diff options
459 files changed, 33775 insertions, 21056 deletions
diff --git a/.homeinstall/README.md b/.homeinstall/README.md index e479ab864..aeecb9184 100644 --- a/.homeinstall/README.md +++ b/.homeinstall/README.md @@ -39,7 +39,7 @@ Software - mkdir -p /var/www - cd /var/www - git clone https://github.com/redmatrix/hubzilla.git html - - cd /html/.homeinstall + - cd html/.homeinstall - cp hubzilla-config.txt.template hubzilla-config.txt - nano hubzilla-config.txt - Read the comments carefully @@ -50,6 +50,20 @@ Software - reboot + Open your domain with a browser and step throught the initial configuration of hubzilla. +## Troubleshooting + +If the check of the mail address fails when you try to register the very first user in the browser. Do... + + cd /var/www/html + util/config system.do_not_check_dns 1 + +## Optional - Set path to imagemagick + +In Admin settings of hubzilla or via terminal + + cd /var/www/html + util/config system.imagick_convert_path /usr/bin/convert + # Step-by-Step in Detail ## Preparations Hardware @@ -120,7 +134,7 @@ There are two ways to get a domain... The cost are around 10,- € once and 1,50 € per month (2017). -The cost are around 10,- € once and 1,50 € per month (2017). +### Method 2: Register a free subdomain ...for example register at freedns.afraid.org @@ -150,7 +164,7 @@ Make the directory for apache and change diretory to it Clone hubzilla from git ("git pull" will update it later) - git clone https://github.com/redmatrix/hubzilla html + git clone https://framagit.org/hubzilla/core html Change to the install script @@ -189,9 +203,16 @@ Leave db type "MySQL" untouched. Follow the instructions in the next pages. +Recommended: Set path to imagemagick + +- in admin settings of hubzilla or +- via terminal + + util/config system.imagick_convert_path /usr/bin/convert + After the daily script was executed at 05:30 (am) -- look at var/www/html/hubzilla-daily.log +- look at /var/www/html/hubzilla-daily.log - check your backup on the external drive - optionally view the daily log under yourdomain.org/admin/logs/ - set the logfile to var/www/html/hubzilla-daily.log @@ -213,4 +234,12 @@ to boot the Rapsi to the client console. DO NOT FORGET TO CHANGE THE DEFAULT PASSWORD FOR USER PI! +On a Raspian Stretch (Debian 9) the validation of the mail address fails for the very first user. +This used to happen on some *bsd distros but there was some work to fix that a year ago (2017). + +So if your system isn't registered in DNS or DNS isn't active do + + cd /var/www/html + util/config system.do_not_check_dns 1 + diff --git a/.homeinstall/hubzilla-setup.sh b/.homeinstall/hubzilla-setup.sh index 3ad9aa37f..ff101086c 100755 --- a/.homeinstall/hubzilla-setup.sh +++ b/.homeinstall/hubzilla-setup.sh @@ -136,17 +136,17 @@ function check_config { # backup is important and should be checked if [ -n "$backup_device_name" ] then - device_mounted=0 + if [ ! -d "$backup_mount_point" ] + then + mkdir "$backup_mount_point" + fi + device_mounted=0 if fdisk -l | grep -i "$backup_device_name.*linux" then print_info "ok - filesystem of external device is linux" if [ -n "$backup_device_pass" ] then echo "$backup_device_pass" | cryptsetup luksOpen $backup_device_name cryptobackup - if [ ! -d /media/hubzilla_backup ] - then - mkdir /media/hubzilla_backup - fi if mount /dev/mapper/cryptobackup /media/hubzilla_backup then device_mounted=1 @@ -246,6 +246,11 @@ function install_apache { nocheck_install "apache2 apache2-utils" } +function install_imagemagick { + print_info "installing imagemagick..." + nocheck_install "imagemagick" +} + function install_curl { print_info "installing curl..." nocheck_install "curl" @@ -567,7 +572,7 @@ function check_https { function install_hubzilla { print_info "installing hubzilla addons..." cd /var/www/html/ - util/add_addon_repo https://github.com/redmatrix/hubzilla-addons.git hzaddons + util/add_addon_repo https://framagit.org/hubzilla/addons.git hzaddons mkdir -p "store/[data]/smarty3" chmod -R 777 store touch .htconfig.php @@ -801,6 +806,7 @@ update_upgrade install_curl install_sendmail install_apache +install_imagemagick install_php install_mysql install_phpmyadmin @@ -1,3 +1,97 @@ +Hubzilla 3.6 (????-??-??) + - Update jquery.timeago library + - Implement Hookable CSP + - ActivityStreams: accept header changes to support plume + - Streamline inconsistencies in addon naming + - SECURITY: hash the session_id in logs + - Update justified gallery library + - Hide channel in /cloud root if channel is hidden in directory + - Add resend option to channel sources tp discard original author. + - Provide flag to exclude privacy groups for federation plugin use in collect_recipients() + - Upgrading from redmatrix is no longer supported + - Deal with htmlentity encoding during authentication workflow + - Rework mod group + - Make droping posts of removed connections more memory efficient + - Refactor getOutainfo() for DAV storage + - Optionally report total available space when uploading + - SECURITY: provide option to disable the cloud 'root' directory and make the cloud module require a target channel nickname + - Add plink and llink to viewsource + - Add new 'filter by name' feature + - Remove network tabs + - New activity filter widget + - New activity order widget + - Make menus editable by visitors with webpage write permissions + - Move forum notifications to notifications + - Move manage privacy groups to the panel channel menu + - Don't remove items that are starred, filed, or that you replied to when removing a connection + - Don't deliver local items more than once + - Make navbar search use the module search function in /network and /channel + - Paint the locks on private activitypub items red. Their privacy model is "slightly" different from hubzillas + - Improve new channel creation workflow + - Add hook 'get_system_apps' + - Implement reset button for jot + - Adjust accept header to make pleroma happy + - Provide a general purpose GDPR document + - Provide function to fetch photo contents from url + - Make get_default_profile_photo() pluggable + - Refactor tags/mentions + - Refactor autocomplete mechanism + - Display pubsites link in info area if invite only + - Add cancel button to editor + - Implement MessageFilter for pubstream and sourced messages + - Add supported protocols to siteinfo + - Allow pdf embeds + - Allow uninstall of plugins which no longer exists via cmdline tool + - Improve the homeinstall script + - Provide easy access to the autoperms setting for forum and repository channels + - Implement admin delete of files, photos and posts + - Allow a different username to be used when importing a channel + - Provide warnings about profile photo and cover photo permissions + - Set the 'force' flag on attach_mkdir when initiated from a DAV operation + + Bugfixes + - Fix double file uploads when dropping files into jot + - Fix jot collapsing when drag and drop to open jot + - Fix wrong album name when moving photos + - Fix wrong timestamp localization before first update in mod mail + - Fix post exiration not propagated to other networks (which support it) + - Fix sys channels visible in dirsearch + - Fix remote_self not working correctly + - Fix photos not syncing properly if destination is a postgres site + - Fix wrong hubloc_url for activitypub hublocs + - Fix z_check_dns() for BSD + - Fix not null violation in oauth1 + - Fix DB issues with oauth2 on postgresql + - Fix 'anybody authenticated' not correctly handled in can_comment_on_post() + - Fix postgres issue if register mode is set to yes - with approval + - Fix tag search not finding articles + - Fix issue with mentions when markdown post addon is enabled + - Fix duplicate addressbook entries on repeated channel imports + + Addons + - Cart: various display improvements + - Cart: make cart work with postgresql DB backend + - Cart: add new hzservice for service_classes + - Cart: add storewide currency settings + - Cart: provide channel app 'Shop' for cart addon + - Cart: implement order updating + - Cart: use CSP hook for paypals checkout.js + - Cart: provide a cancel mechanism for orders + - Cart: add paypal button + - Gallery: new addon to display photo albums with the photoswipe library + - Ldapauth: optionally auto create channel + - Pubcrawl: new setting to ignore ActivityPub recipients in privacy groups + - Diaspora: fix issue with displaying multiple photos + - Pubcrawl: provide plink + - Pubcrawl: hubloc_url should be baseurl, not actor url + - Pubcrawl: deliver restricted posts from hubzilla as direct messages (there is no other way to address only a subset of followers in mastodon) + - Pubcrawl: address comments to a restricted mastodon post to /followers + + +Hubzilla 3.4.2 (2018-07-19) + - Compatibility fix for future versions + + Hubzilla 3.4.1 (2018-06-08) - Say bye, bye to GitHub and move sourcecode repositories to #^https://framagit.org/hubzilla - When removing a connection, don't remove items that are starred, filed or replied to @@ -5,7 +5,7 @@ Hubzilla - Community Server <p align="center" markdown="1"> -<em><a href="install/INSTALL.txt">Installing Hubzilla</a></em> +<em><a href="https://framagit.org/hubzilla/core/blob/master/install/INSTALL.txt">Installing Hubzilla</a></em> </p> **What is Hubzilla?** diff --git a/Zotlabs/Access/PermissionRoles.php b/Zotlabs/Access/PermissionRoles.php index 9855a05c4..c8b4953a5 100644 --- a/Zotlabs/Access/PermissionRoles.php +++ b/Zotlabs/Access/PermissionRoles.php @@ -308,6 +308,8 @@ class PermissionRoles { ] ]; + call_hooks('list_permission_roles',$roles); + return $roles; } diff --git a/Zotlabs/Access/Permissions.php b/Zotlabs/Access/Permissions.php index bca40a9c1..20dc22a72 100644 --- a/Zotlabs/Access/Permissions.php +++ b/Zotlabs/Access/Permissions.php @@ -67,7 +67,7 @@ class Permissions { 'post_comments' => t('Can comment on or like my posts'), 'post_mail' => t('Can send me private mail messages'), 'post_like' => t('Can like/dislike profiles and profile things'), - 'tag_deliver' => t('Can forward to all my channel connections via @+ mentions in posts'), + 'tag_deliver' => t('Can forward to all my channel connections via ! mentions in posts'), 'chat' => t('Can chat with me'), 'republish' => t('Can source my public posts in derived channels'), 'delegate' => t('Can administer my channel') diff --git a/Zotlabs/Daemon/Cron.php b/Zotlabs/Daemon/Cron.php index 01c43262a..d1c516f96 100644 --- a/Zotlabs/Daemon/Cron.php +++ b/Zotlabs/Daemon/Cron.php @@ -50,14 +50,19 @@ class Cron { // expire any expired items - $r = q("select id from item where expires > '2001-01-01 00:00:00' and expires < %s + $r = q("select id,item_wall from item where expires > '2001-01-01 00:00:00' and expires < %s and item_deleted = 0 ", db_utcnow() ); if($r) { require_once('include/items.php'); - foreach($r as $rr) - drop_item($rr['id'],false); + foreach($r as $rr) { + drop_item($rr['id'],false,(($rr['item_wall']) ? DROPITEM_PHASE1 : DROPITEM_NORMAL)); + if($rr['item_wall']) { + // The notifier isn't normally invoked unless item_drop is interactive. + Zotlabs\Daemon\Master::Summon( [ 'Notifier', 'drop', $rr['id'] ] ); + } + } } diff --git a/Zotlabs/Daemon/Poller.php b/Zotlabs/Daemon/Poller.php index e4bc9c143..49151437c 100644 --- a/Zotlabs/Daemon/Poller.php +++ b/Zotlabs/Daemon/Poller.php @@ -71,14 +71,18 @@ class Poller { $randfunc = db_getfunc('RAND'); - $contacts = q("SELECT * FROM abook LEFT JOIN xchan on abook_xchan = xchan_hash + $contacts = q("SELECT abook.abook_updated, abook.abook_connected, abook.abook_feed, + abook.abook_channel, abook.abook_id, abook.abook_archived, abook.abook_pending, + abook.abook_ignored, abook.abook_blocked, + xchan.xchan_network, + account.account_lastlog, account.account_flags + FROM abook LEFT JOIN xchan on abook_xchan = xchan_hash LEFT JOIN account on abook_account = account_id where abook_self = 0 $sql_extra AND (( account_flags = %d ) OR ( account_flags = %d )) $abandon_sql ORDER BY $randfunc", intval(ACCOUNT_OK), intval(ACCOUNT_UNVERIFIED) // FIXME - ); if($contacts) { diff --git a/Zotlabs/Lib/ActivityStreams.php b/Zotlabs/Lib/ActivityStreams.php index 2e9bb0703..37e717f58 100644 --- a/Zotlabs/Lib/ActivityStreams.php +++ b/Zotlabs/Lib/ActivityStreams.php @@ -9,6 +9,7 @@ namespace Zotlabs\Lib; */ class ActivityStreams { + public $raw = null; public $data; public $valid = false; public $id = ''; @@ -33,7 +34,9 @@ class ActivityStreams { */ function __construct($string) { + $this->raw = $string; $this->data = json_decode($string, true); + if($this->data) { $this->valid = true; } @@ -204,7 +207,7 @@ class ActivityStreams { } $x = z_fetch_url($url, true, $redirects, - ['headers' => [ 'Accept: application/ld+json; profile="https://www.w3.org/ns/activitystreams", application/activity+json' ]]); + ['headers' => [ 'Accept: application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"' ]]); if($x['success']) return json_decode($x['body'], true); diff --git a/Zotlabs/Lib/Apps.php b/Zotlabs/Lib/Apps.php index 24cb4a626..c2ec5c967 100644 --- a/Zotlabs/Lib/Apps.php +++ b/Zotlabs/Lib/Apps.php @@ -13,7 +13,12 @@ require_once('include/channel.php'); class Apps { - static public $installed_system_apps = null; + static public $available_apps = null; + static public $installed_apps = null; + + static public $base_apps = null; + + static public function get_system_apps($translate = true) { @@ -45,6 +50,8 @@ class Apps { } } + call_hooks('get_system_apps',$ret); + return $ret; } @@ -53,22 +60,52 @@ class Apps { static public function import_system_apps() { if(! local_channel()) return; + + self::$base_apps = get_config('system','base_apps',[ + 'Connections', + 'Suggest Channels', + 'Grid', + 'Settings', + 'Files', + 'Channel Home', + 'View Profile', + 'Photos', + 'Events', + 'Directory', + 'Search', + 'Help', + 'Mail', + 'Profile Photo' + ]); + $apps = self::get_system_apps(false); - self::$installed_system_apps = q("select * from app where app_system = 1 and app_channel = %d", + self::$available_apps = q("select * from app where app_channel = 0"); + + self::$installed_apps = q("select * from app where app_channel = %d", intval(local_channel()) ); if($apps) { foreach($apps as $app) { $id = self::check_install_system_app($app); + + // $id will be boolean true or false to install an app, or an integer id to update an existing app + if($id !== false) { + $app['uid'] = 0; + $app['guid'] = hash('whirlpool',$app['name']); + $app['system'] = 1; + self::app_install(0,$app); + } + + $id = self::check_install_personal_app($app); // $id will be boolean true or false to install an app, or an integer id to update an existing app if($id === false) continue; 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", + $s = EMPTY_STR; + $r = q("select term from term where otype = %d and oid = %d", intval(TERM_OBJ_APP), intval($id) ); @@ -85,6 +122,7 @@ class Apps { $app['guid'] = hash('whirlpool',$app['name']); $app['system'] = 1; self::app_install(local_channel(),$app); + } } } @@ -95,11 +133,11 @@ class Apps { */ static public function check_install_system_app($app) { - if((! is_array(self::$installed_system_apps)) || (! count(self::$installed_system_apps))) { + if((! is_array(self::$available_apps)) || (! count(self::$available_apps))) { return true; } $notfound = true; - foreach(self::$installed_system_apps as $iapp) { + foreach(self::$available_apps as $iapp) { if($iapp['app_id'] == hash('whirlpool',$app['name'])) { $notfound = false; if(($iapp['app_version'] != $app['version']) @@ -113,6 +151,31 @@ class Apps { } + /** + * Install the system app if no system apps have been installed, or if a new system app + * is discovered, or if the version of a system app changes. + */ + + + + static public function check_install_personal_app($app) { + $installed = false; + foreach(self::$installed_apps as $iapp) { + if($iapp['app_id'] == hash('whirlpool',$app['name'])) { + $installed = true; + if(($iapp['app_version'] != $app['version']) + || ($app['plugin'] && (! $iapp['app_plugin']))) { + return intval($iapp['app_id']); + } + } + } + if(! $installed && in_array($app['name'],self::$base_apps)) { + return true; + } + return false; + } + + static public function app_name_compare($a,$b) { return strcasecmp($a['name'],$b['name']); } @@ -233,7 +296,6 @@ class Apps { 'View Bookmarks' => t('View Bookmarks'), 'My Chatrooms' => t('My Chatrooms'), 'Connections' => t('Connections'), - 'Firefox Share' => t('Firefox Share'), 'Remote Diagnostics' => t('Remote Diagnostics'), 'Suggest Channels' => t('Suggest Channels'), 'Login' => t('Login'), @@ -288,6 +350,7 @@ class Apps { * modes: * view: normal mode for viewing an app via bbcode from a conversation or page * provides install/update button if you're logged in locally + * install: like view but does not display app-bin options if they are present * list: normal mode for viewing an app on the app page * no buttons are shown * edit: viewing the app page in editing mode provides a delete button @@ -300,7 +363,7 @@ class Apps { return; if(! $papp['photo']) - $papp['photo'] = z_root() . '/' . get_default_profile_photo(80); + $papp['photo'] = 'icon:gear'; self::translate_system_apps($papp); @@ -400,12 +463,15 @@ class Apps { )); } + if($mode === 'install') { + $papp['embed'] = true; + } return replace_macros(get_markup_template('app.tpl'),array( '$app' => $papp, '$icon' => $icon, '$hosturl' => $hosturl, '$purchase' => (($papp['page'] && (! $installed)) ? t('Purchase') : ''), - '$install' => (($hosturl && $mode == 'view') ? $install_action : ''), + '$install' => (($hosturl && in_array($mode, ['view','install'])) ? $install_action : ''), '$edit' => ((local_channel() && $installed && $mode == 'edit') ? t('Edit') : ''), '$delete' => ((local_channel() && $installed && $mode == 'edit') ? t('Delete') : ''), '$undelete' => ((local_channel() && $installed && $mode == 'edit') ? t('Undelete') : ''), @@ -468,21 +534,13 @@ class Apps { intval(TERM_OBJ_APP), intval($x[0]['id']) ); - if($x[0]['app_system']) { - $r = q("update app set app_deleted = 1 where app_id = '%s' and app_channel = %d", - dbesc($app['guid']), - intval($uid) - ); - } - else { - $r = q("delete from app where app_id = '%s' and app_channel = %d", - dbesc($app['guid']), - intval($uid) - ); + $r = q("delete from app where app_id = '%s' and app_channel = %d", + dbesc($app['guid']), + intval($uid) + ); - // we don't sync system apps - they may be completely different on the other system - build_sync_packet($uid,array('app' => $x)); - } + // we don't sync system apps - they may be completely different on the other system + build_sync_packet($uid,array('app' => $x)); } else { self::app_undestroy($uid,$app); @@ -736,12 +794,19 @@ class Apps { $darray = array(); $ret = array('success' => false); + $sys = get_sys_channel(); + + $darray['app_url'] = ((x($arr,'url')) ? $arr['url'] : ''); $darray['app_channel'] = ((x($arr,'uid')) ? $arr['uid'] : 0); - if((! $darray['app_url']) || (! $darray['app_channel'])) + if(! $darray['app_url']) return $ret; + if((! $arr['uid']) && (! $arr['author'])) { + $arr['author'] = $sys['channel_hash']; + } + if($arr['photo'] && (strpos($arr['photo'],'icon:') !== 0) && (! strstr($arr['photo'],z_root()))) { $x = import_xchan_photo($arr['photo'],get_observer_hash(),true); $arr['photo'] = $x[1]; @@ -875,7 +940,7 @@ class Apps { // if updating an embed app, don't mess with any existing categories. - if(array_key_exists('embed',$arr) && intval($arr['embed'])) + if(array_key_exists('embed',$arr) && intval($arr['embed']) && (intval($darray['app_channel']))) return $ret; if($x) { diff --git a/Zotlabs/Lib/MessageFilter.php b/Zotlabs/Lib/MessageFilter.php new file mode 100644 index 000000000..eb0fc3d2c --- /dev/null +++ b/Zotlabs/Lib/MessageFilter.php @@ -0,0 +1,79 @@ +<?php + +namespace Zotlabs\Lib; + + + +class MessageFilter { + + + static public function evaluate($item,$incl,$excl) { + + require_once('include/html2plain.php'); + + unobscure($item); + + $text = prepare_text($item['body'],$item['mimetype']); + $text = html2plain(($item['title']) ? $item['title'] . ' ' . $text : $text); + + + $lang = null; + + if((strpos($incl,'lang=') !== false) || (strpos($excl,'lang=') !== false)) { + $lang = detect_language($text); + } + + $tags = ((is_array($item['term']) && count($item['term'])) ? $item['term'] : false); + + // exclude always has priority + + $exclude = (($excl) ? explode("\n",$excl) : null); + + if($exclude) { + foreach($exclude as $word) { + $word = trim($word); + if(! $word) + continue; + if(substr($word,0,1) === '#' && $tags) { + foreach($tags as $t) + if((($t['ttype'] == TERM_HASHTAG) || ($t['ttype'] == TERM_COMMUNITYTAG)) && (($t['term'] === substr($word,1)) || (substr($word,1) === '*'))) + return false; + } + elseif((strpos($word,'/') === 0) && preg_match($word,$text)) + return false; + elseif((strpos($word,'lang=') === 0) && ($lang) && (strcasecmp($lang,trim(substr($word,5))) == 0)) + return false; + elseif(stristr($text,$word) !== false) + return false; + } + } + + $include = (($incl) ? explode("\n",$incl) : null); + + if($include) { + foreach($include as $word) { + $word = trim($word); + if(! $word) + continue; + if(substr($word,0,1) === '#' && $tags) { + foreach($tags as $t) + if((($t['ttype'] == TERM_HASHTAG) || ($t['ttype'] == TERM_COMMUNITYTAG)) && (($t['term'] === substr($word,1)) || (substr($word,1) === '*'))) + return true; + } + elseif((strpos($word,'/') === 0) && preg_match($word,$text)) + return true; + elseif((strpos($word,'lang=') === 0) && ($lang) && (strcasecmp($lang,trim(substr($word,5))) == 0)) + return true; + elseif(stristr($text,$word) !== false) + return true; + } + } + else { + return true; + } + + return false; + } + + +} diff --git a/Zotlabs/Lib/ThreadItem.php b/Zotlabs/Lib/ThreadItem.php index 61a012f9d..ed78ae00b 100644 --- a/Zotlabs/Lib/ThreadItem.php +++ b/Zotlabs/Lib/ThreadItem.php @@ -102,6 +102,13 @@ class ThreadItem { if($item['author']['xchan_network'] === 'rss') $shareable = true; + $privacy_warning = false; + if(($item['item_private'] == 1) && ($item['owner']['xchan_network'] === 'activitypub')) { + $recips = get_iconfig($item['parent'], 'activitypub', 'recips'); + + if(! in_array($observer['xchan_url'], $recips['to'])) + $privacy_warning = true; + } $mode = $conv->get_mode(); @@ -141,6 +148,10 @@ class ThreadItem { 'delete' => t('Delete'), ); } + elseif(is_site_admin()) { + $drop = [ 'dropping' => true, 'delete' => t('Admin Delete') ]; + } + // FIXME if($observer_is_pageowner) { $multidrop = array( @@ -232,16 +243,9 @@ class ThreadItem { // FIXME check this permission if(($conv->get_profile_owner() == local_channel()) && (! array_key_exists('real_uid',$item))) { -// FIXME we don't need all this stuff, some can be done in the template - $star = array( - 'do' => t("Add Star"), - 'undo' => t("Remove Star"), 'toggle' => t("Toggle Star Status"), - 'classdo' => ((intval($item['item_starred'])) ? "hidden" : ""), - 'classundo' => ((intval($item['item_starred'])) ? "" : "hidden"), 'isstarred' => ((intval($item['item_starred'])) ? true : false), - 'starred' => t('starred'), ); } @@ -366,6 +370,7 @@ class ThreadItem { 'editedtime' => (($item['edited'] != $item['created']) ? sprintf( t('last edited: %s'), datetime_convert('UTC', date_default_timezone_get(), $item['edited'], 'r')) : ''), 'expiretime' => (($item['expires'] > NULL_DATE) ? sprintf( t('Expires: %s'), datetime_convert('UTC', date_default_timezone_get(), $item['expires'], 'r')):''), 'lock' => $lock, + 'privacy_warning' => $privacy_warning, 'verified' => $verified, 'unverified' => $unverified, 'forged' => $forged, @@ -756,7 +761,7 @@ class ThreadItem { '$edquote' => t('Quote'), '$edcode' => t('Code'), '$edimg' => t('Image'), - '$edatt' => t('Attach File'), + '$edatt' => t('Attach/Upload file'), '$edurl' => t('Insert Link'), '$edvideo' => t('Video'), '$preview' => t('Preview'), // ((feature_enabled($conv->get_profile_owner(),'preview')) ? t('Preview') : ''), diff --git a/Zotlabs/Module/Acl.php b/Zotlabs/Module/Acl.php index 4c5883e88..0c2ad7522 100644 --- a/Zotlabs/Module/Acl.php +++ b/Zotlabs/Module/Acl.php @@ -24,7 +24,7 @@ class Acl extends \Zotlabs\Web\Controller { function init() { - logger('mod_acl: ' . print_r($_REQUEST,true),LOGGER_DATA); + // logger('mod_acl: ' . print_r($_GET,true),LOGGER_DATA); $start = (x($_REQUEST,'start') ? $_REQUEST['start'] : 0); $count = (x($_REQUEST,'count') ? $_REQUEST['count'] : 500); @@ -94,8 +94,7 @@ class Acl extends \Zotlabs\Web\Controller { . " then POSITION('" . protect_sprintf(dbesc($search)) . "' IN xchan_name) else position('" . protect_sprintf(dbesc(punify($search))) . "' IN xchan_addr) end, "; - $col = ((strpos($search,'@') !== false) ? 'xchan_addr' : 'xchan_name' ); - $sql_extra3 = "AND $col like " . protect_sprintf( "'%" . dbesc(($col === 'xchan_addr') ? punify($search) : $search) . "%'" ) . " "; + $sql_extra3 = "AND ( xchan_addr like " . protect_sprintf( "'%" . dbesc(punify($search)) . "%'" ) . " OR xchan_name like " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " ) "; } else { @@ -268,15 +267,15 @@ class Acl extends \Zotlabs\Web\Controller { }); } } - if(intval(get_config('system','taganyone')) || intval(get_pconfig(local_channel(),'system','taganyone'))) { - if((count($r) < 100) && $type == 'c') { - $r2 = q("SELECT substr(xchan_hash,1,18) as id, xchan_hash as hash, xchan_name as name, xchan_photo_s as micro, xchan_url as url, xchan_addr as nick, 0 as abook_their_perms, 0 as abook_flags, 0 as abook_self - FROM xchan - WHERE xchan_deleted = 0 $sql_extra2 order by $order_extra2 xchan_name asc" - ); - if($r2) - $r = array_merge($r,$r2); - } + if((count($r) < 100) && $type == 'c') { + $r2 = q("SELECT substr(xchan_hash,1,18) as id, xchan_hash as hash, xchan_name as name, xchan_photo_s as micro, xchan_url as url, xchan_addr as nick, 0 as abook_their_perms, 0 as abook_flags, 0 as abook_self + FROM xchan + WHERE xchan_deleted = 0 and not xchan_network in ('rss','anon','unknown') $sql_extra2 order by $order_extra2 xchan_name asc" + ); + if($r2) { + $r = array_merge($r,$r2); + $r = unique_multidim_array($r,'hash'); + } } } elseif($type == 'm') { @@ -337,24 +336,23 @@ class Acl extends \Zotlabs\Web\Controller { if($r) { foreach($r as $g) { - if(($g['network'] === 'rss') && ($type != 'a')) + if(in_array($g['network'],['rss','anon','unknown']) && ($type != 'a')) continue; $g['hash'] = urlencode($g['hash']); if(! $g['nick']) { - $t = explode(' ',strtolower($g['name'])); - $g['nick'] = $t[0] . '@'; + $g['nick'] = $g['url']; } - if(in_array($g['hash'],$permitted) && in_array($type, [ 'c', 'f' ]) && (! $noforums)) { + if(in_array($g['hash'],$permitted) && $type === 'f' && (! $noforums)) { $contacts[] = array( "type" => "c", "photo" => "images/twopeople.png", - "name" => $g['name'] . (($type === 'f') ? '' : '+'), - "id" => urlencode($g['id']) . (($type === 'f') ? '' : '+'), + "name" => $g['name'], + "id" => urlencode($g['id']), "xid" => $g['hash'], - "link" => $g['nick'], + "link" => (($g['nick']) ? $g['nick'] : $g['url']), "nick" => substr($g['nick'],0,strpos($g['nick'],'@')), "self" => (intval($g['abook_self']) ? 'abook-self' : ''), "taggable" => 'taggable', @@ -368,8 +366,8 @@ class Acl extends \Zotlabs\Web\Controller { "name" => $g['name'], "id" => urlencode($g['id']), "xid" => $g['hash'], - "link" => $g['nick'], - "nick" => (($g['nick']) ? substr($g['nick'],0,strpos($g['nick'],'@')) : $g['nick']), + "link" => (($g['nick']) ? $g['nick'] : $g['url']), + "nick" => ((strpos($g['nick'],'@')) ? substr($g['nick'],0,strpos($g['nick'],'@')) : $g['nick']), "self" => (intval($g['abook_self']) ? 'abook-self' : ''), "taggable" => '', "label" => '', diff --git a/Zotlabs/Module/Admin.php b/Zotlabs/Module/Admin.php index 30f3dfa48..2df8dc25d 100644 --- a/Zotlabs/Module/Admin.php +++ b/Zotlabs/Module/Admin.php @@ -100,8 +100,12 @@ class Admin extends \Zotlabs\Web\Controller { } // pending registrations - $r = q("SELECT COUNT(id) AS rtotal FROM register WHERE uid != '0'"); - $pending = $r[0]['rtotal']; + + $pdg = q("SELECT account.*, register.hash from account left join register on account_id = register.uid where (account_flags & %d ) > 0 ", + intval(ACCOUNT_PENDING) + ); + + $pending = (($pdg) ? count($pdg) : 0); // available channels, primary and clones $channels = array(); @@ -140,7 +144,7 @@ class Admin extends \Zotlabs\Web\Controller { '$accounts' => array( t('Registered accounts'), $accounts), '$pending' => array( t('Pending registrations'), $pending), '$channels' => array( t('Registered channels'), $channels), - '$plugins' => array( t('Active plugins'), $plugins ), + '$plugins' => array( t('Active addons'), $plugins ), '$version' => array( t('Version'), STD_VERSION), '$vmaster' => array( t('Repository version (master)'), $vmaster), '$vdev' => array( t('Repository version (dev)'), $vdev), diff --git a/Zotlabs/Module/Admin/Plugins.php b/Zotlabs/Module/Admin/Addons.php index feb29e9d6..b35922aef 100644 --- a/Zotlabs/Module/Admin/Plugins.php +++ b/Zotlabs/Module/Admin/Addons.php @@ -2,10 +2,10 @@ namespace Zotlabs\Module\Admin; -use \Zotlabs\Storage\GitRepo as GitRepo; +use \Zotlabs\Storage\GitRepo; use \Michelf\MarkdownExtra; -class Plugins { +class Addons { /** * @brief @@ -20,7 +20,7 @@ class Plugins { $func($a); } - goaway(z_root() . '/admin/plugins/' . argv(2) ); + goaway(z_root() . '/admin/addons/' . argv(2) ); } elseif(argc() > 2) { switch(argv(2)) { @@ -243,7 +243,7 @@ class Plugins { } /** - * @brief Plugins admin page. + * @brief Addons admin page. * * @return string with parsed HTML */ @@ -278,7 +278,7 @@ class Plugins { $info['disabled'] = 1-intval($x); if (x($_GET,"a") && $_GET['a']=="t"){ - check_form_security_token_redirectOnErr('/admin/plugins', 'admin_plugins', 't'); + check_form_security_token_redirectOnErr('/admin/addons', 'admin_addons', 't'); $pinstalled = false; // Toggle plugin status $idx = array_search($plugin, \App::$plugins); @@ -298,9 +298,9 @@ class Plugins { if($pinstalled) { @require_once("addon/$plugin/$plugin.php"); if(function_exists($plugin.'_plugin_admin')) - goaway(z_root() . '/admin/plugins/' . $plugin); + goaway(z_root() . '/admin/addons/' . $plugin); } - goaway(z_root() . '/admin/plugins' ); + goaway(z_root() . '/admin/addons' ); } // display plugin details @@ -339,7 +339,7 @@ class Plugins { $t = get_markup_template('admin_plugins_details.tpl'); return replace_macros($t, array( '$title' => t('Administration'), - '$page' => t('Plugins'), + '$page' => t('Addons'), '$toggle' => t('Toggle'), '$settings' => t('Settings'), '$baseurl' => z_root(), @@ -358,11 +358,11 @@ class Plugins { '$disabled' => t('Disabled - version incompatibility'), '$admin_form' => $admin_form, - '$function' => 'plugins', + '$function' => 'addons', '$screenshot' => '', '$readme' => $readme, - '$form_security_token' => get_form_security_token('admin_plugins'), + '$form_security_token' => get_form_security_token('admin_addons'), )); } @@ -407,11 +407,11 @@ class Plugins { $admin_plugins_add_repo_form= replace_macros( get_markup_template('admin_plugins_addrepo.tpl'), array( - '$post' => 'admin/plugins/addrepo', - '$desc' => t('Enter the public git repository URL of the plugin repo.'), - '$repoURL' => array('repoURL', t('Plugin repo git URL'), '', ''), + '$post' => 'admin/addons/addrepo', + '$desc' => t('Enter the public git repository URL of the addon repo.'), + '$repoURL' => array('repoURL', t('Addon repo git URL'), '', ''), '$repoName' => array('repoName', t('Custom repo name'), '', '', t('(optional)')), - '$submit' => t('Download Plugin Repo') + '$submit' => t('Download Addon Repo') ) ); $newRepoModalID = random_string(3); @@ -434,17 +434,17 @@ class Plugins { $t = get_markup_template('admin_plugins.tpl'); return replace_macros($t, array( '$title' => t('Administration'), - '$page' => t('Plugins'), + '$page' => t('Addons'), '$submit' => t('Submit'), '$baseurl' => z_root(), - '$function' => 'plugins', + '$function' => 'addons', '$plugins' => $plugins, '$disabled' => t('Disabled - version incompatibility'), - '$form_security_token' => get_form_security_token('admin_plugins'), + '$form_security_token' => get_form_security_token('admin_addons'), '$allowManageRepos' => $allowManageRepos, '$managerepos' => t('Manage Repos'), - '$installedtitle' => t('Installed Plugin Repositories'), - '$addnewrepotitle' => t('Install a New Plugin Repository'), + '$installedtitle' => t('Installed Addon Repositories'), + '$addnewrepotitle' => t('Install a New Addon Repository'), '$expandform' => false, '$form' => $admin_plugins_add_repo_form, '$newRepoModal' => $newRepoModal, diff --git a/Zotlabs/Module/Admin/Security.php b/Zotlabs/Module/Admin/Security.php index 49e1ccf42..80c1d85b7 100644 --- a/Zotlabs/Module/Admin/Security.php +++ b/Zotlabs/Module/Admin/Security.php @@ -16,7 +16,13 @@ class Security { $block_public = ((x($_POST,'block_public')) ? True : False); set_config('system','block_public',$block_public); - + + $cloud_noroot = ((x($_POST,'cloud_noroot')) ? 1 : 0); + set_config('system','cloud_disable_siteroot',1 - $cloud_noroot); + + $cloud_disksize = ((x($_POST,'cloud_disksize')) ? 1 : 0); + set_config('system','cloud_report_disksize',$cloud_disksize); + $ws = $this->trim_array_elems(explode("\n",$_POST['whitelisted_sites'])); set_config('system','whitelisted_sites',$ws); @@ -87,6 +93,8 @@ class Security { '$page' => t('Security'), '$form_security_token' => get_form_security_token('admin_security'), '$block_public' => array('block_public', t("Block public"), get_config('system','block_public'), t("Check to block public access to all otherwise public personal pages on this site unless you are currently authenticated.")), + '$cloud_noroot' => [ 'cloud_noroot', t('Provide a cloud root directory'), 1 - intval(get_config('system','cloud_disable_siteroot')), t('The cloud root directory lists all channel names which provide public files') ], + '$cloud_disksize' => [ 'cloud_disksize', t('Show total disk space available to cloud uploads'), intval(get_config('system','cloud_report_disksize')), '' ], '$transport_security' => array('transport_security', t('Set "Transport Security" HTTP header'),intval(get_config('system','transport_security_header')),''), '$content_security' => array('content_security', t('Set "Content Security Policy" HTTP header'),intval(get_config('system','content_security_policy')),''), '$allowed_email' => array('allowed_email', t("Allowed email domains"), get_config('system','allowed_email'), t("Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains")), diff --git a/Zotlabs/Module/Admin/Site.php b/Zotlabs/Module/Admin/Site.php index 656770ad9..292de4c3a 100644 --- a/Zotlabs/Module/Admin/Site.php +++ b/Zotlabs/Module/Admin/Site.php @@ -76,6 +76,10 @@ class Site { $imagick_path = ((x($_POST,'imagick_path')) ? trim($_POST['imagick_path']) : ''); $thumbnail_security = ((x($_POST,'thumbnail_security')) ? intval($_POST['thumbnail_security']) : 0); $force_queue = ((intval($_POST['force_queue']) > 0) ? intval($_POST['force_queue']) : 3000); + $pub_incl = escape_tags(trim($_POST['pub_incl'])); + $pub_excl = escape_tags(trim($_POST['pub_excl'])); + + $permissions_role = escape_tags(trim($_POST['permissions_role'])); $techlevel = null; if(array_key_exists('techlevel', $_POST)) @@ -102,6 +106,9 @@ class Site { set_config('system', 'from_email_name' , $from_email_name); set_config('system', 'imagick_convert_path' , $imagick_path); set_config('system', 'thumbnail_security' , $thumbnail_security); + set_config('system', 'default_permissions_role', $permissions_role); + set_config('system', 'pubstream_incl',$pub_incl); + set_config('system', 'pubstream_excl',$pub_excl); set_config('system', 'techlevel_lock', $techlevel_lock); @@ -286,6 +293,12 @@ class Site { '5' => t('Wizard - I probably know more than you do') ]; + $perm_roles = \Zotlabs\Access\PermissionRoles::roles(); + $default_role = get_config('system','default_permissions_role','social'); + + $role = array('permissions_role' , t('Default permission role for new accounts'), $default_role, t('This role will be used for the first channel created after registration.'),$perm_roles); + + $homelogin = get_config('system','login_on_homepage'); $enable_context_help = get_config('system','enable_context_help'); @@ -321,6 +334,7 @@ class Site { '$minimum_age' => array('minimum_age', t("Minimum age"), (x(get_config('system','minimum_age'))?get_config('system','minimum_age'):13), t("Minimum age (in years) for who may register on this site.")), '$access_policy' => array('access_policy', t("Which best describes the types of account offered by this hub?"), get_config('system','access_policy'), "This is displayed on the public server site list.", $access_choices), '$register_text' => array('register_text', t("Register text"), htmlspecialchars(get_config('system','register_text'), ENT_QUOTES, 'UTF-8'), t("Will be displayed prominently on the registration page.")), + '$role' => $role, '$frontpage' => array('frontpage', t("Site homepage to show visitors (default: login box)"), get_config('system','frontpage'), t("example: 'public' to show public stream, 'page/sys/home' to show a system webpage called 'home' or 'include:home.html' to include a file.")), '$mirror_frontpage' => array('mirror_frontpage', t("Preserve site homepage URL"), get_config('system','mirror_frontpage'), t('Present the site homepage in a frame at the original location instead of redirecting')), '$abandon_days' => array('abandon_days', t('Accounts abandoned after x days'), get_config('system','account_abandon_days'), t('Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit.')), @@ -330,6 +344,10 @@ 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.')), '$site_firehose' => array('site_firehose', t('Site only Public Streams'), get_config('system','site_firehose'), t('Allow access to public content originating only from this site if Imported Public Streams are disabled.')), '$open_pubstream' => array('open_pubstream', t('Allow anybody on the internet to access the Public streams'), get_config('system','open_pubstream',1), t('Disable to require authentication before viewing. Warning: this content is unmoderated.')), + '$incl' => array('pub_incl',t('Only import Public stream posts with this text'), get_config('system','pubstream_incl'),t('words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts')), + '$excl' => array('pub_excl',t('Do not import Public stream posts with this text'), get_config('system','pubstream_excl'),t('words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts')), + + '$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.")), @@ -353,7 +371,7 @@ class Site { '$active_expire_days' => array('active_expire_days', t('Do not expire any posts which have comments less than this many days ago'), intval(get_config('system','active_expire_days',7)), ''), '$sellpage' => array('site_sellpage', t('Public servers: Optional landing (marketing) webpage for new registrants'), get_config('system','sellpage',''), sprintf( t('Create this page first. Default is %s/register'),z_root())), - '$first_page' => array('first_page', t('Page to display after creating a new channel'), get_config('system','workflow_channel_next','profiles'), t('Recommend: profiles, go, or settings')), + '$first_page' => array('first_page', t('Page to display after creating a new channel'), get_config('system','workflow_channel_next','profiles'), t('Default: profiles')), '$location' => array('site_location', t('Optional: site location'), get_config('system','site_location',''), t('Region or country')), diff --git a/Zotlabs/Module/Apps.php b/Zotlabs/Module/Apps.php index c672ea467..78c8d99ae 100644 --- a/Zotlabs/Module/Apps.php +++ b/Zotlabs/Module/Apps.php @@ -15,6 +15,8 @@ class Apps extends \Zotlabs\Web\Controller { else $mode = 'list'; + $available = ((argc() == 2 && argv(1) === 'available') ? true : false); + $_SESSION['return_url'] = \App::$query_string; $apps = array(); @@ -23,7 +25,7 @@ class Apps extends \Zotlabs\Web\Controller { Zlib\Apps::import_system_apps(); $syslist = array(); $cat = ((array_key_exists('cat',$_GET) && $_GET['cat']) ? [ escape_tags($_GET['cat']) ] : ''); - $list = Zlib\Apps::app_list(local_channel(), (($mode == 'edit') ? true : false), $cat); + $list = Zlib\Apps::app_list((($available) ? 0 : local_channel()), (($mode == 'edit') ? true : false), $cat); if($list) { foreach($list as $x) { $syslist[] = Zlib\Apps::app_encode($x); @@ -39,7 +41,7 @@ class Apps extends \Zotlabs\Web\Controller { // logger('apps: ' . print_r($syslist,true)); foreach($syslist as $app) { - $apps[] = Zlib\Apps::app_render($app,$mode); + $apps[] = Zlib\Apps::app_render($app,(($available) ? 'install' : $mode)); } return replace_macros(get_markup_template('myapps.tpl'), array( @@ -48,7 +50,7 @@ class Apps extends \Zotlabs\Web\Controller { '$title' => t('Apps'), '$apps' => $apps, '$authed' => ((local_channel()) ? true : false), - '$manage' => t('Manage apps'), + '$manage' => (($available) ? '' : t('Manage apps')), '$create' => (($mode == 'edit') ? t('Create new app') : '') )); diff --git a/Zotlabs/Module/Article_edit.php b/Zotlabs/Module/Article_edit.php index 758c1db2e..89abccc40 100644 --- a/Zotlabs/Module/Article_edit.php +++ b/Zotlabs/Module/Article_edit.php @@ -128,6 +128,7 @@ class Article_edit extends \Zotlabs\Web\Controller { '$title' => t('Edit Article'), '$delete' => ((($itm[0]['author_xchan'] === $ob_hash) || ($itm[0]['owner_xchan'] === $ob_hash)) ? t('Delete') : false), '$id' => $itm[0]['id'], + '$cancel' => t('Cancel'), '$editor' => $editor )); diff --git a/Zotlabs/Module/Card_edit.php b/Zotlabs/Module/Card_edit.php index 7cc563fd2..694bdc4ea 100644 --- a/Zotlabs/Module/Card_edit.php +++ b/Zotlabs/Module/Card_edit.php @@ -128,6 +128,7 @@ class Card_edit extends \Zotlabs\Web\Controller { '$title' => t('Edit Card'), '$delete' => ((($itm[0]['author_xchan'] === $ob_hash) || ($itm[0]['owner_xchan'] === $ob_hash)) ? t('Delete') : false), '$id' => $itm[0]['id'], + '$cancel' => t('Cancel'), '$editor' => $editor )); diff --git a/Zotlabs/Module/Channel.php b/Zotlabs/Module/Channel.php index b9924c7f7..b5e6b3aee 100644 --- a/Zotlabs/Module/Channel.php +++ b/Zotlabs/Module/Channel.php @@ -18,6 +18,9 @@ class Channel extends \Zotlabs\Web\Controller { function init() { + if(in_array(substr($_GET['search'],0,1),[ '@', '!', '?'])) + goaway('search' . '?f=&search=' . $_GET['search']); + $which = null; if(argc() > 1) $which = argv(1); @@ -82,7 +85,9 @@ class Channel extends \Zotlabs\Web\Controller { $category = ((x($_REQUEST,'cat')) ? $_REQUEST['cat'] : ''); $hashtags = ((x($_REQUEST,'tag')) ? $_REQUEST['tag'] : ''); + $order = ((x($_GET,'order')) ? notags($_GET['order']) : 'post'); $static = ((array_key_exists('static',$_REQUEST)) ? intval($_REQUEST['static']) : 0); + $search = ((x($_GET,'search')) ? $_GET['search'] : EMPTY_STR); $groups = array(); @@ -118,9 +123,12 @@ class Channel extends \Zotlabs\Web\Controller { $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']); + // search terms header + if($search) { + $o .= replace_macros(get_markup_template("section_title.tpl"),array( + '$title' => t('Search Results For:') . ' ' . htmlspecialchars($search, ENT_COMPAT,'UTF-8') + )); + } if($channel && $is_owner) { $channel_acl = array( @@ -152,7 +160,8 @@ class Channel extends \Zotlabs\Web\Controller { 'editor_autocomplete' => true, 'bbco_autocomplete' => 'bbcode', 'bbcode' => true, - 'jotnets' => true + 'jotnets' => true, + 'reset' => t('Reset form') ); $o .= status_editor($a,$x); @@ -178,6 +187,19 @@ class Channel extends \Zotlabs\Web\Controller { $simple_update = (($update) ? " AND item_unseen = 1 " : ''); + if($search) { + $search = escape_tags($search); + if(strpos($search,'#') === 0) { + $sql_extra .= term_query('item',substr($search,1),TERM_HASHTAG,TERM_COMMUNITYTAG); + } + else { + $sql_extra .= sprintf(" AND item.body like '%s' ", + dbesc(protect_sprintf('%' . $search . '%')) + ); + } + } + + head_add_link([ 'rel' => 'alternate', 'type' => 'application/json+oembed', @@ -228,11 +250,22 @@ class Channel extends \Zotlabs\Web\Controller { if($datequery) { $sql_extra2 .= protect_sprintf(sprintf(" AND item.created <= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery)))); + $order = 'post'; } if($datequery2) { $sql_extra2 .= protect_sprintf(sprintf(" AND item.created >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery2)))); } + if($datequery || $datequery2) { + $sql_extra2 .= " and item.item_thread_top != 0 "; + } + + if($order === 'post') + $ordering = "created"; + else + $ordering = "commented"; + + $itemspage = get_pconfig(local_channel(),'system','itemspage'); \App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20)); $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']), intval(\App::$pager['start'])); @@ -249,13 +282,13 @@ class Channel extends \Zotlabs\Web\Controller { } } else { - $r = q("SELECT item.parent AS item_id FROM item + $r = q("SELECT DISTINCT item.parent AS item_id, $ordering FROM item left join abook on ( item.author_xchan = abook.abook_xchan $abook_uids ) - WHERE true and item.uid = %d AND item.item_thread_top = 1 $item_normal + WHERE true and item.uid = %d $item_normal AND (abook.abook_blocked = 0 or abook.abook_flags is null) - AND item.item_wall = 1 - $sql_extra $sql_extra2 - ORDER BY created DESC, id $pager_sql ", + AND item.item_wall = 1 AND item.item_thread_top = 1 + $sql_extra $sql_extra2 + ORDER BY $ordering DESC $pager_sql ", intval(\App::$profile['profile_uid']) ); } @@ -264,7 +297,6 @@ class Channel extends \Zotlabs\Web\Controller { $r = array(); } } - if($r) { $parents_str = ids_to_querystr($r,'item_id'); @@ -280,7 +312,7 @@ class Channel extends \Zotlabs\Web\Controller { xchan_query($items); $items = fetch_post_tags($items, true); - $items = conv_sort($items,'created'); + $items = conv_sort($items,$ordering); if($load && $mid && (! count($items))) { // This will happen if we don't have sufficient permissions @@ -323,9 +355,9 @@ class Channel extends \Zotlabs\Web\Controller { '$fh' => '0', '$static' => $static, '$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1), - '$search' => '', + '$search' => $search, '$xchan' => '', - '$order' => '', + '$order' => $order, '$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0), '$file' => '', '$cats' => (($category) ? urlencode($category) : ''), @@ -371,12 +403,13 @@ class Channel extends \Zotlabs\Web\Controller { } } + $mode = (($search) ? 'search' : 'channel'); if($checkjs->disabled()) { - $o .= conversation($items,'channel',$update,'traditional'); + $o .= conversation($items,$mode,$update,'traditional'); } else { - $o .= conversation($items,'channel',$update,$page_mode); + $o .= conversation($items,$mode,$update,$page_mode); } if((! $update) || ($checkjs->disabled())) { diff --git a/Zotlabs/Module/Chatsvc.php b/Zotlabs/Module/Chatsvc.php index b4657e84d..d6708d95c 100644 --- a/Zotlabs/Module/Chatsvc.php +++ b/Zotlabs/Module/Chatsvc.php @@ -119,10 +119,10 @@ class Chatsvc extends \Zotlabs\Web\Controller { $rv['xchan_network'] = 'unknown'; $rv['xchan_url'] = z_root(); $rv['xchan_hidden'] = 1; - $rv['xchan_photo_mimetype'] = 'image/jpeg'; - $rv['xchan_photo_l'] = get_default_profile_photo(300); - $rv['xchan_photo_m'] = get_default_profile_photo(80); - $rv['xchan_photo_s'] = get_default_profile_photo(48); + $rv['xchan_photo_mimetype'] = 'image/png'; + $rv['xchan_photo_l'] = z_root() . '/' . get_default_profile_photo(300); + $rv['xchan_photo_m'] = z_root() . '/' . get_default_profile_photo(80); + $rv['xchan_photo_s'] = z_root() . '/' . get_default_profile_photo(48); } diff --git a/Zotlabs/Module/Cloud.php b/Zotlabs/Module/Cloud.php index 34397d275..1b330ecba 100644 --- a/Zotlabs/Module/Cloud.php +++ b/Zotlabs/Module/Cloud.php @@ -35,11 +35,20 @@ class Cloud extends \Zotlabs\Web\Controller { if (argc() > 1) $which = argv(1); + + if (argc() < 2 && intval(get_config('system','cloud_disable_siteroot'))) { + notice( t('Permission denied.') . EOL); + construct_page(); + killme(); + } + $profile = 0; if ($which) profile_load( $which, $profile); + + $auth = new \Zotlabs\Storage\BasicAuth(); $ob_hash = get_observer_hash(); diff --git a/Zotlabs/Module/Cover_photo.php b/Zotlabs/Module/Cover_photo.php index 76e80156c..b911ac991 100644 --- a/Zotlabs/Module/Cover_photo.php +++ b/Zotlabs/Module/Cover_photo.php @@ -9,6 +9,7 @@ namespace Zotlabs\Module; require_once('include/photo/photo_driver.php'); require_once('include/channel.php'); +require_once('include/photos.php'); @@ -84,10 +85,41 @@ class Cover_photo extends \Zotlabs\Web\Controller { ); if($r) { - - $base_image = $r[0]; - $base_image['content'] = (($r[0]['os_storage']) ? @file_get_contents(dbunescbin($base_image['content'])) : dbunescbin($base_image['content'])); - + + $max_thumb = intval(get_config('system','max_thumbnail',1600)); + $iscaled = false; + if(intval($r[0]['height']) > $max_thumb || intval($r[0]['width']) > $max_thumb) { + $imagick_path = get_config('system','imagick_convert_path'); + if($imagick_path && @file_exists($imagick_path) && intval($r[0]['os_storage'])) { + + $fname = dbunescbin($r[0]['content']); + $tmp_name = $fname . '-001'; + $newsize = photo_calculate_scale(array_merge(getimagesize($fname),['max' => $max_thumb])); + $cmd = $imagick_path . ' ' . escapeshellarg(PROJECT_BASE . '/' . $fname) . ' -resize ' . $newsize . ' ' . escapeshellarg(PROJECT_BASE . '/' . $tmp_name); + // logger('imagick thumbnail command: ' . $cmd); + for($x = 0; $x < 4; $x ++) { + exec($cmd); + if(file_exists($tmp_name)) { + break; + } + } + if(file_exists($tmp_name)) { + $base_image = $r[0]; + $gis = getimagesize($tmp_name); +logger('gis: ' . print_r($gis,true)); + $base_image['width'] = $gis[0]; + $base_image['height'] = $gis[1]; + $base_image['content'] = @file_get_contents($tmp_name); + $iscaled = true; + @unlink($tmp_name); + } + } + } + if(! $iscaled) { + $base_image = $r[0]; + $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()) { @@ -119,10 +151,10 @@ class Cover_photo extends \Zotlabs\Web\Controller { intval(local_channel()) ); - $orig_srcx = ( $r[0]['width'] / $scaled_width ) * $srcX; - $orig_srcy = ( $r[0]['height'] / $scaled_height ) * $srcY; - $orig_srcw = ( $srcW / $scaled_width ) * $r[0]['width']; - $orig_srch = ( $srcH / $scaled_height ) * $r[0]['height']; + $orig_srcx = ( $base_image['width'] / $scaled_width ) * $srcX; + $orig_srcy = ( $base_image['height'] / $scaled_height ) * $srcY; + $orig_srcw = ( $srcW / $scaled_width ) * $base_image['width']; + $orig_srch = ( $srcH / $scaled_height ) * $base_image['height']; $im->cropImageRect(1200,435,$orig_srcx, $orig_srcy, $orig_srcw, $orig_srch); diff --git a/Zotlabs/Module/Dirsearch.php b/Zotlabs/Module/Dirsearch.php index 08f1f7a13..81942860f 100644 --- a/Zotlabs/Module/Dirsearch.php +++ b/Zotlabs/Module/Dirsearch.php @@ -257,7 +257,7 @@ class Dirsearch extends \Zotlabs\Web\Controller { else { $r = q("SELECT xchan.*, xprof.* from xchan left join xprof on xchan_hash = xprof_hash - where ( $logic $sql_extra ) $hub_query and xchan_network = 'zot' and xchan_hidden = 0 and xchan_orphan = 0 and xchan_deleted = 0 + where ( $logic $sql_extra ) $hub_query and xchan_network = 'zot' and xchan_system = 0 and xchan_hidden = 0 and xchan_orphan = 0 and xchan_deleted = 0 $safesql $order $qlimit " ); diff --git a/Zotlabs/Module/Display.php b/Zotlabs/Module/Display.php index a5bcf31dc..fe0408c6f 100644 --- a/Zotlabs/Module/Display.php +++ b/Zotlabs/Module/Display.php @@ -67,8 +67,7 @@ class Display extends \Zotlabs\Web\Controller { 'default_location' => $channel['channel_location'], 'nickname' => $channel['channel_address'], 'lockstate' => (($group || $cid || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'), - - 'acl' => populate_acl($channel_acl), + 'acl' => populate_acl($channel_acl,true, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_stream'), get_post_aclDialogDescription(), 'acl_dialog_post'), 'permissions' => $channel_acl, 'bang' => '', 'visitor' => true, @@ -78,7 +77,8 @@ class Display extends \Zotlabs\Web\Controller { 'editor_autocomplete' => true, 'bbco_autocomplete' => 'bbcode', 'bbcode' => true, - 'jotnets' => true + 'jotnets' => true, + 'reset' => t('Reset form') ); $o = '<div id="jot-popup">'; diff --git a/Zotlabs/Module/Editblock.php b/Zotlabs/Module/Editblock.php index 8a7e87a09..563ad9ca2 100644 --- a/Zotlabs/Module/Editblock.php +++ b/Zotlabs/Module/Editblock.php @@ -138,6 +138,7 @@ class Editblock extends \Zotlabs\Web\Controller { '$title' => t('Edit Block'), '$delete' => ((($itm[0]['author_xchan'] === $ob_hash) || ($itm[0]['owner_xchan'] === $ob_hash)) ? t('Delete') : false), '$id' => $itm[0]['id'], + '$cancel' => t('Cancel'), '$editor' => $editor )); diff --git a/Zotlabs/Module/Editlayout.php b/Zotlabs/Module/Editlayout.php index 3d6a79507..67e0bcd32 100644 --- a/Zotlabs/Module/Editlayout.php +++ b/Zotlabs/Module/Editlayout.php @@ -137,6 +137,7 @@ class Editlayout extends \Zotlabs\Web\Controller { '$title' => t('Edit Layout'), '$delete' => ((($itm[0]['author_xchan'] === $ob_hash) || ($itm[0]['owner_xchan'] === $ob_hash)) ? t('Delete') : false), '$id' => $itm[0]['id'], + '$cancel' => t('Cancel'), '$editor' => $editor )); diff --git a/Zotlabs/Module/Editpost.php b/Zotlabs/Module/Editpost.php index 57a4cb97f..45d8e7644 100644 --- a/Zotlabs/Module/Editpost.php +++ b/Zotlabs/Module/Editpost.php @@ -106,6 +106,7 @@ class Editpost extends \Zotlabs\Web\Controller { $o .= replace_macros(get_markup_template('edpost_head.tpl'), array( '$title' => t('Edit post'), + '$cancel' => t('Cancel'), '$editor' => $editor )); diff --git a/Zotlabs/Module/Editwebpage.php b/Zotlabs/Module/Editwebpage.php index da536a729..b67421cd5 100644 --- a/Zotlabs/Module/Editwebpage.php +++ b/Zotlabs/Module/Editwebpage.php @@ -166,6 +166,7 @@ class Editwebpage extends \Zotlabs\Web\Controller { '$title' => t('Edit Webpage'), '$delete' => ((($itm[0]['author_xchan'] === $ob_hash) || ($itm[0]['owner_xchan'] === $ob_hash)) ? t('Delete') : false), '$editor' => $editor, + '$cancel' => t('Cancel'), '$id' => $itm[0]['id'] )); diff --git a/Zotlabs/Module/Filestorage.php b/Zotlabs/Module/Filestorage.php index 5c8557e5a..cd9ab601d 100644 --- a/Zotlabs/Module/Filestorage.php +++ b/Zotlabs/Module/Filestorage.php @@ -66,7 +66,7 @@ class Filestorage extends \Zotlabs\Web\Controller { $perms = get_all_perms($owner, $ob_hash); - if(! $perms['view_storage']) { + if(! ($perms['view_storage'] || is_site_admin())){ notice( t('Permission denied.') . EOL); return; } @@ -75,15 +75,29 @@ class Filestorage extends \Zotlabs\Web\Controller { // 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) { + if(! ($is_owner || is_site_admin())){ info( t('Permission Denied.') . EOL ); return; } if(argc() > 3 && argv(3) === 'delete') { + + if(argc() > 4 && argv(4) === 'json') + $json_return = true; + + + $admin_delete = false; + if(! $perms['write_storage']) { - notice( t('Permission denied.') . EOL); - return; + if(is_site_admin()) { + $admin_delete = true; + } + else { + notice( t('Permission denied.') . EOL); + if($json_return) + json_return_and_die([ 'success' => false ]); + return; + } } $file = intval(argv(2)); @@ -92,22 +106,31 @@ class Filestorage extends \Zotlabs\Web\Controller { intval($owner) ); if(! $r) { + if($json_return) + json_return_and_die([ 'success' => false ]); + notice( t('File not found.') . EOL); goaway(z_root() . '/cloud/' . $which); } $f = $r[0]; - $channel = \App::get_channel(); + + $channel = channelx_by_n($owner); $url = get_cloud_url($channel['channel_id'], $channel['channel_address'], $f['hash']); attach_delete($owner, $f['hash']); - $sync = attach_export_data($channel, $f['hash'], true); - if($sync) { - build_sync_packet($channel['channel_id'], array('file' => array($sync))); + if(! $admin_delete) { + $sync = attach_export_data($channel, $f['hash'], true); + if($sync) { + build_sync_packet($channel['channel_id'], array('file' => array($sync))); + } } + if(json_return) + json_return_and_die([ 'success' => true ]); + goaway(dirname($url)); } diff --git a/Zotlabs/Module/Group.php b/Zotlabs/Module/Group.php index 93a089d02..acebe995d 100644 --- a/Zotlabs/Module/Group.php +++ b/Zotlabs/Module/Group.php @@ -7,6 +7,17 @@ require_once('include/group.php'); class Group extends \Zotlabs\Web\Controller { + function init() { + if(! local_channel()) { + notice( t('Permission denied.') . EOL); + return; + } + + \App::$profile_uid = local_channel(); + + nav_set_selected('Privacy Groups'); + } + function post() { if(! local_channel()) { @@ -22,12 +33,10 @@ class Group extends \Zotlabs\Web\Controller { $r = group_add(local_channel(),$name,$public); if($r) { info( t('Privacy group created.') . EOL ); - $r = group_byname(local_channel(),$name); - if($r) - goaway(z_root() . '/group/' . $r); } - else - notice( t('Could not create privacy group.') . EOL ); + else { + notice( t('Could not create privacy group.') . EOL ); + } goaway(z_root() . '/group'); } @@ -74,30 +83,59 @@ class Group extends \Zotlabs\Web\Controller { notice( t('Permission denied') . EOL); return; } - + // Switch to text mode interface if we have more than 'n' contacts or group members - $switchtotext = get_pconfig(local_channel(),'system','groupedit_image_limit'); if($switchtotext === false) $switchtotext = get_config('system','groupedit_image_limit'); if($switchtotext === false) $switchtotext = 400; - - $tpl = get_markup_template('group_edit.tpl'); - $context = array('$submit' => t('Submit')); - - if((argc() == 2) && (argv(1) === 'new')) { - - return replace_macros($tpl, $context + array( - '$title' => t('Create a group of channels.'), - '$gname' => array('groupname',t('Privacy group name: '), '', ''), - '$gid' => 'new', - '$public' => array('public',t('Members are visible to other channels'), false, ''), + + + if((argc() == 1) || ((argc() == 2) && (argv(1) === 'new'))) { + + $new = (((argc() == 2) && (argv(1) === 'new')) ? true : false); + + $groups = q("SELECT id, gname FROM groups WHERE deleted = 0 AND uid = %d ORDER BY gname ASC", + intval(local_channel()) + ); + + $i = 0; + foreach($groups as $group) { + $entries[$i]['name'] = $group['gname']; + $entries[$i]['id'] = $group['id']; + $entries[$i]['count'] = count(group_get_members($group['id'])); + $i++; + } + + $tpl = get_markup_template('privacy_groups.tpl'); + $o = replace_macros($tpl, [ + '$title' => t('Privacy Groups'), + '$add_new_label' => t('Add Group'), + '$new' => $new, + + // new group form + '$gname' => array('groupname',t('Privacy group name')), + '$public' => array('public',t('Members are visible to other channels'), false), '$form_security_token' => get_form_security_token("group_edit"), - )); - - + '$submit' => t('Submit'), + + // groups list + '$title' => t('Privacy Groups'), + '$name_label' => t('Name'), + '$count_label' => t('Members'), + '$entries' => $entries + ]); + + return $o; + } + + + + + $context = array('$submit' => t('Submit')); + $tpl = get_markup_template('group_edit.tpl'); if((argc() == 3) && (argv(1) === 'drop')) { check_form_security_token_redirectOnErr('/group', 'group_drop', 't'); @@ -172,22 +210,17 @@ class Group extends \Zotlabs\Web\Controller { $preselected[] = $member['xchan_hash']; } } - - $drop_tpl = get_markup_template('group_drop.tpl'); - $drop_txt = replace_macros($drop_tpl, array( - '$id' => $group['id'], - '$delete' => t('Delete'), - '$form_security_token' => get_form_security_token("group_drop"), - )); - - + $context = $context + array( - '$title' => t('Privacy group editor'), + '$title' => sprintf(t('Privacy Group: %s'), $group['gname']), + '$details_label' => t('Edit'), '$gname' => array('groupname',t('Privacy group name: '),$group['gname'], ''), '$gid' => $group['id'], '$drop' => $drop_txt, '$public' => array('public',t('Members are visible to other channels'), $group['visible'], ''), - '$form_security_token' => get_form_security_token('group_edit'), + '$form_security_token_edit' => get_form_security_token('group_edit'), + '$delete' => t('Delete Group'), + '$form_security_token_drop' => get_form_security_token("group_drop"), ); } @@ -196,14 +229,14 @@ class Group extends \Zotlabs\Web\Controller { return; $groupeditor = array( - 'label_members' => t('Members'), + 'label_members' => t('Group members'), 'members' => array(), - 'label_contacts' => t('All Connected Channels'), + 'label_contacts' => t('Not in this group'), 'contacts' => array(), ); $sec_token = addslashes(get_form_security_token('group_member_change')); - $textmode = (($switchtotext && (count($members) > $switchtotext)) ? true : false); + $textmode = (($switchtotext && (count($members) > $switchtotext)) ? true : 'card'); foreach($members as $member) { if($member['xchan_url']) { $member['archived'] = (intval($member['abook_archived']) ? true : false); @@ -219,7 +252,7 @@ class Group extends \Zotlabs\Web\Controller { ); if(count($r)) { - $textmode = (($switchtotext && (count($r) > $switchtotext)) ? true : false); + $textmode = (($switchtotext && (count($r) > $switchtotext)) ? true : 'card'); foreach($r as $member) { if(! in_array($member['xchan_hash'],$preselected)) { $member['archived'] = (intval($member['abook_archived']) ? true : false); @@ -230,7 +263,7 @@ class Group extends \Zotlabs\Web\Controller { } $context['$groupeditor'] = $groupeditor; - $context['$desc'] = t('Click on a channel to add or remove.'); + $context['$desc'] = t('Click a channel to toggle membership'); if($change) { $tpl = get_markup_template('groupeditor.tpl'); diff --git a/Zotlabs/Module/Home.php b/Zotlabs/Module/Home.php index 79449c3b2..647a6412a 100644 --- a/Zotlabs/Module/Home.php +++ b/Zotlabs/Module/Home.php @@ -9,7 +9,7 @@ require_once('include/conversation.php'); class Home extends \Zotlabs\Web\Controller { function init() { - + $ret = array(); call_hooks('home_init',$ret); @@ -89,11 +89,11 @@ class Home extends \Zotlabs\Web\Controller { $sitename = get_config('system','sitename'); if($sitename) - $o .= '<h1 class="home-welcome">' . sprintf( t("Welcome to %s") ,$sitename) . '</h1>'; + $o .= '<h1 class="home-welcome">' . sprintf( t('Welcome to %s') ,$sitename) . '</h1>'; $loginbox = get_config('system','login_on_homepage'); if(intval($loginbox) || $loginbox === false) - $o .= login((\App::$config['system']['register_policy'] == REGISTER_CLOSED) ? 0 : 1); + $o .= login(true); return $o; diff --git a/Zotlabs/Module/Hq.php b/Zotlabs/Module/Hq.php index baeba82e8..fee4246c0 100644 --- a/Zotlabs/Module/Hq.php +++ b/Zotlabs/Module/Hq.php @@ -120,8 +120,7 @@ class Hq extends \Zotlabs\Web\Controller { 'default_location' => $channel['channel_location'], 'nickname' => $channel['channel_address'], 'lockstate' => (($group || $cid || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'), - - 'acl' => populate_acl($channel_acl), + 'acl' => populate_acl($channel_acl,true, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_stream'), get_post_aclDialogDescription(), 'acl_dialog_post'), 'permissions' => $channel_acl, 'bang' => '', 'visitor' => true, @@ -131,7 +130,8 @@ class Hq extends \Zotlabs\Web\Controller { 'editor_autocomplete' => true, 'bbco_autocomplete' => 'bbcode', 'bbcode' => true, - 'jotnets' => true + 'jotnets' => true, + 'reset' => t('Reset form') ]; $o = replace_macros(get_markup_template("hq.tpl"), diff --git a/Zotlabs/Module/Import.php b/Zotlabs/Module/Import.php index c36e4723a..d031bf16b 100644 --- a/Zotlabs/Module/Import.php +++ b/Zotlabs/Module/Import.php @@ -6,6 +6,7 @@ require_once('include/zot.php'); require_once('include/channel.php'); require_once('include/import.php'); require_once('include/perm_upgrade.php'); +require_once('library/urlify/URLify.php'); /** @@ -38,6 +39,7 @@ class Import extends \Zotlabs\Web\Controller { $filename = basename($_FILES['filename']['name']); $filesize = intval($_FILES['filename']['size']); $filetype = $_FILES['filename']['type']; + $newname = trim(strtolower($_REQUEST['newname'])); // import channel from file if($src) { @@ -146,7 +148,20 @@ class Import extends \Zotlabs\Web\Controller { } } - $channel = import_channel($data['channel'], $account_id, $seize); + if($newname) { + $x = false; + + if(get_config('system','unicode_usernames')) { + $x = punify(mb_strtolower($newname)); + } + + if((! $x) || strlen($x) > 64) { + $x = strtolower(\URLify::transliterate($newname)); + } + $newname = $x; + } + + $channel = import_channel($data['channel'], $account_id, $seize, $newname); } else { $moving = false; @@ -542,6 +557,7 @@ class Import extends \Zotlabs\Web\Controller { '$make_primary' => [ 'make_primary', t('Make this hub my primary location'), false, '', [ t('No'), t('Yes') ] ], '$moving' => [ 'moving', t('Move this channel (disable all previous locations)'), false, '', [ t('No'), t('Yes') ] ], + '$newname' => [ 'newname', t('Use this channel nickname instead of the one provided'), '', t('Leave blank to keep your existing channel nickname. You will be randomly assigned a similar nickname if either name is already allocated on this site.')], '$pleasewait' => t('This process may take several minutes to complete. Please submit the form only once and leave this page open until finished.'), diff --git a/Zotlabs/Module/Invite.php b/Zotlabs/Module/Invite.php index 0bcd1c1fa..359f99b3e 100644 --- a/Zotlabs/Module/Invite.php +++ b/Zotlabs/Module/Invite.php @@ -113,7 +113,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,uid,password,lang) VALUES ('%s', '%s',0,'','') ", dbesc($invite_code), dbesc(datetime_convert()) ); diff --git a/Zotlabs/Module/Item.php b/Zotlabs/Module/Item.php index bba1dc02d..ef1eb3700 100644 --- a/Zotlabs/Module/Item.php +++ b/Zotlabs/Module/Item.php @@ -528,22 +528,12 @@ class Item extends \Zotlabs\Web\Controller { // and will require alternatives for alternative content-types (text/html, text/markdown, text/plain, etc.) // we may need virtual or template classes to implement the possible alternatives - // If we're sending a private top-level message with a single @-taggable channel as a recipient, @-tag it, if our pconfig is set. - - if((! $parent) && (get_pconfig($profile_uid,'system','tagifonlyrecip')) && (substr_count($str_contact_allow,'<') == 1) && ($str_group_allow == '') && ($str_contact_deny == '') && ($str_group_deny == '')) { - $x = q("select abook_id, abconfig.v from abook left join abconfig on abook_xchan = abconfig.xchan and abook_channel = abconfig.chan and cat= 'their_perms' and abconfig.k = 'tag_deliver' and abconfig.v = 1 and abook_xchan = '%s' and abook_channel = %d limit 1", - dbesc(str_replace(array('<','>'),array('',''),$str_contact_allow)), - intval($profile_uid) - ); - if($x) - $body .= "\n\n@group+" . $x[0]['abook_id'] . "\n"; - } $body = cleanup_bbcode($body); // Look for tags and linkify them $results = linkify_tags($a, $body, ($uid) ? $uid : $profile_uid); - +logger('linkify: ' . print_r($results,true)); if($results) { // Set permissions based on tag replacements @@ -1084,24 +1074,36 @@ class Item extends \Zotlabs\Web\Controller { if((argc() == 3) && (argv(1) === 'drop') && intval(argv(2))) { require_once('include/items.php'); - $i = q("select id, uid, author_xchan, owner_xchan, source_xchan, item_type from item where id = %d limit 1", + + + $i = q("select id, uid, item_origin, author_xchan, owner_xchan, source_xchan, item_type from item where id = %d limit 1", intval(argv(2)) ); if($i) { $can_delete = false; $local_delete = false; - if(local_channel() && local_channel() == $i[0]['uid']) + + if(local_channel() && local_channel() == $i[0]['uid']) { $local_delete = true; - - $sys = get_sys_channel(); - if(is_site_admin() && $sys['channel_id'] == $i[0]['uid']) - $can_delete = true; + } $ob_hash = get_observer_hash(); - if($ob_hash && ($ob_hash === $i[0]['author_xchan'] || $ob_hash === $i[0]['owner_xchan'] || $ob_hash === $i[0]['source_xchan'])) + if($ob_hash && ($ob_hash === $i[0]['author_xchan'] || $ob_hash === $i[0]['owner_xchan'] || $ob_hash === $i[0]['source_xchan'])) { $can_delete = true; - + } + + // The site admin can delete any post/item on the site. + // If the item originated on this site+channel the deletion will propagate downstream. + // Otherwise just the local copy is removed. + + if(is_site_admin()) { + $local_delete = true; + if(intval($i[0]['item_origin'])) + $can_delete = true; + } + + if(! ($can_delete || $local_delete)) { notice( t('Permission denied.') . EOL); return; diff --git a/Zotlabs/Module/Linkinfo.php b/Zotlabs/Module/Linkinfo.php index 3392e4114..f0d62b5e0 100644 --- a/Zotlabs/Module/Linkinfo.php +++ b/Zotlabs/Module/Linkinfo.php @@ -55,10 +55,10 @@ class Linkinfo extends \Zotlabs\Web\Controller { $h = explode("\n",$result['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']; + if (array_key_exists('content-type', $hdrs)) + $type = $hdrs['content-type']; if($type) { $zrl = is_matrix_url($url); if(stripos($type,'image/') !== false) { @@ -82,6 +82,10 @@ class Linkinfo extends \Zotlabs\Web\Controller { echo $br . '[audio]' . $url . '[/audio]' . $br; killme(); } + if(strtolower($type) === 'application/pdf' || strtolower($type) === 'application/x-pdf') { + echo $br . '[embed]' . $url . '[/embed]' . $br; + killme(); + } } } diff --git a/Zotlabs/Module/Login.php b/Zotlabs/Module/Login.php index ae35b922f..6430939b4 100644 --- a/Zotlabs/Module/Login.php +++ b/Zotlabs/Module/Login.php @@ -10,7 +10,7 @@ class Login extends \Zotlabs\Web\Controller { if(remote_channel() && $_SESSION['atoken']) goaway(z_root()); - return login((\App::$config['system']['register_policy'] == REGISTER_CLOSED) ? false : true); + return login(true); } } diff --git a/Zotlabs/Module/Magic.php b/Zotlabs/Module/Magic.php index 562b7687f..be6866592 100644 --- a/Zotlabs/Module/Magic.php +++ b/Zotlabs/Module/Magic.php @@ -24,8 +24,6 @@ class Magic extends \Zotlabs\Web\Controller { if($bdest) $dest = hex2bin($bdest); - $dest = html_entity_decode($dest); - $parsed = parse_url($dest); if(! $parsed) { if($test) { @@ -145,6 +143,9 @@ class Magic extends \Zotlabs\Web\Controller { if($owa) { + $dest = strip_zids($dest); + $dest = strip_query_param($dest,'f'); + $headers = []; $headers['Accept'] = 'application/x-zot+json' ; $headers['X-Open-Web-Auth'] = random_string(); diff --git a/Zotlabs/Module/Manage.php b/Zotlabs/Module/Manage.php index 9c5c32294..2c88a4df0 100644 --- a/Zotlabs/Module/Manage.php +++ b/Zotlabs/Module/Manage.php @@ -156,7 +156,7 @@ class Manage extends \Zotlabs\Web\Controller { if($delegates) { for($x = 0; $x < count($delegates); $x ++) { - $delegates[$x]['link'] = 'magic?f=&dest=' . urlencode($delegates[$x]['xchan_url']) + $delegates[$x]['link'] = 'magic?f=&bdest=' . bin2hex($delegates[$x]['xchan_url']) . '&delegate=' . urlencode($delegates[$x]['xchan_addr']); $delegates[$x]['channel_name'] = $delegates[$x]['xchan_name']; $delegates[$x]['delegate'] = 1; diff --git a/Zotlabs/Module/Menu.php b/Zotlabs/Module/Menu.php index 1dec65c1f..1687a4414 100644 --- a/Zotlabs/Module/Menu.php +++ b/Zotlabs/Module/Menu.php @@ -7,18 +7,36 @@ require_once('include/channel.php'); class Menu extends \Zotlabs\Web\Controller { + function init() { - if (array_key_exists('sys', $_REQUEST) && $_REQUEST['sys'] && is_site_admin()) { + + if(argc() > 1 && argv(1) === 'sys' && is_site_admin()) { $sys = get_sys_channel(); - if ($sys && intval($sys['channel_id'])) { + if($sys && intval($sys['channel_id'])) { \App::$is_sys = true; } } + + if(argc() > 1) + $which = argv(1); + else + return; + + profile_load($which); + } + - function post() { + function post() { - $uid = local_channel(); + if(! \App::$profile) { + return; + } + + $which = argv(1); + + + $uid = \App::$profile['channel_id']; if(array_key_exists('sys', $_REQUEST) && $_REQUEST['sys'] && is_site_admin()) { $sys = get_sys_channel(); @@ -43,7 +61,7 @@ class Menu extends \Zotlabs\Web\Controller { if($r) { menu_sync_packet($uid,get_observer_hash(),$menu_id); //info( t('Menu updated.') . EOL); - goaway(z_root() . '/mitem/' . $menu_id . ((\App::$is_sys) ? '?f=&sys=1' : '')); + goaway(z_root() . '/mitem/' . $which . '/' . $menu_id . ((\App::$is_sys) ? '?f=&sys=1' : '')); } else notice( t('Unable to update menu.'). EOL); @@ -54,7 +72,7 @@ class Menu extends \Zotlabs\Web\Controller { menu_sync_packet($uid,get_observer_hash(),$r); //info( t('Menu created.') . EOL); - goaway(z_root() . '/mitem/' . $r . ((\App::$is_sys) ? '?f=&sys=1' : '')); + goaway(z_root() . '/mitem/' . $which . '/' . $r . ((\App::$is_sys) ? '?f=&sys=1' : '')); } else notice( t('Unable to create menu.'). EOL); @@ -67,27 +85,71 @@ class Menu extends \Zotlabs\Web\Controller { function get() { + + + if(! \App::$profile) { + notice( t('Requested profile is not available.') . EOL ); + \App::$error = 404; + return; + } + + $which = argv(1); + + $_SESSION['return_url'] = \App::$query_string; + $uid = local_channel(); - - if (\App::$is_sys && is_site_admin()) { + $owner = 0; + $channel = null; + $observer = \App::get_observer(); + + $channel = \App::get_channel(); + + if(\App::$is_sys && is_site_admin()) { $sys = get_sys_channel(); - $uid = intval($sys['channel_id']); + if($sys && intval($sys['channel_id'])) { + $uid = $owner = intval($sys['channel_id']); + $channel = $sys; + $observer = $sys; + } } - - if(! $uid) { + + if(! $owner) { + // Figure out who the page owner is. + $r = channelx_by_nick($which); + if($r) { + $owner = intval($r['channel_id']); + } + } + + $ob_hash = (($observer) ? $observer['xchan_hash'] : ''); + + $perms = get_all_perms($owner,$ob_hash); + + if(! $perms['write_pages']) { notice( t('Permission denied.') . EOL); - return ''; + return; } + + // Get the observer, check their permissions + + $ob_hash = (($observer) ? $observer['xchan_hash'] : ''); + + $perms = get_all_perms($owner,$ob_hash); + + if(! $perms['write_pages']) { + notice( t('Permission denied.') . EOL); + return; + } + + if(argc() == 2) { - if(argc() == 1) { - - $channel = (($sys) ? $sys : \App::get_channel()); + $channel = (($sys) ? $sys : channelx_by_n($owner)); // list menus - $x = menu_list($uid); + $x = menu_list($owner); if($x) { for($y = 0; $y < count($x); $y ++) { - $m = menu_fetch($x[$y]['menu_name'],$uid,get_observer_hash()); + $m = menu_fetch($x[$y]['menu_name'],$owner,get_observer_hash()); if($m) $x[$y]['element'] = '[element]' . base64url_encode(json_encode(menu_element($channel,$m))) . '[/element]'; $x[$y]['bookmark'] = (($x[$y]['menu_flags'] & MENU_BOOKMARK) ? true : false); @@ -100,6 +162,7 @@ class Menu extends \Zotlabs\Web\Controller { '$menu_bookmark' => array('menu_bookmark', t('Allow Bookmarks'), 0 , t('Menu may be used to store saved bookmarks'), array(t('No'), t('Yes'))), '$submit' => t('Submit and proceed'), '$sys' => \App::$is_sys, + '$nick' => $which, '$display' => 'none' )); @@ -119,6 +182,7 @@ class Menu extends \Zotlabs\Web\Controller { '$hintdrop' => t('Delete this menu'), '$hintcontent' => t('Edit menu contents'), '$hintedit' => t('Edit this menu'), + '$nick' => $which, '$sys' => \App::$is_sys )); @@ -126,19 +190,19 @@ class Menu extends \Zotlabs\Web\Controller { } - if(argc() > 1) { - if(intval(argv(1))) { + if(argc() > 2) { + if(intval(argv(2))) { - if(argc() == 3 && argv(2) == 'drop') { - menu_sync_packet($uid,get_observer_hash(),intval(argv(1)),true); - $r = menu_delete_id(intval(argv(1)),$uid); + if(argc() == 4 && argv(3) == 'drop') { + menu_sync_packet($owner,get_observer_hash(),intval(argv(1)),true); + $r = menu_delete_id(intval(argv(2)),$owner); if(!$r) notice( t('Menu could not be deleted.'). EOL); - goaway(z_root() . '/menu' . ((\App::$is_sys) ? '?f=&sys=1' : '')); + goaway(z_root() . '/menu/' . $which . ((\App::$is_sys) ? '?f=&sys=1' : '')); } - $m = menu_fetch_id(intval(argv(1)),$uid); + $m = menu_fetch_id(intval(argv(2)),$owner); if(! $m) { notice( t('Menu not found.') . EOL); @@ -148,14 +212,15 @@ class Menu extends \Zotlabs\Web\Controller { $o = replace_macros(get_markup_template('menuedit.tpl'), array( '$header' => t('Edit Menu'), '$sys' => \App::$is_sys, - '$menu_id' => intval(argv(1)), - '$menu_edit_link' => 'mitem/' . intval(argv(1)) . ((\App::$is_sys) ? '?f=&sys=1' : ''), + '$menu_id' => intval(argv(2)), + '$menu_edit_link' => 'mitem/' . $which . '/' . intval(argv(1)) . ((\App::$is_sys) ? '?f=&sys=1' : ''), '$hintedit' => t('Add or remove entries to this menu'), '$editcontents' => t('Edit menu contents'), '$menu_name' => array('menu_name', t('Menu name'), $m['menu_name'], t('Must be unique, only seen by you'), '*'), '$menu_desc' => array('menu_desc', t('Menu title'), $m['menu_desc'], t('Menu title as seen by others'), ''), '$menu_bookmark' => array('menu_bookmark', t('Allow bookmarks'), (($m['menu_flags'] & MENU_BOOKMARK) ? 1 : 0), t('Menu may be used to store saved bookmarks'), array(t('No'), t('Yes'))), '$menu_system' => (($m['menu_flags'] & MENU_SYSTEM) ? 1 : 0), + '$nick' => $which, '$submit' => t('Submit and proceed') )); diff --git a/Zotlabs/Module/Mitem.php b/Zotlabs/Module/Mitem.php index 28f51b81b..ac7470e13 100644 --- a/Zotlabs/Module/Mitem.php +++ b/Zotlabs/Module/Mitem.php @@ -8,22 +8,25 @@ require_once('include/acl_selectors.php'); class Mitem extends \Zotlabs\Web\Controller { function init() { - - $uid = local_channel(); - - if(array_key_exists('sys',$_REQUEST) && $_REQUEST['sys'] && is_site_admin()) { + + if(argc() > 1 && argv(1) === 'sys' && is_site_admin()) { $sys = get_sys_channel(); - $uid = intval($sys['channel_id']); - \App::$is_sys = true; + if($sys && intval($sys['channel_id'])) { + \App::$is_sys = true; + } } - - if(! $uid) + + if(argc() > 1) + $which = argv(1); + else return; + + profile_load($which); - if(argc() < 2) + if(argc() < 3) return; - $m = menu_fetch_id(intval(argv(1)),$uid); + $m = menu_fetch_id(intval(argv(2)),\App::$profile['channel_id']); if(! $m) { notice( t('Menu not found.') . EOL); return ''; @@ -32,19 +35,27 @@ class Mitem extends \Zotlabs\Web\Controller { } - function post() { + function post() { - $uid = local_channel(); + if(! \App::$profile) { + return; + } + + $which = argv(1); + + + $uid = \App::$profile['channel_id']; - if(\App::$is_sys && is_site_admin()) { + if(array_key_exists('sys', $_REQUEST) && $_REQUEST['sys'] && is_site_admin()) { $sys = get_sys_channel(); $uid = intval($sys['channel_id']); + \App::$is_sys = true; } - if(! $uid) { + if(! $uid) return; - } - + + if(! \App::$data['menu']) return; @@ -63,14 +74,14 @@ class Mitem extends \Zotlabs\Web\Controller { $_REQUEST['mitem_flags'] |= MENU_ITEM_NEWWIN; - $mitem_id = ((argc() > 2) ? intval(argv(2)) : 0); + $mitem_id = ((argc() > 3) ? intval(argv(3)) : 0); if($mitem_id) { $_REQUEST['mitem_id'] = $mitem_id; $r = menu_edit_item($_REQUEST['menu_id'],$uid,$_REQUEST); if($r) { menu_sync_packet($uid,get_observer_hash(),$_REQUEST['menu_id']); //info( t('Menu element updated.') . EOL); - goaway(z_root() . '/mitem/' . $_REQUEST['menu_id'] . ((\App::$is_sys) ? '?f=&sys=1' : '')); + goaway(z_root() . '/mitem/' . $which . '/' . $_REQUEST['menu_id'] . ((\App::$is_sys) ? '?f=&sys=1' : '')); } else notice( t('Unable to update menu element.') . EOL); @@ -82,10 +93,10 @@ class Mitem extends \Zotlabs\Web\Controller { menu_sync_packet($uid,get_observer_hash(),$_REQUEST['menu_id']); //info( t('Menu element added.') . EOL); if($_REQUEST['submit']) { - goaway(z_root() . '/menu' . ((\App::$is_sys) ? '?f=&sys=1' : '')); + goaway(z_root() . '/menu/' . $which . ((\App::$is_sys) ? '?f=&sys=1' : '')); } if($_REQUEST['submit-more']) { - goaway(z_root() . '/mitem/' . $_REQUEST['menu_id'] . '?f=&display=block' . ((\App::$is_sys) ? '&sys=1' : '') ); + goaway(z_root() . '/mitem/' . $which . '/' . $_REQUEST['menu_id'] . '?f=&display=block' . ((\App::$is_sys) ? '&sys=1' : '') ); } } else @@ -96,12 +107,15 @@ class Mitem extends \Zotlabs\Web\Controller { } - function get() { + function get() { $uid = local_channel(); - $channel = \App::get_channel(); + $owner = \App::$profile['channel_id']; + $channel = channelx_by_n($owner); $observer = \App::get_observer(); - + + $which = argv(1); + $ob_hash = (($observer) ? $observer['xchan_hash'] : ''); if(\App::$is_sys && is_site_admin()) { @@ -116,15 +130,15 @@ class Mitem extends \Zotlabs\Web\Controller { return ''; } - if(argc() < 2 || (! \App::$data['menu'])) { + if(argc() < 3 || (! \App::$data['menu'])) { notice( t('Not found.') . EOL); return ''; } - $m = menu_fetch(\App::$data['menu']['menu_name'],$uid,$ob_hash); + $m = menu_fetch(\App::$data['menu']['menu_name'],$owner,$ob_hash); \App::$data['menu_item'] = $m; - $menu_list = menu_list($uid); + $menu_list = menu_list($owner); foreach($menu_list as $menus) { if($menus['menu_name'] != $m['menu']['menu_name']) @@ -135,10 +149,10 @@ class Mitem extends \Zotlabs\Web\Controller { $lockstate = (($channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'); - if(argc() == 2) { + if(argc() == 3) { $r = q("select * from menu_item where mitem_menu_id = %d and mitem_channel_id = %d order by mitem_order asc, mitem_desc asc", intval(\App::$data['menu']['menu_id']), - intval($uid) + intval($owner) ); if($_GET['display']) { @@ -167,6 +181,7 @@ class Mitem extends \Zotlabs\Web\Controller { '$display' => $display, '$lockstate' => $lockstate, '$menu_names' => $menu_names, + '$nick' => $which, '$sys' => \App::$is_sys )); @@ -187,40 +202,41 @@ class Mitem extends \Zotlabs\Web\Controller { '$hintnew' => t('Add menu element'), '$hintdrop' => t('Delete this menu item'), '$hintedit' => t('Edit this menu item'), + '$nick' => $which, )); return $o; } - if(argc() > 2) { - - if(intval(argv(2))) { + if(argc() > 3) { + + if(intval(argv(3))) { $m = q("select * from menu_item where mitem_id = %d and mitem_channel_id = %d limit 1", - intval(argv(2)), - intval($uid) + intval(argv(3)), + intval($owner) ); if(! $m) { notice( t('Menu item not found.') . EOL); - goaway(z_root() . '/menu'. ((\App::$is_sys) ? '?f=&sys=1' : '')); + goaway(z_root() . '/menu/'. $which . ((\App::$is_sys) ? '?f=&sys=1' : '')); } $mitem = $m[0]; $lockstate = (($mitem['allow_cid'] || $mitem['allow_gid'] || $mitem['deny_cid'] || $mitem['deny_gid']) ? 'lock' : 'unlock'); - if(argc() == 4 && argv(3) == 'drop') { - menu_sync_packet($uid,get_observer_hash(),$mitem['mitem_menu_id']); - $r = menu_del_item($mitem['mitem_menu_id'], $uid, intval(argv(2))); - menu_sync_packet($uid,get_observer_hash(),$mitem['mitem_menu_id']); + if(argc() == 5 && argv(4) == 'drop') { + menu_sync_packet($owner,get_observer_hash(),$mitem['mitem_menu_id']); + $r = menu_del_item($mitem['mitem_menu_id'], $owner, intval(argv(3))); + menu_sync_packet($owner,get_observer_hash(),$mitem['mitem_menu_id']); if($r) info( t('Menu item deleted.') . EOL); else notice( t('Menu item could not be deleted.'). EOL); - goaway(z_root() . '/mitem/' . $mitem['mitem_menu_id'] . ((\App::$is_sys) ? '?f=&sys=1' : '')); + goaway(z_root() . '/mitem/' . $which . '/' . $mitem['mitem_menu_id'] . ((\App::$is_sys) ? '?f=&sys=1' : '')); } // edit menu item @@ -234,7 +250,7 @@ class Mitem extends \Zotlabs\Web\Controller { '$allow_gid' => acl2json($mitem['allow_gid']), '$deny_cid' => acl2json($mitem['deny_cid']), '$deny_gid' => acl2json($mitem['deny_gid']), - '$mitem_id' => intval(argv(2)), + '$mitem_id' => intval(argv(3)), '$mitem_desc' => array('mitem_desc', t('Link text'), $mitem['mitem_desc'], '','*'), '$mitem_link' => array('mitem_link', t('Link or Submenu Target'), $mitem['mitem_link'], 'Enter URL of the link or select a menu name to create a submenu', '*', 'list="menu-names"'), '$usezid' => array('usezid', t('Use magic-auth if available'), (($mitem['mitem_flags'] & MENU_ITEM_ZID) ? 1 : 0), '', array(t('No'), t('Yes'))), @@ -242,7 +258,8 @@ class Mitem extends \Zotlabs\Web\Controller { '$mitem_order' => array('mitem_order', t('Order in list'),$mitem['mitem_order'],t('Higher numbers will sink to bottom of listing')), '$submit' => t('Submit'), '$lockstate' => $lockstate, - '$menu_names' => $menu_names + '$menu_names' => $menu_names, + '$nick' => $which )); return $o; diff --git a/Zotlabs/Module/Network.php b/Zotlabs/Module/Network.php index edbcd2ea7..77a08585b 100644 --- a/Zotlabs/Module/Network.php +++ b/Zotlabs/Module/Network.php @@ -15,6 +15,9 @@ class Network extends \Zotlabs\Web\Controller { notice( t('Permission denied.') . EOL); return; } + + if(in_array(substr($_GET['search'],0,1),[ '@', '!', '?'])) + goaway('search' . '?f=&search=' . $_GET['search']); if(count($_GET) < 2) { $network_options = get_pconfig(local_channel(),'system','network_page_default'); @@ -57,13 +60,26 @@ 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'] : ''); $verb = ((x($_REQUEST,'verb')) ? $_REQUEST['verb'] : ''); - + + + $order = get_pconfig(local_channel(), 'mod_network', 'order', 0); + switch($order) { + case 0: + $order = 'comment'; + break; + case 1: + $order = 'post'; + break; + case 2: + $nouveau = true; + break; + } + $search = (($_GET['search']) ? $_GET['search'] : ''); if($search) { $_GET['netsearch'] = escape_tags($search); @@ -84,7 +100,7 @@ class Network extends \Zotlabs\Web\Controller { } if($datequery) - $_GET['order'] = 'post'; + $order = 'post'; // filter by collection (e.g. group) @@ -110,12 +126,8 @@ class Network extends \Zotlabs\Web\Controller { $default_cmin = ((feature_enabled(local_channel(),'affinity')) ? get_pconfig(local_channel(),'affinity','cmin',0) : (-1)); $default_cmax = ((feature_enabled(local_channel(),'affinity')) ? get_pconfig(local_channel(),'affinity','cmax',99) : (-1)); - - // if no tabs are selected, defaults to comments - $cid = ((x($_GET,'cid')) ? intval($_GET['cid']) : 0); $star = ((x($_GET,'star')) ? intval($_GET['star']) : 0); - $order = ((x($_GET,'order')) ? notags($_GET['order']) : 'comment'); $liked = ((x($_GET,'liked')) ? intval($_GET['liked']) : 0); $conv = ((x($_GET,'conv')) ? intval($_GET['conv']) : 0); $spam = ((x($_GET,'spam')) ? intval($_GET['spam']) : 0); @@ -124,18 +136,21 @@ class Network extends \Zotlabs\Web\Controller { $file = ((x($_GET,'file')) ? $_GET['file'] : ''); $xchan = ((x($_GET,'xchan')) ? $_GET['xchan'] : ''); $net = ((x($_GET,'net')) ? $_GET['net'] : ''); + $pf = ((x($_GET,'pf')) ? $_GET['pf'] : ''); $deftag = ''; - if(x($_GET,'search') || x($_GET,'file')) + + if(x($_GET,'search') || $file || (!$pf && $cid)) $nouveau = true; if($cid) { - $r = q("SELECT abook_xchan FROM abook WHERE abook_id = %d AND abook_channel = %d LIMIT 1", + $cid_r = q("SELECT abook.abook_xchan, xchan.xchan_addr, xchan.xchan_name, xchan.xchan_url, xchan.xchan_photo_s, xchan.xchan_pubforum from abook left join xchan on abook_xchan = xchan_hash where abook_id = %d and abook_channel = %d and abook_blocked = 0 limit 1", intval($cid), intval(local_channel()) ); - if(! $r) { + + if(! $cid_r) { if($update) { killme(); } @@ -143,14 +158,14 @@ class Network extends \Zotlabs\Web\Controller { goaway(z_root() . '/network'); // NOTREACHED } - if($_GET['pf'] === '1') - $deftag = '!' . t('forum') . '+' . intval($cid); + if($pf) + $deftag = '!{' . (($cid_r[0]['xchan_addr']) ? $cid_r[0]['xchan_addr'] : $cid_r[0]['xchan_url']) . '}'; else - $def_acl = [ 'allow_cid' => '<' . $r[0]['abook_xchan'] . '>', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '' ]; + $def_acl = [ 'allow_cid' => '<' . $cid_r[0]['abook_xchan'] . '>', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '' ]; } if(! $update) { - $tabs = network_tabs(); + $tabs = ''; //network_tabs(); $o .= $tabs; // search terms header @@ -185,7 +200,8 @@ class Network extends \Zotlabs\Web\Controller { 'editor_autocomplete' => true, 'bbco_autocomplete' => 'bbcode', 'bbcode' => true, - 'jotnets' => true + 'jotnets' => true, + 'reset' => t('Reset form') ); if($deftag) $x['pretext'] = $deftag; @@ -218,17 +234,16 @@ class Network extends \Zotlabs\Web\Controller { $contact_str = ''; $contacts = group_get_members($group); if($contacts) { - foreach($contacts as $c) { - if($contact_str) - $contact_str .= ','; - $contact_str .= "'" . $c['xchan'] . "'"; - } + $contact_str = ids_to_querystr($contacts,'xchan',true); } else { - $contact_str = ' 0 '; - info( t('Privacy group is empty')); + $contact_str = " '0' "; + if(! $update) { + info( t('Privacy group is empty')); + } } $item_thread_top = ''; + $sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND (( author_xchan IN ( $contact_str ) OR owner_xchan in ( $contact_str )) or allow_gid like '" . protect_sprintf('%<' . dbesc($group_hash) . '>%') . "' ) and id = parent $item_normal ) "; $x = group_rec_byhash(local_channel(), $group_hash); @@ -244,27 +259,31 @@ class Network extends \Zotlabs\Web\Controller { $o .= $status_editor; } - - elseif($cid) { - - $r = q("SELECT abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash where abook_id = %d and abook_channel = %d and abook_blocked = 0 limit 1", - intval($cid), - intval(local_channel()) - ); - if($r) { - $item_thread_top = ''; - $sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND uid = " . intval(local_channel()) . " AND ( author_xchan = '" . dbesc($r[0]['abook_xchan']) . "' or owner_xchan = '" . dbesc($r[0]['abook_xchan']) . "' ) $item_normal ) "; - $title = replace_macros(get_markup_template("section_title.tpl"),array( - '$title' => '<a href="' . zid($r[0]['xchan_url']) . '" ><img src="' . zid($r[0]['xchan_photo_s']) . '" alt="' . urlencode($r[0]['xchan_name']) . '" /></a> <a href="' . zid($r[0]['xchan_url']) . '" >' . $r[0]['xchan_name'] . '</a>' - )); - $o = $tabs; - $o .= $title; - $o .= $status_editor; - } - else { - notice( t('Invalid connection.') . EOL); - goaway(z_root() . '/network'); + elseif($cid_r) { + $item_thread_top = ''; + + if($load || $update) { + if(!$pf && $nouveau) { + $sql_extra = " AND author_xchan = '" . dbesc($cid_r[0]['abook_xchan']) . "' "; + } + else { + $ttype = (($pf) ? TERM_FORUM : TERM_MENTION); + + $p1 = q("SELECT DISTINCT parent FROM item WHERE uid = " . intval(local_channel()) . " AND ( author_xchan = '" . dbesc($cid_r[0]['abook_xchan']) . "' OR owner_xchan = '" . dbesc($cid_r[0]['abook_xchan']) . "' ) $item_normal "); + $p2 = q("SELECT oid AS parent FROM term WHERE uid = " . intval(local_channel()) . " AND ttype = $ttype AND term = '" . dbesc($cid_r[0]['xchan_name']) . "'"); + + $p_str = ids_to_querystr(array_merge($p1,$p2),'parent'); + $sql_extra = " AND item.parent IN ( $p_str ) "; + } } + + $title = replace_macros(get_markup_template("section_title.tpl"),array( + '$title' => '<a href="' . zid($cid_r[0]['xchan_url']) . '" ><img src="' . zid($cid_r[0]['xchan_photo_s']) . '" alt="' . urlencode($cid_r[0]['xchan_name']) . '" /></a> <a href="' . zid($cid_r[0]['xchan_url']) . '" >' . $cid_r[0]['xchan_name'] . '</a>' + )); + + $o = $tabs; + $o .= $title; + $o .= $status_editor; } elseif($xchan) { $r = q("select * from xchan where xchan_hash = '%s'", @@ -338,7 +357,8 @@ class Network extends \Zotlabs\Web\Controller { '$mid' => '', '$verb' => $verb, '$net' => $net, - '$dbegin' => $datequery2 + '$dbegin' => $datequery2, + '$pf' => (($pf) ? $pf : '0'), )); } @@ -378,9 +398,15 @@ class Network extends \Zotlabs\Web\Controller { if($conv) { $item_thread_top = ''; - $sql_extra .= sprintf(" AND parent IN (SELECT distinct(parent) from item where ( author_xchan like '%s' or item_mentionsme = 1 )) ", - dbesc(protect_sprintf($channel['channel_hash'])) - ); + + if($nouveau) { + $sql_extra .= " AND author_xchan = '" . dbesc($channel['channel_hash']) . "' "; + } + else { + $sql_extra .= sprintf(" AND parent IN (SELECT distinct(parent) from item where ( author_xchan = '%s' or item_mentionsme = 1 )) ", + dbesc(protect_sprintf($channel['channel_hash'])) + ); + } } if($update && ! $load) { @@ -454,7 +480,7 @@ class Network extends \Zotlabs\Web\Controller { if($nouveau && $load) { // "New Item View" - show all items unthreaded in reverse created date order - $items = q("SELECT item.*, item.id AS item_id, received FROM item + $items = q("SELECT item.*, item.id AS item_id, created FROM item left join abook on ( item.owner_xchan = abook.abook_xchan $abook_uids ) $net_query WHERE true $uids $item_normal @@ -462,7 +488,7 @@ class Network extends \Zotlabs\Web\Controller { $simple_update $sql_extra $sql_options $sql_nets $net_query2 - ORDER BY item.received DESC $pager_sql " + ORDER BY item.created DESC $pager_sql " ); require_once('include/items.php'); @@ -476,12 +502,11 @@ class Network extends \Zotlabs\Web\Controller { // Normal conversation view if($order === 'post') - $ordering = "created"; + $ordering = "created"; else - $ordering = "commented"; + $ordering = "commented"; if($load) { - // Fetch a page full of parent items for this page $r = q("SELECT item.parent AS item_id FROM item left join abook on ( item.owner_xchan = abook.abook_xchan $abook_uids ) @@ -562,6 +587,9 @@ class Network extends \Zotlabs\Web\Controller { } $mode = (($nouveau) ? 'network-new' : 'network'); + + if($search) + $mode = 'search'; $o .= conversation($items,$mode,$update,$page_mode); diff --git a/Zotlabs/Module/New_channel.php b/Zotlabs/Module/New_channel.php index d9becbc22..97a46a43e 100644 --- a/Zotlabs/Module/New_channel.php +++ b/Zotlabs/Module/New_channel.php @@ -41,7 +41,7 @@ class New_channel extends \Zotlabs\Web\Controller { $test[] = legal_webbie($x); // fullname plus random number $test[] = legal_webbie($x) . mt_rand(1000,9999); - + json_return_and_die(check_webbie($test)); } @@ -49,7 +49,10 @@ class New_channel extends \Zotlabs\Web\Controller { require_once('library/urlify/URLify.php'); $result = array('error' => false, 'message' => ''); $n = trim($_REQUEST['nick']); - + if(! $n) { + $n = trim($_REQUEST['name']); + } + $x = false; if(get_config('system','unicode_usernames')) { @@ -58,9 +61,20 @@ class New_channel extends \Zotlabs\Web\Controller { if((! $x) || strlen($x) > 64) $x = strtolower(\URLify::transliterate($n)); - + + $test = array(); + // first name + if(strpos($x,' ')) + $test[] = legal_webbie(substr($x,0,strpos($x,' '))); + if($test[0]) { + // first name plus first initial of last + $test[] = ((strpos($x,' ')) ? $test[0] . legal_webbie(trim(substr($x,strpos($x,' '),2))) : ''); + // first name plus random number + $test[] = $test[0] . mt_rand(1000,9999); + } + $n = legal_webbie($x); if(strlen($n)) { $test[] = $n; @@ -124,7 +138,7 @@ class New_channel extends \Zotlabs\Web\Controller { intval($aid) ); if($r && (! intval($r[0]['total']))) { - $default_role = get_config('system','default_permissions_role'); + $default_role = get_config('system','default_permissions_role','social'); } $limit = account_service_class_fetch(get_account_id(),'total_identities'); @@ -136,21 +150,35 @@ class New_channel extends \Zotlabs\Web\Controller { $channel_usage_message = ''; } } - + + $name_help = '<span id="name_help_loading" style="display:none">' . t('Loading') . '</span><span id="name_help_text">'; + $name_help .= (($default_role) + ? t('Your real name is recommended.') + : t('Examples: "Bob Jameson", "Lisa and her Horses", "Soccer", "Aviation Group"') + ); + $name_help .= '</span>'; + + $nick_help = '<span id="nick_help_loading" style="display:none">' . t('Loading') . '</span><span id="nick_help_text">'; + $nick_help .= t('This will be used to create a unique network address (like an email address).'); + if(! get_config('system','unicode_usernames')) { + $nick_help .= ' ' . t('Allowed characters are a-z 0-9, - and _'); + } + $nick_help .= '<span>'; + $privacy_role = ((x($_REQUEST,'permissions_role')) ? $_REQUEST['permissions_role'] : "" ); $perm_roles = \Zotlabs\Access\PermissionRoles::roles(); if((get_account_techlevel() < 4) && $privacy_role !== 'custom') unset($perm_roles[t('Other')]); - $name = array('name', t('Name or caption'), ((x($_REQUEST,'name')) ? $_REQUEST['name'] : ''), t('Examples: "Bob Jameson", "Lisa and her Horses", "Soccer", "Aviation Group"'), "*"); + $name = array('name', t('Channel name'), ((x($_REQUEST,'name')) ? $_REQUEST['name'] : ''), $name_help, "*"); $nickhub = '@' . \App::get_hostname(); - $nickname = array('nickname', t('Choose a short nickname'), ((x($_REQUEST,'nickname')) ? $_REQUEST['nickname'] : ''), sprintf( t('Your nickname will be used to create an easy to remember channel address e.g. nickname%s'), $nickhub), "*"); - $role = array('permissions_role' , t('Channel role and privacy'), ($privacy_role) ? $privacy_role : 'social', t('Select a channel role with your privacy requirements.') . ' <a href="help/member/member_guide#Channel_Permission_Roles" target="_blank">' . t('Read more about roles') . '</a>',$perm_roles); + $nickname = array('nickname', t('Choose a short nickname'), ((x($_REQUEST,'nickname')) ? $_REQUEST['nickname'] : ''), $nick_help, "*"); + $role = array('permissions_role' , t('Channel role and privacy'), ($privacy_role) ? $privacy_role : 'social', t('Select a channel permission role compatible with your usage needs and privacy requirements.') . '<br>' . '<a href="help/member/member_guide#Channel_Permission_Roles" target="_blank">' . t('Read more about channel permission roles') . '</a>',$perm_roles); $o = replace_macros(get_markup_template('new_channel.tpl'), array( - '$title' => t('Create Channel'), - '$desc' => t('A channel is a unique network identity. It can represent a person (social network profile), a forum (group), a business or celebrity page, a newsfeed, and many other things. Channels can make connections with other channels to share information with each other.') . ' ' . t('The type of channel you create affects the basic privacy settings, the permissions that are granted to connections/friends, and also the channel\'s visibility across the network.'), + '$title' => t('Create a Channel'), + '$desc' => t('A channel is a unique network identity. It can represent a person (social network profile), a forum (group), a business or celebrity page, a newsfeed, and many other things.') , '$label_import' => t('or <a href="import">import an existing channel</a> from another location.'), '$name' => $name, '$role' => $role, diff --git a/Zotlabs/Module/Nojs.php b/Zotlabs/Module/Nojs.php index 6fd6d8106..5f3d80ecd 100644 --- a/Zotlabs/Module/Nojs.php +++ b/Zotlabs/Module/Nojs.php @@ -7,8 +7,8 @@ class Nojs extends \Zotlabs\Web\Controller { function init() { $n = ((argc() > 1) ? intval(argv(1)) : 1); setcookie('jsdisabled', $n, 0, '/'); - $p = $_GET['redir']; - $hasq = strpos($p,'?'); + $p = hex2bin($_GET['redir']); + $hasq = strpbrk($p,'?&'); goaway(z_root() . (($p) ? '/' . $p : '') . (($hasq) ? '' : '?f=' ) . '&jsdisabled=' . $n); } diff --git a/Zotlabs/Module/Notifications.php b/Zotlabs/Module/Notifications.php index dfa007548..1762ad5f6 100644 --- a/Zotlabs/Module/Notifications.php +++ b/Zotlabs/Module/Notifications.php @@ -41,8 +41,6 @@ class Notifications extends \Zotlabs\Web\Controller { $notifications_available = 1; foreach ($r as $rr) { $x = strip_tags(bbcode($rr['msg'])); - if(strpos($x,',')) - $x = substr($x,strpos($x,',')+1); $notif_content .= replace_macros(get_markup_template('notify.tpl'),array( '$item_link' => z_root().'/notify/view/'. $rr['id'], '$item_image' => $rr['photo'], diff --git a/Zotlabs/Module/Oauthinfo.php b/Zotlabs/Module/Oauthinfo.php new file mode 100644 index 000000000..2d10913c4 --- /dev/null +++ b/Zotlabs/Module/Oauthinfo.php @@ -0,0 +1,23 @@ +<?php + +namespace Zotlabs\Module; + + +class Oauthinfo extends \Zotlabs\Web\Controller { + + + function init() { + + $ret = [ + 'issuer' => z_root(), + 'authorization_endpoint' => z_root() . '/authorize', + 'token_endpoint' => z_root() . '/token', + 'response_types_supported' => [ 'code', 'token', 'id_token', 'code id_token', 'token id_token' ] + ]; + + + json_return_and_die($ret); + } + + +}
\ No newline at end of file diff --git a/Zotlabs/Module/Photo.php b/Zotlabs/Module/Photo.php index b3171fe75..3f68e5c67 100644 --- a/Zotlabs/Module/Photo.php +++ b/Zotlabs/Module/Photo.php @@ -4,6 +4,7 @@ namespace Zotlabs\Module; require_once('include/security.php'); require_once('include/attach.php'); require_once('include/photo/photo_driver.php'); +require_once('include/photos.php'); class Photo extends \Zotlabs\Web\Controller { @@ -13,7 +14,8 @@ class Photo extends \Zotlabs\Web\Controller { $prvcachecontrol = false; $streaming = null; $channel = null; - + $person = 0; + switch(argc()) { case 4: $person = argv(3); @@ -30,8 +32,8 @@ class Photo extends \Zotlabs\Web\Controller { } $observer_xchan = get_observer_hash(); - - $default = get_default_profile_photo(); + + $default = z_root() . '/' . get_default_profile_photo(); if(isset($type)) { @@ -45,11 +47,11 @@ class Photo extends \Zotlabs\Web\Controller { case 'm': $resolution = 5; - $default = get_default_profile_photo(80); + $default = z_root() . '/' . get_default_profile_photo(80); break; case 's': $resolution = 6; - $default = get_default_profile_photo(48); + $default = z_root() . '/' . get_default_profile_photo(48); break; case 'l': default: @@ -83,7 +85,7 @@ class Photo extends \Zotlabs\Web\Controller { $data = file_get_contents($data); } if(! $data) { - $data = file_get_contents($default); + $data = fetch_image_from_url($default,$mimetype); } if(! $mimetype) { $mimetype = 'image/png'; @@ -144,6 +146,20 @@ class Photo extends \Zotlabs\Web\Controller { if(! in_array($resolution,[4,5,6])) $allowed = (-1); } + + if($allowed === (-1)) { + $allowed = attach_can_view($r[0]['uid'],$observer_xchan,$photo); + } + + if(intval($r[0]['photo_usage'])) { + $allowed = 1; + if(intval($r[0]['photo_usage']) === PHOTO_COVER) + if($resolution < PHOTO_RES_COVER_1200) + $allowed = (-1); + if(intval($r[0]['photo_usage']) === PHOTO_PROFILE) + if(! in_array($resolution,[4,5,6])) + $allowed = (-1); + } if($allowed === (-1)) $allowed = attach_can_view($r[0]['uid'],$observer_xchan,$photo); @@ -166,13 +182,12 @@ class Photo extends \Zotlabs\Web\Controller { } else { if(! $allowed) { - logger('mod_photo: forbidden. ' . \App::$query_string); - $observer = \App::get_observer(); - logger('mod_photo: observer = ' . (($observer) ? $observer['xchan_addr'] : '(not authenticated)')); - $data = file_get_contents('images/nosign.png'); - $mimetype = 'image/png'; - $prvcachecontrol = true; + http_status_exit(403,'forbidden'); } + if(! $exists) { + http_status_exit(404,'not found'); + } + } } } @@ -182,16 +197,13 @@ class Photo extends \Zotlabs\Web\Controller { switch($resolution) { case 4: - $data = file_get_contents(get_default_profile_photo()); - $mimetype = 'image/png'; + $data = fetch_image_from_url(z_root() . '/' . get_default_profile_photo(),$mimetype); break; case 5: - $data = file_get_contents(get_default_profile_photo(80)); - $mimetype = 'image/png'; + $data = fetch_image_from_url(z_root() . '/' . get_default_profile_photo(80),$mimetype); break; case 6: - $data = file_get_contents(get_default_profile_photo(48)); - $mimetype = 'image/png'; + $data = fetch_image_from_url(z_root() . '/' . get_default_profile_photo(48),$mimetype); break; default: killme(); diff --git a/Zotlabs/Module/Photos.php b/Zotlabs/Module/Photos.php index fceed1910..489bffc4a 100644 --- a/Zotlabs/Module/Photos.php +++ b/Zotlabs/Module/Photos.php @@ -102,14 +102,7 @@ class Photos extends \Zotlabs\Web\Controller { if($_REQUEST['dropalbum'] == t('Delete Album')) { - - // This is dangerous because we combined file storage and photos into one interface - // This function will remove all photos from any directory with the same name since - // we have not passed the path value. - - // The correct solution would be to use a full pathname from your storage root for 'album' - // We also need to prevent/block removing the storage root folder. - + $folder_hash = ''; $r = q("select * from attach where is_dir = 1 and uid = %d and hash = '%s'", @@ -124,7 +117,8 @@ class Photos extends \Zotlabs\Web\Controller { $res = array(); - + $admin_delete = false; + // get the list of photos we are about to delete if(remote_channel() && (! local_channel())) { @@ -133,6 +127,10 @@ class Photos extends \Zotlabs\Web\Controller { elseif(local_channel()) { $str = photos_album_get_db_idstr(local_channel(),$album); } + elseif(is_site_admin()) { + $str = photos_album_get_db_idstr_admin($page_owner_uid,$album); + $admin_delete = true; + } else { $str = null; } @@ -145,7 +143,7 @@ class Photos extends \Zotlabs\Web\Controller { ); if($r) { foreach($r as $i) { - attach_delete($page_owner_uid, $i['resource_id'], 1 ); + attach_delete($page_owner_uid, $i['resource_id'], true ); } } @@ -158,12 +156,14 @@ class Photos extends \Zotlabs\Web\Controller { // @FIXME do the same for the linked attach if($folder_hash) { - attach_delete($page_owner_uid,$folder_hash, 1); - - $sync = attach_export_data(\App::$data['channel'],$folder_hash, true); + attach_delete($page_owner_uid, $folder_hash, true ); + + if(! $admin_delete) { + $sync = attach_export_data(\App::$data['channel'],$folder_hash, true); - if($sync) - build_sync_packet($page_owner_uid,array('file' => array($sync))); + if($sync) + build_sync_packet($page_owner_uid,array('file' => array($sync))); + } } } @@ -181,17 +181,22 @@ class Photos extends \Zotlabs\Web\Controller { $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]) + dbesc(argv(2)) ); if($r) { - attach_delete($page_owner_uid, $r[0]['resource_id'], 1 ); + attach_delete($page_owner_uid, $r[0]['resource_id'], true ); $sync = attach_export_data(\App::$data['channel'],$r[0]['resource_id'], true); if($sync) build_sync_packet($page_owner_uid,array('file' => array($sync))); } - + elseif(is_site_admin()) { + // If the admin deletes a photo, don't sync + attach_delete($page_owner_uid, argv(2), true); + } + + goaway(z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . $_SESSION['album_return']); } diff --git a/Zotlabs/Module/Ping.php b/Zotlabs/Module/Ping.php index 206b8c3d1..baefe62ec 100644 --- a/Zotlabs/Module/Ping.php +++ b/Zotlabs/Module/Ping.php @@ -35,10 +35,12 @@ class Ping extends \Zotlabs\Web\Controller { $result['birthdays_today'] = 0; $result['all_events'] = 0; $result['all_events_today'] = 0; - $result['notice'] = array(); - $result['info'] = array(); + $result['notice'] = []; + $result['info'] = []; $result['pubs'] = 0; $result['files'] = 0; + $result['forums'] = 0; + $result['forums_sub'] = []; if(! $_SESSION['static_loadtime']) $_SESSION['static_loadtime'] = datetime_convert(); @@ -401,7 +403,7 @@ class Ping extends \Zotlabs\Web\Controller { 'notify_link' => z_root() . '/admin/accounts', 'name' => $rr['account_email'], 'url' => '', - 'photo' => get_default_profile_photo(48), + 'photo' => z_root() . '/' . get_default_profile_photo(48), 'when' => relative_date($rr['account_created']), 'hclass' => ('notify-unseen'), 'message' => t('requires approval') @@ -622,6 +624,58 @@ class Ping extends \Zotlabs\Web\Controller { if(! ($vnotify & VNOTIFY_BIRTHDAY)) $result['birthdays'] = 0; + + + if($vnotify & VNOTIFY_FORUMS) { + $forums = get_forum_channels(local_channel()); + + if(! $forums) { + $result['forums'] = 0; + } + else { + + $perms_sql = item_permissions_sql(local_channel()) . item_normal(); + $fcount = count($forums); + $forums['total'] = 0; + + for($x = 0; $x < $fcount; $x ++) { + $r = q("select sum(item_unseen) as unseen from item + where uid = %d and owner_xchan = '%s' and item_unseen = 1 $perms_sql ", + intval(local_channel()), + dbesc($forums[$x]['xchan_hash']) + ); + if($r[0]['unseen']) { + $forums[$x]['notify_link'] = (($forums[$x]['private_forum']) ? $forums[$x]['xchan_url'] : z_root() . '/network/?f=&pf=1&cid=' . $forums[$x]['abook_id']); + $forums[$x]['name'] = $forums[$x]['xchan_name']; + $forums[$x]['url'] = $forums[$x]['xchan_url']; + $forums[$x]['photo'] = $forums[$x]['xchan_photo_s']; + $forums[$x]['unseen'] = $r[0]['unseen']; + $forums[$x]['private_forum'] = (($forums[$x]['private_forum']) ? 'lock' : ''); + $forums[$x]['message'] = (($forums[$x]['private_forum']) ? t('Private forum') : t('Public forum')); + + $forums['total'] = $forums['total'] + $r[0]['unseen']; + + unset($forums[$x]['abook_id']); + unset($forums[$x]['xchan_hash']); + unset($forums[$x]['xchan_name']); + unset($forums[$x]['xchan_url']); + unset($forums[$x]['xchan_photo_s']); + + //if($forums[$x]['private_forum']) + // unset($forums[$x]['private_forum']); + + } + else { + unset($forums[$x]); + } + } + $result['forums'] = $forums['total']; + unset($forums['total']); + + $result['forums_sub'] = $forums; + } + } + $x = json_encode($result); $t8 = dba_timer(); diff --git a/Zotlabs/Module/Pubstream.php b/Zotlabs/Module/Pubstream.php index 42c485f00..7b80a3978 100644 --- a/Zotlabs/Module/Pubstream.php +++ b/Zotlabs/Module/Pubstream.php @@ -66,8 +66,7 @@ class Pubstream extends \Zotlabs\Web\Controller { 'default_location' => $channel['channel_location'], 'nickname' => $channel['channel_address'], 'lockstate' => (($group || $cid || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'), - - 'acl' => populate_acl($channel_acl), + 'acl' => populate_acl($channel_acl,true, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_stream'), get_post_aclDialogDescription(), 'acl_dialog_post'), 'permissions' => $channel_acl, 'bang' => '', 'visitor' => true, @@ -77,7 +76,8 @@ class Pubstream extends \Zotlabs\Web\Controller { 'editor_autocomplete' => true, 'bbco_autocomplete' => 'bbcode', 'bbcode' => true, - 'jotnets' => true + 'jotnets' => true, + 'reset' => t('Reset form') ); $o = '<div id="jot-popup">'; diff --git a/Zotlabs/Module/Register.php b/Zotlabs/Module/Register.php index 5356669e9..3dded19c7 100644 --- a/Zotlabs/Module/Register.php +++ b/Zotlabs/Module/Register.php @@ -187,8 +187,8 @@ class Register extends \Zotlabs\Web\Controller { $registration_is = ''; $other_sites = ''; - if(get_config('system','register_policy') == REGISTER_CLOSED) { - if(get_config('system','directory_mode') == DIRECTORY_MODE_STANDALONE) { + if(intval(get_config('system','register_policy')) === REGISTER_CLOSED) { + if(intval(get_config('system','directory_mode')) === DIRECTORY_MODE_STANDALONE) { notice( t('Registration on this hub is disabled.') . EOL); return; } @@ -197,10 +197,19 @@ class Register extends \Zotlabs\Web\Controller { return $mod->get(); } - if(get_config('system','register_policy') == REGISTER_APPROVE) { + if(intval(get_config('system','register_policy')) == REGISTER_APPROVE) { $registration_is = t('Registration on this hub is by approval only.'); $other_sites = t('<a href="pubsites">Register at another affiliated hub.</a>'); } + + + $invitations = false; + + if(intval(get_config('system','invitation_only'))) { + $invitations = true; + $registration_is = t('Registration on this hub is by invitation only.'); + $other_sites = t('<a href="pubsites">Register at another affiliated hub.</a>'); + } $max_dailies = intval(get_config('system','max_daily_registrations')); if($max_dailies) { @@ -251,10 +260,10 @@ class Register extends \Zotlabs\Web\Controller { $password = array('password', t('Choose a password'), ''); $password2 = array('password2', t('Please re-enter your password'), ''); $invite_code = array('invite_code', t('Please enter your invitation code'), ((x($_REQUEST,'invite_code')) ? strip_tags(trim($_REQUEST['invite_code'])) : "")); - $name = array('name', t('Name or caption'), ((x($_REQUEST,'name')) ? $_REQUEST['name'] : ''), t('Examples: "Bob Jameson", "Lisa and her Horses", "Soccer", "Aviation Group"')); + $name = array('name', t('Your Name'), ((x($_REQUEST,'name')) ? $_REQUEST['name'] : ''), t('Real names are preferred.')); $nickhub = '@' . str_replace(array('http://','https://','/'), '', get_config('system','baseurl')); $nickname = array('nickname', t('Choose a short nickname'), ((x($_REQUEST,'nickname')) ? $_REQUEST['nickname'] : ''), sprintf( t('Your nickname will be used to create an easy to remember channel address e.g. nickname%s'), $nickhub)); - $role = array('permissions_role' , t('Channel role and privacy'), ($privacy_role) ? $privacy_role : 'social', t('Select a channel role with your privacy requirements.') . ' <a href="help/member/member_guide#Account_Permission_Roles" target="_blank">' . t('Read more about roles') . '</a>',$perm_roles); + $role = array('permissions_role' , t('Channel role and privacy'), ($privacy_role) ? $privacy_role : 'social', t('Select a channel permission role for your usage needs and privacy requirements.') . ' <a href="help/member/member_guide#Channel_Permission_Roles" target="_blank">' . t('Read more about channel permission roles') . '</a>',$perm_roles); $tos = array('tos', $label_tos, '', '', array(t('no'),t('yes'))); @@ -270,8 +279,7 @@ class Register extends \Zotlabs\Web\Controller { '$reg_is' => $registration_is, '$registertext' => bbcode(get_config('system','register_text')), '$other_sites' => $other_sites, - '$invitations' => get_config('system','invitation_only'), - '$invite_desc' => t('Membership on this site is by invitation only.'), + '$invitations' => $invitations, '$invite_code' => $invite_code, '$auto_create' => $auto_create, '$name' => $name, diff --git a/Zotlabs/Module/Regmod.php b/Zotlabs/Module/Regmod.php index 70635d707..6fe89ca90 100644 --- a/Zotlabs/Module/Regmod.php +++ b/Zotlabs/Module/Regmod.php @@ -13,8 +13,7 @@ class Regmod extends \Zotlabs\Web\Controller { if(! local_channel()) { info( t('Please login.') . EOL); - $o .= '<br /><br />' . login((\App::$config['system']['register_policy'] == REGISTER_CLOSED) ? 0 : 1); - return $o; + return login(); } if(! is_site_admin()) { diff --git a/Zotlabs/Module/Removeme.php b/Zotlabs/Module/Removeme.php index ca2080e83..451e280c3 100644 --- a/Zotlabs/Module/Removeme.php +++ b/Zotlabs/Module/Removeme.php @@ -38,7 +38,7 @@ class Removeme extends \Zotlabs\Web\Controller { } $global_remove = intval($_POST['global']); - + channel_remove(local_channel(),1 - $global_remove,true); } @@ -56,12 +56,12 @@ class Removeme extends \Zotlabs\Web\Controller { $tpl = get_markup_template('removeme.tpl'); $o .= replace_macros($tpl, array( '$basedir' => z_root(), - '$hash' => $hash, - '$title' => t('Remove This Channel'), - '$desc' => array(t('WARNING: '), t('This channel will be completely removed from the network. '), t('This action is permanent and can not be undone!')), - '$passwd' => t('Please enter your password for verification:'), - '$global' => array('global', t('Remove this channel and all its clones from the network'), false, t('By default only the instance of the channel located on this hub will be removed from the network'), array(t('No'),t('Yes'))), - '$submit' => t('Remove Channel') + '$hash' => $hash, + '$title' => t('Remove This Channel'), + '$desc' => [ t('WARNING: '), t('This channel will be completely removed from the network. '), t('This action is permanent and can not be undone!') ], + '$passwd' => t('Please enter your password for verification:'), + '$global' => [ 'global', t('Remove this channel and all its clones from the network'), false, t('By default only the instance of the channel located on this hub will be removed from the network'), [ t('No'),t('Yes') ] ], + '$submit' => t('Remove Channel') )); return $o; diff --git a/Zotlabs/Module/Rmagic.php b/Zotlabs/Module/Rmagic.php index bfc03f6ec..33a6689ca 100644 --- a/Zotlabs/Module/Rmagic.php +++ b/Zotlabs/Module/Rmagic.php @@ -17,8 +17,8 @@ class Rmagic extends \Zotlabs\Web\Controller { if($r) { if($r[0]['hubloc_url'] === z_root()) goaway(z_root() . '/login'); - $dest = z_root() . '/' . str_replace(['rmagic','zid='],['','zid_='],\App::$query_string); - goaway($r[0]['hubloc_url'] . '/magic' . '?f=&owa=1&dest=' . $dest); + $dest = bin2hex(z_root() . '/' . str_replace(['rmagic','zid='],['','zid_='],\App::$query_string)); + goaway($r[0]['hubloc_url'] . '/magic' . '?f=&owa=1&bdest=' . $dest); } } } @@ -59,11 +59,11 @@ class Rmagic extends \Zotlabs\Web\Controller { if($url) { if($_SESSION['return_url']) - $dest = urlencode(z_root() . '/' . str_replace('zid=','zid_=',$_SESSION['return_url'])); + $dest = bin2hex(z_root() . '/' . str_replace('zid=','zid_=',$_SESSION['return_url'])); else - $dest = urlencode(z_root() . '/' . str_replace([ 'rmagic', 'zid=' ] ,[ '', 'zid_='],\App::$query_string)); + $dest = bin2hex(z_root() . '/' . str_replace([ 'rmagic', 'zid=' ] ,[ '', 'zid_='],\App::$query_string)); - goaway($url . '/magic' . '?f=&owa=1&dest=' . $dest); + goaway($url . '/magic' . '?f=&owa=1&bdest=' . $dest); } } } diff --git a/Zotlabs/Module/Rpost.php b/Zotlabs/Module/Rpost.php index f0c4a06b9..86ee296ec 100644 --- a/Zotlabs/Module/Rpost.php +++ b/Zotlabs/Module/Rpost.php @@ -142,6 +142,7 @@ class Rpost extends \Zotlabs\Web\Controller { $o .= replace_macros(get_markup_template('edpost_head.tpl'), array( '$title' => t('Edit post'), + '$cancel' => '', '$editor' => $editor )); diff --git a/Zotlabs/Module/Settings/Channel.php b/Zotlabs/Module/Settings/Channel.php index 3e928ec58..3a6e03588 100644 --- a/Zotlabs/Module/Settings/Channel.php +++ b/Zotlabs/Module/Settings/Channel.php @@ -21,6 +21,10 @@ class Channel { $role = ((x($_POST,'permissions_role')) ? notags(trim($_POST['permissions_role'])) : ''); $oldrole = get_pconfig(local_channel(),'system','permissions_role'); + // This mapping can be removed after 3.4 release + if($oldrole === 'social_party') { + $oldrole = 'social_federation'; + } if(($role != $oldrole) || ($role === 'custom')) { @@ -142,6 +146,7 @@ class Channel { $unkmail = (((x($_POST,'unkmail')) && (intval($_POST['unkmail']) == 1)) ? 1: 0); $cntunkmail = ((x($_POST,'cntunkmail')) ? intval($_POST['cntunkmail']) : 0); $suggestme = ((x($_POST,'suggestme')) ? intval($_POST['suggestme']) : 0); + $autoperms = ((x($_POST,'autoperms')) ? intval($_POST['autoperms']) : 0); $post_newfriend = (($_POST['post_newfriend'] == 1) ? 1: 0); $post_joingroup = (($_POST['post_joingroup'] == 1) ? 1: 0); @@ -210,6 +215,8 @@ class Channel { $vnotify += intval($_POST['vnotify13']); if(x($_POST,'vnotify14')) $vnotify += intval($_POST['vnotify14']); + if(x($_POST,'vnotify15')) + $vnotify += intval($_POST['vnotify15']); $always_show_in_notices = x($_POST,'always_show_in_notices') ? 1 : 0; @@ -248,6 +255,7 @@ class Channel { set_pconfig(local_channel(),'system','default_permcat',$defpermcat); set_pconfig(local_channel(),'system','email_notify_host',$mailhost); set_pconfig(local_channel(),'system','profile_assign',$profile_assign); + set_pconfig(local_channel(),'system','autoperms',$autoperms); $r = q("update channel set channel_name = '%s', channel_pageflags = %d, channel_timezone = '%s', channel_location = '%s', channel_notifyflags = %d, channel_max_anon_mail = %d, channel_max_friend_req = %d, channel_expire_days = %d $set_perms where channel_id = %d", dbesc($username), @@ -471,13 +479,25 @@ class Channel { $permissions_role = get_pconfig(local_channel(),'system','permissions_role'); if(! $permissions_role) $permissions_role = 'custom'; - + // compatibility mapping - can be removed after 3.4 release + if($permissions_role === 'social_party') + $permissions_role = 'social_federation'; + + if(in_array($permissions_role,['forum','repository'])) + $autoperms = replace_macros(get_markup_template('field_checkbox.tpl'), [ + '$field' => [ 'autoperms',t('Automatic membership approval'), ((get_pconfig(local_channel(),'system','autoperms')) ? 1 : 0), t('If enabled, connection requests will be approved without your interaction'), $yes_no ]]); + else + $autoperms = '<input type="hidden" name="autoperms" value="' . intval(get_pconfig(local_channel(),'system','autoperms')) . '" />'; + $permissions_set = (($permissions_role != 'custom') ? true : false); $perm_roles = \Zotlabs\Access\PermissionRoles::roles(); if((get_account_techlevel() < 4) && $permissions_role !== 'custom') unset($perm_roles[t('Other')]); + + + $vnotify = get_pconfig(local_channel(),'system','vnotify'); $always_show_in_notices = get_pconfig(local_channel(),'system','always_show_in_notices'); if($vnotify === false) @@ -489,6 +509,7 @@ class Channel { $disable_discover_tab = intval(get_config('system','disable_discover_tab',1)) == 1; $site_firehose = intval(get_config('system','site_firehose',0)) == 1; + $o .= replace_macros($stpl,array( '$ptitle' => t('Channel Settings'), @@ -545,7 +566,7 @@ class Channel { '$unkmail' => $unkmail, '$cntunkmail' => array('cntunkmail', t('Maximum private messages per day from unknown people:'), intval($channel['channel_max_anon_mail']) ,t("Useful to reduce spamming")), - + '$autoperms' => $autoperms, '$h_not' => t('Notification Settings'), '$activity_options' => t('By default post a status message when:'), '$post_newfriend' => array('post_newfriend', t('accepting a friend request'), $post_newfriend, '', $yes_no), @@ -580,6 +601,7 @@ class Channel { '$vnotify12' => array('vnotify12', t('Unseen shared files'), ($vnotify & VNOTIFY_FILES), VNOTIFY_FILES, '', $yes_no), '$vnotify13' => (($disable_discover_tab && !$site_firehose) ? array() : array('vnotify13', t('Unseen public activity'), ($vnotify & VNOTIFY_PUBS), VNOTIFY_PUBS, '', $yes_no)), '$vnotify14' => array('vnotify14', t('Unseen likes and dislikes'), ($vnotify & VNOTIFY_LIKE), VNOTIFY_LIKE, '', $yes_no), + '$vnotify15' => array('vnotify15', t('Unseen forum posts'), ($vnotify & VNOTIFY_FORUMS), VNOTIFY_FORUMS, '', $yes_no), '$mailhost' => [ 'mailhost', t('Email notification hub (hostname)'), get_pconfig(local_channel(),'system','email_notify_host',\App::get_hostname()), sprintf( t('If your channel is mirrored to multiple hubs, set this to your preferred location. This will prevent duplicate email notifications. Example: %s'),\App::get_hostname()) ], '$always_show_in_notices' => array('always_show_in_notices', t('Show new wall posts, private messages and connections under Notices'), $always_show_in_notices, 1, '', $yes_no), diff --git a/Zotlabs/Module/Settings/Tokens.php b/Zotlabs/Module/Settings/Tokens.php index bf22ec7aa..619c8b5ba 100644 --- a/Zotlabs/Module/Settings/Tokens.php +++ b/Zotlabs/Module/Settings/Tokens.php @@ -161,8 +161,8 @@ class Tokens { '$me' => t('My Settings'), '$perms' => $perms, '$inherited' => t('inherited'), - '$notself' => 0, - '$self' => 1, + '$notself' => 1, + '$self' => 0, '$permlbl' => t('Individual Permissions'), '$permnote' => t('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.'), '$submit' => t('Submit') @@ -170,4 +170,4 @@ class Tokens { return $o; } -}
\ No newline at end of file +} diff --git a/Zotlabs/Module/Siteinfo.php b/Zotlabs/Module/Siteinfo.php index 92ee78cc6..25276815d 100644 --- a/Zotlabs/Module/Siteinfo.php +++ b/Zotlabs/Module/Siteinfo.php @@ -12,6 +12,9 @@ class Siteinfo extends \Zotlabs\Web\Controller { } function get() { + + $federated = []; + call_hooks('federated_transports',$federated); $siteinfo = replace_macros(get_markup_template('siteinfo.tpl'), [ @@ -27,6 +30,9 @@ class Siteinfo extends \Zotlabs\Web\Controller { '$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>', + + '$additional_text' => t('Additional federated transport protocols:'), + '$additional_fed' => implode(',',$federated), '$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'), diff --git a/Zotlabs/Module/Sources.php b/Zotlabs/Module/Sources.php index a180d9b6e..91e2efa60 100644 --- a/Zotlabs/Module/Sources.php +++ b/Zotlabs/Module/Sources.php @@ -12,12 +12,13 @@ class Sources extends \Zotlabs\Web\Controller { return ''; $source = intval($_REQUEST['source']); - $xchan = $_REQUEST['xchan']; + $xchan = escape_tags($_REQUEST['xchan']); $abook = intval($_REQUEST['abook']); - $words = $_REQUEST['words']; + $words = escape_tags($_REQUEST['words']); + $resend = intval($_REQUEST['resend']); $frequency = $_REQUEST['frequency']; - $name = $_REQUEST['name']; - $tags = $_REQUEST['tags']; + $name = escape_tags($_REQUEST['name']); + $tags = escape_tags($_REQUEST['tags']); $channel = \App::get_channel(); @@ -38,6 +39,8 @@ class Sources extends \Zotlabs\Web\Controller { return; } + set_abconfig(local_channel(),$xchan, 'system','rself',$resend); + if(! $source) { $r = q("insert into source ( src_channel_id, src_channel_xchan, src_xchan, src_patt, src_tag ) values ( %d, '%s', '%s', '%s', '%s' ) ", @@ -69,7 +72,7 @@ class Sources extends \Zotlabs\Web\Controller { } - function get() { + function get() { if(! local_channel()) { notice( t('Permission denied.') . EOL); return ''; @@ -110,7 +113,7 @@ class Sources extends \Zotlabs\Web\Controller { '$words' => array( 'words', t('Only import content with these words (one per line)'),'',t('Leave blank to import all public content')), '$name' => array( 'name', t('Channel Name'), '', ''), '$tags' => array('tags', t('Add the following categories to posts imported from this source (comma separated)'),'',t('Optional')), - + '$resend' => [ 'resend', t('Resend posts with this channel as author'), 0, t('Copyrights may apply'), [ t('No'), t('Yes') ]], '$submit' => t('Submit') )); return $o; @@ -145,6 +148,8 @@ class Sources extends \Zotlabs\Web\Controller { '$xchan' => $r[0]['src_xchan'], '$abook' => $x[0]['abook_id'], '$tags' => array('tags', t('Add the following categories to posts imported from this source (comma separated)'),$r[0]['src_tag'],t('Optional')), + '$resend' => [ 'resend', t('Resend posts with this channel as author'), get_abconfig(local_channel(), $r[0]['xchan_hash'],'system','rself'), t('Copyrights may apply'), [ t('No'), t('Yes') ]], + '$name' => array( 'name', t('Channel Name'), $r[0]['xchan_name'], ''), '$submit' => t('Submit') )); diff --git a/Zotlabs/Module/Viewsrc.php b/Zotlabs/Module/Viewsrc.php index 54ab89e81..5900e385a 100644 --- a/Zotlabs/Module/Viewsrc.php +++ b/Zotlabs/Module/Viewsrc.php @@ -28,7 +28,7 @@ class Viewsrc extends \Zotlabs\Web\Controller { $item_normal = item_normal(); if(local_channel() && $item_id) { - $r = q("select id, item_flags, mimetype, item_obscured, body from item where uid in (%d , %d) and id = %d $item_normal limit 1", + $r = q("select id, item_flags, mimetype, item_obscured, body, llink, plink from item where uid in (%d , %d) and id = %d $item_normal limit 1", intval(local_channel()), intval($sys['channel_id']), intval($item_id) @@ -52,8 +52,11 @@ class Viewsrc extends \Zotlabs\Web\Controller { } if(is_ajax()) { - print '<div><i class="fa fa-pencil"> ' . t('Source of Item') . ' ' . $r[0]['id'] . '</i></div>'; - echo $o; + echo '<div class="p-1">'; + echo '<div>id: ' . $r[0]['id'] . ' | <a href="' . $r[0]['plink'] . '" target="_blank">plink</a> | <a href="' . $r[0]['llink'] . '" target="_blank">llink</a></div>'; + echo '<hr>'; + echo '<pre class="p-1">' . $o . '</pre>'; + echo '</div>'; killme(); } diff --git a/Zotlabs/Module/Well_known.php b/Zotlabs/Module/Well_known.php index 177de2323..442994b54 100644 --- a/Zotlabs/Module/Well_known.php +++ b/Zotlabs/Module/Well_known.php @@ -50,7 +50,15 @@ class Well_known extends \Zotlabs\Web\Controller { $module = new \Zotlabs\Module\Hostxrd(); $module->init(); break; - + + case 'oauth-authorization-server': + \App::$argc -= 1; + array_shift(\App::$argv); + \App::$argv[0] = 'oauthinfo'; + $module = new \Zotlabs\Module\Oauthinfo(); + $module->init(); + break; + case 'dnt-policy.txt': echo file_get_contents('doc/dnt-policy.txt'); killme(); diff --git a/Zotlabs/Module/Wfinger.php b/Zotlabs/Module/Wfinger.php index 81d4beaed..88cb3e879 100644 --- a/Zotlabs/Module/Wfinger.php +++ b/Zotlabs/Module/Wfinger.php @@ -109,7 +109,8 @@ class Wfinger extends \Zotlabs\Web\Controller { $aliases = array( z_root() . (($pchan) ? '/pchan/' : '/channel/') . $r[0]['channel_address'], - z_root() . '/~' . $r[0]['channel_address'] + z_root() . '/~' . $r[0]['channel_address'], + z_root() . '/@' . $r[0]['channel_address'] ); if($h) { diff --git a/Zotlabs/Module/Wiki.php b/Zotlabs/Module/Wiki.php index 7dc8eb1bc..322a3933c 100644 --- a/Zotlabs/Module/Wiki.php +++ b/Zotlabs/Module/Wiki.php @@ -95,7 +95,7 @@ class Wiki extends \Zotlabs\Web\Controller { $owner['channel_deny_gid']) ? 'lock' : 'unlock' ), - 'acl' => populate_acl($owner_acl), + 'acl' => populate_acl($owner_acl, false, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_wiki')), 'allow_cid' => acl2json($owner_acl['allow_cid']), 'allow_gid' => acl2json($owner_acl['allow_gid']), 'deny_cid' => acl2json($owner_acl['deny_cid']), diff --git a/Zotlabs/Storage/BasicAuth.php b/Zotlabs/Storage/BasicAuth.php index d8af03703..a5c01fbb7 100644 --- a/Zotlabs/Storage/BasicAuth.php +++ b/Zotlabs/Storage/BasicAuth.php @@ -253,11 +253,11 @@ class BasicAuth extends DAV\Auth\Backend\AbstractBasic { * @return void */ public function log() { - logger('channel_name ' . $this->channel_name, LOGGER_DATA); - logger('channel_id ' . $this->channel_id, LOGGER_DATA); - logger('channel_hash ' . $this->channel_hash, LOGGER_DATA); - logger('observer ' . $this->observer, LOGGER_DATA); - logger('owner_id ' . $this->owner_id, LOGGER_DATA); - logger('owner_nick ' . $this->owner_nick, LOGGER_DATA); +// logger('channel_name ' . $this->channel_name, LOGGER_DATA); +// logger('channel_id ' . $this->channel_id, LOGGER_DATA); +// logger('channel_hash ' . $this->channel_hash, LOGGER_DATA); +// logger('observer ' . $this->observer, LOGGER_DATA); +// logger('owner_id ' . $this->owner_id, LOGGER_DATA); +// logger('owner_nick ' . $this->owner_nick, LOGGER_DATA); } } diff --git a/Zotlabs/Storage/Browser.php b/Zotlabs/Storage/Browser.php index 508c39d22..c2d70b854 100644 --- a/Zotlabs/Storage/Browser.php +++ b/Zotlabs/Storage/Browser.php @@ -12,7 +12,7 @@ use Sabre\DAV; * * @extends \\Sabre\\DAV\\Browser\\Plugin * - * @link http://github.com/redmatrix/hubzilla + * @link http://framagit.org/hubzilla/core/ * @license http://opensource.org/licenses/mit-license.php The MIT License (MIT) */ class Browser extends DAV\Browser\Plugin { @@ -241,7 +241,7 @@ class Browser extends DAV\Browser\Plugin { // put the array for this file together $ft['attachId'] = $this->findAttachIdByHash($attachHash); - $ft['fileStorageUrl'] = substr($fullPath, 0, strpos($fullPath, "cloud/")) . "filestorage/" . $this->auth->getCurrentUser(); + $ft['fileStorageUrl'] = substr($fullPath, 0, strpos($fullPath, "cloud/")) . "filestorage/" . $this->auth->owner_nick; $ft['icon'] = $icon; $ft['photo_icon'] = $photo_icon; $ft['attachIcon'] = (($size) ? $attachIcon : ''); @@ -276,6 +276,8 @@ class Browser extends DAV\Browser\Plugin { '$create' => t('Create'), '$upload' => t('Add Files'), '$is_owner' => $is_owner, + '$is_admin' => is_site_admin(), + '$admin_delete' => t('Admin Delete'), '$parentpath' => $parentpath, '$cpath' => bin2hex(\App::$query_string), '$tiles' => intval($_SESSION['cloud_tiles']), @@ -331,6 +333,7 @@ class Browser extends DAV\Browser\Plugin { $aclselect = null; $lockstate = ''; + $limit = 0; if($this->auth->owner_id) { $channel = channelx_by_n($this->auth->owner_id); @@ -341,10 +344,15 @@ class Browser extends DAV\Browser\Plugin { $aclselect = ((local_channel() == $this->auth->owner_id) ? populate_acl($channel_acl,false, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_storage')) : ''); } + + // Storage and quota for the account (all channels of the owner of this directory)! + $limit = engr_units_to_bytes(service_class_fetch($this->auth->owner_id, 'attach_upload_limit')); + } + + if((! $limit) && get_config('system','cloud_report_disksize')) { + $limit = engr_units_to_bytes(disk_free_space('store')); } - // Storage and quota for the account (all channels of the owner of this directory)! - $limit = engr_units_to_bytes(service_class_fetch($owner, 'attach_upload_limit')); $r = q("SELECT SUM(filesize) AS total FROM attach WHERE aid = %d", intval($this->auth->channel_account_id) ); diff --git a/Zotlabs/Storage/Directory.php b/Zotlabs/Storage/Directory.php index 7068ee15a..642af6300 100644 --- a/Zotlabs/Storage/Directory.php +++ b/Zotlabs/Storage/Directory.php @@ -571,39 +571,6 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota, DAV\IMo return datetime_convert('UTC', 'UTC', $r[0]['edited'], 'U'); } - /** - * @brief Return quota usage. - * - * @fixme Should guests relly see the used/free values from filesystem of the - * complete store directory? - * - * @return array with used and free values in bytes. - */ - public function getQuotaInfo() { - // values from the filesystem of the complete <i>store/</i> directory - $limit = disk_total_space('store'); - $free = disk_free_space('store'); - - if ($this->auth->owner_id) { - $c = q("select * from channel where channel_id = %d and channel_removed = 0 limit 1", - intval($this->auth->owner_id) - ); - - $ulimit = engr_units_to_bytes(service_class_fetch($c[0]['channel_id'], 'attach_upload_limit')); - $limit = (($ulimit) ? $ulimit : $limit); - - $x = q("select sum(filesize) as total from attach where aid = %d", - intval($c[0]['channel_account_id']) - ); - $free = (($x) ? $limit - $x[0]['total'] : 0); - } - - return array( - $limit - $free, - $free - ); - } - /** * @brief Array with all Directory and File DAV\\Node items for the given path. @@ -719,6 +686,8 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota, DAV\IMo ); foreach ($r as $rr) { + if(\App::$module === 'cloud' && (strpos($rr['filename'],'.') === 0) && (! get_pconfig($channel_id,'system','show_dot_files')) ) + continue; // @FIXME I don't think we use revisions currently in attach structures. // In case we see any in the wild provide a unique filename. This @@ -753,14 +722,13 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota, DAV\IMo function ChannelList(&$auth) { $ret = array(); - $r = q("SELECT channel_id, channel_address FROM channel WHERE channel_removed = 0 - AND channel_system = 0 AND (channel_pageflags & %d) = 0", + $r = q("SELECT channel_id, channel_address, profile.publish FROM channel left join profile on profile.uid = channel.channel_id WHERE channel_removed = 0 AND channel_system = 0 AND (channel_pageflags & %d) = 0", intval(PAGE_HIDDEN) ); if ($r) { foreach ($r as $rr) { - if (perm_is_allowed($rr['channel_id'], $auth->observer, 'view_storage')) { + if (perm_is_allowed($rr['channel_id'], $auth->observer, 'view_storage') && $rr['publish']) { logger('found channel: /cloud/' . $rr['channel_address'], LOGGER_DATA); // @todo can't we drop '/cloud'? It gets stripped off anyway in RedDirectory $ret[] = new Directory('/cloud/' . $rr['channel_address'], $auth); @@ -893,4 +861,48 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota, DAV\IMo return false; } + public function getQuotaInfo() { + + /** + * Returns the quota information + * + * This method MUST return an array with 2 values, the first being the total used space, + * the second the available space (in bytes) + */ + + $used = 0; + $limit = 0; + $free = 0; + + if ($this->auth->owner_id) { + $channel = channelx_by_n($this->auth->owner_id); + if($channel) { + $r = q("SELECT SUM(filesize) AS total FROM attach WHERE aid = %d", + intval($channel['channel_account_id']) + ); + $used = (($r) ? (float) $r[0]['total'] : 0); + $limit = (float) service_class_fetch($this->auth->owner_id, 'attach_upload_limit'); + if($limit) { + // Don't let the result go negative + $free = (($limit > $used) ? $limit - $used : 0); + } + } + } + + if(! $limit) { + $free = disk_free_space('store'); + $used = disk_total_space('store') - $free; + } + + // prevent integer overflow on 32-bit systems + + if($used > (float) PHP_INT_MAX) + $used = PHP_INT_MAX; + if($free > (float) PHP_INT_MAX) + $free = PHP_INT_MAX; + + return [ (int) $used, (int) $free ]; + + } + } diff --git a/Zotlabs/Thumbs/Pdf.php b/Zotlabs/Thumbs/Pdf.php index 98bcf11b5..11714ad53 100644 --- a/Zotlabs/Thumbs/Pdf.php +++ b/Zotlabs/Thumbs/Pdf.php @@ -27,7 +27,7 @@ class Pdf { $imagick_path = get_config('system','imagick_convert_path'); if($imagick_path && @file_exists($imagick_path)) { - $cmd = $imagick_path . ' ' . escapeshellarg(PROJECT_BASE . '/' . $tmpfile . '[0]') . ' -thumbnail ' . $width . 'x' . $height . ' ' . escapeshellarg(PROJECT_BASE . '/' . $outfile); + $cmd = $imagick_path . ' ' . escapeshellarg(PROJECT_BASE . '/' . $tmpfile . '[0]') . ' -resize ' . $width . 'x' . $height . ' ' . escapeshellarg(PROJECT_BASE . '/' . $outfile); // logger('imagick thumbnail command: ' . $cmd); for($x = 0; $x < 4; $x ++) { exec($cmd); diff --git a/Zotlabs/Thumbs/Video.php b/Zotlabs/Thumbs/Video.php index ff4d10a36..15d3ace12 100644 --- a/Zotlabs/Thumbs/Video.php +++ b/Zotlabs/Thumbs/Video.php @@ -46,7 +46,7 @@ class Video { $imagick_path = get_config('system','imagick_convert_path'); if($imagick_path && @file_exists($imagick_path)) { - $cmd = $imagick_path . ' ' . escapeshellarg(PROJECT_BASE . '/' . $tmpfile . '[0]') . ' -thumbnail ' . $width . 'x' . $height . ' ' . escapeshellarg(PROJECT_BASE . '/' . $outfile); + $cmd = $imagick_path . ' ' . escapeshellarg(PROJECT_BASE . '/' . $tmpfile . '[0]') . ' -resize ' . $width . 'x' . $height . ' ' . escapeshellarg(PROJECT_BASE . '/' . $outfile); // logger('imagick thumbnail command: ' . $cmd); /** @scrutinizer ignore-unhandled */ diff --git a/Zotlabs/Web/CheckJS.php b/Zotlabs/Web/CheckJS.php index 8179ceb15..e83ccf27b 100644 --- a/Zotlabs/Web/CheckJS.php +++ b/Zotlabs/Web/CheckJS.php @@ -17,9 +17,9 @@ class CheckJS { else $this->jsdisabled = 0; - if(! $this->jsdisabled) { - $page = urlencode(\App::$query_string); + $page = bin2hex(\App::$query_string); + if(! $this->jsdisabled) { if($test) { $this->jsdisabled = 1; if(array_key_exists('jsdisabled',$_COOKIE)) diff --git a/Zotlabs/Widget/Activity_filter.php b/Zotlabs/Widget/Activity_filter.php new file mode 100644 index 000000000..fadf39144 --- /dev/null +++ b/Zotlabs/Widget/Activity_filter.php @@ -0,0 +1,204 @@ +<?php + +namespace Zotlabs\Widget; + +class Activity_filter { + + function widget($arr) { + + if(! local_channel()) + return ''; + + $cmd = \App::$cmd; + $filter_active = false; + + $tabs = []; + + if(feature_enabled(local_channel(),'personal_tab')) { + if(x($_GET,'conv')) { + $conv_active = (($_GET['conv'] == 1) ? 'active' : ''); + $filter_active = 'personal'; + } + + $tabs[] = [ + 'label' => t('Personal Posts'), + 'icon' => 'user-circle', + 'url' => z_root() . '/' . $cmd . '/?f=&conv=1', + 'sel' => $conv_active, + 'title' => t('Show posts that mention or involve me') + ]; + } + + if(feature_enabled(local_channel(),'star_posts')) { + if(x($_GET,'star')) { + $starred_active = (($_GET['star'] == 1) ? 'active' : ''); + $filter_active = 'star'; + } + + $tabs[] = [ + 'label' => t('Starred Posts'), + 'icon' => 'star', + 'url'=>z_root() . '/' . $cmd . '/?f=&star=1', + 'sel'=>$starred_active, + 'title' => t('Show posts that I have starred') + ]; + } + + if(feature_enabled(local_channel(),'groups')) { + $groups = q("SELECT * FROM groups WHERE deleted = 0 AND uid = %d ORDER BY gname ASC", + intval(local_channel()) + ); + + if($groups) { + foreach($groups as $g) { + if(x($_GET,'gid')) { + $group_active = (($_GET['gid'] == $g['id']) ? 'active' : ''); + $filter_active = 'group'; + } + $gsub[] = [ + 'label' => $g['gname'], + 'icon' => '', + 'url' => z_root() . '/' . $cmd . '/?f=&gid=' . $g['id'], + 'sel' => $group_active, + 'title' => sprintf(t('Show posts related to the %s privacy group'), $g['gname']) + ]; + } + $tabs[] = [ + 'id' => 'privacy_groups', + 'label' => t('Privacy Groups'), + 'icon' => 'users', + 'url' => '#', + 'sel' => (($filter_active == 'group') ? true : false), + 'title' => t('Show my privacy groups'), + 'sub' => $gsub + + ]; + } + } + + if(feature_enabled(local_channel(),'forums_tab')) { + $forums = get_forum_channels(local_channel()); + + if($forums) { + foreach($forums as $f) { + if(x($_GET,'pf') && x($_GET,'cid')) { + $forum_active = ((x($_GET,'pf') && $_GET['cid'] == $f['abook_id']) ? 'active' : ''); + $filter_active = 'forums'; + } + $fsub[] = [ + 'label' => $f['xchan_name'], + 'img' => $f['xchan_photo_s'], + 'url' => (($f['private_forum']) ? $f['xchan_url'] : z_root() . '/' . $cmd . '/?f=&pf=1&cid=' . $f['abook_id']), + 'sel' => $forum_active, + 'title' => t('Show posts to this forum'), + 'lock' => (($f['private_forum']) ? 'lock' : '') + ]; + } + + $tabs[] = [ + 'id' => 'forums', + 'label' => t('Forums'), + 'icon' => 'comments-o', + 'url' => '#', + 'sel' => (($filter_active == 'forums') ? true : false), + 'title' => t('Show forums'), + 'sub' => $fsub + + ]; + } + } + + if(feature_enabled(local_channel(),'filing')) { + $terms = q("select distinct term from term where uid = %d and ttype = %d order by term asc", + intval(local_channel()), + intval(TERM_FILE) + ); + + if($terms) { + foreach($terms as $t) { + if(x($_GET,'file')) { + $file_active = (($_GET['file'] == $t['term']) ? 'active' : ''); + $filter_active = 'file'; + } + $tsub[] = [ + 'label' => $t['term'], + 'icon' => '', + 'url' => z_root() . '/' . $cmd . '/?f=&file=' . $t['term'], + 'sel' => $file_active, + 'title' => sprintf(t('Show posts that I have filed to %s'), $t['term']), + ]; + } + + $tabs[] = [ + 'id' => 'saved_folders', + 'label' => t('Saved Folders'), + 'icon' => 'folder', + 'url' => '#', + 'sel' => (($filter_active == 'file') ? true : false), + 'title' => t('Show filed post categories'), + 'sub' => $tsub + + ]; + } + } + + if(x($_GET,'search')) { + $filter_active = 'search'; + $tabs[] = [ + 'label' => t('Search'), + 'icon' => 'search', + 'url' => z_root() . '/' . $cmd . '/?f=&search=' . $_GET['search'], + 'sel' => 'active disabled', + 'title' => t('Panel search') + ]; + } + + $name = []; + if(feature_enabled(local_channel(),'name_tab')) { + if(x($_GET,'cid') && ! x($_GET,'pf')) { + $filter_active = 'name'; + } + $name = [ + 'label' => x($_GET,'name') ? $_GET['name'] : t('Filter by name'), + 'icon' => 'filter', + 'url'=> z_root() . '/' . $cmd . '/', + 'sel'=> $filter_active == 'name' ? 'is-valid' : '', + 'title' => '' + ]; + } + + $reset = []; + if($filter_active) { + $reset = [ + 'label' => '', + 'icon' => 'remove', + 'url'=> z_root() . '/' . $cmd, + 'sel'=> '', + 'title' => t('Remove active filter') + ]; + } + + $arr = ['tabs' => $tabs]; + + call_hooks('network_tabs', $arr); + + $o = ''; + + if($arr['tabs']) { + $content = replace_macros(get_markup_template('common_pills.tpl'), [ + '$pills' => $arr['tabs'] + ]); + + $o .= replace_macros(get_markup_template('activity_filter_widget.tpl'), [ + '$title' => t('Activity Filters'), + '$reset' => $reset, + '$content' => $content, + '$name' => $name + ]); + } + + return $o; + + } + +} diff --git a/Zotlabs/Widget/Activity_order.php b/Zotlabs/Widget/Activity_order.php new file mode 100644 index 000000000..0e660afc3 --- /dev/null +++ b/Zotlabs/Widget/Activity_order.php @@ -0,0 +1,128 @@ +<?php + +namespace Zotlabs\Widget; + +class Activity_order { + + function widget($arr) { + + if(! local_channel()) + return ''; + + if(! feature_enabled(local_channel(),'order_tab')) { + set_pconfig(local_channel(), 'mod_network', 'order', 0); + return ''; + } + + $commentord_active = ''; + $postord_active = ''; + $unthreaded_active = ''; + + if(x($_GET, 'order')) { + switch($_GET['order']){ + case 'post': + $postord_active = 'active'; + set_pconfig(local_channel(), 'mod_network', 'order', 1); + break; + case 'comment': + $commentord_active = 'active'; + set_pconfig(local_channel(), 'mod_network', 'order', 0); + break; + case 'unthreaded': + $unthreaded_active = 'active'; + set_pconfig(local_channel(), 'mod_network', 'order', 2); + break; + default: + $commentord_active = 'active'; + } + } + else { + $order = get_pconfig(local_channel(), 'mod_network', 'order', 0); + switch($order) { + case 0: + $commentord_active = 'active'; + break; + case 1: + $postord_active = 'active'; + break; + case 2: + $unthreaded_active = 'active'; + break; + default: + $commentord_active = 'active'; + } + } + + // override order for search, filer and cid results + if(x($_GET,'search') || x($_GET,'file') || (! x($_GET,'pf') && x($_GET,'cid'))) { + $unthreaded_active = 'active'; + $commentord_active = $postord_active = 'disabled'; + } + + $cmd = \App::$cmd; + + $filter = ''; + + if(x($_GET,'cid')) + $filter .= '&cid=' . $_GET['cid']; + + if(x($_GET,'gid')) + $filter .= '&gid=' . $_GET['gid']; + + if(x($_GET,'star')) + $filter .= '&star=' . $_GET['star']; + + if(x($_GET,'conv')) + $filter .= '&conv=' . $_GET['conv']; + + if(x($_GET,'file')) + $filter .= '&file=' . $_GET['file']; + + + // tabs + $tabs = []; + + $tabs[] = [ + 'label' => t('Commented Date'), + 'icon' => '', + 'url'=>z_root() . '/' . $cmd . '?f=&order=comment' . $filter, + 'sel'=> $commentord_active, + 'title' => t('Order by last commented date'), + ]; + $tabs[] = [ + 'label' => t('Posted Date'), + 'icon' => '', + 'url'=>z_root() . '/' . $cmd . '?f=&order=post' . $filter, + 'sel'=> $postord_active, + 'title' => t('Order by last posted date'), + ]; + $tabs[] = array( + 'label' => t('Date Unthreaded'), + 'icon' => '', + 'url' => z_root() . '/' . $cmd . '?f=&order=unthreaded' . $filter, + 'sel' => $unthreaded_active, + 'title' => t('Order unthreaded by date'), + ); + + $arr = ['tabs' => $tabs]; + + call_hooks('network_tabs', $arr); + + $o = ''; + + if($arr['tabs']) { + $content = replace_macros(get_markup_template('common_pills.tpl'), [ + '$pills' => $arr['tabs'], + ]); + + $o = replace_macros(get_markup_template('common_widget.tpl'), [ + '$title' => t('Activity Order'), + '$content' => $content, + ]); + } + + return $o; + + } + +} diff --git a/Zotlabs/Widget/Admin.php b/Zotlabs/Widget/Admin.php index a761eebe3..f349377a0 100644 --- a/Zotlabs/Widget/Admin.php +++ b/Zotlabs/Widget/Admin.php @@ -24,7 +24,7 @@ class Admin { 'channels' => array(z_root() . '/admin/channels/', t('Channels'), 'channels'), 'security' => array(z_root() . '/admin/security/', t('Security'), 'security'), 'features' => array(z_root() . '/admin/features/', t('Features'), 'features'), - 'plugins' => array(z_root() . '/admin/plugins/', t('Plugins'), 'plugins'), + 'addons' => array(z_root() . '/admin/addons/', t('Addons'), 'addons'), 'themes' => array(z_root() . '/admin/themes/', t('Themes'), 'themes'), 'queue' => array(z_root() . '/admin/queue', t('Inspect queue'), 'queue'), 'profs' => array(z_root() . '/admin/profs', t('Profile Fields'), 'profs'), @@ -39,7 +39,7 @@ class Admin { if($r) { foreach ($r as $h){ $plugin = $h['aname']; - $plugins[] = array(z_root() . '/admin/plugins/' . $plugin, $plugin, 'plugin'); + $plugins[] = array(z_root() . '/admin/addons/' . $plugin, $plugin, 'plugin'); // temp plugins with admin \App::$plugins_admin[] = $plugin; } @@ -53,7 +53,7 @@ class Admin { $o .= replace_macros(get_markup_template('admin_aside.tpl'), array( '$admin' => $aside, '$admtxt' => t('Admin'), - '$plugadmtxt' => t('Plugin Features'), + '$plugadmtxt' => t('Addon Features'), '$plugins' => $plugins, '$logtxt' => t('Logs'), '$logs' => $logs, diff --git a/Zotlabs/Widget/Appcategories.php b/Zotlabs/Widget/Appcategories.php index 8ff14230f..aebd144d0 100644 --- a/Zotlabs/Widget/Appcategories.php +++ b/Zotlabs/Widget/Appcategories.php @@ -17,6 +17,9 @@ class Appcategories { // Leaving this line which negates the effect of the two invalid lines prior $srchurl = z_root() . '/apps'; + if(argc() > 1 && argv(1) === 'available') + $srchurl .= '/available'; + $terms = array(); diff --git a/Zotlabs/Widget/Appstore.php b/Zotlabs/Widget/Appstore.php new file mode 100644 index 000000000..237707733 --- /dev/null +++ b/Zotlabs/Widget/Appstore.php @@ -0,0 +1,18 @@ +<?php + +namespace Zotlabs\Widget; + + +class Appstore { + + function widget($arr) { + $store = ((argc() > 1 && argv(1) === 'available') ? 1 : 0); + return replace_macros(get_markup_template('appstore.tpl'), [ + '$title' => t('App Collections'), + '$options' => [ + [ z_root() . '/apps/available', t('Available Apps'), $store ], + [ z_root() . '/apps', t('Installed apps'), 1 - $store ] + ] + ]); + } +}
\ No newline at end of file diff --git a/Zotlabs/Widget/Collections.php b/Zotlabs/Widget/Collections.php index d2b29679a..bc9c812c6 100644 --- a/Zotlabs/Widget/Collections.php +++ b/Zotlabs/Widget/Collections.php @@ -8,6 +8,9 @@ class Collections { function widget($args) { + if(argc() < 2) + return; + $mode = ((array_key_exists('mode',$args)) ? $args['mode'] : 'conversation'); switch($mode) { case 'conversation': diff --git a/Zotlabs/Widget/Notifications.php b/Zotlabs/Widget/Notifications.php index fc78a2a39..a4cf4e706 100644 --- a/Zotlabs/Widget/Notifications.php +++ b/Zotlabs/Widget/Notifications.php @@ -111,6 +111,17 @@ class Notifications { 'label' => t('Mark all notices seen') ] ]; + + $notifications[] = [ + 'type' => 'forums', + 'icon' => 'comments-o', + 'severity' => 'secondary', + 'label' => t('Forums'), + 'title' => t('Forums'), + 'filter' => [ + 'name_label' => t('Filter by name') + ] + ]; } if(local_channel() && is_site_admin()) { diff --git a/Zotlabs/Widget/Settings_menu.php b/Zotlabs/Widget/Settings_menu.php index 9574becc3..f35d6f147 100644 --- a/Zotlabs/Widget/Settings_menu.php +++ b/Zotlabs/Widget/Settings_menu.php @@ -105,7 +105,7 @@ class Settings_menu { if(feature_enabled(local_channel(),'permcats')) { $tabs[] = array( - 'label' => t('Permission Groups'), + 'label' => t('Permission Categories'), 'url' => z_root() . '/settings/permcats', 'selected' => ((argv(1) === 'permcats') ? 'active' : ''), ); diff --git a/app/group.apd b/app/group.apd new file mode 100644 index 000000000..d16b9237c --- /dev/null +++ b/app/group.apd @@ -0,0 +1,6 @@ +version: 1 +url: $baseurl/group +requires: local_channel +name: Privacy Groups +photo: icon:users +categories: Networking @@ -50,7 +50,7 @@ require_once('include/attach.php'); require_once('include/bbcode.php'); define ( 'PLATFORM_NAME', 'hubzilla' ); -define ( 'STD_VERSION', '3.4.2' ); +define ( 'STD_VERSION', '3.6RC1' ); define ( 'ZOT_REVISION', '6.0a' ); @@ -404,6 +404,7 @@ define ( 'VNOTIFY_REGISTER', 0x0400 ); define ( 'VNOTIFY_FILES', 0x0800 ); define ( 'VNOTIFY_PUBS', 0x1000 ); define ( 'VNOTIFY_LIKE', 0x2000 ); +define ( 'VNOTIFY_FORUMS', 0x4000 ); @@ -872,20 +873,21 @@ class App { self::$path = $path; } - set_include_path("include/self::$hostname" . PATH_SEPARATOR . get_include_path()); - if((x($_SERVER,'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'], 0, 2) === "q=") { - self::$query_string = escape_tags(substr($_SERVER['QUERY_STRING'], 2)); + self::$query_string = str_replace(['<','>'],['<','>'],substr($_SERVER['QUERY_STRING'], 2)); // removing trailing / - maybe a nginx problem if (substr(self::$query_string, 0, 1) == "/") self::$query_string = substr(self::$query_string, 1); + // change the first & to ? + self::$query_string = preg_replace('/&/','?',self::$query_string,1); } + if(x($_GET,'q')) self::$cmd = escape_tags(trim($_GET['q'],'/\\')); // unix style "homedir" - if(substr(self::$cmd, 0, 1) === '~') + if((substr(self::$cmd, 0, 1) === '~') || (substr(self::$cmd, 0, 1) === '@')) self::$cmd = 'channel/' . substr(self::$cmd, 1); /* @@ -1558,17 +1560,43 @@ function fix_system_urls($oldurl, $newurl) { * @return string Parsed HTML code. */ function login($register = false, $form_id = 'main-login', $hiddens = false, $login_page = true) { + $o = ''; - $reg = false; - $reglink = get_config('system', 'register_link'); - if(! strlen($reglink)) - $reglink = 'register'; - - $reg = array( - 'title' => t('Create an account to access services and applications'), - 'desc' => t('Register'), - 'link' => (($register) ? $reglink : 'pubsites') - ); + $reg = null; + + // Here's the current description of how the register link works (2018-05-15) + + // Register links are enabled on the site home page and login page and navbar. + // They are not shown by default on other pages which may require login. + + // If the register link is enabled and registration is closed, the request is directed + // to /pubsites. If registration is allowed, /register is the default destination + + // system.register_link can over-ride the default behaviour and redirect to an arbitrary + // webpage for paid/custom or organisational registrations, regardless of whether + // registration is allowed. + + // system.register_link may or may not be the same destination as system.sellpage + + // system.sellpage is the destination linked from the /pubsites page on other sites. If + // system.sellpage is not set, the 'register' link in /pubsites will go to 'register' on your + // site. + + // If system.register_link is set to the word 'none', no registration link will be shown on + // your site. + + + $register_policy = get_config('system','register_policy'); + + $reglink = get_config('system', 'register_link', z_root() . '/' . ((intval($register_policy) === REGISTER_CLOSED) ? 'pubsites' : 'register')); + + if($reglink !== 'none') { + $reg = [ + 'title' => t('Create an account to access services and applications'), + 'desc' => t('Register'), + 'link' => $reglink + ]; + } $dest_url = z_root() . '/' . App::$query_string; @@ -1695,7 +1723,7 @@ function can_view_public_stream() { if(observer_prohibited(true)) { return false; } - + if(! (intval(get_config('system','open_pubstream',1)))) { if(! get_observer_hash()) { return false; @@ -2209,8 +2237,35 @@ function construct_page() { if(App::get_scheme() === 'https' && App::$config['system']['transport_security_header']) header("Strict-Transport-Security: max-age=31536000"); - if(App::$config['system']['content_security_policy']) - header("Content-Security-Policy: script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'"); + if(App::$config['system']['content_security_policy']) { + $cspsettings = Array ( + 'script-src' => Array ("'self'","'unsafe-inline'","'unsafe-eval'"), + 'style-src' => Array ("'self'","'unsafe-inline'") + ); + call_hooks('content_security_policy',$cspsettings); + + // Legitimate CSP directives (cxref: https://content-security-policy.com/) + $validcspdirectives=Array( + "default-src", "script-src", "style-src", + "img-src", "connect-src", "font-src", + "object-src", "media-src", 'frame-src', + 'sandbox', 'report-uri', 'child-src', + 'form-action', 'frame-ancestors', 'plugin-types' + ); + $cspheader = "Content-Security-Policy:"; + foreach ($cspsettings as $cspdirective => $csp) { + if (!in_array($cspdirective,$validcspdirectives)) { + logger("INVALID CSP DIRECTIVE: ".$cspdirective,LOGGER_DEBUG); + continue; + } + $cspsettingsarray=array_unique($cspsettings[$cspdirective]); + $cspsetpolicy = implode(' ',$cspsettingsarray); + if ($cspsetpolicy) { + $cspheader .= " ".$cspdirective." ".$cspsetpolicy.";"; + } + } + header($cspheader); + } if(App::$config['system']['x_security_headers']) { header("X-Frame-Options: SAMEORIGIN"); @@ -2492,8 +2547,8 @@ function check_cron_broken() { * @return boolean */ function observer_prohibited($allow_account = false) { - if($allow_account) + if($allow_account) { return (((get_config('system', 'block_public')) && (! get_account_id()) && (! remote_channel())) ? true : false ); - + } return (((get_config('system', 'block_public')) && (! local_channel()) && (! remote_channel())) ? true : false ); } diff --git a/composer.json b/composer.json index f89fb15b2..792c08810 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,7 @@ "SSO", "ZOT" ], - "homepage" : "http://github.com/redmatrix/hubzilla", + "homepage" : "http://framagit.org/hubzilla/core/", "license" : "MIT", "authors" : [{ "name" : "Mike Macgirvin", @@ -18,8 +18,8 @@ } ], "support" : { - "issues" : "https://github.com/redmatrix/hubzilla/issues", - "source" : "https://github.com/redmatrix/hubzilla" + "issues" : "https://framagit.org/hubzilla/core/issues", + "source" : "https://framagit.org/hubzilla/core/" }, "require" : { "php" : ">=5.5", @@ -40,13 +40,12 @@ "smarty/smarty": "~3.1" }, "require-dev" : { - "php" : ">=7.0", - "phpunit/phpunit" : "~6.4.4", + "phpunit/phpunit" : "@stable", "behat/behat" : "@stable", "behat/mink-extension": "@stable", "behat/mink-goutte-driver": "@stable", - "php-mock/php-mock-phpunit": "^2.0", - "phpunit/dbunit": "^3.0" + "php-mock/php-mock-phpunit": "@stable", + "phpunit/dbunit": "@stable" }, "autoload" : { "psr-4" : { diff --git a/composer.lock b/composer.lock index 4a80d7d90..6f1af0fd7 100644 --- a/composer.lock +++ b/composer.lock @@ -1,10 +1,10 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "516114a0fbd804e5234ebeacbac30376", + "content-hash": "ca5770d3c97cc1d0375413eeb61758ab", "packages": [ { "name": "bshaffer/oauth2-server-php", @@ -640,16 +640,16 @@ }, { "name": "sabre/vobject", - "version": "4.1.5", + "version": "4.1.6", "source": { "type": "git", "url": "https://github.com/sabre-io/vobject.git", - "reference": "0928660e92d46d2d24336a6db320636aa3a75414" + "reference": "122cacbdea2c6133ac04db86ec05854beef75adf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/vobject/zipball/0928660e92d46d2d24336a6db320636aa3a75414", - "reference": "0928660e92d46d2d24336a6db320636aa3a75414", + "url": "https://api.github.com/repos/sabre-io/vobject/zipball/122cacbdea2c6133ac04db86ec05854beef75adf", + "reference": "122cacbdea2c6133ac04db86ec05854beef75adf", "shasum": "" }, "require": { @@ -733,7 +733,7 @@ "xCal", "xCard" ], - "time": "2018-03-08T21:06:39+00:00" + "time": "2018-04-20T07:22:50+00:00" }, { "name": "sabre/xml", @@ -863,16 +863,16 @@ }, { "name": "smarty/smarty", - "version": "v3.1.31", + "version": "v3.1.32", "source": { "type": "git", "url": "https://github.com/smarty-php/smarty.git", - "reference": "c7d42e4a327c402897dd587871434888fde1e7a9" + "reference": "ac9d4b587e5bf53381e21881820a9830765cb459" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/smarty-php/smarty/zipball/c7d42e4a327c402897dd587871434888fde1e7a9", - "reference": "c7d42e4a327c402897dd587871434888fde1e7a9", + "url": "https://api.github.com/repos/smarty-php/smarty/zipball/ac9d4b587e5bf53381e21881820a9830765cb459", + "reference": "ac9d4b587e5bf53381e21881820a9830765cb459", "shasum": "" }, "require": { @@ -912,7 +912,7 @@ "keywords": [ "templating" ], - "time": "2016-12-14T21:57:25+00:00" + "time": "2018-04-24T14:53:33+00:00" } ], "packages-dev": [ @@ -1118,27 +1118,27 @@ }, { "name": "behat/mink-browserkit-driver", - "version": "v1.3.2", + "version": "1.3.3", "source": { "type": "git", "url": "https://github.com/minkphp/MinkBrowserKitDriver.git", - "reference": "10e67fb4a295efcd62ea0bf16025a85ea19534fb" + "reference": "1b9a7ce903cfdaaec5fb32bfdbb26118343662eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/minkphp/MinkBrowserKitDriver/zipball/10e67fb4a295efcd62ea0bf16025a85ea19534fb", - "reference": "10e67fb4a295efcd62ea0bf16025a85ea19534fb", + "url": "https://api.github.com/repos/minkphp/MinkBrowserKitDriver/zipball/1b9a7ce903cfdaaec5fb32bfdbb26118343662eb", + "reference": "1b9a7ce903cfdaaec5fb32bfdbb26118343662eb", "shasum": "" }, "require": { "behat/mink": "^1.7.1@dev", "php": ">=5.3.6", - "symfony/browser-kit": "~2.3|~3.0", - "symfony/dom-crawler": "~2.3|~3.0" + "symfony/browser-kit": "~2.3|~3.0|~4.0", + "symfony/dom-crawler": "~2.3|~3.0|~4.0" }, "require-dev": { - "silex/silex": "~1.2", - "symfony/phpunit-bridge": "~2.7|~3.0" + "mink/driver-testsuite": "dev-master", + "symfony/http-kernel": "~2.3|~3.0|~4.0" }, "type": "mink-driver", "extra": { @@ -1170,7 +1170,7 @@ "browser", "testing" ], - "time": "2016-03-05T08:59:47+00:00" + "time": "2018-05-02T09:25:31+00:00" }, { "name": "behat/mink-extension", @@ -1472,16 +1472,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "6.3.0", + "version": "6.3.3", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699" + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699", - "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", "shasum": "" }, "require": { @@ -1491,7 +1491,7 @@ }, "require-dev": { "ext-curl": "*", - "phpunit/phpunit": "^4.0 || ^5.0", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", "psr/log": "^1.0" }, "suggest": { @@ -1500,7 +1500,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "6.2-dev" + "dev-master": "6.3-dev" } }, "autoload": { @@ -1533,7 +1533,7 @@ "rest", "web service" ], - "time": "2017-06-22T18:50:49+00:00" + "time": "2018-04-22T15:46:56+00:00" }, { "name": "guzzlehttp/promises", @@ -1914,25 +1914,28 @@ }, { "name": "php-mock/php-mock-phpunit", - "version": "2.0.1", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/php-mock/php-mock-phpunit.git", - "reference": "b42fc41ecb7538564067527f6c30b8854f149d32" + "reference": "ff1cc1d4e7478ce74221e05742588619bee84f69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-mock/php-mock-phpunit/zipball/b42fc41ecb7538564067527f6c30b8854f149d32", - "reference": "b42fc41ecb7538564067527f6c30b8854f149d32", + "url": "https://api.github.com/repos/php-mock/php-mock-phpunit/zipball/ff1cc1d4e7478ce74221e05742588619bee84f69", + "reference": "ff1cc1d4e7478ce74221e05742588619bee84f69", "shasum": "" }, "require": { "php": ">=7", "php-mock/php-mock-integration": "^2", - "phpunit/phpunit": "^6 <6.5" + "phpunit/phpunit": "^6 || ^7" }, "type": "library", "autoload": { + "files": [ + "autoload.php" + ], "psr-4": { "phpmock\\phpunit\\": "classes/" } @@ -1961,7 +1964,7 @@ "test", "test double" ], - "time": "2017-12-02T09:49:02+00:00" + "time": "2018-04-06T13:54:43+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -2111,23 +2114,23 @@ }, { "name": "phpspec/prophecy", - "version": "1.7.5", + "version": "1.7.6", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "dfd6be44111a7c41c2e884a336cc4f461b3b2401" + "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/dfd6be44111a7c41c2e884a336cc4f461b3b2401", - "reference": "dfd6be44111a7c41c2e884a336cc4f461b3b2401", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/33a7e3c4fda54e912ff6338c48823bd5c0f0b712", + "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", "php": "^5.3|^7.0", "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", - "sebastian/comparator": "^1.1|^2.0", + "sebastian/comparator": "^1.1|^2.0|^3.0", "sebastian/recursion-context": "^1.0|^2.0|^3.0" }, "require-dev": { @@ -2170,7 +2173,7 @@ "spy", "stub" ], - "time": "2018-02-19T10:16:54+00:00" + "time": "2018-04-18T13:57:24+00:00" }, { "name": "phpunit/dbunit", @@ -2226,16 +2229,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "5.3.0", + "version": "5.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "661f34d0bd3f1a7225ef491a70a020ad23a057a1" + "reference": "c89677919c5dd6d3b3852f230a663118762218ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/661f34d0bd3f1a7225ef491a70a020ad23a057a1", - "reference": "661f34d0bd3f1a7225ef491a70a020ad23a057a1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c89677919c5dd6d3b3852f230a663118762218ac", + "reference": "c89677919c5dd6d3b3852f230a663118762218ac", "shasum": "" }, "require": { @@ -2285,7 +2288,7 @@ "testing", "xunit" ], - "time": "2017-12-06T09:29:45+00:00" + "time": "2018-04-06T15:36:58+00:00" }, { "name": "phpunit/php-file-iterator", @@ -2475,16 +2478,16 @@ }, { "name": "phpunit/phpunit", - "version": "6.4.4", + "version": "6.5.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "562f7dc75d46510a4ed5d16189ae57fbe45a9932" + "reference": "4f21a3c6b97c42952fd5c2837bb354ec0199b97b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/562f7dc75d46510a4ed5d16189ae57fbe45a9932", - "reference": "562f7dc75d46510a4ed5d16189ae57fbe45a9932", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4f21a3c6b97c42952fd5c2837bb354ec0199b97b", + "reference": "4f21a3c6b97c42952fd5c2837bb354ec0199b97b", "shasum": "" }, "require": { @@ -2498,12 +2501,12 @@ "phar-io/version": "^1.0", "php": "^7.0", "phpspec/prophecy": "^1.7", - "phpunit/php-code-coverage": "^5.2.2", - "phpunit/php-file-iterator": "^1.4.2", + "phpunit/php-code-coverage": "^5.3", + "phpunit/php-file-iterator": "^1.4.3", "phpunit/php-text-template": "^1.2.1", "phpunit/php-timer": "^1.0.9", - "phpunit/phpunit-mock-objects": "^4.0.3", - "sebastian/comparator": "^2.0.2", + "phpunit/phpunit-mock-objects": "^5.0.5", + "sebastian/comparator": "^2.1", "sebastian/diff": "^2.0", "sebastian/environment": "^3.1", "sebastian/exporter": "^3.1", @@ -2529,7 +2532,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "6.4.x-dev" + "dev-master": "6.5.x-dev" } }, "autoload": { @@ -2555,33 +2558,33 @@ "testing", "xunit" ], - "time": "2017-11-08T11:26:09+00:00" + "time": "2018-04-10T11:38:34+00:00" }, { "name": "phpunit/phpunit-mock-objects", - "version": "4.0.4", + "version": "5.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "2f789b59ab89669015ad984afa350c4ec577ade0" + "reference": "33fd41a76e746b8fa96d00b49a23dadfa8334cdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/2f789b59ab89669015ad984afa350c4ec577ade0", - "reference": "2f789b59ab89669015ad984afa350c4ec577ade0", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/33fd41a76e746b8fa96d00b49a23dadfa8334cdf", + "reference": "33fd41a76e746b8fa96d00b49a23dadfa8334cdf", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.5", "php": "^7.0", "phpunit/php-text-template": "^1.2.1", - "sebastian/exporter": "^3.0" + "sebastian/exporter": "^3.1" }, "conflict": { "phpunit/phpunit": "<6.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^6.5" }, "suggest": { "ext-soap": "*" @@ -2589,7 +2592,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0.x-dev" + "dev-master": "5.0.x-dev" } }, "autoload": { @@ -2604,7 +2607,7 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", + "email": "sebastian@phpunit.de", "role": "lead" } ], @@ -2614,7 +2617,7 @@ "mock", "xunit" ], - "time": "2017-08-03T14:08:16+00:00" + "time": "2018-01-06T05:45:45+00:00" }, { "name": "psr/container", @@ -3276,16 +3279,16 @@ }, { "name": "symfony/browser-kit", - "version": "v3.4.6", + "version": "v3.4.9", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "490f27762705c8489bd042fe3e9377a191dba9b4" + "reference": "840bb6f0d5b3701fd768b68adf7193c2d0f98f79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/490f27762705c8489bd042fe3e9377a191dba9b4", - "reference": "490f27762705c8489bd042fe3e9377a191dba9b4", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/840bb6f0d5b3701fd768b68adf7193c2d0f98f79", + "reference": "840bb6f0d5b3701fd768b68adf7193c2d0f98f79", "shasum": "" }, "require": { @@ -3329,11 +3332,11 @@ ], "description": "Symfony BrowserKit Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:37:34+00:00" + "time": "2018-03-19T22:32:39+00:00" }, { "name": "symfony/class-loader", - "version": "v3.4.6", + "version": "v3.4.9", "source": { "type": "git", "url": "https://github.com/symfony/class-loader.git", @@ -3389,16 +3392,16 @@ }, { "name": "symfony/config", - "version": "v3.4.6", + "version": "v3.4.9", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "05e10567b529476a006b00746c5f538f1636810e" + "reference": "7c2a9d44f4433863e9bca682e7f03609234657f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/05e10567b529476a006b00746c5f538f1636810e", - "reference": "05e10567b529476a006b00746c5f538f1636810e", + "url": "https://api.github.com/repos/symfony/config/zipball/7c2a9d44f4433863e9bca682e7f03609234657f9", + "reference": "7c2a9d44f4433863e9bca682e7f03609234657f9", "shasum": "" }, "require": { @@ -3448,20 +3451,20 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2018-02-14T10:03:57+00:00" + "time": "2018-03-19T22:32:39+00:00" }, { "name": "symfony/console", - "version": "v3.4.6", + "version": "v3.4.9", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "067339e9b8ec30d5f19f5950208893ff026b94f7" + "reference": "5b1fdfa8eb93464bcc36c34da39cedffef822cdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/067339e9b8ec30d5f19f5950208893ff026b94f7", - "reference": "067339e9b8ec30d5f19f5950208893ff026b94f7", + "url": "https://api.github.com/repos/symfony/console/zipball/5b1fdfa8eb93464bcc36c34da39cedffef822cdf", + "reference": "5b1fdfa8eb93464bcc36c34da39cedffef822cdf", "shasum": "" }, "require": { @@ -3482,7 +3485,7 @@ "symfony/process": "~3.3|~4.0" }, "suggest": { - "psr/log": "For using the console logger", + "psr/log-implementation": "For using the console logger", "symfony/event-dispatcher": "", "symfony/lock": "", "symfony/process": "" @@ -3517,20 +3520,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-02-26T15:46:28+00:00" + "time": "2018-04-30T01:22:56+00:00" }, { "name": "symfony/css-selector", - "version": "v3.4.6", + "version": "v3.4.9", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "544655f1fc078a9cd839fdda2b7b1e64627c826a" + "reference": "519a80d7c1d95c6cc0b67f686d15fe27c6910de0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/544655f1fc078a9cd839fdda2b7b1e64627c826a", - "reference": "544655f1fc078a9cd839fdda2b7b1e64627c826a", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/519a80d7c1d95c6cc0b67f686d15fe27c6910de0", + "reference": "519a80d7c1d95c6cc0b67f686d15fe27c6910de0", "shasum": "" }, "require": { @@ -3570,20 +3573,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2018-02-03T14:55:07+00:00" + "time": "2018-03-19T22:32:39+00:00" }, { "name": "symfony/debug", - "version": "v3.4.6", + "version": "v3.4.9", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "9b1071f86e79e1999b3d3675d2e0e7684268b9bc" + "reference": "1b95888cfd996484527cb41e8952d9a5eaf7454f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/9b1071f86e79e1999b3d3675d2e0e7684268b9bc", - "reference": "9b1071f86e79e1999b3d3675d2e0e7684268b9bc", + "url": "https://api.github.com/repos/symfony/debug/zipball/1b95888cfd996484527cb41e8952d9a5eaf7454f", + "reference": "1b95888cfd996484527cb41e8952d9a5eaf7454f", "shasum": "" }, "require": { @@ -3626,20 +3629,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-02-28T21:49:22+00:00" + "time": "2018-04-30T16:53:52+00:00" }, { "name": "symfony/dependency-injection", - "version": "v3.4.6", + "version": "v3.4.9", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "12e901abc1cb0d637a0e5abe9923471361d96b07" + "reference": "54ff9d78b56429f9a1ac12e60bfb6d169c0468e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/12e901abc1cb0d637a0e5abe9923471361d96b07", - "reference": "12e901abc1cb0d637a0e5abe9923471361d96b07", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/54ff9d78b56429f9a1ac12e60bfb6d169c0468e3", + "reference": "54ff9d78b56429f9a1ac12e60bfb6d169c0468e3", "shasum": "" }, "require": { @@ -3697,20 +3700,20 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2018-03-04T03:54:53+00:00" + "time": "2018-04-29T14:04:08+00:00" }, { "name": "symfony/dom-crawler", - "version": "v3.4.6", + "version": "v3.4.9", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "2bb5d3101cc01f4fe580e536daf4f1959bc2d24d" + "reference": "1a4cffeb059226ff6bee9f48acb388faf674afff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/2bb5d3101cc01f4fe580e536daf4f1959bc2d24d", - "reference": "2bb5d3101cc01f4fe580e536daf4f1959bc2d24d", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/1a4cffeb059226ff6bee9f48acb388faf674afff", + "reference": "1a4cffeb059226ff6bee9f48acb388faf674afff", "shasum": "" }, "require": { @@ -3753,20 +3756,20 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2018-02-22T10:48:49+00:00" + "time": "2018-03-19T22:32:39+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v3.4.6", + "version": "v3.4.9", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "58990682ac3fdc1f563b7e705452921372aad11d" + "reference": "fdd5abcebd1061ec647089c6c41a07ed60af09f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/58990682ac3fdc1f563b7e705452921372aad11d", - "reference": "58990682ac3fdc1f563b7e705452921372aad11d", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/fdd5abcebd1061ec647089c6c41a07ed60af09f8", + "reference": "fdd5abcebd1061ec647089c6c41a07ed60af09f8", "shasum": "" }, "require": { @@ -3816,11 +3819,11 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2018-02-14T10:03:57+00:00" + "time": "2018-04-06T07:35:25+00:00" }, { "name": "symfony/filesystem", - "version": "v3.4.6", + "version": "v3.4.9", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", @@ -3869,16 +3872,16 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.7.0", + "version": "v1.8.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "78be803ce01e55d3491c1397cf1c64beb9c1b63b" + "reference": "3296adf6a6454a050679cde90f95350ad604b171" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/78be803ce01e55d3491c1397cf1c64beb9c1b63b", - "reference": "78be803ce01e55d3491c1397cf1c64beb9c1b63b", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171", + "reference": "3296adf6a6454a050679cde90f95350ad604b171", "shasum": "" }, "require": { @@ -3890,7 +3893,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7-dev" + "dev-master": "1.8-dev" } }, "autoload": { @@ -3924,20 +3927,20 @@ "portable", "shim" ], - "time": "2018-01-30T19:27:44+00:00" + "time": "2018-04-26T10:06:28+00:00" }, { "name": "symfony/translation", - "version": "v3.4.6", + "version": "v3.4.9", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "80e19eaf12cbb546ac40384e5c55c36306823e57" + "reference": "d4af50f46cd8171fd5c1cdebdb9a8bbcd8078c6c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/80e19eaf12cbb546ac40384e5c55c36306823e57", - "reference": "80e19eaf12cbb546ac40384e5c55c36306823e57", + "url": "https://api.github.com/repos/symfony/translation/zipball/d4af50f46cd8171fd5c1cdebdb9a8bbcd8078c6c", + "reference": "d4af50f46cd8171fd5c1cdebdb9a8bbcd8078c6c", "shasum": "" }, "require": { @@ -3958,7 +3961,7 @@ "symfony/yaml": "~3.4|~4.0" }, "suggest": { - "psr/log": "To use logging capability in translator", + "psr/log-implementation": "To use logging capability in translator", "symfony/config": "", "symfony/yaml": "" }, @@ -3992,20 +3995,20 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2018-02-22T06:28:18+00:00" + "time": "2018-04-30T01:22:56+00:00" }, { "name": "symfony/yaml", - "version": "v3.4.6", + "version": "v3.4.9", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "6af42631dcf89e9c616242c900d6c52bd53bd1bb" + "reference": "033cfa61ef06ee0847e056e530201842b6e926c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/6af42631dcf89e9c616242c900d6c52bd53bd1bb", - "reference": "6af42631dcf89e9c616242c900d6c52bd53bd1bb", + "url": "https://api.github.com/repos/symfony/yaml/zipball/033cfa61ef06ee0847e056e530201842b6e926c3", + "reference": "033cfa61ef06ee0847e056e530201842b6e926c3", "shasum": "" }, "require": { @@ -4050,7 +4053,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-02-16T09:50:28+00:00" + "time": "2018-04-08T08:21:29+00:00" }, { "name": "theseer/tokenizer", @@ -4094,16 +4097,16 @@ }, { "name": "webmozart/assert", - "version": "1.2.0", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" + "reference": "0df1908962e7a3071564e857d86874dad1ef204a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", - "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", + "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", + "reference": "0df1908962e7a3071564e857d86874dad1ef204a", "shasum": "" }, "require": { @@ -4140,15 +4143,18 @@ "check", "validate" ], - "time": "2016-11-23T20:04:58+00:00" + "time": "2018-01-29T19:49:41+00:00" } ], "aliases": [], "minimum-stability": "stable", "stability-flags": { + "phpunit/phpunit": 0, "behat/behat": 0, "behat/mink-extension": 0, - "behat/mink-goutte-driver": 0 + "behat/mink-goutte-driver": 0, + "php-mock/php-mock-phpunit": 0, + "phpunit/dbunit": 0 }, "prefer-stable": false, "prefer-lowest": false, @@ -4160,7 +4166,5 @@ "ext-xml": "*", "ext-openssl": "*" }, - "platform-dev": { - "php": ">=5.6 || >=7.0" - } + "platform-dev": [] } diff --git a/doc/Hubzilla_on_OpenShift.bb b/doc/Hubzilla_on_OpenShift.bb index bdc8bf9bf..7bdd70955 100644 --- a/doc/Hubzilla_on_OpenShift.bb +++ b/doc/Hubzilla_on_OpenShift.bb @@ -1,11 +1,11 @@ [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. +You will notice a new .openshift folder when you fetch from upstream, i.e. from [url=https://framagit.org/hubzilla/core.git]https://framagit.org/hubzilla/core.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. Create an account on OpenShift, then use the registration e-mail and password to create your first Hubzilla instance. Install git and RedHat's command line tools - rhc - if you have not already done so. See for example https://developers.openshift.com/en/getting-started-debian-ubuntu.html on how to do this on Debian GNU/Linux, or in the menu on that page for other GNU/Linux distributions or other operating systems. -[code]rhc app-create your_app_name php-5.4 mysql-5.5 cron phpmyadmin --namespace your_domain --from-code https://github.com/redmatrix/hubzilla.git -l your@email.address -p your_account_password +[code]rhc app-create your_app_name php-5.4 mysql-5.5 cron phpmyadmin --namespace your_domain --from-code https://framagit.org/hubzilla/core.git -l your@email.address -p your_account_password [/code] Make a note of the database username and password OpenShift creates for your instance, and use these at [url=https://your_app_name-your_domain.rhcloud.com/]https://your_app_name-your_domain.rhcloud.com/[/url] to complete the setup. You MUST change server address from 127.0.0.1 to localhost. diff --git a/doc/README.md b/doc/README.md index 54f80bebe..8de107877 100644 --- a/doc/README.md +++ b/doc/README.md @@ -4,7 +4,7 @@ Hubzilla - Community Server =========================== <p align="center" markdown="1"> -<em><a href="https://github.com/redmatrix/hubzilla/blob/master/install/INSTALL.txt">Installing Hubzilla</a></em> +<em><a href="https://framagit.org/hubzilla/core/blob/master/install/INSTALL.txt">Installing Hubzilla</a></em> </p> diff --git a/doc/TermsOfService.md b/doc/TermsOfService.md index 97e9881aa..1e085559e 100644 --- a/doc/TermsOfService.md +++ b/doc/TermsOfService.md @@ -1,3 +1,9 @@ +Privacy Policy +============== + +#include doc/gdpr1.md; + + Terms of Service ================ diff --git a/doc/about/about.bb b/doc/about/about.bb index b927e80c0..e909f54cd 100644 --- a/doc/about/about.bb +++ b/doc/about/about.bb @@ -13,7 +13,7 @@ From the practical perspective of hub members who use the software, $Projectname 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. +The $Projectname software stack is a relatively standard webserver application written primarily in PHP/MySQL and [url=https://framagit.org/hubzilla/core/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]Glossary[/h3] [dl terms="b"] diff --git a/doc/addons.bb b/doc/addons.bb index e6841d3d0..4bfa7a9fd 100644 --- a/doc/addons.bb +++ b/doc/addons.bb @@ -106,7 +106,7 @@ For these reasons we [b]strongly recommend[/b] that you do NOT install addons fr We also recognise that some developers prefer working on their own and do not wish their code to be mingled with the project repository for a variety of reasons. These developers can ease troubleshooting and debugging by providing a README file in their respective code repository outlining the process for submitting patches and bug fixes. It is also recommended that these projects provide both a 'dev' (development) and 'master' (production) branch which tracks the current project branches of those names. This is because dev and master are often not compatible from the viewpoint of library interfaces. It is also highly recommended that your repository versions are tagged and moved forward within 24 hours of project releases. This is a major inconvenience for everybdy involved, and can present downtime for production sites while this process is being carried out; which is one more reason why we [b]strongly recommend[/b] that addons be submitted to the project addon repository and that you do NOT install such third-party addons. -[url=https://github.com/redmatrix/hubzilla-addons]https://github.com/redmatrix/hubzilla-addons[/url] Main project addon repository +[url=https://framagit.org/hubzilla/addons]https://framagit.org/hubzilla/addons[/url] Main project addon repository [url=https://github.com/23n/red-addons]https://github.com/23n/red-addons[/url] Oliver's repository (mayan_places and flip) diff --git a/doc/addons_gnusocial.bb b/doc/addons_gnusocial.bb index d9aed9ac5..fbb387476 100644 --- a/doc/addons_gnusocial.bb +++ b/doc/addons_gnusocial.bb @@ -10,7 +10,7 @@ Next, click the link to Register a new application. That brings up the new appli Icon. I uploaded $Projectname icon located at this link, after saving it to my computer: -https://github.com/redmatrix/hubzilla/blob/master/images/rm-32.png +https://framagit.org/hubzilla/core/blob/master/images/rm-32.png Name. Give the application an appropriate name. I called mine hubzilla. You might prefer r2g. diff --git a/doc/admin/administrator_guide.md b/doc/admin/administrator_guide.md index 939dc18a7..5f1d40428 100644 --- a/doc/admin/administrator_guide.md +++ b/doc/admin/administrator_guide.md @@ -19,7 +19,7 @@ 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 +tracker](https://framagit.org/hubzilla/core/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 @@ -120,7 +120,7 @@ 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 + git clone https://framagit.org/hubzilla/core.git mywebsite and then you can pick up the latest changes at any time with: @@ -153,7 +153,7 @@ web-based administrative tools to function: Navigate to your website. Then 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 + util/add_addon_repo https://framagit.org/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:: @@ -185,7 +185,7 @@ The installation script was originally designed for a small hardware server behi 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. `git clone https://framagit.org/hubzilla/core.git .` 1. `nano .homeinstall/hubzilla-config.txt` 1. `cd .homeinstall/` 1. `./hubzilla-setup.sh` @@ -331,16 +331,6 @@ 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. ### Administration @@ -396,7 +386,7 @@ To immediately clear out all the extra logging stuff you added. Use the informa ##### Rotating log files -1. Enable the **logrot** addon in the official [hubzilla-addons](https://github.com/redmatrix/hubzilla-addons) repo +1. Enable the **logrot** addon in the official [hubzilla-addons](https://framagit.org/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. @@ -407,6 +397,6 @@ When reporting issues, please try to provide as much detail as may be necessary We encourage you to try to the best of your abilities to use these logs combined with the source code in your possession to troubleshoot issues and find their cause. The community is often able to help, but only you have access to your site logfiles and it is considered a security risk to share them. -If a code issue has been uncovered, please report it on the project bugtracker (https://github.com/redmatrix/hubzilla/issues). Again provide as much detail as possible to avoid us going back and forth asking questions about your configuration or how to duplicate the problem, so that we can get right to the problem and figure out what to do about it. You are also welcome to offer your own solutions and submit patches. In fact we encourage this as we are all volunteers and have little spare time available. The more people that help, the easier the workload for everybody. It's OK if your solution isn't perfect. Every little bit helps and perhaps we can improve on it. +If a code issue has been uncovered, please report it on the project bugtracker (https://framagit.org/hubzilla/core/issues). Again provide as much detail as possible to avoid us going back and forth asking questions about your configuration or how to duplicate the problem, so that we can get right to the problem and figure out what to do about it. You are also welcome to offer your own solutions and submit patches. In fact we encourage this as we are all volunteers and have little spare time available. The more people that help, the easier the workload for everybody. It's OK if your solution isn't perfect. Every little bit helps and perhaps we can improve on it. diff --git a/doc/api/api_functions.bb b/doc/api/api_functions.bb index e6cde3dc6..fe7cb11ba 100644 --- a/doc/api/api_functions.bb +++ b/doc/api/api_functions.bb @@ -1,133 +1,133 @@ -[b]Red Twitter API[/b]
-
-The "basic" Red web API is based on the Twitter API, as this provides instant compatibility with a huge number of third-party clients and applications without requiring any code changes on their part. It is also a super-set of the StatusNet version of the Twitter API, as this also has existing wide support.
-
-Red has a lot more capability that isn't exposed in the Twitter interfaces or where we are forced to "dumb-down" the API functions to work with the primitive Twitter/StatusNet communications and privacy model. So we plan to extend the Twitter API in ways that will allow Red-specific clients to make full use of Red features without being crippled.
-
-A dedicated Red API is also being developed to work with native data structures and permissions and which do not require translating to different privacy and permission models and storage formats. This will be described in other documents. The prefix for all of the native endpoints is 'api/red'.
-
-Red provides multiple channels accesible via the same login account. With Red, any API function which requires authentication will accept a parameter &channel={channel_nickname} - and will select that channel and make it current before executing the API command. By default, the default channel associated with an account is selected.
-
-Red also provides an extended permission model. In the absence of any Red specific API calls to set permissions, they will be set to the default permissions settings which are associated with the current channel.
-
-Red will probably never be able to support the Twitter 'api/friendships' functions fully because Red is not a social network and has no concept of "friendships" - it only recognises permissions to do stuff (or not do stuff as the case may be).
-
-Legend: T= Twitter, S= StatusNet, F= Friendica, R= Red, ()=Not yet working, J= JSON only (XML formats deprecated)
-
-Twitter API compatible functions:
-
- api/account/verify_credentials T,S,F,R
- api/statuses/update T,S,F,R
- api/users/show T,S,F,R
- api/statuses/home_timeline T,S,F,R
- api/statuses/friends_timeline T,S,F,R
- api/statuses/public_timeline T,S,F,R
- api/statuses/show T,S,F,R
- api/statuses/retweet T,S,F,R
- api/statuses/destroy T,S,F,(R)
- api/statuses/mentions T,S,F,(R)
- api/statuses/replies T,S,F,(R)
- api/statuses/user_timeline T,S,F,(R)
- api/favorites T,S,F,R
- api/account/rate_limit_status T,S,F,R
- api/help/test T,S,F,R
- api/statuses/friends T,S,F,R
- api/statuses/followers T,S,F,R
- api/friends/ids T,S,F,R
- api/followers/ids T,S,F,R
- api/direct_messages/new T,S,F,R
- api/direct_messages/conversation T,S,F,R
- api/direct_messages/all T,S,F,R
- api/direct_messages/sent T,S,F,R
- api/direct_messages T,S,F,R
- api/oauth/request_token T,S,F,R
- api/oauth/access_token T,S,F,R
- api/favorites T,S,R
- api/favorites/create T,S,R
- api/favorites/destroy T,S,R
-
-Twitter API functions supported by StatusNet but not currently by Friendica or Red
-
- api/statuses/retweets_of_me T,S
- api/friendships/create T,S
- api/friendships/destroy T,S
- api/friendships/exists T,S
- api/friendships/show T,S
- api/account/update_location T,S
- api/account/update_profile_background_image T,S
- api/account/update_profile_image T,S
- api/blocks/create T,S
- api/blocks/destroy T,S
-
-Twitter API functions not currently supported by StatusNet
-
- api/statuses/retweeted_to_me T
- api/statuses/retweeted_by_me T
- api/direct_messages/destroy T
- api/account/end_session T,(R)
- api/account/update_delivery_device T
- api/notifications/follow T
- api/notifications/leave T
- api/blocks/exists T
- api/blocks/blocking T
- api/lists T
-
-Statusnet compatible extensions to the Twitter API supported in both Friendica and Red
-
- api/statusnet/version S,F,R
- api/statusnet/config S,F,R
-
-Friendica API extensions to the Twitter API supported in both Friendica and Red
-
- api/statuses/mediap F,R
-
-Red specific API extensions to the Twitter API not supported in Friendica
-
- api/account/logout R
- api/export/basic R,J
- api/friendica/config R
- api/red/config R
- api/friendica/version R
-
- api/red/version R
-
- api/red/channel/export/basic R,J
- api/red/channel/stream R,J (currently post only)
- api/red/albums R,J
- api/red/photos R,J (option album=xxxx)
-
-Red proposed API extensions to the Twitter API
-
- api/statuses/edit (R),J
- api/statuses/permissions (R),J
- api/statuses/permissions/update (R),J
- api/statuses/ids (R),J # search for existing message_id before importing a foreign post
- api/files/show (R),J
- api/files/destroy (R),J
- api/files/update (R),J
- api/files/permissions (R),J
- api/files/permissions/update (R),J
- api/pages/show (R),J
- api/pages/destroy (R),J
- api/pages/update (R),J
- api/pages/permissions (R),J
- api/pages/permissions/update (R),J
- api/events/show (R),J
- api/events/update (R),J
- api/events/permissions (R),J
- api/events/permissions/update (R),J
- api/events/destroy (R),J
- api/photos/show (R),J
- api/photos/update (R),J
- api/photos/permissions (R),J
- api/photos/permissions/update (R),J
- api/albums/destroy (R),J
- api/albums/show (R),J
- api/albums/update (R),J
- api/albums/permissions (R),J
- api/albums/permissions/update (R),J
- api/albums/destroy (R),J
- api/friends/permissions (R),J
-
-#include doc/macros/main_footer.bb;
-
+[b]Red Twitter API[/b] + +The "basic" Red web API is based on the Twitter API, as this provides instant compatibility with a huge number of third-party clients and applications without requiring any code changes on their part. It is also a super-set of the StatusNet version of the Twitter API, as this also has existing wide support. + +Red has a lot more capability that isn't exposed in the Twitter interfaces or where we are forced to "dumb-down" the API functions to work with the primitive Twitter/StatusNet communications and privacy model. So we plan to extend the Twitter API in ways that will allow Red-specific clients to make full use of Red features without being crippled. + +A dedicated Red API is also being developed to work with native data structures and permissions and which do not require translating to different privacy and permission models and storage formats. This will be described in other documents. The prefix for all of the native endpoints is 'api/red'. + +Red provides multiple channels accesible via the same login account. With Red, any API function which requires authentication will accept a parameter &channel={channel_nickname} - and will select that channel and make it current before executing the API command. By default, the default channel associated with an account is selected. + +Red also provides an extended permission model. In the absence of any Red specific API calls to set permissions, they will be set to the default permissions settings which are associated with the current channel. + +Red will probably never be able to support the Twitter 'api/friendships' functions fully because Red is not a social network and has no concept of "friendships" - it only recognises permissions to do stuff (or not do stuff as the case may be). + +Legend: T= Twitter, S= StatusNet, F= Friendica, R= Red, ()=Not yet working, J= JSON only (XML formats deprecated) + +Twitter API compatible functions: + + api/account/verify_credentials T,S,F,R + api/statuses/update T,S,F,R + api/users/show T,S,F,R + api/statuses/home_timeline T,S,F,R + api/statuses/friends_timeline T,S,F,R + api/statuses/public_timeline T,S,F,R + api/statuses/show T,S,F,R + api/statuses/retweet T,S,F,R + api/statuses/destroy T,S,F,(R) + api/statuses/mentions T,S,F,(R) + api/statuses/replies T,S,F,(R) + api/statuses/user_timeline T,S,F,(R) + api/favorites T,S,F,R + api/account/rate_limit_status T,S,F,R + api/help/test T,S,F,R + api/statuses/friends T,S,F,R + api/statuses/followers T,S,F,R + api/friends/ids T,S,F,R + api/followers/ids T,S,F,R + api/direct_messages/new T,S,F,R + api/direct_messages/conversation T,S,F,R + api/direct_messages/all T,S,F,R + api/direct_messages/sent T,S,F,R + api/direct_messages T,S,F,R + api/oauth/request_token T,S,F,R + api/oauth/access_token T,S,F,R + api/favorites T,S,R + api/favorites/create T,S,R + api/favorites/destroy T,S,R + +Twitter API functions supported by StatusNet but not currently by Friendica or Red + + api/statuses/retweets_of_me T,S + api/friendships/create T,S + api/friendships/destroy T,S + api/friendships/exists T,S + api/friendships/show T,S + api/account/update_location T,S + api/account/update_profile_background_image T,S + api/account/update_profile_image T,S + api/blocks/create T,S + api/blocks/destroy T,S + +Twitter API functions not currently supported by StatusNet + + api/statuses/retweeted_to_me T + api/statuses/retweeted_by_me T + api/direct_messages/destroy T + api/account/end_session T,(R) + api/account/update_delivery_device T + api/notifications/follow T + api/notifications/leave T + api/blocks/exists T + api/blocks/blocking T + api/lists T + +Statusnet compatible extensions to the Twitter API supported in both Friendica and Red + + api/statusnet/version S,F,R + api/statusnet/config S,F,R + +Friendica API extensions to the Twitter API supported in both Friendica and Red + + api/statuses/mediap F,R + +Red specific API extensions to the Twitter API not supported in Friendica + + api/account/logout R + api/export/basic R,J + api/friendica/config R + api/red/config R + api/friendica/version R + + api/red/version R + + api/red/channel/export/basic R,J + api/red/channel/stream R,J (currently post only) + api/red/albums R,J + api/red/photos R,J (option album=xxxx) + +Red proposed API extensions to the Twitter API + + api/statuses/edit (R),J + api/statuses/permissions (R),J + api/statuses/permissions/update (R),J + api/statuses/ids (R),J # search for existing message_id before importing a foreign post + api/files/show (R),J + api/files/destroy (R),J + api/files/update (R),J + api/files/permissions (R),J + api/files/permissions/update (R),J + api/pages/show (R),J + api/pages/destroy (R),J + api/pages/update (R),J + api/pages/permissions (R),J + api/pages/permissions/update (R),J + api/events/show (R),J + api/events/update (R),J + api/events/permissions (R),J + api/events/permissions/update (R),J + api/events/destroy (R),J + api/photos/show (R),J + api/photos/update (R),J + api/photos/permissions (R),J + api/photos/permissions/update (R),J + api/albums/destroy (R),J + api/albums/show (R),J + api/albums/update (R),J + api/albums/permissions (R),J + api/albums/permissions/update (R),J + api/albums/destroy (R),J + api/friends/permissions (R),J + +#include doc/macros/main_footer.bb; + diff --git a/doc/bugs.bb b/doc/bugs.bb index cc1ea3a20..f6e14b659 100644 --- a/doc/bugs.bb +++ b/doc/bugs.bb @@ -23,7 +23,7 @@ If you get a blank white screen when doing something, this is almost always a co At this point it might be worthwhile discussing the issue on one of the online forums. There may be several of these and some may be more suited to your spoken language. At this time, the 'Hubzilla Support' channel (support@gravizot.de) is the recommended forum for discussing bugs. -If community members with software engineering training/expertise can't help you right away, understand that they are volunteers and may have a lot of other work and demands on their time. At this point you need to file a bug report. You will need an account on github.com to do this. So register, and then visit https://github.com/redmatrix/hubzilla/issues . Create an issue here and provide all the same information that you provided online. Don't leave out anything. +If community members with software engineering training/expertise can't help you right away, understand that they are volunteers and may have a lot of other work and demands on their time. At this point you need to file a bug report. You will need an account on github.com to do this. So register, and then visit https://framagit.org/hubzilla/core/issues . Create an issue here and provide all the same information that you provided online. Don't leave out anything. Then you wait. If it's a high profile issue, it may get fixed quickly. But nobody is in charge of fixing bugs. If it lingers without resolution, please spend some more time investigating the problem. Ask about anything you don't understand related to the behaviour. You will learn more about how the software works and quite possibly figure out why it isn't working now. Ultimately it is somebody in the community who is going to fix this and you are a member of the community; and this is how the open source process works. diff --git a/doc/ca/general.bb b/doc/ca/general.bb index 682b1ff52..fb54f0abc 100644 --- a/doc/ca/general.bb +++ b/doc/ca/general.bb @@ -5,9 +5,9 @@ [h3]Recursos Externs[/h3] [zrl=[baseurl]/help/external-resource-links]Enllaços a Recursos Externs[/zrl] -[url=https://github.com/redmatrix/hubzilla]Lloc Web Principal[/url] +[url=https://framagit.org/hubzilla/core/]Lloc Web Principal[/url] -[url=https://github.com/redmatrix/hubzilla-addons]Complements del Lloc Web[/url] +[url=https://framagit.org/hubzilla/addons]Complements del Lloc Web[/url] [url=[baseurl]/help/credits]Credits en $Projectname[/url] diff --git a/doc/ca/profiles.bb b/doc/ca/profiles.bb index 513bf5fed..5aa04e706 100644 --- a/doc/ca/profiles.bb +++ b/doc/ca/profiles.bb @@ -1,37 +1,37 @@ -[b]Profiles[/b]
-
-$Projectname has unlimited profiles. You may use different profiles to show different "sides of yourself" 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 "sides" of each channel. For example, your default public profile might say "Hello, I'm Fred, and I like laughing". You may show your close friends a profile that adds "and I also enjoy dwarf tossing".
-
-You always have a profile known as your "default" or "public" 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 "Keywords" to your profile. Such as "music, linux, photography" or whatever. You can add as many keywords as you like.
-
-To create an alternate profile, first go to [zrl=[baseurl]/settings/features]Settings > Additional Features[/zrl] and enable "Multiple Profiles" there, otherwise you won't have the ability to use more than just your default profile.
-
-Then select "Edit Profiles" 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 "clone" 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 "Clone this profile" there.
-
-In the list of your profiles, you can also choose the contacts who can see a specific profile. Just click on "Edit visibility" 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 "Settings" 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 "Suggestions" or "Channel Suggestions", 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]
-
-#include doc/macros/main_footer.bb;
+[b]Profiles[/b] + +$Projectname has unlimited profiles. You may use different profiles to show different "sides of yourself" 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 "sides" of each channel. For example, your default public profile might say "Hello, I'm Fred, and I like laughing". You may show your close friends a profile that adds "and I also enjoy dwarf tossing". + +You always have a profile known as your "default" or "public" 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 "Keywords" to your profile. Such as "music, linux, photography" or whatever. You can add as many keywords as you like. + +To create an alternate profile, first go to [zrl=[baseurl]/settings/features]Settings > Additional Features[/zrl] and enable "Multiple Profiles" there, otherwise you won't have the ability to use more than just your default profile. + +Then select "Edit Profiles" 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 "clone" 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 "Clone this profile" there. + +In the list of your profiles, you can also choose the contacts who can see a specific profile. Just click on "Edit visibility" 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 "Settings" 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 "Suggestions" or "Channel Suggestions", 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] + +#include doc/macros/main_footer.bb; diff --git a/doc/ca/what_is_zot.bb b/doc/ca/what_is_zot.bb index df1f15921..83d9614a3 100644 --- a/doc/ca/what_is_zot.bb +++ b/doc/ca/what_is_zot.bb @@ -55,7 +55,7 @@ Per més detalla, informació tècnica sobre Zot, clica sobre algún dels següe - [url=https://github.com/friendica/red/wiki/zot]Especificació pel desenvolupament de Zot (en anglès)[/url] - - [url=https://github.com/redmatrix/hubzilla/blob/master/include/zot.php]Referència per la implementació de Zot en PHP (en anglès)[/url] + - [url=https://framagit.org/hubzilla/core/blob/master/include/zot.php]Referència per la implementació de Zot en PHP (en anglès)[/url] #include doc/macros/main_footer.bb; diff --git a/doc/campaign.bb b/doc/campaign.bb index 750412ba3..dddc614f9 100644 --- a/doc/campaign.bb +++ b/doc/campaign.bb @@ -1,237 +1,237 @@ -[b]Initial Indiegg pitch[/b]
-
-[b][color= grey][size=20]What have we done, and what we hope to achieve[/size][/color][/b]
-
-[b][color= grey][size=18]Single-click sign on, nomadic identity, censorship-resistance, privacy, self-hosting[/size][/color][/b]
-
-We started $Projectname project by asking ourselves a few questions:
-
-- Imagine if it was possible to just access the content of different web sites, without the need to enter usernames and passwords for every site. Such a feature would permit Single-Click user identification: the ability to access sites simply by clicking on links to remote sites.
-Authentication just happens automagically behind the scenes. Forget about remembering multiple user names with multiple passwords when accessing different sites online.
-
-We liked this idea and went ahead with coding it immediately. Today, single-click sign is in alpha state. It needs more love, which means a solid three months of full-time development efforts.
-
-- Think of your Facebook, Twitter, WordPress, or any other website where you currently have an account. Now imagine being able to clone your account, to make an exact duplicate of it (with all of your friends, posts and settings), then export your cloned account into another server that is part of this communication network. After you're done, both of your accounts are synced from the time they were cloned. It doesn't matter where you log in (at your original location, or where you imported your clone). You see the same content, the same friends, posts, and account settings.
-At that point, it is more appropriate to call your account an identity that is nomadic (it is not tied to one home, unless you choose to do so!).
-It's 2013, our online presence no longer has to be tied to a single server, domain name or IP address. We should be able to clone and import our identities to other servers. In such a network, it should only matter who you are, not where you are.
-
-We're very intrigued by the possibilities nomadic identities open up for freedom, censorship-resistance, and identity resilience. Consider the following scenarios:
-
- -- Should a repressive government or corporation decide to delete your account, your cloned identity lives on, because it is located on another server, across the world, which is part of the same communication network. You can't be silenced!
-
- -- What if there is a server meltdown, and your identity goes off line. No problem, you log into your clone and all is good.
-
- -- Your server administrator can no longer afford to keep paying to support a free service (a labor love and principle, which all of us have participating in as system administrators of Friendica sites!). She notifies you that you must clone your account before the shutoff date. Rather than loose all your friends, and start from scratch by creating a new identity somewhere, you clone and move to another server.
-We feel this is especially helpful for the free web, where administrators of FOSS community sites are often faced with difficult financial decisions. Since many of them rely on donations, sometimes servers have to be taken offline, when costs become prohibitive for the brave DIY souls running those server. Nomadic identities should relieve some of the pressures associated with such situations.
-
-At the same time, we are also thinking of solutions that would make it possible for people running Red hubs to be financially sustainable. To that end, we're starting to implement service classes in our code, which would allow administrators to structure paid levels of service, if they choose to do so.
-
-Today, nomadic identity is currently in alpha state. It also needs more love, which means a solid three months of full-time development efforts.
-
-- Imagine a social network that is censorship-resistant, and privacy-respecting by design. It is not controlled by one mega-corporation, and where users cannot be easily censored by oppressive governments. So, in addition to nomadic identities, we are talking about decentralization, open source, freely software, that can run on any hardware that supports a database and a modern web browser. And we mean "any hardware", from a self-hosted $35 Raspberry Pi, to the very latest Intel Xeon and AMD Bulldozer-powered server behemoths.
-
-We've realized that privacy requires full control over content. We should be able to delete, backup and download all of our content, as well as associated account/identity information. To this end, we have already implemented the initial version of account export and backup.
-
-Concerned about pages and pages of posts from months and years past? The solution should be simple: visit your settings page, specify that all content older than 7 days, with the exception of starred posts, should be automatically deleted. Done, the clutter is gone! (Consider also the privacy and anti-mass surveillance implications of this feature. PRISM disclosures have hinted that three-letter spying agencies around the world are recording all internet traffic and storing it for a few days at a time. We feel that automatic post expiration becomes a rather useful feature in this context, and implementing it is one of our near future priorities.)
-
-[b][color= grey][size=18]The Affinity Slider and Access Control Lists[/size][/color][/b]
-
-- What if the permissions and access control lists that help secure modern operating systems were extended into a communication network that lived on the internet? This means somebody could log into this network from their home site, and with the simple click of a few buttons dynamically sort who can have access to their online content on a very fine level: from restricting others from seeing your latest blog post, to sharing your bookmarks with the world.
-
-We've coded the initial version of such a new feature. It is called the "Affinity Slider", and in our very-alpha user interface it looks like this.
-[img]https://friendicared.net/photo/b07b0262e3146325508b81a9d1ae4a1e-0.png[/img]
-
-{INSERT SCREENSHOT OF A MATRIX PAGE}
-
-Think of it as an easy way to filter content that you see, based on the degree of "closeness" to you. Move the slider to Friends, and only content coming from contacts you've tagged as friends is displayed on your home page. Uncluttering thousands of contacts, friends, RSS feeds, and other content should be a basic feature of modern communication on the web, but not at the expense of ease of use.
-
-In addition to the Affinity Slider, we also have the ACL (Access Control List). Say you want to share something with only 5 of your contacts (a blog, two friends from college, and two forums). You click on the padlock, choose the recipients, and that's it. Only those identities will recieve their posts. Furthermore, the post will be encrypted via PKI (pulic key encryption) to help maintain privacy. In the age of PRISM, we don't know all the details on what's safe out there, but we still think that privacy by design should be automatically present, invisible to the user, and easy to use.
-Attaching permissions to any data that lives on this network, potentially solves a great many headaches, while achieving simplicity in communication.
-
-Think of it this way: the internet is nothing, but a bunch of permissions and a folder of data. You, the user controls the permissions and thus the data that is relevant to you.
-
-[b][color= grey][size=20]The Matrix is Born![/size][/color][/b]
-
-After asking and striving to answer a number of such questions, we realized that we were imagining a general purpose communication network with a number of unique, and potentially game-changing, features. We called it $Projectname and started thinking of it as an over-lay on top of the internet as it exists today; an operating system re-invented as a communication network, with its own permissions, access control lists, protocol, connectors to others services, and open-ended possibilities via its API. The sum of the matrix is greater than it's parts. We're not building website, but a way for websites to link together and grow into something that is unique and ever-changing, with autonomy and privacy.
-
-It's a lot of work, for anyone. So far, we've got a team of a handful of volunteers, code geeks, brave early adopters, system administrators and other good people, willing to give the project a shot. We're motivated by our commitment to a free web, where privacy is built-in, and corporations don't have a stranglehold on our daily communication.
-
-We need your help to finish it and release it to the world!
-
-[b][color= grey][size=20]What have we written so far[/size][/color][/b]
-
-As of the today, $Projectname is in developer preview (alpha) state. It is not ready for everyday use, but some of the initial set of core features are implemented (again, in alpha state). These include:
-
-- Zot, the protocol powering the matrix
-- Single-signon logins.
-- Nomadic identities
-- Basic content manipulation: creation, deletion, rudimentary handling of photos, and media files
-- A bare-bones outline of the API and user documentation.
-
-
-[b][color= grey][size=20]Our TO-DO List[/size][/color][/b]
-
-However, in addition to finishing and polishing the above, there are a number of features that have to implemented to make $Projectname ready for daily use. If we meet our fundraising goal, we hope to dive into the following road map, by order of priority:
-
-- A professionally designed user interface (UI), interface that is adaptive to any user level, from end users who want to use the Matrix as a social network, to tinkerers who will put together a customized blog using Comanche, to hackers who will develop and extend the matrix using a built-in code editor, that hooks to the API and the git.
-
-- Comanche, our new markup language, similar to BBCode, with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. You can read more about it on our github wiki: https://github.com/friendica/red/wiki/Comanche
-
-- A unique help system that lives in the matrix, but is not based on the principles of a search engine. We have some interesting ideas about decentralizing help documentation, without going down the road of distributed search engines. Here's a hint: We shouldn't be searching at all, we should just be filtering what's already there in new, and cunning ways.
-
-- An appropriate logo, along with professionally done documentation system, both for our API, as well as users.
-
-- WordPress-like single button software upgrades
-
-- A built-in development environment, using an integrated web-based code editor such as Ace9
-
-[b][color= grey][size=20]What will the money be used for[/size][/color][/b]
-
-If we raise our targeted amount of funds, we plan to use it as follows:
-
-1) Fund 6 months {OR WHATEVER} of full time work for our current core developers, Mike, Thomas, and Tobias {ANYONE ELSE?]
-
-2) Pay a professional web developer to design an kick ass reference theme, along with a project logo.
-
-3) {WHAT ELSE?}
-
-[b][color= grey][size=20]Deadlines[/size][/color][/b]
-
-[b]March, 2014: $Projectname Beta with the following features[/b]
-
-- {LIST FEATURES}
-
-[b][color= grey][size=20]Who We Are[/size][/color][/b]
-
-Mike: {FILL IN BIO, reference Friendica, etc.}
-
-Thomas: {bio blurb}
-
-Tobias: {bio blurb}
-
-Arto: {documentation, etc.}
-
-{WHO ELSE? WE NEED A TEAM, AT LEAST 3-4 PEOPLE}
-
-[b][color= grey][size=20]What Do I Get as a Supporter?[/size][/color][/b]
-
-Our ability to reach 1.0 stable release depends on your generosity and support. We appreciate your help, regardless of the amount! Here's what we're thinking as far as different contribution levels go:
-
-[b]$1: {CATCHY TAGLINE}[/b]
-
-We'll list your name on our initial supporters list, a Hall of Fame of the matrix!
-
-[b]$5:[/b]
-
-[b]$10: [/b]
-
-[b]$16: [/b]
-
-You get one of your $Projectname t-shirts, as well as our undying gratitude.
-
-[b]$32: [/b]
-
-[b]$64 [/b]
-
-[b]128 [/b]
-
-[b]$256: [/b]
-
-[b]$512: [/b]
-
-[b]$1024 [/b]
-
-[b]$2048[/b]
-
-Each contributor at this level gets their own $Projectname virtual private server, installed, hosted and supported by us for a period of 1 year.
-
-[b][color= grey][size=20]Why are we so excited about $Projectname?[/size][/color][/b]
-
-{SOMETHING ABOUT THE POTENTIAL IMPACT OF RED, ITS INNOVATIONS, ETC>
-
-[b][color= grey][size=20]Other Ways to Help[/size][/color][/b]
-
-We're a handful of volunteers, and we understand that not everyone can contribute by donating money. There are many other ways you can in getting the Matrix to version 1.0!
-
-First, you can checkout our source code on github: https://github.com/redmatrix/hubzilla
-
-Maybe you can dive in and help us out with some development.
-
-Second, you can install the current developer preview on a server and start compiling bug reports.
-
-Third, register at one of the public alpha Red hubs, and get a feel for what Red is trying to do!
-
-Perhaps you're good at writing and documenting stuff. Grab an account at one of the public alphas and give us a hand.
-
-[b][color= grey][size=20]Frequently Asked Questions[/size][/color][/b]
-
-[b]1. Is Red a social network?[/b]
-
-$Projectname is not a social network. We're thinking of it as a general purpose communication network, with sharing, and public/private communications built into the matrix.
-
-[b]2. What is the difference between Red and Friendica?[/b]
-
-What's the difference between a passport, and a postcard?
-
-Friendica is really, really good at sending postcards. It can do all sorts of things with postcards. It can send them to your friends. It can send them to people you don't know. It can put them in an envelope and send them privately. It can run them through a photocopier and plaster them all over the internet. It can even take postcards in one language and convert them to many others so your friends who speak a different language can read them.
-
-What Friendica can't do, is wave a postcard at somebody and expect them to believe that holding this postcard prove you are who you say you are. Sure, if you've been sending somebody postcards, they might accept that it is you in the picture, but somebody who has never heard of you will not accept ownership of a postcard as proof of identity.
-
-$Projectname offers a passport.
-
-You can still use it to send postcards. At the same time, when you wave your passport at somebody, they do accept it as proof of identity. No longer do you need to register at every single site you use. You already have an account - it's just not necessarily at our site - so we'll ask to see your passport instead.
-
-Once you've proven your identity, a Red hub lets you use our services, as though you'd registered with directly, and we'd verified your credentials as would have happened in the olden days. These resources can, of course, be anything at all.
-
-[b]2. Why did you choose PHP, instead of Ruby or Python?[/b]
-
-The reference implementation is in PHP. We chose PHP, because it is available everywhere, and is easily configurable. We understand the debates between proponents and opponents of PHP, Ruby and Python. Nothing prevents implementations of Zot and the matrix in those languages. In fact, people on the matrix have already started developing a version of Red in Python [SOURCE?], and there is talk about future implementations in C (aiming for blazing native performance) and Java. It's free and open source, so we feel it's only a matter of time, once Red is initially completed.
-
-[b]4. Other than PHP, what other technology does Red use?[/b]
-
-We use MySQL as our database (this include any forks such as, MariaDB or Percona), and any modern webserver (Apache, nginx, etc.).
-
-[b]5. How is the Affinity Slider different from Mozilla's Persona?[/b]
-{COMPLETE}
-
-[b]6. Does $Projectname use encryption? Details please![/b]
-
-Yes, we do our best to use free and open source encryption libraries to help achieve privacy from general, mass surveillance.
-
-Communication between web browsers and Red hubs is encrypted using SSL certificates.
-
-Private communication on the matrix is protected by AES symmetric encryption, which is itself protected by RSA PKI (public key encryption). By default, we use AES-256-CBC, and our RSA keys are set to 4096-bits.
-
-For more info on our initial implementation of encrypted communication, check out our source code at Github: https://github.com/friendica/red/blob/master/include/crypto.php
-
-[b]7. What do you mean by decentralization? [/b]
-
-
-[b]8. Can I build my own website with in $Projectname?[/b]
-
-Yes. The short explanation: We've got this spiffy idea we're calling "Comanche", which will allow non-programmers to build complete custom websites, and any such website will be able to connect to any other website or channel in the matrix. The goal of Comanche is to hide the technical complexities of communicating in the matrix, while encouraging people to use their creativity and put together their own unique presence on the matrix.
-
-The longer explanation: Comanche is a markup language, similar to bbcode, with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. Comanche uses a Page Description Language file (".pdl", pronounced "puddle") to create these pages. Bbcode is not a requirement; an XML PDL file could also be used. The tag delimiters would be different. Usage is the same.
-
-Additional information is available on our Github project wiki: https://github.com/friendica/red/wiki/Comanche
-
-Comanche is another one of our priorities for the next six months.
-
-[b]9. Where can I see some technical description of Zot?[/b]
-
-Our github wiki contains a number of high-level and technical descriptions of Zot, Comanche, and Red in general: https://github.com/friendica/red/wiki
-
-[b]10. What happens if you raise more than {TARGETED NUMBER}?[/b]
-
-Raising more than our initial goal of funds, will speed up our development efforts. More developers will be able to take time off from other jobs, and concentrate efforts on finishing Red.
-
-[b]11 Can I make a contribution via Bitcoin?[/b]
-
-{YES/NO}
-
-[b]12. I have additional Questions[/]
-
-Awesome. We'd be more than happy to chat. You can find us {HERE}
-
-#include doc/macros/main_footer.bb;
-
+[b]Initial Indiegg pitch[/b] + +[b][color= grey][size=20]What have we done, and what we hope to achieve[/size][/color][/b] + +[b][color= grey][size=18]Single-click sign on, nomadic identity, censorship-resistance, privacy, self-hosting[/size][/color][/b] + +We started $Projectname project by asking ourselves a few questions: + +- Imagine if it was possible to just access the content of different web sites, without the need to enter usernames and passwords for every site. Such a feature would permit Single-Click user identification: the ability to access sites simply by clicking on links to remote sites. +Authentication just happens automagically behind the scenes. Forget about remembering multiple user names with multiple passwords when accessing different sites online. + +We liked this idea and went ahead with coding it immediately. Today, single-click sign is in alpha state. It needs more love, which means a solid three months of full-time development efforts. + +- Think of your Facebook, Twitter, WordPress, or any other website where you currently have an account. Now imagine being able to clone your account, to make an exact duplicate of it (with all of your friends, posts and settings), then export your cloned account into another server that is part of this communication network. After you're done, both of your accounts are synced from the time they were cloned. It doesn't matter where you log in (at your original location, or where you imported your clone). You see the same content, the same friends, posts, and account settings. +At that point, it is more appropriate to call your account an identity that is nomadic (it is not tied to one home, unless you choose to do so!). +It's 2013, our online presence no longer has to be tied to a single server, domain name or IP address. We should be able to clone and import our identities to other servers. In such a network, it should only matter who you are, not where you are. + +We're very intrigued by the possibilities nomadic identities open up for freedom, censorship-resistance, and identity resilience. Consider the following scenarios: + + -- Should a repressive government or corporation decide to delete your account, your cloned identity lives on, because it is located on another server, across the world, which is part of the same communication network. You can't be silenced! + + -- What if there is a server meltdown, and your identity goes off line. No problem, you log into your clone and all is good. + + -- Your server administrator can no longer afford to keep paying to support a free service (a labor love and principle, which all of us have participating in as system administrators of Friendica sites!). She notifies you that you must clone your account before the shutoff date. Rather than loose all your friends, and start from scratch by creating a new identity somewhere, you clone and move to another server. +We feel this is especially helpful for the free web, where administrators of FOSS community sites are often faced with difficult financial decisions. Since many of them rely on donations, sometimes servers have to be taken offline, when costs become prohibitive for the brave DIY souls running those server. Nomadic identities should relieve some of the pressures associated with such situations. + +At the same time, we are also thinking of solutions that would make it possible for people running Red hubs to be financially sustainable. To that end, we're starting to implement service classes in our code, which would allow administrators to structure paid levels of service, if they choose to do so. + +Today, nomadic identity is currently in alpha state. It also needs more love, which means a solid three months of full-time development efforts. + +- Imagine a social network that is censorship-resistant, and privacy-respecting by design. It is not controlled by one mega-corporation, and where users cannot be easily censored by oppressive governments. So, in addition to nomadic identities, we are talking about decentralization, open source, freely software, that can run on any hardware that supports a database and a modern web browser. And we mean "any hardware", from a self-hosted $35 Raspberry Pi, to the very latest Intel Xeon and AMD Bulldozer-powered server behemoths. + +We've realized that privacy requires full control over content. We should be able to delete, backup and download all of our content, as well as associated account/identity information. To this end, we have already implemented the initial version of account export and backup. + +Concerned about pages and pages of posts from months and years past? The solution should be simple: visit your settings page, specify that all content older than 7 days, with the exception of starred posts, should be automatically deleted. Done, the clutter is gone! (Consider also the privacy and anti-mass surveillance implications of this feature. PRISM disclosures have hinted that three-letter spying agencies around the world are recording all internet traffic and storing it for a few days at a time. We feel that automatic post expiration becomes a rather useful feature in this context, and implementing it is one of our near future priorities.) + +[b][color= grey][size=18]The Affinity Slider and Access Control Lists[/size][/color][/b] + +- What if the permissions and access control lists that help secure modern operating systems were extended into a communication network that lived on the internet? This means somebody could log into this network from their home site, and with the simple click of a few buttons dynamically sort who can have access to their online content on a very fine level: from restricting others from seeing your latest blog post, to sharing your bookmarks with the world. + +We've coded the initial version of such a new feature. It is called the "Affinity Slider", and in our very-alpha user interface it looks like this. +[img]https://friendicared.net/photo/b07b0262e3146325508b81a9d1ae4a1e-0.png[/img] + +{INSERT SCREENSHOT OF A MATRIX PAGE} + +Think of it as an easy way to filter content that you see, based on the degree of "closeness" to you. Move the slider to Friends, and only content coming from contacts you've tagged as friends is displayed on your home page. Uncluttering thousands of contacts, friends, RSS feeds, and other content should be a basic feature of modern communication on the web, but not at the expense of ease of use. + +In addition to the Affinity Slider, we also have the ACL (Access Control List). Say you want to share something with only 5 of your contacts (a blog, two friends from college, and two forums). You click on the padlock, choose the recipients, and that's it. Only those identities will recieve their posts. Furthermore, the post will be encrypted via PKI (pulic key encryption) to help maintain privacy. In the age of PRISM, we don't know all the details on what's safe out there, but we still think that privacy by design should be automatically present, invisible to the user, and easy to use. +Attaching permissions to any data that lives on this network, potentially solves a great many headaches, while achieving simplicity in communication. + +Think of it this way: the internet is nothing, but a bunch of permissions and a folder of data. You, the user controls the permissions and thus the data that is relevant to you. + +[b][color= grey][size=20]The Matrix is Born![/size][/color][/b] + +After asking and striving to answer a number of such questions, we realized that we were imagining a general purpose communication network with a number of unique, and potentially game-changing, features. We called it $Projectname and started thinking of it as an over-lay on top of the internet as it exists today; an operating system re-invented as a communication network, with its own permissions, access control lists, protocol, connectors to others services, and open-ended possibilities via its API. The sum of the matrix is greater than it's parts. We're not building website, but a way for websites to link together and grow into something that is unique and ever-changing, with autonomy and privacy. + +It's a lot of work, for anyone. So far, we've got a team of a handful of volunteers, code geeks, brave early adopters, system administrators and other good people, willing to give the project a shot. We're motivated by our commitment to a free web, where privacy is built-in, and corporations don't have a stranglehold on our daily communication. + +We need your help to finish it and release it to the world! + +[b][color= grey][size=20]What have we written so far[/size][/color][/b] + +As of the today, $Projectname is in developer preview (alpha) state. It is not ready for everyday use, but some of the initial set of core features are implemented (again, in alpha state). These include: + +- Zot, the protocol powering the matrix +- Single-signon logins. +- Nomadic identities +- Basic content manipulation: creation, deletion, rudimentary handling of photos, and media files +- A bare-bones outline of the API and user documentation. + + +[b][color= grey][size=20]Our TO-DO List[/size][/color][/b] + +However, in addition to finishing and polishing the above, there are a number of features that have to implemented to make $Projectname ready for daily use. If we meet our fundraising goal, we hope to dive into the following road map, by order of priority: + +- A professionally designed user interface (UI), interface that is adaptive to any user level, from end users who want to use the Matrix as a social network, to tinkerers who will put together a customized blog using Comanche, to hackers who will develop and extend the matrix using a built-in code editor, that hooks to the API and the git. + +- Comanche, our new markup language, similar to BBCode, with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. You can read more about it on our github wiki: https://github.com/friendica/red/wiki/Comanche + +- A unique help system that lives in the matrix, but is not based on the principles of a search engine. We have some interesting ideas about decentralizing help documentation, without going down the road of distributed search engines. Here's a hint: We shouldn't be searching at all, we should just be filtering what's already there in new, and cunning ways. + +- An appropriate logo, along with professionally done documentation system, both for our API, as well as users. + +- WordPress-like single button software upgrades + +- A built-in development environment, using an integrated web-based code editor such as Ace9 + +[b][color= grey][size=20]What will the money be used for[/size][/color][/b] + +If we raise our targeted amount of funds, we plan to use it as follows: + +1) Fund 6 months {OR WHATEVER} of full time work for our current core developers, Mike, Thomas, and Tobias {ANYONE ELSE?] + +2) Pay a professional web developer to design an kick ass reference theme, along with a project logo. + +3) {WHAT ELSE?} + +[b][color= grey][size=20]Deadlines[/size][/color][/b] + +[b]March, 2014: $Projectname Beta with the following features[/b] + +- {LIST FEATURES} + +[b][color= grey][size=20]Who We Are[/size][/color][/b] + +Mike: {FILL IN BIO, reference Friendica, etc.} + +Thomas: {bio blurb} + +Tobias: {bio blurb} + +Arto: {documentation, etc.} + +{WHO ELSE? WE NEED A TEAM, AT LEAST 3-4 PEOPLE} + +[b][color= grey][size=20]What Do I Get as a Supporter?[/size][/color][/b] + +Our ability to reach 1.0 stable release depends on your generosity and support. We appreciate your help, regardless of the amount! Here's what we're thinking as far as different contribution levels go: + +[b]$1: {CATCHY TAGLINE}[/b] + +We'll list your name on our initial supporters list, a Hall of Fame of the matrix! + +[b]$5:[/b] + +[b]$10: [/b] + +[b]$16: [/b] + +You get one of your $Projectname t-shirts, as well as our undying gratitude. + +[b]$32: [/b] + +[b]$64 [/b] + +[b]128 [/b] + +[b]$256: [/b] + +[b]$512: [/b] + +[b]$1024 [/b] + +[b]$2048[/b] + +Each contributor at this level gets their own $Projectname virtual private server, installed, hosted and supported by us for a period of 1 year. + +[b][color= grey][size=20]Why are we so excited about $Projectname?[/size][/color][/b] + +{SOMETHING ABOUT THE POTENTIAL IMPACT OF RED, ITS INNOVATIONS, ETC> + +[b][color= grey][size=20]Other Ways to Help[/size][/color][/b] + +We're a handful of volunteers, and we understand that not everyone can contribute by donating money. There are many other ways you can in getting the Matrix to version 1.0! + +First, you can checkout our source code on github: https://framagit.org/hubzilla/core/ + +Maybe you can dive in and help us out with some development. + +Second, you can install the current developer preview on a server and start compiling bug reports. + +Third, register at one of the public alpha Red hubs, and get a feel for what Red is trying to do! + +Perhaps you're good at writing and documenting stuff. Grab an account at one of the public alphas and give us a hand. + +[b][color= grey][size=20]Frequently Asked Questions[/size][/color][/b] + +[b]1. Is Red a social network?[/b] + +$Projectname is not a social network. We're thinking of it as a general purpose communication network, with sharing, and public/private communications built into the matrix. + +[b]2. What is the difference between Red and Friendica?[/b] + +What's the difference between a passport, and a postcard? + +Friendica is really, really good at sending postcards. It can do all sorts of things with postcards. It can send them to your friends. It can send them to people you don't know. It can put them in an envelope and send them privately. It can run them through a photocopier and plaster them all over the internet. It can even take postcards in one language and convert them to many others so your friends who speak a different language can read them. + +What Friendica can't do, is wave a postcard at somebody and expect them to believe that holding this postcard prove you are who you say you are. Sure, if you've been sending somebody postcards, they might accept that it is you in the picture, but somebody who has never heard of you will not accept ownership of a postcard as proof of identity. + +$Projectname offers a passport. + +You can still use it to send postcards. At the same time, when you wave your passport at somebody, they do accept it as proof of identity. No longer do you need to register at every single site you use. You already have an account - it's just not necessarily at our site - so we'll ask to see your passport instead. + +Once you've proven your identity, a Red hub lets you use our services, as though you'd registered with directly, and we'd verified your credentials as would have happened in the olden days. These resources can, of course, be anything at all. + +[b]2. Why did you choose PHP, instead of Ruby or Python?[/b] + +The reference implementation is in PHP. We chose PHP, because it is available everywhere, and is easily configurable. We understand the debates between proponents and opponents of PHP, Ruby and Python. Nothing prevents implementations of Zot and the matrix in those languages. In fact, people on the matrix have already started developing a version of Red in Python [SOURCE?], and there is talk about future implementations in C (aiming for blazing native performance) and Java. It's free and open source, so we feel it's only a matter of time, once Red is initially completed. + +[b]4. Other than PHP, what other technology does Red use?[/b] + +We use MySQL as our database (this include any forks such as, MariaDB or Percona), and any modern webserver (Apache, nginx, etc.). + +[b]5. How is the Affinity Slider different from Mozilla's Persona?[/b] +{COMPLETE} + +[b]6. Does $Projectname use encryption? Details please![/b] + +Yes, we do our best to use free and open source encryption libraries to help achieve privacy from general, mass surveillance. + +Communication between web browsers and Red hubs is encrypted using SSL certificates. + +Private communication on the matrix is protected by AES symmetric encryption, which is itself protected by RSA PKI (public key encryption). By default, we use AES-256-CBC, and our RSA keys are set to 4096-bits. + +For more info on our initial implementation of encrypted communication, check out our source code at Github: https://github.com/friendica/red/blob/master/include/crypto.php + +[b]7. What do you mean by decentralization? [/b] + + +[b]8. Can I build my own website with in $Projectname?[/b] + +Yes. The short explanation: We've got this spiffy idea we're calling "Comanche", which will allow non-programmers to build complete custom websites, and any such website will be able to connect to any other website or channel in the matrix. The goal of Comanche is to hide the technical complexities of communicating in the matrix, while encouraging people to use their creativity and put together their own unique presence on the matrix. + +The longer explanation: Comanche is a markup language, similar to bbcode, with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. Comanche uses a Page Description Language file (".pdl", pronounced "puddle") to create these pages. Bbcode is not a requirement; an XML PDL file could also be used. The tag delimiters would be different. Usage is the same. + +Additional information is available on our Github project wiki: https://github.com/friendica/red/wiki/Comanche + +Comanche is another one of our priorities for the next six months. + +[b]9. Where can I see some technical description of Zot?[/b] + +Our github wiki contains a number of high-level and technical descriptions of Zot, Comanche, and Red in general: https://github.com/friendica/red/wiki + +[b]10. What happens if you raise more than {TARGETED NUMBER}?[/b] + +Raising more than our initial goal of funds, will speed up our development efforts. More developers will be able to take time off from other jobs, and concentrate efforts on finishing Red. + +[b]11 Can I make a contribution via Bitcoin?[/b] + +{YES/NO} + +[b]12. I have additional Questions[/] + +Awesome. We'd be more than happy to chat. You can find us {HERE} + +#include doc/macros/main_footer.bb; + diff --git a/doc/checking_account_quota_usage.bb b/doc/checking_account_quota_usage.bb index ca7e070ad..7612d03d8 100644 --- a/doc/checking_account_quota_usage.bb +++ b/doc/checking_account_quota_usage.bb @@ -1,20 +1,20 @@ -[b]Checking your account quota usage (service limits usage)[/b]
-
-Your hub might implement service class limits, assigning limits to the total size of file, photo, channels, top-level posts, etc., that can be created by an account holder for a specific service level.
-
-Here's how you can quickly check how much of your assigned quota you're currently using:
-
-[b]Check file storage quota levels[/b]
-Visit the following URL in your browser:
-[observer=1][observer.baseurl]/filestorage/[observer.webname][/observer]
-[observer=0]example.com/filestorage/username[/observer]
-
-[b]Check uploaded photos storage quota levels[/b]
-[observer=1][observer.baseurl]/photos/[observer.webname][/observer]
-[observer=0]example.com/photos/username[/observer]
-
-Example:
-[observer=1][observer.baseurl]/filestorage/[observer.webname][/observer]
-[observer=0]example.com/filestorage/username[/observer]
-
-#include doc/macros/main_footer.bb;
+[b]Checking your account quota usage (service limits usage)[/b] + +Your hub might implement service class limits, assigning limits to the total size of file, photo, channels, top-level posts, etc., that can be created by an account holder for a specific service level. + +Here's how you can quickly check how much of your assigned quota you're currently using: + +[b]Check file storage quota levels[/b] +Visit the following URL in your browser: +[observer=1][observer.baseurl]/filestorage/[observer.webname][/observer] +[observer=0]example.com/filestorage/username[/observer] + +[b]Check uploaded photos storage quota levels[/b] +[observer=1][observer.baseurl]/photos/[observer.webname][/observer] +[observer=0]example.com/photos/username[/observer] + +Example: +[observer=1][observer.baseurl]/filestorage/[observer.webname][/observer] +[observer=0]example.com/filestorage/username[/observer] + +#include doc/macros/main_footer.bb; diff --git a/doc/comanche.bb b/doc/comanche.bb index 4b198d657..faf7e695e 100644 --- a/doc/comanche.bb +++ b/doc/comanche.bb @@ -1,261 +1,261 @@ -[b]Comanche Page Description Language[/b]
-
-Comanche is a markup language similar to bbcode with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. Comanche uses a Page Decription Language to create these pages.
-
-Comanche primarily chooses what content will appear in various regions of the page. The various regions have names and these names can change depending on what layout template you choose.
-
-[b]Page Templates[/b]
-Currently there are five layout templates, unless your site provides additional layouts.
-
-[code]
- [b]default[/b]
- The default template defines a "nav" region across the top, "aside" as a fixed width sidebar,
- "content" for the main content region, and "footer" for a page footer.
-
-
- [b]full[/b]
- The full template defines the same as the default template with the exception that there is no "aside" region.
-
-
- [b]choklet[/b]
- The choklet template provides a number of fluid layout styles which can be specified by flavour:
-
- (default flavour) - a two column layout similar to the "default" template, but more fluid
- bannertwo - a two column layout with a banner region, compatible with the "default" template on small displays
- three - three column layout (adds a "right_aside" region to the default template)
- edgestwo - two column layout with fixed side margins
- edgesthree - three column layout with fixed side margins
- full - three column layout with fixed side margins and adds a "header" region beneath the navigation bar
-
- [b]redable[/b] (sic)
- A template for reading longer texts full screen (so without navigation bar). Three columns: aside, content and right_aside.
- For maximum readability it is advised to only use the middle content column.
-
- [b]zen[/b]
- Gives you the freedom to do everything yourself. Just a blank page with a content region.
-
-[/code]
-
-To choose a layout template, use the 'template' tag.
-
-[code]
- [template]full[/template]
-
-[/code]
-
-To choose the "choklet" template with the "three" flavour:
-
-[code]
- [template=three]choklet[/template]
-
-[/code]
-
-The default template will be used if no other template is specified. The template can use any names it desires for content regions. You will be using 'region' tags to decide what content to place in the respective regions.
-
-Three "macros" have been defined for your use.
-[code]
- $htmlhead - replaced with the site head content.
- $nav - replaced with the site navigation bar content.
- $content - replaced with the main page content.
-
-[/code]
-
-By default, $nav is placed in the "nav" page region and $content is placed in the "content" region. You only need to use these macros if you wish to re-arrange where these items appear, either to change the order or to move them to other regions.
-
-
-To select a theme for your page, use the 'theme' tag.
-[code]
- [theme]suckerberg[/theme]
-
-[/code]
-This will select the theme named "suckerberg". By default your channel's preferred theme will be used.
-
-[code]
- [theme=passion]suckerberg[/theme]
-
-[/code]
-This will select the theme named "suckerberg" and select the "passion" schema (theme variant). Alternatively it may be possible to use a condensed theme notation for this.
-
-[code]
- [theme]suckerberg:passion[/theme]
-
-[/code]
-
-The condensed notation isn't part of Comanche itself but is recognised by $Projectname platform as a theme specifier.
-
-[b]Regions[/b]
-Each region has a name, as noted above. You will specify the region of interest using a 'region' tag, which includes the name. Any content you wish placed in this region should be placed between the opening region tag and the closing tag.
-
-[code]
- [region=htmlhead]....content goes here....[/region]
- [region=aside]....content goes here....[/region]
- [region=nav]....content goes here....[/region]
- [region=content]....content goes here....[/region]
-
-[/code]
-
-[b]CSS and Javascript[/b]
-We have the possibility to include javascript and css libraries in the htmlhead region. At present we make use of jquery (js), bootstrap (css/js) and foundation (css/js).
-This will overwrite the selected themes htmlhead.
-
-[code]
- [region=htmlhead]
- [css]bootstrap[/css]
- [js]jquery[/js]
- [js]bootstrap[/js]
- [/region]
-
-[/code]
-
-[b]Menus and Blocks[/b]
-Your webpage creation tools allow you to create menus and blocks, in addition to page content. These provide a chunk of existing content to be placed in whatever regions and whatever order you specify. Each of these has a name which you define when the menu or block is created.
-
-[code]
- [menu]mymenu[/menu]
-
-[/code]
-This places the menu called "mymenu" at this location on the page, which must be inside a region.
-
-[code]
- [menu=horizontal]mymenu[/menu]
-
-[/code]
-This places the menu called "mymenu" at this location on the page, which must be inside a region. Additionally it applies the "horizontal" class to the menu. "horizontal" is defined in the redbasic theme. It may or may not be available in other themes.
-
-[code]
- [menu][var=wrap]none[/var]mymenu[/menu]
-
-[/code]
-The variable [var=wrap]none[/var] in a block removes the wrapping div element from the menu.
-
-[code]
- [block]contributors[/block]
-[/code]
-This places a block named "contributors" in this region.
-
-[code]
- [block=someclass]contributors[/block]
-
-[/code]
-This places a block named "contributors" in this region. Additionally it applies the "someclass" class to the block. This replaces the default block classes "bblock widget".
-
-[code]
- [block][var=wrap]none[/var]contributors[/block]
-
-[/code]
-The variable [var=wrap]none[/var] in a block removes the wrapping div element from the block.
-
-[b]Widgets[/b]
-Widgets are executable apps provided by the system which you can place on your page. Some widgets take arguments which allows you to tailor the widget to your purpose. (TODO: list available widgets and arguments). The base system provides
-
-[code]
- profile - widget which duplicates the profile sidebar of your channel page. This widget takes no arguments
- tagcloud - provides a tag cloud of categories
- count - maximum number of category tags to list
-
-[/code]
-
-Widgets and arguments are specified with the 'widget' and 'var' tags.
-[code]
- [widget=recent_visitors][var=count]24[/var][/widget]
-
-[/code]
-
-This loads the "recent_visitors" widget and supplies it with the argument "count" set to "24".
-
-[b]Comments[/b]
-The 'comment' tag is used to delimit comments. These comments will not appear on the rendered page.
-
-[code]
- [comment]This is a comment[/comment]
-
-[/code]
-
-[b]Conditional Execution[/b]
-You can use an 'if' construct to make decisions. These are currently based on system configuration variable or the current observer.
-
-[code]
- [if $config.system.foo]
- ... the configuration variable system.foo evaluates to 'true'.
- [else]
- ... the configuration variable system.foo evaluates to 'false'.
- [/if]
-
- [if $observer]
- ... this content will only be show to authenticated viewers
- [/if]
-
-[/code]
-
- The 'else' clause is optional.
-
- Several tests are supported besides boolean evaluation.
-
-[code]
- [if $config.system.foo == bar]
- ... the configuration variable system.foo is equal to the string 'bar'
- [/if]
- [if $config.system.foo != bar]
- ... the configuration variable system.foo is not equal to the string 'bar'
- [/if]
- [if $config.system.foo {} bar ]
- ... the configuration variable system.foo is a simple array containing a value 'bar'
- [/if]
- [if $config.system.foo {*} bar]
- ... the configuration variable system.foo is a simple array containing a key named 'bar'
- [/if]
-[/code]
-
-[b]Complex Example[/b]
-[code]
- [comment]use an existing page template which provides a banner region plus 3 columns beneath it[/comment]
-
- [template]3-column-with-header[/template]
-
- [comment]Use the "darknight" theme[/comment]
-
- [theme]darkknight[/theme]
-
- [comment]Use the existing site navigation menu[/comment]
-
- [region=nav]$nav[/region]
-
- [region=side]
-
- [comment]Use my chosen menu and a couple of widgets[/comment]
-
- [menu]myfavouritemenu[/menu]
-
- [widget=recent_visitors]
- [var=count]24[/var]
- [var=names_only]1[/var]
- [/widget]
-
- [widget=tagcloud][/widget]
- [block]donate[/block]
-
- [/region]
-
-
-
- [region=middle]
-
- [comment]Show the normal page content[/comment]
-
- $content
-
- [/region]
-
-
-
- [region=right]
-
- [comment]Show my condensed channel "wall" feed and allow interaction if the observer is allowed to interact[/comment]
-
- [widget]channel[/widget]
-
- [/region]
-
-[/code]
-
-#include doc/macros/main_footer.bb;
+[b]Comanche Page Description Language[/b] + +Comanche is a markup language similar to bbcode with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. Comanche uses a Page Decription Language to create these pages. + +Comanche primarily chooses what content will appear in various regions of the page. The various regions have names and these names can change depending on what layout template you choose. + +[b]Page Templates[/b] +Currently there are five layout templates, unless your site provides additional layouts. + +[code] + [b]default[/b] + The default template defines a "nav" region across the top, "aside" as a fixed width sidebar, + "content" for the main content region, and "footer" for a page footer. + + + [b]full[/b] + The full template defines the same as the default template with the exception that there is no "aside" region. + + + [b]choklet[/b] + The choklet template provides a number of fluid layout styles which can be specified by flavour: + + (default flavour) - a two column layout similar to the "default" template, but more fluid + bannertwo - a two column layout with a banner region, compatible with the "default" template on small displays + three - three column layout (adds a "right_aside" region to the default template) + edgestwo - two column layout with fixed side margins + edgesthree - three column layout with fixed side margins + full - three column layout with fixed side margins and adds a "header" region beneath the navigation bar + + [b]redable[/b] (sic) + A template for reading longer texts full screen (so without navigation bar). Three columns: aside, content and right_aside. + For maximum readability it is advised to only use the middle content column. + + [b]zen[/b] + Gives you the freedom to do everything yourself. Just a blank page with a content region. + +[/code] + +To choose a layout template, use the 'template' tag. + +[code] + [template]full[/template] + +[/code] + +To choose the "choklet" template with the "three" flavour: + +[code] + [template=three]choklet[/template] + +[/code] + +The default template will be used if no other template is specified. The template can use any names it desires for content regions. You will be using 'region' tags to decide what content to place in the respective regions. + +Three "macros" have been defined for your use. +[code] + $htmlhead - replaced with the site head content. + $nav - replaced with the site navigation bar content. + $content - replaced with the main page content. + +[/code] + +By default, $nav is placed in the "nav" page region and $content is placed in the "content" region. You only need to use these macros if you wish to re-arrange where these items appear, either to change the order or to move them to other regions. + + +To select a theme for your page, use the 'theme' tag. +[code] + [theme]suckerberg[/theme] + +[/code] +This will select the theme named "suckerberg". By default your channel's preferred theme will be used. + +[code] + [theme=passion]suckerberg[/theme] + +[/code] +This will select the theme named "suckerberg" and select the "passion" schema (theme variant). Alternatively it may be possible to use a condensed theme notation for this. + +[code] + [theme]suckerberg:passion[/theme] + +[/code] + +The condensed notation isn't part of Comanche itself but is recognised by $Projectname platform as a theme specifier. + +[b]Regions[/b] +Each region has a name, as noted above. You will specify the region of interest using a 'region' tag, which includes the name. Any content you wish placed in this region should be placed between the opening region tag and the closing tag. + +[code] + [region=htmlhead]....content goes here....[/region] + [region=aside]....content goes here....[/region] + [region=nav]....content goes here....[/region] + [region=content]....content goes here....[/region] + +[/code] + +[b]CSS and Javascript[/b] +We have the possibility to include javascript and css libraries in the htmlhead region. At present we make use of jquery (js), bootstrap (css/js) and foundation (css/js). +This will overwrite the selected themes htmlhead. + +[code] + [region=htmlhead] + [css]bootstrap[/css] + [js]jquery[/js] + [js]bootstrap[/js] + [/region] + +[/code] + +[b]Menus and Blocks[/b] +Your webpage creation tools allow you to create menus and blocks, in addition to page content. These provide a chunk of existing content to be placed in whatever regions and whatever order you specify. Each of these has a name which you define when the menu or block is created. + +[code] + [menu]mymenu[/menu] + +[/code] +This places the menu called "mymenu" at this location on the page, which must be inside a region. + +[code] + [menu=horizontal]mymenu[/menu] + +[/code] +This places the menu called "mymenu" at this location on the page, which must be inside a region. Additionally it applies the "horizontal" class to the menu. "horizontal" is defined in the redbasic theme. It may or may not be available in other themes. + +[code] + [menu][var=wrap]none[/var]mymenu[/menu] + +[/code] +The variable [var=wrap]none[/var] in a block removes the wrapping div element from the menu. + +[code] + [block]contributors[/block] +[/code] +This places a block named "contributors" in this region. + +[code] + [block=someclass]contributors[/block] + +[/code] +This places a block named "contributors" in this region. Additionally it applies the "someclass" class to the block. This replaces the default block classes "bblock widget". + +[code] + [block][var=wrap]none[/var]contributors[/block] + +[/code] +The variable [var=wrap]none[/var] in a block removes the wrapping div element from the block. + +[b]Widgets[/b] +Widgets are executable apps provided by the system which you can place on your page. Some widgets take arguments which allows you to tailor the widget to your purpose. (TODO: list available widgets and arguments). The base system provides + +[code] + profile - widget which duplicates the profile sidebar of your channel page. This widget takes no arguments + tagcloud - provides a tag cloud of categories + count - maximum number of category tags to list + +[/code] + +Widgets and arguments are specified with the 'widget' and 'var' tags. +[code] + [widget=recent_visitors][var=count]24[/var][/widget] + +[/code] + +This loads the "recent_visitors" widget and supplies it with the argument "count" set to "24". + +[b]Comments[/b] +The 'comment' tag is used to delimit comments. These comments will not appear on the rendered page. + +[code] + [comment]This is a comment[/comment] + +[/code] + +[b]Conditional Execution[/b] +You can use an 'if' construct to make decisions. These are currently based on system configuration variable or the current observer. + +[code] + [if $config.system.foo] + ... the configuration variable system.foo evaluates to 'true'. + [else] + ... the configuration variable system.foo evaluates to 'false'. + [/if] + + [if $observer] + ... this content will only be show to authenticated viewers + [/if] + +[/code] + + The 'else' clause is optional. + + Several tests are supported besides boolean evaluation. + +[code] + [if $config.system.foo == bar] + ... the configuration variable system.foo is equal to the string 'bar' + [/if] + [if $config.system.foo != bar] + ... the configuration variable system.foo is not equal to the string 'bar' + [/if] + [if $config.system.foo {} bar ] + ... the configuration variable system.foo is a simple array containing a value 'bar' + [/if] + [if $config.system.foo {*} bar] + ... the configuration variable system.foo is a simple array containing a key named 'bar' + [/if] +[/code] + +[b]Complex Example[/b] +[code] + [comment]use an existing page template which provides a banner region plus 3 columns beneath it[/comment] + + [template]3-column-with-header[/template] + + [comment]Use the "darknight" theme[/comment] + + [theme]darkknight[/theme] + + [comment]Use the existing site navigation menu[/comment] + + [region=nav]$nav[/region] + + [region=side] + + [comment]Use my chosen menu and a couple of widgets[/comment] + + [menu]myfavouritemenu[/menu] + + [widget=recent_visitors] + [var=count]24[/var] + [var=names_only]1[/var] + [/widget] + + [widget=tagcloud][/widget] + [block]donate[/block] + + [/region] + + + + [region=middle] + + [comment]Show the normal page content[/comment] + + $content + + [/region] + + + + [region=right] + + [comment]Show my condensed channel "wall" feed and allow interaction if the observer is allowed to interact[/comment] + + [widget]channel[/widget] + + [/region] + +[/code] + +#include doc/macros/main_footer.bb; diff --git a/doc/context/en/admin/plugins/assets/addon_repo_gui_1.png b/doc/context/en/admin/addons/assets/addon_repo_gui_1.png Binary files differindex 37139b345..37139b345 100644 --- a/doc/context/en/admin/plugins/assets/addon_repo_gui_1.png +++ b/doc/context/en/admin/addons/assets/addon_repo_gui_1.png diff --git a/doc/context/en/admin/plugins/help.html b/doc/context/en/admin/addons/help.html index d57f4967f..bfb5e416a 100644 --- a/doc/context/en/admin/plugins/help.html +++ b/doc/context/en/admin/addons/help.html @@ -1,14 +1,14 @@ <dl class="dl-horizontal"> <dt>General</dt> - <dd>This page manages which plugins (also known as <i>addons</i>) are installed.</dd> + <dd>This page manages which addons (also known as <i>plugins</i>) are installed.</dd> <dt>Manage Repos</dt> <dd>If your webserver has the necessary write permissions, you will see a button labeled <b>Manage Repos</b>, which opens a control panel for managing what plugin <i>repositories</i> are installed. These repos are stored in <span style="font-family: monospace;">extend/addon/[repo name]/</span>. The official Hubzilla - plugin repo can be added by entering the repo URL - <span style="font-family: monospace;">https://github.com/redmatrix/hubzilla-addons.git</span> + addon repo can be added by entering the repo URL + <span style="font-family: monospace;">https://framagit.org/hubzilla/addons.git</span> and choosing a name for the repo such as <b>official</b>. You should see this repo in the list similar to the following: <br> - <img class="img-responsive" src="doc/context/en/admin/plugins/assets/addon_repo_gui_1.png"></dd> -</dl>
\ No newline at end of file + <img class="img-responsive" src="doc/context/en/admin/addons/assets/addon_repo_gui_1.png"></dd> +</dl> diff --git a/doc/context/es-es/admin/plugins/assets/addon_repo_gui_1.png b/doc/context/es-es/admin/addons/assets/addon_repo_gui_1.png Binary files differindex 37139b345..37139b345 100644 --- a/doc/context/es-es/admin/plugins/assets/addon_repo_gui_1.png +++ b/doc/context/es-es/admin/addons/assets/addon_repo_gui_1.png diff --git a/doc/context/es-es/admin/plugins/help.html b/doc/context/es-es/admin/addons/help.html index 0096937fe..49a047f5e 100644 --- a/doc/context/es-es/admin/plugins/help.html +++ b/doc/context/es-es/admin/addons/help.html @@ -1,14 +1,14 @@ <dl class="dl-horizontal"> <dt>General</dt> - <dd>Esta página gestiona qué plugins (también llamados <i>addons</i> o <i>complementos</i>) están instalados.</dd> + <dd>Esta página gestiona qué addons (también llamados <i>plugins</i> o <i>complementos</i>) están instalados.</dd> <dt>Gestión de los repositorios</dt> <dd>Si su servidor web tiene los permisos de escritura necesarios, verá un botón etiquetado como <b>Gestión de repositorios</b>, - que abre un panel de control para administrar qué <i>repositorios</i> de plugins están instalados. Estos repositorios están - almacenados en <span style="font-family: monospace;">extend/addon/[nombre del repositorio]/</span>. El repositorio de plugins oficial de Hubzilla + que abre un panel de control para administrar qué <i>repositorios</i> de addons están instalados. Estos repositorios están + almacenados en <span style="font-family: monospace;">extend/addon/[nombre del repositorio]/</span>. El repositorio de addons oficial de Hubzilla se puede añadir escribiendo la URL del repositorio - <span style="font-family: monospace;">https://github.com/redmatrix/hubzilla-addons.git</span> + <span style="font-family: monospace;">https://framagit.org/hubzilla/addons.git</span> y eligiendo un nombre para el repositorio como <b>oficial</b>. Debería ver este repositorio en una lista parecida a esta: <br> - <img class="img-responsive" src="doc/context/es-es/admin/plugins/assets/addon_repo_gui_1.png"></dd> -</dl>
\ No newline at end of file + <img class="img-responsive" src="doc/context/es-es/admin/addons/assets/addon_repo_gui_1.png"></dd> +</dl> diff --git a/doc/de/general.bb b/doc/de/general.bb index b9b75f161..2ce5533f1 100644 --- a/doc/de/general.bb +++ b/doc/de/general.bb @@ -5,8 +5,8 @@ [h3]Externe Ressourcen[/h3] [zrl=[baseurl]/help/external-resource-links]Links zu externen Ressourcen[/zrl] -[url=https://github.com/redmatrix/hubzilla]Haupt-Website[/url] -[url=https://github.com/redmatrix/hubzilla-addons]Addons-Website[/url] +[url=https://framagit.org/hubzilla/core/]Haupt-Website[/url] +[url=https://framagit.org/hubzilla/addons]Addons-Website[/url] [url=[baseurl]/help/credits]$Projectname Credits[/url] diff --git a/doc/dev_beginner.bb b/doc/dev_beginner.bb index 4cf1ca591..4ac69c301 100644 --- a/doc/dev_beginner.bb +++ b/doc/dev_beginner.bb @@ -1,419 +1,419 @@ -[h2]You want to contribute code?[/h2]
-[b]...and don't know how to start to...[/b]
-[list]
-[*] debug the red#matrix (php on the webserver),
-[*] contribute code to the project,
-[*] optionally - do it all from inside a virtual machine
-[/list]
-This manual was tested for Debian (Wheezy) as virtual machine on Lubuntu (Ubuntu 14.0) as host.
-
-Content
-
-[toc]
-
-[h2]Install a Virtual Machine (KVM)[/h2]
-
-[url=https://wiki.debian.org/KVM]Here[/url] the installation guide for Linux Debian.
-The summary:
-[list=1]
-[*] install KVM
-[code]# apt-get install qemu-kvm libvirt-bin[/code]
-[*] add yourself to the group libvirt [code]# adduser <youruser> libvirt[/code]
-[*] install gui to manage virtual machines [code]# apt-get install virt-manager[/code]
-[*] download an operating system to run inside the vm ([url=http://ftp.nl.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/netboot/mini.iso]mini.iso[/url])
-[*] start the virt manager
-- create new virtual machine (click on icon)
-- choose your iso image (just downloaded) as installation source
-- optional: configure the new vm: ram, cpu's,...
-- start virtual machine > result: linux debian starts in a new window.
-[*] (optional) avoid network errors after restart of host os
-[code]# virsh net-start default
-# virsh net-autostart default[/code]
-[/list]
-
-
-[h2]Install Apache Webserver[/h2]
-
-Open a terminal and make yourself root
-[code]su -l[/code]
-
-Create the standard group for the Apache webserver
-[code]groupadd www-data[/code]
-might exist already
-
-[code]usermod -a -G www-data www-data[/code]
-
-Check if the system is really up to date
-[code]apt-get update
-apt-get upgrade[/code]
-
-Optional restart services after installation
-[code]reboot[/code]
-
-If you restarted, make yourself root
-[code]su -l[/code]
-
-Install Apache: [code]
-apt-get install apache2 apache2-doc apache2-utils[/code]
-
-Open webbrowser on PC and check [url=localhost]localhost[/url]
-Should show you a page like "It works"
-
-(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
-
-
-[h2]Install PHP, MySQL, phpMyAdmin[/h2]
-
-[h3]PHP, MySQL[/h3]
-
-[code]su -l
-apt-get install libapache2-mod-php5 php5 php-pear php5-xcache php5-curl php5-mcrypt php5-xdebug
-apt-get install php5-mysql
-apt-get install mysql-server mysql-client[/code]
-enter and note the mysql passwort
-
-Optional since its already enabled during phpmyadmin setup
-[code]
-php5enmod mcrypt
-[/code]
-
-[h3]phpMyAdmin[/h3]
-
-Install php myadmin
-[code]apt-get install phpmyadmin[/code]
-
-Configuring phpmyadmin
-- Select apache2 (hint: use the tab key to select)
-- Configure database for phpmyadmin with dbconfig-common?: Choose Yes
-
-(Source #^[url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
-
-[h3]Enable rewrite[/h3]
-
-The default installation of Apache2 comes with mod_rewrite installed. To check whether this is the case, verify the existence of /etc/apache2/mods-available/rewrite.load
-
-[code]
-root@debian /var/www $ nano /etc/apache2/mods-available/rewrite.load
-[/code]
-
- (You should find the content: LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so)
-To enable and load mod_rewrite, do the rest of steps.
-Create a symbolic link in /etc/apache2/mods-enabled
-
-[code]
-cd /var/www
-root@debian /var/www $ a2enmod rewrite
-[/code]
-
-Then open up the following file, and replace every occurrence of "AllowOverride None" with "AllowOverride all".
-
-[code]
-root@debian /var/www $nano /etc/apache2/apache2.conf
-[/code]
-or
-[code]
-root@debian:/var# gedit /etc/apache2/sites-enabled/000-default
-[/code]
-
-Finally, restart Apache2.
-
-[code]
-root@debian /var/www $service apache2 restart
-[/code]
-
-[h3]Test installation[/h3]
-
-[code]cd /var/www[/code]
-
-create a php file to test the php installation[code]nano phpinfo.php[/code]
-
-Insert into the file:
-[code]
-<?php
- phpinfo();
-?>
-[/code]
-(save CTRL+0, ENTER, CTRL+X)
-
-open webbrowser on PC and try #^[url=http://localhost/phpinfo.php]http://localhost/phpinfo.php[/url] (page shows infos on php)
-
-connect phpMyAdmin with MySQL database [code]nano /etc/apache2/apache2.conf
-[/code]
-- CTRL+V... to the end of the file
-- Insert at the end of the file: (save CTRL+0, ENTER, CTRL+X)[code]Include /etc/phpmyadmin/apache.conf[/code]
-
-restart apache
-[code]/etc/init.d/apache2 restart
-apt-get update
-apt-get upgrade
-reboot[/code]
-
-[b]phpMyAdmin[/b]
-
-open webbrowser on PC and try #^[url=http://localhost/phpmyadmin]http://localhost/phpmyadmin[/url]
-
-(Source #^[url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
-
-[h3]Create an empty database... that is later used by the red#matrix[/h3]
-
-
-open webbrowser on PC and try #^[url=http://localhost/phpmyadmin]http://localhost/phpmyadmin[/url]
-
-Create an empty database, for example named "red".
-Create a database user, for example "red".
-Grant all rights for the user "red" to the database "red".
-
-Note the access details (hostname, username, password, database name).
-
-
-[h2]Fork the project on github[/h2]
-
-Please follow the instruction in the offiical [url=http://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project] documentation[/url] of git.
-It is a good idea to read the whole manual! Git is different to other version control systems in many ways.
-
-Now you should
-[list]
-[*] create an account at github.com
-[*] fork https://github.com/redmatrix/hubzilla
-[*] fork https://github.com/redmatrix/hubzilla-addons
-[/list]
-
-If you not want to use GIT from the command line - there is a usefull Eclipse plugin named ""Eclipse Mylyn to GitHub connector".
-
-
-[h2]Install RED and its Addons[/h2]
-
-[h3]Git at your computer / vm[/h3]
-
-You should have created an account on github and forked the projects befor you procceed.
-
-Delete the directory www
-[code]root@debian:/var# rm -R www/
-[/code]
-
-Install git (and optionally git-gui a client gui)
-[code]apt-get install git git-gui[/code]
-
-[h3]Download red#matri and addons[/h3]
-
-Download the main project red and red-addons
-[code]
-root@debian:/var# git clone https://github.com/yourname/red www
-root@debian:/var# cd www/
-root@debian:/var/www# git clone https://github.com/yourname/red-addons addon
-[/code]
-
-Make this extra folder
-[code]
-root@debian:/var/www# mkdir -p "store/[data]/smarty3"
-[/code]
-
-Create .htconfig.php and make it writable by the webserver
-[code]
-root@debian:/var/www# touch .htconfig.php
-root@debian:/var/www# chmod ou+w .htconfig.php
-[/code]
-
-Make user www-data (webserver) is the owner all the project files
-[code]
-root@debian:/var/www# cd ..
-root@debian:/var# chown -R www-data:www-data www/
-[/code]
-
-Add yourself ("surfer" in this example) to the group www-data. Why? Later you want to modify files in eclipse or in another editor.
-Then make all files writable by the group www-date you are now a member of.
-[code]
-root@debian:/var# cd www/
-root@debian:/var/www# usermod -G www-data surfer
-root@debian:/var# chmod -R g+w www/
-[/code]
-
-Restart the computer (or vm)
-If you are still not able to modify the project files you can check the members of the group www-data with
-[code]
-cat /etc/group
-[/code]
-
-[h3]Register yourself as admin[/h3]
-
-Open http://localhost and init the matrix
-
-Befor you register a first user switch off the registration mails.
-Open /var/www/.htconfig.php
-and make sure "0" is set in this line
-[code]
-App::$config['system']['verify_email'] = 0;
-[/code]
-You should be able to change the file as "yourself" (instead of using root or www-data).
-
-[h3]Cron and the poller[/h3]
-
-Important!
-Run the poller to pick up the recent "public" postings of your friends
-Set up a cron job or scheduled task to run the poller once every 5-10
-minutes to pick up the recent "public" postings of your friends
-
-[code]
-crontab -e
-[/code]
-
-Add
-[code]
-*/10 * * * * cd /var/www/; /usr/bin/php include/poller.php
-[/code]
-
-If you don't know the path to PHP type
-[code]
-whereis php
-[/code]
-
-
-[h2]Debug the server via eclipse[/h2]
-
-[h3]Check the configuration of xdebug[/h3]
-
-You shoud already have installed xdebug in the steps befor
-[code]
-apt-get install php5-xdebug
-[/code]
-
-Configuring Xdebug
-
-Open your terminal and type as root (su -l)
-[code]
-gedit /etc/php5/mods-available/xdebug.ini
-[/code]
-
-if the file is empty try this location
-[code]
-gedit /etc/php5/conf.d/xdebug.ini
-[/code]
-
-That command should open the text editor gedit with the Xdebug configuration file
-At the end of the file content append the following text
-
-xdebug.remote_enable=on
-xdebug.remote_handler=dbgp
-xdebug.remote_host=localhost
-xdebug.remote_port=9000
-
-Save changes and close the editor.
-In you terminal type to restart the web server.
-[code]
-service apache2 restart
-[/code]
-
-
-[h3]Install Eclipse and start debugging[/h3]
-
-Install eclipse.
-Start eclipse with default worspace (or as you like)
-
-Install the PHP plugin
-Menu > Help > Install new software...
-Install "PHP Developnent Tools ..."
-
-Optionally - Install the GitHub connector plugin
-Menu > Help > Install new software...
-Install "Eclipse Mylyn to GitHub connector"
-
-Configure the PHP plugin
-Menu > Window > Preferences...
-> General > Webbrowser > Change to "Use external web browser"
-> PHP > Debug > Debug Settings > PHP Debugger > Change to "XDebug"
-
-Create a new PHP project
-Menu > File > New Project > Choose PHP > "PHP Project"
-> Choose Create project at existing location" and "/var/www"
-
-Start debugging
-Open index.php and "Debug as..."
-Choose as Launch URL: "http://localhost/"
-
-Expected:
-[list]
-[*] The web browser starts
-[*] The debugger will stop at the first php line
-[/list]
-
-
-[h2]Contribute your changes via github[/h2]
-
-[h3]Preparations[/h3]
-
-There is a related page in this docs: [zrl=[baseurl]/help/git_for_non_developers]Git for Non-Developers[/zrl].
-As stated befor it is recommended to read the official documentation [url=http://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project]GitHub-Contributing-to-a-Project[/url] of git.
-
-Eclipse has a usefull plugin for GIT: "Eclipse Mylyn to GitHub connector".
-
-Make sure you have set your data
-[code]
-surfer@debian:/var/www$ git config --global user.name "Your Name"
-surfer@debian:/var/www$ git config --global user.email "your@mail.com"
-[/code]
-
-[h3]Your first contribution[/h3]
-
-Create a descriptive topic branch
-[code]
-surfer@debian:/var/www$ git checkout -b dev_beginning
-[/code]
-
-Make sure your local repository is up-to-date with the main project.
-Add the original repository as a remote named “upstream” if not done yet
-[code]
-surfer@debian:/var/www$ git remote add upstream https://github.com/redmatrix/hubzilla
-[/code]
-
-Fetch the newest work from that remote
-[code]
-surfer@debian:/var/www$ git fetch upstream
-surfer@debian:/var/www$ git merge upstream/master
-[/code]
-
-Hint: You can list the branches
-[code]
-surfer@debian:/var/www$ git branch -v
-[/code]
-
-Make your changes. In this example it is a new doc file.
-
-Check your modifications
-[code]
-surfer@debian:/var/www$ git status
-[/code]
-
-Add (stage) the new file
-[code]
-surfer@debian:/var/www$ git add doc/dev_beginner.bb
-[/code]
-
-Commit the changes to your local branch. This will open an editor to provide a message.
-[code]
-surfer@debian:/var/www$ git commit -a
-[/code]
-
-Push back up to the same topic branch online
-[code]
-surfer@debian:/var/www$ git push
-[/code]
-
-Now you can go to your (online) account at github and create the pull request.
-
-[h3]Following contributions[/h3]
-
-In case the main devolpers want you to change something.
-Fetch the newest work from the remote upstream/master to be sure you have the latest changes.
-[code]
-surfer@debian:/var/www$ git fetch upstream
-surfer@debian:/var/www$ git merge upstream/master
-[/code]
-Make your changes, test them, commit (to local repository), push (to online repository)
-[code]
-surfer@debian:/var/www$ git status
-surfer@debian:/var/www$ git commit -a -m "added modification of branch"
-surfer@debian:/var/www$ git push
-[/code]
-
-
-#include doc/macros/main_footer.bb;
\ No newline at end of file +[h2]You want to contribute code?[/h2] +[b]...and don't know how to start to...[/b] +[list] +[*] debug the red#matrix (php on the webserver), +[*] contribute code to the project, +[*] optionally - do it all from inside a virtual machine +[/list] +This manual was tested for Debian (Wheezy) as virtual machine on Lubuntu (Ubuntu 14.0) as host. + +Content + +[toc] + +[h2]Install a Virtual Machine (KVM)[/h2] + +[url=https://wiki.debian.org/KVM]Here[/url] the installation guide for Linux Debian. +The summary: +[list=1] +[*] install KVM +[code]# apt-get install qemu-kvm libvirt-bin[/code] +[*] add yourself to the group libvirt [code]# adduser <youruser> libvirt[/code] +[*] install gui to manage virtual machines [code]# apt-get install virt-manager[/code] +[*] download an operating system to run inside the vm ([url=http://ftp.nl.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/netboot/mini.iso]mini.iso[/url]) +[*] start the virt manager +- create new virtual machine (click on icon) +- choose your iso image (just downloaded) as installation source +- optional: configure the new vm: ram, cpu's,... +- start virtual machine > result: linux debian starts in a new window. +[*] (optional) avoid network errors after restart of host os +[code]# virsh net-start default +# virsh net-autostart default[/code] +[/list] + + +[h2]Install Apache Webserver[/h2] + +Open a terminal and make yourself root +[code]su -l[/code] + +Create the standard group for the Apache webserver +[code]groupadd www-data[/code] +might exist already + +[code]usermod -a -G www-data www-data[/code] + +Check if the system is really up to date +[code]apt-get update +apt-get upgrade[/code] + +Optional restart services after installation +[code]reboot[/code] + +If you restarted, make yourself root +[code]su -l[/code] + +Install Apache: [code] +apt-get install apache2 apache2-doc apache2-utils[/code] + +Open webbrowser on PC and check [url=localhost]localhost[/url] +Should show you a page like "It works" + +(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url]) + + +[h2]Install PHP, MySQL, phpMyAdmin[/h2] + +[h3]PHP, MySQL[/h3] + +[code]su -l +apt-get install libapache2-mod-php5 php5 php-pear php5-xcache php5-curl php5-mcrypt php5-xdebug +apt-get install php5-mysql +apt-get install mysql-server mysql-client[/code] +enter and note the mysql passwort + +Optional since its already enabled during phpmyadmin setup +[code] +php5enmod mcrypt +[/code] + +[h3]phpMyAdmin[/h3] + +Install php myadmin +[code]apt-get install phpmyadmin[/code] + +Configuring phpmyadmin +- Select apache2 (hint: use the tab key to select) +- Configure database for phpmyadmin with dbconfig-common?: Choose Yes + +(Source #^[url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url]) + +[h3]Enable rewrite[/h3] + +The default installation of Apache2 comes with mod_rewrite installed. To check whether this is the case, verify the existence of /etc/apache2/mods-available/rewrite.load + +[code] +root@debian /var/www $ nano /etc/apache2/mods-available/rewrite.load +[/code] + + (You should find the content: LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so) +To enable and load mod_rewrite, do the rest of steps. +Create a symbolic link in /etc/apache2/mods-enabled + +[code] +cd /var/www +root@debian /var/www $ a2enmod rewrite +[/code] + +Then open up the following file, and replace every occurrence of "AllowOverride None" with "AllowOverride all". + +[code] +root@debian /var/www $nano /etc/apache2/apache2.conf +[/code] +or +[code] +root@debian:/var# gedit /etc/apache2/sites-enabled/000-default +[/code] + +Finally, restart Apache2. + +[code] +root@debian /var/www $service apache2 restart +[/code] + +[h3]Test installation[/h3] + +[code]cd /var/www[/code] + +create a php file to test the php installation[code]nano phpinfo.php[/code] + +Insert into the file: +[code] +<?php + phpinfo(); +?> +[/code] +(save CTRL+0, ENTER, CTRL+X) + +open webbrowser on PC and try #^[url=http://localhost/phpinfo.php]http://localhost/phpinfo.php[/url] (page shows infos on php) + +connect phpMyAdmin with MySQL database [code]nano /etc/apache2/apache2.conf +[/code] +- CTRL+V... to the end of the file +- Insert at the end of the file: (save CTRL+0, ENTER, CTRL+X)[code]Include /etc/phpmyadmin/apache.conf[/code] + +restart apache +[code]/etc/init.d/apache2 restart +apt-get update +apt-get upgrade +reboot[/code] + +[b]phpMyAdmin[/b] + +open webbrowser on PC and try #^[url=http://localhost/phpmyadmin]http://localhost/phpmyadmin[/url] + +(Source #^[url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url]) + +[h3]Create an empty database... that is later used by the red#matrix[/h3] + + +open webbrowser on PC and try #^[url=http://localhost/phpmyadmin]http://localhost/phpmyadmin[/url] + +Create an empty database, for example named "red". +Create a database user, for example "red". +Grant all rights for the user "red" to the database "red". + +Note the access details (hostname, username, password, database name). + + +[h2]Fork the project on github[/h2] + +Please follow the instruction in the offiical [url=http://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project] documentation[/url] of git. +It is a good idea to read the whole manual! Git is different to other version control systems in many ways. + +Now you should +[list] +[*] create an account at github.com +[*] fork https://framagit.org/hubzilla/core +[*] fork https://framagit.org/hubzilla/addons +[/list] + +If you not want to use GIT from the command line - there is a usefull Eclipse plugin named ""Eclipse Mylyn to GitHub connector". + + +[h2]Install RED and its Addons[/h2] + +[h3]Git at your computer / vm[/h3] + +You should have created an account on github and forked the projects befor you procceed. + +Delete the directory www +[code]root@debian:/var# rm -R www/ +[/code] + +Install git (and optionally git-gui a client gui) +[code]apt-get install git git-gui[/code] + +[h3]Download red#matri and addons[/h3] + +Download the main project red and red-addons +[code] +root@debian:/var# git clone https://github.com/yourname/red www +root@debian:/var# cd www/ +root@debian:/var/www# git clone https://github.com/yourname/red-addons addon +[/code] + +Make this extra folder +[code] +root@debian:/var/www# mkdir -p "store/[data]/smarty3" +[/code] + +Create .htconfig.php and make it writable by the webserver +[code] +root@debian:/var/www# touch .htconfig.php +root@debian:/var/www# chmod ou+w .htconfig.php +[/code] + +Make user www-data (webserver) is the owner all the project files +[code] +root@debian:/var/www# cd .. +root@debian:/var# chown -R www-data:www-data www/ +[/code] + +Add yourself ("surfer" in this example) to the group www-data. Why? Later you want to modify files in eclipse or in another editor. +Then make all files writable by the group www-date you are now a member of. +[code] +root@debian:/var# cd www/ +root@debian:/var/www# usermod -G www-data surfer +root@debian:/var# chmod -R g+w www/ +[/code] + +Restart the computer (or vm) +If you are still not able to modify the project files you can check the members of the group www-data with +[code] +cat /etc/group +[/code] + +[h3]Register yourself as admin[/h3] + +Open http://localhost and init the matrix + +Befor you register a first user switch off the registration mails. +Open /var/www/.htconfig.php +and make sure "0" is set in this line +[code] +App::$config['system']['verify_email'] = 0; +[/code] +You should be able to change the file as "yourself" (instead of using root or www-data). + +[h3]Cron and the poller[/h3] + +Important! +Run the poller to pick up the recent "public" postings of your friends +Set up a cron job or scheduled task to run the poller once every 5-10 +minutes to pick up the recent "public" postings of your friends + +[code] +crontab -e +[/code] + +Add +[code] +*/10 * * * * cd /var/www/; /usr/bin/php include/poller.php +[/code] + +If you don't know the path to PHP type +[code] +whereis php +[/code] + + +[h2]Debug the server via eclipse[/h2] + +[h3]Check the configuration of xdebug[/h3] + +You shoud already have installed xdebug in the steps befor +[code] +apt-get install php5-xdebug +[/code] + +Configuring Xdebug + +Open your terminal and type as root (su -l) +[code] +gedit /etc/php5/mods-available/xdebug.ini +[/code] + +if the file is empty try this location +[code] +gedit /etc/php5/conf.d/xdebug.ini +[/code] + +That command should open the text editor gedit with the Xdebug configuration file +At the end of the file content append the following text + +xdebug.remote_enable=on +xdebug.remote_handler=dbgp +xdebug.remote_host=localhost +xdebug.remote_port=9000 + +Save changes and close the editor. +In you terminal type to restart the web server. +[code] +service apache2 restart +[/code] + + +[h3]Install Eclipse and start debugging[/h3] + +Install eclipse. +Start eclipse with default worspace (or as you like) + +Install the PHP plugin +Menu > Help > Install new software... +Install "PHP Developnent Tools ..." + +Optionally - Install the GitHub connector plugin +Menu > Help > Install new software... +Install "Eclipse Mylyn to GitHub connector" + +Configure the PHP plugin +Menu > Window > Preferences... +> General > Webbrowser > Change to "Use external web browser" +> PHP > Debug > Debug Settings > PHP Debugger > Change to "XDebug" + +Create a new PHP project +Menu > File > New Project > Choose PHP > "PHP Project" +> Choose Create project at existing location" and "/var/www" + +Start debugging +Open index.php and "Debug as..." +Choose as Launch URL: "http://localhost/" + +Expected: +[list] +[*] The web browser starts +[*] The debugger will stop at the first php line +[/list] + + +[h2]Contribute your changes via github[/h2] + +[h3]Preparations[/h3] + +There is a related page in this docs: [zrl=[baseurl]/help/git_for_non_developers]Git for Non-Developers[/zrl]. +As stated befor it is recommended to read the official documentation [url=http://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project]GitHub-Contributing-to-a-Project[/url] of git. + +Eclipse has a usefull plugin for GIT: "Eclipse Mylyn to GitHub connector". + +Make sure you have set your data +[code] +surfer@debian:/var/www$ git config --global user.name "Your Name" +surfer@debian:/var/www$ git config --global user.email "your@mail.com" +[/code] + +[h3]Your first contribution[/h3] + +Create a descriptive topic branch +[code] +surfer@debian:/var/www$ git checkout -b dev_beginning +[/code] + +Make sure your local repository is up-to-date with the main project. +Add the original repository as a remote named “upstream” if not done yet +[code] +surfer@debian:/var/www$ git remote add upstream https://framagit.org/hubzilla/core/ +[/code] + +Fetch the newest work from that remote +[code] +surfer@debian:/var/www$ git fetch upstream +surfer@debian:/var/www$ git merge upstream/master +[/code] + +Hint: You can list the branches +[code] +surfer@debian:/var/www$ git branch -v +[/code] + +Make your changes. In this example it is a new doc file. + +Check your modifications +[code] +surfer@debian:/var/www$ git status +[/code] + +Add (stage) the new file +[code] +surfer@debian:/var/www$ git add doc/dev_beginner.bb +[/code] + +Commit the changes to your local branch. This will open an editor to provide a message. +[code] +surfer@debian:/var/www$ git commit -a +[/code] + +Push back up to the same topic branch online +[code] +surfer@debian:/var/www$ git push +[/code] + +Now you can go to your (online) account at github and create the pull request. + +[h3]Following contributions[/h3] + +In case the main devolpers want you to change something. +Fetch the newest work from the remote upstream/master to be sure you have the latest changes. +[code] +surfer@debian:/var/www$ git fetch upstream +surfer@debian:/var/www$ git merge upstream/master +[/code] +Make your changes, test them, commit (to local repository), push (to online repository) +[code] +surfer@debian:/var/www$ git status +surfer@debian:/var/www$ git commit -a -m "added modification of branch" +surfer@debian:/var/www$ git push +[/code] + + +#include doc/macros/main_footer.bb; diff --git a/doc/developer/unorganized.md b/doc/developer/unorganized.md index 74d914aaf..5ba719226 100644 --- a/doc/developer/unorganized.md +++ b/doc/developer/unorganized.md @@ -7,7 +7,7 @@ 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). +You may fork/clone the Red repository from [https://framagit.org/hubzilla/core.git](https://framagit.org/hubzilla/core.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 @@ -44,7 +44,7 @@ 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] +You may fork/clone the Red repository from [url=https://framagit.org/hubzilla/core.git]https://framagit.org/hubzilla/core.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 diff --git a/doc/developer_function_primer.bb b/doc/developer_function_primer.bb index 183581361..48af9523d 100644 --- a/doc/developer_function_primer.bb +++ b/doc/developer_function_primer.bb @@ -1,43 +1,43 @@ -[b]$Projectname development - some useful basic functions[/b]
-
-[b]get_account_id()[/b]
-
-Returns numeric account_id if authenticated or 0. It is possible to be authenticated and not connected to a channel.
-
-[b]local_channel()[/b]
-
-Returns authenticated numeric channel_id if authenticated and connected to a channel or 0. Sometimes referred to as $uid in the code.
-
-[b]remote_channel()[/b]
-
-Returns authenticated string hash of Red global identifier, if authenticated via remote auth, or an empty string.
-
-[b]App::get_observer()[/b]
-
-returns an xchan structure representing the current viewer if authenticated (locally or remotely).
-
-[b]get_config($family,$key), get_pconfig($uid,$family,$key), get_xconfig($xchan_hash,$family,$key)[/b]
-
-Returns the config setting for $family and $key or false if unset.
-
-[b] set_config($family,$key,$value), set_pconfig($uid,$family,$key,$value)[/b]
-
-Sets the value of config setting for $family and $key to $value. Returns $value. The config versions operate on system-wide settings. The pconfig versions get/set the values for a specific integer uid (channel_id). The xconfig version get/sets the value for a specific xchan hash - generally used for remote users.
-
-[b]dbesc()[/b]
-
-Always escape strings being used in DB queries. This function returns the escaped string. Integer DB parameters should all be proven integers by wrapping with intval()
-
-[b]q($sql,$var1...)[/b]
-
-Perform a DB query with the SQL statement $sql. printf style arguments %s and %d are replaced with variable arguments, which should each be appropriately dbesc() or intval(). SELECT queries return an array of results or false if SQL or DB error. Other queries return true if the command was successful or false if it wasn't.
-
-[b]t($string)[/b]
-
-Returns the translated variant of $string for the current language or $string (default 'en' language) if the language is unrecognised or a translated version of the string does not exist.
-
-[b]x($var), $x($array,$key)[/b]
-
-Shorthand test to see if variable $var is set and is not empty. Tests vary by type. Returns false if $var or $key is not set. If variable is set, returns 1 if has 'non-zero' value, otherwise returns 0. -- e.g. x('') or x(0) returns 0;
-
-#include doc/macros/main_footer.bb;
+[b]$Projectname development - some useful basic functions[/b] + +[b]get_account_id()[/b] + +Returns numeric account_id if authenticated or 0. It is possible to be authenticated and not connected to a channel. + +[b]local_channel()[/b] + +Returns authenticated numeric channel_id if authenticated and connected to a channel or 0. Sometimes referred to as $uid in the code. + +[b]remote_channel()[/b] + +Returns authenticated string hash of Red global identifier, if authenticated via remote auth, or an empty string. + +[b]App::get_observer()[/b] + +returns an xchan structure representing the current viewer if authenticated (locally or remotely). + +[b]get_config($family,$key), get_pconfig($uid,$family,$key), get_xconfig($xchan_hash,$family,$key)[/b] + +Returns the config setting for $family and $key or false if unset. + +[b] set_config($family,$key,$value), set_pconfig($uid,$family,$key,$value)[/b] + +Sets the value of config setting for $family and $key to $value. Returns $value. The config versions operate on system-wide settings. The pconfig versions get/set the values for a specific integer uid (channel_id). The xconfig version get/sets the value for a specific xchan hash - generally used for remote users. + +[b]dbesc()[/b] + +Always escape strings being used in DB queries. This function returns the escaped string. Integer DB parameters should all be proven integers by wrapping with intval() + +[b]q($sql,$var1...)[/b] + +Perform a DB query with the SQL statement $sql. printf style arguments %s and %d are replaced with variable arguments, which should each be appropriately dbesc() or intval(). SELECT queries return an array of results or false if SQL or DB error. Other queries return true if the command was successful or false if it wasn't. + +[b]t($string)[/b] + +Returns the translated variant of $string for the current language or $string (default 'en' language) if the language is unrecognised or a translated version of the string does not exist. + +[b]x($var), $x($array,$key)[/b] + +Shorthand test to see if variable $var is set and is not empty. Tests vary by type. Returns false if $var or $key is not set. If variable is set, returns 1 if has 'non-zero' value, otherwise returns 0. -- e.g. x('') or x(0) returns 0; + +#include doc/macros/main_footer.bb; @@ -1 +1 @@ -doc/es-es
\ No newline at end of file +es-es
\ No newline at end of file diff --git a/doc/es-es/about/about.bb b/doc/es-es/about/about.bb index 731bdef85..1d5f3a4a2 100644 --- a/doc/es-es/about/about.bb +++ b/doc/es-es/about/about.bb @@ -12,31 +12,32 @@ Desde la perspectiva práctica de los miembros del hub que utilizan el software, [li]y más...[/li][/ul] Aunque todas estas aplicaciones y servicios se pueden encontrar en otros paquetes de software, sólo $Projectname le permite establecer permisos para grupos e individuos que pueden no tener cuentas en tu hub. En las aplicaciones web típicas, si desea compartir cosas en privado en Internet, las personas con las que comparte deben tener cuentas en el servidor que aloja sus datos; de lo contrario, no hay una forma sólida para que su servidor[i]autentifique[/i] a los visitantes del sitio para saber si les concede acceso. $Projectname resuelve este problema con un sistema avanzado de[i]autenticación remota[/i] que valida la identidad de los visitantes empleando técnicas que incluyen criptografía de clave pública. - [h3]El software[/h3] -$Projectname es, básicamente, una aplicación de servidor web relativamente estándar escrita principalmente en PHP/MySQL [url=https://github.com/redmatrix/hubzilla/blob/master/install/INSTALL.txt][/url], que requiere poco más que un servidor web, una base de datos compatible con MySQL y el lenguaje de scripting PHP. Está diseñado para ser fácilmente instalable por aquellos con habilidades básicas de administración de sitios web en plataformas típicas de alojamiento compartido con una amplia gama de hardware informático. También se puede extender fácilmente a través de plugins y temas y otras herramientas de terceros. +$Projectname es, básicamente, una aplicación de servidor web relativamente estándar escrita principalmente en PHP/MySQL [url=https://framagit.org/hubzilla/core/blob/master/install/INSTALL.txt][/url], que requiere poco más que un servidor web, una base de datos compatible con MySQL y el lenguaje de scripting PHP. Está diseñado para ser fácilmente instalable por aquellos con habilidades básicas de administración de sitios web en plataformas típicas de alojamiento compartido con una amplia gama de hardware informático. También se puede extender fácilmente a través de plugins y temas y otras herramientas de terceros. [h3]Glosario[/h3] [dl terms="b"] -Una instancia de este software ejecutándose en un servidor web estándar +[*= Hub] Una instancia de este software ejecutándose en un servidor web estándar -[grid] Red global de hubs que intercambian información entre sí utilizando el protocolo Zot. +[*= Grid] Red global de hubs que intercambian información entre sí utilizando el protocolo Zot. -La identidad fundamental en la cuadrícula. Un canal puede representar a una persona, un blog o un foro, por nombrar algunos. Los canales pueden hacer conexiones con otros canales para compartir información con permisos muy detallados. +[*= Canal] La identidad fundamental en la cuadrícula. Un canal puede representar a una persona, un blog o un foro, por nombrar algunos. Los canales pueden hacer conexiones con otros canales para compartir información con permisos muy detallados. -Los canales pueden tener clones asociados con cuentas separadas y otras cuentas no relacionadas en hubs independientes. Las comunicaciones compartidas con un canal se sincronizan entre los clones del canal, permitiendo que un canal envíe y reciba mensajes y acceda a contenido compartido desde múltiples hubs. Esto proporciona resistencia contra fallas en la red y en el hardware, lo que puede ser un problema significativo para los servidores web autohospedados o de recursos limitados. La clonación le permite mover completamente un canal de un hub a otro, llevando sus datos y conexiones con usted. Ver identidad nómada. +[*= Clones] Los canales pueden tener clones asociados con cuentas separadas y otras cuentas no relacionadas en hubs independientes. Las comunicaciones compartidas con un canal se sincronizan entre los clones del canal, permitiendo que un canal envíe y reciba mensajes y acceda a contenido compartido desde múltiples hubs. Esto proporciona resistencia contra fallas en la red y en el hardware, lo que puede ser un problema significativo para los servidores web autohospedados o de recursos limitados. La clonación le permite mover completamente un canal de un hub a otro, llevando sus datos y conexiones con usted. Ver identidad nómada. -Identidad nómada] La capacidad de autenticar y migrar fácilmente una identidad a través de concentradores y dominios web independientes. La identidad nómada proporciona una verdadera propiedad de una identidad en línea, porque las identidades de los canales controlados por una cuenta en un hub no están vinculadas al propio hub. Un hub es más como un "host" para canales. Con Hubzilla, no tienes una "cuenta" en un servidor como lo haces en sitios web típicos; tienes una identidad que puedes llevarte a través de la rejilla usando clones. +[*= Identidad nómada] La capacidad de autenticar y migrar fácilmente una identidad a través de hubs y dominios web independientes. La identidad nómada proporciona una verdadera propiedad de una identidad en línea, porque las identidades de los canales controlados por una cuenta en un hub no están vinculadas al propio hub. Un hub es más como un "host" para canales. Con Hubzilla, no tienes una "cuenta" en un servidor como lo haces en sitios web típicos; tienes una identidad que puedes llevarte a través de la rejilla usando clones. -Traducción y sincronización: El novedoso protocolo basado en JSON para la implementación de comunicaciones y servicios descentralizados seguros. Se diferencia de muchos otros protocolos de comunicación en que construye las comunicaciones sobre un marco de identidad y autenticación descentralizado. El componente de autenticación es similar a OpenID conceptualmente pero está aislado de las identidades basadas en DNS. Cuando es posible, la autenticación remota es silenciosa e invisible. Esto proporciona un mecanismo para el control de acceso distribuido a escala de Internet que es discreto. +[*= Zot] El novedoso protocolo basado en JSON para la implementación de comunicaciones y servicios descentralizados seguros. Se diferencia de muchos otros protocolos de comunicación en que construye las comunicaciones sobre un marco de identidad y autenticación descentralizado. El componente de autenticación es similar a OpenID conceptualmente pero está aislado de las identidades basadas en DNS. Cuando es posible, la autenticación remota es silenciosa e invisible. Esto proporciona un mecanismo para el control de acceso distribuido a escala de Internet que es discreto. [/dl] + [h3]Características[/h3] Esta página enumera algunas de las características principales de $Projectname que se incluyen en la versión oficial. $Projectname es una plataforma altamente extensible, por lo que se pueden añadir más características y capacidades a través de temas y plugins adicionales. + [h4]Control deslizante de afinidad[/h4] Cuando se añaden conexiones en $Projectname, los miembros tienen la opción de asignar niveles de "afinidad" (cuán cerca está su amigo). @@ -46,6 +47,7 @@ En este punto, la herramienta $Projectname [i]Control deslizante de afinidad[/i] El control deslizante de afinidad permite el filtrado instantáneo de grandes cantidades de contenido, agrupado por niveles de cercanía. + [h4]Filtrado de conexiones[/h4] Usted tiene la capacidad de controlar con precisión lo que aparece en su flujo usando el "Filtro de conexión" opcional. Cuando está habilitado, el Editor de conexión proporciona entradas para seleccionar los criterios que deben coincidir para incluir o excluir un mensaje específico de un canal específico. Una vez que un mensaje ha sido permitido, todos los comentarios a ese mensaje son permitidos sin importar si coinciden o no con los criterios de selección. Puede seleccionar las palabras que, si están presentes, bloquean el mensaje o se aseguran de que esté incluido en su stream. Se pueden utilizar expresiones regulares para un control aún más preciso, así como hashtags o incluso el idioma detectado del mensaje. @@ -81,19 +83,23 @@ Puede crear cualquier número de salas de chat personales y permitir el acceso a [h4]Construcción de Páginas Web[/h4] -El nombre del proyecto tiene muchas herramientas de creación de "Gestión de contenidos" para construir páginas web, incluyendo edición de diseño, menús, bloques, widgets y regiones de página/contenido. Todo esto puede ser controladospara que las páginas resultantes sean privadas para la audiencia a la que están destinadas. +$Projectname tiene muchas herramientas de creación de "Gestión de contenidos" para construir páginas web, incluyendo edición de diseño, menús, bloques, widgets y regiones de página/contenido. Todo esto puede ser controladospara que las páginas resultantes sean privadas para la audiencia a la que están destinadas. + [h4]Aplicaciones[/h4] Las aplicaciones pueden ser construidas y distribuidas por los miembros. Éstas se diferencian de las aplicaciones tradicionales de "bloqueo de proveedores" porque están completamente controladas por el autor, que puede proporcionar control de acceso en las páginas de aplicaciones de destino y cobrar en consecuencia por este acceso. La mayoría de las aplicaciones en $Projectname son gratuitas y pueden ser creadas fácilmente por aquellos sin conocimientos de programación. -[h4]Diseño[/h4 -El diseño de la página se basa en un lenguaje de descripción llamado comanche. El propio nombre del proyecto está escrito en diseños comanches que se pueden cambiar. Esto permite un nivel de personalización que no se encuentra normalmente en los llamados "entornos multiusuario". +[h4]Diseño[/h4] + +El diseño de la página se basa en un lenguaje de descripción llamado comanche. La propia $Projectname está escrito en diseños comanches que se pueden cambiar. Esto permite un nivel de personalización que no se encuentra normalmente en los llamados "entornos multiusuario". + [h4]Marcadores[/h4] -Comparta y guarde/maneje los marcadores de los enlaces proporcionados en las conversaciones. +Comparta y guarde/maneje los marcadores de los enlaces proporcionados en las conversaciones. + [h4]Cifrado privado de mensajes y cuestiones de privacidad[/h4] @@ -101,7 +107,7 @@ El correo privado se almacena en un formato "oscuro". Aunque este no es a prueba Cada canal $Projectname tiene su propio conjunto único de claves RSA 4096-bit privadas y públicas asociadas, generadas cuando se crean los canales por primera vez. Se utiliza para proteger mensajes privados y mensajes en tránsito. -Además, los mensajes pueden crearse utilizando "encriptación de extremo a extremo" que no puede ser leída por los operadores de nombres de proyecto o ISPs o cualquier persona que no conozca el código de acceso. +Además, los mensajes pueden crearse utilizando "encriptación de extremo a extremo" que no puede ser leída por los operadores de $Projectname o ISPs o cualquier persona que no conozca el código de acceso. Por lo general, los mensajes públicos no se cifran durante el transporte ni durante el almacenamiento. @@ -130,7 +136,8 @@ Proporcionamos un acceso fácil a un directorio de miembros y proporcionamos her [h4]TLS/SSL[/h4] -En el caso de los concentradores de nombres de proyecto que utilizan TLS/SSL, las comunicaciones de cliente a servidor se cifran mediante TLS/SSL. Dadas las recientes revelaciones en los medios de comunicación con respecto a la vigilancia global generalizada y la elusión del cifrado por parte de NSA y GCHQ, es razonable asumir que las comunicaciones protegidas por HTTPS pueden verse comprometidas de varias maneras. Por consiguiente, las comunicaciones privadas se cifran a un nivel superior antes de enviarlas fuera del sitio. +En el caso de los hubs de $Projectname que utilizan TLS/SSL, las comunicaciones de cliente a servidor se cifran mediante TLS/SSL. Dadas las recientes revelaciones en los medios de comunicación con respecto a la vigilancia global generalizada y la elusión del cifrado por parte de NSA y GCHQ, es razonable asumir que las comunicaciones protegidas por HTTPS pueden verse comprometidas de varias maneras. Por consiguiente, las comunicaciones privadas se cifran a un nivel superior antes de enviarlas fuera del sitio. + [h4]Ajustes de canal[/h4] @@ -140,13 +147,13 @@ Si elige una función de privacidad "personalizada", cada canal permite establec Las opciones son: - Nadie excepto usted mismo. - Sólo aquellos que usted permita específicamente. - Cualquiera en sus conexiones aprobadas. - Cualquiera en este sitio web. - Cualquiera en esta red. - Cualquiera autentificado. - Cualquiera en Internet. + - Nadie excepto usted mismo. + - Sólo aquellos que usted permita específicamente. + - Cualquiera en sus conexiones aprobadas. + - Cualquiera en este sitio web. + - Cualquiera en esta red. + - Cualquiera autentificado. + - Cualquiera en Internet. [h4]Foros Públicos y Privados[/h4] @@ -173,37 +180,45 @@ $Projectname ofrece nuevas e interesantes posibilidades de privacidad. Puede lee Se aplican algunas advertencias. Para una explicación completa de la clonación de identidad, lea el documento <HOW TO CLONE MY IDENTITY>. + [h4]Perfiles Múltiples[/h4] Se puede crear cualquier número de perfiles que contengan información diferente y éstos pueden hacerse visibles para algunas de sus conexiones/amigos. Un perfil "predeterminado" puede ser visto por cualquiera y puede contener información limitada, con más información disponible para seleccionar grupos o personas. Esto significa que el perfil (y el contenido del sitio) que ven sus compañeros de trabajo puede ser diferente de lo que ven sus compañeros de trabajo, y también completamente diferente de lo que es visible para el público en general. + [h4]Copia de seguridad de la cuenta[/h4] $Projectname ofrece una sencilla copia de seguridad de la cuenta con un solo clic, en la que puede descargar una copia de seguridad completa de su(s) perfil(es). Las copias de seguridad se pueden utilizar para clonar o restaurar un perfil. + [h4]Borrado de cuenta[/h4] Las cuentas se pueden eliminar inmediatamente haciendo clic en un enlace. Eso es todo. Todo el contenido asociado se elimina de la rejilla (esto incluye los mensajes y cualquier otro contenido producido por el perfil eliminado). Dependiendo del número de conexiones que tenga, el proceso de eliminación de contenido remoto podría llevar algún tiempo, pero está previsto que ocurra tan rápido como sea posible. [h4]Supresión de contenido[/h4] -Cualquier contenido creado en $Projectname permanece bajo el control del miembro (o canal) que lo creó originalmente. En cualquier momento, un miembro puede borrar un mensaje o un rango de mensajes. El proceso de eliminación garantiza que el contenido se elimine, independientemente de si se publicó en el concentrador principal (doméstico) de un canal o en otro concentrador, donde el canal se autenticó de forma remota a través de Zot (protocolo de autenticación y comunicación de $Projectname). +Cualquier contenido creado en $Projectname permanece bajo el control del miembro (o canal) que lo creó originalmente. En cualquier momento, un miembro puede borrar un mensaje o un rango de mensajes. El proceso de eliminación garantiza que el contenido se elimine, independientemente de si se publicó en el hub principal de un canal o en otro hub, donde el canal se autenticó de forma remota a través de Zot (protocolo de autenticación y comunicación de $Projectname). + [h4]Medios[/h4] Al igual que cualquier otro sistema moderno de blogging, red social, o un servicio de micro-blogging, $Projectname soporta la carga de archivos, incrustación de video y vinculación de páginas web. + [h4]Previsualización/Edición[/h4] + Los mensajes y comentarios se pueden previsualizar antes de enviarlos y editarlos después de enviarlos. + [h4]Votación/Consenso[/h4] Los mensajes pueden convertirse en elementos de "consenso" que permiten a los lectores ofrecer retroalimentación, que se recopila en contadores de "acuerdo", "desacuerdo" y "abstención". Esto le permite medir el interés por las ideas y crear encuestas informales. -[h4]Extendiendo $Nombre del proyecto[/h4] +[h4]Extendiendo $Projectname[/h4] -El nombre del proyecto se puede ampliar de varias maneras, a través de la personalización del sitio, personalización, configuración de opciones, temas y complementos/plugins. -[h4]API[/h4] +$Projectname se puede ampliar de varias maneras, a través de la personalización del sitio, personalización, configuración de opciones, temas y complementos/plugins. +[h4]API[/h4] + Una API está disponible para su uso por parte de servicios de terceros. Un plugin también proporciona una implementación básica de Twitter (para los que existen cientos de herramientas de terceros). El acceso puede ser proporcionado por login/contraseña o OAuth, y el registro del cliente de las aplicaciones de OAuth es proporcionado.
\ No newline at end of file diff --git a/doc/es-es/about/project.bb b/doc/es-es/about/project.bb index 6871869d5..5f493af1d 100644 --- a/doc/es-es/about/project.bb +++ b/doc/es-es/about/project.bb @@ -1,4 +1,4 @@ -[h3]$Nombre del proyecto Gobernanza[/h3] +[h3]Gobernanza de $Projectname[/h3] La gobernanza se relaciona con la gestión de un proyecto y, en particular, con su relación con la resolución de conflictos. @@ -7,7 +7,7 @@ La gobernanza se relaciona con la gestión de un proyecto y, en particular, con El proyecto es mantenido y las decisiones tomadas por la "comunidad". La estructura de gobernanza sigue evolucionando. Hasta que se finalice la estructura, las decisiones se toman en el siguiente orden: [ol] -Consenso perezoso +[*] Consenso perezoso Si se presenta una propuesta de proyecto a uno de los foros de gobierno de la comunidad y no hay objeciones serias en un plazo "razonable" desde la fecha de la propuesta (por lo general, disponemos de 2 a 3 días para que todas las partes interesadas puedan opinar), no es necesario votar y la propuesta se considerará aprobada. En este momento se pueden plantear algunas preocupaciones, pero si éstas se abordan durante la discusión y se proporcionan soluciones provisionales, se considerarán aprobadas. @@ -17,12 +17,12 @@ Si se presenta una propuesta de proyecto a uno de los foros de gobierno de la co Los desarrolladores senior con un historial significativo de proyectos se comprometen a vetar cualquier decisión. La decisión no podrá adoptarse hasta que se retire el veto o se presente una propuesta alternativa. -Voto Comunitario +[*] Voto Comunitario Una decisión que no tiene un mandato claro o un consenso claro, pero que no es vetada, puede ser llevada a votación comunitaria. En la actualidad se trata de un simple voto popular en uno de los foros comunitarios aplicables. En este momento, el voto popular decide el resultado. Esto puede cambiar en el futuro si la comunidad adopta un modelo de gobierno de "consejo". Este documento se actualizará en ese momento con las reglas de gobierno actualizadas. [/ol] -El Voto Comunitario no siempre proporciona un resultado agradable y puede generar facciones polarizadas en la comunidad (de ahí la razón por la que se están considerando otros modelos). Si la propuesta es "rechazada" todavía hay varias cosas que se pueden hacer y la propuesta se vuelve a presentar con parámetros ligeramente diferentes (convertir a un complemento, convertir a una característica opcional que está desactivada por defecto, etc.). Si el interés en la película es alto y la votación es "cercana", puede generar muchos malos sentimientos entre los votantes perdedores. En estas votaciones tan reñidas, se[b]recomienda encarecidamente[/b] que el proponente tome medidas para abordar cualquier inquietud que se haya planteado y vuelva a presentar. +El Voto Comunitario no siempre proporciona un resultado agradable y puede generar facciones polarizadas en la comunidad (de ahí la razón por la que se están considerando otros modelos). Si la propuesta es "rechazada" todavía hay varias cosas que se pueden hacer y la propuesta se vuelve a presentar con parámetros ligeramente diferentes (convertir a un complemento, convertir a una característica opcional que está desactivada por defecto, etc.). Si el interés en la película es alto y la votación es "cercana", puede generar muchos malos sentimientos entre los votantes perdedores. En estas votaciones tan reñidas, se [b]recomienda encarecidamente[/b] que el proponente tome medidas para abordar cualquier inquietud que se haya planteado y vuelva a presentar. @@ -30,24 +30,24 @@ El Voto Comunitario no siempre proporciona un resultado agradable y puede genera P: ¿Quién puede ver mi contenido? -R: Por defecto CUALQUIER PERSONA en Internet, A MENOS que usted lo restrinja. El nombre del proyecto le permite elegir el nivel de privacidad que desea. El contenido restringido NO será visible para las "redes de espionaje" y los anunciantes. Estará protegido contra las escuchas de personas ajenas a la empresa, en la medida de nuestras posibilidades. Los administradores de los hubs con suficientes habilidades y paciencia PUEDEN ser capaces de escuchar a escondidas algunas comunicaciones privadas, pero deben hacer un esfuerzo para hacerlo. Los modos de privacidad existen dentro de $Projectname que son incluso resistentes a las escuchas por parte de administradores de hubs cualificados y decididos. +R: Por defecto CUALQUIER PERSONA en Internet, A MENOS que usted lo restrinja. $Projectname le permite elegir el nivel de privacidad que desea. El contenido restringido NO será visible para las "redes de espionaje" y los anunciantes. Estará protegido contra las escuchas de personas ajenas a la empresa, en la medida de nuestras posibilidades. Los administradores de los hubs con suficientes habilidades y paciencia PUEDEN ser capaces de escuchar a escondidas algunas comunicaciones privadas, pero deben hacer un esfuerzo para hacerlo. Los modos de privacidad existen dentro de $Projectname que son incluso resistentes a las escuchas por parte de administradores de hubs cualificados y decididos. P: ¿Se puede censurar mi contenido? -R: $Nombre del proyecto (la red) NO PUEDE censurar su contenido. Los administradores de servidores y hubs están sujetos a las leyes locales y PUEDEN eliminar contenido objetable de su sitio o hub. Cualquiera PUEDE convertirse en administrador del hub, incluyéndote a ti; y por lo tanto publicar contenido que de otra manera podría ser censurado. Usted aún PUEDE estar sujeto a las leyes locales. +R: $Projectname (la red) NO PUEDE censurar su contenido. Los administradores de servidores y hubs están sujetos a las leyes locales y PUEDEN eliminar contenido objetable de su sitio o hub. Cualquiera PUEDE convertirse en administrador del hub, incluyéndote a ti; y por lo tanto publicar contenido que de otra manera podría ser censurado. Usted aún PUEDE estar sujeto a las leyes locales. [h5]Definiciones[/h5] -**$$Nombre del proyecto** +**$Projectname** También conocido como "la red", $Projectname es una colección de ordenadores/servidores individuales (aka **hubs**) que se conectan para formar una red cooperativa más grande. -*Hub* +**Hub** Una computadora individual o servidor conectado a $Projectname. Estos son proporcionados por un administrador de **hub y pueden ser públicos o privados, de pago o gratuitos. -El administrador del hub. +**El administrador del hub** El operador del sistema de un hub individual. @@ -82,11 +82,11 @@ La privacidad para su identidad es otro aspecto. Debido a que tiene una identida Una identidad descentralizada tiene muchas ventajas y le ofrece muchas características interesantes, pero debe tener en cuenta que su identidad es conocida por otros hubs de la red $Projectname. Una de esas ventajas es que otros canales pueden servirte contenido personalizado y permitirte ver cosas privadas (como fotos privadas que otros desean compartir contigo). Por eso esos canales necesitan saber quién eres. Pero entendemos que a veces esos otros canales saben más de ti de lo que deseas. Por ejemplo el plug-in Visage que puede decirle al propietario de un canal la última vez que visites su perfil. Usted puede fácilmente OPT-OUT de este bajo nivel y, pensamos, seguimiento inofensivo. -Puede habilitar [No rastrear (DNT)](http://donottrack.us/) en su navegador web. Respetamos esta nueva propuesta de política de privacidad. Todos los navegadores modernos soportan DNT. Lo encontrarás en la configuración de privacidad de tus navegadores o bien puedes consultar el manual del navegador. Esto no afectará a la funcionalidad de $Projectname. Este ajuste es probablemente suficiente para la mayoría de las personas. +* Puede habilitar [No rastrear (DNT)](http://donottrack.us/)] en su navegador web. Respetamos esta nueva propuesta de política de privacidad. Todos los navegadores modernos soportan DNT. Lo encontrarás en la configuración de privacidad de tus navegadores o bien puedes consultar el manual del navegador. Esto no afectará a la funcionalidad de $Projectname. Este ajuste es probablemente suficiente para la mayoría de las personas. -Puede [desactivar la publicación](configuración) de su canal en nuestro directorio de canales. Si quieres que la gente encuentre tu canal, debes darles la dirección de tu canal directamente a ellos. Creemos que esto es una buena indicación de que prefieres privacidad extra y habilitar automáticamente "No rastrear" si este es el caso. +* Puede [desactivar la publicación](configuración) de su canal en nuestro directorio de canales. Si quieres que la gente encuentre tu canal, debes darles la dirección de tu canal directamente a ellos. Creemos que esto es una buena indicación de que prefieres privacidad extra y habilitar automáticamente "No rastrear" si este es el caso. -Puedes tener un hub bloqueado. Esto significa que todos los canales y contenidos de ese hub no son públicos y no son visibles para el mundo exterior. Esto es algo que sólo el administrador del hub puede hacer. También respetamos esto y activamos automáticamente "No rastrear" si está configurado. +* Puede tener un hub bloqueado. Esto significa que todos los canales y contenidos de ese hub no son públicos y no son visibles para el mundo exterior. Esto es algo que sólo el administrador del hub puede hacer. También respetamos esto y activamos automáticamente "No rastrear" si está configurado. [h5]Censura[/h5] @@ -97,6 +97,7 @@ $Projectname RECOMIENDA que los administradores de hubs proporcionen un período Si usted típica y regularmente publica contenido de naturaleza adulta u ofensiva, se le recomienda encarecidamente que marque su cuenta "NSFW" (No es seguro para el trabajo). Esto evitará que se muestre la foto de tu perfil en el directorio, excepto a los espectadores que hayan optado por desactivar el "modo seguro". Si los administradores del directorio consideran que la foto de tu perfil es adulta u ofensiva, el administrador del directorio PUEDE marcar tu foto de perfil como NSFW. Actualmente no existe ningún mecanismo oficial para impugnar o revertir esta decisión, razón por la cual DEBERÍA usted marcar su propia cuenta NSFW si es probable que sea inapropiada para el público en general. + [h3]Créditos[/h3] Gracias a todos los que han ayudado y contribuido al proyecto y a sus predecesores a lo largo de los años. diff --git a/doc/es-es/git_for_non_developers.bb b/doc/es-es/git_for_non_developers.bb index 7a3ab980b..904826f94 100644 --- a/doc/es-es/git_for_non_developers.bb +++ b/doc/es-es/git_for_non_developers.bb @@ -1,78 +1,78 @@ -[b]Git para no desarrolladores[/b]
-
-Así que está manejando una traducción, o está contribuyendo a un tema, y cada vez que hace un pull request tiene que hablar con uno de los desarrolladores antes de que sus cambios puedan ser fusionados?
-
-Lo más probable es que no haya encontrado una forma rápida de explicar cómo mantener las cosas sincronizadas en su lado. Es realmente muy fácil.
-
-Después de crear un fork del repositorio (sólo tiene que hacer clic en "fork" en github), necesita clonar su propia copia.
-
-Por ejemplo, asumiremos que está trabajando en un tema llamado redexample (que no existe).
-
-[code]git clone https://github.com/username/red.git[/code]
-
-Así que está manejando una traducción, o está contribuyendo a un tema, y cada vez que hace un pull request tiene que hablar con uno de los desarrolladores antes de que sus cambios puedan ser fusionados?
-
-Lo más probable es que no haya encontrado una forma rápida de explicar cómo mantener las cosas sincronizadas en su lado. Es realmente muy fácil.
-
-Después de crear un fork del repositorio (sólo tiene que hacer clic en "fork" en github), necesita clonar su propia copia.
-
-Por ejemplo, asumiremos que está trabajando en un tema llamado redexample (que no existe).
-
-Una vez que lo haya hecho, cd en el directorio, y añadir un upstream.
-
-[code]
-cd red
-git remote add upstream https://github.com/redmatrix/hubzilla
-[/code]
-
-A partir de ahora, puede realizar cambios en el upstream con el comando
-[code]git fetch upstream[/code]
-
-Antes de que sus cambios puedan fusionarse automáticamente, a menudo necesitará fusionar los cambios anteriores.
-
-[code]
-git merge upstream/master
-[/code]
-
-Siempre debe fusionar upstream antes de subir cualquier cambio, y [i]debe[/i] fusionar upstream con cualquier pull request para que se fusionen automáticamente.
-
-El 99% de las veces, todo irá bien. La única vez que no lo hará es si alguien más ha estado editando los mismos ficheros que usted y, a menudo, sólo si ha estado editando las mismas líneas de los mismos archivos. Si eso sucede, ese sería un buen momento para solicitar ayuda hasta que se acostumbre a manejar sus propios conflictos de fusión.
-
-Entonces sólo necesitas añadir tus cambios [code]git añadir vista/tema/redexample/[/code]
-
-Esto agregará todos los archivos en la vista/tema/redexample y cualquier subdirectorio. Si sus archivos particulares se mezclan a través del código, usted debe agregar uno a la vez. Trata de no hacer git add -a, ya que esto lo agregará todo, incluyendo archivos temporales (mayormente, pero no siempre atrapamos a aquellos con un.gitignore) y cualquier cambio local que tenga, pero que no intente confirmar.
-
-Una vez que haya agregado todos los archivos que ha cambiado, necesita confirmarlos. [code]git commit[/code]
-
-Esto abrirá un editor donde podrá describir los cambios que ha realizado. Guarde este archivo y salga del editor.
-
-Finalmente, suba los cambios en su propio git
-[code]git push[/code]
-
-Y eso es todo, su repo está al día!
-
-Todo lo que necesita hacer ahora es crear la petición pull. Hay dos maneras de hacerlo.
-
-La forma más fácil, si está utilizando Github, es simplemente hacer clic en el botón verde en la parte superior de su propia copia del repositorio, introducir una descripción de los cambios, y hacer clic en `crear pull request'. El repositorio principal, los temas y los complementos tienen su rama principal en Github, por lo que este método se puede utilizar la mayor parte del tiempo.
-
-La mayoría de la gente puede parar aquí.
-
-Algunos proyectos en la ecosfera extendida de RedMatrix no tienen presencia en Github, para un pull request, los pasos son un poco diferentes: usted tendrá que crear su pull request manualmente. Afortunadamente, esto no es
-mucho más difícil.
-
-[code]git request-pull -p <start> <url>[/code]
-
-Start es el nombre de un commit por el que empezar. Esto debe existir en el upstream. Normalmente, sólo querr'a la rama master.
-
-URL es la URL de[i]su[/i] repo.
-
-También se puede especificar <end>. Este valor predeterminado es HEAD.
-
-Ejemplo:
-[código]
-git request-pull master https://ejemplo.com/proyecto
-[/código]
-
-Y simplemente envíe la salida al mantenedor del proyecto.
-
-#include doc/macros/main_footer.bb;
+[b]Git para no desarrolladores[/b] + +Así que está manejando una traducción, o está contribuyendo a un tema, y cada vez que hace un pull request tiene que hablar con uno de los desarrolladores antes de que sus cambios puedan ser fusionados? + +Lo más probable es que no haya encontrado una forma rápida de explicar cómo mantener las cosas sincronizadas en su lado. Es realmente muy fácil. + +Después de crear un fork del repositorio (sólo tiene que hacer clic en "fork" en github), necesita clonar su propia copia. + +Por ejemplo, asumiremos que está trabajando en un tema llamado redexample (que no existe). + +[code]git clone https://github.com/username/red.git[/code] + +Así que está manejando una traducción, o está contribuyendo a un tema, y cada vez que hace un pull request tiene que hablar con uno de los desarrolladores antes de que sus cambios puedan ser fusionados? + +Lo más probable es que no haya encontrado una forma rápida de explicar cómo mantener las cosas sincronizadas en su lado. Es realmente muy fácil. + +Después de crear un fork del repositorio (sólo tiene que hacer clic en "fork" en github), necesita clonar su propia copia. + +Por ejemplo, asumiremos que está trabajando en un tema llamado redexample (que no existe). + +Una vez que lo haya hecho, cd en el directorio, y añadir un upstream. + +[code] +cd red +git remote add upstream https://framagit.org/hubzilla/core/ +[/code] + +A partir de ahora, puede realizar cambios en el upstream con el comando +[code]git fetch upstream[/code] + +Antes de que sus cambios puedan fusionarse automáticamente, a menudo necesitará fusionar los cambios anteriores. + +[code] +git merge upstream/master +[/code] + +Siempre debe fusionar upstream antes de subir cualquier cambio, y [i]debe[/i] fusionar upstream con cualquier pull request para que se fusionen automáticamente. + +El 99% de las veces, todo irá bien. La única vez que no lo hará es si alguien más ha estado editando los mismos ficheros que usted y, a menudo, sólo si ha estado editando las mismas líneas de los mismos archivos. Si eso sucede, ese sería un buen momento para solicitar ayuda hasta que se acostumbre a manejar sus propios conflictos de fusión. + +Entonces sólo necesitas añadir tus cambios [code]git añadir vista/tema/redexample/[/code] + +Esto agregará todos los archivos en la vista/tema/redexample y cualquier subdirectorio. Si sus archivos particulares se mezclan a través del código, usted debe agregar uno a la vez. Trata de no hacer git add -a, ya que esto lo agregará todo, incluyendo archivos temporales (mayormente, pero no siempre atrapamos a aquellos con un.gitignore) y cualquier cambio local que tenga, pero que no intente confirmar. + +Una vez que haya agregado todos los archivos que ha cambiado, necesita confirmarlos. [code]git commit[/code] + +Esto abrirá un editor donde podrá describir los cambios que ha realizado. Guarde este archivo y salga del editor. + +Finalmente, suba los cambios en su propio git +[code]git push[/code] + +Y eso es todo, su repo está al día! + +Todo lo que necesita hacer ahora es crear la petición pull. Hay dos maneras de hacerlo. + +La forma más fácil, si está utilizando Github, es simplemente hacer clic en el botón verde en la parte superior de su propia copia del repositorio, introducir una descripción de los cambios, y hacer clic en `crear pull request'. El repositorio principal, los temas y los complementos tienen su rama principal en Github, por lo que este método se puede utilizar la mayor parte del tiempo. + +La mayoría de la gente puede parar aquí. + +Algunos proyectos en la ecosfera extendida de RedMatrix no tienen presencia en Github, para un pull request, los pasos son un poco diferentes: usted tendrá que crear su pull request manualmente. Afortunadamente, esto no es +mucho más difícil. + +[code]git request-pull -p <start> <url>[/code] + +Start es el nombre de un commit por el que empezar. Esto debe existir en el upstream. Normalmente, sólo querr'a la rama master. + +URL es la URL de[i]su[/i] repo. + +También se puede especificar <end>. Este valor predeterminado es HEAD. + +Ejemplo: +[código] +git request-pull master https://ejemplo.com/proyecto +[/código] + +Y simplemente envíe la salida al mantenedor del proyecto. + +#include doc/macros/main_footer.bb; diff --git a/doc/es-es/main.bb b/doc/es-es/main.bb index 00d2e47bb..dff1717e4 100644 --- a/doc/es-es/main.bb +++ b/doc/es-es/main.bb @@ -2,7 +2,6 @@ [zrl=[baseurl]/help/about][b]¿Qué es $Projectname?[/b][/zrl] $Projectname est un software de publicación y comunicación descentralizadas que le permite tener el control de sus necesidades y datos. Es ustedm y solo usted, quien decide a quién permite ver sus publicaciones. - [zrl=[baseurl]/help/features][b]Funcionaliades de $Projectname[/b][/zrl] $Projectname es una red global distribuida que es flexible, pero puede crecer en potencia desde in pequeño sitio personal hasta albergar una comunidad de numerosas personas. diff --git a/doc/external-resource-links.bb b/doc/external-resource-links.bb index a679e9381..338db8023 100644 --- a/doc/external-resource-links.bb +++ b/doc/external-resource-links.bb @@ -1,21 +1,21 @@ -[h2]External resource links[/h2]
-[h3]Third-Party Themes[/h3]
-[ul]
-[*][url=https://github.com/omigeot/redstrap3]Redstrap[/url]
-[*][url=https://bitbucket.org/tobiasd/red-clean]Clean[/url]
-[*][url=https://github.com/tonybaldwin/redmatrixthemes/]nubasic[/url]
-[*][url=https://github.com/deadsuperhero/redmatrix-themes]Sean Tilley's themes[/url]
-[/ul]
-[h3]Third-Party addons[/h3]
-[ul]
-[*][url=https://abcentric.net/git/abcjsplugin.git]ABCjs integration - display scores in posts (WIP)[/url]
-[/ul]
-[h3]Related projects[/h3]
-[ul]
-[*][url=https://addons.mozilla.org/en-US/firefox/addon/redshare/]Redshare for Firefox[/url]
-[*][url=https://github.com/cvogeley/red-for-android]Red for Android[/url]
-[*][url=https://github.com/zzottel/feed2red]feed2red.pl (posts Atom/RSS feeds to channel)[/url]
-[*][url=https://wordpress.org/plugins/hubzilla-wp/]WordPress gateway (combine with wppost addon for full features)[/url]
-[/ul]
-
-#include doc/macros/main_footer.bb;
+[h2]External resource links[/h2] +[h3]Third-Party Themes[/h3] +[ul] +[*][url=https://github.com/omigeot/redstrap3]Redstrap[/url] +[*][url=https://bitbucket.org/tobiasd/red-clean]Clean[/url] +[*][url=https://github.com/tonybaldwin/redmatrixthemes/]nubasic[/url] +[*][url=https://github.com/deadsuperhero/redmatrix-themes]Sean Tilley's themes[/url] +[/ul] +[h3]Third-Party addons[/h3] +[ul] +[*][url=https://abcentric.net/git/abcjsplugin.git]ABCjs integration - display scores in posts (WIP)[/url] +[/ul] +[h3]Related projects[/h3] +[ul] +[*][url=https://addons.mozilla.org/en-US/firefox/addon/redshare/]Redshare for Firefox[/url] +[*][url=https://github.com/cvogeley/red-for-android]Red for Android[/url] +[*][url=https://github.com/zzottel/feed2red]feed2red.pl (posts Atom/RSS feeds to channel)[/url] +[*][url=https://wordpress.org/plugins/hubzilla-wp/]WordPress gateway (combine with wppost addon for full features)[/url] +[/ul] + +#include doc/macros/main_footer.bb; diff --git a/doc/extra_features.bb b/doc/extra_features.bb index 0044a06a7..17d85228e 100644 --- a/doc/extra_features.bb +++ b/doc/extra_features.bb @@ -1,98 +1,98 @@ -// multiple of these have been enabled by default. should we note this here somewhere, move it or remove them from this file?
-[b]Features[/b]
-
-The default interface of $Projectname was designed to be uncluttered. There are a huge number of extra features (some of which are extremely useful) which you can turn on and get the most of the application. These are found under the Extra Features link of your Settings page.
-
-[b]Content Expiration[/b]
-
-Remove posts/comments and/or private messages at a future time. An extra button is added to the post editor which asks you for an expiration. Typically this in "yyyy-mm-dd hh:mm" format, but in the English language you have a bit more freedom and can use most any recognisable date reference such as "next Thursday" or "+1 day". At the specified time (give or take approximately ten minutes based on the remote system's checking frequency) the post is removed.
-
-[b]Multiple Profiles[/b]
-
-The ability to create multiple profiles which are visible only to specific persons or groups. Your default profile may be visible to anybody, but secondary profiles can all contain different or additional information and can only be seen by those to whom that profile is assigned.
-
-[b]Web Pages[/b]
-
-Provides the ability to use web page design feaures and create custom webpages from your own content and also to design the pages with page layouts, custom menus, and content blocks.
-
-[b]Private Notes[/b]
-
-On pages where it is available (your matrix page and personal web pages) provide a "widget" to create and store personal reminders and notes.
-
-[b]Extended Identity Sharing[/b]
-
-By default your identity travels with you as you browse the matrix to remote sites - and they know who you are and can show you content that only you can see. With Extended Identity Sharing you can provide this information to any website you visit from within the matrix.
-
-[b]Expert Mode[/b]
-
-This allows you to see some advanced configuration options that would confuse some people or cause support issues. In particular this can give you full control over theme features and colours - so that you can tweak a large number of settings of the display theme to your liking.
-
-[b]Premium Channel[/b]
-
-This allows you to set restrictions and terms on those that connect with your channel. This may be used by celebrities or anybody else who wishes to describe their channel to people who wish to connect with it. In certain cases you may be asked for payment in order to connect.
-
-[b]Post Preview[/b]
-
-Allows previewing posts and comments exactly as they would look on the page before publishing them.
-
-[b]Channel Sources[/b]
-
-Automatically import and re-publish channel content from other channels or feeds. This allows you to create sub-channels and super-channels from content provided elsewhere. The rules are that the content must be public, and the channel owner must give you permission to source their channel.
-
-[b]Even More Encryption[/b]
-
-Private messages are encrypted during transport and storage. In this day and age, this encyption may not be enough if your communications are extremely sensitive. This options lets you provide optional encryption of content "end-to-end" with a shared secret key. How the recipient learns the secret key is completely up to you. You can provide a hint such as "the name of aunt Claire's first dog".
-
-[b]Search by Date[/b]
-
-This provides the ability to select posts by date ranges
-
-[b]Privacy Group Filter[/b]
-
-Enable widget to display stream posts only from selected privacy groups. This also toggles the outbound permissions while you are viewing a group. This is analogous to Google "circles" or Disapora "aspects".
-
-[b]Saved Searches[/b]
-
-Provides a search widget on your matrix page which can save selected search terms for re-use.
-
-[b]Personal Tab[/b]
-
-Enable tab to display only matrix posts that you've interacted with in some way, as an author or a contributor to the conversation.
-
-[b]New Tab[/b]
-
-Enables a tab to display all new matrix activity as a firehose or timeline.
-
-[b]Affinity Tool[/b]
-
-Filter matrix stream activity by the depth of your relationships
-
-[b]Edit Sent Posts[/b]
-
-Edit and correct posts and comments after sending
-
-[b]Tagging[/b]
-
-Ability to tag existing posts, including those written by others.
-
-[b]Post Categories[/b]
-
-Add categories to your channel posts
-
-[b]Saved Folders[/b]
-
-Ability to file posts under folders or tags for later recall
-
-[b]Dislike Posts[/b]
-
-Ability to dislike posts/comments
-
-[b]Star Posts[/b]
-
-Ability to mark special posts with a star indicator
-
-[b]Tag Cloud[/b]
-
-Provide a personal tag cloud on your channel page
-
-#include doc/macros/main_footer.bb;
+// multiple of these have been enabled by default. should we note this here somewhere, move it or remove them from this file? +[b]Features[/b] + +The default interface of $Projectname was designed to be uncluttered. There are a huge number of extra features (some of which are extremely useful) which you can turn on and get the most of the application. These are found under the Extra Features link of your Settings page. + +[b]Content Expiration[/b] + +Remove posts/comments and/or private messages at a future time. An extra button is added to the post editor which asks you for an expiration. Typically this in "yyyy-mm-dd hh:mm" format, but in the English language you have a bit more freedom and can use most any recognisable date reference such as "next Thursday" or "+1 day". At the specified time (give or take approximately ten minutes based on the remote system's checking frequency) the post is removed. + +[b]Multiple Profiles[/b] + +The ability to create multiple profiles which are visible only to specific persons or groups. Your default profile may be visible to anybody, but secondary profiles can all contain different or additional information and can only be seen by those to whom that profile is assigned. + +[b]Web Pages[/b] + +Provides the ability to use web page design feaures and create custom webpages from your own content and also to design the pages with page layouts, custom menus, and content blocks. + +[b]Private Notes[/b] + +On pages where it is available (your matrix page and personal web pages) provide a "widget" to create and store personal reminders and notes. + +[b]Extended Identity Sharing[/b] + +By default your identity travels with you as you browse the matrix to remote sites - and they know who you are and can show you content that only you can see. With Extended Identity Sharing you can provide this information to any website you visit from within the matrix. + +[b]Expert Mode[/b] + +This allows you to see some advanced configuration options that would confuse some people or cause support issues. In particular this can give you full control over theme features and colours - so that you can tweak a large number of settings of the display theme to your liking. + +[b]Premium Channel[/b] + +This allows you to set restrictions and terms on those that connect with your channel. This may be used by celebrities or anybody else who wishes to describe their channel to people who wish to connect with it. In certain cases you may be asked for payment in order to connect. + +[b]Post Preview[/b] + +Allows previewing posts and comments exactly as they would look on the page before publishing them. + +[b]Channel Sources[/b] + +Automatically import and re-publish channel content from other channels or feeds. This allows you to create sub-channels and super-channels from content provided elsewhere. The rules are that the content must be public, and the channel owner must give you permission to source their channel. + +[b]Even More Encryption[/b] + +Private messages are encrypted during transport and storage. In this day and age, this encyption may not be enough if your communications are extremely sensitive. This options lets you provide optional encryption of content "end-to-end" with a shared secret key. How the recipient learns the secret key is completely up to you. You can provide a hint such as "the name of aunt Claire's first dog". + +[b]Search by Date[/b] + +This provides the ability to select posts by date ranges + +[b]Privacy Group Filter[/b] + +Enable widget to display stream posts only from selected privacy groups. This also toggles the outbound permissions while you are viewing a group. This is analogous to Google "circles" or Disapora "aspects". + +[b]Saved Searches[/b] + +Provides a search widget on your matrix page which can save selected search terms for re-use. + +[b]Personal Tab[/b] + +Enable tab to display only matrix posts that you've interacted with in some way, as an author or a contributor to the conversation. + +[b]New Tab[/b] + +Enables a tab to display all new matrix activity as a firehose or timeline. + +[b]Affinity Tool[/b] + +Filter matrix stream activity by the depth of your relationships + +[b]Edit Sent Posts[/b] + +Edit and correct posts and comments after sending + +[b]Tagging[/b] + +Ability to tag existing posts, including those written by others. + +[b]Post Categories[/b] + +Add categories to your channel posts + +[b]Saved Folders[/b] + +Ability to file posts under folders or tags for later recall + +[b]Dislike Posts[/b] + +Ability to dislike posts/comments + +[b]Star Posts[/b] + +Ability to mark special posts with a star indicator + +[b]Tag Cloud[/b] + +Provide a personal tag cloud on your channel page + +#include doc/macros/main_footer.bb; diff --git a/doc/feature/additional/access.md b/doc/feature/additional/access.md index 3581ca11d..b7f0df717 100644 --- a/doc/feature/additional/access.md +++ b/doc/feature/additional/access.md @@ -17,10 +17,10 @@ Ability to create multiple profiles. Minimum required technical skill level to see this feature: 3 -### Permission Groups +### Permission Categories -Provide alternate connection permission roles. -<!-- TODO: full description for Permission Groups --> +Provide alternate connection permission limits. +<!-- TODO: full description for Permission Categories --> Minimum required technical skill level to see this feature: 2 diff --git a/doc/fr/TermsOfService.md b/doc/fr/TermsOfService.md new file mode 100644 index 000000000..c51224e14 --- /dev/null +++ b/doc/fr/TermsOfService.md @@ -0,0 +1,10 @@ +Politique de confidentialité +============== + +#include doc/gdpr1.md; + + +Conditions d'utilisation +================ + +#include doc/SiteTOS.md; diff --git a/doc/fr/about/about.bb b/doc/fr/about/about.bb index de736bff2..0c0463d7c 100644 --- a/doc/fr/about/about.bb +++ b/doc/fr/about/about.bb @@ -14,7 +14,7 @@ Du point de vue pratique des membres du hub qui utilisent le logiciel, $Projectn Alors que toutes ces applications et services peuvent être trouvés dans d'autres progiciels, seul $Projectname vous permet de définir des permissions pour des groupes et des individus qui n'ont peut-être même pas de comptes sur votre hub ! Dans les applications web typiques, si vous voulez partager des choses en privé sur Internet, les personnes avec qui vous partagez doivent avoir des comptes sur le serveur hébergeant vos données ; autrement, il n'y a pas de moyen robuste pour votre serveur [i]d'authentifier[/i] les visiteurs du site pour savoir s'ils doivent leur accorder l'accès. $Projectname résout ce problème avec un système avancé [i]d'authentification à distance[/i] qui valide l'identité des visiteurs en employant des techniques qui incluent la cryptographie à clé publique. [h3]Pile logicielle[/h3]. -La pile logicielle $Projectname est une application serveur web relativement standard écrite principalement en PHP/MySQL et [url=https://github.com/redmatrix/hubzilla/blob/master/install/INSTALL.txt] nécessitant un peu plus qu'un serveur web, une base de données compatible MySQL, et le langage de script PHP[/url]. Il est conçu pour être facilement installable par ceux qui ont des compétences de base en administration de sites Web sur des plates-formes d'hébergement mutualisé typiques avec une large gamme de matériel informatique. Il est aussi facilement extensible via des plugins et des thèmes et d'autres outils tiers. +La pile logicielle $Projectname est une application serveur web relativement standard écrite principalement en PHP/MySQL et [url=https://framagit.org/hubzilla/core/blob/master/install/INSTALL.txt] nécessitant un peu plus qu'un serveur web, une base de données compatible MySQL, et le langage de script PHP[/url]. Il est conçu pour être facilement installable par ceux qui ont des compétences de base en administration de sites Web sur des plates-formes d'hébergement mutualisé typiques avec une large gamme de matériel informatique. Il est aussi facilement extensible via des plugins et des thèmes et d'autres outils tiers. [h3]Glossaire[/h3]. [dl terms="b"] diff --git a/doc/fr/gdpr1.md b/doc/fr/gdpr1.md new file mode 100644 index 000000000..bc0dfe056 --- /dev/null +++ b/doc/fr/gdpr1.md @@ -0,0 +1,77 @@ +Avis de confidentialité Mai 2018 + +Comment vos informations seront utilisées +================================= + +Les informations que vous fournissez à ce site Web peuvent être stockées et utilisées pour vous fournir des services. + +Nous avons besoin d'une adresse e-mail pour identifier le titulaire du compte. Ceci ne sera pas partagé avec tout autre site Web ou service. Il est utilisé pour vous envoyer des notifications concernant votre compte et effectuer des tâches administratives telles que la réinitialisation de votre mot de passe. Vous avez la possibilité de refuser toutes les notifications par courriel par le biais de vos paramètres. + +Les canaux de communication créés sur ce site web nécessitent un nom et une photo ou un avatar. Un avatar par défaut sera choisi si vous n'en fournissez pas. Le nom, l'avatar, et un lien vers la page web du canal sera partagée avec d'autres serveurs et services afin de se référer à cette identité. Le nom n'a pas besoin d'être votre vrai nom et la photo ou l'avatar n'a pas besoin de vous ressembler. + +Toutes les autres informations que vous fournissez à ce site Web sont facultatives. + +En tant que service de communication sociale et de stockage dans les nuages, vous utiliserez généralement ce site Web pour partager des informations avec d'autres personnes. Nous fournissons une gamme d'options de confidentialité pour vous permettre de limiter ce partage à ceux que vous choisissez. + +Traitement de vos informations +============================== + +Notre traitement de vos informations est limité à leur stockage pour que vous puissiez les utiliser. Nous POUVONS tenir des registres d'activité pour aider à diagnostiquer les problèmes de logiciel et à maintenir la sécurité du système contre +intrusion. Ces journaux sont régulièrement effacés après quelques jours. + +Nous PEUVONS (si vous avez fourni cette permission) essayer de suggérer des amitiés ou des connexions basées sur des amitiés +sur l'analyse des informations accessibles au public concernant vos connexions. Il s'agit actuellement du "traitement" de données le plus avancé effectué sur ce site Web. Vous pouvez restreindre l'accès à ces informations si ce traitement n'est pas souhaité. + +S'il est fourni, nous PEUVONS utiliser votre sexe pour formuler des messages texte dans votre langue maternelle. + +Dans tous les autres cas, vos données sont stockées dans le cadre de la politique de confidentialité de votre choix et au mieux. +de notre capacité n'est partagée qu'avec ceux avec qui vous avez choisi de la partager. + +Nous ne partageons pas vos informations personnelles avec des tiers et n'analysons pas votre comportement ou vos informations personnelles. +Nous n'avons pas de publicité ou de relations d'affaires avec les annonceurs. + +Nous PEUVONS être invités ou forcés de divulguer les informations que vous nous avez fournies en réponse à des procédures pénales et judiciaires légitimes. Dans la mesure du possible, nous vous en aviserons si cela se produit. + +Accès à vos informations +========================== + +Certaines communications sont partagées avec d'autres sites Web. Ceux qui utilisent le même logiciel vont généralement +ont des politiques similaires en matière de protection de la vie privée. + +Il se peut que l'on vous montre des vidéos intégrées et des liens fournis pour visiter d'autres sites Web dans le cadre de vos activités quotidiennes à l'aide de ce site Web. Cette mai vous exposer à la surveillance par des services externes, tels que (mais non limité à) Facebook, Twitter et Google. Chaque opérateur de site Web est autorisé à configurer si le contenu intégré est autorisé ou non. + +L'accès à vos données personnelles et aux fichiers stockés est sous votre contrôle. + +Notre stockage de vos données est fourni sous votre consentement implicite par le biais de votre utilisation continue du service. Vous pouvez retirer ce consentement à tout moment et, en cas de suppression de compte, nous supprimerons toutes les toutes les données qui vous appartiennent. Le processus de suppression peut prendre plusieurs jours, car nous faisons également tout notre possible pour le supprimer de tous les sites Internet qui ont reçu une copie. + +Toutes les données et tous les fichiers stockés pour un canal de communication sont à votre disposition pour +télécharger pour les pupilles d'archives ou pour les transférer sur un autre site Web compatible. + +Vos droits +=========== + +En vertu du règlement général sur la protection des données +(GDPR) et la Loi sur la protection des données 2018 (DPA) , vous disposez d'un certain nombre de droits en ce qui concerne vos données personnelles. +Vous avez le droit de nous demander l'accès et la rectification ou l'effacement de vos données personnelles, le droit de restreindre le traitement, de s'opposer au traitement ainsi que, dans certaines circonstances, le droit à la portabilité des données. + +Si vous avez donné votre consentement au traitement de vos données, vous avez le droit (dans certaines circonstances) de retirer ce consentement à tout moment, ce qui n'affectera pas la licéité du traitement avant le retrait de votre consentement. + +Vous avez le droit de déposer une plainte auprès du Commissariat à l'information si vous estimez que nous n'avons pas respecté les exigences du GDPR ou de la DPA 18 en ce qui concerne vos données personnelles. + +Identité et coordonnées du responsable du traitement et du délégué à la protection des données + +[NOM DE L'ENTREPRISE] +est le contrôleur [et le processeur] +des données aux fins de la LPD 18 et du RDPPIB. 3 + +Si vous avez des questions sur la manière dont vos données sont traitées, vous pouvez nous contacter : + +[NOM] +Offre de protection des données à +[COURRIEL] + +[NOM] [TITRE] +à +[COURRIEL] + +ou vous pouvez écrire à l'adresse suivante [] diff --git a/doc/gdpr1.md b/doc/gdpr1.md new file mode 100644 index 000000000..daa401a3d --- /dev/null +++ b/doc/gdpr1.md @@ -0,0 +1,114 @@ + +Privacy Notice May 2018 + +How your information will be used +================================= + +Information you provide to this website may be stored and used to provide services to you. + +We require an email address to idenitfy the account holder. This will not be shared with +any other website or service. It is used to send you notifications about your account and +perform administrative tasks such as resetting your password. You have the option to +opt-out of all email notifications through your settings. + +Communication channels created on this website require a name and a photo or avatar. A +default avatar will be chosen if you do not supply one. The name, avatar, and a link to +the channel webpage will be shared with other servers and services in order to refer to +this identity. The name does not need to be your real name and the photo or avatar does +not need to resemble you. + +All other information you supply to this website is optional. + +As a social communication and cloud storage service, you will usually be using this website +to share information with others. We provide a range of privacy options to allow you to +restrict this sharing to only those you choose. + + +Processing of your information +============================== + +Our processing of your information is limited to storing it for you to use. We MAY keep logs +of activity to help diagnose software issues and to maintain security of the system against +intrusion. These logs are routinely deleted after a few days. + +We MAY (if you have provided this permission) try to suggest frendships or connections based +on analysing publicly available information about your connections. This is currently the most +advanced data "processing" performed at this website. You may restrict access to this information +if this processing is undesired. + +If supplied, we MAY use your gender to formulate text messages in your native language, for +instance "Bob commented on HIS post." + +In all other cases, your data is stored under your desired privacy policy and to the best +of our ability is only shared with those who you have elected to share it with. + +We do not share your private information with third parties or analyse your behaviour or personal +characteristics. We have no advertisements or business relationships with advertisers. + +We MAY be asked or forced to divulge information provided by you in response to legitimate +criminal and legal proceedings. Where possible we will notify you if this happens. + + +Access to your information +========================== + +Some communications are shared with other websites. Those using the same software will usually +have similar privacy policies. + + +You may be shown embedded videos and provided links to visit other websites as part of your +day-to-day activities using this website. This MAY expose you to monitoring by external services, such +as (but not limited to) Facebook, Twitter, and Google. Each website operator is allowed to configure +whether or not embedded content is permitted. + +Further access to your personal data and stored files is under your control. + +Our storage of your data is provided under your implied consent through your continued use of +the service. You may withdraw this consent at any time and on account deletion we will remove +all data which belongs to you. The process of deletion may take several days as we also make a good faith +effort to delete it from any internetworked websites that have been provided a copy. + + +All data and files stored for a communications channel are available for you to +download for either archival puposes or to transfer to another compatible website. + + + +Your rights +=========== + +Under the General Data Protection Regulation +(GDPR) and The Data Protection Act 2018 +(DPA) you have a number of rights with regard to your personal data. +You have the right to request from us access to and rectification or erasure of your personal data, +the right to restrict processing, object to processing as well as in certain circumstances the right +to data portability. + +If you have provided consent for the processing of your data you have the right (in certain +circumstances) to withdraw that consent at any time which will not affect the lawfulness of +the processing before your consent was withdrawn. + +You have the right to lodge a complaint to the Information Commissioners’ Office if you +believe that we have not complied with the requirements of the GDPR or DPA 18 with regard +to your personal data. + +Identity and contact details of controller and data protection officer + +[NAME OF COMPANY] +is the controller +[and processor] +of data for the purposes of the DPA 18 and GDPR. 3 + +If you have any concerns as to how your data is processed you can contact: + +[ +[NAME] +Data Protection Offer at +[EMAIL ADDRESS] +] +[NAME] [JOB TITLE] +at +[EMAIL ADDRESS] +or you can write to these +individuals using the address of +[] diff --git a/doc/general.bb b/doc/general.bb index 8390aceb3..0b80db756 100644 --- a/doc/general.bb +++ b/doc/general.bb @@ -6,8 +6,8 @@ [h3]External resources[/h3] [zrl=[baseurl]/help/external-resource-links]List of external resources[/zrl] -[url=https://github.com/redmatrix/hubzilla]Main Website[/url] -[url=https://github.com/redmatrix/hubzilla-addons]Addon Website[/url] +[url=https://framagit.org/hubzilla/core/]Main Website[/url] +[url=https://framagit.org/hubzilla/addons]Addon Website[/url] [url=[baseurl]/help/credits]$Projectname Credits[/url] [h3]About this $Projectname hub[/h3] [zrl=[baseurl]/help/TermsOfService]Terms of Service For This Hub[/zrl] diff --git a/doc/git_for_non_developers.bb b/doc/git_for_non_developers.bb index 80c11024b..5fba17439 100644 --- a/doc/git_for_non_developers.bb +++ b/doc/git_for_non_developers.bb @@ -1,71 +1,71 @@ -[b]Git For Non-Developers[/b]
-
-So you're handling a translation, or you're contributing to a theme, and every time you make a pull request you have to talk to one of the developers before your changes can be merged in?
-
-Chances are, you just haven't found a quick how-to explaining how to keep things in sync on your end. It's really very easy.
-
-After you've created a fork of the repo (just click "fork" at github), you need to clone your own copy.
-
-For the sake of examples, we'll assume you're working on a theme called redexample (which does not exist).
-
-[code]git clone https://github.com/username/red.git[/code]
-
-Once you've done that, cd into the directory, and add an upstream.
-
-[code]
-cd red
-git remote add upstream https://github.com/redmatrix/hubzilla
-[/code]
-
-From now on, you can pull upstream changes with the command
-[code]git fetch upstream[/code]
-
-Before your changes can be merged automatically, you will often need to merge upstream changes.
-
-[code]
-git merge upstream/master
-[/code]
-
-You should always merge upstream before pushing any changes, and [i]must[/i] merge upstream with any pull requests to make them automatically mergeable.
-
-99% of the time, this will all go well. The only time it won't is if somebody else has been editing the same files as you - and often, only if they have been editing the same lines of the same files. If that happens, that would be a good time to request help until you get the hang of handling your own merge conflicts.
-
-Then you just need to add your changes [code]git add view/theme/redexample/[/code]
-
-This will add all the files in view/theme/redexample and any subdirectories. If your particular files are mixed throughout the code, you should add one at a time. Try not to do git add -a, as this will add everything, including temporary files (we mostly, but not always catch those with a .gitignore) and any local changes you have, but did not intend to commit.
-
-Once you have added all the files you have changed, you need to commit them. [code]git commit[/code]
-
-This will open up an editor where you can describe the changes you have made. Save this file, and exit the editor.
-
-Finally, push the changes to your own git
-[code]git push[/code]
-
-And that's it, your repo is up to date!
-
-All you need to do now is actually create the pull request. There are two ways to do this.
-
-The easy way, if you're using Github is to simply click the green button at the top of your own copy of the repository, enter a description of the changes, and click 'create pull request'. The
-main repository, themes, and addons all have their main branch at Github, so this method can be used most of the time.
-
-Most people can stop here.
-
-Some projects in the extended RedMatrix ecosphere have no Github presence, to pull request these is a bit different - you'll have to create your pull request manually. Fortunately, this isn't
-much harder.
-
-[code]git request-pull -p <start> <url>[/code]
-
-Start is the name of a commit to start at. This must exist upstream. Normally, you just want master.
-
-URL is the URL of [i]your[/i] repo.
-
-One can also specify <end>. This defaults to HEAD.
-
-Example:
-[code]
-git request-pull master https://example.com/project
-[/code]
-
-And simply send the output to the project maintainer.
-
-#include doc/macros/main_footer.bb;
+[b]Git For Non-Developers[/b] + +So you're handling a translation, or you're contributing to a theme, and every time you make a pull request you have to talk to one of the developers before your changes can be merged in? + +Chances are, you just haven't found a quick how-to explaining how to keep things in sync on your end. It's really very easy. + +After you've created a fork of the repo (just click "fork" at github), you need to clone your own copy. + +For the sake of examples, we'll assume you're working on a theme called redexample (which does not exist). + +[code]git clone https://github.com/username/red.git[/code] + +Once you've done that, cd into the directory, and add an upstream. + +[code] +cd red +git remote add upstream https://framagit.org/hubzilla/core/ +[/code] + +From now on, you can pull upstream changes with the command +[code]git fetch upstream[/code] + +Before your changes can be merged automatically, you will often need to merge upstream changes. + +[code] +git merge upstream/master +[/code] + +You should always merge upstream before pushing any changes, and [i]must[/i] merge upstream with any pull requests to make them automatically mergeable. + +99% of the time, this will all go well. The only time it won't is if somebody else has been editing the same files as you - and often, only if they have been editing the same lines of the same files. If that happens, that would be a good time to request help until you get the hang of handling your own merge conflicts. + +Then you just need to add your changes [code]git add view/theme/redexample/[/code] + +This will add all the files in view/theme/redexample and any subdirectories. If your particular files are mixed throughout the code, you should add one at a time. Try not to do git add -a, as this will add everything, including temporary files (we mostly, but not always catch those with a .gitignore) and any local changes you have, but did not intend to commit. + +Once you have added all the files you have changed, you need to commit them. [code]git commit[/code] + +This will open up an editor where you can describe the changes you have made. Save this file, and exit the editor. + +Finally, push the changes to your own git +[code]git push[/code] + +And that's it, your repo is up to date! + +All you need to do now is actually create the pull request. There are two ways to do this. + +The easy way, if you're using Github is to simply click the green button at the top of your own copy of the repository, enter a description of the changes, and click 'create pull request'. The +main repository, themes, and addons all have their main branch at Github, so this method can be used most of the time. + +Most people can stop here. + +Some projects in the extended RedMatrix ecosphere have no Github presence, to pull request these is a bit different - you'll have to create your pull request manually. Fortunately, this isn't +much harder. + +[code]git request-pull -p <start> <url>[/code] + +Start is the name of a commit to start at. This must exist upstream. Normally, you just want master. + +URL is the URL of [i]your[/i] repo. + +One can also specify <end>. This defaults to HEAD. + +Example: +[code] +git request-pull master https://example.com/project +[/code] + +And simply send the output to the project maintainer. + +#include doc/macros/main_footer.bb; diff --git a/doc/intro_for_developers.bb b/doc/intro_for_developers.bb index 99dd8f8f3..6ef7a4d9e 100644 --- a/doc/intro_for_developers.bb +++ b/doc/intro_for_developers.bb @@ -1,113 +1,113 @@ -[b]$Projectname Developer Guide[/b]
-
-[b]File system layout:[/b]
-
-[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
-
-[b]The Database:[/b]
-
- [li]abook - contact table, replaces Friendica 'contact'[/li]
- [li]account - service provider account[/li]
- [li]addon - registered plugins[/li]
- [li]app - peronal app data[/li]
- [li]attach - file attachments[/li]
- [li]auth_codes - OAuth usage[/li]
- [li]cache - OEmbed cache[/li]
- [li]channel - replaces Friendica 'user'[/li]
- [li]chat - chat room content[/li]
- [li]chatpresence - channel presence information for chat[/li]
- [li]chatroom - data for the actual chat room[/li]
- [li]clients - OAuth usage[/li]
- [li]config - main configuration storage[/li]
- [li]conv - Diaspora private messages[/li]
- [li]event - Events[/li]
- [li]fcontact - friend suggestion stuff[/li]
- [li]ffinder - friend suggestion stuff[/li]
- [li]fserver - obsolete[/li]
- [li]fsuggest - friend suggestion stuff[/li]
- [li]groups - privacy groups[/li]
- [li]group_member - privacy groups[/li]
- [li]hook - plugin hook registry[/li]
- [li]hubloc - Red location storage, ties a location to an xchan[/li]
- [li]item - posts[/li]
- [li]item_id - other identifiers on other services for posts[/li]
- [li]likes - likes of 'things'[/li]
- [li]mail - private messages[/li]
- [li]menu - channel menu data[/li]
- [li]menu_item - items uses by channel menus[/li]
- [li]notify - notifications[/li]
- [li]notify-threads - need to factor this out and use item thread info on notifications[/li]
- [li]obj - object data for things (x has y)[/li]
- [li]outq - output queue[/li]
- [li]pconfig - personal (per channel) configuration storage[/li]
- [li]photo - photo storage[/li]
- [li]poll - data for polls[/li]
- [li]poll_elm - data for poll elements[/li]
- [li]profdef - custom profile field definitions[/li]
- [li]profext - custom profile field data[/li]
- [li]profile - channel profiles[/li]
- [li]profile_check - DFRN remote auth use, may be obsolete[/li]
- [li]register - registrations requiring admin approval[/li]
- [li]session - web session storage[/li]
- [li]shares - shared item information[/li]
- [li[sign - Diaspora signatures. To be phased out.[/li]
- [li]site - site table to find directory peers[/li]
- [li]source - channel sources data[/li]
- [li]spam - unfinished[/li]
- [li]sys_perms - extensible permissions for the sys channel[/li]
- [li]term - item taxonomy (categories, tags, etc.) table[/li]
- [li]tokens - OAuth usage[/li]
- [li]updates - directory sync updates[/li]
- [li]verify - general purpose verification structure[/li]
- [li]vote - vote data for polls[/li]
- [li]xchan - replaces 'gcontact', list of known channels in the universe[/li]
- [li]xchat - bookmarked chat rooms[/li]
- [li]xconfig - as pconfig but for channels with no local account[/li]
- [li]xlink - "friends of friends" linkages derived from poco[/li]
- [li]xprof - if this hub is a directory server, contains basic public profile info of everybody in the network[/li]
- [li]xtag - if this hub is a directory server, contains tags or interests of everybody in the network[/li]
-
-
-[b]How to theme $Projectname - by Olivier Migeot[/b]
-
-This is a short documentation on what I found while trying to modify $Projectname'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.
-
-#include doc/macros/main_footer.bb;
+[b]$Projectname Developer Guide[/b] + +[b]File system layout:[/b] + +[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 + +[b]The Database:[/b] + + [li]abook - contact table, replaces Friendica 'contact'[/li] + [li]account - service provider account[/li] + [li]addon - registered plugins[/li] + [li]app - peronal app data[/li] + [li]attach - file attachments[/li] + [li]auth_codes - OAuth usage[/li] + [li]cache - OEmbed cache[/li] + [li]channel - replaces Friendica 'user'[/li] + [li]chat - chat room content[/li] + [li]chatpresence - channel presence information for chat[/li] + [li]chatroom - data for the actual chat room[/li] + [li]clients - OAuth usage[/li] + [li]config - main configuration storage[/li] + [li]conv - Diaspora private messages[/li] + [li]event - Events[/li] + [li]fcontact - friend suggestion stuff[/li] + [li]ffinder - friend suggestion stuff[/li] + [li]fserver - obsolete[/li] + [li]fsuggest - friend suggestion stuff[/li] + [li]groups - privacy groups[/li] + [li]group_member - privacy groups[/li] + [li]hook - plugin hook registry[/li] + [li]hubloc - Red location storage, ties a location to an xchan[/li] + [li]item - posts[/li] + [li]item_id - other identifiers on other services for posts[/li] + [li]likes - likes of 'things'[/li] + [li]mail - private messages[/li] + [li]menu - channel menu data[/li] + [li]menu_item - items uses by channel menus[/li] + [li]notify - notifications[/li] + [li]notify-threads - need to factor this out and use item thread info on notifications[/li] + [li]obj - object data for things (x has y)[/li] + [li]outq - output queue[/li] + [li]pconfig - personal (per channel) configuration storage[/li] + [li]photo - photo storage[/li] + [li]poll - data for polls[/li] + [li]poll_elm - data for poll elements[/li] + [li]profdef - custom profile field definitions[/li] + [li]profext - custom profile field data[/li] + [li]profile - channel profiles[/li] + [li]profile_check - DFRN remote auth use, may be obsolete[/li] + [li]register - registrations requiring admin approval[/li] + [li]session - web session storage[/li] + [li]shares - shared item information[/li] + [li[sign - Diaspora signatures. To be phased out.[/li] + [li]site - site table to find directory peers[/li] + [li]source - channel sources data[/li] + [li]spam - unfinished[/li] + [li]sys_perms - extensible permissions for the sys channel[/li] + [li]term - item taxonomy (categories, tags, etc.) table[/li] + [li]tokens - OAuth usage[/li] + [li]updates - directory sync updates[/li] + [li]verify - general purpose verification structure[/li] + [li]vote - vote data for polls[/li] + [li]xchan - replaces 'gcontact', list of known channels in the universe[/li] + [li]xchat - bookmarked chat rooms[/li] + [li]xconfig - as pconfig but for channels with no local account[/li] + [li]xlink - "friends of friends" linkages derived from poco[/li] + [li]xprof - if this hub is a directory server, contains basic public profile info of everybody in the network[/li] + [li]xtag - if this hub is a directory server, contains tags or interests of everybody in the network[/li] + + +[b]How to theme $Projectname - by Olivier Migeot[/b] + +This is a short documentation on what I found while trying to modify $Projectname'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. + +#include doc/macros/main_footer.bb; diff --git a/doc/member/bbcode.html b/doc/member/bbcode.html index 9b7080a32..e3e079b4d 100644 --- a/doc/member/bbcode.html +++ b/doc/member/bbcode.html @@ -193,7 +193,7 @@ If a rendering plugin is not installed or an unsupported language is specified, <td><code>[url=https://hubzilla.org]Hubzilla[/url]</code></td><td><a href="https://hubzilla.org" target="_blank">Hubzilla</a></td> </tr> <tr> - <td><code>An image [img]url/of/image.jpg[/img] + <td><code>An image [img]https://example.org/image.jpg[/img] in some text </code></td><td> An image <img src="/images/default_profile_photos/rainbow_man/48.jpg" alt="Image/photo"> in some text </td> @@ -315,17 +315,17 @@ Create a table of content in a webpage or wiki page. Please refer to the <a href The observer will be returned to their home hub to enter a post with the specified title and body. Both are optional</td><td><a href="[baseurl]/rpost?f=&title=title&body=Text+to+post" target="_blank">[baseurl]/rpost?f=&title=title&body=Text+to+post</a></td> </tr> <tr> - <td>This requires the <a href="https://github.com/redmatrix/hubzilla-addons/tree/master/qrator"><strong>qrator</strong></a> plugin.<br><code>[qr]text to post[/qr]</code></td><td><img src="/doc/member/assets/qr_text_to_post.png"></td> + <td>This requires the <a href="https://framagit.org/hubzilla/addons/tree/master/qrator"><strong>qrator</strong></a> plugin.<br><code>[qr]text to post[/qr]</code></td><td><img src="/doc/member/assets/qr_text_to_post.png"></td> </tr> <tr> - <td>This requires a suitable map plugin such as <strong><a href="https://github.com/redmatrix/hubzilla-addons/tree/master/openstreetmap">openstreetmap</a></strong>. + <td>This requires a suitable map plugin such as <strong><a href="https://framagit.org/hubzilla/addons/tree/master/openstreetmap">openstreetmap</a></strong>. <code>[map]</code></td><td>Generate an inline map using the current browser coordinates of the poster, if browser location is enabled</td> </tr> <tr> - <td>This requires a suitable map plugin such as <strong><a href="https://github.com/redmatrix/hubzilla-addons/tree/master/openstreetmap">openstreetmap</a></strong>. + <td>This requires a suitable map plugin such as <strong><a href="https://framagit.org/hubzilla/addons/tree/master/openstreetmap">openstreetmap</a></strong>. <code>[map=latitude,longitude]</code></td><td>Generate a map using global coordinates.</td></tr> <tr> - <td>This requires a suitable map plugin such as <strong><a href="https://github.com/redmatrix/hubzilla-addons/tree/master/openstreetmap">openstreetmap</a></strong>. + <td>This requires a suitable map plugin such as <strong><a href="https://framagit.org/hubzilla/addons/tree/master/openstreetmap">openstreetmap</a></strong>. <code>[map]Place Name[/map]</code></td><td> Generate a map for a given named location. The first matching location is returned. For instance "Sydney" will usually return Sydney, Australia and not Sydney, Nova Scotia, Canada unless the more precise location is specified. It is highly recommended to use the post preview utility to ensure you have the correct location before submitting the post. </td> diff --git a/doc/member/member_guide.bb b/doc/member/member_guide.bb index e36e1c497..2b772d1c5 100644 --- a/doc/member/member_guide.bb +++ b/doc/member/member_guide.bb @@ -203,7 +203,7 @@ Some communications offer more than one protocol. If you wish to connect with so [ostatus]foobar@foo.bar [diaspora]foobar@foo.bar [zot]foobar@foo.bar -[rss]https://foo.bar/foobar +[feed]https://foo.bar/foobar [/code] @@ -359,7 +359,7 @@ The [b]![/b] character designates a deliverable mention to a forum or special ch !Gardening - mention the Gardening Forum and also post to the Gardening "network" (e.g. send to all the forum members; if you have permission to do so) [/code] -Note: In previous releases, forums were delivered by using @forum+ with a plus sign at the end. This mechanism is still used occasionally but is deprecated and !forum is now preferred. +Note: In previous releases, forums were delivered by using @forum+ with a plus sign at the end. This mechanism is no longer supported. [h4]Private Mentions[/h4] If you wish to restrict a post to a single person or a number of people, you can do this by selecting channels or privacy groups from the privacy tool. You can also just tag them with a privacy tag. A privacy tag is a name preceded by the two characters @! - and in addition to tagging these channels, will also change the privacy permissions of the post to only include them. You can have more than one privacy tag, for instance @!bob and @!linda will send the post only to Bob and Linda. This mechanism over-rides the privacy selector. @@ -374,26 +374,26 @@ The above mechanisms only apply to "top-level" posts you create. Mentioning a ch [h4]Topical Tags (also known as Hashtags)[/h4] Topical tags are indicated by preceding the tag name with the # character. This will create a link in the post to a generalised site search for the term provided. For example, #[zrl=[baseurl]/search?tag=cars]cars[/zrl] will provide a search link for all posts mentioning 'cars' on your site. Topical tags are generally a minimum of three characters in length. Shorter search terms are not likely to yield any search results, although this depends on the database configuration. -Topical tags are also not linked if they are purely numeric, e.g. #1. If you wish to use a numeric hashtag, please add some descriptive text such as #2012-elections. +Topical tags are also not normally linked if they are purely numeric, e.g. #1. If you wish to use a numeric hashtag, please add some descriptive text such as #2012-elections or enclose the entire tag in double quotes (for example #"2012"). Doubles quotes are also required if the tag contains spaces (#"My Tag") and may be required if the tag contains punctuation characters (#"EndsWithPeriod." or #"Exciting!!!"). [h4]Bookmarks[/h4] Bookmarks indicate a link which can be saved to your bookmark folder. They use the sequence #^ followed by the link. Often these are generated automatically. If the 'bookmarker' addon is installed, this sequence will be converted to a bookmark icon when viewing the post or comment online, and clicking the icon will save the bookmark. If the bookmarker addon is not installed, the post 'dropdown menu' contains a link for saving the bookmark or bookmarks. -[h4]Spaces in Tags and Mentions[/h4] +[h4]Manual Mentions[/h4] Where possible please use the auto-complete window to select tag and mention recipients, because it will generate a coded tag which uniquely identifies one channel. Names are sometimes ambiguous. However, you can "manually" tag a channel by matching the channel name or address. [code] -@Robert Johnson +@billy [/code] -will tag Robert Johnson, but we can only match one space. If the name was "Blind Lemon Jefferson" it won't be found unless you enclose the entire name in double quotes or change the spaces to underscores. +will tag a connection whose name or network address is 'billy' (exact match). If you have two connections with a name or network address of billy, for instance billy@server1.hubzilla.org and billy@server2.hubzilla2.org, you will need to supply the complete address or the results will be ambiguous and the wrong person may be tagged. [code] -@"Blind Lemon Jefferson" -@Blind_Lemon_Jefferson +@"Robert Johnson" [/code] -are both equivalent. +will tag Robert Johnson. The double quotes are required if the tagged name contains space characters. + [h3]Web Pages[/h3] diff --git a/doc/plugins.bb b/doc/plugins.bb index a320de790..3aecc458f 100644 --- a/doc/plugins.bb +++ b/doc/plugins.bb @@ -1,312 +1,312 @@ -[b]Plugins[/b]
-
-So you want to make $Projectname do something it doesn't already do. There are lots of ways. But let's learn how to write a plugin or addon.
-
-
-In your $Projectname folder/directory, you will probably see a sub-directory called 'addon'. If you don't have one already, go ahead and create it.
-[code]
- mkdir addon
-[/code]
-Then figure out a name for your addon. You probably have at least a vague idea of what you want it to do. For our example I'm going to create a plugin called 'randplace' that provides a somewhat random location for each of your posts. The name of your plugin is used to find the functions we need to access and is part of the function names, so to be safe, use only simple text characters.
-
-Once you've chosen a name, create a directory beneath 'addon' to hold your working file or files.
-[code]
- mkdir addon/randplace
-[/code]
-Now create your plugin file. It needs to have the same name, and it's a PHP script, so using your favourite editor, create the file
-[code]
- addon/randplace/randplace.php
-[/code]
-The very first line of this file needs to be
-[code]
- <?php
-[/code]
-Then we're going to create a comment block to describe the plugin. There's a special format for this. We use /* ... */ comment-style and some tagged lines consisting of
-[code]
- /**
- *
- * Name: Random Place (here you can use better descriptions than you could in the filename)
- * Description: Sample $Projectname plugin, Sets a random place when posting.
- * Version: 1.0
- * Author: Mike Macgirvin <mike@zothub.com>
- *
- */
-[/code]
-These tags will be seen by the site administrator when he/she installs or manages plugins from the admin panel. There can be more than one author. Just add another line starting with 'Author:'.
-
-The typical plugin will have at least the following functions:
-[code]
- pluginname_load()
- pluginname_unload()
-[/code]
-In our case, we'll call them randplace_load() and randplace_unload(), as that is the name of our plugin. These functions are called whenever we wish to either initialise the plugin or remove it from the current webpage. Also if your plugin requires things like altering the database schema before it can run for the very first time, you would likely place these instructions in the functions named
-[code]
- pluginname_install()
- pluginname_uninstall()
-[/code]
-
-Next we'll talk about [b]hooks[/b]. Hooks are places in $Projectname code where we allow plugins to do stuff. There are a [url=[baseurl]/help/hooklist]lot of these[/url], and they each have a name. What we normally do is use the pluginname_load() function to register a "handler function" for any hooks you are interested in. Then when any of these hooks are triggered, your code will be called.
-
-We register hook handlers with the 'Zotlabs\Extend\Hook::register()' function. It typically takes 3 arguments. The first is the hook we wish to catch, the second is the filename of the file to find our handler function (relative to the base of your $Projectname installation), and the third is the function name of your handler function. So let's create our randplace_load() function right now.
-
-[code]
- function randplace_load() {
- Zotlabs\Extend\Hook::register('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
-
- Zotlabs\Extend\Hook::register('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings');
- Zotlabs\Extend\Hook::register('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
-
- }
-[/code]
-
-So we're going to catch three events, 'post_local' which is triggered when a post is made on the local system, 'feature_settings' to set some preferences for our plugin, and 'feature_settings_post' to store those settings.
-
-Next we'll create an unload function. This is easy, as it just unregisters our hooks. It takes exactly the same arguments.
-[code]
- function randplace_unload() {
- Zotlabs\Extend\Hook::unregister('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
-
- Zotlabs\Extend\Hook::unregister('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings');
- Zotlabs\Extend\Hook::unregister('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
- }
-[/code]
-
-Hooks are always called with one argument which is specific to the hook you're calling. It contains information relevant to that particular place in the program, and often allows you to look at, and even change it. In order to change it, you need to add '&' to the variable name so it is passed to your function by reference. Otherwise it will create a copy and any changes you make will be lost when the hook process returns. Usually (but not always) the passed data is a named array of data structures. Please see the "hook reference" (not yet written as of this date) for details on any specific hook. Occasionally you may need to view the program source to see precisely how a given hook is called and how the results are processed.
-
-Let's go ahead and add some code to implement our post_local hook handler.
-[code]
- function randplace_post_hook(&$item) {
-
- /**
- *
- * An item was posted on the local system.
- * We are going to look for specific items:
- * - A status post by a profile owner
- * - The profile owner must have allowed our plugin
- *
- */
-
- logger('randplace invoked');
-
- if(! local_channel()) /* non-zero if this is a logged in user of this system */
- return;
-
- if(local_channel() != $item['uid']) /* Does this person own the post? */
- return;
-
- if(($item['parent']) || (! is_item_normal($item))) {
- /* If the item has a parent, or is not "normal", this is a comment or something else, not a status post. */
- return;
- }
-
- /* Retrieve our personal config setting */
-
- $active = get_pconfig(local_channel(), 'randplace', 'enable');
-
- if(! $active)
- return;
- /**
- *
- * OK, we're allowed to do our stuff.
- * Here's what we are going to do:
- * load the list of timezone names, and use that to generate a list of world cities.
- * Then we'll pick one of those at random and put it in the "location" field for the post.
- *
- */
-
- $cities = array();
- $zones = timezone_identifiers_list();
- foreach($zones as $zone) {
- if((strpos($zone,'/')) && (! stristr($zone,'US/')) && (! stristr($zone,'Etc/')))
- $cities[] = str_replace('_', ' ',substr($zone,strpos($zone,'/') + 1));
- }
-
- if(! count($cities))
- return;
- $city = array_rand($cities,1);
- $item['location'] = $cities[$city];
-
- return;
- }
-[/code]
-
-Now let's add our functions to create and store preference settings.
-[code]
- /**
- *
- * Callback from the settings post function.
- * $post contains the global $_POST array.
- * We will make sure we've got a valid user account
- * and that only our own submit button was clicked
- * and if so set our configuration setting for this person.
- *
- */
-
- function randplace_settings_post($post) {
- if(! local_channel())
- return;
- if($_POST['randplace-submit'])
- set_pconfig(local_channel(),'randplace','enable',intval($_POST['randplace']));
- }
-
-
-
- /**
- *
- * Called from the Feature Setting form.
- * The second argument is a string in this case, the HTML content region of the page.
- * Add our own settings info to the string.
- *
- * For uniformity of settings pages, we use the following convention
- * <div class="settings-block">
- * <h3>title</h3>
- * .... settings html - many elements will be floated...
- * <div class="clear"></div> <!-- generic class which clears all floats -->
- * <input type="submit" name="pluginnname-submit" class="settings-submit" ..... />
- * </div>
- */
-
-
-
- function randplace_settings(&$s) {
-
- if(! local_channel())
- return;
-
- /* Add our stylesheet to the page so we can make our settings look nice */
-
- head_add_css(/addon/randplace/randplace.css');
-
- /* Get the current state of our config variable */
-
- $enabled = get_pconfig(local_channel(),'randplace','enable');
-
- $checked = (($enabled) ? ' checked="checked" ' : '');
-
- /* Add some HTML to the existing form */
-
- $s .= '<div class="settings-block">';
- $s .= '<h3>' . t('Randplace Settings') . '</h3>';
- $s .= '<div id="randplace-enable-wrapper">';
- $s .= '<label id="randplace-enable-label" for="randplace-checkbox">' . t('Enable Randplace Plugin') . '</label>';
- $s .= '<input id="randplace-checkbox" type="checkbox" name="randplace" value="1" ' . $checked . '/>';
- $s .= '</div><div class="clear"></div>';
-
- /* provide a submit button */
-
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="randplace-submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>';
-
- }
-
-[/code]
-
-
-
-[h2]Advanced Plugins[/h2]
-
-Sometimes your plugins want to provide a range of new functionality which isn't provided at all or is clumsy to provide using hooks. In this case your plugin can also act as a 'module'. A module in our case refers to a structured webpage handler which responds to a given URL. Then anything which accesses that URL will be handled completely by your plugin.
-
-There are two ways to accomplish this. To create a module object use the following model:
-[code]
-<?php /* file: addon/randplace/Mod_Randplace.php */
-namespace Zotlabs\Module;
-
- // Your module will consist of the name of your addon with an uppercase first character, within the Zotlabs\Module namespace
- // To avoid namespace conflicts with your plugin, the convention we're using is to name the module file Mod_Addonname.php
- // In this case 'Mod_Randplace.php' and then include it from within your main plugin file 'randplace.php' with the line:
- //
- // require_once('addon/randplace/Mod_Randplace.php');
-
- class Randplace extends \Zotlabs\Web\Controller {
- function init() {
- // init method is always called first if it exists
- }
- function post() {
- // the post method is only called if there are $_POST variables present (e.g. the page request method is "post")
- }
- function get() {
- // The get method is used to display normal content on the page
- // whatever this function returns will be displayed in the page body
- }
- }
-[/code]
-
-The other option is to use a procedural interface. The $a argument to these function is obsolete, but must be present.
-The key to this is to create a simple function named pluginname_module() which does nothing. These lines and this interface
-can be used inside your addon file without causing a namespace conflict, as the object method will.
-
-[code]
- function randplace_module() { return; }
-[/code]
-Once this function exists, the URL #^[url=https://yoursite/randplace]https://yoursite/randplace[/url] will access your plugin as a module. Then you can define functions which are called at various points to return or process a structured webpage just like system modules. The typical functions and the order which they are called is
-[code]
- modulename_init($a) // (e.g. randplace_init($a);) called first - if you wish to emit json or xml,
- // you should do it here, followed by killme() which will avoid the default action of building a webpage
- modulename_post($a) // Called whenever the page is accessed via the "post" method
- modulename_content($a) // called to generate the central page content. This function should return a string
- // consisting of the central page content.
-[/code]
-Your module functions have access to the URL path as if they were standalone programs in the Unix operating system. For instance if you visit the page
-[code]
- https://yoursite/randplace/something/somewhere/whatever
-[/code]
-we will create an argc/argv list for use by your module functions
-[code]
- $x = argc(); // $x will be 4, the number of path arguments after the sitename
-
- for($x = 0; $x < argc(); $x ++)
- echo $x . ' ' . argv($x);
-
-
- 0 randplace
- 1 something
- 2 somewhere
- 3 whatever
-[/code]
-
-[h3]Using class methods as hook handler functions[/h3]
-
-To register a hook using a class method as a callback, a couple of things need to be considered. The first is that the functions need to be declared static public so that they are available from all contexts, and they need to have a namespace attached because they can be called from within multiple namespaces. You can then register them as strings or arrays (using the PHP internal calling method).
-
-[code]
-<?php
-/*
- * plugin info block goes here
- */
-
-function myplugin_load() {
- Zotlabs\Extend\Hook::register('hook_name','addon/myplugin/myplugin.php','\\Myplugin::foo');
-[b]or[/b]
- Zotlabs\Extend\Hook::register('hook_name','addon/myplugin/myplugin.php',array('\\Myplugin','foo'));
-}
-
-class Myplugin {
-
- public static function foo($params) {
- // handler for 'hook_name'
- }
-}
-[/code]
-
-If you want to keep your plugin hidden from the siteinfo page, simply create a file called '.hidden' in your addon directory
-[code]
- touch addon/<addon name>/.hidden
-[/code]
-
-***Porting Friendica Plugins***
-
-$Projectname uses a similar plugin architecture to the Friendica project. The authentication, identity, and permissions systems are completely different. Many Friendica can be ported reasonably easily by renaming a few functions - and then ensuring that the permissions model is adhered to. The functions which need to be renamed are:
-
-[li] Friendica's pluginname_install() is pluginname_load()[/li]
-
-[li] Friendica's pluginname_uninstall() is pluginname_unload()[/li]
-
-$Projectname has _install and _uninstall functions but these are used differently.
-
-[li] Friendica's "plugin_settings" hook is called "feature_settings"[/li]
-
-[li] Friendica's "plugin_settings_post" hook is called "feature_settings_post"[/li]
-
-Changing these will often allow your plugin to function, but please double check all your permission and identity code because the concepts behind it are completely different in $Projectname. Many structured data names (especially DB schema columns) are also quite different.
-
-#include doc/macros/main_footer.bb;
+[b]Plugins[/b] + +So you want to make $Projectname do something it doesn't already do. There are lots of ways. But let's learn how to write a plugin or addon. + + +In your $Projectname folder/directory, you will probably see a sub-directory called 'addon'. If you don't have one already, go ahead and create it. +[code] + mkdir addon +[/code] +Then figure out a name for your addon. You probably have at least a vague idea of what you want it to do. For our example I'm going to create a plugin called 'randplace' that provides a somewhat random location for each of your posts. The name of your plugin is used to find the functions we need to access and is part of the function names, so to be safe, use only simple text characters. + +Once you've chosen a name, create a directory beneath 'addon' to hold your working file or files. +[code] + mkdir addon/randplace +[/code] +Now create your plugin file. It needs to have the same name, and it's a PHP script, so using your favourite editor, create the file +[code] + addon/randplace/randplace.php +[/code] +The very first line of this file needs to be +[code] + <?php +[/code] +Then we're going to create a comment block to describe the plugin. There's a special format for this. We use /* ... */ comment-style and some tagged lines consisting of +[code] + /** + * + * Name: Random Place (here you can use better descriptions than you could in the filename) + * Description: Sample $Projectname plugin, Sets a random place when posting. + * Version: 1.0 + * Author: Mike Macgirvin <mike@zothub.com> + * + */ +[/code] +These tags will be seen by the site administrator when he/she installs or manages plugins from the admin panel. There can be more than one author. Just add another line starting with 'Author:'. + +The typical plugin will have at least the following functions: +[code] + pluginname_load() + pluginname_unload() +[/code] +In our case, we'll call them randplace_load() and randplace_unload(), as that is the name of our plugin. These functions are called whenever we wish to either initialise the plugin or remove it from the current webpage. Also if your plugin requires things like altering the database schema before it can run for the very first time, you would likely place these instructions in the functions named +[code] + pluginname_install() + pluginname_uninstall() +[/code] + +Next we'll talk about [b]hooks[/b]. Hooks are places in $Projectname code where we allow plugins to do stuff. There are a [url=[baseurl]/help/hooklist]lot of these[/url], and they each have a name. What we normally do is use the pluginname_load() function to register a "handler function" for any hooks you are interested in. Then when any of these hooks are triggered, your code will be called. + +We register hook handlers with the 'Zotlabs\Extend\Hook::register()' function. It typically takes 3 arguments. The first is the hook we wish to catch, the second is the filename of the file to find our handler function (relative to the base of your $Projectname installation), and the third is the function name of your handler function. So let's create our randplace_load() function right now. + +[code] + function randplace_load() { + Zotlabs\Extend\Hook::register('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook'); + + Zotlabs\Extend\Hook::register('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings'); + Zotlabs\Extend\Hook::register('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post'); + + } +[/code] + +So we're going to catch three events, 'post_local' which is triggered when a post is made on the local system, 'feature_settings' to set some preferences for our plugin, and 'feature_settings_post' to store those settings. + +Next we'll create an unload function. This is easy, as it just unregisters our hooks. It takes exactly the same arguments. +[code] + function randplace_unload() { + Zotlabs\Extend\Hook::unregister('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook'); + + Zotlabs\Extend\Hook::unregister('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings'); + Zotlabs\Extend\Hook::unregister('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post'); + } +[/code] + +Hooks are always called with one argument which is specific to the hook you're calling. It contains information relevant to that particular place in the program, and often allows you to look at, and even change it. In order to change it, you need to add '&' to the variable name so it is passed to your function by reference. Otherwise it will create a copy and any changes you make will be lost when the hook process returns. Usually (but not always) the passed data is a named array of data structures. Please see the "hook reference" (not yet written as of this date) for details on any specific hook. Occasionally you may need to view the program source to see precisely how a given hook is called and how the results are processed. + +Let's go ahead and add some code to implement our post_local hook handler. +[code] + function randplace_post_hook(&$item) { + + /** + * + * An item was posted on the local system. + * We are going to look for specific items: + * - A status post by a profile owner + * - The profile owner must have allowed our plugin + * + */ + + logger('randplace invoked'); + + if(! local_channel()) /* non-zero if this is a logged in user of this system */ + return; + + if(local_channel() != $item['uid']) /* Does this person own the post? */ + return; + + if(($item['parent']) || (! is_item_normal($item))) { + /* If the item has a parent, or is not "normal", this is a comment or something else, not a status post. */ + return; + } + + /* Retrieve our personal config setting */ + + $active = get_pconfig(local_channel(), 'randplace', 'enable'); + + if(! $active) + return; + /** + * + * OK, we're allowed to do our stuff. + * Here's what we are going to do: + * load the list of timezone names, and use that to generate a list of world cities. + * Then we'll pick one of those at random and put it in the "location" field for the post. + * + */ + + $cities = array(); + $zones = timezone_identifiers_list(); + foreach($zones as $zone) { + if((strpos($zone,'/')) && (! stristr($zone,'US/')) && (! stristr($zone,'Etc/'))) + $cities[] = str_replace('_', ' ',substr($zone,strpos($zone,'/') + 1)); + } + + if(! count($cities)) + return; + $city = array_rand($cities,1); + $item['location'] = $cities[$city]; + + return; + } +[/code] + +Now let's add our functions to create and store preference settings. +[code] + /** + * + * Callback from the settings post function. + * $post contains the global $_POST array. + * We will make sure we've got a valid user account + * and that only our own submit button was clicked + * and if so set our configuration setting for this person. + * + */ + + function randplace_settings_post($post) { + if(! local_channel()) + return; + if($_POST['randplace-submit']) + set_pconfig(local_channel(),'randplace','enable',intval($_POST['randplace'])); + } + + + + /** + * + * Called from the Feature Setting form. + * The second argument is a string in this case, the HTML content region of the page. + * Add our own settings info to the string. + * + * For uniformity of settings pages, we use the following convention + * <div class="settings-block"> + * <h3>title</h3> + * .... settings html - many elements will be floated... + * <div class="clear"></div> <!-- generic class which clears all floats --> + * <input type="submit" name="pluginnname-submit" class="settings-submit" ..... /> + * </div> + */ + + + + function randplace_settings(&$s) { + + if(! local_channel()) + return; + + /* Add our stylesheet to the page so we can make our settings look nice */ + + head_add_css(/addon/randplace/randplace.css'); + + /* Get the current state of our config variable */ + + $enabled = get_pconfig(local_channel(),'randplace','enable'); + + $checked = (($enabled) ? ' checked="checked" ' : ''); + + /* Add some HTML to the existing form */ + + $s .= '<div class="settings-block">'; + $s .= '<h3>' . t('Randplace Settings') . '</h3>'; + $s .= '<div id="randplace-enable-wrapper">'; + $s .= '<label id="randplace-enable-label" for="randplace-checkbox">' . t('Enable Randplace Plugin') . '</label>'; + $s .= '<input id="randplace-checkbox" type="checkbox" name="randplace" value="1" ' . $checked . '/>'; + $s .= '</div><div class="clear"></div>'; + + /* provide a submit button */ + + $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="randplace-submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>'; + + } + +[/code] + + + +[h2]Advanced Plugins[/h2] + +Sometimes your plugins want to provide a range of new functionality which isn't provided at all or is clumsy to provide using hooks. In this case your plugin can also act as a 'module'. A module in our case refers to a structured webpage handler which responds to a given URL. Then anything which accesses that URL will be handled completely by your plugin. + +There are two ways to accomplish this. To create a module object use the following model: +[code] +<?php /* file: addon/randplace/Mod_Randplace.php */ +namespace Zotlabs\Module; + + // Your module will consist of the name of your addon with an uppercase first character, within the Zotlabs\Module namespace + // To avoid namespace conflicts with your plugin, the convention we're using is to name the module file Mod_Addonname.php + // In this case 'Mod_Randplace.php' and then include it from within your main plugin file 'randplace.php' with the line: + // + // require_once('addon/randplace/Mod_Randplace.php'); + + class Randplace extends \Zotlabs\Web\Controller { + function init() { + // init method is always called first if it exists + } + function post() { + // the post method is only called if there are $_POST variables present (e.g. the page request method is "post") + } + function get() { + // The get method is used to display normal content on the page + // whatever this function returns will be displayed in the page body + } + } +[/code] + +The other option is to use a procedural interface. The $a argument to these function is obsolete, but must be present. +The key to this is to create a simple function named pluginname_module() which does nothing. These lines and this interface +can be used inside your addon file without causing a namespace conflict, as the object method will. + +[code] + function randplace_module() { return; } +[/code] +Once this function exists, the URL #^[url=https://yoursite/randplace]https://yoursite/randplace[/url] will access your plugin as a module. Then you can define functions which are called at various points to return or process a structured webpage just like system modules. The typical functions and the order which they are called is +[code] + modulename_init($a) // (e.g. randplace_init($a);) called first - if you wish to emit json or xml, + // you should do it here, followed by killme() which will avoid the default action of building a webpage + modulename_post($a) // Called whenever the page is accessed via the "post" method + modulename_content($a) // called to generate the central page content. This function should return a string + // consisting of the central page content. +[/code] +Your module functions have access to the URL path as if they were standalone programs in the Unix operating system. For instance if you visit the page +[code] + https://yoursite/randplace/something/somewhere/whatever +[/code] +we will create an argc/argv list for use by your module functions +[code] + $x = argc(); // $x will be 4, the number of path arguments after the sitename + + for($x = 0; $x < argc(); $x ++) + echo $x . ' ' . argv($x); + + + 0 randplace + 1 something + 2 somewhere + 3 whatever +[/code] + +[h3]Using class methods as hook handler functions[/h3] + +To register a hook using a class method as a callback, a couple of things need to be considered. The first is that the functions need to be declared static public so that they are available from all contexts, and they need to have a namespace attached because they can be called from within multiple namespaces. You can then register them as strings or arrays (using the PHP internal calling method). + +[code] +<?php +/* + * plugin info block goes here + */ + +function myplugin_load() { + Zotlabs\Extend\Hook::register('hook_name','addon/myplugin/myplugin.php','\\Myplugin::foo'); +[b]or[/b] + Zotlabs\Extend\Hook::register('hook_name','addon/myplugin/myplugin.php',array('\\Myplugin','foo')); +} + +class Myplugin { + + public static function foo($params) { + // handler for 'hook_name' + } +} +[/code] + +If you want to keep your plugin hidden from the siteinfo page, simply create a file called '.hidden' in your addon directory +[code] + touch addon/<addon name>/.hidden +[/code] + +***Porting Friendica Plugins*** + +$Projectname uses a similar plugin architecture to the Friendica project. The authentication, identity, and permissions systems are completely different. Many Friendica can be ported reasonably easily by renaming a few functions - and then ensuring that the permissions model is adhered to. The functions which need to be renamed are: + +[li] Friendica's pluginname_install() is pluginname_load()[/li] + +[li] Friendica's pluginname_uninstall() is pluginname_unload()[/li] + +$Projectname has _install and _uninstall functions but these are used differently. + +[li] Friendica's "plugin_settings" hook is called "feature_settings"[/li] + +[li] Friendica's "plugin_settings_post" hook is called "feature_settings_post"[/li] + +Changing these will often allow your plugin to function, but please double check all your permission and identity code because the concepts behind it are completely different in $Projectname. Many structured data names (especially DB schema columns) are also quite different. + +#include doc/macros/main_footer.bb; diff --git a/doc/problems-following-an-update.bb b/doc/problems-following-an-update.bb index 2d1fefc5b..7376d6163 100644 --- a/doc/problems-following-an-update.bb +++ b/doc/problems-following-an-update.bb @@ -1,38 +1,38 @@ -[b]Problems Following An Update[/b]
-
-A good 90% of all bugs encountered immediately after updating the code to the latest version are simple cache errors of one sort or another. If you update and find something very obvious is broken - like your matrix page doesn't load, notifications are missing, or comment boxes are missing - the chances are it's not a bug at all. Breaking basic functionality is the kind of thing developers tend to notice.
-
-If this happens to you, there are a few simple steps to take before resorting to the support forums:
-
-[b]Browser Cache[/b]
-
-Symptoms: Menus do not expand, ACL selector does not open, progress indicator does not display (or loops forever), Matrix and channel pages do not load.
-
-Force reload the page. Shift reload, or ctrl+f5. Occasionally, but very, very rarely, you will also need to clear the session data - which is achieved by restarting the browser.
-
-[b]FastCGI[/b]
-
-Symptoms: Incorrect variables. The basic UI mostly works, but displays incorrect content or is missing content entirely.
-
-If you're using php5-fpm, this problem is usually resolved with [code]service php5-fpm restart[/code]
-
-[b]Smarty Cache[/b]
-
-Symptoms:
-
-1) White Screen Of Death. This is most prevalent on the settings and admin pages.
-
-2) Missing icons, tabs, menus or features.
-
-We use the Smarty3 template engine to generate pages. These templates are compiled before they are displayed. Occasionally, a new or modified template will fail to overwrite the old compiled version. To clear the Smarty cache, delete all the files in store/[data]/smarty3/compiled [b]but do not delete the directory itself[/b]. Templates will then be recompiled on their next access.
-
-[b]Theme Issues[/b]
-
-There are many themes for $Projectname. Only Redbasic is officialy supported by the core developers. This applies [i]even if a core developer happens to support an additional theme[/i]. This means new features are only guaranteed to work in Redbasic.
-
-Redbasic uses a few javascript libraries that are done differently, or entirely absent in other themes. This means new features may only work properly in Redbasic. Before reporting an issue, therefore, you should switch to Redbasic to see if it exists there. If the issue goes away, this is not a bug - it's a theme that isn't up to date.
-
-Should you report an issue with the theme developers then? No. Theme developers use their themes. Chances are, they know. Give them two or three days to catch up and [i]then[/i] report the issue if it's still not fixed. There are two workarounds for this situation. Firstly, you can temporarily use Redbasic. Secondly, most themes are open source too - open a pull request and make yourself a friend.
-
-#include doc/macros/troubleshooting_footer.bb;
-
+[b]Problems Following An Update[/b] + +A good 90% of all bugs encountered immediately after updating the code to the latest version are simple cache errors of one sort or another. If you update and find something very obvious is broken - like your matrix page doesn't load, notifications are missing, or comment boxes are missing - the chances are it's not a bug at all. Breaking basic functionality is the kind of thing developers tend to notice. + +If this happens to you, there are a few simple steps to take before resorting to the support forums: + +[b]Browser Cache[/b] + +Symptoms: Menus do not expand, ACL selector does not open, progress indicator does not display (or loops forever), Matrix and channel pages do not load. + +Force reload the page. Shift reload, or ctrl+f5. Occasionally, but very, very rarely, you will also need to clear the session data - which is achieved by restarting the browser. + +[b]FastCGI[/b] + +Symptoms: Incorrect variables. The basic UI mostly works, but displays incorrect content or is missing content entirely. + +If you're using php5-fpm, this problem is usually resolved with [code]service php5-fpm restart[/code] + +[b]Smarty Cache[/b] + +Symptoms: + +1) White Screen Of Death. This is most prevalent on the settings and admin pages. + +2) Missing icons, tabs, menus or features. + +We use the Smarty3 template engine to generate pages. These templates are compiled before they are displayed. Occasionally, a new or modified template will fail to overwrite the old compiled version. To clear the Smarty cache, delete all the files in store/[data]/smarty3/compiled [b]but do not delete the directory itself[/b]. Templates will then be recompiled on their next access. + +[b]Theme Issues[/b] + +There are many themes for $Projectname. Only Redbasic is officialy supported by the core developers. This applies [i]even if a core developer happens to support an additional theme[/i]. This means new features are only guaranteed to work in Redbasic. + +Redbasic uses a few javascript libraries that are done differently, or entirely absent in other themes. This means new features may only work properly in Redbasic. Before reporting an issue, therefore, you should switch to Redbasic to see if it exists there. If the issue goes away, this is not a bug - it's a theme that isn't up to date. + +Should you report an issue with the theme developers then? No. Theme developers use their themes. Chances are, they know. Give them two or three days to catch up and [i]then[/i] report the issue if it's still not fixed. There are two workarounds for this situation. Firstly, you can temporarily use Redbasic. Secondly, most themes are open source too - open a pull request and make yourself a friend. + +#include doc/macros/troubleshooting_footer.bb; + diff --git a/doc/red2pi.bb b/doc/red2pi.bb index 28db7dc70..8ae087fbf 100644 --- a/doc/red2pi.bb +++ b/doc/red2pi.bb @@ -1,342 +1,342 @@ -[b]How to install $Projectname on a Raspberry Pi[/b]
-
-You just bought a Raspberry Pi and want to run the RED Matrix with your own domain name?
-
-Then this page is for you! You will:
-[list=1]
-[*] Install Raspberry OS (Debian Linux) on a Raspberry
-[*] Install Apache Web Server, PHP, MaySQL, phpMyAdmin
-[*] Register a free domain (dynamic DNS) and use it for your hub
-[*] Install $Projectname
-[*] Keep your Raspberry Pi and $Projectname up-to-date
-[*] TODO Setting up SSL
-[*] TODO Running with SSL
-[*] TODO Make the webserver less vulnarable to attacks
-[/list]
-
-[size=large]1. Install Raspberry OS (Debian Linux)[/size]
-
-instructions under [url=http://www.raspberrypi.org/downloads]http://www.raspberrypi.org/downloads[/url]
-This page links to the quick start containing detailed instruction.
-
-[b]Format SD card[/b]
-
-using the program gparted under Linux Mint 15
-
-format as FAT32
-
-[b]Download NOOBS (offline and network install)[/b]
-
-[url=http://downloads.raspberrypi.org/noobs]http://downloads.raspberrypi.org/noobs[/url]
-
-unzip
-
-copy unzipped files to SD card
-
-[b]Install Raspbian as OS on the Rasperry Pi[/b]
-
-connect with keyboard via USB
-
-connect with monitor via HDMI
-
-Insert SD card into Rasperry Pi
-
-Connect with power supply to switch on the Rasperry
-
-choose Raspbian as OS (> installs Raspbian....)
-
-wait for the coniguration program raspi-config (you can later start it by sudo raspi-config)
-
-[b]Configure Raspbian[/b]
-
-in raspi-config > advanced > choose to use ssh (!! You need this to connect to administrate your Pi from your PC !!)
-
-in raspi-config > change the password (of default user "pi" from "raspberry" to your password)
-
-in raspi-config (optional) > Internationalisation options > Change Locale > to de_DE.utf-8 utf-8 (for example)
-
-in raspi-config (optional) > Internationalisation options > Change Timezoe > set your timezone
-
-in raspi-config (optional) > Overlock > medium
-
-(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
-
-
-[b]More[/b]
-
-[code]sudo reboot[/code]
-
-Now its time to connect the Pi to the network.
-[ul]
-[*] pull out keyboard
-[*] pull out monitor
-[*] you even can pull out the power supply (USB)
-[*] plug-in the network cable to the router
-[*] plug-in the power supply again
-[*] wait for a minute or to give the Pi time to boot and start ssh...
-[/ul]
-
-On your PC connect to the Pi to administrate (here update it).
-Open the console on the PC (Window: Start > cmd, Linux: Shell)
-
-Hint: use the router admin tool to find out the IP of your PI[code]ssh pi@192.168.178.37
-sudo apt-get update
-sudo apt-get dist-upgrade[/code]
-
-(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
-
-
-
-[size=large]2. Install Apache Web Server, PHP, MaySQL, phpMyAdmin[/size]
-
-[b]Install Apache Webserver[/b]
-
-[code]sudo bash
-sudo groupadd www-data[/code] might exist already
-
-[code]sudo usermod -a -G www-data www-data
-sudo apt-get update
-sudo reboot[/code]
-
-wait...
-reconnect via ssh, example: [code]ssh pi@192.168.178.37
-sudo apt-get install apache2 apache2-doc apache2-utils[/code]
-
-Open webbrowser on PC and check [url=http://192.168.178.37]http://192.168.178.37[/url]
-Should show you a page like "It works"
-
-(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
-
-
-[b]Install PHP, MaySQL, phpMyAdmin[/b]
-
-[code]sudo bash
-apt-get install libapache2-mod-php5 php5 php-pear php5-xcache php5-curl
-apt-get install php5-mysql
-apt-get install mysql-server mysql-client[/code] enter and note the mysql passwort
-
-[code]apt-get install phpmyadmin[/code]
-
-Configuring phpmyadmin
-- Select apache2
-- Configure database for phpmyadmin with dbconfig-common?: Choose Yes
-
-(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
-
-
-[b]Test installation[/b]
-
-[code]cd /var/www[/code]
-
-create a php file to test the php installation[code]sudo nano phpinfo.php[/code]
-
-Insert into the file:[code]
-<?php
- phpinfo();
-?>
-[/code]
-(save CTRL+0, ENTER, CTRL+X)
-
-open webbrowser on PC and try [url=http://192.168.178.37/phpinfo.php]http://192.168.178.37/phpinfo.php[/url] (page shows infos on php)
-
-connect phpMyAdmin with MySQL database [code]nano /etc/apache2/apache2.conf[/code]
-- CTRL+V... to the end of the file
-- Insert at the end of the file: (save CTRL+0, ENTER, CTRL+X)[code]Include /etc/phpmyadmin/apache.conf[/code]
-
-restart apache[code]/etc/init.d/apache2 restart
-sudo apt-get update
-sudo apt-get upgrade
-sudo reboot[/code]
-
-(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
-
-
-[b]phpMyAdmin[/b]
-
-open webbrowser on PC and try #^[url=http://192.168.178.37/phpmyadmin]http://192.168.178.37/phpmyadmin[/url]
-
-(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
-
-
-[b]Create an empty database... that is later used by RED[/b]
-
-open webbrowser on PC and try #^[url=http://192.168.178.37/phpmyadmin]http://192.168.178.37/phpmyadmin[/url]
-
-Create an empty database
-
-Note the access details (hostname, username, password, database name).
-
-
-[size=large]3. Selfhost[/size]
-
-(Source: #^[url=http://www.techjawab.com/2013/06/setup-dynamic-dns-dyndns-for-free-on.html]http://www.techjawab.com/2013/06/setup-dynamic-dns-dyndns-for-free-on.html[/url])
-
-[url=http://freedns.afraid.org/signup/]http://freedns.afraid.org/signup/[/url]
-
-[b]Step 1[/b]
-Register for a Free domain at #^[url=http://freedns.afraid.org/signup/]http://freedns.afraid.org/signup/[/url]
-(We will take techhome.homenet.org in this guide)
-
-[b]Step 2[/b]
-
-Logon to FreeDNS (where you just registered) and goto #^[url=http://freedns.afraid.org/dynamic/]http://freedns.afraid.org/dynamic/[/url]
-Right click on "Direct Link" and copy the URL and paste it somewhere.
-You should notice a large and unique alpha-numeric key in the URL, make a note of it as shown below:
-[code]http://freedns.afraid.org/dynamic/update.php?alphanumeric-key[/code]
-
-
-[b]Step 3[/b]
-Install inadyn using the following command:[code]sudo apt-get install inadyn[/code]
-
-[b]Step 4[/b]
-Configure inadyn using the below steps:[code]sudo nano /etc/inadyn.conf[/code]
-And add the following contains in it replacing the actual values:
-[code]
---username [color=red]techhome[/color]
---password [color=red]mypassword[/color]
---update_period 3600
---forced_update_period 14400
---alias [color=red]techhome.homenet.org</b>,[color=red]alphanumeric key[/color]
---background
---dyndns_system default@freedns.afraid.org
---syslog
- [/code]
-
-
-[b]Step 5[/b]
-
-Now, we need to ensure that the DNS updater (Inadyn) runs automatically after every re-boot[code]export EDITOR=gedit && sudo crontab -e[/code]
-Add the following line:[code]@reboot /usr/sbin/inadyn[/code]
-
-
-[b]Step 6[/b]
-
-Reboot system and then run the following command to ensure inadyn is running:[code]
-sudo reboot
-ps -A | grep inadyn
-[/code]
-Now your host is ready and up for accessing from internet...
-You can trying ssh-ing from another computer over the internet
-[code]ssh username@techhome.homenet.org[/code]
-Or, if any web server is running, then simply browse to #^[url=http://techhome.homenet.org]http://techhome.homenet.org[/url]
-Or, you can just ping it to test ping techhome.homenet.org
-To check the logs you can use this:
-[code]more /var/log/messages |grep INADYN[/code]
-
-
-[size=large]4. Install $Projectname[/size]
-
-(Source: [zrl=[baseurl]/help/Install][baseurl]/help/Install[/zrl])
-
-Linux Appache document root is /var/www/
-Two files exist there (created by the steps above): index.html, phpinfo.php
-
-
-[b]Install $Projectname and its Addons[/b]
-
-Cleanup: Remove the directory www/ (Git will not create files and folders in directories that are not empty.) Make sure you are in directory var[code]pi@pi /var $ cd /var[/code]
-
-Remove directory[code]pi@pi /var $ sudo rm -rf www/[/code]
-
-Download the sources of $Projectname from GIT
-[code]pi@pi /var $ sudo git clone https://github.com/redmatrix/hubzilla.git www[/code]
-
-Download the sources of the addons from GIT
-[code]pi@pi /var/www $ sudo git clone https://github.com/redmatrix/hubzilla-addons.git addon[/code]
-
-Make user www-data the owner of the whole web directory (including subdirectories and files)
-(TODO: This step has to be proofed by the next installation.)
-[code]pi@pi /var $ chown -R www-data:www-data /var/www/[/code]
-
-Check if you can update the sources from git[code]
-pi@pi /var $ cd www
-pi@pi /var/www $ git pull
-[/code]
-
-Check if you can update the addons
-[code]pi@pi /var/www $ cd addon/
-pi@pi /var/www/addon $ sudo git pull[/code]
-
-Make sure folder store/[data]/smarty3 exists and is writable by the webserver
-[code]pi@pi /var/www $ sudo chmod ou+w "store/\[data\]/smarty3"[/code]
-
-Create .htconfig.php and is writable by the webserver
-[code]pi@pi /var/www $ sudo touch .htconfig.php
-pi@pi /var/www $ sudo chmod ou+w .htconfig.php[/code]
-
-[b]First start and initial configuration of your RED Matrix hub[/b]
-
-In browser open #^[zrl=http://einervonvielen.mooo.com/]http://einervonvielen.mooo.com/[/zrl]
-(Replace einervonvielen.mooo.com by your domain, see chapter selfhost. Be patient. It takes time.)
-(#^[zrl=http://einervonvielen.mooo.com/index.php?q=setup]http://einervonvielen.mooo.com/index.php?q=setup[/zrl])
-
-There might be errors like the following.
-
-Error: libCURL PHP module required but not installed.
-Solution:
-apt-get install php5-curl
-
-Error: Apache webserver mod-rewrite module is required but not installed.
-Solution
-(Source: [url=http://xmodulo.com/2013/01/how-to-enable-mod_rewrite-in-apache2-on-debian-ubuntu.html]http://xmodulo.com/2013/01/how-to-enable-mod_rewrite-in-apache2-on-debian-ubuntu.html[/url])
-The default installation of Apache2 comes with mod_rewrite installed. To check whether this is the case, verify the existence of /etc/apache2/mods-available/rewrite.load
-- pi@pi /var/www $ nano /etc/apache2/mods-available/rewrite.load
- (You should find the contendt: LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so)
-To enable and load mod_rewrite, do the rest of steps.
-Create a symbolic link in /etc/apache2/mods-enabled
-- pi@pi /var/www $ sudo a2enmod rewrite
-Then open up the following file, and replace every occurrence of "AllowOverride None" with "AllowOverride all".
-- pi@pi /var/www $ sudo nano /etc/apache2/sites-available/default
-Finally, restart Apache2.
-- pi@pi /var/www $ sudo service apache2 restart
-
-Error store is writable (not checked)
-Solution:
-(TODO: Make writeable to group www-data only?)
-pi@pi /var/www $ sudo mkdir store
-pi@pi /var/www $ chown -R www-data:www-data /var/www/red/
-pi@pi /var/www $ sudo chmod ou+w view
-
-[b]More[/b]
-
-Set up a cron job to run the poller once every 15 minutes in order to perform background processing.
-- pi@pi /var/www $ which php
-Make sure you are in the document root directory of the webserver
-- pi@pi /var/www $ cd /var/www/
-Try to execute the poller in order to make sure it works
-- pi@pi /var/www $ /usr/bin/php include/poller.php
-Create the cronjob
-- pi@pi /var/www $ crontab -e
-Enter
-- */15 * * * * cd /var/www/; /usr/bin/php include/poller.php
-- Save and exit.
-
-Prevent search engines from indexing your search pages. Why? This can cause heavy resource use.
-
-[code]
-php util/config system block_public_search 1
-[/code]
-
-
-
-[size=large]5. Keep your Raspberry Pi and your $Projectname up-to-date[/size]
-
-Git update every day at 4 am and addons at 5 am every day
-Try if the command is working
-- pi@pi /var/www $ sudo git pull
-Create the cronjob
-- pi@pi /var/www $ crontab -e
-Enter the following to update at 4:01 am every day
-- 01 04 * * * cd /var/www/; sudo git pull
-Enter the following to update the addons at 5:01 am every day
-- 01 05 * * * cd /var/www/addon/; sudo git pull
-Enter the following to update the Raspberry Pi (Raspbian OS = Debian) at 6:01 am every day
-- 01 06 * * * sudo aptitude -y update && sudo aptitude -y safe-upgrade
-Save and exit.
-
-[size=large]6. Running with SSL[/size]
-
-Follow the instructions here:
-[url=https://github.com/friendica/friendica/wiki/Running-Friendica-with-SSL]https://github.com/friendica/friendica/wiki/Running-Friendica-with-SSL[/url]
-
-#include doc/macros/main_footer.bb;
+[b]How to install $Projectname on a Raspberry Pi[/b] + +You just bought a Raspberry Pi and want to run the RED Matrix with your own domain name? + +Then this page is for you! You will: +[list=1] +[*] Install Raspberry OS (Debian Linux) on a Raspberry +[*] Install Apache Web Server, PHP, MaySQL, phpMyAdmin +[*] Register a free domain (dynamic DNS) and use it for your hub +[*] Install $Projectname +[*] Keep your Raspberry Pi and $Projectname up-to-date +[*] TODO Setting up SSL +[*] TODO Running with SSL +[*] TODO Make the webserver less vulnarable to attacks +[/list] + +[size=large]1. Install Raspberry OS (Debian Linux)[/size] + +instructions under [url=http://www.raspberrypi.org/downloads]http://www.raspberrypi.org/downloads[/url] +This page links to the quick start containing detailed instruction. + +[b]Format SD card[/b] + +using the program gparted under Linux Mint 15 + +format as FAT32 + +[b]Download NOOBS (offline and network install)[/b] + +[url=http://downloads.raspberrypi.org/noobs]http://downloads.raspberrypi.org/noobs[/url] + +unzip + +copy unzipped files to SD card + +[b]Install Raspbian as OS on the Rasperry Pi[/b] + +connect with keyboard via USB + +connect with monitor via HDMI + +Insert SD card into Rasperry Pi + +Connect with power supply to switch on the Rasperry + +choose Raspbian as OS (> installs Raspbian....) + +wait for the coniguration program raspi-config (you can later start it by sudo raspi-config) + +[b]Configure Raspbian[/b] + +in raspi-config > advanced > choose to use ssh (!! You need this to connect to administrate your Pi from your PC !!) + +in raspi-config > change the password (of default user "pi" from "raspberry" to your password) + +in raspi-config (optional) > Internationalisation options > Change Locale > to de_DE.utf-8 utf-8 (for example) + +in raspi-config (optional) > Internationalisation options > Change Timezoe > set your timezone + +in raspi-config (optional) > Overlock > medium + +(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url]) + + +[b]More[/b] + +[code]sudo reboot[/code] + +Now its time to connect the Pi to the network. +[ul] +[*] pull out keyboard +[*] pull out monitor +[*] you even can pull out the power supply (USB) +[*] plug-in the network cable to the router +[*] plug-in the power supply again +[*] wait for a minute or to give the Pi time to boot and start ssh... +[/ul] + +On your PC connect to the Pi to administrate (here update it). +Open the console on the PC (Window: Start > cmd, Linux: Shell) + +Hint: use the router admin tool to find out the IP of your PI[code]ssh pi@192.168.178.37 +sudo apt-get update +sudo apt-get dist-upgrade[/code] + +(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url]) + + + +[size=large]2. Install Apache Web Server, PHP, MaySQL, phpMyAdmin[/size] + +[b]Install Apache Webserver[/b] + +[code]sudo bash +sudo groupadd www-data[/code] might exist already + +[code]sudo usermod -a -G www-data www-data +sudo apt-get update +sudo reboot[/code] + +wait... +reconnect via ssh, example: [code]ssh pi@192.168.178.37 +sudo apt-get install apache2 apache2-doc apache2-utils[/code] + +Open webbrowser on PC and check [url=http://192.168.178.37]http://192.168.178.37[/url] +Should show you a page like "It works" + +(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url]) + + +[b]Install PHP, MaySQL, phpMyAdmin[/b] + +[code]sudo bash +apt-get install libapache2-mod-php5 php5 php-pear php5-xcache php5-curl +apt-get install php5-mysql +apt-get install mysql-server mysql-client[/code] enter and note the mysql passwort + +[code]apt-get install phpmyadmin[/code] + +Configuring phpmyadmin +- Select apache2 +- Configure database for phpmyadmin with dbconfig-common?: Choose Yes + +(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url]) + + +[b]Test installation[/b] + +[code]cd /var/www[/code] + +create a php file to test the php installation[code]sudo nano phpinfo.php[/code] + +Insert into the file:[code] +<?php + phpinfo(); +?> +[/code] +(save CTRL+0, ENTER, CTRL+X) + +open webbrowser on PC and try [url=http://192.168.178.37/phpinfo.php]http://192.168.178.37/phpinfo.php[/url] (page shows infos on php) + +connect phpMyAdmin with MySQL database [code]nano /etc/apache2/apache2.conf[/code] +- CTRL+V... to the end of the file +- Insert at the end of the file: (save CTRL+0, ENTER, CTRL+X)[code]Include /etc/phpmyadmin/apache.conf[/code] + +restart apache[code]/etc/init.d/apache2 restart +sudo apt-get update +sudo apt-get upgrade +sudo reboot[/code] + +(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url]) + + +[b]phpMyAdmin[/b] + +open webbrowser on PC and try #^[url=http://192.168.178.37/phpmyadmin]http://192.168.178.37/phpmyadmin[/url] + +(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url]) + + +[b]Create an empty database... that is later used by RED[/b] + +open webbrowser on PC and try #^[url=http://192.168.178.37/phpmyadmin]http://192.168.178.37/phpmyadmin[/url] + +Create an empty database + +Note the access details (hostname, username, password, database name). + + +[size=large]3. Selfhost[/size] + +(Source: #^[url=http://www.techjawab.com/2013/06/setup-dynamic-dns-dyndns-for-free-on.html]http://www.techjawab.com/2013/06/setup-dynamic-dns-dyndns-for-free-on.html[/url]) + +[url=http://freedns.afraid.org/signup/]http://freedns.afraid.org/signup/[/url] + +[b]Step 1[/b] +Register for a Free domain at #^[url=http://freedns.afraid.org/signup/]http://freedns.afraid.org/signup/[/url] +(We will take techhome.homenet.org in this guide) + +[b]Step 2[/b] + +Logon to FreeDNS (where you just registered) and goto #^[url=http://freedns.afraid.org/dynamic/]http://freedns.afraid.org/dynamic/[/url] +Right click on "Direct Link" and copy the URL and paste it somewhere. +You should notice a large and unique alpha-numeric key in the URL, make a note of it as shown below: +[code]http://freedns.afraid.org/dynamic/update.php?alphanumeric-key[/code] + + +[b]Step 3[/b] +Install inadyn using the following command:[code]sudo apt-get install inadyn[/code] + +[b]Step 4[/b] +Configure inadyn using the below steps:[code]sudo nano /etc/inadyn.conf[/code] +And add the following contains in it replacing the actual values: +[code] +--username [color=red]techhome[/color] +--password [color=red]mypassword[/color] +--update_period 3600 +--forced_update_period 14400 +--alias [color=red]techhome.homenet.org</b>,[color=red]alphanumeric key[/color] +--background +--dyndns_system default@freedns.afraid.org +--syslog + [/code] + + +[b]Step 5[/b] + +Now, we need to ensure that the DNS updater (Inadyn) runs automatically after every re-boot[code]export EDITOR=gedit && sudo crontab -e[/code] +Add the following line:[code]@reboot /usr/sbin/inadyn[/code] + + +[b]Step 6[/b] + +Reboot system and then run the following command to ensure inadyn is running:[code] +sudo reboot +ps -A | grep inadyn +[/code] +Now your host is ready and up for accessing from internet... +You can trying ssh-ing from another computer over the internet +[code]ssh username@techhome.homenet.org[/code] +Or, if any web server is running, then simply browse to #^[url=http://techhome.homenet.org]http://techhome.homenet.org[/url] +Or, you can just ping it to test ping techhome.homenet.org +To check the logs you can use this: +[code]more /var/log/messages |grep INADYN[/code] + + +[size=large]4. Install $Projectname[/size] + +(Source: [zrl=[baseurl]/help/Install][baseurl]/help/Install[/zrl]) + +Linux Appache document root is /var/www/ +Two files exist there (created by the steps above): index.html, phpinfo.php + + +[b]Install $Projectname and its Addons[/b] + +Cleanup: Remove the directory www/ (Git will not create files and folders in directories that are not empty.) Make sure you are in directory var[code]pi@pi /var $ cd /var[/code] + +Remove directory[code]pi@pi /var $ sudo rm -rf www/[/code] + +Download the sources of $Projectname from GIT +[code]pi@pi /var $ sudo git clone https://framagit.org/hubzilla/core.git www[/code] + +Download the sources of the addons from GIT +[code]pi@pi /var/www $ sudo git clone https://framagit.org/hubzilla/addons.git addon[/code] + +Make user www-data the owner of the whole web directory (including subdirectories and files) +(TODO: This step has to be proofed by the next installation.) +[code]pi@pi /var $ chown -R www-data:www-data /var/www/[/code] + +Check if you can update the sources from git[code] +pi@pi /var $ cd www +pi@pi /var/www $ git pull +[/code] + +Check if you can update the addons +[code]pi@pi /var/www $ cd addon/ +pi@pi /var/www/addon $ sudo git pull[/code] + +Make sure folder store/[data]/smarty3 exists and is writable by the webserver +[code]pi@pi /var/www $ sudo chmod ou+w "store/\[data\]/smarty3"[/code] + +Create .htconfig.php and is writable by the webserver +[code]pi@pi /var/www $ sudo touch .htconfig.php +pi@pi /var/www $ sudo chmod ou+w .htconfig.php[/code] + +[b]First start and initial configuration of your RED Matrix hub[/b] + +In browser open #^[zrl=http://einervonvielen.mooo.com/]http://einervonvielen.mooo.com/[/zrl] +(Replace einervonvielen.mooo.com by your domain, see chapter selfhost. Be patient. It takes time.) +(#^[zrl=http://einervonvielen.mooo.com/index.php?q=setup]http://einervonvielen.mooo.com/index.php?q=setup[/zrl]) + +There might be errors like the following. + +Error: libCURL PHP module required but not installed. +Solution: +apt-get install php5-curl + +Error: Apache webserver mod-rewrite module is required but not installed. +Solution +(Source: [url=http://xmodulo.com/2013/01/how-to-enable-mod_rewrite-in-apache2-on-debian-ubuntu.html]http://xmodulo.com/2013/01/how-to-enable-mod_rewrite-in-apache2-on-debian-ubuntu.html[/url]) +The default installation of Apache2 comes with mod_rewrite installed. To check whether this is the case, verify the existence of /etc/apache2/mods-available/rewrite.load +- pi@pi /var/www $ nano /etc/apache2/mods-available/rewrite.load + (You should find the contendt: LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so) +To enable and load mod_rewrite, do the rest of steps. +Create a symbolic link in /etc/apache2/mods-enabled +- pi@pi /var/www $ sudo a2enmod rewrite +Then open up the following file, and replace every occurrence of "AllowOverride None" with "AllowOverride all". +- pi@pi /var/www $ sudo nano /etc/apache2/sites-available/default +Finally, restart Apache2. +- pi@pi /var/www $ sudo service apache2 restart + +Error store is writable (not checked) +Solution: +(TODO: Make writeable to group www-data only?) +pi@pi /var/www $ sudo mkdir store +pi@pi /var/www $ chown -R www-data:www-data /var/www/red/ +pi@pi /var/www $ sudo chmod ou+w view + +[b]More[/b] + +Set up a cron job to run the poller once every 15 minutes in order to perform background processing. +- pi@pi /var/www $ which php +Make sure you are in the document root directory of the webserver +- pi@pi /var/www $ cd /var/www/ +Try to execute the poller in order to make sure it works +- pi@pi /var/www $ /usr/bin/php include/poller.php +Create the cronjob +- pi@pi /var/www $ crontab -e +Enter +- */15 * * * * cd /var/www/; /usr/bin/php include/poller.php +- Save and exit. + +Prevent search engines from indexing your search pages. Why? This can cause heavy resource use. + +[code] +php util/config system block_public_search 1 +[/code] + + + +[size=large]5. Keep your Raspberry Pi and your $Projectname up-to-date[/size] + +Git update every day at 4 am and addons at 5 am every day +Try if the command is working +- pi@pi /var/www $ sudo git pull +Create the cronjob +- pi@pi /var/www $ crontab -e +Enter the following to update at 4:01 am every day +- 01 04 * * * cd /var/www/; sudo git pull +Enter the following to update the addons at 5:01 am every day +- 01 05 * * * cd /var/www/addon/; sudo git pull +Enter the following to update the Raspberry Pi (Raspbian OS = Debian) at 6:01 am every day +- 01 06 * * * sudo aptitude -y update && sudo aptitude -y safe-upgrade +Save and exit. + +[size=large]6. Running with SSL[/size] + +Follow the instructions here: +[url=https://github.com/friendica/friendica/wiki/Running-Friendica-with-SSL]https://github.com/friendica/friendica/wiki/Running-Friendica-with-SSL[/url] + +#include doc/macros/main_footer.bb; diff --git a/doc/roadmap.bb b/doc/roadmap.bb index 9ef9f146a..dce19848a 100644 --- a/doc/roadmap.bb +++ b/doc/roadmap.bb @@ -1,49 +1,28 @@ +Roadmap -Roadmap for $Projectname V3 -*HZ = Hubzilla repository +Platform + Convert E2EE and select Javascript resources to dynamic loading using jQuery.getScript() [or other methods]. -Crypto - Convert E2EE to dynamic loading (on demand) using jQuery.getScript() [or other methods] to only load encryption libs when you require them. This should also support multiple encryption libraries (e.g. SJCL, others) triggered from the choice of algorithm and remain pluggable. +Webpages -Subscriptions and business models - Build enough into core(/addons) to generate income (or at least try and cover costs) out of the box + Make webpage building easy, with point-n-click selectors to build PDLs - Resolve the "every photo has an item" confusion, perhaps every file should also - but only if we can explain it and separate them conceptually. -Migration tools - Friendica importer - Diaspora importer (channel and connection import done, conversations and photos still in progress and waiting for support from Diaspora) +Events -Webpage design UI improvements - If practical, separate "conversation" sub-themes from overall themes so one can choose different conversation and content layouts within a base theme. - Make webpage building easy, with point-n-click selectors to build PDLs - bring back WYSIWYG, which ideally requires a JS abstraction layer so we can use any editor and change it based on mimetype + Recurring events + Integrate Hubzilla events with CalDAV -Social Networking Federation - Friendica native mode? - Pump.io? - Others? -Lists - Create a list object to contain arbitrary things for system use - Create a list object to contain arbitrary things for personal use +Connections -Events - Recurring events + CardDAV integration with abook and profiles -Zot - Provide a way to sync web resources. This could be built on DAV except for preserving resource naming (guids) instead of filenames. -API extensions - More, more, more. +Issues manager -Evangelism - More documentation. More, more, more. - Libzot + Provide easy(easier) channel move (as opposed to channel copy or clone) -DNS abstraction for V3 - Allow a channel to live in an arbitrary "DNS" namespace, for instance "mike@core.hubzilla". Use our directories and zot to find the actual DNS location via redirection. This could potentially allow hubs to be hidden behind tor or alt-roots and accessible only via the matrix. -
\ No newline at end of file diff --git a/doc/roadmap_hz3.md b/doc/roadmap_hz3.md deleted file mode 100644 index a64fb2d5c..000000000 --- a/doc/roadmap_hz3.md +++ /dev/null @@ -1,27 +0,0 @@ - -Hubzilla III -============ - -Due: December 2017 -Codename: - - -Wishlist: - -- Move CalDAV/CardDAV server to core - -- Integrate Hubzilla events with CalDAV - -- Connection 'roles' allows you to select different permission roles for your connections; such as follower, friend, contributor, etc. - -- CardDAV integration with abook and profiles - -- App tray - -- issues manager - -- wiki cloning - -- provide easy channel move (as opposed to channel copy or clone), which is currently supported only by the basic server role. - -- provide RSA keychange operation; which cannot affect the primary identity (which is based on the channel keys), so add a secondary dynamic key pair which will be used for all other operations and can be upgraded or revoked at any time.
\ No newline at end of file diff --git a/doc/roadmapv4.bb b/doc/roadmapv4.bb deleted file mode 100644 index 419cd8d4c..000000000 --- a/doc/roadmapv4.bb +++ /dev/null @@ -1,29 +0,0 @@ -[h1]Project Roadmap V4[/h1] - -[h2]Hubzilla 2.0 - code name "Universal Thunder"[/h2] - -[h3]Project Core Development[/h3] - -Goals/Highlights: - - -Focus on visual website design tools, widgets, and sharing mechanisms - -[x] App organisation. - -[x] Conversion of core application to a composer format living under the namespace "Zotlabs" - -[x] Conversion of Modules to a more general purpose Controllers layout with DB/memory based -controller routing as opposed to filesystem routing. - -[x] (partial) Conversion of core Zot Protocol to a class library - -[x] Abstraction of nomadic identity so that sending/receiving to/from singleton networks to/from any clone works flawlessly - [b]provided[/b] the clone physically connected to that singleton identity is up. - -[h3]Community Development[/h3] - -[x] CalDAV/CardDAV - -E-Commerce - -Auto Updater
\ No newline at end of file diff --git a/doc/schema_development.bb b/doc/schema_development.bb index 3d4c84e85..10832684a 100644 --- a/doc/schema_development.bb +++ b/doc/schema_development.bb @@ -1,78 +1,78 @@ -[b]Red Development - A Guide To The Schema System[/b]
-
-A schema, in a nutshell, is a collection of settings for a bunch of variables to define
-certain elements of a theme. A schema is loaded as though it were part of config.php
-and has access to all the same information. Importantly, this means it is identity aware,
-and can be used to do some interesting things. One could, for example, restrict options
-by service class, or present different options to different members.
-
-By default, we filter only by whether or not expert mode is enabled. If expert mode is
-enabled, all options are presented to the member. If it is not, only scheme, background
-image, font face, and iconset are available as choices.
-
-A schema is loaded *after* the member's personal settings. Therefore, to allow a member
-to overwrite a particular aspect of a schema you would use the following syntax:
-[code]
- if (! $foo)
- $foo = 'bar';
-[/code]
-However, there are circumstances - particularly with positional elements - where it
-may be desirable (or necessary) to override a member's settings. In this case, the syntax
-is even simpler:
-[code]
- $foo = 'bar';
-[/code]
-Members will not thank you for this, however, so only use it when it is required.
-
-If no personal options are set, and no schema is selected, we will first try to load a schema
-with the file name "default.php". This file should never be included with a theme. If it
-is, merge conflicts will occur as people update their code. Rather, this should be defined
-by administrators on a site by site basis.
-default.php and default.css MUST be symlinks to existing scheme files.
-
-You schema does not need to - and should not - contain all of these values. Only the values
-that differ from the defaults should be listed. This gives you some very powerful options
-with very few lines of code.
-
-Note the options available differ with each theme. The options available with the Redbasic
-theme are as follows:
-
-[li] nav_colour
- The colour of the navigation bar. Options are red, black and silver. Alternatively,
- one can set $nav_bg_1, $nav_bg_2, $nav_bg_3 and $nav_bg_4 to provide gradient and
- hover effects.[/li]
-[li] banner_colour
- The font colour of the banner element. Accepts an RGB or Hex value.[/li]
-[li] bgcolour
- Set the body background colour. Accepts an RGB or Hex value.[/li]
-[li] background_image
- Sets a background image. Accepts a URL or path.[/li]
-[li] item_colour
- Set the background colour of items. Accepts an RGB or Hex value.[/li]
-[li] item_opacity
- Set the opacity of items. Accepts a value from 0.01 to 1[/li]
-[li] toolicon_colour
- Set the colour of tool icons. Accepts an RGB or Hex value.[/li]
-[li] toolicon_activecolour
- Set the colour of active or hovered icon tools.[/li]
-[li] font_size
- Set the size of fonts in items and posts. Accepts px or em.[/li]
-[li] body_font_size
- Sets the size of fonts at the body level. Accepts px or em.[/li]
-[li] font_colour
- Sets the font colour. Accepts an RGB or Hex value.[/li]
-[li] radius
- Set the radius of corners. Accepts a numeral, and is always in px.[/li]
-[li] shadow
- Set the size of shadows shown with inline images. Accepts a numerical
- value. Note shadows are not applied to smileys.[/li]
-[li] converse_width
- Set the maximum width of the content region in px.[/li]
-[li] nav_min_opacity[/li]
-[li] top_photo[/li]
-[li] reply_photo[/li]
-
-If a your_schema_name.css file is found, the content of this file will be attached to the end of style.css.
-This gives the schem developer the possiblity to override any style component.
-
-#include doc/macros/main_footer.bb;
+[b]Red Development - A Guide To The Schema System[/b] + +A schema, in a nutshell, is a collection of settings for a bunch of variables to define +certain elements of a theme. A schema is loaded as though it were part of config.php +and has access to all the same information. Importantly, this means it is identity aware, +and can be used to do some interesting things. One could, for example, restrict options +by service class, or present different options to different members. + +By default, we filter only by whether or not expert mode is enabled. If expert mode is +enabled, all options are presented to the member. If it is not, only scheme, background +image, font face, and iconset are available as choices. + +A schema is loaded *after* the member's personal settings. Therefore, to allow a member +to overwrite a particular aspect of a schema you would use the following syntax: +[code] + if (! $foo) + $foo = 'bar'; +[/code] +However, there are circumstances - particularly with positional elements - where it +may be desirable (or necessary) to override a member's settings. In this case, the syntax +is even simpler: +[code] + $foo = 'bar'; +[/code] +Members will not thank you for this, however, so only use it when it is required. + +If no personal options are set, and no schema is selected, we will first try to load a schema +with the file name "default.php". This file should never be included with a theme. If it +is, merge conflicts will occur as people update their code. Rather, this should be defined +by administrators on a site by site basis. +default.php and default.css MUST be symlinks to existing scheme files. + +You schema does not need to - and should not - contain all of these values. Only the values +that differ from the defaults should be listed. This gives you some very powerful options +with very few lines of code. + +Note the options available differ with each theme. The options available with the Redbasic +theme are as follows: + +[li] nav_colour + The colour of the navigation bar. Options are red, black and silver. Alternatively, + one can set $nav_bg_1, $nav_bg_2, $nav_bg_3 and $nav_bg_4 to provide gradient and + hover effects.[/li] +[li] banner_colour + The font colour of the banner element. Accepts an RGB or Hex value.[/li] +[li] bgcolour + Set the body background colour. Accepts an RGB or Hex value.[/li] +[li] background_image + Sets a background image. Accepts a URL or path.[/li] +[li] item_colour + Set the background colour of items. Accepts an RGB or Hex value.[/li] +[li] item_opacity + Set the opacity of items. Accepts a value from 0.01 to 1[/li] +[li] toolicon_colour + Set the colour of tool icons. Accepts an RGB or Hex value.[/li] +[li] toolicon_activecolour + Set the colour of active or hovered icon tools.[/li] +[li] font_size + Set the size of fonts in items and posts. Accepts px or em.[/li] +[li] body_font_size + Sets the size of fonts at the body level. Accepts px or em.[/li] +[li] font_colour + Sets the font colour. Accepts an RGB or Hex value.[/li] +[li] radius + Set the radius of corners. Accepts a numeral, and is always in px.[/li] +[li] shadow + Set the size of shadows shown with inline images. Accepts a numerical + value. Note shadows are not applied to smileys.[/li] +[li] converse_width + Set the maximum width of the content region in px.[/li] +[li] nav_min_opacity[/li] +[li] top_photo[/li] +[li] reply_photo[/li] + +If a your_schema_name.css file is found, the content of this file will be attached to the end of style.css. +This gives the schem developer the possiblity to override any style component. + +#include doc/macros/main_footer.bb; diff --git a/doc/sv/main.bb b/doc/sv/main.bb index 1c6ad3f63..e304a84cd 100644 --- a/doc/sv/main.bb +++ b/doc/sv/main.bb @@ -1,80 +1,80 @@ -[img][baseurl]/images/hubzilla-banner.png[/img]
-
-[zrl=[baseurl]/help/about][b]Vad är $Projectname?[/b][/zrl]
-$Projectname är en decentraliserad publicerings- och kommunikationsplattform som möjliggör att du behåller kontrollen över dina kommunikationer med hjälp av automatisk kryptering och fininställbar behörighetskontroll. Det är du, och bara du, som beslutar vem som är behörig att ta del av ditt innehåll.
-
-[zrl=[baseurl]/help/features][b]$Projectname funktioner[/b][/zrl]
-$Projectname används redan och bildar ett globalt distribuerad närverk och bevisar* dagligen sin skalbarhet och diversitet i allt från installationer med en kanal till installationer med många användare och många kanaler med en stor mängd innehåll.
-Föreställ dig isolerade familjekommunikationsplatformer, distribuerade nätforum med fildelning, hjälpforum, bloggar och hemsidor. Eller proffesionellt anpassade innehållsleverantörer med kommersiella premium* kanaler och målriktat innehållsstyrning. Vad du än önskar så finns $Projectname för att stödja dig i förverkligande av din kreativitet.
-
-[zrl=[baseurl]/help/what_is_zot][b]Har du Zot? Skaffa det, direkt.[/b][/zrl]
-Zot är en fantastisk ny kommunikationsprotokoll uppfunnit speciellt för $Projectname. Som medlem är du inte längre bunden till en enskild sida eller hub tack vara "nomadiska identiteter". Flytt lätt till en annan server och håll dina kontakter och förbindelser intakta eller klona och kör den samma kanal på flera servrar simultant. I tillfälle av att en av dem stänger ner så går du inte miste om något. Plus när du är loggat in i $Projectname så är det inga flera inloggningar även när du kontakter andra hubbar i nätverket. Zot är det som gör $Projectname till något särskilt värdefullt/som urskiljer $Projectname från mängden.
-
-[h3]Kom igång[/h3]
-[zrl=[baseurl]/help/Privacy]Privacy Policy[/zrl]
-[zrl=[baseurl]/help/registration]Account Registration[/zrl]
-[zrl=[baseurl]/help/accounts_profiles_channels_basics]You at $Projectname: accounts, profiles and channels in short[/zrl]
-[zrl=[baseurl]/help/profiles]Profiles[/zrl]
-[zrl=[baseurl]/help/channels]Channels[/zrl]
-[zrl=[baseurl]/help/sv/roles]Behörighetsförval för kanaler[/zrl]
-[zrl=[baseurl]/help/first-post]Your first posting[/zrl]
-[zrl=[baseurl]/help/connecting_to_channels]Connecting To Other Channels[/zrl]
-[zrl=[baseurl]/help/permissions]Permissions And Encryption: You Are In Control[/zrl]
-[zrl=[baseurl]/help/cloud]Cloud Storage[/zrl]
-[zrl=[baseurl]/help/remove_account]Remove Channel or Account[/zrl]
-
-[h3]Hjälp till medlemmar[/h3]
-[zrl=[baseurl]/help/tags_and_mentions]Tags and Mentions[/zrl]
-[zrl=[baseurl]/help/webpages]Web Pages[/zrl]
-[zrl=[baseurl]/help/bbcode]BBcode reference for posts and comments[/zrl]
-[zrl=[baseurl]/help/checking_account_quota_usage]Checking Account Quota Usage[/zrl]
-[zrl=[baseurl]/help/cloud_desktop_clients]Cloud Desktop Clients[/zrl]
-[zrl=[baseurl]/help/AdvancedSearch]Advanced Directory Search[/zrl]
-[zrl=[baseurl]/help/addons]Help With Addons[/zrl]
-[zrl=[baseurl]/help/diaspora_compat]Diaspora Communications Compatibility (Diaspora and Friendica)[/zrl]
-[zrl=[baseurl]/help/faq_members]FAQ For Members[/zrl]
-
-[h3]Hjälp till administratorer[/h3]
-[zrl=[baseurl]/help/install]Install[/zrl]
-[zrl=[baseurl]/help/debian_install]Easy Install on Debian via script[/zrl]
-[zrl=[baseurl]/help/red2pi]Installing Red on the Raspberry Pi[/zrl]
-[zrl=[baseurl]/help/troubleshooting]Troubleshooting Tips[/zrl]
-[zrl=[baseurl]/help/hidden_configs]Tweaking $Projectname's Hidden Configurations[/zrl]
-[zrl=[baseurl]/help/faq_admins]FAQ For Admins[/zrl]
-
-[h3]Teknisk dokumentation[/h3]
-[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]
-[zrl=[baseurl]/help/comanche]Comanche Page Descriptions[/zrl]
-[zrl=[baseurl]/help/Creating-Templates]Creating Comanche Templates[/zrl]
-[zrl=[baseurl]/help/Widgets]Core Widgets[/zrl]
-[zrl=[baseurl]/help/plugins]Plugins[/zrl]
-[zrl=[baseurl]/help/doco]Contributing Documentation[/zrl]
-[zrl=[baseurl]/help/DerivedTheme1]Creating Derivative Themes[/zrl]
-[zrl=[baseurl]/help/schema_development]Schemas[/zrl]
-[zrl=[baseurl]/help/Translations]Translations[/zrl]
-[zrl=[baseurl]/help/developers]Developers[/zrl]
-[zrl=[baseurl]/help/intro_for_developers]Intro for Developers[/zrl]
-[zrl=[baseurl]/help/api_functions]API functions[/zrl]
-[zrl=[baseurl]/help/api_posting]Posting to the red# using the API[/zrl]
-[zrl=[baseurl]/help/developer_function_primer]Red Functions 101[/zrl]
-[zrl=[baseurl]/doc/html/]Code Reference (doxygen generated - sets cookies)[/zrl]
-[zrl=[baseurl]/help/to_do_doco]To-Do list for the Red Documentation Project[/zrl]
-[zrl=[baseurl]/help/to_do_code]To-Do list for Developers[/zrl]
-[zrl=[baseurl]/help/roadmap]Version 3 roadmap[/zrl]
-[zrl=[baseurl]/help/git_for_non_developers]Git for Non-Developers[/zrl]
-[zrl=[baseurl]/help/dev_beginner]Sep-for-step manual for beginning developers[/zrl]
-
-[h3]Externa resurser[/h3]
-[zrl=[baseurl]/help/external-resource-links]External Resource Links[/zrl]
-[url=https://github.com/friendica/red]Main Website[/url]
-[url=https://github.com/friendica/red-addons]Addon Website[/url]
-[url=https://zothub.com/channel/one]Development Channel[/url]
-
-[url=[baseurl]/help/credits]$Projectname Credits[/url]
-
-[h3]About This $Projectname Hub[/h3]
-[zrl=[baseurl]/help/TermsOfService]Terms of Service For This Hub[/zrl]
-[zrl=[baseurl]/siteinfo]Hub Information (/siteinfo)[/zrl]
-[zrl=[baseurl]/siteinfo_json]Detailed Technical Hub Information (/siteinfo_json)[/zrl]
+[img][baseurl]/images/hubzilla-banner.png[/img] + +[zrl=[baseurl]/help/about][b]Vad är $Projectname?[/b][/zrl] +$Projectname är en decentraliserad publicerings- och kommunikationsplattform som möjliggör att du behåller kontrollen över dina kommunikationer med hjälp av automatisk kryptering och fininställbar behörighetskontroll. Det är du, och bara du, som beslutar vem som är behörig att ta del av ditt innehåll. + +[zrl=[baseurl]/help/features][b]$Projectname funktioner[/b][/zrl] +$Projectname används redan och bildar ett globalt distribuerad närverk och bevisar* dagligen sin skalbarhet och diversitet i allt från installationer med en kanal till installationer med många användare och många kanaler med en stor mängd innehåll. +Föreställ dig isolerade familjekommunikationsplatformer, distribuerade nätforum med fildelning, hjälpforum, bloggar och hemsidor. Eller proffesionellt anpassade innehållsleverantörer med kommersiella premium* kanaler och målriktat innehållsstyrning. Vad du än önskar så finns $Projectname för att stödja dig i förverkligande av din kreativitet. + +[zrl=[baseurl]/help/what_is_zot][b]Har du Zot? Skaffa det, direkt.[/b][/zrl] +Zot är en fantastisk ny kommunikationsprotokoll uppfunnit speciellt för $Projectname. Som medlem är du inte längre bunden till en enskild sida eller hub tack vara "nomadiska identiteter". Flytt lätt till en annan server och håll dina kontakter och förbindelser intakta eller klona och kör den samma kanal på flera servrar simultant. I tillfälle av att en av dem stänger ner så går du inte miste om något. Plus när du är loggat in i $Projectname så är det inga flera inloggningar även när du kontakter andra hubbar i nätverket. Zot är det som gör $Projectname till något särskilt värdefullt/som urskiljer $Projectname från mängden. + +[h3]Kom igång[/h3] +[zrl=[baseurl]/help/Privacy]Privacy Policy[/zrl] +[zrl=[baseurl]/help/registration]Account Registration[/zrl] +[zrl=[baseurl]/help/accounts_profiles_channels_basics]You at $Projectname: accounts, profiles and channels in short[/zrl] +[zrl=[baseurl]/help/profiles]Profiles[/zrl] +[zrl=[baseurl]/help/channels]Channels[/zrl] +[zrl=[baseurl]/help/sv/roles]Behörighetsförval för kanaler[/zrl] +[zrl=[baseurl]/help/first-post]Your first posting[/zrl] +[zrl=[baseurl]/help/connecting_to_channels]Connecting To Other Channels[/zrl] +[zrl=[baseurl]/help/permissions]Permissions And Encryption: You Are In Control[/zrl] +[zrl=[baseurl]/help/cloud]Cloud Storage[/zrl] +[zrl=[baseurl]/help/remove_account]Remove Channel or Account[/zrl] + +[h3]Hjälp till medlemmar[/h3] +[zrl=[baseurl]/help/tags_and_mentions]Tags and Mentions[/zrl] +[zrl=[baseurl]/help/webpages]Web Pages[/zrl] +[zrl=[baseurl]/help/bbcode]BBcode reference for posts and comments[/zrl] +[zrl=[baseurl]/help/checking_account_quota_usage]Checking Account Quota Usage[/zrl] +[zrl=[baseurl]/help/cloud_desktop_clients]Cloud Desktop Clients[/zrl] +[zrl=[baseurl]/help/AdvancedSearch]Advanced Directory Search[/zrl] +[zrl=[baseurl]/help/addons]Help With Addons[/zrl] +[zrl=[baseurl]/help/diaspora_compat]Diaspora Communications Compatibility (Diaspora and Friendica)[/zrl] +[zrl=[baseurl]/help/faq_members]FAQ For Members[/zrl] + +[h3]Hjälp till administratorer[/h3] +[zrl=[baseurl]/help/install]Install[/zrl] +[zrl=[baseurl]/help/debian_install]Easy Install on Debian via script[/zrl] +[zrl=[baseurl]/help/red2pi]Installing Red on the Raspberry Pi[/zrl] +[zrl=[baseurl]/help/troubleshooting]Troubleshooting Tips[/zrl] +[zrl=[baseurl]/help/hidden_configs]Tweaking $Projectname's Hidden Configurations[/zrl] +[zrl=[baseurl]/help/faq_admins]FAQ For Admins[/zrl] + +[h3]Teknisk dokumentation[/h3] +[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] +[zrl=[baseurl]/help/comanche]Comanche Page Descriptions[/zrl] +[zrl=[baseurl]/help/Creating-Templates]Creating Comanche Templates[/zrl] +[zrl=[baseurl]/help/Widgets]Core Widgets[/zrl] +[zrl=[baseurl]/help/plugins]Plugins[/zrl] +[zrl=[baseurl]/help/doco]Contributing Documentation[/zrl] +[zrl=[baseurl]/help/DerivedTheme1]Creating Derivative Themes[/zrl] +[zrl=[baseurl]/help/schema_development]Schemas[/zrl] +[zrl=[baseurl]/help/Translations]Translations[/zrl] +[zrl=[baseurl]/help/developers]Developers[/zrl] +[zrl=[baseurl]/help/intro_for_developers]Intro for Developers[/zrl] +[zrl=[baseurl]/help/api_functions]API functions[/zrl] +[zrl=[baseurl]/help/api_posting]Posting to the red# using the API[/zrl] +[zrl=[baseurl]/help/developer_function_primer]Red Functions 101[/zrl] +[zrl=[baseurl]/doc/html/]Code Reference (doxygen generated - sets cookies)[/zrl] +[zrl=[baseurl]/help/to_do_doco]To-Do list for the Red Documentation Project[/zrl] +[zrl=[baseurl]/help/to_do_code]To-Do list for Developers[/zrl] +[zrl=[baseurl]/help/roadmap]Version 3 roadmap[/zrl] +[zrl=[baseurl]/help/git_for_non_developers]Git for Non-Developers[/zrl] +[zrl=[baseurl]/help/dev_beginner]Sep-for-step manual for beginning developers[/zrl] + +[h3]Externa resurser[/h3] +[zrl=[baseurl]/help/external-resource-links]External Resource Links[/zrl] +[url=https://github.com/friendica/red]Main Website[/url] +[url=https://github.com/friendica/red-addons]Addon Website[/url] +[url=https://zothub.com/channel/one]Development Channel[/url] + +[url=[baseurl]/help/credits]$Projectname Credits[/url] + +[h3]About This $Projectname Hub[/h3] +[zrl=[baseurl]/help/TermsOfService]Terms of Service For This Hub[/zrl] +[zrl=[baseurl]/siteinfo]Hub Information (/siteinfo)[/zrl] +[zrl=[baseurl]/siteinfo_json]Detailed Technical Hub Information (/siteinfo_json)[/zrl] diff --git a/include/api_zot.php b/include/api_zot.php index 1d30a0845..921242152 100644 --- a/include/api_zot.php +++ b/include/api_zot.php @@ -96,9 +96,10 @@ // 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'); + if(array_key_exists('dbegin',$_REQUEST)) + $_REQUEST['datequery2'] = $_REQUEST['dbegin']; + if(array_key_exists('dend',$_REQUEST)) + $_REQUEST['datequery'] = $_REQUEST['dend']; $arr = $_REQUEST; $ret = []; diff --git a/include/attach.php b/include/attach.php index ec72bb946..202412263 100644 --- a/include/attach.php +++ b/include/attach.php @@ -1585,8 +1585,8 @@ function get_cloud_url($channel_id, $channel_name, $attachHash) { } } while ($parentHash); - $url = z_root() . '/cloud/' . $channel_name . '/' . $parentFullPath . find_filename_by_hash($channel_id, $attachHash); + $url = z_root() . '/cloud/' . $channel_name . '/' . $parentFullPath . find_filename_by_hash($channel_id, $attachHash); return $url; } diff --git a/include/auth.php b/include/auth.php index c44eeb8fc..b952754fd 100644 --- a/include/auth.php +++ b/include/auth.php @@ -49,51 +49,91 @@ function account_verify_password($login, $pass) { $channel = null; $xchan = null; - if(! strpos($login,'@')) { - $channel = channelx_by_nick($login); - if(! $channel) { - $x = q("select * from atoken where atoken_name = '%s' and atoken_token = '%s' limit 1", - dbesc($login), - dbesc($pass) - ); - if($x) { - $ret['xchan'] = atoken_xchan($x[0]); - atoken_create_xchan($ret['xchan']); - return $ret; + $addon_auth = [ + 'username' => $login, + 'password' => trim($pass), + 'authenticated' => 0, + 'user_record' => null + ]; + + /** + * + * A plugin indicates successful login by setting 'authenticated' to non-zero value and returning a user record + * Plugins should never set 'authenticated' except to indicate success - as hooks may be chained + * and later plugins should not interfere with an earlier one that succeeded. + * + */ + + call_hooks('authenticate', $addon_auth); + + if(($addon_auth['authenticated']) && is_array($addon_auth['user_record']) && (! empty($addon_auth['user_record']))) { + $ret['account'] = $addon_auth['user_record']; + return $ret; + } + else { + if(! strpos($login,'@')) { + $channel = channelx_by_nick($login); + if(! $channel) { + $x = q("select * from atoken where atoken_name = '%s' and atoken_token = '%s' limit 1", + dbesc($login), + dbesc($pass) + ); + if($x) { + $ret['xchan'] = atoken_xchan($x[0]); + atoken_create_xchan($ret['xchan']); + return $ret; + } } } - } - if($channel) { - $where = " where account_id = " . intval($channel['channel_account_id']) . " "; - } - else { - $where = " where account_email = '" . dbesc($login) . "' "; - } + if($channel) { + $where = " where account_id = " . intval($channel['channel_account_id']) . " "; + } + else { + $where = " where account_email = '" . dbesc($login) . "' "; + } - $a = q("select * from account $where"); - if(! $a) { - return null; - } + $a = q("select * from account $where"); + if(! $a) { + return null; + } - $account = $a[0]; + $account = $a[0]; - // Currently we only verify email address if there is an open registration policy. - // This isn't because of any policy - it's because the workflow gets too complicated if - // you have to verify the email and then go through the account approval workflow before - // letting them login. + // Currently we only verify email address if there is an open registration policy. + // This isn't because of any policy - it's because the workflow gets too complicated if + // you have to verify the email and then go through the account approval workflow before + // letting them login. - if(($email_verify) && ($register_policy == REGISTER_OPEN) && ($account['account_flags'] & ACCOUNT_UNVERIFIED)) { - logger('email verification required for ' . $login); - return ( [ 'reason' => 'unvalidated' ] ); - } + if(($email_verify) && ($register_policy == REGISTER_OPEN) && ($account['account_flags'] & ACCOUNT_UNVERIFIED)) { + logger('email verification required for ' . $login); + return ( [ 'reason' => 'unvalidated' ] ); + } - if(($account['account_flags'] == ACCOUNT_OK) - && (hash('whirlpool',$account['account_salt'] . $pass) === $account['account_password'])) { - logger('password verified for ' . $login); - $ret['account'] = $account; - if($channel) - $ret['channel'] = $channel; - return $ret; + if($channel) { + // Try the authentication plugin again since weve determined we are using the channel login instead of account login + $addon_auth = [ + 'username' => $account['account_email'], + 'password' => trim($pass), + 'authenticated' => 0, + 'user_record' => null + ]; + + call_hooks('authenticate', $addon_auth); + + if(($addon_auth['authenticated']) && is_array($addon_auth['user_record']) && (! empty($addon_auth['user_record']))) { + $ret['account'] = $addon_auth['user_record']; + return $ret; + } + } + + if(($account['account_flags'] == ACCOUNT_OK) + && (hash('whirlpool',$account['account_salt'] . $pass) === $account['account_password'])) { + logger('password verified for ' . $login); + $ret['account'] = $account; + if($channel) + $ret['channel'] = $channel; + return $ret; + } } $error = 'password failed for ' . $login; @@ -242,52 +282,29 @@ else { if((x($_POST, 'auth-params')) && $_POST['auth-params'] === 'login') { - $record = null; - - $addon_auth = array( - 'username' => punify(trim($_POST['username'])), - 'password' => trim($_POST['password']), - 'authenticated' => 0, - 'user_record' => null - ); - - /** - * - * A plugin indicates successful login by setting 'authenticated' to non-zero value and returning a user record - * Plugins should never set 'authenticated' except to indicate success - as hooks may be chained - * and later plugins should not interfere with an earlier one that succeeded. - * - */ - - call_hooks('authenticate', $addon_auth); - $atoken = null; $account = null; + $channel = null; - if(($addon_auth['authenticated']) && (count($addon_auth['user_record']))) { - $account = $addon_auth['user_record']; + $verify = account_verify_password($_POST['username'], $_POST['password']); + if($verify && array_key_exists('reason',$verify) && $verify['reason'] === 'unvalidated') { + notice( t('Email validation is incomplete. Please check your email.')); + goaway(z_root() . '/email_validation/' . bin2hex(punify(trim(escape_tags($_POST['username']))))); + } + elseif($verify) { + $atoken = $verify['xchan']; + $channel = $verify['channel']; + $account = App::$account = $verify['account']; } - else { - $verify = account_verify_password($_POST['username'], $_POST['password']); - if($verify && array_key_exists('reason',$verify) && $verify['reason'] === 'unvalidated') { - notice( t('Email validation is incomplete. Please check your email.')); - goaway(z_root() . '/email_validation/' . bin2hex(punify(trim(escape_tags($_POST['username']))))); - } - elseif($verify) { - $atoken = $verify['xchan']; - $channel = $verify['channel']; - $account = App::$account = $verify['account']; - } - if(App::$account) { - $_SESSION['account_id'] = App::$account['account_id']; - } - elseif($atoken) { - atoken_login($atoken); - } - else { - notice( t('Failed authentication') . EOL); - } + if(App::$account) { + $_SESSION['account_id'] = App::$account['account_id']; + } + elseif($atoken) { + atoken_login($atoken); + } + else { + notice( t('Failed authentication') . EOL); } if(! ($account || $atoken)) { @@ -326,8 +343,9 @@ else { // if we haven't failed up this point, log them in. $_SESSION['last_login_date'] = datetime_convert(); - if(! $atoken) + if(! $atoken) { authenticate_success($account,$channel,true, true); + } } } diff --git a/include/channel.php b/include/channel.php index 11a5c5e63..d7c5a2511 100644 --- a/include/channel.php +++ b/include/channel.php @@ -1710,9 +1710,9 @@ function zid_init() { // try to avoid recursion - but send them home to do a proper magic auth $query = App::$query_string; $query = str_replace(array('?zid=','&zid='),array('?rzid=','&rzid='),$query); - $dest = '/' . urlencode($query); + $dest = '/' . $query; if($r && ($r[0]['hubloc_url'] != z_root()) && (! strstr($dest,'/magic')) && (! strstr($dest,'/rmagic'))) { - goaway($r[0]['hubloc_url'] . '/magic' . '?f=&rev=1&owa=1&dest=' . z_root() . $dest); + goaway($r[0]['hubloc_url'] . '/magic' . '?f=&rev=1&owa=1&bdest=' . bin2hex(z_root() . $dest)); } else logger('No hubloc found.'); @@ -1776,6 +1776,17 @@ function get_default_profile_photo($size = 300) { if(! $scheme) $scheme = 'rainbow_man'; + if(! is_dir('images/default_profile_photos/' . $scheme)) { + $x = [ 'scheme' => $scheme, 'size' => $size, 'url' => '' ]; + call_hooks('default_profile_photo',$x); + if($x['url']) { + return $x['url']; + } + else { + $scheme = 'rainbow_man'; + } + } + return 'images/default_profile_photos/' . $scheme . '/' . $size . '.png'; } @@ -2240,6 +2251,11 @@ function get_zcard_embed($channel, $observer_hash = '', $args = array()) { * - false if no channel with $nick was found */ function channelx_by_nick($nick) { + + // If we are provided a Unicode nickname convert to IDN + + $nick = punify($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) ); diff --git a/include/connections.php b/include/connections.php index 5a9e31950..76b26e468 100644 --- a/include/connections.php +++ b/include/connections.php @@ -120,7 +120,7 @@ function vcard_from_xchan($xchan, $observer = null, $mode = '') { App::$profile_uid = $xchan['channel_id']; $url = (($observer) - ? z_root() . '/magic?f=&owa=1&dest=' . $xchan['xchan_url'] . '&addr=' . $xchan['xchan_addr'] + ? z_root() . '/magic?f=&owa=1&bdest=' . bin2hex($xchan['xchan_url']) . '&addr=' . $xchan['xchan_addr'] : $xchan['xchan_url'] ); @@ -373,7 +373,6 @@ function contact_remove($channel_id, $abook_id) { if(intval($abook['abook_self'])) return false; - $r = q("select id from item where (owner_xchan = '%s' or author_xchan = '%s') and uid = %d and item_retained = 0 and item_starred = 0", dbesc($abook['abook_xchan']), dbesc($abook['abook_xchan']), @@ -383,13 +382,17 @@ function contact_remove($channel_id, $abook_id) { $r = fetch_post_tags($r,true); foreach($r as $rr) { - $terms = get_terms_oftype($item['term'],TERM_FILE); - if(! $terms) { - drop_item($rr['id'],false); + $x = q("select uid from term where otype = %d and oid = %d ttype = %d limit 1", + intval(TERM_OBJ_POST), + intval($rr['id']), + intval(TERM_FILE) + ); + if($x) { + continue; } + drop_item($rr['id'],false); } } - q("delete from abook where abook_id = %d and abook_channel = %d", intval($abook['abook_id']), diff --git a/include/conversation.php b/include/conversation.php index 97dd402fc..4997bc2b7 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -509,6 +509,7 @@ function conversation($items, $mode, $update, $page_mode = 'traditional', $prepa . ((x($_GET,'cmax')) ? '&cmax=' . $_GET['cmax'] : '') . ((x($_GET,'file')) ? '&file=' . $_GET['file'] : '') . ((x($_GET,'uri')) ? '&uri=' . $_GET['uri'] : '') + . ((x($_GET,'pf')) ? '&pf=' . $_GET['pf'] : '') . "'; var profile_page = " . App::$pager['page'] . "; </script>\r\n"; } } @@ -690,8 +691,10 @@ function conversation($items, $mode, $update, $page_mode = 'traditional', $prepa 'delete' => t('Delete'), ); - $star = false; - $isstarred = "unstarred fa-star-o"; + $star = array( + 'toggle' => t("Toggle Star Status"), + 'isstarred' => ((intval($item['item_starred'])) ? true : false), + ); $lock = (($item['item_private'] || strlen($item['allow_cid']) || strlen($item['allow_gid']) || strlen($item['deny_cid']) || strlen($item['deny_gid'])) ? t('Private Message') @@ -773,8 +776,7 @@ function conversation($items, $mode, $update, $page_mode = 'traditional', $prepa 'owner_photo' => $owner_photo, 'plink' => get_plink($item,false), 'edpost' => false, - 'isstarred' => $isstarred, - 'star' => $star, + 'star' => ((feature_enabled(local_channel(),'star_posts')) ? $star : ''), 'drop' => $drop, 'vote' => $likebuttons, 'like' => '', @@ -1001,18 +1003,21 @@ function thread_author_menu($item, $mode = '') { $profile_link = chanlink_hash($item['author_xchan']); $contact = false; - if(App::$contacts && array_key_exists($item['author_xchan'],App::$contacts)) - $contact = App::$contacts[$item['author_xchan']]; - else - if($local_channel && $item['author']['xchan_addr']) - $follow_url = z_root() . '/follow/?f=&url=' . urlencode($item['author']['xchan_addr']) . '&interactive=0'; - + if($channel['channel_hash'] !== $item['author_xchan']) { + if(App::$contacts && array_key_exists($item['author_xchan'],App::$contacts)) { + $contact = App::$contacts[$item['author_xchan']]; + } + else { + if($local_channel && $item['author']['xchan_addr'] && (! in_array($item['author']['xchan_network'],[ 'rss', 'anon','unknown' ]))) { + $follow_url = z_root() . '/follow/?f=&url=' . urlencode($item['author']['xchan_addr']) . '&interactive=0'; + } + } - if($item['uid'] > 0 && author_is_pmable($item['author'],$contact)) { - $pm_url = z_root() . '/mail/new/?f=&hash=' . urlencode($item['author_xchan']); + if($item['uid'] > 0 && author_is_pmable($item['author'],$contact)) { + $pm_url = z_root() . '/mail/new/?f=&hash=' . urlencode($item['author_xchan']); + } } - if($contact) { $poke_link = z_root() . '/poke/?f=&c=' . $contact['abook_id']; if (! intval($contact['abook_self'])) @@ -1159,7 +1164,7 @@ function builtin_activity_puller($item, &$conv_responses) { if((activity_match($item['verb'], $verb)) && ($item['id'] != $item['parent'])) { $name = (($item['author']['xchan_name']) ? $item['author']['xchan_name'] : t('Unknown')); $url = (($item['author_xchan'] && $item['author']['xchan_photo_s']) - ? '<a class="dropdown-item" href="' . chanlink_hash($item['author_xchan']) . '">' . '<img class="menu-img-1" src="' . zid($item['author']['xchan_photo_s']) . '" alt="' . urlencode($name) . '" />' . $name . '</a>' + ? '<a class="dropdown-item" href="' . chanlink_hash($item['author_xchan']) . '">' . '<img class="menu-img-1" src="' . zid($item['author']['xchan_photo_s']) . '" alt="' . urlencode($name) . '" /> ' . $name . '</a>' : '<a class="dropdown-item" href="#" class="disabled">' . $name . '</a>' ); @@ -1279,7 +1284,7 @@ function status_editor($a, $x, $popup = false) { if(x($x, 'hide_weblink')) $weblink = false; - $embedPhotos = t('Embed image from photo albums'); + $embedPhotos = t('Embed (existing) photo from your photo albums'); $writefiles = (($mimetype === 'text/bbcode') ? perm_is_allowed($x['profile_uid'], get_observer_hash(), 'write_storage') : false); if(x($x, 'hide_attach')) @@ -1301,6 +1306,8 @@ function status_editor($a, $x, $popup = false) { $id_select = ''; $webpage = ((x($x,'webpage')) ? $x['webpage'] : ''); + + $reset = ((x($x,'reset')) ? $x['reset'] : ''); $feature_auto_save_draft = ((feature_enabled($x['profile_uid'], 'auto_save_draft')) ? "true" : "false"); @@ -1326,6 +1333,7 @@ function status_editor($a, $x, $popup = false) { '$nocomment_enabled' => t('Comments enabled'), '$nocomment_disabled' => t('Comments disabled'), '$auto_save_draft' => $feature_auto_save_draft, + '$reset' => $reset )); $tpl = get_markup_template('jot.tpl'); @@ -1382,7 +1390,7 @@ function status_editor($a, $x, $popup = false) { '$underline' => t('Underline'), '$quote' => t('Quote'), '$code' => t('Code'), - '$attach' => t('Attach file'), + '$attach' => t('Attach/Upload file'), '$weblink' => $weblink, '$embedPhotos' => $embedPhotos, '$embedPhotosModalTitle' => t('Embed an image from your albums'), @@ -1438,7 +1446,8 @@ function status_editor($a, $x, $popup = false) { '$expiryModalCANCEL' => t('Cancel'), '$expanded' => ((x($x, 'expanded')) ? $x['expanded'] : false), '$bbcode' => ((x($x, 'bbcode')) ? $x['bbcode'] : false), - '$parent' => ((array_key_exists('parent',$x) && $x['parent']) ? $x['parent'] : 0) + '$parent' => ((array_key_exists('parent',$x) && $x['parent']) ? $x['parent'] : 0), + '$reset' => $reset )); if ($popup === true) { diff --git a/include/features.php b/include/features.php index c865f6754..03f50c9a4 100644 --- a/include/features.php +++ b/include/features.php @@ -237,8 +237,8 @@ function get_features($filtered = true, $level = (-1)) { [ 'permcats', - t('Permission Groups'), - t('Provide alternate connection permission roles.'), + t('Permission Categories'), + t('Create custom connection permission limits'), false, get_config('feature_lock','permcats'), feature_level('permcats',2), @@ -386,21 +386,39 @@ function get_features($filtered = true, $level = (-1)) { ], [ - 'personal_tab', - t('Network Personal Tab'), - t('Enable tab to display only Network posts that you\'ve interacted on'), + 'order_tab', + t('Alternate Stream Order'), + t('Ability to order the stream by last post date, last comment date or unthreaded activities'), false, - get_config('feature_lock','personal_tab'), - feature_level('personal_tab',1), + get_config('feature_lock','order_tab'), + feature_level('order_tab',2), + ], + + [ + 'name_tab', + t('Contact Filter'), + t('Ability to display only posts of a selected contact'), + false, + get_config('feature_lock','name_tab'), + feature_level('name_tab',1), ], [ - 'new_tab', - t('Network New Tab'), - t('Enable tab to display all new Network activity'), + 'forums_tab', + t('Forum Filter'), + t('Ability to display only posts of a specific forum'), false, - get_config('feature_lock','new_tab'), - feature_level('new_tab',2), + get_config('feature_lock','forums_tab'), + feature_level('forums_tab',1), + ], + + [ + 'personal_tab', + t('Personal Posts Filter'), + t('Ability to display only posts that you\'ve interacted on'), + false, + get_config('feature_lock','personal_tab'), + feature_level('personal_tab',1), ], [ diff --git a/include/feedutils.php b/include/feedutils.php index 023caaad6..afbe4229e 100644 --- a/include/feedutils.php +++ b/include/feedutils.php @@ -1332,6 +1332,12 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) { // immediate parent wasn't found. Turn into a top-level post if permissions allow // but save the thread_parent in case we need to refer to it later. + if($importer['channel_system']) { + if( ! \Zotlabs\Lib\MessageFilter::evaluate($datarray,get_config('system','pubstream_incl'),get_config('system','pubstream_excl'))) { + continue; + } + } + if(! post_is_importable($datarray, $contact)) continue; @@ -1482,6 +1488,12 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) { $author['owner_avatar'] = $contact['thumb']; } + if($importer['channel_system']) { + if( ! \Zotlabs\Lib\MessageFilter::evaluate($datarray,get_config('system','pubstream_incl'),get_config('system','pubstream_excl'))) { + continue; + } + } + if(! post_is_importable($datarray, $contact)) continue; diff --git a/include/follow.php b/include/follow.php index d803afa3f..964c43ff2 100644 --- a/include/follow.php +++ b/include/follow.php @@ -158,7 +158,7 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false) $feeds = get_config('system','feed_contacts'); - if(($feeds) && ($protocol === '' || $protocol === 'feed')) { + if(($feeds) && ($protocol === '' || $protocol === 'feed' || $protocol === 'rss')) { $d = discover_by_url($url); } else { @@ -204,7 +204,7 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false) $singleton = intval($x['singleton']); $aid = $channel['channel_account_id']; - $hash = get_observer_hash(); + $hash = $channel['channel_hash']; $default_group = $channel['channel_default_group']; if($hash == $xchan_hash) { diff --git a/include/group.php b/include/group.php index 03ebf7ee5..56bf210ff 100644 --- a/include/group.php +++ b/include/group.php @@ -279,14 +279,6 @@ function group_side($every="connections",$each="group",$edit = false, $group_id } $groups = array(); - - $groups[] = array( - 'text' => t('All Channels'), - 'id' => 0, - 'selected' => (($group_id == 0) ? 'group-selected' : ''), - 'href' => $every . (($every === 'network') ? '?f=&gid=0' : ''), - ); - $r = q("SELECT * FROM groups WHERE deleted = 0 AND uid = %d ORDER BY gname ASC", intval($_SESSION['uid']) diff --git a/include/import.php b/include/import.php index fb7826101..4953834c9 100644 --- a/include/import.php +++ b/include/import.php @@ -14,7 +14,7 @@ require_once('include/perm_upgrade.php'); * @param int $seize * @return boolean|array */ -function import_channel($channel, $account_id, $seize) { +function import_channel($channel, $account_id, $seize, $newname = '') { if(! array_key_exists('channel_system',$channel)) { $channel['channel_system'] = (($channel['channel_pageflags'] & 0x1000) ? 1 : 0); @@ -30,6 +30,11 @@ function import_channel($channel, $account_id, $seize) { $channel['channel_hash'] = make_xchan_hash($channel['channel_guid'],$channel['channel_guid_sig']); + if($newname) { + $channel['channel_address'] = $newname; + } + + // Check for duplicate channels $r = q("select * from channel where (channel_guid = '%s' or channel_hash = '%s' or channel_address = '%s' ) limit 1", @@ -1322,20 +1327,23 @@ function sync_files($channel, $files) { ); if($exists) { - if(! dbesc_array($p)) - continue; $str = ''; foreach($p as $k => $v) { + $matches = false; + if(preg_match('/([^a-zA-Z0-9\-\_\.])/',$k,$matches)) { + continue; + } + if($str) $str .= ","; - - $str .= " " . TQUOT . $k . TQUOT . " = '" . $v . "' "; + + $str .= " " . TQUOT . $k . TQUOT . " = '" . (($k === 'content') ? dbescbin($v) : dbesc($v)) . "' "; } $r = dbq("update photo set " . $str . " where id = " . intval($exists[0]['id']) ); } else { - create_table_from_array('photo',$p); + create_table_from_array('photo',$p, [ 'content' ] ); } } } diff --git a/include/items.php b/include/items.php index 0b8ec7075..9dd5d005b 100755 --- a/include/items.php +++ b/include/items.php @@ -19,9 +19,10 @@ require_once('include/permissions.php'); * * @param array $item * @param[out] boolean $private_envelope + * @param boolean $include_groups * @return array containing the recipients */ -function collect_recipients($item, &$private_envelope) { +function collect_recipients($item, &$private_envelope,$include_groups = true) { require_once('include/group.php'); @@ -34,7 +35,12 @@ function collect_recipients($item, &$private_envelope) { $allow_people = expand_acl($item['allow_cid']); - $allow_groups = expand_groups(expand_acl($item['allow_gid'])); + if($include_groups) { + $allow_groups = expand_groups(expand_acl($item['allow_gid'])); + } + else { + $allow_groups = []; + } $recipients = array_unique(array_merge($allow_people,$allow_groups)); @@ -178,7 +184,7 @@ function item_normal() { } function item_normal_search() { - return " and item.item_hidden = 0 and item.item_type in (0,3,6) and item.item_deleted = 0 + return " and item.item_hidden = 0 and item.item_type in (0,3,6,7) 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 and item.obj_type != '" . ACTIVITY_OBJ_FILE . "' "; } @@ -974,12 +980,10 @@ function empty_acl($item) { } function encode_item($item,$mirror = false) { - $x = array(); + $x = []; $x['type'] = 'activity'; $x['encoding'] = 'zot'; -// logger('encode_item: ' . print_r($item,true)); - $r = q("select channel_id from channel where channel_id = %d limit 1", intval($item['uid']) ); @@ -1356,7 +1360,7 @@ function encode_item_flags($item) { } function encode_mail($item,$extended = false) { - $x = array(); + $x = []; $x['type'] = 'mail'; $x['encoding'] = 'zot'; @@ -2948,6 +2952,20 @@ function start_delivery_chain($channel, $item, $item_id, $parent) { } } } + + // This will change the author to the post owner. Useful for RSS feeds which are to be syndicated + // to federated platforms which can't verify the identity of the author. + // This MAY cause you to run afoul of copyright law. + + $rewrite_author = intval(get_abconfig($channel['channel_id'],$item['owner_xchan'],'system','rself')); + if($rewrite_author) { + $item['author_xchan'] = $channel['channel_hash']; + + $r = q("update item set author_xchan = '%s' where id = %d", + dbesc($item['author_xchan']), + intval($item_id) + ); + } } // Change this copy of the post to a forum head message and deliver to all the tgroup members @@ -3007,9 +3025,6 @@ function start_delivery_chain($channel, $item, $item_id, $parent) { intval($item_id) ); - - - if($r) Zotlabs\Daemon\Master::Summon(array('Notifier','tgroup',$item_id)); else { @@ -3032,62 +3047,56 @@ function start_delivery_chain($channel, $item, $item_id, $parent) { * @param array $item */ function check_item_source($uid, $item) { + + logger('source: uid: ' . $uid, LOGGER_DEBUG); + $xchan = (($item['source_xchan']) ? $item['source_xchan'] : $item['owner_xchan']); + $r = q("select * from source where src_channel_id = %d and ( src_xchan = '%s' or src_xchan = '*' ) limit 1", intval($uid), - dbesc(($item['source_xchan']) ? $item['source_xchan'] : $item['owner_xchan']) + dbesc($xchan) ); - if(! $r) + if(! $r) { + logger('source: no source record for this channel and source', LOGGER_DEBUG); return false; + } - $x = q("select abook_their_perms, abook_feed from abook where abook_channel = %d and abook_xchan = '%s' limit 1", + $x = q("select abook_feed from abook where abook_channel = %d and abook_xchan = '%s' limit 1", intval($uid), - dbesc($item['owner_xchan']) + dbesc($xchan) ); - if(! $x) + if(! $x) { + logger('source: not connected to this channel.'); return false; + } - if(! get_abconfig($uid,$item['owner_xchan'],'their_perms','republish')) + if(! get_abconfig($uid,$xchan,'their_perms','republish')) { + logger('source: no republish permission'); return false; + } - if($item['item_private'] && (! intval($x[0]['abook_feed']))) + if($item['item_private'] && (! intval($x[0]['abook_feed']))) { + logger('source: item is private'); return false; + } - if($r[0]['src_channel_xchan'] === $item['owner_xchan']) + if($r[0]['src_channel_xchan'] === $xchan) { + logger('source: cannot source yourself'); return false; + } - - // since we now have connection filters with more features, the source filter is redundant and can probably go away - - if(! $r[0]['src_patt']) + if (! $r[0]['src_patt']) { + logger('source: success'); return true; + } - - require_once('include/html2plain.php'); - $text = prepare_text($item['body'],$item['mimetype']); - $text = html2plain($text); - - $tags = ((count($item['term'])) ? $item['term'] : false); - - $words = explode("\n",$r[0]['src_patt']); - if($words) { - foreach($words as $word) { - $w = trim($word); - if(! $w) - continue; - if(substr($w,0,1) === '#' && $tags) { - foreach($tags as $t) - if((($t['ttype'] == TERM_HASHTAG) || ($t['ttype'] == TERM_COMMUNITYTAG)) && (($t['term'] === substr($w,1)) || (substr($w,1) === '*'))) - return true; - } - elseif((strpos($w,'/') === 0) && preg_match($w,$text)) - return true; - elseif(stristr($text,$w) !== false) - return true; - } + if (\Zotlabs\Lib\MessageFilter::evaluate($item, $r[0]['src_patt'], EMPTY_STR)) { + logger('source: text filter success'); + return true; } + logger('source: filter fail'); return false; } @@ -3105,69 +3114,8 @@ function post_is_importable($item,$abook) { if(! ($abook['abook_incl'] || $abook['abook_excl'])) return true; - require_once('include/html2plain.php'); - - unobscure($item); - - $text = prepare_text($item['body'],$item['mimetype']); - $text = html2plain(($item['title']) ? $item['title'] . ' ' . $text : $text); - - - $lang = null; - - if((strpos($abook['abook_incl'],'lang=') !== false) || (strpos($abook['abook_excl'],'lang=') !== false)) { - $lang = detect_language($text); - } - $tags = ((count($item['term'])) ? $item['term'] : false); - - // exclude always has priority - - $exclude = (($abook['abook_excl']) ? explode("\n",$abook['abook_excl']) : null); - - if($exclude) { - foreach($exclude as $word) { - $word = trim($word); - if(! $word) - continue; - if(substr($word,0,1) === '#' && $tags) { - foreach($tags as $t) - if((($t['ttype'] == TERM_HASHTAG) || ($t['ttype'] == TERM_COMMUNITYTAG)) && (($t['term'] === substr($word,1)) || (substr($word,1) === '*'))) - return false; - } - elseif((strpos($word,'/') === 0) && preg_match($word,$text)) - return false; - elseif((strpos($word,'lang=') === 0) && ($lang) && (strcasecmp($lang,trim(substr($word,5))) == 0)) - return false; - elseif(stristr($text,$word) !== false) - return false; - } - } - - $include = (($abook['abook_incl']) ? explode("\n",$abook['abook_incl']) : null); + return \Zotlabs\Lib\MessageFilter::evaluate($item,$abook['abook_incl'],$abook['abook_excl']); - if($include) { - foreach($include as $word) { - $word = trim($word); - if(! $word) - continue; - if(substr($word,0,1) === '#' && $tags) { - foreach($tags as $t) - if((($t['ttype'] == TERM_HASHTAG) || ($t['ttype'] == TERM_COMMUNITYTAG)) && (($t['term'] === substr($word,1)) || (substr($word,1) === '*'))) - return true; - } - elseif((strpos($word,'/') === 0) && preg_match($word,$text)) - return true; - elseif((strpos($word,'lang=') === 0) && ($lang) && (strcasecmp($lang,trim(substr($word,5))) == 0)) - return true; - elseif(stristr($text,$word) !== false) - return true; - } - } - else { - return true; - } - - return false; } @@ -3561,7 +3509,6 @@ function item_expire($uid,$days,$comment_days = 7) { drop_item($item['id'],false); } -// Zotlabs\Daemon\Master::Summon(array('Notifier','expire',$uid)); } function retain_item($id) { diff --git a/include/js_strings.php b/include/js_strings.php index 936594291..d9038e838 100644 --- a/include/js_strings.php +++ b/include/js_strings.php @@ -23,6 +23,16 @@ function js_strings() { '$linkurl' => t('Please enter a link URL'), '$leavethispage' => t('Unsaved changes. Are you sure you wish to leave this page?'), '$location' => t('Location'), + '$lovely' => t('lovely'), + '$wonderful' => t('wonderful'), + '$fantastic' => t('fantastic'), + '$great' => t('great'), + '$nick_invld1' => t('Your chosen nickname was either already taken or not valid. Please use our suggestion ('), + '$nick_invld2' => t(') or enter a new one.'), + '$nick_valid' => t('Thank you, this nickname is valid.'), + '$name_empty' => t('A channel name is required.'), + '$name_ok1' => t('This is a '), + '$name_ok2' => t(' channel name'), // translatable prefix and suffix strings for jquery.timeago - // using the defaults set below if left untranslated, empty strings if diff --git a/include/language.php b/include/language.php index d0ecd3a85..69a7e3004 100644 --- a/include/language.php +++ b/include/language.php @@ -242,7 +242,7 @@ function tt($singular, $plural, $count, $ctx = ''){ if (! function_exists($f)) $f = 'string_plural_select_default'; - $k = $f($count); + $k = $f(intval($count)); return is_array($t) ? $t[$k] : $t; } diff --git a/include/markdown.php b/include/markdown.php index 431ba84a4..de9862801 100644 --- a/include/markdown.php +++ b/include/markdown.php @@ -75,10 +75,10 @@ function markdown_to_bb($s, $use_zrl = false, $options = []) { // Convert everything that looks like a link to a link if($use_zrl) { $s = str_replace(['[img', '/img]'], ['[zmg', '/zmg]'], $s); - $s = preg_replace("/([^\]\=]|^)(https?\:\/\/)([a-zA-Z0-9\pL\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,\@\(\)]+)/ismu", '$1[zrl=$2$3]$2$3[/zrl]',$s); + $s = preg_replace("/([^\]\=\{]|^)(https?\:\/\/)([a-zA-Z0-9\pL\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,\@\(\)]+)/ismu", '$1[zrl=$2$3]$2$3[/zrl]',$s); } else { - $s = preg_replace("/([^\]\=]|^)(https?\:\/\/)([a-zA-Z0-9\pL\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,\@\(\)]+)/ismu", '$1[url=$2$3]$2$3[/url]',$s); + $s = preg_replace("/([^\]\=\{]|^)(https?\:\/\/)([a-zA-Z0-9\pL\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,\@\(\)]+)/ismu", '$1[url=$2$3]$2$3[/url]',$s); } // remove duplicate adjacent code tags diff --git a/include/menu.php b/include/menu.php index 4add78c39..1a2059451 100644 --- a/include/menu.php +++ b/include/menu.php @@ -81,6 +81,10 @@ function menu_render($menu, $class='', $edit = false, $var = array()) { if ((! $channel_id) && (local_channel())) $channel_id = local_channel(); + $chan = channelx_by_n($channel_id); + if(! $chan) + return ''; + $menu_list = menu_list($channel_id); $menu_names = array(); @@ -110,6 +114,7 @@ function menu_render($menu, $class='', $edit = false, $var = array()) { $ret = replace_macros(get_markup_template('usermenu.tpl'),array( '$menu' => $menu['menu'], '$class' => $class, + '$nick' => $chan['channel_address'], '$edit' => (($edit) ? t("Edit") : ''), '$id' => $menu['menu']['menu_id'], '$items' => $menu['items'], diff --git a/include/nav.php b/include/nav.php index a443c58ff..41358c93e 100644 --- a/include/nav.php +++ b/include/nav.php @@ -17,15 +17,7 @@ function nav($template = 'default') { if(!(x(App::$page,'nav'))) App::$page['nav'] = ''; - $base = z_root(); - - App::$page['htmlhead'] .= <<< EOT -<script>$(document).ready(function() { - $("#nav-search-text").search_autocomplete('$base/acl'); -}); - -</script> -EOT; + App::$page['htmlhead'] .= '<script>$(document).ready(function() { $("#nav-search-text").search_autocomplete(\'' . z_root() . '/acl' . '\');});</script>'; $is_owner = (((local_channel()) && ((App::$profile_uid == local_channel()) || (App::$profile_uid == 0))) ? true : false); @@ -99,8 +91,10 @@ EOT; if(local_channel()) { if(! $_SESSION['delegate']) { - $nav['manage'] = array('manage', t('Channel Manager'), "", t('Manage Your Channels'),'manage_nav_btn'); + $nav['manage'] = array('manage', t('Channel Manager'), "", t('Manage your channels'),'manage_nav_btn'); } + if(feature_enabled(local_channel(),'groups')) + $nav['group'] = array('group', t('Privacy Groups'),"", t('Manage your privacy groups'),'group_nav_btn'); $nav['settings'] = array('settings', t('Settings'),"", t('Account/Channel Settings'),'settings_nav_btn'); @@ -176,21 +170,19 @@ EOT; $nav['help'] = [$help_url, t('Help'), "", t('Help and documentation'), 'help_nav_btn', $context_help, $enable_context_help]; } - $nav['search'] = ['search', t('Search'), "", t('Search site @name, !forum, #tag, ?docs, content')]; - + switch(App::$module) { + case 'network': + $search_form_action = 'network'; + break; + case 'channel': + $search_form_action = 'channel'; + break; + default: + $search_form_action = 'search'; + } - /** - * - * The following nav links are only show to logged in users - * - */ - if(local_channel()) { - if(! $_SESSION['delegate']) { - $nav['manage'] = array('manage', t('Channel Manager'), "", t('Manage Your Channels'),'manage_nav_btn'); - } - $nav['settings'] = array('settings', t('Settings'),"", t('Account/Channel Settings'),'settings_nav_btn'); - } + $nav['search'] = ['search', t('Search'), "", t('Search site @name, !forum, #tag, ?docs, content'), $search_form_action]; /** * Admin page @@ -220,9 +212,9 @@ EOT; //app bin if($is_owner) { - if(get_pconfig(local_channel(), 'system','initial_import_system_apps') === false) { + if(get_pconfig(local_channel(), 'system','import_system_apps') !== datetime_convert('UTC','UTC','now','Y-m-d')) { Zlib\Apps::import_system_apps(); - set_pconfig(local_channel(), 'system','initial_import_system_apps', 1); + set_pconfig(local_channel(), 'system','import_system_apps', datetime_convert('UTC','UTC','now','Y-m-d')); } $syslist = array(); diff --git a/include/network.php b/include/network.php index 93b27b436..91a39a6cb 100644 --- a/include/network.php +++ b/include/network.php @@ -468,13 +468,21 @@ function z_dns_check($h,$check_mx = 0) { && \App::$config['system']['do_not_check_dns']) return true; + // This will match either Windows or Mac ('Darwin') + if(stripos(PHP_OS,'win') !== false) + return true; + + // BSD variants have dns_get_record() but it only works reliably without any options + if(stripos(PHP_OS,'bsd') !== false) + return((@dns_get_record($h) || filter_var($h, FILTER_VALIDATE_IP)) ? true : false); + + // Otherwise we will assume dns_get_record() works as documented - //$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); + $opts = DNS_A + DNS_CNAME + DNS_PTR; + if($check_mx) + $opts += DNS_MX; + + return((@dns_get_record($h,$opts) || filter_var($h, FILTER_VALIDATE_IP)) ? true : false); } /** @@ -999,7 +1007,7 @@ function discover_by_url($url, $arr = null) { return false; $network = (($arr['network']) ? $arr['network'] : 'unknown'); - $name = (($arr['name']) ? $arr['name'] : 'unknown'); + $name = (trim($arr['name']) ? trim($arr['name']) : 'unknown'); $photo = (($arr['photo']) ? $arr['photo'] : ''); $addr = (($arr['addr']) ? $arr['addr'] : ''); $guid = $url; @@ -1103,6 +1111,9 @@ function discover_by_url($url, $arr = null) { if(! $name) $name = notags($feed->get_description()); + if(! trim($name)) + $name = 'unknown'; + $r = q("select * from xchan where xchan_hash = '%s' limit 1", dbesc($guid) ); @@ -1213,7 +1224,7 @@ function webfinger_rfc7033($webbie, $zot = false) { if(strpos($webbie,'@')) { $lhs = substr($webbie,0,strpos($webbie,'@')); $rhs = substr($webbie,strpos($webbie,'@')+1); - $resource = 'acct:' . $webbie; + $resource = urlencode('acct:' . $webbie); } else { $m = parse_url($webbie); @@ -1231,7 +1242,7 @@ function webfinger_rfc7033($webbie, $zot = false) { $counter = 0; $s = z_fetch_url('https://' . $rhs . '/.well-known/webfinger?f=&resource=' . $resource . (($zot) ? '&zot=1' : ''), - false, $counter, [ 'headers' => [ 'Accept: application/jrd+json, */*' ] ]); + false, $counter, [ 'headers' => [ 'Accept: application/jrd+json, application/json, */*' ] ]); if($s['success']) { $j = json_decode($s['body'], true); @@ -2052,4 +2063,4 @@ function jsonld_document_loader($url) { } return []; -}
\ No newline at end of file +} diff --git a/include/oauth.php b/include/oauth.php index a3c52bf27..845ec4558 100644 --- a/include/oauth.php +++ b/include/oauth.php @@ -79,7 +79,7 @@ class ZotOAuth1DataStore extends OAuth1DataStore { $k = $consumer; } - $r = q("INSERT INTO tokens (id, secret, client_id, auth_scope, expires) VALUES ('%s','%s','%s','%s', %d)", + $r = q("INSERT INTO tokens (id, secret, client_id, auth_scope, expires, uid) VALUES ('%s','%s','%s','%s', %d, 0)", dbesc($key), dbesc($sec), dbesc($k), diff --git a/include/oembed.php b/include/oembed.php index e677087a2..41ab001d3 100755 --- a/include/oembed.php +++ b/include/oembed.php @@ -105,6 +105,7 @@ function oembed_action($embedurl) { // if the url is embeddable with oembed, return the bbcode link. function oembed_process($url) { + $j = oembed_fetch_url($url); logger('oembed_process: ' . print_r($j,true), LOGGER_DATA, LOG_DEBUG); if($j && $j['type'] !== 'error') @@ -132,6 +133,7 @@ function oembed_fetch_url($embedurl){ } } + $txt = null; // we should try to cache this and avoid a lookup on each render @@ -217,10 +219,19 @@ function oembed_fetch_url($embedurl){ } - $j = json_decode($txt,true); + if(strpos(strtolower($embedurl),'.pdf') !== false) { + $action = 'allow'; + $j = [ 'html' => '<object data="' . $embedurl . '" type="application/pdf" width="500" height="720">' . '<a href="' . $embedurl . '">' . t('View PDF') . '</a></object>', 'width' => 500, 'height' => 720, 'type' => 'pdf' ]; + + } - if(! $j) + if(! $j) { + $j = json_decode($txt,true); + } + + if(! $j) { $j = []; + } if($action === 'filter') { if($j['html']) { @@ -317,6 +328,11 @@ function oembed_format_object($j){ //$ret = "<a href='".$embedurl."'>".$j['title']."</a>"; }; break; + case 'pdf': { + $ret = $j['html']; + break; + } + case "rich": { // not so safe.. $ret.= $jhtml; diff --git a/include/photos.php b/include/photos.php index 9ae0e6874..d0c5f77fc 100644 --- a/include/photos.php +++ b/include/photos.php @@ -80,14 +80,15 @@ function photo_upload($channel, $observer, $args) { if($imagick_path && @file_exists($imagick_path)) { $tmp_name = $args['os_syspath'] . '-001'; $newsize = photo_calculate_scale(array_merge($args['getimagesize'],['max' => $max_thumb])); - $cmd = $imagick_path . ' ' . escapeshellarg(PROJECT_BASE . '/' . $args['os_syspath']) . ' -thumbnail ' . $newsize . ' ' . escapeshellarg(PROJECT_BASE . '/' . $tmp_name); - // logger('imagick thumbnail command: ' . $cmd); + $cmd = $imagick_path . ' ' . escapeshellarg(PROJECT_BASE . '/' . $args['os_syspath']) . ' -resize ' . $newsize . ' ' . escapeshellarg(PROJECT_BASE . '/' . $tmp_name); + logger('imagick thumbnail command: ' . $cmd); for($x = 0; $x < 4; $x ++) { exec($cmd); - if(! file_exists($tmp_name)) { - logger('imagick scale failed. Retrying.'); - continue; + if(file_exists($tmp_name)) { + break; } + logger('imagick scale failed. Retrying.'); + continue; } if(! file_exists($tmp_name)) { logger('imagick scale failed. Abort.'); @@ -96,7 +97,7 @@ function photo_upload($channel, $observer, $args) { $imagedata = @file_get_contents($tmp_name); $filesize = @filesize($args['os_syspath']); - @unlink($tmp_name); +// @unlink($tmp_name); } else { $imagedata = @file_get_contents($args['os_syspath']); @@ -786,17 +787,31 @@ function photos_album_get_db_idstr($channel_id, $album, $remote_xchan = '') { ); } if ($r) { - $arr = array(); - foreach ($r as $rr) { - $arr[] = "'" . dbesc($rr['hash']) . "'" ; - } - $str = implode(',',$arr); - return $str; + return ids_to_querystr($r,'hash',true); } return false; } +function photos_album_get_db_idstr_admin($channel_id, $album) { + + if(! is_site_admin()) + return false; + + $r = q("SELECT hash from attach where uid = %d and folder = '%s' ", + intval($channel_id), + dbesc($album) + ); + + if ($r) { + return ids_to_querystr($r,'hash',true); + } + + return false; +} + + + /** * @brief Creates a new photo item. * @@ -996,3 +1011,23 @@ function profile_photo_set_profile_perms($uid, $profileid = 0) { } } } + +function fetch_image_from_url($url,&$mimetype) { + + $redirects = 0; + $x = z_fetch_url($url,true,$redirects,[ 'novalidate' => true ]); + if($x['success']) { + $hdrs = []; + $h = explode("\n",$x['header']); + foreach ($h as $l) { + list($k,$v) = array_map("trim", explode(":", trim($l), 2)); + $hdrs[strtolower($k)] = $v; + } + if (array_key_exists('content-type', $hdrs)) + $mimetype = $hdrs['content-type']; + + return $x['body']; + } + + return EMPTY_STR; +}
\ No newline at end of file diff --git a/include/plugin.php b/include/plugin.php index 4545e1e8d..734c20d79 100755 --- a/include/plugin.php +++ b/include/plugin.php @@ -53,10 +53,15 @@ function unload_plugin($plugin){ * @return boolean */ function uninstall_plugin($plugin) { + unload_plugin($plugin); - if(! file_exists('addon/' . $plugin . '/' . $plugin . '.php')) + if(! file_exists('addon/' . $plugin . '/' . $plugin . '.php')) { + q("DELETE FROM addon WHERE aname = '%s' ", + dbesc($plugin) + ); return false; + } logger("Addons: uninstalling " . $plugin); //$t = @filemtime('addon/' . $plugin . '/' . $plugin . '.php'); @@ -73,6 +78,7 @@ function uninstall_plugin($plugin) { q("DELETE FROM addon WHERE aname = '%s' ", dbesc($plugin) ); + } /** @@ -553,7 +559,7 @@ function get_widget_info($widget){ $checkpaths = [ "Zotlabs/SiteWidget/$ucwidget.php", - "Zotlibs/Widget/$ucwidget.php", + "Zotlabs/Widget/$ucwidget.php", "addon/$ucwidget/$ucwidget.php", "addon/$widget.php" ]; diff --git a/include/security.php b/include/security.php index 19278d5cb..88988a7c0 100644 --- a/include/security.php +++ b/include/security.php @@ -118,10 +118,10 @@ function atoken_xchan($atoken) { 'xchan_network' => 'unknown', 'xchan_url' => z_root() . '/guest/' . substr($c['channel_hash'],0,16) . '.' . $atoken['atoken_name'], 'xchan_hidden' => 1, - 'xchan_photo_mimetype' => 'image/jpeg', - 'xchan_photo_l' => get_default_profile_photo(300), - 'xchan_photo_m' => get_default_profile_photo(80), - 'xchan_photo_s' => get_default_profile_photo(48) + 'xchan_photo_mimetype' => 'image/png', + 'xchan_photo_l' => z_root() . '/' . get_default_profile_photo(300), + 'xchan_photo_m' => z_root() . '/' . get_default_profile_photo(80), + 'xchan_photo_s' => z_root() . '/' . get_default_profile_photo(48) ]; } diff --git a/include/text.php b/include/text.php index af88c9f9c..e894c5ce5 100644 --- a/include/text.php +++ b/include/text.php @@ -572,7 +572,7 @@ function item_message_id() { $r = q("SELECT id FROM item WHERE mid = '%s' LIMIT 1", dbesc($mid)); - if(count($r)) + if($r) $dups = true; } while($dups == true); @@ -593,7 +593,7 @@ function photo_new_resource() { $r = q("SELECT id FROM photo WHERE resource_id = '%s' LIMIT 1", dbesc($resource)); - if(count($r)) + if($r) $found = true; } while($found === true); @@ -665,7 +665,7 @@ function logger($msg, $level = LOGGER_NORMAL, $priority = LOG_INFO) { $stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); $where = basename($stack[0]['file']) . ':' . $stack[0]['line'] . ':' . $stack[1]['function'] . ': '; - $s = datetime_convert('UTC','UTC', 'now', ATOM_TIME) . ':' . log_priority_str($priority) . ':' . session_id() . ':' . $where . $msg . PHP_EOL; + $s = datetime_convert('UTC','UTC', 'now', ATOM_TIME) . ':' . log_priority_str($priority) . ':' . logid() . ':' . $where . $msg . PHP_EOL; $pluginfo = array('filename' => $logfile, 'loglevel' => $level, 'message' => $s,'priority' => $priority, 'logged' => false); if(! (App::$module == 'setup')) @@ -675,6 +675,13 @@ function logger($msg, $level = LOGGER_NORMAL, $priority = LOG_INFO) { @file_put_contents($pluginfo['filename'], $pluginfo['message'], FILE_APPEND); } +function logid() { + $x = session_id(); + if(! $x) + $x = getmypid(); + return substr(hash('whirlpool',$x),0,10); +} + /** * @brief like logger() but with a function backtrace to pinpoint certain classes * of problems which show up deep in the calling stack. @@ -693,7 +700,7 @@ function btlogger($msg, $level = LOGGER_NORMAL, $priority = LOG_INFO) { if(file_exists(BTLOGGER_DEBUG_FILE) && is_writable(BTLOGGER_DEBUG_FILE)) { $stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); $where = basename($stack[0]['file']) . ':' . $stack[0]['line'] . ':' . $stack[1]['function'] . ': '; - $s = datetime_convert('UTC','UTC', 'now', ATOM_TIME) . ':' . log_priority_str($priority) . ':' . session_id() . ':' . $where . $msg . PHP_EOL; + $s = datetime_convert('UTC','UTC', 'now', ATOM_TIME) . ':' . log_priority_str($priority) . ':' . logid() . ':' . $where . $msg . PHP_EOL; @file_put_contents(BTLOGGER_DEBUG_FILE, $s, FILE_APPEND); } @@ -764,7 +771,7 @@ function dlogger($msg, $level = 0) { $where = basename($stack[0]['file']) . ':' . $stack[0]['line'] . ':' . $stack[1]['function'] . ': '; - @file_put_contents($logfile, datetime_convert('UTC','UTC', 'now', ATOM_TIME) . ':' . session_id() . ' ' . $where . $msg . PHP_EOL, FILE_APPEND); + @file_put_contents($logfile, datetime_convert('UTC','UTC', 'now', ATOM_TIME) . ':' . logid() . ' ' . $where . $msg . PHP_EOL, FILE_APPEND); } @@ -816,41 +823,36 @@ function get_tags($s) { // match any double quoted tags - if(preg_match_all('/([@#!]\"\;.*?\"\;)/',$s,$match)) { + if(preg_match_all('/([@#\!]\"\;.*?\"\;)/',$s,$match)) { foreach($match[1] as $mtch) { $ret[] = $mtch; } } - // Match full names against @tags including the space between first and last - // We will look these up afterward to see if they are full names or not recognisable. - - // The lookbehind is used to prevent a match in the middle of a word - // '=' needs to be avoided because when the replacement is made (in handle_tag()) it has to be ignored there - // Feel free to allow '=' if the issue with '=' is solved in handle_tag() - // added / ? and [ to avoid issues with hashchars in url paths - - // added ; to single word tags to allow emojis and other unicode character constructs in bbcode - // (this would actually be &#xnnnnn; but the ampersand will have been escaped to & by the time we see it.) + // match bracket mentions - if(preg_match_all('/(?<![a-zA-Z0-9=\pL\/\?])(@[^ \x0D\x0A,:?\[]+ [^ \x0D\x0A@,:?\[]+)/u',$s,$match)) { + if(preg_match_all('/([@!]\!?\{.*?\})/',$s,$match)) { foreach($match[1] as $mtch) { - if(substr($mtch,-1,1) === '.') - $ret[] = substr($mtch,0,-1); - else - $ret[] = $mtch; + $ret[] = $mtch; } } - // Otherwise pull out single word tags. These can be @nickname, @first_last + // Pull out single word tags. These can be @nickname, @first_last // and #hash tags. - if(preg_match_all('/(?<![a-zA-Z0-9=\pL\/\?\;])([@#\!][^ \x0D\x0A,;:?\[]+)/u',$s,$match)) { + if(preg_match_all('/(?<![a-zA-Z0-9=\pL\/\?\;])([@#\!]\!?[^ \x0D\x0A,;:\?\[\{\&]+)/u',$s,$match)) { foreach($match[1] as $mtch) { + + // Cleanup/ignore false positives + + // Just ignore these rather than try and adjust the regex to deal with them + if(in_array($mtch,[ '@!', '!!' ])) + continue; + // likewise for trailing period. Strip it off rather than complicate the regex further. if(substr($mtch,-1,1) === '.') $mtch = substr($mtch,0,-1); // ignore strictly numeric tags like #1 or #^ bookmarks or ## double hash - if((strpos($mtch,'#') === 0) && ( ctype_digit(substr($mtch,1)) || substr($mtch,1,1) === '^') || substr($mtch,1,1) === '#') + if((strpos($mtch,'#') === 0) && ( ctype_digit(substr($mtch,1)) || in_array(substr($mtch,1,1), [ '^', '#' ]))) continue; // or quote remnants from the quoted strings we already picked out earlier if(strpos($mtch,'"')) @@ -875,7 +877,7 @@ function get_tags($s) { usort($ret,'tag_sort_length'); -// logger('get_tags: ' . print_r($ret,true)); + // logger('get_tags: ' . print_r($ret,true)); return $ret; } @@ -1016,28 +1018,37 @@ function chanlink_cid($d) { function magiclink_url($observer,$myaddr,$url) { return (($observer) - ? z_root() . '/magic?f=&owa=1&dest=' . $url . '&addr=' . $myaddr + ? z_root() . '/magic?f=&owa=1&bdest=' . bin2hex($url) . '&addr=' . $myaddr : $url ); } -function micropro($contact, $redirect = false, $class = '', $textmode = false) { +function micropro($contact, $redirect = false, $class = '', $mode = false) { if($contact['click']) $url = '#'; else $url = chanlink_hash($contact['xchan_hash']); - return replace_macros(get_markup_template(($textmode)?'micropro_txt.tpl':'micropro_img.tpl'),array( + + $tpl = 'micropro_img.tpl'; + if($mode === true) + $tpl = 'micropro_txt.tpl'; + if($mode === 'card') + $tpl = 'micropro_card.tpl'; + + return replace_macros(get_markup_template($tpl), array( '$click' => (($contact['click']) ? $contact['click'] : ''), '$class' => $class . (($contact['archived']) ? ' archived' : ''), '$oneway' => (($contact['oneway']) ? true : false), '$url' => $url, '$photo' => $contact['xchan_photo_s'], '$name' => $contact['xchan_name'], + '$addr' => $contact['xchan_addr'], '$title' => $contact['xchan_name'] . ' [' . $contact['xchan_addr'] . ']', + '$network' => sprintf(t('Network: %s'), $contact['xchan_network']) )); } @@ -1420,15 +1431,21 @@ function unobscure_mail(&$item) { function theme_attachments(&$item) { $arr = json_decode($item['attach'],true); + if(is_array($arr) && count($arr)) { $attaches = array(); foreach($arr as $r) { $icon = getIconFromType($r['type']); - $label = (($r['title']) ? urldecode(htmlspecialchars($r['title'], ENT_COMPAT, 'UTF-8')) : t('Unknown Attachment')); + + if($r['title']) + $label = urldecode(htmlspecialchars($r['title'], ENT_COMPAT, 'UTF-8')); + + if(! $label && $r['href']) + $label = basename($r['href']); //some feeds provide an attachment where title an empty space - if($label == ' ') + if(! $label || $label == ' ') $label = t('Unknown Attachment'); $title = t('Size') . ' ' . (($r['length']) ? userReadableSize($r['length']) : t('unknown')); @@ -1437,7 +1454,7 @@ function theme_attachments(&$item) { if(is_foreigner($item['author_xchan'])) $url = $r['href']; else - $url = z_root() . '/magic?f=&owa=1&hash=' . $item['author_xchan'] . '&dest=' . $r['href'] . '/' . $r['revision']; + $url = z_root() . '/magic?f=&owa=1&hash=' . $item['author_xchan'] . '&bdest=' . bin2hex($r['href'] . '/' . $r['revision']); //$s .= '<a href="' . $url . '" title="' . $title . '" class="attachlink" >' . $icon . '</a>'; $attaches[] = array('label' => $label, 'url' => $url, 'icon' => $icon, 'title' => $title); @@ -2025,22 +2042,40 @@ function item_post_type($item) { function undo_post_tagging($s) { $matches = null; + $x = null; // undo tags and mentions $cnt = preg_match_all('/([@#])(\!*)\[zrl=(.*?)\](.*?)\[\/zrl\]/ism',$s,$matches,PREG_SET_ORDER); if($cnt) { foreach($matches as $mtch) { - $s = str_replace($mtch[0], $mtch[1] . $mtch[2] . quote_tag($mtch[4]),$s); + if($mtch[1] === '@') { + $x = q("select xchan_addr, xchan_url from xchan where xchan_url = '%s' limit 1", + dbesc($mtch[3]) + ); + } + if($x) { + $s = str_replace($mtch[0], $mtch[1] . $mtch[2] . '{' . (($x[0]['xchan_addr']) ? $x[0]['xchan_addr'] : $x[0]['xchan_url']) . '}', $s); + } + else { + $s = str_replace($mtch[0], $mtch[1] . $mtch[2] . quote_tag($mtch[4]),$s); + } } } // undo forum tags $cnt = preg_match_all('/\!\[zrl=(.*?)\](.*?)\[\/zrl\]/ism',$s,$matches,PREG_SET_ORDER); if($cnt) { foreach($matches as $mtch) { - $s = str_replace($mtch[0], '!' . quote_tag($mtch[2]),$s); + $x = q("select xchan_addr, xchan_url from xchan where xchan_url = '%s' limit 1", + dbesc($mtch[1]) + ); + if($x) { + $s = str_replace($mtch[0], '!' . '{' . (($x[0]['xchan_addr']) ? $x[0]['xchan_addr'] : $x[0]['xchan_url']) . '}', $s); + } + else { + $s = str_replace($mtch[0], '!' . quote_tag($mtch[2]),$s); + } } } - return $s; } @@ -2187,6 +2222,7 @@ function ids_to_querystr($arr,$idx = 'id',$quote = false) { * @param $arr array * @param $elm array key to extract from sub-array * @param $delim string default ',' + * @param $each filter function to apply to each element before evaluation, default is 'trim'. * @returns string */ @@ -2516,10 +2552,10 @@ function extra_query_args() { * @param[in,out] string &$str_tags string to add the tag to * @param int $profile_uid * @param string $tag the tag to replace - * @param boolean $diaspora default false + * @param boolean $in_network default true * @return boolean true if replaced, false if not replaced */ -function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $diaspora = false) { +function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $in_network = true) { $replaced = false; $r = null; @@ -2530,9 +2566,10 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d $termtype = ((strpos($tag,'!') === 0) ? TERM_FORUM : $termtype); $termtype = ((strpos($tag,'#^[') === 0) ? TERM_BOOKMARK : $termtype); - //is it a hash tag? - if(strpos($tag,'#') === 0) { - if(strpos($tag,'#^[') === 0) { + // Is it a hashtag of some kind? + + if ( in_array($termtype, [ TERM_HASHTAG, TERM_BOOKMARK ] )) { + if($termtype === TERM_BOOKMARK) { if(preg_match('/#\^\[(url|zrl)(.*?)\](.*?)\[\/(url|zrl)\]/',$tag,$match)) { $basetag = $match[3]; $url = ((substr($match[2],0,1) === '=') ? substr($match[2],1) : $match[3]); @@ -2541,33 +2578,35 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d } // if the tag is already replaced... elseif((strpos($tag,'[zrl=')) || (strpos($tag,'[url='))) { - //...do nothing + // ...do nothing return $replaced; } + if(! $replaced) { - // base tag has the tags name only + // double-quoted hashtags: base tag has the htmlentity name only if((substr($tag,0,7) === '#"') && (substr($tag,-6,6) === '"')) { $basetag = substr($tag,7); $basetag = substr($basetag,0,-6); } else - $basetag = str_replace('_',' ',substr($tag,1)); + $basetag = substr($tag,1); + + // create text for link - //create text for link $url = z_root() . '/search?tag=' . rawurlencode($basetag); $newtag = '#[zrl=' . z_root() . '/search?tag=' . rawurlencode($basetag) . ']' . $basetag . '[/zrl]'; - //replace tag by the link. Make sure to not replace something in the middle of a word - // The '=' is needed to not replace color codes if the code is also used as a tag - // Much better would be to somehow completely avoiding things in e.g. [color]-tags. - // This would allow writing things like "my favourite tag=#foobar". + + // replace tag by the link. Make sure to not replace something in the middle of a word + $body = preg_replace('/(?<![a-zA-Z0-9=])'.preg_quote($tag,'/').'/', $newtag, $body); $replaced = true; } - //is the link already in str_tags? + + // is the link already in str_tags? if(! stristr($str_tags,$newtag)) { - //append or set str_tags + // append or set str_tags if(strlen($str_tags)) $str_tags .= ','; @@ -2578,148 +2617,97 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d 'termtype' => $termtype, 'term' => $basetag, 'url' => $url, - 'contact' => $r[0] + 'contact' => [] ]; + } - //is it a person tag? + // END hashtags - $grouptag = false; + // BEGIN mentions - if(strpos($tag,'!') === 0) { - $grouptag = true; - } - if(strpos($tag,'@') === 0 || $grouptag) { + if ( in_array($termtype, [ TERM_MENTION, TERM_FORUM ] )) { - // The @! tag will alter permissions - $exclusive = (((! $grouptag) && (strpos($tag,'!') === 1) && (! $diaspora)) ? true : false); - if(($grouptag) && (strpos($tag,'!!') === 0)) { - $exclusive = true; - } + // The @! tag and !! tag will alter permissions + + // $in_network is set to false to avoid false positives on posts originating + // on a network which does not implement privacy tags or implements them differently. + + $exclusive = (((strpos(substr($tag,1), '!') === 0) && $in_network) ? true : false); //is it already replaced? - if(strpos($tag,'[zrl=')) + if(strpos($tag,'[zrl=') || strpos($tag,'[url=')) return $replaced; - //get the person's name + // get the channel name + // First extract the name or name fragment we are going to replace - $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 + $name = substr($tag,(($exclusive) ? 2 : 1)); + $newname = $name; // make a copy that we can mess with $tagcid = 0; $r = null; - // is it some generated name? - - $forum = false; - $trailing_plus_name = false; + // is it some generated (autocompleted) name? - // @channel+ is a forum or network delivery tag - - if(substr($newname,-1,1) === '+') { - $forum = true; + if(substr($name,0,1) === '{' && substr($name,-1,1) === '}') { + $newname = substr($name,1); $newname = substr($newname,0,-1); - } - - // Here we're looking for an address book entry as provided by the auto-completer - // of the form something+nnn where nnn is an abook_id or the first chars of xchan_hash - - - // If there's a +nnn in the string make sure there isn't a space preceding it - - $t1 = strpos($newname,' '); - $t2 = strrpos($newname,'+'); - - if($t1 && $t2 && $t1 < $t2) - $t2 = 0; - - if(($t2) && (! $diaspora)) { - //get the id - - $tagcid = urldecode(substr($newname,$t2 + 1)); - if(strrpos($tagcid,' ')) - $tagcid = substr($tagcid,0,strrpos($tagcid,' ')); - - if(strlen($tagcid) < 16) - $abook_id = intval($tagcid); - //remove the next word from tag's name - if(strpos($name,' ')) { - $name = substr($name,0,strpos($name,' ')); - } - - 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 - WHERE abook_id = %d AND abook_channel = %d LIMIT 1", - intval($abook_id), - intval($profile_uid) - ); - } - else { - $r = q("SELECT * FROM xchan - WHERE xchan_hash like '%s%%' LIMIT 1", - dbesc($tagcid) - ); - } + $r = q("select * from xchan where xchan_addr = '%s' or xchan_url = '%s' limit 1", + dbesc($newname), + dbesc($newname) + ); } if(! $r) { // look for matching names in the address book - // Two ways to deal with spaces - double quote the name or use underscores - // we see this after input filtering so quotes have been html entity encoded + // Double quote the entire mentioned term to include special characters + // such as spaces and some punctuation. + + // We see this after input filtering so quotes have been html entity encoded if((substr($name,0,6) === '"') && (substr($name,-6,6) === '"')) { $newname = substr($name,6); $newname = substr($newname,0,-6); } - else - $newname = str_replace('_',' ',$name); - - // do this bit over since we started over with $name - if(substr($newname,-1,1) === '+') { - $forum = true; - $newname = substr($newname,0,-1); - } + // select someone from this user's contacts by name - //select someone from this user's contacts by name $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) ); - 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 - WHERE xchan_addr like ('%s') AND abook_channel = %d LIMIT 1", - dbesc(((strpos($newname,'@')) ? $newname : $newname . '@%')), - intval($profile_uid) + // select anybody by full hubloc_addr + + if((! $r) && strpos($newname,'@')) { + $r = q("SELECT * FROM xchan left join hubloc on xchan_hash = hubloc_hash + WHERE hubloc_addr = '%s' LIMIT 1", + dbesc($newname) ); } - if(! $r) { - // 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. + // select someone by attag or nick and the name passed in + if(! $r) { $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 . '+'), + WHERE xchan_addr like ('%s') AND abook_channel = %d LIMIT 1", + dbesc(((strpos($newname,'@')) ? $newname : $newname . '@%')), intval($profile_uid) ); - if($r) - $trailing_plus_name = true; } + } // $r is set if we found something $channel = App::get_channel(); - + if($r) { $profile = $r[0]['xchan_url']; $newname = $r[0]['xchan_name']; @@ -2757,27 +2745,24 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d } } - if(($exclusive) && (! $access_tag)) { - $access_tag .= 'cid:' . $channel['channel_hash']; - } - - // if there is an url for this channel + // if there is a url for this channel if(isset($profile)) { $replaced = true; //create profile link $profile = str_replace(',','%2c',$profile); $url = $profile; - if($grouptag) { + if($termtype === TERM_FORUM) { $newtag = '!' . (($exclusive) ? '!' : '') . '[zrl=' . $profile . ']' . $newname . '[/zrl]'; $body = str_replace('!' . (($exclusive) ? '!' : '') . $name, $newtag, $body); } else { - $newtag = '@' . (($exclusive) ? '!' : '') . '[zrl=' . $profile . ']' . $newname . (($forum && ! $trailing_plus_name) ? '+' : '') . '[/zrl]'; + // ( $termtype === TERM_MENTION ) + $newtag = '@' . (($exclusive) ? '!' : '') . '[zrl=' . $profile . ']' . $newname . '[/zrl]'; $body = str_replace('@' . (($exclusive) ? '!' : '') . $name, $newtag, $body); } - //append tag to str_tags + // append tag to str_tags if(! stristr($str_tags,$newtag)) { if(strlen($str_tags)) $str_tags .= ','; @@ -2791,14 +2776,14 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d 'termtype' => $termtype, 'term' => $newname, 'url' => $url, - 'contact' => $r[0] + 'contact' => (($r) ? $r[0] : []) ]; } -function linkify_tags($a, &$body, $uid, $diaspora = false) { - $str_tags = ''; - $tagged = array(); - $results = array(); +function linkify_tags($a, &$body, $uid, $in_network = true) { + $str_tags = EMPTY_STR; + $tagged = []; + $results = []; $tags = get_tags($body); @@ -2806,20 +2791,7 @@ function linkify_tags($a, &$body, $uid, $diaspora = false) { foreach($tags as $tag) { $access_tag = ''; - // If we already tagged 'Robert Johnson', don't try and tag 'Robert'. - // Robert Johnson should be first in the $tags array - - $fullnametagged = false; - for($x = 0; $x < count($tagged); $x ++) { - if(stristr($tagged[$x],$tag . ' ')) { - $fullnametagged = true; - break; - } - } - 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, $in_network); $results[] = array('success' => $success, 'access_tag' => $access_tag); if($success['replaced']) $tagged[] = $tag; @@ -3230,21 +3202,33 @@ function array2XML($obj, $array) { * * @param string $table * @param array $arr + * @param array $binary_fields - fields which will be cleansed with dbescbin rather than dbesc; this is critical for postgres * @return boolean|PDOStatement */ -function create_table_from_array($table, $arr) { +function create_table_from_array($table, $arr, $binary_fields = []) { 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)) - . "')" - ); + $clean = []; + foreach($arr as $k => $v) { + $matches = false; + if(preg_match('/([^a-zA-Z0-9\-\_\.])/',$k,$matches)) { + return false; + } + if(in_array($k,$binary_fields)) { + $clean[$k] = dbescbin($v); + } + else { + $clean[$k] = dbesc($v); + } } + $r = dbq("INSERT INTO " . TQUOT . $table . TQUOT . " (" . TQUOT + . implode(TQUOT . ', ' . TQUOT, array_keys($clean)) + . TQUOT . ") VALUES ('" + . implode("', '", array_values($clean)) + . "')" + ); return $r; } @@ -3273,9 +3257,9 @@ function cleanup_bbcode($body) { $body = preg_replace_callback('/\[zrl(.*?)\[\/(zrl)\]/ism','\red_escape_codeblock',$body); - $body = preg_replace_callback("/([^\]\='".'"'."\/]|^|\#\^)(https?\:\/\/[a-zA-Z0-9\pL\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\\ + $body = preg_replace_callback("/([^\]\='".'"'."\/\{]|^|\#\^)(https?\:\/\/[a-zA-Z0-9\pL\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\\ +\,\(\)]+)/ismu", '\nakedoembed', $body); - $body = preg_replace_callback("/([^\]\='".'"'."\/]|^|\#\^)(https?\:\/\/[a-zA-Z0-9\pL\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\\ + $body = preg_replace_callback("/([^\]\='".'"'."\/\{]|^|\#\^)(https?\:\/\/[a-zA-Z0-9\pL\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\\ +\,\(\)]+)/ismu", '\red_zrl_callback', $body); $body = preg_replace_callback('/\[\$b64zrl(.*?)\[\/(zrl)\]/ism','\red_unescape_codeblock',$body); @@ -3344,6 +3328,9 @@ function featured_sort($a,$b) { } +// Be aware that punify will convert domain names and pathnames + + function punify($s) { require_once('vendor/simplepie/simplepie/idn/idna_convert.class.php'); $x = new idna_convert(['encoding' => 'utf8']); @@ -3351,6 +3338,8 @@ function punify($s) { } +// Be aware that unpunify will only convert domain names and not pathnames + function unpunify($s) { require_once('vendor/simplepie/simplepie/idn/idna_convert.class.php'); $x = new idna_convert(['encoding' => 'utf8']); @@ -3358,3 +3347,68 @@ function unpunify($s) { } + +function unique_multidim_array($array, $key) { + $temp_array = array(); + $i = 0; + $key_array = array(); + + foreach($array as $val) { + if (!in_array($val[$key], $key_array)) { + $key_array[$i] = $val[$key]; + $temp_array[$i] = $val; + } + $i++; + } + return $temp_array; +} + +function get_forum_channels($uid) { + + if(! $uid) + return; + + $xf = false; + + $x1 = q("select xchan from abconfig where chan = %d and cat = 'their_perms' and k = 'send_stream' and v = '0'", + intval($uid) + ); + 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($uid) + ); + + if($x2) { + $xf = ids_to_querystr($x2,'xchan',true); + + // private forums + $x3 = q("select xchan from abconfig where chan = %d and cat = 'their_perms' and k = 'post_wall' and v = '1' and xchan in (" . $xc . ") and not xchan in (" . $xf . ") ", + intval(local_channel()) + ); + if($x3) { + $xf = ids_to_querystr(array_merge($x2,$x3),'xchan',true); + } + } + } + + $sql_extra = (($xf) ? " and ( xchan_hash in (" . $xf . ") or xchan_pubforum = 1 ) " : " and xchan_pubforum = 1 "); + + $r = 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 and abook_pending = 0 and abook_ignored = 0 and abook_blocked = 0 and abook_archived = 0 $sql_extra order by xchan_name", + intval($uid) + ); + + for($x = 0; $x < count($r); $x ++) { + if($x3) { + foreach($x3 as $xx) { + if($r[$x]['xchan_hash'] == $xx['xchan']) { + $r[$x]['private_forum'] = 1; + } + } + } + } + + return $r; + +} diff --git a/include/zot.php b/include/zot.php index 8e14bb37c..19e1298c3 100644 --- a/include/zot.php +++ b/include/zot.php @@ -1787,6 +1787,10 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ $local_public = false; continue; } + if(! \Zotlabs\Lib\MessageFilter::evaluate($arr,get_config('system','pubstream_incl'),get_config('system','pubstream_excl'))) { + $local_public = false; + continue; + } } $tag_delivery = tgroup_check($channel['channel_id'],$arr); @@ -1923,6 +1927,7 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ continue; } + $r = q("select * from item where mid = '%s' and uid = %d limit 1", dbesc($arr['mid']), intval($channel['channel_id']) diff --git a/install/sample-nginx.conf b/install/sample-nginx.conf index 4121ff2ec..839f208ae 100644 --- a/install/sample-nginx.conf +++ b/install/sample-nginx.conf @@ -73,29 +73,32 @@ server { client_max_body_size 20m; client_body_buffer_size 128k; + include mime.types; + # rewrite to front controller as default rule location / { - if ($is_args != "") { - rewrite ^/(.*) /index.php?q=$uri&$args last; + if (!-e $request_filename) { + rewrite ^(.*)$ /index.php?q=$1; } - rewrite ^/(.*) /index.php?q=$uri last; } # make sure webfinger and other well known services aren't blocked # by denying dot files and rewrite request to the front controller location ^~ /.well-known/ { allow all; - rewrite ^/(.*) /index.php?q=$uri&$args last; + if (!-e $request_filename) { + rewrite ^(.*)$ /index.php?q=$1; + } } # statically serve these file types when possible # otherwise fall back to front controller # allow browser to cache them # added .htm for advanced source code editor library - location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|map|ttf|woff|woff2|svg)$ { - expires 30d; - try_files $uri /index.php?q=$uri&$args; - } + # location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|map|ttf|woff|woff2|svg)$ { + # expires 30d; + # try_files $uri /index.php?q=$uri&$args; + # } # block these file types location ~* \.(tpl|md|tgz|log|out)$ { diff --git a/library/jquery-textcomplete/jquery.textcomplete.js b/library/jquery-textcomplete/jquery.textcomplete.js deleted file mode 100644 index 0dd9fd827..000000000 --- a/library/jquery-textcomplete/jquery.textcomplete.js +++ /dev/null @@ -1,1488 +0,0 @@ -(function (factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['jquery'], factory); - } else if (typeof module === "object" && module.exports) { - var $ = require('jquery'); - module.exports = factory($); - } else { - // Browser globals - factory(jQuery); - } -}(function (jQuery) { - -/*! - * jQuery.textcomplete - * - * Repository: https://github.com/yuku-t/jquery-textcomplete - * License: MIT (https://github.com/yuku-t/jquery-textcomplete/blob/master/LICENSE) - * Author: Yuku Takahashi - */ - -if (typeof jQuery === 'undefined') { - throw new Error('jQuery.textcomplete requires jQuery'); -} - -+function ($) { - 'use strict'; - - var warn = function (message) { - if (console.warn) { console.warn(message); } - }; - - var id = 1; - - $.fn.textcomplete = function (strategies, option) { - var args = Array.prototype.slice.call(arguments); - return this.each(function () { - var self = this; - var $this = $(this); - var completer = $this.data('textComplete'); - if (!completer) { - option || (option = {}); - option._oid = id++; // unique object id - completer = new $.fn.textcomplete.Completer(this, option); - $this.data('textComplete', completer); - } - if (typeof strategies === 'string') { - if (!completer) return; - args.shift() - completer[strategies].apply(completer, args); - if (strategies === 'destroy') { - $this.removeData('textComplete'); - } - } else { - // For backward compatibility. - // TODO: Remove at v0.4 - $.each(strategies, function (obj) { - $.each(['header', 'footer', 'placement', 'maxCount'], function (name) { - if (obj[name]) { - completer.option[name] = obj[name]; - warn(name + 'as a strategy param is deprecated. Use option.'); - delete obj[name]; - } - }); - }); - completer.register($.fn.textcomplete.Strategy.parse(strategies, { - el: self, - $el: $this - })); - } - }); - }; - -}(jQuery); - -+function ($) { - 'use strict'; - - // Exclusive execution control utility. - // - // func - The function to be locked. It is executed with a function named - // `free` as the first argument. Once it is called, additional - // execution are ignored until the free is invoked. Then the last - // ignored execution will be replayed immediately. - // - // Examples - // - // var lockedFunc = lock(function (free) { - // setTimeout(function { free(); }, 1000); // It will be free in 1 sec. - // console.log('Hello, world'); - // }); - // lockedFunc(); // => 'Hello, world' - // lockedFunc(); // none - // lockedFunc(); // none - // // 1 sec past then - // // => 'Hello, world' - // lockedFunc(); // => 'Hello, world' - // lockedFunc(); // none - // - // Returns a wrapped function. - var lock = function (func) { - var locked, queuedArgsToReplay; - - return function () { - // Convert arguments into a real array. - var args = Array.prototype.slice.call(arguments); - if (locked) { - // Keep a copy of this argument list to replay later. - // OK to overwrite a previous value because we only replay - // the last one. - queuedArgsToReplay = args; - return; - } - locked = true; - var self = this; - args.unshift(function replayOrFree() { - if (queuedArgsToReplay) { - // Other request(s) arrived while we were locked. - // Now that the lock is becoming available, replay - // the latest such request, then call back here to - // unlock (or replay another request that arrived - // while this one was in flight). - var replayArgs = queuedArgsToReplay; - queuedArgsToReplay = undefined; - replayArgs.unshift(replayOrFree); - func.apply(self, replayArgs); - } else { - locked = false; - } - }); - func.apply(this, args); - }; - }; - - var isString = function (obj) { - return Object.prototype.toString.call(obj) === '[object String]'; - }; - - var uniqueId = 0; - - function Completer(element, option) { - this.$el = $(element); - this.id = 'textcomplete' + uniqueId++; - this.strategies = []; - this.views = []; - this.option = $.extend({}, Completer.defaults, option); - - if (!this.$el.is('input[type=text]') && !this.$el.is('input[type=search]') && !this.$el.is('textarea') && !element.isContentEditable && element.contentEditable != 'true') { - throw new Error('textcomplete must be called on a Textarea or a ContentEditable.'); - } - - // use ownerDocument to fix iframe / IE issues - if (element === element.ownerDocument.activeElement) { - // element has already been focused. Initialize view objects immediately. - this.initialize() - } else { - // Initialize view objects lazily. - var self = this; - this.$el.one('focus.' + this.id, function () { self.initialize(); }); - - // Special handling for CKEditor: lazy init on instance load - if ((!this.option.adapter || this.option.adapter == 'CKEditor') && typeof CKEDITOR != 'undefined' && (this.$el.is('textarea'))) { - CKEDITOR.on("instanceReady", function(event) { - event.editor.once("focus", function(event2) { - // replace the element with the Iframe element and flag it as CKEditor - self.$el = $(event.editor.editable().$); - if (!self.option.adapter) { - self.option.adapter = $.fn.textcomplete['CKEditor']; - self.option.ckeditor_instance = event.editor; - } - self.initialize(); - }); - }); - } - } - } - - Completer.defaults = { - appendTo: 'body', - className: '', // deprecated option - dropdownClassName: 'dropdown-menu textcomplete-dropdown', - maxCount: 10, - zIndex: '100', - rightEdgeOffset: 30 - }; - - $.extend(Completer.prototype, { - // Public properties - // ----------------- - - id: null, - option: null, - strategies: null, - adapter: null, - dropdown: null, - $el: null, - $iframe: null, - - // Public methods - // -------------- - - initialize: function () { - var element = this.$el.get(0); - - // check if we are in an iframe - // we need to alter positioning logic if using an iframe - if (this.$el.prop('ownerDocument') !== document && window.frames.length) { - for (var iframeIndex = 0; iframeIndex < window.frames.length; iframeIndex++) { - if (this.$el.prop('ownerDocument') === window.frames[iframeIndex].document) { - this.$iframe = $(window.frames[iframeIndex].frameElement); - break; - } - } - } - - - // Initialize view objects. - this.dropdown = new $.fn.textcomplete.Dropdown(element, this, this.option); - var Adapter, viewName; - if (this.option.adapter) { - Adapter = this.option.adapter; - } else { - if (this.$el.is('textarea') || this.$el.is('input[type=text]') || this.$el.is('input[type=search]')) { - viewName = typeof element.selectionEnd === 'number' ? 'Textarea' : 'IETextarea'; - } else { - viewName = 'ContentEditable'; - } - Adapter = $.fn.textcomplete[viewName]; - } - this.adapter = new Adapter(element, this, this.option); - }, - - destroy: function () { - this.$el.off('.' + this.id); - if (this.adapter) { - this.adapter.destroy(); - } - if (this.dropdown) { - this.dropdown.destroy(); - } - this.$el = this.adapter = this.dropdown = null; - }, - - deactivate: function () { - if (this.dropdown) { - this.dropdown.deactivate(); - } - }, - - // Invoke textcomplete. - trigger: function (text, skipUnchangedTerm) { - if (!this.dropdown) { this.initialize(); } - text != null || (text = this.adapter.getTextFromHeadToCaret()); - var searchQuery = this._extractSearchQuery(text); - if (searchQuery.length) { - var term = searchQuery[1]; - // Ignore shift-key, ctrl-key and so on. - if (skipUnchangedTerm && this._term === term && term !== "") { return; } - this._term = term; - this._search.apply(this, searchQuery); - } else { - this._term = null; - this.dropdown.deactivate(); - } - }, - - fire: function (eventName) { - var args = Array.prototype.slice.call(arguments, 1); - this.$el.trigger(eventName, args); - return this; - }, - - register: function (strategies) { - Array.prototype.push.apply(this.strategies, strategies); - }, - - // Insert the value into adapter view. It is called when the dropdown is clicked - // or selected. - // - // value - The selected element of the array callbacked from search func. - // strategy - The Strategy object. - // e - Click or keydown event object. - select: function (value, strategy, e) { - this._term = null; - this.adapter.select(value, strategy, e); - this.fire('change').fire('textComplete:select', value, strategy); - this.adapter.focus(); - }, - - // Private properties - // ------------------ - - _clearAtNext: true, - _term: null, - - // Private methods - // --------------- - - // Parse the given text and extract the first matching strategy. - // - // Returns an array including the strategy, the query term and the match - // object if the text matches an strategy; otherwise returns an empty array. - _extractSearchQuery: function (text) { - for (var i = 0; i < this.strategies.length; i++) { - var strategy = this.strategies[i]; - var context = strategy.context(text); - if (context || context === '') { - var matchRegexp = $.isFunction(strategy.match) ? strategy.match(text) : strategy.match; - if (isString(context)) { text = context; } - var match = text.match(matchRegexp); - if (match) { return [strategy, match[strategy.index], match]; } - } - } - return [] - }, - - // Call the search method of selected strategy.. - _search: lock(function (free, strategy, term, match) { - var self = this; - strategy.search(term, function (data, stillSearching) { - if (!self.dropdown.shown) { - self.dropdown.activate(); - } - if (self._clearAtNext) { - // The first callback in the current lock. - self.dropdown.clear(); - self._clearAtNext = false; - } - self.dropdown.setPosition(self.adapter.getCaretPosition()); - self.dropdown.render(self._zip(data, strategy, term)); - if (!stillSearching) { - // The last callback in the current lock. - free(); - self._clearAtNext = true; // Call dropdown.clear at the next time. - } - }, match); - }), - - // Build a parameter for Dropdown#render. - // - // Examples - // - // this._zip(['a', 'b'], 's'); - // //=> [{ value: 'a', strategy: 's' }, { value: 'b', strategy: 's' }] - _zip: function (data, strategy, term) { - return $.map(data, function (value) { - return { value: value, strategy: strategy, term: term }; - }); - } - }); - - $.fn.textcomplete.Completer = Completer; -}(jQuery); - -+function ($) { - 'use strict'; - - var $window = $(window); - - var include = function (zippedData, datum) { - var i, elem; - var idProperty = datum.strategy.idProperty - for (i = 0; i < zippedData.length; i++) { - elem = zippedData[i]; - if (elem.strategy !== datum.strategy) continue; - if (idProperty) { - if (elem.value[idProperty] === datum.value[idProperty]) return true; - } else { - if (elem.value === datum.value) return true; - } - } - return false; - }; - - var dropdownViews = {}; - $(document).on('click', function (e) { - var id = e.originalEvent && e.originalEvent.keepTextCompleteDropdown; - $.each(dropdownViews, function (key, view) { - if (key !== id) { view.deactivate(); } - }); - }); - - var commands = { - SKIP_DEFAULT: 0, - KEY_UP: 1, - KEY_DOWN: 2, - KEY_ENTER: 3, - KEY_PAGEUP: 4, - KEY_PAGEDOWN: 5, - KEY_ESCAPE: 6 - }; - - // Dropdown view - // ============= - - // Construct Dropdown object. - // - // element - Textarea or contenteditable element. - function Dropdown(element, completer, option) { - this.$el = Dropdown.createElement(option); - this.completer = completer; - this.id = completer.id + 'dropdown'; - this._data = []; // zipped data. - this.$inputEl = $(element); - this.option = option; - - // Override setPosition method. - if (option.listPosition) { this.setPosition = option.listPosition; } - if (option.height) { this.$el.height(option.height); } - var self = this; - $.each(['maxCount', 'placement', 'footer', 'header', 'noResultsMessage', 'className'], function (_i, name) { - if (option[name] != null) { self[name] = option[name]; } - }); - this._bindEvents(element); - dropdownViews[this.id] = this; - } - - $.extend(Dropdown, { - // Class methods - // ------------- - - createElement: function (option) { - var $parent = option.appendTo; - if (!($parent instanceof $)) { $parent = $($parent); } - var $el = $('<ul></ul>') - .addClass(option.dropdownClassName) - .attr('id', 'textcomplete-dropdown-' + option._oid) - .css({ - display: 'none', - left: 0, - position: 'absolute', - zIndex: option.zIndex - }) - .appendTo($parent); - return $el; - } - }); - - $.extend(Dropdown.prototype, { - // Public properties - // ----------------- - - $el: null, // jQuery object of ul.dropdown-menu element. - $inputEl: null, // jQuery object of target textarea. - completer: null, - footer: null, - header: null, - id: null, - maxCount: null, - placement: '', - shown: false, - data: [], // Shown zipped data. - className: '', - - // Public methods - // -------------- - - destroy: function () { - // Don't remove $el because it may be shared by several textcompletes. - this.deactivate(); - - this.$el.off('.' + this.id); - this.$inputEl.off('.' + this.id); - this.clear(); - this.$el.remove(); - this.$el = this.$inputEl = this.completer = null; - delete dropdownViews[this.id] - }, - - render: function (zippedData) { - var contentsHtml = this._buildContents(zippedData); - var unzippedData = $.map(zippedData, function (d) { return d.value; }); - if (zippedData.length) { - var strategy = zippedData[0].strategy; - if (strategy.id) { - this.$el.attr('data-strategy', strategy.id); - } else { - this.$el.removeAttr('data-strategy'); - } - this._renderHeader(unzippedData); - this._renderFooter(unzippedData); - if (contentsHtml) { - this._renderContents(contentsHtml); - this._fitToBottom(); - this._fitToRight(); - this._activateIndexedItem(); - } - this._setScroll(); - } else if (this.noResultsMessage) { - this._renderNoResultsMessage(unzippedData); - } else if (this.shown) { - this.deactivate(); - } - }, - - setPosition: function (pos) { - // Make the dropdown fixed if the input is also fixed - // This can't be done during init, as textcomplete may be used on multiple elements on the same page - // Because the same dropdown is reused behind the scenes, we need to recheck every time the dropdown is showed - var position = 'absolute'; - // Check if input or one of its parents has positioning we need to care about - this.$inputEl.add(this.$inputEl.parents()).each(function() { - if($(this).css('position') === 'absolute') // The element has absolute positioning, so it's all OK - return false; - if($(this).css('position') === 'fixed') { - pos.top -= $window.scrollTop(); - pos.left -= $window.scrollLeft(); - position = 'fixed'; - return false; - } - }); - this.$el.css(this._applyPlacement(pos)); - this.$el.css({ position: position }); // Update positioning - - return this; - }, - - clear: function () { - this.$el.html(''); - this.data = []; - this._index = 0; - this._$header = this._$footer = this._$noResultsMessage = null; - }, - - activate: function () { - if (!this.shown) { - this.clear(); - this.$el.show(); - if (this.className) { this.$el.addClass(this.className); } - this.completer.fire('textComplete:show'); - this.shown = true; - } - return this; - }, - - deactivate: function () { - if (this.shown) { - this.$el.hide(); - if (this.className) { this.$el.removeClass(this.className); } - this.completer.fire('textComplete:hide'); - this.shown = false; - } - return this; - }, - - isUp: function (e) { - return e.keyCode === 38 || (e.ctrlKey && e.keyCode === 80); // UP, Ctrl-P - }, - - isDown: function (e) { - return e.keyCode === 40 || (e.ctrlKey && e.keyCode === 78); // DOWN, Ctrl-N - }, - - isEnter: function (e) { - var modifiers = e.ctrlKey || e.altKey || e.metaKey || e.shiftKey; - return !modifiers && (e.keyCode === 13 || e.keyCode === 9 || (this.option.completeOnSpace === true && e.keyCode === 32)) // ENTER, TAB - }, - - isPageup: function (e) { - return e.keyCode === 33; // PAGEUP - }, - - isPagedown: function (e) { - return e.keyCode === 34; // PAGEDOWN - }, - - isEscape: function (e) { - return e.keyCode === 27; // ESCAPE - }, - - // Private properties - // ------------------ - - _data: null, // Currently shown zipped data. - _index: null, - _$header: null, - _$noResultsMessage: null, - _$footer: null, - - // Private methods - // --------------- - - _bindEvents: function () { - this.$el.on('mousedown.' + this.id, '.textcomplete-item', $.proxy(this._onClick, this)); - this.$el.on('touchstart.' + this.id, '.textcomplete-item', $.proxy(this._onClick, this)); - this.$el.on('mouseover.' + this.id, '.textcomplete-item', $.proxy(this._onMouseover, this)); - this.$inputEl.on('keydown.' + this.id, $.proxy(this._onKeydown, this)); - }, - - _onClick: function (e) { - var $el = $(e.target); - e.preventDefault(); - e.originalEvent.keepTextCompleteDropdown = this.id; - if (!$el.hasClass('textcomplete-item')) { - $el = $el.closest('.textcomplete-item'); - } - var datum = this.data[parseInt($el.data('index'), 10)]; - this.completer.select(datum.value, datum.strategy, e); - var self = this; - // Deactive at next tick to allow other event handlers to know whether - // the dropdown has been shown or not. - setTimeout(function () { - self.deactivate(); - if (e.type === 'touchstart') { - self.$inputEl.focus(); - } - }, 0); - }, - - // Activate hovered item. - _onMouseover: function (e) { - var $el = $(e.target); - e.preventDefault(); - if (!$el.hasClass('textcomplete-item')) { - $el = $el.closest('.textcomplete-item'); - } - this._index = parseInt($el.data('index'), 10); - this._activateIndexedItem(); - }, - - _onKeydown: function (e) { - if (!this.shown) { return; } - - var command; - - if ($.isFunction(this.option.onKeydown)) { - command = this.option.onKeydown(e, commands); - } - - if (command == null) { - command = this._defaultKeydown(e); - } - - switch (command) { - case commands.KEY_UP: - e.preventDefault(); - this._up(); - break; - case commands.KEY_DOWN: - e.preventDefault(); - this._down(); - break; - case commands.KEY_ENTER: - e.preventDefault(); - this._enter(e); - break; - case commands.KEY_PAGEUP: - e.preventDefault(); - this._pageup(); - break; - case commands.KEY_PAGEDOWN: - e.preventDefault(); - this._pagedown(); - break; - case commands.KEY_ESCAPE: - e.preventDefault(); - this.deactivate(); - break; - } - }, - - _defaultKeydown: function (e) { - if (this.isUp(e)) { - return commands.KEY_UP; - } else if (this.isDown(e)) { - return commands.KEY_DOWN; - } else if (this.isEnter(e)) { - return commands.KEY_ENTER; - } else if (this.isPageup(e)) { - return commands.KEY_PAGEUP; - } else if (this.isPagedown(e)) { - return commands.KEY_PAGEDOWN; - } else if (this.isEscape(e)) { - return commands.KEY_ESCAPE; - } - }, - - _up: function () { - if (this._index === 0) { - this._index = this.data.length - 1; - } else { - this._index -= 1; - } - this._activateIndexedItem(); - this._setScroll(); - }, - - _down: function () { - if (this._index === this.data.length - 1) { - this._index = 0; - } else { - this._index += 1; - } - this._activateIndexedItem(); - this._setScroll(); - }, - - _enter: function (e) { - var datum = this.data[parseInt(this._getActiveElement().data('index'), 10)]; - this.completer.select(datum.value, datum.strategy, e); - this.deactivate(); - }, - - _pageup: function () { - var target = 0; - var threshold = this._getActiveElement().position().top - this.$el.innerHeight(); - this.$el.children().each(function (i) { - if ($(this).position().top + $(this).outerHeight() > threshold) { - target = i; - return false; - } - }); - this._index = target; - this._activateIndexedItem(); - this._setScroll(); - }, - - _pagedown: function () { - var target = this.data.length - 1; - var threshold = this._getActiveElement().position().top + this.$el.innerHeight(); - this.$el.children().each(function (i) { - if ($(this).position().top > threshold) { - target = i; - return false - } - }); - this._index = target; - this._activateIndexedItem(); - this._setScroll(); - }, - - _activateIndexedItem: function () { - this.$el.find('.textcomplete-item.active').removeClass('active'); - this._getActiveElement().addClass('active'); - }, - - _getActiveElement: function () { - return this.$el.children('.textcomplete-item:nth(' + this._index + ')'); - }, - - _setScroll: function () { - var $activeEl = this._getActiveElement(); - var itemTop = $activeEl.position().top; - var itemHeight = $activeEl.outerHeight(); - var visibleHeight = this.$el.innerHeight(); - var visibleTop = this.$el.scrollTop(); - if (this._index === 0 || this._index == this.data.length - 1 || itemTop < 0) { - this.$el.scrollTop(itemTop + visibleTop); - } else if (itemTop + itemHeight > visibleHeight) { - this.$el.scrollTop(itemTop + itemHeight + visibleTop - visibleHeight); - } - }, - - _buildContents: function (zippedData) { - var datum, i, index; - var html = ''; - for (i = 0; i < zippedData.length; i++) { - if (this.data.length === this.maxCount) break; - datum = zippedData[i]; - if (include(this.data, datum)) { continue; } - index = this.data.length; - this.data.push(datum); - html += '<li class="textcomplete-item" data-index="' + index + '"><a>'; - html += datum.strategy.template(datum.value, datum.term); - html += '</a></li>'; - } - return html; - }, - - _renderHeader: function (unzippedData) { - if (this.header) { - if (!this._$header) { - this._$header = $('<li class="textcomplete-header"></li>').prependTo(this.$el); - } - var html = $.isFunction(this.header) ? this.header(unzippedData) : this.header; - this._$header.html(html); - } - }, - - _renderFooter: function (unzippedData) { - if (this.footer) { - if (!this._$footer) { - this._$footer = $('<li class="textcomplete-footer"></li>').appendTo(this.$el); - } - var html = $.isFunction(this.footer) ? this.footer(unzippedData) : this.footer; - this._$footer.html(html); - } - }, - - _renderNoResultsMessage: function (unzippedData) { - if (this.noResultsMessage) { - if (!this._$noResultsMessage) { - this._$noResultsMessage = $('<li class="textcomplete-no-results-message"></li>').appendTo(this.$el); - } - var html = $.isFunction(this.noResultsMessage) ? this.noResultsMessage(unzippedData) : this.noResultsMessage; - this._$noResultsMessage.html(html); - } - }, - - _renderContents: function (html) { - if (this._$footer) { - this._$footer.before(html); - } else { - this.$el.append(html); - } - }, - - _fitToBottom: function() { - var windowScrollBottom = $window.scrollTop() + $window.height(); - var height = this.$el.height(); - if ((this.$el.position().top + height) > windowScrollBottom) { - // only do this if we are not in an iframe - if (!this.completer.$iframe) { - this.$el.offset({top: windowScrollBottom - height}); - } - } - }, - - _fitToRight: function() { - // We don't know how wide our content is until the browser positions us, and at that point it clips us - // to the document width so we don't know if we would have overrun it. As a heuristic to avoid that clipping - // (which makes our elements wrap onto the next line and corrupt the next item), if we're close to the right - // edge, move left. We don't know how far to move left, so just keep nudging a bit. - var tolerance = this.option.rightEdgeOffset; // pixels. Make wider than vertical scrollbar because we might not be able to use that space. - var lastOffset = this.$el.offset().left, offset; - var width = this.$el.width(); - var maxLeft = $window.width() - tolerance; - while (lastOffset + width > maxLeft) { - this.$el.offset({left: lastOffset - tolerance}); - offset = this.$el.offset().left; - if (offset >= lastOffset) { break; } - lastOffset = offset; - } - }, - - _applyPlacement: function (position) { - // If the 'placement' option set to 'top', move the position above the element. - if (this.placement.indexOf('top') !== -1) { - // Overwrite the position object to set the 'bottom' property instead of the top. - position = { - top: 'auto', - bottom: this.$el.parent().height() - position.top + position.lineHeight, - left: position.left - }; - } else { - position.bottom = 'auto'; - delete position.lineHeight; - } - if (this.placement.indexOf('absleft') !== -1) { - position.left = 0; - } else if (this.placement.indexOf('absright') !== -1) { - position.right = 0; - position.left = 'auto'; - } - return position; - } - }); - - $.fn.textcomplete.Dropdown = Dropdown; - $.extend($.fn.textcomplete, commands); -}(jQuery); - -+function ($) { - 'use strict'; - - // Memoize a search function. - var memoize = function (func) { - var memo = {}; - return function (term, callback) { - if (memo[term]) { - callback(memo[term]); - } else { - func.call(this, term, function (data) { - memo[term] = (memo[term] || []).concat(data); - callback.apply(null, arguments); - }); - } - }; - }; - - function Strategy(options) { - $.extend(this, options); - if (this.cache) { this.search = memoize(this.search); } - } - - Strategy.parse = function (strategiesArray, params) { - return $.map(strategiesArray, function (strategy) { - var strategyObj = new Strategy(strategy); - strategyObj.el = params.el; - strategyObj.$el = params.$el; - return strategyObj; - }); - }; - - $.extend(Strategy.prototype, { - // Public properties - // ----------------- - - // Required - match: null, - replace: null, - search: null, - - // Optional - id: null, - cache: false, - context: function () { return true; }, - index: 2, - template: function (obj) { return obj; }, - idProperty: null - }); - - $.fn.textcomplete.Strategy = Strategy; - -}(jQuery); - -+function ($) { - 'use strict'; - - var now = Date.now || function () { return new Date().getTime(); }; - - // Returns a function, that, as long as it continues to be invoked, will not - // be triggered. The function will be called after it stops being called for - // `wait` msec. - // - // This utility function was originally implemented at Underscore.js. - var debounce = function (func, wait) { - var timeout, args, context, timestamp, result; - var later = function () { - var last = now() - timestamp; - if (last < wait) { - timeout = setTimeout(later, wait - last); - } else { - timeout = null; - result = func.apply(context, args); - context = args = null; - } - }; - - return function () { - context = this; - args = arguments; - timestamp = now(); - if (!timeout) { - timeout = setTimeout(later, wait); - } - return result; - }; - }; - - function Adapter () {} - - $.extend(Adapter.prototype, { - // Public properties - // ----------------- - - id: null, // Identity. - completer: null, // Completer object which creates it. - el: null, // Textarea element. - $el: null, // jQuery object of the textarea. - option: null, - - // Public methods - // -------------- - - initialize: function (element, completer, option) { - this.el = element; - this.$el = $(element); - this.id = completer.id + this.constructor.name; - this.completer = completer; - this.option = option; - - if (this.option.debounce) { - this._onKeyup = debounce(this._onKeyup, this.option.debounce); - } - - this._bindEvents(); - }, - - destroy: function () { - this.$el.off('.' + this.id); // Remove all event handlers. - this.$el = this.el = this.completer = null; - }, - - // Update the element with the given value and strategy. - // - // value - The selected object. It is one of the item of the array - // which was callbacked from the search function. - // strategy - The Strategy associated with the selected value. - select: function (/* value, strategy */) { - throw new Error('Not implemented'); - }, - - // Returns the caret's relative coordinates from body's left top corner. - getCaretPosition: function () { - var position = this._getCaretRelativePosition(); - var offset = this.$el.offset(); - - // Calculate the left top corner of `this.option.appendTo` element. - var $parent = this.option.appendTo; - if ($parent) { - if (!($parent instanceof $)) { $parent = $($parent); } - var parentOffset = $parent.offsetParent().offset(); - offset.top -= parentOffset.top; - offset.left -= parentOffset.left; - } - - position.top += offset.top; - position.left += offset.left; - return position; - }, - - // Focus on the element. - focus: function () { - this.$el.focus(); - }, - - // Private methods - // --------------- - - _bindEvents: function () { - this.$el.on('keyup.' + this.id, $.proxy(this._onKeyup, this)); - }, - - _onKeyup: function (e) { - if (this._skipSearch(e)) { return; } - this.completer.trigger(this.getTextFromHeadToCaret(), true); - }, - - // Suppress searching if it returns true. - _skipSearch: function (clickEvent) { - switch (clickEvent.keyCode) { - case 9: // TAB - case 13: // ENTER - case 16: // SHIFT - case 17: // CTRL - case 18: // ALT - case 33: // PAGEUP - case 34: // PAGEDOWN - case 40: // DOWN - case 38: // UP - case 27: // ESC - return true; - } - if (clickEvent.ctrlKey) switch (clickEvent.keyCode) { - case 78: // Ctrl-N - case 80: // Ctrl-P - return true; - } - } - }); - - $.fn.textcomplete.Adapter = Adapter; -}(jQuery); - -+function ($) { - 'use strict'; - - // Textarea adapter - // ================ - // - // Managing a textarea. It doesn't know a Dropdown. - function Textarea(element, completer, option) { - this.initialize(element, completer, option); - } - - $.extend(Textarea.prototype, $.fn.textcomplete.Adapter.prototype, { - // Public methods - // -------------- - - // Update the textarea with the given value and strategy. - select: function (value, strategy, e) { - var pre = this.getTextFromHeadToCaret(); - var post = this.el.value.substring(this.el.selectionEnd); - var newSubstr = strategy.replace(value, e); - var regExp; - if (typeof newSubstr !== 'undefined') { - if ($.isArray(newSubstr)) { - post = newSubstr[1] + post; - newSubstr = newSubstr[0]; - } - regExp = $.isFunction(strategy.match) ? strategy.match(pre) : strategy.match; - pre = pre.replace(regExp, newSubstr); - this.$el.val(pre + post); - this.el.selectionStart = this.el.selectionEnd = pre.length; - } - }, - - getTextFromHeadToCaret: function () { - return this.el.value.substring(0, this.el.selectionEnd); - }, - - // Private methods - // --------------- - - _getCaretRelativePosition: function () { - var p = $.fn.textcomplete.getCaretCoordinates(this.el, this.el.selectionStart); - return { - top: p.top + this._calculateLineHeight() - this.$el.scrollTop(), - left: p.left - this.$el.scrollLeft(), - lineHeight: this._calculateLineHeight() - }; - }, - - _calculateLineHeight: function () { - var lineHeight = parseInt(this.$el.css('line-height'), 10); - if (isNaN(lineHeight)) { - // http://stackoverflow.com/a/4515470/1297336 - var parentNode = this.el.parentNode; - var temp = document.createElement(this.el.nodeName); - var style = this.el.style; - temp.setAttribute( - 'style', - 'margin:0px;padding:0px;font-family:' + style.fontFamily + ';font-size:' + style.fontSize - ); - temp.innerHTML = 'test'; - parentNode.appendChild(temp); - lineHeight = temp.clientHeight; - parentNode.removeChild(temp); - } - return lineHeight; - } - }); - - $.fn.textcomplete.Textarea = Textarea; -}(jQuery); - -+function ($) { - 'use strict'; - - var sentinelChar = '吶'; - - function IETextarea(element, completer, option) { - this.initialize(element, completer, option); - $('<span>' + sentinelChar + '</span>').css({ - position: 'absolute', - top: -9999, - left: -9999 - }).insertBefore(element); - } - - $.extend(IETextarea.prototype, $.fn.textcomplete.Textarea.prototype, { - // Public methods - // -------------- - - select: function (value, strategy, e) { - var pre = this.getTextFromHeadToCaret(); - var post = this.el.value.substring(pre.length); - var newSubstr = strategy.replace(value, e); - var regExp; - if (typeof newSubstr !== 'undefined') { - if ($.isArray(newSubstr)) { - post = newSubstr[1] + post; - newSubstr = newSubstr[0]; - } - regExp = $.isFunction(strategy.match) ? strategy.match(pre) : strategy.match; - pre = pre.replace(regExp, newSubstr); - this.$el.val(pre + post); - this.el.focus(); - var range = this.el.createTextRange(); - range.collapse(true); - range.moveEnd('character', pre.length); - range.moveStart('character', pre.length); - range.select(); - } - }, - - getTextFromHeadToCaret: function () { - this.el.focus(); - var range = document.selection.createRange(); - range.moveStart('character', -this.el.value.length); - var arr = range.text.split(sentinelChar) - return arr.length === 1 ? arr[0] : arr[1]; - } - }); - - $.fn.textcomplete.IETextarea = IETextarea; -}(jQuery); - -// NOTE: TextComplete plugin has contenteditable support but it does not work -// fine especially on old IEs. -// Any pull requests are REALLY welcome. - -+function ($) { - 'use strict'; - - // ContentEditable adapter - // ======================= - // - // Adapter for contenteditable elements. - function ContentEditable (element, completer, option) { - this.initialize(element, completer, option); - } - - $.extend(ContentEditable.prototype, $.fn.textcomplete.Adapter.prototype, { - // Public methods - // -------------- - - // Update the content with the given value and strategy. - // When an dropdown item is selected, it is executed. - select: function (value, strategy, e) { - var pre = this.getTextFromHeadToCaret(); - // use ownerDocument instead of window to support iframes - var sel = this.el.ownerDocument.getSelection(); - - var range = sel.getRangeAt(0); - var selection = range.cloneRange(); - selection.selectNodeContents(range.startContainer); - var content = selection.toString(); - var post = content.substring(range.startOffset); - var newSubstr = strategy.replace(value, e); - var regExp; - if (typeof newSubstr !== 'undefined') { - if ($.isArray(newSubstr)) { - post = newSubstr[1] + post; - newSubstr = newSubstr[0]; - } - regExp = $.isFunction(strategy.match) ? strategy.match(pre) : strategy.match; - pre = pre.replace(regExp, newSubstr) - .replace(/ $/, " "); //   necessary at least for CKeditor to not eat spaces - range.selectNodeContents(range.startContainer); - range.deleteContents(); - - // create temporary elements - var preWrapper = this.el.ownerDocument.createElement("div"); - preWrapper.innerHTML = pre; - var postWrapper = this.el.ownerDocument.createElement("div"); - postWrapper.innerHTML = post; - - // create the fragment thats inserted - var fragment = this.el.ownerDocument.createDocumentFragment(); - var childNode; - var lastOfPre; - while (childNode = preWrapper.firstChild) { - lastOfPre = fragment.appendChild(childNode); - } - while (childNode = postWrapper.firstChild) { - fragment.appendChild(childNode); - } - - // insert the fragment & jump behind the last node in "pre" - range.insertNode(fragment); - range.setStartAfter(lastOfPre); - - range.collapse(true); - sel.removeAllRanges(); - sel.addRange(range); - } - }, - - // Private methods - // --------------- - - // Returns the caret's relative position from the contenteditable's - // left top corner. - // - // Examples - // - // this._getCaretRelativePosition() - // //=> { top: 18, left: 200, lineHeight: 16 } - // - // Dropdown's position will be decided using the result. - _getCaretRelativePosition: function () { - var range = this.el.ownerDocument.getSelection().getRangeAt(0).cloneRange(); - var node = this.el.ownerDocument.createElement('span'); - range.insertNode(node); - range.selectNodeContents(node); - range.deleteContents(); - var $node = $(node); - var position = $node.offset(); - position.left -= this.$el.offset().left; - position.top += $node.height() - this.$el.offset().top; - position.lineHeight = $node.height(); - - // special positioning logic for iframes - // this is typically used for contenteditables such as tinymce or ckeditor - if (this.completer.$iframe) { - var iframePosition = this.completer.$iframe.offset(); - position.top += iframePosition.top; - position.left += iframePosition.left; - //subtract scrollTop from element in iframe - position.top -= this.$el.scrollTop(); - } - - $node.remove(); - return position; - }, - - // Returns the string between the first character and the caret. - // Completer will be triggered with the result for start autocompleting. - // - // Example - // - // // Suppose the html is '<b>hello</b> wor|ld' and | is the caret. - // this.getTextFromHeadToCaret() - // // => ' wor' // not '<b>hello</b> wor' - getTextFromHeadToCaret: function () { - var range = this.el.ownerDocument.getSelection().getRangeAt(0); - var selection = range.cloneRange(); - selection.selectNodeContents(range.startContainer); - return selection.toString().substring(0, range.startOffset); - } - }); - - $.fn.textcomplete.ContentEditable = ContentEditable; -}(jQuery); - -// NOTE: TextComplete plugin has contenteditable support but it does not work -// fine especially on old IEs. -// Any pull requests are REALLY welcome. - -+function ($) { - 'use strict'; - - // CKEditor adapter - // ======================= - // - // Adapter for CKEditor, based on contenteditable elements. - function CKEditor (element, completer, option) { - this.initialize(element, completer, option); - } - - $.extend(CKEditor.prototype, $.fn.textcomplete.ContentEditable.prototype, { - _bindEvents: function () { - var $this = this; - this.option.ckeditor_instance.on('key', function(event) { - var domEvent = event.data; - $this._onKeyup(domEvent); - if ($this.completer.dropdown.shown && $this._skipSearch(domEvent)) { - return false; - } - }, null, null, 1); // 1 = Priority = Important! - // we actually also need the native event, as the CKEditor one is happening to late - this.$el.on('keyup.' + this.id, $.proxy(this._onKeyup, this)); - }, -}); - - $.fn.textcomplete.CKEditor = CKEditor; -}(jQuery); - -// The MIT License (MIT) -// -// Copyright (c) 2015 Jonathan Ong me@jongleberry.com -// -// 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. -// -// https://github.com/component/textarea-caret-position - -(function ($) { - -// The properties that we copy into a mirrored div. -// Note that some browsers, such as Firefox, -// do not concatenate properties, i.e. padding-top, bottom etc. -> padding, -// so we have to do every single property specifically. -var properties = [ - 'direction', // RTL support - 'boxSizing', - 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does - 'height', - 'overflowX', - 'overflowY', // copy the scrollbar for IE - - 'borderTopWidth', - 'borderRightWidth', - 'borderBottomWidth', - 'borderLeftWidth', - 'borderStyle', - - 'paddingTop', - 'paddingRight', - 'paddingBottom', - 'paddingLeft', - - // https://developer.mozilla.org/en-US/docs/Web/CSS/font - 'fontStyle', - 'fontVariant', - 'fontWeight', - 'fontStretch', - 'fontSize', - 'fontSizeAdjust', - 'lineHeight', - 'fontFamily', - - 'textAlign', - 'textTransform', - 'textIndent', - 'textDecoration', // might not make a difference, but better be safe - - 'letterSpacing', - 'wordSpacing', - - 'tabSize', - 'MozTabSize' - -]; - -var isBrowser = (typeof window !== 'undefined'); -var isFirefox = (isBrowser && window.mozInnerScreenX != null); - -function getCaretCoordinates(element, position, options) { - if(!isBrowser) { - throw new Error('textarea-caret-position#getCaretCoordinates should only be called in a browser'); - } - - var debug = options && options.debug || false; - if (debug) { - var el = document.querySelector('#input-textarea-caret-position-mirror-div'); - if ( el ) { el.parentNode.removeChild(el); } - } - - // mirrored div - var div = document.createElement('div'); - div.id = 'input-textarea-caret-position-mirror-div'; - document.body.appendChild(div); - - var style = div.style; - var computed = window.getComputedStyle? getComputedStyle(element) : element.currentStyle; // currentStyle for IE < 9 - - // default textarea styles - style.whiteSpace = 'pre-wrap'; - if (element.nodeName !== 'INPUT') - style.wordWrap = 'break-word'; // only for textarea-s - - // position off-screen - style.position = 'absolute'; // required to return coordinates properly - if (!debug) - style.visibility = 'hidden'; // not 'display: none' because we want rendering - - // transfer the element's properties to the div - properties.forEach(function (prop) { - style[prop] = computed[prop]; - }); - - if (isFirefox) { - // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275 - if (element.scrollHeight > parseInt(computed.height)) - style.overflowY = 'scroll'; - } else { - style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll' - } - - div.textContent = element.value.substring(0, position); - // the second special handling for input type="text" vs textarea: spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037 - if (element.nodeName === 'INPUT') - div.textContent = div.textContent.replace(/\s/g, '\u00a0'); - - var span = document.createElement('span'); - // Wrapping must be replicated *exactly*, including when a long word gets - // onto the next line, with whitespace at the end of the line before (#7). - // The *only* reliable way to do that is to copy the *entire* rest of the - // textarea's content into the <span> created at the caret position. - // for inputs, just '.' would be enough, but why bother? - span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all - div.appendChild(span); - - var coordinates = { - top: span.offsetTop + parseInt(computed['borderTopWidth']), - left: span.offsetLeft + parseInt(computed['borderLeftWidth']) - }; - - if (debug) { - span.style.backgroundColor = '#aaa'; - } else { - document.body.removeChild(div); - } - - return coordinates; -} - -$.fn.textcomplete.getCaretCoordinates = getCaretCoordinates; - -}(jQuery)); - -return jQuery; -})); diff --git a/library/jquery-textcomplete/jquery.textcomplete.min.js b/library/jquery-textcomplete/jquery.textcomplete.min.js deleted file mode 100644 index d8f67a804..000000000 --- a/library/jquery-textcomplete/jquery.textcomplete.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! jquery-textcomplete - v1.8.0 - 2016-11-15 */ -!function(a){if("function"==typeof define&&define.amd)define(["jquery"],a);else if("object"==typeof module&&module.exports){var b=require("jquery");module.exports=a(b)}else a(jQuery)}(function(a){if("undefined"==typeof a)throw new Error("jQuery.textcomplete requires jQuery");return+function(a){"use strict";var b=function(a){console.warn&&console.warn(a)},c=1;a.fn.textcomplete=function(d,e){var f=Array.prototype.slice.call(arguments);return this.each(function(){var g=this,h=a(this),i=h.data("textComplete");if(i||(e||(e={}),e._oid=c++,i=new a.fn.textcomplete.Completer(this,e),h.data("textComplete",i)),"string"==typeof d){if(!i)return;f.shift(),i[d].apply(i,f),"destroy"===d&&h.removeData("textComplete")}else a.each(d,function(c){a.each(["header","footer","placement","maxCount"],function(a){c[a]&&(i.option[a]=c[a],b(a+"as a strategy param is deprecated. Use option."),delete c[a])})}),i.register(a.fn.textcomplete.Strategy.parse(d,{el:g,$el:h}))})}}(a),+function(a){"use strict";function b(c,d){if(this.$el=a(c),this.id="textcomplete"+e++,this.strategies=[],this.views=[],this.option=a.extend({},b.defaults,d),!(this.$el.is("input[type=text]")||this.$el.is("input[type=search]")||this.$el.is("textarea")||c.isContentEditable||"true"==c.contentEditable))throw new Error("textcomplete must be called on a Textarea or a ContentEditable.");if(c===c.ownerDocument.activeElement)this.initialize();else{var f=this;this.$el.one("focus."+this.id,function(){f.initialize()}),this.option.adapter&&"CKEditor"!=this.option.adapter||"undefined"==typeof CKEDITOR||!this.$el.is("textarea")||CKEDITOR.on("instanceReady",function(b){b.editor.once("focus",function(c){f.$el=a(b.editor.editable().$),f.option.adapter||(f.option.adapter=a.fn.textcomplete.CKEditor,f.option.ckeditor_instance=b.editor),f.initialize()})})}}var c=function(a){var b,c;return function(){var d=Array.prototype.slice.call(arguments);if(b)return void(c=d);b=!0;var e=this;d.unshift(function f(){if(c){var d=c;c=void 0,d.unshift(f),a.apply(e,d)}else b=!1}),a.apply(this,d)}},d=function(a){return"[object String]"===Object.prototype.toString.call(a)},e=0;b.defaults={appendTo:"body",className:"",dropdownClassName:"dropdown-menu textcomplete-dropdown",maxCount:10,zIndex:"100",rightEdgeOffset:30},a.extend(b.prototype,{id:null,option:null,strategies:null,adapter:null,dropdown:null,$el:null,$iframe:null,initialize:function(){var b=this.$el.get(0);if(this.$el.prop("ownerDocument")!==document&&window.frames.length)for(var c=0;c<window.frames.length;c++)if(this.$el.prop("ownerDocument")===window.frames[c].document){this.$iframe=a(window.frames[c].frameElement);break}this.dropdown=new a.fn.textcomplete.Dropdown(b,this,this.option);var d,e;this.option.adapter?d=this.option.adapter:(e=this.$el.is("textarea")||this.$el.is("input[type=text]")||this.$el.is("input[type=search]")?"number"==typeof b.selectionEnd?"Textarea":"IETextarea":"ContentEditable",d=a.fn.textcomplete[e]),this.adapter=new d(b,this,this.option)},destroy:function(){this.$el.off("."+this.id),this.adapter&&this.adapter.destroy(),this.dropdown&&this.dropdown.destroy(),this.$el=this.adapter=this.dropdown=null},deactivate:function(){this.dropdown&&this.dropdown.deactivate()},trigger:function(a,b){this.dropdown||this.initialize(),null!=a||(a=this.adapter.getTextFromHeadToCaret());var c=this._extractSearchQuery(a);if(c.length){var d=c[1];if(b&&this._term===d&&""!==d)return;this._term=d,this._search.apply(this,c)}else this._term=null,this.dropdown.deactivate()},fire:function(a){var b=Array.prototype.slice.call(arguments,1);return this.$el.trigger(a,b),this},register:function(a){Array.prototype.push.apply(this.strategies,a)},select:function(a,b,c){this._term=null,this.adapter.select(a,b,c),this.fire("change").fire("textComplete:select",a,b),this.adapter.focus()},_clearAtNext:!0,_term:null,_extractSearchQuery:function(b){for(var c=0;c<this.strategies.length;c++){var e=this.strategies[c],f=e.context(b);if(f||""===f){var g=a.isFunction(e.match)?e.match(b):e.match;d(f)&&(b=f);var h=b.match(g);if(h)return[e,h[e.index],h]}}return[]},_search:c(function(a,b,c,d){var e=this;b.search(c,function(d,f){e.dropdown.shown||e.dropdown.activate(),e._clearAtNext&&(e.dropdown.clear(),e._clearAtNext=!1),e.dropdown.setPosition(e.adapter.getCaretPosition()),e.dropdown.render(e._zip(d,b,c)),f||(a(),e._clearAtNext=!0)},d)}),_zip:function(b,c,d){return a.map(b,function(a){return{value:a,strategy:c,term:d}})}}),a.fn.textcomplete.Completer=b}(a),+function(a){"use strict";function b(c,d,f){this.$el=b.createElement(f),this.completer=d,this.id=d.id+"dropdown",this._data=[],this.$inputEl=a(c),this.option=f,f.listPosition&&(this.setPosition=f.listPosition),f.height&&this.$el.height(f.height);var g=this;a.each(["maxCount","placement","footer","header","noResultsMessage","className"],function(a,b){null!=f[b]&&(g[b]=f[b])}),this._bindEvents(c),e[this.id]=this}var c=a(window),d=function(a,b){var c,d,e=b.strategy.idProperty;for(c=0;c<a.length;c++)if(d=a[c],d.strategy===b.strategy)if(e){if(d.value[e]===b.value[e])return!0}else if(d.value===b.value)return!0;return!1},e={};a(document).on("click",function(b){var c=b.originalEvent&&b.originalEvent.keepTextCompleteDropdown;a.each(e,function(a,b){a!==c&&b.deactivate()})});var f={SKIP_DEFAULT:0,KEY_UP:1,KEY_DOWN:2,KEY_ENTER:3,KEY_PAGEUP:4,KEY_PAGEDOWN:5,KEY_ESCAPE:6};a.extend(b,{createElement:function(b){var c=b.appendTo;c instanceof a||(c=a(c));var d=a("<ul></ul>").addClass(b.dropdownClassName).attr("id","textcomplete-dropdown-"+b._oid).css({display:"none",left:0,position:"absolute",zIndex:b.zIndex}).appendTo(c);return d}}),a.extend(b.prototype,{$el:null,$inputEl:null,completer:null,footer:null,header:null,id:null,maxCount:null,placement:"",shown:!1,data:[],className:"",destroy:function(){this.deactivate(),this.$el.off("."+this.id),this.$inputEl.off("."+this.id),this.clear(),this.$el.remove(),this.$el=this.$inputEl=this.completer=null,delete e[this.id]},render:function(b){var c=this._buildContents(b),d=a.map(b,function(a){return a.value});if(b.length){var e=b[0].strategy;e.id?this.$el.attr("data-strategy",e.id):this.$el.removeAttr("data-strategy"),this._renderHeader(d),this._renderFooter(d),c&&(this._renderContents(c),this._fitToBottom(),this._fitToRight(),this._activateIndexedItem()),this._setScroll()}else this.noResultsMessage?this._renderNoResultsMessage(d):this.shown&&this.deactivate()},setPosition:function(b){var d="absolute";return this.$inputEl.add(this.$inputEl.parents()).each(function(){return"absolute"===a(this).css("position")?!1:"fixed"===a(this).css("position")?(b.top-=c.scrollTop(),b.left-=c.scrollLeft(),d="fixed",!1):void 0}),this.$el.css(this._applyPlacement(b)),this.$el.css({position:d}),this},clear:function(){this.$el.html(""),this.data=[],this._index=0,this._$header=this._$footer=this._$noResultsMessage=null},activate:function(){return this.shown||(this.clear(),this.$el.show(),this.className&&this.$el.addClass(this.className),this.completer.fire("textComplete:show"),this.shown=!0),this},deactivate:function(){return this.shown&&(this.$el.hide(),this.className&&this.$el.removeClass(this.className),this.completer.fire("textComplete:hide"),this.shown=!1),this},isUp:function(a){return 38===a.keyCode||a.ctrlKey&&80===a.keyCode},isDown:function(a){return 40===a.keyCode||a.ctrlKey&&78===a.keyCode},isEnter:function(a){var b=a.ctrlKey||a.altKey||a.metaKey||a.shiftKey;return!b&&(13===a.keyCode||9===a.keyCode||this.option.completeOnSpace===!0&&32===a.keyCode)},isPageup:function(a){return 33===a.keyCode},isPagedown:function(a){return 34===a.keyCode},isEscape:function(a){return 27===a.keyCode},_data:null,_index:null,_$header:null,_$noResultsMessage:null,_$footer:null,_bindEvents:function(){this.$el.on("mousedown."+this.id,".textcomplete-item",a.proxy(this._onClick,this)),this.$el.on("touchstart."+this.id,".textcomplete-item",a.proxy(this._onClick,this)),this.$el.on("mouseover."+this.id,".textcomplete-item",a.proxy(this._onMouseover,this)),this.$inputEl.on("keydown."+this.id,a.proxy(this._onKeydown,this))},_onClick:function(b){var c=a(b.target);b.preventDefault(),b.originalEvent.keepTextCompleteDropdown=this.id,c.hasClass("textcomplete-item")||(c=c.closest(".textcomplete-item"));var d=this.data[parseInt(c.data("index"),10)];this.completer.select(d.value,d.strategy,b);var e=this;setTimeout(function(){e.deactivate(),"touchstart"===b.type&&e.$inputEl.focus()},0)},_onMouseover:function(b){var c=a(b.target);b.preventDefault(),c.hasClass("textcomplete-item")||(c=c.closest(".textcomplete-item")),this._index=parseInt(c.data("index"),10),this._activateIndexedItem()},_onKeydown:function(b){if(this.shown){var c;switch(a.isFunction(this.option.onKeydown)&&(c=this.option.onKeydown(b,f)),null==c&&(c=this._defaultKeydown(b)),c){case f.KEY_UP:b.preventDefault(),this._up();break;case f.KEY_DOWN:b.preventDefault(),this._down();break;case f.KEY_ENTER:b.preventDefault(),this._enter(b);break;case f.KEY_PAGEUP:b.preventDefault(),this._pageup();break;case f.KEY_PAGEDOWN:b.preventDefault(),this._pagedown();break;case f.KEY_ESCAPE:b.preventDefault(),this.deactivate()}}},_defaultKeydown:function(a){return this.isUp(a)?f.KEY_UP:this.isDown(a)?f.KEY_DOWN:this.isEnter(a)?f.KEY_ENTER:this.isPageup(a)?f.KEY_PAGEUP:this.isPagedown(a)?f.KEY_PAGEDOWN:this.isEscape(a)?f.KEY_ESCAPE:void 0},_up:function(){0===this._index?this._index=this.data.length-1:this._index-=1,this._activateIndexedItem(),this._setScroll()},_down:function(){this._index===this.data.length-1?this._index=0:this._index+=1,this._activateIndexedItem(),this._setScroll()},_enter:function(a){var b=this.data[parseInt(this._getActiveElement().data("index"),10)];this.completer.select(b.value,b.strategy,a),this.deactivate()},_pageup:function(){var b=0,c=this._getActiveElement().position().top-this.$el.innerHeight();this.$el.children().each(function(d){return a(this).position().top+a(this).outerHeight()>c?(b=d,!1):void 0}),this._index=b,this._activateIndexedItem(),this._setScroll()},_pagedown:function(){var b=this.data.length-1,c=this._getActiveElement().position().top+this.$el.innerHeight();this.$el.children().each(function(d){return a(this).position().top>c?(b=d,!1):void 0}),this._index=b,this._activateIndexedItem(),this._setScroll()},_activateIndexedItem:function(){this.$el.find(".textcomplete-item.active").removeClass("active"),this._getActiveElement().addClass("active")},_getActiveElement:function(){return this.$el.children(".textcomplete-item:nth("+this._index+")")},_setScroll:function(){var a=this._getActiveElement(),b=a.position().top,c=a.outerHeight(),d=this.$el.innerHeight(),e=this.$el.scrollTop();0===this._index||this._index==this.data.length-1||0>b?this.$el.scrollTop(b+e):b+c>d&&this.$el.scrollTop(b+c+e-d)},_buildContents:function(a){var b,c,e,f="";for(c=0;c<a.length&&this.data.length!==this.maxCount;c++)b=a[c],d(this.data,b)||(e=this.data.length,this.data.push(b),f+='<li class="textcomplete-item" data-index="'+e+'"><a>',f+=b.strategy.template(b.value,b.term),f+="</a></li>");return f},_renderHeader:function(b){if(this.header){this._$header||(this._$header=a('<li class="textcomplete-header"></li>').prependTo(this.$el));var c=a.isFunction(this.header)?this.header(b):this.header;this._$header.html(c)}},_renderFooter:function(b){if(this.footer){this._$footer||(this._$footer=a('<li class="textcomplete-footer"></li>').appendTo(this.$el));var c=a.isFunction(this.footer)?this.footer(b):this.footer;this._$footer.html(c)}},_renderNoResultsMessage:function(b){if(this.noResultsMessage){this._$noResultsMessage||(this._$noResultsMessage=a('<li class="textcomplete-no-results-message"></li>').appendTo(this.$el));var c=a.isFunction(this.noResultsMessage)?this.noResultsMessage(b):this.noResultsMessage;this._$noResultsMessage.html(c)}},_renderContents:function(a){this._$footer?this._$footer.before(a):this.$el.append(a)},_fitToBottom:function(){var a=c.scrollTop()+c.height(),b=this.$el.height();this.$el.position().top+b>a&&(this.completer.$iframe||this.$el.offset({top:a-b}))},_fitToRight:function(){for(var a,b=this.option.rightEdgeOffset,d=this.$el.offset().left,e=this.$el.width(),f=c.width()-b;d+e>f&&(this.$el.offset({left:d-b}),a=this.$el.offset().left,!(a>=d));)d=a},_applyPlacement:function(a){return-1!==this.placement.indexOf("top")?a={top:"auto",bottom:this.$el.parent().height()-a.top+a.lineHeight,left:a.left}:(a.bottom="auto",delete a.lineHeight),-1!==this.placement.indexOf("absleft")?a.left=0:-1!==this.placement.indexOf("absright")&&(a.right=0,a.left="auto"),a}}),a.fn.textcomplete.Dropdown=b,a.extend(a.fn.textcomplete,f)}(a),+function(a){"use strict";function b(b){a.extend(this,b),this.cache&&(this.search=c(this.search))}var c=function(a){var b={};return function(c,d){b[c]?d(b[c]):a.call(this,c,function(a){b[c]=(b[c]||[]).concat(a),d.apply(null,arguments)})}};b.parse=function(c,d){return a.map(c,function(a){var c=new b(a);return c.el=d.el,c.$el=d.$el,c})},a.extend(b.prototype,{match:null,replace:null,search:null,id:null,cache:!1,context:function(){return!0},index:2,template:function(a){return a},idProperty:null}),a.fn.textcomplete.Strategy=b}(a),+function(a){"use strict";function b(){}var c=Date.now||function(){return(new Date).getTime()},d=function(a,b){var d,e,f,g,h,i=function(){var j=c()-g;b>j?d=setTimeout(i,b-j):(d=null,h=a.apply(f,e),f=e=null)};return function(){return f=this,e=arguments,g=c(),d||(d=setTimeout(i,b)),h}};a.extend(b.prototype,{id:null,completer:null,el:null,$el:null,option:null,initialize:function(b,c,e){this.el=b,this.$el=a(b),this.id=c.id+this.constructor.name,this.completer=c,this.option=e,this.option.debounce&&(this._onKeyup=d(this._onKeyup,this.option.debounce)),this._bindEvents()},destroy:function(){this.$el.off("."+this.id),this.$el=this.el=this.completer=null},select:function(){throw new Error("Not implemented")},getCaretPosition:function(){var b=this._getCaretRelativePosition(),c=this.$el.offset(),d=this.option.appendTo;if(d){d instanceof a||(d=a(d));var e=d.offsetParent().offset();c.top-=e.top,c.left-=e.left}return b.top+=c.top,b.left+=c.left,b},focus:function(){this.$el.focus()},_bindEvents:function(){this.$el.on("keyup."+this.id,a.proxy(this._onKeyup,this))},_onKeyup:function(a){this._skipSearch(a)||this.completer.trigger(this.getTextFromHeadToCaret(),!0)},_skipSearch:function(a){switch(a.keyCode){case 9:case 13:case 16:case 17:case 18:case 33:case 34:case 40:case 38:case 27:return!0}if(a.ctrlKey)switch(a.keyCode){case 78:case 80:return!0}}}),a.fn.textcomplete.Adapter=b}(a),+function(a){"use strict";function b(a,b,c){this.initialize(a,b,c)}a.extend(b.prototype,a.fn.textcomplete.Adapter.prototype,{select:function(b,c,d){var e,f=this.getTextFromHeadToCaret(),g=this.el.value.substring(this.el.selectionEnd),h=c.replace(b,d);"undefined"!=typeof h&&(a.isArray(h)&&(g=h[1]+g,h=h[0]),e=a.isFunction(c.match)?c.match(f):c.match,f=f.replace(e,h),this.$el.val(f+g),this.el.selectionStart=this.el.selectionEnd=f.length)},getTextFromHeadToCaret:function(){return this.el.value.substring(0,this.el.selectionEnd)},_getCaretRelativePosition:function(){var b=a.fn.textcomplete.getCaretCoordinates(this.el,this.el.selectionStart);return{top:b.top+this._calculateLineHeight()-this.$el.scrollTop(),left:b.left-this.$el.scrollLeft(),lineHeight:this._calculateLineHeight()}},_calculateLineHeight:function(){var a=parseInt(this.$el.css("line-height"),10);if(isNaN(a)){var b=this.el.parentNode,c=document.createElement(this.el.nodeName),d=this.el.style;c.setAttribute("style","margin:0px;padding:0px;font-family:"+d.fontFamily+";font-size:"+d.fontSize),c.innerHTML="test",b.appendChild(c),a=c.clientHeight,b.removeChild(c)}return a}}),a.fn.textcomplete.Textarea=b}(a),+function(a){"use strict";function b(b,d,e){this.initialize(b,d,e),a("<span>"+c+"</span>").css({position:"absolute",top:-9999,left:-9999}).insertBefore(b)}var c="吶";a.extend(b.prototype,a.fn.textcomplete.Textarea.prototype,{select:function(b,c,d){var e,f=this.getTextFromHeadToCaret(),g=this.el.value.substring(f.length),h=c.replace(b,d);if("undefined"!=typeof h){a.isArray(h)&&(g=h[1]+g,h=h[0]),e=a.isFunction(c.match)?c.match(f):c.match,f=f.replace(e,h),this.$el.val(f+g),this.el.focus();var i=this.el.createTextRange();i.collapse(!0),i.moveEnd("character",f.length),i.moveStart("character",f.length),i.select()}},getTextFromHeadToCaret:function(){this.el.focus();var a=document.selection.createRange();a.moveStart("character",-this.el.value.length);var b=a.text.split(c);return 1===b.length?b[0]:b[1]}}),a.fn.textcomplete.IETextarea=b}(a),+function(a){"use strict";function b(a,b,c){this.initialize(a,b,c)}a.extend(b.prototype,a.fn.textcomplete.Adapter.prototype,{select:function(b,c,d){var e=this.getTextFromHeadToCaret(),f=this.el.ownerDocument.getSelection(),g=f.getRangeAt(0),h=g.cloneRange();h.selectNodeContents(g.startContainer);var i,j=h.toString(),k=j.substring(g.startOffset),l=c.replace(b,d);if("undefined"!=typeof l){a.isArray(l)&&(k=l[1]+k,l=l[0]),i=a.isFunction(c.match)?c.match(e):c.match,e=e.replace(i,l).replace(/ $/," "),g.selectNodeContents(g.startContainer),g.deleteContents();var m=this.el.ownerDocument.createElement("div");m.innerHTML=e;var n=this.el.ownerDocument.createElement("div");n.innerHTML=k;for(var o,p,q=this.el.ownerDocument.createDocumentFragment();o=m.firstChild;)p=q.appendChild(o);for(;o=n.firstChild;)q.appendChild(o);g.insertNode(q),g.setStartAfter(p),g.collapse(!0),f.removeAllRanges(),f.addRange(g)}},_getCaretRelativePosition:function(){var b=this.el.ownerDocument.getSelection().getRangeAt(0).cloneRange(),c=this.el.ownerDocument.createElement("span");b.insertNode(c),b.selectNodeContents(c),b.deleteContents();var d=a(c),e=d.offset();if(e.left-=this.$el.offset().left,e.top+=d.height()-this.$el.offset().top,e.lineHeight=d.height(),this.completer.$iframe){var f=this.completer.$iframe.offset();e.top+=f.top,e.left+=f.left,e.top-=this.$el.scrollTop()}return d.remove(),e},getTextFromHeadToCaret:function(){var a=this.el.ownerDocument.getSelection().getRangeAt(0),b=a.cloneRange();return b.selectNodeContents(a.startContainer),b.toString().substring(0,a.startOffset)}}),a.fn.textcomplete.ContentEditable=b}(a),+function(a){"use strict";function b(a,b,c){this.initialize(a,b,c)}a.extend(b.prototype,a.fn.textcomplete.ContentEditable.prototype,{_bindEvents:function(){var b=this;this.option.ckeditor_instance.on("key",function(a){var c=a.data;return b._onKeyup(c),b.completer.dropdown.shown&&b._skipSearch(c)?!1:void 0},null,null,1),this.$el.on("keyup."+this.id,a.proxy(this._onKeyup,this))}}),a.fn.textcomplete.CKEditor=b}(a),function(a){function b(a,b,f){if(!d)throw new Error("textarea-caret-position#getCaretCoordinates should only be called in a browser");var g=f&&f.debug||!1;if(g){var h=document.querySelector("#input-textarea-caret-position-mirror-div");h&&h.parentNode.removeChild(h)}var i=document.createElement("div");i.id="input-textarea-caret-position-mirror-div",document.body.appendChild(i);var j=i.style,k=window.getComputedStyle?getComputedStyle(a):a.currentStyle;j.whiteSpace="pre-wrap","INPUT"!==a.nodeName&&(j.wordWrap="break-word"),j.position="absolute",g||(j.visibility="hidden"),c.forEach(function(a){j[a]=k[a]}),e?a.scrollHeight>parseInt(k.height)&&(j.overflowY="scroll"):j.overflow="hidden",i.textContent=a.value.substring(0,b),"INPUT"===a.nodeName&&(i.textContent=i.textContent.replace(/\s/g," "));var l=document.createElement("span");l.textContent=a.value.substring(b)||".",i.appendChild(l);var m={top:l.offsetTop+parseInt(k.borderTopWidth),left:l.offsetLeft+parseInt(k.borderLeftWidth)};return g?l.style.backgroundColor="#aaa":document.body.removeChild(i),m}var c=["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderStyle","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing","tabSize","MozTabSize"],d="undefined"!=typeof window,e=d&&null!=window.mozInnerScreenX;a.fn.textcomplete.getCaretCoordinates=b}(a),a}); -//# sourceMappingURL=dist/jquery.textcomplete.min.map
\ No newline at end of file diff --git a/library/jquery-textcomplete/jquery.textcomplete.min.map b/library/jquery-textcomplete/jquery.textcomplete.min.map deleted file mode 100644 index 0e249c1c4..000000000 --- a/library/jquery-textcomplete/jquery.textcomplete.min.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"dist/jquery.textcomplete.min.js","sources":["dist/jquery.textcomplete.js"],"names":["factory","define","amd","module","exports","$","require","jQuery","Error","warn","message","console","id","fn","textcomplete","strategies","option","args","Array","prototype","slice","call","arguments","this","each","self","$this","completer","data","_oid","Completer","shift","apply","removeData","obj","name","register","Strategy","parse","el","$el","element","uniqueId","views","extend","defaults","is","isContentEditable","contentEditable","ownerDocument","activeElement","initialize","one","adapter","CKEDITOR","on","event","editor","once","event2","editable","ckeditor_instance","lock","func","locked","queuedArgsToReplay","unshift","replayOrFree","replayArgs","undefined","isString","Object","toString","appendTo","className","dropdownClassName","maxCount","zIndex","rightEdgeOffset","dropdown","$iframe","get","prop","document","window","frames","length","iframeIndex","frameElement","Dropdown","Adapter","viewName","selectionEnd","destroy","off","deactivate","trigger","text","skipUnchangedTerm","getTextFromHeadToCaret","searchQuery","_extractSearchQuery","term","_term","_search","fire","eventName","push","select","value","strategy","e","focus","_clearAtNext","i","context","matchRegexp","isFunction","match","index","free","search","stillSearching","shown","activate","clear","setPosition","getCaretPosition","render","_zip","map","createElement","_data","$inputEl","listPosition","height","_i","_bindEvents","dropdownViews","$window","include","zippedData","datum","elem","idProperty","originalEvent","keepTextCompleteDropdown","key","view","commands","SKIP_DEFAULT","KEY_UP","KEY_DOWN","KEY_ENTER","KEY_PAGEUP","KEY_PAGEDOWN","KEY_ESCAPE","$parent","addClass","attr","css","display","left","position","footer","header","placement","remove","contentsHtml","_buildContents","unzippedData","d","removeAttr","_renderHeader","_renderFooter","_renderContents","_fitToBottom","_fitToRight","_activateIndexedItem","_setScroll","noResultsMessage","_renderNoResultsMessage","pos","add","parents","top","scrollTop","scrollLeft","_applyPlacement","html","_index","_$header","_$footer","_$noResultsMessage","show","hide","removeClass","isUp","keyCode","ctrlKey","isDown","isEnter","modifiers","altKey","metaKey","shiftKey","completeOnSpace","isPageup","isPagedown","isEscape","proxy","_onClick","_onMouseover","_onKeydown","target","preventDefault","hasClass","closest","parseInt","setTimeout","type","command","onKeydown","_defaultKeydown","_up","_down","_enter","_pageup","_pagedown","_getActiveElement","threshold","innerHeight","children","outerHeight","find","$activeEl","itemTop","itemHeight","visibleHeight","visibleTop","template","prependTo","before","append","windowScrollBottom","offset","tolerance","lastOffset","width","maxLeft","indexOf","bottom","parent","lineHeight","right","options","cache","memoize","memo","callback","concat","strategiesArray","params","strategyObj","replace","now","Date","getTime","debounce","wait","timeout","timestamp","result","later","last","constructor","_onKeyup","_getCaretRelativePosition","parentOffset","offsetParent","_skipSearch","clickEvent","Textarea","regExp","pre","post","substring","newSubstr","isArray","val","selectionStart","p","getCaretCoordinates","_calculateLineHeight","isNaN","parentNode","temp","nodeName","style","setAttribute","fontFamily","fontSize","innerHTML","appendChild","clientHeight","removeChild","IETextarea","sentinelChar","insertBefore","range","createTextRange","collapse","moveEnd","moveStart","selection","createRange","arr","split","ContentEditable","sel","getSelection","getRangeAt","cloneRange","selectNodeContents","startContainer","content","startOffset","deleteContents","preWrapper","postWrapper","childNode","lastOfPre","fragment","createDocumentFragment","firstChild","insertNode","setStartAfter","removeAllRanges","addRange","node","$node","iframePosition","CKEditor","domEvent","isBrowser","debug","querySelector","div","body","computed","getComputedStyle","currentStyle","whiteSpace","wordWrap","visibility","properties","forEach","isFirefox","scrollHeight","overflowY","overflow","textContent","span","coordinates","offsetTop","offsetLeft","backgroundColor","mozInnerScreenX"],"mappings":";CAAC,SAAUA,GACT,GAAsB,kBAAXC,SAAyBA,OAAOC,IAEzCD,QAAQ,UAAWD,OACd,IAAsB,gBAAXG,SAAuBA,OAAOC,QAAS,CACvD,GAAIC,GAAIC,QAAQ,SAChBH,QAAOC,QAAUJ,EAAQK,OAGzBL,GAAQO,SAEV,SAAUA,GAUZ,GAAsB,mBAAXA,GACT,KAAM,IAAIC,OAAM,sCAw7ClB,QAr7CC,SAAUH,GACT,YAEA,IAAII,GAAO,SAAUC,GACfC,QAAQF,MAAQE,QAAQF,KAAKC,IAG/BE,EAAK,CAETP,GAAEQ,GAAGC,aAAe,SAAUC,EAAYC,GACxC,GAAIC,GAAOC,MAAMC,UAAUC,MAAMC,KAAKC,UACtC,OAAOC,MAAKC,KAAK,WACf,GAAIC,GAAOF,KACPG,EAAQrB,EAAEkB,MACVI,EAAYD,EAAME,KAAK,eAO3B,IANKD,IACHX,IAAWA,MACXA,EAAOa,KAAOjB,IACde,EAAY,GAAItB,GAAEQ,GAAGC,aAAagB,UAAUP,KAAMP,GAClDU,EAAME,KAAK,eAAgBD,IAEH,gBAAfZ,GAAyB,CAClC,IAAKY,EAAW,MAChBV,GAAKc,QACLJ,EAAUZ,GAAYiB,MAAML,EAAWV,GACpB,YAAfF,GACFW,EAAMO,WAAW,oBAKnB5B,GAAEmB,KAAKT,EAAY,SAAUmB,GAC3B7B,EAAEmB,MAAM,SAAU,SAAU,YAAa,YAAa,SAAUW,GAC1DD,EAAIC,KACNR,EAAUX,OAAOmB,GAAQD,EAAIC,GAC7B1B,EAAK0B,EAAO,wDACLD,GAAIC,QAIjBR,EAAUS,SAAS/B,EAAEQ,GAAGC,aAAauB,SAASC,MAAMvB,GAClDwB,GAAId,EACJe,IAAKd,SAMbnB,IAED,SAAUF,GACT,YAgEA,SAASyB,GAAUW,EAASzB,GAO1B,GANAO,KAAKiB,IAAanC,EAAEoC,GACpBlB,KAAKX,GAAa,eAAiB8B,IACnCnB,KAAKR,cACLQ,KAAKoB,SACLpB,KAAKP,OAAaX,EAAEuC,UAAWd,EAAUe,SAAU7B,KAE9CO,KAAKiB,IAAIM,GAAG,qBAAwBvB,KAAKiB,IAAIM,GAAG,uBAA0BvB,KAAKiB,IAAIM,GAAG,aAAgBL,EAAQM,mBAAgD,QAA3BN,EAAQO,iBAC9I,KAAM,IAAIxC,OAAM,kEAIlB,IAAIiC,IAAYA,EAAQQ,cAAcC,cAEpC3B,KAAK4B,iBACA,CAEL,GAAI1B,GAAOF,IACXA,MAAKiB,IAAIY,IAAI,SAAW7B,KAAKX,GAAI,WAAca,EAAK0B,eAG9C5B,KAAKP,OAAOqC,SAAkC,YAAvB9B,KAAKP,OAAOqC,SAA6C,mBAAZC,YAA4B/B,KAAKiB,IAAIM,GAAG,aAChHQ,SAASC,GAAG,gBAAiB,SAASC,GACpCA,EAAMC,OAAOC,KAAK,QAAS,SAASC,GAElClC,EAAKe,IAAMnC,EAAEmD,EAAMC,OAAOG,WAAWvD,GAChCoB,EAAKT,OAAOqC,UACf5B,EAAKT,OAAOqC,QAAUhD,EAAEQ,GAAGC,aAAuB,SAClDW,EAAKT,OAAO6C,kBAAoBL,EAAMC,QAExChC,EAAK0B,kBAtEf,GAAIW,GAAO,SAAUC,GACnB,GAAIC,GAAQC,CAEZ,OAAO,YAEL,GAAIhD,GAAOC,MAAMC,UAAUC,MAAMC,KAAKC,UACtC,IAAI0C,EAKF,YADAC,EAAqBhD,EAGvB+C,IAAS,CACT,IAAIvC,GAAOF,IACXN,GAAKiD,QAAQ,QAASC,KACpB,GAAIF,EAAoB,CAMtB,GAAIG,GAAaH,CACjBA,GAAqBI,OACrBD,EAAWF,QAAQC,GACnBJ,EAAK/B,MAAMP,EAAM2C,OAEjBJ,IAAS,IAGbD,EAAK/B,MAAMT,KAAMN,KAIjBqD,EAAW,SAAUpC,GACvB,MAA+C,oBAAxCqC,OAAOpD,UAAUqD,SAASnD,KAAKa,IAGpCQ,EAAW,CAuCfZ,GAAUe,UACR4B,SAAU,OACVC,UAAW,GACXC,kBAAmB,sCACnBC,SAAU,GACVC,OAAQ,MACRC,gBAAiB,IAGnBzE,EAAEuC,OAAOd,EAAUX,WAIjBP,GAAY,KACZI,OAAY,KACZD,WAAY,KACZsC,QAAY,KACZ0B,SAAY,KACZvC,IAAY,KACZwC,QAAY,KAKZ7B,WAAY,WACV,GAAIV,GAAUlB,KAAKiB,IAAIyC,IAAI,EAI3B,IAAI1D,KAAKiB,IAAI0C,KAAK,mBAAqBC,UAAYC,OAAOC,OAAOC,OAC/D,IAAK,GAAIC,GAAc,EAAGA,EAAcH,OAAOC,OAAOC,OAAQC,IAC5D,GAAIhE,KAAKiB,IAAI0C,KAAK,mBAAqBE,OAAOC,OAAOE,GAAaJ,SAAU,CAC1E5D,KAAKyD,QAAU3E,EAAE+E,OAAOC,OAAOE,GAAaC,aAC5C,OAONjE,KAAKwD,SAAW,GAAI1E,GAAEQ,GAAGC,aAAa2E,SAAShD,EAASlB,KAAMA,KAAKP,OACnE,IAAI0E,GAASC,CACTpE,MAAKP,OAAOqC,QACdqC,EAAUnE,KAAKP,OAAOqC,SAGpBsC,EADEpE,KAAKiB,IAAIM,GAAG,aAAevB,KAAKiB,IAAIM,GAAG,qBAAuBvB,KAAKiB,IAAIM,GAAG,sBACjC,gBAAzBL,GAAQmD,aAA4B,WAAa,aAExD,kBAEbF,EAAUrF,EAAEQ,GAAGC,aAAa6E,IAE9BpE,KAAK8B,QAAU,GAAIqC,GAAQjD,EAASlB,KAAMA,KAAKP,SAGjD6E,QAAS,WACPtE,KAAKiB,IAAIsD,IAAI,IAAMvE,KAAKX,IACpBW,KAAK8B,SACP9B,KAAK8B,QAAQwC,UAEXtE,KAAKwD,UACPxD,KAAKwD,SAASc,UAEhBtE,KAAKiB,IAAMjB,KAAK8B,QAAU9B,KAAKwD,SAAW,MAG5CgB,WAAY,WACNxE,KAAKwD,UACPxD,KAAKwD,SAASgB,cAKlBC,QAAS,SAAUC,EAAMC,GAClB3E,KAAKwD,UAAYxD,KAAK4B,aACnB,MAAR8C,IAAiBA,EAAO1E,KAAK8B,QAAQ8C,yBACrC,IAAIC,GAAc7E,KAAK8E,oBAAoBJ,EAC3C,IAAIG,EAAYd,OAAQ,CACtB,GAAIgB,GAAOF,EAAY,EAEvB,IAAIF,GAAqB3E,KAAKgF,QAAUD,GAAiB,KAATA,EAAe,MAC/D/E,MAAKgF,MAAQD,EACb/E,KAAKiF,QAAQxE,MAAMT,KAAM6E,OAEzB7E,MAAKgF,MAAQ,KACbhF,KAAKwD,SAASgB,cAIlBU,KAAM,SAAUC,GACd,GAAIzF,GAAOC,MAAMC,UAAUC,MAAMC,KAAKC,UAAW,EAEjD,OADAC,MAAKiB,IAAIwD,QAAQU,EAAWzF,GACrBM,MAGTa,SAAU,SAAUrB,GAClBG,MAAMC,UAAUwF,KAAK3E,MAAMT,KAAKR,WAAYA,IAS9C6F,OAAQ,SAAUC,EAAOC,EAAUC,GACjCxF,KAAKgF,MAAQ,KACbhF,KAAK8B,QAAQuD,OAAOC,EAAOC,EAAUC,GACrCxF,KAAKkF,KAAK,UAAUA,KAAK,sBAAuBI,EAAOC,GACvDvF,KAAK8B,QAAQ2D,SAMfC,cAAc,EACdV,MAAc,KASdF,oBAAqB,SAAUJ,GAC7B,IAAK,GAAIiB,GAAI,EAAGA,EAAI3F,KAAKR,WAAWuE,OAAQ4B,IAAK,CAC/C,GAAIJ,GAAWvF,KAAKR,WAAWmG,GAC3BC,EAAUL,EAASK,QAAQlB,EAC/B,IAAIkB,GAAuB,KAAZA,EAAgB,CAC7B,GAAIC,GAAc/G,EAAEgH,WAAWP,EAASQ,OAASR,EAASQ,MAAMrB,GAAQa,EAASQ,KAC7EhD,GAAS6C,KAAYlB,EAAOkB,EAChC,IAAIG,GAAQrB,EAAKqB,MAAMF,EACvB,IAAIE,EAAS,OAAQR,EAAUQ,EAAMR,EAASS,OAAQD,IAG1D,UAIFd,QAAS1C,EAAK,SAAU0D,EAAMV,EAAUR,EAAMgB,GAC5C,GAAI7F,GAAOF,IACXuF,GAASW,OAAOnB,EAAM,SAAU1E,EAAM8F,GAC/BjG,EAAKsD,SAAS4C,OACjBlG,EAAKsD,SAAS6C,WAEZnG,EAAKwF,eAEPxF,EAAKsD,SAAS8C,QACdpG,EAAKwF,cAAe,GAEtBxF,EAAKsD,SAAS+C,YAAYrG,EAAK4B,QAAQ0E,oBACvCtG,EAAKsD,SAASiD,OAAOvG,EAAKwG,KAAKrG,EAAMkF,EAAUR,IAC1CoB,IAEHF,IACA/F,EAAKwF,cAAe,IAErBK,KASLW,KAAM,SAAUrG,EAAMkF,EAAUR,GAC9B,MAAOjG,GAAE6H,IAAItG,EAAM,SAAUiF,GAC3B,OAASA,MAAOA,EAAOC,SAAUA,EAAUR,KAAMA,QAKvDjG,EAAEQ,GAAGC,aAAagB,UAAYA,GAC9BvB,IAED,SAAUF,GACT,YA2CA,SAASoF,GAAShD,EAASd,EAAWX,GACpCO,KAAKiB,IAAYiD,EAAS0C,cAAcnH,GACxCO,KAAKI,UAAYA,EACjBJ,KAAKX,GAAYe,EAAUf,GAAK,WAChCW,KAAK6G,SACL7G,KAAK8G,SAAYhI,EAAEoC,GACnBlB,KAAKP,OAAYA,EAGbA,EAAOsH,eAAgB/G,KAAKuG,YAAc9G,EAAOsH,cACjDtH,EAAOuH,QAAUhH,KAAKiB,IAAI+F,OAAOvH,EAAOuH,OAC5C,IAAI9G,GAAOF,IACXlB,GAAEmB,MAAM,WAAY,YAAa,SAAU,SAAU,mBAAoB,aAAc,SAAUgH,EAAIrG,GAC/E,MAAhBnB,EAAOmB,KAAiBV,EAAKU,GAAQnB,EAAOmB,MAElDZ,KAAKkH,YAAYhG,GACjBiG,EAAcnH,KAAKX,IAAMW,KAzD3B,GAAIoH,GAAUtI,EAAE+E,QAEZwD,EAAU,SAAUC,EAAYC,GAClC,GAAI5B,GAAG6B,EACHC,EAAaF,EAAMhC,SAASkC,UAChC,KAAK9B,EAAI,EAAGA,EAAI2B,EAAWvD,OAAQ4B,IAEjC,GADA6B,EAAOF,EAAW3B,GACd6B,EAAKjC,WAAagC,EAAMhC,SAC5B,GAAIkC,GACF,GAAID,EAAKlC,MAAMmC,KAAgBF,EAAMjC,MAAMmC,GAAa,OAAO,MAE/D,IAAID,EAAKlC,QAAUiC,EAAMjC,MAAO,OAAO,CAG3C,QAAO,GAGL6B,IACJrI,GAAE8E,UAAU5B,GAAG,QAAS,SAAUwD,GAChC,GAAInG,GAAKmG,EAAEkC,eAAiBlC,EAAEkC,cAAcC,wBAC5C7I,GAAEmB,KAAKkH,EAAe,SAAUS,EAAKC,GAC/BD,IAAQvI,GAAMwI,EAAKrD,gBAI3B,IAAIsD,IACFC,aAAc,EACdC,OAAQ,EACRC,SAAU,EACVC,UAAW,EACXC,WAAY,EACZC,aAAc,EACdC,WAAY,EA4BdvJ,GAAEuC,OAAO6C,GAIP0C,cAAe,SAAUnH,GACvB,GAAI6I,GAAU7I,EAAOyD,QACfoF,aAAmBxJ,KAAMwJ,EAAUxJ,EAAEwJ,GAC3C,IAAIrH,GAAMnC,EAAE,aACTyJ,SAAS9I,EAAO2D,mBAChBoF,KAAK,KAAM,yBAA2B/I,EAAOa,MAC7CmI,KACCC,QAAS,OACTC,KAAM,EACNC,SAAU,WACVtF,OAAQ7D,EAAO6D,SAEhBJ,SAASoF,EACZ,OAAOrH,MAIXnC,EAAEuC,OAAO6C,EAAStE,WAIhBqB,IAAW,KACX6F,SAAW,KACX1G,UAAW,KACXyI,OAAW,KACXC,OAAW,KACXzJ,GAAW,KACXgE,SAAW,KACX0F,UAAW,GACX3C,OAAW,EACX/F,QACA8C,UAAW,GAKXmB,QAAS,WAEPtE,KAAKwE,aAELxE,KAAKiB,IAAIsD,IAAI,IAAMvE,KAAKX,IACxBW,KAAK8G,SAASvC,IAAI,IAAMvE,KAAKX,IAC7BW,KAAKsG,QACLtG,KAAKiB,IAAI+H,SACThJ,KAAKiB,IAAMjB,KAAK8G,SAAW9G,KAAKI,UAAY,WACrC+G,GAAcnH,KAAKX,KAG5BoH,OAAQ,SAAUa,GAChB,GAAI2B,GAAejJ,KAAKkJ,eAAe5B,GACnC6B,EAAerK,EAAE6H,IAAIW,EAAY,SAAU8B,GAAK,MAAOA,GAAE9D,OAC7D,IAAIgC,EAAWvD,OAAQ,CACrB,GAAIwB,GAAW+B,EAAW,GAAG/B,QACzBA,GAASlG,GACXW,KAAKiB,IAAIuH,KAAK,gBAAiBjD,EAASlG,IAExCW,KAAKiB,IAAIoI,WAAW,iBAEtBrJ,KAAKsJ,cAAcH,GACnBnJ,KAAKuJ,cAAcJ,GACfF,IACFjJ,KAAKwJ,gBAAgBP,GACrBjJ,KAAKyJ,eACLzJ,KAAK0J,cACL1J,KAAK2J,wBAEP3J,KAAK4J,iBACI5J,MAAK6J,iBACd7J,KAAK8J,wBAAwBX,GACpBnJ,KAAKoG,OACdpG,KAAKwE,cAIT+B,YAAa,SAAUwD,GAIrB,GAAInB,GAAW,UAef,OAbA5I,MAAK8G,SAASkD,IAAIhK,KAAK8G,SAASmD,WAAWhK,KAAK,WAC9C,MAA+B,aAA5BnB,EAAEkB,MAAMyI,IAAI,aACN,EACsB,UAA5B3J,EAAEkB,MAAMyI,IAAI,aACbsB,EAAIG,KAAO9C,EAAQ+C,YACnBJ,EAAIpB,MAAQvB,EAAQgD,aACpBxB,EAAW,SACJ,GAJT,SAOF5I,KAAKiB,IAAIwH,IAAIzI,KAAKqK,gBAAgBN,IAClC/J,KAAKiB,IAAIwH,KAAMG,SAAUA,IAElB5I,MAGTsG,MAAO,WACLtG,KAAKiB,IAAIqJ,KAAK,IACdtK,KAAKK,QACLL,KAAKuK,OAAS,EACdvK,KAAKwK,SAAWxK,KAAKyK,SAAWzK,KAAK0K,mBAAqB,MAG5DrE,SAAU,WAQR,MAPKrG,MAAKoG,QACRpG,KAAKsG,QACLtG,KAAKiB,IAAI0J,OACL3K,KAAKmD,WAAanD,KAAKiB,IAAIsH,SAASvI,KAAKmD,WAC7CnD,KAAKI,UAAU8E,KAAK,qBACpBlF,KAAKoG,OAAQ,GAERpG,MAGTwE,WAAY,WAOV,MANIxE,MAAKoG,QACPpG,KAAKiB,IAAI2J,OACL5K,KAAKmD,WAAanD,KAAKiB,IAAI4J,YAAY7K,KAAKmD,WAChDnD,KAAKI,UAAU8E,KAAK,qBACpBlF,KAAKoG,OAAQ,GAERpG,MAGT8K,KAAM,SAAUtF,GACd,MAAqB,MAAdA,EAAEuF,SAAmBvF,EAAEwF,SAAyB,KAAdxF,EAAEuF,SAG7CE,OAAQ,SAAUzF,GAChB,MAAqB,MAAdA,EAAEuF,SAAmBvF,EAAEwF,SAAyB,KAAdxF,EAAEuF,SAG7CG,QAAS,SAAU1F,GACjB,GAAI2F,GAAY3F,EAAEwF,SAAWxF,EAAE4F,QAAU5F,EAAE6F,SAAW7F,EAAE8F,QACxD,QAAQH,IAA4B,KAAd3F,EAAEuF,SAAgC,IAAdvF,EAAEuF,SAAkB/K,KAAKP,OAAO8L,mBAAoB,GAAsB,KAAd/F,EAAEuF,UAG1GS,SAAU,SAAUhG,GAClB,MAAqB,MAAdA,EAAEuF,SAGXU,WAAY,SAAUjG,GACpB,MAAqB,MAAdA,EAAEuF,SAGXW,SAAU,SAAUlG,GAClB,MAAqB,MAAdA,EAAEuF,SAMXlE,MAAU,KACV0D,OAAU,KACVC,SAAU,KACVE,mBAAoB,KACpBD,SAAU,KAKVvD,YAAa,WACXlH,KAAKiB,IAAIe,GAAG,aAAehC,KAAKX,GAAI,qBAAsBP,EAAE6M,MAAM3L,KAAK4L,SAAU5L,OACjFA,KAAKiB,IAAIe,GAAG,cAAgBhC,KAAKX,GAAI,qBAAsBP,EAAE6M,MAAM3L,KAAK4L,SAAU5L,OAClFA,KAAKiB,IAAIe,GAAG,aAAehC,KAAKX,GAAI,qBAAsBP,EAAE6M,MAAM3L,KAAK6L,aAAc7L,OACrFA,KAAK8G,SAAS9E,GAAG,WAAahC,KAAKX,GAAIP,EAAE6M,MAAM3L,KAAK8L,WAAY9L,QAGlE4L,SAAU,SAAUpG,GAClB,GAAIvE,GAAMnC,EAAE0G,EAAEuG,OACdvG,GAAEwG,iBACFxG,EAAEkC,cAAcC,yBAA2B3H,KAAKX,GAC3C4B,EAAIgL,SAAS,uBAChBhL,EAAMA,EAAIiL,QAAQ,sBAEpB,IAAI3E,GAAQvH,KAAKK,KAAK8L,SAASlL,EAAIZ,KAAK,SAAU,IAClDL,MAAKI,UAAUiF,OAAOkC,EAAMjC,MAAOiC,EAAMhC,SAAUC,EACnD,IAAItF,GAAOF,IAGXoM,YAAW,WACTlM,EAAKsE,aACU,eAAXgB,EAAE6G,MACJnM,EAAK4G,SAASrB,SAEf,IAILoG,aAAc,SAAUrG,GACtB,GAAIvE,GAAMnC,EAAE0G,EAAEuG,OACdvG,GAAEwG,iBACG/K,EAAIgL,SAAS,uBAChBhL,EAAMA,EAAIiL,QAAQ,uBAEpBlM,KAAKuK,OAAS4B,SAASlL,EAAIZ,KAAK,SAAU,IAC1CL,KAAK2J,wBAGPmC,WAAY,SAAUtG,GACpB,GAAKxF,KAAKoG,MAAV,CAEA,GAAIkG,EAUJ,QARIxN,EAAEgH,WAAW9F,KAAKP,OAAO8M,aAC3BD,EAAUtM,KAAKP,OAAO8M,UAAU/G,EAAGsC,IAGtB,MAAXwE,IACFA,EAAUtM,KAAKwM,gBAAgBhH,IAGzB8G,GACN,IAAKxE,GAASE,OACZxC,EAAEwG,iBACFhM,KAAKyM,KACL,MACF,KAAK3E,GAASG,SACZzC,EAAEwG,iBACFhM,KAAK0M,OACL,MACF,KAAK5E,GAASI,UACZ1C,EAAEwG,iBACFhM,KAAK2M,OAAOnH,EACZ,MACF,KAAKsC,GAASK,WACZ3C,EAAEwG,iBACFhM,KAAK4M,SACL,MACF,KAAK9E,GAASM,aACZ5C,EAAEwG,iBACFhM,KAAK6M,WACL,MACF,KAAK/E,GAASO,WACZ7C,EAAEwG,iBACFhM,KAAKwE,gBAKXgI,gBAAiB,SAAUhH,GACzB,MAAIxF,MAAK8K,KAAKtF,GACLsC,EAASE,OACPhI,KAAKiL,OAAOzF,GACdsC,EAASG,SACPjI,KAAKkL,QAAQ1F,GACfsC,EAASI,UACPlI,KAAKwL,SAAShG,GAChBsC,EAASK,WACPnI,KAAKyL,WAAWjG,GAClBsC,EAASM,aACPpI,KAAK0L,SAASlG,GAChBsC,EAASO,WADX,QAKToE,IAAK,WACiB,IAAhBzM,KAAKuK,OACPvK,KAAKuK,OAASvK,KAAKK,KAAK0D,OAAS,EAEjC/D,KAAKuK,QAAU,EAEjBvK,KAAK2J,uBACL3J,KAAK4J,cAGP8C,MAAO,WACD1M,KAAKuK,SAAWvK,KAAKK,KAAK0D,OAAS,EACrC/D,KAAKuK,OAAS,EAEdvK,KAAKuK,QAAU,EAEjBvK,KAAK2J,uBACL3J,KAAK4J,cAGP+C,OAAQ,SAAUnH,GAChB,GAAI+B,GAAQvH,KAAKK,KAAK8L,SAASnM,KAAK8M,oBAAoBzM,KAAK,SAAU,IACvEL,MAAKI,UAAUiF,OAAOkC,EAAMjC,MAAOiC,EAAMhC,SAAUC,GACnDxF,KAAKwE,cAGPoI,QAAS,WACP,GAAIb,GAAS,EACTgB,EAAY/M,KAAK8M,oBAAoBlE,WAAWsB,IAAMlK,KAAKiB,IAAI+L,aACnEhN,MAAKiB,IAAIgM,WAAWhN,KAAK,SAAU0F,GACjC,MAAI7G,GAAEkB,MAAM4I,WAAWsB,IAAMpL,EAAEkB,MAAMkN,cAAgBH,GACnDhB,EAASpG,GACF,GAFT,SAKF3F,KAAKuK,OAASwB,EACd/L,KAAK2J,uBACL3J,KAAK4J,cAGPiD,UAAW,WACT,GAAId,GAAS/L,KAAKK,KAAK0D,OAAS,EAC5BgJ,EAAY/M,KAAK8M,oBAAoBlE,WAAWsB,IAAMlK,KAAKiB,IAAI+L,aACnEhN,MAAKiB,IAAIgM,WAAWhN,KAAK,SAAU0F,GACjC,MAAI7G,GAAEkB,MAAM4I,WAAWsB,IAAM6C,GAC3BhB,EAASpG,GACF,GAFT,SAKF3F,KAAKuK,OAASwB,EACd/L,KAAK2J,uBACL3J,KAAK4J,cAGPD,qBAAsB,WACpB3J,KAAKiB,IAAIkM,KAAK,6BAA6BtC,YAAY,UACvD7K,KAAK8M,oBAAoBvE,SAAS,WAGpCuE,kBAAmB,WACjB,MAAO9M,MAAKiB,IAAIgM,SAAS,0BAA4BjN,KAAKuK,OAAS,MAGrEX,WAAY,WACV,GAAIwD,GAAYpN,KAAK8M,oBACjBO,EAAUD,EAAUxE,WAAWsB,IAC/BoD,EAAaF,EAAUF,cACvBK,EAAgBvN,KAAKiB,IAAI+L,cACzBQ,EAAaxN,KAAKiB,IAAIkJ,WACN,KAAhBnK,KAAKuK,QAAgBvK,KAAKuK,QAAUvK,KAAKK,KAAK0D,OAAS,GAAe,EAAVsJ,EAC9DrN,KAAKiB,IAAIkJ,UAAUkD,EAAUG,GACpBH,EAAUC,EAAaC,GAChCvN,KAAKiB,IAAIkJ,UAAUkD,EAAUC,EAAaE,EAAaD,IAI3DrE,eAAgB,SAAU5B,GACxB,GAAIC,GAAO5B,EAAGK,EACVsE,EAAO,EACX,KAAK3E,EAAI,EAAGA,EAAI2B,EAAWvD,QACrB/D,KAAKK,KAAK0D,SAAW/D,KAAKqD,SADGsC,IAEjC4B,EAAQD,EAAW3B,GACf0B,EAAQrH,KAAKK,KAAMkH,KACvBvB,EAAQhG,KAAKK,KAAK0D,OAClB/D,KAAKK,KAAK+E,KAAKmC,GACf+C,GAAQ,6CAA+CtE,EAAQ,QAC/DsE,GAAU/C,EAAMhC,SAASkI,SAASlG,EAAMjC,MAAOiC,EAAMxC,MACrDuF,GAAQ,YAEV,OAAOA,IAGThB,cAAe,SAAUH,GACvB,GAAInJ,KAAK8I,OAAQ,CACV9I,KAAKwK,WACRxK,KAAKwK,SAAW1L,EAAE,yCAAyC4O,UAAU1N,KAAKiB,KAE5E,IAAIqJ,GAAOxL,EAAEgH,WAAW9F,KAAK8I,QAAU9I,KAAK8I,OAAOK,GAAgBnJ,KAAK8I,MACxE9I,MAAKwK,SAASF,KAAKA,KAIvBf,cAAe,SAAUJ,GACvB,GAAInJ,KAAK6I,OAAQ,CACV7I,KAAKyK,WACRzK,KAAKyK,SAAW3L,EAAE,yCAAyCoE,SAASlD,KAAKiB,KAE3E,IAAIqJ,GAAOxL,EAAEgH,WAAW9F,KAAK6I,QAAU7I,KAAK6I,OAAOM,GAAgBnJ,KAAK6I,MACxE7I,MAAKyK,SAASH,KAAKA,KAIvBR,wBAAyB,SAAUX,GACjC,GAAInJ,KAAK6J,iBAAkB,CACpB7J,KAAK0K,qBACR1K,KAAK0K,mBAAqB5L,EAAE,qDAAqDoE,SAASlD,KAAKiB,KAEjG,IAAIqJ,GAAOxL,EAAEgH,WAAW9F,KAAK6J,kBAAoB7J,KAAK6J,iBAAiBV,GAAgBnJ,KAAK6J,gBAC5F7J,MAAK0K,mBAAmBJ,KAAKA,KAIjCd,gBAAiB,SAAUc,GACrBtK,KAAKyK,SACPzK,KAAKyK,SAASkD,OAAOrD,GAErBtK,KAAKiB,IAAI2M,OAAOtD,IAIpBb,aAAc,WACZ,GAAIoE,GAAqBzG,EAAQ+C,YAAc/C,EAAQJ,SACnDA,EAAShH,KAAKiB,IAAI+F,QACjBhH,MAAKiB,IAAI2H,WAAWsB,IAAMlD,EAAU6G,IAElC7N,KAAKI,UAAUqD,SAClBzD,KAAKiB,IAAI6M,QAAQ5D,IAAK2D,EAAqB7G,MAKjD0C,YAAa,WASX,IAJA,GACyCoE,GADrCC,EAAY/N,KAAKP,OAAO8D,gBACxByK,EAAahO,KAAKiB,IAAI6M,SAASnF,KAC/BsF,EAAQjO,KAAKiB,IAAIgN,QACjBC,EAAU9G,EAAQ6G,QAAUF,EACzBC,EAAaC,EAAQC,IAC1BlO,KAAKiB,IAAI6M,QAAQnF,KAAMqF,EAAaD,IACpCD,EAAS9N,KAAKiB,IAAI6M,SAASnF,OACvBmF,GAAUE,KACdA,EAAaF,GAIjBzD,gBAAiB,SAAUzB,GAmBzB,MAjBsC,KAAlC5I,KAAK+I,UAAUoF,QAAQ,OAEzBvF,GACEsB,IAAK,OACLkE,OAAQpO,KAAKiB,IAAIoN,SAASrH,SAAW4B,EAASsB,IAAMtB,EAAS0F,WAC7D3F,KAAMC,EAASD,OAGjBC,EAASwF,OAAS,aACXxF,GAAS0F,YAEwB,KAAtCtO,KAAK+I,UAAUoF,QAAQ,WACzBvF,EAASD,KAAO,EACgC,KAAvC3I,KAAK+I,UAAUoF,QAAQ,cAChCvF,EAAS2F,MAAQ,EACjB3F,EAASD,KAAO,QAEXC,KAIX9J,EAAEQ,GAAGC,aAAa2E,SAAWA,EAC7BpF,EAAEuC,OAAOvC,EAAEQ,GAAGC,aAAcuI,IAC5B9I,IAED,SAAUF,GACT,YAiBA,SAASgC,GAAS0N,GAChB1P,EAAEuC,OAAOrB,KAAMwO,GACXxO,KAAKyO,QAASzO,KAAKkG,OAASwI,EAAQ1O,KAAKkG,SAhB/C,GAAIwI,GAAU,SAAUlM,GACtB,GAAImM,KACJ,OAAO,UAAU5J,EAAM6J,GACjBD,EAAK5J,GACP6J,EAASD,EAAK5J,IAEdvC,EAAK1C,KAAKE,KAAM+E,EAAM,SAAU1E,GAC9BsO,EAAK5J,IAAS4J,EAAK5J,QAAa8J,OAAOxO,GACvCuO,EAASnO,MAAM,KAAMV,cAW7Be,GAASC,MAAQ,SAAU+N,EAAiBC,GAC1C,MAAOjQ,GAAE6H,IAAImI,EAAiB,SAAUvJ,GACtC,GAAIyJ,GAAc,GAAIlO,GAASyE,EAG/B,OAFAyJ,GAAYhO,GAAK+N,EAAO/N,GACxBgO,EAAY/N,IAAM8N,EAAO9N,IAClB+N,KAIXlQ,EAAEuC,OAAOP,EAASlB,WAKhBmG,MAAY,KACZkJ,QAAY,KACZ/I,OAAY,KAGZ7G,GAAY,KACZoP,OAAY,EACZ7I,QAAY,WAAc,OAAO,GACjCI,MAAY,EACZyH,SAAY,SAAU9M,GAAO,MAAOA,IACpC8G,WAAY,OAGd3I,EAAEQ,GAAGC,aAAauB,SAAWA,GAE7B9B,IAED,SAAUF,GACT,YAiCA,SAASqF,MA/BT,GAAI+K,GAAMC,KAAKD,KAAO,WAAc,OAAO,GAAIC,OAAOC,WAOlDC,EAAW,SAAU7M,EAAM8M,GAC7B,GAAIC,GAAS7P,EAAMkG,EAAS4J,EAAWC,EACnCC,EAAQ,WACV,GAAIC,GAAOT,IAAQM,CACRF,GAAPK,EACFJ,EAAUnD,WAAWsD,EAAOJ,EAAOK,IAEnCJ,EAAU,KACVE,EAASjN,EAAK/B,MAAMmF,EAASlG,GAC7BkG,EAAUlG,EAAO,MAIrB,OAAO,YAOL,MANAkG,GAAU5F,KACVN,EAAOK,UACPyP,EAAYN,IACPK,IACHA,EAAUnD,WAAWsD,EAAOJ,IAEvBG,GAMX3Q,GAAEuC,OAAO8C,EAAQvE,WAIfP,GAAW,KACXe,UAAW,KACXY,GAAW,KACXC,IAAW,KACXxB,OAAW,KAKXmC,WAAY,SAAUV,EAASd,EAAWX,GACxCO,KAAKgB,GAAYE,EACjBlB,KAAKiB,IAAYnC,EAAEoC,GACnBlB,KAAKX,GAAYe,EAAUf,GAAKW,KAAK4P,YAAYhP,KACjDZ,KAAKI,UAAYA,EACjBJ,KAAKP,OAAYA,EAEbO,KAAKP,OAAO4P,WACdrP,KAAK6P,SAAWR,EAASrP,KAAK6P,SAAU7P,KAAKP,OAAO4P,WAGtDrP,KAAKkH,eAGP5C,QAAS,WACPtE,KAAKiB,IAAIsD,IAAI,IAAMvE,KAAKX,IACxBW,KAAKiB,IAAMjB,KAAKgB,GAAKhB,KAAKI,UAAY,MAQxCiF,OAAQ,WACN,KAAM,IAAIpG,OAAM,oBAIlBuH,iBAAkB,WAChB,GAAIoC,GAAW5I,KAAK8P,4BAChBhC,EAAS9N,KAAKiB,IAAI6M,SAGlBxF,EAAUtI,KAAKP,OAAOyD,QAC1B,IAAIoF,EAAS,CACJA,YAAmBxJ,KAAMwJ,EAAUxJ,EAAEwJ,GAC3C,IAAIyH,GAAezH,EAAQ0H,eAAelC,QAC1CA,GAAO5D,KAAO6F,EAAa7F,IAC3B4D,EAAOnF,MAAQoH,EAAapH,KAK/B,MAFAC,GAASsB,KAAO4D,EAAO5D,IACvBtB,EAASD,MAAQmF,EAAOnF,KACjBC,GAITnD,MAAO,WACLzF,KAAKiB,IAAIwE,SAMXyB,YAAa,WACXlH,KAAKiB,IAAIe,GAAG,SAAWhC,KAAKX,GAAIP,EAAE6M,MAAM3L,KAAK6P,SAAU7P,QAGzD6P,SAAU,SAAUrK,GACdxF,KAAKiQ,YAAYzK,IACrBxF,KAAKI,UAAUqE,QAAQzE,KAAK4E,0BAA0B,IAIxDqL,YAAa,SAAUC,GACrB,OAAQA,EAAWnF,SACjB,IAAK,GACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACH,OAAO,EAEX,GAAImF,EAAWlF,QAAS,OAAQkF,EAAWnF,SACzC,IAAK,IACL,IAAK,IACH,OAAO,MAKfjM,EAAEQ,GAAGC,aAAa4E,QAAUA,GAC5BnF,IAED,SAAUF,GACT,YAMA,SAASqR,GAASjP,EAASd,EAAWX,GACpCO,KAAK4B,WAAWV,EAASd,EAAWX,GAGtCX,EAAEuC,OAAO8O,EAASvQ,UAAWd,EAAEQ,GAAGC,aAAa4E,QAAQvE,WAKrDyF,OAAQ,SAAUC,EAAOC,EAAUC,GACjC,GAGI4K,GAHAC,EAAMrQ,KAAK4E,yBACX0L,EAAOtQ,KAAKgB,GAAGsE,MAAMiL,UAAUvQ,KAAKgB,GAAGqD,cACvCmM,EAAYjL,EAAS0J,QAAQ3J,EAAOE,EAEf,oBAAdgL,KACL1R,EAAE2R,QAAQD,KACZF,EAAOE,EAAU,GAAKF,EACtBE,EAAYA,EAAU,IAExBJ,EAAStR,EAAEgH,WAAWP,EAASQ,OAASR,EAASQ,MAAMsK,GAAO9K,EAASQ,MACvEsK,EAAMA,EAAIpB,QAAQmB,EAAQI,GAC1BxQ,KAAKiB,IAAIyP,IAAIL,EAAMC,GACnBtQ,KAAKgB,GAAG2P,eAAiB3Q,KAAKgB,GAAGqD,aAAegM,EAAItM,SAIxDa,uBAAwB,WACtB,MAAO5E,MAAKgB,GAAGsE,MAAMiL,UAAU,EAAGvQ,KAAKgB,GAAGqD,eAM5CyL,0BAA2B,WACzB,GAAIc,GAAI9R,EAAEQ,GAAGC,aAAasR,oBAAoB7Q,KAAKgB,GAAIhB,KAAKgB,GAAG2P,eAC/D,QACEzG,IAAK0G,EAAE1G,IAAMlK,KAAK8Q,uBAAyB9Q,KAAKiB,IAAIkJ,YACpDxB,KAAMiI,EAAEjI,KAAO3I,KAAKiB,IAAImJ,aACxBkE,WAAYtO,KAAK8Q,yBAIrBA,qBAAsB,WACpB,GAAIxC,GAAanC,SAASnM,KAAKiB,IAAIwH,IAAI,eAAgB,GACvD,IAAIsI,MAAMzC,GAAa,CAErB,GAAI0C,GAAahR,KAAKgB,GAAGgQ,WACrBC,EAAOrN,SAASgD,cAAc5G,KAAKgB,GAAGkQ,UACtCC,EAAQnR,KAAKgB,GAAGmQ,KACpBF,GAAKG,aACH,QACA,sCAAwCD,EAAME,WAAa,cAAgBF,EAAMG,UAEnFL,EAAKM,UAAY,OACjBP,EAAWQ,YAAYP,GACvB3C,EAAa2C,EAAKQ,aAClBT,EAAWU,YAAYT,GAEzB,MAAO3C,MAIXxP,EAAEQ,GAAGC,aAAa4Q,SAAWA,GAC7BnR,IAED,SAAUF,GACT,YAIA,SAAS6S,GAAWzQ,EAASd,EAAWX,GACtCO,KAAK4B,WAAWV,EAASd,EAAWX,GACpCX,EAAE,SAAW8S,EAAe,WAAWnJ,KACrCG,SAAU,WACVsB,IAAK,MACLvB,KAAM,QACLkJ,aAAa3Q,GARlB,GAAI0Q,GAAe,GAWnB9S,GAAEuC,OAAOsQ,EAAW/R,UAAWd,EAAEQ,GAAGC,aAAa4Q,SAASvQ,WAIxDyF,OAAQ,SAAUC,EAAOC,EAAUC,GACjC,GAGI4K,GAHAC,EAAMrQ,KAAK4E,yBACX0L,EAAOtQ,KAAKgB,GAAGsE,MAAMiL,UAAUF,EAAItM,QACnCyM,EAAYjL,EAAS0J,QAAQ3J,EAAOE,EAExC,IAAyB,mBAAdgL,GAA2B,CAChC1R,EAAE2R,QAAQD,KACZF,EAAOE,EAAU,GAAKF,EACtBE,EAAYA,EAAU,IAExBJ,EAAStR,EAAEgH,WAAWP,EAASQ,OAASR,EAASQ,MAAMsK,GAAO9K,EAASQ,MACvEsK,EAAMA,EAAIpB,QAAQmB,EAAQI,GAC1BxQ,KAAKiB,IAAIyP,IAAIL,EAAMC,GACnBtQ,KAAKgB,GAAGyE,OACR,IAAIqM,GAAQ9R,KAAKgB,GAAG+Q,iBACpBD,GAAME,UAAS,GACfF,EAAMG,QAAQ,YAAa5B,EAAItM,QAC/B+N,EAAMI,UAAU,YAAa7B,EAAItM,QACjC+N,EAAMzM,WAIVT,uBAAwB,WACtB5E,KAAKgB,GAAGyE,OACR,IAAIqM,GAAQlO,SAASuO,UAAUC,aAC/BN,GAAMI,UAAU,aAAclS,KAAKgB,GAAGsE,MAAMvB,OAC5C,IAAIsO,GAAMP,EAAMpN,KAAK4N,MAAMV,EAC3B,OAAsB,KAAfS,EAAItO,OAAesO,EAAI,GAAKA,EAAI,MAI3CvT,EAAEQ,GAAGC,aAAaoS,WAAaA,GAC/B3S,IAMD,SAAUF,GACT,YAMA,SAASyT,GAAiBrR,EAASd,EAAWX,GAC5CO,KAAK4B,WAAWV,EAASd,EAAWX,GAGtCX,EAAEuC,OAAOkR,EAAgB3S,UAAWd,EAAEQ,GAAGC,aAAa4E,QAAQvE,WAM5DyF,OAAQ,SAAUC,EAAOC,EAAUC,GACjC,GAAI6K,GAAMrQ,KAAK4E,yBAEX4N,EAAMxS,KAAKgB,GAAGU,cAAc+Q,eAE5BX,EAAQU,EAAIE,WAAW,GACvBP,EAAYL,EAAMa,YACtBR,GAAUS,mBAAmBd,EAAMe,eACnC,IAGIzC,GAHA0C,EAAUX,EAAUlP,WACpBqN,EAAOwC,EAAQvC,UAAUuB,EAAMiB,aAC/BvC,EAAYjL,EAAS0J,QAAQ3J,EAAOE,EAExC,IAAyB,mBAAdgL,GAA2B,CAChC1R,EAAE2R,QAAQD,KACZF,EAAOE,EAAU,GAAKF,EACtBE,EAAYA,EAAU,IAExBJ,EAAStR,EAAEgH,WAAWP,EAASQ,OAASR,EAASQ,MAAMsK,GAAO9K,EAASQ,MACvEsK,EAAMA,EAAIpB,QAAQmB,EAAQI,GACrBvB,QAAQ,KAAM,SACnB6C,EAAMc,mBAAmBd,EAAMe,gBAC/Bf,EAAMkB,gBAGN,IAAIC,GAAajT,KAAKgB,GAAGU,cAAckF,cAAc,MACrDqM,GAAW1B,UAAYlB,CACvB,IAAI6C,GAAclT,KAAKgB,GAAGU,cAAckF,cAAc,MACtDsM,GAAY3B,UAAYjB,CAMxB,KAHA,GACI6C,GACAC,EAFAC,EAAWrT,KAAKgB,GAAGU,cAAc4R,yBAG9BH,EAAYF,EAAWM,YAC7BH,EAAYC,EAAS7B,YAAY2B,EAElC,MAAOA,EAAYD,EAAYK,YAC9BF,EAAS7B,YAAY2B,EAItBrB,GAAM0B,WAAWH,GACjBvB,EAAM2B,cAAcL,GAEpBtB,EAAME,UAAS,GACfQ,EAAIkB,kBACJlB,EAAImB,SAAS7B,KAgBjBhC,0BAA2B,WACzB,GAAIgC,GAAQ9R,KAAKgB,GAAGU,cAAc+Q,eAAeC,WAAW,GAAGC,aAC3DiB,EAAO5T,KAAKgB,GAAGU,cAAckF,cAAc,OAC/CkL,GAAM0B,WAAWI,GACjB9B,EAAMc,mBAAmBgB,GACzB9B,EAAMkB,gBACN,IAAIa,GAAQ/U,EAAE8U,GACVhL,EAAWiL,EAAM/F,QAOrB,IANAlF,EAASD,MAAQ3I,KAAKiB,IAAI6M,SAASnF,KACnCC,EAASsB,KAAO2J,EAAM7M,SAAWhH,KAAKiB,IAAI6M,SAAS5D,IACnDtB,EAAS0F,WAAauF,EAAM7M,SAIxBhH,KAAKI,UAAUqD,QAAS,CAC1B,GAAIqQ,GAAiB9T,KAAKI,UAAUqD,QAAQqK,QAC5ClF,GAASsB,KAAO4J,EAAe5J,IAC/BtB,EAASD,MAAQmL,EAAenL,KAEhCC,EAASsB,KAAOlK,KAAKiB,IAAIkJ,YAI3B,MADA0J,GAAM7K,SACCJ,GAWThE,uBAAwB,WACtB,GAAIkN,GAAQ9R,KAAKgB,GAAGU,cAAc+Q,eAAeC,WAAW,GACxDP,EAAYL,EAAMa,YAEtB,OADAR,GAAUS,mBAAmBd,EAAMe,gBAC5BV,EAAUlP,WAAWsN,UAAU,EAAGuB,EAAMiB,gBAInDjU,EAAEQ,GAAGC,aAAagT,gBAAkBA,GACpCvT,IAMD,SAAUF,GACT,YAMA,SAASiV,GAAU7S,EAASd,EAAWX,GACrCO,KAAK4B,WAAWV,EAASd,EAAWX,GAGtCX,EAAEuC,OAAO0S,EAASnU,UAAWd,EAAEQ,GAAGC,aAAagT,gBAAgB3S,WAC7DsH,YAAa,WACX,GAAI/G,GAAQH,IACZA,MAAKP,OAAO6C,kBAAkBN,GAAG,MAAO,SAASC,GAC/C,GAAI+R,GAAW/R,EAAM5B,IAErB,OADAF,GAAM0P,SAASmE,GACX7T,EAAMC,UAAUoD,SAAS4C,OAASjG,EAAM8P,YAAY+D,IAC/C,EADT,QAGC,KAAM,KAAM,GAEfhU,KAAKiB,IAAIe,GAAG,SAAWhC,KAAKX,GAAIP,EAAE6M,MAAM3L,KAAK6P,SAAU7P,UAI3DlB,EAAEQ,GAAGC,aAAawU,SAAWA,GAC7B/U,GAuBD,SAAUF,GAmDX,QAAS+R,GAAoB3P,EAAS0H,EAAU4F,GAC9C,IAAIyF,EACF,KAAM,IAAIhV,OAAM,iFAGlB,IAAIiV,GAAQ1F,GAAWA,EAAQ0F,QAAS,CACxC,IAAIA,EAAO,CACT,GAAIlT,GAAK4C,SAASuQ,cAAc,4CAC3BnT,IAAOA,EAAGgQ,WAAWU,YAAY1Q,GAIxC,GAAIoT,GAAMxQ,SAASgD,cAAc,MACjCwN,GAAI/U,GAAK,2CACTuE,SAASyQ,KAAK7C,YAAY4C,EAE1B,IAAIjD,GAAQiD,EAAIjD,MACZmD,EAAWzQ,OAAO0Q,iBAAkBA,iBAAiBrT,GAAWA,EAAQsT,YAG5ErD,GAAMsD,WAAa,WACM,UAArBvT,EAAQgQ,WACVC,EAAMuD,SAAW,cAGnBvD,EAAMvI,SAAW,WACZsL,IACH/C,EAAMwD,WAAa,UAGrBC,EAAWC,QAAQ,SAAUlR,GAC3BwN,EAAMxN,GAAQ2Q,EAAS3Q,KAGrBmR,EAEE5T,EAAQ6T,aAAe5I,SAASmI,EAAStN,UAC3CmK,EAAM6D,UAAY,UAEpB7D,EAAM8D,SAAW,SAGnBb,EAAIc,YAAchU,EAAQoE,MAAMiL,UAAU,EAAG3H,GAEpB,UAArB1H,EAAQgQ,WACVkD,EAAIc,YAAcd,EAAIc,YAAYjG,QAAQ,MAAO,KAEnD,IAAIkG,GAAOvR,SAASgD,cAAc,OAMlCuO,GAAKD,YAAchU,EAAQoE,MAAMiL,UAAU3H,IAAa,IACxDwL,EAAI5C,YAAY2D,EAEhB,IAAIC,IACFlL,IAAKiL,EAAKE,UAAYlJ,SAASmI,EAAyB,gBACxD3L,KAAMwM,EAAKG,WAAanJ,SAASmI,EAA0B,iBAS7D,OANIJ,GACFiB,EAAKhE,MAAMoE,gBAAkB,OAE7B3R,SAASyQ,KAAK3C,YAAY0C,GAGrBgB,EAhHT,GAAIR,IACF,YACA,YACA,QACA,SACA,YACA,YAEA,iBACA,mBACA,oBACA,kBACA,cAEA,aACA,eACA,gBACA,cAGA,YACA,cACA,aACA,cACA,WACA,iBACA,aACA,aAEA,YACA,gBACA,aACA,iBAEA,gBACA,cAEA,UACA,cAIEX,EAA+B,mBAAXpQ,QACpBiR,EAAab,GAAuC,MAA1BpQ,OAAO2R,eAwErC1W,GAAEQ,GAAGC,aAAasR,oBAAsBA,GAEtC7R,GAEKA"}
\ No newline at end of file diff --git a/library/jquery.timeago.js b/library/jquery.timeago.js index ef9327aac..f7b640149 100644 --- a/library/jquery.timeago.js +++ b/library/jquery.timeago.js @@ -3,7 +3,7 @@ * updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago"). * * @name timeago - * @version 1.4.1 + * @version 1.6.3 * @requires jQuery v1.2.3+ * @author Ryan McGeary * @license MIT License - http://www.opensource.org/licenses/mit-license.php @@ -11,13 +11,15 @@ * For usage and examples, visit: * http://timeago.yarp.com/ * - * Copyright (c) 2008-2013, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org) + * Copyright (c) 2008-2017, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org) */ (function (factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); + } else if (typeof module === 'object' && typeof module.exports === 'object') { + factory(require('jquery')); } else { // Browser globals factory(jQuery); @@ -43,6 +45,7 @@ allowFuture: false, localeTitle: false, cutoff: 0, + autoDispose: true, strings: { prefixAgo: null, prefixFromNow: null, @@ -66,7 +69,7 @@ }, inWords: function(distanceMillis) { - if(!this.settings.allowPast && ! this.settings.allowFuture) { + if (!this.settings.allowPast && ! this.settings.allowFuture) { throw 'timeago allowPast and allowFuture settings can not both be set to false.'; } @@ -80,7 +83,7 @@ } } - if(!this.settings.allowPast && distanceMillis >= 0) { + if (!this.settings.allowPast && distanceMillis >= 0) { return this.settings.strings.inPast; } @@ -136,7 +139,8 @@ // init is default when no action is given // functions are called with context of a single element var functions = { - init: function(){ + init: function() { + functions.dispose.call(this); var refresh_el = $.proxy(refresh, this); refresh_el(); var $s = $t.settings; @@ -144,13 +148,15 @@ this._timeagoInterval = setInterval(refresh_el, $s.refreshMillis); } }, - update: function(time){ - var parsedTime = $t.parse(time); - $(this).data('timeago', { datetime: parsedTime }); - if($t.settings.localeTitle) $(this).attr("title", parsedTime.toLocaleString()); + update: function(timestamp) { + var date = (timestamp instanceof Date) ? timestamp : $t.parse(timestamp); + $(this).data('timeago', { datetime: date }); + if ($t.settings.localeTitle) { + $(this).attr("title", date.toLocaleString()); + } refresh.apply(this); }, - updateFromDOM: function(){ + updateFromDOM: function() { $(this).data('timeago', { datetime: $t.parse( $t.isTime(this) ? $(this).attr("datetime") : $(this).attr("title") ) }); refresh.apply(this); }, @@ -164,30 +170,35 @@ $.fn.timeago = function(action, options) { var fn = action ? functions[action] : functions.init; - if(!fn){ + if (!fn) { throw new Error("Unknown function name '"+ action +"' for timeago"); } // each over objects here and call the requested function - this.each(function(){ + this.each(function() { fn.call(this, options); }); return this; }; function refresh() { + var $s = $t.settings; + //check if it's still visible - if(!$.contains(document.documentElement,this)){ + if ($s.autoDispose && !$.contains(document.documentElement,this)) { //stop if it has been removed $(this).timeago("dispose"); return this; } var data = prepareData(this); - var $s = $t.settings; if (!isNaN(data.datetime)) { - if ( $s.cutoff == 0 || Math.abs(distance(data.datetime)) < $s.cutoff) { + if ( $s.cutoff === 0 || Math.abs(distance(data.datetime)) < $s.cutoff) { $(this).text(inWords(data.datetime)); + } else { + if ($(this).attr('title').length > 0) { + $(this).text($(this).attr('title')); + } } } return this; diff --git a/library/justifiedGallery/jquery.justifiedGallery.js b/library/justifiedGallery/jquery.justifiedGallery.js index 85a4168bd..e1495d870 100644 --- a/library/justifiedGallery/jquery.justifiedGallery.js +++ b/library/justifiedGallery/jquery.justifiedGallery.js @@ -1,26 +1,49 @@ /*! - * Justified Gallery - v3.6.5 + * justifiedGallery - v3.7.0 * http://miromannino.github.io/Justified-Gallery/ * Copyright (c) 2018 Miro Mannino * Licensed under the MIT license. */ -(function($) { - - function hasScrollBar() { - return $("body").height() > $(window).height(); +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof module === 'object' && module.exports) { + // Node/CommonJS + module.exports = function( root, jQuery ) { + if ( jQuery === undefined ) { + // require('jQuery') returns a factory that requires window to + // build a jQuery instance, we normalize how we use modules + // that require this pattern but the window provided is a noop + // if it's defined (how jquery works) + if ( typeof window !== 'undefined' ) { + jQuery = require('jquery'); + } + else { + jQuery = require('jquery')(root); + } + } + factory(jQuery); + return jQuery; + }; + } else { + // Browser globals + factory(jQuery); } +}(function ($) { + /** * Justified Gallery controller constructor * * @param $gallery the gallery to build - * @param settings the settings (the defaults are in $.fn.justifiedGallery.defaults) + * @param settings the settings (the defaults are in JustifiedGallery.defaults) * @constructor */ var JustifiedGallery = function ($gallery, settings) { - + this.settings = settings; this.checkSettings(); - + this.imgAnalyzerTimeout = null; this.entries = null; this.buildingRow = { @@ -46,12 +69,13 @@ $el : $('<div class="spinner"><span></span><span></span><span></span></div>'), intervalId : null }; + this.scrollBarOn = false; this.checkWidthIntervalId = null; this.galleryWidth = $gallery.width(); this.$gallery = $gallery; - + }; - + /** @returns {String} the best suffix given the width and the height */ JustifiedGallery.prototype.getSuffix = function (width, height) { var longestSide, i; @@ -63,7 +87,7 @@ } return this.settings.sizeRangeSuffixes[this.suffixRanges[i - 1]]; }; - + /** * Remove the suffix from the string * @@ -72,14 +96,14 @@ JustifiedGallery.prototype.removeSuffix = function (str, suffix) { return str.substring(0, str.length - suffix.length); }; - + /** * @returns {boolean} a boolean to say if the suffix is contained in the str or not */ JustifiedGallery.prototype.endsWith = function (str, suffix) { return str.indexOf(suffix, str.length - suffix.length) !== -1; }; - + /** * Get the used suffix of a particular url * @@ -95,7 +119,7 @@ } return ''; }; - + /** * Given an image src, with the width and the height, returns the new image src with the * best suffix to show the best quality thumbnail. @@ -104,7 +128,7 @@ */ JustifiedGallery.prototype.newSrc = function (imageSrc, imgWidth, imgHeight, image) { var newImageSrc; - + if (this.settings.thumbnailPath) { newImageSrc = this.settings.thumbnailPath(imageSrc, imgWidth, imgHeight, image); } else { @@ -114,10 +138,10 @@ newImageSrc = this.removeSuffix(newImageSrc, this.getUsedSuffix(newImageSrc)); newImageSrc += this.getSuffix(imgWidth, imgHeight) + ext; } - + return newImageSrc; }; - + /** * Shows the images that is in the given entry * @@ -133,7 +157,7 @@ $entry.find(this.settings.imgSelector).stop().fadeTo(this.settings.imagesAnimationDuration, 1.0, callback); } }; - + /** * Extract the image src form the image, looking from the 'safe-src', and if it can't be found, from the * 'src' attribute. It saves in the image data the 'jg.originalSrc' field, with the extracted src. @@ -146,19 +170,19 @@ $image.data('jg.originalSrc', imageSrc); return imageSrc; }; - + /** @returns {jQuery} the image in the given entry */ JustifiedGallery.prototype.imgFromEntry = function ($entry) { var $img = $entry.find(this.settings.imgSelector); return $img.length === 0 ? null : $img; }; - + /** @returns {jQuery} the caption in the given entry */ JustifiedGallery.prototype.captionFromEntry = function ($entry) { var $caption = $entry.find('> .caption'); return $caption.length === 0 ? null : $caption; }; - + /** * Display the entry * @@ -174,28 +198,28 @@ $entry.height(rowHeight); $entry.css('top', y); $entry.css('left', x); - + var $image = this.imgFromEntry($entry); if ($image !== null) { $image.css('width', imgWidth); $image.css('height', imgHeight); $image.css('margin-left', - imgWidth / 2); $image.css('margin-top', - imgHeight / 2); - + // Image reloading for an high quality of thumbnails var imageSrc = $image.attr('src'); var newImageSrc = this.newSrc(imageSrc, imgWidth, imgHeight, $image[0]); - + $image.one('error', function () { $image.attr('src', $image.data('jg.originalSrc')); //revert to the original thumbnail, we got it. }); - + var loadNewImage = function () { if (imageSrc !== newImageSrc) { //load the new image after the fadeIn $image.attr('src', newImageSrc); } }; - + if ($entry.data('jg.loaded') === 'skipped') { this.onImageEvent(imageSrc, $.proxy(function() { this.showImg($entry, loadNewImage); @@ -204,14 +228,14 @@ } else { this.showImg($entry, loadNewImage); } - + } else { this.showImg($entry); } - + this.displayEntryCaption($entry); }; - + /** * Display the entry caption. If the caption element doesn't exists, it creates the caption using the 'alt' * or the 'title' attributes. @@ -222,7 +246,7 @@ var $image = this.imgFromEntry($entry); if ($image !== null && this.settings.captions) { var $imgCaption = this.captionFromEntry($entry); - + // Create it if it doesn't exists if ($imgCaption === null) { var caption = $image.attr('alt'); @@ -233,7 +257,7 @@ $entry.data('jg.createdCaption', true); } } - + // Create events (we check again the $imgCaption because it can be still inexistent) if ($imgCaption !== null) { if (!this.settings.cssAnimation) $imgCaption.stop().fadeTo(0, this.settings.captionSettings.nonVisibleOpacity); @@ -243,7 +267,7 @@ this.removeCaptionEventsHandlers($entry); } }; - + /** * Validates the caption * @@ -253,7 +277,7 @@ JustifiedGallery.prototype.isValidCaption = function (caption) { return (typeof caption !== 'undefined' && caption.length > 0); }; - + /** * The callback for the event 'mouseenter'. It assumes that the event currentTarget is an entry. * It shows the caption using jQuery (or using CSS if it is configured so) @@ -269,7 +293,7 @@ this.settings.captionSettings.visibleOpacity); } }; - + /** * The callback for the event 'mouseleave'. It assumes that the event currentTarget is an entry. * It hides the caption using jQuery (or using CSS if it is configured so) @@ -285,7 +309,7 @@ this.settings.captionSettings.nonVisibleOpacity); } }; - + /** * Add the handlers of the entry for the caption * @@ -303,7 +327,7 @@ $entry.data('jg.captionMouseEvents', captionMouseEvents); } }; - + /** * Remove the handlers of the entry for the caption * @@ -317,7 +341,7 @@ $entry.removeData('jg.captionMouseEvents'); } }; - + /** * Clear the building row data to be used for a new row */ @@ -326,7 +350,7 @@ this.buildingRow.aspectRatio = 0; this.buildingRow.width = 0; }; - + /** * Justify the building row, preparing it to * @@ -341,7 +365,7 @@ var rowHeight = availableWidth / this.buildingRow.aspectRatio; var defaultRowHeight = this.settings.rowHeight; var justifiable = this.buildingRow.width / availableWidth > this.settings.justifyThreshold; - + //Skip the last row if we can't justify it and the lastRow == 'hide' if (isLastRow && this.settings.lastRow === 'hide' && !justifiable) { for (i = 0; i < this.buildingRow.entriesBuff.length; i++) { @@ -355,21 +379,21 @@ } return -1; } - + // With lastRow = nojustify, justify if is justificable (the images will not become too big) if (isLastRow && !justifiable && this.settings.lastRow !== 'justify' && this.settings.lastRow !== 'hide') { justify = false; - + if (this.rows > 0) { defaultRowHeight = (this.offY - this.border - this.settings.margins * this.rows) / this.rows; justify = defaultRowHeight * this.buildingRow.aspectRatio / availableWidth > this.settings.justifyThreshold; } } - + for (i = 0; i < this.buildingRow.entriesBuff.length; i++) { $entry = this.buildingRow.entriesBuff[i]; imgAspectRatio = $entry.data('jg.width') / $entry.data('jg.height'); - + if (justify) { newImgW = (i === this.buildingRow.entriesBuff.length - 1) ? availableWidth : rowHeight * imgAspectRatio; newImgH = rowHeight; @@ -377,17 +401,17 @@ newImgW = defaultRowHeight * imgAspectRatio; newImgH = defaultRowHeight; } - + availableWidth -= Math.round(newImgW); $entry.data('jg.jwidth', Math.round(newImgW)); $entry.data('jg.jheight', Math.ceil(newImgH)); if (i === 0 || minHeight > newImgH) minHeight = newImgH; } - + this.buildingRow.height = minHeight; return justify; }; - + /** * Flush a row: justify it, modify the gallery height accordingly to the row height * @@ -396,115 +420,120 @@ JustifiedGallery.prototype.flushRow = function (isLastRow) { var settings = this.settings; var $entry, buildingRowRes, offX = this.border, i; - + buildingRowRes = this.prepareBuildingRow(isLastRow); if (isLastRow && settings.lastRow === 'hide' && buildingRowRes === -1) { this.clearBuildingRow(); return; } - + if(this.maxRowHeight) { if(this.maxRowHeight < this.buildingRow.height) this.buildingRow.height = this.maxRowHeight; } - + //Align last (unjustified) row if (isLastRow && (settings.lastRow === 'center' || settings.lastRow === 'right')) { var availableWidth = this.galleryWidth - 2 * this.border - (this.buildingRow.entriesBuff.length - 1) * settings.margins; - + for (i = 0; i < this.buildingRow.entriesBuff.length; i++) { $entry = this.buildingRow.entriesBuff[i]; availableWidth -= $entry.data('jg.jwidth'); } - + if (settings.lastRow === 'center') offX += availableWidth / 2; else if (settings.lastRow === 'right') offX += availableWidth; } - + var lastEntryIdx = this.buildingRow.entriesBuff.length - 1; for (i = 0; i <= lastEntryIdx; i++) { $entry = this.buildingRow.entriesBuff[ this.settings.rtl ? lastEntryIdx - i : i ]; this.displayEntry($entry, offX, this.offY, $entry.data('jg.jwidth'), $entry.data('jg.jheight'), this.buildingRow.height); offX += $entry.data('jg.jwidth') + settings.margins; } - + //Gallery Height this.galleryHeightToSet = this.offY + this.buildingRow.height + this.border; this.setGalleryTempHeight(this.galleryHeightToSet + this.getSpinnerHeight()); - + if (!isLastRow || (this.buildingRow.height <= settings.rowHeight && buildingRowRes)) { //Ready for a new row this.offY += this.buildingRow.height + settings.margins; this.rows += 1; this.clearBuildingRow(); - this.$gallery.trigger('jg.rowflush'); + this.settings.triggerEvent.call(this, 'jg.rowflush'); } }; - - - // Scroll position not restoring: https://github.com/miromannino/Justified-Gallery/issues/221 + + + // Scroll position not restoring: https://github.com/miromannino/Justified-Gallery/issues/221 var galleryPrevStaticHeight = 0; - + JustifiedGallery.prototype.rememberGalleryHeight = function () { galleryPrevStaticHeight = this.$gallery.height(); this.$gallery.height(galleryPrevStaticHeight); }; - + // grow only JustifiedGallery.prototype.setGalleryTempHeight = function (height) { galleryPrevStaticHeight = Math.max(height, galleryPrevStaticHeight); this.$gallery.height(galleryPrevStaticHeight); }; - + JustifiedGallery.prototype.setGalleryFinalHeight = function (height) { galleryPrevStaticHeight = height; this.$gallery.height(height); }; - - + + /** + * @returns {boolean} a boolean saying if the scrollbar is active or not + */ + function hasScrollBar() { + return $("body").height() > $(window).height(); + } + /** * Checks the width of the gallery container, to know if a new justification is needed */ - var scrollBarOn = false; JustifiedGallery.prototype.checkWidth = function () { this.checkWidthIntervalId = setInterval($.proxy(function () { - + // if the gallery is not currently visible, abort. if (!this.$gallery.is(":visible")) return; - + var galleryWidth = parseFloat(this.$gallery.width()); - if (hasScrollBar() === scrollBarOn) { + if (hasScrollBar() === this.scrollBarOn) { if (Math.abs(galleryWidth - this.galleryWidth) > this.settings.refreshSensitivity) { this.galleryWidth = galleryWidth; this.rewind(); - + this.rememberGalleryHeight(); - + // Restart to analyze this.startImgAnalyzer(true); } } else { - scrollBarOn = hasScrollBar(); + this.scrollBarOn = hasScrollBar(); this.galleryWidth = galleryWidth; } }, this), this.settings.refreshTime); }; - + /** * @returns {boolean} a boolean saying if the spinner is active or not */ JustifiedGallery.prototype.isSpinnerActive = function () { return this.spinner.intervalId !== null; }; - + /** * @returns {int} the spinner height */ JustifiedGallery.prototype.getSpinnerHeight = function () { return this.spinner.$el.innerHeight(); }; - + /** * Stops the spinner animation and modify the gallery height to exclude the spinner */ @@ -514,7 +543,7 @@ this.setGalleryTempHeight(this.$gallery.height() - this.getSpinnerHeight()); this.spinner.$el.detach(); }; - + /** * Starts the spinner animation */ @@ -533,7 +562,7 @@ spinnerContext.phase = (spinnerContext.phase + 1) % ($spinnerPoints.length * 2); }, spinnerContext.timeSlot); }; - + /** * Rewind the image analysis to start from the first entry. */ @@ -544,7 +573,7 @@ this.rows = 0; this.clearBuildingRow(); }; - + /** * Update the entries searching it from the justified gallery HTML element * @@ -553,16 +582,16 @@ */ JustifiedGallery.prototype.updateEntries = function (norewind) { var newEntries; - + if (norewind && this.lastFetchedEntry != null) { newEntries = $(this.lastFetchedEntry).nextAll(this.settings.selector).toArray(); } else { this.entries = []; newEntries = this.$gallery.children(this.settings.selector).toArray(); } - + if (newEntries.length > 0) { - + // Sort or randomize if ($.isFunction(this.settings.sort)) { newEntries = this.sortArray(newEntries); @@ -570,20 +599,20 @@ newEntries = this.shuffleArray(newEntries); } this.lastFetchedEntry = newEntries[newEntries.length - 1]; - + // Filter if (this.settings.filter) { newEntries = this.filterArray(newEntries); } else { this.resetFilters(newEntries); } - + } - + this.entries = this.entries.concat(newEntries); return true; }; - + /** * Apply the entries order to the DOM, iterating the entries and appending the images * @@ -595,7 +624,7 @@ $(this).appendTo(that.$gallery); }); }; - + /** * Shuffle the array using the Fisher-Yates shuffle algorithm * @@ -613,7 +642,7 @@ this.insertToGallery(a); return a; }; - + /** * Sort the array using settings.comparator as comparator * @@ -625,7 +654,7 @@ this.insertToGallery(a); return a; }; - + /** * Reset the filters removing the 'jg-filtered' class from all the entries * @@ -634,7 +663,7 @@ JustifiedGallery.prototype.resetFilters = function (a) { for (var i = 0; i < a.length; i++) $(a[i]).removeClass('jg-filtered'); }; - + /** * Filter the entries considering theirs classes (if a string has been passed) or using a function for filtering. * @@ -668,7 +697,7 @@ return filteredArr; } }; - + /** * Destroy the Justified Gallery instance. * @@ -680,10 +709,10 @@ */ JustifiedGallery.prototype.destroy = function () { clearInterval(this.checkWidthIntervalId); - + $.each(this.entries, $.proxy(function(_, entry) { var $entry = $(entry); - + // Reset entry style $entry.css('width', ''); $entry.css('height', ''); @@ -691,7 +720,7 @@ $entry.css('left', ''); $entry.data('jg.loaded', undefined); $entry.removeClass('jg-entry'); - + // Reset image style var $img = this.imgFromEntry($entry); $img.css('width', ''); @@ -700,7 +729,7 @@ $img.css('margin-top', ''); $img.attr('src', $img.data('jg.originalSrc')); $img.data('jg.originalSrc', undefined); - + // Remove caption this.removeCaptionEventsHandlers($entry); var $caption = this.captionFromEntry($entry); @@ -711,14 +740,14 @@ } else { if ($caption !== null) $caption.fadeTo(0, 1); } - + }, this)); - + this.$gallery.css('height', ''); this.$gallery.removeClass('justified-gallery'); this.$gallery.data('jg.controller', undefined); }; - + /** * Analyze the images and builds the rows. It returns if it found an image that is not loaded. * @@ -733,41 +762,41 @@ var imgAspectRatio = $entry.data('jg.width') / $entry.data('jg.height'); if (availableWidth / (this.buildingRow.aspectRatio + imgAspectRatio) < this.settings.rowHeight) { this.flushRow(false); - + if(++this.yield.flushed >= this.yield.every) { this.startImgAnalyzer(isForResize); return; } } - + this.buildingRow.entriesBuff.push($entry); this.buildingRow.aspectRatio += imgAspectRatio; this.buildingRow.width += imgAspectRatio * this.settings.rowHeight; this.lastAnalyzedIndex = i; - + } else if ($entry.data('jg.loaded') !== 'error') { return; } } - + // Last row flush (the row is not full) if (this.buildingRow.entriesBuff.length > 0) this.flushRow(true); - + if (this.isSpinnerActive()) { this.stopLoadingSpinnerAnimation(); } - + /* Stop, if there is, the timeout to start the analyzeImages. This is because an image can be set loaded, and the timeout can be set, but this image can be analyzed yet. */ this.stopImgAnalyzerStarter(); - + //On complete callback - this.$gallery.trigger(isForResize ? 'jg.resize' : 'jg.complete'); + this.settings.triggerEvent.call(this, isForResize ? 'jg.resize' : 'jg.complete'); this.setGalleryFinalHeight(this.galleryHeightToSet); }; - + /** * Stops any ImgAnalyzer starter (that has an assigned timeout) */ @@ -778,7 +807,7 @@ this.imgAnalyzerTimeout = null; } }; - + /** * Starts the image analyzer. It is not immediately called to let the browser to update the view * @@ -791,7 +820,7 @@ that.analyzeImages(isForResize); }, 0.001); // we can't start it immediately due to a IE different behaviour }; - + /** * Checks if the image is loaded or not using another image object. We cannot use the 'complete' image property, * because some browsers, with a 404 set complete = true. @@ -802,7 +831,7 @@ */ JustifiedGallery.prototype.onImageEvent = function (imageSrc, onLoad, onError) { if (!onLoad && !onError) return; - + var memImage = new Image(); var $memImage = $(memImage); if (onLoad) { @@ -819,7 +848,7 @@ } memImage.src = imageSrc; }; - + /** * Init of Justified Gallery controlled * It analyzes all the entries starting theirs loading and calling the image analyzer (that works with loaded images) @@ -829,23 +858,23 @@ $.each(this.entries, function (index, entry) { var $entry = $(entry); var $image = that.imgFromEntry($entry); - + $entry.addClass('jg-entry'); - + if ($entry.data('jg.loaded') !== true && $entry.data('jg.loaded') !== 'skipped') { - + // Link Rel global overwrite if (that.settings.rel !== null) $entry.attr('rel', that.settings.rel); - + // Link Target global overwrite if (that.settings.target !== null) $entry.attr('target', that.settings.target); - + if ($image !== null) { - + // Image src var imageSrc = that.extractImgSrcFromImage($image); $image.attr('src', imageSrc); - + /* If we have the height and the width, we don't wait that the image is loaded, but we start directly * with the justification */ if (that.settings.waitThumbnailsLoad === false) { @@ -860,13 +889,13 @@ return true; // continue } } - + $entry.data('jg.loaded', false); imagesToLoad = true; - + // Spinner start if (!that.isSpinnerActive()) that.startLoadingSpinnerAnimation(); - + that.onImageEvent(imageSrc, function (loadImg) { // image loaded $entry.data('jg.width', loadImg.width); $entry.data('jg.height', loadImg.height); @@ -876,21 +905,21 @@ $entry.data('jg.loaded', 'error'); that.startImgAnalyzer(false); }); - + } else { $entry.data('jg.loaded', true); $entry.data('jg.width', $entry.width() | parseFloat($entry.css('width')) | 1); $entry.data('jg.height', $entry.height() | parseFloat($entry.css('height')) | 1); } - + } - + }); - + if (!imagesToLoad && !skippedImages) this.startImgAnalyzer(false); this.checkWidth(); }; - + /** * Checks that it is a valid number. If a string is passed it is converted to a number * @@ -901,14 +930,14 @@ if ($.type(settingContainer[settingName]) === 'string') { settingContainer[settingName] = parseFloat(settingContainer[settingName]); } - + if ($.type(settingContainer[settingName]) === 'number') { if (isNaN(settingContainer[settingName])) throw 'invalid number for ' + settingName; } else { throw settingName + ' must be a number'; } }; - + /** * Checks the sizeRangeSuffixes and, if necessary, converts * its keys from string (e.g. old settings with 'lt100') to int. @@ -917,12 +946,12 @@ if ($.type(this.settings.sizeRangeSuffixes) !== 'object') { throw 'sizeRangeSuffixes must be defined and must be an object'; } - + var suffixRanges = []; for (var rangeIdx in this.settings.sizeRangeSuffixes) { if (this.settings.sizeRangeSuffixes.hasOwnProperty(rangeIdx)) suffixRanges.push(rangeIdx); } - + var newSizeRngSuffixes = {0: ''}; for (var i = 0; i < suffixRanges.length; i++) { if ($.type(suffixRanges[i]) === 'string') { @@ -936,10 +965,10 @@ newSizeRngSuffixes[suffixRanges[i]] = this.settings.sizeRangeSuffixes[suffixRanges[i]]; } } - + this.settings.sizeRangeSuffixes = newSizeRngSuffixes; }; - + /** * check and convert the maxRowHeight setting * requires rowHeight to be already set @@ -949,7 +978,7 @@ JustifiedGallery.prototype.retrieveMaxRowHeight = function () { var newMaxRowHeight = null; var rowHeight = this.settings.rowHeight; - + if ($.type(this.settings.maxRowHeight) === 'string') { if (this.settings.maxRowHeight.match(/^[0-9]+%$/)) { newMaxRowHeight = rowHeight * parseFloat(this.settings.maxRowHeight.match(/^([0-9]+)%$/)[1]) / 100; @@ -963,26 +992,26 @@ } else { throw 'maxRowHeight must be a number or a percentage'; } - + // check if the converted value is not a number if (isNaN(newMaxRowHeight)) throw 'invalid number for maxRowHeight'; - + // check values, maxRowHeight must be >= rowHeight if (newMaxRowHeight < rowHeight) newMaxRowHeight = rowHeight; - + return newMaxRowHeight; }; - + /** * Checks the settings */ JustifiedGallery.prototype.checkSettings = function () { this.checkSizeRangesSuffixes(); - + this.checkOrConvertNumber(this.settings, 'rowHeight'); this.checkOrConvertNumber(this.settings, 'margins'); this.checkOrConvertNumber(this.settings, 'border'); - + var lastRowModes = [ 'justify', 'nojustify', @@ -994,7 +1023,7 @@ if (lastRowModes.indexOf(this.settings.lastRow) === -1) { throw 'lastRow must be one of: ' + lastRowModes.join(', '); } - + this.checkOrConvertNumber(this.settings, 'justifyThreshold'); if (this.settings.justifyThreshold < 0 || this.settings.justifyThreshold > 1) { throw 'justifyThreshold must be in the interval [0,1]'; @@ -1002,38 +1031,38 @@ if ($.type(this.settings.cssAnimation) !== 'boolean') { throw 'cssAnimation must be a boolean'; } - + if ($.type(this.settings.captions) !== 'boolean') throw 'captions must be a boolean'; this.checkOrConvertNumber(this.settings.captionSettings, 'animationDuration'); - + this.checkOrConvertNumber(this.settings.captionSettings, 'visibleOpacity'); if (this.settings.captionSettings.visibleOpacity < 0 || this.settings.captionSettings.visibleOpacity > 1) { throw 'captionSettings.visibleOpacity must be in the interval [0, 1]'; } - + this.checkOrConvertNumber(this.settings.captionSettings, 'nonVisibleOpacity'); if (this.settings.captionSettings.nonVisibleOpacity < 0 || this.settings.captionSettings.nonVisibleOpacity > 1) { throw 'captionSettings.nonVisibleOpacity must be in the interval [0, 1]'; } - + this.checkOrConvertNumber(this.settings, 'imagesAnimationDuration'); this.checkOrConvertNumber(this.settings, 'refreshTime'); this.checkOrConvertNumber(this.settings, 'refreshSensitivity'); if ($.type(this.settings.randomize) !== 'boolean') throw 'randomize must be a boolean'; if ($.type(this.settings.selector) !== 'string') throw 'selector must be a string'; - + if (this.settings.sort !== false && !$.isFunction(this.settings.sort)) { throw 'sort must be false or a comparison function'; } - + if (this.settings.filter !== false && !$.isFunction(this.settings.filter) && $.type(this.settings.filter) !== 'string') { throw 'filter must be false, a string or a filter function'; } }; - + /** * It brings all the indexes from the sizeRangeSuffixes and it orders them. They are then sorted and returned. * @returns {Array} sorted suffix ranges @@ -1046,7 +1075,7 @@ suffixRanges.sort(function (a, b) { return a > b ? 1 : a < b ? -1 : 0; }); return suffixRanges; }; - + /** * Update the existing settings only changing some of them * @@ -1056,63 +1085,15 @@ // In this case Justified Gallery has been called again changing only some options this.settings = $.extend({}, this.settings, newSettings); this.checkSettings(); - + // As reported in the settings: negative value = same as margins, 0 = disabled this.border = this.settings.border >= 0 ? this.settings.border : this.settings.margins; - + this.maxRowHeight = this.retrieveMaxRowHeight(); this.suffixRanges = this.retrieveSuffixRanges(); }; - - /** - * Justified Gallery plugin for jQuery - * - * Events - * - jg.complete : called when all the gallery has been created - * - jg.resize : called when the gallery has been resized - * - jg.rowflush : when a new row appears - * - * @param arg the action (or the settings) passed when the plugin is called - * @returns {*} the object itself - */ - $.fn.justifiedGallery = function (arg) { - return this.each(function (index, gallery) { - - var $gallery = $(gallery); - $gallery.addClass('justified-gallery'); - - var controller = $gallery.data('jg.controller'); - if (typeof controller === 'undefined') { - // Create controller and assign it to the object data - if (typeof arg !== 'undefined' && arg !== null && $.type(arg) !== 'object') { - if (arg === 'destroy') return; // Just a call to an unexisting object - throw 'The argument must be an object'; - } - controller = new JustifiedGallery($gallery, $.extend({}, $.fn.justifiedGallery.defaults, arg)); - $gallery.data('jg.controller', controller); - } else if (arg === 'norewind') { - // In this case we don't rewind: we analyze only the latest images (e.g. to complete the last unfinished row - // ... left to be more readable - } else if (arg === 'destroy') { - controller.destroy(); - return; - } else { - // In this case Justified Gallery has been called again changing only some options - controller.updateSettings(arg); - controller.rewind(); - } - - // Update the entries list - if (!controller.updateEntries(arg === 'norewind')) return; - - // Init justified gallery - controller.init(); - - }); - }; - - // Default options - $.fn.justifiedGallery.defaults = { + + JustifiedGallery.prototype.defaults = { sizeRangeSuffixes: { }, /* e.g. Flickr configuration { 100: '_t', // used when longest is less than 100px @@ -1132,9 +1113,9 @@ // can't exceed 3 * rowHeight) margins: 1, border: -1, // negative value = same as margins, 0 = disabled, any other value to set the border - + lastRow: 'nojustify', // … which is the same as 'left', or can be 'justify', 'center', 'right' or 'hide' - + justifyThreshold: 0.90, /* if row width / available space > 0.90 it will be always justified * (i.e. lastRow setting is not considered) */ waitThumbnailsLoad: true, @@ -1165,7 +1146,57 @@ It follows the specifications of the Array.prototype.filter() function of JavaScript. */ selector: 'a, div:not(.spinner)', // The selector that is used to know what are the entries of the gallery - imgSelector: '> img, > a > img' // The selector that is used to know what are the images of each entry + imgSelector: '> img, > a > img', // The selector that is used to know what are the images of each entry + triggerEvent: function (event) { // This is called to trigger events, the default behavior is to call $.trigger + this.$gallery.trigger(event); // Consider that 'this' is this set to the JustifiedGallery object, so it can + } // access to fields such as $gallery, useful to trigger events with jQuery. + }; + + /** + * Justified Gallery plugin for jQuery + * + * Events + * - jg.complete : called when all the gallery has been created + * - jg.resize : called when the gallery has been resized + * - jg.rowflush : when a new row appears + * + * @param arg the action (or the settings) passed when the plugin is called + * @returns {*} the object itself + */ + $.fn.justifiedGallery = function (arg) { + return this.each(function (index, gallery) { + + var $gallery = $(gallery); + $gallery.addClass('justified-gallery'); + + var controller = $gallery.data('jg.controller'); + if (typeof controller === 'undefined') { + // Create controller and assign it to the object data + if (typeof arg !== 'undefined' && arg !== null && $.type(arg) !== 'object') { + if (arg === 'destroy') return; // Just a call to an unexisting object + throw 'The argument must be an object'; + } + controller = new JustifiedGallery($gallery, $.extend({}, JustifiedGallery.prototype.defaults, arg)); + $gallery.data('jg.controller', controller); + } else if (arg === 'norewind') { + // In this case we don't rewind: we analyze only the latest images (e.g. to complete the last unfinished row + // ... left to be more readable + } else if (arg === 'destroy') { + controller.destroy(); + return; + } else { + // In this case Justified Gallery has been called again changing only some options + controller.updateSettings(arg); + controller.rewind(); + } + + // Update the entries list + if (!controller.updateEntries(arg === 'norewind')) return; + + // Init justified gallery + controller.init(); + + }); }; -}(jQuery)); +}));
\ No newline at end of file diff --git a/library/justifiedGallery/jquery.justifiedGallery.min.js b/library/justifiedGallery/jquery.justifiedGallery.min.js index 87519987b..bda51a188 100644 --- a/library/justifiedGallery/jquery.justifiedGallery.min.js +++ b/library/justifiedGallery/jquery.justifiedGallery.min.js @@ -1,7 +1,8 @@ /*! - * Justified Gallery - v3.6.5 + * justifiedGallery - v3.7.0 * http://miromannino.github.io/Justified-Gallery/ * Copyright (c) 2018 Miro Mannino * Licensed under the MIT license. */ -!function(a){function b(){return a("body").height()>a(window).height()}var c=function(b,c){this.settings=c,this.checkSettings(),this.imgAnalyzerTimeout=null,this.entries=null,this.buildingRow={entriesBuff:[],width:0,height:0,aspectRatio:0},this.lastFetchedEntry=null,this.lastAnalyzedIndex=-1,this.yield={every:2,flushed:0},this.border=c.border>=0?c.border:c.margins,this.maxRowHeight=this.retrieveMaxRowHeight(),this.suffixRanges=this.retrieveSuffixRanges(),this.offY=this.border,this.rows=0,this.spinner={phase:0,timeSlot:150,$el:a('<div class="spinner"><span></span><span></span><span></span></div>'),intervalId:null},this.checkWidthIntervalId=null,this.galleryWidth=b.width(),this.$gallery=b};c.prototype.getSuffix=function(a,b){var c,d;for(c=a>b?a:b,d=0;d<this.suffixRanges.length;d++)if(c<=this.suffixRanges[d])return this.settings.sizeRangeSuffixes[this.suffixRanges[d]];return this.settings.sizeRangeSuffixes[this.suffixRanges[d-1]]},c.prototype.removeSuffix=function(a,b){return a.substring(0,a.length-b.length)},c.prototype.endsWith=function(a,b){return-1!==a.indexOf(b,a.length-b.length)},c.prototype.getUsedSuffix=function(a){for(var b in this.settings.sizeRangeSuffixes)if(this.settings.sizeRangeSuffixes.hasOwnProperty(b)){if(0===this.settings.sizeRangeSuffixes[b].length)continue;if(this.endsWith(a,this.settings.sizeRangeSuffixes[b]))return this.settings.sizeRangeSuffixes[b]}return""},c.prototype.newSrc=function(a,b,c,d){var e;if(this.settings.thumbnailPath)e=this.settings.thumbnailPath(a,b,c,d);else{var f=a.match(this.settings.extension),g=null!==f?f[0]:"";e=a.replace(this.settings.extension,""),e=this.removeSuffix(e,this.getUsedSuffix(e)),e+=this.getSuffix(b,c)+g}return e},c.prototype.showImg=function(a,b){this.settings.cssAnimation?(a.addClass("entry-visible"),b&&b()):(a.stop().fadeTo(this.settings.imagesAnimationDuration,1,b),a.find(this.settings.imgSelector).stop().fadeTo(this.settings.imagesAnimationDuration,1,b))},c.prototype.extractImgSrcFromImage=function(a){var b="undefined"!=typeof a.data("safe-src")?a.data("safe-src"):a.attr("src");return a.data("jg.originalSrc",b),b},c.prototype.imgFromEntry=function(a){var b=a.find(this.settings.imgSelector);return 0===b.length?null:b},c.prototype.captionFromEntry=function(a){var b=a.find("> .caption");return 0===b.length?null:b},c.prototype.displayEntry=function(b,c,d,e,f,g){b.width(e),b.height(g),b.css("top",d),b.css("left",c);var h=this.imgFromEntry(b);if(null!==h){h.css("width",e),h.css("height",f),h.css("margin-left",-e/2),h.css("margin-top",-f/2);var i=h.attr("src"),j=this.newSrc(i,e,f,h[0]);h.one("error",function(){h.attr("src",h.data("jg.originalSrc"))});var k=function(){i!==j&&h.attr("src",j)};"skipped"===b.data("jg.loaded")?this.onImageEvent(i,a.proxy(function(){this.showImg(b,k),b.data("jg.loaded",!0)},this)):this.showImg(b,k)}else this.showImg(b);this.displayEntryCaption(b)},c.prototype.displayEntryCaption=function(b){var c=this.imgFromEntry(b);if(null!==c&&this.settings.captions){var d=this.captionFromEntry(b);if(null===d){var e=c.attr("alt");this.isValidCaption(e)||(e=b.attr("title")),this.isValidCaption(e)&&(d=a('<div class="caption">'+e+"</div>"),b.append(d),b.data("jg.createdCaption",!0))}null!==d&&(this.settings.cssAnimation||d.stop().fadeTo(0,this.settings.captionSettings.nonVisibleOpacity),this.addCaptionEventsHandlers(b))}else this.removeCaptionEventsHandlers(b)},c.prototype.isValidCaption=function(a){return"undefined"!=typeof a&&a.length>0},c.prototype.onEntryMouseEnterForCaption=function(b){var c=this.captionFromEntry(a(b.currentTarget));this.settings.cssAnimation?c.addClass("caption-visible").removeClass("caption-hidden"):c.stop().fadeTo(this.settings.captionSettings.animationDuration,this.settings.captionSettings.visibleOpacity)},c.prototype.onEntryMouseLeaveForCaption=function(b){var c=this.captionFromEntry(a(b.currentTarget));this.settings.cssAnimation?c.removeClass("caption-visible").removeClass("caption-hidden"):c.stop().fadeTo(this.settings.captionSettings.animationDuration,this.settings.captionSettings.nonVisibleOpacity)},c.prototype.addCaptionEventsHandlers=function(b){var c=b.data("jg.captionMouseEvents");"undefined"==typeof c&&(c={mouseenter:a.proxy(this.onEntryMouseEnterForCaption,this),mouseleave:a.proxy(this.onEntryMouseLeaveForCaption,this)},b.on("mouseenter",void 0,void 0,c.mouseenter),b.on("mouseleave",void 0,void 0,c.mouseleave),b.data("jg.captionMouseEvents",c))},c.prototype.removeCaptionEventsHandlers=function(a){var b=a.data("jg.captionMouseEvents");"undefined"!=typeof b&&(a.off("mouseenter",void 0,b.mouseenter),a.off("mouseleave",void 0,b.mouseleave),a.removeData("jg.captionMouseEvents"))},c.prototype.clearBuildingRow=function(){this.buildingRow.entriesBuff=[],this.buildingRow.aspectRatio=0,this.buildingRow.width=0},c.prototype.prepareBuildingRow=function(a){var b,c,d,e,f,g=!0,h=0,i=this.galleryWidth-2*this.border-(this.buildingRow.entriesBuff.length-1)*this.settings.margins,j=i/this.buildingRow.aspectRatio,k=this.settings.rowHeight,l=this.buildingRow.width/i>this.settings.justifyThreshold;if(a&&"hide"===this.settings.lastRow&&!l){for(b=0;b<this.buildingRow.entriesBuff.length;b++)c=this.buildingRow.entriesBuff[b],this.settings.cssAnimation?c.removeClass("entry-visible"):(c.stop().fadeTo(0,.1),c.find("> img, > a > img").fadeTo(0,0));return-1}for(a&&!l&&"justify"!==this.settings.lastRow&&"hide"!==this.settings.lastRow&&(g=!1,this.rows>0&&(k=(this.offY-this.border-this.settings.margins*this.rows)/this.rows,g=k*this.buildingRow.aspectRatio/i>this.settings.justifyThreshold)),b=0;b<this.buildingRow.entriesBuff.length;b++)c=this.buildingRow.entriesBuff[b],d=c.data("jg.width")/c.data("jg.height"),g?(e=b===this.buildingRow.entriesBuff.length-1?i:j*d,f=j):(e=k*d,f=k),i-=Math.round(e),c.data("jg.jwidth",Math.round(e)),c.data("jg.jheight",Math.ceil(f)),(0===b||h>f)&&(h=f);return this.buildingRow.height=h,g},c.prototype.flushRow=function(a){var b,c,d,e=this.settings,f=this.border;if(c=this.prepareBuildingRow(a),a&&"hide"===e.lastRow&&-1===c)return void this.clearBuildingRow();if(this.maxRowHeight&&this.maxRowHeight<this.buildingRow.height&&(this.buildingRow.height=this.maxRowHeight),a&&("center"===e.lastRow||"right"===e.lastRow)){var g=this.galleryWidth-2*this.border-(this.buildingRow.entriesBuff.length-1)*e.margins;for(d=0;d<this.buildingRow.entriesBuff.length;d++)b=this.buildingRow.entriesBuff[d],g-=b.data("jg.jwidth");"center"===e.lastRow?f+=g/2:"right"===e.lastRow&&(f+=g)}var h=this.buildingRow.entriesBuff.length-1;for(d=0;h>=d;d++)b=this.buildingRow.entriesBuff[this.settings.rtl?h-d:d],this.displayEntry(b,f,this.offY,b.data("jg.jwidth"),b.data("jg.jheight"),this.buildingRow.height),f+=b.data("jg.jwidth")+e.margins;this.galleryHeightToSet=this.offY+this.buildingRow.height+this.border,this.setGalleryTempHeight(this.galleryHeightToSet+this.getSpinnerHeight()),(!a||this.buildingRow.height<=e.rowHeight&&c)&&(this.offY+=this.buildingRow.height+e.margins,this.rows+=1,this.clearBuildingRow(),this.$gallery.trigger("jg.rowflush"))};var d=0;c.prototype.rememberGalleryHeight=function(){d=this.$gallery.height(),this.$gallery.height(d)},c.prototype.setGalleryTempHeight=function(a){d=Math.max(a,d),this.$gallery.height(d)},c.prototype.setGalleryFinalHeight=function(a){d=a,this.$gallery.height(a)};var e=!1;c.prototype.checkWidth=function(){this.checkWidthIntervalId=setInterval(a.proxy(function(){if(this.$gallery.is(":visible")){var a=parseFloat(this.$gallery.width());b()===e?Math.abs(a-this.galleryWidth)>this.settings.refreshSensitivity&&(this.galleryWidth=a,this.rewind(),this.rememberGalleryHeight(),this.startImgAnalyzer(!0)):(e=b(),this.galleryWidth=a)}},this),this.settings.refreshTime)},c.prototype.isSpinnerActive=function(){return null!==this.spinner.intervalId},c.prototype.getSpinnerHeight=function(){return this.spinner.$el.innerHeight()},c.prototype.stopLoadingSpinnerAnimation=function(){clearInterval(this.spinner.intervalId),this.spinner.intervalId=null,this.setGalleryTempHeight(this.$gallery.height()-this.getSpinnerHeight()),this.spinner.$el.detach()},c.prototype.startLoadingSpinnerAnimation=function(){var a=this.spinner,b=a.$el.find("span");clearInterval(a.intervalId),this.$gallery.append(a.$el),this.setGalleryTempHeight(this.offY+this.buildingRow.height+this.getSpinnerHeight()),a.intervalId=setInterval(function(){a.phase<b.length?b.eq(a.phase).fadeTo(a.timeSlot,1):b.eq(a.phase-b.length).fadeTo(a.timeSlot,0),a.phase=(a.phase+1)%(2*b.length)},a.timeSlot)},c.prototype.rewind=function(){this.lastFetchedEntry=null,this.lastAnalyzedIndex=-1,this.offY=this.border,this.rows=0,this.clearBuildingRow()},c.prototype.updateEntries=function(b){var c;return b&&null!=this.lastFetchedEntry?c=a(this.lastFetchedEntry).nextAll(this.settings.selector).toArray():(this.entries=[],c=this.$gallery.children(this.settings.selector).toArray()),c.length>0&&(a.isFunction(this.settings.sort)?c=this.sortArray(c):this.settings.randomize&&(c=this.shuffleArray(c)),this.lastFetchedEntry=c[c.length-1],this.settings.filter?c=this.filterArray(c):this.resetFilters(c)),this.entries=this.entries.concat(c),!0},c.prototype.insertToGallery=function(b){var c=this;a.each(b,function(){a(this).appendTo(c.$gallery)})},c.prototype.shuffleArray=function(a){var b,c,d;for(b=a.length-1;b>0;b--)c=Math.floor(Math.random()*(b+1)),d=a[b],a[b]=a[c],a[c]=d;return this.insertToGallery(a),a},c.prototype.sortArray=function(a){return a.sort(this.settings.sort),this.insertToGallery(a),a},c.prototype.resetFilters=function(b){for(var c=0;c<b.length;c++)a(b[c]).removeClass("jg-filtered")},c.prototype.filterArray=function(b){var c=this.settings;if("string"===a.type(c.filter))return b.filter(function(b){var d=a(b);return d.is(c.filter)?(d.removeClass("jg-filtered"),!0):(d.addClass("jg-filtered").removeClass("jg-visible"),!1)});if(a.isFunction(c.filter)){for(var d=b.filter(c.filter),e=0;e<b.length;e++)-1===d.indexOf(b[e])?a(b[e]).addClass("jg-filtered").removeClass("jg-visible"):a(b[e]).removeClass("jg-filtered");return d}},c.prototype.destroy=function(){clearInterval(this.checkWidthIntervalId),a.each(this.entries,a.proxy(function(b,c){var d=a(c);d.css("width",""),d.css("height",""),d.css("top",""),d.css("left",""),d.data("jg.loaded",void 0),d.removeClass("jg-entry");var e=this.imgFromEntry(d);e.css("width",""),e.css("height",""),e.css("margin-left",""),e.css("margin-top",""),e.attr("src",e.data("jg.originalSrc")),e.data("jg.originalSrc",void 0),this.removeCaptionEventsHandlers(d);var f=this.captionFromEntry(d);d.data("jg.createdCaption")?(d.data("jg.createdCaption",void 0),null!==f&&f.remove()):null!==f&&f.fadeTo(0,1)},this)),this.$gallery.css("height",""),this.$gallery.removeClass("justified-gallery"),this.$gallery.data("jg.controller",void 0)},c.prototype.analyzeImages=function(b){for(var c=this.lastAnalyzedIndex+1;c<this.entries.length;c++){var d=a(this.entries[c]);if(d.data("jg.loaded")===!0||"skipped"===d.data("jg.loaded")){var e=this.galleryWidth-2*this.border-(this.buildingRow.entriesBuff.length-1)*this.settings.margins,f=d.data("jg.width")/d.data("jg.height");if(e/(this.buildingRow.aspectRatio+f)<this.settings.rowHeight&&(this.flushRow(!1),++this.yield.flushed>=this.yield.every))return void this.startImgAnalyzer(b);this.buildingRow.entriesBuff.push(d),this.buildingRow.aspectRatio+=f,this.buildingRow.width+=f*this.settings.rowHeight,this.lastAnalyzedIndex=c}else if("error"!==d.data("jg.loaded"))return}this.buildingRow.entriesBuff.length>0&&this.flushRow(!0),this.isSpinnerActive()&&this.stopLoadingSpinnerAnimation(),this.stopImgAnalyzerStarter(),this.$gallery.trigger(b?"jg.resize":"jg.complete"),this.setGalleryFinalHeight(this.galleryHeightToSet)},c.prototype.stopImgAnalyzerStarter=function(){this.yield.flushed=0,null!==this.imgAnalyzerTimeout&&(clearTimeout(this.imgAnalyzerTimeout),this.imgAnalyzerTimeout=null)},c.prototype.startImgAnalyzer=function(a){var b=this;this.stopImgAnalyzerStarter(),this.imgAnalyzerTimeout=setTimeout(function(){b.analyzeImages(a)},.001)},c.prototype.onImageEvent=function(b,c,d){if(c||d){var e=new Image,f=a(e);c&&f.one("load",function(){f.off("load error"),c(e)}),d&&f.one("error",function(){f.off("load error"),d(e)}),e.src=b}},c.prototype.init=function(){var b=!1,c=!1,d=this;a.each(this.entries,function(e,f){var g=a(f),h=d.imgFromEntry(g);if(g.addClass("jg-entry"),g.data("jg.loaded")!==!0&&"skipped"!==g.data("jg.loaded"))if(null!==d.settings.rel&&g.attr("rel",d.settings.rel),null!==d.settings.target&&g.attr("target",d.settings.target),null!==h){var i=d.extractImgSrcFromImage(h);if(h.attr("src",i),d.settings.waitThumbnailsLoad===!1){var j=parseFloat(h.prop("width")),k=parseFloat(h.prop("height"));if(!isNaN(j)&&!isNaN(k))return g.data("jg.width",j),g.data("jg.height",k),g.data("jg.loaded","skipped"),c=!0,d.startImgAnalyzer(!1),!0}g.data("jg.loaded",!1),b=!0,d.isSpinnerActive()||d.startLoadingSpinnerAnimation(),d.onImageEvent(i,function(a){g.data("jg.width",a.width),g.data("jg.height",a.height),g.data("jg.loaded",!0),d.startImgAnalyzer(!1)},function(){g.data("jg.loaded","error"),d.startImgAnalyzer(!1)})}else g.data("jg.loaded",!0),g.data("jg.width",g.width()|parseFloat(g.css("width"))|1),g.data("jg.height",g.height()|parseFloat(g.css("height"))|1)}),b||c||this.startImgAnalyzer(!1),this.checkWidth()},c.prototype.checkOrConvertNumber=function(b,c){if("string"===a.type(b[c])&&(b[c]=parseFloat(b[c])),"number"!==a.type(b[c]))throw c+" must be a number";if(isNaN(b[c]))throw"invalid number for "+c},c.prototype.checkSizeRangesSuffixes=function(){if("object"!==a.type(this.settings.sizeRangeSuffixes))throw"sizeRangeSuffixes must be defined and must be an object";var b=[];for(var c in this.settings.sizeRangeSuffixes)this.settings.sizeRangeSuffixes.hasOwnProperty(c)&&b.push(c);for(var d={0:""},e=0;e<b.length;e++)if("string"===a.type(b[e]))try{var f=parseInt(b[e].replace(/^[a-z]+/,""),10);d[f]=this.settings.sizeRangeSuffixes[b[e]]}catch(g){throw"sizeRangeSuffixes keys must contains correct numbers ("+g+")"}else d[b[e]]=this.settings.sizeRangeSuffixes[b[e]];this.settings.sizeRangeSuffixes=d},c.prototype.retrieveMaxRowHeight=function(){var b=null,c=this.settings.rowHeight;if("string"===a.type(this.settings.maxRowHeight))b=this.settings.maxRowHeight.match(/^[0-9]+%$/)?c*parseFloat(this.settings.maxRowHeight.match(/^([0-9]+)%$/)[1])/100:parseFloat(this.settings.maxRowHeight);else{if("number"!==a.type(this.settings.maxRowHeight)){if(this.settings.maxRowHeight===!1||null==this.settings.maxRowHeight)return null;throw"maxRowHeight must be a number or a percentage"}b=this.settings.maxRowHeight}if(isNaN(b))throw"invalid number for maxRowHeight";return c>b&&(b=c),b},c.prototype.checkSettings=function(){this.checkSizeRangesSuffixes(),this.checkOrConvertNumber(this.settings,"rowHeight"),this.checkOrConvertNumber(this.settings,"margins"),this.checkOrConvertNumber(this.settings,"border");var b=["justify","nojustify","left","center","right","hide"];if(-1===b.indexOf(this.settings.lastRow))throw"lastRow must be one of: "+b.join(", ");if(this.checkOrConvertNumber(this.settings,"justifyThreshold"),this.settings.justifyThreshold<0||this.settings.justifyThreshold>1)throw"justifyThreshold must be in the interval [0,1]";if("boolean"!==a.type(this.settings.cssAnimation))throw"cssAnimation must be a boolean";if("boolean"!==a.type(this.settings.captions))throw"captions must be a boolean";if(this.checkOrConvertNumber(this.settings.captionSettings,"animationDuration"),this.checkOrConvertNumber(this.settings.captionSettings,"visibleOpacity"),this.settings.captionSettings.visibleOpacity<0||this.settings.captionSettings.visibleOpacity>1)throw"captionSettings.visibleOpacity must be in the interval [0, 1]";if(this.checkOrConvertNumber(this.settings.captionSettings,"nonVisibleOpacity"),this.settings.captionSettings.nonVisibleOpacity<0||this.settings.captionSettings.nonVisibleOpacity>1)throw"captionSettings.nonVisibleOpacity must be in the interval [0, 1]";if(this.checkOrConvertNumber(this.settings,"imagesAnimationDuration"),this.checkOrConvertNumber(this.settings,"refreshTime"),this.checkOrConvertNumber(this.settings,"refreshSensitivity"),"boolean"!==a.type(this.settings.randomize))throw"randomize must be a boolean";if("string"!==a.type(this.settings.selector))throw"selector must be a string";if(this.settings.sort!==!1&&!a.isFunction(this.settings.sort))throw"sort must be false or a comparison function";if(this.settings.filter!==!1&&!a.isFunction(this.settings.filter)&&"string"!==a.type(this.settings.filter))throw"filter must be false, a string or a filter function"},c.prototype.retrieveSuffixRanges=function(){var a=[];for(var b in this.settings.sizeRangeSuffixes)this.settings.sizeRangeSuffixes.hasOwnProperty(b)&&a.push(parseInt(b,10));return a.sort(function(a,b){return a>b?1:b>a?-1:0}),a},c.prototype.updateSettings=function(b){this.settings=a.extend({},this.settings,b),this.checkSettings(),this.border=this.settings.border>=0?this.settings.border:this.settings.margins,this.maxRowHeight=this.retrieveMaxRowHeight(),this.suffixRanges=this.retrieveSuffixRanges()},a.fn.justifiedGallery=function(b){return this.each(function(d,e){var f=a(e);f.addClass("justified-gallery");var g=f.data("jg.controller");if("undefined"==typeof g){if("undefined"!=typeof b&&null!==b&&"object"!==a.type(b)){if("destroy"===b)return;throw"The argument must be an object"}g=new c(f,a.extend({},a.fn.justifiedGallery.defaults,b)),f.data("jg.controller",g)}else if("norewind"===b);else{if("destroy"===b)return void g.destroy();g.updateSettings(b),g.rewind()}g.updateEntries("norewind"===b)&&g.init()})},a.fn.justifiedGallery.defaults={sizeRangeSuffixes:{},thumbnailPath:void 0,rowHeight:120,maxRowHeight:!1,margins:1,border:-1,lastRow:"nojustify",justifyThreshold:.9,waitThumbnailsLoad:!0,captions:!0,cssAnimation:!0,imagesAnimationDuration:500,captionSettings:{animationDuration:500,visibleOpacity:.7,nonVisibleOpacity:0},rel:null,target:null,extension:/\.[^.\\/]+$/,refreshTime:200,refreshSensitivity:0,randomize:!1,rtl:!1,sort:!1,filter:!1,selector:"a, div:not(.spinner)",imgSelector:"> img, > a > img"}}(jQuery);
\ No newline at end of file + +!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof module&&module.exports?module.exports=function(t,i){return void 0===i&&(i="undefined"!=typeof window?require("jquery"):require("jquery")(t)),e(i),i}:e(jQuery)}(function(g){var r=function(t,i){this.settings=i,this.checkSettings(),this.imgAnalyzerTimeout=null,this.entries=null,this.buildingRow={entriesBuff:[],width:0,height:0,aspectRatio:0},this.lastFetchedEntry=null,this.lastAnalyzedIndex=-1,this.yield={every:2,flushed:0},this.border=0<=i.border?i.border:i.margins,this.maxRowHeight=this.retrieveMaxRowHeight(),this.suffixRanges=this.retrieveSuffixRanges(),this.offY=this.border,this.rows=0,this.spinner={phase:0,timeSlot:150,$el:g('<div class="spinner"><span></span><span></span><span></span></div>'),intervalId:null},this.scrollBarOn=!1,this.checkWidthIntervalId=null,this.galleryWidth=t.width(),this.$gallery=t};r.prototype.getSuffix=function(t,i){var e,s;for(e=i<t?t:i,s=0;s<this.suffixRanges.length;s++)if(e<=this.suffixRanges[s])return this.settings.sizeRangeSuffixes[this.suffixRanges[s]];return this.settings.sizeRangeSuffixes[this.suffixRanges[s-1]]},r.prototype.removeSuffix=function(t,i){return t.substring(0,t.length-i.length)},r.prototype.endsWith=function(t,i){return-1!==t.indexOf(i,t.length-i.length)},r.prototype.getUsedSuffix=function(t){for(var i in this.settings.sizeRangeSuffixes)if(this.settings.sizeRangeSuffixes.hasOwnProperty(i)){if(0===this.settings.sizeRangeSuffixes[i].length)continue;if(this.endsWith(t,this.settings.sizeRangeSuffixes[i]))return this.settings.sizeRangeSuffixes[i]}return""},r.prototype.newSrc=function(t,i,e,s){var n;if(this.settings.thumbnailPath)n=this.settings.thumbnailPath(t,i,e,s);else{var r=t.match(this.settings.extension),o=null!==r?r[0]:"";n=t.replace(this.settings.extension,""),n=this.removeSuffix(n,this.getUsedSuffix(n)),n+=this.getSuffix(i,e)+o}return n},r.prototype.showImg=function(t,i){this.settings.cssAnimation?(t.addClass("entry-visible"),i&&i()):(t.stop().fadeTo(this.settings.imagesAnimationDuration,1,i),t.find(this.settings.imgSelector).stop().fadeTo(this.settings.imagesAnimationDuration,1,i))},r.prototype.extractImgSrcFromImage=function(t){var i=void 0!==t.data("safe-src")?t.data("safe-src"):t.attr("src");return t.data("jg.originalSrc",i),i},r.prototype.imgFromEntry=function(t){var i=t.find(this.settings.imgSelector);return 0===i.length?null:i},r.prototype.captionFromEntry=function(t){var i=t.find("> .caption");return 0===i.length?null:i},r.prototype.displayEntry=function(t,i,e,s,n,r){t.width(s),t.height(r),t.css("top",e),t.css("left",i);var o=this.imgFromEntry(t);if(null!==o){o.css("width",s),o.css("height",n),o.css("margin-left",-s/2),o.css("margin-top",-n/2);var a=o.attr("src"),h=this.newSrc(a,s,n,o[0]);o.one("error",function(){o.attr("src",o.data("jg.originalSrc"))});var l=function(){a!==h&&o.attr("src",h)};"skipped"===t.data("jg.loaded")?this.onImageEvent(a,g.proxy(function(){this.showImg(t,l),t.data("jg.loaded",!0)},this)):this.showImg(t,l)}else this.showImg(t);this.displayEntryCaption(t)},r.prototype.displayEntryCaption=function(t){var i=this.imgFromEntry(t);if(null!==i&&this.settings.captions){var e=this.captionFromEntry(t);if(null===e){var s=i.attr("alt");this.isValidCaption(s)||(s=t.attr("title")),this.isValidCaption(s)&&(e=g('<div class="caption">'+s+"</div>"),t.append(e),t.data("jg.createdCaption",!0))}null!==e&&(this.settings.cssAnimation||e.stop().fadeTo(0,this.settings.captionSettings.nonVisibleOpacity),this.addCaptionEventsHandlers(t))}else this.removeCaptionEventsHandlers(t)},r.prototype.isValidCaption=function(t){return void 0!==t&&0<t.length},r.prototype.onEntryMouseEnterForCaption=function(t){var i=this.captionFromEntry(g(t.currentTarget));this.settings.cssAnimation?i.addClass("caption-visible").removeClass("caption-hidden"):i.stop().fadeTo(this.settings.captionSettings.animationDuration,this.settings.captionSettings.visibleOpacity)},r.prototype.onEntryMouseLeaveForCaption=function(t){var i=this.captionFromEntry(g(t.currentTarget));this.settings.cssAnimation?i.removeClass("caption-visible").removeClass("caption-hidden"):i.stop().fadeTo(this.settings.captionSettings.animationDuration,this.settings.captionSettings.nonVisibleOpacity)},r.prototype.addCaptionEventsHandlers=function(t){var i=t.data("jg.captionMouseEvents");void 0===i&&(i={mouseenter:g.proxy(this.onEntryMouseEnterForCaption,this),mouseleave:g.proxy(this.onEntryMouseLeaveForCaption,this)},t.on("mouseenter",void 0,void 0,i.mouseenter),t.on("mouseleave",void 0,void 0,i.mouseleave),t.data("jg.captionMouseEvents",i))},r.prototype.removeCaptionEventsHandlers=function(t){var i=t.data("jg.captionMouseEvents");void 0!==i&&(t.off("mouseenter",void 0,i.mouseenter),t.off("mouseleave",void 0,i.mouseleave),t.removeData("jg.captionMouseEvents"))},r.prototype.clearBuildingRow=function(){this.buildingRow.entriesBuff=[],this.buildingRow.aspectRatio=0,this.buildingRow.width=0},r.prototype.prepareBuildingRow=function(t){var i,e,s,n,r,o=!0,a=0,h=this.galleryWidth-2*this.border-(this.buildingRow.entriesBuff.length-1)*this.settings.margins,l=h/this.buildingRow.aspectRatio,g=this.settings.rowHeight,u=this.buildingRow.width/h>this.settings.justifyThreshold;if(t&&"hide"===this.settings.lastRow&&!u){for(i=0;i<this.buildingRow.entriesBuff.length;i++)e=this.buildingRow.entriesBuff[i],this.settings.cssAnimation?e.removeClass("entry-visible"):(e.stop().fadeTo(0,.1),e.find("> img, > a > img").fadeTo(0,0));return-1}for(t&&!u&&"justify"!==this.settings.lastRow&&"hide"!==this.settings.lastRow&&(o=!1,0<this.rows&&(o=(g=(this.offY-this.border-this.settings.margins*this.rows)/this.rows)*this.buildingRow.aspectRatio/h>this.settings.justifyThreshold)),i=0;i<this.buildingRow.entriesBuff.length;i++)s=(e=this.buildingRow.entriesBuff[i]).data("jg.width")/e.data("jg.height"),o?(n=i===this.buildingRow.entriesBuff.length-1?h:l*s,r=l):(n=g*s,r=g),h-=Math.round(n),e.data("jg.jwidth",Math.round(n)),e.data("jg.jheight",Math.ceil(r)),(0===i||r<a)&&(a=r);return this.buildingRow.height=a,o},r.prototype.flushRow=function(t){var i,e,s,n=this.settings,r=this.border;if(e=this.prepareBuildingRow(t),t&&"hide"===n.lastRow&&-1===e)this.clearBuildingRow();else{if(this.maxRowHeight&&this.maxRowHeight<this.buildingRow.height&&(this.buildingRow.height=this.maxRowHeight),t&&("center"===n.lastRow||"right"===n.lastRow)){var o=this.galleryWidth-2*this.border-(this.buildingRow.entriesBuff.length-1)*n.margins;for(s=0;s<this.buildingRow.entriesBuff.length;s++)o-=(i=this.buildingRow.entriesBuff[s]).data("jg.jwidth");"center"===n.lastRow?r+=o/2:"right"===n.lastRow&&(r+=o)}var a=this.buildingRow.entriesBuff.length-1;for(s=0;s<=a;s++)i=this.buildingRow.entriesBuff[this.settings.rtl?a-s:s],this.displayEntry(i,r,this.offY,i.data("jg.jwidth"),i.data("jg.jheight"),this.buildingRow.height),r+=i.data("jg.jwidth")+n.margins;this.galleryHeightToSet=this.offY+this.buildingRow.height+this.border,this.setGalleryTempHeight(this.galleryHeightToSet+this.getSpinnerHeight()),(!t||this.buildingRow.height<=n.rowHeight&&e)&&(this.offY+=this.buildingRow.height+n.margins,this.rows+=1,this.clearBuildingRow(),this.settings.triggerEvent.call(this,"jg.rowflush"))}};var i=0;function e(){return g("body").height()>g(window).height()}r.prototype.rememberGalleryHeight=function(){i=this.$gallery.height(),this.$gallery.height(i)},r.prototype.setGalleryTempHeight=function(t){i=Math.max(t,i),this.$gallery.height(i)},r.prototype.setGalleryFinalHeight=function(t){i=t,this.$gallery.height(t)},r.prototype.checkWidth=function(){this.checkWidthIntervalId=setInterval(g.proxy(function(){if(this.$gallery.is(":visible")){var t=parseFloat(this.$gallery.width());e()===this.scrollBarOn?Math.abs(t-this.galleryWidth)>this.settings.refreshSensitivity&&(this.galleryWidth=t,this.rewind(),this.rememberGalleryHeight(),this.startImgAnalyzer(!0)):(this.scrollBarOn=e(),this.galleryWidth=t)}},this),this.settings.refreshTime)},r.prototype.isSpinnerActive=function(){return null!==this.spinner.intervalId},r.prototype.getSpinnerHeight=function(){return this.spinner.$el.innerHeight()},r.prototype.stopLoadingSpinnerAnimation=function(){clearInterval(this.spinner.intervalId),this.spinner.intervalId=null,this.setGalleryTempHeight(this.$gallery.height()-this.getSpinnerHeight()),this.spinner.$el.detach()},r.prototype.startLoadingSpinnerAnimation=function(){var t=this.spinner,i=t.$el.find("span");clearInterval(t.intervalId),this.$gallery.append(t.$el),this.setGalleryTempHeight(this.offY+this.buildingRow.height+this.getSpinnerHeight()),t.intervalId=setInterval(function(){t.phase<i.length?i.eq(t.phase).fadeTo(t.timeSlot,1):i.eq(t.phase-i.length).fadeTo(t.timeSlot,0),t.phase=(t.phase+1)%(2*i.length)},t.timeSlot)},r.prototype.rewind=function(){this.lastFetchedEntry=null,this.lastAnalyzedIndex=-1,this.offY=this.border,this.rows=0,this.clearBuildingRow()},r.prototype.updateEntries=function(t){var i;return t&&null!=this.lastFetchedEntry?i=g(this.lastFetchedEntry).nextAll(this.settings.selector).toArray():(this.entries=[],i=this.$gallery.children(this.settings.selector).toArray()),0<i.length&&(g.isFunction(this.settings.sort)?i=this.sortArray(i):this.settings.randomize&&(i=this.shuffleArray(i)),this.lastFetchedEntry=i[i.length-1],this.settings.filter?i=this.filterArray(i):this.resetFilters(i)),this.entries=this.entries.concat(i),!0},r.prototype.insertToGallery=function(t){var i=this;g.each(t,function(){g(this).appendTo(i.$gallery)})},r.prototype.shuffleArray=function(t){var i,e,s;for(i=t.length-1;0<i;i--)e=Math.floor(Math.random()*(i+1)),s=t[i],t[i]=t[e],t[e]=s;return this.insertToGallery(t),t},r.prototype.sortArray=function(t){return t.sort(this.settings.sort),this.insertToGallery(t),t},r.prototype.resetFilters=function(t){for(var i=0;i<t.length;i++)g(t[i]).removeClass("jg-filtered")},r.prototype.filterArray=function(t){var e=this.settings;if("string"===g.type(e.filter))return t.filter(function(t){var i=g(t);return i.is(e.filter)?(i.removeClass("jg-filtered"),!0):(i.addClass("jg-filtered").removeClass("jg-visible"),!1)});if(g.isFunction(e.filter)){for(var i=t.filter(e.filter),s=0;s<t.length;s++)-1===i.indexOf(t[s])?g(t[s]).addClass("jg-filtered").removeClass("jg-visible"):g(t[s]).removeClass("jg-filtered");return i}},r.prototype.destroy=function(){clearInterval(this.checkWidthIntervalId),g.each(this.entries,g.proxy(function(t,i){var e=g(i);e.css("width",""),e.css("height",""),e.css("top",""),e.css("left",""),e.data("jg.loaded",void 0),e.removeClass("jg-entry");var s=this.imgFromEntry(e);s.css("width",""),s.css("height",""),s.css("margin-left",""),s.css("margin-top",""),s.attr("src",s.data("jg.originalSrc")),s.data("jg.originalSrc",void 0),this.removeCaptionEventsHandlers(e);var n=this.captionFromEntry(e);e.data("jg.createdCaption")?(e.data("jg.createdCaption",void 0),null!==n&&n.remove()):null!==n&&n.fadeTo(0,1)},this)),this.$gallery.css("height",""),this.$gallery.removeClass("justified-gallery"),this.$gallery.data("jg.controller",void 0)},r.prototype.analyzeImages=function(t){for(var i=this.lastAnalyzedIndex+1;i<this.entries.length;i++){var e=g(this.entries[i]);if(!0===e.data("jg.loaded")||"skipped"===e.data("jg.loaded")){var s=this.galleryWidth-2*this.border-(this.buildingRow.entriesBuff.length-1)*this.settings.margins,n=e.data("jg.width")/e.data("jg.height");if(s/(this.buildingRow.aspectRatio+n)<this.settings.rowHeight&&(this.flushRow(!1),++this.yield.flushed>=this.yield.every))return void this.startImgAnalyzer(t);this.buildingRow.entriesBuff.push(e),this.buildingRow.aspectRatio+=n,this.buildingRow.width+=n*this.settings.rowHeight,this.lastAnalyzedIndex=i}else if("error"!==e.data("jg.loaded"))return}0<this.buildingRow.entriesBuff.length&&this.flushRow(!0),this.isSpinnerActive()&&this.stopLoadingSpinnerAnimation(),this.stopImgAnalyzerStarter(),this.settings.triggerEvent.call(this,t?"jg.resize":"jg.complete"),this.setGalleryFinalHeight(this.galleryHeightToSet)},r.prototype.stopImgAnalyzerStarter=function(){this.yield.flushed=0,null!==this.imgAnalyzerTimeout&&(clearTimeout(this.imgAnalyzerTimeout),this.imgAnalyzerTimeout=null)},r.prototype.startImgAnalyzer=function(t){var i=this;this.stopImgAnalyzerStarter(),this.imgAnalyzerTimeout=setTimeout(function(){i.analyzeImages(t)},.001)},r.prototype.onImageEvent=function(t,i,e){if(i||e){var s=new Image,n=g(s);i&&n.one("load",function(){n.off("load error"),i(s)}),e&&n.one("error",function(){n.off("load error"),e(s)}),s.src=t}},r.prototype.init=function(){var a=!1,h=!1,l=this;g.each(this.entries,function(t,i){var e=g(i),s=l.imgFromEntry(e);if(e.addClass("jg-entry"),!0!==e.data("jg.loaded")&&"skipped"!==e.data("jg.loaded"))if(null!==l.settings.rel&&e.attr("rel",l.settings.rel),null!==l.settings.target&&e.attr("target",l.settings.target),null!==s){var n=l.extractImgSrcFromImage(s);if(s.attr("src",n),!1===l.settings.waitThumbnailsLoad){var r=parseFloat(s.prop("width")),o=parseFloat(s.prop("height"));if(!isNaN(r)&&!isNaN(o))return e.data("jg.width",r),e.data("jg.height",o),e.data("jg.loaded","skipped"),h=!0,l.startImgAnalyzer(!1),!0}e.data("jg.loaded",!1),a=!0,l.isSpinnerActive()||l.startLoadingSpinnerAnimation(),l.onImageEvent(n,function(t){e.data("jg.width",t.width),e.data("jg.height",t.height),e.data("jg.loaded",!0),l.startImgAnalyzer(!1)},function(){e.data("jg.loaded","error"),l.startImgAnalyzer(!1)})}else e.data("jg.loaded",!0),e.data("jg.width",e.width()|parseFloat(e.css("width"))|1),e.data("jg.height",e.height()|parseFloat(e.css("height"))|1)}),a||h||this.startImgAnalyzer(!1),this.checkWidth()},r.prototype.checkOrConvertNumber=function(t,i){if("string"===g.type(t[i])&&(t[i]=parseFloat(t[i])),"number"!==g.type(t[i]))throw i+" must be a number";if(isNaN(t[i]))throw"invalid number for "+i},r.prototype.checkSizeRangesSuffixes=function(){if("object"!==g.type(this.settings.sizeRangeSuffixes))throw"sizeRangeSuffixes must be defined and must be an object";var t=[];for(var i in this.settings.sizeRangeSuffixes)this.settings.sizeRangeSuffixes.hasOwnProperty(i)&&t.push(i);for(var e={0:""},s=0;s<t.length;s++)if("string"===g.type(t[s]))try{e[parseInt(t[s].replace(/^[a-z]+/,""),10)]=this.settings.sizeRangeSuffixes[t[s]]}catch(t){throw"sizeRangeSuffixes keys must contains correct numbers ("+t+")"}else e[t[s]]=this.settings.sizeRangeSuffixes[t[s]];this.settings.sizeRangeSuffixes=e},r.prototype.retrieveMaxRowHeight=function(){var t=null,i=this.settings.rowHeight;if("string"===g.type(this.settings.maxRowHeight))t=this.settings.maxRowHeight.match(/^[0-9]+%$/)?i*parseFloat(this.settings.maxRowHeight.match(/^([0-9]+)%$/)[1])/100:parseFloat(this.settings.maxRowHeight);else{if("number"!==g.type(this.settings.maxRowHeight)){if(!1===this.settings.maxRowHeight||null==this.settings.maxRowHeight)return null;throw"maxRowHeight must be a number or a percentage"}t=this.settings.maxRowHeight}if(isNaN(t))throw"invalid number for maxRowHeight";return t<i&&(t=i),t},r.prototype.checkSettings=function(){this.checkSizeRangesSuffixes(),this.checkOrConvertNumber(this.settings,"rowHeight"),this.checkOrConvertNumber(this.settings,"margins"),this.checkOrConvertNumber(this.settings,"border");var t=["justify","nojustify","left","center","right","hide"];if(-1===t.indexOf(this.settings.lastRow))throw"lastRow must be one of: "+t.join(", ");if(this.checkOrConvertNumber(this.settings,"justifyThreshold"),this.settings.justifyThreshold<0||1<this.settings.justifyThreshold)throw"justifyThreshold must be in the interval [0,1]";if("boolean"!==g.type(this.settings.cssAnimation))throw"cssAnimation must be a boolean";if("boolean"!==g.type(this.settings.captions))throw"captions must be a boolean";if(this.checkOrConvertNumber(this.settings.captionSettings,"animationDuration"),this.checkOrConvertNumber(this.settings.captionSettings,"visibleOpacity"),this.settings.captionSettings.visibleOpacity<0||1<this.settings.captionSettings.visibleOpacity)throw"captionSettings.visibleOpacity must be in the interval [0, 1]";if(this.checkOrConvertNumber(this.settings.captionSettings,"nonVisibleOpacity"),this.settings.captionSettings.nonVisibleOpacity<0||1<this.settings.captionSettings.nonVisibleOpacity)throw"captionSettings.nonVisibleOpacity must be in the interval [0, 1]";if(this.checkOrConvertNumber(this.settings,"imagesAnimationDuration"),this.checkOrConvertNumber(this.settings,"refreshTime"),this.checkOrConvertNumber(this.settings,"refreshSensitivity"),"boolean"!==g.type(this.settings.randomize))throw"randomize must be a boolean";if("string"!==g.type(this.settings.selector))throw"selector must be a string";if(!1!==this.settings.sort&&!g.isFunction(this.settings.sort))throw"sort must be false or a comparison function";if(!1!==this.settings.filter&&!g.isFunction(this.settings.filter)&&"string"!==g.type(this.settings.filter))throw"filter must be false, a string or a filter function"},r.prototype.retrieveSuffixRanges=function(){var t=[];for(var i in this.settings.sizeRangeSuffixes)this.settings.sizeRangeSuffixes.hasOwnProperty(i)&&t.push(parseInt(i,10));return t.sort(function(t,i){return i<t?1:t<i?-1:0}),t},r.prototype.updateSettings=function(t){this.settings=g.extend({},this.settings,t),this.checkSettings(),this.border=0<=this.settings.border?this.settings.border:this.settings.margins,this.maxRowHeight=this.retrieveMaxRowHeight(),this.suffixRanges=this.retrieveSuffixRanges()},r.prototype.defaults={sizeRangeSuffixes:{},thumbnailPath:void 0,rowHeight:120,maxRowHeight:!1,margins:1,border:-1,lastRow:"nojustify",justifyThreshold:.9,waitThumbnailsLoad:!0,captions:!0,cssAnimation:!0,imagesAnimationDuration:500,captionSettings:{animationDuration:500,visibleOpacity:.7,nonVisibleOpacity:0},rel:null,target:null,extension:/\.[^.\\/]+$/,refreshTime:200,refreshSensitivity:0,randomize:!1,rtl:!1,sort:!1,filter:!1,selector:"a, div:not(.spinner)",imgSelector:"> img, > a > img",triggerEvent:function(t){this.$gallery.trigger(t)}},g.fn.justifiedGallery=function(n){return this.each(function(t,i){var e=g(i);e.addClass("justified-gallery");var s=e.data("jg.controller");if(void 0===s){if(null!=n&&"object"!==g.type(n)){if("destroy"===n)return;throw"The argument must be an object"}s=new r(e,g.extend({},r.prototype.defaults,n)),e.data("jg.controller",s)}else if("norewind"===n);else{if("destroy"===n)return void s.destroy();s.updateSettings(n),s.rewind()}s.updateEntries("norewind"===n)&&s.init()})}});
\ No newline at end of file diff --git a/library/justifiedGallery/justifiedGallery.css b/library/justifiedGallery/justifiedGallery.css index 3b1da6850..8b753dc38 100644 --- a/library/justifiedGallery/justifiedGallery.css +++ b/library/justifiedGallery/justifiedGallery.css @@ -1,5 +1,5 @@ /*! - * Justified Gallery - v3.6.5 + * justifiedGallery - v3.7.0 * http://miromannino.github.io/Justified-Gallery/ * Copyright (c) 2018 Miro Mannino * Licensed under the MIT license. diff --git a/library/justifiedGallery/justifiedGallery.min.css b/library/justifiedGallery/justifiedGallery.min.css index ba8b177d7..8b753dc38 100644 --- a/library/justifiedGallery/justifiedGallery.min.css +++ b/library/justifiedGallery/justifiedGallery.min.css @@ -1,7 +1,102 @@ /*! - * Justified Gallery - v3.6.5 + * justifiedGallery - v3.7.0 * http://miromannino.github.io/Justified-Gallery/ * Copyright (c) 2018 Miro Mannino * Licensed under the MIT license. */ -.justified-gallery{width:100%;position:relative;overflow:hidden}.justified-gallery>a,.justified-gallery>div,.justified-gallery>figure{position:absolute;display:inline-block;overflow:hidden;filter:"alpha(opacity=10)";opacity:.1;margin:0;padding:0}.justified-gallery>a>img,.justified-gallery>div>img,.justified-gallery>figure>img,.justified-gallery>a>a>img,.justified-gallery>div>a>img,.justified-gallery>figure>a>img{position:absolute;top:50%;left:50%;margin:0;padding:0;border:0;filter:"alpha(opacity=0)";opacity:0}.justified-gallery>a>.caption,.justified-gallery>div>.caption,.justified-gallery>figure>.caption{display:none;position:absolute;bottom:0;padding:5px;background-color:#000;left:0;right:0;margin:0;color:#fff;font-size:12px;font-weight:300;font-family:sans-serif}.justified-gallery>a>.caption.caption-visible,.justified-gallery>div>.caption.caption-visible,.justified-gallery>figure>.caption.caption-visible{display:initial;filter:"alpha(opacity=70)";opacity:.7;-webkit-transition:opacity 500ms ease-in;-moz-transition:opacity 500ms ease-in;-o-transition:opacity 500ms ease-in;transition:opacity 500ms ease-in}.justified-gallery>.entry-visible{filter:"alpha(opacity=100)";opacity:1;background:0 0}.justified-gallery>.entry-visible>img,.justified-gallery>.entry-visible>a>img{filter:"alpha(opacity=100)";opacity:1;-webkit-transition:opacity 500ms ease-in;-moz-transition:opacity 500ms ease-in;-o-transition:opacity 500ms ease-in;transition:opacity 500ms ease-in}.justified-gallery>.jg-filtered{display:none}.justified-gallery>.spinner{position:absolute;bottom:0;margin-left:-24px;padding:10px 0;left:50%;filter:"alpha(opacity=100)";opacity:1;overflow:initial}.justified-gallery>.spinner>span{display:inline-block;filter:"alpha(opacity=0)";opacity:0;width:8px;height:8px;margin:0 4px;background-color:#000;border-radius:6px}
\ No newline at end of file +.justified-gallery { + width: 100%; + position: relative; + overflow: hidden; +} +.justified-gallery > a, +.justified-gallery > div, +.justified-gallery > figure { + position: absolute; + display: inline-block; + overflow: hidden; + /* background: #888888; To have gray placeholders while the gallery is loading with waitThumbnailsLoad = false */ + filter: "alpha(opacity=10)"; + opacity: 0.1; + margin: 0; + padding: 0; +} +.justified-gallery > a > img, +.justified-gallery > div > img, +.justified-gallery > figure > img, +.justified-gallery > a > a > img, +.justified-gallery > div > a > img, +.justified-gallery > figure > a > img { + position: absolute; + top: 50%; + left: 50%; + margin: 0; + padding: 0; + border: none; + filter: "alpha(opacity=0)"; + opacity: 0; +} +.justified-gallery > a > .caption, +.justified-gallery > div > .caption, +.justified-gallery > figure > .caption { + display: none; + position: absolute; + bottom: 0; + padding: 5px; + background-color: #000000; + left: 0; + right: 0; + margin: 0; + color: white; + font-size: 12px; + font-weight: 300; + font-family: sans-serif; +} +.justified-gallery > a > .caption.caption-visible, +.justified-gallery > div > .caption.caption-visible, +.justified-gallery > figure > .caption.caption-visible { + display: initial; + filter: "alpha(opacity=70)"; + opacity: 0.7; + -webkit-transition: opacity 500ms ease-in; + -moz-transition: opacity 500ms ease-in; + -o-transition: opacity 500ms ease-in; + transition: opacity 500ms ease-in; +} +.justified-gallery > .entry-visible { + filter: "alpha(opacity=100)"; + opacity: 1; + background: none; +} +.justified-gallery > .entry-visible > img, +.justified-gallery > .entry-visible > a > img { + filter: "alpha(opacity=100)"; + opacity: 1; + -webkit-transition: opacity 500ms ease-in; + -moz-transition: opacity 500ms ease-in; + -o-transition: opacity 500ms ease-in; + transition: opacity 500ms ease-in; +} +.justified-gallery > .jg-filtered { + display: none; +} +.justified-gallery > .spinner { + position: absolute; + bottom: 0; + margin-left: -24px; + padding: 10px 0 10px 0; + left: 50%; + filter: "alpha(opacity=100)"; + opacity: 1; + overflow: initial; +} +.justified-gallery > .spinner > span { + display: inline-block; + filter: "alpha(opacity=0)"; + opacity: 0; + width: 8px; + height: 8px; + margin: 0 4px 0 4px; + background-color: #000; + border-radius: 6px; +} diff --git a/library/textcomplete/textcomplete.js b/library/textcomplete/textcomplete.js new file mode 100644 index 000000000..5134be691 --- /dev/null +++ b/library/textcomplete/textcomplete.js @@ -0,0 +1,2409 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 5); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _strategy = __webpack_require__(2); + +var _strategy2 = _interopRequireDefault(_strategy); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * Encapsulate an result of each search results. + */ +var SearchResult = function () { + + /** + * @param {object} data - An element of array callbacked by search function. + */ + function SearchResult(data, term, strategy) { + _classCallCheck(this, SearchResult); + + this.data = data; + this.term = term; + this.strategy = strategy; + } + + _createClass(SearchResult, [{ + key: "replace", + value: function replace(beforeCursor, afterCursor) { + var replacement = this.strategy.replace(this.data); + if (replacement !== null) { + if (Array.isArray(replacement)) { + afterCursor = replacement[1] + afterCursor; + replacement = replacement[0]; + } + var match = this.strategy.matchText(beforeCursor); + if (match) { + replacement = replacement.replace(/\$&/g, match[0]).replace(/\$(\d)/g, function (_, p1) { + return match[parseInt(p1, 10)]; + }); + return [[beforeCursor.slice(0, match.index), replacement, beforeCursor.slice(match.index + match[0].length)].join(""), afterCursor]; + } + } + } + }, { + key: "render", + value: function render() { + return this.strategy.template(this.data, this.term); + } + }]); + + return SearchResult; +}(); + +exports.default = SearchResult; + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var has = Object.prototype.hasOwnProperty + , prefix = '~'; + +/** + * Constructor to create a storage for our `EE` objects. + * An `Events` instance is a plain object whose properties are event names. + * + * @constructor + * @api private + */ +function Events() {} + +// +// We try to not inherit from `Object.prototype`. In some engines creating an +// instance in this way is faster than calling `Object.create(null)` directly. +// If `Object.create(null)` is not supported we prefix the event names with a +// character to make sure that the built-in object properties are not +// overridden or used as an attack vector. +// +if (Object.create) { + Events.prototype = Object.create(null); + + // + // This hack is needed because the `__proto__` property is still inherited in + // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5. + // + if (!new Events().__proto__) prefix = false; +} + +/** + * Representation of a single event listener. + * + * @param {Function} fn The listener function. + * @param {Mixed} context The context to invoke the listener with. + * @param {Boolean} [once=false] Specify if the listener is a one-time listener. + * @constructor + * @api private + */ +function EE(fn, context, once) { + this.fn = fn; + this.context = context; + this.once = once || false; +} + +/** + * Minimal `EventEmitter` interface that is molded against the Node.js + * `EventEmitter` interface. + * + * @constructor + * @api public + */ +function EventEmitter() { + this._events = new Events(); + this._eventsCount = 0; +} + +/** + * Return an array listing the events for which the emitter has registered + * listeners. + * + * @returns {Array} + * @api public + */ +EventEmitter.prototype.eventNames = function eventNames() { + var names = [] + , events + , name; + + if (this._eventsCount === 0) return names; + + for (name in (events = this._events)) { + if (has.call(events, name)) names.push(prefix ? name.slice(1) : name); + } + + if (Object.getOwnPropertySymbols) { + return names.concat(Object.getOwnPropertySymbols(events)); + } + + return names; +}; + +/** + * Return the listeners registered for a given event. + * + * @param {String|Symbol} event The event name. + * @param {Boolean} exists Only check if there are listeners. + * @returns {Array|Boolean} + * @api public + */ +EventEmitter.prototype.listeners = function listeners(event, exists) { + var evt = prefix ? prefix + event : event + , available = this._events[evt]; + + if (exists) return !!available; + if (!available) return []; + if (available.fn) return [available.fn]; + + for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) { + ee[i] = available[i].fn; + } + + return ee; +}; + +/** + * Calls each of the listeners registered for a given event. + * + * @param {String|Symbol} event The event name. + * @returns {Boolean} `true` if the event had listeners, else `false`. + * @api public + */ +EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) { + var evt = prefix ? prefix + event : event; + + if (!this._events[evt]) return false; + + var listeners = this._events[evt] + , len = arguments.length + , args + , i; + + if (listeners.fn) { + if (listeners.once) this.removeListener(event, listeners.fn, undefined, true); + + switch (len) { + case 1: return listeners.fn.call(listeners.context), true; + case 2: return listeners.fn.call(listeners.context, a1), true; + case 3: return listeners.fn.call(listeners.context, a1, a2), true; + case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true; + case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true; + case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true; + } + + for (i = 1, args = new Array(len -1); i < len; i++) { + args[i - 1] = arguments[i]; + } + + listeners.fn.apply(listeners.context, args); + } else { + var length = listeners.length + , j; + + for (i = 0; i < length; i++) { + if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true); + + switch (len) { + case 1: listeners[i].fn.call(listeners[i].context); break; + case 2: listeners[i].fn.call(listeners[i].context, a1); break; + case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break; + case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break; + default: + if (!args) for (j = 1, args = new Array(len -1); j < len; j++) { + args[j - 1] = arguments[j]; + } + + listeners[i].fn.apply(listeners[i].context, args); + } + } + } + + return true; +}; + +/** + * Add a listener for a given event. + * + * @param {String|Symbol} event The event name. + * @param {Function} fn The listener function. + * @param {Mixed} [context=this] The context to invoke the listener with. + * @returns {EventEmitter} `this`. + * @api public + */ +EventEmitter.prototype.on = function on(event, fn, context) { + var listener = new EE(fn, context || this) + , evt = prefix ? prefix + event : event; + + if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++; + else if (!this._events[evt].fn) this._events[evt].push(listener); + else this._events[evt] = [this._events[evt], listener]; + + return this; +}; + +/** + * Add a one-time listener for a given event. + * + * @param {String|Symbol} event The event name. + * @param {Function} fn The listener function. + * @param {Mixed} [context=this] The context to invoke the listener with. + * @returns {EventEmitter} `this`. + * @api public + */ +EventEmitter.prototype.once = function once(event, fn, context) { + var listener = new EE(fn, context || this, true) + , evt = prefix ? prefix + event : event; + + if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++; + else if (!this._events[evt].fn) this._events[evt].push(listener); + else this._events[evt] = [this._events[evt], listener]; + + return this; +}; + +/** + * Remove the listeners of a given event. + * + * @param {String|Symbol} event The event name. + * @param {Function} fn Only remove the listeners that match this function. + * @param {Mixed} context Only remove the listeners that have this context. + * @param {Boolean} once Only remove one-time listeners. + * @returns {EventEmitter} `this`. + * @api public + */ +EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) { + var evt = prefix ? prefix + event : event; + + if (!this._events[evt]) return this; + if (!fn) { + if (--this._eventsCount === 0) this._events = new Events(); + else delete this._events[evt]; + return this; + } + + var listeners = this._events[evt]; + + if (listeners.fn) { + if ( + listeners.fn === fn + && (!once || listeners.once) + && (!context || listeners.context === context) + ) { + if (--this._eventsCount === 0) this._events = new Events(); + else delete this._events[evt]; + } + } else { + for (var i = 0, events = [], length = listeners.length; i < length; i++) { + if ( + listeners[i].fn !== fn + || (once && !listeners[i].once) + || (context && listeners[i].context !== context) + ) { + events.push(listeners[i]); + } + } + + // + // Reset the array, or remove it completely if we have no more listeners. + // + if (events.length) this._events[evt] = events.length === 1 ? events[0] : events; + else if (--this._eventsCount === 0) this._events = new Events(); + else delete this._events[evt]; + } + + return this; +}; + +/** + * Remove all listeners, or those of the specified event. + * + * @param {String|Symbol} [event] The event name. + * @returns {EventEmitter} `this`. + * @api public + */ +EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) { + var evt; + + if (event) { + evt = prefix ? prefix + event : event; + if (this._events[evt]) { + if (--this._eventsCount === 0) this._events = new Events(); + else delete this._events[evt]; + } + } else { + this._events = new Events(); + this._eventsCount = 0; + } + + return this; +}; + +// +// Alias methods names because people roll like that. +// +EventEmitter.prototype.off = EventEmitter.prototype.removeListener; +EventEmitter.prototype.addListener = EventEmitter.prototype.on; + +// +// This function doesn't apply anymore. +// +EventEmitter.prototype.setMaxListeners = function setMaxListeners() { + return this; +}; + +// +// Expose the prefix. +// +EventEmitter.prefixed = prefix; + +// +// Allow `EventEmitter` to be imported as module namespace. +// +EventEmitter.EventEmitter = EventEmitter; + +// +// Expose the module. +// +if (true) { + module.exports = EventEmitter; +} + + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var DEFAULT_INDEX = 2; + +function DEFAULT_TEMPLATE(value) { + return value; +} + +/** + * Properties for a strategy. + * + * @typedef + */ + +/** + * Encapsulate a single strategy. + */ +var Strategy = function () { + function Strategy(props) { + _classCallCheck(this, Strategy); + + this.props = props; + this.cache = props.cache ? {} : null; + } + + /** + * @return {this} + */ + + + _createClass(Strategy, [{ + key: "destroy", + value: function destroy() { + this.cache = null; + return this; + } + }, { + key: "search", + value: function search(term, callback, match) { + if (this.cache) { + this.searchWithCache(term, callback, match); + } else { + this.props.search(term, callback, match); + } + } + + /** + * @param {object} data - An element of array callbacked by search function. + */ + + }, { + key: "replace", + value: function replace(data) { + return this.props.replace(data); + } + + /** @private */ + + }, { + key: "searchWithCache", + value: function searchWithCache(term, callback, match) { + var _this = this; + + if (this.cache && this.cache[term]) { + callback(this.cache[term]); + } else { + this.props.search(term, function (results) { + if (_this.cache) { + _this.cache[term] = results; + } + callback(results); + }, match); + } + } + + /** @private */ + + }, { + key: "matchText", + value: function matchText(text) { + if (typeof this.match === "function") { + return this.match(text); + } else { + return text.match(this.match); + } + } + + /** @private */ + + }, { + key: "match", + get: function get() { + return this.props.match; + } + + /** @private */ + + }, { + key: "index", + get: function get() { + return typeof this.props.index === "number" ? this.props.index : DEFAULT_INDEX; + } + }, { + key: "template", + get: function get() { + return this.props.template || DEFAULT_TEMPLATE; + } + }]); + + return Strategy; +}(); + +exports.default = Strategy; + +/***/ }), +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.calculateElementOffset = calculateElementOffset; +exports.getLineHeightPx = getLineHeightPx; +exports.calculateLineHeightPx = calculateLineHeightPx; + + +/** + * Create a custom event + * + * @private + */ +var createCustomEvent = exports.createCustomEvent = function () { + if (typeof window.CustomEvent === "function") { + return function (type, options) { + return new document.defaultView.CustomEvent(type, { + cancelable: options && options.cancelable || false, + detail: options && options.detail || undefined + }); + }; + } else { + // Custom event polyfill from + // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#polyfill + return function (type, options) { + var event = document.createEvent("CustomEvent"); + event.initCustomEvent(type, + /* bubbles */false, options && options.cancelable || false, options && options.detail || undefined); + return event; + }; + } +} + +/** + * Get the current coordinates of the `el` relative to the document. + * + * @private + */ +();function calculateElementOffset(el) { + var rect = el.getBoundingClientRect(); + var _el$ownerDocument = el.ownerDocument, + defaultView = _el$ownerDocument.defaultView, + documentElement = _el$ownerDocument.documentElement; + + var offset = { + top: rect.top + defaultView.pageYOffset, + left: rect.left + defaultView.pageXOffset + }; + if (documentElement) { + offset.top -= documentElement.clientTop; + offset.left -= documentElement.clientLeft; + } + return offset; +} + +var CHAR_CODE_ZERO = "0".charCodeAt(0); +var CHAR_CODE_NINE = "9".charCodeAt(0); + +function isDigit(charCode) { + return charCode >= CHAR_CODE_ZERO && charCode <= CHAR_CODE_NINE; +} + +/** + * Returns the line-height of the given node in pixels. + * + * @private + */ +function getLineHeightPx(node) { + var computedStyle = window.getComputedStyle(node + + // If the char code starts with a digit, it is either a value in pixels, + // or unitless, as per: + // https://drafts.csswg.org/css2/visudet.html#propdef-line-height + // https://drafts.csswg.org/css2/cascade.html#computed-value + );if (isDigit(computedStyle.lineHeight.charCodeAt(0))) { + // In real browsers the value is *always* in pixels, even for unit-less + // line-heights. However, we still check as per the spec. + if (isDigit(computedStyle.lineHeight.charCodeAt(computedStyle.lineHeight.length - 1))) { + return parseFloat(computedStyle.lineHeight) * parseFloat(computedStyle.fontSize); + } else { + return parseFloat(computedStyle.lineHeight); + } + } + + // Otherwise, the value is "normal". + // If the line-height is "normal", calculate by font-size + return calculateLineHeightPx(node.nodeName, computedStyle); +} + +/** + * Returns calculated line-height of the given node in pixels. + * + * @private + */ +function calculateLineHeightPx(nodeName, computedStyle) { + var body = document.body; + if (!body) { + return 0; + } + + var tempNode = document.createElement(nodeName); + tempNode.innerHTML = " "; + tempNode.style.fontSize = computedStyle.fontSize; + tempNode.style.fontFamily = computedStyle.fontFamily; + tempNode.style.padding = "0"; + body.appendChild(tempNode + + // Make sure textarea has only 1 row + );if (tempNode instanceof HTMLTextAreaElement) { + ;tempNode.rows = 1; + } + + // Assume the height of the element is the line-height + var height = tempNode.offsetHeight; + body.removeChild(tempNode); + + return height; +} + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _eventemitter = __webpack_require__(1); + +var _eventemitter2 = _interopRequireDefault(_eventemitter); + +var _utils = __webpack_require__(3); + +var _search_result = __webpack_require__(0); + +var _search_result2 = _interopRequireDefault(_search_result); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +/*eslint no-unused-vars: off*/ + +/** + * Abstract class representing a editor target. + * + * Editor classes must implement `#applySearchResult`, `#getCursorOffset` and + * `#getBeforeCursor` methods. + * + * Editor classes must invoke `#emitMoveEvent`, `#emitEnterEvent`, + * `#emitChangeEvent` and `#emitEscEvent` at proper timing. + * + * @abstract + */ + + +/** @typedef */ +var Editor = function (_EventEmitter) { + _inherits(Editor, _EventEmitter); + + function Editor() { + _classCallCheck(this, Editor); + + return _possibleConstructorReturn(this, (Editor.__proto__ || Object.getPrototypeOf(Editor)).apply(this, arguments)); + } + + _createClass(Editor, [{ + key: "destroy", + + /** + * It is called when associated textcomplete object is destroyed. + * + * @return {this} + */ + value: function destroy() { + return this; + } + + /** + * It is called when a search result is selected by a user. + */ + + }, { + key: "applySearchResult", + value: function applySearchResult(_) { + throw new Error("Not implemented."); + } + + /** + * The input cursor's absolute coordinates from the window's left + * top corner. + */ + + }, { + key: "getCursorOffset", + value: function getCursorOffset() { + throw new Error("Not implemented."); + } + + /** + * Editor string value from head to cursor. + * Returns null if selection type is range not cursor. + */ + + }, { + key: "getBeforeCursor", + value: function getBeforeCursor() { + throw new Error("Not implemented."); + } + + /** + * Emit a move event, which moves active dropdown element. + * Child class must call this method at proper timing with proper parameter. + * + * @see {@link Textarea} for live example. + */ + + }, { + key: "emitMoveEvent", + value: function emitMoveEvent(code) { + var moveEvent = (0, _utils.createCustomEvent)("move", { + cancelable: true, + detail: { + code: code + } + }); + this.emit("move", moveEvent); + return moveEvent; + } + + /** + * Emit a enter event, which selects current search result. + * Child class must call this method at proper timing. + * + * @see {@link Textarea} for live example. + */ + + }, { + key: "emitEnterEvent", + value: function emitEnterEvent() { + var enterEvent = (0, _utils.createCustomEvent)("enter", { cancelable: true }); + this.emit("enter", enterEvent); + return enterEvent; + } + + /** + * Emit a change event, which triggers auto completion. + * Child class must call this method at proper timing. + * + * @see {@link Textarea} for live example. + */ + + }, { + key: "emitChangeEvent", + value: function emitChangeEvent() { + var changeEvent = (0, _utils.createCustomEvent)("change", { + detail: { + beforeCursor: this.getBeforeCursor() + } + }); + this.emit("change", changeEvent); + return changeEvent; + } + + /** + * Emit a esc event, which hides dropdown element. + * Child class must call this method at proper timing. + * + * @see {@link Textarea} for live example. + */ + + }, { + key: "emitEscEvent", + value: function emitEscEvent() { + var escEvent = (0, _utils.createCustomEvent)("esc", { cancelable: true }); + this.emit("esc", escEvent); + return escEvent; + } + + /** + * Helper method for parsing KeyboardEvent. + * + * @see {@link Textarea} for live example. + */ + + }, { + key: "getCode", + value: function getCode(e) { + return e.keyCode === 9 ? "ENTER" // tab + : e.keyCode === 13 ? "ENTER" // enter + : e.keyCode === 27 ? "ESC" // esc + : e.keyCode === 38 ? "UP" // up + : e.keyCode === 40 ? "DOWN" // down + : e.keyCode === 78 && e.ctrlKey ? "DOWN" // ctrl-n + : e.keyCode === 80 && e.ctrlKey ? "UP" // ctrl-p + : "OTHER"; + } + }]); + + return Editor; +}(_eventemitter2.default); + +exports.default = Editor; + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(global) { + +var _textcomplete = __webpack_require__(7); + +var _textcomplete2 = _interopRequireDefault(_textcomplete); + +var _textarea = __webpack_require__(12); + +var _textarea2 = _interopRequireDefault(_textarea); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var editors = void 0; +if (global.Textcomplete && global.Textcomplete.editors) { + editors = global.Textcomplete.editors; +} else { + editors = {}; +} +editors.Textarea = _textarea2.default; + +global.Textcomplete = _textcomplete2.default; +global.Textcomplete.editors = editors; +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(6))) + +/***/ }), +/* 6 */ +/***/ (function(module, exports) { + +var g;
+
+// This works in non-strict mode
+g = (function() {
+ return this;
+})();
+
+try {
+ // This works if eval is allowed (see CSP)
+ g = g || Function("return this")() || (1,eval)("this");
+} catch(e) {
+ // This works if the window reference is available
+ if(typeof window === "object")
+ g = window;
+}
+
+// g can still be undefined, but nothing to do about it...
+// We return undefined, instead of nothing here, so it's
+// easier to handle this case. if(!global) { ...}
+
+module.exports = g;
+ + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _completer = __webpack_require__(8); + +var _completer2 = _interopRequireDefault(_completer); + +var _editor = __webpack_require__(4); + +var _editor2 = _interopRequireDefault(_editor); + +var _dropdown = __webpack_require__(10); + +var _dropdown2 = _interopRequireDefault(_dropdown); + +var _strategy = __webpack_require__(2); + +var _strategy2 = _interopRequireDefault(_strategy); + +var _search_result = __webpack_require__(0); + +var _search_result2 = _interopRequireDefault(_search_result); + +var _eventemitter = __webpack_require__(1); + +var _eventemitter2 = _interopRequireDefault(_eventemitter); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var CALLBACK_METHODS = ["handleChange", "handleEnter", "handleEsc", "handleHit", "handleMove", "handleSelect"]; + +/** @typedef */ + +/** + * The core of textcomplete. It acts as a mediator. + */ +var Textcomplete = function (_EventEmitter) { + _inherits(Textcomplete, _EventEmitter); + + /** + * @param {Editor} editor - Where the textcomplete works on. + */ + function Textcomplete(editor) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, Textcomplete); + + var _this = _possibleConstructorReturn(this, (Textcomplete.__proto__ || Object.getPrototypeOf(Textcomplete)).call(this)); + + _this.completer = new _completer2.default(); + _this.isQueryInFlight = false; + _this.nextPendingQuery = null; + _this.dropdown = new _dropdown2.default(options.dropdown || {}); + _this.editor = editor; + _this.options = options; + + CALLBACK_METHODS.forEach(function (method) { + ;_this[method] = _this[method].bind(_this); + }); + + _this.startListening(); + return _this; + } + + /** + * @return {this} + */ + + + _createClass(Textcomplete, [{ + key: "destroy", + value: function destroy() { + var destroyEditor = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + this.completer.destroy(); + this.dropdown.destroy(); + if (destroyEditor) { + this.editor.destroy(); + } + this.stopListening(); + return this; + } + + /** + * @return {this} + */ + + }, { + key: "hide", + value: function hide() { + this.dropdown.deactivate(); + return this; + } + + /** + * @return {this} + * @example + * textcomplete.register([{ + * match: /(^|\s)(\w+)$/, + * search: function (term, callback) { + * $.ajax({ ... }) + * .done(callback) + * .fail([]); + * }, + * replace: function (value) { + * return '$1' + value + ' '; + * } + * }]); + */ + + }, { + key: "register", + value: function register(strategyPropsArray) { + var _this2 = this; + + strategyPropsArray.forEach(function (props) { + _this2.completer.registerStrategy(new _strategy2.default(props)); + }); + return this; + } + + /** + * Start autocompleting. + * + * @param {string} text - Head to input cursor. + * @return {this} + */ + + }, { + key: "trigger", + value: function trigger(text) { + if (this.isQueryInFlight) { + this.nextPendingQuery = text; + } else { + this.isQueryInFlight = true; + this.nextPendingQuery = null; + this.completer.run(text); + } + return this; + } + + /** @private */ + + }, { + key: "handleHit", + value: function handleHit(_ref) { + var searchResults = _ref.searchResults; + + if (searchResults.length) { + this.dropdown.render(searchResults, this.editor.getCursorOffset()); + } else { + this.dropdown.deactivate(); + } + this.isQueryInFlight = false; + if (this.nextPendingQuery !== null) { + this.trigger(this.nextPendingQuery); + } + } + + /** @private */ + + }, { + key: "handleMove", + value: function handleMove(e) { + e.detail.code === "UP" ? this.dropdown.up(e) : this.dropdown.down(e); + } + + /** @private */ + + }, { + key: "handleEnter", + value: function handleEnter(e) { + var activeItem = this.dropdown.getActiveItem(); + if (activeItem) { + this.dropdown.select(activeItem); + e.preventDefault(); + } else { + this.dropdown.deactivate(); + } + } + + /** @private */ + + }, { + key: "handleEsc", + value: function handleEsc(e) { + if (this.dropdown.shown) { + this.dropdown.deactivate(); + e.preventDefault(); + } + } + + /** @private */ + + }, { + key: "handleChange", + value: function handleChange(e) { + if (e.detail.beforeCursor != null) { + this.trigger(e.detail.beforeCursor); + } else { + this.dropdown.deactivate(); + } + } + + /** @private */ + + }, { + key: "handleSelect", + value: function handleSelect(selectEvent) { + this.emit("select", selectEvent); + if (!selectEvent.defaultPrevented) { + this.editor.applySearchResult(selectEvent.detail.searchResult); + } + } + + /** @private */ + + }, { + key: "startListening", + value: function startListening() { + var _this3 = this; + + this.editor.on("move", this.handleMove).on("enter", this.handleEnter).on("esc", this.handleEsc).on("change", this.handleChange); + this.dropdown.on("select", this.handleSelect);["show", "shown", "render", "rendered", "selected", "hidden", "hide"].forEach(function (eventName) { + _this3.dropdown.on(eventName, function () { + return _this3.emit(eventName); + }); + }); + this.completer.on("hit", this.handleHit); + } + + /** @private */ + + }, { + key: "stopListening", + value: function stopListening() { + this.completer.removeAllListeners(); + this.dropdown.removeAllListeners(); + this.editor.removeListener("move", this.handleMove).removeListener("enter", this.handleEnter).removeListener("esc", this.handleEsc).removeListener("change", this.handleChange); + } + }]); + + return Textcomplete; +}(_eventemitter2.default); + +exports.default = Textcomplete; + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _eventemitter = __webpack_require__(1); + +var _eventemitter2 = _interopRequireDefault(_eventemitter); + +var _query = __webpack_require__(9); + +var _query2 = _interopRequireDefault(_query); + +var _search_result = __webpack_require__(0); + +var _search_result2 = _interopRequireDefault(_search_result); + +var _strategy = __webpack_require__(2); + +var _strategy2 = _interopRequireDefault(_strategy); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var CALLBACK_METHODS = ["handleQueryResult"]; + +/** + * Complete engine. + */ + +var Completer = function (_EventEmitter) { + _inherits(Completer, _EventEmitter); + + function Completer() { + _classCallCheck(this, Completer); + + var _this = _possibleConstructorReturn(this, (Completer.__proto__ || Object.getPrototypeOf(Completer)).call(this)); + + _this.strategies = []; + + CALLBACK_METHODS.forEach(function (method) { + ;_this[method] = _this[method].bind(_this); + }); + return _this; + } + + /** + * @return {this} + */ + + + _createClass(Completer, [{ + key: "destroy", + value: function destroy() { + this.strategies.forEach(function (strategy) { + return strategy.destroy(); + }); + return this; + } + + /** + * Register a strategy to the completer. + * + * @return {this} + */ + + }, { + key: "registerStrategy", + value: function registerStrategy(strategy) { + this.strategies.push(strategy); + return this; + } + + /** + * @param {string} text - Head to input cursor. + */ + + }, { + key: "run", + value: function run(text) { + var query = this.extractQuery(text); + if (query) { + query.execute(this.handleQueryResult); + } else { + this.handleQueryResult([]); + } + } + + /** + * Find a query, which matches to the given text. + * + * @private + */ + + }, { + key: "extractQuery", + value: function extractQuery(text) { + for (var i = 0; i < this.strategies.length; i++) { + var query = _query2.default.build(this.strategies[i], text); + if (query) { + return query; + } + } + return null; + } + + /** + * Callbacked by {@link Query#execute}. + * + * @private + */ + + }, { + key: "handleQueryResult", + value: function handleQueryResult(searchResults) { + this.emit("hit", { searchResults: searchResults }); + } + }]); + + return Completer; +}(_eventemitter2.default); + +exports.default = Completer; + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _search_result = __webpack_require__(0); + +var _search_result2 = _interopRequireDefault(_search_result); + +var _strategy = __webpack_require__(2); + +var _strategy2 = _interopRequireDefault(_strategy); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * Encapsulate matching condition between a Strategy and current editor's value. + */ +var Query = function () { + _createClass(Query, null, [{ + key: "build", + + + /** + * Build a Query object by the given string if this matches to the string. + * + * @param {string} text - Head to input cursor. + */ + value: function build(strategy, text) { + if (typeof strategy.props.context === "function") { + var context = strategy.props.context(text); + if (typeof context === "string") { + text = context; + } else if (!context) { + return null; + } + } + var match = strategy.matchText(text); + return match ? new Query(strategy, match[strategy.index], match) : null; + } + }]); + + function Query(strategy, term, match) { + _classCallCheck(this, Query); + + this.strategy = strategy; + this.term = term; + this.match = match; + } + + /** + * Invoke search strategy and callback the given function. + */ + + + _createClass(Query, [{ + key: "execute", + value: function execute(callback) { + var _this = this; + + this.strategy.search(this.term, function (results) { + callback(results.map(function (result) { + return new _search_result2.default(result, _this.term, _this.strategy); + })); + }, this.match); + } + }]); + + return Query; +}(); + +exports.default = Query; + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _eventemitter = __webpack_require__(1); + +var _eventemitter2 = _interopRequireDefault(_eventemitter); + +var _dropdown_item = __webpack_require__(11); + +var _dropdown_item2 = _interopRequireDefault(_dropdown_item); + +var _search_result = __webpack_require__(0); + +var _search_result2 = _interopRequireDefault(_search_result); + +var _utils = __webpack_require__(3); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var DEFAULT_CLASS_NAME = "dropdown-menu textcomplete-dropdown"; + +/** @typedef */ + +/** + * Encapsulate a dropdown view. + * + * @prop {boolean} shown - Whether the #el is shown or not. + * @prop {DropdownItem[]} items - The array of rendered dropdown items. + */ +var Dropdown = function (_EventEmitter) { + _inherits(Dropdown, _EventEmitter); + + _createClass(Dropdown, null, [{ + key: "createElement", + value: function createElement() { + var el = document.createElement("ul"); + var style = el.style; + style.display = "none"; + style.position = "absolute"; + style.zIndex = "10000"; + var body = document.body; + if (body) { + body.appendChild(el); + } + return el; + } + }]); + + function Dropdown(options) { + _classCallCheck(this, Dropdown); + + var _this = _possibleConstructorReturn(this, (Dropdown.__proto__ || Object.getPrototypeOf(Dropdown)).call(this)); + + _this.shown = false; + _this.items = []; + _this.activeItem = null; + _this.footer = options.footer; + _this.header = options.header; + _this.maxCount = options.maxCount || 10; + _this.el.className = options.className || DEFAULT_CLASS_NAME; + _this.rotate = options.hasOwnProperty("rotate") ? options.rotate : true; + _this.placement = options.placement; + _this.itemOptions = options.item || {}; + var style = options.style; + if (style) { + Object.keys(style).forEach(function (key) { + ;_this.el.style[key] = style[key]; + }); + } + return _this; + } + + /** + * @return {this} + */ + + + _createClass(Dropdown, [{ + key: "destroy", + value: function destroy() { + var parentNode = this.el.parentNode; + if (parentNode) { + parentNode.removeChild(this.el); + } + this.clear()._el = null; + return this; + } + }, { + key: "render", + + + /** + * Render the given data as dropdown items. + * + * @return {this} + */ + value: function render(searchResults, cursorOffset) { + var _this2 = this; + + var renderEvent = (0, _utils.createCustomEvent)("render", { cancelable: true }); + this.emit("render", renderEvent); + if (renderEvent.defaultPrevented) { + return this; + } + var rawResults = searchResults.map(function (searchResult) { + return searchResult.data; + }); + var dropdownItems = searchResults.slice(0, this.maxCount || searchResults.length).map(function (searchResult) { + return new _dropdown_item2.default(searchResult, _this2.itemOptions); + }); + this.clear().setStrategyId(searchResults[0]).renderEdge(rawResults, "header").append(dropdownItems).renderEdge(rawResults, "footer").show().setOffset(cursorOffset); + this.emit("rendered", (0, _utils.createCustomEvent)("rendered")); + return this; + } + + /** + * Hide the dropdown then sweep out items. + * + * @return {this} + */ + + }, { + key: "deactivate", + value: function deactivate() { + return this.hide().clear(); + } + + /** + * @return {this} + */ + + }, { + key: "select", + value: function select(dropdownItem) { + var detail = { searchResult: dropdownItem.searchResult }; + var selectEvent = (0, _utils.createCustomEvent)("select", { + cancelable: true, + detail: detail + }); + this.emit("select", selectEvent); + if (selectEvent.defaultPrevented) { + return this; + } + this.deactivate(); + this.emit("selected", (0, _utils.createCustomEvent)("selected", { detail: detail })); + return this; + } + + /** + * @return {this} + */ + + }, { + key: "up", + value: function up(e) { + return this.shown ? this.moveActiveItem("prev", e) : this; + } + + /** + * @return {this} + */ + + }, { + key: "down", + value: function down(e) { + return this.shown ? this.moveActiveItem("next", e) : this; + } + + /** + * Retrieve the active item. + */ + + }, { + key: "getActiveItem", + value: function getActiveItem() { + return this.activeItem; + } + + /** + * Add items to dropdown. + * + * @private + */ + + }, { + key: "append", + value: function append(items) { + var _this3 = this; + + var fragment = document.createDocumentFragment(); + items.forEach(function (item) { + _this3.items.push(item); + item.appended(_this3); + fragment.appendChild(item.el); + }); + this.el.appendChild(fragment); + return this; + } + + /** @private */ + + }, { + key: "setOffset", + value: function setOffset(cursorOffset) { + var doc = document.documentElement; + if (doc) { + var elementWidth = this.el.offsetWidth; + if (cursorOffset.left) { + var browserWidth = doc.clientWidth; + if (cursorOffset.left + elementWidth > browserWidth) { + cursorOffset.left = browserWidth - elementWidth; + } + this.el.style.left = cursorOffset.left + "px"; + } else if (cursorOffset.right) { + if (cursorOffset.right - elementWidth < 0) { + cursorOffset.right = 0; + } + this.el.style.right = cursorOffset.right + "px"; + } + if (this.isPlacementTop()) { + this.el.style.bottom = doc.clientHeight - cursorOffset.top + cursorOffset.lineHeight + "px"; + } else { + this.el.style.top = cursorOffset.top + "px"; + } + } + return this; + } + + /** + * Show the element. + * + * @private + */ + + }, { + key: "show", + value: function show() { + if (!this.shown) { + var showEvent = (0, _utils.createCustomEvent)("show", { cancelable: true }); + this.emit("show", showEvent); + if (showEvent.defaultPrevented) { + return this; + } + this.el.style.display = "block"; + this.shown = true; + this.emit("shown", (0, _utils.createCustomEvent)("shown")); + } + return this; + } + + /** + * Hide the element. + * + * @private + */ + + }, { + key: "hide", + value: function hide() { + if (this.shown) { + var hideEvent = (0, _utils.createCustomEvent)("hide", { cancelable: true }); + this.emit("hide", hideEvent); + if (hideEvent.defaultPrevented) { + return this; + } + this.el.style.display = "none"; + this.shown = false; + this.emit("hidden", (0, _utils.createCustomEvent)("hidden")); + } + return this; + } + + /** + * Clear search results. + * + * @private + */ + + }, { + key: "clear", + value: function clear() { + this.el.innerHTML = ""; + this.items.forEach(function (item) { + return item.destroy(); + }); + this.items = []; + return this; + } + + /** @private */ + + }, { + key: "moveActiveItem", + value: function moveActiveItem(direction, e) { + var nextActiveItem = direction === "next" ? this.activeItem ? this.activeItem.next : this.items[0] : this.activeItem ? this.activeItem.prev : this.items[this.items.length - 1]; + if (nextActiveItem) { + nextActiveItem.activate(); + e.preventDefault(); + } + return this; + } + + /** @private */ + + }, { + key: "setStrategyId", + value: function setStrategyId(searchResult) { + var strategyId = searchResult && searchResult.strategy.props.id; + if (strategyId) { + this.el.setAttribute("data-strategy", strategyId); + } else { + this.el.removeAttribute("data-strategy"); + } + return this; + } + + /** + * @private + * @param {object[]} rawResults - What callbacked by search function. + */ + + }, { + key: "renderEdge", + value: function renderEdge(rawResults, type) { + var source = (type === "header" ? this.header : this.footer) || ""; + var content = typeof source === "function" ? source(rawResults) : source; + var li = document.createElement("li"); + li.classList.add("textcomplete-" + type); + li.innerHTML = content; + this.el.appendChild(li); + return this; + } + + /** @private */ + + }, { + key: "isPlacementTop", + value: function isPlacementTop() { + return this.placement === "top"; + } + }, { + key: "el", + get: function get() { + if (!this._el) { + this._el = Dropdown.createElement(); + } + return this._el; + } + }]); + + return Dropdown; +}(_eventemitter2.default); + +exports.default = Dropdown; + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.DEFAULT_CLASS_NAME = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _search_result = __webpack_require__(0); + +var _search_result2 = _interopRequireDefault(_search_result); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var DEFAULT_CLASS_NAME = exports.DEFAULT_CLASS_NAME = "textcomplete-item"; +var CALLBACK_METHODS = ["onClick", "onMouseover"]; + +/** @typedef */ + + +// Declare interface instead of importing Dropdown itself to prevent circular dependency. + +/** + * Encapsulate an item of dropdown. + */ +var DropdownItem = function () { + function DropdownItem(searchResult, options) { + var _this = this; + + _classCallCheck(this, DropdownItem); + + this.searchResult = searchResult; + this.active = false; + this.className = options.className || DEFAULT_CLASS_NAME; + this.activeClassName = this.className + " active"; + + CALLBACK_METHODS.forEach(function (method) { + ;_this[method] = _this[method].bind(_this); + }); + } + + _createClass(DropdownItem, [{ + key: "destroy", + + + /** + * Try to free resources and perform other cleanup operations. + */ + value: function destroy() { + this.el.removeEventListener("mousedown", this.onClick, false); + this.el.removeEventListener("mouseover", this.onMouseover, false); + this.el.removeEventListener("touchstart", this.onClick, false); + if (this.active) { + this.dropdown.activeItem = null; + } + // This element has already been removed by {@link Dropdown#clear}. + this._el = null; + } + + /** + * Callbacked when it is appended to a dropdown. + * + * @see Dropdown#append + */ + + }, { + key: "appended", + value: function appended(dropdown) { + this.dropdown = dropdown; + this.siblings = dropdown.items; + this.index = this.siblings.length - 1; + } + + /** + * Deactivate active item then activate itself. + * + * @return {this} + */ + + }, { + key: "activate", + value: function activate() { + if (!this.active) { + var _activeItem = this.dropdown.getActiveItem(); + if (_activeItem) { + _activeItem.deactivate(); + } + this.dropdown.activeItem = this; + this.active = true; + this.el.className = this.activeClassName; + } + return this; + } + + /** + * Get the next sibling. + */ + + }, { + key: "deactivate", + + + /** @private */ + value: function deactivate() { + if (this.active) { + this.active = false; + this.el.className = this.className; + this.dropdown.activeItem = null; + } + return this; + } + + /** @private */ + + }, { + key: "onClick", + value: function onClick(e) { + e.preventDefault // Prevent blur event + ();this.dropdown.select(this); + } + + /** @private */ + + }, { + key: "onMouseover", + value: function onMouseover() { + this.activate(); + } + }, { + key: "el", + get: function get() { + if (this._el) { + return this._el; + } + var li = document.createElement("li"); + li.className = this.active ? this.activeClassName : this.className; + var a = document.createElement("a"); + a.innerHTML = this.searchResult.render(); + li.appendChild(a); + this._el = li; + li.addEventListener("mousedown", this.onClick); + li.addEventListener("mouseover", this.onMouseover); + li.addEventListener("touchstart", this.onClick); + return li; + } + }, { + key: "next", + get: function get() { + var nextIndex = void 0; + if (this.index === this.siblings.length - 1) { + if (!this.dropdown.rotate) { + return null; + } + nextIndex = 0; + } else { + nextIndex = this.index + 1; + } + return this.siblings[nextIndex]; + } + + /** + * Get the previous sibling. + */ + + }, { + key: "prev", + get: function get() { + var nextIndex = void 0; + if (this.index === 0) { + if (!this.dropdown.rotate) { + return null; + } + nextIndex = this.siblings.length - 1; + } else { + nextIndex = this.index - 1; + } + return this.siblings[nextIndex]; + } + }]); + + return DropdownItem; +}(); + +exports.default = DropdownItem; + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _update = __webpack_require__(13); + +var _update2 = _interopRequireDefault(_update); + +var _editor = __webpack_require__(4); + +var _editor2 = _interopRequireDefault(_editor); + +var _utils = __webpack_require__(3); + +var _search_result = __webpack_require__(0); + +var _search_result2 = _interopRequireDefault(_search_result); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var getCaretCoordinates = __webpack_require__(14); + +var CALLBACK_METHODS = ["onInput", "onKeydown"]; + +/** + * Encapsulate the target textarea element. + */ + +var Textarea = function (_Editor) { + _inherits(Textarea, _Editor); + + /** + * @param {HTMLTextAreaElement} el - Where the textcomplete works on. + */ + function Textarea(el) { + _classCallCheck(this, Textarea); + + var _this = _possibleConstructorReturn(this, (Textarea.__proto__ || Object.getPrototypeOf(Textarea)).call(this)); + + _this.el = el; + + CALLBACK_METHODS.forEach(function (method) { + ;_this[method] = _this[method].bind(_this); + }); + + _this.startListening(); + return _this; + } + + /** + * @return {this} + */ + + + _createClass(Textarea, [{ + key: "destroy", + value: function destroy() { + _get(Textarea.prototype.__proto__ || Object.getPrototypeOf(Textarea.prototype), "destroy", this).call(this); + this.stopListening + // Release the element reference early to help garbage collection. + ();this.el = null; + return this; + } + + /** + * Implementation for {@link Editor#applySearchResult} + */ + + }, { + key: "applySearchResult", + value: function applySearchResult(searchResult) { + var before = this.getBeforeCursor(); + if (before != null) { + var replace = searchResult.replace(before, this.getAfterCursor()); + this.el.focus // Clicking a dropdown item removes focus from the element. + ();if (Array.isArray(replace)) { + (0, _update2.default)(this.el, replace[0], replace[1]); + this.el.dispatchEvent(new Event("input")); + } + } + } + + /** + * Implementation for {@link Editor#getCursorOffset} + */ + + }, { + key: "getCursorOffset", + value: function getCursorOffset() { + var elOffset = (0, _utils.calculateElementOffset)(this.el); + var elScroll = this.getElScroll(); + var cursorPosition = this.getCursorPosition(); + var lineHeight = (0, _utils.getLineHeightPx)(this.el); + var top = elOffset.top - elScroll.top + cursorPosition.top + lineHeight; + var left = elOffset.left - elScroll.left + cursorPosition.left; + if (this.el.dir !== "rtl") { + return { top: top, left: left, lineHeight: lineHeight }; + } else { + var right = document.documentElement ? document.documentElement.clientWidth - left : 0; + return { top: top, right: right, lineHeight: lineHeight }; + } + } + + /** + * Implementation for {@link Editor#getBeforeCursor} + */ + + }, { + key: "getBeforeCursor", + value: function getBeforeCursor() { + return this.el.selectionStart !== this.el.selectionEnd ? null : this.el.value.substring(0, this.el.selectionEnd); + } + + /** @private */ + + }, { + key: "getAfterCursor", + value: function getAfterCursor() { + return this.el.value.substring(this.el.selectionEnd); + } + + /** @private */ + + }, { + key: "getElScroll", + value: function getElScroll() { + return { top: this.el.scrollTop, left: this.el.scrollLeft }; + } + + /** + * The input cursor's relative coordinates from the textarea's left + * top corner. + * + * @private + */ + + }, { + key: "getCursorPosition", + value: function getCursorPosition() { + return getCaretCoordinates(this.el, this.el.selectionEnd); + } + + /** @private */ + + }, { + key: "onInput", + value: function onInput() { + this.emitChangeEvent(); + } + + /** @private */ + + }, { + key: "onKeydown", + value: function onKeydown(e) { + var code = this.getCode(e); + var event = void 0; + if (code === "UP" || code === "DOWN") { + event = this.emitMoveEvent(code); + } else if (code === "ENTER") { + event = this.emitEnterEvent(); + } else if (code === "ESC") { + event = this.emitEscEvent(); + } + if (event && event.defaultPrevented) { + e.preventDefault(); + } + } + + /** @private */ + + }, { + key: "startListening", + value: function startListening() { + this.el.addEventListener("input", this.onInput); + this.el.addEventListener("keydown", this.onKeydown); + } + + /** @private */ + + }, { + key: "stopListening", + value: function stopListening() { + this.el.removeEventListener("input", this.onInput); + this.el.removeEventListener("keydown", this.onKeydown); + } + }]); + + return Textarea; +}(_editor2.default); + +exports.default = Textarea; + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +exports.default = function (el, headToCursor, cursorToTail) { + var curr = el.value, + // strA + strB1 + strC + next = headToCursor + (cursorToTail || ''), + // strA + strB2 + strC + activeElement = document.activeElement; + + // Calculate length of strA and strC + var aLength = 0, + cLength = 0; + while (aLength < curr.length && aLength < next.length && curr[aLength] === next[aLength]) { + aLength++; + } + while (curr.length - cLength - 1 >= 0 && next.length - cLength - 1 >= 0 && curr[curr.length - cLength - 1] === next[next.length - cLength - 1]) { + cLength++; + } + aLength = Math.min(aLength, Math.min(curr.length, next.length) - cLength); + + // Select strB1 + el.setSelectionRange(aLength, curr.length - cLength); + + // Get strB2 + var strB2 = next.substring(aLength, next.length - cLength); + + // Replace strB1 with strB2 + el.focus(); + if (!document.execCommand('insertText', false, strB2)) { + // Document.execCommand returns false if the command is not supported. + // Firefox and IE returns false in this case. + el.value = next; + el.dispatchEvent(createInputEvent()); + } + + // Move cursor to the end of headToCursor + el.setSelectionRange(headToCursor.length, headToCursor.length); + + activeElement && activeElement.focus(); + return el; +}; + +function createInputEvent() { + if (typeof Event !== "undefined") { + return new Event("input", { bubbles: true, cancelable: true }); + } else { + var event = document.createEvent("Event"); + event.initEvent("input", true, true); + return event; + } +} + +/***/ }), +/* 14 */ +/***/ (function(module, exports) { + +/* jshint browser: true */ + +(function () { + +// The properties that we copy into a mirrored div. +// Note that some browsers, such as Firefox, +// do not concatenate properties, i.e. padding-top, bottom etc. -> padding, +// so we have to do every single property specifically. +var properties = [ + 'direction', // RTL support + 'boxSizing', + 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does + 'height', + 'overflowX', + 'overflowY', // copy the scrollbar for IE + + 'borderTopWidth', + 'borderRightWidth', + 'borderBottomWidth', + 'borderLeftWidth', + 'borderStyle', + + 'paddingTop', + 'paddingRight', + 'paddingBottom', + 'paddingLeft', + + // https://developer.mozilla.org/en-US/docs/Web/CSS/font + 'fontStyle', + 'fontVariant', + 'fontWeight', + 'fontStretch', + 'fontSize', + 'fontSizeAdjust', + 'lineHeight', + 'fontFamily', + + 'textAlign', + 'textTransform', + 'textIndent', + 'textDecoration', // might not make a difference, but better be safe + + 'letterSpacing', + 'wordSpacing', + + 'tabSize', + 'MozTabSize' + +]; + +var isBrowser = (typeof window !== 'undefined'); +var isFirefox = (isBrowser && window.mozInnerScreenX != null); + +function getCaretCoordinates(element, position, options) { + if(!isBrowser) { + throw new Error('textarea-caret-position#getCaretCoordinates should only be called in a browser'); + } + + var debug = options && options.debug || false; + if (debug) { + var el = document.querySelector('#input-textarea-caret-position-mirror-div'); + if ( el ) { el.parentNode.removeChild(el); } + } + + // mirrored div + var div = document.createElement('div'); + div.id = 'input-textarea-caret-position-mirror-div'; + document.body.appendChild(div); + + var style = div.style; + var computed = window.getComputedStyle? getComputedStyle(element) : element.currentStyle; // currentStyle for IE < 9 + + // default textarea styles + style.whiteSpace = 'pre-wrap'; + if (element.nodeName !== 'INPUT') + style.wordWrap = 'break-word'; // only for textarea-s + + // position off-screen + style.position = 'absolute'; // required to return coordinates properly + if (!debug) + style.visibility = 'hidden'; // not 'display: none' because we want rendering + + // transfer the element's properties to the div + properties.forEach(function (prop) { + style[prop] = computed[prop]; + }); + + if (isFirefox) { + // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275 + if (element.scrollHeight > parseInt(computed.height)) + style.overflowY = 'scroll'; + } else { + style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll' + } + + div.textContent = element.value.substring(0, position); + // the second special handling for input type="text" vs textarea: spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037 + if (element.nodeName === 'INPUT') + div.textContent = div.textContent.replace(/\s/g, '\u00a0'); + + var span = document.createElement('span'); + // Wrapping must be replicated *exactly*, including when a long word gets + // onto the next line, with whitespace at the end of the line before (#7). + // The *only* reliable way to do that is to copy the *entire* rest of the + // textarea's content into the <span> created at the caret position. + // for inputs, just '.' would be enough, but why bother? + span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all + div.appendChild(span); + + var coordinates = { + top: span.offsetTop + parseInt(computed['borderTopWidth']), + left: span.offsetLeft + parseInt(computed['borderLeftWidth']) + }; + + if (debug) { + span.style.backgroundColor = '#aaa'; + } else { + document.body.removeChild(div); + } + + return coordinates; +} + +if (typeof module != 'undefined' && typeof module.exports != 'undefined') { + module.exports = getCaretCoordinates; +} else if(isBrowser){ + window.getCaretCoordinates = getCaretCoordinates; +} + +}()); + + +/***/ }) +/******/ ]); +//# sourceMappingURL=textcomplete.js.map
\ No newline at end of file diff --git a/library/textcomplete/textcomplete.js.map b/library/textcomplete/textcomplete.js.map new file mode 100644 index 000000000..42ed11883 --- /dev/null +++ b/library/textcomplete/textcomplete.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap 0bc74e584933ddf1c7ac","webpack:///./src/search_result.js","webpack:///./node_modules/eventemitter3/index.js","webpack:///./src/strategy.js","webpack:///./src/utils.js","webpack:///./src/editor.js","webpack:///./src/main.js","webpack:///(webpack)/buildin/global.js","webpack:///./src/textcomplete.js","webpack:///./src/completer.js","webpack:///./src/query.js","webpack:///./src/dropdown.js","webpack:///./src/dropdown_item.js","webpack:///./src/textarea.js","webpack:///./node_modules/undate/lib/update.js","webpack:///./node_modules/textarea-caret/index.js"],"names":["SearchResult","data","term","strategy","beforeCursor","afterCursor","replacement","replace","Array","isArray","match","matchText","_","p1","parseInt","slice","index","length","join","template","DEFAULT_INDEX","DEFAULT_TEMPLATE","value","Strategy","props","cache","callback","searchWithCache","search","results","text","calculateElementOffset","getLineHeightPx","calculateLineHeightPx","createCustomEvent","window","CustomEvent","type","options","document","defaultView","cancelable","detail","undefined","event","createEvent","initCustomEvent","el","rect","getBoundingClientRect","ownerDocument","documentElement","offset","top","pageYOffset","left","pageXOffset","clientTop","clientLeft","CHAR_CODE_ZERO","charCodeAt","CHAR_CODE_NINE","isDigit","charCode","node","computedStyle","getComputedStyle","lineHeight","parseFloat","fontSize","nodeName","body","tempNode","createElement","innerHTML","style","fontFamily","padding","appendChild","HTMLTextAreaElement","rows","height","offsetHeight","removeChild","Editor","Error","code","moveEvent","emit","enterEvent","changeEvent","getBeforeCursor","escEvent","e","keyCode","ctrlKey","editors","global","Textcomplete","Textarea","CALLBACK_METHODS","editor","completer","isQueryInFlight","nextPendingQuery","dropdown","forEach","method","bind","startListening","destroyEditor","destroy","stopListening","deactivate","strategyPropsArray","registerStrategy","run","searchResults","render","getCursorOffset","trigger","up","down","activeItem","getActiveItem","select","preventDefault","shown","selectEvent","defaultPrevented","applySearchResult","searchResult","on","handleMove","handleEnter","handleEsc","handleChange","handleSelect","eventName","handleHit","removeAllListeners","removeListener","Completer","strategies","push","query","extractQuery","execute","handleQueryResult","i","build","Query","context","map","result","DEFAULT_CLASS_NAME","Dropdown","display","position","zIndex","items","footer","header","maxCount","className","rotate","hasOwnProperty","placement","itemOptions","item","Object","keys","key","parentNode","clear","_el","cursorOffset","renderEvent","rawResults","dropdownItems","setStrategyId","renderEdge","append","show","setOffset","hide","dropdownItem","moveActiveItem","fragment","createDocumentFragment","appended","doc","elementWidth","offsetWidth","browserWidth","clientWidth","right","isPlacementTop","bottom","clientHeight","showEvent","hideEvent","direction","nextActiveItem","next","prev","activate","strategyId","id","setAttribute","removeAttribute","source","content","li","classList","add","DropdownItem","active","activeClassName","removeEventListener","onClick","onMouseover","siblings","a","addEventListener","nextIndex","getCaretCoordinates","require","before","getAfterCursor","focus","dispatchEvent","Event","elOffset","elScroll","getElScroll","cursorPosition","getCursorPosition","dir","selectionStart","selectionEnd","substring","scrollTop","scrollLeft","emitChangeEvent","getCode","emitMoveEvent","emitEnterEvent","emitEscEvent","onInput","onKeydown"],"mappings":";AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;AC3DA;;;;;;;;AAEA;;;IAGqBA,Y;;AAKnB;;;AAGA,wBAAYC,IAAZ,EAA0BC,IAA1B,EAAwCC,QAAxC,EAA4D;AAAA;;AAC1D,SAAKF,IAAL,GAAYA,IAAZ;AACA,SAAKC,IAAL,GAAYA,IAAZ;AACA,SAAKC,QAAL,GAAgBA,QAAhB;AACD;;;;4BAEOC,Y,EAAsBC,W,EAAqB;AACjD,UAAIC,cAAc,KAAKH,QAAL,CAAcI,OAAd,CAAsB,KAAKN,IAA3B,CAAlB;AACA,UAAIK,gBAAgB,IAApB,EAA0B;AACxB,YAAIE,MAAMC,OAAN,CAAcH,WAAd,CAAJ,EAAgC;AAC9BD,wBAAcC,YAAY,CAAZ,IAAiBD,WAA/B;AACAC,wBAAcA,YAAY,CAAZ,CAAd;AACD;AACD,YAAMI,QAAQ,KAAKP,QAAL,CAAcQ,SAAd,CAAwBP,YAAxB,CAAd;AACA,YAAIM,KAAJ,EAAW;AACTJ,wBAAcA,YACXC,OADW,CACH,MADG,EACKG,MAAM,CAAN,CADL,EAEXH,OAFW,CAEH,SAFG,EAEQ,UAACK,CAAD,EAAIC,EAAJ;AAAA,mBAAWH,MAAMI,SAASD,EAAT,EAAa,EAAb,CAAN,CAAX;AAAA,WAFR,CAAd;AAGA,iBAAO,CACL,CACET,aAAaW,KAAb,CAAmB,CAAnB,EAAsBL,MAAMM,KAA5B,CADF,EAEEV,WAFF,EAGEF,aAAaW,KAAb,CAAmBL,MAAMM,KAAN,GAAcN,MAAM,CAAN,EAASO,MAA1C,CAHF,EAIEC,IAJF,CAIO,EAJP,CADK,EAMLb,WANK,CAAP;AAQD;AACF;AACF;;;6BAEgB;AACf,aAAO,KAAKF,QAAL,CAAcgB,QAAd,CAAuB,KAAKlB,IAA5B,EAAkC,KAAKC,IAAvC,CAAP;AACD;;;;;;kBAxCkBF,Y;;;;;;;ACPrB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,QAAQ;AACnB,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,0DAA0D,OAAO;AACjE;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yCAAyC,SAAS;AAClD;AACA;;AAEA;AACA,GAAG;AACH;AACA;;AAEA,eAAe,YAAY;AAC3B;;AAEA;AACA,2DAA2D;AAC3D,+DAA+D;AAC/D,mEAAmE;AACnE,uEAAuE;AACvE;AACA,0DAA0D,SAAS;AACnE;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,SAAS;AACpB,WAAW,MAAM;AACjB,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,SAAS;AACpB,WAAW,MAAM;AACjB,aAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,SAAS;AACpB,WAAW,MAAM;AACjB,WAAW,QAAQ;AACnB,aAAa,aAAa;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,2DAA2D,YAAY;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAW,cAAc;AACzB,aAAa,aAAa;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;AC9SA,IAAMoB,gBAAgB,CAAtB;;AAEA,SAASC,gBAAT,CAA0BC,KAA1B,EAAiC;AAC/B,SAAOA,KAAP;AACD;;AAED;;;;;;AAgBA;;;IAGqBC,Q;AAInB,oBAAYC,KAAZ,EAAuC;AAAA;;AACrC,SAAKA,KAAL,GAAaA,KAAb;AACA,SAAKC,KAAL,GAAaD,MAAMC,KAAN,GAAc,EAAd,GAAmB,IAAhC;AACD;;AAED;;;;;;;8BAGU;AACR,WAAKA,KAAL,GAAa,IAAb;AACA,aAAO,IAAP;AACD;;;2BAEMvB,I,EAAcwB,Q,EAAoBhB,K,EAAwB;AAC/D,UAAI,KAAKe,KAAT,EAAgB;AACd,aAAKE,eAAL,CAAqBzB,IAArB,EAA2BwB,QAA3B,EAAqChB,KAArC;AACD,OAFD,MAEO;AACL,aAAKc,KAAL,CAAWI,MAAX,CAAkB1B,IAAlB,EAAwBwB,QAAxB,EAAkChB,KAAlC;AACD;AACF;;AAED;;;;;;4BAGQT,I,EAAW;AACjB,aAAO,KAAKuB,KAAL,CAAWjB,OAAX,CAAmBN,IAAnB,CAAP;AACD;;AAED;;;;oCACgBC,I,EAAcwB,Q,EAAoBhB,K,EAAwB;AAAA;;AACxE,UAAI,KAAKe,KAAL,IAAc,KAAKA,KAAL,CAAWvB,IAAX,CAAlB,EAAoC;AAClCwB,iBAAS,KAAKD,KAAL,CAAWvB,IAAX,CAAT;AACD,OAFD,MAEO;AACL,aAAKsB,KAAL,CAAWI,MAAX,CACE1B,IADF,EAEE,mBAAW;AACT,cAAI,MAAKuB,KAAT,EAAgB;AACd,kBAAKA,KAAL,CAAWvB,IAAX,IAAmB2B,OAAnB;AACD;AACDH,mBAASG,OAAT;AACD,SAPH,EAQEnB,KARF;AAUD;AACF;;AAED;;;;8BACUoB,I,EAAgC;AACxC,UAAI,OAAO,KAAKpB,KAAZ,KAAsB,UAA1B,EAAsC;AACpC,eAAO,KAAKA,KAAL,CAAWoB,IAAX,CAAP;AACD,OAFD,MAEO;AACL,eAAQA,KAAKpB,KAAL,CAAW,KAAKA,KAAhB,CAAR;AACD;AACF;;AAED;;;;wBACwD;AACtD,aAAO,KAAKc,KAAL,CAAWd,KAAlB;AACD;;AAED;;;;wBACoB;AAClB,aAAO,OAAO,KAAKc,KAAL,CAAWR,KAAlB,KAA4B,QAA5B,GACH,KAAKQ,KAAL,CAAWR,KADR,GAEHI,aAFJ;AAGD;;;wBAEkC;AACjC,aAAO,KAAKI,KAAL,CAAWL,QAAX,IAAuBE,gBAA9B;AACD;;;;;;kBAzEkBE,Q;;;;;;;;;;;;QCSLQ,sB,GAAAA,sB;QA4BAC,e,GAAAA,e;QAoCAC,qB,GAAAA,qB;;;AAxGhB;;;;;AAKO,IAAMC,gDAAqB,YAAM;AACtC,MAAI,OAAOC,OAAOC,WAAd,KAA8B,UAAlC,EAA8C;AAC5C,WAAO,UACLC,IADK,EAELC,OAFK,EAGQ;AACb,aAAO,IAAIC,SAASC,WAAT,CAAqBJ,WAAzB,CAAqCC,IAArC,EAA2C;AAChDI,oBAAaH,WAAWA,QAAQG,UAApB,IAAmC,KADC;AAEhDC,gBAASJ,WAAWA,QAAQI,MAApB,IAA+BC;AAFS,OAA3C,CAAP;AAID,KARD;AASD,GAVD,MAUO;AACL;AACA;AACA,WAAO,UACLN,IADK,EAELC,OAFK,EAGQ;AACb,UAAMM,QAAQL,SAASM,WAAT,CAAqB,aAArB,CAAd;AACAD,YAAME,eAAN,CACET,IADF;AAEE,mBAAc,KAFhB,EAGGC,WAAWA,QAAQG,UAApB,IAAmC,KAHrC,EAIGH,WAAWA,QAAQI,MAApB,IAA+BC,SAJjC;AAMA,aAAOC,KAAP;AACD,KAZD;AAaD;AACF;;AAED;;;;;AA9BiC,EAA1B,CAmCA,SAASb,sBAAT,CACLgB,EADK,EAE0B;AAC/B,MAAMC,OAAOD,GAAGE,qBAAH,EAAb;AAD+B,0BAEUF,GAAGG,aAFb;AAAA,MAEvBV,WAFuB,qBAEvBA,WAFuB;AAAA,MAEVW,eAFU,qBAEVA,eAFU;;AAG/B,MAAMC,SAAS;AACbC,SAAKL,KAAKK,GAAL,GAAWb,YAAYc,WADf;AAEbC,UAAMP,KAAKO,IAAL,GAAYf,YAAYgB;AAFjB,GAAf;AAIA,MAAIL,eAAJ,EAAqB;AACnBC,WAAOC,GAAP,IAAcF,gBAAgBM,SAA9B;AACAL,WAAOG,IAAP,IAAeJ,gBAAgBO,UAA/B;AACD;AACD,SAAON,MAAP;AACD;;AAED,IAAMO,iBAAiB,IAAIC,UAAJ,CAAe,CAAf,CAAvB;AACA,IAAMC,iBAAiB,IAAID,UAAJ,CAAe,CAAf,CAAvB;;AAEA,SAASE,OAAT,CAAiBC,QAAjB,EAA4C;AAC1C,SAAOA,YAAYJ,cAAZ,IAA8BI,YAAYF,cAAjD;AACD;;AAED;;;;;AAKO,SAAS7B,eAAT,CAAyBgC,IAAzB,EAAoD;AACzD,MAAMC,gBAAgB9B,OAAO+B,gBAAP,CAAwBF;;AAE9C;AACA;AACA;AACA;AALsB,GAAtB,CAMA,IAAIF,QAAQG,cAAcE,UAAd,CAAyBP,UAAzB,CAAoC,CAApC,CAAR,CAAJ,EAAqD;AACnD;AACA;AACA,QACEE,QACEG,cAAcE,UAAd,CAAyBP,UAAzB,CACEK,cAAcE,UAAd,CAAyBlD,MAAzB,GAAkC,CADpC,CADF,CADF,EAME;AACA,aACEmD,WAAWH,cAAcE,UAAzB,IACAC,WAAWH,cAAcI,QAAzB,CAFF;AAID,KAXD,MAWO;AACL,aAAOD,WAAWH,cAAcE,UAAzB,CAAP;AACD;AACF;;AAED;AACA;AACA,SAAOlC,sBAAsB+B,KAAKM,QAA3B,EAAqCL,aAArC,CAAP;AACD;;AAED;;;;;AAKO,SAAShC,qBAAT,CACLqC,QADK,EAELL,aAFK,EAGG;AACR,MAAMM,OAAOhC,SAASgC,IAAtB;AACA,MAAI,CAACA,IAAL,EAAW;AACT,WAAO,CAAP;AACD;;AAED,MAAMC,WAAWjC,SAASkC,aAAT,CAAuBH,QAAvB,CAAjB;AACAE,WAASE,SAAT,GAAqB,QAArB;AACAF,WAASG,KAAT,CAAeN,QAAf,GAA0BJ,cAAcI,QAAxC;AACAG,WAASG,KAAT,CAAeC,UAAf,GAA4BX,cAAcW,UAA1C;AACAJ,WAASG,KAAT,CAAeE,OAAf,GAAyB,GAAzB;AACAN,OAAKO,WAAL,CAAiBN;;AAEjB;AAFA,IAGA,IAAIA,oBAAoBO,mBAAxB,EAA6C;AAC3C,KAAEP,QAAD,CAAgCQ,IAAhC,GAAuC,CAAvC;AACF;;AAED;AACA,MAAMC,SAAST,SAASU,YAAxB;AACAX,OAAKY,WAAL,CAAiBX,QAAjB;;AAEA,SAAOS,MAAP;AACD,C;;;;;;;;;;;;;;;ACjID;;;;AAEA;;AACA;;;;;;;;;;;AALA;;AAiBA;;;;;;;;;;;;;AAVA;IAqBqBG,M;;;;;;;;;;;;AACnB;;;;;8BAKU;AACR,aAAO,IAAP;AACD;;AAED;;;;;;sCAGkBxE,C,EAAuB;AACvC,YAAM,IAAIyE,KAAJ,CAAU,kBAAV,CAAN;AACD;;AAED;;;;;;;sCAIgC;AAC9B,YAAM,IAAIA,KAAJ,CAAU,kBAAV,CAAN;AACD;;AAED;;;;;;;sCAI2B;AACzB,YAAM,IAAIA,KAAJ,CAAU,kBAAV,CAAN;AACD;;AAED;;;;;;;;;kCAMcC,I,EAAkC;AAC9C,UAAMC,YAAY,8BAAkB,MAAlB,EAA0B;AAC1C9C,oBAAY,IAD8B;AAE1CC,gBAAQ;AACN4C,gBAAMA;AADA;AAFkC,OAA1B,CAAlB;AAMA,WAAKE,IAAL,CAAU,MAAV,EAAkBD,SAAlB;AACA,aAAOA,SAAP;AACD;;AAED;;;;;;;;;qCAM8B;AAC5B,UAAME,aAAa,8BAAkB,OAAlB,EAA2B,EAAEhD,YAAY,IAAd,EAA3B,CAAnB;AACA,WAAK+C,IAAL,CAAU,OAAV,EAAmBC,UAAnB;AACA,aAAOA,UAAP;AACD;;AAED;;;;;;;;;sCAM+B;AAC7B,UAAMC,cAAc,8BAAkB,QAAlB,EAA4B;AAC9ChD,gBAAQ;AACNtC,wBAAc,KAAKuF,eAAL;AADR;AADsC,OAA5B,CAApB;AAKA,WAAKH,IAAL,CAAU,QAAV,EAAoBE,WAApB;AACA,aAAOA,WAAP;AACD;;AAED;;;;;;;;;mCAM4B;AAC1B,UAAME,WAAW,8BAAkB,KAAlB,EAAyB,EAAEnD,YAAY,IAAd,EAAzB,CAAjB;AACA,WAAK+C,IAAL,CAAU,KAAV,EAAiBI,QAAjB;AACA,aAAOA,QAAP;AACD;;AAED;;;;;;;;4BAKQC,C,EAA2B;AACjC,aAAOA,EAAEC,OAAF,KAAc,CAAd,GACH,OADG,CACK;AADL,QAEHD,EAAEC,OAAF,KAAc,EAAd,GACE,OADF,CACU;AADV,QAEED,EAAEC,OAAF,KAAc,EAAd,GACE,KADF,CACQ;AADR,QAEED,EAAEC,OAAF,KAAc,EAAd,GACE,IADF,CACO;AADP,QAEED,EAAEC,OAAF,KAAc,EAAd,GACE,MADF,CACS;AADT,QAEED,EAAEC,OAAF,KAAc,EAAd,IAAoBD,EAAEE,OAAtB,GACE,MADF,CACS;AADT,QAEEF,EAAEC,OAAF,KAAc,EAAd,IAAoBD,EAAEE,OAAtB,GACE,IADF,CACO;AADP,QAEE,OAdhB;AAeD;;;;;;kBA/GkBX,M;;;;;;;;;AC7BrB;;;;AACA;;;;;;AAEA,IAAIY,gBAAJ;AACA,IAAIC,OAAOC,YAAP,IAAuBD,OAAOC,YAAP,CAAoBF,OAA/C,EAAwD;AACtDA,YAAUC,OAAOC,YAAP,CAAoBF,OAA9B;AACD,CAFD,MAEO;AACLA,YAAU,EAAV;AACD;AACDA,QAAQG,QAAR;;AAEAF,OAAOC,YAAP;AACAD,OAAOC,YAAP,CAAoBF,OAApB,GAA8BA,OAA9B,C;;;;;;;ACZA;;AAEA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;;AAEA;AACA;AACA,4CAA4C;;AAE5C;;;;;;;;;;;;;;;;AClBA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AAEA;;;;;;;;;;;;AAEA,IAAMI,mBAAmB,CACvB,cADuB,EAEvB,aAFuB,EAGvB,WAHuB,EAIvB,WAJuB,EAKvB,YALuB,EAMvB,cANuB,CAAzB;;AASA;;AAKA;;;IAGqBF,Y;;;AAQnB;;;AAGA,wBAAYG,MAAZ,EAA+D;AAAA,QAAnC/D,OAAmC,uEAAJ,EAAI;;AAAA;;AAAA;;AAG7D,UAAKgE,SAAL,GAAiB,yBAAjB;AACA,UAAKC,eAAL,GAAuB,KAAvB;AACA,UAAKC,gBAAL,GAAwB,IAAxB;AACA,UAAKC,QAAL,GAAgB,uBAAanE,QAAQmE,QAAR,IAAoB,EAAjC,CAAhB;AACA,UAAKJ,MAAL,GAAcA,MAAd;AACA,UAAK/D,OAAL,GAAeA,OAAf;;AAEA8D,qBAAiBM,OAAjB,CAAyB,kBAAU;AACjC,OAAC,MAAYC,MAAZ,IAAsB,MAAYA,MAAZ,EAAoBC,IAApB,OAAtB;AACF,KAFD;;AAIA,UAAKC,cAAL;AAd6D;AAe9D;;AAED;;;;;;;8BAGuC;AAAA,UAA/BC,aAA+B,uEAAN,IAAM;;AACrC,WAAKR,SAAL,CAAeS,OAAf;AACA,WAAKN,QAAL,CAAcM,OAAd;AACA,UAAID,aAAJ,EAAmB;AACjB,aAAKT,MAAL,CAAYU,OAAZ;AACD;AACD,WAAKC,aAAL;AACA,aAAO,IAAP;AACD;;AAED;;;;;;2BAGO;AACL,WAAKP,QAAL,CAAcQ,UAAd;AACA,aAAO,IAAP;AACD;;AAED;;;;;;;;;;;;;;;;;;6BAeSC,kB,EAA0C;AAAA;;AACjDA,yBAAmBR,OAAnB,CAA2B,iBAAS;AAClC,eAAKJ,SAAL,CAAea,gBAAf,CAAgC,uBAAa3F,KAAb,CAAhC;AACD,OAFD;AAGA,aAAO,IAAP;AACD;;AAED;;;;;;;;;4BAMQM,I,EAAc;AACpB,UAAI,KAAKyE,eAAT,EAA0B;AACxB,aAAKC,gBAAL,GAAwB1E,IAAxB;AACD,OAFD,MAEO;AACL,aAAKyE,eAAL,GAAuB,IAAvB;AACA,aAAKC,gBAAL,GAAwB,IAAxB;AACA,aAAKF,SAAL,CAAec,GAAf,CAAmBtF,IAAnB;AACD;AACD,aAAO,IAAP;AACD;;AAED;;;;oCACgE;AAAA,UAApDuF,aAAoD,QAApDA,aAAoD;;AAC9D,UAAIA,cAAcpG,MAAlB,EAA0B;AACxB,aAAKwF,QAAL,CAAca,MAAd,CAAqBD,aAArB,EAAoC,KAAKhB,MAAL,CAAYkB,eAAZ,EAApC;AACD,OAFD,MAEO;AACL,aAAKd,QAAL,CAAcQ,UAAd;AACD;AACD,WAAKV,eAAL,GAAuB,KAAvB;AACA,UAAI,KAAKC,gBAAL,KAA0B,IAA9B,EAAoC;AAClC,aAAKgB,OAAL,CAAa,KAAKhB,gBAAlB;AACD;AACF;;AAED;;;;+BACWX,C,EAAgB;AACzBA,QAAEnD,MAAF,CAAS4C,IAAT,KAAkB,IAAlB,GAAyB,KAAKmB,QAAL,CAAcgB,EAAd,CAAiB5B,CAAjB,CAAzB,GAA+C,KAAKY,QAAL,CAAciB,IAAd,CAAmB7B,CAAnB,CAA/C;AACD;;AAED;;;;gCACYA,C,EAAgB;AAC1B,UAAM8B,aAAa,KAAKlB,QAAL,CAAcmB,aAAd,EAAnB;AACA,UAAID,UAAJ,EAAgB;AACd,aAAKlB,QAAL,CAAcoB,MAAd,CAAqBF,UAArB;AACA9B,UAAEiC,cAAF;AACD,OAHD,MAGO;AACL,aAAKrB,QAAL,CAAcQ,UAAd;AACD;AACF;;AAED;;;;8BACUpB,C,EAAgB;AACxB,UAAI,KAAKY,QAAL,CAAcsB,KAAlB,EAAyB;AACvB,aAAKtB,QAAL,CAAcQ,UAAd;AACApB,UAAEiC,cAAF;AACD;AACF;;AAED;;;;iCACajC,C,EAAgB;AAC3B,UAAIA,EAAEnD,MAAF,CAAStC,YAAT,IAAyB,IAA7B,EAAmC;AACjC,aAAKoH,OAAL,CAAa3B,EAAEnD,MAAF,CAAStC,YAAtB;AACD,OAFD,MAEO;AACL,aAAKqG,QAAL,CAAcQ,UAAd;AACD;AACF;;AAED;;;;iCACae,W,EAA0B;AACrC,WAAKxC,IAAL,CAAU,QAAV,EAAoBwC,WAApB;AACA,UAAI,CAACA,YAAYC,gBAAjB,EAAmC;AACjC,aAAK5B,MAAL,CAAY6B,iBAAZ,CAA8BF,YAAYtF,MAAZ,CAAmByF,YAAjD;AACD;AACF;;AAED;;;;qCACiB;AAAA;;AACf,WAAK9B,MAAL,CACG+B,EADH,CACM,MADN,EACc,KAAKC,UADnB,EAEGD,EAFH,CAEM,OAFN,EAEe,KAAKE,WAFpB,EAGGF,EAHH,CAGM,KAHN,EAGa,KAAKG,SAHlB,EAIGH,EAJH,CAIM,QAJN,EAIgB,KAAKI,YAJrB;AAKA,WAAK/B,QAAL,CAAc2B,EAAd,CAAiB,QAAjB,EAA2B,KAAKK,YAAhC,EACC,CACC,MADD,EAEC,OAFD,EAGC,QAHD,EAIC,UAJD,EAKC,UALD,EAMC,QAND,EAOC,MAPD,EAQC/B,OARD,CAQS,qBAAa;AACrB,eAAKD,QAAL,CAAc2B,EAAd,CAAiBM,SAAjB,EAA4B;AAAA,iBAAM,OAAKlD,IAAL,CAAUkD,SAAV,CAAN;AAAA,SAA5B;AACD,OAVA;AAWD,WAAKpC,SAAL,CAAe8B,EAAf,CAAkB,KAAlB,EAAyB,KAAKO,SAA9B;AACD;;AAED;;;;oCACgB;AACd,WAAKrC,SAAL,CAAesC,kBAAf;AACA,WAAKnC,QAAL,CAAcmC,kBAAd;AACA,WAAKvC,MAAL,CACGwC,cADH,CACkB,MADlB,EAC0B,KAAKR,UAD/B,EAEGQ,cAFH,CAEkB,OAFlB,EAE2B,KAAKP,WAFhC,EAGGO,cAHH,CAGkB,KAHlB,EAGyB,KAAKN,SAH9B,EAIGM,cAJH,CAIkB,QAJlB,EAI4B,KAAKL,YAJjC;AAKD;;;;;;kBA7KkBtC,Y;;;;;;;;;;;;;;;ACzBrB;;;;AAEA;;;;AACA;;;;AACA;;;;;;;;;;;;AAEA,IAAME,mBAAmB,CAAC,mBAAD,CAAzB;;AAEA;;;;IAGqB0C,S;;;AAGnB,uBAAc;AAAA;;AAAA;;AAEZ,UAAKC,UAAL,GAAkB,EAAlB;;AAEA3C,qBAAiBM,OAAjB,CAAyB,kBAAU;AACjC,OAAC,MAAYC,MAAZ,IAAsB,MAAYA,MAAZ,EAAoBC,IAApB,OAAtB;AACF,KAFD;AAJY;AAOb;;AAED;;;;;;;8BAGU;AACR,WAAKmC,UAAL,CAAgBrC,OAAhB,CAAwB;AAAA,eAAYvG,SAAS4G,OAAT,EAAZ;AAAA,OAAxB;AACA,aAAO,IAAP;AACD;;AAED;;;;;;;;qCAKiB5G,Q,EAAoB;AACnC,WAAK4I,UAAL,CAAgBC,IAAhB,CAAqB7I,QAArB;AACA,aAAO,IAAP;AACD;;AAED;;;;;;wBAGI2B,I,EAAoB;AACtB,UAAMmH,QAAQ,KAAKC,YAAL,CAAkBpH,IAAlB,CAAd;AACA,UAAImH,KAAJ,EAAW;AACTA,cAAME,OAAN,CAAc,KAAKC,iBAAnB;AACD,OAFD,MAEO;AACL,aAAKA,iBAAL,CAAuB,EAAvB;AACD;AACF;;AAED;;;;;;;;iCAKatH,I,EAAc;AACzB,WAAK,IAAIuH,IAAI,CAAb,EAAgBA,IAAI,KAAKN,UAAL,CAAgB9H,MAApC,EAA4CoI,GAA5C,EAAiD;AAC/C,YAAMJ,QAAQ,gBAAMK,KAAN,CAAY,KAAKP,UAAL,CAAgBM,CAAhB,CAAZ,EAAgCvH,IAAhC,CAAd;AACA,YAAImH,KAAJ,EAAW;AACT,iBAAOA,KAAP;AACD;AACF;AACD,aAAO,IAAP;AACD;;AAED;;;;;;;;sCAKkB5B,a,EAA+B;AAC/C,WAAK7B,IAAL,CAAU,KAAV,EAAiB,EAAE6B,4BAAF,EAAjB;AACD;;;;;;kBAhEkByB,S;;;;;;;;;;;;;;;ACXrB;;;;AACA;;;;;;;;AAGA;;;IAGqBS,K;;;;;AAKnB;;;;;0BAKapJ,Q,EAAoB2B,I,EAAsB;AACrD,UAAI,OAAO3B,SAASqB,KAAT,CAAegI,OAAtB,KAAkC,UAAtC,EAAkD;AAChD,YAAMA,UAAUrJ,SAASqB,KAAT,CAAegI,OAAf,CAAuB1H,IAAvB,CAAhB;AACA,YAAI,OAAO0H,OAAP,KAAmB,QAAvB,EAAiC;AAC/B1H,iBAAO0H,OAAP;AACD,SAFD,MAEO,IAAI,CAACA,OAAL,EAAc;AACnB,iBAAO,IAAP;AACD;AACF;AACD,UAAM9I,QAAQP,SAASQ,SAAT,CAAmBmB,IAAnB,CAAd;AACA,aAAOpB,QAAQ,IAAI6I,KAAJ,CAAUpJ,QAAV,EAAoBO,MAAMP,SAASa,KAAf,CAApB,EAA2CN,KAA3C,CAAR,GAA4D,IAAnE;AACD;;;AAED,iBAAYP,QAAZ,EAAgCD,IAAhC,EAA8CQ,KAA9C,EAAgE;AAAA;;AAC9D,SAAKP,QAAL,GAAgBA,QAAhB;AACA,SAAKD,IAAL,GAAYA,IAAZ;AACA,SAAKQ,KAAL,GAAaA,KAAb;AACD;;AAED;;;;;;;4BAGQgB,Q,EAAoC;AAAA;;AAC1C,WAAKvB,QAAL,CAAcyB,MAAd,CACE,KAAK1B,IADP,EAEE,mBAAW;AACTwB,iBACEG,QAAQ4H,GAAR,CAAY,kBAAU;AACpB,iBAAO,4BAAiBC,MAAjB,EAAyB,MAAKxJ,IAA9B,EAAoC,MAAKC,QAAzC,CAAP;AACD,SAFD,CADF;AAKD,OARH,EASE,KAAKO,KATP;AAWD;;;;;;kBA5CkB6I,K;;;;;;;;;;;;;;;ACRrB;;;;AAEA;;;;AACA;;;;AACA;;;;;;;;;;AAGA,IAAMI,qBAAqB,qCAA3B;;AAEA;;AAYA;;;;;;IAMqBC,Q;;;;;oCAYsB;AACvC,UAAM7G,KAAKR,SAASkC,aAAT,CAAuB,IAAvB,CAAX;AACA,UAAME,QAAQ5B,GAAG4B,KAAjB;AACAA,YAAMkF,OAAN,GAAgB,MAAhB;AACAlF,YAAMmF,QAAN,GAAiB,UAAjB;AACAnF,YAAMoF,MAAN,GAAe,OAAf;AACA,UAAMxF,OAAOhC,SAASgC,IAAtB;AACA,UAAIA,IAAJ,EAAU;AACRA,aAAKO,WAAL,CAAiB/B,EAAjB;AACD;AACD,aAAOA,EAAP;AACD;;;AAED,oBAAYT,OAAZ,EAAsC;AAAA;;AAAA;;AAEpC,UAAKyF,KAAL,GAAa,KAAb;AACA,UAAKiC,KAAL,GAAa,EAAb;AACA,UAAKrC,UAAL,GAAkB,IAAlB;AACA,UAAKsC,MAAL,GAAc3H,QAAQ2H,MAAtB;AACA,UAAKC,MAAL,GAAc5H,QAAQ4H,MAAtB;AACA,UAAKC,QAAL,GAAgB7H,QAAQ6H,QAAR,IAAoB,EAApC;AACA,UAAKpH,EAAL,CAAQqH,SAAR,GAAoB9H,QAAQ8H,SAAR,IAAqBT,kBAAzC;AACA,UAAKU,MAAL,GAAc/H,QAAQgI,cAAR,CAAuB,QAAvB,IAAmChI,QAAQ+H,MAA3C,GAAoD,IAAlE;AACA,UAAKE,SAAL,GAAiBjI,QAAQiI,SAAzB;AACA,UAAKC,WAAL,GAAmBlI,QAAQmI,IAAR,IAAgB,EAAnC;AACA,QAAM9F,QAAQrC,QAAQqC,KAAtB;AACA,QAAIA,KAAJ,EAAW;AACT+F,aAAOC,IAAP,CAAYhG,KAAZ,EAAmB+B,OAAnB,CAA2B,eAAO;AAChC,SAAE,MAAK3D,EAAL,CAAQ4B,KAAT,CAAqBiG,GAArB,IAA4BjG,MAAMiG,GAAN,CAA5B;AACF,OAFD;AAGD;AAjBmC;AAkBrC;;AAED;;;;;;;8BAGU;AACR,UAAMC,aAAa,KAAK9H,EAAL,CAAQ8H,UAA3B;AACA,UAAIA,UAAJ,EAAgB;AACdA,mBAAW1F,WAAX,CAAuB,KAAKpC,EAA5B;AACD;AACD,WAAK+H,KAAL,GAAaC,GAAb,GAAmB,IAAnB;AACA,aAAO,IAAP;AACD;;;;;AASD;;;;;2BAKO1D,a,EAA+B2D,Y,EAA4B;AAAA;;AAChE,UAAMC,cAAc,8BAAkB,QAAlB,EAA4B,EAAExI,YAAY,IAAd,EAA5B,CAApB;AACA,WAAK+C,IAAL,CAAU,QAAV,EAAoByF,WAApB;AACA,UAAIA,YAAYhD,gBAAhB,EAAkC;AAChC,eAAO,IAAP;AACD;AACD,UAAMiD,aAAa7D,cAAcoC,GAAd,CAAkB;AAAA,eAAgBtB,aAAalI,IAA7B;AAAA,OAAlB,CAAnB;AACA,UAAMkL,gBAAgB9D,cACnBtG,KADmB,CACb,CADa,EACV,KAAKoJ,QAAL,IAAiB9C,cAAcpG,MADrB,EAEnBwI,GAFmB,CAEf;AAAA,eAAgB,4BAAiBtB,YAAjB,EAA+B,OAAKqC,WAApC,CAAhB;AAAA,OAFe,CAAtB;AAGA,WAAKM,KAAL,GACGM,aADH,CACiB/D,cAAc,CAAd,CADjB,EAEGgE,UAFH,CAEcH,UAFd,EAE0B,QAF1B,EAGGI,MAHH,CAGUH,aAHV,EAIGE,UAJH,CAIcH,UAJd,EAI0B,QAJ1B,EAKGK,IALH,GAMGC,SANH,CAMaR,YANb;AAOA,WAAKxF,IAAL,CAAU,UAAV,EAAsB,8BAAkB,UAAlB,CAAtB;AACA,aAAO,IAAP;AACD;;AAED;;;;;;;;iCAKa;AACX,aAAO,KAAKiG,IAAL,GAAYX,KAAZ,EAAP;AACD;;AAED;;;;;;2BAGOY,Y,EAA4B;AACjC,UAAMhJ,SAAS,EAAEyF,cAAcuD,aAAavD,YAA7B,EAAf;AACA,UAAMH,cAAc,8BAAkB,QAAlB,EAA4B;AAC9CvF,oBAAY,IADkC;AAE9CC,gBAAQA;AAFsC,OAA5B,CAApB;AAIA,WAAK8C,IAAL,CAAU,QAAV,EAAoBwC,WAApB;AACA,UAAIA,YAAYC,gBAAhB,EAAkC;AAChC,eAAO,IAAP;AACD;AACD,WAAKhB,UAAL;AACA,WAAKzB,IAAL,CAAU,UAAV,EAAsB,8BAAkB,UAAlB,EAA8B,EAAE9C,cAAF,EAA9B,CAAtB;AACA,aAAO,IAAP;AACD;;AAED;;;;;;uBAGGmD,C,EAAgB;AACjB,aAAO,KAAKkC,KAAL,GAAa,KAAK4D,cAAL,CAAoB,MAApB,EAA4B9F,CAA5B,CAAb,GAA8C,IAArD;AACD;;AAED;;;;;;yBAGKA,C,EAAgB;AACnB,aAAO,KAAKkC,KAAL,GAAa,KAAK4D,cAAL,CAAoB,MAApB,EAA4B9F,CAA5B,CAAb,GAA8C,IAArD;AACD;;AAED;;;;;;oCAGqC;AACnC,aAAO,KAAK8B,UAAZ;AACD;;AAED;;;;;;;;2BAKOqC,K,EAAuB;AAAA;;AAC5B,UAAM4B,WAAWrJ,SAASsJ,sBAAT,EAAjB;AACA7B,YAAMtD,OAAN,CAAc,gBAAQ;AACpB,eAAKsD,KAAL,CAAWhB,IAAX,CAAgByB,IAAhB;AACAA,aAAKqB,QAAL;AACAF,iBAAS9G,WAAT,CAAqB2F,KAAK1H,EAA1B;AACD,OAJD;AAKA,WAAKA,EAAL,CAAQ+B,WAAR,CAAoB8G,QAApB;AACA,aAAO,IAAP;AACD;;AAED;;;;8BACUZ,Y,EAA4B;AACpC,UAAMe,MAAMxJ,SAASY,eAArB;AACA,UAAI4I,GAAJ,EAAS;AACP,YAAMC,eAAe,KAAKjJ,EAAL,CAAQkJ,WAA7B;AACA,YAAIjB,aAAazH,IAAjB,EAAuB;AACrB,cAAM2I,eAAeH,IAAII,WAAzB;AACA,cAAInB,aAAazH,IAAb,GAAoByI,YAApB,GAAmCE,YAAvC,EAAqD;AACnDlB,yBAAazH,IAAb,GAAoB2I,eAAeF,YAAnC;AACD;AACD,eAAKjJ,EAAL,CAAQ4B,KAAR,CAAcpB,IAAd,GAAwByH,aAAazH,IAArC;AACD,SAND,MAMO,IAAIyH,aAAaoB,KAAjB,EAAwB;AAC7B,cAAIpB,aAAaoB,KAAb,GAAqBJ,YAArB,GAAoC,CAAxC,EAA2C;AACzChB,yBAAaoB,KAAb,GAAqB,CAArB;AACD;AACD,eAAKrJ,EAAL,CAAQ4B,KAAR,CAAcyH,KAAd,GAAyBpB,aAAaoB,KAAtC;AACD;AACD,YAAI,KAAKC,cAAL,EAAJ,EAA2B;AACzB,eAAKtJ,EAAL,CAAQ4B,KAAR,CAAc2H,MAAd,GAA0BP,IAAIQ,YAAJ,GACxBvB,aAAa3H,GADW,GAExB2H,aAAa7G,UAFf;AAGD,SAJD,MAIO;AACL,eAAKpB,EAAL,CAAQ4B,KAAR,CAActB,GAAd,GAAuB2H,aAAa3H,GAApC;AACD;AACF;AACD,aAAO,IAAP;AACD;;AAED;;;;;;;;2BAKO;AACL,UAAI,CAAC,KAAK0E,KAAV,EAAiB;AACf,YAAMyE,YAAY,8BAAkB,MAAlB,EAA0B,EAAE/J,YAAY,IAAd,EAA1B,CAAlB;AACA,aAAK+C,IAAL,CAAU,MAAV,EAAkBgH,SAAlB;AACA,YAAIA,UAAUvE,gBAAd,EAAgC;AAC9B,iBAAO,IAAP;AACD;AACD,aAAKlF,EAAL,CAAQ4B,KAAR,CAAckF,OAAd,GAAwB,OAAxB;AACA,aAAK9B,KAAL,GAAa,IAAb;AACA,aAAKvC,IAAL,CAAU,OAAV,EAAmB,8BAAkB,OAAlB,CAAnB;AACD;AACD,aAAO,IAAP;AACD;;AAED;;;;;;;;2BAKO;AACL,UAAI,KAAKuC,KAAT,EAAgB;AACd,YAAM0E,YAAY,8BAAkB,MAAlB,EAA0B,EAAEhK,YAAY,IAAd,EAA1B,CAAlB;AACA,aAAK+C,IAAL,CAAU,MAAV,EAAkBiH,SAAlB;AACA,YAAIA,UAAUxE,gBAAd,EAAgC;AAC9B,iBAAO,IAAP;AACD;AACD,aAAKlF,EAAL,CAAQ4B,KAAR,CAAckF,OAAd,GAAwB,MAAxB;AACA,aAAK9B,KAAL,GAAa,KAAb;AACA,aAAKvC,IAAL,CAAU,QAAV,EAAoB,8BAAkB,QAAlB,CAApB;AACD;AACD,aAAO,IAAP;AACD;;AAED;;;;;;;;4BAKQ;AACN,WAAKzC,EAAL,CAAQ2B,SAAR,GAAoB,EAApB;AACA,WAAKsF,KAAL,CAAWtD,OAAX,CAAmB;AAAA,eAAQ+D,KAAK1D,OAAL,EAAR;AAAA,OAAnB;AACA,WAAKiD,KAAL,GAAa,EAAb;AACA,aAAO,IAAP;AACD;;AAED;;;;mCACe0C,S,EAA4B7G,C,EAAgB;AACzD,UAAM8G,iBACJD,cAAc,MAAd,GACI,KAAK/E,UAAL,GAAkB,KAAKA,UAAL,CAAgBiF,IAAlC,GAAyC,KAAK5C,KAAL,CAAW,CAAX,CAD7C,GAEI,KAAKrC,UAAL,GACE,KAAKA,UAAL,CAAgBkF,IADlB,GAEE,KAAK7C,KAAL,CAAW,KAAKA,KAAL,CAAW/I,MAAX,GAAoB,CAA/B,CALR;AAMA,UAAI0L,cAAJ,EAAoB;AAClBA,uBAAeG,QAAf;AACAjH,UAAEiC,cAAF;AACD;AACD,aAAO,IAAP;AACD;;AAED;;;;kCACcK,Y,EAA6B;AACzC,UAAM4E,aAAa5E,gBAAgBA,aAAahI,QAAb,CAAsBqB,KAAtB,CAA4BwL,EAA/D;AACA,UAAID,UAAJ,EAAgB;AACd,aAAKhK,EAAL,CAAQkK,YAAR,CAAqB,eAArB,EAAsCF,UAAtC;AACD,OAFD,MAEO;AACL,aAAKhK,EAAL,CAAQmK,eAAR,CAAwB,eAAxB;AACD;AACD,aAAO,IAAP;AACD;;AAED;;;;;;;+BAIWhC,U,EAAsB7I,I,EAA2B;AAC1D,UAAM8K,SAAS,CAAC9K,SAAS,QAAT,GAAoB,KAAK6H,MAAzB,GAAkC,KAAKD,MAAxC,KAAmD,EAAlE;AACA,UAAMmD,UACJ,OAAOD,MAAP,KAAkB,UAAlB,GAA+BA,OAAOjC,UAAP,CAA/B,GAAoDiC,MADtD;AAEA,UAAME,KAAK9K,SAASkC,aAAT,CAAuB,IAAvB,CAAX;AACA4I,SAAGC,SAAH,CAAaC,GAAb,mBAAiClL,IAAjC;AACAgL,SAAG3I,SAAH,GAAe0I,OAAf;AACA,WAAKrK,EAAL,CAAQ+B,WAAR,CAAoBuI,EAApB;AACA,aAAO,IAAP;AACD;;AAED;;;;qCACiB;AACf,aAAO,KAAK9C,SAAL,KAAmB,KAA1B;AACD;;;wBA3N0B;AACzB,UAAI,CAAC,KAAKQ,GAAV,EAAe;AACb,aAAKA,GAAL,GAAWnB,SAASnF,aAAT,EAAX;AACD;AACD,aAAO,KAAKsG,GAAZ;AACD;;;;;;kBA9DkBnB,Q;;;;;;;;;;;;;;;;AC1BrB;;;;;;;;AAEO,IAAMD,kDAAqB,mBAA3B;AACP,IAAMvD,mBAAmB,CAAC,SAAD,EAAY,aAAZ,CAAzB;;AAEA;;;AAKA;;AASA;;;IAGqBoH,Y;AAUnB,wBAAYrF,YAAZ,EAAwC7F,OAAxC,EAAsE;AAAA;;AAAA;;AACpE,SAAK6F,YAAL,GAAoBA,YAApB;AACA,SAAKsF,MAAL,GAAc,KAAd;AACA,SAAKrD,SAAL,GAAiB9H,QAAQ8H,SAAR,IAAqBT,kBAAtC;AACA,SAAK+D,eAAL,GAA0B,KAAKtD,SAA/B;;AAEAhE,qBAAiBM,OAAjB,CAAyB,kBAAU;AACjC,OAAC,MAAYC,MAAZ,IAAsB,MAAYA,MAAZ,EAAoBC,IAApB,OAAtB;AACF,KAFD;AAGD;;;;;;AAkBD;;;8BAGU;AACR,WAAK7D,EAAL,CAAQ4K,mBAAR,CAA4B,WAA5B,EAAyC,KAAKC,OAA9C,EAAuD,KAAvD;AACA,WAAK7K,EAAL,CAAQ4K,mBAAR,CAA4B,WAA5B,EAAyC,KAAKE,WAA9C,EAA2D,KAA3D;AACA,WAAK9K,EAAL,CAAQ4K,mBAAR,CAA4B,YAA5B,EAA0C,KAAKC,OAA/C,EAAwD,KAAxD;AACA,UAAI,KAAKH,MAAT,EAAiB;AACf,aAAKhH,QAAL,CAAckB,UAAd,GAA2B,IAA3B;AACD;AACD;AACA,WAAKoD,GAAL,GAAW,IAAX;AACD;;AAED;;;;;;;;6BAKStE,Q,EAAoB;AAC3B,WAAKA,QAAL,GAAgBA,QAAhB;AACA,WAAKqH,QAAL,GAAgBrH,SAASuD,KAAzB;AACA,WAAKhJ,KAAL,GAAa,KAAK8M,QAAL,CAAc7M,MAAd,GAAuB,CAApC;AACD;;AAED;;;;;;;;+BAKW;AACT,UAAI,CAAC,KAAKwM,MAAV,EAAkB;AAChB,YAAM9F,cAAa,KAAKlB,QAAL,CAAcmB,aAAd,EAAnB;AACA,YAAID,WAAJ,EAAgB;AACdA,sBAAWV,UAAX;AACD;AACD,aAAKR,QAAL,CAAckB,UAAd,GAA2B,IAA3B;AACA,aAAK8F,MAAL,GAAc,IAAd;AACA,aAAK1K,EAAL,CAAQqH,SAAR,GAAoB,KAAKsD,eAAzB;AACD;AACD,aAAO,IAAP;AACD;;AAED;;;;;;;;AAgCA;iCACa;AACX,UAAI,KAAKD,MAAT,EAAiB;AACf,aAAKA,MAAL,GAAc,KAAd;AACA,aAAK1K,EAAL,CAAQqH,SAAR,GAAoB,KAAKA,SAAzB;AACA,aAAK3D,QAAL,CAAckB,UAAd,GAA2B,IAA3B;AACD;AACD,aAAO,IAAP;AACD;;AAED;;;;4BACQ9B,C,EAAU;AAChBA,QAAEiC,cAAF,CAAmB;AAAnB,SACA,KAAKrB,QAAL,CAAcoB,MAAd,CAAqB,IAArB;AACD;;AAED;;;;kCACc;AACZ,WAAKiF,QAAL;AACD;;;wBA9GuB;AACtB,UAAI,KAAK/B,GAAT,EAAc;AACZ,eAAO,KAAKA,GAAZ;AACD;AACD,UAAMsC,KAAK9K,SAASkC,aAAT,CAAuB,IAAvB,CAAX;AACA4I,SAAGjD,SAAH,GAAe,KAAKqD,MAAL,GAAc,KAAKC,eAAnB,GAAqC,KAAKtD,SAAzD;AACA,UAAM2D,IAAIxL,SAASkC,aAAT,CAAuB,GAAvB,CAAV;AACAsJ,QAAErJ,SAAF,GAAc,KAAKyD,YAAL,CAAkBb,MAAlB,EAAd;AACA+F,SAAGvI,WAAH,CAAeiJ,CAAf;AACA,WAAKhD,GAAL,GAAWsC,EAAX;AACAA,SAAGW,gBAAH,CAAoB,WAApB,EAAiC,KAAKJ,OAAtC;AACAP,SAAGW,gBAAH,CAAoB,WAApB,EAAiC,KAAKH,WAAtC;AACAR,SAAGW,gBAAH,CAAoB,YAApB,EAAkC,KAAKJ,OAAvC;AACA,aAAOP,EAAP;AACD;;;wBAgDyB;AACxB,UAAIY,kBAAJ;AACA,UAAI,KAAKjN,KAAL,KAAe,KAAK8M,QAAL,CAAc7M,MAAd,GAAuB,CAA1C,EAA6C;AAC3C,YAAI,CAAC,KAAKwF,QAAL,CAAc4D,MAAnB,EAA2B;AACzB,iBAAO,IAAP;AACD;AACD4D,oBAAY,CAAZ;AACD,OALD,MAKO;AACLA,oBAAY,KAAKjN,KAAL,GAAa,CAAzB;AACD;AACD,aAAO,KAAK8M,QAAL,CAAcG,SAAd,CAAP;AACD;;AAED;;;;;;wBAG0B;AACxB,UAAIA,kBAAJ;AACA,UAAI,KAAKjN,KAAL,KAAe,CAAnB,EAAsB;AACpB,YAAI,CAAC,KAAKyF,QAAL,CAAc4D,MAAnB,EAA2B;AACzB,iBAAO,IAAP;AACD;AACD4D,oBAAY,KAAKH,QAAL,CAAc7M,MAAd,GAAuB,CAAnC;AACD,OALD,MAKO;AACLgN,oBAAY,KAAKjN,KAAL,GAAa,CAAzB;AACD;AACD,aAAO,KAAK8M,QAAL,CAAcG,SAAd,CAAP;AACD;;;;;;kBA9GkBT,Y;;;;;;;;;;;;;;;;;ACtBrB;;;;AAEA;;;;AACA;;AACA;;;;;;;;;;;;AAEA,IAAMU,sBAAsB,mBAAAC,CAAQ,EAAR,CAA5B;;AAEA,IAAM/H,mBAAmB,CAAC,SAAD,EAAY,WAAZ,CAAzB;;AAEA;;;;IAGqBD,Q;;;AAGnB;;;AAGA,oBAAYpD,EAAZ,EAAqC;AAAA;;AAAA;;AAEnC,UAAKA,EAAL,GAAUA,EAAV;;AAEAqD,qBAAiBM,OAAjB,CAAyB,kBAAU;AACjC,OAAC,MAAYC,MAAZ,IAAsB,MAAYA,MAAZ,EAAoBC,IAApB,OAAtB;AACF,KAFD;;AAIA,UAAKC,cAAL;AARmC;AASpC;;AAED;;;;;;;8BAGU;AACR;AACA,WAAKG;AACL;AADA,SAEE,IAAD,CAAYjE,EAAZ,GAAiB,IAAjB;AACD,aAAO,IAAP;AACD;;AAED;;;;;;sCAGkBoF,Y,EAA4B;AAC5C,UAAMiG,SAAS,KAAKzI,eAAL,EAAf;AACA,UAAIyI,UAAU,IAAd,EAAoB;AAClB,YAAM7N,UAAU4H,aAAa5H,OAAb,CAAqB6N,MAArB,EAA6B,KAAKC,cAAL,EAA7B,CAAhB;AACA,aAAKtL,EAAL,CAAQuL,KAAR,CAAgB;AAAhB,WACA,IAAI9N,MAAMC,OAAN,CAAcF,OAAd,CAAJ,EAA4B;AAC1B,gCAAO,KAAKwC,EAAZ,EAAgBxC,QAAQ,CAAR,CAAhB,EAA4BA,QAAQ,CAAR,CAA5B;AACA,eAAKwC,EAAL,CAAQwL,aAAR,CAAsB,IAAIC,KAAJ,CAAU,OAAV,CAAtB;AACD;AACF;AACF;;AAED;;;;;;sCAGkB;AAChB,UAAMC,WAAW,mCAAuB,KAAK1L,EAA5B,CAAjB;AACA,UAAM2L,WAAW,KAAKC,WAAL,EAAjB;AACA,UAAMC,iBAAiB,KAAKC,iBAAL,EAAvB;AACA,UAAM1K,aAAa,4BAAgB,KAAKpB,EAArB,CAAnB;AACA,UAAMM,MAAMoL,SAASpL,GAAT,GAAeqL,SAASrL,GAAxB,GAA8BuL,eAAevL,GAA7C,GAAmDc,UAA/D;AACA,UAAMZ,OAAOkL,SAASlL,IAAT,GAAgBmL,SAASnL,IAAzB,GAAgCqL,eAAerL,IAA5D;AACA,UAAI,KAAKR,EAAL,CAAQ+L,GAAR,KAAgB,KAApB,EAA2B;AACzB,eAAO,EAAEzL,QAAF,EAAOE,UAAP,EAAaY,sBAAb,EAAP;AACD,OAFD,MAEO;AACL,YAAMiI,QAAQ7J,SAASY,eAAT,GACVZ,SAASY,eAAT,CAAyBgJ,WAAzB,GAAuC5I,IAD7B,GAEV,CAFJ;AAGA,eAAO,EAAEF,QAAF,EAAO+I,YAAP,EAAcjI,sBAAd,EAAP;AACD;AACF;;AAED;;;;;;sCAGkB;AAChB,aAAO,KAAKpB,EAAL,CAAQgM,cAAR,KAA2B,KAAKhM,EAAL,CAAQiM,YAAnC,GACH,IADG,GAEH,KAAKjM,EAAL,CAAQzB,KAAR,CAAc2N,SAAd,CAAwB,CAAxB,EAA2B,KAAKlM,EAAL,CAAQiM,YAAnC,CAFJ;AAGD;;AAED;;;;qCACiB;AACf,aAAO,KAAKjM,EAAL,CAAQzB,KAAR,CAAc2N,SAAd,CAAwB,KAAKlM,EAAL,CAAQiM,YAAhC,CAAP;AACD;;AAED;;;;kCAC6C;AAC3C,aAAO,EAAE3L,KAAK,KAAKN,EAAL,CAAQmM,SAAf,EAA0B3L,MAAM,KAAKR,EAAL,CAAQoM,UAAxC,EAAP;AACD;;AAED;;;;;;;;;wCAMmD;AACjD,aAAOjB,oBAAoB,KAAKnL,EAAzB,EAA6B,KAAKA,EAAL,CAAQiM,YAArC,CAAP;AACD;;AAED;;;;8BACU;AACR,WAAKI,eAAL;AACD;;AAED;;;;8BACUvJ,C,EAAkB;AAC1B,UAAMP,OAAO,KAAK+J,OAAL,CAAaxJ,CAAb,CAAb;AACA,UAAIjD,cAAJ;AACA,UAAI0C,SAAS,IAAT,IAAiBA,SAAS,MAA9B,EAAsC;AACpC1C,gBAAQ,KAAK0M,aAAL,CAAmBhK,IAAnB,CAAR;AACD,OAFD,MAEO,IAAIA,SAAS,OAAb,EAAsB;AAC3B1C,gBAAQ,KAAK2M,cAAL,EAAR;AACD,OAFM,MAEA,IAAIjK,SAAS,KAAb,EAAoB;AACzB1C,gBAAQ,KAAK4M,YAAL,EAAR;AACD;AACD,UAAI5M,SAASA,MAAMqF,gBAAnB,EAAqC;AACnCpC,UAAEiC,cAAF;AACD;AACF;;AAED;;;;qCACiB;AACf,WAAK/E,EAAL,CAAQiL,gBAAR,CAAyB,OAAzB,EAAkC,KAAKyB,OAAvC;AACA,WAAK1M,EAAL,CAAQiL,gBAAR,CAAyB,SAAzB,EAAoC,KAAK0B,SAAzC;AACD;;AAED;;;;oCACgB;AACd,WAAK3M,EAAL,CAAQ4K,mBAAR,CAA4B,OAA5B,EAAqC,KAAK8B,OAA1C;AACA,WAAK1M,EAAL,CAAQ4K,mBAAR,CAA4B,SAA5B,EAAuC,KAAK+B,SAA5C;AACD;;;;;;kBA3HkBvJ,Q;;;;;;;ACfrB;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,+BAA+B,kCAAkC;AACjE,GAAG;AACH;AACA;AACA;AACA;AACA,C;;;;;;ACtDA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,+BAA+B;AAC9C;;AAEA;AACA;AACA;AACA;;AAEA;AACA,2FAA2F;;AAE3F;AACA;AACA;AACA,kCAAkC;;AAElC;AACA,8BAA8B;AAC9B;AACA,gCAAgC;;AAEhC;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA,GAAG;AACH,8BAA8B,0CAA0C;AACxE;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D;AAC9D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA,CAAC;AACD;AACA;;AAEA,CAAC","file":"textcomplete.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 5);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0bc74e584933ddf1c7ac","// @flow\n\nimport Strategy from \"./strategy\"\n\n/**\n * Encapsulate an result of each search results.\n */\nexport default class SearchResult {\n data: Object\n term: string\n strategy: Strategy\n\n /**\n * @param {object} data - An element of array callbacked by search function.\n */\n constructor(data: Object, term: string, strategy: Strategy) {\n this.data = data\n this.term = term\n this.strategy = strategy\n }\n\n replace(beforeCursor: string, afterCursor: string) {\n let replacement = this.strategy.replace(this.data)\n if (replacement !== null) {\n if (Array.isArray(replacement)) {\n afterCursor = replacement[1] + afterCursor\n replacement = replacement[0]\n }\n const match = this.strategy.matchText(beforeCursor)\n if (match) {\n replacement = replacement\n .replace(/\\$&/g, match[0])\n .replace(/\\$(\\d)/g, (_, p1) => match[parseInt(p1, 10)])\n return [\n [\n beforeCursor.slice(0, match.index),\n replacement,\n beforeCursor.slice(match.index + match[0].length),\n ].join(\"\"),\n afterCursor,\n ]\n }\n }\n }\n\n render(): string {\n return this.strategy.template(this.data, this.term)\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/search_result.js","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @api private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {Mixed} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @api private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @api public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @api public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Boolean} exists Only check if there are listeners.\n * @returns {Array|Boolean}\n * @api public\n */\nEventEmitter.prototype.listeners = function listeners(event, exists) {\n var evt = prefix ? prefix + event : event\n , available = this._events[evt];\n\n if (exists) return !!available;\n if (!available) return [];\n if (available.fn) return [available.fn];\n\n for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n ee[i] = available[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @api public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn The listener function.\n * @param {Mixed} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n var listener = new EE(fn, context || this)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n else if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [this._events[evt], listener];\n\n return this;\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn The listener function.\n * @param {Mixed} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n var listener = new EE(fn, context || this, true)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n else if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [this._events[evt], listener];\n\n return this;\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {Mixed} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn\n && (!once || listeners.once)\n && (!context || listeners.context === context)\n ) {\n if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn\n || (once && !listeners[i].once)\n || (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {String|Symbol} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) {\n if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n }\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// This function doesn't apply anymore.\n//\nEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n return this;\n};\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/eventemitter3/index.js\n// module id = 1\n// module chunks = 0","// @flow\n\ndeclare class MatchData extends Array<string> {\n index: number;\n}\n\nexport type { MatchData }\n\nconst DEFAULT_INDEX = 2\n\nfunction DEFAULT_TEMPLATE(value) {\n return value\n}\n\n/**\n * Properties for a strategy.\n *\n * @typedef\n */\nexport type StrategyProperties = {\n match: RegExp | (string => MatchData | null),\n search: Function,\n replace: any => string[] | string | null,\n cache?: boolean,\n context?: Function,\n template?: any => string,\n index?: number,\n id?: string,\n}\n\n/**\n * Encapsulate a single strategy.\n */\nexport default class Strategy {\n props: StrategyProperties\n cache: ?Object\n\n constructor(props: StrategyProperties) {\n this.props = props\n this.cache = props.cache ? {} : null\n }\n\n /**\n * @return {this}\n */\n destroy() {\n this.cache = null\n return this\n }\n\n search(term: string, callback: Function, match: MatchData): void {\n if (this.cache) {\n this.searchWithCache(term, callback, match)\n } else {\n this.props.search(term, callback, match)\n }\n }\n\n /**\n * @param {object} data - An element of array callbacked by search function.\n */\n replace(data: any) {\n return this.props.replace(data)\n }\n\n /** @private */\n searchWithCache(term: string, callback: Function, match: MatchData): void {\n if (this.cache && this.cache[term]) {\n callback(this.cache[term])\n } else {\n this.props.search(\n term,\n results => {\n if (this.cache) {\n this.cache[term] = results\n }\n callback(results)\n },\n match,\n )\n }\n }\n\n /** @private */\n matchText(text: string): MatchData | null {\n if (typeof this.match === \"function\") {\n return this.match(text)\n } else {\n return (text.match(this.match): any)\n }\n }\n\n /** @private */\n get match(): $PropertyType<StrategyProperties, \"match\"> {\n return this.props.match\n }\n\n /** @private */\n get index(): number {\n return typeof this.props.index === \"number\"\n ? this.props.index\n : DEFAULT_INDEX\n }\n\n get template(): (...any) => string {\n return this.props.template || DEFAULT_TEMPLATE\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/strategy.js","// @flow\n\n/**\n * Create a custom event\n *\n * @private\n */\nexport const createCustomEvent = (() => {\n if (typeof window.CustomEvent === \"function\") {\n return function(\n type: string,\n options: ?{ detail?: Object, cancelable?: boolean },\n ): CustomEvent {\n return new document.defaultView.CustomEvent(type, {\n cancelable: (options && options.cancelable) || false,\n detail: (options && options.detail) || undefined,\n })\n }\n } else {\n // Custom event polyfill from\n // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#polyfill\n return function(\n type: string,\n options: ?{ detail?: Object, cancelable?: boolean },\n ): CustomEvent {\n const event = document.createEvent(\"CustomEvent\")\n event.initCustomEvent(\n type,\n /* bubbles */ false,\n (options && options.cancelable) || false,\n (options && options.detail) || undefined,\n )\n return event\n }\n }\n})()\n\n/**\n * Get the current coordinates of the `el` relative to the document.\n *\n * @private\n */\nexport function calculateElementOffset(\n el: HTMLElement,\n): { top: number, left: number } {\n const rect = el.getBoundingClientRect()\n const { defaultView, documentElement } = el.ownerDocument\n const offset = {\n top: rect.top + defaultView.pageYOffset,\n left: rect.left + defaultView.pageXOffset,\n }\n if (documentElement) {\n offset.top -= documentElement.clientTop\n offset.left -= documentElement.clientLeft\n }\n return offset\n}\n\nconst CHAR_CODE_ZERO = \"0\".charCodeAt(0)\nconst CHAR_CODE_NINE = \"9\".charCodeAt(0)\n\nfunction isDigit(charCode: number): boolean {\n return charCode >= CHAR_CODE_ZERO && charCode <= CHAR_CODE_NINE\n}\n\n/**\n * Returns the line-height of the given node in pixels.\n *\n * @private\n */\nexport function getLineHeightPx(node: HTMLElement): number {\n const computedStyle = window.getComputedStyle(node)\n\n // If the char code starts with a digit, it is either a value in pixels,\n // or unitless, as per:\n // https://drafts.csswg.org/css2/visudet.html#propdef-line-height\n // https://drafts.csswg.org/css2/cascade.html#computed-value\n if (isDigit(computedStyle.lineHeight.charCodeAt(0))) {\n // In real browsers the value is *always* in pixels, even for unit-less\n // line-heights. However, we still check as per the spec.\n if (\n isDigit(\n computedStyle.lineHeight.charCodeAt(\n computedStyle.lineHeight.length - 1,\n ),\n )\n ) {\n return (\n parseFloat(computedStyle.lineHeight) *\n parseFloat(computedStyle.fontSize)\n )\n } else {\n return parseFloat(computedStyle.lineHeight)\n }\n }\n\n // Otherwise, the value is \"normal\".\n // If the line-height is \"normal\", calculate by font-size\n return calculateLineHeightPx(node.nodeName, computedStyle)\n}\n\n/**\n * Returns calculated line-height of the given node in pixels.\n *\n * @private\n */\nexport function calculateLineHeightPx(\n nodeName: string,\n computedStyle: CSSStyleDeclaration,\n): number {\n const body = document.body\n if (!body) {\n return 0\n }\n\n const tempNode = document.createElement(nodeName)\n tempNode.innerHTML = \" \"\n tempNode.style.fontSize = computedStyle.fontSize\n tempNode.style.fontFamily = computedStyle.fontFamily\n tempNode.style.padding = \"0\"\n body.appendChild(tempNode)\n\n // Make sure textarea has only 1 row\n if (tempNode instanceof HTMLTextAreaElement) {\n ;(tempNode: HTMLTextAreaElement).rows = 1\n }\n\n // Assume the height of the element is the line-height\n const height = tempNode.offsetHeight\n body.removeChild(tempNode)\n\n return height\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils.js","// @flow\n/*eslint no-unused-vars: off*/\n\nimport EventEmitter from \"eventemitter3\"\n\nimport { createCustomEvent } from \"./utils\"\nimport SearchResult from \"./search_result\"\n\n/** @typedef */\nexport type CursorOffset = {\n lineHeight: number,\n top: number,\n left?: number,\n right?: number,\n}\n\ntype KeyCode = \"ESC\" | \"ENTER\" | \"UP\" | \"DOWN\" | \"OTHER\"\n\n/**\n * Abstract class representing a editor target.\n *\n * Editor classes must implement `#applySearchResult`, `#getCursorOffset` and\n * `#getBeforeCursor` methods.\n *\n * Editor classes must invoke `#emitMoveEvent`, `#emitEnterEvent`,\n * `#emitChangeEvent` and `#emitEscEvent` at proper timing.\n *\n * @abstract\n */\nexport default class Editor extends EventEmitter {\n /**\n * It is called when associated textcomplete object is destroyed.\n *\n * @return {this}\n */\n destroy() {\n return this\n }\n\n /**\n * It is called when a search result is selected by a user.\n */\n applySearchResult(_: SearchResult): void {\n throw new Error(\"Not implemented.\")\n }\n\n /**\n * The input cursor's absolute coordinates from the window's left\n * top corner.\n */\n getCursorOffset(): CursorOffset {\n throw new Error(\"Not implemented.\")\n }\n\n /**\n * Editor string value from head to cursor.\n * Returns null if selection type is range not cursor.\n */\n getBeforeCursor(): ?string {\n throw new Error(\"Not implemented.\")\n }\n\n /**\n * Emit a move event, which moves active dropdown element.\n * Child class must call this method at proper timing with proper parameter.\n *\n * @see {@link Textarea} for live example.\n */\n emitMoveEvent(code: \"UP\" | \"DOWN\"): CustomEvent {\n const moveEvent = createCustomEvent(\"move\", {\n cancelable: true,\n detail: {\n code: code,\n },\n })\n this.emit(\"move\", moveEvent)\n return moveEvent\n }\n\n /**\n * Emit a enter event, which selects current search result.\n * Child class must call this method at proper timing.\n *\n * @see {@link Textarea} for live example.\n */\n emitEnterEvent(): CustomEvent {\n const enterEvent = createCustomEvent(\"enter\", { cancelable: true })\n this.emit(\"enter\", enterEvent)\n return enterEvent\n }\n\n /**\n * Emit a change event, which triggers auto completion.\n * Child class must call this method at proper timing.\n *\n * @see {@link Textarea} for live example.\n */\n emitChangeEvent(): CustomEvent {\n const changeEvent = createCustomEvent(\"change\", {\n detail: {\n beforeCursor: this.getBeforeCursor(),\n },\n })\n this.emit(\"change\", changeEvent)\n return changeEvent\n }\n\n /**\n * Emit a esc event, which hides dropdown element.\n * Child class must call this method at proper timing.\n *\n * @see {@link Textarea} for live example.\n */\n emitEscEvent(): CustomEvent {\n const escEvent = createCustomEvent(\"esc\", { cancelable: true })\n this.emit(\"esc\", escEvent)\n return escEvent\n }\n\n /**\n * Helper method for parsing KeyboardEvent.\n *\n * @see {@link Textarea} for live example.\n */\n getCode(e: KeyboardEvent): KeyCode {\n return e.keyCode === 9\n ? \"ENTER\" // tab\n : e.keyCode === 13\n ? \"ENTER\" // enter\n : e.keyCode === 27\n ? \"ESC\" // esc\n : e.keyCode === 38\n ? \"UP\" // up\n : e.keyCode === 40\n ? \"DOWN\" // down\n : e.keyCode === 78 && e.ctrlKey\n ? \"DOWN\" // ctrl-n\n : e.keyCode === 80 && e.ctrlKey\n ? \"UP\" // ctrl-p\n : \"OTHER\"\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/editor.js","import Textcomplete from \"./textcomplete\"\nimport Textarea from \"./textarea\"\n\nlet editors\nif (global.Textcomplete && global.Textcomplete.editors) {\n editors = global.Textcomplete.editors\n} else {\n editors = {}\n}\neditors.Textarea = Textarea\n\nglobal.Textcomplete = Textcomplete\nglobal.Textcomplete.editors = editors\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.js","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = 6\n// module chunks = 0","// @flow\n\nimport Completer from \"./completer\"\nimport Editor from \"./editor\"\nimport Dropdown, { type DropdownOptions } from \"./dropdown\"\nimport Strategy, { type StrategyProperties } from \"./strategy\"\nimport SearchResult from \"./search_result\"\n\nimport EventEmitter from \"eventemitter3\"\n\nconst CALLBACK_METHODS = [\n \"handleChange\",\n \"handleEnter\",\n \"handleEsc\",\n \"handleHit\",\n \"handleMove\",\n \"handleSelect\",\n]\n\n/** @typedef */\ntype TextcompleteOptions = {\n dropdown?: DropdownOptions,\n}\n\n/**\n * The core of textcomplete. It acts as a mediator.\n */\nexport default class Textcomplete extends EventEmitter {\n dropdown: Dropdown\n editor: Editor\n options: TextcompleteOptions\n completer: Completer\n isQueryInFlight: boolean\n nextPendingQuery: string | null\n\n /**\n * @param {Editor} editor - Where the textcomplete works on.\n */\n constructor(editor: Editor, options: TextcompleteOptions = {}) {\n super()\n\n this.completer = new Completer()\n this.isQueryInFlight = false\n this.nextPendingQuery = null\n this.dropdown = new Dropdown(options.dropdown || {})\n this.editor = editor\n this.options = options\n\n CALLBACK_METHODS.forEach(method => {\n ;(this: any)[method] = (this: any)[method].bind(this)\n })\n\n this.startListening()\n }\n\n /**\n * @return {this}\n */\n destroy(destroyEditor: boolean = true) {\n this.completer.destroy()\n this.dropdown.destroy()\n if (destroyEditor) {\n this.editor.destroy()\n }\n this.stopListening()\n return this\n }\n\n /**\n * @return {this}\n */\n hide() {\n this.dropdown.deactivate()\n return this\n }\n\n /**\n * @return {this}\n * @example\n * textcomplete.register([{\n * match: /(^|\\s)(\\w+)$/,\n * search: function (term, callback) {\n * $.ajax({ ... })\n * .done(callback)\n * .fail([]);\n * },\n * replace: function (value) {\n * return '$1' + value + ' ';\n * }\n * }]);\n */\n register(strategyPropsArray: StrategyProperties[]) {\n strategyPropsArray.forEach(props => {\n this.completer.registerStrategy(new Strategy(props))\n })\n return this\n }\n\n /**\n * Start autocompleting.\n *\n * @param {string} text - Head to input cursor.\n * @return {this}\n */\n trigger(text: string) {\n if (this.isQueryInFlight) {\n this.nextPendingQuery = text\n } else {\n this.isQueryInFlight = true\n this.nextPendingQuery = null\n this.completer.run(text)\n }\n return this\n }\n\n /** @private */\n handleHit({ searchResults }: { searchResults: SearchResult[] }) {\n if (searchResults.length) {\n this.dropdown.render(searchResults, this.editor.getCursorOffset())\n } else {\n this.dropdown.deactivate()\n }\n this.isQueryInFlight = false\n if (this.nextPendingQuery !== null) {\n this.trigger(this.nextPendingQuery)\n }\n }\n\n /** @private */\n handleMove(e: CustomEvent) {\n e.detail.code === \"UP\" ? this.dropdown.up(e) : this.dropdown.down(e)\n }\n\n /** @private */\n handleEnter(e: CustomEvent) {\n const activeItem = this.dropdown.getActiveItem()\n if (activeItem) {\n this.dropdown.select(activeItem)\n e.preventDefault()\n } else {\n this.dropdown.deactivate()\n }\n }\n\n /** @private */\n handleEsc(e: CustomEvent) {\n if (this.dropdown.shown) {\n this.dropdown.deactivate()\n e.preventDefault()\n }\n }\n\n /** @private */\n handleChange(e: CustomEvent) {\n if (e.detail.beforeCursor != null) {\n this.trigger(e.detail.beforeCursor)\n } else {\n this.dropdown.deactivate()\n }\n }\n\n /** @private */\n handleSelect(selectEvent: CustomEvent) {\n this.emit(\"select\", selectEvent)\n if (!selectEvent.defaultPrevented) {\n this.editor.applySearchResult(selectEvent.detail.searchResult)\n }\n }\n\n /** @private */\n startListening() {\n this.editor\n .on(\"move\", this.handleMove)\n .on(\"enter\", this.handleEnter)\n .on(\"esc\", this.handleEsc)\n .on(\"change\", this.handleChange)\n this.dropdown.on(\"select\", this.handleSelect)\n ;[\n \"show\",\n \"shown\",\n \"render\",\n \"rendered\",\n \"selected\",\n \"hidden\",\n \"hide\",\n ].forEach(eventName => {\n this.dropdown.on(eventName, () => this.emit(eventName))\n })\n this.completer.on(\"hit\", this.handleHit)\n }\n\n /** @private */\n stopListening() {\n this.completer.removeAllListeners()\n this.dropdown.removeAllListeners()\n this.editor\n .removeListener(\"move\", this.handleMove)\n .removeListener(\"enter\", this.handleEnter)\n .removeListener(\"esc\", this.handleEsc)\n .removeListener(\"change\", this.handleChange)\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/textcomplete.js","// @flow\n\nimport EventEmitter from \"eventemitter3\"\n\nimport Query from \"./query\"\nimport SearchResult from \"./search_result\"\nimport Strategy from \"./strategy\"\n\nconst CALLBACK_METHODS = [\"handleQueryResult\"]\n\n/**\n * Complete engine.\n */\nexport default class Completer extends EventEmitter {\n strategies: Strategy[]\n\n constructor() {\n super()\n this.strategies = []\n\n CALLBACK_METHODS.forEach(method => {\n ;(this: any)[method] = (this: any)[method].bind(this)\n })\n }\n\n /**\n * @return {this}\n */\n destroy() {\n this.strategies.forEach(strategy => strategy.destroy())\n return this\n }\n\n /**\n * Register a strategy to the completer.\n *\n * @return {this}\n */\n registerStrategy(strategy: Strategy) {\n this.strategies.push(strategy)\n return this\n }\n\n /**\n * @param {string} text - Head to input cursor.\n */\n run(text: string): void {\n const query = this.extractQuery(text)\n if (query) {\n query.execute(this.handleQueryResult)\n } else {\n this.handleQueryResult([])\n }\n }\n\n /**\n * Find a query, which matches to the given text.\n *\n * @private\n */\n extractQuery(text: string) {\n for (let i = 0; i < this.strategies.length; i++) {\n const query = Query.build(this.strategies[i], text)\n if (query) {\n return query\n }\n }\n return null\n }\n\n /**\n * Callbacked by {@link Query#execute}.\n *\n * @private\n */\n handleQueryResult(searchResults: SearchResult[]) {\n this.emit(\"hit\", { searchResults })\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/completer.js","// @flow\n\nimport SearchResult from \"./search_result\"\nimport Strategy from \"./strategy\"\nimport type { MatchData } from \"./strategy\"\n\n/**\n * Encapsulate matching condition between a Strategy and current editor's value.\n */\nexport default class Query {\n strategy: Strategy\n term: string\n match: MatchData\n\n /**\n * Build a Query object by the given string if this matches to the string.\n *\n * @param {string} text - Head to input cursor.\n */\n static build(strategy: Strategy, text: string): ?Query {\n if (typeof strategy.props.context === \"function\") {\n const context = strategy.props.context(text)\n if (typeof context === \"string\") {\n text = context\n } else if (!context) {\n return null\n }\n }\n const match = strategy.matchText(text)\n return match ? new Query(strategy, match[strategy.index], match) : null\n }\n\n constructor(strategy: Strategy, term: string, match: MatchData) {\n this.strategy = strategy\n this.term = term\n this.match = match\n }\n\n /**\n * Invoke search strategy and callback the given function.\n */\n execute(callback: (SearchResult[]) => void) {\n this.strategy.search(\n this.term,\n results => {\n callback(\n results.map(result => {\n return new SearchResult(result, this.term, this.strategy)\n }),\n )\n },\n this.match,\n )\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/query.js","// @flow\nimport EventEmitter from \"eventemitter3\"\n\nimport DropdownItem, { type DropdownItemOptions } from \"./dropdown_item\"\nimport SearchResult from \"./search_result\"\nimport { createCustomEvent } from \"./utils\"\nimport type { CursorOffset } from \"./editor\"\n\nconst DEFAULT_CLASS_NAME = \"dropdown-menu textcomplete-dropdown\"\n\n/** @typedef */\nexport type DropdownOptions = {\n className?: string,\n footer?: any => string | string,\n header?: any => string | string,\n maxCount?: number,\n placement?: string,\n rotate?: boolean,\n style?: { [string]: string },\n item?: DropdownItemOptions,\n}\n\n/**\n * Encapsulate a dropdown view.\n *\n * @prop {boolean} shown - Whether the #el is shown or not.\n * @prop {DropdownItem[]} items - The array of rendered dropdown items.\n */\nexport default class Dropdown extends EventEmitter {\n shown: boolean\n items: DropdownItem[]\n activeItem: DropdownItem | null\n footer: $PropertyType<DropdownOptions, \"footer\">\n header: $PropertyType<DropdownOptions, \"header\">\n maxCount: $PropertyType<DropdownOptions, \"maxCount\">\n rotate: $PropertyType<DropdownOptions, \"rotate\">\n placement: $PropertyType<DropdownOptions, \"placement\">\n itemOptions: DropdownItemOptions\n _el: ?HTMLUListElement\n\n static createElement(): HTMLUListElement {\n const el = document.createElement(\"ul\")\n const style = el.style\n style.display = \"none\"\n style.position = \"absolute\"\n style.zIndex = \"10000\"\n const body = document.body\n if (body) {\n body.appendChild(el)\n }\n return el\n }\n\n constructor(options: DropdownOptions) {\n super()\n this.shown = false\n this.items = []\n this.activeItem = null\n this.footer = options.footer\n this.header = options.header\n this.maxCount = options.maxCount || 10\n this.el.className = options.className || DEFAULT_CLASS_NAME\n this.rotate = options.hasOwnProperty(\"rotate\") ? options.rotate : true\n this.placement = options.placement\n this.itemOptions = options.item || {}\n const style = options.style\n if (style) {\n Object.keys(style).forEach(key => {\n ;(this.el.style: any)[key] = style[key]\n })\n }\n }\n\n /**\n * @return {this}\n */\n destroy() {\n const parentNode = this.el.parentNode\n if (parentNode) {\n parentNode.removeChild(this.el)\n }\n this.clear()._el = null\n return this\n }\n\n get el(): HTMLUListElement {\n if (!this._el) {\n this._el = Dropdown.createElement()\n }\n return this._el\n }\n\n /**\n * Render the given data as dropdown items.\n *\n * @return {this}\n */\n render(searchResults: SearchResult[], cursorOffset: CursorOffset) {\n const renderEvent = createCustomEvent(\"render\", { cancelable: true })\n this.emit(\"render\", renderEvent)\n if (renderEvent.defaultPrevented) {\n return this\n }\n const rawResults = searchResults.map(searchResult => searchResult.data)\n const dropdownItems = searchResults\n .slice(0, this.maxCount || searchResults.length)\n .map(searchResult => new DropdownItem(searchResult, this.itemOptions))\n this.clear()\n .setStrategyId(searchResults[0])\n .renderEdge(rawResults, \"header\")\n .append(dropdownItems)\n .renderEdge(rawResults, \"footer\")\n .show()\n .setOffset(cursorOffset)\n this.emit(\"rendered\", createCustomEvent(\"rendered\"))\n return this\n }\n\n /**\n * Hide the dropdown then sweep out items.\n *\n * @return {this}\n */\n deactivate() {\n return this.hide().clear()\n }\n\n /**\n * @return {this}\n */\n select(dropdownItem: DropdownItem) {\n const detail = { searchResult: dropdownItem.searchResult }\n const selectEvent = createCustomEvent(\"select\", {\n cancelable: true,\n detail: detail,\n })\n this.emit(\"select\", selectEvent)\n if (selectEvent.defaultPrevented) {\n return this\n }\n this.deactivate()\n this.emit(\"selected\", createCustomEvent(\"selected\", { detail }))\n return this\n }\n\n /**\n * @return {this}\n */\n up(e: CustomEvent) {\n return this.shown ? this.moveActiveItem(\"prev\", e) : this\n }\n\n /**\n * @return {this}\n */\n down(e: CustomEvent) {\n return this.shown ? this.moveActiveItem(\"next\", e) : this\n }\n\n /**\n * Retrieve the active item.\n */\n getActiveItem(): DropdownItem | null {\n return this.activeItem\n }\n\n /**\n * Add items to dropdown.\n *\n * @private\n */\n append(items: DropdownItem[]) {\n const fragment = document.createDocumentFragment()\n items.forEach(item => {\n this.items.push(item)\n item.appended(this)\n fragment.appendChild(item.el)\n })\n this.el.appendChild(fragment)\n return this\n }\n\n /** @private */\n setOffset(cursorOffset: CursorOffset) {\n const doc = document.documentElement\n if (doc) {\n const elementWidth = this.el.offsetWidth\n if (cursorOffset.left) {\n const browserWidth = doc.clientWidth\n if (cursorOffset.left + elementWidth > browserWidth) {\n cursorOffset.left = browserWidth - elementWidth\n }\n this.el.style.left = `${cursorOffset.left}px`\n } else if (cursorOffset.right) {\n if (cursorOffset.right - elementWidth < 0) {\n cursorOffset.right = 0\n }\n this.el.style.right = `${cursorOffset.right}px`\n }\n if (this.isPlacementTop()) {\n this.el.style.bottom = `${doc.clientHeight -\n cursorOffset.top +\n cursorOffset.lineHeight}px`\n } else {\n this.el.style.top = `${cursorOffset.top}px`\n }\n }\n return this\n }\n\n /**\n * Show the element.\n *\n * @private\n */\n show() {\n if (!this.shown) {\n const showEvent = createCustomEvent(\"show\", { cancelable: true })\n this.emit(\"show\", showEvent)\n if (showEvent.defaultPrevented) {\n return this\n }\n this.el.style.display = \"block\"\n this.shown = true\n this.emit(\"shown\", createCustomEvent(\"shown\"))\n }\n return this\n }\n\n /**\n * Hide the element.\n *\n * @private\n */\n hide() {\n if (this.shown) {\n const hideEvent = createCustomEvent(\"hide\", { cancelable: true })\n this.emit(\"hide\", hideEvent)\n if (hideEvent.defaultPrevented) {\n return this\n }\n this.el.style.display = \"none\"\n this.shown = false\n this.emit(\"hidden\", createCustomEvent(\"hidden\"))\n }\n return this\n }\n\n /**\n * Clear search results.\n *\n * @private\n */\n clear() {\n this.el.innerHTML = \"\"\n this.items.forEach(item => item.destroy())\n this.items = []\n return this\n }\n\n /** @private */\n moveActiveItem(direction: \"next\" | \"prev\", e: CustomEvent) {\n const nextActiveItem =\n direction === \"next\"\n ? this.activeItem ? this.activeItem.next : this.items[0]\n : this.activeItem\n ? this.activeItem.prev\n : this.items[this.items.length - 1]\n if (nextActiveItem) {\n nextActiveItem.activate()\n e.preventDefault()\n }\n return this\n }\n\n /** @private */\n setStrategyId(searchResult: ?SearchResult) {\n const strategyId = searchResult && searchResult.strategy.props.id\n if (strategyId) {\n this.el.setAttribute(\"data-strategy\", strategyId)\n } else {\n this.el.removeAttribute(\"data-strategy\")\n }\n return this\n }\n\n /**\n * @private\n * @param {object[]} rawResults - What callbacked by search function.\n */\n renderEdge(rawResults: Object[], type: \"header\" | \"footer\") {\n const source = (type === \"header\" ? this.header : this.footer) || \"\"\n const content: any =\n typeof source === \"function\" ? source(rawResults) : source\n const li = document.createElement(\"li\")\n li.classList.add(`textcomplete-${type}`)\n li.innerHTML = content\n this.el.appendChild(li)\n return this\n }\n\n /** @private */\n isPlacementTop() {\n return this.placement === \"top\"\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/dropdown.js","// @flow\n\nimport SearchResult from \"./search_result\"\n\nexport const DEFAULT_CLASS_NAME = \"textcomplete-item\"\nconst CALLBACK_METHODS = [\"onClick\", \"onMouseover\"]\n\n/** @typedef */\nexport type DropdownItemOptions = {\n className?: string,\n}\n\n// Declare interface instead of importing Dropdown itself to prevent circular dependency.\ninterface Dropdown {\n activeItem: DropdownItem | null;\n items: DropdownItem[];\n rotate: ?Boolean;\n getActiveItem(): DropdownItem | null;\n select(DropdownItem): DropdownItem;\n}\n\n/**\n * Encapsulate an item of dropdown.\n */\nexport default class DropdownItem {\n searchResult: SearchResult\n active: boolean\n className: string\n activeClassName: string\n siblings: DropdownItem[]\n dropdown: Dropdown\n index: number\n _el: ?HTMLLIElement\n\n constructor(searchResult: SearchResult, options: DropdownItemOptions) {\n this.searchResult = searchResult\n this.active = false\n this.className = options.className || DEFAULT_CLASS_NAME\n this.activeClassName = `${this.className} active`\n\n CALLBACK_METHODS.forEach(method => {\n ;(this: any)[method] = (this: any)[method].bind(this)\n })\n }\n\n get el(): HTMLLIElement {\n if (this._el) {\n return this._el\n }\n const li = document.createElement(\"li\")\n li.className = this.active ? this.activeClassName : this.className\n const a = document.createElement(\"a\")\n a.innerHTML = this.searchResult.render()\n li.appendChild(a)\n this._el = li\n li.addEventListener(\"mousedown\", this.onClick)\n li.addEventListener(\"mouseover\", this.onMouseover)\n li.addEventListener(\"touchstart\", this.onClick)\n return li\n }\n\n /**\n * Try to free resources and perform other cleanup operations.\n */\n destroy() {\n this.el.removeEventListener(\"mousedown\", this.onClick, false)\n this.el.removeEventListener(\"mouseover\", this.onMouseover, false)\n this.el.removeEventListener(\"touchstart\", this.onClick, false)\n if (this.active) {\n this.dropdown.activeItem = null\n }\n // This element has already been removed by {@link Dropdown#clear}.\n this._el = null\n }\n\n /**\n * Callbacked when it is appended to a dropdown.\n *\n * @see Dropdown#append\n */\n appended(dropdown: Dropdown) {\n this.dropdown = dropdown\n this.siblings = dropdown.items\n this.index = this.siblings.length - 1\n }\n\n /**\n * Deactivate active item then activate itself.\n *\n * @return {this}\n */\n activate() {\n if (!this.active) {\n const activeItem = this.dropdown.getActiveItem()\n if (activeItem) {\n activeItem.deactivate()\n }\n this.dropdown.activeItem = this\n this.active = true\n this.el.className = this.activeClassName\n }\n return this\n }\n\n /**\n * Get the next sibling.\n */\n get next(): ?DropdownItem {\n let nextIndex\n if (this.index === this.siblings.length - 1) {\n if (!this.dropdown.rotate) {\n return null\n }\n nextIndex = 0\n } else {\n nextIndex = this.index + 1\n }\n return this.siblings[nextIndex]\n }\n\n /**\n * Get the previous sibling.\n */\n get prev(): ?DropdownItem {\n let nextIndex\n if (this.index === 0) {\n if (!this.dropdown.rotate) {\n return null\n }\n nextIndex = this.siblings.length - 1\n } else {\n nextIndex = this.index - 1\n }\n return this.siblings[nextIndex]\n }\n\n /** @private */\n deactivate() {\n if (this.active) {\n this.active = false\n this.el.className = this.className\n this.dropdown.activeItem = null\n }\n return this\n }\n\n /** @private */\n onClick(e: Event) {\n e.preventDefault() // Prevent blur event\n this.dropdown.select(this)\n }\n\n /** @private */\n onMouseover() {\n this.activate()\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/dropdown_item.js","// @flow\n\nimport update from \"undate/lib/update\"\n\nimport Editor from \"./editor\"\nimport { calculateElementOffset, getLineHeightPx } from \"./utils\"\nimport SearchResult from \"./search_result\"\n\nconst getCaretCoordinates = require(\"textarea-caret\")\n\nconst CALLBACK_METHODS = [\"onInput\", \"onKeydown\"]\n\n/**\n * Encapsulate the target textarea element.\n */\nexport default class Textarea extends Editor {\n el: HTMLTextAreaElement\n\n /**\n * @param {HTMLTextAreaElement} el - Where the textcomplete works on.\n */\n constructor(el: HTMLTextAreaElement) {\n super()\n this.el = el\n\n CALLBACK_METHODS.forEach(method => {\n ;(this: any)[method] = (this: any)[method].bind(this)\n })\n\n this.startListening()\n }\n\n /**\n * @return {this}\n */\n destroy() {\n super.destroy()\n this.stopListening()\n // Release the element reference early to help garbage collection.\n ;(this: any).el = null\n return this\n }\n\n /**\n * Implementation for {@link Editor#applySearchResult}\n */\n applySearchResult(searchResult: SearchResult) {\n const before = this.getBeforeCursor()\n if (before != null) {\n const replace = searchResult.replace(before, this.getAfterCursor())\n this.el.focus() // Clicking a dropdown item removes focus from the element.\n if (Array.isArray(replace)) {\n update(this.el, replace[0], replace[1])\n this.el.dispatchEvent(new Event(\"input\"))\n }\n }\n }\n\n /**\n * Implementation for {@link Editor#getCursorOffset}\n */\n getCursorOffset() {\n const elOffset = calculateElementOffset(this.el)\n const elScroll = this.getElScroll()\n const cursorPosition = this.getCursorPosition()\n const lineHeight = getLineHeightPx(this.el)\n const top = elOffset.top - elScroll.top + cursorPosition.top + lineHeight\n const left = elOffset.left - elScroll.left + cursorPosition.left\n if (this.el.dir !== \"rtl\") {\n return { top, left, lineHeight }\n } else {\n const right = document.documentElement\n ? document.documentElement.clientWidth - left\n : 0\n return { top, right, lineHeight }\n }\n }\n\n /**\n * Implementation for {@link Editor#getBeforeCursor}\n */\n getBeforeCursor() {\n return this.el.selectionStart !== this.el.selectionEnd\n ? null\n : this.el.value.substring(0, this.el.selectionEnd)\n }\n\n /** @private */\n getAfterCursor() {\n return this.el.value.substring(this.el.selectionEnd)\n }\n\n /** @private */\n getElScroll(): { top: number, left: number } {\n return { top: this.el.scrollTop, left: this.el.scrollLeft }\n }\n\n /**\n * The input cursor's relative coordinates from the textarea's left\n * top corner.\n *\n * @private\n */\n getCursorPosition(): { top: number, left: number } {\n return getCaretCoordinates(this.el, this.el.selectionEnd)\n }\n\n /** @private */\n onInput() {\n this.emitChangeEvent()\n }\n\n /** @private */\n onKeydown(e: KeyboardEvent) {\n const code = this.getCode(e)\n let event\n if (code === \"UP\" || code === \"DOWN\") {\n event = this.emitMoveEvent(code)\n } else if (code === \"ENTER\") {\n event = this.emitEnterEvent()\n } else if (code === \"ESC\") {\n event = this.emitEscEvent()\n }\n if (event && event.defaultPrevented) {\n e.preventDefault()\n }\n }\n\n /** @private */\n startListening() {\n this.el.addEventListener(\"input\", this.onInput)\n this.el.addEventListener(\"keydown\", this.onKeydown)\n }\n\n /** @private */\n stopListening() {\n this.el.removeEventListener(\"input\", this.onInput)\n this.el.removeEventListener(\"keydown\", this.onKeydown)\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/textarea.js","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (el, headToCursor, cursorToTail) {\n var curr = el.value,\n // strA + strB1 + strC\n next = headToCursor + (cursorToTail || ''),\n // strA + strB2 + strC\n activeElement = document.activeElement;\n\n // Calculate length of strA and strC\n var aLength = 0,\n cLength = 0;\n while (aLength < curr.length && aLength < next.length && curr[aLength] === next[aLength]) {\n aLength++;\n }\n while (curr.length - cLength - 1 >= 0 && next.length - cLength - 1 >= 0 && curr[curr.length - cLength - 1] === next[next.length - cLength - 1]) {\n cLength++;\n }\n aLength = Math.min(aLength, Math.min(curr.length, next.length) - cLength);\n\n // Select strB1\n el.setSelectionRange(aLength, curr.length - cLength);\n\n // Get strB2\n var strB2 = next.substring(aLength, next.length - cLength);\n\n // Replace strB1 with strB2\n el.focus();\n if (!document.execCommand('insertText', false, strB2)) {\n // Document.execCommand returns false if the command is not supported.\n // Firefox and IE returns false in this case.\n el.value = next;\n el.dispatchEvent(createInputEvent());\n }\n\n // Move cursor to the end of headToCursor\n el.setSelectionRange(headToCursor.length, headToCursor.length);\n\n activeElement && activeElement.focus();\n return el;\n};\n\nfunction createInputEvent() {\n if (typeof Event !== \"undefined\") {\n return new Event(\"input\", { bubbles: true, cancelable: true });\n } else {\n var event = document.createEvent(\"Event\");\n event.initEvent(\"input\", true, true);\n return event;\n }\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/undate/lib/update.js\n// module id = 13\n// module chunks = 0","/* jshint browser: true */\n\n(function () {\n\n// The properties that we copy into a mirrored div.\n// Note that some browsers, such as Firefox,\n// do not concatenate properties, i.e. padding-top, bottom etc. -> padding,\n// so we have to do every single property specifically.\nvar properties = [\n 'direction', // RTL support\n 'boxSizing',\n 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does\n 'height',\n 'overflowX',\n 'overflowY', // copy the scrollbar for IE\n\n 'borderTopWidth',\n 'borderRightWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'borderStyle',\n\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/font\n 'fontStyle',\n 'fontVariant',\n 'fontWeight',\n 'fontStretch',\n 'fontSize',\n 'fontSizeAdjust',\n 'lineHeight',\n 'fontFamily',\n\n 'textAlign',\n 'textTransform',\n 'textIndent',\n 'textDecoration', // might not make a difference, but better be safe\n\n 'letterSpacing',\n 'wordSpacing',\n\n 'tabSize',\n 'MozTabSize'\n\n];\n\nvar isBrowser = (typeof window !== 'undefined');\nvar isFirefox = (isBrowser && window.mozInnerScreenX != null);\n\nfunction getCaretCoordinates(element, position, options) {\n if(!isBrowser) {\n throw new Error('textarea-caret-position#getCaretCoordinates should only be called in a browser');\n }\n\n var debug = options && options.debug || false;\n if (debug) {\n var el = document.querySelector('#input-textarea-caret-position-mirror-div');\n if ( el ) { el.parentNode.removeChild(el); }\n }\n\n // mirrored div\n var div = document.createElement('div');\n div.id = 'input-textarea-caret-position-mirror-div';\n document.body.appendChild(div);\n\n var style = div.style;\n var computed = window.getComputedStyle? getComputedStyle(element) : element.currentStyle; // currentStyle for IE < 9\n\n // default textarea styles\n style.whiteSpace = 'pre-wrap';\n if (element.nodeName !== 'INPUT')\n style.wordWrap = 'break-word'; // only for textarea-s\n\n // position off-screen\n style.position = 'absolute'; // required to return coordinates properly\n if (!debug)\n style.visibility = 'hidden'; // not 'display: none' because we want rendering\n\n // transfer the element's properties to the div\n properties.forEach(function (prop) {\n style[prop] = computed[prop];\n });\n\n if (isFirefox) {\n // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275\n if (element.scrollHeight > parseInt(computed.height))\n style.overflowY = 'scroll';\n } else {\n style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll'\n }\n\n div.textContent = element.value.substring(0, position);\n // the second special handling for input type=\"text\" vs textarea: spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037\n if (element.nodeName === 'INPUT')\n div.textContent = div.textContent.replace(/\\s/g, '\\u00a0');\n\n var span = document.createElement('span');\n // Wrapping must be replicated *exactly*, including when a long word gets\n // onto the next line, with whitespace at the end of the line before (#7).\n // The *only* reliable way to do that is to copy the *entire* rest of the\n // textarea's content into the <span> created at the caret position.\n // for inputs, just '.' would be enough, but why bother?\n span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all\n div.appendChild(span);\n\n var coordinates = {\n top: span.offsetTop + parseInt(computed['borderTopWidth']),\n left: span.offsetLeft + parseInt(computed['borderLeftWidth'])\n };\n\n if (debug) {\n span.style.backgroundColor = '#aaa';\n } else {\n document.body.removeChild(div);\n }\n\n return coordinates;\n}\n\nif (typeof module != 'undefined' && typeof module.exports != 'undefined') {\n module.exports = getCaretCoordinates;\n} else if(isBrowser){\n window.getCaretCoordinates = getCaretCoordinates;\n}\n\n}());\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/textarea-caret/index.js\n// module id = 14\n// module chunks = 0"],"sourceRoot":""}
\ No newline at end of file diff --git a/library/textcomplete/textcomplete.min.js b/library/textcomplete/textcomplete.min.js new file mode 100644 index 000000000..717a2c905 --- /dev/null +++ b/library/textcomplete/textcomplete.min.js @@ -0,0 +1,2 @@ +!function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=5)}([function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=n(2),s=(function(e){e&&e.__esModule}(o),function(){function e(t,n,i){r(this,e),this.data=t,this.term=n,this.strategy=i}return i(e,[{key:"replace",value:function(e,t){var n=this.strategy.replace(this.data);if(null!==n){Array.isArray(n)&&(t=n[1]+t,n=n[0]);var r=this.strategy.matchText(e);if(r)return n=n.replace(/\$&/g,r[0]).replace(/\$(\d)/g,function(e,t){return r[parseInt(t,10)]}),[[e.slice(0,r.index),n,e.slice(r.index+r[0].length)].join(""),t]}}},{key:"render",value:function(){return this.strategy.template(this.data,this.term)}}]),e}());t.default=s},function(e){"use strict";function t(){}function n(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function r(){this._events=new t,this._eventsCount=0}var i=Object.prototype.hasOwnProperty,o="~";Object.create&&(t.prototype=Object.create(null),(new t).__proto__||(o=!1)),r.prototype.eventNames=function(){var e,t,n=[];if(0===this._eventsCount)return n;for(t in e=this._events)i.call(e,t)&&n.push(o?t.slice(1):t);return Object.getOwnPropertySymbols?n.concat(Object.getOwnPropertySymbols(e)):n},r.prototype.listeners=function(e,t){var n=o?o+e:e,r=this._events[n];if(t)return!!r;if(!r)return[];if(r.fn)return[r.fn];for(var i=0,s=r.length,a=new Array(s);i<s;i++)a[i]=r[i].fn;return a},r.prototype.emit=function(e,t,n,r,i,s){var a=o?o+e:e;if(!this._events[a])return!1;var u,l,c=this._events[a],h=arguments.length;if(c.fn){switch(c.once&&this.removeListener(e,c.fn,void 0,!0),h){case 1:return c.fn.call(c.context),!0;case 2:return c.fn.call(c.context,t),!0;case 3:return c.fn.call(c.context,t,n),!0;case 4:return c.fn.call(c.context,t,n,r),!0;case 5:return c.fn.call(c.context,t,n,r,i),!0;case 6:return c.fn.call(c.context,t,n,r,i,s),!0}for(l=1,u=new Array(h-1);l<h;l++)u[l-1]=arguments[l];c.fn.apply(c.context,u)}else{var f,d=c.length;for(l=0;l<d;l++)switch(c[l].once&&this.removeListener(e,c[l].fn,void 0,!0),h){case 1:c[l].fn.call(c[l].context);break;case 2:c[l].fn.call(c[l].context,t);break;case 3:c[l].fn.call(c[l].context,t,n);break;case 4:c[l].fn.call(c[l].context,t,n,r);break;default:if(!u)for(f=1,u=new Array(h-1);f<h;f++)u[f-1]=arguments[f];c[l].fn.apply(c[l].context,u)}}return!0},r.prototype.on=function(e,t,r){var i=new n(t,r||this),s=o?o+e:e;return this._events[s]?this._events[s].fn?this._events[s]=[this._events[s],i]:this._events[s].push(i):(this._events[s]=i,this._eventsCount++),this},r.prototype.once=function(e,t,r){var i=new n(t,r||this,!0),s=o?o+e:e;return this._events[s]?this._events[s].fn?this._events[s]=[this._events[s],i]:this._events[s].push(i):(this._events[s]=i,this._eventsCount++),this},r.prototype.removeListener=function(e,n,r,i){var s=o?o+e:e;if(!this._events[s])return this;if(!n)return 0==--this._eventsCount?this._events=new t:delete this._events[s],this;var a=this._events[s];if(a.fn)a.fn!==n||i&&!a.once||r&&a.context!==r||(0==--this._eventsCount?this._events=new t:delete this._events[s]);else{for(var u=0,l=[],c=a.length;u<c;u++)(a[u].fn!==n||i&&!a[u].once||r&&a[u].context!==r)&&l.push(a[u]);l.length?this._events[s]=1===l.length?l[0]:l:0==--this._eventsCount?this._events=new t:delete this._events[s]}return this},r.prototype.removeAllListeners=function(e){var n;return e?(n=o?o+e:e,this._events[n]&&(0==--this._eventsCount?this._events=new t:delete this._events[n])):(this._events=new t,this._eventsCount=0),this},r.prototype.off=r.prototype.removeListener,r.prototype.addListener=r.prototype.on,r.prototype.setMaxListeners=function(){return this},r.prefixed=o,r.EventEmitter=r,e.exports=r},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e){return e}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function(){function e(t){n(this,e),this.props=t,this.cache=t.cache?{}:null}return i(e,[{key:"destroy",value:function(){return this.cache=null,this}},{key:"search",value:function(e,t,n){this.cache?this.searchWithCache(e,t,n):this.props.search(e,t,n)}},{key:"replace",value:function(e){return this.props.replace(e)}},{key:"searchWithCache",value:function(e,t,n){var r=this;this.cache&&this.cache[e]?t(this.cache[e]):this.props.search(e,function(n){r.cache&&(r.cache[e]=n),t(n)},n)}},{key:"matchText",value:function(e){return"function"==typeof this.match?this.match(e):e.match(this.match)}},{key:"match",get:function(){return this.props.match}},{key:"index",get:function(){return"number"==typeof this.props.index?this.props.index:2}},{key:"template",get:function(){return this.props.template||r}}]),e}();t.default=o},function(e,t){"use strict";function n(e){var t=e.getBoundingClientRect(),n=e.ownerDocument,r=n.defaultView,i=n.documentElement,o={top:t.top+r.pageYOffset,left:t.left+r.pageXOffset};return i&&(o.top-=i.clientTop,o.left-=i.clientLeft),o}function r(e){return e>=s&&e<=a}function i(e){var t=window.getComputedStyle(e);return r(t.lineHeight.charCodeAt(0))?r(t.lineHeight.charCodeAt(t.lineHeight.length-1))?parseFloat(t.lineHeight)*parseFloat(t.fontSize):parseFloat(t.lineHeight):o(e.nodeName,t)}function o(e,t){var n=document.body;if(!n)return 0;var r=document.createElement(e);r.innerHTML=" ",r.style.fontSize=t.fontSize,r.style.fontFamily=t.fontFamily,r.style.padding="0",n.appendChild(r),r instanceof HTMLTextAreaElement&&(r.rows=1);var i=r.offsetHeight;return n.removeChild(r),i}Object.defineProperty(t,"__esModule",{value:!0}),t.calculateElementOffset=n,t.getLineHeightPx=i,t.calculateLineHeightPx=o;var s=(t.createCustomEvent=function(){return"function"==typeof window.CustomEvent?function(e,t){return new document.defaultView.CustomEvent(e,{cancelable:t&&t.cancelable||!1,detail:t&&t.detail||void 0})}:function(e,t){var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,!1,t&&t.cancelable||!1,t&&t.detail||void 0),n}}(),"0".charCodeAt(0)),a="9".charCodeAt(0)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(1),l=r(u),c=n(3),h=n(0),f=(r(h),function(e){function t(){return i(this,t),o(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return s(t,e),a(t,[{key:"destroy",value:function(){return this}},{key:"applySearchResult",value:function(){throw new Error("Not implemented.")}},{key:"getCursorOffset",value:function(){throw new Error("Not implemented.")}},{key:"getBeforeCursor",value:function(){throw new Error("Not implemented.")}},{key:"emitMoveEvent",value:function(e){var t=(0,c.createCustomEvent)("move",{cancelable:!0,detail:{code:e}});return this.emit("move",t),t}},{key:"emitEnterEvent",value:function(){var e=(0,c.createCustomEvent)("enter",{cancelable:!0});return this.emit("enter",e),e}},{key:"emitChangeEvent",value:function(){var e=(0,c.createCustomEvent)("change",{detail:{beforeCursor:this.getBeforeCursor()}});return this.emit("change",e),e}},{key:"emitEscEvent",value:function(){var e=(0,c.createCustomEvent)("esc",{cancelable:!0});return this.emit("esc",e),e}},{key:"getCode",value:function(e){return 9===e.keyCode?"ENTER":13===e.keyCode?"ENTER":27===e.keyCode?"ESC":38===e.keyCode?"UP":40===e.keyCode?"DOWN":78===e.keyCode&&e.ctrlKey?"DOWN":80===e.keyCode&&e.ctrlKey?"UP":"OTHER"}}]),t}(l.default));t.default=f},function(e,t,n){"use strict";(function(e){function t(e){return e&&e.__esModule?e:{default:e}}var r=n(7),i=t(r),o=n(12),s=t(o),a=void 0;a=e.Textcomplete&&e.Textcomplete.editors?e.Textcomplete.editors:{},a.Textarea=s.default,e.Textcomplete=i.default,e.Textcomplete.editors=a}).call(t,n(6))},function(e){var t;t=function(){return this}();try{t=t||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(t=window)}e.exports=t},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(8),l=r(u),c=n(4),h=(r(c),n(10)),f=r(h),d=n(2),v=r(d),p=n(0),y=(r(p),n(1)),m=r(y),g=["handleChange","handleEnter","handleEsc","handleHit","handleMove","handleSelect"],b=function(e){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};i(this,t);var r=o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return r.completer=new l.default,r.isQueryInFlight=!1,r.nextPendingQuery=null,r.dropdown=new f.default(n.dropdown||{}),r.editor=e,r.options=n,g.forEach(function(e){r[e]=r[e].bind(r)}),r.startListening(),r}return s(t,e),a(t,[{key:"destroy",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this.completer.destroy(),this.dropdown.destroy(),e&&this.editor.destroy(),this.stopListening(),this}},{key:"hide",value:function(){return this.dropdown.deactivate(),this}},{key:"register",value:function(e){var t=this;return e.forEach(function(e){t.completer.registerStrategy(new v.default(e))}),this}},{key:"trigger",value:function(e){return this.isQueryInFlight?this.nextPendingQuery=e:(this.isQueryInFlight=!0,this.nextPendingQuery=null,this.completer.run(e)),this}},{key:"handleHit",value:function(e){var t=e.searchResults;t.length?this.dropdown.render(t,this.editor.getCursorOffset()):this.dropdown.deactivate(),this.isQueryInFlight=!1,null!==this.nextPendingQuery&&this.trigger(this.nextPendingQuery)}},{key:"handleMove",value:function(e){"UP"===e.detail.code?this.dropdown.up(e):this.dropdown.down(e)}},{key:"handleEnter",value:function(e){var t=this.dropdown.getActiveItem();t?(this.dropdown.select(t),e.preventDefault()):this.dropdown.deactivate()}},{key:"handleEsc",value:function(e){this.dropdown.shown&&(this.dropdown.deactivate(),e.preventDefault())}},{key:"handleChange",value:function(e){null!=e.detail.beforeCursor?this.trigger(e.detail.beforeCursor):this.dropdown.deactivate()}},{key:"handleSelect",value:function(e){this.emit("select",e),e.defaultPrevented||this.editor.applySearchResult(e.detail.searchResult)}},{key:"startListening",value:function(){var e=this;this.editor.on("move",this.handleMove).on("enter",this.handleEnter).on("esc",this.handleEsc).on("change",this.handleChange),this.dropdown.on("select",this.handleSelect),["show","shown","render","rendered","selected","hidden","hide"].forEach(function(t){e.dropdown.on(t,function(){return e.emit(t)})}),this.completer.on("hit",this.handleHit)}},{key:"stopListening",value:function(){this.completer.removeAllListeners(),this.dropdown.removeAllListeners(),this.editor.removeListener("move",this.handleMove).removeListener("enter",this.handleEnter).removeListener("esc",this.handleEsc).removeListener("change",this.handleChange)}}]),t}(m.default);t.default=b},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(1),l=r(u),c=n(9),h=r(c),f=n(0),d=(r(f),n(2)),v=(r(d),["handleQueryResult"]),p=function(e){function t(){i(this,t);var e=o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return e.strategies=[],v.forEach(function(t){e[t]=e[t].bind(e)}),e}return s(t,e),a(t,[{key:"destroy",value:function(){return this.strategies.forEach(function(e){return e.destroy()}),this}},{key:"registerStrategy",value:function(e){return this.strategies.push(e),this}},{key:"run",value:function(e){var t=this.extractQuery(e);t?t.execute(this.handleQueryResult):this.handleQueryResult([])}},{key:"extractQuery",value:function(e){for(var t=0;t<this.strategies.length;t++){var n=h.default.build(this.strategies[t],e);if(n)return n}return null}},{key:"handleQueryResult",value:function(e){this.emit("hit",{searchResults:e})}}]),t}(l.default);t.default=p},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(0),a=r(s),u=n(2),l=(r(u),function(){function e(t,n,r){i(this,e),this.strategy=t,this.term=n,this.match=r}return o(e,null,[{key:"build",value:function(t,n){if("function"==typeof t.props.context){var r=t.props.context(n);if("string"==typeof r)n=r;else if(!r)return null}var i=t.matchText(n);return i?new e(t,i[t.index],i):null}}]),o(e,[{key:"execute",value:function(e){var t=this;this.strategy.search(this.term,function(n){e(n.map(function(e){return new a.default(e,t.term,t.strategy)}))},this.match)}}]),e}());t.default=l},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(1),l=r(u),c=n(11),h=r(c),f=n(0),d=(r(f),n(3)),v="dropdown-menu textcomplete-dropdown",p=function(e){function t(e){i(this,t);var n=o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));n.shown=!1,n.items=[],n.activeItem=null,n.footer=e.footer,n.header=e.header,n.maxCount=e.maxCount||10,n.el.className=e.className||v,n.rotate=!e.hasOwnProperty("rotate")||e.rotate,n.placement=e.placement,n.itemOptions=e.item||{};var r=e.style;return r&&Object.keys(r).forEach(function(e){n.el.style[e]=r[e]}),n}return s(t,e),a(t,null,[{key:"createElement",value:function(){var e=document.createElement("ul"),t=e.style;t.display="none",t.position="absolute",t.zIndex="10000";var n=document.body;return n&&n.appendChild(e),e}}]),a(t,[{key:"destroy",value:function(){var e=this.el.parentNode;return e&&e.removeChild(this.el),this.clear()._el=null,this}},{key:"render",value:function(e,t){var n=this,r=(0,d.createCustomEvent)("render",{cancelable:!0});if(this.emit("render",r),r.defaultPrevented)return this;var i=e.map(function(e){return e.data}),o=e.slice(0,this.maxCount||e.length).map(function(e){return new h.default(e,n.itemOptions)});return this.clear().setStrategyId(e[0]).renderEdge(i,"header").append(o).renderEdge(i,"footer").show().setOffset(t),this.emit("rendered",(0,d.createCustomEvent)("rendered")),this}},{key:"deactivate",value:function(){return this.hide().clear()}},{key:"select",value:function(e){var t={searchResult:e.searchResult},n=(0,d.createCustomEvent)("select",{cancelable:!0,detail:t});return this.emit("select",n),n.defaultPrevented?this:(this.deactivate(),this.emit("selected",(0,d.createCustomEvent)("selected",{detail:t})),this)}},{key:"up",value:function(e){return this.shown?this.moveActiveItem("prev",e):this}},{key:"down",value:function(e){return this.shown?this.moveActiveItem("next",e):this}},{key:"getActiveItem",value:function(){return this.activeItem}},{key:"append",value:function(e){var t=this,n=document.createDocumentFragment();return e.forEach(function(e){t.items.push(e),e.appended(t),n.appendChild(e.el)}),this.el.appendChild(n),this}},{key:"setOffset",value:function(e){var t=document.documentElement;if(t){var n=this.el.offsetWidth;if(e.left){var r=t.clientWidth;e.left+n>r&&(e.left=r-n),this.el.style.left=e.left+"px"}else e.right&&(e.right-n<0&&(e.right=0),this.el.style.right=e.right+"px");this.isPlacementTop()?this.el.style.bottom=t.clientHeight-e.top+e.lineHeight+"px":this.el.style.top=e.top+"px"}return this}},{key:"show",value:function(){if(!this.shown){var e=(0,d.createCustomEvent)("show",{cancelable:!0});if(this.emit("show",e),e.defaultPrevented)return this;this.el.style.display="block",this.shown=!0,this.emit("shown",(0,d.createCustomEvent)("shown"))}return this}},{key:"hide",value:function(){if(this.shown){var e=(0,d.createCustomEvent)("hide",{cancelable:!0});if(this.emit("hide",e),e.defaultPrevented)return this;this.el.style.display="none",this.shown=!1,this.emit("hidden",(0,d.createCustomEvent)("hidden"))}return this}},{key:"clear",value:function(){return this.el.innerHTML="",this.items.forEach(function(e){return e.destroy()}),this.items=[],this}},{key:"moveActiveItem",value:function(e,t){var n="next"===e?this.activeItem?this.activeItem.next:this.items[0]:this.activeItem?this.activeItem.prev:this.items[this.items.length-1];return n&&(n.activate(),t.preventDefault()),this}},{key:"setStrategyId",value:function(e){var t=e&&e.strategy.props.id;return t?this.el.setAttribute("data-strategy",t):this.el.removeAttribute("data-strategy"),this}},{key:"renderEdge",value:function(e,t){var n=("header"===t?this.header:this.footer)||"",r="function"==typeof n?n(e):n,i=document.createElement("li");return i.classList.add("textcomplete-"+t),i.innerHTML=r,this.el.appendChild(i),this}},{key:"isPlacementTop",value:function(){return"top"===this.placement}},{key:"el",get:function(){return this._el||(this._el=t.createElement()),this._el}}]),t}(l.default);t.default=p},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_CLASS_NAME=void 0;var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=n(0),s=(function(e){e&&e.__esModule}(o),t.DEFAULT_CLASS_NAME="textcomplete-item"),a=["onClick","onMouseover"],u=function(){function e(t,n){var i=this;r(this,e),this.searchResult=t,this.active=!1,this.className=n.className||s,this.activeClassName=this.className+" active",a.forEach(function(e){i[e]=i[e].bind(i)})}return i(e,[{key:"destroy",value:function(){this.el.removeEventListener("mousedown",this.onClick,!1),this.el.removeEventListener("mouseover",this.onMouseover,!1),this.el.removeEventListener("touchstart",this.onClick,!1),this.active&&(this.dropdown.activeItem=null),this._el=null}},{key:"appended",value:function(e){this.dropdown=e,this.siblings=e.items,this.index=this.siblings.length-1}},{key:"activate",value:function(){if(!this.active){var e=this.dropdown.getActiveItem();e&&e.deactivate(),this.dropdown.activeItem=this,this.active=!0,this.el.className=this.activeClassName}return this}},{key:"deactivate",value:function(){return this.active&&(this.active=!1,this.el.className=this.className,this.dropdown.activeItem=null),this}},{key:"onClick",value:function(e){e.preventDefault(),this.dropdown.select(this)}},{key:"onMouseover",value:function(){this.activate()}},{key:"el",get:function(){if(this._el)return this._el;var e=document.createElement("li");e.className=this.active?this.activeClassName:this.className;var t=document.createElement("a");return t.innerHTML=this.searchResult.render(),e.appendChild(t),this._el=e,e.addEventListener("mousedown",this.onClick),e.addEventListener("mouseover",this.onMouseover),e.addEventListener("touchstart",this.onClick),e}},{key:"next",get:function(){var e=void 0;if(this.index===this.siblings.length-1){if(!this.dropdown.rotate)return null;e=0}else e=this.index+1;return this.siblings[e]}},{key:"prev",get:function(){var e=void 0;if(0===this.index){if(!this.dropdown.rotate)return null;e=this.siblings.length-1}else e=this.index-1;return this.siblings[e]}}]),e}();t.default=u},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=function e(t,n,r){null===t&&(t=Function.prototype);var i=Object.getOwnPropertyDescriptor(t,n);if(void 0===i){var o=Object.getPrototypeOf(t);return null===o?void 0:e(o,n,r)}if("value"in i)return i.value;var s=i.get;if(void 0!==s)return s.call(r)},l=n(13),c=r(l),h=n(4),f=r(h),d=n(3),v=n(0),p=(r(v),n(14)),y=["onInput","onKeydown"],m=function(e){function t(e){i(this,t);var n=o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return n.el=e,y.forEach(function(e){n[e]=n[e].bind(n)}),n.startListening(),n}return s(t,e),a(t,[{key:"destroy",value:function(){return u(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"destroy",this).call(this),this.stopListening(),this.el=null,this}},{key:"applySearchResult",value:function(e){var t=this.getBeforeCursor();if(null!=t){var n=e.replace(t,this.getAfterCursor());this.el.focus(),Array.isArray(n)&&((0,c.default)(this.el,n[0],n[1]),this.el.dispatchEvent(new Event("input")))}}},{key:"getCursorOffset",value:function(){var e=(0,d.calculateElementOffset)(this.el),t=this.getElScroll(),n=this.getCursorPosition(),r=(0,d.getLineHeightPx)(this.el),i=e.top-t.top+n.top+r,o=e.left-t.left+n.left;return"rtl"!==this.el.dir?{top:i,left:o,lineHeight:r}:{top:i,right:document.documentElement?document.documentElement.clientWidth-o:0,lineHeight:r}}},{key:"getBeforeCursor",value:function(){return this.el.selectionStart!==this.el.selectionEnd?null:this.el.value.substring(0,this.el.selectionEnd)}},{key:"getAfterCursor",value:function(){return this.el.value.substring(this.el.selectionEnd)}},{key:"getElScroll",value:function(){return{top:this.el.scrollTop,left:this.el.scrollLeft}}},{key:"getCursorPosition",value:function(){return p(this.el,this.el.selectionEnd)}},{key:"onInput",value:function(){this.emitChangeEvent()}},{key:"onKeydown",value:function(e){var t=this.getCode(e),n=void 0;"UP"===t||"DOWN"===t?n=this.emitMoveEvent(t):"ENTER"===t?n=this.emitEnterEvent():"ESC"===t&&(n=this.emitEscEvent()),n&&n.defaultPrevented&&e.preventDefault()}},{key:"startListening",value:function(){this.el.addEventListener("input",this.onInput),this.el.addEventListener("keydown",this.onKeydown)}},{key:"stopListening",value:function(){this.el.removeEventListener("input",this.onInput),this.el.removeEventListener("keydown",this.onKeydown)}}]),t}(f.default);t.default=m},function(e,t){"use strict";function n(){if("undefined"!=typeof Event)return new Event("input",{bubbles:!0,cancelable:!0});var e=document.createEvent("Event");return e.initEvent("input",!0,!0),e}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){for(var i=e.value,o=t+(r||""),s=document.activeElement,a=0,u=0;a<i.length&&a<o.length&&i[a]===o[a];)a++;for(;i.length-u-1>=0&&o.length-u-1>=0&&i[i.length-u-1]===o[o.length-u-1];)u++;a=Math.min(a,Math.min(i.length,o.length)-u),e.setSelectionRange(a,i.length-u);var l=o.substring(a,o.length-u);return e.focus(),document.execCommand("insertText",!1,l)||(e.value=o,e.dispatchEvent(n())),e.setSelectionRange(t.length,t.length),s&&s.focus(),e}},function(e){!function(){function t(e,t,o){if(!r)throw new Error("textarea-caret-position#getCaretCoordinates should only be called in a browser");var s=o&&o.debug||!1;if(s){var a=document.querySelector("#input-textarea-caret-position-mirror-div");a&&a.parentNode.removeChild(a)}var u=document.createElement("div");u.id="input-textarea-caret-position-mirror-div",document.body.appendChild(u);var l=u.style,c=window.getComputedStyle?getComputedStyle(e):e.currentStyle;l.whiteSpace="pre-wrap","INPUT"!==e.nodeName&&(l.wordWrap="break-word"),l.position="absolute",s||(l.visibility="hidden"),n.forEach(function(e){l[e]=c[e]}),i?e.scrollHeight>parseInt(c.height)&&(l.overflowY="scroll"):l.overflow="hidden",u.textContent=e.value.substring(0,t),"INPUT"===e.nodeName&&(u.textContent=u.textContent.replace(/\s/g," "));var h=document.createElement("span");h.textContent=e.value.substring(t)||".",u.appendChild(h);var f={top:h.offsetTop+parseInt(c.borderTopWidth),left:h.offsetLeft+parseInt(c.borderLeftWidth)};return s?h.style.backgroundColor="#aaa":document.body.removeChild(u),f}var n=["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderStyle","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing","tabSize","MozTabSize"],r="undefined"!=typeof window,i=r&&null!=window.mozInnerScreenX;void 0!==e&&void 0!==e.exports?e.exports=t:r&&(window.getCaretCoordinates=t)}()}]); +//# sourceMappingURL=textcomplete.min.js.map
\ No newline at end of file diff --git a/library/textcomplete/textcomplete.min.js.map b/library/textcomplete/textcomplete.min.js.map new file mode 100644 index 000000000..435675297 --- /dev/null +++ b/library/textcomplete/textcomplete.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///textcomplete.min.js","webpack:///webpack/bootstrap 5fdd342a07201b673919","webpack:///./src/search_result.js","webpack:///./node_modules/eventemitter3/index.js","webpack:///./src/strategy.js","webpack:///./src/utils.js","webpack:///./src/editor.js","webpack:///./src/main.js","webpack:///(webpack)/buildin/global.js","webpack:///./src/textcomplete.js","webpack:///./src/completer.js","webpack:///./src/query.js","webpack:///./src/dropdown.js","webpack:///./src/dropdown_item.js","webpack:///./src/textarea.js","webpack:///./node_modules/undate/lib/update.js","webpack:///./node_modules/textarea-caret/index.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","_classCallCheck","instance","Constructor","TypeError","value","_createClass","defineProperties","target","props","length","descriptor","writable","key","protoProps","staticProps","_strategy","SearchResult","obj","data","term","strategy","this","beforeCursor","afterCursor","replacement","replace","Array","isArray","match","matchText","_","p1","parseInt","slice","index","join","template","default","Events","EE","fn","context","once","EventEmitter","_events","_eventsCount","has","prefix","create","__proto__","eventNames","events","names","push","getOwnPropertySymbols","concat","listeners","event","exists","evt","available","ee","emit","a1","a2","a3","a4","a5","args","len","arguments","removeListener","undefined","apply","j","on","listener","removeAllListeners","off","addListener","setMaxListeners","prefixed","DEFAULT_TEMPLATE","Strategy","cache","callback","searchWithCache","search","_this","results","text","calculateElementOffset","el","rect","getBoundingClientRect","_el$ownerDocument","ownerDocument","defaultView","documentElement","offset","top","pageYOffset","left","pageXOffset","clientTop","clientLeft","isDigit","charCode","CHAR_CODE_ZERO","CHAR_CODE_NINE","getLineHeightPx","node","computedStyle","window","getComputedStyle","lineHeight","charCodeAt","parseFloat","fontSize","calculateLineHeightPx","nodeName","body","document","tempNode","createElement","innerHTML","style","fontFamily","padding","appendChild","HTMLTextAreaElement","rows","height","offsetHeight","removeChild","createCustomEvent","CustomEvent","type","options","cancelable","detail","createEvent","initCustomEvent","_interopRequireDefault","_possibleConstructorReturn","self","ReferenceError","_inherits","subClass","superClass","constructor","setPrototypeOf","_eventemitter","_eventemitter2","_utils","_search_result","Editor","_EventEmitter","getPrototypeOf","Error","code","moveEvent","enterEvent","changeEvent","getBeforeCursor","escEvent","e","keyCode","ctrlKey","global","_textcomplete","_textcomplete2","_textarea","_textarea2","editors","Textcomplete","Textarea","g","Function","eval","_completer","_completer2","_editor","_dropdown","_dropdown2","_strategy2","CALLBACK_METHODS","editor","completer","isQueryInFlight","nextPendingQuery","dropdown","forEach","method","bind","startListening","destroyEditor","destroy","stopListening","deactivate","strategyPropsArray","_this2","registerStrategy","run","_ref","searchResults","render","getCursorOffset","trigger","up","down","activeItem","getActiveItem","select","preventDefault","shown","selectEvent","defaultPrevented","applySearchResult","searchResult","_this3","handleMove","handleEnter","handleEsc","handleChange","handleSelect","eventName","handleHit","_query","_query2","Completer","strategies","query","extractQuery","execute","handleQueryResult","build","_search_result2","Query","map","result","_dropdown_item","_dropdown_item2","DEFAULT_CLASS_NAME","Dropdown","items","footer","header","maxCount","className","rotate","placement","itemOptions","item","keys","display","position","zIndex","parentNode","clear","_el","cursorOffset","renderEvent","rawResults","dropdownItems","setStrategyId","renderEdge","append","show","setOffset","hide","dropdownItem","moveActiveItem","fragment","createDocumentFragment","appended","doc","elementWidth","offsetWidth","browserWidth","clientWidth","right","isPlacementTop","bottom","clientHeight","showEvent","hideEvent","direction","nextActiveItem","next","prev","activate","strategyId","id","setAttribute","removeAttribute","source","content","li","classList","add","DropdownItem","active","activeClassName","removeEventListener","onClick","onMouseover","siblings","a","addEventListener","nextIndex","_get","receiver","desc","getOwnPropertyDescriptor","parent","_update","_update2","_editor2","getCaretCoordinates","_Editor","before","getAfterCursor","focus","dispatchEvent","Event","elOffset","elScroll","getElScroll","cursorPosition","getCursorPosition","dir","selectionStart","selectionEnd","substring","scrollTop","scrollLeft","emitChangeEvent","getCode","emitMoveEvent","emitEnterEvent","emitEscEvent","onInput","onKeydown","createInputEvent","bubbles","initEvent","headToCursor","cursorToTail","curr","activeElement","aLength","cLength","Math","min","setSelectionRange","strB2","execCommand","element","isBrowser","debug","querySelector","div","computed","currentStyle","whiteSpace","wordWrap","visibility","properties","prop","isFirefox","scrollHeight","overflowY","overflow","textContent","span","coordinates","offsetTop","offsetLeft","backgroundColor","mozInnerScreenX"],"mappings":"CAAS,SAAUA,GCInB,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAE,OAGA,IAAAC,GAAAF,EAAAD,IACAI,EAAAJ,EACAK,GAAA,EACAH,WAUA,OANAJ,GAAAE,GAAAM,KAAAH,EAAAD,QAAAC,IAAAD,QAAAH,GAGAI,EAAAE,GAAA,EAGAF,EAAAD,QAvBA,GAAAD,KA4BAF,GAAAQ,EAAAT,EAGAC,EAAAS,EAAAP,EAGAF,EAAAU,EAAA,SAAAP,EAAAQ,EAAAC,GACAZ,EAAAa,EAAAV,EAAAQ,IACAG,OAAAC,eAAAZ,EAAAQ,GACAK,cAAA,EACAC,YAAA,EACAC,IAAAN,KAMAZ,EAAAmB,EAAA,SAAAf,GACA,GAAAQ,GAAAR,KAAAgB,WACA,WAA2B,MAAAhB,GAAA,SAC3B,WAAiC,MAAAA,GAEjC,OADAJ,GAAAU,EAAAE,EAAA,IAAAA,GACAA,GAIAZ,EAAAa,EAAA,SAAAQ,EAAAC,GAAsD,MAAAR,QAAAS,UAAAC,eAAAjB,KAAAc,EAAAC,IAGtDtB,EAAAyB,EAAA,GAGAzB,IAAA0B,EAAA,KDMM,SAAUtB,EAAQD,EAASH,GAEjC,YAeA,SAAS2B,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAZhHhB,OAAOC,eAAeZ,EAAS,cAC7B4B,OAAO,GAGT,IAAIC,GAAe,WAAc,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAI9B,GAAI,EAAGA,EAAI8B,EAAMC,OAAQ/B,IAAK,CAAE,GAAIgC,GAAaF,EAAM9B,EAAIgC,GAAWpB,WAAaoB,EAAWpB,aAAc,EAAOoB,EAAWrB,cAAe,EAAU,SAAWqB,KAAYA,EAAWC,UAAW,GAAMxB,OAAOC,eAAemB,EAAQG,EAAWE,IAAKF,IAAiB,MAAO,UAAUR,EAAaW,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBJ,EAAYN,UAAWiB,GAAiBC,GAAaR,EAAiBJ,EAAaY,GAAqBZ,ME1EhiBa,EAAA1C,EAAA,GAKqB2C,GF2ErB,SAAgCC,GAAcA,GAAOA,EAAIxB,YAFjBsB,GASrB,WE1EjB,QAAAC,GAAYE,EAAcC,EAAcC,GAAoBpB,EAAAqB,KAAAL,GAC1DK,KAAKH,KAAOA,EACZG,KAAKF,KAAOA,EACZE,KAAKD,SAAWA,EF6GlB,MAzBAf,GAAaW,IACXJ,IAAK,UACLR,MAAO,SEnFDkB,EAAsBC,GAC5B,GAAIC,GAAcH,KAAKD,SAASK,QAAQJ,KAAKH,KAC7C,IAAoB,OAAhBM,EAAsB,CACpBE,MAAMC,QAAQH,KAChBD,EAAcC,EAAY,GAAKD,EAC/BC,EAAcA,EAAY,GAE5B,IAAMI,GAAQP,KAAKD,SAASS,UAAUP,EACtC,IAAIM,EAIF,MAHAJ,GAAcA,EACXC,QAAQ,OAAQG,EAAM,IACtBH,QAAQ,UAAW,SAACK,EAAGC,GAAJ,MAAWH,GAAMI,SAASD,EAAI,SAGhDT,EAAaW,MAAM,EAAGL,EAAMM,OAC5BV,EACAF,EAAaW,MAAML,EAAMM,MAAQN,EAAM,GAAGnB,SAC1C0B,KAAK,IACPZ,OFkFNX,IAAK,SACLR,MAAO,WE5EP,MAAOiB,MAAKD,SAASgB,SAASf,KAAKH,KAAMG,KAAKF,UFiFzCH,KAGTxC,GAAQ6D,QE3HarB,GF+Hf,SAAUvC,GAEhB,YG5HA,SAAA6D,MA4BA,QAAAC,GAAAC,EAAAC,EAAAC,GACArB,KAAAmB,KACAnB,KAAAoB,UACApB,KAAAqB,SAAA,EAUA,QAAAC,KACAtB,KAAAuB,QAAA,GAAAN,GACAjB,KAAAwB,aAAA,EArDA,GAAAC,GAAA3D,OAAAS,UAAAC,eACAkD,EAAA,GAkBA5D,QAAA6D,SACAV,EAAA1C,UAAAT,OAAA6D,OAAA,OAMA,GAAAV,IAAAW,YAAAF,GAAA,IAqCAJ,EAAA/C,UAAAsD,WAAA,WACA,GACAC,GACAnE,EAFAoE,IAIA,QAAA/B,KAAAwB,aAAA,MAAAO,EAEA,KAAApE,IAAAmE,GAAA9B,KAAAuB,QACAE,EAAAlE,KAAAuE,EAAAnE,IAAAoE,EAAAC,KAAAN,EAAA/D,EAAAiD,MAAA,GAAAjD,EAGA,OAAAG,QAAAmE,sBACAF,EAAAG,OAAApE,OAAAmE,sBAAAH,IAGAC,GAWAT,EAAA/C,UAAA4D,UAAA,SAAAC,EAAAC,GACA,GAAAC,GAAAZ,IAAAU,IACAG,EAAAvC,KAAAuB,QAAAe,EAEA,IAAAD,EAAA,QAAAE,CACA,KAAAA,EAAA,QACA,IAAAA,EAAApB,GAAA,OAAAoB,EAAApB,GAEA,QAAA9D,GAAA,EAAAC,EAAAiF,EAAAnD,OAAAoD,EAAA,GAAAnC,OAAA/C,GAA0DD,EAAAC,EAAOD,IACjEmF,EAAAnF,GAAAkF,EAAAlF,GAAA8D,EAGA,OAAAqB,IAUAlB,EAAA/C,UAAAkE,KAAA,SAAAL,EAAAM,EAAAC,EAAAC,EAAAC,EAAAC,GACA,GAAAR,GAAAZ,IAAAU,GAEA,KAAApC,KAAAuB,QAAAe,GAAA,QAEA,IAEAS,GACA1F,EAHA8E,EAAAnC,KAAAuB,QAAAe,GACAU,EAAAC,UAAA7D,MAIA,IAAA+C,EAAAhB,GAAA,CAGA,OAFAgB,EAAAd,MAAArB,KAAAkD,eAAAd,EAAAD,EAAAhB,OAAAgC,IAAA,GAEAH,GACA,aAAAb,GAAAhB,GAAA5D,KAAA4E,EAAAf,UAAA,CACA,cAAAe,GAAAhB,GAAA5D,KAAA4E,EAAAf,QAAAsB,IAAA,CACA,cAAAP,GAAAhB,GAAA5D,KAAA4E,EAAAf,QAAAsB,EAAAC,IAAA,CACA,cAAAR,GAAAhB,GAAA5D,KAAA4E,EAAAf,QAAAsB,EAAAC,EAAAC,IAAA,CACA,cAAAT,GAAAhB,GAAA5D,KAAA4E,EAAAf,QAAAsB,EAAAC,EAAAC,EAAAC,IAAA,CACA,cAAAV,GAAAhB,GAAA5D,KAAA4E,EAAAf,QAAAsB,EAAAC,EAAAC,EAAAC,EAAAC,IAAA,EAGA,IAAAzF,EAAA,EAAA0F,EAAA,GAAA1C,OAAA2C,EAAA,GAAyC3F,EAAA2F,EAAS3F,IAClD0F,EAAA1F,EAAA,GAAA4F,UAAA5F,EAGA8E,GAAAhB,GAAAiC,MAAAjB,EAAAf,QAAA2B,OACG,CACH,GACAM,GADAjE,EAAA+C,EAAA/C,MAGA,KAAA/B,EAAA,EAAeA,EAAA+B,EAAY/B,IAG3B,OAFA8E,EAAA9E,GAAAgE,MAAArB,KAAAkD,eAAAd,EAAAD,EAAA9E,GAAA8D,OAAAgC,IAAA,GAEAH,GACA,OAAAb,EAAA9E,GAAA8D,GAAA5D,KAAA4E,EAAA9E,GAAA+D,QAA2D,MAC3D,QAAAe,EAAA9E,GAAA8D,GAAA5D,KAAA4E,EAAA9E,GAAA+D,QAAAsB,EAA+D,MAC/D,QAAAP,EAAA9E,GAAA8D,GAAA5D,KAAA4E,EAAA9E,GAAA+D,QAAAsB,EAAAC,EAAmE,MACnE,QAAAR,EAAA9E,GAAA8D,GAAA5D,KAAA4E,EAAA9E,GAAA+D,QAAAsB,EAAAC,EAAAC,EAAuE,MACvE,SACA,IAAAG,EAAA,IAAAM,EAAA,EAAAN,EAAA,GAAA1C,OAAA2C,EAAA,GAA0DK,EAAAL,EAASK,IACnEN,EAAAM,EAAA,GAAAJ,UAAAI,EAGAlB,GAAA9E,GAAA8D,GAAAiC,MAAAjB,EAAA9E,GAAA+D,QAAA2B,IAKA,UAYAzB,EAAA/C,UAAA+E,GAAA,SAAAlB,EAAAjB,EAAAC,GACA,GAAAmC,GAAA,GAAArC,GAAAC,EAAAC,GAAApB,MACAsC,EAAAZ,IAAAU,GAMA,OAJApC,MAAAuB,QAAAe,GACAtC,KAAAuB,QAAAe,GAAAnB,GACAnB,KAAAuB,QAAAe,IAAAtC,KAAAuB,QAAAe,GAAAiB,GADAvD,KAAAuB,QAAAe,GAAAN,KAAAuB,IADAvD,KAAAuB,QAAAe,GAAAiB,EAAAvD,KAAAwB,gBAIAxB,MAYAsB,EAAA/C,UAAA8C,KAAA,SAAAe,EAAAjB,EAAAC,GACA,GAAAmC,GAAA,GAAArC,GAAAC,EAAAC,GAAApB,MAAA,GACAsC,EAAAZ,IAAAU,GAMA,OAJApC,MAAAuB,QAAAe,GACAtC,KAAAuB,QAAAe,GAAAnB,GACAnB,KAAAuB,QAAAe,IAAAtC,KAAAuB,QAAAe,GAAAiB,GADAvD,KAAAuB,QAAAe,GAAAN,KAAAuB,IADAvD,KAAAuB,QAAAe,GAAAiB,EAAAvD,KAAAwB,gBAIAxB,MAaAsB,EAAA/C,UAAA2E,eAAA,SAAAd,EAAAjB,EAAAC,EAAAC,GACA,GAAAiB,GAAAZ,IAAAU,GAEA,KAAApC,KAAAuB,QAAAe,GAAA,MAAAtC,KACA,KAAAmB,EAGA,MAFA,MAAAnB,KAAAwB,aAAAxB,KAAAuB,QAAA,GAAAN,SACAjB,MAAAuB,QAAAe,GACAtC,IAGA,IAAAmC,GAAAnC,KAAAuB,QAAAe,EAEA,IAAAH,EAAAhB,GAEAgB,EAAAhB,QACAE,IAAAc,EAAAd,MACAD,GAAAe,EAAAf,cAEA,KAAApB,KAAAwB,aAAAxB,KAAAuB,QAAA,GAAAN,SACAjB,MAAAuB,QAAAe,QAEG,CACH,OAAAjF,GAAA,EAAAyE,KAAA1C,EAAA+C,EAAA/C,OAA2D/B,EAAA+B,EAAY/B,KAEvE8E,EAAA9E,GAAA8D,QACAE,IAAAc,EAAA9E,GAAAgE,MACAD,GAAAe,EAAA9E,GAAA+D,cAEAU,EAAAE,KAAAG,EAAA9E,GAOAyE,GAAA1C,OAAAY,KAAAuB,QAAAe,GAAA,IAAAR,EAAA1C,OAAA0C,EAAA,GAAAA,EACA,KAAA9B,KAAAwB,aAAAxB,KAAAuB,QAAA,GAAAN,SACAjB,MAAAuB,QAAAe,GAGA,MAAAtC,OAUAsB,EAAA/C,UAAAiF,mBAAA,SAAApB,GACA,GAAAE,EAaA,OAXAF,IACAE,EAAAZ,IAAAU,IACApC,KAAAuB,QAAAe,KACA,KAAAtC,KAAAwB,aAAAxB,KAAAuB,QAAA,GAAAN,SACAjB,MAAAuB,QAAAe,MAGAtC,KAAAuB,QAAA,GAAAN,GACAjB,KAAAwB,aAAA,GAGAxB,MAMAsB,EAAA/C,UAAAkF,IAAAnC,EAAA/C,UAAA2E,eACA5B,EAAA/C,UAAAmF,YAAApC,EAAA/C,UAAA+E,GAKAhC,EAAA/C,UAAAoF,gBAAA,WACA,MAAA3D,OAMAsB,EAAAsC,SAAAlC,EAKAJ,iBAMAlE,EAAAD,QAAAmE,GH+IM,SAAUlE,EAAQD,GAExB,YASA,SAASwB,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCIrchH,QAAS+E,GAAiB9E,GACxB,MAAOA,GJ8bTjB,OAAOC,eAAeZ,EAAS,cAC7B4B,OAAO,GAGT,IAAIC,GAAe,WAAc,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAI9B,GAAI,EAAGA,EAAI8B,EAAMC,OAAQ/B,IAAK,CAAE,GAAIgC,GAAaF,EAAM9B,EAAIgC,GAAWpB,WAAaoB,EAAWpB,aAAc,EAAOoB,EAAWrB,cAAe,EAAU,SAAWqB,KAAYA,EAAWC,UAAW,GAAMxB,OAAOC,eAAemB,EAAQG,EAAWE,IAAKF,IAAiB,MAAO,UAAUR,EAAaW,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBJ,EAAYN,UAAWiB,GAAiBC,GAAaR,EAAiBJ,EAAaY,GAAqBZ,MI5a3gBiF,EJ+bN,WI3bb,QAAAA,GAAY3E,GAA2BR,EAAAqB,KAAA8D,GACrC9D,KAAKb,MAAQA,EACba,KAAK+D,MAAQ5E,EAAM4E,SAAa,KJqhBlC,MA/EA/E,GAAa8E,IACXvE,IAAK,UACLR,MAAO,WIhcP,MADAiB,MAAK+D,MAAQ,KACN/D,QJqcPT,IAAK,SACLR,MAAO,SIncFe,EAAckE,EAAoBzD,GACnCP,KAAK+D,MACP/D,KAAKiE,gBAAgBnE,EAAMkE,EAAUzD,GAErCP,KAAKb,MAAM+E,OAAOpE,EAAMkE,EAAUzD,MJ4cpChB,IAAK,UACLR,MAAO,SItcDc,GACN,MAAOG,MAAKb,MAAMiB,QAAQP,MJ4c1BN,IAAK,kBACLR,MAAO,SIzcOe,EAAckE,EAAoBzD,GAAwB,GAAA4D,GAAAnE,IACpEA,MAAK+D,OAAS/D,KAAK+D,MAAMjE,GAC3BkE,EAAShE,KAAK+D,MAAMjE,IAEpBE,KAAKb,MAAM+E,OACTpE,EACA,SAAAsE,GACMD,EAAKJ,QACPI,EAAKJ,MAAMjE,GAAQsE,GAErBJ,EAASI,IAEX7D,MJ+cJhB,IAAK,YACLR,MAAO,SI1cCsF,GACR,MAA0B,kBAAfrE,MAAKO,MACPP,KAAKO,MAAM8D,GAEVA,EAAK9D,MAAMP,KAAKO,UJid1BhB,IAAK,QACLrB,IAAK,WI5cL,MAAO8B,MAAKb,MAAMoB,SJmdlBhB,IAAK,QACLrB,IAAK,WI/cL,MAAmC,gBAArB8B,MAAKb,MAAM0B,MACrBb,KAAKb,MAAM0B,MA5FG,KJ8iBlBtB,IAAK,WACLrB,IAAK,WI9cL,MAAO8B,MAAKb,MAAM4B,UAAY8C,MJmdzBC,IAGT3G,GAAQ6D,QI9hBa8C,GJkiBf,SAAU1G,EAAQD,GAExB,YK3hBO,SAASmH,GACdC,GAEA,GAAMC,GAAOD,EAAGE,wBADeC,EAEUH,EAAGI,cAApCC,EAFuBF,EAEvBE,YAAaC,EAFUH,EAEVG,gBACfC,GACJC,IAAKP,EAAKO,IAAMH,EAAYI,YAC5BC,KAAMT,EAAKS,KAAOL,EAAYM,YAMhC,OAJIL,KACFC,EAAOC,KAAOF,EAAgBM,UAC9BL,EAAOG,MAAQJ,EAAgBO,YAE1BN,EAMT,QAASO,GAAQC,GACf,MAAOA,IAAYC,GAAkBD,GAAYE,EAQ5C,QAASC,GAAgBC,GAC9B,GAAMC,GAAgBC,OAAOC,iBAAiBH,EAM9C,OAAIL,GAAQM,EAAcG,WAAWC,WAAW,IAI5CV,EACEM,EAAcG,WAAWC,WACvBJ,EAAcG,WAAW1G,OAAS,IAKpC4G,WAAWL,EAAcG,YACzBE,WAAWL,EAAcM,UAGpBD,WAAWL,EAAcG,YAM7BI,EAAsBR,EAAKS,SAAUR,GAQvC,QAASO,GACdC,EACAR,GAEA,GAAMS,GAAOC,SAASD,IACtB,KAAKA,EACH,MAAO,EAGT,IAAME,GAAWD,SAASE,cAAcJ,EACxCG,GAASE,UAAY,SACrBF,EAASG,MAAMR,SAAWN,EAAcM,SACxCK,EAASG,MAAMC,WAAaf,EAAce,WAC1CJ,EAASG,MAAME,QAAU,IACzBP,EAAKQ,YAAYN,GAGbA,YAAoBO,uBACpBP,EAA+BQ,KAAO,EAI1C,IAAMC,GAAST,EAASU,YAGxB,OAFAZ,GAAKa,YAAYX,GAEVS,ELqcTjJ,OAAOC,eAAeZ,EAAS,cAC7B4B,OAAO,IAET5B,EKjiBgBmH,yBLkiBhBnH,EKtgBgBsI,kBLugBhBtI,EKnegB+I,uBAnGT,IAmDDX,IAnDO2B,oBAAqB,WAChC,MAAkC,kBAAvBtB,QAAOuB,YACT,SACLC,EACAC,GAEA,MAAO,IAAIhB,UAASzB,YAAYuC,YAAYC,GAC1CE,WAAaD,GAAWA,EAAQC,aAAe,EAC/CC,OAASF,GAAWA,EAAQE,YAAWpE,MAMpC,SACLiE,EACAC,GAEA,GAAMjF,GAAQiE,SAASmB,YAAY,cAOnC,OANApF,GAAMqF,gBACJL,GACc,EACbC,GAAWA,EAAQC,aAAe,EAClCD,GAAWA,EAAQE,YAAWpE,IAE1Bf,MA0BU,IAAI2D,WAAW,IAChCP,EAAiB,IAAIO,WAAW,ILsoBhC,SAAU3I,EAAQD,EAASH,GAEjC,YAmBA,SAAS0K,GAAuB9H,GAAO,MAAOA,IAAOA,EAAIxB,WAAawB,GAAQoB,QAASpB,GAEvF,QAASjB,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAAS6I,GAA2BC,EAAMrK,GAAQ,IAAKqK,EAAQ,KAAM,IAAIC,gBAAe,4DAAgE,QAAOtK,GAAyB,gBAATA,IAAqC,kBAATA,GAA8BqK,EAAPrK,EAElO,QAASuK,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIlJ,WAAU,iEAAoEkJ,GAAeD,GAASxJ,UAAYT,OAAO6D,OAAOqG,GAAcA,EAAWzJ,WAAa0J,aAAelJ,MAAOgJ,EAAU9J,YAAY,EAAOqB,UAAU,EAAMtB,cAAc,KAAegK,IAAYlK,OAAOoK,eAAiBpK,OAAOoK,eAAeH,EAAUC,GAAcD,EAASnG,UAAYoG,GAtBjelK,OAAOC,eAAeZ,EAAS,cAC7B4B,OAAO,GAGT,IAAIC,GAAe,WAAc,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAI9B,GAAI,EAAGA,EAAI8B,EAAMC,OAAQ/B,IAAK,CAAE,GAAIgC,GAAaF,EAAM9B,EAAIgC,GAAWpB,WAAaoB,EAAWpB,aAAc,EAAOoB,EAAWrB,cAAe,EAAU,SAAWqB,KAAYA,EAAWC,UAAW,GAAMxB,OAAOC,eAAemB,EAAQG,EAAWE,IAAKF,IAAiB,MAAO,UAAUR,EAAaW,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBJ,EAAYN,UAAWiB,GAAiBC,GAAaR,EAAiBJ,EAAaY,GAAqBZ,MMvsBhiBsJ,EAAAnL,EAAA,GN2sBIoL,EAAiBV,EAAuBS,GMzsB5CE,EAAArL,EAAA,GACAsL,EAAAtL,EAAA,GAuBqBuL,GNurBCb,EAAuBY,GAyBhC,SAAUE,GAGrB,QAASD,KAGP,MAFA5J,GAAgBqB,KAAMuI,GAEfZ,EAA2B3H,MAAOuI,EAAO3G,WAAa9D,OAAO2K,eAAeF,IAASnF,MAAMpD,KAAMiD,YAwI1G,MA7IA6E,GAAUS,EAAQC,GAQlBxJ,EAAauJ,IACXhJ,IAAK,UAOLR,MAAO,WM1tBP,MAAOiB,SNmuBPT,IAAK,oBACLR,MAAO,WM7tBP,KAAM,IAAI2J,OAAM,uBNuuBhBnJ,IAAK,kBACLR,MAAO,WMhuBP,KAAM,IAAI2J,OAAM,uBN0uBhBnJ,IAAK,kBACLR,MAAO,WMnuBP,KAAM,IAAI2J,OAAM,uBN+uBhBnJ,IAAK,gBACLR,MAAO,SMvuBK4J,GACZ,GAAMC,IAAY,EAAAP,EAAAnB,mBAAkB,QAClCI,YAAY,EACZC,QACEoB,KAAMA,IAIV,OADA3I,MAAKyC,KAAK,OAAQmG,GACXA,KNkvBPrJ,IAAK,iBACLR,MAAO,WMzuBP,GAAM8J,IAAa,EAAAR,EAAAnB,mBAAkB,SAAWI,YAAY,GAE5D,OADAtH,MAAKyC,KAAK,QAASoG,GACZA,KNqvBPtJ,IAAK,kBACLR,MAAO,WM5uBP,GAAM+J,IAAc,EAAAT,EAAAnB,mBAAkB,UACpCK,QACEtH,aAAcD,KAAK+I,oBAIvB,OADA/I,MAAKyC,KAAK,SAAUqG,GACbA,KNwvBPvJ,IAAK,eACLR,MAAO,WM/uBP,GAAMiK,IAAW,EAAAX,EAAAnB,mBAAkB,OAASI,YAAY,GAExD,OADAtH,MAAKyC,KAAK,MAAOuG,GACVA,KN0vBPzJ,IAAK,UACLR,MAAO,SMnvBDkK,GACN,MAAqB,KAAdA,EAAEC,QACL,QACc,KAAdD,EAAEC,QACA,QACc,KAAdD,EAAEC,QACA,MACc,KAAdD,EAAEC,QACA,KACc,KAAdD,EAAEC,QACA,OACc,KAAdD,EAAEC,SAAkBD,EAAEE,QACpB,OACc,KAAdF,EAAEC,SAAkBD,EAAEE,QACpB,KACA,YNgvBXZ,GACPH,EAAepH,SAEjB7D,GAAQ6D,QMj2BauH,GNq2Bf,SAAUnL,EAAQD,EAASH,GAEjC,cAC4B,SAASoM,GAUrC,QAAS1B,GAAuB9H,GAAO,MAAOA,IAAOA,EAAIxB,WAAawB,GAAQoB,QAASpB,GO/4BvF,GAAAyJ,GAAArM,EAAA,GPy4BIsM,EAAiB5B,EAAuB2B,GOx4B5CE,EAAAvM,EAAA,IP44BIwM,EAAa9B,EAAuB6B,GO14BpCE,QAEFA,GADEL,EAAOM,cAAgBN,EAAOM,aAAaD,QACnCL,EAAOM,aAAaD,WAIhCA,EAAQE,SAARH,EAAAxI,QAEAoI,EAAOM,aAAPJ,EAAAtI,QACAoI,EAAOM,aAAaD,QAAUA,IP+4BDlM,KAAKJ,EAASH,EAAoB,KAIzD,SAAUI,GQ/5BhB,GAAAwM,EAGAA,GAAA,WACA,MAAA5J,QAGA,KAEA4J,KAAAC,SAAA,qBAAAC,MAAA,QACC,MAAAb,GAED,gBAAArD,UACAgE,EAAAhE,QAOAxI,EAAAD,QAAAyM,GRs6BM,SAAUxM,EAAQD,EAASH,GAEjC,YAiCA,SAAS0K,GAAuB9H,GAAO,MAAOA,IAAOA,EAAIxB,WAAawB,GAAQoB,QAASpB,GAEvF,QAASjB,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAAS6I,GAA2BC,EAAMrK,GAAQ,IAAKqK,EAAQ,KAAM,IAAIC,gBAAe,4DAAgE,QAAOtK,GAAyB,gBAATA,IAAqC,kBAATA,GAA8BqK,EAAPrK,EAElO,QAASuK,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIlJ,WAAU,iEAAoEkJ,GAAeD,GAASxJ,UAAYT,OAAO6D,OAAOqG,GAAcA,EAAWzJ,WAAa0J,aAAelJ,MAAOgJ,EAAU9J,YAAY,EAAOqB,UAAU,EAAMtB,cAAc,KAAegK,IAAYlK,OAAOoK,eAAiBpK,OAAOoK,eAAeH,EAAUC,GAAcD,EAASnG,UAAYoG,GApCjelK,OAAOC,eAAeZ,EAAS,cAC7B4B,OAAO,GAGT,IAAIC,GAAe,WAAc,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAI9B,GAAI,EAAGA,EAAI8B,EAAMC,OAAQ/B,IAAK,CAAE,GAAIgC,GAAaF,EAAM9B,EAAIgC,GAAWpB,WAAaoB,EAAWpB,aAAc,EAAOoB,EAAWrB,cAAe,EAAU,SAAWqB,KAAYA,EAAWC,UAAW,GAAMxB,OAAOC,eAAemB,EAAQG,EAAWE,IAAKF,IAAiB,MAAO,UAAUR,EAAaW,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBJ,EAAYN,UAAWiB,GAAiBC,GAAaR,EAAiBJ,EAAaY,GAAqBZ,MSj8BhiBkL,EAAA/M,EAAA,GTq8BIgN,EAActC,EAAuBqC,GSp8BzCE,EAAAjN,EAAA,GACAkN,GTu8BexC,EAAuBuC,GSv8BtCjN,EAAA,KT28BImN,EAAazC,EAAuBwC,GS18BxCxK,EAAA1C,EAAA,GT88BIoN,EAAa1C,EAAuBhI,GS78BxC4I,EAAAtL,EAAA,GAEAmL,GT+8BsBT,EAAuBY,GS/8B7CtL,EAAA,ITm9BIoL,EAAiBV,EAAuBS,GSj9BtCkC,GACJ,eACA,cACA,YACA,YACA,aACA,gBAWmBX,ETi9BF,SAAUlB,GSt8B3B,QAAAkB,GAAYY,GAAmD,GAAnCjD,GAAmCpE,UAAA7D,OAAA,OAAA+D,KAAAF,UAAA,GAAAA,UAAA,KAAAtE,GAAAqB,KAAA0J,EAAA,IAAAvF,GAAAwD,EAAA3H,MAAA0J,EAAA9H,WAAA9D,OAAA2K,eAAAiB,IAAAnM,KAAAyC,MAAA,OAG7DmE,GAAKoG,UAAY,GAAAP,GAAAhJ,QACjBmD,EAAKqG,iBAAkB,EACvBrG,EAAKsG,iBAAmB,KACxBtG,EAAKuG,SAAW,GAAAP,GAAAnJ,QAAaqG,EAAQqD,cACrCvG,EAAKmG,OAASA,EACdnG,EAAKkD,QAAUA,EAEfgD,EAAiBM,QAAQ,SAAAC,GACtBzG,EAAYyG,GAAUzG,EAAYyG,GAAQC,KAApB1G,KAGzBA,EAAK2G,iBAdwD3G,ETopC/D,MA7MA2D,GAAU4B,EAAclB,GAgCxBxJ,EAAa0K,IACXnK,IAAK,UACLR,MAAO,WSr9B8B,GAA/BgM,KAA+B9H,UAAA7D,OAAA,OAAA+D,KAAAF,UAAA,KAAAA,UAAA,EAOrC,OANAjD,MAAKuK,UAAUS,UACfhL,KAAK0K,SAASM,UACVD,GACF/K,KAAKsK,OAAOU,UAEdhL,KAAKiL,gBACEjL,QT+9BPT,IAAK,OACLR,MAAO,WSx9BP,MADAiB,MAAK0K,SAASQ,aACPlL,QT8+BPT,IAAK,WACLR,MAAO,SS79BAoM,GAA0C,GAAAC,GAAApL,IAIjD,OAHAmL,GAAmBR,QAAQ,SAAAxL,GACzBiM,EAAKb,UAAUc,iBAAiB,GAAAjB,GAAApJ,QAAa7B,MAExCa,QT0+BPT,IAAK,UACLR,MAAO,SSl+BDsF,GAQN,MAPIrE,MAAKwK,gBACPxK,KAAKyK,iBAAmBpG,GAExBrE,KAAKwK,iBAAkB,EACvBxK,KAAKyK,iBAAmB,KACxBzK,KAAKuK,UAAUe,IAAIjH,IAEdrE,QTw+BPT,IAAK,YACLR,MAAO,SAAmBwM,GSr+BoC,GAApDC,GAAoDD,EAApDC,aACNA,GAAcpM,OAChBY,KAAK0K,SAASe,OAAOD,EAAexL,KAAKsK,OAAOoB,mBAEhD1L,KAAK0K,SAASQ,aAEhBlL,KAAKwK,iBAAkB,EACO,OAA1BxK,KAAKyK,kBACPzK,KAAK2L,QAAQ3L,KAAKyK,qBT8+BpBlL,IAAK,aACLR,MAAO,SS1+BEkK,GACS,OAAlBA,EAAE1B,OAAOoB,KAAgB3I,KAAK0K,SAASkB,GAAG3C,GAAKjJ,KAAK0K,SAASmB,KAAK5C,MTg/BlE1J,IAAK,cACLR,MAAO,SS7+BGkK,GACV,GAAM6C,GAAa9L,KAAK0K,SAASqB,eAC7BD,IACF9L,KAAK0K,SAASsB,OAAOF,GACrB7C,EAAEgD,kBAEFjM,KAAK0K,SAASQ,gBTo/BhB3L,IAAK,YACLR,MAAO,SSh/BCkK,GACJjJ,KAAK0K,SAASwB,QAChBlM,KAAK0K,SAASQ,aACdjC,EAAEgD,qBTu/BJ1M,IAAK,eACLR,MAAO,SSn/BIkK,GACkB,MAAzBA,EAAE1B,OAAOtH,aACXD,KAAK2L,QAAQ1C,EAAE1B,OAAOtH,cAEtBD,KAAK0K,SAASQ,gBT0/BhB3L,IAAK,eACLR,MAAO,SSt/BIoN,GACXnM,KAAKyC,KAAK,SAAU0J,GACfA,EAAYC,kBACfpM,KAAKsK,OAAO+B,kBAAkBF,EAAY5E,OAAO+E,iBT6/BnD/M,IAAK,iBACLR,MAAO,WSz/BQ,GAAAwN,GAAAvM,IACfA,MAAKsK,OACFhH,GAAG,OAAQtD,KAAKwM,YAChBlJ,GAAG,QAAStD,KAAKyM,aACjBnJ,GAAG,MAAOtD,KAAK0M,WACfpJ,GAAG,SAAUtD,KAAK2M,cACrB3M,KAAK0K,SAASpH,GAAG,SAAUtD,KAAK4M,eAE9B,OACA,QACA,SACA,WACA,WACA,SACA,QACAjC,QAAQ,SAAAkC,GACRN,EAAK7B,SAASpH,GAAGuJ,EAAW,iBAAMN,GAAK9J,KAAKoK,OAE9C7M,KAAKuK,UAAUjH,GAAG,MAAOtD,KAAK8M,cTs/B9BvN,IAAK,gBACLR,MAAO,WSl/BPiB,KAAKuK,UAAU/G,qBACfxD,KAAK0K,SAASlH,qBACdxD,KAAKsK,OACFpH,eAAe,OAAQlD,KAAKwM,YAC5BtJ,eAAe,QAASlD,KAAKyM,aAC7BvJ,eAAe,MAAOlD,KAAK0M,WAC3BxJ,eAAe,SAAUlD,KAAK2M,kBTm/B5BjD,GACPtB,EAAepH,QAEjB7D,GAAQ6D,QSlqCa0I,GTsqCf,SAAUtM,EAAQD,EAASH,GAEjC,YAyBA,SAAS0K,GAAuB9H,GAAO,MAAOA,IAAOA,EAAIxB,WAAawB,GAAQoB,QAASpB,GAEvF,QAASjB,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAAS6I,GAA2BC,EAAMrK,GAAQ,IAAKqK,EAAQ,KAAM,IAAIC,gBAAe,4DAAgE,QAAOtK,GAAyB,gBAATA,IAAqC,kBAATA,GAA8BqK,EAAPrK,EAElO,QAASuK,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIlJ,WAAU,iEAAoEkJ,GAAeD,GAASxJ,UAAYT,OAAO6D,OAAOqG,GAAcA,EAAWzJ,WAAa0J,aAAelJ,MAAOgJ,EAAU9J,YAAY,EAAOqB,UAAU,EAAMtB,cAAc,KAAegK,IAAYlK,OAAOoK,eAAiBpK,OAAOoK,eAAeH,EAAUC,GAAcD,EAASnG,UAAYoG,GA5BjelK,OAAOC,eAAeZ,EAAS,cAC7B4B,OAAO,GAGT,IAAIC,GAAe,WAAc,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAI9B,GAAI,EAAGA,EAAI8B,EAAMC,OAAQ/B,IAAK,CAAE,GAAIgC,GAAaF,EAAM9B,EAAIgC,GAAWpB,WAAaoB,EAAWpB,aAAc,EAAOoB,EAAWrB,cAAe,EAAU,SAAWqB,KAAYA,EAAWC,UAAW,GAAMxB,OAAOC,eAAemB,EAAQG,EAAWE,IAAKF,IAAiB,MAAO,UAAUR,EAAaW,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBJ,EAAYN,UAAWiB,GAAiBC,GAAaR,EAAiBJ,EAAaY,GAAqBZ,MUxsChiBsJ,EAAAnL,EAAA,GV4sCIoL,EAAiBV,EAAuBS,GU1sC5C4E,EAAA/P,EAAA,GV8sCIgQ,EAAUtF,EAAuBqF,GU7sCrCzE,EAAAtL,EAAA,GACA0C,GVgtCsBgI,EAAuBY,GUhtC7CtL,EAAA,IAEMqN,GVktCW3C,EAAuBhI,IUltCd,sBAKLuN,EV6tCL,SAAUzE,GU1tCxB,QAAAyE,KAActO,EAAAqB,KAAAiN,EAAA,IAAA9I,GAAAwD,EAAA3H,MAAAiN,EAAArL,WAAA9D,OAAA2K,eAAAwE,IAAA1P,KAAAyC,MAAA,OAEZmE,GAAK+I,cAEL7C,EAAiBM,QAAQ,SAAAC,GACtBzG,EAAYyG,GAAUzG,EAAYyG,GAAQC,KAApB1G,KALbA,EVmzCd,MAxFA2D,GAAUmF,EAAWzE,GAoBrBxJ,EAAaiO,IACX1N,IAAK,UACLR,MAAO,WUnuCP,MADAiB,MAAKkN,WAAWvC,QAAQ,SAAA5K,GAAA,MAAYA,GAASiL,YACtChL,QVivCPT,IAAK,mBACLR,MAAO,SU1uCQgB,GAEf,MADAC,MAAKkN,WAAWlL,KAAKjC,GACdC,QVkvCPT,IAAK,MACLR,MAAO,SU7uCLsF,GACF,GAAM8I,GAAQnN,KAAKoN,aAAa/I,EAC5B8I,GACFA,EAAME,QAAQrN,KAAKsN,mBAEnBtN,KAAKsN,yBVwvCP/N,IAAK,eACLR,MAAO,SUhvCIsF,GACX,IAAK,GAAIhH,GAAI,EAAGA,EAAI2C,KAAKkN,WAAW9N,OAAQ/B,IAAK,CAC/C,GAAM8P,GAAQH,EAAAhM,QAAMuM,MAAMvN,KAAKkN,WAAW7P,GAAIgH,EAC9C,IAAI8I,EACF,MAAOA,GAGX,MAAO,SV0vCP5N,IAAK,oBACLR,MAAO,SUnvCSyM,GAChBxL,KAAKyC,KAAK,OAAS+I,sBVuvCdyB,GACP7E,EAAepH,QAEjB7D,GAAQ6D,QUzzCaiM,GV6zCf,SAAU7P,EAAQD,EAASH,GAEjC,YAiBA,SAAS0K,GAAuB9H,GAAO,MAAOA,IAAOA,EAAIxB,WAAawB,GAAQoB,QAASpB,GAEvF,QAASjB,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAhBhHhB,OAAOC,eAAeZ,EAAS,cAC7B4B,OAAO,GAGT,IAAIC,GAAe,WAAc,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAI9B,GAAI,EAAGA,EAAI8B,EAAMC,OAAQ/B,IAAK,CAAE,GAAIgC,GAAaF,EAAM9B,EAAIgC,GAAWpB,WAAaoB,EAAWpB,aAAc,EAAOoB,EAAWrB,cAAe,EAAU,SAAWqB,KAAYA,EAAWC,UAAW,GAAMxB,OAAOC,eAAemB,EAAQG,EAAWE,IAAKF,IAAiB,MAAO,UAAUR,EAAaW,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBJ,EAAYN,UAAWiB,GAAiBC,GAAaR,EAAiBJ,EAAaY,GAAqBZ,MWj1ChiByJ,EAAAtL,EAAA,GXq1CIwQ,EAAkB9F,EAAuBY,GWp1C7C5I,EAAA1C,EAAA,GAMqByQ,GXk1CJ/F,EAAuBhI,GAS5B,WWp0CV,QAAA+N,GAAY1N,EAAoBD,EAAcS,GAAkB5B,EAAAqB,KAAAyN,GAC9DzN,KAAKD,SAAWA,EAChBC,KAAKF,KAAOA,EACZE,KAAKO,MAAQA,EXm3Cf,MAjDAvB,GAAayO,EAAO,OAClBlO,IAAK,QAQLR,MAAO,SW31CIgB,EAAoBsE,GAC/B,GAAsC,kBAA3BtE,GAASZ,MAAMiC,QAAwB,CAChD,GAAMA,GAAUrB,EAASZ,MAAMiC,QAAQiD,EACvC,IAAuB,gBAAZjD,GACTiD,EAAOjD,MACF,KAAKA,EACV,MAAO,MAGX,GAAMb,GAAQR,EAASS,UAAU6D,EACjC,OAAO9D,GAAQ,GAAIkN,GAAM1N,EAAUQ,EAAMR,EAASc,OAAQN,GAAS,SX42CrEvB,EAAayO,IACXlO,IAAK,UACLR,MAAO,SWl2CDiF,GAAoC,GAAAG,GAAAnE,IAC1CA,MAAKD,SAASmE,OACZlE,KAAKF,KACL,SAAAsE,GACEJ,EACEI,EAAQsJ,IAAI,SAAAC,GACV,MAAO,IAAAH,GAAAxM,QAAiB2M,EAAQxJ,EAAKrE,KAAMqE,EAAKpE,cAItDC,KAAKO,WXm2CFkN,KAGTtQ,GAAQ6D,QWh5CayM,GXo5Cf,SAAUrQ,EAAQD,EAASH,GAEjC,YAuBA,SAAS0K,GAAuB9H,GAAO,MAAOA,IAAOA,EAAIxB,WAAawB,GAAQoB,QAASpB,GAEvF,QAASjB,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAAS6I,GAA2BC,EAAMrK,GAAQ,IAAKqK,EAAQ,KAAM,IAAIC,gBAAe,4DAAgE,QAAOtK,GAAyB,gBAATA,IAAqC,kBAATA,GAA8BqK,EAAPrK,EAElO,QAASuK,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIlJ,WAAU,iEAAoEkJ,GAAeD,GAASxJ,UAAYT,OAAO6D,OAAOqG,GAAcA,EAAWzJ,WAAa0J,aAAelJ,MAAOgJ,EAAU9J,YAAY,EAAOqB,UAAU,EAAMtB,cAAc,KAAegK,IAAYlK,OAAOoK,eAAiBpK,OAAOoK,eAAeH,EAAUC,GAAcD,EAASnG,UAAYoG,GA1BjelK,OAAOC,eAAeZ,EAAS,cAC7B4B,OAAO,GAGT,IAAIC,GAAe,WAAc,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAI9B,GAAI,EAAGA,EAAI8B,EAAMC,OAAQ/B,IAAK,CAAE,GAAIgC,GAAaF,EAAM9B,EAAIgC,GAAWpB,WAAaoB,EAAWpB,aAAc,EAAOoB,EAAWrB,cAAe,EAAU,SAAWqB,KAAYA,EAAWC,UAAW,GAAMxB,OAAOC,eAAemB,EAAQG,EAAWE,IAAKF,IAAiB,MAAO,UAAUR,EAAaW,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBJ,EAAYN,UAAWiB,GAAiBC,GAAaR,EAAiBJ,EAAaY,GAAqBZ,MYr6ChiBsJ,EAAAnL,EAAA,GZy6CIoL,EAAiBV,EAAuBS,GYv6C5CyF,EAAA5Q,EAAA,IZ26CI6Q,EAAkBnG,EAAuBkG,GY16C7CtF,EAAAtL,EAAA,GACAqL,GZ66CsBX,EAAuBY,GY76C7CtL,EAAA,IAGM8Q,EAAqB,sCAoBNC,EZ46CN,SAAUvF,GYn5CvB,QAAAuF,GAAY1G,GAA0B1I,EAAAqB,KAAA+N,EAAA,IAAA5J,GAAAwD,EAAA3H,MAAA+N,EAAAnM,WAAA9D,OAAA2K,eAAAsF,IAAAxQ,KAAAyC,MAEpCmE,GAAK+H,OAAQ,EACb/H,EAAK6J,SACL7J,EAAK2H,WAAa,KAClB3H,EAAK8J,OAAS5G,EAAQ4G,OACtB9J,EAAK+J,OAAS7G,EAAQ6G,OACtB/J,EAAKgK,SAAW9G,EAAQ8G,UAAY,GACpChK,EAAKI,GAAG6J,UAAY/G,EAAQ+G,WAAaN,EACzC3J,EAAKkK,QAAShH,EAAQ7I,eAAe,WAAY6I,EAAQgH,OACzDlK,EAAKmK,UAAYjH,EAAQiH,UACzBnK,EAAKoK,YAAclH,EAAQmH,QAC3B,IAAM/H,GAAQY,EAAQZ,KAZc,OAahCA,IACF3I,OAAO2Q,KAAKhI,GAAOkE,QAAQ,SAAApL,GACvB4E,EAAKI,GAAGkC,MAAYlH,GAAOkH,EAAMlH,KAfH4E,EZotDtC,MAhUA2D,GAAUiG,EAAUvF,GAEpBxJ,EAAa+O,EAAU,OACrBxO,IAAK,gBACLR,MAAO,WYp6CP,GAAMwF,GAAK8B,SAASE,cAAc,MAC5BE,EAAQlC,EAAGkC,KACjBA,GAAMiI,QAAU,OAChBjI,EAAMkI,SAAW,WACjBlI,EAAMmI,OAAS,OACf,IAAMxI,GAAOC,SAASD,IAItB,OAHIA,IACFA,EAAKQ,YAAYrC,GAEZA,MZs8CTvF,EAAa+O,IACXxO,IAAK,UACLR,MAAO,WY76CP,GAAM8P,GAAa7O,KAAKuE,GAAGsK,UAK3B,OAJIA,IACFA,EAAW5H,YAAYjH,KAAKuE,IAE9BvE,KAAK8O,QAAQC,IAAM,KACZ/O,QZi7CPT,IAAK,SAQLR,MAAO,SY16CFyM,EAA+BwD,GAA4B,GAAA5D,GAAApL,KAC1DiP,GAAc,EAAA5G,EAAAnB,mBAAkB,UAAYI,YAAY,GAE9D,IADAtH,KAAKyC,KAAK,SAAUwM,GAChBA,EAAY7C,iBACd,MAAOpM,KAET,IAAMkP,GAAa1D,EAAckC,IAAI,SAAApB,GAAA,MAAgBA,GAAazM,OAC5DsP,EAAgB3D,EACnB5K,MAAM,EAAGZ,KAAKmO,UAAY3C,EAAcpM,QACxCsO,IAAI,SAAApB,GAAA,MAAgB,IAAAuB,GAAA7M,QAAiBsL,EAAclB,EAAKmD,cAS3D,OARAvO,MAAK8O,QACFM,cAAc5D,EAAc,IAC5B6D,WAAWH,EAAY,UACvBI,OAAOH,GACPE,WAAWH,EAAY,UACvBK,OACAC,UAAUR,GACbhP,KAAKyC,KAAK,YAAY,EAAA4F,EAAAnB,mBAAkB,aACjClH,QZk7CPT,IAAK,aACLR,MAAO,WY16CP,MAAOiB,MAAKyP,OAAOX,WZm7CnBvP,IAAK,SACLR,MAAO,SY96CF2Q,GACL,GAAMnI,IAAW+E,aAAcoD,EAAapD,cACtCH,GAAc,EAAA9D,EAAAnB,mBAAkB,UACpCI,YAAY,EACZC,OAAQA,GAGV,OADAvH,MAAKyC,KAAK,SAAU0J,GAChBA,EAAYC,iBACPpM,MAETA,KAAKkL,aACLlL,KAAKyC,KAAK,YAAY,EAAA4F,EAAAnB,mBAAkB,YAAcK,YAC/CvH,SZs7CPT,IAAK,KACLR,MAAO,SYj7CNkK,GACD,MAAOjJ,MAAKkM,MAAQlM,KAAK2P,eAAe,OAAQ1G,GAAKjJ,QZy7CrDT,IAAK,OACLR,MAAO,SYp7CJkK,GACH,MAAOjJ,MAAKkM,MAAQlM,KAAK2P,eAAe,OAAQ1G,GAAKjJ,QZ47CrDT,IAAK,gBACLR,MAAO,WYt7CP,MAAOiB,MAAK8L,cZi8CZvM,IAAK,SACLR,MAAO,SY17CFiP,GAAuB,GAAAzB,GAAAvM,KACtB4P,EAAWvJ,SAASwJ,wBAO1B,OANA7B,GAAMrD,QAAQ,SAAA6D,GACZjC,EAAKyB,MAAMhM,KAAKwM,GAChBA,EAAKsB,SAALvD,GACAqD,EAAShJ,YAAY4H,EAAKjK,MAE5BvE,KAAKuE,GAAGqC,YAAYgJ,GACb5P,QZk8CPT,IAAK,YACLR,MAAO,SY/7CCiQ,GACR,GAAMe,GAAM1J,SAASxB,eACrB,IAAIkL,EAAK,CACP,GAAMC,GAAehQ,KAAKuE,GAAG0L,WAC7B,IAAIjB,EAAa/J,KAAM,CACrB,GAAMiL,GAAeH,EAAII,WACrBnB,GAAa/J,KAAO+K,EAAeE,IACrClB,EAAa/J,KAAOiL,EAAeF,GAErChQ,KAAKuE,GAAGkC,MAAMxB,KAAU+J,EAAa/J,KAArC,SACS+J,GAAaoB,QAClBpB,EAAaoB,MAAQJ,EAAe,IACtChB,EAAaoB,MAAQ,GAEvBpQ,KAAKuE,GAAGkC,MAAM2J,MAAWpB,EAAaoB,MAAtC,KAEEpQ,MAAKqQ,iBACPrQ,KAAKuE,GAAGkC,MAAM6J,OAAYP,EAAIQ,aAC5BvB,EAAajK,IACbiK,EAAalJ,WAFf,KAIA9F,KAAKuE,GAAGkC,MAAM1B,IAASiK,EAAajK,IAApC,KAGJ,MAAO/E,SZu8CPT,IAAK,OACLR,MAAO,WY/7CP,IAAKiB,KAAKkM,MAAO,CACf,GAAMsE,IAAY,EAAAnI,EAAAnB,mBAAkB,QAAUI,YAAY,GAE1D,IADAtH,KAAKyC,KAAK,OAAQ+N,GACdA,EAAUpE,iBACZ,MAAOpM,KAETA,MAAKuE,GAAGkC,MAAMiI,QAAU,QACxB1O,KAAKkM,OAAQ,EACblM,KAAKyC,KAAK,SAAS,EAAA4F,EAAAnB,mBAAkB,UAEvC,MAAOlH,SZ08CPT,IAAK,OACLR,MAAO,WYl8CP,GAAIiB,KAAKkM,MAAO,CACd,GAAMuE,IAAY,EAAApI,EAAAnB,mBAAkB,QAAUI,YAAY,GAE1D,IADAtH,KAAKyC,KAAK,OAAQgO,GACdA,EAAUrE,iBACZ,MAAOpM,KAETA,MAAKuE,GAAGkC,MAAMiI,QAAU,OACxB1O,KAAKkM,OAAQ,EACblM,KAAKyC,KAAK,UAAU,EAAA4F,EAAAnB,mBAAkB,WAExC,MAAOlH,SZ68CPT,IAAK,QACLR,MAAO,WYl8CP,MAHAiB,MAAKuE,GAAGiC,UAAY,GACpBxG,KAAKgO,MAAMrD,QAAQ,SAAA6D,GAAA,MAAQA,GAAKxD,YAChChL,KAAKgO,SACEhO,QZ88CPT,IAAK,iBACLR,MAAO,SY38CM2R,EAA4BzH,GACzC,GAAM0H,GACU,SAAdD,EACI1Q,KAAK8L,WAAa9L,KAAK8L,WAAW8E,KAAO5Q,KAAKgO,MAAM,GACpDhO,KAAK8L,WACH9L,KAAK8L,WAAW+E,KAChB7Q,KAAKgO,MAAMhO,KAAKgO,MAAM5O,OAAS,EAKvC,OAJIuR,KACFA,EAAeG,WACf7H,EAAEgD,kBAEGjM,QZ48CPT,IAAK,gBACLR,MAAO,SYz8CKuN,GACZ,GAAMyE,GAAazE,GAAgBA,EAAavM,SAASZ,MAAM6R,EAM/D,OALID,GACF/Q,KAAKuE,GAAG0M,aAAa,gBAAiBF,GAEtC/Q,KAAKuE,GAAG2M,gBAAgB,iBAEnBlR,QZk9CPT,IAAK,aACLR,MAAO,SY58CEmQ,EAAsB9H,GAC/B,GAAM+J,IAAmB,WAAT/J,EAAoBpH,KAAKkO,OAASlO,KAAKiO,SAAW,GAC5DmD,EACc,kBAAXD,GAAwBA,EAAOjC,GAAciC,EAChDE,EAAKhL,SAASE,cAAc,KAIlC,OAHA8K,GAAGC,UAAUC,IAAb,gBAAiCnK,GACjCiK,EAAG7K,UAAY4K,EACfpR,KAAKuE,GAAGqC,YAAYyK,GACbrR,QZi9CPT,IAAK,iBACLR,MAAO,WY78CP,MAA0B,QAAnBiB,KAAKsO,aZi9CZ/O,IAAK,KACLrB,IAAK,WYxqDL,MAHK8B,MAAK+O,MACR/O,KAAK+O,IAAMhB,EAASxH,iBAEfvG,KAAK+O,QZgrDPhB,GACP3F,EAAepH,QAEjB7D,GAAQ6D,QYhvDa+M,GZovDf,SAAU3Q,EAAQD,EAASH,GAEjC,YAgBA,SAAS2B,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAbhHhB,OAAOC,eAAeZ,EAAS,cAC7B4B,OAAO,IAET5B,EAAQ2Q,uBAAqB3K,EAE7B,IAAInE,GAAe,WAAc,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAI9B,GAAI,EAAGA,EAAI8B,EAAMC,OAAQ/B,IAAK,CAAE,GAAIgC,GAAaF,EAAM9B,EAAIgC,GAAWpB,WAAaoB,EAAWpB,aAAc,EAAOoB,EAAWrB,cAAe,EAAU,SAAWqB,KAAYA,EAAWC,UAAW,GAAMxB,OAAOC,eAAemB,EAAQG,EAAWE,IAAKF,IAAiB,MAAO,UAAUR,EAAaW,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBJ,EAAYN,UAAWiB,GAAiBC,GAAaR,EAAiBJ,EAAaY,GAAqBZ,MaxxDhiByJ,EAAAtL,EAAA,GAEa8Q,Gb4xDb,SAAgClO,GAAcA,GAAOA,EAAIxB,YAFZkK,Ga1xDhCwF,qBAAqB,qBAC5BzD,GAAoB,UAAW,eAmBhBmH,EbuxDF,Wa7wDjB,QAAAA,GAAYlF,EAA4BjF,GAA8B,GAAAlD,GAAAnE,IAAArB,GAAAqB,KAAAwR,GACpExR,KAAKsM,aAAeA,EACpBtM,KAAKyR,QAAS,EACdzR,KAAKoO,UAAY/G,EAAQ+G,WAAaN,EACtC9N,KAAK0R,gBAAqB1R,KAAKoO,UAA/B,UAEA/D,EAAiBM,QAAQ,SAAAC,GACtBzG,EAAYyG,GAAUzG,EAAYyG,GAAQC,KAApB1G,Kbi6D3B,MA3IAnF,GAAawS,IACXjS,IAAK,UAMLR,MAAO,WarwDPiB,KAAKuE,GAAGoN,oBAAoB,YAAa3R,KAAK4R,SAAS,GACvD5R,KAAKuE,GAAGoN,oBAAoB,YAAa3R,KAAK6R,aAAa,GAC3D7R,KAAKuE,GAAGoN,oBAAoB,aAAc3R,KAAK4R,SAAS,GACpD5R,KAAKyR,SACPzR,KAAK0K,SAASoB,WAAa,MAG7B9L,KAAK+O,IAAM,QbgxDXxP,IAAK,WACLR,MAAO,SazwDA2L,GACP1K,KAAK0K,SAAWA,EAChB1K,KAAK8R,SAAWpH,EAASsD,MACzBhO,KAAKa,MAAQb,KAAK8R,SAAS1S,OAAS,KbmxDpCG,IAAK,WACLR,MAAO,Wa3wDP,IAAKiB,KAAKyR,OAAQ,CAChB,GAAM3F,GAAa9L,KAAK0K,SAASqB,eAC7BD,IACFA,EAAWZ,aAEblL,KAAK0K,SAASoB,WAAa9L,KAC3BA,KAAKyR,QAAS,EACdzR,KAAKuE,GAAG6J,UAAYpO,KAAK0R,gBAE3B,MAAO1R,SboxDPT,IAAK,aAILR,MAAO,Wa9uDP,MALIiB,MAAKyR,SACPzR,KAAKyR,QAAS,EACdzR,KAAKuE,GAAG6J,UAAYpO,KAAKoO,UACzBpO,KAAK0K,SAASoB,WAAa,MAEtB9L,Qb0vDPT,IAAK,UACLR,MAAO,SavvDDkK,GACNA,EAAEgD,iBACFjM,KAAK0K,SAASsB,OAAOhM,Sb6vDrBT,IAAK,cACLR,MAAO,WazvDPiB,KAAK8Q,cb6vDLvR,IAAK,KACLrB,IAAK,Wa12DL,GAAI8B,KAAK+O,IACP,MAAO/O,MAAK+O,GAEd,IAAMsC,GAAKhL,SAASE,cAAc,KAClC8K,GAAGjD,UAAYpO,KAAKyR,OAASzR,KAAK0R,gBAAkB1R,KAAKoO,SACzD,IAAM2D,GAAI1L,SAASE,cAAc,IAOjC,OANAwL,GAAEvL,UAAYxG,KAAKsM,aAAab,SAChC4F,EAAGzK,YAAYmL,GACf/R,KAAK+O,IAAMsC,EACXA,EAAGW,iBAAiB,YAAahS,KAAK4R,SACtCP,EAAGW,iBAAiB,YAAahS,KAAK6R,aACtCR,EAAGW,iBAAiB,aAAchS,KAAK4R,SAChCP,Kb82DP9R,IAAK,OACLrB,IAAK,Wa7zDL,GAAI+T,SACJ,IAAIjS,KAAKa,QAAUb,KAAK8R,SAAS1S,OAAS,EAAG,CAC3C,IAAKY,KAAK0K,SAAS2D,OACjB,MAAO,KAET4D,GAAY,MAEZA,GAAYjS,KAAKa,MAAQ,CAE3B,OAAOb,MAAK8R,SAASG,Mbs0DrB1S,IAAK,OACLrB,IAAK,Wah0DL,GAAI+T,SACJ,IAAmB,IAAfjS,KAAKa,MAAa,CACpB,IAAKb,KAAK0K,SAAS2D,OACjB,MAAO,KAET4D,GAAYjS,KAAK8R,SAAS1S,OAAS,MAEnC6S,GAAYjS,KAAKa,MAAQ,CAE3B,OAAOb,MAAK8R,SAASG,Obq0DhBT,IAGTrU,GAAQ6D,Qar7DawQ,Gby7Df,SAAUpU,EAAQD,EAASH,GAEjC,YAyBA,SAAS0K,GAAuB9H,GAAO,MAAOA,IAAOA,EAAIxB,WAAawB,GAAQoB,QAASpB,GAEvF,QAASjB,GAAgBC,EAAUC,GAAe,KAAMD,YAAoBC,IAAgB,KAAM,IAAIC,WAAU,qCAEhH,QAAS6I,GAA2BC,EAAMrK,GAAQ,IAAKqK,EAAQ,KAAM,IAAIC,gBAAe,4DAAgE,QAAOtK,GAAyB,gBAATA,IAAqC,kBAATA,GAA8BqK,EAAPrK,EAElO,QAASuK,GAAUC,EAAUC,GAAc,GAA0B,kBAAfA,IAA4C,OAAfA,EAAuB,KAAM,IAAIlJ,WAAU,iEAAoEkJ,GAAeD,GAASxJ,UAAYT,OAAO6D,OAAOqG,GAAcA,EAAWzJ,WAAa0J,aAAelJ,MAAOgJ,EAAU9J,YAAY,EAAOqB,UAAU,EAAMtB,cAAc,KAAegK,IAAYlK,OAAOoK,eAAiBpK,OAAOoK,eAAeH,EAAUC,GAAcD,EAASnG,UAAYoG,GA5BjelK,OAAOC,eAAeZ,EAAS,cAC7B4B,OAAO,GAGT,IAAIC,GAAe,WAAc,QAASC,GAAiBC,EAAQC,GAAS,IAAK,GAAI9B,GAAI,EAAGA,EAAI8B,EAAMC,OAAQ/B,IAAK,CAAE,GAAIgC,GAAaF,EAAM9B,EAAIgC,GAAWpB,WAAaoB,EAAWpB,aAAc,EAAOoB,EAAWrB,cAAe,EAAU,SAAWqB,KAAYA,EAAWC,UAAW,GAAMxB,OAAOC,eAAemB,EAAQG,EAAWE,IAAKF,IAAiB,MAAO,UAAUR,EAAaW,EAAYC,GAAiJ,MAA9HD,IAAYP,EAAiBJ,EAAYN,UAAWiB,GAAiBC,GAAaR,EAAiBJ,EAAaY,GAAqBZ,MAE5hBqT,EAAO,QAAShU,GAAIG,EAAQC,EAAU6T,GAA2B,OAAX9T,IAAiBA,EAASwL,SAAStL,UAAW,IAAI6T,GAAOtU,OAAOuU,yBAAyBhU,EAAQC,EAAW,QAAa6E,KAATiP,EAAoB,CAAE,GAAIE,GAASxU,OAAO2K,eAAepK,EAAS,OAAe,QAAXiU,MAAmB,GAAkCpU,EAAIoU,EAAQhU,EAAU6T,GAAoB,GAAI,SAAWC,GAAQ,MAAOA,GAAKrT,KAAgB,IAAInB,GAASwU,EAAKlU,GAAK,QAAeiF,KAAXvF,EAA4C,MAAOA,GAAOL,KAAK4U,Ic19D5dI,EAAAvV,EAAA,Id89DIwV,EAAW9K,EAAuB6K,Gc59DtCtI,EAAAjN,EAAA,Gdg+DIyV,EAAW/K,EAAuBuC,Gc/9DtC5B,EAAArL,EAAA,GACAsL,EAAAtL,EAAA,GAEM0V,Gdk+DgBhL,EAAuBY,Gcl+DjBtL,EAAQ,KAE9BqN,GAAoB,UAAW,aAKhBV,Ed6+DN,SAAUgJ,Gcv+DvB,QAAAhJ,GAAYpF,GAAyB5F,EAAAqB,KAAA2J,EAAA,IAAAxF,GAAAwD,EAAA3H,MAAA2J,EAAA/H,WAAA9D,OAAA2K,eAAAkB,IAAApM,KAAAyC,MAAA,OAEnCmE,GAAKI,GAAKA,EAEV8F,EAAiBM,QAAQ,SAAAC,GACtBzG,EAAYyG,GAAUzG,EAAYyG,GAAQC,KAApB1G,KAGzBA,EAAK2G,iBAR8B3G,EduoErC,MA/JA2D,GAAU6B,EAAUgJ,GAyBpB3T,EAAa2K,IACXpK,IAAK,UACLR,MAAO,Wch/DP,MAJAmT,GAAAvI,EAAApL,UAAAqD,WAAA9D,OAAA2K,eAAAkB,EAAApL,WAAA,UAAAyB,MAAAzC,KAAAyC,MACAA,KAAKiL,gBAEHjL,KAAWuE,GAAK,KACXvE,Qd6/DPT,IAAK,oBACLR,MAAO,Scx/DSuN,GAChB,GAAMsG,GAAS5S,KAAK+I,iBACpB,IAAc,MAAV6J,EAAgB,CAClB,GAAMxS,GAAUkM,EAAalM,QAAQwS,EAAQ5S,KAAK6S,iBAClD7S,MAAKuE,GAAGuO,QACJzS,MAAMC,QAAQF,MAChB,EAAAoS,EAAAxR,SAAOhB,KAAKuE,GAAInE,EAAQ,GAAIA,EAAQ,IACpCJ,KAAKuE,GAAGwO,cAAc,GAAIC,OAAM,edkgEpCzT,IAAK,kBACLR,MAAO,Wc1/DP,GAAMkU,IAAW,EAAA5K,EAAA/D,wBAAuBtE,KAAKuE,IACvC2O,EAAWlT,KAAKmT,cAChBC,EAAiBpT,KAAKqT,oBACtBvN,GAAa,EAAAuC,EAAA5C,iBAAgBzF,KAAKuE,IAClCQ,EAAMkO,EAASlO,IAAMmO,EAASnO,IAAMqO,EAAerO,IAAMe,EACzDb,EAAOgO,EAAShO,KAAOiO,EAASjO,KAAOmO,EAAenO,IAC5D,OAAoB,QAAhBjF,KAAKuE,GAAG+O,KACDvO,MAAKE,OAAMa,eAKXf,MAAKqL,MAHA/J,SAASxB,gBACnBwB,SAASxB,gBAAgBsL,YAAclL,EACvC,EACiBa,iBdkgEvBvG,IAAK,kBACLR,MAAO,Wc3/DP,MAAOiB,MAAKuE,GAAGgP,iBAAmBvT,KAAKuE,GAAGiP,aACtC,KACAxT,KAAKuE,GAAGxF,MAAM0U,UAAU,EAAGzT,KAAKuE,GAAGiP,iBdggEvCjU,IAAK,iBACLR,MAAO,Wc5/DP,MAAOiB,MAAKuE,GAAGxF,MAAM0U,UAAUzT,KAAKuE,GAAGiP,iBdmgEvCjU,IAAK,cACLR,MAAO,Wc//DP,OAASgG,IAAK/E,KAAKuE,GAAGmP,UAAWzO,KAAMjF,KAAKuE,GAAGoP,ed2gE/CpU,IAAK,oBACLR,MAAO,WclgEP,MAAO2T,GAAoB1S,KAAKuE,GAAIvE,KAAKuE,GAAGiP,iBdygE5CjU,IAAK,UACLR,MAAO,WcrgEPiB,KAAK4T,qBd4gELrU,IAAK,YACLR,MAAO,SczgECkK,GACR,GAAMN,GAAO3I,KAAK6T,QAAQ5K,GACtB7G,QACS,QAATuG,GAA0B,SAATA,EACnBvG,EAAQpC,KAAK8T,cAAcnL,GACT,UAATA,EACTvG,EAAQpC,KAAK+T,iBACK,QAATpL,IACTvG,EAAQpC,KAAKgU,gBAEX5R,GAASA,EAAMgK,kBACjBnD,EAAEgD,oBdghEJ1M,IAAK,iBACLR,MAAO,Wc3gEPiB,KAAKuE,GAAGyN,iBAAiB,QAAShS,KAAKiU,SACvCjU,KAAKuE,GAAGyN,iBAAiB,UAAWhS,KAAKkU,cdkhEzC3U,IAAK,gBACLR,MAAO,Wc9gEPiB,KAAKuE,GAAGoN,oBAAoB,QAAS3R,KAAKiU,SAC1CjU,KAAKuE,GAAGoN,oBAAoB,UAAW3R,KAAKkU,edmhEvCvK,GACP8I,EAASzR,QAEX7D,GAAQ6D,QchpEa2I,GdopEf,SAAUvM,EAAQD,GAExB,YevnEA,SAAAgX,KACA,sBAAAnB,OACA,UAAAA,OAAA,SAA+BoB,SAAA,EAAA9M,YAAA,GAE/B,IAAAlF,GAAAiE,SAAAmB,YAAA,QAEA,OADApF,GAAAiS,UAAA,eACAjS,EAlDAtE,OAAAC,eAAAZ,EAAA,cACA4B,OAAA,IAGA5B,EAAA6D,QAAA,SAAAuD,EAAA+P,EAAAC,GAUA,IATA,GAAAC,GAAAjQ,EAAAxF,MAEA6R,EAAA0D,GAAAC,GAAA,IAEAE,EAAApO,SAAAoO,cAGAC,EAAA,EACAC,EAAA,EACAD,EAAAF,EAAApV,QAAAsV,EAAA9D,EAAAxR,QAAAoV,EAAAE,KAAA9D,EAAA8D,IACAA,GAEA,MAAAF,EAAApV,OAAAuV,EAAA,MAAA/D,EAAAxR,OAAAuV,EAAA,MAAAH,IAAApV,OAAAuV,EAAA,KAAA/D,IAAAxR,OAAAuV,EAAA,IACAA,GAEAD,GAAAE,KAAAC,IAAAH,EAAAE,KAAAC,IAAAL,EAAApV,OAAAwR,EAAAxR,QAAAuV,GAGApQ,EAAAuQ,kBAAAJ,EAAAF,EAAApV,OAAAuV,EAGA,IAAAI,GAAAnE,EAAA6C,UAAAiB,EAAA9D,EAAAxR,OAAAuV,EAeA,OAZApQ,GAAAuO,QACAzM,SAAA2O,YAAA,gBAAAD,KAGAxQ,EAAAxF,MAAA6R,EACArM,EAAAwO,cAAAoB,MAIA5P,EAAAuQ,kBAAAR,EAAAlV,OAAAkV,EAAAlV,QAEAqV,KAAA3B,QACAvO,IfqrEM,SAAUnH,IgB9tEhB,WAmDA,QAAAsV,GAAAuC,EAAAtG,EAAAtH,GACA,IAAA6N,EACA,SAAAxM,OAAA,iFAGA,IAAAyM,GAAA9N,KAAA8N,QAAA,CACA,IAAAA,EAAA,CACA,GAAA5Q,GAAA8B,SAAA+O,cAAA,4CACA7Q,IAAeA,EAAAsK,WAAA5H,YAAA1C,GAIf,GAAA8Q,GAAAhP,SAAAE,cAAA,MACA8O,GAAArE,GAAA,2CACA3K,SAAAD,KAAAQ,YAAAyO,EAEA,IAAA5O,GAAA4O,EAAA5O,MACA6O,EAAA1P,OAAAC,kCAAAoP,KAAAM,YAGA9O,GAAA+O,WAAA,WACA,UAAAP,EAAA9O,WACAM,EAAAgP,SAAA,cAGAhP,EAAAkI,SAAA,WACAwG,IACA1O,EAAAiP,WAAA,UAGAC,EAAAhL,QAAA,SAAAiL,GACAnP,EAAAmP,GAAAN,EAAAM,KAGAC,EAEAZ,EAAAa,aAAAnV,SAAA2U,EAAAvO,UACAN,EAAAsP,UAAA,UAEAtP,EAAAuP,SAAA,SAGAX,EAAAY,YAAAhB,EAAAlW,MAAA0U,UAAA,EAAA9E,GAEA,UAAAsG,EAAA9O,WACAkP,EAAAY,YAAAZ,EAAAY,YAAA7V,QAAA,WAEA,IAAA8V,GAAA7P,SAAAE,cAAA,OAMA2P,GAAAD,YAAAhB,EAAAlW,MAAA0U,UAAA9E,IAAA,IACA0G,EAAAzO,YAAAsP,EAEA,IAAAC,IACApR,IAAAmR,EAAAE,UAAAzV,SAAA2U,EAAA,gBACArQ,KAAAiR,EAAAG,WAAA1V,SAAA2U,EAAA,iBASA,OANAH,GACAe,EAAAzP,MAAA6P,gBAAA,OAEAjQ,SAAAD,KAAAa,YAAAoO,GAGAc,EAhHA,GAAAR,IACA,YACA,YACA,QACA,SACA,YACA,YAEA,iBACA,mBACA,oBACA,kBACA,cAEA,aACA,eACA,gBACA,cAGA,YACA,cACA,aACA,cACA,WACA,iBACA,aACA,aAEA,YACA,gBACA,aACA,iBAEA,gBACA,cAEA,UACA,cAIAT,EAAA,mBAAAtP,QACAiQ,EAAAX,GAAA,MAAAtP,OAAA2Q,oBAwEA,KAAAnZ,OAAA,KAAAA,EAAAD,QACAC,EAAAD,QAAAuV,EACCwC,IACDtP,OAAA8M","file":"textcomplete.min.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 5);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _strategy = __webpack_require__(2);\n\nvar _strategy2 = _interopRequireDefault(_strategy);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Encapsulate an result of each search results.\n */\nvar SearchResult = function () {\n\n /**\n * @param {object} data - An element of array callbacked by search function.\n */\n function SearchResult(data, term, strategy) {\n _classCallCheck(this, SearchResult);\n\n this.data = data;\n this.term = term;\n this.strategy = strategy;\n }\n\n _createClass(SearchResult, [{\n key: \"replace\",\n value: function replace(beforeCursor, afterCursor) {\n var replacement = this.strategy.replace(this.data);\n if (replacement !== null) {\n if (Array.isArray(replacement)) {\n afterCursor = replacement[1] + afterCursor;\n replacement = replacement[0];\n }\n var match = this.strategy.matchText(beforeCursor);\n if (match) {\n replacement = replacement.replace(/\\$&/g, match[0]).replace(/\\$(\\d)/g, function (_, p1) {\n return match[parseInt(p1, 10)];\n });\n return [[beforeCursor.slice(0, match.index), replacement, beforeCursor.slice(match.index + match[0].length)].join(\"\"), afterCursor];\n }\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n return this.strategy.template(this.data, this.term);\n }\n }]);\n\n return SearchResult;\n}();\n\nexports.default = SearchResult;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @api private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {Mixed} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @api private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @api public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @api public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Boolean} exists Only check if there are listeners.\n * @returns {Array|Boolean}\n * @api public\n */\nEventEmitter.prototype.listeners = function listeners(event, exists) {\n var evt = prefix ? prefix + event : event\n , available = this._events[evt];\n\n if (exists) return !!available;\n if (!available) return [];\n if (available.fn) return [available.fn];\n\n for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n ee[i] = available[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @api public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn The listener function.\n * @param {Mixed} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n var listener = new EE(fn, context || this)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n else if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [this._events[evt], listener];\n\n return this;\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn The listener function.\n * @param {Mixed} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n var listener = new EE(fn, context || this, true)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n else if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [this._events[evt], listener];\n\n return this;\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {Mixed} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn\n && (!once || listeners.once)\n && (!context || listeners.context === context)\n ) {\n if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn\n || (once && !listeners[i].once)\n || (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {String|Symbol} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) {\n if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n }\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// This function doesn't apply anymore.\n//\nEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n return this;\n};\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif (true) {\n module.exports = EventEmitter;\n}\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DEFAULT_INDEX = 2;\n\nfunction DEFAULT_TEMPLATE(value) {\n return value;\n}\n\n/**\n * Properties for a strategy.\n *\n * @typedef\n */\n\n/**\n * Encapsulate a single strategy.\n */\nvar Strategy = function () {\n function Strategy(props) {\n _classCallCheck(this, Strategy);\n\n this.props = props;\n this.cache = props.cache ? {} : null;\n }\n\n /**\n * @return {this}\n */\n\n\n _createClass(Strategy, [{\n key: \"destroy\",\n value: function destroy() {\n this.cache = null;\n return this;\n }\n }, {\n key: \"search\",\n value: function search(term, callback, match) {\n if (this.cache) {\n this.searchWithCache(term, callback, match);\n } else {\n this.props.search(term, callback, match);\n }\n }\n\n /**\n * @param {object} data - An element of array callbacked by search function.\n */\n\n }, {\n key: \"replace\",\n value: function replace(data) {\n return this.props.replace(data);\n }\n\n /** @private */\n\n }, {\n key: \"searchWithCache\",\n value: function searchWithCache(term, callback, match) {\n var _this = this;\n\n if (this.cache && this.cache[term]) {\n callback(this.cache[term]);\n } else {\n this.props.search(term, function (results) {\n if (_this.cache) {\n _this.cache[term] = results;\n }\n callback(results);\n }, match);\n }\n }\n\n /** @private */\n\n }, {\n key: \"matchText\",\n value: function matchText(text) {\n if (typeof this.match === \"function\") {\n return this.match(text);\n } else {\n return text.match(this.match);\n }\n }\n\n /** @private */\n\n }, {\n key: \"match\",\n get: function get() {\n return this.props.match;\n }\n\n /** @private */\n\n }, {\n key: \"index\",\n get: function get() {\n return typeof this.props.index === \"number\" ? this.props.index : DEFAULT_INDEX;\n }\n }, {\n key: \"template\",\n get: function get() {\n return this.props.template || DEFAULT_TEMPLATE;\n }\n }]);\n\n return Strategy;\n}();\n\nexports.default = Strategy;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.calculateElementOffset = calculateElementOffset;\nexports.getLineHeightPx = getLineHeightPx;\nexports.calculateLineHeightPx = calculateLineHeightPx;\n\n\n/**\n * Create a custom event\n *\n * @private\n */\nvar createCustomEvent = exports.createCustomEvent = function () {\n if (typeof window.CustomEvent === \"function\") {\n return function (type, options) {\n return new document.defaultView.CustomEvent(type, {\n cancelable: options && options.cancelable || false,\n detail: options && options.detail || undefined\n });\n };\n } else {\n // Custom event polyfill from\n // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#polyfill\n return function (type, options) {\n var event = document.createEvent(\"CustomEvent\");\n event.initCustomEvent(type,\n /* bubbles */false, options && options.cancelable || false, options && options.detail || undefined);\n return event;\n };\n }\n}\n\n/**\n * Get the current coordinates of the `el` relative to the document.\n *\n * @private\n */\n();function calculateElementOffset(el) {\n var rect = el.getBoundingClientRect();\n var _el$ownerDocument = el.ownerDocument,\n defaultView = _el$ownerDocument.defaultView,\n documentElement = _el$ownerDocument.documentElement;\n\n var offset = {\n top: rect.top + defaultView.pageYOffset,\n left: rect.left + defaultView.pageXOffset\n };\n if (documentElement) {\n offset.top -= documentElement.clientTop;\n offset.left -= documentElement.clientLeft;\n }\n return offset;\n}\n\nvar CHAR_CODE_ZERO = \"0\".charCodeAt(0);\nvar CHAR_CODE_NINE = \"9\".charCodeAt(0);\n\nfunction isDigit(charCode) {\n return charCode >= CHAR_CODE_ZERO && charCode <= CHAR_CODE_NINE;\n}\n\n/**\n * Returns the line-height of the given node in pixels.\n *\n * @private\n */\nfunction getLineHeightPx(node) {\n var computedStyle = window.getComputedStyle(node\n\n // If the char code starts with a digit, it is either a value in pixels,\n // or unitless, as per:\n // https://drafts.csswg.org/css2/visudet.html#propdef-line-height\n // https://drafts.csswg.org/css2/cascade.html#computed-value\n );if (isDigit(computedStyle.lineHeight.charCodeAt(0))) {\n // In real browsers the value is *always* in pixels, even for unit-less\n // line-heights. However, we still check as per the spec.\n if (isDigit(computedStyle.lineHeight.charCodeAt(computedStyle.lineHeight.length - 1))) {\n return parseFloat(computedStyle.lineHeight) * parseFloat(computedStyle.fontSize);\n } else {\n return parseFloat(computedStyle.lineHeight);\n }\n }\n\n // Otherwise, the value is \"normal\".\n // If the line-height is \"normal\", calculate by font-size\n return calculateLineHeightPx(node.nodeName, computedStyle);\n}\n\n/**\n * Returns calculated line-height of the given node in pixels.\n *\n * @private\n */\nfunction calculateLineHeightPx(nodeName, computedStyle) {\n var body = document.body;\n if (!body) {\n return 0;\n }\n\n var tempNode = document.createElement(nodeName);\n tempNode.innerHTML = \" \";\n tempNode.style.fontSize = computedStyle.fontSize;\n tempNode.style.fontFamily = computedStyle.fontFamily;\n tempNode.style.padding = \"0\";\n body.appendChild(tempNode\n\n // Make sure textarea has only 1 row\n );if (tempNode instanceof HTMLTextAreaElement) {\n ;tempNode.rows = 1;\n }\n\n // Assume the height of the element is the line-height\n var height = tempNode.offsetHeight;\n body.removeChild(tempNode);\n\n return height;\n}\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _eventemitter = __webpack_require__(1);\n\nvar _eventemitter2 = _interopRequireDefault(_eventemitter);\n\nvar _utils = __webpack_require__(3);\n\nvar _search_result = __webpack_require__(0);\n\nvar _search_result2 = _interopRequireDefault(_search_result);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n/*eslint no-unused-vars: off*/\n\n/**\n * Abstract class representing a editor target.\n *\n * Editor classes must implement `#applySearchResult`, `#getCursorOffset` and\n * `#getBeforeCursor` methods.\n *\n * Editor classes must invoke `#emitMoveEvent`, `#emitEnterEvent`,\n * `#emitChangeEvent` and `#emitEscEvent` at proper timing.\n *\n * @abstract\n */\n\n\n/** @typedef */\nvar Editor = function (_EventEmitter) {\n _inherits(Editor, _EventEmitter);\n\n function Editor() {\n _classCallCheck(this, Editor);\n\n return _possibleConstructorReturn(this, (Editor.__proto__ || Object.getPrototypeOf(Editor)).apply(this, arguments));\n }\n\n _createClass(Editor, [{\n key: \"destroy\",\n\n /**\n * It is called when associated textcomplete object is destroyed.\n *\n * @return {this}\n */\n value: function destroy() {\n return this;\n }\n\n /**\n * It is called when a search result is selected by a user.\n */\n\n }, {\n key: \"applySearchResult\",\n value: function applySearchResult(_) {\n throw new Error(\"Not implemented.\");\n }\n\n /**\n * The input cursor's absolute coordinates from the window's left\n * top corner.\n */\n\n }, {\n key: \"getCursorOffset\",\n value: function getCursorOffset() {\n throw new Error(\"Not implemented.\");\n }\n\n /**\n * Editor string value from head to cursor.\n * Returns null if selection type is range not cursor.\n */\n\n }, {\n key: \"getBeforeCursor\",\n value: function getBeforeCursor() {\n throw new Error(\"Not implemented.\");\n }\n\n /**\n * Emit a move event, which moves active dropdown element.\n * Child class must call this method at proper timing with proper parameter.\n *\n * @see {@link Textarea} for live example.\n */\n\n }, {\n key: \"emitMoveEvent\",\n value: function emitMoveEvent(code) {\n var moveEvent = (0, _utils.createCustomEvent)(\"move\", {\n cancelable: true,\n detail: {\n code: code\n }\n });\n this.emit(\"move\", moveEvent);\n return moveEvent;\n }\n\n /**\n * Emit a enter event, which selects current search result.\n * Child class must call this method at proper timing.\n *\n * @see {@link Textarea} for live example.\n */\n\n }, {\n key: \"emitEnterEvent\",\n value: function emitEnterEvent() {\n var enterEvent = (0, _utils.createCustomEvent)(\"enter\", { cancelable: true });\n this.emit(\"enter\", enterEvent);\n return enterEvent;\n }\n\n /**\n * Emit a change event, which triggers auto completion.\n * Child class must call this method at proper timing.\n *\n * @see {@link Textarea} for live example.\n */\n\n }, {\n key: \"emitChangeEvent\",\n value: function emitChangeEvent() {\n var changeEvent = (0, _utils.createCustomEvent)(\"change\", {\n detail: {\n beforeCursor: this.getBeforeCursor()\n }\n });\n this.emit(\"change\", changeEvent);\n return changeEvent;\n }\n\n /**\n * Emit a esc event, which hides dropdown element.\n * Child class must call this method at proper timing.\n *\n * @see {@link Textarea} for live example.\n */\n\n }, {\n key: \"emitEscEvent\",\n value: function emitEscEvent() {\n var escEvent = (0, _utils.createCustomEvent)(\"esc\", { cancelable: true });\n this.emit(\"esc\", escEvent);\n return escEvent;\n }\n\n /**\n * Helper method for parsing KeyboardEvent.\n *\n * @see {@link Textarea} for live example.\n */\n\n }, {\n key: \"getCode\",\n value: function getCode(e) {\n return e.keyCode === 9 ? \"ENTER\" // tab\n : e.keyCode === 13 ? \"ENTER\" // enter\n : e.keyCode === 27 ? \"ESC\" // esc\n : e.keyCode === 38 ? \"UP\" // up\n : e.keyCode === 40 ? \"DOWN\" // down\n : e.keyCode === 78 && e.ctrlKey ? \"DOWN\" // ctrl-n\n : e.keyCode === 80 && e.ctrlKey ? \"UP\" // ctrl-p\n : \"OTHER\";\n }\n }]);\n\n return Editor;\n}(_eventemitter2.default);\n\nexports.default = Editor;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(global) {\n\nvar _textcomplete = __webpack_require__(7);\n\nvar _textcomplete2 = _interopRequireDefault(_textcomplete);\n\nvar _textarea = __webpack_require__(12);\n\nvar _textarea2 = _interopRequireDefault(_textarea);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar editors = void 0;\nif (global.Textcomplete && global.Textcomplete.editors) {\n editors = global.Textcomplete.editors;\n} else {\n editors = {};\n}\neditors.Textarea = _textarea2.default;\n\nglobal.Textcomplete = _textcomplete2.default;\nglobal.Textcomplete.editors = editors;\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(6)))\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports) {\n\nvar g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _completer = __webpack_require__(8);\n\nvar _completer2 = _interopRequireDefault(_completer);\n\nvar _editor = __webpack_require__(4);\n\nvar _editor2 = _interopRequireDefault(_editor);\n\nvar _dropdown = __webpack_require__(10);\n\nvar _dropdown2 = _interopRequireDefault(_dropdown);\n\nvar _strategy = __webpack_require__(2);\n\nvar _strategy2 = _interopRequireDefault(_strategy);\n\nvar _search_result = __webpack_require__(0);\n\nvar _search_result2 = _interopRequireDefault(_search_result);\n\nvar _eventemitter = __webpack_require__(1);\n\nvar _eventemitter2 = _interopRequireDefault(_eventemitter);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CALLBACK_METHODS = [\"handleChange\", \"handleEnter\", \"handleEsc\", \"handleHit\", \"handleMove\", \"handleSelect\"];\n\n/** @typedef */\n\n/**\n * The core of textcomplete. It acts as a mediator.\n */\nvar Textcomplete = function (_EventEmitter) {\n _inherits(Textcomplete, _EventEmitter);\n\n /**\n * @param {Editor} editor - Where the textcomplete works on.\n */\n function Textcomplete(editor) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, Textcomplete);\n\n var _this = _possibleConstructorReturn(this, (Textcomplete.__proto__ || Object.getPrototypeOf(Textcomplete)).call(this));\n\n _this.completer = new _completer2.default();\n _this.isQueryInFlight = false;\n _this.nextPendingQuery = null;\n _this.dropdown = new _dropdown2.default(options.dropdown || {});\n _this.editor = editor;\n _this.options = options;\n\n CALLBACK_METHODS.forEach(function (method) {\n ;_this[method] = _this[method].bind(_this);\n });\n\n _this.startListening();\n return _this;\n }\n\n /**\n * @return {this}\n */\n\n\n _createClass(Textcomplete, [{\n key: \"destroy\",\n value: function destroy() {\n var destroyEditor = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n this.completer.destroy();\n this.dropdown.destroy();\n if (destroyEditor) {\n this.editor.destroy();\n }\n this.stopListening();\n return this;\n }\n\n /**\n * @return {this}\n */\n\n }, {\n key: \"hide\",\n value: function hide() {\n this.dropdown.deactivate();\n return this;\n }\n\n /**\n * @return {this}\n * @example\n * textcomplete.register([{\n * match: /(^|\\s)(\\w+)$/,\n * search: function (term, callback) {\n * $.ajax({ ... })\n * .done(callback)\n * .fail([]);\n * },\n * replace: function (value) {\n * return '$1' + value + ' ';\n * }\n * }]);\n */\n\n }, {\n key: \"register\",\n value: function register(strategyPropsArray) {\n var _this2 = this;\n\n strategyPropsArray.forEach(function (props) {\n _this2.completer.registerStrategy(new _strategy2.default(props));\n });\n return this;\n }\n\n /**\n * Start autocompleting.\n *\n * @param {string} text - Head to input cursor.\n * @return {this}\n */\n\n }, {\n key: \"trigger\",\n value: function trigger(text) {\n if (this.isQueryInFlight) {\n this.nextPendingQuery = text;\n } else {\n this.isQueryInFlight = true;\n this.nextPendingQuery = null;\n this.completer.run(text);\n }\n return this;\n }\n\n /** @private */\n\n }, {\n key: \"handleHit\",\n value: function handleHit(_ref) {\n var searchResults = _ref.searchResults;\n\n if (searchResults.length) {\n this.dropdown.render(searchResults, this.editor.getCursorOffset());\n } else {\n this.dropdown.deactivate();\n }\n this.isQueryInFlight = false;\n if (this.nextPendingQuery !== null) {\n this.trigger(this.nextPendingQuery);\n }\n }\n\n /** @private */\n\n }, {\n key: \"handleMove\",\n value: function handleMove(e) {\n e.detail.code === \"UP\" ? this.dropdown.up(e) : this.dropdown.down(e);\n }\n\n /** @private */\n\n }, {\n key: \"handleEnter\",\n value: function handleEnter(e) {\n var activeItem = this.dropdown.getActiveItem();\n if (activeItem) {\n this.dropdown.select(activeItem);\n e.preventDefault();\n } else {\n this.dropdown.deactivate();\n }\n }\n\n /** @private */\n\n }, {\n key: \"handleEsc\",\n value: function handleEsc(e) {\n if (this.dropdown.shown) {\n this.dropdown.deactivate();\n e.preventDefault();\n }\n }\n\n /** @private */\n\n }, {\n key: \"handleChange\",\n value: function handleChange(e) {\n if (e.detail.beforeCursor != null) {\n this.trigger(e.detail.beforeCursor);\n } else {\n this.dropdown.deactivate();\n }\n }\n\n /** @private */\n\n }, {\n key: \"handleSelect\",\n value: function handleSelect(selectEvent) {\n this.emit(\"select\", selectEvent);\n if (!selectEvent.defaultPrevented) {\n this.editor.applySearchResult(selectEvent.detail.searchResult);\n }\n }\n\n /** @private */\n\n }, {\n key: \"startListening\",\n value: function startListening() {\n var _this3 = this;\n\n this.editor.on(\"move\", this.handleMove).on(\"enter\", this.handleEnter).on(\"esc\", this.handleEsc).on(\"change\", this.handleChange);\n this.dropdown.on(\"select\", this.handleSelect);[\"show\", \"shown\", \"render\", \"rendered\", \"selected\", \"hidden\", \"hide\"].forEach(function (eventName) {\n _this3.dropdown.on(eventName, function () {\n return _this3.emit(eventName);\n });\n });\n this.completer.on(\"hit\", this.handleHit);\n }\n\n /** @private */\n\n }, {\n key: \"stopListening\",\n value: function stopListening() {\n this.completer.removeAllListeners();\n this.dropdown.removeAllListeners();\n this.editor.removeListener(\"move\", this.handleMove).removeListener(\"enter\", this.handleEnter).removeListener(\"esc\", this.handleEsc).removeListener(\"change\", this.handleChange);\n }\n }]);\n\n return Textcomplete;\n}(_eventemitter2.default);\n\nexports.default = Textcomplete;\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _eventemitter = __webpack_require__(1);\n\nvar _eventemitter2 = _interopRequireDefault(_eventemitter);\n\nvar _query = __webpack_require__(9);\n\nvar _query2 = _interopRequireDefault(_query);\n\nvar _search_result = __webpack_require__(0);\n\nvar _search_result2 = _interopRequireDefault(_search_result);\n\nvar _strategy = __webpack_require__(2);\n\nvar _strategy2 = _interopRequireDefault(_strategy);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar CALLBACK_METHODS = [\"handleQueryResult\"];\n\n/**\n * Complete engine.\n */\n\nvar Completer = function (_EventEmitter) {\n _inherits(Completer, _EventEmitter);\n\n function Completer() {\n _classCallCheck(this, Completer);\n\n var _this = _possibleConstructorReturn(this, (Completer.__proto__ || Object.getPrototypeOf(Completer)).call(this));\n\n _this.strategies = [];\n\n CALLBACK_METHODS.forEach(function (method) {\n ;_this[method] = _this[method].bind(_this);\n });\n return _this;\n }\n\n /**\n * @return {this}\n */\n\n\n _createClass(Completer, [{\n key: \"destroy\",\n value: function destroy() {\n this.strategies.forEach(function (strategy) {\n return strategy.destroy();\n });\n return this;\n }\n\n /**\n * Register a strategy to the completer.\n *\n * @return {this}\n */\n\n }, {\n key: \"registerStrategy\",\n value: function registerStrategy(strategy) {\n this.strategies.push(strategy);\n return this;\n }\n\n /**\n * @param {string} text - Head to input cursor.\n */\n\n }, {\n key: \"run\",\n value: function run(text) {\n var query = this.extractQuery(text);\n if (query) {\n query.execute(this.handleQueryResult);\n } else {\n this.handleQueryResult([]);\n }\n }\n\n /**\n * Find a query, which matches to the given text.\n *\n * @private\n */\n\n }, {\n key: \"extractQuery\",\n value: function extractQuery(text) {\n for (var i = 0; i < this.strategies.length; i++) {\n var query = _query2.default.build(this.strategies[i], text);\n if (query) {\n return query;\n }\n }\n return null;\n }\n\n /**\n * Callbacked by {@link Query#execute}.\n *\n * @private\n */\n\n }, {\n key: \"handleQueryResult\",\n value: function handleQueryResult(searchResults) {\n this.emit(\"hit\", { searchResults: searchResults });\n }\n }]);\n\n return Completer;\n}(_eventemitter2.default);\n\nexports.default = Completer;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _search_result = __webpack_require__(0);\n\nvar _search_result2 = _interopRequireDefault(_search_result);\n\nvar _strategy = __webpack_require__(2);\n\nvar _strategy2 = _interopRequireDefault(_strategy);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Encapsulate matching condition between a Strategy and current editor's value.\n */\nvar Query = function () {\n _createClass(Query, null, [{\n key: \"build\",\n\n\n /**\n * Build a Query object by the given string if this matches to the string.\n *\n * @param {string} text - Head to input cursor.\n */\n value: function build(strategy, text) {\n if (typeof strategy.props.context === \"function\") {\n var context = strategy.props.context(text);\n if (typeof context === \"string\") {\n text = context;\n } else if (!context) {\n return null;\n }\n }\n var match = strategy.matchText(text);\n return match ? new Query(strategy, match[strategy.index], match) : null;\n }\n }]);\n\n function Query(strategy, term, match) {\n _classCallCheck(this, Query);\n\n this.strategy = strategy;\n this.term = term;\n this.match = match;\n }\n\n /**\n * Invoke search strategy and callback the given function.\n */\n\n\n _createClass(Query, [{\n key: \"execute\",\n value: function execute(callback) {\n var _this = this;\n\n this.strategy.search(this.term, function (results) {\n callback(results.map(function (result) {\n return new _search_result2.default(result, _this.term, _this.strategy);\n }));\n }, this.match);\n }\n }]);\n\n return Query;\n}();\n\nexports.default = Query;\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _eventemitter = __webpack_require__(1);\n\nvar _eventemitter2 = _interopRequireDefault(_eventemitter);\n\nvar _dropdown_item = __webpack_require__(11);\n\nvar _dropdown_item2 = _interopRequireDefault(_dropdown_item);\n\nvar _search_result = __webpack_require__(0);\n\nvar _search_result2 = _interopRequireDefault(_search_result);\n\nvar _utils = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar DEFAULT_CLASS_NAME = \"dropdown-menu textcomplete-dropdown\";\n\n/** @typedef */\n\n/**\n * Encapsulate a dropdown view.\n *\n * @prop {boolean} shown - Whether the #el is shown or not.\n * @prop {DropdownItem[]} items - The array of rendered dropdown items.\n */\nvar Dropdown = function (_EventEmitter) {\n _inherits(Dropdown, _EventEmitter);\n\n _createClass(Dropdown, null, [{\n key: \"createElement\",\n value: function createElement() {\n var el = document.createElement(\"ul\");\n var style = el.style;\n style.display = \"none\";\n style.position = \"absolute\";\n style.zIndex = \"10000\";\n var body = document.body;\n if (body) {\n body.appendChild(el);\n }\n return el;\n }\n }]);\n\n function Dropdown(options) {\n _classCallCheck(this, Dropdown);\n\n var _this = _possibleConstructorReturn(this, (Dropdown.__proto__ || Object.getPrototypeOf(Dropdown)).call(this));\n\n _this.shown = false;\n _this.items = [];\n _this.activeItem = null;\n _this.footer = options.footer;\n _this.header = options.header;\n _this.maxCount = options.maxCount || 10;\n _this.el.className = options.className || DEFAULT_CLASS_NAME;\n _this.rotate = options.hasOwnProperty(\"rotate\") ? options.rotate : true;\n _this.placement = options.placement;\n _this.itemOptions = options.item || {};\n var style = options.style;\n if (style) {\n Object.keys(style).forEach(function (key) {\n ;_this.el.style[key] = style[key];\n });\n }\n return _this;\n }\n\n /**\n * @return {this}\n */\n\n\n _createClass(Dropdown, [{\n key: \"destroy\",\n value: function destroy() {\n var parentNode = this.el.parentNode;\n if (parentNode) {\n parentNode.removeChild(this.el);\n }\n this.clear()._el = null;\n return this;\n }\n }, {\n key: \"render\",\n\n\n /**\n * Render the given data as dropdown items.\n *\n * @return {this}\n */\n value: function render(searchResults, cursorOffset) {\n var _this2 = this;\n\n var renderEvent = (0, _utils.createCustomEvent)(\"render\", { cancelable: true });\n this.emit(\"render\", renderEvent);\n if (renderEvent.defaultPrevented) {\n return this;\n }\n var rawResults = searchResults.map(function (searchResult) {\n return searchResult.data;\n });\n var dropdownItems = searchResults.slice(0, this.maxCount || searchResults.length).map(function (searchResult) {\n return new _dropdown_item2.default(searchResult, _this2.itemOptions);\n });\n this.clear().setStrategyId(searchResults[0]).renderEdge(rawResults, \"header\").append(dropdownItems).renderEdge(rawResults, \"footer\").show().setOffset(cursorOffset);\n this.emit(\"rendered\", (0, _utils.createCustomEvent)(\"rendered\"));\n return this;\n }\n\n /**\n * Hide the dropdown then sweep out items.\n *\n * @return {this}\n */\n\n }, {\n key: \"deactivate\",\n value: function deactivate() {\n return this.hide().clear();\n }\n\n /**\n * @return {this}\n */\n\n }, {\n key: \"select\",\n value: function select(dropdownItem) {\n var detail = { searchResult: dropdownItem.searchResult };\n var selectEvent = (0, _utils.createCustomEvent)(\"select\", {\n cancelable: true,\n detail: detail\n });\n this.emit(\"select\", selectEvent);\n if (selectEvent.defaultPrevented) {\n return this;\n }\n this.deactivate();\n this.emit(\"selected\", (0, _utils.createCustomEvent)(\"selected\", { detail: detail }));\n return this;\n }\n\n /**\n * @return {this}\n */\n\n }, {\n key: \"up\",\n value: function up(e) {\n return this.shown ? this.moveActiveItem(\"prev\", e) : this;\n }\n\n /**\n * @return {this}\n */\n\n }, {\n key: \"down\",\n value: function down(e) {\n return this.shown ? this.moveActiveItem(\"next\", e) : this;\n }\n\n /**\n * Retrieve the active item.\n */\n\n }, {\n key: \"getActiveItem\",\n value: function getActiveItem() {\n return this.activeItem;\n }\n\n /**\n * Add items to dropdown.\n *\n * @private\n */\n\n }, {\n key: \"append\",\n value: function append(items) {\n var _this3 = this;\n\n var fragment = document.createDocumentFragment();\n items.forEach(function (item) {\n _this3.items.push(item);\n item.appended(_this3);\n fragment.appendChild(item.el);\n });\n this.el.appendChild(fragment);\n return this;\n }\n\n /** @private */\n\n }, {\n key: \"setOffset\",\n value: function setOffset(cursorOffset) {\n var doc = document.documentElement;\n if (doc) {\n var elementWidth = this.el.offsetWidth;\n if (cursorOffset.left) {\n var browserWidth = doc.clientWidth;\n if (cursorOffset.left + elementWidth > browserWidth) {\n cursorOffset.left = browserWidth - elementWidth;\n }\n this.el.style.left = cursorOffset.left + \"px\";\n } else if (cursorOffset.right) {\n if (cursorOffset.right - elementWidth < 0) {\n cursorOffset.right = 0;\n }\n this.el.style.right = cursorOffset.right + \"px\";\n }\n if (this.isPlacementTop()) {\n this.el.style.bottom = doc.clientHeight - cursorOffset.top + cursorOffset.lineHeight + \"px\";\n } else {\n this.el.style.top = cursorOffset.top + \"px\";\n }\n }\n return this;\n }\n\n /**\n * Show the element.\n *\n * @private\n */\n\n }, {\n key: \"show\",\n value: function show() {\n if (!this.shown) {\n var showEvent = (0, _utils.createCustomEvent)(\"show\", { cancelable: true });\n this.emit(\"show\", showEvent);\n if (showEvent.defaultPrevented) {\n return this;\n }\n this.el.style.display = \"block\";\n this.shown = true;\n this.emit(\"shown\", (0, _utils.createCustomEvent)(\"shown\"));\n }\n return this;\n }\n\n /**\n * Hide the element.\n *\n * @private\n */\n\n }, {\n key: \"hide\",\n value: function hide() {\n if (this.shown) {\n var hideEvent = (0, _utils.createCustomEvent)(\"hide\", { cancelable: true });\n this.emit(\"hide\", hideEvent);\n if (hideEvent.defaultPrevented) {\n return this;\n }\n this.el.style.display = \"none\";\n this.shown = false;\n this.emit(\"hidden\", (0, _utils.createCustomEvent)(\"hidden\"));\n }\n return this;\n }\n\n /**\n * Clear search results.\n *\n * @private\n */\n\n }, {\n key: \"clear\",\n value: function clear() {\n this.el.innerHTML = \"\";\n this.items.forEach(function (item) {\n return item.destroy();\n });\n this.items = [];\n return this;\n }\n\n /** @private */\n\n }, {\n key: \"moveActiveItem\",\n value: function moveActiveItem(direction, e) {\n var nextActiveItem = direction === \"next\" ? this.activeItem ? this.activeItem.next : this.items[0] : this.activeItem ? this.activeItem.prev : this.items[this.items.length - 1];\n if (nextActiveItem) {\n nextActiveItem.activate();\n e.preventDefault();\n }\n return this;\n }\n\n /** @private */\n\n }, {\n key: \"setStrategyId\",\n value: function setStrategyId(searchResult) {\n var strategyId = searchResult && searchResult.strategy.props.id;\n if (strategyId) {\n this.el.setAttribute(\"data-strategy\", strategyId);\n } else {\n this.el.removeAttribute(\"data-strategy\");\n }\n return this;\n }\n\n /**\n * @private\n * @param {object[]} rawResults - What callbacked by search function.\n */\n\n }, {\n key: \"renderEdge\",\n value: function renderEdge(rawResults, type) {\n var source = (type === \"header\" ? this.header : this.footer) || \"\";\n var content = typeof source === \"function\" ? source(rawResults) : source;\n var li = document.createElement(\"li\");\n li.classList.add(\"textcomplete-\" + type);\n li.innerHTML = content;\n this.el.appendChild(li);\n return this;\n }\n\n /** @private */\n\n }, {\n key: \"isPlacementTop\",\n value: function isPlacementTop() {\n return this.placement === \"top\";\n }\n }, {\n key: \"el\",\n get: function get() {\n if (!this._el) {\n this._el = Dropdown.createElement();\n }\n return this._el;\n }\n }]);\n\n return Dropdown;\n}(_eventemitter2.default);\n\nexports.default = Dropdown;\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.DEFAULT_CLASS_NAME = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _search_result = __webpack_require__(0);\n\nvar _search_result2 = _interopRequireDefault(_search_result);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DEFAULT_CLASS_NAME = exports.DEFAULT_CLASS_NAME = \"textcomplete-item\";\nvar CALLBACK_METHODS = [\"onClick\", \"onMouseover\"];\n\n/** @typedef */\n\n\n// Declare interface instead of importing Dropdown itself to prevent circular dependency.\n\n/**\n * Encapsulate an item of dropdown.\n */\nvar DropdownItem = function () {\n function DropdownItem(searchResult, options) {\n var _this = this;\n\n _classCallCheck(this, DropdownItem);\n\n this.searchResult = searchResult;\n this.active = false;\n this.className = options.className || DEFAULT_CLASS_NAME;\n this.activeClassName = this.className + \" active\";\n\n CALLBACK_METHODS.forEach(function (method) {\n ;_this[method] = _this[method].bind(_this);\n });\n }\n\n _createClass(DropdownItem, [{\n key: \"destroy\",\n\n\n /**\n * Try to free resources and perform other cleanup operations.\n */\n value: function destroy() {\n this.el.removeEventListener(\"mousedown\", this.onClick, false);\n this.el.removeEventListener(\"mouseover\", this.onMouseover, false);\n this.el.removeEventListener(\"touchstart\", this.onClick, false);\n if (this.active) {\n this.dropdown.activeItem = null;\n }\n // This element has already been removed by {@link Dropdown#clear}.\n this._el = null;\n }\n\n /**\n * Callbacked when it is appended to a dropdown.\n *\n * @see Dropdown#append\n */\n\n }, {\n key: \"appended\",\n value: function appended(dropdown) {\n this.dropdown = dropdown;\n this.siblings = dropdown.items;\n this.index = this.siblings.length - 1;\n }\n\n /**\n * Deactivate active item then activate itself.\n *\n * @return {this}\n */\n\n }, {\n key: \"activate\",\n value: function activate() {\n if (!this.active) {\n var _activeItem = this.dropdown.getActiveItem();\n if (_activeItem) {\n _activeItem.deactivate();\n }\n this.dropdown.activeItem = this;\n this.active = true;\n this.el.className = this.activeClassName;\n }\n return this;\n }\n\n /**\n * Get the next sibling.\n */\n\n }, {\n key: \"deactivate\",\n\n\n /** @private */\n value: function deactivate() {\n if (this.active) {\n this.active = false;\n this.el.className = this.className;\n this.dropdown.activeItem = null;\n }\n return this;\n }\n\n /** @private */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n e.preventDefault // Prevent blur event\n ();this.dropdown.select(this);\n }\n\n /** @private */\n\n }, {\n key: \"onMouseover\",\n value: function onMouseover() {\n this.activate();\n }\n }, {\n key: \"el\",\n get: function get() {\n if (this._el) {\n return this._el;\n }\n var li = document.createElement(\"li\");\n li.className = this.active ? this.activeClassName : this.className;\n var a = document.createElement(\"a\");\n a.innerHTML = this.searchResult.render();\n li.appendChild(a);\n this._el = li;\n li.addEventListener(\"mousedown\", this.onClick);\n li.addEventListener(\"mouseover\", this.onMouseover);\n li.addEventListener(\"touchstart\", this.onClick);\n return li;\n }\n }, {\n key: \"next\",\n get: function get() {\n var nextIndex = void 0;\n if (this.index === this.siblings.length - 1) {\n if (!this.dropdown.rotate) {\n return null;\n }\n nextIndex = 0;\n } else {\n nextIndex = this.index + 1;\n }\n return this.siblings[nextIndex];\n }\n\n /**\n * Get the previous sibling.\n */\n\n }, {\n key: \"prev\",\n get: function get() {\n var nextIndex = void 0;\n if (this.index === 0) {\n if (!this.dropdown.rotate) {\n return null;\n }\n nextIndex = this.siblings.length - 1;\n } else {\n nextIndex = this.index - 1;\n }\n return this.siblings[nextIndex];\n }\n }]);\n\n return DropdownItem;\n}();\n\nexports.default = DropdownItem;\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _update = __webpack_require__(13);\n\nvar _update2 = _interopRequireDefault(_update);\n\nvar _editor = __webpack_require__(4);\n\nvar _editor2 = _interopRequireDefault(_editor);\n\nvar _utils = __webpack_require__(3);\n\nvar _search_result = __webpack_require__(0);\n\nvar _search_result2 = _interopRequireDefault(_search_result);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar getCaretCoordinates = __webpack_require__(14);\n\nvar CALLBACK_METHODS = [\"onInput\", \"onKeydown\"];\n\n/**\n * Encapsulate the target textarea element.\n */\n\nvar Textarea = function (_Editor) {\n _inherits(Textarea, _Editor);\n\n /**\n * @param {HTMLTextAreaElement} el - Where the textcomplete works on.\n */\n function Textarea(el) {\n _classCallCheck(this, Textarea);\n\n var _this = _possibleConstructorReturn(this, (Textarea.__proto__ || Object.getPrototypeOf(Textarea)).call(this));\n\n _this.el = el;\n\n CALLBACK_METHODS.forEach(function (method) {\n ;_this[method] = _this[method].bind(_this);\n });\n\n _this.startListening();\n return _this;\n }\n\n /**\n * @return {this}\n */\n\n\n _createClass(Textarea, [{\n key: \"destroy\",\n value: function destroy() {\n _get(Textarea.prototype.__proto__ || Object.getPrototypeOf(Textarea.prototype), \"destroy\", this).call(this);\n this.stopListening\n // Release the element reference early to help garbage collection.\n ();this.el = null;\n return this;\n }\n\n /**\n * Implementation for {@link Editor#applySearchResult}\n */\n\n }, {\n key: \"applySearchResult\",\n value: function applySearchResult(searchResult) {\n var before = this.getBeforeCursor();\n if (before != null) {\n var replace = searchResult.replace(before, this.getAfterCursor());\n this.el.focus // Clicking a dropdown item removes focus from the element.\n ();if (Array.isArray(replace)) {\n (0, _update2.default)(this.el, replace[0], replace[1]);\n this.el.dispatchEvent(new Event(\"input\"));\n }\n }\n }\n\n /**\n * Implementation for {@link Editor#getCursorOffset}\n */\n\n }, {\n key: \"getCursorOffset\",\n value: function getCursorOffset() {\n var elOffset = (0, _utils.calculateElementOffset)(this.el);\n var elScroll = this.getElScroll();\n var cursorPosition = this.getCursorPosition();\n var lineHeight = (0, _utils.getLineHeightPx)(this.el);\n var top = elOffset.top - elScroll.top + cursorPosition.top + lineHeight;\n var left = elOffset.left - elScroll.left + cursorPosition.left;\n if (this.el.dir !== \"rtl\") {\n return { top: top, left: left, lineHeight: lineHeight };\n } else {\n var right = document.documentElement ? document.documentElement.clientWidth - left : 0;\n return { top: top, right: right, lineHeight: lineHeight };\n }\n }\n\n /**\n * Implementation for {@link Editor#getBeforeCursor}\n */\n\n }, {\n key: \"getBeforeCursor\",\n value: function getBeforeCursor() {\n return this.el.selectionStart !== this.el.selectionEnd ? null : this.el.value.substring(0, this.el.selectionEnd);\n }\n\n /** @private */\n\n }, {\n key: \"getAfterCursor\",\n value: function getAfterCursor() {\n return this.el.value.substring(this.el.selectionEnd);\n }\n\n /** @private */\n\n }, {\n key: \"getElScroll\",\n value: function getElScroll() {\n return { top: this.el.scrollTop, left: this.el.scrollLeft };\n }\n\n /**\n * The input cursor's relative coordinates from the textarea's left\n * top corner.\n *\n * @private\n */\n\n }, {\n key: \"getCursorPosition\",\n value: function getCursorPosition() {\n return getCaretCoordinates(this.el, this.el.selectionEnd);\n }\n\n /** @private */\n\n }, {\n key: \"onInput\",\n value: function onInput() {\n this.emitChangeEvent();\n }\n\n /** @private */\n\n }, {\n key: \"onKeydown\",\n value: function onKeydown(e) {\n var code = this.getCode(e);\n var event = void 0;\n if (code === \"UP\" || code === \"DOWN\") {\n event = this.emitMoveEvent(code);\n } else if (code === \"ENTER\") {\n event = this.emitEnterEvent();\n } else if (code === \"ESC\") {\n event = this.emitEscEvent();\n }\n if (event && event.defaultPrevented) {\n e.preventDefault();\n }\n }\n\n /** @private */\n\n }, {\n key: \"startListening\",\n value: function startListening() {\n this.el.addEventListener(\"input\", this.onInput);\n this.el.addEventListener(\"keydown\", this.onKeydown);\n }\n\n /** @private */\n\n }, {\n key: \"stopListening\",\n value: function stopListening() {\n this.el.removeEventListener(\"input\", this.onInput);\n this.el.removeEventListener(\"keydown\", this.onKeydown);\n }\n }]);\n\n return Textarea;\n}(_editor2.default);\n\nexports.default = Textarea;\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (el, headToCursor, cursorToTail) {\n var curr = el.value,\n // strA + strB1 + strC\n next = headToCursor + (cursorToTail || ''),\n // strA + strB2 + strC\n activeElement = document.activeElement;\n\n // Calculate length of strA and strC\n var aLength = 0,\n cLength = 0;\n while (aLength < curr.length && aLength < next.length && curr[aLength] === next[aLength]) {\n aLength++;\n }\n while (curr.length - cLength - 1 >= 0 && next.length - cLength - 1 >= 0 && curr[curr.length - cLength - 1] === next[next.length - cLength - 1]) {\n cLength++;\n }\n aLength = Math.min(aLength, Math.min(curr.length, next.length) - cLength);\n\n // Select strB1\n el.setSelectionRange(aLength, curr.length - cLength);\n\n // Get strB2\n var strB2 = next.substring(aLength, next.length - cLength);\n\n // Replace strB1 with strB2\n el.focus();\n if (!document.execCommand('insertText', false, strB2)) {\n // Document.execCommand returns false if the command is not supported.\n // Firefox and IE returns false in this case.\n el.value = next;\n el.dispatchEvent(createInputEvent());\n }\n\n // Move cursor to the end of headToCursor\n el.setSelectionRange(headToCursor.length, headToCursor.length);\n\n activeElement && activeElement.focus();\n return el;\n};\n\nfunction createInputEvent() {\n if (typeof Event !== \"undefined\") {\n return new Event(\"input\", { bubbles: true, cancelable: true });\n } else {\n var event = document.createEvent(\"Event\");\n event.initEvent(\"input\", true, true);\n return event;\n }\n}\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports) {\n\n/* jshint browser: true */\n\n(function () {\n\n// The properties that we copy into a mirrored div.\n// Note that some browsers, such as Firefox,\n// do not concatenate properties, i.e. padding-top, bottom etc. -> padding,\n// so we have to do every single property specifically.\nvar properties = [\n 'direction', // RTL support\n 'boxSizing',\n 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does\n 'height',\n 'overflowX',\n 'overflowY', // copy the scrollbar for IE\n\n 'borderTopWidth',\n 'borderRightWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'borderStyle',\n\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/font\n 'fontStyle',\n 'fontVariant',\n 'fontWeight',\n 'fontStretch',\n 'fontSize',\n 'fontSizeAdjust',\n 'lineHeight',\n 'fontFamily',\n\n 'textAlign',\n 'textTransform',\n 'textIndent',\n 'textDecoration', // might not make a difference, but better be safe\n\n 'letterSpacing',\n 'wordSpacing',\n\n 'tabSize',\n 'MozTabSize'\n\n];\n\nvar isBrowser = (typeof window !== 'undefined');\nvar isFirefox = (isBrowser && window.mozInnerScreenX != null);\n\nfunction getCaretCoordinates(element, position, options) {\n if(!isBrowser) {\n throw new Error('textarea-caret-position#getCaretCoordinates should only be called in a browser');\n }\n\n var debug = options && options.debug || false;\n if (debug) {\n var el = document.querySelector('#input-textarea-caret-position-mirror-div');\n if ( el ) { el.parentNode.removeChild(el); }\n }\n\n // mirrored div\n var div = document.createElement('div');\n div.id = 'input-textarea-caret-position-mirror-div';\n document.body.appendChild(div);\n\n var style = div.style;\n var computed = window.getComputedStyle? getComputedStyle(element) : element.currentStyle; // currentStyle for IE < 9\n\n // default textarea styles\n style.whiteSpace = 'pre-wrap';\n if (element.nodeName !== 'INPUT')\n style.wordWrap = 'break-word'; // only for textarea-s\n\n // position off-screen\n style.position = 'absolute'; // required to return coordinates properly\n if (!debug)\n style.visibility = 'hidden'; // not 'display: none' because we want rendering\n\n // transfer the element's properties to the div\n properties.forEach(function (prop) {\n style[prop] = computed[prop];\n });\n\n if (isFirefox) {\n // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275\n if (element.scrollHeight > parseInt(computed.height))\n style.overflowY = 'scroll';\n } else {\n style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll'\n }\n\n div.textContent = element.value.substring(0, position);\n // the second special handling for input type=\"text\" vs textarea: spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037\n if (element.nodeName === 'INPUT')\n div.textContent = div.textContent.replace(/\\s/g, '\\u00a0');\n\n var span = document.createElement('span');\n // Wrapping must be replicated *exactly*, including when a long word gets\n // onto the next line, with whitespace at the end of the line before (#7).\n // The *only* reliable way to do that is to copy the *entire* rest of the\n // textarea's content into the <span> created at the caret position.\n // for inputs, just '.' would be enough, but why bother?\n span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all\n div.appendChild(span);\n\n var coordinates = {\n top: span.offsetTop + parseInt(computed['borderTopWidth']),\n left: span.offsetLeft + parseInt(computed['borderLeftWidth'])\n };\n\n if (debug) {\n span.style.backgroundColor = '#aaa';\n } else {\n document.body.removeChild(div);\n }\n\n return coordinates;\n}\n\nif (typeof module != 'undefined' && typeof module.exports != 'undefined') {\n module.exports = getCaretCoordinates;\n} else if(isBrowser){\n window.getCaretCoordinates = getCaretCoordinates;\n}\n\n}());\n\n\n/***/ })\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// textcomplete.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 5);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 5fdd342a07201b673919","// @flow\n\nimport Strategy from \"./strategy\"\n\n/**\n * Encapsulate an result of each search results.\n */\nexport default class SearchResult {\n data: Object\n term: string\n strategy: Strategy\n\n /**\n * @param {object} data - An element of array callbacked by search function.\n */\n constructor(data: Object, term: string, strategy: Strategy) {\n this.data = data\n this.term = term\n this.strategy = strategy\n }\n\n replace(beforeCursor: string, afterCursor: string) {\n let replacement = this.strategy.replace(this.data)\n if (replacement !== null) {\n if (Array.isArray(replacement)) {\n afterCursor = replacement[1] + afterCursor\n replacement = replacement[0]\n }\n const match = this.strategy.matchText(beforeCursor)\n if (match) {\n replacement = replacement\n .replace(/\\$&/g, match[0])\n .replace(/\\$(\\d)/g, (_, p1) => match[parseInt(p1, 10)])\n return [\n [\n beforeCursor.slice(0, match.index),\n replacement,\n beforeCursor.slice(match.index + match[0].length),\n ].join(\"\"),\n afterCursor,\n ]\n }\n }\n }\n\n render(): string {\n return this.strategy.template(this.data, this.term)\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/search_result.js","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @api private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {Mixed} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @api private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @api public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @api public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Boolean} exists Only check if there are listeners.\n * @returns {Array|Boolean}\n * @api public\n */\nEventEmitter.prototype.listeners = function listeners(event, exists) {\n var evt = prefix ? prefix + event : event\n , available = this._events[evt];\n\n if (exists) return !!available;\n if (!available) return [];\n if (available.fn) return [available.fn];\n\n for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n ee[i] = available[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @api public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn The listener function.\n * @param {Mixed} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n var listener = new EE(fn, context || this)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n else if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [this._events[evt], listener];\n\n return this;\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn The listener function.\n * @param {Mixed} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n var listener = new EE(fn, context || this, true)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n else if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [this._events[evt], listener];\n\n return this;\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {Mixed} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn\n && (!once || listeners.once)\n && (!context || listeners.context === context)\n ) {\n if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn\n || (once && !listeners[i].once)\n || (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {String|Symbol} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) {\n if (--this._eventsCount === 0) this._events = new Events();\n else delete this._events[evt];\n }\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// This function doesn't apply anymore.\n//\nEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n return this;\n};\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/eventemitter3/index.js\n// module id = 1\n// module chunks = 0","// @flow\n\ndeclare class MatchData extends Array<string> {\n index: number;\n}\n\nexport type { MatchData }\n\nconst DEFAULT_INDEX = 2\n\nfunction DEFAULT_TEMPLATE(value) {\n return value\n}\n\n/**\n * Properties for a strategy.\n *\n * @typedef\n */\nexport type StrategyProperties = {\n match: RegExp | (string => MatchData | null),\n search: Function,\n replace: any => string[] | string | null,\n cache?: boolean,\n context?: Function,\n template?: any => string,\n index?: number,\n id?: string,\n}\n\n/**\n * Encapsulate a single strategy.\n */\nexport default class Strategy {\n props: StrategyProperties\n cache: ?Object\n\n constructor(props: StrategyProperties) {\n this.props = props\n this.cache = props.cache ? {} : null\n }\n\n /**\n * @return {this}\n */\n destroy() {\n this.cache = null\n return this\n }\n\n search(term: string, callback: Function, match: MatchData): void {\n if (this.cache) {\n this.searchWithCache(term, callback, match)\n } else {\n this.props.search(term, callback, match)\n }\n }\n\n /**\n * @param {object} data - An element of array callbacked by search function.\n */\n replace(data: any) {\n return this.props.replace(data)\n }\n\n /** @private */\n searchWithCache(term: string, callback: Function, match: MatchData): void {\n if (this.cache && this.cache[term]) {\n callback(this.cache[term])\n } else {\n this.props.search(\n term,\n results => {\n if (this.cache) {\n this.cache[term] = results\n }\n callback(results)\n },\n match,\n )\n }\n }\n\n /** @private */\n matchText(text: string): MatchData | null {\n if (typeof this.match === \"function\") {\n return this.match(text)\n } else {\n return (text.match(this.match): any)\n }\n }\n\n /** @private */\n get match(): $PropertyType<StrategyProperties, \"match\"> {\n return this.props.match\n }\n\n /** @private */\n get index(): number {\n return typeof this.props.index === \"number\"\n ? this.props.index\n : DEFAULT_INDEX\n }\n\n get template(): (...any) => string {\n return this.props.template || DEFAULT_TEMPLATE\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/strategy.js","// @flow\n\n/**\n * Create a custom event\n *\n * @private\n */\nexport const createCustomEvent = (() => {\n if (typeof window.CustomEvent === \"function\") {\n return function(\n type: string,\n options: ?{ detail?: Object, cancelable?: boolean },\n ): CustomEvent {\n return new document.defaultView.CustomEvent(type, {\n cancelable: (options && options.cancelable) || false,\n detail: (options && options.detail) || undefined,\n })\n }\n } else {\n // Custom event polyfill from\n // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#polyfill\n return function(\n type: string,\n options: ?{ detail?: Object, cancelable?: boolean },\n ): CustomEvent {\n const event = document.createEvent(\"CustomEvent\")\n event.initCustomEvent(\n type,\n /* bubbles */ false,\n (options && options.cancelable) || false,\n (options && options.detail) || undefined,\n )\n return event\n }\n }\n})()\n\n/**\n * Get the current coordinates of the `el` relative to the document.\n *\n * @private\n */\nexport function calculateElementOffset(\n el: HTMLElement,\n): { top: number, left: number } {\n const rect = el.getBoundingClientRect()\n const { defaultView, documentElement } = el.ownerDocument\n const offset = {\n top: rect.top + defaultView.pageYOffset,\n left: rect.left + defaultView.pageXOffset,\n }\n if (documentElement) {\n offset.top -= documentElement.clientTop\n offset.left -= documentElement.clientLeft\n }\n return offset\n}\n\nconst CHAR_CODE_ZERO = \"0\".charCodeAt(0)\nconst CHAR_CODE_NINE = \"9\".charCodeAt(0)\n\nfunction isDigit(charCode: number): boolean {\n return charCode >= CHAR_CODE_ZERO && charCode <= CHAR_CODE_NINE\n}\n\n/**\n * Returns the line-height of the given node in pixels.\n *\n * @private\n */\nexport function getLineHeightPx(node: HTMLElement): number {\n const computedStyle = window.getComputedStyle(node)\n\n // If the char code starts with a digit, it is either a value in pixels,\n // or unitless, as per:\n // https://drafts.csswg.org/css2/visudet.html#propdef-line-height\n // https://drafts.csswg.org/css2/cascade.html#computed-value\n if (isDigit(computedStyle.lineHeight.charCodeAt(0))) {\n // In real browsers the value is *always* in pixels, even for unit-less\n // line-heights. However, we still check as per the spec.\n if (\n isDigit(\n computedStyle.lineHeight.charCodeAt(\n computedStyle.lineHeight.length - 1,\n ),\n )\n ) {\n return (\n parseFloat(computedStyle.lineHeight) *\n parseFloat(computedStyle.fontSize)\n )\n } else {\n return parseFloat(computedStyle.lineHeight)\n }\n }\n\n // Otherwise, the value is \"normal\".\n // If the line-height is \"normal\", calculate by font-size\n return calculateLineHeightPx(node.nodeName, computedStyle)\n}\n\n/**\n * Returns calculated line-height of the given node in pixels.\n *\n * @private\n */\nexport function calculateLineHeightPx(\n nodeName: string,\n computedStyle: CSSStyleDeclaration,\n): number {\n const body = document.body\n if (!body) {\n return 0\n }\n\n const tempNode = document.createElement(nodeName)\n tempNode.innerHTML = \" \"\n tempNode.style.fontSize = computedStyle.fontSize\n tempNode.style.fontFamily = computedStyle.fontFamily\n tempNode.style.padding = \"0\"\n body.appendChild(tempNode)\n\n // Make sure textarea has only 1 row\n if (tempNode instanceof HTMLTextAreaElement) {\n ;(tempNode: HTMLTextAreaElement).rows = 1\n }\n\n // Assume the height of the element is the line-height\n const height = tempNode.offsetHeight\n body.removeChild(tempNode)\n\n return height\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils.js","// @flow\n/*eslint no-unused-vars: off*/\n\nimport EventEmitter from \"eventemitter3\"\n\nimport { createCustomEvent } from \"./utils\"\nimport SearchResult from \"./search_result\"\n\n/** @typedef */\nexport type CursorOffset = {\n lineHeight: number,\n top: number,\n left?: number,\n right?: number,\n}\n\ntype KeyCode = \"ESC\" | \"ENTER\" | \"UP\" | \"DOWN\" | \"OTHER\"\n\n/**\n * Abstract class representing a editor target.\n *\n * Editor classes must implement `#applySearchResult`, `#getCursorOffset` and\n * `#getBeforeCursor` methods.\n *\n * Editor classes must invoke `#emitMoveEvent`, `#emitEnterEvent`,\n * `#emitChangeEvent` and `#emitEscEvent` at proper timing.\n *\n * @abstract\n */\nexport default class Editor extends EventEmitter {\n /**\n * It is called when associated textcomplete object is destroyed.\n *\n * @return {this}\n */\n destroy() {\n return this\n }\n\n /**\n * It is called when a search result is selected by a user.\n */\n applySearchResult(_: SearchResult): void {\n throw new Error(\"Not implemented.\")\n }\n\n /**\n * The input cursor's absolute coordinates from the window's left\n * top corner.\n */\n getCursorOffset(): CursorOffset {\n throw new Error(\"Not implemented.\")\n }\n\n /**\n * Editor string value from head to cursor.\n * Returns null if selection type is range not cursor.\n */\n getBeforeCursor(): ?string {\n throw new Error(\"Not implemented.\")\n }\n\n /**\n * Emit a move event, which moves active dropdown element.\n * Child class must call this method at proper timing with proper parameter.\n *\n * @see {@link Textarea} for live example.\n */\n emitMoveEvent(code: \"UP\" | \"DOWN\"): CustomEvent {\n const moveEvent = createCustomEvent(\"move\", {\n cancelable: true,\n detail: {\n code: code,\n },\n })\n this.emit(\"move\", moveEvent)\n return moveEvent\n }\n\n /**\n * Emit a enter event, which selects current search result.\n * Child class must call this method at proper timing.\n *\n * @see {@link Textarea} for live example.\n */\n emitEnterEvent(): CustomEvent {\n const enterEvent = createCustomEvent(\"enter\", { cancelable: true })\n this.emit(\"enter\", enterEvent)\n return enterEvent\n }\n\n /**\n * Emit a change event, which triggers auto completion.\n * Child class must call this method at proper timing.\n *\n * @see {@link Textarea} for live example.\n */\n emitChangeEvent(): CustomEvent {\n const changeEvent = createCustomEvent(\"change\", {\n detail: {\n beforeCursor: this.getBeforeCursor(),\n },\n })\n this.emit(\"change\", changeEvent)\n return changeEvent\n }\n\n /**\n * Emit a esc event, which hides dropdown element.\n * Child class must call this method at proper timing.\n *\n * @see {@link Textarea} for live example.\n */\n emitEscEvent(): CustomEvent {\n const escEvent = createCustomEvent(\"esc\", { cancelable: true })\n this.emit(\"esc\", escEvent)\n return escEvent\n }\n\n /**\n * Helper method for parsing KeyboardEvent.\n *\n * @see {@link Textarea} for live example.\n */\n getCode(e: KeyboardEvent): KeyCode {\n return e.keyCode === 9\n ? \"ENTER\" // tab\n : e.keyCode === 13\n ? \"ENTER\" // enter\n : e.keyCode === 27\n ? \"ESC\" // esc\n : e.keyCode === 38\n ? \"UP\" // up\n : e.keyCode === 40\n ? \"DOWN\" // down\n : e.keyCode === 78 && e.ctrlKey\n ? \"DOWN\" // ctrl-n\n : e.keyCode === 80 && e.ctrlKey\n ? \"UP\" // ctrl-p\n : \"OTHER\"\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/editor.js","import Textcomplete from \"./textcomplete\"\nimport Textarea from \"./textarea\"\n\nlet editors\nif (global.Textcomplete && global.Textcomplete.editors) {\n editors = global.Textcomplete.editors\n} else {\n editors = {}\n}\neditors.Textarea = Textarea\n\nglobal.Textcomplete = Textcomplete\nglobal.Textcomplete.editors = editors\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.js","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = 6\n// module chunks = 0","// @flow\n\nimport Completer from \"./completer\"\nimport Editor from \"./editor\"\nimport Dropdown, { type DropdownOptions } from \"./dropdown\"\nimport Strategy, { type StrategyProperties } from \"./strategy\"\nimport SearchResult from \"./search_result\"\n\nimport EventEmitter from \"eventemitter3\"\n\nconst CALLBACK_METHODS = [\n \"handleChange\",\n \"handleEnter\",\n \"handleEsc\",\n \"handleHit\",\n \"handleMove\",\n \"handleSelect\",\n]\n\n/** @typedef */\ntype TextcompleteOptions = {\n dropdown?: DropdownOptions,\n}\n\n/**\n * The core of textcomplete. It acts as a mediator.\n */\nexport default class Textcomplete extends EventEmitter {\n dropdown: Dropdown\n editor: Editor\n options: TextcompleteOptions\n completer: Completer\n isQueryInFlight: boolean\n nextPendingQuery: string | null\n\n /**\n * @param {Editor} editor - Where the textcomplete works on.\n */\n constructor(editor: Editor, options: TextcompleteOptions = {}) {\n super()\n\n this.completer = new Completer()\n this.isQueryInFlight = false\n this.nextPendingQuery = null\n this.dropdown = new Dropdown(options.dropdown || {})\n this.editor = editor\n this.options = options\n\n CALLBACK_METHODS.forEach(method => {\n ;(this: any)[method] = (this: any)[method].bind(this)\n })\n\n this.startListening()\n }\n\n /**\n * @return {this}\n */\n destroy(destroyEditor: boolean = true) {\n this.completer.destroy()\n this.dropdown.destroy()\n if (destroyEditor) {\n this.editor.destroy()\n }\n this.stopListening()\n return this\n }\n\n /**\n * @return {this}\n */\n hide() {\n this.dropdown.deactivate()\n return this\n }\n\n /**\n * @return {this}\n * @example\n * textcomplete.register([{\n * match: /(^|\\s)(\\w+)$/,\n * search: function (term, callback) {\n * $.ajax({ ... })\n * .done(callback)\n * .fail([]);\n * },\n * replace: function (value) {\n * return '$1' + value + ' ';\n * }\n * }]);\n */\n register(strategyPropsArray: StrategyProperties[]) {\n strategyPropsArray.forEach(props => {\n this.completer.registerStrategy(new Strategy(props))\n })\n return this\n }\n\n /**\n * Start autocompleting.\n *\n * @param {string} text - Head to input cursor.\n * @return {this}\n */\n trigger(text: string) {\n if (this.isQueryInFlight) {\n this.nextPendingQuery = text\n } else {\n this.isQueryInFlight = true\n this.nextPendingQuery = null\n this.completer.run(text)\n }\n return this\n }\n\n /** @private */\n handleHit({ searchResults }: { searchResults: SearchResult[] }) {\n if (searchResults.length) {\n this.dropdown.render(searchResults, this.editor.getCursorOffset())\n } else {\n this.dropdown.deactivate()\n }\n this.isQueryInFlight = false\n if (this.nextPendingQuery !== null) {\n this.trigger(this.nextPendingQuery)\n }\n }\n\n /** @private */\n handleMove(e: CustomEvent) {\n e.detail.code === \"UP\" ? this.dropdown.up(e) : this.dropdown.down(e)\n }\n\n /** @private */\n handleEnter(e: CustomEvent) {\n const activeItem = this.dropdown.getActiveItem()\n if (activeItem) {\n this.dropdown.select(activeItem)\n e.preventDefault()\n } else {\n this.dropdown.deactivate()\n }\n }\n\n /** @private */\n handleEsc(e: CustomEvent) {\n if (this.dropdown.shown) {\n this.dropdown.deactivate()\n e.preventDefault()\n }\n }\n\n /** @private */\n handleChange(e: CustomEvent) {\n if (e.detail.beforeCursor != null) {\n this.trigger(e.detail.beforeCursor)\n } else {\n this.dropdown.deactivate()\n }\n }\n\n /** @private */\n handleSelect(selectEvent: CustomEvent) {\n this.emit(\"select\", selectEvent)\n if (!selectEvent.defaultPrevented) {\n this.editor.applySearchResult(selectEvent.detail.searchResult)\n }\n }\n\n /** @private */\n startListening() {\n this.editor\n .on(\"move\", this.handleMove)\n .on(\"enter\", this.handleEnter)\n .on(\"esc\", this.handleEsc)\n .on(\"change\", this.handleChange)\n this.dropdown.on(\"select\", this.handleSelect)\n ;[\n \"show\",\n \"shown\",\n \"render\",\n \"rendered\",\n \"selected\",\n \"hidden\",\n \"hide\",\n ].forEach(eventName => {\n this.dropdown.on(eventName, () => this.emit(eventName))\n })\n this.completer.on(\"hit\", this.handleHit)\n }\n\n /** @private */\n stopListening() {\n this.completer.removeAllListeners()\n this.dropdown.removeAllListeners()\n this.editor\n .removeListener(\"move\", this.handleMove)\n .removeListener(\"enter\", this.handleEnter)\n .removeListener(\"esc\", this.handleEsc)\n .removeListener(\"change\", this.handleChange)\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/textcomplete.js","// @flow\n\nimport EventEmitter from \"eventemitter3\"\n\nimport Query from \"./query\"\nimport SearchResult from \"./search_result\"\nimport Strategy from \"./strategy\"\n\nconst CALLBACK_METHODS = [\"handleQueryResult\"]\n\n/**\n * Complete engine.\n */\nexport default class Completer extends EventEmitter {\n strategies: Strategy[]\n\n constructor() {\n super()\n this.strategies = []\n\n CALLBACK_METHODS.forEach(method => {\n ;(this: any)[method] = (this: any)[method].bind(this)\n })\n }\n\n /**\n * @return {this}\n */\n destroy() {\n this.strategies.forEach(strategy => strategy.destroy())\n return this\n }\n\n /**\n * Register a strategy to the completer.\n *\n * @return {this}\n */\n registerStrategy(strategy: Strategy) {\n this.strategies.push(strategy)\n return this\n }\n\n /**\n * @param {string} text - Head to input cursor.\n */\n run(text: string): void {\n const query = this.extractQuery(text)\n if (query) {\n query.execute(this.handleQueryResult)\n } else {\n this.handleQueryResult([])\n }\n }\n\n /**\n * Find a query, which matches to the given text.\n *\n * @private\n */\n extractQuery(text: string) {\n for (let i = 0; i < this.strategies.length; i++) {\n const query = Query.build(this.strategies[i], text)\n if (query) {\n return query\n }\n }\n return null\n }\n\n /**\n * Callbacked by {@link Query#execute}.\n *\n * @private\n */\n handleQueryResult(searchResults: SearchResult[]) {\n this.emit(\"hit\", { searchResults })\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/completer.js","// @flow\n\nimport SearchResult from \"./search_result\"\nimport Strategy from \"./strategy\"\nimport type { MatchData } from \"./strategy\"\n\n/**\n * Encapsulate matching condition between a Strategy and current editor's value.\n */\nexport default class Query {\n strategy: Strategy\n term: string\n match: MatchData\n\n /**\n * Build a Query object by the given string if this matches to the string.\n *\n * @param {string} text - Head to input cursor.\n */\n static build(strategy: Strategy, text: string): ?Query {\n if (typeof strategy.props.context === \"function\") {\n const context = strategy.props.context(text)\n if (typeof context === \"string\") {\n text = context\n } else if (!context) {\n return null\n }\n }\n const match = strategy.matchText(text)\n return match ? new Query(strategy, match[strategy.index], match) : null\n }\n\n constructor(strategy: Strategy, term: string, match: MatchData) {\n this.strategy = strategy\n this.term = term\n this.match = match\n }\n\n /**\n * Invoke search strategy and callback the given function.\n */\n execute(callback: (SearchResult[]) => void) {\n this.strategy.search(\n this.term,\n results => {\n callback(\n results.map(result => {\n return new SearchResult(result, this.term, this.strategy)\n }),\n )\n },\n this.match,\n )\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/query.js","// @flow\nimport EventEmitter from \"eventemitter3\"\n\nimport DropdownItem, { type DropdownItemOptions } from \"./dropdown_item\"\nimport SearchResult from \"./search_result\"\nimport { createCustomEvent } from \"./utils\"\nimport type { CursorOffset } from \"./editor\"\n\nconst DEFAULT_CLASS_NAME = \"dropdown-menu textcomplete-dropdown\"\n\n/** @typedef */\nexport type DropdownOptions = {\n className?: string,\n footer?: any => string | string,\n header?: any => string | string,\n maxCount?: number,\n placement?: string,\n rotate?: boolean,\n style?: { [string]: string },\n item?: DropdownItemOptions,\n}\n\n/**\n * Encapsulate a dropdown view.\n *\n * @prop {boolean} shown - Whether the #el is shown or not.\n * @prop {DropdownItem[]} items - The array of rendered dropdown items.\n */\nexport default class Dropdown extends EventEmitter {\n shown: boolean\n items: DropdownItem[]\n activeItem: DropdownItem | null\n footer: $PropertyType<DropdownOptions, \"footer\">\n header: $PropertyType<DropdownOptions, \"header\">\n maxCount: $PropertyType<DropdownOptions, \"maxCount\">\n rotate: $PropertyType<DropdownOptions, \"rotate\">\n placement: $PropertyType<DropdownOptions, \"placement\">\n itemOptions: DropdownItemOptions\n _el: ?HTMLUListElement\n\n static createElement(): HTMLUListElement {\n const el = document.createElement(\"ul\")\n const style = el.style\n style.display = \"none\"\n style.position = \"absolute\"\n style.zIndex = \"10000\"\n const body = document.body\n if (body) {\n body.appendChild(el)\n }\n return el\n }\n\n constructor(options: DropdownOptions) {\n super()\n this.shown = false\n this.items = []\n this.activeItem = null\n this.footer = options.footer\n this.header = options.header\n this.maxCount = options.maxCount || 10\n this.el.className = options.className || DEFAULT_CLASS_NAME\n this.rotate = options.hasOwnProperty(\"rotate\") ? options.rotate : true\n this.placement = options.placement\n this.itemOptions = options.item || {}\n const style = options.style\n if (style) {\n Object.keys(style).forEach(key => {\n ;(this.el.style: any)[key] = style[key]\n })\n }\n }\n\n /**\n * @return {this}\n */\n destroy() {\n const parentNode = this.el.parentNode\n if (parentNode) {\n parentNode.removeChild(this.el)\n }\n this.clear()._el = null\n return this\n }\n\n get el(): HTMLUListElement {\n if (!this._el) {\n this._el = Dropdown.createElement()\n }\n return this._el\n }\n\n /**\n * Render the given data as dropdown items.\n *\n * @return {this}\n */\n render(searchResults: SearchResult[], cursorOffset: CursorOffset) {\n const renderEvent = createCustomEvent(\"render\", { cancelable: true })\n this.emit(\"render\", renderEvent)\n if (renderEvent.defaultPrevented) {\n return this\n }\n const rawResults = searchResults.map(searchResult => searchResult.data)\n const dropdownItems = searchResults\n .slice(0, this.maxCount || searchResults.length)\n .map(searchResult => new DropdownItem(searchResult, this.itemOptions))\n this.clear()\n .setStrategyId(searchResults[0])\n .renderEdge(rawResults, \"header\")\n .append(dropdownItems)\n .renderEdge(rawResults, \"footer\")\n .show()\n .setOffset(cursorOffset)\n this.emit(\"rendered\", createCustomEvent(\"rendered\"))\n return this\n }\n\n /**\n * Hide the dropdown then sweep out items.\n *\n * @return {this}\n */\n deactivate() {\n return this.hide().clear()\n }\n\n /**\n * @return {this}\n */\n select(dropdownItem: DropdownItem) {\n const detail = { searchResult: dropdownItem.searchResult }\n const selectEvent = createCustomEvent(\"select\", {\n cancelable: true,\n detail: detail,\n })\n this.emit(\"select\", selectEvent)\n if (selectEvent.defaultPrevented) {\n return this\n }\n this.deactivate()\n this.emit(\"selected\", createCustomEvent(\"selected\", { detail }))\n return this\n }\n\n /**\n * @return {this}\n */\n up(e: CustomEvent) {\n return this.shown ? this.moveActiveItem(\"prev\", e) : this\n }\n\n /**\n * @return {this}\n */\n down(e: CustomEvent) {\n return this.shown ? this.moveActiveItem(\"next\", e) : this\n }\n\n /**\n * Retrieve the active item.\n */\n getActiveItem(): DropdownItem | null {\n return this.activeItem\n }\n\n /**\n * Add items to dropdown.\n *\n * @private\n */\n append(items: DropdownItem[]) {\n const fragment = document.createDocumentFragment()\n items.forEach(item => {\n this.items.push(item)\n item.appended(this)\n fragment.appendChild(item.el)\n })\n this.el.appendChild(fragment)\n return this\n }\n\n /** @private */\n setOffset(cursorOffset: CursorOffset) {\n const doc = document.documentElement\n if (doc) {\n const elementWidth = this.el.offsetWidth\n if (cursorOffset.left) {\n const browserWidth = doc.clientWidth\n if (cursorOffset.left + elementWidth > browserWidth) {\n cursorOffset.left = browserWidth - elementWidth\n }\n this.el.style.left = `${cursorOffset.left}px`\n } else if (cursorOffset.right) {\n if (cursorOffset.right - elementWidth < 0) {\n cursorOffset.right = 0\n }\n this.el.style.right = `${cursorOffset.right}px`\n }\n if (this.isPlacementTop()) {\n this.el.style.bottom = `${doc.clientHeight -\n cursorOffset.top +\n cursorOffset.lineHeight}px`\n } else {\n this.el.style.top = `${cursorOffset.top}px`\n }\n }\n return this\n }\n\n /**\n * Show the element.\n *\n * @private\n */\n show() {\n if (!this.shown) {\n const showEvent = createCustomEvent(\"show\", { cancelable: true })\n this.emit(\"show\", showEvent)\n if (showEvent.defaultPrevented) {\n return this\n }\n this.el.style.display = \"block\"\n this.shown = true\n this.emit(\"shown\", createCustomEvent(\"shown\"))\n }\n return this\n }\n\n /**\n * Hide the element.\n *\n * @private\n */\n hide() {\n if (this.shown) {\n const hideEvent = createCustomEvent(\"hide\", { cancelable: true })\n this.emit(\"hide\", hideEvent)\n if (hideEvent.defaultPrevented) {\n return this\n }\n this.el.style.display = \"none\"\n this.shown = false\n this.emit(\"hidden\", createCustomEvent(\"hidden\"))\n }\n return this\n }\n\n /**\n * Clear search results.\n *\n * @private\n */\n clear() {\n this.el.innerHTML = \"\"\n this.items.forEach(item => item.destroy())\n this.items = []\n return this\n }\n\n /** @private */\n moveActiveItem(direction: \"next\" | \"prev\", e: CustomEvent) {\n const nextActiveItem =\n direction === \"next\"\n ? this.activeItem ? this.activeItem.next : this.items[0]\n : this.activeItem\n ? this.activeItem.prev\n : this.items[this.items.length - 1]\n if (nextActiveItem) {\n nextActiveItem.activate()\n e.preventDefault()\n }\n return this\n }\n\n /** @private */\n setStrategyId(searchResult: ?SearchResult) {\n const strategyId = searchResult && searchResult.strategy.props.id\n if (strategyId) {\n this.el.setAttribute(\"data-strategy\", strategyId)\n } else {\n this.el.removeAttribute(\"data-strategy\")\n }\n return this\n }\n\n /**\n * @private\n * @param {object[]} rawResults - What callbacked by search function.\n */\n renderEdge(rawResults: Object[], type: \"header\" | \"footer\") {\n const source = (type === \"header\" ? this.header : this.footer) || \"\"\n const content: any =\n typeof source === \"function\" ? source(rawResults) : source\n const li = document.createElement(\"li\")\n li.classList.add(`textcomplete-${type}`)\n li.innerHTML = content\n this.el.appendChild(li)\n return this\n }\n\n /** @private */\n isPlacementTop() {\n return this.placement === \"top\"\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/dropdown.js","// @flow\n\nimport SearchResult from \"./search_result\"\n\nexport const DEFAULT_CLASS_NAME = \"textcomplete-item\"\nconst CALLBACK_METHODS = [\"onClick\", \"onMouseover\"]\n\n/** @typedef */\nexport type DropdownItemOptions = {\n className?: string,\n}\n\n// Declare interface instead of importing Dropdown itself to prevent circular dependency.\ninterface Dropdown {\n activeItem: DropdownItem | null;\n items: DropdownItem[];\n rotate: ?Boolean;\n getActiveItem(): DropdownItem | null;\n select(DropdownItem): DropdownItem;\n}\n\n/**\n * Encapsulate an item of dropdown.\n */\nexport default class DropdownItem {\n searchResult: SearchResult\n active: boolean\n className: string\n activeClassName: string\n siblings: DropdownItem[]\n dropdown: Dropdown\n index: number\n _el: ?HTMLLIElement\n\n constructor(searchResult: SearchResult, options: DropdownItemOptions) {\n this.searchResult = searchResult\n this.active = false\n this.className = options.className || DEFAULT_CLASS_NAME\n this.activeClassName = `${this.className} active`\n\n CALLBACK_METHODS.forEach(method => {\n ;(this: any)[method] = (this: any)[method].bind(this)\n })\n }\n\n get el(): HTMLLIElement {\n if (this._el) {\n return this._el\n }\n const li = document.createElement(\"li\")\n li.className = this.active ? this.activeClassName : this.className\n const a = document.createElement(\"a\")\n a.innerHTML = this.searchResult.render()\n li.appendChild(a)\n this._el = li\n li.addEventListener(\"mousedown\", this.onClick)\n li.addEventListener(\"mouseover\", this.onMouseover)\n li.addEventListener(\"touchstart\", this.onClick)\n return li\n }\n\n /**\n * Try to free resources and perform other cleanup operations.\n */\n destroy() {\n this.el.removeEventListener(\"mousedown\", this.onClick, false)\n this.el.removeEventListener(\"mouseover\", this.onMouseover, false)\n this.el.removeEventListener(\"touchstart\", this.onClick, false)\n if (this.active) {\n this.dropdown.activeItem = null\n }\n // This element has already been removed by {@link Dropdown#clear}.\n this._el = null\n }\n\n /**\n * Callbacked when it is appended to a dropdown.\n *\n * @see Dropdown#append\n */\n appended(dropdown: Dropdown) {\n this.dropdown = dropdown\n this.siblings = dropdown.items\n this.index = this.siblings.length - 1\n }\n\n /**\n * Deactivate active item then activate itself.\n *\n * @return {this}\n */\n activate() {\n if (!this.active) {\n const activeItem = this.dropdown.getActiveItem()\n if (activeItem) {\n activeItem.deactivate()\n }\n this.dropdown.activeItem = this\n this.active = true\n this.el.className = this.activeClassName\n }\n return this\n }\n\n /**\n * Get the next sibling.\n */\n get next(): ?DropdownItem {\n let nextIndex\n if (this.index === this.siblings.length - 1) {\n if (!this.dropdown.rotate) {\n return null\n }\n nextIndex = 0\n } else {\n nextIndex = this.index + 1\n }\n return this.siblings[nextIndex]\n }\n\n /**\n * Get the previous sibling.\n */\n get prev(): ?DropdownItem {\n let nextIndex\n if (this.index === 0) {\n if (!this.dropdown.rotate) {\n return null\n }\n nextIndex = this.siblings.length - 1\n } else {\n nextIndex = this.index - 1\n }\n return this.siblings[nextIndex]\n }\n\n /** @private */\n deactivate() {\n if (this.active) {\n this.active = false\n this.el.className = this.className\n this.dropdown.activeItem = null\n }\n return this\n }\n\n /** @private */\n onClick(e: Event) {\n e.preventDefault() // Prevent blur event\n this.dropdown.select(this)\n }\n\n /** @private */\n onMouseover() {\n this.activate()\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/dropdown_item.js","// @flow\n\nimport update from \"undate/lib/update\"\n\nimport Editor from \"./editor\"\nimport { calculateElementOffset, getLineHeightPx } from \"./utils\"\nimport SearchResult from \"./search_result\"\n\nconst getCaretCoordinates = require(\"textarea-caret\")\n\nconst CALLBACK_METHODS = [\"onInput\", \"onKeydown\"]\n\n/**\n * Encapsulate the target textarea element.\n */\nexport default class Textarea extends Editor {\n el: HTMLTextAreaElement\n\n /**\n * @param {HTMLTextAreaElement} el - Where the textcomplete works on.\n */\n constructor(el: HTMLTextAreaElement) {\n super()\n this.el = el\n\n CALLBACK_METHODS.forEach(method => {\n ;(this: any)[method] = (this: any)[method].bind(this)\n })\n\n this.startListening()\n }\n\n /**\n * @return {this}\n */\n destroy() {\n super.destroy()\n this.stopListening()\n // Release the element reference early to help garbage collection.\n ;(this: any).el = null\n return this\n }\n\n /**\n * Implementation for {@link Editor#applySearchResult}\n */\n applySearchResult(searchResult: SearchResult) {\n const before = this.getBeforeCursor()\n if (before != null) {\n const replace = searchResult.replace(before, this.getAfterCursor())\n this.el.focus() // Clicking a dropdown item removes focus from the element.\n if (Array.isArray(replace)) {\n update(this.el, replace[0], replace[1])\n this.el.dispatchEvent(new Event(\"input\"))\n }\n }\n }\n\n /**\n * Implementation for {@link Editor#getCursorOffset}\n */\n getCursorOffset() {\n const elOffset = calculateElementOffset(this.el)\n const elScroll = this.getElScroll()\n const cursorPosition = this.getCursorPosition()\n const lineHeight = getLineHeightPx(this.el)\n const top = elOffset.top - elScroll.top + cursorPosition.top + lineHeight\n const left = elOffset.left - elScroll.left + cursorPosition.left\n if (this.el.dir !== \"rtl\") {\n return { top, left, lineHeight }\n } else {\n const right = document.documentElement\n ? document.documentElement.clientWidth - left\n : 0\n return { top, right, lineHeight }\n }\n }\n\n /**\n * Implementation for {@link Editor#getBeforeCursor}\n */\n getBeforeCursor() {\n return this.el.selectionStart !== this.el.selectionEnd\n ? null\n : this.el.value.substring(0, this.el.selectionEnd)\n }\n\n /** @private */\n getAfterCursor() {\n return this.el.value.substring(this.el.selectionEnd)\n }\n\n /** @private */\n getElScroll(): { top: number, left: number } {\n return { top: this.el.scrollTop, left: this.el.scrollLeft }\n }\n\n /**\n * The input cursor's relative coordinates from the textarea's left\n * top corner.\n *\n * @private\n */\n getCursorPosition(): { top: number, left: number } {\n return getCaretCoordinates(this.el, this.el.selectionEnd)\n }\n\n /** @private */\n onInput() {\n this.emitChangeEvent()\n }\n\n /** @private */\n onKeydown(e: KeyboardEvent) {\n const code = this.getCode(e)\n let event\n if (code === \"UP\" || code === \"DOWN\") {\n event = this.emitMoveEvent(code)\n } else if (code === \"ENTER\") {\n event = this.emitEnterEvent()\n } else if (code === \"ESC\") {\n event = this.emitEscEvent()\n }\n if (event && event.defaultPrevented) {\n e.preventDefault()\n }\n }\n\n /** @private */\n startListening() {\n this.el.addEventListener(\"input\", this.onInput)\n this.el.addEventListener(\"keydown\", this.onKeydown)\n }\n\n /** @private */\n stopListening() {\n this.el.removeEventListener(\"input\", this.onInput)\n this.el.removeEventListener(\"keydown\", this.onKeydown)\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/textarea.js","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (el, headToCursor, cursorToTail) {\n var curr = el.value,\n // strA + strB1 + strC\n next = headToCursor + (cursorToTail || ''),\n // strA + strB2 + strC\n activeElement = document.activeElement;\n\n // Calculate length of strA and strC\n var aLength = 0,\n cLength = 0;\n while (aLength < curr.length && aLength < next.length && curr[aLength] === next[aLength]) {\n aLength++;\n }\n while (curr.length - cLength - 1 >= 0 && next.length - cLength - 1 >= 0 && curr[curr.length - cLength - 1] === next[next.length - cLength - 1]) {\n cLength++;\n }\n aLength = Math.min(aLength, Math.min(curr.length, next.length) - cLength);\n\n // Select strB1\n el.setSelectionRange(aLength, curr.length - cLength);\n\n // Get strB2\n var strB2 = next.substring(aLength, next.length - cLength);\n\n // Replace strB1 with strB2\n el.focus();\n if (!document.execCommand('insertText', false, strB2)) {\n // Document.execCommand returns false if the command is not supported.\n // Firefox and IE returns false in this case.\n el.value = next;\n el.dispatchEvent(createInputEvent());\n }\n\n // Move cursor to the end of headToCursor\n el.setSelectionRange(headToCursor.length, headToCursor.length);\n\n activeElement && activeElement.focus();\n return el;\n};\n\nfunction createInputEvent() {\n if (typeof Event !== \"undefined\") {\n return new Event(\"input\", { bubbles: true, cancelable: true });\n } else {\n var event = document.createEvent(\"Event\");\n event.initEvent(\"input\", true, true);\n return event;\n }\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/undate/lib/update.js\n// module id = 13\n// module chunks = 0","/* jshint browser: true */\n\n(function () {\n\n// The properties that we copy into a mirrored div.\n// Note that some browsers, such as Firefox,\n// do not concatenate properties, i.e. padding-top, bottom etc. -> padding,\n// so we have to do every single property specifically.\nvar properties = [\n 'direction', // RTL support\n 'boxSizing',\n 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does\n 'height',\n 'overflowX',\n 'overflowY', // copy the scrollbar for IE\n\n 'borderTopWidth',\n 'borderRightWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'borderStyle',\n\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/font\n 'fontStyle',\n 'fontVariant',\n 'fontWeight',\n 'fontStretch',\n 'fontSize',\n 'fontSizeAdjust',\n 'lineHeight',\n 'fontFamily',\n\n 'textAlign',\n 'textTransform',\n 'textIndent',\n 'textDecoration', // might not make a difference, but better be safe\n\n 'letterSpacing',\n 'wordSpacing',\n\n 'tabSize',\n 'MozTabSize'\n\n];\n\nvar isBrowser = (typeof window !== 'undefined');\nvar isFirefox = (isBrowser && window.mozInnerScreenX != null);\n\nfunction getCaretCoordinates(element, position, options) {\n if(!isBrowser) {\n throw new Error('textarea-caret-position#getCaretCoordinates should only be called in a browser');\n }\n\n var debug = options && options.debug || false;\n if (debug) {\n var el = document.querySelector('#input-textarea-caret-position-mirror-div');\n if ( el ) { el.parentNode.removeChild(el); }\n }\n\n // mirrored div\n var div = document.createElement('div');\n div.id = 'input-textarea-caret-position-mirror-div';\n document.body.appendChild(div);\n\n var style = div.style;\n var computed = window.getComputedStyle? getComputedStyle(element) : element.currentStyle; // currentStyle for IE < 9\n\n // default textarea styles\n style.whiteSpace = 'pre-wrap';\n if (element.nodeName !== 'INPUT')\n style.wordWrap = 'break-word'; // only for textarea-s\n\n // position off-screen\n style.position = 'absolute'; // required to return coordinates properly\n if (!debug)\n style.visibility = 'hidden'; // not 'display: none' because we want rendering\n\n // transfer the element's properties to the div\n properties.forEach(function (prop) {\n style[prop] = computed[prop];\n });\n\n if (isFirefox) {\n // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275\n if (element.scrollHeight > parseInt(computed.height))\n style.overflowY = 'scroll';\n } else {\n style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll'\n }\n\n div.textContent = element.value.substring(0, position);\n // the second special handling for input type=\"text\" vs textarea: spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037\n if (element.nodeName === 'INPUT')\n div.textContent = div.textContent.replace(/\\s/g, '\\u00a0');\n\n var span = document.createElement('span');\n // Wrapping must be replicated *exactly*, including when a long word gets\n // onto the next line, with whitespace at the end of the line before (#7).\n // The *only* reliable way to do that is to copy the *entire* rest of the\n // textarea's content into the <span> created at the caret position.\n // for inputs, just '.' would be enough, but why bother?\n span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all\n div.appendChild(span);\n\n var coordinates = {\n top: span.offsetTop + parseInt(computed['borderTopWidth']),\n left: span.offsetLeft + parseInt(computed['borderLeftWidth'])\n };\n\n if (debug) {\n span.style.backgroundColor = '#aaa';\n } else {\n document.body.removeChild(div);\n }\n\n return coordinates;\n}\n\nif (typeof module != 'undefined' && typeof module.exports != 'undefined') {\n module.exports = getCaretCoordinates;\n} else if(isBrowser){\n window.getCaretCoordinates = getCaretCoordinates;\n}\n\n}());\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/textarea-caret/index.js\n// module id = 14\n// module chunks = 0"],"sourceRoot":""}
\ No newline at end of file diff --git a/util/addons b/util/addons index 150a7ca09..3d772bf73 100755 --- a/util/addons +++ b/util/addons @@ -106,9 +106,12 @@ if($argc == 3 && $argv[1] === 'install') { if($argc == 3 && $argv[1] === 'uninstall') { + $found = false; + if($plugins) { foreach($plugins as $p) { if($p[0] === $argv[2]) { + $found = true; if(! $p[1]) echo $p[0] . ' not installed.' . "\n"; elseif($p[2]['disabled']) @@ -125,6 +128,17 @@ if($argc == 3 && $argv[1] === 'uninstall') { } } + // force uninstall of addon which no longer exists + + if(! $found) { + $idx = array_search($argv[2], App::$plugins); + if ($idx !== false) + unset(App::$plugins[$idx]); + uninstall_plugin($argv[2]); + set_config("system","addon", implode(", ",App::$plugins)); + echo $argv[2] . ' uninstalled.' . "\n"; + } + killme(); } diff --git a/util/generate-hooks-index/project.clj b/util/generate-hooks-index/project.clj index 730fe76d8..dc0b92f51 100644 --- a/util/generate-hooks-index/project.clj +++ b/util/generate-hooks-index/project.clj @@ -1,6 +1,6 @@ (defproject generate-hooks-index "0.1.0-SNAPSHOT" :description "Generates Hooks docs for Hubzilla" - :url "https://github.com/redmatrix/hubzilla" + :url "https://framagit.org/hubzilla/core/" :license {:name "Eclipse Public License" :url "http://www.eclipse.org/legal/epl-v10.html"} :dependencies [[org.clojure/clojure "1.7.0"] diff --git a/util/hmessages.po b/util/hmessages.po index adf2c2459..f0ab348ef 100644 --- a/util/hmessages.po +++ b/util/hmessages.po @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: 3.5\n" +"Project-Id-Version: 3.6RC\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-04-23 11:34+0200\n" +"POT-Creation-Date: 2018-07-18 11:47+0200\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" @@ -74,7 +74,7 @@ msgid "Can like/dislike profiles and profile things" msgstr "" #: ../../Zotlabs/Access/Permissions.php:70 -msgid "Can forward to all my channel connections via @+ mentions in posts" +msgid "Can forward to all my channel connections via ! mentions in posts" msgstr "" #: ../../Zotlabs/Access/Permissions.php:71 @@ -150,14 +150,14 @@ msgid "Special - Group Repository" msgstr "" #: ../../Zotlabs/Access/PermissionRoles.php:306 -#: ../../Zotlabs/Module/Cdav.php:1182 ../../Zotlabs/Module/New_channel.php:144 -#: ../../Zotlabs/Module/Settings/Channel.php:479 +#: ../../Zotlabs/Module/Cdav.php:1182 ../../Zotlabs/Module/New_channel.php:172 +#: ../../Zotlabs/Module/Settings/Channel.php:496 #: ../../Zotlabs/Module/Connedit.php:918 ../../Zotlabs/Module/Profiles.php:795 -#: ../../Zotlabs/Module/Register.php:224 ../../include/selectors.php:49 +#: ../../Zotlabs/Module/Register.php:233 ../../include/selectors.php:49 #: ../../include/selectors.php:66 ../../include/selectors.php:104 #: ../../include/selectors.php:140 ../../include/event.php:1315 -#: ../../include/event.php:1322 ../../include/connections.php:697 -#: ../../include/connections.php:704 +#: ../../include/event.php:1322 ../../include/connections.php:703 +#: ../../include/connections.php:710 msgid "Other" msgstr "" @@ -169,23 +169,24 @@ msgstr "" #: ../../Zotlabs/Module/Editlayout.php:31 ../../Zotlabs/Module/Connect.php:17 #: ../../Zotlabs/Module/Achievements.php:15 ../../Zotlabs/Module/Hcard.php:12 #: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Profile.php:20 -#: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Editwebpage.php:32 -#: ../../Zotlabs/Module/Cards.php:33 ../../Zotlabs/Module/Webpages.php:33 -#: ../../Zotlabs/Module/Filestorage.php:51 ../../include/channel.php:1197 +#: ../../Zotlabs/Module/Menu.php:91 ../../Zotlabs/Module/Layouts.php:31 +#: ../../Zotlabs/Module/Editwebpage.php:32 ../../Zotlabs/Module/Cards.php:33 +#: ../../Zotlabs/Module/Webpages.php:33 ../../Zotlabs/Module/Filestorage.php:51 +#: ../../include/channel.php:1197 msgid "Requested profile is not available." msgstr "" #: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80 #: ../../Zotlabs/Module/Invite.php:17 ../../Zotlabs/Module/Invite.php:94 #: ../../Zotlabs/Module/Articles.php:68 ../../Zotlabs/Module/Editlayout.php:67 -#: ../../Zotlabs/Module/Editlayout.php:90 ../../Zotlabs/Module/Channel.php:110 -#: ../../Zotlabs/Module/Channel.php:248 ../../Zotlabs/Module/Channel.php:288 +#: ../../Zotlabs/Module/Editlayout.php:90 ../../Zotlabs/Module/Channel.php:115 +#: ../../Zotlabs/Module/Channel.php:281 ../../Zotlabs/Module/Channel.php:320 #: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Locs.php:87 -#: ../../Zotlabs/Module/Mitem.php:115 ../../Zotlabs/Module/Events.php:271 -#: ../../Zotlabs/Module/Appman.php:87 ../../Zotlabs/Module/Regmod.php:21 +#: ../../Zotlabs/Module/Mitem.php:129 ../../Zotlabs/Module/Events.php:271 +#: ../../Zotlabs/Module/Appman.php:87 ../../Zotlabs/Module/Regmod.php:20 #: ../../Zotlabs/Module/Article_edit.php:51 -#: ../../Zotlabs/Module/New_channel.php:91 -#: ../../Zotlabs/Module/New_channel.php:116 +#: ../../Zotlabs/Module/New_channel.php:105 +#: ../../Zotlabs/Module/New_channel.php:130 #: ../../Zotlabs/Module/Sharedwithme.php:16 ../../Zotlabs/Module/Setup.php:209 #: ../../Zotlabs/Module/Moderate.php:13 #: ../../Zotlabs/Module/Settings/Features.php:38 @@ -202,30 +203,32 @@ msgstr "" #: ../../Zotlabs/Module/Profile_photo.php:315 #: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Item.php:229 #: ../../Zotlabs/Module/Item.php:246 ../../Zotlabs/Module/Item.php:256 -#: ../../Zotlabs/Module/Item.php:1106 ../../Zotlabs/Module/Page.php:34 +#: ../../Zotlabs/Module/Item.php:1108 ../../Zotlabs/Module/Page.php:34 #: ../../Zotlabs/Module/Page.php:133 ../../Zotlabs/Module/Connedit.php:389 #: ../../Zotlabs/Module/Chat.php:100 ../../Zotlabs/Module/Chat.php:105 -#: ../../Zotlabs/Module/Menu.php:78 ../../Zotlabs/Module/Layouts.php:71 -#: ../../Zotlabs/Module/Layouts.php:78 ../../Zotlabs/Module/Layouts.php:89 -#: ../../Zotlabs/Module/Defperms.php:173 ../../Zotlabs/Module/Group.php:13 -#: ../../Zotlabs/Module/Profiles.php:198 ../../Zotlabs/Module/Profiles.php:635 +#: ../../Zotlabs/Module/Menu.php:129 ../../Zotlabs/Module/Menu.php:140 +#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78 +#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Cloud.php:40 +#: ../../Zotlabs/Module/Defperms.php:173 ../../Zotlabs/Module/Group.php:12 +#: ../../Zotlabs/Module/Group.php:24 ../../Zotlabs/Module/Profiles.php:198 +#: ../../Zotlabs/Module/Profiles.php:635 #: ../../Zotlabs/Module/Editwebpage.php:68 #: ../../Zotlabs/Module/Editwebpage.php:89 #: ../../Zotlabs/Module/Editwebpage.php:107 #: ../../Zotlabs/Module/Editwebpage.php:121 ../../Zotlabs/Module/Manage.php:10 #: ../../Zotlabs/Module/Cards.php:72 ../../Zotlabs/Module/Webpages.php:118 #: ../../Zotlabs/Module/Block.php:24 ../../Zotlabs/Module/Block.php:74 -#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Sources.php:74 +#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Sources.php:77 #: ../../Zotlabs/Module/Like.php:185 ../../Zotlabs/Module/Suggest.php:28 #: ../../Zotlabs/Module/Message.php:18 ../../Zotlabs/Module/Mail.php:146 #: ../../Zotlabs/Module/Register.php:77 -#: ../../Zotlabs/Module/Cover_photo.php:281 -#: ../../Zotlabs/Module/Cover_photo.php:294 +#: ../../Zotlabs/Module/Cover_photo.php:313 +#: ../../Zotlabs/Module/Cover_photo.php:326 #: ../../Zotlabs/Module/Display.php:449 ../../Zotlabs/Module/Network.php:15 #: ../../Zotlabs/Module/Filestorage.php:15 #: ../../Zotlabs/Module/Filestorage.php:70 -#: ../../Zotlabs/Module/Filestorage.php:85 -#: ../../Zotlabs/Module/Filestorage.php:117 ../../Zotlabs/Module/Common.php:38 +#: ../../Zotlabs/Module/Filestorage.php:96 +#: ../../Zotlabs/Module/Filestorage.php:140 ../../Zotlabs/Module/Common.php:38 #: ../../Zotlabs/Module/Viewconnections.php:28 #: ../../Zotlabs/Module/Viewconnections.php:33 #: ../../Zotlabs/Module/Service_limits.php:11 ../../Zotlabs/Module/Rate.php:113 @@ -234,12 +237,11 @@ msgstr "" #: ../../Zotlabs/Web/WebServer.php:123 ../../addon/keepout/keepout.php:36 #: ../../addon/openid/Mod_Id.php:53 ../../addon/pumpio/pumpio.php:40 #: ../../include/attach.php:150 ../../include/attach.php:197 -#: ../../include/attach.php:270 ../../include/attach.php:284 -#: ../../include/attach.php:293 ../../include/attach.php:366 -#: ../../include/attach.php:380 ../../include/attach.php:387 -#: ../../include/attach.php:469 ../../include/attach.php:1029 -#: ../../include/attach.php:1103 ../../include/attach.php:1268 -#: ../../include/items.php:3706 ../../include/photos.php:27 +#: ../../include/attach.php:270 ../../include/attach.php:379 +#: ../../include/attach.php:393 ../../include/attach.php:400 +#: ../../include/attach.php:482 ../../include/attach.php:1042 +#: ../../include/attach.php:1116 ../../include/attach.php:1281 +#: ../../include/items.php:3653 ../../include/photos.php:27 msgid "Permission denied." msgstr "" @@ -248,7 +250,7 @@ msgstr "" msgid "Block Name" msgstr "" -#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2422 +#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2458 msgid "Blocks" msgstr "" @@ -256,22 +258,22 @@ msgstr "" msgid "Block Title" msgstr "" -#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Menu.php:114 +#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Menu.php:177 #: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:251 msgid "Created" msgstr "" -#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Menu.php:115 +#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Menu.php:178 #: ../../Zotlabs/Module/Layouts.php:192 ../../Zotlabs/Module/Webpages.php:252 msgid "Edited" msgstr "" #: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Articles.php:96 -#: ../../Zotlabs/Module/Cdav.php:1185 ../../Zotlabs/Module/New_channel.php:160 -#: ../../Zotlabs/Module/Connedit.php:921 ../../Zotlabs/Module/Menu.php:118 +#: ../../Zotlabs/Module/Cdav.php:1185 ../../Zotlabs/Module/New_channel.php:188 +#: ../../Zotlabs/Module/Connedit.php:921 ../../Zotlabs/Module/Menu.php:181 #: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Module/Profiles.php:798 #: ../../Zotlabs/Module/Cards.php:100 ../../Zotlabs/Module/Webpages.php:239 -#: ../../Zotlabs/Storage/Browser.php:276 ../../Zotlabs/Storage/Browser.php:382 +#: ../../Zotlabs/Storage/Browser.php:276 ../../Zotlabs/Storage/Browser.php:390 #: ../../Zotlabs/Widget/Cdav.php:128 ../../Zotlabs/Widget/Cdav.php:165 msgid "Create" msgstr "" @@ -279,27 +281,27 @@ msgstr "" #: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Editlayout.php:114 #: ../../Zotlabs/Module/Article_edit.php:99 #: ../../Zotlabs/Module/Admin/Profs.php:175 -#: ../../Zotlabs/Module/Settings/Oauth2.php:149 +#: ../../Zotlabs/Module/Settings/Oauth2.php:150 #: ../../Zotlabs/Module/Settings/Oauth.php:150 #: ../../Zotlabs/Module/Thing.php:266 ../../Zotlabs/Module/Editblock.php:114 #: ../../Zotlabs/Module/Connections.php:281 #: ../../Zotlabs/Module/Connections.php:319 #: ../../Zotlabs/Module/Connections.php:339 ../../Zotlabs/Module/Wiki.php:202 -#: ../../Zotlabs/Module/Wiki.php:362 ../../Zotlabs/Module/Menu.php:112 -#: ../../Zotlabs/Module/Layouts.php:193 +#: ../../Zotlabs/Module/Wiki.php:362 ../../Zotlabs/Module/Menu.php:175 +#: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Module/Group.php:216 #: ../../Zotlabs/Module/Editwebpage.php:142 #: ../../Zotlabs/Module/Webpages.php:240 ../../Zotlabs/Module/Card_edit.php:99 -#: ../../Zotlabs/Lib/Apps.php:409 ../../Zotlabs/Lib/ThreadItem.php:121 -#: ../../Zotlabs/Storage/Browser.php:288 ../../Zotlabs/Widget/Cdav.php:126 +#: ../../Zotlabs/Lib/Apps.php:475 ../../Zotlabs/Lib/ThreadItem.php:128 +#: ../../Zotlabs/Storage/Browser.php:290 ../../Zotlabs/Widget/Cdav.php:126 #: ../../Zotlabs/Widget/Cdav.php:162 ../../include/channel.php:1296 -#: ../../include/channel.php:1300 ../../include/menu.php:113 +#: ../../include/channel.php:1300 ../../include/menu.php:118 msgid "Edit" msgstr "" -#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1102 +#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1107 #: ../../Zotlabs/Module/Wiki.php:287 ../../Zotlabs/Module/Layouts.php:194 #: ../../Zotlabs/Module/Webpages.php:241 ../../Zotlabs/Widget/Cdav.php:124 -#: ../../include/conversation.php:1366 +#: ../../include/conversation.php:1374 msgid "Share" msgstr "" @@ -309,18 +311,17 @@ msgstr "" #: ../../Zotlabs/Module/Admin/Accounts.php:175 #: ../../Zotlabs/Module/Admin/Channels.php:149 #: ../../Zotlabs/Module/Admin/Profs.php:176 -#: ../../Zotlabs/Module/Settings/Oauth2.php:150 +#: ../../Zotlabs/Module/Settings/Oauth2.php:151 #: ../../Zotlabs/Module/Settings/Oauth.php:151 #: ../../Zotlabs/Module/Thing.php:267 ../../Zotlabs/Module/Editblock.php:139 #: ../../Zotlabs/Module/Connections.php:289 -#: ../../Zotlabs/Module/Photos.php:1203 ../../Zotlabs/Module/Connedit.php:654 -#: ../../Zotlabs/Module/Connedit.php:923 ../../Zotlabs/Module/Group.php:179 -#: ../../Zotlabs/Module/Profiles.php:800 +#: ../../Zotlabs/Module/Photos.php:1208 ../../Zotlabs/Module/Connedit.php:654 +#: ../../Zotlabs/Module/Connedit.php:923 ../../Zotlabs/Module/Profiles.php:800 #: ../../Zotlabs/Module/Editwebpage.php:167 #: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Module/Card_edit.php:129 -#: ../../Zotlabs/Lib/Apps.php:410 ../../Zotlabs/Lib/ThreadItem.php:141 -#: ../../Zotlabs/Storage/Browser.php:289 ../../include/conversation.php:690 -#: ../../include/conversation.php:733 +#: ../../Zotlabs/Lib/Apps.php:476 ../../Zotlabs/Lib/ThreadItem.php:148 +#: ../../Zotlabs/Storage/Browser.php:291 ../../include/conversation.php:691 +#: ../../include/conversation.php:736 msgid "Delete" msgstr "" @@ -401,49 +402,49 @@ msgid "3. Click [Connect]" msgstr "" #: ../../Zotlabs/Module/Invite.php:151 ../../Zotlabs/Module/Locs.php:121 -#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Events.php:493 +#: ../../Zotlabs/Module/Mitem.php:259 ../../Zotlabs/Module/Events.php:493 #: ../../Zotlabs/Module/Appman.php:153 #: ../../Zotlabs/Module/Import_items.php:129 ../../Zotlabs/Module/Setup.php:308 #: ../../Zotlabs/Module/Setup.php:349 ../../Zotlabs/Module/Connect.php:98 #: ../../Zotlabs/Module/Admin/Features.php:66 -#: ../../Zotlabs/Module/Admin/Plugins.php:438 #: ../../Zotlabs/Module/Admin/Accounts.php:168 #: ../../Zotlabs/Module/Admin/Logs.php:84 #: ../../Zotlabs/Module/Admin/Channels.php:147 #: ../../Zotlabs/Module/Admin/Themes.php:158 -#: ../../Zotlabs/Module/Admin/Site.php:296 +#: ../../Zotlabs/Module/Admin/Site.php:309 +#: ../../Zotlabs/Module/Admin/Addons.php:438 #: ../../Zotlabs/Module/Admin/Profs.php:178 #: ../../Zotlabs/Module/Admin/Account_edit.php:74 -#: ../../Zotlabs/Module/Admin/Security.php:104 +#: ../../Zotlabs/Module/Admin/Security.php:112 #: ../../Zotlabs/Module/Settings/Permcats.php:115 -#: ../../Zotlabs/Module/Settings/Channel.php:495 +#: ../../Zotlabs/Module/Settings/Channel.php:516 #: ../../Zotlabs/Module/Settings/Features.php:79 #: ../../Zotlabs/Module/Settings/Tokens.php:168 -#: ../../Zotlabs/Module/Settings/Oauth2.php:84 +#: ../../Zotlabs/Module/Settings/Oauth2.php:85 #: ../../Zotlabs/Module/Settings/Account.php:118 #: ../../Zotlabs/Module/Settings/Featured.php:54 #: ../../Zotlabs/Module/Settings/Display.php:192 #: ../../Zotlabs/Module/Settings/Oauth.php:88 #: ../../Zotlabs/Module/Thing.php:326 ../../Zotlabs/Module/Thing.php:379 -#: ../../Zotlabs/Module/Import.php:530 ../../Zotlabs/Module/Cal.php:345 -#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Photos.php:1082 -#: ../../Zotlabs/Module/Photos.php:1122 ../../Zotlabs/Module/Photos.php:1240 +#: ../../Zotlabs/Module/Import.php:565 ../../Zotlabs/Module/Cal.php:345 +#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Photos.php:1087 +#: ../../Zotlabs/Module/Photos.php:1127 ../../Zotlabs/Module/Photos.php:1245 #: ../../Zotlabs/Module/Wiki.php:206 ../../Zotlabs/Module/Pdledit.php:98 #: ../../Zotlabs/Module/Poke.php:200 ../../Zotlabs/Module/Connedit.php:887 #: ../../Zotlabs/Module/Chat.php:196 ../../Zotlabs/Module/Chat.php:242 #: ../../Zotlabs/Module/Email_validation.php:40 #: ../../Zotlabs/Module/Pconfig.php:107 ../../Zotlabs/Module/Defperms.php:249 -#: ../../Zotlabs/Module/Group.php:87 ../../Zotlabs/Module/Profiles.php:723 -#: ../../Zotlabs/Module/Editpost.php:85 ../../Zotlabs/Module/Sources.php:114 -#: ../../Zotlabs/Module/Sources.php:149 ../../Zotlabs/Module/Xchan.php:15 -#: ../../Zotlabs/Module/Mail.php:431 ../../Zotlabs/Module/Filestorage.php:160 -#: ../../Zotlabs/Module/Rate.php:166 ../../Zotlabs/Lib/ThreadItem.php:752 -#: ../../Zotlabs/Widget/Eventstools.php:16 +#: ../../Zotlabs/Module/Group.php:121 ../../Zotlabs/Module/Group.php:137 +#: ../../Zotlabs/Module/Profiles.php:723 ../../Zotlabs/Module/Editpost.php:85 +#: ../../Zotlabs/Module/Sources.php:117 ../../Zotlabs/Module/Sources.php:154 +#: ../../Zotlabs/Module/Xchan.php:15 ../../Zotlabs/Module/Mail.php:431 +#: ../../Zotlabs/Module/Filestorage.php:183 ../../Zotlabs/Module/Rate.php:166 +#: ../../Zotlabs/Lib/ThreadItem.php:757 ../../Zotlabs/Widget/Eventstools.php:16 #: ../../Zotlabs/Widget/Wiki_pages.php:40 #: ../../Zotlabs/Widget/Wiki_pages.php:97 #: ../../view/theme/redbasic_c/php/config.php:95 #: ../../view/theme/redbasic/php/config.php:93 -#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:275 +#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:284 #: ../../addon/planets/planets.php:153 #: ../../addon/openclipatar/openclipatar.php:53 #: ../../addon/wppost/wppost.php:113 ../../addon/nsfw/nsfw.php:92 @@ -451,7 +452,7 @@ msgstr "" #: ../../addon/likebanner/likebanner.php:57 #: ../../addon/redphotos/redphotos.php:136 ../../addon/irc/irc.php:53 #: ../../addon/ljpost/ljpost.php:86 ../../addon/startpage/startpage.php:113 -#: ../../addon/diaspora/diaspora.php:825 +#: ../../addon/diaspora/diaspora.php:830 #: ../../addon/rainbowtag/rainbowtag.php:85 ../../addon/hzfiles/hzfiles.php:84 #: ../../addon/visage/visage.php:170 ../../addon/nsabait/nsabait.php:161 #: ../../addon/mailtest/mailtest.php:100 @@ -460,7 +461,7 @@ msgstr "" #: ../../addon/jappixmini/jappixmini.php:371 #: ../../addon/superblock/superblock.php:120 ../../addon/nofed/nofed.php:80 #: ../../addon/redred/redred.php:119 ../../addon/logrot/logrot.php:35 -#: ../../addon/frphotos/frphotos.php:97 ../../addon/pubcrawl/pubcrawl.php:1072 +#: ../../addon/frphotos/frphotos.php:97 ../../addon/pubcrawl/pubcrawl.php:1159 #: ../../addon/chords/Mod_Chords.php:60 ../../addon/libertree/libertree.php:85 #: ../../addon/flattrwidget/flattrwidget.php:124 #: ../../addon/statusnet/statusnet.php:322 @@ -468,7 +469,10 @@ msgstr "" #: ../../addon/statusnet/statusnet.php:432 #: ../../addon/statusnet/statusnet.php:900 ../../addon/twitter/twitter.php:218 #: ../../addon/twitter/twitter.php:265 -#: ../../addon/smileybutton/smileybutton.php:219 ../../addon/cart/cart.php:1104 +#: ../../addon/smileybutton/smileybutton.php:219 ../../addon/cart/cart.php:1251 +#: ../../addon/cart/submodules/paypalbutton.php:144 +#: ../../addon/cart/submodules/hzservices.php:78 +#: ../../addon/cart/submodules/hzservices.php:647 #: ../../addon/piwik/piwik.php:95 ../../addon/pageheader/pageheader.php:48 #: ../../addon/authchoose/authchoose.php:71 ../../addon/xmpp/xmpp.php:69 #: ../../addon/pumpio/pumpio.php:237 ../../addon/redfiles/redfiles.php:124 @@ -477,8 +481,8 @@ msgid "Submit" msgstr "" #: ../../Zotlabs/Module/Articles.php:38 ../../Zotlabs/Module/Articles.php:191 -#: ../../Zotlabs/Lib/Apps.php:229 ../../include/features.php:133 -#: ../../include/nav.php:469 +#: ../../Zotlabs/Lib/Apps.php:292 ../../include/features.php:133 +#: ../../include/nav.php:461 msgid "Articles" msgstr "" @@ -508,13 +512,32 @@ msgstr "" msgid "Edit Layout" msgstr "" +#: ../../Zotlabs/Module/Editlayout.php:140 ../../Zotlabs/Module/Cdav.php:899 +#: ../../Zotlabs/Module/Cdav.php:1188 ../../Zotlabs/Module/Article_edit.php:131 +#: ../../Zotlabs/Module/Admin/Addons.php:423 +#: ../../Zotlabs/Module/Settings/Oauth2.php:86 +#: ../../Zotlabs/Module/Settings/Oauth2.php:114 +#: ../../Zotlabs/Module/Settings/Oauth.php:89 +#: ../../Zotlabs/Module/Settings/Oauth.php:115 +#: ../../Zotlabs/Module/Editblock.php:141 ../../Zotlabs/Module/Wiki.php:347 +#: ../../Zotlabs/Module/Wiki.php:379 ../../Zotlabs/Module/Profile_photo.php:465 +#: ../../Zotlabs/Module/Connedit.php:924 ../../Zotlabs/Module/Fbrowser.php:66 +#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:801 +#: ../../Zotlabs/Module/Editwebpage.php:169 +#: ../../Zotlabs/Module/Editpost.php:109 ../../Zotlabs/Module/Filer.php:55 +#: ../../Zotlabs/Module/Cover_photo.php:399 ../../Zotlabs/Module/Tagrm.php:15 +#: ../../Zotlabs/Module/Tagrm.php:138 ../../Zotlabs/Module/Card_edit.php:131 +#: ../../include/conversation.php:1397 ../../include/conversation.php:1446 +msgid "Cancel" +msgstr "" + #: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:86 -#: ../../Zotlabs/Module/Import_items.php:120 ../../Zotlabs/Module/Cloud.php:117 -#: ../../Zotlabs/Module/Group.php:74 ../../Zotlabs/Module/Dreport.php:10 +#: ../../Zotlabs/Module/Import_items.php:120 ../../Zotlabs/Module/Cloud.php:126 +#: ../../Zotlabs/Module/Group.php:83 ../../Zotlabs/Module/Dreport.php:10 #: ../../Zotlabs/Module/Dreport.php:68 ../../Zotlabs/Module/Like.php:296 #: ../../Zotlabs/Web/WebServer.php:122 ../../addon/redphotos/redphotos.php:119 #: ../../addon/hzfiles/hzfiles.php:73 ../../addon/frphotos/frphotos.php:82 -#: ../../addon/redfiles/redfiles.php:109 ../../include/items.php:358 +#: ../../addon/redfiles/redfiles.php:109 ../../include/items.php:364 msgid "Permission denied" msgstr "" @@ -553,11 +576,11 @@ msgstr "" #: ../../Zotlabs/Module/Cdav.php:786 ../../Zotlabs/Module/Cdav.php:787 #: ../../Zotlabs/Module/Cdav.php:794 ../../Zotlabs/Module/Embedphotos.php:146 -#: ../../Zotlabs/Module/Photos.php:817 ../../Zotlabs/Module/Photos.php:1273 -#: ../../Zotlabs/Lib/Apps.php:754 ../../Zotlabs/Lib/Apps.php:833 +#: ../../Zotlabs/Module/Photos.php:822 ../../Zotlabs/Module/Photos.php:1278 +#: ../../Zotlabs/Lib/Apps.php:819 ../../Zotlabs/Lib/Apps.php:898 #: ../../Zotlabs/Storage/Browser.php:164 ../../Zotlabs/Widget/Portfolio.php:95 -#: ../../Zotlabs/Widget/Album.php:84 ../../addon/pubcrawl/as.php:891 -#: ../../include/conversation.php:1160 +#: ../../Zotlabs/Widget/Album.php:84 ../../addon/pubcrawl/as.php:961 +#: ../../include/conversation.php:1165 msgid "Unknown" msgstr "" @@ -596,6 +619,7 @@ msgstr "" #: ../../Zotlabs/Module/Cdav.php:871 ../../Zotlabs/Module/Events.php:473 #: ../../Zotlabs/Module/Appman.php:143 ../../Zotlabs/Module/Rbmark.php:101 #: ../../addon/rendezvous/rendezvous.php:173 +#: ../../addon/cart/submodules/hzservices.php:659 msgid "Description" msgstr "" @@ -608,14 +632,14 @@ msgstr "" #: ../../Zotlabs/Module/Cdav.php:879 ../../Zotlabs/Module/Events.php:689 #: ../../Zotlabs/Module/Events.php:698 ../../Zotlabs/Module/Cal.php:339 -#: ../../Zotlabs/Module/Cal.php:346 ../../Zotlabs/Module/Photos.php:971 +#: ../../Zotlabs/Module/Cal.php:346 ../../Zotlabs/Module/Photos.php:976 msgid "Previous" msgstr "" #: ../../Zotlabs/Module/Cdav.php:880 ../../Zotlabs/Module/Events.php:690 #: ../../Zotlabs/Module/Events.php:699 ../../Zotlabs/Module/Setup.php:263 #: ../../Zotlabs/Module/Cal.php:340 ../../Zotlabs/Module/Cal.php:347 -#: ../../Zotlabs/Module/Photos.php:980 +#: ../../Zotlabs/Module/Photos.php:985 msgid "Next" msgstr "" @@ -664,35 +688,20 @@ msgstr "" msgid "Delete all" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:899 ../../Zotlabs/Module/Cdav.php:1188 -#: ../../Zotlabs/Module/Admin/Plugins.php:423 -#: ../../Zotlabs/Module/Settings/Oauth2.php:85 -#: ../../Zotlabs/Module/Settings/Oauth2.php:113 -#: ../../Zotlabs/Module/Settings/Oauth.php:89 -#: ../../Zotlabs/Module/Settings/Oauth.php:115 -#: ../../Zotlabs/Module/Wiki.php:347 ../../Zotlabs/Module/Wiki.php:379 -#: ../../Zotlabs/Module/Profile_photo.php:464 -#: ../../Zotlabs/Module/Connedit.php:924 ../../Zotlabs/Module/Fbrowser.php:66 -#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:801 -#: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Module/Cover_photo.php:366 -#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138 -#: ../../include/conversation.php:1389 ../../include/conversation.php:1438 -msgid "Cancel" -msgstr "" - #: ../../Zotlabs/Module/Cdav.php:900 msgid "Sorry! Editing of recurrent events is not yet implemented." msgstr "" #: ../../Zotlabs/Module/Cdav.php:1170 ../../Zotlabs/Module/Sharedwithme.php:105 #: ../../Zotlabs/Module/Admin/Channels.php:159 -#: ../../Zotlabs/Module/Settings/Oauth2.php:86 -#: ../../Zotlabs/Module/Settings/Oauth2.php:114 +#: ../../Zotlabs/Module/Settings/Oauth2.php:87 +#: ../../Zotlabs/Module/Settings/Oauth2.php:115 #: ../../Zotlabs/Module/Settings/Oauth.php:90 #: ../../Zotlabs/Module/Settings/Oauth.php:116 #: ../../Zotlabs/Module/Wiki.php:209 ../../Zotlabs/Module/Connedit.php:906 -#: ../../Zotlabs/Module/Chat.php:251 ../../Zotlabs/Lib/NativeWikiPage.php:558 -#: ../../Zotlabs/Storage/Browser.php:283 +#: ../../Zotlabs/Module/Chat.php:251 ../../Zotlabs/Module/Group.php:125 +#: ../../Zotlabs/Lib/NativeWikiPage.php:558 +#: ../../Zotlabs/Storage/Browser.php:285 #: ../../Zotlabs/Widget/Wiki_page_history.php:22 #: ../../addon/rendezvous/rendezvous.php:172 msgid "Name" @@ -717,7 +726,7 @@ msgstr "" #: ../../Zotlabs/Module/Connedit.php:910 ../../Zotlabs/Module/Profiles.php:787 #: ../../addon/openid/MysqlProvider.php:56 #: ../../addon/openid/MysqlProvider.php:57 ../../addon/rtof/rtof.php:93 -#: ../../addon/redred/redred.php:107 ../../include/network.php:1770 +#: ../../addon/redred/redred.php:107 ../../include/network.php:1769 msgid "Email" msgstr "" @@ -745,19 +754,19 @@ msgstr "" #: ../../Zotlabs/Module/Cdav.php:1179 ../../Zotlabs/Module/Connedit.php:915 #: ../../Zotlabs/Module/Profiles.php:792 ../../include/event.php:1308 -#: ../../include/connections.php:690 +#: ../../include/connections.php:696 msgid "Mobile" msgstr "" #: ../../Zotlabs/Module/Cdav.php:1180 ../../Zotlabs/Module/Connedit.php:916 #: ../../Zotlabs/Module/Profiles.php:793 ../../include/event.php:1309 -#: ../../include/connections.php:691 +#: ../../include/connections.php:697 msgid "Home" msgstr "" #: ../../Zotlabs/Module/Cdav.php:1181 ../../Zotlabs/Module/Connedit.php:917 #: ../../Zotlabs/Module/Profiles.php:794 ../../include/event.php:1312 -#: ../../include/connections.php:694 +#: ../../include/connections.php:700 msgid "Work" msgstr "" @@ -772,14 +781,13 @@ msgstr "" msgid "Add Field" msgstr "" -#: ../../Zotlabs/Module/Cdav.php:1186 -#: ../../Zotlabs/Module/Admin/Plugins.php:453 -#: ../../Zotlabs/Module/Settings/Oauth2.php:39 -#: ../../Zotlabs/Module/Settings/Oauth2.php:112 +#: ../../Zotlabs/Module/Cdav.php:1186 ../../Zotlabs/Module/Admin/Addons.php:453 +#: ../../Zotlabs/Module/Settings/Oauth2.php:40 +#: ../../Zotlabs/Module/Settings/Oauth2.php:113 #: ../../Zotlabs/Module/Settings/Oauth.php:43 #: ../../Zotlabs/Module/Settings/Oauth.php:114 #: ../../Zotlabs/Module/Connedit.php:922 ../../Zotlabs/Module/Profiles.php:799 -#: ../../Zotlabs/Lib/Apps.php:393 +#: ../../Zotlabs/Lib/Apps.php:456 msgid "Update" msgstr "" @@ -824,25 +832,35 @@ msgstr "" msgid "This site is not a directory server" msgstr "" -#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Ochannel.php:32 +#: ../../Zotlabs/Module/Channel.php:35 ../../Zotlabs/Module/Ochannel.php:32 #: ../../Zotlabs/Module/Chat.php:25 ../../addon/chess/chess.php:508 msgid "You must be logged in to see this page." msgstr "" -#: ../../Zotlabs/Module/Channel.php:47 ../../Zotlabs/Module/Hcard.php:37 +#: ../../Zotlabs/Module/Channel.php:50 ../../Zotlabs/Module/Hcard.php:37 #: ../../Zotlabs/Module/Profile.php:45 msgid "Posts and comments" msgstr "" -#: ../../Zotlabs/Module/Channel.php:54 ../../Zotlabs/Module/Hcard.php:44 +#: ../../Zotlabs/Module/Channel.php:57 ../../Zotlabs/Module/Hcard.php:44 #: ../../Zotlabs/Module/Profile.php:52 msgid "Only posts" msgstr "" -#: ../../Zotlabs/Module/Channel.php:107 +#: ../../Zotlabs/Module/Channel.php:112 msgid "Insufficient permissions. Request redirected to profile page." msgstr "" +#: ../../Zotlabs/Module/Channel.php:129 ../../Zotlabs/Module/Network.php:174 +msgid "Search Results For:" +msgstr "" + +#: ../../Zotlabs/Module/Channel.php:164 ../../Zotlabs/Module/Hq.php:134 +#: ../../Zotlabs/Module/Pubstream.php:80 ../../Zotlabs/Module/Display.php:81 +#: ../../Zotlabs/Module/Network.php:204 +msgid "Reset form" +msgstr "" + #: ../../Zotlabs/Module/Uexport.php:57 ../../Zotlabs/Module/Uexport.php:58 msgid "Export Channel" msgstr "" @@ -909,7 +927,7 @@ msgstr "" msgid "You have got no unseen posts..." msgstr "" -#: ../../Zotlabs/Module/Search.php:17 ../../Zotlabs/Module/Photos.php:540 +#: ../../Zotlabs/Module/Search.php:17 ../../Zotlabs/Module/Photos.php:545 #: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Directory.php:63 #: ../../Zotlabs/Module/Directory.php:68 ../../Zotlabs/Module/Display.php:30 #: ../../Zotlabs/Module/Viewconnections.php:23 @@ -917,9 +935,10 @@ msgid "Public access denied." msgstr "" #: ../../Zotlabs/Module/Search.php:44 ../../Zotlabs/Module/Connections.php:335 -#: ../../Zotlabs/Lib/Apps.php:256 ../../Zotlabs/Widget/Sitesearch.php:31 -#: ../../include/text.php:1051 ../../include/text.php:1063 -#: ../../include/acl_selectors.php:118 ../../include/nav.php:179 +#: ../../Zotlabs/Lib/Apps.php:318 ../../Zotlabs/Widget/Sitesearch.php:31 +#: ../../Zotlabs/Widget/Activity_filter.php:148 ../../include/text.php:1062 +#: ../../include/text.php:1074 ../../include/acl_selectors.php:118 +#: ../../include/nav.php:185 msgid "Search" msgstr "" @@ -934,7 +953,7 @@ msgid "Search results for: %s" msgstr "" #: ../../Zotlabs/Module/Pubstream.php:95 -#: ../../Zotlabs/Widget/Notifications.php:131 +#: ../../Zotlabs/Widget/Notifications.php:142 msgid "Public Stream" msgstr "" @@ -964,11 +983,11 @@ msgstr "" msgid "Manage Channel Locations" msgstr "" -#: ../../Zotlabs/Module/Locs.php:119 ../../Zotlabs/Module/Admin.php:111 +#: ../../Zotlabs/Module/Locs.php:119 ../../Zotlabs/Module/Admin.php:115 msgid "Primary" msgstr "" -#: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:113 +#: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:176 msgid "Drop" msgstr "" @@ -1008,66 +1027,69 @@ msgstr "" msgid "Use arrows to move the corresponding app up or down in the app tray" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:28 ../../Zotlabs/Module/Menu.php:144 +#: ../../Zotlabs/Module/Mitem.php:31 ../../Zotlabs/Module/Menu.php:208 msgid "Menu not found." msgstr "" -#: ../../Zotlabs/Module/Mitem.php:52 +#: ../../Zotlabs/Module/Mitem.php:63 msgid "Unable to create element." msgstr "" -#: ../../Zotlabs/Module/Mitem.php:76 +#: ../../Zotlabs/Module/Mitem.php:87 msgid "Unable to update menu element." msgstr "" -#: ../../Zotlabs/Module/Mitem.php:92 +#: ../../Zotlabs/Module/Mitem.php:103 msgid "Unable to add menu element." msgstr "" -#: ../../Zotlabs/Module/Mitem.php:120 ../../Zotlabs/Module/Menu.php:166 +#: ../../Zotlabs/Module/Mitem.php:134 ../../Zotlabs/Module/Menu.php:231 #: ../../Zotlabs/Module/Xchan.php:41 msgid "Not found." msgstr "" -#: ../../Zotlabs/Module/Mitem.php:153 ../../Zotlabs/Module/Mitem.php:230 +#: ../../Zotlabs/Module/Mitem.php:167 ../../Zotlabs/Module/Mitem.php:246 msgid "Menu Item Permissions" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231 -#: ../../Zotlabs/Module/Settings/Channel.php:528 +#: ../../Zotlabs/Module/Mitem.php:168 ../../Zotlabs/Module/Mitem.php:247 +#: ../../Zotlabs/Module/Settings/Channel.php:549 msgid "(click to open/close)" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:176 +#: ../../Zotlabs/Module/Mitem.php:174 ../../Zotlabs/Module/Mitem.php:191 msgid "Link Name" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:161 ../../Zotlabs/Module/Mitem.php:239 +#: ../../Zotlabs/Module/Mitem.php:175 ../../Zotlabs/Module/Mitem.php:255 msgid "Link or Submenu Target" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:161 +#: ../../Zotlabs/Module/Mitem.php:175 msgid "Enter URL of the link or select a menu name to create a submenu" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:240 +#: ../../Zotlabs/Module/Mitem.php:176 ../../Zotlabs/Module/Mitem.php:256 msgid "Use magic-auth if available" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:163 -#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241 +#: ../../Zotlabs/Module/Mitem.php:176 ../../Zotlabs/Module/Mitem.php:177 +#: ../../Zotlabs/Module/Mitem.php:256 ../../Zotlabs/Module/Mitem.php:257 #: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471 -#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Admin/Site.php:259 -#: ../../Zotlabs/Module/Settings/Channel.php:307 +#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Admin/Site.php:266 +#: ../../Zotlabs/Module/Settings/Channel.php:315 #: ../../Zotlabs/Module/Settings/Display.php:100 -#: ../../Zotlabs/Module/Api.php:99 ../../Zotlabs/Module/Photos.php:697 -#: ../../Zotlabs/Module/Wiki.php:218 ../../Zotlabs/Module/Wiki.php:219 -#: ../../Zotlabs/Module/Connedit.php:396 ../../Zotlabs/Module/Connedit.php:779 -#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157 -#: ../../Zotlabs/Module/Defperms.php:180 ../../Zotlabs/Module/Profiles.php:681 -#: ../../Zotlabs/Module/Filestorage.php:155 -#: ../../Zotlabs/Module/Filestorage.php:163 -#: ../../Zotlabs/Storage/Browser.php:397 ../../boot.php:1594 +#: ../../Zotlabs/Module/Import.php:554 ../../Zotlabs/Module/Import.php:558 +#: ../../Zotlabs/Module/Import.php:559 ../../Zotlabs/Module/Api.php:99 +#: ../../Zotlabs/Module/Photos.php:702 ../../Zotlabs/Module/Wiki.php:218 +#: ../../Zotlabs/Module/Wiki.php:219 ../../Zotlabs/Module/Connedit.php:396 +#: ../../Zotlabs/Module/Connedit.php:779 ../../Zotlabs/Module/Menu.php:162 +#: ../../Zotlabs/Module/Menu.php:221 ../../Zotlabs/Module/Defperms.php:180 +#: ../../Zotlabs/Module/Profiles.php:681 ../../Zotlabs/Module/Sources.php:116 +#: ../../Zotlabs/Module/Sources.php:151 +#: ../../Zotlabs/Module/Filestorage.php:178 +#: ../../Zotlabs/Module/Filestorage.php:186 +#: ../../Zotlabs/Storage/Browser.php:405 ../../boot.php:1618 #: ../../view/theme/redbasic_c/php/config.php:100 #: ../../view/theme/redbasic_c/php/config.php:115 #: ../../view/theme/redbasic/php/config.php:98 @@ -1095,8 +1117,13 @@ msgstr "" #: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:243 #: ../../addon/twitter/twitter.php:252 ../../addon/twitter/twitter.php:261 #: ../../addon/smileybutton/smileybutton.php:211 -#: ../../addon/smileybutton/smileybutton.php:215 ../../addon/cart/cart.php:1075 -#: ../../addon/cart/cart.php:1082 ../../addon/cart/cart.php:1090 +#: ../../addon/smileybutton/smileybutton.php:215 ../../addon/cart/cart.php:1206 +#: ../../addon/cart/cart.php:1213 ../../addon/cart/cart.php:1221 +#: ../../addon/cart/submodules/paypalbutton.php:99 +#: ../../addon/cart/submodules/paypalbutton.php:104 +#: ../../addon/cart/submodules/hzservices.php:73 +#: ../../addon/cart/submodules/hzservices.php:653 +#: ../../addon/cart/submodules/hzservices.php:657 #: ../../addon/authchoose/authchoose.php:67 ../../addon/xmpp/xmpp.php:53 #: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223 #: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231 @@ -1105,20 +1132,22 @@ msgstr "" msgid "No" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:163 -#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241 +#: ../../Zotlabs/Module/Mitem.php:176 ../../Zotlabs/Module/Mitem.php:177 +#: ../../Zotlabs/Module/Mitem.php:256 ../../Zotlabs/Module/Mitem.php:257 #: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471 -#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Admin/Site.php:261 -#: ../../Zotlabs/Module/Settings/Channel.php:307 +#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Admin/Site.php:268 +#: ../../Zotlabs/Module/Settings/Channel.php:315 #: ../../Zotlabs/Module/Settings/Display.php:100 -#: ../../Zotlabs/Module/Api.php:98 ../../Zotlabs/Module/Photos.php:697 -#: ../../Zotlabs/Module/Wiki.php:218 ../../Zotlabs/Module/Wiki.php:219 -#: ../../Zotlabs/Module/Connedit.php:396 ../../Zotlabs/Module/Menu.php:100 -#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Defperms.php:180 -#: ../../Zotlabs/Module/Profiles.php:681 -#: ../../Zotlabs/Module/Filestorage.php:155 -#: ../../Zotlabs/Module/Filestorage.php:163 -#: ../../Zotlabs/Storage/Browser.php:397 ../../boot.php:1594 +#: ../../Zotlabs/Module/Import.php:554 ../../Zotlabs/Module/Import.php:558 +#: ../../Zotlabs/Module/Import.php:559 ../../Zotlabs/Module/Api.php:98 +#: ../../Zotlabs/Module/Photos.php:702 ../../Zotlabs/Module/Wiki.php:218 +#: ../../Zotlabs/Module/Wiki.php:219 ../../Zotlabs/Module/Connedit.php:396 +#: ../../Zotlabs/Module/Menu.php:162 ../../Zotlabs/Module/Menu.php:221 +#: ../../Zotlabs/Module/Defperms.php:180 ../../Zotlabs/Module/Profiles.php:681 +#: ../../Zotlabs/Module/Sources.php:116 ../../Zotlabs/Module/Sources.php:151 +#: ../../Zotlabs/Module/Filestorage.php:178 +#: ../../Zotlabs/Module/Filestorage.php:186 +#: ../../Zotlabs/Storage/Browser.php:405 ../../boot.php:1618 #: ../../view/theme/redbasic_c/php/config.php:100 #: ../../view/theme/redbasic_c/php/config.php:115 #: ../../view/theme/redbasic/php/config.php:98 @@ -1146,8 +1175,13 @@ msgstr "" #: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:243 #: ../../addon/twitter/twitter.php:252 ../../addon/twitter/twitter.php:261 #: ../../addon/smileybutton/smileybutton.php:211 -#: ../../addon/smileybutton/smileybutton.php:215 ../../addon/cart/cart.php:1075 -#: ../../addon/cart/cart.php:1082 ../../addon/cart/cart.php:1090 +#: ../../addon/smileybutton/smileybutton.php:215 ../../addon/cart/cart.php:1206 +#: ../../addon/cart/cart.php:1213 ../../addon/cart/cart.php:1221 +#: ../../addon/cart/submodules/paypalbutton.php:99 +#: ../../addon/cart/submodules/paypalbutton.php:104 +#: ../../addon/cart/submodules/hzservices.php:73 +#: ../../addon/cart/submodules/hzservices.php:653 +#: ../../addon/cart/submodules/hzservices.php:657 #: ../../addon/authchoose/authchoose.php:67 ../../addon/xmpp/xmpp.php:53 #: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223 #: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231 @@ -1156,83 +1190,83 @@ msgstr "" msgid "Yes" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:241 +#: ../../Zotlabs/Module/Mitem.php:177 ../../Zotlabs/Module/Mitem.php:257 msgid "Open link in new window" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242 +#: ../../Zotlabs/Module/Mitem.php:178 ../../Zotlabs/Module/Mitem.php:258 msgid "Order in list" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242 +#: ../../Zotlabs/Module/Mitem.php:178 ../../Zotlabs/Module/Mitem.php:258 msgid "Higher numbers will sink to bottom of listing" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:165 +#: ../../Zotlabs/Module/Mitem.php:179 msgid "Submit and finish" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:166 +#: ../../Zotlabs/Module/Mitem.php:180 msgid "Submit and continue" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:174 +#: ../../Zotlabs/Module/Mitem.php:189 msgid "Menu:" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:177 +#: ../../Zotlabs/Module/Mitem.php:192 msgid "Link Target" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:180 +#: ../../Zotlabs/Module/Mitem.php:195 msgid "Edit menu" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:183 +#: ../../Zotlabs/Module/Mitem.php:198 msgid "Edit element" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:184 +#: ../../Zotlabs/Module/Mitem.php:199 msgid "Drop element" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:185 +#: ../../Zotlabs/Module/Mitem.php:200 msgid "New element" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:186 +#: ../../Zotlabs/Module/Mitem.php:201 msgid "Edit this menu container" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:187 +#: ../../Zotlabs/Module/Mitem.php:202 msgid "Add menu element" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:188 +#: ../../Zotlabs/Module/Mitem.php:203 msgid "Delete this menu item" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:189 +#: ../../Zotlabs/Module/Mitem.php:204 msgid "Edit this menu item" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:206 +#: ../../Zotlabs/Module/Mitem.php:222 msgid "Menu item not found." msgstr "" -#: ../../Zotlabs/Module/Mitem.php:219 +#: ../../Zotlabs/Module/Mitem.php:235 msgid "Menu item deleted." msgstr "" -#: ../../Zotlabs/Module/Mitem.php:221 +#: ../../Zotlabs/Module/Mitem.php:237 msgid "Menu item could not be deleted." msgstr "" -#: ../../Zotlabs/Module/Mitem.php:228 +#: ../../Zotlabs/Module/Mitem.php:244 msgid "Edit Menu Element" msgstr "" -#: ../../Zotlabs/Module/Mitem.php:238 +#: ../../Zotlabs/Module/Mitem.php:254 msgid "Link text" msgstr "" @@ -1263,7 +1297,7 @@ msgstr "" #: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Tagger.php:73 #: ../../Zotlabs/Module/Like.php:386 ../../include/conversation.php:119 -#: ../../include/text.php:2008 ../../include/event.php:1153 +#: ../../include/text.php:2025 ../../include/event.php:1153 msgid "event" msgstr "" @@ -1324,13 +1358,13 @@ msgstr "" msgid "Edit Location" msgstr "" -#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1123 -#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/ThreadItem.php:762 -#: ../../include/conversation.php:1333 +#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1128 +#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/ThreadItem.php:767 +#: ../../include/conversation.php:1341 msgid "Preview" msgstr "" -#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1405 +#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1413 msgid "Permission settings" msgstr "" @@ -1355,7 +1389,7 @@ msgid "Delete event" msgstr "" #: ../../Zotlabs/Module/Events.php:660 ../../Zotlabs/Module/Cal.php:315 -#: ../../include/text.php:1827 +#: ../../include/text.php:1844 msgid "Link to Source" msgstr "" @@ -1440,21 +1474,21 @@ msgstr "" msgid "Please login." msgstr "" -#: ../../Zotlabs/Module/Magic.php:72 +#: ../../Zotlabs/Module/Magic.php:76 msgid "Hub not found." msgstr "" #: ../../Zotlabs/Module/Subthread.php:111 ../../Zotlabs/Module/Tagger.php:69 #: ../../Zotlabs/Module/Like.php:384 #: ../../addon/redphotos/redphotohelper.php:71 -#: ../../addon/diaspora/Receiver.php:1500 ../../addon/pubcrawl/as.php:1405 -#: ../../include/conversation.php:116 ../../include/text.php:2005 +#: ../../addon/diaspora/Receiver.php:1530 ../../addon/pubcrawl/as.php:1509 +#: ../../include/conversation.php:116 ../../include/text.php:2022 msgid "photo" msgstr "" #: ../../Zotlabs/Module/Subthread.php:111 ../../Zotlabs/Module/Like.php:384 -#: ../../addon/diaspora/Receiver.php:1500 ../../addon/pubcrawl/as.php:1405 -#: ../../include/conversation.php:144 ../../include/text.php:2011 +#: ../../addon/diaspora/Receiver.php:1530 ../../addon/pubcrawl/as.php:1509 +#: ../../include/conversation.php:144 ../../include/text.php:2028 msgid "status" msgstr "" @@ -1479,14 +1513,14 @@ msgstr "" #: ../../Zotlabs/Module/Editblock.php:116 ../../Zotlabs/Module/Chat.php:207 #: ../../Zotlabs/Module/Editwebpage.php:143 ../../Zotlabs/Module/Mail.php:288 #: ../../Zotlabs/Module/Mail.php:430 ../../Zotlabs/Module/Card_edit.php:101 -#: ../../include/conversation.php:1278 +#: ../../include/conversation.php:1283 msgid "Insert web link" msgstr "" #: ../../Zotlabs/Module/Article_edit.php:117 -#: ../../Zotlabs/Module/Editblock.php:129 ../../Zotlabs/Module/Photos.php:698 -#: ../../Zotlabs/Module/Photos.php:1068 ../../Zotlabs/Module/Card_edit.php:117 -#: ../../include/conversation.php:1401 +#: ../../Zotlabs/Module/Editblock.php:129 ../../Zotlabs/Module/Photos.php:703 +#: ../../Zotlabs/Module/Photos.php:1073 ../../Zotlabs/Module/Card_edit.php:117 +#: ../../include/conversation.php:1409 msgid "Title (optional)" msgstr "" @@ -1494,16 +1528,16 @@ msgstr "" msgid "Edit Article" msgstr "" -#: ../../Zotlabs/Module/Import_items.php:48 ../../Zotlabs/Module/Import.php:64 +#: ../../Zotlabs/Module/Import_items.php:48 ../../Zotlabs/Module/Import.php:66 msgid "Nothing to import." msgstr "" -#: ../../Zotlabs/Module/Import_items.php:72 ../../Zotlabs/Module/Import.php:79 -#: ../../Zotlabs/Module/Import.php:95 +#: ../../Zotlabs/Module/Import_items.php:72 ../../Zotlabs/Module/Import.php:81 +#: ../../Zotlabs/Module/Import.php:97 msgid "Unable to download data from old server" msgstr "" -#: ../../Zotlabs/Module/Import_items.php:77 ../../Zotlabs/Module/Import.php:102 +#: ../../Zotlabs/Module/Import_items.php:77 ../../Zotlabs/Module/Import.php:104 msgid "Imported file is empty." msgstr "" @@ -1525,81 +1559,84 @@ msgid "Use this form to import existing posts and content from an export file." msgstr "" #: ../../Zotlabs/Module/Import_items.php:127 -#: ../../Zotlabs/Module/Import.php:517 +#: ../../Zotlabs/Module/Import.php:548 msgid "File to Upload" msgstr "" -#: ../../Zotlabs/Module/New_channel.php:133 ../../Zotlabs/Module/Manage.php:138 +#: ../../Zotlabs/Module/New_channel.php:147 ../../Zotlabs/Module/Manage.php:138 #, php-format msgid "You have created %1$.0f of %2$.0f allowed channels." msgstr "" -#: ../../Zotlabs/Module/New_channel.php:146 -#: ../../Zotlabs/Module/Register.php:254 -msgid "Name or caption" +#: ../../Zotlabs/Module/New_channel.php:154 +#: ../../Zotlabs/Module/New_channel.php:161 +#: ../../Zotlabs/Module/Connedit.php:852 ../../Zotlabs/Module/Defperms.php:240 +#: ../../Zotlabs/Widget/Notifications.php:162 ../../include/nav.php:276 +msgid "Loading" msgstr "" -#: ../../Zotlabs/Module/New_channel.php:146 -#: ../../Zotlabs/Module/Register.php:254 +#: ../../Zotlabs/Module/New_channel.php:156 +msgid "Your real name is recommended." +msgstr "" + +#: ../../Zotlabs/Module/New_channel.php:157 msgid "" "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation " "Group\"" msgstr "" -#: ../../Zotlabs/Module/New_channel.php:148 -#: ../../Zotlabs/Module/Register.php:256 -msgid "Choose a short nickname" +#: ../../Zotlabs/Module/New_channel.php:162 +msgid "" +"This will be used to create a unique network address (like an email address)." msgstr "" -#: ../../Zotlabs/Module/New_channel.php:148 -#: ../../Zotlabs/Module/Register.php:256 -#, php-format -msgid "" -"Your nickname will be used to create an easy to remember channel address e." -"g. nickname%s" +#: ../../Zotlabs/Module/New_channel.php:164 +msgid "Allowed characters are a-z 0-9, - and _" msgstr "" -#: ../../Zotlabs/Module/New_channel.php:149 -#: ../../Zotlabs/Module/Settings/Channel.php:539 -#: ../../Zotlabs/Module/Register.php:257 +#: ../../Zotlabs/Module/New_channel.php:174 +msgid "Channel name" +msgstr "" + +#: ../../Zotlabs/Module/New_channel.php:176 +#: ../../Zotlabs/Module/Register.php:265 +msgid "Choose a short nickname" +msgstr "" + +#: ../../Zotlabs/Module/New_channel.php:177 +#: ../../Zotlabs/Module/Settings/Channel.php:560 +#: ../../Zotlabs/Module/Register.php:266 msgid "Channel role and privacy" msgstr "" -#: ../../Zotlabs/Module/New_channel.php:149 -#: ../../Zotlabs/Module/Register.php:257 -msgid "Select a channel role with your privacy requirements." +#: ../../Zotlabs/Module/New_channel.php:177 +msgid "" +"Select a channel permission role compatible with your usage needs and " +"privacy requirements." msgstr "" -#: ../../Zotlabs/Module/New_channel.php:149 -#: ../../Zotlabs/Module/Register.php:257 -msgid "Read more about roles" +#: ../../Zotlabs/Module/New_channel.php:177 +#: ../../Zotlabs/Module/Register.php:266 +msgid "Read more about channel permission roles" msgstr "" -#: ../../Zotlabs/Module/New_channel.php:152 -msgid "Create Channel" +#: ../../Zotlabs/Module/New_channel.php:180 +msgid "Create a Channel" msgstr "" -#: ../../Zotlabs/Module/New_channel.php:153 +#: ../../Zotlabs/Module/New_channel.php:181 msgid "" "A channel is a unique network identity. It can represent a person (social " "network profile), a forum (group), a business or celebrity page, a newsfeed, " -"and many other things. Channels can make connections with other channels to " -"share information with each other." +"and many other things." msgstr "" -#: ../../Zotlabs/Module/New_channel.php:153 -msgid "" -"The type of channel you create affects the basic privacy settings, the " -"permissions that are granted to connections/friends, and also the channel's " -"visibility across the network." -msgstr "" - -#: ../../Zotlabs/Module/New_channel.php:154 +#: ../../Zotlabs/Module/New_channel.php:182 msgid "" "or <a href=\"import\">import an existing channel</a> from another location." msgstr "" -#: ../../Zotlabs/Module/New_channel.php:159 +#: ../../Zotlabs/Module/New_channel.php:187 msgid "Validate" msgstr "" @@ -1645,7 +1682,7 @@ msgid "" msgstr "" #: ../../Zotlabs/Module/Removeme.php:64 -#: ../../Zotlabs/Module/Settings/Channel.php:600 +#: ../../Zotlabs/Module/Settings/Channel.php:622 msgid "Remove Channel" msgstr "" @@ -1658,12 +1695,12 @@ msgid "NEW" msgstr "" #: ../../Zotlabs/Module/Sharedwithme.php:107 -#: ../../Zotlabs/Storage/Browser.php:285 ../../include/text.php:1434 +#: ../../Zotlabs/Storage/Browser.php:287 ../../include/text.php:1451 msgid "Size" msgstr "" #: ../../Zotlabs/Module/Sharedwithme.php:108 -#: ../../Zotlabs/Storage/Browser.php:286 +#: ../../Zotlabs/Storage/Browser.php:288 msgid "Last Modified" msgstr "" @@ -2238,150 +2275,6 @@ msgstr "" msgid "No failed updates." msgstr "" -#: ../../Zotlabs/Module/Admin/Plugins.php:259 -#: ../../Zotlabs/Module/Admin/Themes.php:72 ../../Zotlabs/Module/Thing.php:94 -#: ../../Zotlabs/Module/Viewsrc.php:25 ../../Zotlabs/Module/Display.php:46 -#: ../../Zotlabs/Module/Display.php:453 ../../Zotlabs/Module/Filestorage.php:24 -#: ../../Zotlabs/Module/Admin.php:62 ../../include/items.php:3619 -msgid "Item not found." -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:289 -#, php-format -msgid "Plugin %s disabled." -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:294 -#, php-format -msgid "Plugin %s enabled." -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:310 -#: ../../Zotlabs/Module/Admin/Themes.php:95 -msgid "Disable" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:313 -#: ../../Zotlabs/Module/Admin/Themes.php:97 -msgid "Enable" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:341 -#: ../../Zotlabs/Module/Admin/Plugins.php:436 -#: ../../Zotlabs/Module/Admin/Accounts.php:166 -#: ../../Zotlabs/Module/Admin/Logs.php:82 -#: ../../Zotlabs/Module/Admin/Channels.php:145 -#: ../../Zotlabs/Module/Admin/Themes.php:122 -#: ../../Zotlabs/Module/Admin/Themes.php:156 -#: ../../Zotlabs/Module/Admin/Site.php:294 -#: ../../Zotlabs/Module/Admin/Security.php:86 -#: ../../Zotlabs/Module/Admin.php:136 -msgid "Administration" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:342 -#: ../../Zotlabs/Module/Admin/Plugins.php:437 ../../Zotlabs/Widget/Admin.php:27 -msgid "Plugins" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:343 -#: ../../Zotlabs/Module/Admin/Themes.php:124 -msgid "Toggle" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:344 -#: ../../Zotlabs/Module/Admin/Themes.php:125 ../../Zotlabs/Lib/Apps.php:242 -#: ../../Zotlabs/Widget/Newmember.php:46 -#: ../../Zotlabs/Widget/Settings_menu.php:141 ../../include/nav.php:105 -#: ../../include/nav.php:192 -msgid "Settings" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:351 -#: ../../Zotlabs/Module/Admin/Themes.php:134 -msgid "Author: " -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:352 -#: ../../Zotlabs/Module/Admin/Themes.php:135 -msgid "Maintainer: " -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:353 -msgid "Minimum project version: " -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:354 -msgid "Maximum project version: " -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:355 -msgid "Minimum PHP version: " -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:356 -msgid "Compatible Server Roles: " -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:357 -msgid "Requires: " -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:358 -#: ../../Zotlabs/Module/Admin/Plugins.php:442 -msgid "Disabled - version incompatibility" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:411 -msgid "Enter the public git repository URL of the plugin repo." -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:412 -msgid "Plugin repo git URL" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:413 -msgid "Custom repo name" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:413 -msgid "(optional)" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:414 -msgid "Download Plugin Repo" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:421 -msgid "Install new repo" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:393 -msgid "Install" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:445 -msgid "Manage Repos" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:446 -msgid "Installed Plugin Repositories" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:447 -msgid "Install a New Plugin Repository" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:454 -msgid "Switch branch" -msgstr "" - -#: ../../Zotlabs/Module/Admin/Plugins.php:455 -#: ../../Zotlabs/Module/Photos.php:1020 ../../Zotlabs/Module/Tagrm.php:137 -#: ../../addon/superblock/superblock.php:116 -msgid "Remove" -msgstr "" - #: ../../Zotlabs/Module/Admin/Accounts.php:37 #, php-format msgid "%s account blocked/unblocked" @@ -2400,7 +2293,7 @@ msgstr[1] "" msgid "Account not found" msgstr "" -#: ../../Zotlabs/Module/Admin/Accounts.php:91 ../../include/channel.php:2473 +#: ../../Zotlabs/Module/Admin/Accounts.php:91 ../../include/channel.php:2490 #, php-format msgid "Account '%s' deleted" msgstr "" @@ -2415,6 +2308,19 @@ msgstr "" msgid "Account '%s' unblocked" msgstr "" +#: ../../Zotlabs/Module/Admin/Accounts.php:166 +#: ../../Zotlabs/Module/Admin/Logs.php:82 +#: ../../Zotlabs/Module/Admin/Channels.php:145 +#: ../../Zotlabs/Module/Admin/Themes.php:122 +#: ../../Zotlabs/Module/Admin/Themes.php:156 +#: ../../Zotlabs/Module/Admin/Site.php:307 +#: ../../Zotlabs/Module/Admin/Addons.php:341 +#: ../../Zotlabs/Module/Admin/Addons.php:436 +#: ../../Zotlabs/Module/Admin/Security.php:92 +#: ../../Zotlabs/Module/Admin.php:140 +msgid "Administration" +msgstr "" + #: ../../Zotlabs/Module/Admin/Accounts.php:167 #: ../../Zotlabs/Module/Admin/Accounts.php:180 #: ../../Zotlabs/Module/Admin.php:96 ../../Zotlabs/Widget/Admin.php:23 @@ -2439,7 +2345,7 @@ msgid "No registrations." msgstr "" #: ../../Zotlabs/Module/Admin/Accounts.php:173 -#: ../../Zotlabs/Module/Connections.php:303 ../../include/conversation.php:732 +#: ../../Zotlabs/Module/Connections.php:303 ../../include/conversation.php:735 msgid "Approve" msgstr "" @@ -2462,7 +2368,7 @@ msgstr "" msgid "ID" msgstr "" -#: ../../Zotlabs/Module/Admin/Accounts.php:184 ../../include/group.php:284 +#: ../../Zotlabs/Module/Admin/Accounts.php:184 msgid "All Channels" msgstr "" @@ -2576,7 +2482,7 @@ msgid "Channel '%s' code disallowed" msgstr "" #: ../../Zotlabs/Module/Admin/Channels.php:146 -#: ../../Zotlabs/Module/Admin.php:110 ../../Zotlabs/Widget/Admin.php:24 +#: ../../Zotlabs/Module/Admin.php:114 ../../Zotlabs/Widget/Admin.php:24 msgid "Channels" msgstr "" @@ -2597,7 +2503,7 @@ msgid "Disallow Code" msgstr "" #: ../../Zotlabs/Module/Admin/Channels.php:154 -#: ../../include/conversation.php:1811 ../../include/nav.php:378 +#: ../../include/conversation.php:1820 ../../include/nav.php:370 msgid "Channel" msgstr "" @@ -2625,6 +2531,24 @@ msgstr "" msgid "No themes found." msgstr "" +#: ../../Zotlabs/Module/Admin/Themes.php:72 +#: ../../Zotlabs/Module/Admin/Addons.php:259 ../../Zotlabs/Module/Thing.php:94 +#: ../../Zotlabs/Module/Viewsrc.php:25 ../../Zotlabs/Module/Display.php:46 +#: ../../Zotlabs/Module/Display.php:453 ../../Zotlabs/Module/Filestorage.php:24 +#: ../../Zotlabs/Module/Admin.php:62 ../../include/items.php:3566 +msgid "Item not found." +msgstr "" + +#: ../../Zotlabs/Module/Admin/Themes.php:95 +#: ../../Zotlabs/Module/Admin/Addons.php:310 +msgid "Disable" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Themes.php:97 +#: ../../Zotlabs/Module/Admin/Addons.php:313 +msgid "Enable" +msgstr "" + #: ../../Zotlabs/Module/Admin/Themes.php:116 msgid "Screenshot" msgstr "" @@ -2634,6 +2558,28 @@ msgstr "" msgid "Themes" msgstr "" +#: ../../Zotlabs/Module/Admin/Themes.php:124 +#: ../../Zotlabs/Module/Admin/Addons.php:343 +msgid "Toggle" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Themes.php:125 +#: ../../Zotlabs/Module/Admin/Addons.php:344 ../../Zotlabs/Lib/Apps.php:304 +#: ../../Zotlabs/Widget/Newmember.php:46 +#: ../../Zotlabs/Widget/Settings_menu.php:141 ../../include/nav.php:99 +msgid "Settings" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Themes.php:134 +#: ../../Zotlabs/Module/Admin/Addons.php:351 +msgid "Author: " +msgstr "" + +#: ../../Zotlabs/Module/Admin/Themes.php:135 +#: ../../Zotlabs/Module/Admin/Addons.php:352 +msgid "Maintainer: " +msgstr "" + #: ../../Zotlabs/Module/Admin/Themes.php:162 msgid "[Experimental]" msgstr "" @@ -2642,466 +2588,581 @@ msgstr "" msgid "[Unsupported]" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:165 +#: ../../Zotlabs/Module/Admin/Site.php:172 msgid "Site settings updated." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:191 +#: ../../Zotlabs/Module/Admin/Site.php:198 #: ../../view/theme/redbasic_c/php/config.php:15 -#: ../../view/theme/redbasic/php/config.php:15 ../../include/text.php:3106 +#: ../../view/theme/redbasic/php/config.php:15 ../../include/text.php:3078 msgid "Default" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:202 +#: ../../Zotlabs/Module/Admin/Site.php:209 #: ../../Zotlabs/Module/Settings/Display.php:130 #, php-format msgid "%s - (Incompatible)" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:209 +#: ../../Zotlabs/Module/Admin/Site.php:216 msgid "mobile" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:211 +#: ../../Zotlabs/Module/Admin/Site.php:218 msgid "experimental" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:213 +#: ../../Zotlabs/Module/Admin/Site.php:220 msgid "unsupported" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:260 +#: ../../Zotlabs/Module/Admin/Site.php:267 msgid "Yes - with approval" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:266 +#: ../../Zotlabs/Module/Admin/Site.php:273 msgid "My site is not a public server" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:267 +#: ../../Zotlabs/Module/Admin/Site.php:274 msgid "My site has paid access only" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:268 +#: ../../Zotlabs/Module/Admin/Site.php:275 msgid "My site has free access only" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:269 +#: ../../Zotlabs/Module/Admin/Site.php:276 msgid "My site offers free accounts with optional paid upgrades" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:281 +#: ../../Zotlabs/Module/Admin/Site.php:288 msgid "Beginner/Basic" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:282 +#: ../../Zotlabs/Module/Admin/Site.php:289 msgid "Novice - not skilled but willing to learn" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:283 +#: ../../Zotlabs/Module/Admin/Site.php:290 msgid "Intermediate - somewhat comfortable" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:284 +#: ../../Zotlabs/Module/Admin/Site.php:291 msgid "Advanced - very comfortable" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:285 +#: ../../Zotlabs/Module/Admin/Site.php:292 msgid "Expert - I can write computer code" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:286 +#: ../../Zotlabs/Module/Admin/Site.php:293 msgid "Wizard - I probably know more than you do" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:295 ../../Zotlabs/Widget/Admin.php:22 +#: ../../Zotlabs/Module/Admin/Site.php:299 +msgid "Default permission role for new accounts" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Site.php:299 +msgid "" +"This role will be used for the first channel created after registration." +msgstr "" + +#: ../../Zotlabs/Module/Admin/Site.php:308 ../../Zotlabs/Widget/Admin.php:22 msgid "Site" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:297 -#: ../../Zotlabs/Module/Register.php:269 +#: ../../Zotlabs/Module/Admin/Site.php:310 +#: ../../Zotlabs/Module/Register.php:278 msgid "Registration" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:298 +#: ../../Zotlabs/Module/Admin/Site.php:311 msgid "File upload" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:299 +#: ../../Zotlabs/Module/Admin/Site.php:312 msgid "Policies" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:300 ../../include/contact_widgets.php:16 +#: ../../Zotlabs/Module/Admin/Site.php:313 ../../include/contact_widgets.php:16 msgid "Advanced" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:304 +#: ../../Zotlabs/Module/Admin/Site.php:317 #: ../../addon/statusnet/statusnet.php:891 msgid "Site name" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:306 +#: ../../Zotlabs/Module/Admin/Site.php:319 msgid "Site default technical skill level" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:306 +#: ../../Zotlabs/Module/Admin/Site.php:319 msgid "Used to provide a member experience matched to technical comfort level" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:308 +#: ../../Zotlabs/Module/Admin/Site.php:321 msgid "Lock the technical skill level setting" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:308 +#: ../../Zotlabs/Module/Admin/Site.php:321 msgid "Members can set their own technical comfort level by default" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:310 +#: ../../Zotlabs/Module/Admin/Site.php:323 msgid "Banner/Logo" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:310 +#: ../../Zotlabs/Module/Admin/Site.php:323 msgid "Unfiltered HTML/CSS/JS is allowed" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:311 +#: ../../Zotlabs/Module/Admin/Site.php:324 msgid "Administrator Information" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:311 +#: ../../Zotlabs/Module/Admin/Site.php:324 msgid "" "Contact information for site administrators. Displayed on siteinfo page. " "BBCode can be used here" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:312 ../../Zotlabs/Module/Siteinfo.php:21 +#: ../../Zotlabs/Module/Admin/Site.php:325 ../../Zotlabs/Module/Siteinfo.php:24 msgid "Site Information" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:312 +#: ../../Zotlabs/Module/Admin/Site.php:325 msgid "" "Publicly visible description of this site. Displayed on siteinfo page. " "BBCode can be used here" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:313 +#: ../../Zotlabs/Module/Admin/Site.php:326 msgid "System language" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:314 +#: ../../Zotlabs/Module/Admin/Site.php:327 msgid "System theme" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:314 +#: ../../Zotlabs/Module/Admin/Site.php:327 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:317 +#: ../../Zotlabs/Module/Admin/Site.php:330 msgid "Allow Feeds as Connections" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:317 +#: ../../Zotlabs/Module/Admin/Site.php:330 msgid "(Heavy system resource usage)" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:318 +#: ../../Zotlabs/Module/Admin/Site.php:331 msgid "Maximum image size" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:318 +#: ../../Zotlabs/Module/Admin/Site.php:331 msgid "" "Maximum size in bytes of uploaded images. Default is 0, which means no " "limits." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:319 +#: ../../Zotlabs/Module/Admin/Site.php:332 msgid "Does this site allow new member registration?" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:320 +#: ../../Zotlabs/Module/Admin/Site.php:333 msgid "Invitation only" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:320 +#: ../../Zotlabs/Module/Admin/Site.php:333 msgid "" "Only allow new member registrations with an invitation code. Above register " "policy must be set to Yes." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:321 +#: ../../Zotlabs/Module/Admin/Site.php:334 msgid "Minimum age" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:321 +#: ../../Zotlabs/Module/Admin/Site.php:334 msgid "Minimum age (in years) for who may register on this site." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:322 +#: ../../Zotlabs/Module/Admin/Site.php:335 msgid "Which best describes the types of account offered by this hub?" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:323 +#: ../../Zotlabs/Module/Admin/Site.php:336 msgid "Register text" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:323 +#: ../../Zotlabs/Module/Admin/Site.php:336 msgid "Will be displayed prominently on the registration page." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:324 +#: ../../Zotlabs/Module/Admin/Site.php:338 msgid "Site homepage to show visitors (default: login box)" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:324 +#: ../../Zotlabs/Module/Admin/Site.php:338 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:325 +#: ../../Zotlabs/Module/Admin/Site.php:339 msgid "Preserve site homepage URL" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:325 +#: ../../Zotlabs/Module/Admin/Site.php:339 msgid "" "Present the site homepage in a frame at the original location instead of " "redirecting" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:326 +#: ../../Zotlabs/Module/Admin/Site.php:340 msgid "Accounts abandoned after x days" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:326 +#: ../../Zotlabs/Module/Admin/Site.php:340 msgid "" "Will not waste system resources polling external sites for abandonded " "accounts. Enter 0 for no time limit." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:327 +#: ../../Zotlabs/Module/Admin/Site.php:341 msgid "Allowed friend domains" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:327 +#: ../../Zotlabs/Module/Admin/Site.php:341 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:328 +#: ../../Zotlabs/Module/Admin/Site.php:342 msgid "Verify Email Addresses" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:328 +#: ../../Zotlabs/Module/Admin/Site.php:342 msgid "" "Check to verify email addresses used in account registration (recommended)." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:329 +#: ../../Zotlabs/Module/Admin/Site.php:343 msgid "Force publish" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:329 +#: ../../Zotlabs/Module/Admin/Site.php:343 msgid "" "Check to force all profiles on this site to be listed in the site directory." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:330 +#: ../../Zotlabs/Module/Admin/Site.php:344 msgid "Import Public Streams" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:330 +#: ../../Zotlabs/Module/Admin/Site.php:344 msgid "" "Import and allow access to public content pulled from other sites. Warning: " "this content is unmoderated." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:331 +#: ../../Zotlabs/Module/Admin/Site.php:345 msgid "Site only Public Streams" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:331 +#: ../../Zotlabs/Module/Admin/Site.php:345 msgid "" "Allow access to public content originating only from this site if Imported " "Public Streams are disabled." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:332 +#: ../../Zotlabs/Module/Admin/Site.php:346 msgid "Allow anybody on the internet to access the Public streams" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:332 +#: ../../Zotlabs/Module/Admin/Site.php:346 msgid "" "Disable to require authentication before viewing. Warning: this content is " "unmoderated." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:333 +#: ../../Zotlabs/Module/Admin/Site.php:347 +msgid "Only import Public stream posts with this text" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Site.php:347 +#: ../../Zotlabs/Module/Admin/Site.php:348 +#: ../../Zotlabs/Module/Connedit.php:875 ../../Zotlabs/Module/Connedit.php:876 +msgid "" +"words one per line or #tags or /patterns/ or lang=xx, leave blank to import " +"all posts" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Site.php:348 +msgid "Do not import Public stream posts with this text" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Site.php:351 msgid "Login on Homepage" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:333 +#: ../../Zotlabs/Module/Admin/Site.php:351 msgid "" "Present a login box to visitors on the home page if no other content has " "been configured." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:334 +#: ../../Zotlabs/Module/Admin/Site.php:352 msgid "Enable context help" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:334 +#: ../../Zotlabs/Module/Admin/Site.php:352 msgid "" "Display contextual help for the current page when the help button is pressed." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:336 +#: ../../Zotlabs/Module/Admin/Site.php:354 msgid "Reply-to email address for system generated email." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:337 +#: ../../Zotlabs/Module/Admin/Site.php:355 msgid "Sender (From) email address for system generated email." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:338 +#: ../../Zotlabs/Module/Admin/Site.php:356 msgid "Name of email sender for system generated email." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:340 +#: ../../Zotlabs/Module/Admin/Site.php:358 msgid "Directory Server URL" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:340 +#: ../../Zotlabs/Module/Admin/Site.php:358 msgid "Default directory server" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:342 +#: ../../Zotlabs/Module/Admin/Site.php:360 msgid "Proxy user" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:343 +#: ../../Zotlabs/Module/Admin/Site.php:361 msgid "Proxy URL" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:344 +#: ../../Zotlabs/Module/Admin/Site.php:362 msgid "Network timeout" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:344 +#: ../../Zotlabs/Module/Admin/Site.php:362 msgid "Value is in seconds. Set to 0 for unlimited (not recommended)." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:345 +#: ../../Zotlabs/Module/Admin/Site.php:363 msgid "Delivery interval" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:345 +#: ../../Zotlabs/Module/Admin/Site.php:363 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:346 +#: ../../Zotlabs/Module/Admin/Site.php:364 msgid "Deliveries per process" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:346 +#: ../../Zotlabs/Module/Admin/Site.php:364 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:347 +#: ../../Zotlabs/Module/Admin/Site.php:365 msgid "Queue Threshold" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:347 +#: ../../Zotlabs/Module/Admin/Site.php:365 msgid "" "Always defer immediate delivery if queue contains more than this number of " "entries." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:348 +#: ../../Zotlabs/Module/Admin/Site.php:366 msgid "Poll interval" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:348 +#: ../../Zotlabs/Module/Admin/Site.php:366 msgid "" "Delay background polling processes by this many seconds to reduce system " "load. If 0, use delivery interval." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:349 +#: ../../Zotlabs/Module/Admin/Site.php:367 msgid "Path to ImageMagick convert program" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:349 +#: ../../Zotlabs/Module/Admin/Site.php:367 msgid "" "If set, use this program to generate photo thumbnails for huge images ( > " "4000 pixels in either dimension), otherwise memory exhaustion may occur. " "Example: /usr/bin/convert" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:350 +#: ../../Zotlabs/Module/Admin/Site.php:368 msgid "Allow SVG thumbnails in file browser" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:350 +#: ../../Zotlabs/Module/Admin/Site.php:368 msgid "WARNING: SVG images may contain malicious code." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:351 +#: ../../Zotlabs/Module/Admin/Site.php:369 msgid "Maximum Load Average" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:351 +#: ../../Zotlabs/Module/Admin/Site.php:369 msgid "" "Maximum system load before delivery and poll processes are deferred - " "default 50." msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:352 +#: ../../Zotlabs/Module/Admin/Site.php:370 msgid "Expiration period in days for imported (grid/network) content" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:352 +#: ../../Zotlabs/Module/Admin/Site.php:370 msgid "0 for no expiration of imported content" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:353 +#: ../../Zotlabs/Module/Admin/Site.php:371 msgid "" "Do not expire any posts which have comments less than this many days ago" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:355 +#: ../../Zotlabs/Module/Admin/Site.php:373 msgid "" "Public servers: Optional landing (marketing) webpage for new registrants" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:355 +#: ../../Zotlabs/Module/Admin/Site.php:373 #, php-format msgid "Create this page first. Default is %s/register" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:356 +#: ../../Zotlabs/Module/Admin/Site.php:374 msgid "Page to display after creating a new channel" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:356 -msgid "Recommend: profiles, go, or settings" +#: ../../Zotlabs/Module/Admin/Site.php:374 +msgid "Default: profiles" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:358 +#: ../../Zotlabs/Module/Admin/Site.php:376 msgid "Optional: site location" msgstr "" -#: ../../Zotlabs/Module/Admin/Site.php:358 +#: ../../Zotlabs/Module/Admin/Site.php:376 msgid "Region or country" msgstr "" +#: ../../Zotlabs/Module/Admin/Addons.php:289 +#, php-format +msgid "Plugin %s disabled." +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:294 +#, php-format +msgid "Plugin %s enabled." +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:342 +#: ../../Zotlabs/Module/Admin/Addons.php:437 ../../Zotlabs/Widget/Admin.php:27 +msgid "Addons" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:353 +msgid "Minimum project version: " +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:354 +msgid "Maximum project version: " +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:355 +msgid "Minimum PHP version: " +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:356 +msgid "Compatible Server Roles: " +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:357 +msgid "Requires: " +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:358 +#: ../../Zotlabs/Module/Admin/Addons.php:442 +msgid "Disabled - version incompatibility" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:411 +msgid "Enter the public git repository URL of the addon repo." +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:412 +msgid "Addon repo git URL" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:413 +msgid "Custom repo name" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:413 +msgid "(optional)" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:414 +msgid "Download Addon Repo" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:421 +msgid "Install new repo" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:422 ../../Zotlabs/Lib/Apps.php:456 +msgid "Install" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:445 +msgid "Manage Repos" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:446 +msgid "Installed Addon Repositories" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:447 +msgid "Install a New Addon Repository" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:454 +msgid "Switch branch" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Addons.php:455 +#: ../../Zotlabs/Module/Photos.php:1025 ../../Zotlabs/Module/Tagrm.php:137 +#: ../../addon/superblock/superblock.php:116 +msgid "Remove" +msgstr "" + #: ../../Zotlabs/Module/Admin/Profs.php:89 msgid "New Profile Field" msgstr "" @@ -3144,8 +3205,8 @@ msgstr "" #: ../../Zotlabs/Module/Admin/Profs.php:94 #: ../../Zotlabs/Module/Admin/Profs.php:114 ../../Zotlabs/Module/Rbmark.php:32 #: ../../Zotlabs/Module/Rbmark.php:104 ../../Zotlabs/Module/Filer.php:53 -#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1052 -#: ../../include/text.php:1064 +#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1063 +#: ../../include/text.php:1075 msgid "Save" msgstr "" @@ -3222,114 +3283,127 @@ msgstr "" msgid "Service class" msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:77 +#: ../../Zotlabs/Module/Admin/Security.php:83 msgid "" "By default, unfiltered HTML is allowed in embedded media. This is inherently " "insecure." msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:80 +#: ../../Zotlabs/Module/Admin/Security.php:86 msgid "" "The recommended setting is to only allow unfiltered HTML from the following " "sites:" msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:81 +#: ../../Zotlabs/Module/Admin/Security.php:87 msgid "" "https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/" "<br />https://vimeo.com/<br />https://soundcloud.com/<br />" msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:82 +#: ../../Zotlabs/Module/Admin/Security.php:88 msgid "" "All other embedded content will be filtered, <strong>unless</strong> " "embedded content from that site is explicitly blocked." msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:87 ../../Zotlabs/Widget/Admin.php:25 +#: ../../Zotlabs/Module/Admin/Security.php:93 ../../Zotlabs/Widget/Admin.php:25 msgid "Security" msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:89 +#: ../../Zotlabs/Module/Admin/Security.php:95 msgid "Block public" msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:89 +#: ../../Zotlabs/Module/Admin/Security.php:95 msgid "" "Check to block public access to all otherwise public personal pages on this " "site unless you are currently authenticated." msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:90 +#: ../../Zotlabs/Module/Admin/Security.php:96 +msgid "Provide a cloud root directory" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Security.php:96 +msgid "" +"The cloud root directory lists all channel names which provide public files" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Security.php:97 +msgid "Show total disk space available to cloud uploads" +msgstr "" + +#: ../../Zotlabs/Module/Admin/Security.php:98 msgid "Set \"Transport Security\" HTTP header" msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:91 +#: ../../Zotlabs/Module/Admin/Security.php:99 msgid "Set \"Content Security Policy\" HTTP header" msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:92 +#: ../../Zotlabs/Module/Admin/Security.php:100 msgid "Allowed email domains" msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:92 +#: ../../Zotlabs/Module/Admin/Security.php:100 msgid "" "Comma separated list of domains which are allowed in email addresses for " "registrations to this site. Wildcards are accepted. Empty to allow any " "domains" msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:93 +#: ../../Zotlabs/Module/Admin/Security.php:101 msgid "Not allowed email domains" msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:93 +#: ../../Zotlabs/Module/Admin/Security.php:101 msgid "" "Comma separated list of domains which are not allowed in email addresses for " "registrations to this site. Wildcards are accepted. Empty to allow any " "domains, unless allowed domains have been defined." msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:94 +#: ../../Zotlabs/Module/Admin/Security.php:102 msgid "Allow communications only from these sites" msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:94 +#: ../../Zotlabs/Module/Admin/Security.php:102 msgid "" "One site per line. Leave empty to allow communication from anywhere by " "default" msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:95 +#: ../../Zotlabs/Module/Admin/Security.php:103 msgid "Block communications from these sites" msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:96 +#: ../../Zotlabs/Module/Admin/Security.php:104 msgid "Allow communications only from these channels" msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:96 +#: ../../Zotlabs/Module/Admin/Security.php:104 msgid "" "One channel (hash) per line. Leave empty to allow from any channel by default" msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:97 +#: ../../Zotlabs/Module/Admin/Security.php:105 msgid "Block communications from these channels" msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:98 +#: ../../Zotlabs/Module/Admin/Security.php:106 msgid "Only allow embeds from secure (SSL) websites and links." msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:99 +#: ../../Zotlabs/Module/Admin/Security.php:107 msgid "Allow unfiltered embedded HTML content only from these domains" msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:99 +#: ../../Zotlabs/Module/Admin/Security.php:107 msgid "One site per line. By default embedded content is filtered." msgstr "" -#: ../../Zotlabs/Module/Admin/Security.php:100 +#: ../../Zotlabs/Module/Admin/Security.php:108 msgid "Block embedded HTML from these domains" msgstr "" @@ -3342,7 +3416,7 @@ msgid "Visible to:" msgstr "" #: ../../Zotlabs/Module/Lockview.php:117 ../../Zotlabs/Module/Lockview.php:153 -#: ../../Zotlabs/Module/Acl.php:121 ../../include/acl_selectors.php:88 +#: ../../Zotlabs/Module/Acl.php:120 ../../include/acl_selectors.php:88 msgctxt "acl" msgid "Profile" msgstr "" @@ -3370,6 +3444,7 @@ msgid "" msgstr "" #: ../../Zotlabs/Module/Settings/Permcats.php:99 +#: ../../Zotlabs/Widget/Settings_menu.php:108 ../../include/features.php:240 msgid "Permission Categories" msgstr "" @@ -3404,18 +3479,18 @@ msgid "" "individual settings. You can <strong>not</strong> change those settings here." msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:64 #: ../../Zotlabs/Module/Settings/Channel.php:68 -#: ../../Zotlabs/Module/Settings/Channel.php:69 #: ../../Zotlabs/Module/Settings/Channel.php:72 -#: ../../Zotlabs/Module/Settings/Channel.php:83 +#: ../../Zotlabs/Module/Settings/Channel.php:73 +#: ../../Zotlabs/Module/Settings/Channel.php:76 +#: ../../Zotlabs/Module/Settings/Channel.php:87 #: ../../Zotlabs/Module/Connedit.php:711 ../../Zotlabs/Widget/Affinity.php:24 #: ../../include/selectors.php:123 ../../include/channel.php:437 #: ../../include/channel.php:438 ../../include/channel.php:445 msgid "Friends" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:264 +#: ../../Zotlabs/Module/Settings/Channel.php:272 #: ../../Zotlabs/Module/Defperms.php:103 #: ../../addon/rendezvous/rendezvous.php:82 #: ../../addon/openstreetmap/openstreetmap.php:184 @@ -3425,400 +3500,414 @@ msgstr "" msgid "Settings updated." msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:325 +#: ../../Zotlabs/Module/Settings/Channel.php:333 msgid "Nobody except yourself" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:326 +#: ../../Zotlabs/Module/Settings/Channel.php:334 msgid "Only those you specifically allow" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:327 +#: ../../Zotlabs/Module/Settings/Channel.php:335 msgid "Approved connections" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:328 +#: ../../Zotlabs/Module/Settings/Channel.php:336 msgid "Any connections" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:329 +#: ../../Zotlabs/Module/Settings/Channel.php:337 msgid "Anybody on this website" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:330 +#: ../../Zotlabs/Module/Settings/Channel.php:338 msgid "Anybody in this network" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:331 +#: ../../Zotlabs/Module/Settings/Channel.php:339 msgid "Anybody authenticated" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:332 +#: ../../Zotlabs/Module/Settings/Channel.php:340 msgid "Anybody on the internet" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:407 +#: ../../Zotlabs/Module/Settings/Channel.php:415 msgid "Publish your default profile in the network directory" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:412 +#: ../../Zotlabs/Module/Settings/Channel.php:420 msgid "Allow us to suggest you as a potential friend to new members?" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:416 +#: ../../Zotlabs/Module/Settings/Channel.php:424 msgid "or" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:425 +#: ../../Zotlabs/Module/Settings/Channel.php:433 msgid "Your channel address is" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:428 +#: ../../Zotlabs/Module/Settings/Channel.php:436 msgid "Your files/photos are accessible via WebDAV at" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:493 +#: ../../Zotlabs/Module/Settings/Channel.php:488 +msgid "Automatic membership approval" +msgstr "" + +#: ../../Zotlabs/Module/Settings/Channel.php:488 +#: ../../Zotlabs/Module/Defperms.php:239 +msgid "" +"If enabled, connection requests will be approved without your interaction" +msgstr "" + +#: ../../Zotlabs/Module/Settings/Channel.php:514 msgid "Channel Settings" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:500 +#: ../../Zotlabs/Module/Settings/Channel.php:521 msgid "Basic Settings" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:501 ../../include/channel.php:1521 +#: ../../Zotlabs/Module/Settings/Channel.php:522 ../../include/channel.php:1521 msgid "Full Name:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:502 +#: ../../Zotlabs/Module/Settings/Channel.php:523 #: ../../Zotlabs/Module/Settings/Account.php:119 msgid "Email Address:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:503 +#: ../../Zotlabs/Module/Settings/Channel.php:524 msgid "Your Timezone:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:504 +#: ../../Zotlabs/Module/Settings/Channel.php:525 msgid "Default Post Location:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:504 +#: ../../Zotlabs/Module/Settings/Channel.php:525 msgid "Geographical location to display on your posts" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:505 +#: ../../Zotlabs/Module/Settings/Channel.php:526 msgid "Use Browser Location:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:507 +#: ../../Zotlabs/Module/Settings/Channel.php:528 msgid "Adult Content" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:507 +#: ../../Zotlabs/Module/Settings/Channel.php:528 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:509 +#: ../../Zotlabs/Module/Settings/Channel.php:530 msgid "Security and Privacy Settings" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:511 +#: ../../Zotlabs/Module/Settings/Channel.php:532 msgid "Your permissions are already configured. Click to view/adjust" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:513 +#: ../../Zotlabs/Module/Settings/Channel.php:534 msgid "Hide my online presence" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:513 +#: ../../Zotlabs/Module/Settings/Channel.php:534 msgid "Prevents displaying in your profile that you are online" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:515 +#: ../../Zotlabs/Module/Settings/Channel.php:536 msgid "Simple Privacy Settings:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:516 +#: ../../Zotlabs/Module/Settings/Channel.php:537 msgid "" "Very Public - <em>extremely permissive (should be used with caution)</em>" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:517 +#: ../../Zotlabs/Module/Settings/Channel.php:538 msgid "" "Typical - <em>default public, privacy when desired (similar to social " "network permissions but with improved privacy)</em>" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:518 +#: ../../Zotlabs/Module/Settings/Channel.php:539 msgid "Private - <em>default private, never open or public</em>" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:519 +#: ../../Zotlabs/Module/Settings/Channel.php:540 msgid "Blocked - <em>default blocked to/from everybody</em>" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:521 +#: ../../Zotlabs/Module/Settings/Channel.php:542 msgid "Allow others to tag your posts" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:521 +#: ../../Zotlabs/Module/Settings/Channel.php:542 msgid "" "Often used by the community to retro-actively flag inappropriate content" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:523 +#: ../../Zotlabs/Module/Settings/Channel.php:544 msgid "Channel Permission Limits" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:525 +#: ../../Zotlabs/Module/Settings/Channel.php:546 msgid "Expire other channel content after this many days" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:525 +#: ../../Zotlabs/Module/Settings/Channel.php:546 msgid "0 or blank to use the website limit." msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:525 +#: ../../Zotlabs/Module/Settings/Channel.php:546 #, php-format msgid "This website expires after %d days." msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:525 +#: ../../Zotlabs/Module/Settings/Channel.php:546 msgid "This website does not expire imported content." msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:525 +#: ../../Zotlabs/Module/Settings/Channel.php:546 msgid "The website limit takes precedence if lower than your limit." msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:526 +#: ../../Zotlabs/Module/Settings/Channel.php:547 msgid "Maximum Friend Requests/Day:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:526 +#: ../../Zotlabs/Module/Settings/Channel.php:547 msgid "May reduce spam activity" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:527 +#: ../../Zotlabs/Module/Settings/Channel.php:548 msgid "Default Privacy Group" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:529 +#: ../../Zotlabs/Module/Settings/Channel.php:550 msgid "Use my default audience setting for the type of object published" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:530 +#: ../../Zotlabs/Module/Settings/Channel.php:551 msgid "Profile to assign new connections" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:540 +#: ../../Zotlabs/Module/Settings/Channel.php:561 msgid "Default Permissions Group" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:546 +#: ../../Zotlabs/Module/Settings/Channel.php:567 msgid "Maximum private messages per day from unknown people:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:546 +#: ../../Zotlabs/Module/Settings/Channel.php:567 msgid "Useful to reduce spamming" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:549 +#: ../../Zotlabs/Module/Settings/Channel.php:570 #: ../../Zotlabs/Lib/Enotify.php:68 msgid "Notification Settings" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:550 +#: ../../Zotlabs/Module/Settings/Channel.php:571 msgid "By default post a status message when:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:551 +#: ../../Zotlabs/Module/Settings/Channel.php:572 msgid "accepting a friend request" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:552 +#: ../../Zotlabs/Module/Settings/Channel.php:573 msgid "joining a forum/community" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:553 +#: ../../Zotlabs/Module/Settings/Channel.php:574 msgid "making an <em>interesting</em> profile change" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:554 +#: ../../Zotlabs/Module/Settings/Channel.php:575 msgid "Send a notification email when:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:555 +#: ../../Zotlabs/Module/Settings/Channel.php:576 msgid "You receive a connection request" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:556 +#: ../../Zotlabs/Module/Settings/Channel.php:577 msgid "Your connections are confirmed" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:557 +#: ../../Zotlabs/Module/Settings/Channel.php:578 msgid "Someone writes on your profile wall" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:558 +#: ../../Zotlabs/Module/Settings/Channel.php:579 msgid "Someone writes a followup comment" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:559 +#: ../../Zotlabs/Module/Settings/Channel.php:580 msgid "You receive a private message" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:560 +#: ../../Zotlabs/Module/Settings/Channel.php:581 msgid "You receive a friend suggestion" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:561 +#: ../../Zotlabs/Module/Settings/Channel.php:582 msgid "You are tagged in a post" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:562 +#: ../../Zotlabs/Module/Settings/Channel.php:583 msgid "You are poked/prodded/etc. in a post" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:564 +#: ../../Zotlabs/Module/Settings/Channel.php:585 msgid "Someone likes your post/comment" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:567 +#: ../../Zotlabs/Module/Settings/Channel.php:588 msgid "Show visual notifications including:" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:569 +#: ../../Zotlabs/Module/Settings/Channel.php:590 msgid "Unseen grid activity" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:570 +#: ../../Zotlabs/Module/Settings/Channel.php:591 msgid "Unseen channel activity" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:571 +#: ../../Zotlabs/Module/Settings/Channel.php:592 msgid "Unseen private messages" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:571 -#: ../../Zotlabs/Module/Settings/Channel.php:576 -#: ../../Zotlabs/Module/Settings/Channel.php:577 -#: ../../Zotlabs/Module/Settings/Channel.php:578 +#: ../../Zotlabs/Module/Settings/Channel.php:592 +#: ../../Zotlabs/Module/Settings/Channel.php:597 +#: ../../Zotlabs/Module/Settings/Channel.php:598 +#: ../../Zotlabs/Module/Settings/Channel.php:599 #: ../../addon/jappixmini/jappixmini.php:343 msgid "Recommended" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:572 +#: ../../Zotlabs/Module/Settings/Channel.php:593 msgid "Upcoming events" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:573 +#: ../../Zotlabs/Module/Settings/Channel.php:594 msgid "Events today" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:574 +#: ../../Zotlabs/Module/Settings/Channel.php:595 msgid "Upcoming birthdays" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:574 +#: ../../Zotlabs/Module/Settings/Channel.php:595 msgid "Not available in all themes" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:575 +#: ../../Zotlabs/Module/Settings/Channel.php:596 msgid "System (personal) notifications" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:576 +#: ../../Zotlabs/Module/Settings/Channel.php:597 msgid "System info messages" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:577 +#: ../../Zotlabs/Module/Settings/Channel.php:598 msgid "System critical alerts" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:578 +#: ../../Zotlabs/Module/Settings/Channel.php:599 msgid "New connections" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:579 +#: ../../Zotlabs/Module/Settings/Channel.php:600 msgid "System Registrations" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:580 +#: ../../Zotlabs/Module/Settings/Channel.php:601 msgid "Unseen shared files" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:581 +#: ../../Zotlabs/Module/Settings/Channel.php:602 msgid "Unseen public activity" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:582 +#: ../../Zotlabs/Module/Settings/Channel.php:603 msgid "Unseen likes and dislikes" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:583 +#: ../../Zotlabs/Module/Settings/Channel.php:604 +msgid "Unseen forum posts" +msgstr "" + +#: ../../Zotlabs/Module/Settings/Channel.php:605 msgid "Email notification hub (hostname)" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:583 +#: ../../Zotlabs/Module/Settings/Channel.php:605 #, php-format msgid "" "If your channel is mirrored to multiple hubs, set this to your preferred " "location. This will prevent duplicate email notifications. Example: %s" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:584 +#: ../../Zotlabs/Module/Settings/Channel.php:606 msgid "Show new wall posts, private messages and connections under Notices" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:586 +#: ../../Zotlabs/Module/Settings/Channel.php:608 msgid "Notify me of events this many days in advance" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:586 +#: ../../Zotlabs/Module/Settings/Channel.php:608 msgid "Must be greater than 0" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:592 +#: ../../Zotlabs/Module/Settings/Channel.php:614 msgid "Advanced Account/Page Type Settings" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:593 +#: ../../Zotlabs/Module/Settings/Channel.php:615 msgid "Change the behaviour of this account for special situations" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:595 +#: ../../Zotlabs/Module/Settings/Channel.php:617 msgid "Miscellaneous Settings" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:596 +#: ../../Zotlabs/Module/Settings/Channel.php:618 msgid "Default photo upload folder" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:596 -#: ../../Zotlabs/Module/Settings/Channel.php:597 +#: ../../Zotlabs/Module/Settings/Channel.php:618 +#: ../../Zotlabs/Module/Settings/Channel.php:619 msgid "%Y - current year, %m - current month" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:597 +#: ../../Zotlabs/Module/Settings/Channel.php:619 msgid "Default file upload folder" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:599 +#: ../../Zotlabs/Module/Settings/Channel.php:621 msgid "Personal menu to display in your channel pages" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:601 +#: ../../Zotlabs/Module/Settings/Channel.php:623 msgid "Remove this channel." msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:602 +#: ../../Zotlabs/Module/Settings/Channel.php:624 msgid "Firefox Share $Projectname provider" msgstr "" -#: ../../Zotlabs/Module/Settings/Channel.php:603 +#: ../../Zotlabs/Module/Settings/Channel.php:625 msgid "Start calendar week on Monday" msgstr "" @@ -3887,93 +3976,93 @@ msgstr "" msgid "Their Settings" msgstr "" -#: ../../Zotlabs/Module/Settings/Oauth2.php:35 +#: ../../Zotlabs/Module/Settings/Oauth2.php:36 msgid "Name and Secret are required" msgstr "" -#: ../../Zotlabs/Module/Settings/Oauth2.php:83 +#: ../../Zotlabs/Module/Settings/Oauth2.php:84 msgid "Add OAuth2 application" msgstr "" -#: ../../Zotlabs/Module/Settings/Oauth2.php:86 -#: ../../Zotlabs/Module/Settings/Oauth2.php:114 +#: ../../Zotlabs/Module/Settings/Oauth2.php:87 +#: ../../Zotlabs/Module/Settings/Oauth2.php:115 #: ../../Zotlabs/Module/Settings/Oauth.php:90 msgid "Name of application" msgstr "" -#: ../../Zotlabs/Module/Settings/Oauth2.php:87 -#: ../../Zotlabs/Module/Settings/Oauth2.php:115 +#: ../../Zotlabs/Module/Settings/Oauth2.php:88 +#: ../../Zotlabs/Module/Settings/Oauth2.php:116 #: ../../Zotlabs/Module/Settings/Oauth.php:92 #: ../../Zotlabs/Module/Settings/Oauth.php:118 #: ../../addon/statusnet/statusnet.php:893 ../../addon/twitter/twitter.php:782 msgid "Consumer Secret" msgstr "" -#: ../../Zotlabs/Module/Settings/Oauth2.php:87 -#: ../../Zotlabs/Module/Settings/Oauth2.php:115 +#: ../../Zotlabs/Module/Settings/Oauth2.php:88 +#: ../../Zotlabs/Module/Settings/Oauth2.php:116 #: ../../Zotlabs/Module/Settings/Oauth.php:91 #: ../../Zotlabs/Module/Settings/Oauth.php:92 msgid "Automatically generated - change if desired. Max length 20" msgstr "" -#: ../../Zotlabs/Module/Settings/Oauth2.php:88 -#: ../../Zotlabs/Module/Settings/Oauth2.php:116 +#: ../../Zotlabs/Module/Settings/Oauth2.php:89 +#: ../../Zotlabs/Module/Settings/Oauth2.php:117 #: ../../Zotlabs/Module/Settings/Oauth.php:93 #: ../../Zotlabs/Module/Settings/Oauth.php:119 msgid "Redirect" msgstr "" -#: ../../Zotlabs/Module/Settings/Oauth2.php:88 -#: ../../Zotlabs/Module/Settings/Oauth2.php:116 +#: ../../Zotlabs/Module/Settings/Oauth2.php:89 +#: ../../Zotlabs/Module/Settings/Oauth2.php:117 #: ../../Zotlabs/Module/Settings/Oauth.php:93 msgid "" "Redirect URI - leave blank unless your application specifically requires this" msgstr "" -#: ../../Zotlabs/Module/Settings/Oauth2.php:89 -#: ../../Zotlabs/Module/Settings/Oauth2.php:117 +#: ../../Zotlabs/Module/Settings/Oauth2.php:90 +#: ../../Zotlabs/Module/Settings/Oauth2.php:118 msgid "Grant Types" msgstr "" -#: ../../Zotlabs/Module/Settings/Oauth2.php:89 #: ../../Zotlabs/Module/Settings/Oauth2.php:90 -#: ../../Zotlabs/Module/Settings/Oauth2.php:117 +#: ../../Zotlabs/Module/Settings/Oauth2.php:91 #: ../../Zotlabs/Module/Settings/Oauth2.php:118 +#: ../../Zotlabs/Module/Settings/Oauth2.php:119 msgid "leave blank unless your application sepcifically requires this" msgstr "" -#: ../../Zotlabs/Module/Settings/Oauth2.php:90 -#: ../../Zotlabs/Module/Settings/Oauth2.php:118 +#: ../../Zotlabs/Module/Settings/Oauth2.php:91 +#: ../../Zotlabs/Module/Settings/Oauth2.php:119 msgid "Authorization scope" msgstr "" -#: ../../Zotlabs/Module/Settings/Oauth2.php:102 +#: ../../Zotlabs/Module/Settings/Oauth2.php:103 msgid "OAuth2 Application not found." msgstr "" -#: ../../Zotlabs/Module/Settings/Oauth2.php:111 -#: ../../Zotlabs/Module/Settings/Oauth2.php:148 +#: ../../Zotlabs/Module/Settings/Oauth2.php:112 +#: ../../Zotlabs/Module/Settings/Oauth2.php:149 #: ../../Zotlabs/Module/Settings/Oauth.php:87 #: ../../Zotlabs/Module/Settings/Oauth.php:113 #: ../../Zotlabs/Module/Settings/Oauth.php:149 msgid "Add application" msgstr "" -#: ../../Zotlabs/Module/Settings/Oauth2.php:147 +#: ../../Zotlabs/Module/Settings/Oauth2.php:148 msgid "Connected OAuth2 Apps" msgstr "" -#: ../../Zotlabs/Module/Settings/Oauth2.php:151 +#: ../../Zotlabs/Module/Settings/Oauth2.php:152 #: ../../Zotlabs/Module/Settings/Oauth.php:152 msgid "Client key starts with" msgstr "" -#: ../../Zotlabs/Module/Settings/Oauth2.php:152 +#: ../../Zotlabs/Module/Settings/Oauth2.php:153 #: ../../Zotlabs/Module/Settings/Oauth.php:153 msgid "No name" msgstr "" -#: ../../Zotlabs/Module/Settings/Oauth2.php:153 +#: ../../Zotlabs/Module/Settings/Oauth2.php:154 #: ../../Zotlabs/Module/Settings/Oauth.php:154 msgid "Remove authorization" msgstr "" @@ -4212,7 +4301,7 @@ msgid "Icon url" msgstr "" #: ../../Zotlabs/Module/Settings/Oauth.php:94 -#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147 +#: ../../Zotlabs/Module/Sources.php:115 ../../Zotlabs/Module/Sources.php:150 msgid "Optional" msgstr "" @@ -4224,21 +4313,21 @@ msgstr "" msgid "Connected Apps" msgstr "" -#: ../../Zotlabs/Module/Embedphotos.php:140 ../../Zotlabs/Module/Photos.php:811 -#: ../../Zotlabs/Module/Photos.php:1350 ../../Zotlabs/Widget/Portfolio.php:87 +#: ../../Zotlabs/Module/Embedphotos.php:140 ../../Zotlabs/Module/Photos.php:816 +#: ../../Zotlabs/Module/Photos.php:1355 ../../Zotlabs/Widget/Portfolio.php:87 #: ../../Zotlabs/Widget/Album.php:78 msgid "View Photo" msgstr "" -#: ../../Zotlabs/Module/Embedphotos.php:156 ../../Zotlabs/Module/Photos.php:842 +#: ../../Zotlabs/Module/Embedphotos.php:156 ../../Zotlabs/Module/Photos.php:847 #: ../../Zotlabs/Widget/Portfolio.php:108 ../../Zotlabs/Widget/Album.php:95 msgid "Edit Album" msgstr "" -#: ../../Zotlabs/Module/Embedphotos.php:158 ../../Zotlabs/Module/Photos.php:712 -#: ../../Zotlabs/Module/Profile_photo.php:458 -#: ../../Zotlabs/Module/Cover_photo.php:362 -#: ../../Zotlabs/Storage/Browser.php:384 ../../Zotlabs/Widget/Cdav.php:133 +#: ../../Zotlabs/Module/Embedphotos.php:158 ../../Zotlabs/Module/Photos.php:717 +#: ../../Zotlabs/Module/Profile_photo.php:459 +#: ../../Zotlabs/Module/Cover_photo.php:395 +#: ../../Zotlabs/Storage/Browser.php:392 ../../Zotlabs/Widget/Cdav.php:133 #: ../../Zotlabs/Widget/Cdav.php:169 ../../Zotlabs/Widget/Portfolio.php:110 #: ../../Zotlabs/Widget/Album.php:97 msgid "Upload" @@ -4302,9 +4391,9 @@ msgid "URL for photo of thing (optional)" msgstr "" #: ../../Zotlabs/Module/Thing.php:319 ../../Zotlabs/Module/Thing.php:372 -#: ../../Zotlabs/Module/Photos.php:702 ../../Zotlabs/Module/Photos.php:1071 +#: ../../Zotlabs/Module/Photos.php:707 ../../Zotlabs/Module/Photos.php:1076 #: ../../Zotlabs/Module/Connedit.php:676 ../../Zotlabs/Module/Chat.php:235 -#: ../../Zotlabs/Module/Filestorage.php:147 ../../include/acl_selectors.php:123 +#: ../../Zotlabs/Module/Filestorage.php:170 ../../include/acl_selectors.php:123 msgid "Permissions" msgstr "" @@ -4312,11 +4401,11 @@ msgstr "" msgid "Add Thing to your Profile" msgstr "" -#: ../../Zotlabs/Module/Notify.php:61 ../../Zotlabs/Module/Notifications.php:57 +#: ../../Zotlabs/Module/Notify.php:61 ../../Zotlabs/Module/Notifications.php:55 msgid "No more system notifications." msgstr "" -#: ../../Zotlabs/Module/Notify.php:65 ../../Zotlabs/Module/Notifications.php:61 +#: ../../Zotlabs/Module/Notify.php:65 ../../Zotlabs/Module/Notifications.php:59 msgid "System Notifications" msgstr "" @@ -4324,52 +4413,56 @@ msgstr "" msgid "Connection added." msgstr "" -#: ../../Zotlabs/Module/Import.php:144 +#: ../../Zotlabs/Module/Import.php:146 #, php-format msgid "Your service plan only allows %d channels." msgstr "" -#: ../../Zotlabs/Module/Import.php:158 +#: ../../Zotlabs/Module/Import.php:173 msgid "No channel. Import failed." msgstr "" -#: ../../Zotlabs/Module/Import.php:482 +#: ../../Zotlabs/Module/Import.php:513 #: ../../addon/diaspora/import_diaspora.php:139 msgid "Import completed." msgstr "" -#: ../../Zotlabs/Module/Import.php:510 +#: ../../Zotlabs/Module/Import.php:541 msgid "You must be logged in to use this feature." msgstr "" -#: ../../Zotlabs/Module/Import.php:515 +#: ../../Zotlabs/Module/Import.php:546 msgid "Import Channel" msgstr "" -#: ../../Zotlabs/Module/Import.php:516 +#: ../../Zotlabs/Module/Import.php:547 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:518 +#: ../../Zotlabs/Module/Import.php:549 msgid "Or provide the old server/hub details" msgstr "" -#: ../../Zotlabs/Module/Import.php:519 +#: ../../Zotlabs/Module/Import.php:551 msgid "Your old identity address (xyz@example.com)" msgstr "" -#: ../../Zotlabs/Module/Import.php:520 +#: ../../Zotlabs/Module/Import.php:552 msgid "Your old login email address" msgstr "" -#: ../../Zotlabs/Module/Import.php:521 +#: ../../Zotlabs/Module/Import.php:553 msgid "Your old login password" msgstr "" -#: ../../Zotlabs/Module/Import.php:522 +#: ../../Zotlabs/Module/Import.php:554 +msgid "Import a few months of posts if possible (limited by available memory" +msgstr "" + +#: ../../Zotlabs/Module/Import.php:556 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 " @@ -4377,19 +4470,25 @@ msgid "" "location for files, photos, and media." msgstr "" -#: ../../Zotlabs/Module/Import.php:523 +#: ../../Zotlabs/Module/Import.php:558 msgid "Make this hub my primary location" msgstr "" -#: ../../Zotlabs/Module/Import.php:524 +#: ../../Zotlabs/Module/Import.php:559 msgid "Move this channel (disable all previous locations)" msgstr "" -#: ../../Zotlabs/Module/Import.php:525 -msgid "Import a few months of posts if possible (limited by available memory" +#: ../../Zotlabs/Module/Import.php:560 +msgid "Use this channel nickname instead of the one provided" +msgstr "" + +#: ../../Zotlabs/Module/Import.php:560 +msgid "" +"Leave blank to keep your existing channel nickname. You will be randomly " +"assigned a similar nickname if either name is already allocated on this site." msgstr "" -#: ../../Zotlabs/Module/Import.php:526 +#: ../../Zotlabs/Module/Import.php:562 msgid "" "This process may take several minutes to complete. Please submit the form " "only once and leave this page open until finished." @@ -4399,16 +4498,16 @@ msgstr "" msgid "Authentication failed." msgstr "" -#: ../../Zotlabs/Module/Rmagic.php:75 ../../boot.php:1590 -#: ../../include/channel.php:2318 +#: ../../Zotlabs/Module/Rmagic.php:75 ../../boot.php:1614 +#: ../../include/channel.php:2334 msgid "Remote Authentication" msgstr "" -#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:2319 +#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:2335 msgid "Enter your channel address (e.g. channel@example.com)" msgstr "" -#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:2320 +#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:2336 msgid "Authenticate" msgstr "" @@ -4416,7 +4515,7 @@ msgstr "" msgid "Permissions denied." msgstr "" -#: ../../Zotlabs/Module/Cal.php:344 ../../include/text.php:2446 +#: ../../Zotlabs/Module/Cal.php:344 ../../include/text.php:2482 msgid "Import" msgstr "" @@ -4450,15 +4549,15 @@ msgstr "" msgid "vcard" msgstr "" -#: ../../Zotlabs/Module/Apps.php:48 ../../Zotlabs/Lib/Apps.php:228 +#: ../../Zotlabs/Module/Apps.php:50 ../../Zotlabs/Lib/Apps.php:291 msgid "Apps" msgstr "" -#: ../../Zotlabs/Module/Apps.php:51 +#: ../../Zotlabs/Module/Apps.php:53 msgid "Manage apps" msgstr "" -#: ../../Zotlabs/Module/Apps.php:52 +#: ../../Zotlabs/Module/Apps.php:54 msgid "Create new app" msgstr "" @@ -4468,7 +4567,7 @@ msgctxt "mood" msgid "%1$s is %2$s" msgstr "" -#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:253 +#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:315 msgid "Mood" msgstr "" @@ -4506,9 +4605,9 @@ msgid "Archived/Unreachable" msgstr "" #: ../../Zotlabs/Module/Connections.php:80 -#: ../../Zotlabs/Module/Connections.php:89 ../../Zotlabs/Module/Menu.php:116 -#: ../../Zotlabs/Module/Notifications.php:52 -#: ../../include/conversation.php:1717 +#: ../../Zotlabs/Module/Connections.php:89 ../../Zotlabs/Module/Menu.php:179 +#: ../../Zotlabs/Module/Notifications.php:50 +#: ../../include/conversation.php:1726 msgid "New" msgstr "" @@ -4617,8 +4716,8 @@ msgstr "" msgid "Recent activity" msgstr "" -#: ../../Zotlabs/Module/Connections.php:331 ../../Zotlabs/Lib/Apps.php:235 -#: ../../include/text.php:973 +#: ../../Zotlabs/Module/Connections.php:331 ../../Zotlabs/Lib/Apps.php:298 +#: ../../include/text.php:975 msgid "Connections" msgstr "" @@ -4640,10 +4739,6 @@ msgstr "" msgid "item" msgstr "" -#: ../../Zotlabs/Module/Viewsrc.php:55 -msgid "Source of Item" -msgstr "" - #: ../../Zotlabs/Module/Bookmarks.php:56 msgid "Bookmark added" msgstr "" @@ -4688,7 +4783,7 @@ msgstr "" msgid "Page owner information could not be retrieved." msgstr "" -#: ../../Zotlabs/Module/Photos.php:94 ../../Zotlabs/Module/Photos.php:120 +#: ../../Zotlabs/Module/Photos.php:94 ../../Zotlabs/Module/Photos.php:113 msgid "Album not found." msgstr "" @@ -4696,190 +4791,190 @@ msgstr "" msgid "Delete Album" msgstr "" -#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1083 +#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1088 msgid "Delete Photo" msgstr "" -#: ../../Zotlabs/Module/Photos.php:551 +#: ../../Zotlabs/Module/Photos.php:556 msgid "No photos selected" msgstr "" -#: ../../Zotlabs/Module/Photos.php:600 +#: ../../Zotlabs/Module/Photos.php:605 msgid "Access to this item is restricted." msgstr "" -#: ../../Zotlabs/Module/Photos.php:646 +#: ../../Zotlabs/Module/Photos.php:651 #, php-format msgid "%1$.2f MB of %2$.2f MB photo storage used." msgstr "" -#: ../../Zotlabs/Module/Photos.php:649 +#: ../../Zotlabs/Module/Photos.php:654 #, php-format msgid "%1$.2f MB photo storage used." msgstr "" -#: ../../Zotlabs/Module/Photos.php:691 +#: ../../Zotlabs/Module/Photos.php:696 msgid "Upload Photos" msgstr "" -#: ../../Zotlabs/Module/Photos.php:695 +#: ../../Zotlabs/Module/Photos.php:700 msgid "Enter an album name" msgstr "" -#: ../../Zotlabs/Module/Photos.php:696 +#: ../../Zotlabs/Module/Photos.php:701 msgid "or select an existing album (doubleclick)" msgstr "" -#: ../../Zotlabs/Module/Photos.php:697 +#: ../../Zotlabs/Module/Photos.php:702 msgid "Create a status post for this upload" msgstr "" -#: ../../Zotlabs/Module/Photos.php:699 +#: ../../Zotlabs/Module/Photos.php:704 msgid "Description (optional)" msgstr "" -#: ../../Zotlabs/Module/Photos.php:785 +#: ../../Zotlabs/Module/Photos.php:790 msgid "Show Newest First" msgstr "" -#: ../../Zotlabs/Module/Photos.php:787 +#: ../../Zotlabs/Module/Photos.php:792 msgid "Show Oldest First" msgstr "" -#: ../../Zotlabs/Module/Photos.php:844 ../../Zotlabs/Module/Photos.php:1381 +#: ../../Zotlabs/Module/Photos.php:849 ../../Zotlabs/Module/Photos.php:1386 msgid "Add Photos" msgstr "" -#: ../../Zotlabs/Module/Photos.php:892 +#: ../../Zotlabs/Module/Photos.php:897 msgid "Permission denied. Access to this item may be restricted." msgstr "" -#: ../../Zotlabs/Module/Photos.php:894 +#: ../../Zotlabs/Module/Photos.php:899 msgid "Photo not available" msgstr "" -#: ../../Zotlabs/Module/Photos.php:952 +#: ../../Zotlabs/Module/Photos.php:957 msgid "Use as profile photo" msgstr "" -#: ../../Zotlabs/Module/Photos.php:953 +#: ../../Zotlabs/Module/Photos.php:958 msgid "Use as cover photo" msgstr "" -#: ../../Zotlabs/Module/Photos.php:960 +#: ../../Zotlabs/Module/Photos.php:965 msgid "Private Photo" msgstr "" -#: ../../Zotlabs/Module/Photos.php:975 +#: ../../Zotlabs/Module/Photos.php:980 msgid "View Full Size" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1057 +#: ../../Zotlabs/Module/Photos.php:1062 msgid "Edit photo" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1059 +#: ../../Zotlabs/Module/Photos.php:1064 msgid "Rotate CW (right)" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1060 +#: ../../Zotlabs/Module/Photos.php:1065 msgid "Rotate CCW (left)" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1063 +#: ../../Zotlabs/Module/Photos.php:1068 msgid "Move photo to album" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1064 +#: ../../Zotlabs/Module/Photos.php:1069 msgid "Enter a new album name" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1065 +#: ../../Zotlabs/Module/Photos.php:1070 msgid "or select an existing one (doubleclick)" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1070 +#: ../../Zotlabs/Module/Photos.php:1075 msgid "Add a Tag" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1078 +#: ../../Zotlabs/Module/Photos.php:1083 msgid "Example: @bob, @Barbara_Jensen, @jim@example.com" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1081 +#: ../../Zotlabs/Module/Photos.php:1086 msgid "Flag as adult in album view" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1100 ../../Zotlabs/Lib/ThreadItem.php:281 +#: ../../Zotlabs/Module/Photos.php:1105 ../../Zotlabs/Lib/ThreadItem.php:285 msgid "I like this (toggle)" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1101 ../../Zotlabs/Lib/ThreadItem.php:282 +#: ../../Zotlabs/Module/Photos.php:1106 ../../Zotlabs/Lib/ThreadItem.php:286 msgid "I don't like this (toggle)" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1103 ../../Zotlabs/Lib/ThreadItem.php:427 -#: ../../include/conversation.php:785 +#: ../../Zotlabs/Module/Photos.php:1108 ../../Zotlabs/Lib/ThreadItem.php:432 +#: ../../include/conversation.php:787 msgid "Please wait" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1119 ../../Zotlabs/Module/Photos.php:1237 -#: ../../Zotlabs/Lib/ThreadItem.php:749 +#: ../../Zotlabs/Module/Photos.php:1124 ../../Zotlabs/Module/Photos.php:1242 +#: ../../Zotlabs/Lib/ThreadItem.php:754 msgid "This is you" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1121 ../../Zotlabs/Module/Photos.php:1239 -#: ../../Zotlabs/Lib/ThreadItem.php:751 ../../include/js_strings.php:6 +#: ../../Zotlabs/Module/Photos.php:1126 ../../Zotlabs/Module/Photos.php:1244 +#: ../../Zotlabs/Lib/ThreadItem.php:756 ../../include/js_strings.php:6 msgid "Comment" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1137 ../../include/conversation.php:618 +#: ../../Zotlabs/Module/Photos.php:1142 ../../include/conversation.php:619 msgctxt "title" msgid "Likes" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1137 ../../include/conversation.php:618 +#: ../../Zotlabs/Module/Photos.php:1142 ../../include/conversation.php:619 msgctxt "title" msgid "Dislikes" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1138 ../../include/conversation.php:619 +#: ../../Zotlabs/Module/Photos.php:1143 ../../include/conversation.php:620 msgctxt "title" msgid "Agree" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1138 ../../include/conversation.php:619 +#: ../../Zotlabs/Module/Photos.php:1143 ../../include/conversation.php:620 msgctxt "title" msgid "Disagree" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1138 ../../include/conversation.php:619 +#: ../../Zotlabs/Module/Photos.php:1143 ../../include/conversation.php:620 msgctxt "title" msgid "Abstain" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1139 ../../include/conversation.php:620 +#: ../../Zotlabs/Module/Photos.php:1144 ../../include/conversation.php:621 msgctxt "title" msgid "Attending" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1139 ../../include/conversation.php:620 +#: ../../Zotlabs/Module/Photos.php:1144 ../../include/conversation.php:621 msgctxt "title" msgid "Not attending" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1139 ../../include/conversation.php:620 +#: ../../Zotlabs/Module/Photos.php:1144 ../../include/conversation.php:621 msgctxt "title" msgid "Might attend" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1156 ../../Zotlabs/Module/Photos.php:1168 -#: ../../Zotlabs/Lib/ThreadItem.php:201 ../../Zotlabs/Lib/ThreadItem.php:213 +#: ../../Zotlabs/Module/Photos.php:1161 ../../Zotlabs/Module/Photos.php:1173 +#: ../../Zotlabs/Lib/ThreadItem.php:212 ../../Zotlabs/Lib/ThreadItem.php:224 msgid "View all" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1160 ../../Zotlabs/Lib/ThreadItem.php:205 -#: ../../include/conversation.php:1981 ../../include/channel.php:1539 +#: ../../Zotlabs/Module/Photos.php:1165 ../../Zotlabs/Lib/ThreadItem.php:216 +#: ../../include/conversation.php:1990 ../../include/channel.php:1539 #: ../../include/taxonomy.php:661 msgctxt "noun" msgid "Like" @@ -4887,56 +4982,58 @@ msgid_plural "Likes" msgstr[0] "" msgstr[1] "" -#: ../../Zotlabs/Module/Photos.php:1165 ../../Zotlabs/Lib/ThreadItem.php:210 -#: ../../include/conversation.php:1984 +#: ../../Zotlabs/Module/Photos.php:1170 ../../Zotlabs/Lib/ThreadItem.php:221 +#: ../../include/conversation.php:1993 msgctxt "noun" msgid "Dislike" msgid_plural "Dislikes" msgstr[0] "" msgstr[1] "" -#: ../../Zotlabs/Module/Photos.php:1265 +#: ../../Zotlabs/Module/Photos.php:1270 msgid "Photo Tools" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1274 +#: ../../Zotlabs/Module/Photos.php:1279 msgid "In This Photo:" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1279 +#: ../../Zotlabs/Module/Photos.php:1284 msgid "Map" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1287 ../../Zotlabs/Lib/ThreadItem.php:415 +#: ../../Zotlabs/Module/Photos.php:1292 ../../Zotlabs/Lib/ThreadItem.php:420 msgctxt "noun" msgid "Likes" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1288 ../../Zotlabs/Lib/ThreadItem.php:416 +#: ../../Zotlabs/Module/Photos.php:1293 ../../Zotlabs/Lib/ThreadItem.php:421 msgctxt "noun" msgid "Dislikes" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1293 ../../Zotlabs/Lib/ThreadItem.php:421 +#: ../../Zotlabs/Module/Photos.php:1298 ../../Zotlabs/Lib/ThreadItem.php:426 #: ../../include/acl_selectors.php:125 msgid "Close" msgstr "" -#: ../../Zotlabs/Module/Photos.php:1365 ../../Zotlabs/Module/Photos.php:1378 -#: ../../Zotlabs/Module/Photos.php:1379 ../../include/photos.php:667 +#: ../../Zotlabs/Module/Photos.php:1370 ../../Zotlabs/Module/Photos.php:1383 +#: ../../Zotlabs/Module/Photos.php:1384 ../../include/photos.php:668 msgid "Recent Photos" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:30 ../../addon/cart/cart.php:1135 +#: ../../Zotlabs/Module/Wiki.php:30 ../../addon/cart/cart.php:1293 msgid "Profile Unavailable." msgstr "" -#: ../../Zotlabs/Module/Wiki.php:44 ../../Zotlabs/Module/Cloud.php:114 +#: ../../Zotlabs/Module/Wiki.php:44 ../../Zotlabs/Module/Cloud.php:123 msgid "Not found" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:68 ../../addon/cart/myshop.php:114 -#: ../../addon/cart/cart.php:1204 ../../addon/cart/manual_payments.php:58 +#: ../../Zotlabs/Module/Wiki.php:68 ../../addon/cart/myshop.php:51 +#: ../../addon/cart/cart.php:1420 +#: ../../addon/cart/submodules/paypalbutton.php:481 +#: ../../addon/cart/manual_payments.php:62 msgid "Invalid channel" msgstr "" @@ -4952,8 +5049,8 @@ msgstr "" msgid "Error downloading wiki: " msgstr "" -#: ../../Zotlabs/Module/Wiki.php:197 ../../include/conversation.php:1928 -#: ../../include/nav.php:494 +#: ../../Zotlabs/Module/Wiki.php:197 ../../include/conversation.php:1937 +#: ../../include/nav.php:486 msgid "Wikis" msgstr "" @@ -4977,22 +5074,22 @@ msgstr "" #: ../../Zotlabs/Module/Wiki.php:208 ../../Zotlabs/Module/Wiki.php:350 #: ../../Zotlabs/Widget/Wiki_pages.php:36 #: ../../Zotlabs/Widget/Wiki_pages.php:93 ../../addon/mdpost/mdpost.php:40 -#: ../../include/text.php:1869 +#: ../../include/text.php:1886 msgid "Markdown" msgstr "" #: ../../Zotlabs/Module/Wiki.php:208 ../../Zotlabs/Module/Wiki.php:350 #: ../../Zotlabs/Widget/Wiki_pages.php:36 -#: ../../Zotlabs/Widget/Wiki_pages.php:93 ../../include/text.php:1867 +#: ../../Zotlabs/Widget/Wiki_pages.php:93 ../../include/text.php:1884 msgid "BBcode" msgstr "" #: ../../Zotlabs/Module/Wiki.php:208 ../../Zotlabs/Widget/Wiki_pages.php:36 -#: ../../Zotlabs/Widget/Wiki_pages.php:93 ../../include/text.php:1870 +#: ../../Zotlabs/Widget/Wiki_pages.php:93 ../../include/text.php:1887 msgid "Text" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:210 ../../Zotlabs/Storage/Browser.php:284 +#: ../../Zotlabs/Module/Wiki.php:210 ../../Zotlabs/Storage/Browser.php:286 msgid "Type" msgstr "" @@ -5048,47 +5145,47 @@ msgstr "" msgid "New page name" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:377 ../../include/conversation.php:1282 +#: ../../Zotlabs/Module/Wiki.php:377 msgid "Embed image from photo albums" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:378 ../../include/conversation.php:1388 +#: ../../Zotlabs/Module/Wiki.php:378 ../../include/conversation.php:1396 msgid "Embed an image from your albums" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:380 ../../Zotlabs/Module/Profile_photo.php:465 -#: ../../Zotlabs/Module/Cover_photo.php:367 ../../include/conversation.php:1390 -#: ../../include/conversation.php:1437 +#: ../../Zotlabs/Module/Wiki.php:380 ../../Zotlabs/Module/Profile_photo.php:466 +#: ../../Zotlabs/Module/Cover_photo.php:400 ../../include/conversation.php:1398 +#: ../../include/conversation.php:1445 msgid "OK" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:381 ../../Zotlabs/Module/Profile_photo.php:466 -#: ../../Zotlabs/Module/Cover_photo.php:368 ../../include/conversation.php:1320 +#: ../../Zotlabs/Module/Wiki.php:381 ../../Zotlabs/Module/Profile_photo.php:467 +#: ../../Zotlabs/Module/Cover_photo.php:401 ../../include/conversation.php:1327 msgid "Choose images to embed" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:382 ../../Zotlabs/Module/Profile_photo.php:467 -#: ../../Zotlabs/Module/Cover_photo.php:369 ../../include/conversation.php:1321 +#: ../../Zotlabs/Module/Wiki.php:382 ../../Zotlabs/Module/Profile_photo.php:468 +#: ../../Zotlabs/Module/Cover_photo.php:402 ../../include/conversation.php:1328 msgid "Choose an album" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:383 ../../Zotlabs/Module/Profile_photo.php:468 -#: ../../Zotlabs/Module/Cover_photo.php:370 +#: ../../Zotlabs/Module/Wiki.php:383 ../../Zotlabs/Module/Profile_photo.php:469 +#: ../../Zotlabs/Module/Cover_photo.php:403 msgid "Choose a different album" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:384 ../../Zotlabs/Module/Profile_photo.php:469 -#: ../../Zotlabs/Module/Cover_photo.php:371 ../../include/conversation.php:1323 +#: ../../Zotlabs/Module/Wiki.php:384 ../../Zotlabs/Module/Profile_photo.php:470 +#: ../../Zotlabs/Module/Cover_photo.php:404 ../../include/conversation.php:1330 msgid "Error getting album list" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:385 ../../Zotlabs/Module/Profile_photo.php:470 -#: ../../Zotlabs/Module/Cover_photo.php:372 ../../include/conversation.php:1324 +#: ../../Zotlabs/Module/Wiki.php:385 ../../Zotlabs/Module/Profile_photo.php:471 +#: ../../Zotlabs/Module/Cover_photo.php:405 ../../include/conversation.php:1331 msgid "Error getting photo link" msgstr "" -#: ../../Zotlabs/Module/Wiki.php:386 ../../Zotlabs/Module/Profile_photo.php:471 -#: ../../Zotlabs/Module/Cover_photo.php:373 ../../include/conversation.php:1325 +#: ../../Zotlabs/Module/Wiki.php:386 ../../Zotlabs/Module/Profile_photo.php:472 +#: ../../Zotlabs/Module/Cover_photo.php:406 ../../include/conversation.php:1332 msgid "Error getting album" msgstr "" @@ -5188,8 +5285,8 @@ msgstr "" msgid "System layout" msgstr "" -#: ../../Zotlabs/Module/Poke.php:182 ../../Zotlabs/Lib/Apps.php:254 -#: ../../include/conversation.php:1092 +#: ../../Zotlabs/Module/Poke.php:182 ../../Zotlabs/Lib/Apps.php:316 +#: ../../include/conversation.php:1097 msgid "Poke" msgstr "" @@ -5218,7 +5315,7 @@ msgid "Make this post private" msgstr "" #: ../../Zotlabs/Module/Profile_photo.php:66 -#: ../../Zotlabs/Module/Cover_photo.php:56 +#: ../../Zotlabs/Module/Cover_photo.php:57 msgid "Image uploaded but image cropping failed." msgstr "" @@ -5229,7 +5326,7 @@ msgid "Profile Photos" msgstr "" #: ../../Zotlabs/Module/Profile_photo.php:142 -#: ../../Zotlabs/Module/Cover_photo.php:159 +#: ../../Zotlabs/Module/Cover_photo.php:191 msgid "Image resize failed." msgstr "" @@ -5241,73 +5338,85 @@ msgid "" msgstr "" #: ../../Zotlabs/Module/Profile_photo.php:225 -#: ../../Zotlabs/Module/Cover_photo.php:173 ../../include/photos.php:195 +#: ../../Zotlabs/Module/Cover_photo.php:205 ../../include/photos.php:196 msgid "Unable to process image" msgstr "" #: ../../Zotlabs/Module/Profile_photo.php:260 -#: ../../Zotlabs/Module/Cover_photo.php:197 +#: ../../Zotlabs/Module/Cover_photo.php:229 msgid "Image upload failed." msgstr "" #: ../../Zotlabs/Module/Profile_photo.php:279 -#: ../../Zotlabs/Module/Cover_photo.php:214 +#: ../../Zotlabs/Module/Cover_photo.php:246 msgid "Unable to process image." msgstr "" #: ../../Zotlabs/Module/Profile_photo.php:343 #: ../../Zotlabs/Module/Profile_photo.php:390 -#: ../../Zotlabs/Module/Cover_photo.php:307 -#: ../../Zotlabs/Module/Cover_photo.php:322 +#: ../../Zotlabs/Module/Cover_photo.php:339 +#: ../../Zotlabs/Module/Cover_photo.php:354 msgid "Photo not available." msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:455 -#: ../../Zotlabs/Module/Cover_photo.php:359 -msgid "Upload File:" +#: ../../Zotlabs/Module/Profile_photo.php:454 +msgid "" +"Your default profile photo is visible to anybody on the internet. Profile " +"photos for alternate profiles will inherit the permissions of the profile" +msgstr "" + +#: ../../Zotlabs/Module/Profile_photo.php:454 +msgid "" +"Your profile photo is visible to anybody on the internet and may be " +"distributed to other websites." msgstr "" #: ../../Zotlabs/Module/Profile_photo.php:456 -#: ../../Zotlabs/Module/Cover_photo.php:360 -msgid "Select a profile:" +#: ../../Zotlabs/Module/Cover_photo.php:392 +msgid "Upload File:" msgstr "" #: ../../Zotlabs/Module/Profile_photo.php:457 +#: ../../Zotlabs/Module/Cover_photo.php:393 +msgid "Select a profile:" +msgstr "" + +#: ../../Zotlabs/Module/Profile_photo.php:458 msgid "Use Photo for Profile" msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:457 +#: ../../Zotlabs/Module/Profile_photo.php:458 msgid "Change Profile Photo" msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:458 +#: ../../Zotlabs/Module/Profile_photo.php:459 msgid "Use" msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:462 #: ../../Zotlabs/Module/Profile_photo.php:463 -#: ../../Zotlabs/Module/Cover_photo.php:364 -#: ../../Zotlabs/Module/Cover_photo.php:365 +#: ../../Zotlabs/Module/Profile_photo.php:464 +#: ../../Zotlabs/Module/Cover_photo.php:397 +#: ../../Zotlabs/Module/Cover_photo.php:398 msgid "Use a photo from your albums" msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:473 -#: ../../Zotlabs/Module/Cover_photo.php:376 +#: ../../Zotlabs/Module/Profile_photo.php:474 +#: ../../Zotlabs/Module/Cover_photo.php:409 msgid "Select existing photo" msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:492 -#: ../../Zotlabs/Module/Cover_photo.php:393 +#: ../../Zotlabs/Module/Profile_photo.php:493 +#: ../../Zotlabs/Module/Cover_photo.php:426 msgid "Crop Image" msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:493 -#: ../../Zotlabs/Module/Cover_photo.php:394 +#: ../../Zotlabs/Module/Profile_photo.php:494 +#: ../../Zotlabs/Module/Cover_photo.php:427 msgid "Please adjust the image cropping for optimum viewing." msgstr "" -#: ../../Zotlabs/Module/Profile_photo.php:495 -#: ../../Zotlabs/Module/Cover_photo.php:396 +#: ../../Zotlabs/Module/Profile_photo.php:496 +#: ../../Zotlabs/Module/Cover_photo.php:429 msgid "Done Editing" msgstr "" @@ -5327,60 +5436,68 @@ msgstr "" msgid "Empty post discarded." msgstr "" -#: ../../Zotlabs/Module/Item.php:874 +#: ../../Zotlabs/Module/Item.php:864 msgid "Duplicate post suppressed." msgstr "" -#: ../../Zotlabs/Module/Item.php:1019 +#: ../../Zotlabs/Module/Item.php:1009 msgid "System error. Post not saved." msgstr "" -#: ../../Zotlabs/Module/Item.php:1055 +#: ../../Zotlabs/Module/Item.php:1045 msgid "Your comment is awaiting approval." msgstr "" -#: ../../Zotlabs/Module/Item.php:1160 +#: ../../Zotlabs/Module/Item.php:1162 msgid "Unable to obtain post information from database." msgstr "" -#: ../../Zotlabs/Module/Item.php:1189 +#: ../../Zotlabs/Module/Item.php:1191 #, php-format msgid "You have reached your limit of %1$.0f top level posts." msgstr "" -#: ../../Zotlabs/Module/Item.php:1196 +#: ../../Zotlabs/Module/Item.php:1198 #, php-format msgid "You have reached your limit of %1$.0f webpages." msgstr "" -#: ../../Zotlabs/Module/Ping.php:330 +#: ../../Zotlabs/Module/Ping.php:332 msgid "sent you a private message" msgstr "" -#: ../../Zotlabs/Module/Ping.php:383 +#: ../../Zotlabs/Module/Ping.php:385 msgid "added your channel" msgstr "" -#: ../../Zotlabs/Module/Ping.php:407 +#: ../../Zotlabs/Module/Ping.php:409 msgid "requires approval" msgstr "" -#: ../../Zotlabs/Module/Ping.php:417 +#: ../../Zotlabs/Module/Ping.php:419 msgid "g A l F d" msgstr "" -#: ../../Zotlabs/Module/Ping.php:435 +#: ../../Zotlabs/Module/Ping.php:437 msgid "[today]" msgstr "" -#: ../../Zotlabs/Module/Ping.php:444 +#: ../../Zotlabs/Module/Ping.php:446 msgid "posted an event" msgstr "" -#: ../../Zotlabs/Module/Ping.php:477 +#: ../../Zotlabs/Module/Ping.php:479 msgid "shared a file with you" msgstr "" +#: ../../Zotlabs/Module/Ping.php:654 +msgid "Private forum" +msgstr "" + +#: ../../Zotlabs/Module/Ping.php:654 +msgid "Public forum" +msgstr "" + #: ../../Zotlabs/Module/Page.php:39 ../../Zotlabs/Module/Block.php:29 msgid "Invalid item." msgstr "" @@ -5441,9 +5558,9 @@ msgstr "" msgid "Connection has been removed." msgstr "" -#: ../../Zotlabs/Module/Connedit.php:594 ../../Zotlabs/Lib/Apps.php:247 +#: ../../Zotlabs/Module/Connedit.php:594 ../../Zotlabs/Lib/Apps.php:309 #: ../../addon/openclipatar/openclipatar.php:57 -#: ../../include/conversation.php:1032 ../../include/nav.php:114 +#: ../../include/conversation.php:1037 ../../include/nav.php:108 msgid "View Profile" msgstr "" @@ -5468,7 +5585,7 @@ msgstr "" msgid "Fetch updated photo" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:615 ../../include/conversation.php:1042 +#: ../../Zotlabs/Module/Connedit.php:615 ../../include/conversation.php:1047 msgid "Recent Activity" msgstr "" @@ -5616,7 +5733,7 @@ msgstr "" msgid "Connection Default Permissions" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:850 ../../include/items.php:4214 +#: ../../Zotlabs/Module/Connedit.php:850 ../../include/items.php:4158 #, php-format msgid "Connection: %s" msgstr "" @@ -5633,11 +5750,6 @@ msgstr "" msgid "Permission role" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:852 ../../Zotlabs/Module/Defperms.php:240 -#: ../../Zotlabs/Widget/Notifications.php:151 ../../include/nav.php:284 -msgid "Loading" -msgstr "" - #: ../../Zotlabs/Module/Connedit.php:853 ../../Zotlabs/Module/Defperms.php:241 msgid "Add permission role" msgstr "" @@ -5685,12 +5797,6 @@ msgstr "" msgid "Only import posts with this text" msgstr "" -#: ../../Zotlabs/Module/Connedit.php:875 ../../Zotlabs/Module/Connedit.php:876 -msgid "" -"words one per line or #tags or /patterns/ or lang=xx, leave blank to import " -"all posts" -msgstr "" - #: ../../Zotlabs/Module/Connedit.php:876 msgid "Do not import posts with this text" msgstr "" @@ -5751,13 +5857,13 @@ msgid "Bookmark this room" msgstr "" #: ../../Zotlabs/Module/Chat.php:205 ../../Zotlabs/Module/Mail.php:241 -#: ../../Zotlabs/Module/Mail.php:362 ../../include/conversation.php:1315 +#: ../../Zotlabs/Module/Mail.php:362 ../../include/conversation.php:1322 msgid "Please enter a link URL:" msgstr "" #: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Module/Mail.php:294 -#: ../../Zotlabs/Module/Mail.php:436 ../../Zotlabs/Lib/ThreadItem.php:766 -#: ../../include/conversation.php:1435 +#: ../../Zotlabs/Module/Mail.php:436 ../../Zotlabs/Lib/ThreadItem.php:771 +#: ../../include/conversation.php:1443 msgid "Encrypt text" msgstr "" @@ -5790,111 +5896,111 @@ msgstr "" msgid "min" msgstr "" -#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:248 -#: ../../include/conversation.php:1834 ../../include/nav.php:401 +#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:310 +#: ../../include/conversation.php:1843 ../../include/nav.php:393 msgid "Photos" msgstr "" -#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:243 -#: ../../Zotlabs/Storage/Browser.php:272 ../../include/conversation.php:1842 -#: ../../include/nav.php:409 +#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:305 +#: ../../Zotlabs/Storage/Browser.php:272 ../../include/conversation.php:1851 +#: ../../include/nav.php:401 msgid "Files" msgstr "" -#: ../../Zotlabs/Module/Menu.php:49 +#: ../../Zotlabs/Module/Menu.php:67 msgid "Unable to update menu." msgstr "" -#: ../../Zotlabs/Module/Menu.php:60 +#: ../../Zotlabs/Module/Menu.php:78 msgid "Unable to create menu." msgstr "" -#: ../../Zotlabs/Module/Menu.php:98 ../../Zotlabs/Module/Menu.php:110 +#: ../../Zotlabs/Module/Menu.php:160 ../../Zotlabs/Module/Menu.php:173 msgid "Menu Name" msgstr "" -#: ../../Zotlabs/Module/Menu.php:98 +#: ../../Zotlabs/Module/Menu.php:160 msgid "Unique name (not visible on webpage) - required" msgstr "" -#: ../../Zotlabs/Module/Menu.php:99 ../../Zotlabs/Module/Menu.php:111 +#: ../../Zotlabs/Module/Menu.php:161 ../../Zotlabs/Module/Menu.php:174 msgid "Menu Title" msgstr "" -#: ../../Zotlabs/Module/Menu.php:99 +#: ../../Zotlabs/Module/Menu.php:161 msgid "Visible on webpage - leave empty for no title" msgstr "" -#: ../../Zotlabs/Module/Menu.php:100 +#: ../../Zotlabs/Module/Menu.php:162 msgid "Allow Bookmarks" msgstr "" -#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157 +#: ../../Zotlabs/Module/Menu.php:162 ../../Zotlabs/Module/Menu.php:221 msgid "Menu may be used to store saved bookmarks" msgstr "" -#: ../../Zotlabs/Module/Menu.php:101 ../../Zotlabs/Module/Menu.php:159 +#: ../../Zotlabs/Module/Menu.php:163 ../../Zotlabs/Module/Menu.php:224 msgid "Submit and proceed" msgstr "" -#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2423 +#: ../../Zotlabs/Module/Menu.php:170 ../../include/text.php:2459 msgid "Menus" msgstr "" -#: ../../Zotlabs/Module/Menu.php:117 +#: ../../Zotlabs/Module/Menu.php:180 msgid "Bookmarks allowed" msgstr "" -#: ../../Zotlabs/Module/Menu.php:119 +#: ../../Zotlabs/Module/Menu.php:182 msgid "Delete this menu" msgstr "" -#: ../../Zotlabs/Module/Menu.php:120 ../../Zotlabs/Module/Menu.php:154 +#: ../../Zotlabs/Module/Menu.php:183 ../../Zotlabs/Module/Menu.php:218 msgid "Edit menu contents" msgstr "" -#: ../../Zotlabs/Module/Menu.php:121 +#: ../../Zotlabs/Module/Menu.php:184 msgid "Edit this menu" msgstr "" -#: ../../Zotlabs/Module/Menu.php:136 +#: ../../Zotlabs/Module/Menu.php:200 msgid "Menu could not be deleted." msgstr "" -#: ../../Zotlabs/Module/Menu.php:149 +#: ../../Zotlabs/Module/Menu.php:213 msgid "Edit Menu" msgstr "" -#: ../../Zotlabs/Module/Menu.php:153 +#: ../../Zotlabs/Module/Menu.php:217 msgid "Add or remove entries to this menu" msgstr "" -#: ../../Zotlabs/Module/Menu.php:155 +#: ../../Zotlabs/Module/Menu.php:219 msgid "Menu name" msgstr "" -#: ../../Zotlabs/Module/Menu.php:155 +#: ../../Zotlabs/Module/Menu.php:219 msgid "Must be unique, only seen by you" msgstr "" -#: ../../Zotlabs/Module/Menu.php:156 +#: ../../Zotlabs/Module/Menu.php:220 msgid "Menu title" msgstr "" -#: ../../Zotlabs/Module/Menu.php:156 +#: ../../Zotlabs/Module/Menu.php:220 msgid "Menu title as seen by others" msgstr "" -#: ../../Zotlabs/Module/Menu.php:157 +#: ../../Zotlabs/Module/Menu.php:221 msgid "Allow bookmarks" msgstr "" -#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2424 +#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2460 msgid "Layouts" msgstr "" -#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Lib/Apps.php:251 -#: ../../include/nav.php:176 ../../include/nav.php:280 +#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Lib/Apps.php:313 +#: ../../include/nav.php:170 ../../include/nav.php:272 #: ../../include/help.php:68 ../../include/help.php:74 msgid "Help" msgstr "" @@ -5911,11 +6017,11 @@ msgstr "" msgid "Download PDL file" msgstr "" -#: ../../Zotlabs/Module/Cloud.php:120 +#: ../../Zotlabs/Module/Cloud.php:129 msgid "Please refresh page" msgstr "" -#: ../../Zotlabs/Module/Cloud.php:123 +#: ../../Zotlabs/Module/Cloud.php:132 msgid "Unknown error" msgstr "" @@ -5949,12 +6055,12 @@ msgid "Post not found." msgstr "" #: ../../Zotlabs/Module/Tagger.php:77 ../../include/markdown.php:160 -#: ../../include/bbcode.php:352 +#: ../../include/bbcode.php:354 msgid "post" msgstr "" #: ../../Zotlabs/Module/Tagger.php:79 ../../include/conversation.php:146 -#: ../../include/text.php:2013 +#: ../../include/text.php:2030 msgid "comment" msgstr "" @@ -5978,11 +6084,6 @@ msgid "" "to correctly use this feature." msgstr "" -#: ../../Zotlabs/Module/Defperms.php:239 -msgid "" -"If enabled, connection requests will be approved without your interaction" -msgstr "" - #: ../../Zotlabs/Module/Defperms.php:246 msgid "Automatic approval settings" msgstr "" @@ -6010,57 +6111,76 @@ msgstr "" msgid "Allow" msgstr "" -#: ../../Zotlabs/Module/Group.php:24 +#: ../../Zotlabs/Module/Group.php:35 msgid "Privacy group created." msgstr "" -#: ../../Zotlabs/Module/Group.php:30 +#: ../../Zotlabs/Module/Group.php:38 msgid "Could not create privacy group." msgstr "" -#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:143 -#: ../../include/items.php:4181 +#: ../../Zotlabs/Module/Group.php:51 ../../Zotlabs/Module/Group.php:181 +#: ../../include/items.php:4125 msgid "Privacy group not found." msgstr "" -#: ../../Zotlabs/Module/Group.php:58 +#: ../../Zotlabs/Module/Group.php:67 msgid "Privacy group updated." msgstr "" -#: ../../Zotlabs/Module/Group.php:92 -msgid "Create a group of channels." +#: ../../Zotlabs/Module/Group.php:113 ../../Zotlabs/Module/Group.php:124 +#: ../../Zotlabs/Widget/Activity_filter.php:68 ../../include/features.php:221 +#: ../../include/nav.php:97 ../../include/group.php:320 +msgid "Privacy Groups" msgstr "" -#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:186 -msgid "Privacy group name: " +#: ../../Zotlabs/Module/Group.php:114 +msgid "Add Group" msgstr "" -#: ../../Zotlabs/Module/Group.php:95 ../../Zotlabs/Module/Group.php:189 +#: ../../Zotlabs/Module/Group.php:118 +msgid "Privacy group name" +msgstr "" + +#: ../../Zotlabs/Module/Group.php:119 ../../Zotlabs/Module/Group.php:220 msgid "Members are visible to other channels" msgstr "" -#: ../../Zotlabs/Module/Group.php:113 +#: ../../Zotlabs/Module/Group.php:126 ../../Zotlabs/Module/Help.php:81 +msgid "Members" +msgstr "" + +#: ../../Zotlabs/Module/Group.php:151 msgid "Privacy group removed." msgstr "" -#: ../../Zotlabs/Module/Group.php:115 +#: ../../Zotlabs/Module/Group.php:153 msgid "Unable to remove privacy group." msgstr "" -#: ../../Zotlabs/Module/Group.php:185 -msgid "Privacy group editor" +#: ../../Zotlabs/Module/Group.php:215 +#, php-format +msgid "Privacy Group: %s" msgstr "" -#: ../../Zotlabs/Module/Group.php:199 ../../Zotlabs/Module/Help.php:81 -msgid "Members" +#: ../../Zotlabs/Module/Group.php:217 +msgid "Privacy group name: " msgstr "" -#: ../../Zotlabs/Module/Group.php:201 -msgid "All Connected Channels" +#: ../../Zotlabs/Module/Group.php:222 +msgid "Delete Group" msgstr "" -#: ../../Zotlabs/Module/Group.php:233 -msgid "Click on a channel to add or remove." +#: ../../Zotlabs/Module/Group.php:232 +msgid "Group members" +msgstr "" + +#: ../../Zotlabs/Module/Group.php:234 +msgid "Not in this group" +msgstr "" + +#: ../../Zotlabs/Module/Group.php:266 +msgid "Click a channel to toggle membership" msgstr "" #: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:184 @@ -6186,7 +6306,7 @@ msgstr "" msgid "Add profile things" msgstr "" -#: ../../Zotlabs/Module/Profiles.php:733 ../../include/conversation.php:1708 +#: ../../Zotlabs/Module/Profiles.php:733 ../../include/conversation.php:1717 msgid "Personal" msgstr "" @@ -6337,7 +6457,7 @@ msgid "Profile Image" msgstr "" #: ../../Zotlabs/Module/Profiles.php:830 ../../include/channel.php:1296 -#: ../../include/nav.php:117 +#: ../../include/nav.php:111 msgid "Edit Profiles" msgstr "" @@ -6416,8 +6536,8 @@ msgstr "" msgid "Create a new channel" msgstr "" -#: ../../Zotlabs/Module/Manage.php:170 ../../Zotlabs/Lib/Apps.php:240 -#: ../../include/nav.php:102 ../../include/nav.php:190 +#: ../../Zotlabs/Module/Manage.php:170 ../../Zotlabs/Lib/Apps.php:302 +#: ../../include/nav.php:94 msgid "Channel Manager" msgstr "" @@ -6452,8 +6572,8 @@ msgid "Delegated Channel" msgstr "" #: ../../Zotlabs/Module/Cards.php:42 ../../Zotlabs/Module/Cards.php:194 -#: ../../Zotlabs/Lib/Apps.php:230 ../../include/conversation.php:1893 -#: ../../include/features.php:123 ../../include/nav.php:458 +#: ../../Zotlabs/Lib/Apps.php:293 ../../include/conversation.php:1902 +#: ../../include/features.php:123 ../../include/nav.php:450 msgid "Cards" msgstr "" @@ -6465,45 +6585,49 @@ msgstr "" msgid "This directory server requires an access token" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:18 +#: ../../Zotlabs/Module/Siteinfo.php:21 msgid "About this site" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:19 +#: ../../Zotlabs/Module/Siteinfo.php:22 msgid "Site Name" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:23 +#: ../../Zotlabs/Module/Siteinfo.php:26 msgid "Administrator" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:25 ../../Zotlabs/Module/Register.php:232 +#: ../../Zotlabs/Module/Siteinfo.php:28 ../../Zotlabs/Module/Register.php:241 msgid "Terms of Service" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:26 +#: ../../Zotlabs/Module/Siteinfo.php:29 msgid "Software and Project information" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:27 +#: ../../Zotlabs/Module/Siteinfo.php:30 msgid "This site is powered by $Projectname" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:28 +#: ../../Zotlabs/Module/Siteinfo.php:31 msgid "" "Federated and decentralised networking and identity services provided by Zot" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:30 +#: ../../Zotlabs/Module/Siteinfo.php:34 +msgid "Additional federated transport protocols:" +msgstr "" + +#: ../../Zotlabs/Module/Siteinfo.php:36 #, php-format msgid "Version %s" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:31 +#: ../../Zotlabs/Module/Siteinfo.php:37 msgid "Project homepage" msgstr "" -#: ../../Zotlabs/Module/Siteinfo.php:32 +#: ../../Zotlabs/Module/Siteinfo.php:38 msgid "Developer homepage" msgstr "" @@ -6512,7 +6636,7 @@ msgid "No ratings" msgstr "" #: ../../Zotlabs/Module/Ratings.php:97 ../../Zotlabs/Module/Pubsites.php:35 -#: ../../include/conversation.php:1082 +#: ../../include/conversation.php:1087 msgid "Ratings" msgstr "" @@ -6544,8 +6668,8 @@ msgstr "" msgid "Export selected" msgstr "" -#: ../../Zotlabs/Module/Webpages.php:237 ../../Zotlabs/Lib/Apps.php:244 -#: ../../include/conversation.php:1915 ../../include/nav.php:481 +#: ../../Zotlabs/Module/Webpages.php:237 ../../Zotlabs/Lib/Apps.php:306 +#: ../../include/conversation.php:1924 ../../include/nav.php:473 msgid "Webpages" msgstr "" @@ -6688,70 +6812,85 @@ msgstr "" msgid "Redeliver" msgstr "" -#: ../../Zotlabs/Module/Profiles.php:728 ../../Zotlabs/Module/Profiles.php:827 -#: ../../include/channel.php:1081 -msgid "Edit visibility" +#: ../../Zotlabs/Module/Sources.php:38 +msgid "Failed to create source. No channel selected." msgstr "" -#: ../../Zotlabs/Module/Profiles.php:729 -msgid "Profile Tools" +#: ../../Zotlabs/Module/Sources.php:54 +msgid "Source created." msgstr "" -#: ../../Zotlabs/Module/Profiles.php:730 -msgid "Change cover photo" +#: ../../Zotlabs/Module/Sources.php:67 +msgid "Source updated." msgstr "" -#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1052 -msgid "Change profile photo" +#: ../../Zotlabs/Module/Sources.php:93 +msgid "*" msgstr "" -#: ../../Zotlabs/Module/Sources.php:96 +#: ../../Zotlabs/Module/Sources.php:99 #: ../../Zotlabs/Widget/Settings_menu.php:133 ../../include/features.php:292 msgid "Channel Sources" msgstr "" -#: ../../Zotlabs/Module/Profiles.php:733 -msgid "Clone this profile" +#: ../../Zotlabs/Module/Sources.php:100 +msgid "Manage remote sources of content for your channel." msgstr "" -#: ../../Zotlabs/Module/Profiles.php:734 -msgid "Delete this profile" +#: ../../Zotlabs/Module/Sources.php:101 ../../Zotlabs/Module/Sources.php:111 +msgid "New Source" msgstr "" -#: ../../Zotlabs/Module/Profiles.php:735 -msgid "Add profile things" +#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:146 +msgid "" +"Import all or selected content from the following channel into this channel " +"and distribute it according to your channel settings." msgstr "" -#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1654 -msgid "Personal" +#: ../../Zotlabs/Module/Sources.php:113 ../../Zotlabs/Module/Sources.php:147 +msgid "Only import content with these words (one per line)" msgstr "" -#: ../../Zotlabs/Module/Profiles.php:738 -msgid "Relation" +#: ../../Zotlabs/Module/Sources.php:113 ../../Zotlabs/Module/Sources.php:147 +msgid "Leave blank to import all public content" msgstr "" -#: ../../Zotlabs/Module/Profiles.php:739 ../../include/datetime.php:55 -msgid "Miscellaneous" +#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:153 +msgid "Channel Name" msgstr "" -#: ../../Zotlabs/Module/Profiles.php:741 -msgid "Import profile from file" +#: ../../Zotlabs/Module/Sources.php:115 ../../Zotlabs/Module/Sources.php:150 +msgid "" +"Add the following categories to posts imported from this source (comma " +"separated)" +msgstr "" + +#: ../../Zotlabs/Module/Sources.php:116 ../../Zotlabs/Module/Sources.php:151 +msgid "Resend posts with this channel as author" msgstr "" -#: ../../Zotlabs/Module/Sources.php:133 ../../Zotlabs/Module/Sources.php:161 +#: ../../Zotlabs/Module/Sources.php:116 ../../Zotlabs/Module/Sources.php:151 +msgid "Copyrights may apply" +msgstr "" + +#: ../../Zotlabs/Module/Sources.php:136 ../../Zotlabs/Module/Sources.php:166 msgid "Source not found." msgstr "" -#: ../../Zotlabs/Module/Profiles.php:744 -msgid "Marital status" +#: ../../Zotlabs/Module/Sources.php:143 +msgid "Edit Source" msgstr "" -#: ../../Zotlabs/Module/Profiles.php:745 -msgid "Sexual preference" +#: ../../Zotlabs/Module/Sources.php:144 +msgid "Delete Source" msgstr "" -#: ../../Zotlabs/Module/Profiles.php:748 -msgid "Profile name" +#: ../../Zotlabs/Module/Sources.php:174 +msgid "Source removed" +msgstr "" + +#: ../../Zotlabs/Module/Sources.php:176 +msgid "Unable to remove source." msgstr "" #: ../../Zotlabs/Module/Like.php:54 @@ -6789,13 +6928,13 @@ msgstr "" msgid "Previous action reversed." msgstr "" -#: ../../Zotlabs/Module/Like.php:438 ../../addon/diaspora/Receiver.php:1529 -#: ../../addon/pubcrawl/as.php:1440 ../../include/conversation.php:160 +#: ../../Zotlabs/Module/Like.php:438 ../../addon/diaspora/Receiver.php:1559 +#: ../../addon/pubcrawl/as.php:1544 ../../include/conversation.php:160 #, php-format msgid "%1$s likes %2$s's %3$s" msgstr "" -#: ../../Zotlabs/Module/Like.php:440 ../../addon/pubcrawl/as.php:1442 +#: ../../Zotlabs/Module/Like.php:440 ../../addon/pubcrawl/as.php:1546 #: ../../include/conversation.php:163 #, php-format msgid "%1$s doesn't like %2$s's %3$s" @@ -6816,17 +6955,17 @@ msgstr "" msgid "%1$s abstains from a decision on %2$s's %3$s" msgstr "" -#: ../../Zotlabs/Module/Like.php:448 ../../addon/diaspora/Receiver.php:2072 +#: ../../Zotlabs/Module/Like.php:448 ../../addon/diaspora/Receiver.php:2102 #, php-format msgid "%1$s is attending %2$s's %3$s" msgstr "" -#: ../../Zotlabs/Module/Like.php:450 ../../addon/diaspora/Receiver.php:2074 +#: ../../Zotlabs/Module/Like.php:450 ../../addon/diaspora/Receiver.php:2104 #, php-format msgid "%1$s is not attending %2$s's %3$s" msgstr "" -#: ../../Zotlabs/Module/Like.php:452 ../../addon/diaspora/Receiver.php:2076 +#: ../../Zotlabs/Module/Like.php:452 ../../addon/diaspora/Receiver.php:2106 #, php-format msgid "%1$s may attend %2$s's %3$s" msgstr "" @@ -6885,7 +7024,7 @@ msgstr "" #: ../../Zotlabs/Module/Directory.php:338 ../../Zotlabs/Module/Suggest.php:56 #: ../../Zotlabs/Widget/Follow.php:32 ../../Zotlabs/Widget/Suggestions.php:44 -#: ../../include/conversation.php:1052 ../../include/channel.php:1376 +#: ../../include/conversation.php:1057 ../../include/channel.php:1376 #: ../../include/connections.php:110 msgid "Connect" msgstr "" @@ -7034,7 +7173,6 @@ msgid "Subject:" msgstr "" #: ../../Zotlabs/Module/Mail.php:287 ../../Zotlabs/Module/Mail.php:429 -#: ../../include/conversation.php:1385 msgid "Attach file" msgstr "" @@ -7043,7 +7181,7 @@ msgid "Send" msgstr "" #: ../../Zotlabs/Module/Mail.php:292 ../../Zotlabs/Module/Mail.php:434 -#: ../../include/conversation.php:1430 +#: ../../include/conversation.php:1438 msgid "Set expiration date" msgstr "" @@ -7119,19 +7257,19 @@ msgstr "" msgid "Rate" msgstr "" -#: ../../Zotlabs/Module/Impel.php:43 ../../include/bbcode.php:267 +#: ../../Zotlabs/Module/Impel.php:43 ../../include/bbcode.php:269 msgid "webpage" msgstr "" -#: ../../Zotlabs/Module/Impel.php:48 ../../include/bbcode.php:273 +#: ../../Zotlabs/Module/Impel.php:48 ../../include/bbcode.php:275 msgid "block" msgstr "" -#: ../../Zotlabs/Module/Impel.php:53 ../../include/bbcode.php:270 +#: ../../Zotlabs/Module/Impel.php:53 ../../include/bbcode.php:272 msgid "layout" msgstr "" -#: ../../Zotlabs/Module/Impel.php:60 ../../include/bbcode.php:276 +#: ../../Zotlabs/Module/Impel.php:60 ../../include/bbcode.php:278 msgid "menu" msgstr "" @@ -7169,7 +7307,7 @@ msgstr "" msgid "or select an existing folder (doubleclick)" msgstr "" -#: ../../Zotlabs/Module/Filer.php:54 ../../Zotlabs/Lib/ThreadItem.php:151 +#: ../../Zotlabs/Module/Filer.php:54 ../../Zotlabs/Lib/ThreadItem.php:162 msgid "Save to Folder" msgstr "" @@ -7216,98 +7354,123 @@ msgstr "" msgid "Registration on this hub is by approval only." msgstr "" -#: ../../Zotlabs/Module/Register.php:202 +#: ../../Zotlabs/Module/Register.php:202 ../../Zotlabs/Module/Register.php:211 msgid "<a href=\"pubsites\">Register at another affiliated hub.</a>" msgstr "" -#: ../../Zotlabs/Module/Register.php:212 +#: ../../Zotlabs/Module/Register.php:210 +msgid "Registration on this hub is by invitation only." +msgstr "" + +#: ../../Zotlabs/Module/Register.php:221 msgid "" "This site has exceeded the number of allowed daily account registrations. " "Please try again tomorrow." msgstr "" -#: ../../Zotlabs/Module/Register.php:238 +#: ../../Zotlabs/Module/Register.php:247 #, php-format msgid "I accept the %s for this website" msgstr "" -#: ../../Zotlabs/Module/Register.php:245 +#: ../../Zotlabs/Module/Register.php:254 #, php-format msgid "I am over %s years of age and accept the %s for this website" msgstr "" -#: ../../Zotlabs/Module/Register.php:250 +#: ../../Zotlabs/Module/Register.php:259 msgid "Your email address" msgstr "" -#: ../../Zotlabs/Module/Register.php:251 +#: ../../Zotlabs/Module/Register.php:260 msgid "Choose a password" msgstr "" -#: ../../Zotlabs/Module/Register.php:252 +#: ../../Zotlabs/Module/Register.php:261 msgid "Please re-enter your password" msgstr "" -#: ../../Zotlabs/Module/Register.php:253 +#: ../../Zotlabs/Module/Register.php:262 msgid "Please enter your invitation code" msgstr "" -#: ../../Zotlabs/Module/Register.php:258 -msgid "no" +#: ../../Zotlabs/Module/Register.php:263 +msgid "Your Name" msgstr "" -#: ../../Zotlabs/Module/Register.php:258 -msgid "yes" +#: ../../Zotlabs/Module/Register.php:263 +msgid "Real names are preferred." msgstr "" -#: ../../Zotlabs/Module/Register.php:274 -msgid "Membership on this site is by invitation only." +#: ../../Zotlabs/Module/Register.php:265 +#, php-format +msgid "" +"Your nickname will be used to create an easy to remember channel address e." +"g. nickname%s" msgstr "" -#: ../../Zotlabs/Module/Register.php:286 ../../boot.php:1570 -#: ../../include/nav.php:164 +#: ../../Zotlabs/Module/Register.php:266 +msgid "" +"Select a channel permission role for your usage needs and privacy " +"requirements." +msgstr "" + +#: ../../Zotlabs/Module/Register.php:267 +msgid "no" +msgstr "" + +#: ../../Zotlabs/Module/Register.php:267 +msgid "yes" +msgstr "" + +#: ../../Zotlabs/Module/Register.php:294 ../../boot.php:1593 +#: ../../include/nav.php:158 msgid "Register" msgstr "" -#: ../../Zotlabs/Module/Register.php:287 +#: ../../Zotlabs/Module/Register.php:295 msgid "" "This site requires email verification. After completing this form, please " "check your email for further instructions." msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:136 -#: ../../Zotlabs/Module/Cover_photo.php:186 +#: ../../Zotlabs/Module/Cover_photo.php:168 +#: ../../Zotlabs/Module/Cover_photo.php:218 msgid "Cover Photos" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:237 ../../include/items.php:4558 +#: ../../Zotlabs/Module/Cover_photo.php:269 ../../include/items.php:4502 msgid "female" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4559 +#: ../../Zotlabs/Module/Cover_photo.php:270 ../../include/items.php:4503 #, php-format msgid "%1$s updated her %2$s" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:239 ../../include/items.php:4560 +#: ../../Zotlabs/Module/Cover_photo.php:271 ../../include/items.php:4504 msgid "male" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/items.php:4561 +#: ../../Zotlabs/Module/Cover_photo.php:272 ../../include/items.php:4505 #, php-format msgid "%1$s updated his %2$s" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:242 ../../include/items.php:4563 +#: ../../Zotlabs/Module/Cover_photo.php:274 ../../include/items.php:4507 #, php-format msgid "%1$s updated their %2$s" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:244 ../../include/channel.php:2070 +#: ../../Zotlabs/Module/Cover_photo.php:276 ../../include/channel.php:2081 msgid "cover photo" msgstr "" -#: ../../Zotlabs/Module/Cover_photo.php:361 +#: ../../Zotlabs/Module/Cover_photo.php:390 +msgid "Your cover photo may be visible to anybody on the internet" +msgstr "" + +#: ../../Zotlabs/Module/Cover_photo.php:394 msgid "Change Cover Photo" msgstr "" @@ -7315,8 +7478,8 @@ msgstr "" msgid "Documentation Search" msgstr "" -#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1824 -#: ../../include/nav.php:391 +#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1833 +#: ../../include/nav.php:383 msgid "About" msgstr "" @@ -7360,39 +7523,27 @@ msgstr "" msgid "Select a tag to remove: " msgstr "" -#: ../../Zotlabs/Module/Network.php:100 +#: ../../Zotlabs/Module/Network.php:116 msgid "No such group" msgstr "" -#: ../../Zotlabs/Module/Network.php:142 +#: ../../Zotlabs/Module/Network.php:157 msgid "No such channel" msgstr "" -#: ../../Zotlabs/Module/Network.php:147 -msgid "forum" -msgstr "" - -#: ../../Zotlabs/Module/Network.php:159 -msgid "Search Results For:" -msgstr "" - -#: ../../Zotlabs/Module/Network.php:229 +#: ../../Zotlabs/Module/Network.php:242 msgid "Privacy group is empty" msgstr "" -#: ../../Zotlabs/Module/Network.php:238 +#: ../../Zotlabs/Module/Network.php:253 msgid "Privacy group: " msgstr "" -#: ../../Zotlabs/Module/Network.php:265 -msgid "Invalid connection." -msgstr "" - -#: ../../Zotlabs/Module/Network.php:285 ../../addon/redred/redred.php:65 +#: ../../Zotlabs/Module/Network.php:304 ../../addon/redred/redred.php:65 msgid "Invalid channel." msgstr "" -#: ../../Zotlabs/Module/Acl.php:361 +#: ../../Zotlabs/Module/Acl.php:359 msgid "network" msgstr "" @@ -7410,44 +7561,44 @@ msgstr "" msgid "Permission Denied." msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:95 +#: ../../Zotlabs/Module/Filestorage.php:112 msgid "File not found." msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:142 +#: ../../Zotlabs/Module/Filestorage.php:165 msgid "Edit file permissions" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:154 +#: ../../Zotlabs/Module/Filestorage.php:177 msgid "Set/edit permissions" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:155 +#: ../../Zotlabs/Module/Filestorage.php:178 msgid "Include all files and sub folders" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:156 +#: ../../Zotlabs/Module/Filestorage.php:179 msgid "Return to file list" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:158 +#: ../../Zotlabs/Module/Filestorage.php:181 msgid "Copy/paste this code to attach file to a post" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:159 +#: ../../Zotlabs/Module/Filestorage.php:182 msgid "Copy/paste this URL to link file from a web page" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:161 +#: ../../Zotlabs/Module/Filestorage.php:184 msgid "Share this file" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:162 +#: ../../Zotlabs/Module/Filestorage.php:185 msgid "Show URL to this file" msgstr "" -#: ../../Zotlabs/Module/Filestorage.php:163 -#: ../../Zotlabs/Storage/Browser.php:397 +#: ../../Zotlabs/Module/Filestorage.php:186 +#: ../../Zotlabs/Storage/Browser.php:405 msgid "Show in your contacts shared folder" msgstr "" @@ -7496,47 +7647,47 @@ msgstr "" msgid "Expiring accounts" msgstr "" -#: ../../Zotlabs/Module/Admin.php:112 +#: ../../Zotlabs/Module/Admin.php:116 msgid "Clones" msgstr "" -#: ../../Zotlabs/Module/Admin.php:118 +#: ../../Zotlabs/Module/Admin.php:122 msgid "Message queues" msgstr "" -#: ../../Zotlabs/Module/Admin.php:132 +#: ../../Zotlabs/Module/Admin.php:136 msgid "Your software should be updated" msgstr "" -#: ../../Zotlabs/Module/Admin.php:137 +#: ../../Zotlabs/Module/Admin.php:141 msgid "Summary" msgstr "" -#: ../../Zotlabs/Module/Admin.php:140 +#: ../../Zotlabs/Module/Admin.php:144 msgid "Registered accounts" msgstr "" -#: ../../Zotlabs/Module/Admin.php:141 +#: ../../Zotlabs/Module/Admin.php:145 msgid "Pending registrations" msgstr "" -#: ../../Zotlabs/Module/Admin.php:142 +#: ../../Zotlabs/Module/Admin.php:146 msgid "Registered channels" msgstr "" -#: ../../Zotlabs/Module/Admin.php:143 -msgid "Active plugins" +#: ../../Zotlabs/Module/Admin.php:147 +msgid "Active addons" msgstr "" -#: ../../Zotlabs/Module/Admin.php:144 +#: ../../Zotlabs/Module/Admin.php:148 msgid "Version" msgstr "" -#: ../../Zotlabs/Module/Admin.php:145 +#: ../../Zotlabs/Module/Admin.php:149 msgid "Repository version (master)" msgstr "" -#: ../../Zotlabs/Module/Admin.php:146 +#: ../../Zotlabs/Module/Admin.php:150 msgid "Repository version (dev)" msgstr "" @@ -7589,7 +7740,7 @@ msgid "" "Password reset failed." msgstr "" -#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1598 +#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1622 msgid "Password Reset" msgstr "" @@ -7634,8 +7785,8 @@ msgstr "" msgid "Email Address" msgstr "" -#: ../../Zotlabs/Module/Notifications.php:62 -#: ../../Zotlabs/Lib/ThreadItem.php:408 +#: ../../Zotlabs/Module/Notifications.php:60 +#: ../../Zotlabs/Lib/ThreadItem.php:413 msgid "Mark all seen" msgstr "" @@ -7663,124 +7814,120 @@ msgstr "" msgid "5. Wizard - I probably know more than you do" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:231 +#: ../../Zotlabs/Lib/Apps.php:294 msgid "Site Admin" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:232 ../../addon/buglink/buglink.php:16 +#: ../../Zotlabs/Lib/Apps.php:295 ../../addon/buglink/buglink.php:16 msgid "Report Bug" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:233 +#: ../../Zotlabs/Lib/Apps.php:296 msgid "View Bookmarks" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:234 +#: ../../Zotlabs/Lib/Apps.php:297 msgid "My Chatrooms" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:236 -msgid "Firefox Share" -msgstr "" - -#: ../../Zotlabs/Lib/Apps.php:237 +#: ../../Zotlabs/Lib/Apps.php:299 msgid "Remote Diagnostics" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:238 ../../include/features.php:417 +#: ../../Zotlabs/Lib/Apps.php:300 ../../include/features.php:435 msgid "Suggest Channels" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:239 ../../boot.php:1589 ../../include/nav.php:126 -#: ../../include/nav.php:130 +#: ../../Zotlabs/Lib/Apps.php:301 ../../boot.php:1613 ../../include/nav.php:120 +#: ../../include/nav.php:124 msgid "Login" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:241 +#: ../../Zotlabs/Lib/Apps.php:303 msgid "Activity" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:245 ../../include/conversation.php:1931 -#: ../../include/features.php:96 ../../include/nav.php:497 +#: ../../Zotlabs/Lib/Apps.php:307 ../../include/conversation.php:1940 +#: ../../include/features.php:96 ../../include/nav.php:489 msgid "Wiki" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:246 +#: ../../Zotlabs/Lib/Apps.php:308 msgid "Channel Home" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:249 ../../include/conversation.php:1853 -#: ../../include/conversation.php:1856 +#: ../../Zotlabs/Lib/Apps.php:311 ../../include/conversation.php:1862 +#: ../../include/conversation.php:1865 msgid "Events" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:250 +#: ../../Zotlabs/Lib/Apps.php:312 msgid "Directory" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:252 +#: ../../Zotlabs/Lib/Apps.php:314 msgid "Mail" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:255 +#: ../../Zotlabs/Lib/Apps.php:317 msgid "Chat" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:257 +#: ../../Zotlabs/Lib/Apps.php:319 msgid "Probe" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:258 +#: ../../Zotlabs/Lib/Apps.php:320 msgid "Suggest" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:259 +#: ../../Zotlabs/Lib/Apps.php:321 msgid "Random Channel" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:260 +#: ../../Zotlabs/Lib/Apps.php:322 msgid "Invite" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:261 ../../Zotlabs/Widget/Admin.php:26 +#: ../../Zotlabs/Lib/Apps.php:323 ../../Zotlabs/Widget/Admin.php:26 msgid "Features" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:262 ../../addon/openid/MysqlProvider.php:69 +#: ../../Zotlabs/Lib/Apps.php:324 ../../addon/openid/MysqlProvider.php:69 msgid "Language" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:263 +#: ../../Zotlabs/Lib/Apps.php:325 msgid "Post" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:264 ../../addon/openid/MysqlProvider.php:58 +#: ../../Zotlabs/Lib/Apps.php:326 ../../addon/openid/MysqlProvider.php:58 #: ../../addon/openid/MysqlProvider.php:59 #: ../../addon/openid/MysqlProvider.php:60 msgid "Profile Photo" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:407 +#: ../../Zotlabs/Lib/Apps.php:473 msgid "Purchase" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:411 +#: ../../Zotlabs/Lib/Apps.php:477 msgid "Undelete" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:419 +#: ../../Zotlabs/Lib/Apps.php:485 msgid "Add to app-tray" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:420 +#: ../../Zotlabs/Lib/Apps.php:486 msgid "Remove from app-tray" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:421 +#: ../../Zotlabs/Lib/Apps.php:487 msgid "Pin to navbar" msgstr "" -#: ../../Zotlabs/Lib/Apps.php:422 +#: ../../Zotlabs/Lib/Apps.php:488 msgid "Unpin from navbar" msgstr "" @@ -7867,8 +8014,8 @@ msgctxt "wiki_history" msgid "Message" msgstr "" -#: ../../Zotlabs/Lib/NativeWikiPage.php:597 ../../include/bbcode.php:744 -#: ../../include/bbcode.php:914 +#: ../../Zotlabs/Lib/NativeWikiPage.php:597 ../../include/bbcode.php:746 +#: ../../include/bbcode.php:916 msgid "Different viewers will see this text differently" msgstr "" @@ -8240,208 +8387,200 @@ msgstr "" msgid "Update %s failed. See error logs." msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:97 ../../include/conversation.php:697 +#: ../../Zotlabs/Lib/ThreadItem.php:97 ../../include/conversation.php:700 msgid "Private Message" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:147 ../../include/conversation.php:689 +#: ../../Zotlabs/Lib/ThreadItem.php:152 ../../Zotlabs/Storage/Browser.php:280 +msgid "Admin Delete" +msgstr "" + +#: ../../Zotlabs/Lib/ThreadItem.php:158 ../../include/conversation.php:690 msgid "Select" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:172 +#: ../../Zotlabs/Lib/ThreadItem.php:183 msgid "I will attend" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:172 +#: ../../Zotlabs/Lib/ThreadItem.php:183 msgid "I will not attend" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:172 +#: ../../Zotlabs/Lib/ThreadItem.php:183 msgid "I might attend" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:182 +#: ../../Zotlabs/Lib/ThreadItem.php:193 msgid "I agree" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:182 +#: ../../Zotlabs/Lib/ThreadItem.php:193 msgid "I disagree" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:182 +#: ../../Zotlabs/Lib/ThreadItem.php:193 msgid "I abstain" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:238 -msgid "Add Star" -msgstr "" - -#: ../../Zotlabs/Lib/ThreadItem.php:239 -msgid "Remove Star" -msgstr "" - -#: ../../Zotlabs/Lib/ThreadItem.php:240 +#: ../../Zotlabs/Lib/ThreadItem.php:247 ../../include/conversation.php:695 msgid "Toggle Star Status" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:244 -msgid "starred" -msgstr "" - -#: ../../Zotlabs/Lib/ThreadItem.php:254 ../../include/conversation.php:704 +#: ../../Zotlabs/Lib/ThreadItem.php:258 ../../include/conversation.php:707 msgid "Message signature validated" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:255 ../../include/conversation.php:705 +#: ../../Zotlabs/Lib/ThreadItem.php:259 ../../include/conversation.php:708 msgid "Message signature incorrect" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:263 +#: ../../Zotlabs/Lib/ThreadItem.php:267 msgid "Add Tag" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:281 ../../include/taxonomy.php:575 +#: ../../Zotlabs/Lib/ThreadItem.php:285 ../../include/taxonomy.php:575 msgid "like" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:282 ../../include/taxonomy.php:576 +#: ../../Zotlabs/Lib/ThreadItem.php:286 ../../include/taxonomy.php:576 msgid "dislike" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:286 +#: ../../Zotlabs/Lib/ThreadItem.php:290 msgid "Share This" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:286 +#: ../../Zotlabs/Lib/ThreadItem.php:290 msgid "share" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:295 +#: ../../Zotlabs/Lib/ThreadItem.php:299 msgid "Delivery Report" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:313 +#: ../../Zotlabs/Lib/ThreadItem.php:317 #, php-format msgid "%d comment" msgid_plural "%d comments" msgstr[0] "" msgstr[1] "" -#: ../../Zotlabs/Lib/ThreadItem.php:343 ../../Zotlabs/Lib/ThreadItem.php:344 +#: ../../Zotlabs/Lib/ThreadItem.php:347 ../../Zotlabs/Lib/ThreadItem.php:348 #, php-format msgid "View %s's profile - %s" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:347 +#: ../../Zotlabs/Lib/ThreadItem.php:351 msgid "to" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:348 +#: ../../Zotlabs/Lib/ThreadItem.php:352 msgid "via" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:349 +#: ../../Zotlabs/Lib/ThreadItem.php:353 msgid "Wall-to-Wall" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:350 +#: ../../Zotlabs/Lib/ThreadItem.php:354 msgid "via Wall-To-Wall:" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:363 ../../include/conversation.php:763 +#: ../../Zotlabs/Lib/ThreadItem.php:367 ../../include/conversation.php:766 #, php-format msgid "from %s" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:366 ../../include/conversation.php:766 +#: ../../Zotlabs/Lib/ThreadItem.php:370 ../../include/conversation.php:769 #, php-format msgid "last edited: %s" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:367 ../../include/conversation.php:767 +#: ../../Zotlabs/Lib/ThreadItem.php:371 ../../include/conversation.php:770 #, php-format msgid "Expires: %s" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:374 +#: ../../Zotlabs/Lib/ThreadItem.php:379 msgid "Attend" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:375 +#: ../../Zotlabs/Lib/ThreadItem.php:380 msgid "Attendance Options" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:376 +#: ../../Zotlabs/Lib/ThreadItem.php:381 msgid "Vote" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:377 +#: ../../Zotlabs/Lib/ThreadItem.php:382 msgid "Voting Options" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:398 +#: ../../Zotlabs/Lib/ThreadItem.php:403 #: ../../addon/bookmarker/bookmarker.php:38 msgid "Save Bookmarks" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:399 +#: ../../Zotlabs/Lib/ThreadItem.php:404 msgid "Add to Calendar" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:426 ../../include/conversation.php:483 +#: ../../Zotlabs/Lib/ThreadItem.php:431 ../../include/conversation.php:483 msgid "This is an unsaved preview" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:458 ../../include/js_strings.php:7 +#: ../../Zotlabs/Lib/ThreadItem.php:463 ../../include/js_strings.php:7 #, php-format msgid "%s show all" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:753 ../../include/conversation.php:1380 +#: ../../Zotlabs/Lib/ThreadItem.php:758 ../../include/conversation.php:1388 msgid "Bold" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:754 ../../include/conversation.php:1381 +#: ../../Zotlabs/Lib/ThreadItem.php:759 ../../include/conversation.php:1389 msgid "Italic" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:755 ../../include/conversation.php:1382 +#: ../../Zotlabs/Lib/ThreadItem.php:760 ../../include/conversation.php:1390 msgid "Underline" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:756 ../../include/conversation.php:1383 +#: ../../Zotlabs/Lib/ThreadItem.php:761 ../../include/conversation.php:1391 msgid "Quote" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:757 ../../include/conversation.php:1384 +#: ../../Zotlabs/Lib/ThreadItem.php:762 ../../include/conversation.php:1392 msgid "Code" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:758 +#: ../../Zotlabs/Lib/ThreadItem.php:763 msgid "Image" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:759 -msgid "Attach File" +#: ../../Zotlabs/Lib/ThreadItem.php:764 ../../include/conversation.php:1393 +msgid "Attach/Upload file" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:760 +#: ../../Zotlabs/Lib/ThreadItem.php:765 msgid "Insert Link" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:761 +#: ../../Zotlabs/Lib/ThreadItem.php:766 msgid "Video" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:771 +#: ../../Zotlabs/Lib/ThreadItem.php:776 msgid "Your full name (required)" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:772 +#: ../../Zotlabs/Lib/ThreadItem.php:777 msgid "Your email address (required)" msgstr "" -#: ../../Zotlabs/Lib/ThreadItem.php:773 +#: ../../Zotlabs/Lib/ThreadItem.php:778 msgid "Your website URL (optional)" msgstr "" @@ -8457,11 +8596,11 @@ msgstr "" msgid "Welcome %s. Remote authentication successful." msgstr "" -#: ../../Zotlabs/Storage/Browser.php:107 ../../Zotlabs/Storage/Browser.php:287 +#: ../../Zotlabs/Storage/Browser.php:107 ../../Zotlabs/Storage/Browser.php:289 msgid "parent" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:131 ../../include/text.php:2845 +#: ../../Zotlabs/Storage/Browser.php:131 ../../include/text.php:2817 msgid "Collection" msgstr "" @@ -8473,8 +8612,8 @@ msgstr "" msgid "Addressbook" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:140 ../../include/nav.php:420 -#: ../../include/nav.php:423 +#: ../../Zotlabs/Storage/Browser.php:140 ../../include/nav.php:412 +#: ../../include/nav.php:415 msgid "Calendar" msgstr "" @@ -8498,33 +8637,36 @@ msgstr "" msgid "Add Files" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:353 +#: ../../Zotlabs/Storage/Browser.php:361 #, php-format msgid "You are using %1$s of your available file storage." msgstr "" -#: ../../Zotlabs/Storage/Browser.php:358 +#: ../../Zotlabs/Storage/Browser.php:366 #, php-format msgid "You are using %1$s of %2$s available file storage. (%3$s%)" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:369 +#: ../../Zotlabs/Storage/Browser.php:377 msgid "WARNING:" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:381 +#: ../../Zotlabs/Storage/Browser.php:389 msgid "Create new folder" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:383 +#: ../../Zotlabs/Storage/Browser.php:391 msgid "Upload file" msgstr "" -#: ../../Zotlabs/Storage/Browser.php:396 +#: ../../Zotlabs/Storage/Browser.php:404 msgid "Drop files here to immediately upload" msgstr "" #: ../../Zotlabs/Widget/Forums.php:100 +#: ../../Zotlabs/Widget/Activity_filter.php:100 +#: ../../Zotlabs/Widget/Notifications.php:119 +#: ../../Zotlabs/Widget/Notifications.php:120 msgid "Forums" msgstr "" @@ -8604,7 +8746,7 @@ msgstr "" msgid "Select an addressbook to import to" msgstr "" -#: ../../Zotlabs/Widget/Appcategories.php:40 +#: ../../Zotlabs/Widget/Appcategories.php:43 #: ../../include/contact_widgets.php:97 ../../include/contact_widgets.php:141 #: ../../include/contact_widgets.php:186 ../../include/taxonomy.php:409 #: ../../include/taxonomy.php:491 ../../include/taxonomy.php:511 @@ -8612,7 +8754,8 @@ msgstr "" msgid "Categories" msgstr "" -#: ../../Zotlabs/Widget/Appcategories.php:43 ../../Zotlabs/Widget/Filer.php:31 +#: ../../Zotlabs/Widget/Appcategories.php:46 ../../Zotlabs/Widget/Filer.php:31 +#: ../../widgets/Netselect/Netselect.php:26 #: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:100 #: ../../include/contact_widgets.php:144 ../../include/contact_widgets.php:189 msgid "Everything" @@ -8663,8 +8806,8 @@ msgid "New Message" msgstr "" #: ../../Zotlabs/Widget/Chatroom_list.php:16 -#: ../../include/conversation.php:1867 ../../include/conversation.php:1870 -#: ../../include/nav.php:434 ../../include/nav.php:437 +#: ../../include/conversation.php:1876 ../../include/conversation.php:1879 +#: ../../include/nav.php:426 ../../include/nav.php:429 msgid "Chatrooms" msgstr "" @@ -8689,6 +8832,74 @@ msgctxt "widget" msgid "Activity" msgstr "" +#: ../../Zotlabs/Widget/Activity_filter.php:24 +msgid "Personal Posts" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_filter.php:28 +msgid "Show posts that mention or involve me" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_filter.php:39 +msgid "Starred Posts" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_filter.php:43 +msgid "Show posts that I have starred" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_filter.php:63 +#, php-format +msgid "Show posts related to the %s privacy group" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_filter.php:72 +msgid "Show my privacy groups" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_filter.php:93 +msgid "Show posts to this forum" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_filter.php:104 +msgid "Show forums" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_filter.php:128 +#, php-format +msgid "Show posts that I have filed to %s" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_filter.php:134 +#: ../../Zotlabs/Widget/Filer.php:28 ../../include/contact_widgets.php:53 +#: ../../include/features.php:488 +msgid "Saved Folders" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_filter.php:138 +msgid "Show filed post categories" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_filter.php:152 +msgid "Panel search" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_filter.php:162 +#: ../../Zotlabs/Widget/Notifications.php:27 +#: ../../Zotlabs/Widget/Notifications.php:46 +#: ../../Zotlabs/Widget/Notifications.php:122 +#: ../../Zotlabs/Widget/Notifications.php:153 +msgid "Filter by name" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_filter.php:177 +msgid "Remove active filter" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_filter.php:193 +msgid "Activity Filters" +msgstr "" + #: ../../Zotlabs/Widget/Follow.php:22 #, php-format msgid "You have %1$.0f of %2$.0f allowed connections." @@ -8750,7 +8961,7 @@ msgstr "" msgid "Saved Searches" msgstr "" -#: ../../Zotlabs/Widget/Savedsearch.php:84 ../../include/group.php:333 +#: ../../Zotlabs/Widget/Savedsearch.php:84 ../../include/group.php:325 msgid "add" msgstr "" @@ -8787,9 +8998,32 @@ msgstr "" msgid "See more..." msgstr "" -#: ../../Zotlabs/Widget/Filer.php:28 ../../include/contact_widgets.php:53 -#: ../../include/features.php:470 -msgid "Saved Folders" +#: ../../Zotlabs/Widget/Activity_order.php:86 +msgid "Commented Date" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_order.php:90 +msgid "Order by last commented date" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_order.php:93 +msgid "Posted Date" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_order.php:97 +msgid "Order by last posted date" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_order.php:100 +msgid "Date Unthreaded" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_order.php:104 +msgid "Order unthreaded by date" +msgstr "" + +#: ../../Zotlabs/Widget/Activity_order.php:119 +msgid "Activity Order" msgstr "" #: ../../Zotlabs/Widget/Cover_photo.php:54 @@ -8801,6 +9035,18 @@ msgstr "" msgid "Tags" msgstr "" +#: ../../Zotlabs/Widget/Appstore.php:11 +msgid "App Collections" +msgstr "" + +#: ../../Zotlabs/Widget/Appstore.php:13 +msgid "Available Apps" +msgstr "" + +#: ../../Zotlabs/Widget/Appstore.php:14 +msgid "Installed apps" +msgstr "" + #: ../../Zotlabs/Widget/Newmember.php:24 msgid "Profile Creation" msgstr "" @@ -8813,7 +9059,7 @@ msgstr "" msgid "Upload cover photo" msgstr "" -#: ../../Zotlabs/Widget/Newmember.php:28 ../../include/nav.php:119 +#: ../../Zotlabs/Widget/Newmember.php:28 ../../include/nav.php:113 msgid "Edit your profile" msgstr "" @@ -8865,12 +9111,12 @@ msgstr "" msgid "DB updates" msgstr "" -#: ../../Zotlabs/Widget/Admin.php:55 ../../include/nav.php:199 +#: ../../Zotlabs/Widget/Admin.php:55 ../../include/nav.php:191 msgid "Admin" msgstr "" #: ../../Zotlabs/Widget/Admin.php:56 -msgid "Plugin Features" +msgid "Addon Features" msgstr "" #: ../../Zotlabs/Widget/Settings_menu.php:35 @@ -8909,10 +9155,6 @@ msgstr "" msgid "OAuth2 apps" msgstr "" -#: ../../Zotlabs/Widget/Settings_menu.php:108 ../../include/features.php:240 -msgid "Permission Groups" -msgstr "" - #: ../../Zotlabs/Widget/Settings_menu.php:125 msgid "Premium Channel Settings" msgstr "" @@ -8939,16 +9181,10 @@ msgstr "" #: ../../Zotlabs/Widget/Notifications.php:26 #: ../../Zotlabs/Widget/Notifications.php:45 -#: ../../Zotlabs/Widget/Notifications.php:141 +#: ../../Zotlabs/Widget/Notifications.php:152 msgid "Show new posts only" msgstr "" -#: ../../Zotlabs/Widget/Notifications.php:27 -#: ../../Zotlabs/Widget/Notifications.php:46 -#: ../../Zotlabs/Widget/Notifications.php:142 -msgid "Filter by name" -msgstr "" - #: ../../Zotlabs/Widget/Notifications.php:35 msgid "New Home Activity" msgstr "" @@ -8962,7 +9198,7 @@ msgid "View your home activity" msgstr "" #: ../../Zotlabs/Widget/Notifications.php:42 -#: ../../Zotlabs/Widget/Notifications.php:138 +#: ../../Zotlabs/Widget/Notifications.php:149 msgid "Mark all notifications seen" msgstr "" @@ -9027,23 +9263,23 @@ msgstr "" msgid "Mark all notices seen" msgstr "" -#: ../../Zotlabs/Widget/Notifications.php:121 +#: ../../Zotlabs/Widget/Notifications.php:132 msgid "New Registrations" msgstr "" -#: ../../Zotlabs/Widget/Notifications.php:122 +#: ../../Zotlabs/Widget/Notifications.php:133 msgid "New Registrations Notifications" msgstr "" -#: ../../Zotlabs/Widget/Notifications.php:132 +#: ../../Zotlabs/Widget/Notifications.php:143 msgid "Public Stream Notifications" msgstr "" -#: ../../Zotlabs/Widget/Notifications.php:135 +#: ../../Zotlabs/Widget/Notifications.php:146 msgid "View the public stream" msgstr "" -#: ../../Zotlabs/Widget/Notifications.php:150 +#: ../../Zotlabs/Widget/Notifications.php:161 msgid "Sorry, you have got no notifications at the moment" msgstr "" @@ -9051,57 +9287,53 @@ msgstr "" msgid "Source channel not found." msgstr "" -#: ../../boot.php:1569 +#: ../../boot.php:1592 msgid "Create an account to access services and applications" msgstr "" -#: ../../boot.php:1588 ../../include/nav.php:111 ../../include/nav.php:140 -#: ../../include/nav.php:159 +#: ../../boot.php:1612 ../../include/nav.php:105 ../../include/nav.php:134 +#: ../../include/nav.php:153 msgid "Logout" msgstr "" -#: ../../boot.php:1592 +#: ../../boot.php:1616 msgid "Login/Email" msgstr "" -#: ../../boot.php:1593 +#: ../../boot.php:1617 msgid "Password" msgstr "" -#: ../../boot.php:1594 +#: ../../boot.php:1618 msgid "Remember me" msgstr "" -#: ../../boot.php:1597 +#: ../../boot.php:1621 msgid "Forgot your password?" msgstr "" -#: ../../boot.php:2354 +#: ../../boot.php:2405 #, php-format msgid "[$Projectname] Website SSL error for %s" msgstr "" -#: ../../boot.php:2359 +#: ../../boot.php:2410 msgid "Website SSL certificate is not valid. Please correct." msgstr "" -#: ../../boot.php:2475 +#: ../../boot.php:2526 #, php-format msgid "[$Projectname] Cron tasks not running on %s" msgstr "" -#: ../../boot.php:2480 +#: ../../boot.php:2531 msgid "Cron/Scheduled tasks not running." msgstr "" -#: ../../boot.php:2481 ../../include/datetime.php:238 +#: ../../boot.php:2532 ../../include/datetime.php:238 msgid "never" msgstr "" -#: ../../store/[data]/smarty3/compiled/a0a1289f91f53b2c12e4e0b45ffe8291540ba895_0.file.cover_photo.tpl.php:123 -msgid "Cover Photo" -msgstr "" - #: ../../view/theme/redbasic_c/php/config.php:16 #: ../../view/theme/redbasic_c/php/config.php:19 #: ../../view/theme/redbasic/php/config.php:16 @@ -9218,6 +9450,33 @@ msgstr "" msgid "Set size of followup author photos" msgstr "" +#: ../../widgets/Netselect/Netselect.php:24 +msgid "Network/Protocol" +msgstr "" + +#: ../../widgets/Netselect/Netselect.php:28 ../../include/network.php:1772 +msgid "Zot" +msgstr "" + +#: ../../widgets/Netselect/Netselect.php:31 ../../include/network.php:1770 +msgid "Diaspora" +msgstr "" + +#: ../../widgets/Netselect/Netselect.php:33 ../../include/network.php:1763 +#: ../../include/network.php:1764 +msgid "Friendica" +msgstr "" + +#: ../../widgets/Netselect/Netselect.php:38 ../../include/network.php:1765 +msgid "OStatus" +msgstr "" + +#: ../../widgets/Netselect/Netselect.php:42 ../../addon/pubcrawl/as.php:1219 +#: ../../addon/pubcrawl/as.php:1374 ../../addon/pubcrawl/as.php:1553 +#: ../../include/network.php:1768 +msgid "ActivityPub" +msgstr "" + #: ../../addon/rendezvous/rendezvous.php:57 msgid "Errors encountered deleting database table " msgstr "" @@ -9359,30 +9618,30 @@ msgstr "" msgid "Skeleton Settings" msgstr "" -#: ../../addon/gnusoc/gnusoc.php:249 +#: ../../addon/gnusoc/gnusoc.php:258 msgid "GNU-Social Protocol Settings updated." msgstr "" -#: ../../addon/gnusoc/gnusoc.php:268 +#: ../../addon/gnusoc/gnusoc.php:277 msgid "" "The GNU-Social protocol does not support location independence. Connections " "you make within that network may be unreachable from alternate channel " "locations." msgstr "" -#: ../../addon/gnusoc/gnusoc.php:271 +#: ../../addon/gnusoc/gnusoc.php:280 msgid "Enable the GNU-Social protocol for this channel" msgstr "" -#: ../../addon/gnusoc/gnusoc.php:275 +#: ../../addon/gnusoc/gnusoc.php:284 msgid "GNU-Social Protocol Settings" msgstr "" -#: ../../addon/gnusoc/gnusoc.php:471 +#: ../../addon/gnusoc/gnusoc.php:480 msgid "Follow" msgstr "" -#: ../../addon/gnusoc/gnusoc.php:474 +#: ../../addon/gnusoc/gnusoc.php:483 #, php-format msgid "%1$s is now following %2$s" msgstr "" @@ -9429,7 +9688,7 @@ msgid "Page to load after image selection." msgstr "" #: ../../addon/openclipatar/openclipatar.php:58 ../../include/channel.php:1300 -#: ../../include/nav.php:119 +#: ../../include/nav.php:113 msgid "Edit Profile" msgstr "" @@ -9815,6 +10074,14 @@ msgstr "" msgid "IRC Chatroom" msgstr "" +#: ../../addon/gallery/gallery.php:42 ../../addon/gallery/Mod_Gallery.php:111 +msgid "Gallery" +msgstr "" + +#: ../../addon/gallery/gallery.php:45 +msgid "Photo Gallery" +msgstr "" + #: ../../addon/ljpost/ljpost.php:42 msgid "Post to LiveJournal" msgstr "" @@ -9917,7 +10184,7 @@ msgstr "" msgid "OpenID protocol error. No ID returned." msgstr "" -#: ../../addon/openid/Mod_Openid.php:188 ../../include/auth.php:300 +#: ../../addon/openid/Mod_Openid.php:188 ../../include/auth.php:317 msgid "Login failed." msgstr "" @@ -10114,38 +10381,38 @@ msgstr "" msgid "declared undying love for" msgstr "" -#: ../../addon/diaspora/diaspora.php:781 +#: ../../addon/diaspora/diaspora.php:786 msgid "Diaspora Protocol Settings updated." msgstr "" -#: ../../addon/diaspora/diaspora.php:800 +#: ../../addon/diaspora/diaspora.php:805 msgid "" "The Diaspora protocol does not support location independence. Connections " "you make within that network may be unreachable from alternate channel " "locations." msgstr "" -#: ../../addon/diaspora/diaspora.php:803 +#: ../../addon/diaspora/diaspora.php:808 msgid "Enable the Diaspora protocol for this channel" msgstr "" -#: ../../addon/diaspora/diaspora.php:807 +#: ../../addon/diaspora/diaspora.php:812 msgid "Allow any Diaspora member to comment on your public posts" msgstr "" -#: ../../addon/diaspora/diaspora.php:811 +#: ../../addon/diaspora/diaspora.php:816 msgid "Prevent your hashtags from being redirected to other sites" msgstr "" -#: ../../addon/diaspora/diaspora.php:815 +#: ../../addon/diaspora/diaspora.php:820 msgid "Sign and forward posts and comments with no existing Diaspora signature" msgstr "" -#: ../../addon/diaspora/diaspora.php:820 +#: ../../addon/diaspora/diaspora.php:825 msgid "Followed hashtags (comma separated, do not include the #)" msgstr "" -#: ../../addon/diaspora/diaspora.php:825 +#: ../../addon/diaspora/diaspora.php:830 msgid "Diaspora Protocol Settings" msgstr "" @@ -10153,7 +10420,7 @@ msgstr "" msgid "No username found in import file." msgstr "" -#: ../../addon/diaspora/import_diaspora.php:41 ../../include/import.php:67 +#: ../../addon/diaspora/import_diaspora.php:41 ../../include/import.php:72 msgid "Unable to create a unique channel address. Import failed." msgstr "" @@ -10676,35 +10943,40 @@ msgstr "" msgid "Friendica Login Password" msgstr "" -#: ../../addon/pubcrawl/as.php:1146 ../../addon/pubcrawl/as.php:1273 -#: ../../addon/pubcrawl/as.php:1449 ../../include/network.php:1769 -msgid "ActivityPub" -msgstr "" - -#: ../../addon/pubcrawl/pubcrawl.php:1053 +#: ../../addon/pubcrawl/pubcrawl.php:1136 msgid "ActivityPub Protocol Settings updated." msgstr "" -#: ../../addon/pubcrawl/pubcrawl.php:1062 +#: ../../addon/pubcrawl/pubcrawl.php:1145 msgid "" "The ActivityPub protocol does not support location independence. Connections " "you make within that network may be unreachable from alternate channel " "locations." msgstr "" -#: ../../addon/pubcrawl/pubcrawl.php:1065 +#: ../../addon/pubcrawl/pubcrawl.php:1148 msgid "Enable the ActivityPub protocol for this channel" msgstr "" -#: ../../addon/pubcrawl/pubcrawl.php:1068 +#: ../../addon/pubcrawl/pubcrawl.php:1151 +msgid "Deliver to ActivityPub recipients in privacy groups" +msgstr "" + +#: ../../addon/pubcrawl/pubcrawl.php:1151 +msgid "" +"May result in a large number of mentions and expose all the members of your " +"privacy group" +msgstr "" + +#: ../../addon/pubcrawl/pubcrawl.php:1155 msgid "Send multi-media HTML articles" msgstr "" -#: ../../addon/pubcrawl/pubcrawl.php:1068 +#: ../../addon/pubcrawl/pubcrawl.php:1155 msgid "Not supported by some microblog services such as Mastodon" msgstr "" -#: ../../addon/pubcrawl/pubcrawl.php:1072 +#: ../../addon/pubcrawl/pubcrawl.php:1159 msgid "ActivityPub Protocol Settings" msgstr "" @@ -11185,75 +11457,206 @@ msgstr "" msgid "Smileybutton Settings" msgstr "" -#: ../../addon/cart/myshop.php:138 +#: ../../addon/cart/myshop.php:44 +msgid "Access Denied." +msgstr "" + +#: ../../addon/cart/myshop.php:125 ../../addon/cart/cart.php:1324 msgid "Order Not Found" msgstr "" -#: ../../addon/cart/cart.php:810 -msgid "Order cannot be checked out." +#: ../../addon/cart/myshop.php:155 ../../addon/cart/myshop.php:191 +#: ../../addon/cart/myshop.php:225 ../../addon/cart/myshop.php:273 +#: ../../addon/cart/myshop.php:308 ../../addon/cart/myshop.php:331 +msgid "Access Denied" +msgstr "" + +#: ../../addon/cart/myshop.php:200 ../../addon/cart/myshop.php:234 +#: ../../addon/cart/myshop.php:283 ../../addon/cart/myshop.php:341 +msgid "Invalid Item" msgstr "" -#: ../../addon/cart/cart.php:1073 +#: ../../addon/cart/cart.php:467 +msgid "[cart] Item Added" +msgstr "" + +#: ../../addon/cart/cart.php:851 +msgid "Order already checked out." +msgstr "" + +#: ../../addon/cart/cart.php:1204 msgid "Enable Shopping Cart" msgstr "" -#: ../../addon/cart/cart.php:1080 +#: ../../addon/cart/cart.php:1211 msgid "Enable Test Catalog" msgstr "" -#: ../../addon/cart/cart.php:1088 +#: ../../addon/cart/cart.php:1219 msgid "Enable Manual Payments" msgstr "" -#: ../../addon/cart/cart.php:1103 -msgid "Base Cart Settings" +#: ../../addon/cart/cart.php:1238 +msgid "Base Merchant Currency" msgstr "" -#: ../../addon/cart/cart.php:1151 -msgid "Add Item" +#: ../../addon/cart/cart.php:1250 +msgid "Cart - Base Settings" msgstr "" -#: ../../addon/cart/cart.php:1165 -msgid "Call cart_post_" +#: ../../addon/cart/cart.php:1271 ../../addon/cart/cart.php:1274 +msgid "Shop" msgstr "" -#: ../../addon/cart/cart.php:1195 +#: ../../addon/cart/cart.php:1401 +msgid "You must be logged into the Grid to shop." +msgstr "" + +#: ../../addon/cart/cart.php:1411 msgid "Cart Not Enabled (profile: " msgstr "" -#: ../../addon/cart/cart.php:1226 ../../addon/cart/manual_payments.php:36 +#: ../../addon/cart/cart.php:1442 +#: ../../addon/cart/submodules/paypalbutton.php:417 +#: ../../addon/cart/manual_payments.php:37 msgid "Order not found." msgstr "" -#: ../../addon/cart/cart.php:1262 ../../addon/cart/cart.php:1389 -msgid "No Order Found" +#: ../../addon/cart/cart.php:1451 +msgid "Access denied." msgstr "" -#: ../../addon/cart/cart.php:1270 -msgid "call: " +#: ../../addon/cart/cart.php:1503 ../../addon/cart/cart.php:1647 +msgid "No Order Found" msgstr "" -#: ../../addon/cart/cart.php:1273 +#: ../../addon/cart/cart.php:1512 msgid "An unknown error has occurred Please start again." msgstr "" -#: ../../addon/cart/cart.php:1414 +#: ../../addon/cart/cart.php:1680 msgid "Invalid Payment Type. Please start again." msgstr "" -#: ../../addon/cart/cart.php:1421 +#: ../../addon/cart/cart.php:1687 msgid "Order not found" msgstr "" -#: ../../addon/cart/manual_payments.php:9 +#: ../../addon/cart/submodules/paypalbutton.php:97 +msgid "Enable Paypal Button Module" +msgstr "" + +#: ../../addon/cart/submodules/paypalbutton.php:102 +msgid "Use Production Key" +msgstr "" + +#: ../../addon/cart/submodules/paypalbutton.php:109 +msgid "Paypal Sandbox Client Key" +msgstr "" + +#: ../../addon/cart/submodules/paypalbutton.php:116 +msgid "Paypal Sandbox Secret Key" +msgstr "" + +#: ../../addon/cart/submodules/paypalbutton.php:122 +msgid "Paypal Production Client Key" +msgstr "" + +#: ../../addon/cart/submodules/paypalbutton.php:129 +msgid "Paypal Production Secret Key" +msgstr "" + +#: ../../addon/cart/submodules/paypalbutton.php:143 +msgid "Cart - Paypal Addon" +msgstr "" + +#: ../../addon/cart/submodules/paypalbutton.php:277 +msgid "Paypal button payments are not enabled." +msgstr "" + +#: ../../addon/cart/submodules/paypalbutton.php:295 +msgid "" +"Paypal button payments are not properly configured. Please choose another " +"payment option." +msgstr "" + +#: ../../addon/cart/submodules/hzservices.php:71 +msgid "Enable Hubzilla Services Module" +msgstr "" + +#: ../../addon/cart/submodules/hzservices.php:77 +msgid "Cart - Hubzilla Services Addon" +msgstr "" + +#: ../../addon/cart/submodules/hzservices.php:169 +msgid "New Sku" +msgstr "" + +#: ../../addon/cart/submodules/hzservices.php:204 +msgid "Cannot save edits to locked item." +msgstr "" + +#: ../../addon/cart/submodules/hzservices.php:252 +#: ../../addon/cart/submodules/hzservices.php:339 +msgid "SKU not found." +msgstr "" + +#: ../../addon/cart/submodules/hzservices.php:305 +#: ../../addon/cart/submodules/hzservices.php:309 +msgid "Invalid Activation Directive." +msgstr "" + +#: ../../addon/cart/submodules/hzservices.php:380 +#: ../../addon/cart/submodules/hzservices.php:384 +msgid "Invalid Deactivation Directive." +msgstr "" + +#: ../../addon/cart/submodules/hzservices.php:570 +msgid "Add to this privacy group" +msgstr "" + +#: ../../addon/cart/submodules/hzservices.php:586 +msgid "Set user service class" +msgstr "" + +#: ../../addon/cart/submodules/hzservices.php:613 +msgid "You must be using a local account to purchase this service." +msgstr "" + +#: ../../addon/cart/submodules/hzservices.php:651 +msgid "Changes Locked" +msgstr "" + +#: ../../addon/cart/submodules/hzservices.php:655 +msgid "Item available for purchase." +msgstr "" + +#: ../../addon/cart/submodules/hzservices.php:662 +msgid "Price" +msgstr "" + +#: ../../addon/cart/submodules/hzservices.php:665 +msgid "Add buyer to privacy group" +msgstr "" + +#: ../../addon/cart/submodules/hzservices.php:670 +msgid "Add buyer as connection" +msgstr "" + +#: ../../addon/cart/submodules/hzservices.php:677 +#: ../../addon/cart/submodules/hzservices.php:718 +msgid "Set Service Class" +msgstr "" + +#: ../../addon/cart/manual_payments.php:7 msgid "Error: order mismatch. Please try again." msgstr "" -#: ../../addon/cart/manual_payments.php:29 +#: ../../addon/cart/manual_payments.php:30 msgid "Manual payments are not enabled." msgstr "" -#: ../../addon/cart/manual_payments.php:44 +#: ../../addon/cart/manual_payments.php:46 msgid "Finished" msgstr "" @@ -11738,11 +12141,11 @@ msgstr "" msgid "PumpIO Settings saved." msgstr "" -#: ../../addon/ldapauth/ldapauth.php:61 +#: ../../addon/ldapauth/ldapauth.php:70 msgid "An account has been created for you." msgstr "" -#: ../../addon/ldapauth/ldapauth.php:68 +#: ../../addon/ldapauth/ldapauth.php:77 msgid "Authentication successful but rejected: account creation is disabled." msgstr "" @@ -12054,282 +12457,286 @@ msgstr "" msgid "%1$s poked %2$s" msgstr "" -#: ../../include/conversation.php:251 ../../include/text.php:1129 -#: ../../include/text.php:1133 +#: ../../include/conversation.php:251 ../../include/text.php:1140 +#: ../../include/text.php:1144 msgid "poked" msgstr "" -#: ../../include/conversation.php:736 +#: ../../include/conversation.php:739 #, php-format msgid "View %s's profile @ %s" msgstr "" -#: ../../include/conversation.php:756 +#: ../../include/conversation.php:759 msgid "Categories:" msgstr "" -#: ../../include/conversation.php:757 +#: ../../include/conversation.php:760 msgid "Filed under:" msgstr "" -#: ../../include/conversation.php:783 +#: ../../include/conversation.php:785 msgid "View in context" msgstr "" -#: ../../include/conversation.php:884 +#: ../../include/conversation.php:886 msgid "remove" msgstr "" -#: ../../include/conversation.php:888 +#: ../../include/conversation.php:890 msgid "Loading..." msgstr "" -#: ../../include/conversation.php:889 +#: ../../include/conversation.php:891 msgid "Delete Selected Items" msgstr "" -#: ../../include/conversation.php:932 +#: ../../include/conversation.php:934 msgid "View Source" msgstr "" -#: ../../include/conversation.php:942 +#: ../../include/conversation.php:944 msgid "Follow Thread" msgstr "" -#: ../../include/conversation.php:951 +#: ../../include/conversation.php:953 msgid "Unfollow Thread" msgstr "" -#: ../../include/conversation.php:1062 +#: ../../include/conversation.php:1067 msgid "Edit Connection" msgstr "" -#: ../../include/conversation.php:1072 +#: ../../include/conversation.php:1077 msgid "Message" msgstr "" -#: ../../include/conversation.php:1206 +#: ../../include/conversation.php:1211 #, php-format msgid "%s likes this." msgstr "" -#: ../../include/conversation.php:1206 +#: ../../include/conversation.php:1211 #, php-format msgid "%s doesn't like this." msgstr "" -#: ../../include/conversation.php:1210 +#: ../../include/conversation.php:1215 #, 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:1212 +#: ../../include/conversation.php:1217 #, 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:1218 +#: ../../include/conversation.php:1223 msgid "and" msgstr "" -#: ../../include/conversation.php:1221 +#: ../../include/conversation.php:1226 #, php-format msgid ", and %d other people" msgid_plural ", and %d other people" msgstr[0] "" msgstr[1] "" -#: ../../include/conversation.php:1222 +#: ../../include/conversation.php:1227 #, php-format msgid "%s like this." msgstr "" -#: ../../include/conversation.php:1222 +#: ../../include/conversation.php:1227 #, php-format msgid "%s don't like this." msgstr "" -#: ../../include/conversation.php:1265 +#: ../../include/conversation.php:1270 msgid "Set your location" msgstr "" -#: ../../include/conversation.php:1266 +#: ../../include/conversation.php:1271 msgid "Clear browser location" msgstr "" -#: ../../include/conversation.php:1316 +#: ../../include/conversation.php:1287 +msgid "Embed (existing) photo from your photo albums" +msgstr "" + +#: ../../include/conversation.php:1323 msgid "Tag term:" msgstr "" -#: ../../include/conversation.php:1317 +#: ../../include/conversation.php:1324 msgid "Where are you right now?" msgstr "" -#: ../../include/conversation.php:1322 +#: ../../include/conversation.php:1329 msgid "Choose a different album..." msgstr "" -#: ../../include/conversation.php:1326 +#: ../../include/conversation.php:1333 msgid "Comments enabled" msgstr "" -#: ../../include/conversation.php:1327 +#: ../../include/conversation.php:1334 msgid "Comments disabled" msgstr "" -#: ../../include/conversation.php:1375 +#: ../../include/conversation.php:1383 msgid "Page link name" msgstr "" -#: ../../include/conversation.php:1378 +#: ../../include/conversation.php:1386 msgid "Post as" msgstr "" -#: ../../include/conversation.php:1392 +#: ../../include/conversation.php:1400 msgid "Toggle voting" msgstr "" -#: ../../include/conversation.php:1395 +#: ../../include/conversation.php:1403 msgid "Disable comments" msgstr "" -#: ../../include/conversation.php:1396 +#: ../../include/conversation.php:1404 msgid "Toggle comments" msgstr "" -#: ../../include/conversation.php:1404 +#: ../../include/conversation.php:1412 msgid "Categories (optional, comma-separated list)" msgstr "" -#: ../../include/conversation.php:1427 +#: ../../include/conversation.php:1435 msgid "Other networks and post services" msgstr "" -#: ../../include/conversation.php:1433 +#: ../../include/conversation.php:1441 msgid "Set publish date" msgstr "" -#: ../../include/conversation.php:1693 +#: ../../include/conversation.php:1702 msgid "Commented Order" msgstr "" -#: ../../include/conversation.php:1696 +#: ../../include/conversation.php:1705 msgid "Sort by Comment Date" msgstr "" -#: ../../include/conversation.php:1700 +#: ../../include/conversation.php:1709 msgid "Posted Order" msgstr "" -#: ../../include/conversation.php:1703 +#: ../../include/conversation.php:1712 msgid "Sort by Post Date" msgstr "" -#: ../../include/conversation.php:1711 +#: ../../include/conversation.php:1720 msgid "Posts that mention or involve you" msgstr "" -#: ../../include/conversation.php:1720 +#: ../../include/conversation.php:1729 msgid "Activity Stream - by date" msgstr "" -#: ../../include/conversation.php:1726 +#: ../../include/conversation.php:1735 msgid "Starred" msgstr "" -#: ../../include/conversation.php:1729 +#: ../../include/conversation.php:1738 msgid "Favourite Posts" msgstr "" -#: ../../include/conversation.php:1736 +#: ../../include/conversation.php:1745 msgid "Spam" msgstr "" -#: ../../include/conversation.php:1739 +#: ../../include/conversation.php:1748 msgid "Posts flagged as SPAM" msgstr "" -#: ../../include/conversation.php:1814 ../../include/nav.php:381 +#: ../../include/conversation.php:1823 ../../include/nav.php:373 msgid "Status Messages and Posts" msgstr "" -#: ../../include/conversation.php:1827 ../../include/nav.php:394 +#: ../../include/conversation.php:1836 ../../include/nav.php:386 msgid "Profile Details" msgstr "" -#: ../../include/conversation.php:1837 ../../include/nav.php:404 -#: ../../include/photos.php:666 +#: ../../include/conversation.php:1846 ../../include/nav.php:396 +#: ../../include/photos.php:667 msgid "Photo Albums" msgstr "" -#: ../../include/conversation.php:1845 ../../include/nav.php:412 +#: ../../include/conversation.php:1854 ../../include/nav.php:404 msgid "Files and Storage" msgstr "" -#: ../../include/conversation.php:1882 ../../include/nav.php:447 +#: ../../include/conversation.php:1891 ../../include/nav.php:439 msgid "Bookmarks" msgstr "" -#: ../../include/conversation.php:1885 ../../include/nav.php:450 +#: ../../include/conversation.php:1894 ../../include/nav.php:442 msgid "Saved Bookmarks" msgstr "" -#: ../../include/conversation.php:1896 ../../include/nav.php:461 +#: ../../include/conversation.php:1905 ../../include/nav.php:453 msgid "View Cards" msgstr "" -#: ../../include/conversation.php:1904 +#: ../../include/conversation.php:1913 msgid "articles" msgstr "" -#: ../../include/conversation.php:1907 ../../include/nav.php:472 +#: ../../include/conversation.php:1916 ../../include/nav.php:464 msgid "View Articles" msgstr "" -#: ../../include/conversation.php:1918 ../../include/nav.php:484 +#: ../../include/conversation.php:1927 ../../include/nav.php:476 msgid "View Webpages" msgstr "" -#: ../../include/conversation.php:1987 +#: ../../include/conversation.php:1996 msgctxt "noun" msgid "Attending" msgid_plural "Attending" msgstr[0] "" msgstr[1] "" -#: ../../include/conversation.php:1990 +#: ../../include/conversation.php:1999 msgctxt "noun" msgid "Not Attending" msgid_plural "Not Attending" msgstr[0] "" msgstr[1] "" -#: ../../include/conversation.php:1993 +#: ../../include/conversation.php:2002 msgctxt "noun" msgid "Undecided" msgid_plural "Undecided" msgstr[0] "" msgstr[1] "" -#: ../../include/conversation.php:1996 +#: ../../include/conversation.php:2005 msgctxt "noun" msgid "Agree" msgid_plural "Agrees" msgstr[0] "" msgstr[1] "" -#: ../../include/conversation.php:1999 +#: ../../include/conversation.php:2008 msgctxt "noun" msgid "Disagree" msgid_plural "Disagrees" msgstr[0] "" msgstr[1] "" -#: ../../include/conversation.php:2002 +#: ../../include/conversation.php:2011 msgctxt "noun" msgid "Abstain" msgid_plural "Abstains" @@ -12361,12 +12768,12 @@ msgstr "" msgid "Unable to import a removed channel." msgstr "" -#: ../../include/import.php:46 +#: ../../include/import.php:51 msgid "" "Cannot create a duplicate channel identifier on this system. Import failed." msgstr "" -#: ../../include/import.php:111 +#: ../../include/import.php:116 msgid "Cloned channel not found. Import failed." msgstr "" @@ -12394,340 +12801,345 @@ msgstr "" msgid "newer" msgstr "" -#: ../../include/text.php:961 +#: ../../include/text.php:963 msgid "No connections" msgstr "" -#: ../../include/text.php:993 +#: ../../include/text.php:995 #, php-format msgid "View all %s connections" msgstr "" -#: ../../include/text.php:1129 ../../include/text.php:1133 +#: ../../include/text.php:1051 +#, php-format +msgid "Network: %s" +msgstr "" + +#: ../../include/text.php:1140 ../../include/text.php:1144 msgid "poke" msgstr "" -#: ../../include/text.php:1134 +#: ../../include/text.php:1145 msgid "ping" msgstr "" -#: ../../include/text.php:1134 +#: ../../include/text.php:1145 msgid "pinged" msgstr "" -#: ../../include/text.php:1135 +#: ../../include/text.php:1146 msgid "prod" msgstr "" -#: ../../include/text.php:1135 +#: ../../include/text.php:1146 msgid "prodded" msgstr "" -#: ../../include/text.php:1136 +#: ../../include/text.php:1147 msgid "slap" msgstr "" -#: ../../include/text.php:1136 +#: ../../include/text.php:1147 msgid "slapped" msgstr "" -#: ../../include/text.php:1137 +#: ../../include/text.php:1148 msgid "finger" msgstr "" -#: ../../include/text.php:1137 +#: ../../include/text.php:1148 msgid "fingered" msgstr "" -#: ../../include/text.php:1138 +#: ../../include/text.php:1149 msgid "rebuff" msgstr "" -#: ../../include/text.php:1138 +#: ../../include/text.php:1149 msgid "rebuffed" msgstr "" -#: ../../include/text.php:1161 +#: ../../include/text.php:1172 msgid "happy" msgstr "" -#: ../../include/text.php:1162 +#: ../../include/text.php:1173 msgid "sad" msgstr "" -#: ../../include/text.php:1163 +#: ../../include/text.php:1174 msgid "mellow" msgstr "" -#: ../../include/text.php:1164 +#: ../../include/text.php:1175 msgid "tired" msgstr "" -#: ../../include/text.php:1165 +#: ../../include/text.php:1176 msgid "perky" msgstr "" -#: ../../include/text.php:1166 +#: ../../include/text.php:1177 msgid "angry" msgstr "" -#: ../../include/text.php:1167 +#: ../../include/text.php:1178 msgid "stupefied" msgstr "" -#: ../../include/text.php:1168 +#: ../../include/text.php:1179 msgid "puzzled" msgstr "" -#: ../../include/text.php:1169 +#: ../../include/text.php:1180 msgid "interested" msgstr "" -#: ../../include/text.php:1170 +#: ../../include/text.php:1181 msgid "bitter" msgstr "" -#: ../../include/text.php:1171 +#: ../../include/text.php:1182 msgid "cheerful" msgstr "" -#: ../../include/text.php:1172 +#: ../../include/text.php:1183 msgid "alive" msgstr "" -#: ../../include/text.php:1173 +#: ../../include/text.php:1184 msgid "annoyed" msgstr "" -#: ../../include/text.php:1174 +#: ../../include/text.php:1185 msgid "anxious" msgstr "" -#: ../../include/text.php:1175 +#: ../../include/text.php:1186 msgid "cranky" msgstr "" -#: ../../include/text.php:1176 +#: ../../include/text.php:1187 msgid "disturbed" msgstr "" -#: ../../include/text.php:1177 +#: ../../include/text.php:1188 msgid "frustrated" msgstr "" -#: ../../include/text.php:1178 +#: ../../include/text.php:1189 msgid "depressed" msgstr "" -#: ../../include/text.php:1179 +#: ../../include/text.php:1190 msgid "motivated" msgstr "" -#: ../../include/text.php:1180 +#: ../../include/text.php:1191 msgid "relaxed" msgstr "" -#: ../../include/text.php:1181 +#: ../../include/text.php:1192 msgid "surprised" msgstr "" -#: ../../include/text.php:1360 ../../include/js_strings.php:76 +#: ../../include/text.php:1371 ../../include/js_strings.php:86 msgid "Monday" msgstr "" -#: ../../include/text.php:1360 ../../include/js_strings.php:77 +#: ../../include/text.php:1371 ../../include/js_strings.php:87 msgid "Tuesday" msgstr "" -#: ../../include/text.php:1360 ../../include/js_strings.php:78 +#: ../../include/text.php:1371 ../../include/js_strings.php:88 msgid "Wednesday" msgstr "" -#: ../../include/text.php:1360 ../../include/js_strings.php:79 +#: ../../include/text.php:1371 ../../include/js_strings.php:89 msgid "Thursday" msgstr "" -#: ../../include/text.php:1360 ../../include/js_strings.php:80 +#: ../../include/text.php:1371 ../../include/js_strings.php:90 msgid "Friday" msgstr "" -#: ../../include/text.php:1360 ../../include/js_strings.php:81 +#: ../../include/text.php:1371 ../../include/js_strings.php:91 msgid "Saturday" msgstr "" -#: ../../include/text.php:1360 ../../include/js_strings.php:75 +#: ../../include/text.php:1371 ../../include/js_strings.php:85 msgid "Sunday" msgstr "" -#: ../../include/text.php:1364 ../../include/js_strings.php:51 +#: ../../include/text.php:1375 ../../include/js_strings.php:61 msgid "January" msgstr "" -#: ../../include/text.php:1364 ../../include/js_strings.php:52 +#: ../../include/text.php:1375 ../../include/js_strings.php:62 msgid "February" msgstr "" -#: ../../include/text.php:1364 ../../include/js_strings.php:53 +#: ../../include/text.php:1375 ../../include/js_strings.php:63 msgid "March" msgstr "" -#: ../../include/text.php:1364 ../../include/js_strings.php:54 +#: ../../include/text.php:1375 ../../include/js_strings.php:64 msgid "April" msgstr "" -#: ../../include/text.php:1364 +#: ../../include/text.php:1375 msgid "May" msgstr "" -#: ../../include/text.php:1364 ../../include/js_strings.php:56 +#: ../../include/text.php:1375 ../../include/js_strings.php:66 msgid "June" msgstr "" -#: ../../include/text.php:1364 ../../include/js_strings.php:57 +#: ../../include/text.php:1375 ../../include/js_strings.php:67 msgid "July" msgstr "" -#: ../../include/text.php:1364 ../../include/js_strings.php:58 +#: ../../include/text.php:1375 ../../include/js_strings.php:68 msgid "August" msgstr "" -#: ../../include/text.php:1364 ../../include/js_strings.php:59 +#: ../../include/text.php:1375 ../../include/js_strings.php:69 msgid "September" msgstr "" -#: ../../include/text.php:1364 ../../include/js_strings.php:60 +#: ../../include/text.php:1375 ../../include/js_strings.php:70 msgid "October" msgstr "" -#: ../../include/text.php:1364 ../../include/js_strings.php:61 +#: ../../include/text.php:1375 ../../include/js_strings.php:71 msgid "November" msgstr "" -#: ../../include/text.php:1364 ../../include/js_strings.php:62 +#: ../../include/text.php:1375 ../../include/js_strings.php:72 msgid "December" msgstr "" -#: ../../include/text.php:1428 ../../include/text.php:1432 +#: ../../include/text.php:1449 msgid "Unknown Attachment" msgstr "" -#: ../../include/text.php:1434 ../../include/feedutils.php:860 +#: ../../include/text.php:1451 ../../include/feedutils.php:860 msgid "unknown" msgstr "" -#: ../../include/text.php:1470 +#: ../../include/text.php:1487 msgid "remove category" msgstr "" -#: ../../include/text.php:1544 +#: ../../include/text.php:1561 msgid "remove from file" msgstr "" -#: ../../include/text.php:1686 ../../include/message.php:12 +#: ../../include/text.php:1703 ../../include/message.php:12 msgid "Download binary/encrypted content" msgstr "" -#: ../../include/text.php:1849 ../../include/language.php:397 +#: ../../include/text.php:1866 ../../include/language.php:397 msgid "default" msgstr "" -#: ../../include/text.php:1857 +#: ../../include/text.php:1874 msgid "Page layout" msgstr "" -#: ../../include/text.php:1857 +#: ../../include/text.php:1874 msgid "You can create your own with the layouts tool" msgstr "" -#: ../../include/text.php:1868 +#: ../../include/text.php:1885 msgid "HTML" msgstr "" -#: ../../include/text.php:1871 +#: ../../include/text.php:1888 msgid "Comanche Layout" msgstr "" -#: ../../include/text.php:1876 +#: ../../include/text.php:1893 msgid "PHP" msgstr "" -#: ../../include/text.php:1885 +#: ../../include/text.php:1902 msgid "Page content type" msgstr "" -#: ../../include/text.php:2018 +#: ../../include/text.php:2035 msgid "activity" msgstr "" -#: ../../include/text.php:2100 +#: ../../include/text.php:2135 msgid "a-z, 0-9, -, and _ only" msgstr "" -#: ../../include/text.php:2419 +#: ../../include/text.php:2455 msgid "Design Tools" msgstr "" -#: ../../include/text.php:2425 +#: ../../include/text.php:2461 msgid "Pages" msgstr "" -#: ../../include/text.php:2447 +#: ../../include/text.php:2483 msgid "Import website..." msgstr "" -#: ../../include/text.php:2448 +#: ../../include/text.php:2484 msgid "Select folder to import" msgstr "" -#: ../../include/text.php:2449 +#: ../../include/text.php:2485 msgid "Import from a zipped folder:" msgstr "" -#: ../../include/text.php:2450 +#: ../../include/text.php:2486 msgid "Import from cloud files:" msgstr "" -#: ../../include/text.php:2451 +#: ../../include/text.php:2487 msgid "/cloud/channel/path/to/folder" msgstr "" -#: ../../include/text.php:2452 +#: ../../include/text.php:2488 msgid "Enter path to website files" msgstr "" -#: ../../include/text.php:2453 +#: ../../include/text.php:2489 msgid "Select folder" msgstr "" -#: ../../include/text.php:2454 +#: ../../include/text.php:2490 msgid "Export website..." msgstr "" -#: ../../include/text.php:2455 +#: ../../include/text.php:2491 msgid "Export to a zip file" msgstr "" -#: ../../include/text.php:2456 +#: ../../include/text.php:2492 msgid "website.zip" msgstr "" -#: ../../include/text.php:2457 +#: ../../include/text.php:2493 msgid "Enter a name for the zip file." msgstr "" -#: ../../include/text.php:2458 +#: ../../include/text.php:2494 msgid "Export to cloud files" msgstr "" -#: ../../include/text.php:2459 +#: ../../include/text.php:2495 msgid "/path/to/export/folder" msgstr "" -#: ../../include/text.php:2460 +#: ../../include/text.php:2496 msgid "Enter a path to a cloud files destination." msgstr "" -#: ../../include/text.php:2461 +#: ../../include/text.php:2497 msgid "Specify folder" msgstr "" @@ -12775,7 +13187,7 @@ msgstr "" msgid "View all %d common connections" msgstr "" -#: ../../include/markdown.php:158 ../../include/bbcode.php:356 +#: ../../include/markdown.php:158 ../../include/bbcode.php:358 #, php-format msgid "%1$s wrote the following %2$s %3$s" msgstr "" @@ -12883,182 +13295,224 @@ msgstr "" msgid "Unsaved changes. Are you sure you wish to leave this page?" msgstr "" +#: ../../include/js_strings.php:26 +msgid "lovely" +msgstr "" + +#: ../../include/js_strings.php:27 +msgid "wonderful" +msgstr "" + +#: ../../include/js_strings.php:28 +msgid "fantastic" +msgstr "" + +#: ../../include/js_strings.php:29 +msgid "great" +msgstr "" + +#: ../../include/js_strings.php:30 +msgid "" +"Your chosen nickname was either already taken or not valid. Please use our " +"suggestion (" +msgstr "" + #: ../../include/js_strings.php:31 -msgid "timeago.prefixAgo" +msgid ") or enter a new one." msgstr "" #: ../../include/js_strings.php:32 -msgid "timeago.prefixFromNow" +msgid "Thank you, this nickname is valid." msgstr "" #: ../../include/js_strings.php:33 -msgid "timeago.suffixAgo" +msgid "A channel name is required." msgstr "" #: ../../include/js_strings.php:34 +msgid "This is a " +msgstr "" + +#: ../../include/js_strings.php:35 +msgid " channel name" +msgstr "" + +#: ../../include/js_strings.php:41 +msgid "timeago.prefixAgo" +msgstr "" + +#: ../../include/js_strings.php:42 +msgid "timeago.prefixFromNow" +msgstr "" + +#: ../../include/js_strings.php:43 +msgid "timeago.suffixAgo" +msgstr "" + +#: ../../include/js_strings.php:44 msgid "timeago.suffixFromNow" msgstr "" -#: ../../include/js_strings.php:37 +#: ../../include/js_strings.php:47 msgid "less than a minute" msgstr "" -#: ../../include/js_strings.php:38 +#: ../../include/js_strings.php:48 msgid "about a minute" msgstr "" -#: ../../include/js_strings.php:39 +#: ../../include/js_strings.php:49 #, php-format msgid "%d minutes" msgstr "" -#: ../../include/js_strings.php:40 +#: ../../include/js_strings.php:50 msgid "about an hour" msgstr "" -#: ../../include/js_strings.php:41 +#: ../../include/js_strings.php:51 #, php-format msgid "about %d hours" msgstr "" -#: ../../include/js_strings.php:42 +#: ../../include/js_strings.php:52 msgid "a day" msgstr "" -#: ../../include/js_strings.php:43 +#: ../../include/js_strings.php:53 #, php-format msgid "%d days" msgstr "" -#: ../../include/js_strings.php:44 +#: ../../include/js_strings.php:54 msgid "about a month" msgstr "" -#: ../../include/js_strings.php:45 +#: ../../include/js_strings.php:55 #, php-format msgid "%d months" msgstr "" -#: ../../include/js_strings.php:46 +#: ../../include/js_strings.php:56 msgid "about a year" msgstr "" -#: ../../include/js_strings.php:47 +#: ../../include/js_strings.php:57 #, php-format msgid "%d years" msgstr "" -#: ../../include/js_strings.php:48 +#: ../../include/js_strings.php:58 msgid " " msgstr "" -#: ../../include/js_strings.php:49 +#: ../../include/js_strings.php:59 msgid "timeago.numbers" msgstr "" -#: ../../include/js_strings.php:55 +#: ../../include/js_strings.php:65 msgctxt "long" msgid "May" msgstr "" -#: ../../include/js_strings.php:63 +#: ../../include/js_strings.php:73 msgid "Jan" msgstr "" -#: ../../include/js_strings.php:64 +#: ../../include/js_strings.php:74 msgid "Feb" msgstr "" -#: ../../include/js_strings.php:65 +#: ../../include/js_strings.php:75 msgid "Mar" msgstr "" -#: ../../include/js_strings.php:66 +#: ../../include/js_strings.php:76 msgid "Apr" msgstr "" -#: ../../include/js_strings.php:67 +#: ../../include/js_strings.php:77 msgctxt "short" msgid "May" msgstr "" -#: ../../include/js_strings.php:68 +#: ../../include/js_strings.php:78 msgid "Jun" msgstr "" -#: ../../include/js_strings.php:69 +#: ../../include/js_strings.php:79 msgid "Jul" msgstr "" -#: ../../include/js_strings.php:70 +#: ../../include/js_strings.php:80 msgid "Aug" msgstr "" -#: ../../include/js_strings.php:71 +#: ../../include/js_strings.php:81 msgid "Sep" msgstr "" -#: ../../include/js_strings.php:72 +#: ../../include/js_strings.php:82 msgid "Oct" msgstr "" -#: ../../include/js_strings.php:73 +#: ../../include/js_strings.php:83 msgid "Nov" msgstr "" -#: ../../include/js_strings.php:74 +#: ../../include/js_strings.php:84 msgid "Dec" msgstr "" -#: ../../include/js_strings.php:82 +#: ../../include/js_strings.php:92 msgid "Sun" msgstr "" -#: ../../include/js_strings.php:83 +#: ../../include/js_strings.php:93 msgid "Mon" msgstr "" -#: ../../include/js_strings.php:84 +#: ../../include/js_strings.php:94 msgid "Tue" msgstr "" -#: ../../include/js_strings.php:85 +#: ../../include/js_strings.php:95 msgid "Wed" msgstr "" -#: ../../include/js_strings.php:86 +#: ../../include/js_strings.php:96 msgid "Thu" msgstr "" -#: ../../include/js_strings.php:87 +#: ../../include/js_strings.php:97 msgid "Fri" msgstr "" -#: ../../include/js_strings.php:88 +#: ../../include/js_strings.php:98 msgid "Sat" msgstr "" -#: ../../include/js_strings.php:89 +#: ../../include/js_strings.php:99 msgctxt "calendar" msgid "today" msgstr "" -#: ../../include/js_strings.php:90 +#: ../../include/js_strings.php:100 msgctxt "calendar" msgid "month" msgstr "" -#: ../../include/js_strings.php:91 +#: ../../include/js_strings.php:101 msgctxt "calendar" msgid "week" msgstr "" -#: ../../include/js_strings.php:92 +#: ../../include/js_strings.php:102 msgctxt "calendar" msgid "day" msgstr "" -#: ../../include/js_strings.php:93 +#: ../../include/js_strings.php:103 msgctxt "calendar" msgid "All day" msgstr "" @@ -13102,65 +13556,69 @@ msgstr "" msgid "%1$s has an updated %2$s, changing %3$s." msgstr "" -#: ../../include/attach.php:265 ../../include/attach.php:361 +#: ../../include/attach.php:265 ../../include/attach.php:374 msgid "Item was not found." msgstr "" -#: ../../include/attach.php:554 +#: ../../include/attach.php:282 +msgid "Unknown error." +msgstr "" + +#: ../../include/attach.php:567 msgid "No source file." msgstr "" -#: ../../include/attach.php:576 +#: ../../include/attach.php:589 msgid "Cannot locate file to replace" msgstr "" -#: ../../include/attach.php:595 +#: ../../include/attach.php:608 msgid "Cannot locate file to revise/update" msgstr "" -#: ../../include/attach.php:737 +#: ../../include/attach.php:750 #, php-format msgid "File exceeds size limit of %d" msgstr "" -#: ../../include/attach.php:758 +#: ../../include/attach.php:771 #, php-format msgid "You have reached your limit of %1$.0f Mbytes attachment storage." msgstr "" -#: ../../include/attach.php:940 +#: ../../include/attach.php:953 msgid "File upload failed. Possible system limit or action terminated." msgstr "" -#: ../../include/attach.php:969 +#: ../../include/attach.php:982 msgid "Stored file could not be verified. Upload failed." msgstr "" -#: ../../include/attach.php:1043 ../../include/attach.php:1059 +#: ../../include/attach.php:1056 ../../include/attach.php:1072 msgid "Path not available." msgstr "" -#: ../../include/attach.php:1108 ../../include/attach.php:1273 +#: ../../include/attach.php:1121 ../../include/attach.php:1286 msgid "Empty pathname" msgstr "" -#: ../../include/attach.php:1134 +#: ../../include/attach.php:1147 msgid "duplicate filename or path" msgstr "" -#: ../../include/attach.php:1159 +#: ../../include/attach.php:1172 msgid "Path not found." msgstr "" -#: ../../include/attach.php:1227 +#: ../../include/attach.php:1240 msgid "mkdir failed." msgstr "" -#: ../../include/attach.php:1231 +#: ../../include/attach.php:1244 msgid "database storage failed." msgstr "" -#: ../../include/attach.php:1279 +#: ../../include/attach.php:1292 msgid "Empty path" msgstr "" @@ -13170,71 +13628,71 @@ msgid "" "form has been opened for too long (>3 hours) before submitting it." msgstr "" -#: ../../include/items.php:885 ../../include/items.php:945 +#: ../../include/items.php:891 ../../include/items.php:951 msgid "(Unknown)" msgstr "" -#: ../../include/items.php:1133 +#: ../../include/items.php:1137 msgid "Visible to anybody on the internet." msgstr "" -#: ../../include/items.php:1135 +#: ../../include/items.php:1139 msgid "Visible to you only." msgstr "" -#: ../../include/items.php:1137 +#: ../../include/items.php:1141 msgid "Visible to anybody in this network." msgstr "" -#: ../../include/items.php:1139 +#: ../../include/items.php:1143 msgid "Visible to anybody authenticated." msgstr "" -#: ../../include/items.php:1141 +#: ../../include/items.php:1145 #, php-format msgid "Visible to anybody on %s." msgstr "" -#: ../../include/items.php:1143 +#: ../../include/items.php:1147 msgid "Visible to all connections." msgstr "" -#: ../../include/items.php:1145 +#: ../../include/items.php:1149 msgid "Visible to approved connections." msgstr "" -#: ../../include/items.php:1147 +#: ../../include/items.php:1151 msgid "Visible to specific connections." msgstr "" -#: ../../include/items.php:4197 +#: ../../include/items.php:4141 msgid "Privacy group is empty." msgstr "" -#: ../../include/items.php:4204 +#: ../../include/items.php:4148 #, php-format msgid "Privacy group: %s" msgstr "" -#: ../../include/items.php:4216 +#: ../../include/items.php:4160 msgid "Connection not found." msgstr "" -#: ../../include/items.php:4565 +#: ../../include/items.php:4509 msgid "profile photo" msgstr "" -#: ../../include/items.php:4756 +#: ../../include/items.php:4700 #, php-format msgid "[Edited %s]" msgstr "" -#: ../../include/items.php:4756 +#: ../../include/items.php:4700 msgctxt "edit_activity" msgid "Post" msgstr "" -#: ../../include/items.php:4756 +#: ../../include/items.php:4700 msgctxt "edit_activity" msgid "Comment" msgstr "" @@ -13424,63 +13882,47 @@ msgstr "" msgid "Cancelled" msgstr "" -#: ../../include/event.php:1310 ../../include/connections.php:692 +#: ../../include/event.php:1310 ../../include/connections.php:698 msgid "Home, Voice" msgstr "" -#: ../../include/event.php:1311 ../../include/connections.php:693 +#: ../../include/event.php:1311 ../../include/connections.php:699 msgid "Home, Fax" msgstr "" -#: ../../include/event.php:1313 ../../include/connections.php:695 +#: ../../include/event.php:1313 ../../include/connections.php:701 msgid "Work, Voice" msgstr "" -#: ../../include/event.php:1314 ../../include/connections.php:696 +#: ../../include/event.php:1314 ../../include/connections.php:702 msgid "Work, Fax" msgstr "" -#: ../../include/network.php:762 +#: ../../include/network.php:760 msgid "view full size" msgstr "" -#: ../../include/network.php:1764 ../../include/network.php:1765 -msgid "Friendica" -msgstr "" - #: ../../include/network.php:1766 -msgid "OStatus" -msgstr "" - -#: ../../include/network.php:1767 msgid "GNU-Social" msgstr "" -#: ../../include/network.php:1768 +#: ../../include/network.php:1767 msgid "RSS/Atom" msgstr "" #: ../../include/network.php:1771 -msgid "Diaspora" -msgstr "" - -#: ../../include/network.php:1772 msgid "Facebook" msgstr "" #: ../../include/network.php:1773 -msgid "Zot" -msgstr "" - -#: ../../include/network.php:1774 msgid "LinkedIn" msgstr "" -#: ../../include/network.php:1775 +#: ../../include/network.php:1774 msgid "XMPP/IM" msgstr "" -#: ../../include/network.php:1776 +#: ../../include/network.php:1775 msgid "MySpace" msgstr "" @@ -13522,26 +13964,26 @@ msgstr "" msgid "Cannot locate DNS info for database server '%s'" msgstr "" -#: ../../include/bbcode.php:198 ../../include/bbcode.php:1200 -#: ../../include/bbcode.php:1203 ../../include/bbcode.php:1208 -#: ../../include/bbcode.php:1211 ../../include/bbcode.php:1214 -#: ../../include/bbcode.php:1217 ../../include/bbcode.php:1222 -#: ../../include/bbcode.php:1225 ../../include/bbcode.php:1230 -#: ../../include/bbcode.php:1233 ../../include/bbcode.php:1236 -#: ../../include/bbcode.php:1239 +#: ../../include/bbcode.php:200 ../../include/bbcode.php:1202 +#: ../../include/bbcode.php:1205 ../../include/bbcode.php:1210 +#: ../../include/bbcode.php:1213 ../../include/bbcode.php:1216 +#: ../../include/bbcode.php:1219 ../../include/bbcode.php:1224 +#: ../../include/bbcode.php:1227 ../../include/bbcode.php:1232 +#: ../../include/bbcode.php:1235 ../../include/bbcode.php:1238 +#: ../../include/bbcode.php:1241 msgid "Image/photo" msgstr "" -#: ../../include/bbcode.php:237 ../../include/bbcode.php:1250 +#: ../../include/bbcode.php:239 ../../include/bbcode.php:1252 msgid "Encrypted content" msgstr "" -#: ../../include/bbcode.php:253 +#: ../../include/bbcode.php:255 #, php-format msgid "Install %1$s element %2$s" msgstr "" -#: ../../include/bbcode.php:257 +#: ../../include/bbcode.php:259 #, php-format msgid "You have reached your limit of %1$.0f Mbytes attachment storage." msgstr "" @@ -13550,51 +13992,55 @@ msgstr "" msgid "card" msgstr "" -#: ../../include/bbcode.php:348 +#: ../../include/bbcode.php:350 msgid "card" msgstr "" -#: ../../include/bbcode.php:350 +#: ../../include/bbcode.php:352 msgid "article" msgstr "" -#: ../../include/bbcode.php:433 ../../include/bbcode.php:441 +#: ../../include/bbcode.php:435 ../../include/bbcode.php:443 msgid "Click to open/close" msgstr "" -#: ../../include/bbcode.php:441 +#: ../../include/bbcode.php:443 msgid "spoiler" msgstr "" -#: ../../include/bbcode.php:454 +#: ../../include/bbcode.php:456 msgid "View article" msgstr "" -#: ../../include/bbcode.php:454 +#: ../../include/bbcode.php:456 msgid "View summary" msgstr "" -#: ../../include/bbcode.php:1188 +#: ../../include/bbcode.php:1190 msgid "$1 wrote:" msgstr "" -#: ../../include/oembed.php:329 +#: ../../include/oembed.php:224 +msgid "View PDF" +msgstr "" + +#: ../../include/oembed.php:347 msgid " by " msgstr "" -#: ../../include/oembed.php:330 +#: ../../include/oembed.php:348 msgid " on " msgstr "" -#: ../../include/oembed.php:359 +#: ../../include/oembed.php:377 msgid "Embedded content" msgstr "" -#: ../../include/oembed.php:368 +#: ../../include/oembed.php:386 msgid "Embedding disabled" msgstr "" -#: ../../include/zid.php:347 +#: ../../include/zid.php:351 #, php-format msgid "OpenWebAuth: %1$s welcomes %2$s" msgstr "" @@ -13723,10 +14169,6 @@ msgstr "" msgid "Access Control and Permissions" msgstr "" -#: ../../include/features.php:221 ../../include/group.php:328 -msgid "Privacy Groups" -msgstr "" - #: ../../include/features.php:222 msgid "Enable management and selection of privacy groups" msgstr "" @@ -13740,7 +14182,7 @@ msgid "Ability to create multiple profiles" msgstr "" #: ../../include/features.php:241 -msgid "Provide alternate connection permission roles." +msgid "Create custom connection permission limits" msgstr "" #: ../../include/features.php:249 @@ -13863,94 +14305,112 @@ msgid "Save search terms for re-use" msgstr "" #: ../../include/features.php:390 -msgid "Network Personal Tab" +msgid "Alternate Stream Order" msgstr "" #: ../../include/features.php:391 -msgid "Enable tab to display only Network posts that you've interacted on" +msgid "" +"Ability to order the stream by last post date, last comment date or " +"unthreaded activities" msgstr "" #: ../../include/features.php:399 -msgid "Network New Tab" +msgid "Contact Filter" msgstr "" #: ../../include/features.php:400 -msgid "Enable tab to display all new Network activity" +msgid "Ability to display only posts of a selected contact" msgstr "" #: ../../include/features.php:408 -msgid "Affinity Tool" +msgid "Forum Filter" msgstr "" #: ../../include/features.php:409 -msgid "Filter stream activity by depth of relationships" +msgid "Ability to display only posts of a specific forum" +msgstr "" + +#: ../../include/features.php:417 +msgid "Personal Posts Filter" msgstr "" #: ../../include/features.php:418 -msgid "Show friend and connection suggestions" +msgid "Ability to display only posts that you've interacted on" msgstr "" #: ../../include/features.php:426 -msgid "Connection Filtering" +msgid "Affinity Tool" msgstr "" #: ../../include/features.php:427 +msgid "Filter stream activity by depth of relationships" +msgstr "" + +#: ../../include/features.php:436 +msgid "Show friend and connection suggestions" +msgstr "" + +#: ../../include/features.php:444 +msgid "Connection Filtering" +msgstr "" + +#: ../../include/features.php:445 msgid "Filter incoming posts from connections based on keywords/content" msgstr "" -#: ../../include/features.php:439 +#: ../../include/features.php:457 msgid "Post/Comment Tools" msgstr "" -#: ../../include/features.php:443 +#: ../../include/features.php:461 msgid "Community Tagging" msgstr "" -#: ../../include/features.php:444 +#: ../../include/features.php:462 msgid "Ability to tag existing posts" msgstr "" -#: ../../include/features.php:452 +#: ../../include/features.php:470 msgid "Post Categories" msgstr "" -#: ../../include/features.php:453 +#: ../../include/features.php:471 msgid "Add categories to your posts" msgstr "" -#: ../../include/features.php:461 +#: ../../include/features.php:479 msgid "Emoji Reactions" msgstr "" -#: ../../include/features.php:462 +#: ../../include/features.php:480 msgid "Add emoji reaction ability to posts" msgstr "" -#: ../../include/features.php:471 +#: ../../include/features.php:489 msgid "Ability to file posts under folders" msgstr "" -#: ../../include/features.php:479 +#: ../../include/features.php:497 msgid "Dislike Posts" msgstr "" -#: ../../include/features.php:480 +#: ../../include/features.php:498 msgid "Ability to dislike posts/comments" msgstr "" -#: ../../include/features.php:488 +#: ../../include/features.php:506 msgid "Star Posts" msgstr "" -#: ../../include/features.php:489 +#: ../../include/features.php:507 msgid "Ability to mark special posts with a star indicator" msgstr "" -#: ../../include/features.php:497 +#: ../../include/features.php:515 msgid "Tag Cloud" msgstr "" -#: ../../include/features.php:498 +#: ../../include/features.php:516 msgid "Provide a personal tag cloud on your channel page" msgstr "" @@ -14019,38 +14479,38 @@ msgstr "" msgid "Registration confirmation for %s" msgstr "" -#: ../../include/account.php:383 +#: ../../include/account.php:385 #, php-format msgid "Registration request at %s" msgstr "" -#: ../../include/account.php:405 +#: ../../include/account.php:407 msgid "your registration password" msgstr "" -#: ../../include/account.php:411 ../../include/account.php:473 +#: ../../include/account.php:413 ../../include/account.php:475 #, php-format msgid "Registration details for %s" msgstr "" -#: ../../include/account.php:484 +#: ../../include/account.php:486 msgid "Account approved." msgstr "" -#: ../../include/account.php:524 +#: ../../include/account.php:526 #, php-format msgid "Registration revoked for %s" msgstr "" -#: ../../include/account.php:803 ../../include/account.php:805 +#: ../../include/account.php:805 ../../include/account.php:807 msgid "Click here to upgrade." msgstr "" -#: ../../include/account.php:811 +#: ../../include/account.php:813 msgid "This action exceeds the limits set by your subscription plan." msgstr "" -#: ../../include/account.php:816 +#: ../../include/account.php:818 msgid "This action is not available under your subscription plan." msgstr "" @@ -14135,106 +14595,110 @@ msgstr "" msgid "Happy Birthday %1$s" msgstr "" -#: ../../include/nav.php:96 +#: ../../include/nav.php:88 msgid "Remote authentication" msgstr "" -#: ../../include/nav.php:96 +#: ../../include/nav.php:88 msgid "Click to authenticate to your home hub" msgstr "" -#: ../../include/nav.php:102 ../../include/nav.php:190 -msgid "Manage Your Channels" +#: ../../include/nav.php:94 +msgid "Manage your channels" +msgstr "" + +#: ../../include/nav.php:97 +msgid "Manage your privacy groups" msgstr "" -#: ../../include/nav.php:105 ../../include/nav.php:192 +#: ../../include/nav.php:99 msgid "Account/Channel Settings" msgstr "" -#: ../../include/nav.php:111 ../../include/nav.php:140 +#: ../../include/nav.php:105 ../../include/nav.php:134 msgid "End this session" msgstr "" -#: ../../include/nav.php:114 +#: ../../include/nav.php:108 msgid "Your profile page" msgstr "" -#: ../../include/nav.php:117 +#: ../../include/nav.php:111 msgid "Manage/Edit profiles" msgstr "" -#: ../../include/nav.php:126 ../../include/nav.php:130 +#: ../../include/nav.php:120 ../../include/nav.php:124 msgid "Sign in" msgstr "" -#: ../../include/nav.php:157 +#: ../../include/nav.php:151 msgid "Take me home" msgstr "" -#: ../../include/nav.php:159 +#: ../../include/nav.php:153 msgid "Log me out of this site" msgstr "" -#: ../../include/nav.php:164 +#: ../../include/nav.php:158 msgid "Create an account" msgstr "" -#: ../../include/nav.php:176 +#: ../../include/nav.php:170 msgid "Help and documentation" msgstr "" -#: ../../include/nav.php:179 +#: ../../include/nav.php:185 msgid "Search site @name, !forum, #tag, ?docs, content" msgstr "" -#: ../../include/nav.php:199 +#: ../../include/nav.php:191 msgid "Site Setup and Configuration" msgstr "" -#: ../../include/nav.php:290 +#: ../../include/nav.php:282 msgid "@name, !forum, #tag, ?doc, content" msgstr "" -#: ../../include/nav.php:291 +#: ../../include/nav.php:283 msgid "Please wait..." msgstr "" -#: ../../include/nav.php:297 +#: ../../include/nav.php:289 msgid "Add Apps" msgstr "" -#: ../../include/nav.php:298 +#: ../../include/nav.php:290 msgid "Arrange Apps" msgstr "" -#: ../../include/nav.php:299 +#: ../../include/nav.php:291 msgid "Toggle System Apps" msgstr "" -#: ../../include/photos.php:150 +#: ../../include/photos.php:151 #, php-format msgid "Image exceeds website size limit of %lu bytes" msgstr "" -#: ../../include/photos.php:161 +#: ../../include/photos.php:162 msgid "Image file is empty." msgstr "" -#: ../../include/photos.php:326 +#: ../../include/photos.php:327 msgid "Photo storage failed." msgstr "" -#: ../../include/photos.php:375 +#: ../../include/photos.php:376 msgid "a new photo" msgstr "" -#: ../../include/photos.php:379 +#: ../../include/photos.php:380 #, php-format msgctxt "photo_upload" msgid "%1$s posted %2$s to %3$s" msgstr "" -#: ../../include/photos.php:671 +#: ../../include/photos.php:672 msgid "Upload New Photos" msgstr "" @@ -14246,12 +14710,12 @@ msgstr "" msgid "Unable to verify channel signature" msgstr "" -#: ../../include/zot.php:2552 +#: ../../include/zot.php:2557 #, php-format msgid "Unable to verify site signature for %s" msgstr "" -#: ../../include/zot.php:4219 +#: ../../include/zot.php:4221 msgid "invalid target signature" msgstr "" @@ -14266,19 +14730,19 @@ msgstr "" msgid "Add new connections to this privacy group" msgstr "" -#: ../../include/group.php:306 +#: ../../include/group.php:298 msgid "edit" msgstr "" -#: ../../include/group.php:329 +#: ../../include/group.php:321 msgid "Edit group" msgstr "" -#: ../../include/group.php:330 +#: ../../include/group.php:322 msgid "Add privacy group" msgstr "" -#: ../../include/group.php:331 +#: ../../include/group.php:323 msgid "Channels not in any privacy group" msgstr "" @@ -14290,19 +14754,19 @@ msgstr "" msgid "Open the selected location in a different window or browser tab" msgstr "" -#: ../../include/auth.php:152 +#: ../../include/auth.php:192 msgid "Delegation session ended." msgstr "" -#: ../../include/auth.php:156 +#: ../../include/auth.php:196 msgid "Logged out." msgstr "" -#: ../../include/auth.php:273 +#: ../../include/auth.php:291 msgid "Email validation is incomplete. Please check your email." msgstr "" -#: ../../include/auth.php:289 +#: ../../include/auth.php:307 msgid "Failed authentication" msgstr "" diff --git a/util/php2po.php b/util/php2po.php index ff41e6d1e..c165006a1 100644 --- a/util/php2po.php +++ b/util/php2po.php @@ -1,11 +1,11 @@ <?php - if(! class_exists('App')) { - class TmpA { - public $strings = Array(); - } - $a = new TmpA(); - } + if(! class_exists('App')) { + class App { + static public $rtl; + static public $strings = Array(); + } + } if ($argc!=2) { print "Usage: ".$argv[0]." <hstrings.php>\n\n"; @@ -32,17 +32,17 @@ if ($k!="" && substr($l,0,7)=="msgstr "){ $ink = False; - $v = '""'; + $v = ''; //echo "DBG: k:'$k'\n"; if (isset(App::$strings[$k])) { - $v= '"'.App::$strings[$k].'"'; + $v= App::$strings[$k]; //echo "DBG\n"; //var_dump($k, $v, App::$strings[$k], $v); //echo "/DBG\n"; } //echo "DBG: v:'$v'\n"; - $l = "msgstr ".$v."\n"; + $l = "msgstr \"".str_replace('"','\"',$v)."\"\n"; } if (substr($l,0,6)=="msgid_" || substr($l,0,7)=="msgstr[" )$ink = False;; diff --git a/util/update_theme_repo b/util/update_theme_repo index 3a6e3dbd0..3d3cafe84 100755 --- a/util/update_theme_repo +++ b/util/update_theme_repo @@ -2,6 +2,8 @@ set -f +set -f + if [ $# -ne 1 ]; then echo usage: $0 repository echo "Repositories:" diff --git a/util/update_widget_repo b/util/update_widget_repo index a04714c3e..70d09f959 100755 --- a/util/update_widget_repo +++ b/util/update_widget_repo @@ -27,6 +27,10 @@ for a in "${filelist[@]}" ; do # echo 'ignoring git' continue; fi + if [ ! -d ../extend/widget/$1/$base ]; then +# echo $a 'not a directory' + continue; + fi if [ -x $base ]; then # echo $base 'file exists' continue; diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index e7e1de1d0..dca528ad4 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -807,6 +807,7 @@ return array( 'Zotlabs\\Lib\\JSalmon' => $baseDir . '/Zotlabs/Lib/JSalmon.php', 'Zotlabs\\Lib\\LDSignatures' => $baseDir . '/Zotlabs/Lib/LDSignatures.php', 'Zotlabs\\Lib\\MarkdownSoap' => $baseDir . '/Zotlabs/Lib/MarkdownSoap.php', + 'Zotlabs\\Lib\\MessageFilter' => $baseDir . '/Zotlabs/Lib/MessageFilter.php', 'Zotlabs\\Lib\\NativeWiki' => $baseDir . '/Zotlabs/Lib/NativeWiki.php', 'Zotlabs\\Lib\\NativeWikiPage' => $baseDir . '/Zotlabs/Lib/NativeWikiPage.php', 'Zotlabs\\Lib\\PConfig' => $baseDir . '/Zotlabs/Lib/PConfig.php', @@ -826,11 +827,11 @@ return array( '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\\Addons' => $baseDir . '/Zotlabs/Module/Admin/Addons.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', @@ -926,6 +927,7 @@ return array( 'Zotlabs\\Module\\Notifications' => $baseDir . '/Zotlabs/Module/Notifications.php', 'Zotlabs\\Module\\Notify' => $baseDir . '/Zotlabs/Module/Notify.php', 'Zotlabs\\Module\\OAuth2TestVehicle' => $baseDir . '/Zotlabs/Module/Oauth2testvehicle.php', + 'Zotlabs\\Module\\Oauthinfo' => $baseDir . '/Zotlabs/Module/Oauthinfo.php', 'Zotlabs\\Module\\Ochannel' => $baseDir . '/Zotlabs/Module/Ochannel.php', 'Zotlabs\\Module\\Oembed' => $baseDir . '/Zotlabs/Module/Oembed.php', 'Zotlabs\\Module\\Oep' => $baseDir . '/Zotlabs/Module/Oep.php', @@ -1250,6 +1252,9 @@ return array( 'Zotlabs\\Update\\_1210' => $baseDir . '/Zotlabs/Update/_1210.php', 'Zotlabs\\Update\\_1211' => $baseDir . '/Zotlabs/Update/_1211.php', 'Zotlabs\\Update\\_1212' => $baseDir . '/Zotlabs/Update/_1212.php', + 'Zotlabs\\Update\\_1213' => $baseDir . '/Zotlabs/Update/_1213.php', + 'Zotlabs\\Update\\_1214' => $baseDir . '/Zotlabs/Update/_1214.php', + 'Zotlabs\\Update\\_1215' => $baseDir . '/Zotlabs/Update/_1215.php', 'Zotlabs\\Web\\CheckJS' => $baseDir . '/Zotlabs/Web/CheckJS.php', 'Zotlabs\\Web\\Controller' => $baseDir . '/Zotlabs/Web/Controller.php', 'Zotlabs\\Web\\HTTPHeaders' => $baseDir . '/Zotlabs/Web/HTTPHeaders.php', @@ -1261,11 +1266,14 @@ return array( 'Zotlabs\\Web\\SubModule' => $baseDir . '/Zotlabs/Web/SubModule.php', 'Zotlabs\\Web\\WebServer' => $baseDir . '/Zotlabs/Web/WebServer.php', 'Zotlabs\\Widget\\Activity' => $baseDir . '/Zotlabs/Widget/Activity.php', + 'Zotlabs\\Widget\\Activity_filter' => $baseDir . '/Zotlabs/Widget/Activity_filter.php', + 'Zotlabs\\Widget\\Activity_order' => $baseDir . '/Zotlabs/Widget/Activity_order.php', 'Zotlabs\\Widget\\Admin' => $baseDir . '/Zotlabs/Widget/Admin.php', 'Zotlabs\\Widget\\Affinity' => $baseDir . '/Zotlabs/Widget/Affinity.php', 'Zotlabs\\Widget\\Album' => $baseDir . '/Zotlabs/Widget/Album.php', 'Zotlabs\\Widget\\Appcategories' => $baseDir . '/Zotlabs/Widget/Appcategories.php', 'Zotlabs\\Widget\\Appcloud' => $baseDir . '/Zotlabs/Widget/Appcloud.php', + 'Zotlabs\\Widget\\Appstore' => $baseDir . '/Zotlabs/Widget/Appstore.php', 'Zotlabs\\Widget\\Archive' => $baseDir . '/Zotlabs/Widget/Archive.php', 'Zotlabs\\Widget\\Bookmarkedchats' => $baseDir . '/Zotlabs/Widget/Bookmarkedchats.php', 'Zotlabs\\Widget\\Catcloud' => $baseDir . '/Zotlabs/Widget/Catcloud.php', diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 11f2c01d6..cd4782104 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -961,6 +961,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Lib\\JSalmon' => __DIR__ . '/../..' . '/Zotlabs/Lib/JSalmon.php', 'Zotlabs\\Lib\\LDSignatures' => __DIR__ . '/../..' . '/Zotlabs/Lib/LDSignatures.php', 'Zotlabs\\Lib\\MarkdownSoap' => __DIR__ . '/../..' . '/Zotlabs/Lib/MarkdownSoap.php', + 'Zotlabs\\Lib\\MessageFilter' => __DIR__ . '/../..' . '/Zotlabs/Lib/MessageFilter.php', 'Zotlabs\\Lib\\NativeWiki' => __DIR__ . '/../..' . '/Zotlabs/Lib/NativeWiki.php', 'Zotlabs\\Lib\\NativeWikiPage' => __DIR__ . '/../..' . '/Zotlabs/Lib/NativeWikiPage.php', 'Zotlabs\\Lib\\PConfig' => __DIR__ . '/../..' . '/Zotlabs/Lib/PConfig.php', @@ -980,11 +981,11 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d '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\\Addons' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Addons.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', @@ -1080,6 +1081,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Module\\Notifications' => __DIR__ . '/../..' . '/Zotlabs/Module/Notifications.php', 'Zotlabs\\Module\\Notify' => __DIR__ . '/../..' . '/Zotlabs/Module/Notify.php', 'Zotlabs\\Module\\OAuth2TestVehicle' => __DIR__ . '/../..' . '/Zotlabs/Module/Oauth2testvehicle.php', + 'Zotlabs\\Module\\Oauthinfo' => __DIR__ . '/../..' . '/Zotlabs/Module/Oauthinfo.php', 'Zotlabs\\Module\\Ochannel' => __DIR__ . '/../..' . '/Zotlabs/Module/Ochannel.php', 'Zotlabs\\Module\\Oembed' => __DIR__ . '/../..' . '/Zotlabs/Module/Oembed.php', 'Zotlabs\\Module\\Oep' => __DIR__ . '/../..' . '/Zotlabs/Module/Oep.php', @@ -1404,6 +1406,9 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Update\\_1210' => __DIR__ . '/../..' . '/Zotlabs/Update/_1210.php', 'Zotlabs\\Update\\_1211' => __DIR__ . '/../..' . '/Zotlabs/Update/_1211.php', 'Zotlabs\\Update\\_1212' => __DIR__ . '/../..' . '/Zotlabs/Update/_1212.php', + 'Zotlabs\\Update\\_1213' => __DIR__ . '/../..' . '/Zotlabs/Update/_1213.php', + 'Zotlabs\\Update\\_1214' => __DIR__ . '/../..' . '/Zotlabs/Update/_1214.php', + 'Zotlabs\\Update\\_1215' => __DIR__ . '/../..' . '/Zotlabs/Update/_1215.php', 'Zotlabs\\Web\\CheckJS' => __DIR__ . '/../..' . '/Zotlabs/Web/CheckJS.php', 'Zotlabs\\Web\\Controller' => __DIR__ . '/../..' . '/Zotlabs/Web/Controller.php', 'Zotlabs\\Web\\HTTPHeaders' => __DIR__ . '/../..' . '/Zotlabs/Web/HTTPHeaders.php', @@ -1415,11 +1420,14 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Web\\SubModule' => __DIR__ . '/../..' . '/Zotlabs/Web/SubModule.php', 'Zotlabs\\Web\\WebServer' => __DIR__ . '/../..' . '/Zotlabs/Web/WebServer.php', 'Zotlabs\\Widget\\Activity' => __DIR__ . '/../..' . '/Zotlabs/Widget/Activity.php', + 'Zotlabs\\Widget\\Activity_filter' => __DIR__ . '/../..' . '/Zotlabs/Widget/Activity_filter.php', + 'Zotlabs\\Widget\\Activity_order' => __DIR__ . '/../..' . '/Zotlabs/Widget/Activity_order.php', 'Zotlabs\\Widget\\Admin' => __DIR__ . '/../..' . '/Zotlabs/Widget/Admin.php', 'Zotlabs\\Widget\\Affinity' => __DIR__ . '/../..' . '/Zotlabs/Widget/Affinity.php', 'Zotlabs\\Widget\\Album' => __DIR__ . '/../..' . '/Zotlabs/Widget/Album.php', 'Zotlabs\\Widget\\Appcategories' => __DIR__ . '/../..' . '/Zotlabs/Widget/Appcategories.php', 'Zotlabs\\Widget\\Appcloud' => __DIR__ . '/../..' . '/Zotlabs/Widget/Appcloud.php', + 'Zotlabs\\Widget\\Appstore' => __DIR__ . '/../..' . '/Zotlabs/Widget/Appstore.php', 'Zotlabs\\Widget\\Archive' => __DIR__ . '/../..' . '/Zotlabs/Widget/Archive.php', 'Zotlabs\\Widget\\Bookmarkedchats' => __DIR__ . '/../..' . '/Zotlabs/Widget/Bookmarkedchats.php', 'Zotlabs\\Widget\\Catcloud' => __DIR__ . '/../..' . '/Zotlabs/Widget/Catcloud.php', diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 6ce7bf350..ea47f731d 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -657,17 +657,17 @@ }, { "name": "sabre/vobject", - "version": "4.1.5", - "version_normalized": "4.1.5.0", + "version": "4.1.6", + "version_normalized": "4.1.6.0", "source": { "type": "git", "url": "https://github.com/sabre-io/vobject.git", - "reference": "0928660e92d46d2d24336a6db320636aa3a75414" + "reference": "122cacbdea2c6133ac04db86ec05854beef75adf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/vobject/zipball/0928660e92d46d2d24336a6db320636aa3a75414", - "reference": "0928660e92d46d2d24336a6db320636aa3a75414", + "url": "https://api.github.com/repos/sabre-io/vobject/zipball/122cacbdea2c6133ac04db86ec05854beef75adf", + "reference": "122cacbdea2c6133ac04db86ec05854beef75adf", "shasum": "" }, "require": { @@ -682,7 +682,7 @@ "suggest": { "hoa/bench": "If you would like to run the benchmark scripts" }, - "time": "2018-03-08T21:06:39+00:00", + "time": "2018-04-20T07:22:50+00:00", "bin": [ "bin/vobject", "bin/generate_vcards" @@ -886,23 +886,23 @@ }, { "name": "smarty/smarty", - "version": "v3.1.31", - "version_normalized": "3.1.31.0", + "version": "v3.1.32", + "version_normalized": "3.1.32.0", "source": { "type": "git", "url": "https://github.com/smarty-php/smarty.git", - "reference": "c7d42e4a327c402897dd587871434888fde1e7a9" + "reference": "ac9d4b587e5bf53381e21881820a9830765cb459" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/smarty-php/smarty/zipball/c7d42e4a327c402897dd587871434888fde1e7a9", - "reference": "c7d42e4a327c402897dd587871434888fde1e7a9", + "url": "https://api.github.com/repos/smarty-php/smarty/zipball/ac9d4b587e5bf53381e21881820a9830765cb459", + "reference": "ac9d4b587e5bf53381e21881820a9830765cb459", "shasum": "" }, "require": { "php": ">=5.2" }, - "time": "2016-12-14T21:57:25+00:00", + "time": "2018-04-24T14:53:33+00:00", "type": "library", "extra": { "branch-alias": { diff --git a/vendor/sabre/vobject/CHANGELOG.md b/vendor/sabre/vobject/CHANGELOG.md index 269b3dbff..6cfec988e 100644 --- a/vendor/sabre/vobject/CHANGELOG.md +++ b/vendor/sabre/vobject/CHANGELOG.md @@ -1,10 +1,17 @@ ChangeLog ========= +4.1.6 (2018-04-20) +------------------ + +* #406, #407, #408, #409: Another round of performance improvements in serialization of properties (@gharlan, @staabm) +* #410: Fixes in iTip for handling `BYDAY=SA,SO` (@gharlan) +* #381: Fixes in iTip handling of `SCHEDULE-FORCE-SEND` (@alecpl) + 4.1.5 (2018-03-08) ------------------ -* Serialization: Performance boost for long properties (@gharlan) +* #404: Serialization: Performance boost for long properties (@gharlan) 4.1.4 (2017-12-22) ------------------ diff --git a/vendor/sabre/vobject/lib/ITip/Broker.php b/vendor/sabre/vobject/lib/ITip/Broker.php index b9a30611b..b954cdc8d 100644 --- a/vendor/sabre/vobject/lib/ITip/Broker.php +++ b/vendor/sabre/vobject/lib/ITip/Broker.php @@ -897,6 +897,9 @@ class Broker { if ($key === 'INTERVAL' && $val == 1) { continue; } + if (is_array($val)) { + $val = implode(',', $val); + } $rrule[] = "$key=$val"; } } @@ -936,9 +939,9 @@ class Broker { if (isset($attendees[$attendee->getNormalizedValue()])) { $attendees[$attendee->getNormalizedValue()]['instances'][$recurId] = [ - 'id' => $recurId, - 'partstat' => $partStat, - 'force-send' => $forceSend, + 'id' => $recurId, + 'partstat' => $partStat, + 'forceSend' => $forceSend, ]; } else { $attendees[$attendee->getNormalizedValue()] = [ diff --git a/vendor/sabre/vobject/lib/Parser/MimeDir.php b/vendor/sabre/vobject/lib/Parser/MimeDir.php index 78e5bf385..742641236 100644 --- a/vendor/sabre/vobject/lib/Parser/MimeDir.php +++ b/vendor/sabre/vobject/lib/Parser/MimeDir.php @@ -283,22 +283,22 @@ class MimeDir extends Parser { */ protected function readLine() { - if (!is_null($this->lineBuffer)) { + if (!\is_null($this->lineBuffer)) { $rawLine = $this->lineBuffer; $this->lineBuffer = null; } else { do { - $eof = feof($this->input); + $eof = \feof($this->input); - $rawLine = fgets($this->input); + $rawLine = \fgets($this->input); - if ($eof || (feof($this->input) && $rawLine === false)) { + if ($eof || (\feof($this->input) && $rawLine === false)) { throw new EofException('End of document reached prematurely'); } if ($rawLine === false) { throw new ParseException('Error reading from input stream'); } - $rawLine = rtrim($rawLine, "\r\n"); + $rawLine = \rtrim($rawLine, "\r\n"); } while ($rawLine === ''); // Skipping empty lines $this->lineIndex++; } @@ -309,14 +309,15 @@ class MimeDir extends Parser { // Looking ahead for folded lines. while (true) { - $nextLine = rtrim(fgets($this->input), "\r\n"); + $nextLine = \rtrim(\fgets($this->input), "\r\n"); $this->lineIndex++; if (!$nextLine) { break; } if ($nextLine[0] === "\t" || $nextLine[0] === " ") { - $line .= substr($nextLine, 1); - $rawLine .= "\n " . substr($nextLine, 1); + $curLine = \substr($nextLine, 1); + $line .= $curLine; + $rawLine .= "\n " . $curLine; } else { $this->lineBuffer = $nextLine; break; diff --git a/vendor/sabre/vobject/lib/Property.php b/vendor/sabre/vobject/lib/Property.php index 96855f1f7..3d1775fa2 100644 --- a/vendor/sabre/vobject/lib/Property.php +++ b/vendor/sabre/vobject/lib/Property.php @@ -246,20 +246,18 @@ abstract class Property extends Node { $str .= ':' . $this->getRawMimeDirValue(); - $out = ''; - while (strlen($str) > 0) { - if (strlen($str) > 75) { - $part = mb_strcut($str, 0, 75, 'utf-8'); - $out .= $part . "\r\n"; - $str = ' ' . substr($str, strlen($part)); - } else { - $out .= $str . "\r\n"; - $str = ''; - break; - } - } + $str = \preg_replace( + '/( + (?:^.)? # 1 additional byte in first line because of missing single space (see next line) + .{1,74} # max 75 bytes per line (1 byte is used for a single space added after every CRLF) + (?![\x80-\xbf]) # prevent splitting multibyte characters + )/x', + "$1\r\n ", + $str + ); - return $out; + // remove single space after last CRLF + return \substr($str, 0, -1); } diff --git a/vendor/sabre/vobject/lib/Property/Text.php b/vendor/sabre/vobject/lib/Property/Text.php index bb7ab34ee..47a86ccc9 100644 --- a/vendor/sabre/vobject/lib/Property/Text.php +++ b/vendor/sabre/vobject/lib/Property/Text.php @@ -213,16 +213,16 @@ class Text extends Property { $val = $this->getParts(); if (isset($this->minimumPropertyValues[$this->name])) { - $val = array_pad($val, $this->minimumPropertyValues[$this->name], ''); + $val = \array_pad($val, $this->minimumPropertyValues[$this->name], ''); } // Imploding multiple parts into a single value, and splitting the // values with ;. - if (count($val) > 1) { + if (\count($val) > 1) { foreach ($val as $k => $v) { - $val[$k] = str_replace(';', '\;', $v); + $val[$k] = \str_replace(';', '\;', $v); } - $val = implode(';', $val); + $val = \implode(';', $val); } else { $val = $val[0]; } @@ -242,7 +242,7 @@ class Text extends Property { // If the resulting value contains a \n, we must encode it as // quoted-printable. - if (strpos($val, "\n") !== false) { + if (\strpos($val, "\n") !== false) { $str .= ';ENCODING=QUOTED-PRINTABLE:'; $lastLine = $str; @@ -252,40 +252,39 @@ class Text extends Property { // encode newlines for us. Specifically, the \r\n sequence must in // vcards be encoded as =0D=OA and we must insert soft-newlines // every 75 bytes. - for ($ii = 0;$ii < strlen($val);$ii++) { - $ord = ord($val[$ii]); + for ($ii = 0;$ii < \strlen($val);$ii++) { + $ord = \ord($val[$ii]); // These characters are encoded as themselves. if ($ord >= 32 && $ord <= 126) { $lastLine .= $val[$ii]; } else { - $lastLine .= '=' . strtoupper(bin2hex($val[$ii])); + $lastLine .= '=' . \strtoupper(\bin2hex($val[$ii])); } - if (strlen($lastLine) >= 75) { + if (\strlen($lastLine) >= 75) { // Soft line break $out .= $lastLine . "=\r\n "; $lastLine = null; } } - if (!is_null($lastLine)) $out .= $lastLine . "\r\n"; + if (!\is_null($lastLine)) $out .= $lastLine . "\r\n"; return $out; } else { $str .= ':' . $val; - $out = ''; - while (strlen($str) > 0) { - if (strlen($str) > 75) { - $part = mb_strcut($str, 0, 75, 'utf-8'); - $out .= $part . "\r\n"; - $str = ' ' . substr($str, strlen($part)); - } else { - $out .= $str . "\r\n"; - $str = ''; - break; - } - } - return $out; + $str = \preg_replace( + '/( + (?:^.)? # 1 additional byte in first line because of missing single space (see next line) + .{1,74} # max 75 bytes per line (1 byte is used for a single space added after every CRLF) + (?![\x80-\xbf]) # prevent splitting multibyte characters + )/x', + "$1\r\n ", + $str + ); + + // remove single space after last CRLF + return \substr($str, 0, -1); } diff --git a/vendor/sabre/vobject/lib/Version.php b/vendor/sabre/vobject/lib/Version.php index 67e8a4037..074b06c4b 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.5'; + const VERSION = '4.1.6'; } diff --git a/vendor/smarty/smarty/COMPOSER_RELEASE_NOTES.txt b/vendor/smarty/smarty/COMPOSER_RELEASE_NOTES.txt index c943d9f2e..0644719c9 100644 --- a/vendor/smarty/smarty/COMPOSER_RELEASE_NOTES.txt +++ b/vendor/smarty/smarty/COMPOSER_RELEASE_NOTES.txt @@ -27,3 +27,5 @@ To retrieve the development and documentation folders add "smarty/smarty-dev": "~3.1@dev" } +If you are using (include) the composer generated autoloader.php which is located +in the /vendor folder it is no longer needed to require the Smarty.class.php file.
\ No newline at end of file diff --git a/vendor/smarty/smarty/INHERITANCE_RELEASE_NOTES.txt b/vendor/smarty/smarty/INHERITANCE_RELEASE_NOTES.txt index c415c4ccd..67936a81a 100644 --- a/vendor/smarty/smarty/INHERITANCE_RELEASE_NOTES.txt +++ b/vendor/smarty/smarty/INHERITANCE_RELEASE_NOTES.txt @@ -1,4 +1,11 @@ -3.1.31-dev +3.1.3" +New tags for inheritance parent and chilD +{parent} == {$smarty.block.parent} +{child} == {$smarty.block.child} +Both tags support the assign attribute like +{child assign=foo} + +3.1.31 New tags for inheritance parent and child {block_parent} == {$smarty.block.parent} {block_child} == {$smarty.block.child} @@ -7,7 +14,6 @@ Since 3.1.28 you can mix inheritance by extends resource with the {extends} tag. A template called by extends resource can extend a subtemplate or chain buy the {extends} tag. Since 3.1.31 this feature can be turned off by setting the new Smarty property Smarty::$extends_recursion to false. - 3.1.28 Starting with version 3.1.28 template inheritance is no longer a compile time process. All {block} tag parent/child relations are resolved at run time. @@ -63,7 +69,7 @@ the compiled code of {include} subtemplates gets also merged in compiled inherit Merging the code into a single compile template has some drawbacks. 1. You could not use variable file names in {include} Smarty would use the {include} of compilation time. 2. You could not use individual compile_id in {include} -3. Seperate caching of subtemplate was not possible +3. Separate caching of subtemplate was not possible 4. Any change of the template directory structure between calls was not necessarily seen. Starting with 3.1.15 some of the above conditions got checked and resulted in an exception. It turned out @@ -75,13 +81,11 @@ With this setting all {include} subtemplate will be merge into the compiled inhe could be rejected by exception. -If $smarty->inheritance_merge_compiled_includes = false; {include} subtemplate will not be merged. -You must now manually merge all {include} subtemplate which do contain {block} tags. This is done by setting the "inline" option. +If $smarty->inheritance_merge_compiled_includes = false; {include} subtemplate will not be merged.You must now manually merge all {include} subtemplate which do contain {block} tags. This is done by setting the "inline" option. {include file='foo.bar' inline} 1. In case of a variable file name like {include file=$foo inline} you must use the variable in a compile_id $smarty->compile_id = $foo; -2. If you use individual compile_id in {include file='foo.tpl' compile_id=$bar inline} it must be used in the - global compile_id as well $smarty->compile_id = $bar; +2. If you use individual compile_id in {include file='foo.tpl' compile_id=$bar inline} it must be used in the global compile_id as well $smarty->compile_id = $bar; 3. If call templates with different template_dir configurations and a parent could same named child template from different folders you must make the folder name part of the compile_id. diff --git a/vendor/smarty/smarty/NEW_FEATURES.txt b/vendor/smarty/smarty/NEW_FEATURES.txt index adbc1099b..7632b07ea 100644 --- a/vendor/smarty/smarty/NEW_FEATURES.txt +++ b/vendor/smarty/smarty/NEW_FEATURES.txt @@ -2,6 +2,53 @@ This file contains a brief description of new features which have been added to Smarty 3.1 +Smarty 3.1.32 New tags for inheritance parent and child + ========================================= + {parent} == {$smarty.block.parent} + {child} == {$smarty.block.child} + Both tags support the assign attribute like + {child assign=foo} + + Deprecate functions Smarty::muteExpectedErrors() and Smarty::unmuteExpectedErrors() + =================================================================================== + These functions to start a special error handler are no longer needed as Smarty does + no longer use error suppression like @filemtime(). + For backward compatibility the functions still can be called. + + Using literals containing Smarty's left and right delimiter + =========================================================== + New Methods + $smarty->setLiterals(array $literals) + $smarty->addLiterals(array $literals) + to define literals containing Smarty delimiter. This can avoid the need for extreme usage + of {literal} {/literal} tags. + A) Treat '{{' and '}}' as literal + If Smarty::$auto_literal is enabled + {{ foo }} + will be treated now as literal. (This does apply for any number of delimiter repeatations). + However {{foo}} is not an literal but will be interpreted as a recursive Smarty tag. + If you use + $smarty->setLiteral(array('{{','}}')); + {{foo}} is now a literal as well. + NOTE: In the last example nested Smarty tags starting with '{{' or ending with '}}' will not + work any longer, but this should be very very raw occouring restriction. + B) Example 2 + Assume your delimiter are '<-' , '->' and '<--' , '-->' shall be literals + $smarty->setLiteral(array('<--','-->')); + + + The capture buffers can now be accessed as array + ================================================ + {capture name='foo'} + bah + {\capture} + {capture name='buh'} + blar + {\capture} + {foreach $smarty.capture as $name => $buffer} + .... + {/foreach} + Smarty 3.1.31 New tags for inheritance parent and child ========================================= @@ -45,8 +92,7 @@ Smarty 3.1.30 {/foreach} The {foreach} loop is rendered while processing the compiled template, but $current is a nocache - variable. Normally the {if $current==$item.id} would fail as the $item variable is unkown in the - cached template. {make_nocache $item} does make the current $item value known in thee cached template. + variable. Normally the {if $current==$item.id} would fail as the $item variable is unknown in the cached template. {make_nocache $item} does make the current $item value known in thee cached template. {make_nocache} is ignored when caching is disabled or the variable does exists as nocache variable. @@ -81,8 +127,7 @@ Smarty 3.1.30 Supported scope are parent, tpl_root, smarty, global and root. A scope used together with the {include} tag will cause that with some exceptions any variable assignment within that sub-template will update/assign the variable in other scopes according - to the above rules. It does include also variables assigned by plugins, tags supporting the assign=foo - attribute and direct assignments in {if} and {while} like {if $foo=$bar}. + to the above rules. It does include also variables assigned by plugins, tags supporting the assign=foo attribute and direct assignments in {if} and {while} like {if $foo=$bar}. Excluded are the key and value variables of {foreach}, {for} loop variables , variables passed by attributes in {include} and direct increments/decrements like {$foo++}, {$foo--} @@ -132,8 +177,8 @@ Smarty 3.1.28 as the corresponding Smarty methods to get the content of another template. Example: $template->display(); Does display template of template object - $template->display('foo.tpl'); Does display template 'foo.bar' - + $template->display('foo.tpl'); Does display template 'foo.bar' + File: resource ============== Multiple template_dir entries can now be selected by a comma separated list of indices. diff --git a/vendor/smarty/smarty/README b/vendor/smarty/smarty/README index 08b397c3f..9a71519bd 100644 --- a/vendor/smarty/smarty/README +++ b/vendor/smarty/smarty/README @@ -176,7 +176,7 @@ backward compatible with Smarty 2, except for the following items: There are many things that are new to Smarty 3. Here are the notable items: - + LEXER/PARSER ============ @@ -197,8 +197,8 @@ is still supported for BC. Examples: {$x+$y} will output the sum of x and y. {$foo = strlen($bar)} function in assignment -{assign var=foo value= $x+$y} in attributes -{$foo = myfunct( ($x+$y)*3 )} as function parameter +{assign var=foo value= $x+$y} in attributes +{$foo = myfunct( ($x+$y)*3 )} as function parameter {$foo[$x+3]} as array index Smarty tags can be used as values within other tags. @@ -239,18 +239,18 @@ Examples: The original "dot" notation stays, and with improvements. Examples: -{$foo.a.b.c} => $foo['a']['b']['c'] +{$foo.a.b.c} => $foo['a']['b']['c'] {$foo.a.$b.c} => $foo['a'][$b]['c'] with variable index {$foo.a.{$b+4}.c} => $foo['a'][$b+4]['c'] with expression as index {$foo.a.{$b.c}} => $foo['a'][$b['c']] with nested index -note that { and } are used to address ambiguties when nesting the dot syntax. +note that { and } are used to address ambiguties when nesting the dot syntax. Variable names themselves can be variable and contain expressions. Examples: $foo normal variable -$foo_{$bar} variable name containing other variable -$foo_{$x+$y} variable name containing expressions +$foo_{$bar} variable name containing other variable +$foo_{$x+$y} variable name containing expressions $foo_{$bar}_buh_{$blar} variable name with multiple segments {$foo_{$x}} will output the variable $foo_1 if $x has a value of 1. @@ -260,12 +260,12 @@ Example: {$object->method1($x)->method2($y)} {for} tag added for looping (replacement for {section} tag): {for $x=0, $y=count($foo); $x<$y; $x++} .... {/for} Any number of statements can be used separated by comma as the first -inital expression at {for}. +initial expression at {for}. {for $x = $start to $end step $step} ... {/for}is in the SVN now . You can use also {for $x = $start to $end} ... {/for} -In this case the step value will be automaticall 1 or -1 depending on the start and end values. +In this case the step value will be automatically 1 or -1 depending on the start and end values. Instead of $start and $end you can use any valid expression. Inside the loop the following special vars can be accessed: $x@iteration = number of iteration @@ -290,7 +290,7 @@ $var@last true on last iteration The Smarty 2 {foreach} tag syntax is still supported. -NOTE: {$bar[foo]} still indicates a variable inside of a {section} named foo. +NOTE: {$bar[foo]} still indicates a variable inside of a {section} named foo. If you want to access an array element with index foo, you must use quotes such as {$bar['foo']}, or use the dot syntax {$bar.foo}. @@ -377,12 +377,12 @@ $smarty->display('string:This is my template, {$foo}!'); // php VARIABLE SCOPE / VARIABLE STORAGE ================================= -In Smarty 2, all assigned variables were stored within the Smarty object. -Therefore, all variables assigned in PHP were accessible by all subsequent +In Smarty 2, all assigned variables were stored within the Smarty object. +Therefore, all variables assigned in PHP were accessible by all subsequent fetch and display template calls. -In Smarty 3, we have the choice to assign variables to the main Smarty object, -to user-created data objects, and to user-created template objects. +In Smarty 3, we have the choice to assign variables to the main Smarty object, +to user-created data objects, and to user-created template objects. These objects can be chained. The object at the end of a chain can access all variables belonging to that template and all variables within the parent objects. The Smarty object can only be the root of a chain, but a chain can be isolated @@ -396,7 +396,7 @@ global variables. A Smarty data object can be created as follows: $data = $smarty->createData(); // create root data object $data->assign('foo','bar'); // assign variables as usual -$data->config_load('my.conf'); // load config file +$data->config_load('my.conf'); // load config file $data= $smarty->createData($smarty); // create data object having a parent link to the Smarty object @@ -414,7 +414,7 @@ The first parameter can be a template name, a smarty object or a data object. Examples: $tpl = $smarty->createTemplate('mytpl.tpl'); // create template object not linked to any parent $tpl->assign('foo','bar'); // directly assign variables -$tpl->config_load('my.conf'); // load config file +$tpl->config_load('my.conf'); // load config file $tpl = $smarty->createTemplate('mytpl.tpl',$smarty); // create template having a parent link to the Smarty object $tpl = $smarty->createTemplate('mytpl.tpl',$data); // create template having a parent link to the $data object @@ -424,31 +424,31 @@ If the $parent parameter is not specified in these method calls, the template ob is will link back to the Smarty object as it's parent. If a template is called by an {include...} tag from another template, the -subtemplate links back to the calling template as it's parent. +subtemplate links back to the calling template as it's parent. All variables assigned locally or from a parent template are accessible. If the template creates or modifies a variable by using the {assign var=foo...} or {$foo=...} tags, these new values are only known locally (local scope). When the template exits, none of the new variables or modifications can be seen in the -parent template(s). This is same behavior as in Smarty 2. +parent template(s). This is same behavior as in Smarty 2. With Smarty 3, we can assign variables with a scope attribute which allows the availablility of these new variables or modifications globally (ie in the parent templates.) -Possible scopes are local, parent, root and global. +Possible scopes are local, parent, root and global. Examples: {assign var=foo value='bar'} // no scope is specified, the default 'local' {$foo='bar'} // same, local scope {assign var=foo value='bar' scope='local'} // same, local scope -{assign var=foo value='bar' scope='parent'} // Values will be available to the parent object +{assign var=foo value='bar' scope='parent'} // Values will be available to the parent object {$foo='bar' scope='parent'} // (normally the calling template) -{assign var=foo value='bar' scope='root'} // Values will be exported up to the root object, so they can +{assign var=foo value='bar' scope='root'} // Values will be exported up to the root object, so they can {$foo='bar' scope='root'} // be seen from all templates using the same root. -{assign var=foo value='bar' scope='global'} // Values will be exported to global variable storage, +{assign var=foo value='bar' scope='global'} // Values will be exported to global variable storage, {$foo='bar' scope='global'} // they are available to any and all templates. @@ -460,8 +460,8 @@ included template. PLUGINS ======= -Smarty 3 plugins follow the same coding rules as in Smarty 2. -The main difference is that the template object is now passed in place of the smarty object. +Smarty 3 plugins follow the same coding rules as in Smarty 2. +The main difference is that the template object is now passed in place of the smarty object. The smarty object can be still be accessed through $template->smarty. smarty_plugintype_name (array $params, Smarty_Internal_Template $template) @@ -473,7 +473,7 @@ TEMPLATE INHERITANCE: ===================== With template inheritance you can define blocks, which are areas that can be -overriden by child templates, so your templates could look like this: +overridden by child templates, so your templates could look like this: parent.tpl: <html> @@ -491,14 +491,14 @@ parent.tpl: </html> child.tpl: -{extends file='parent.tpl'} +{extends file='parent.tpl'} {block name='title'} Child title {/block} grandchild.tpl: -{extends file='child.tpl'} -{block name='title'}Home - {$smarty.block.parent}{/block} +{extends file='child.tpl'} +{block name='title'}Home - {$smarty.block.parent}{/block} {block name='page-title'}My home{/block} {block name='content'} {foreach $images as $img} @@ -508,10 +508,10 @@ grandchild.tpl: We redefined all the blocks here, however in the title block we used {$smarty.block.parent}, which tells Smarty to insert the default content from the parent template in its place. -The content block was overriden to display the image files, and page-title has also be -overriden to display a completely different title. +The content block was overridden to display the image files, and page-title has also be +overridden to display a completely different title. -If we render grandchild.tpl we will get this: +If we render grandchild.tpl we will get this: <html> <head> <title>Home - Child title</title> @@ -529,8 +529,8 @@ If we render grandchild.tpl we will get this: NOTE: In the child templates everything outside the {extends} or {block} tag sections is ignored. -The inheritance tree can be as big as you want (meaning you can extend a file that -extends another one that extends another one and so on..), but be aware that all files +The inheritance tree can be as big as you want (meaning you can extend a file that +extends another one that extends another one and so on..), but be aware that all files have to be checked for modifications at runtime so the more inheritance the more overhead you add. Instead of defining the parent/child relationships with the {extends} tag in the child template you @@ -538,7 +538,7 @@ can use the resource as follow: $smarty->display('extends:parent.tpl|child.tpl|grandchild.tpl'); -Child {block} tags may optionally have a append or prepend attribute. In this case the parent block content +Child {block} tags may optionally have a append or prepend attribute. In this case the parent block content is appended or prepended to the child block content. {block name='title' append} My title {/block} diff --git a/vendor/smarty/smarty/README.md b/vendor/smarty/smarty/README.md index 5783eb3e0..24baae4c2 100644 --- a/vendor/smarty/smarty/README.md +++ b/vendor/smarty/smarty/README.md @@ -1,5 +1,12 @@ -#Smarty 3 template engine -##Distribution repository +# Smarty 3 template engine +[smarty.net](https://www.smarty.net/) + +## Documentation + +For documentation see +[www.smarty.net/docs/en/](https://www.smarty.net/docs/en/) + +## Distribution repository > Smarty 3.1.28 introduces run time template inheritance @@ -10,7 +17,7 @@ Smarty versions 3.1.11 or later are now on github and can be installed with Comp The "smarty/smarty" package will start at libs/.... subfolder. -To get the latest stable version of Smarty 3.1 use +To get the latest stable version of Smarty 3.1 use: ```json "require": { @@ -20,7 +27,7 @@ To get the latest stable version of Smarty 3.1 use in your composer.json file. -To get the trunk version use +To get the trunk version use: ```json "require": { @@ -28,7 +35,7 @@ To get the trunk version use } ``` -For a specific version use something like +For a specific version use something like: ```json "require": { @@ -36,7 +43,7 @@ For a specific version use something like } ``` -PHPUnit test can be installed by corresponding composer entries like +PHPUnit test can be installed by corresponding composer entries like: ```json "require": { @@ -44,7 +51,7 @@ PHPUnit test can be installed by corresponding composer entries like } ``` -Similar applies for the lexer/parser generator +Similar applies for the lexer/parser generator. ```json "require": { @@ -52,7 +59,7 @@ Similar applies for the lexer/parser generator } ``` -Or you could use +Or you could use: ```json "require": { @@ -60,6 +67,6 @@ Or you could use } ``` -Which is a wrapper to install all 3 packages +Which is a wrapper to install all 3 packages. -Composer can also be used for Smarty2 versions 2.6.24 to 2.6.28 +Composer can also be used for Smarty2 versions 2.6.24 to 2.6.30. diff --git a/vendor/smarty/smarty/SMARTY_2_BC_NOTES.txt b/vendor/smarty/smarty/SMARTY_2_BC_NOTES.txt index 79a2cb1b6..fd36bd33b 100644 --- a/vendor/smarty/smarty/SMARTY_2_BC_NOTES.txt +++ b/vendor/smarty/smarty/SMARTY_2_BC_NOTES.txt @@ -2,8 +2,8 @@ == Syntax == -Smarty 3 API has a new syntax. Much of the Smarty 2 syntax is supported -by a wrapper but deprecated. See the README that comes with Smarty 3 for more +Smarty 3 API has a new syntax. Much of the Smarty 2 syntax is supported +by a wrapper but deprecated. See the README that comes with Smarty 3 for more information. The {$array|@mod} syntax has always been a bit confusing, where an "@" is required @@ -32,9 +32,9 @@ Makes Javascript/CSS easier to work with, eliminating the need for {literal}. This can be disabled by setting $smarty->auto_literal = false; == Unquoted Strings == -Smarty 2 was a bit more forgiving (and ambiguous) when it comes to unquoted strings -in parameters. Smarty3 is more restrictive. You can still pass strings without quotes -so long as they contain no special characters. (anything outside of A-Za-z0-9_) +Smarty 2 was a bit more forgiving (and ambiguous) when it comes to unquoted strings +in parameters. Smarty3 is more restrictive. You can still pass strings without quotes +so long as they contain no special characters. (anything outside of A-Za-z0-9_) For example filename strings must be quoted <source lang="smarty"> @@ -42,16 +42,16 @@ For example filename strings must be quoted </source> == Extending the Smarty class == -Smarty 3 makes use of the __construct method for initialization. If you are extending -the Smarty class, its constructor is not called implicitly if the your child class defines -its own constructor. In order to run Smarty's constructor, a call to parent::__construct() -within your child constructor is required. +Smarty 3 makes use of the __construct method for initialization. If you are extending +the Smarty class, its constructor is not called implicitly if the your child class defines +its own constructor. In order to run Smarty's constructor, a call to parent::__construct() +within your child constructor is required. <source lang="php"> class MySmarty extends Smarty { function __construct() { parent::__construct(); - + // your initialization code goes here } @@ -59,36 +59,36 @@ class MySmarty extends Smarty { </source> == Autoloader == -Smarty 3 does register its own autoloader with spl_autoload_register. If your code has -an existing __autoload function then this function must be explicitly registered on -the __autoload stack. See http://us3.php.net/manual/en/function.spl-autoload-register.php +Smarty 3 does register its own autoloader with spl_autoload_register. If your code has +an existing __autoload function then this function must be explicitly registered on +the __autoload stack. See http://us3.php.net/manual/en/function.spl-autoload-register.php for further details. == Plugin Filenames == -Smarty 3 optionally supports the PHP spl_autoloader. The autoloader requires filenames -to be lower case. Because of this, Smarty plugin file names must also be lowercase. +Smarty 3 optionally supports the PHP spl_autoloader. The autoloader requires filenames +to be lower case. Because of this, Smarty plugin file names must also be lowercase. In Smarty 2, mixed case file names did work. == Scope of Special Smarty Variables == -In Smarty 2 the special Smarty variables $smarty.section... and $smarty.foreach... -had global scope. If you had loops with the same name in subtemplates you could accidentally +In Smarty 2 the special Smarty variables $smarty.section... and $smarty.foreach... +had global scope. If you had loops with the same name in subtemplates you could accidentally overwrite values of parent template. -In Smarty 3 these special Smarty variable have only local scope in the template which -is defining the loop. If you need their value in a subtemplate you have to pass them +In Smarty 3 these special Smarty variable have only local scope in the template which +is defining the loop. If you need their value in a subtemplate you have to pass them as parameter. <source lang="smarty"> {include file='path/foo.tpl' index=$smarty.section.foo.index} </source> == SMARTY_RESOURCE_CHAR_SET == -Smarty 3 sets the constant SMARTY_RESOURCE_CHAR_SET to utf-8 as default template charset. -This is now used also on modifiers like escape as default charset. If your templates use -other charsets make sure that you define the constant accordingly. Otherwise you may not +Smarty 3 sets the constant SMARTY_RESOURCE_CHAR_SET to utf-8 as default template charset. +This is now used also on modifiers like escape as default charset. If your templates use +other charsets make sure that you define the constant accordingly. Otherwise you may not get any output. == newline at {if} tags == -A \n was added to the compiled code of the {if},{else},{elseif},{/if} tags to get output of newlines as expected by the template source. +A \n was added to the compiled code of the {if},{else},{elseif},{/if} tags to get output of newlines as expected by the template source. If one of the {if} tags is at the line end you will now get a newline in the HTML output. == trigger_error() == @@ -96,7 +96,7 @@ The API function trigger_error() has been removed because it did just map to PHP However it's still included in the Smarty2 API wrapper. == Smarty constants == -The constants +The constants SMARTY_PHP_PASSTHRU SMARTY_PHP_QUOTE SMARTY_PHP_REMOVE diff --git a/vendor/smarty/smarty/SMARTY_3.0_BC_NOTES.txt b/vendor/smarty/smarty/SMARTY_3.0_BC_NOTES.txt index fd8b540c2..24bdec61a 100644 --- a/vendor/smarty/smarty/SMARTY_3.0_BC_NOTES.txt +++ b/vendor/smarty/smarty/SMARTY_3.0_BC_NOTES.txt @@ -1,14 +1,14 @@ == Smarty2 backward compatibility == -All Smarty2 specific API functions and deprecated functionallity has been moved +All Smarty2 specific API functions and deprecated functionality has been moved to the SmartyBC class. == {php} Tag == -The {php} tag is no longer available in the standard Smarty calls. -The use of {php} tags is deprecated and only available in the SmartyBC class. +The {php} tag is no longer available in the standard Smarty calls. +The use of {php} tags is deprecated and only available in the SmartyBC class. == {include_php} Tag == -The {include_php} tag is no longer available in the standard Smarty calls. -The use of {include_php} tags is deprecated and only available in the SmartyBC class. +The {include_php} tag is no longer available in the standard Smarty calls. +The use of {include_php} tags is deprecated and only available in the SmartyBC class. == php template resource == The support of the php template resource is removed. diff --git a/vendor/smarty/smarty/SMARTY_3.1_NOTES.txt b/vendor/smarty/smarty/SMARTY_3.1_NOTES.txt index 57709f0d7..d7c23ccc4 100644 --- a/vendor/smarty/smarty/SMARTY_3.1_NOTES.txt +++ b/vendor/smarty/smarty/SMARTY_3.1_NOTES.txt @@ -50,7 +50,7 @@ The escape modifier now knows the $double_encode option, which will prevent entities from being encoded again. The capitalize modifier now know the $lc_rest option, which makes sure -all letters following a captial letter are lower-cased. +all letters following a capital letter are lower-cased. The count_sentences modifier now accepts (.?!) as legitimate endings of a sentence - previously only (.) was @@ -62,7 +62,7 @@ entity. default_template_handler_func -The invocation of $smarty->$default_template_handler_func had to be +The invocation of $smarty->$default_template_handler_func had to be altered. Instead of a Smarty_Internal_Template, the fifth argument is now provided with the Smarty instance. New footprint: @@ -71,14 +71,14 @@ now provided with the Smarty instance. New footprint: * Default Template Handler * * called when Smarty's file: resource is unable to load a requested file - * + * * @param string $type resource type (e.g. "file", "string", "eval", "resource") * @param string $name resource name (e.g. "foo/bar.tpl") * @param string &$content template's content * @param integer &$modified template's modification time * @param Smarty $smarty Smarty instance - * @return string|boolean path to file or boolean true if $content and $modified - * have been filled, boolean false if no default template + * @return string|boolean path to file or boolean true if $content and $modified + * have been filled, boolean false if no default template * could be loaded */ function default_template_handler_func($type, $name, &$content, &$modified, Smarty $smarty) { @@ -126,7 +126,7 @@ run on variable output. SYNTAX: {setfilter filter1|filter2|filter3....} Smarty3 will lookup up matching filters in the following search order: -1. varibale filter plugin in plugins_dir. +1. variable filter plugin in plugins_dir. 2. a valid modifier. A modifier specification will also accept additional parameter like filter2:'foo' 3. a PHP function @@ -186,8 +186,8 @@ Note that old-fashioned registration of $cache_handler is not possible anymore. As the functionality had not been ported to Smarty 3.0.x properly, it has been dropped from 3.1 completely. -Locking facilities have been implemented to avoid concurrent cache -generation. Enable cache locking by setting +Locking facilities have been implemented to avoid concurrent cache +generation. Enable cache locking by setting $smarty->cache_locking = true; Relative Paths in Templates (File-Resource) @@ -258,7 +258,7 @@ default_config_handler_func() has been introduced. default_plugin_handler_func() -An optional default_plugin_handler_func() can be defined which gets called +An optional default_plugin_handler_func() can be defined which gets called by the compiler on tags which can't be resolved internally or by plugins. The default_plugin_handler() can map tags to plugins on the fly. diff --git a/vendor/smarty/smarty/change_log.txt b/vendor/smarty/smarty/change_log.txt index 1d42b0a76..5765a1718 100644 --- a/vendor/smarty/smarty/change_log.txt +++ b/vendor/smarty/smarty/change_log.txt @@ -1,4 +1,145 @@ -===== 3.1.31 ===== (14.12.2016) +===== 3.1.32 ===== (24.04.2018) +24.04.2018 + - bugfix possible Security Vulnerability in Smarty_Security class. + +26.03.2018 + - bugfix plugins may not be loaded if {function} or {block} tags are executed in nocache mode + https://github.com/smarty-php/smarty/issues/371 + +26.03.2018 + - new feature {parent} = {$smarty.block.parent} {child} = {$smarty.block.child} + +23.03.2018 + - bugfix preg_replace could fail on large content resulting in a blank page https://github.com/smarty-php/smarty/issues/417 + +21.03.2018 + - bugfix {$smarty.section...} used outside {section}{/section} showed incorrect values if {section}{/section} was called inside + another loop https://github.com/smarty-php/smarty/issues/422 + - bugfix short form of {section} attributes did not work https://github.com/smarty-php/smarty/issues/428 + +17.03.2018 + - improvement Smarty::compileAllTemplates() exit with a non-zero status code if max errors is reached https://github.com/smarty-php/smarty/pull/402 + +16.03.2018 + - bugfix extends resource did not work with user defined left/right delimiter https://github.com/smarty-php/smarty/issues/419 + +22.11.2017 + - bugfix {break} and {continue} could fail if {foreach}{/foreach} did contain other + looping tags like {for}, {section} and {while} https://github.com/smarty-php/smarty/issues/323 + +20.11.2017 + - bugfix rework of newline spacing between tag code and template text. + now again identical with Smarty2 (forum topic 26878) + - replacement of " by ' + +05.11.2017 + - lexer/parser optimization + - code cleanup and optimizations + - bugfix {$smarty.section.name.loop} used together with {$smarty.section.name.total} could produce + wrong results (forum topic 27041) + +26.10.2017 + - bugfix Smarty version was not filled in header comment of compiled and cached files + - optimization replace internal Smarty::$ds property by DIRECTORY_SEPARATOR + - deprecate functions Smarty::muteExpectedErrors() and Smarty::unmuteExpectedErrors() + as Smarty does no longer use error suppression like @filemtime(). + for backward compatibility code is moved from Smarty class to an external class and still can be + called. + - correction of PHPDoc blocks + - minor code cleanup + +21.10.2017 + - bugfix custom delimiters could fail since modification of version 3.1.32-dev-23 + https://github.com/smarty-php/smarty/issues/394 + +18.10.2017 + - bugfix fix implementation of unclosed block tag in double quoted string of 12.10.2017 + https://github.com/smarty-php/smarty/issues/396 https://github.com/smarty-php/smarty/issues/397 + https://github.com/smarty-php/smarty/issues/391 https://github.com/smarty-php/smarty/issues/392 + +12.10.2017 + - bugfix $smarty.block.child and $smarty.block.parent could not be used like any + $smarty special variable https://github.com/smarty-php/smarty/issues/393 + - unclosed block tag in double quoted string must throw compiler exception. + https://github.com/smarty-php/smarty/issues/391 https://github.com/smarty-php/smarty/issues/392 + +07.10.2017 + - bugfix modification of 9.8.2017 did fail on some recursive + tag nesting. https://github.com/smarty-php/smarty/issues/389 + +26.8.2017 + - bugfix chained modifier failed when last modifier parameter is a signed value + https://github.com/smarty-php/smarty/issues/327 + - bugfix templates filepath with multibyte characters did not work + https://github.com/smarty-php/smarty/issues/385 + - bugfix {make_nocache} did display code if the template did not contain other nocache code + https://github.com/smarty-php/smarty/issues/369 + +09.8.2017 + - improvement repeated delimiter like {{ and }} will be treated as literal + https://groups.google.com/forum/#!topic/smarty-developers/h9r82Bx4KZw + +05.8.2017 + - bugfix wordwrap modifier could fail if used in nocache code. + converted plugin file shared.mb_wordwrap.php into modifier.mb_wordwrap.php + - cleanup of _getSmartyObj() + +31.7.2017 + - Call clearstatcache() after mkdir() failure https://github.com/smarty-php/smarty/pull/379 + +30.7.2017 + - rewrite mkdir() bugfix to retry automatically see https://github.com/smarty-php/smarty/pull/377 + https://github.com/smarty-php/smarty/pull/379 + +21.7.2017 + - security possible PHP code injection on custom resources at display() or fetch() + calls if the resource does not sanitize the template name + - bugfix fix 'mkdir(): File exists' error on create directory from parallel + processes https://github.com/smarty-php/smarty/pull/377 + - bugfix solve preg_match() hhvm parameter problem https://github.com/smarty-php/smarty/pull/372 + +27.5.2017 + - bugfix change compiled code for registered function and modifiers to called as callable to allow closures + https://github.com/smarty-php/smarty/pull/368, https://github.com/smarty-php/smarty/issues/273 + - bugfix https://github.com/smarty-php/smarty/pull/368 did break the default plugin handler + - improvement replace phpversion() by PHP_VERSION constant. + https://github.com/smarty-php/smarty/pull/363 + +21.5.2017 + - performance store flag for already required shared plugin functions in static variable or + Smarty's $_cache to improve performance when plugins are often called + https://github.com/smarty-php/smarty/commit/51e0d5cd405d764a4ea257d1bac1fb1205f74528#commitcomment-22280086 + - bugfix remove special treatment of classes implementing ArrayAccess in {foreach} + https://github.com/smarty-php/smarty/issues/332 + - bugfix remove deleted files by clear_cache() and clear_compiled_template() from + ACP cache if present, add some is_file() checks to avoid possible warnings on filemtime() + caused by above functions. + https://github.com/smarty-php/smarty/issues/341 + - bugfix version 3.1.31 did fail under PHP 5.2 + https://github.com/smarty-php/smarty/issues/365 + +19.5.2017 + - change properties $accessMap and $obsoleteProperties from private to protected + https://github.com/smarty-php/smarty/issues/351 + - new feature The named capture buffers can now be accessed also as array + See NEWS_FEATURES.txt https://github.com/smarty-php/smarty/issues/366 + - improvement check if ini_get() and ini_set() not disabled + https://github.com/smarty-php/smarty/pull/362 + +24.4.2017 + - fix spelling https://github.com/smarty-php/smarty/commit/e3eda8a5f5653d8abb960eb1bc47e3eca679b1b4#commitcomment-21803095 + +17.4.2017 + - correct generated code on empty() and isset() call, observe change PHP behaviour since PHP 5.5 + https://github.com/smarty-php/smarty/issues/347 + +14.4.2017 + - merge pull requests https://github.com/smarty-php/smarty/pull/349, https://github.com/smarty-php/smarty/pull/322 and https://github.com/smarty-php/smarty/pull/337 to fix spelling and annotation + +13.4.2017 + - bugfix array_merge() parameter should be checked https://github.com/smarty-php/smarty/issues/350 + +===== 3.1.31 ===== (14.12.2016) 23.11.2016 - move template object cache into static variables @@ -36,7 +177,7 @@ 19.10.2016 - bugfix {make_nocache $var} did fail when variable value did contain '\' https://github.com/smarty-php/smarty/issues/305 - bugfix {make_nocache $var} remove spaces from variable value https://github.com/smarty-php/smarty/issues/304 - + 12.10.2016 - bugfix {include} with template names including variable or constants could fail after bugfix from 28.09.2016 https://github.com/smarty-php/smarty/issues/302 @@ -95,7 +236,7 @@ 01.09.2016 - performance require_once should be called only once for shared plugins https://github.com/smarty-php/smarty/issues/280 - + 26.08.2016 - bugfix change of 23.08.2016 failed on linux when use_include_path = true @@ -118,47 +259,47 @@ - bugfix update of 04.08.2016 was incomplete 05.08.2016 - - bugfix compiling of templates failed when the Smarty delimiter did contain '/' https://github.com/smarty-php/smarty/issues/264 + - bugfix compiling of templates failed when the Smarty delimiter did contain '/' https://github.com/smarty-php/smarty/issues/264 - updated error checking at template and config default handler - + 04.08.2016 - improvement move template function source parameter into extension - + 26.07.2016 - optimization unneeded loading of compiled resource - + 24.07.2016 - regression this->addPluginsDir('/abs/path/to/dir') adding absolute path without trailing '/' did fail https://github.com/smarty-php/smarty/issues/260 - + 23.07.2016 - bugfix setTemplateDir('/') and setTemplateDir('') did create wrong absolute filepath https://github.com/smarty-php/smarty/issues/245 - optimization of filepath normalization - improvement remove double function declaration in plugin shared.escape_special_cars.php https://github.com/smarty-php/smarty/issues/229 - + 19.07.2016 - bugfix multiple {include} with relative filepath within {block}{/block} could fail https://github.com/smarty-php/smarty/issues/246 - bugfix {math} shell injection vulnerability patch provided by Tim Weber - + 18.07.2016 - bugfix {foreach} if key variable and item@key attribute have been used both the key variable was not updated https://github.com/smarty-php/smarty/issues/254 - bugfix modifier on plugins like {plugin|modifier ... } did fail when the plugin does return an array https://github.com/smarty-php/smarty/issues/228 - bugfix avoid opcache_invalidate to result in ErrorException when opcache.restrict_api is not empty https://github.com/smarty-php/smarty/pull/244 - bugfix multiple {include} with relative filepath within {block}{/block} could fail https://github.com/smarty-php/smarty/issues/246 - + 14.07.2016 - bugfix wrong parameter on compileAllTemplates() and compileAllConfig() https://github.com/smarty-php/smarty/issues/231 - + 13.07.2016 - bugfix PHP 7 compatibility on registered compiler plugins https://github.com/smarty-php/smarty/issues/241 - update testInstall() https://github.com/smarty-php/smarty/issues/248https://github.com/smarty-php/smarty/issues/248 - bugfix enable debugging could fail when template objects did already exists https://github.com/smarty-php/smarty/issues/237 - bugfix template function data should be merged when loading subtemplate https://github.com/smarty-php/smarty/issues/240 - bugfix wrong parameter on compileAllTemplates() https://github.com/smarty-php/smarty/issues/231 - + 12.07.2016 - bugfix {foreach} item variable must be created also on empty from array https://github.com/smarty-php/smarty/issues/238 and https://github.com/smarty-php/smarty/issues/239 - bugfix enableSecurity() must init cache flags https://github.com/smarty-php/smarty/issues/247 - + 27.05.2016 - bugfix/improvement of compileAlltemplates() follow symlinks in template folder (PHP >= 5.3.1) https://github.com/smarty-php/smarty/issues/224 clear internal cache and expension handler for each template to avoid possible conflicts https://github.com/smarty-php/smarty/issues/231 @@ -201,26 +342,26 @@ 11.03.2016 - optimization of capture and security handling - improvement $smarty->clearCompiledTemplate() should return on recompiled or uncompiled resources - + 10.03.2016 - optimization of resource processing - + 09.03.2016 - improvement rework of 'scope' attribute handling see see NEW_FEATURES.txt https://github.com/smarty-php/smarty/issues/194 https://github.com/smarty-php/smarty/issues/186 https://github.com/smarty-php/smarty/issues/179 - bugfix correct Autoloader update of 2.3.2014 https://github.com/smarty-php/smarty/issues/199 - + 04.03.2016 - bugfix change from 01.03.2016 will cause $smarty->isCached(..) failure if called multiple time for same template (forum topic 25935) - + 02.03.2016 - revert autoloader optimizations because of unexplainable warning when using plugins https://github.com/smarty-php/smarty/issues/199 - + 01.03.2016 - bugfix template objects must be cached on $smarty->fetch('foo.tpl) calls incase the template is fetched multiple times (forum topic 25909) - + 25.02.2016 - bugfix wrong _realpath with 4 or more parent-directories https://github.com/smarty-php/smarty/issues/190 - optimization of _realpath @@ -229,10 +370,10 @@ 20.02.2016 - bugfix {strip} must keep space between hmtl tags. Broken by changes of 10.2.2016 https://github.com/smarty-php/smarty/issues/184 - new feature/bugfix {foreach}{section} add 'properties' attribute to force compilation of loop properties - see NEW_FEATURES.txt https://github.com/smarty-php/smarty/issues/189 - + see NEW_FEATURES.txt https://github.com/smarty-php/smarty/issues/189 + 19.02.2016 - - revert output buffer flushing on display, echo content again because possible problems when PHP files had + - revert output buffer flushing on display, echo content again because possible problems when PHP files had characters (newline} after ?> at file end https://github.com/smarty-php/smarty/issues/187 14.02.2016 @@ -243,33 +384,33 @@ - optimization make compiler tag object cache static for higher compilation speed 11.02.2016 - - improvement added KnockoutJS comments to trimwhitespace outputfilter https://github.com/smarty-php/smarty/issues/82 + - improvement added KnockoutJS comments to trimwhitespace outputfilter https://github.com/smarty-php/smarty/issues/82 https://github.com/smarty-php/smarty/pull/181 - + 10.02.2016 - bugfix {strip} must keep space on output creating smarty tags within html tags https://github.com/smarty-php/smarty/issues/177 - bugfix wrong precedence on special if conditions like '$foo is ... by $bar' could cause wrong code https://github.com/smarty-php/smarty/issues/178 - improvement because of ambiguities the inline constant support has been removed from the $foo.bar syntax https://github.com/smarty-php/smarty/issues/149 - - bugfix other {strip} error with output tags between hmtl https://github.com/smarty-php/smarty/issues/180 + - bugfix other {strip} error with output tags between hmtl https://github.com/smarty-php/smarty/issues/180 09.02.2016 - move some code from parser into compiler - reformat all code for unique style - update/bugfix scope attribute handling reworked. Read the newfeatures.txt file - + 05.02.2016 - improvement internal compiler changes - + 01.02.2016 - bugfix {foreach} compilation failed when $smarty->merge_compiled_includes = true and pre-filters are used. 29.01.2016 - bugfix implement replacement code for _tag_stack property https://github.com/smarty-php/smarty/issues/151 - + 28.01.2016 - bugfix allow windows network filepath or wrapper (forum topic 25876) https://github.com/smarty-php/smarty/issues/170 - bugfix if fetch('foo.tpl') is called on a template object the $parent parameter should default to the calling template object https://github.com/smarty-php/smarty/issues/152 - + 27.01.2016 - revert bugfix compiling {section} did create warning - bugfix {$smarty.section.customer.loop} did throw compiler error https://github.com/smarty-php/smarty/issues/161 @@ -279,7 +420,7 @@ - bugfix {extends} with relative file path did not work https://github.com/smarty-php/smarty/issues/154 https://github.com/smarty-php/smarty/issues/158 - bugfix {capture} data could not been seen in other templates with {$smarty.capture.name} https://github.com/smarty-php/smarty/issues/153 - + 26.01.2016 - improvement observe Smarty::$_CHARSET in debugging console https://github.com/smarty-php/smarty/issues/169 - bugfix compiling {section} did create warning @@ -289,28 +430,28 @@ - update scope handling - optimize block plugin compiler - improvement runtime checks if registered block plugins are callable - + 01.01.2016 - remove Smarty::$resource_cache_mode property - + 31.12.2015 - optimization of {assign}, {if} and {while} compiled code - + 30.12.2015 - bugfix plugin names starting with "php" did not compile https://github.com/smarty-php/smarty/issues/147 29.12.2015 - bugfix Smarty::error_reporting was not observed when display() or fetch() was called on template objects https://github.com/smarty-php/smarty/issues/145 - + 28.12.2015 - optimization of {foreach} code size and processing - + 27.12.2015 - improve inheritance code - update external methods - code fixes - PHPdoc updates - + 25.12.2015 - compile {block} tag code and its processing into classes - optimization replace hhvm extension by inline code @@ -324,45 +465,45 @@ - optimization move internal method decodeProperties back into template object - optimization move subtemplate processing back into template object - new feature Caching does now observe the template_dir setting and will create separate cache files if required - + 22.12.2015 - change $xxx_dir properties from private to protected in case Smarty class gets extended - code optimizations - + 21.12.2015 - bugfix a filepath starting with '/' or '\' on windows should normalize to the root dir of current working drive https://github.com/smarty-php/smarty/issues/134 - optimization of filepath normalization - bugfix {strip} must remove all blanks between html tags https://github.com/smarty-php/smarty/issues/136 - + ===== 3.1.29 ===== (21.12.2015) 21.12.2015 - optimization improve speed of filetime checks on extends and extendsall resource - + 20.12.2015 - bugfix failure when the default resource type was set to 'extendsall' https://github.com/smarty-php/smarty/issues/123 - update compilation of Smarty special variables - bugfix add addition check for OS type on normalization of file path https://github.com/smarty-php/smarty/issues/134 - bugfix the source uid of the extendsall resource must contain $template_dir settings https://github.com/smarty-php/smarty/issues/123 - + 19.12.2015 - bugfix using $smarty.capture.foo in expressions could fail https://github.com/smarty-php/smarty/pull/138 - bugfix broken PHP 5.2 compatibility https://github.com/smarty-php/smarty/issues/139 - remove no longer used code - improvement make sure that compiled and cache templates never can contain a trailing '?>? - + 18.12.2015 - bugfix regression when modifier parameter was followed by math https://github.com/smarty-php/smarty/issues/132 - + 17.12.2015 - bugfix {$smarty.capture.nameFail} did lowercase capture name https://github.com/smarty-php/smarty/issues/135 - bugfix using {block append/prepend} on same block in multiple levels of inheritance templates could fail (forum topic 25827) - bugfix text content consisting of just a single '0' like in {if true}0{/if} was suppressed (forum topic 25834) - + 16.12.2015 - bugfix {foreach} did fail if from atrribute is a Generator class https://github.com/smarty-php/smarty/issues/128 - bugfix direct access $smarty->template_dir = 'foo'; should call Smarty::setTemplateDir() https://github.com/smarty-php/smarty/issues/121 - + 15.12.2015 - bugfix {$smarty.cookies.foo} did return the $_COOKIE array not the 'foo' value https://github.com/smarty-php/smarty/issues/122 - bugfix a call to clearAllCache() and other should clear all internal template object caches (forum topic 25828) @@ -370,25 +511,25 @@ 14.12.2015 - bugfix {$smarty.config.foo} broken in 3.1.28 https://github.com/smarty-php/smarty/issues/120 - bugfix multiple calls of {section} with same name droped E_NOTICE error https://github.com/smarty-php/smarty/issues/118 - + ===== 3.1.28 ===== (13.12.2015) 13.12.2015 - bugfix {foreach} and {section} with uppercase characters in name attribute did not work (forum topic 25819) - bugfix $smarty->debugging_ctrl = 'URL' did not work (forum topic 25811) - bugfix Debug Console could display incorrect data when using subtemplates - + 09.12.2015 - bugfix Smarty did fail under PHP 7.0.0 with use_include_path = true; - + 09.12.2015 - bugfix {strip} should exclude some html tags from stripping, related to fix for https://github.com/smarty-php/smarty/issues/111 - + 08.12.2015 - bugfix internal template function data got stored in wrong compiled file https://github.com/smarty-php/smarty/issues/114 - + 05.12.2015 -bugfix {strip} should insert a single space https://github.com/smarty-php/smarty/issues/111 - + 25.11.2015 -bugfix a left delimter like '[%' did fail on [%$var_[%$variable%]%] (forum topic 25798) @@ -397,7 +538,7 @@ 01.11.2015 - update config file processing - + 31.10.2015 - bugfix add missing $trusted_dir property to SmartyBC class (forum topic 25751) @@ -421,7 +562,7 @@ 18.09.2015 - bugfix {if $foo instanceof $bar} failed to compile if 2nd value is a variable https://github.com/smarty-php/smarty/issues/92 - + 17.09.2015 - bugfix {foreach} first attribute was not correctly reset since commit 05a8fa2 of 02.08.2015 https://github.com/smarty-php/smarty/issues/90 @@ -435,7 +576,7 @@ - move code of {call} processing back into Smarty_Internal_Template class - improvement invalidate OPCACHE for cleared compiled and cached template files (forum topic 25557) - bugfix unintended multiple debug windows (forum topic 25699) - + 30.08.2015 - size optimization move some runtime functions into extension - optimize inline template processing @@ -584,10 +725,10 @@ 01.06.2015 - bugfix <?xml ... ?> including template variables broken since 3.1.22 https://github.com/smarty-php/smarty/issues/47 - + 27.05.2015 - bugfix {include} with variable file name must not create by default individual cache file (since 3.1.22) https://github.com/smarty-php/smarty/issues/43 - + 24.05.2015 - bugfix if condition string 'neq' broken due to a typo https://github.com/smarty-php/smarty/issues/42 @@ -595,11 +736,11 @@ 23.05.2015 - improvement on php_handling to allow very large PHP sections, better error handling - improvement allow extreme large comment sections (forum 25538) - + 21.05.2015 - bugfix broken PHP 5.2 compatibility when compiling <?php tags https://github.com/smarty-php/smarty/issues/40 - bugfix named {foreach} comparison like $smarty.foreach.foobar.index > 1 did compile into wrong code https://github.com/smarty-php/smarty/issues/41 - + 19.05.2015 - bugfix compiler did overwrite existing variable value when setting the nocache attribute https://github.com/smarty-php/smarty/issues/39 - bugfix output filter trimwhitespace could run into the pcre.backtrack_limit on large output (code.google issue 220) @@ -607,14 +748,14 @@ 18.05.2015 - improvement introduce shortcuts in lexer/parser rules for most frequent terms for higher - compilation speed + compilation speed 16.05.2015 - bugfix {php}{/php} did work just for single lines https://github.com/smarty-php/smarty/issues/33 - improvement remove not needed ?><?php transitions from compiled code - improvement reduce number of lexer tokens on operators and if conditions - improvement higher compilation speed by modified lexer/parser generator at "smarty/smarty-lexer" - + 13.05.2015 - improvement remove not needed ?><?php transitions from compiled code - improvement of debugging: @@ -623,7 +764,7 @@ - display Smarty version number - Truncate lenght of Origin display and extend strin value display to 80 character - bugfix in Smarty_Security 'nl2br' should be a trusted modifier, not PHP function (code.google issue 223) - + 12.05.2015 - bugfix {$smarty.constant.TEST} did fail on undefined constant https://github.com/smarty-php/smarty/issues/28 - bugfix access to undefined config variable like {#undef#} did fail https://github.com/smarty-php/smarty/issues/29 @@ -633,7 +774,7 @@ 12.05.2015 - bugfix of smaller performance issue introduce in 3.1.22 when caching is enabled - bugfix missig entry for smarty-temmplate-config in autoloader - + ===== 3.1.22 ===== tag was deleted because 3.1.22 did fail caused by the missing entry for smarty-temmplate-config in autoloader 10.05.2015 - bugfix custom cache resource did not observe compile_id and cache_id when $cache_locking == true @@ -647,14 +788,14 @@ 06.05.2015 - bugfix in 3.1.22-dev cache resource must not be loaded for subtemplates - bugfix/improvement in 3.1.22-dev cache locking did not work as expected - + 05.05.2015 - optimization on cache update when main template is modified - optimization move <?php ?> handling from parser to new compiler module 05.05.2015 - bugfix code could be messed up when {tags} are used in multiple attributes https://github.com/smarty-php/smarty/issues/23 - + 04.05.2015 - bugfix Smarty_Resource::parseResourceName incompatible with Google AppEngine (https://github.com/smarty-php/smarty/issues/22) - improvement use is_file() checks to avoid errors suppressed by @ which could still cause problems (https://github.com/smarty-php/smarty/issues/24) @@ -664,13 +805,13 @@ 28.04.2015 - bugfix plugins of merged subtemplates not loaded in 3.1.22-dev (forum topic 25508) - - 23.04.2015 + + 23.04.2015 - bugfix a nocache template variable used as parameter at {insert} was by mistake cached - + 20.04.2015 - bugfix at a template function containing nocache code a parmeter could overwrite a template variable of same name - + 27.03.2015 - bugfix Smarty_Security->allow_constants=false; did also disable true, false and null (change of 16.03.2015) - improvement added a whitelist for trusted constants to security Smarty_Security::$trusted_constants (forum topic 25471) @@ -678,39 +819,39 @@ 20.03.2015 - bugfix make sure that function properties get saved only in compiled files containing the fuction definition {forum topic 25452} - bugfix correct update of global variable values on exit of template functions. (reported under Smarty Developers) - + 16.03.2015 - bugfix problems with {function}{/function} and {call} tags in different subtemplate cache files {forum topic 25452} - bugfix Smarty_Security->allow_constants=false; did not disallow direct usage of defined constants like {SMARTY_DIR} {forum topic 25457} - bugfix {block}{/block} tags did not work inside double quoted strings https://github.com/smarty-php/smarty/issues/18 - - + + 15.03.2015 - bugfix $smarty->compile_check must be restored before rendering of a just updated cache file {forum 25452} - + 14.03.2015 - bugfix {nocache} {/nocache} tags corrupted code when used within a nocache section caused by a nocache template variable. - + - bugfix template functions defined with {function} in an included subtemplate could not be called in nocache mode with {call... nocache} if the subtemplate had it's own cache file {forum 25452} - + 10.03.2015 - bugfix {include ... nocache} whith variable file or compile_id attribute was not executed in nocache mode. - + 12.02.2015 - bugfix multiple Smarty::fetch() of same template when $smarty->merge_compiled_includes = true; could cause function already defined error - + 11.02.2015 - bugfix recursive {includes} did create E_NOTICE message when $smarty->merge_compiled_includes = true; (github issue #16) - + 22.01.2015 - new feature security can now control access to static methods and properties see also NEW_FEATURES.txt 21.01.2015 - bugfix clearCompiledTemplates(), clearAll() and clear() could try to delete whole drive at wrong path permissions because realpath() fail (forum 25397) - - bugfix 'self::' and 'parent::' was interpreted in template syntax as static class - + - bugfix 'self::' and 'parent::' was interpreted in template syntax as static class + 04.01.2015 - push last weeks changes to github @@ -721,10 +862,10 @@ - optimization restructure config file processing 31.12.2014 - - bugfix use function_exists('mb_get_info') for setting Smarty::$_MBSTRING. + - bugfix use function_exists('mb_get_info') for setting Smarty::$_MBSTRING. Function mb_split could be overloaded depending on php.ini mbstring.func_overload - - + + 29.12.2014 - new feature security can now limit the template nesting level by property $max_template_nesting see also NEW_FEATURES.txt (forum 25370) @@ -738,14 +879,14 @@ 13.12.2014 - improvement optimization of lexer and parser resulting in a up to 30% higher compiling speed - + 11.12.2014 - bugfix resolve parser ambiguity between constant print tag {CONST} and other smarty tags after change of 09.12.2014 - + 09.12.2014 - bugfix variables $null, $true and $false did not work after the change of 12.11.2014 (forum 25342) - bugfix call of template function by a variable name did not work after latest changes (forum 25342) - + 23.11.2014 - bugfix a plugin with attached modifier could fail if the tag was immediately followed by another Smarty tag (since 3.1.21) (forum 25326) @@ -763,12 +904,12 @@ 04.11.2014 - new feature $smarty->debugging = true; => overwrite existing Debug Console window (old behaviour) $smarty->debugging = 2; => individual Debug Console window by template name - + 03.11.2014 - bugfix Debug Console did not show included subtemplates since 3.1.17 (forum 25301) - bugfix Modifier debug_print_var did not limit recursion or prevent recursive object display at Debug Console (ATTENTION: parameter order has changed to be able to specify maximum recursion) - - bugfix Debug consol did not include subtemplate information with $smarty->merge_compiled_includes = true + - bugfix Debug consol did not include subtemplate information with $smarty->merge_compiled_includes = true - improvement The template variables are no longer displayed as objects on the Debug Console - improvement $smarty->createData($parent = null, $name = null) new optional name parameter for display at Debug Console - addition of some hooks for future extension of Debug Console @@ -785,7 +926,7 @@ 26.10.2014 - bugfix E_NOTICE message was created during compilation when ASP tags '<%' or '%>' are in template source text - bugfix merge_compiled_includes option failed when caching enables and same subtemplate was included cached and not cached - + ===== 3.1.21 ===== (18.10.2014) 18.10.2014 - composer moved to github @@ -812,143 +953,143 @@ ===== 3.1.20 ===== (09.10.2014) 08.10.2014 - bugfix security mode of "<script language=php>" must be controlled by $php_handling property (Thue Kristensen) - + 01.10.2014 - bugfix template resource of inheritance blocks could get invalid if the default resource type is not 'file'(Issue 202) - bugfix existing child {block} tag must override parent {block} tag append / prepend setting (topic 25259) - + 02.08.2014 - bugfix modifier wordwrap did output break string wrong if first word was exceeding length with cut = true (topic 25193) - + 24.07.2014 - bugfix cache clear when cache folder does not exist 16.07.2014 - enhancement remove BOM automatically from template source (topic 25161) - + 04.07.2014 - bugfix the bufix of 02.06.2014 broke correct handling of child templates with same name but different template folders in extends resource (issue 194 and topic 25099) - + ===== 3.1.19 ===== (30.06.2014) 20.06.2014 - bugfix template variables could not be passed as parameter in {include} when the include was in a {nocache} section (topic 25131) - + 17.06.2014 - bugfix large template text of some charsets could cause parsing errors (topic 24630) - + 08.06.2014 - bugfix registered objects did not work after spelling fixes of 06.06.2014 - bugfix {block} tags within {literal} .. {/literal} got not displayed correctly (topic 25024) - bugfix UNC WINDOWS PATH like "\\psf\path\to\dir" did not work as template directory (Issue 192) - bugfix {html_image} security check did fail on files relative to basedir (Issue 191) - + 06.06.2014 - fixed PHPUnit outputFilterTrimWhitespaceTests.php assertion of test result - fixed spelling, PHPDoc , minor errors, code cleanup - + 02.06.2014 - using multiple cwd with relative template dirs could result in identical compiled file names. (issue 194 and topic 25099) - + 19.04.2014 - bugfix calling createTemplate(template, data) with empty data array caused notice of array to string conversion (Issue 189) - bugfix clearCompiledTemplate() did not delete files on WINDOWS when a compile_id was specified - + 18.04.2014 - revert bugfix of 5.4.2014 because %-e date format is not supported on all operating systems ===== 3.1.18 ===== (07.04.2014) - 06.04.2014 + 06.04.2014 - bugfix template inheritance fail when using custom resource after patch of 8.3.2014 (Issue 187) - bugfix update of composer file (Issue 168 and 184) 05.04.2014 - bugfix default date format leads to extra spaces when displaying dates with single digit days (Issue 165) - + 26.03.2014 - bugfix Smart_Resource_Custom should not lowercase the resource name (Issue 183) - + 24.03.2014 - bugfix using a {foreach} property like @iteration could fail when used in inheritance parent templates (Issue 182) - + 20.03.2014 - bugfix $smarty->auto_literal and mbsting.func_overload 2, 6 or 7 did fail (forum topic 24899) - + 18.03.2014 - revert change of 17.03.2014 - + 17.03.2014 - bugfix $smarty->auto_literal and mbsting.func_overload 2, 6 or 7 did fail (forum topic 24899) - + 15.03.2014 - bugfix Smarty_CacheResource_Keyvaluestore did use different keys on read/writes and clearCache() calls (Issue 169) 13.03.2014 - bugfix clearXxx() change of 27.1.2014 did not work when specifing cache_id or compile_id (forum topic 24868 and 24867) - + ===== 3.1.17 ===== 08.03.2014 - bugfix relative file path {include} within {block} of child templates did throw exception on first call (Issue 177) - + 17.02.2014 - bugfix Smarty failed when executing PHP on HHVM (Hip Hop 2.4) because uniqid('',true) does return string with ',' (forum topic 20343) - + 16.02.2014 - bugfix a '//' or '\\' in template_dir path could produce wrong path on relative filepath in {include} (Issue 175) - + 05.02.2014 - bugfix shared.literal_compiler_param.php did throw an exception when literal did contain a '-' (smarty-developers group) - + 27.01.2014 - bugfix $smarty->debugging = true; did show the variable of the $smarty object not the variables used in display() call (forum topic 24764) - bugfix clearCompiledTemplate(), clearAll() and clear() should use realpath to avoid possible exception from RecursiveDirectoryIterator (Issue 171) - + 26.01.2014 - bugfix undo block nesting checks for {nocache} for reasons like forum topic 23280 (forum topic 24762) - + 18.01.2014 - bugfix the compiler did fail when using template inheritance and recursive {include} (smarty-developers group) - + 11.01.2014 - bugfix "* }" (spaces before right delimiter) was interpreted by mistake as comment end tag (Issue 170) - internals content cache should be clear when updating cache file - + 08.01.2014 - bugfix Smarty_CacheResource_Custom did not handle template resource type specifications on clearCache() calls (Issue 169) - bugfix SmartyBC.class.php should use require_once to load Smarty.class.php (forum topic 24683) - + ===== 3.1.16 ===== 15.12.2013 - bugfix {include} with {block} tag handling (forum topic 24599, 24594, 24682) (Issue 161) Read 3.1.16_RELEASE_NOTES for more details - enhancement additional debug output at $smarty->_parserdebug = true; - + 07.11.2013 - bugfix too restrictive handling of {include} within {block} tags. 3.1.15 did throw errors where 3.1.14 did not (forum topic 24599) - bugfix compiler could fail if PHP mbstring.func_overload is enabled (Issue 164) - + 28.10.2013 - bugfix variable resource name at custom resource plugin did not work within {block} tags (Issue 163) - bugfix notice "Trying to get property of non-object" removed (Issue 163) - bugfix correction of modifier capitalize fix from 3.10.2013 (issue 159) - - bugfix multiple {block}s with same name in parent did not work (forum topic 24631) - + - bugfix multiple {block}s with same name in parent did not work (forum topic 24631) + 20.10.2013 - bugfix a variable file name at {extends} tag did fail (forum topic 24618) - + 14.10.2013 - bugfix yesterdays fix could result in an undefined variable - + 13.10.2013 - bugfix variable names on {include} in template inheritance did unextepted error message (forum topic 24594) (Issue 161) -.- bugfix relative includes with same name like {include './foo.tpl'} from different folder failed (forum topic 24590)(Issue 161) +.- bugfix relative includes with same name like {include './foo.tpl'} from different folder failed (forum topic 24590)(Issue 161) 04.10.2013 - - bugfix variable file names at {extends} had been disbabled by mistake with the rewrite of + - bugfix variable file names at {extends} had been disbabled by mistake with the rewrite of template inheritance of 24.08.2013 (forum topic 24585) - + 03.10.2013 - bugfix loops using modifier capitalize did eat up memory (issue 159) - + ===== Smarty 3.1.15 ===== 01.10.2013 - use current delimiters in compiler error messages (issue 157) @@ -959,7 +1100,7 @@ 16.09.2013 - bugfix recompiled templates did not show on first request with zend opcache cache (forum topic 24320) - + 13.09.2013 - bugfix html_select_time defaulting error for the Meridian dropdown (forum topic 24549) @@ -977,7 +1118,7 @@ - The {strip} tag can now be placed outside {block} tags in child templates (forum topic 24289) - change SmartyException::$escape is now false by default - change PHP traceback has been remove for SmartyException and SmartyCompilerException - + 14.08.2013 - bugfix compiled filepath of config file did not observe different config_dir (forum topic 24493) @@ -1033,7 +1174,7 @@ 25.04.2013 - bugfix escape and wordrap modifier could be compiled into wrong code when used in {nocache}{/nocache} section but caching is disabled (Forum Topic 24260) - + 05.04.2013 - bugfix post filter must not run when compiling inheritance child blocks (Forum Topic 24094) - bugfix after the fix for Issue #130 compiler exceptions got double escaped (Forum Topic 24199) @@ -1063,7 +1204,7 @@ - bugfix wrong variable usage in smarty_internal_utility.php (Issue #125) 26.11.2012 -- bugfix global variable assigned within template function are not seen after template function exit (Forum Topic 23800) +- bugfix global variable assigned within template function are not seen after template function exit (Forum Topic 23800) 24.11.2012 - made SmartyBC loadable via composer (Issue #124) @@ -1095,7 +1236,7 @@ Either we get MBstring's full package, or we pretend it's not there at all. 21.08.2012 -- bugfix $auto_literal = false did not work with { block} tags in child templates +- bugfix $auto_literal = false did not work with { block} tags in child templates (problem was reintroduced after fix in 3.1.7)(Forum Topic 20581) 17.08.2012 @@ -1112,16 +1253,16 @@ - bugfix avoid PHP error on $smarty->configLoad(...) with invalid section specification (Forum Topic 22608) 30.07.2012 --bugfix {assign} in a nocache section should not overwrite existing variable values +-bugfix {assign} in a nocache section should not overwrite existing variable values during compilation (issue 109) - + 28.07.2012 - bugfix array access of config variables did not work (Forum Topic 22527) 19.07.2012 - bugfix the default plugin handler did create wrong compiled code for static class methods from external script files (issue 108) - + ===== Smarty-3.1.11 ===== 30.06.2012 - bugfix {block.. hide} did not work as nested child (Forum Topic 22216) @@ -1238,7 +1379,7 @@ - bugfix template inheritace did fail if mbstring.func_overload != 0 (issue 70) (Forum Topic 20680) 20.12.2011 -- bugfix template inheritance: {$smarty.block.child} in nested child {block} tags did not return +- bugfix template inheritance: {$smarty.block.child} in nested child {block} tags did not return content after {$smarty.block.child} (Forum Topic 20564) ===== Smarty-3.1.7 ===== @@ -1249,7 +1390,7 @@ - bugfix unregisterObject() raised notice when object to unregister did not exist - changed internals to use Smarty::$_MBSTRING ($_CHARSET, $_DATE_FORMAT) for better unit testing - added Smarty::$_UTF8_MODIFIER for proper PCRE charset handling (Forum Topic 20452) -- added Smarty_Security::isTrustedUri() and Smarty_Security::$trusted_uri to validate +- added Smarty_Security::isTrustedUri() and Smarty_Security::$trusted_uri to validate remote resource calls through {fetch} and {html_image} (Forum Topic 20627) 17.12.2011 @@ -1261,11 +1402,11 @@ 9.12.2011 - bugfix {capture} tags around recursive {include} calls did throw exception (Forum Topic 20549) - bugfix $auto_literal = false did not work with { block} tags in child templates (Forum Topic 20581) -- bugfix template inheritance: do not include code of {include} in overloaded {block} into compiled +- bugfix template inheritance: do not include code of {include} in overloaded {block} into compiled parent template (Issue #66} - bugfix template inheritance: {$smarty.block.child} in nested child {block} tags did not return expected result (Forum Topic 20564) - + ===== Smarty-3.1.6 ===== 30.11.2011 - bugfix is_cache() for individual cached subtemplates with $smarty->caching = CACHING_OFF did produce @@ -1275,7 +1416,7 @@ - bugfix added exception if the default plugin handler did return a not static callback (Forum Topic 20512) 25.11.2011 -- bugfix {html_select_date} and {html_slecet_time} did not default to current time if "time" was not specified +- bugfix {html_select_date} and {html_slecet_time} did not default to current time if "time" was not specified since r4432 (issue 60) 24.11.2011 @@ -1305,7 +1446,7 @@ 22.10.2011 - bugfix smarty_mb_from_unicode() would not decode unicode-points properly -- bugfix use catch Exception instead UnexpectedValueException in +- bugfix use catch Exception instead UnexpectedValueException in clearCompiledTemplate to be PHP 5.2 compatible 21.10.2011 @@ -1346,7 +1487,7 @@ 11.10.2011 - add runtime checks for not matching {capture}/{/capture} calls (Forum Topic 20120) - + 10.10.2011 - bugfix variable name typo in {html_options} and {html_checkboxes} (Issue #54) - bugfix <?xml> tag did create wrong output when caching enabled and the tag was in included subtemplate @@ -1374,7 +1515,7 @@ 04.10.2011 - bugfix assign() in plugins called in subtemplates did change value also in parent template -- bugfix of problem introduced with r4342 on math plugin +- bugfix of problem introduced with r4342 on math plugin - bugfix output filter should not run on individually cached subtemplates - add unloadFilter() method - bugfix has_nocache_code flag was not reset before compilation @@ -1415,7 +1556,7 @@ - remove unused properties - optimization use real function instead anonymous function for preg_replace_callback - bugfix a relative {include} in child template blocks failed -- bugfix direct setting of $template_dir, $config_dir, $plugins_dir in __construct() of an +- bugfix direct setting of $template_dir, $config_dir, $plugins_dir in __construct() of an extended Smarty class created problems - bugfix error muting was not implemented for cache locking @@ -1608,7 +1749,7 @@ - removed experimental setOption() getOption() methods - output returned content also on opening tag calls of block plugins - rewrite of default plugin handler -- compile code of variable filters for better performance +- compile code of variable filters for better performance 20/04/2011 - allow {php} {include_php} tags and PHP_ALLOW handling only with the SmartyBC class @@ -1645,7 +1786,7 @@ 21/02/2011 - added new new compile_check mode COMPILECHECK_CACHEMISS - corrected new cloning behaviour of createTemplate() -- do no longer store the compiler object as property in the compile_tag classes to avoid possible memory leaks +- do no longer store the compiler object as property in the compile_tag classes to avoid possible memory leaks during compilation 19/02/2011 @@ -1781,7 +1922,7 @@ 01/03/2011 - bugfix replace modifier did not work in 3.0.7 on systems without multibyte support -- bugfix {$smarty.template} could return in 3.0.7 parent template name instead of +- bugfix {$smarty.template} could return in 3.0.7 parent template name instead of child name when it needed to compile 25/02/2011 @@ -1950,7 +2091,7 @@ - reactivated $error_reporting property handling - fixed typo in compile_continue - fixed security in {fetch} plugin -- changed back plugin parameters to two. second is template object +- changed back plugin parameters to two. second is template object with transparent access to Smarty object - fixed {config_load} scoping form compile time to run time @@ -1972,7 +2113,7 @@ request_use_auto_globals security is enabled. 01/11/2010 -- bugfix related to E_NOTICE change. {if empty($foo)} did fail when $foo contained a string +- bugfix related to E_NOTICE change. {if empty($foo)} did fail when $foo contained a string 28/10/2010 - bugfix on compiling modifiers within $smarty special vars like {$smarty.post.{$foo|lower}} @@ -2133,7 +2274,7 @@ request_use_auto_globals 21/06/2010 - removed use of PHP shortags SMARTY_PHP_PASSTHRU mode -- improved speed of cache->clear() when a compile_id was specified and use_sub_dirs is true +- improved speed of cache->clear() when a compile_id was specified and use_sub_dirs is true 20/06/2010 - replace internal get_time() calls with standard PHP5 microtime(true) calls @@ -2193,13 +2334,13 @@ request_use_auto_globals - reverted the change 0f 30/04/2010. With the exception of forward references template functions can be again called by a standard tag. 10/05/2010 -- bugfix on {foreach} and {for} optimizations of 27/04/2010 +- bugfix on {foreach} and {for} optimizations of 27/04/2010 09/05/2010 -- update of template and config file parser because of minor parser generator bugs +- update of template and config file parser because of minor parser generator bugs 07/05/2010 -- bugfix on {insert} +- bugfix on {insert} 06/05/2010 - bugfix when merging compiled templates and objects are passed as parameter of the {include} tag @@ -2207,7 +2348,7 @@ request_use_auto_globals 05/05/2010 - bugfix on {insert} to cache parameter - implementation of $smarty->default_modifiers as in Smarty2 -- bugfix on getTemplateVars method +- bugfix on getTemplateVars method 01/05/2010 - bugfix on handling of variable method names at object chaning @@ -2239,7 +2380,7 @@ request_use_auto_globals - removed parser restrictions in using true,false and null as ID 07/04/2010 -- bugfix typo in smarty_internal_templatecompilerbase +- bugfix typo in smarty_internal_templatecompilerbase 31/03/2010 - compile locking by touching old compiled files to avoid concurrent compilations @@ -2251,7 +2392,7 @@ request_use_auto_globals 25/03/2010 - change of utility->compileAllTemplates() log messages -- bugfix on nocache code in {function} tags +- bugfix on nocache code in {function} tags - new method utility->compileAllConfig() to compile all config files 24/03/2010 @@ -2276,7 +2417,7 @@ request_use_auto_globals 16/03/2010 - bugfix on assign attribute at registered template objects - make handling of modifiers on expression BC to Smarty2 - + 15/03/2010 - bugfix on block plugin calls @@ -2295,7 +2436,7 @@ request_use_auto_globals - bugfix on nocache code in {block} tags if child template was included by {include} 27/02/2010 -- allow block tags inside double quoted string +- allow block tags inside double quoted string 26/02/2010 - cache modified check implemented @@ -2377,15 +2518,15 @@ request_use_auto_globals - bugfix on backslash within single quoted strings - bugfix allow absolute filepath for config files - bugfix on special Smarty variable $smarty.cookies -- revert handling of newline on no output tags like {if...} +- revert handling of newline on no output tags like {if...} - allow special characters in config file section names for Smarty2 BC 01/13/2010 -- bugfix on {if} tags +- bugfix on {if} tags 01/12/2010 - changed back modifier handling in parser. Some restrictions still apply: - if modifiers are used in side {if...} expression or in mathematical expressions + if modifiers are used in side {if...} expression or in mathematical expressions parentheses must be used. - bugfix the {function..} tag did not accept the name attribute in double quotes - closed possible security hole at <?php ... ?> tags @@ -2415,7 +2556,7 @@ request_use_auto_globals - bugfix for custom delimiter at extends resource and {extends} tag 01/05/2010 -- bugfix sha1() calculations at extends resource and some general improvments on sha1() handling +- bugfix sha1() calculations at extends resource and some general improvments on sha1() handling 01/03/2010 @@ -2445,7 +2586,7 @@ request_use_auto_globals - use sha1() for filepath encoding - updates on nocache_hash handling - internal change on merging some data -- fixed cache filename for custom resources +- fixed cache filename for custom resources 12/28/2009 - update for security fixes @@ -2597,12 +2738,12 @@ request_use_auto_globals - fixed preg_qoute on delimiters 11/09/2009 -- lexer/parser bugfix +- lexer/parser bugfix - new SMARTY_SPL_AUTOLOAD constant to control the autoloader option - bugfix for {function} block tags in included templates 11/08/2009 -- fixed alphanumeric array index +- fixed alphanumeric array index - bugfix on complex double quoted strings 11/05/2009 @@ -2620,7 +2761,7 @@ request_use_auto_globals - new security_class property (default is Smarty_Security) 11/02/2009 -- added neq,lte,gte,mod as aliases to if conditions +- added neq,lte,gte,mod as aliases to if conditions - throw exception on illegal Smarty() constructor calls 10/31/2009 @@ -2651,7 +2792,7 @@ request_use_auto_globals - added {$foo++}{$foo--} syntax - buxfix changed PHP "if (..):" to "if (..){" because of possible bad code when concenating PHP tags - autoload Smarty internal classes -- fixed file dependency for config files +- fixed file dependency for config files - some code optimizations - fixed function definitions on some autoloaded methods - fixed nocache variable inside if condition of {if} tag @@ -2662,7 +2803,7 @@ request_use_auto_globals 10/19/2009 - fixed compiled template merging on variable double quoted strings as name -- fixed bug in caching mode 2 and cache_lifetime -1 +- fixed bug in caching mode 2 and cache_lifetime -1 - fixed modifier support on block tags 10/17/2009 @@ -2861,7 +3002,7 @@ NOTICE: existing compiled template and cache files must be deleted 05/05/2009 - fixed E_STRICT incompabilities -- {function} tag bug fix +- {function} tag bug fix - security policy definitions have been moved from plugins folder to file Security.class.php in libs folder - added allow_super_global configuration to security @@ -2921,9 +3062,9 @@ NOTICE: existing compiled template and cache files must be deleted 04/10/2009 - check if mb string functions available otherwise fallback to normal string functions -- added global variable scope SMARTY_GLOBAL_SCOPE +- added global variable scope SMARTY_GLOBAL_SCOPE - enable 'variable' filter by default -- fixed {$smarty.block.parent.foo} +- fixed {$smarty.block.parent.foo} - implementation of a 'variable' filter as replacement for default modifier 04/09/2009 @@ -2963,7 +3104,7 @@ NOTICE: existing compiled template and cache files must be deleted 03/31/2009 - bugfix smarty.class and internal.security_handler -- added compile_check configuration +- added compile_check configuration - added setter/getter methods 03/30/2009 @@ -2996,7 +3137,7 @@ NOTICE: existing compiled template and cache files must be deleted - fixed exceptions in function plugins - fixed notice error in Smarty.class.php - allow chained objects to span multiple lines -- fixed error in modifiers +- fixed error in modifiers 03/20/2009 - moved /plugins folder into /libs folder @@ -3005,14 +3146,14 @@ NOTICE: existing compiled template and cache files must be deleted 03/19/2009 - allow array definition as modifier parameter -- changed modifier to use multi byte string funktions. +- changed modifier to use multi byte string funktions. 03/17/2009 -- bugfix +- bugfix 03/15/2009 - added {include_php} tag for BC -- removed @ error suppression +- removed @ error suppression - bugfix fetch did always repeat output of first call when calling same template several times - PHPunit tests extended @@ -3109,7 +3250,7 @@ NOTICE: existing compiled template and cache files must be deleted - changed search order on modifiers to look at plugins folder first - parser bug fix for modifier on array elements $foo.bar|modifier - parser bug fix on single quoted srings -- internal: splitted up compiler plugin files +- internal: splitted up compiler plugin files 02/01/2009 - allow method chaining on static classes @@ -3173,7 +3314,7 @@ NOTICE: existing compiled template and cache files must be deleted - optimization of plugin loading 12/30/2008 -- added compiler support of registered object +- added compiler support of registered object - added backtick support in doubled quoted strings for backward compatibility - some minor bug fixes and improvments @@ -3184,7 +3325,7 @@ NOTICE: existing compiled template and cache files must be deleted - finished work on (un)register_modifier method - plugin handling from plugins folder changed for modifier plugins deleted - internal.modifier.php -- added modifier chaining to parser +- added modifier chaining to parser 12/17/2008 - finished (un)register_function method diff --git a/vendor/smarty/smarty/composer.json b/vendor/smarty/smarty/composer.json new file mode 100644 index 000000000..5064c8ce3 --- /dev/null +++ b/vendor/smarty/smarty/composer.json @@ -0,0 +1,39 @@ +{ + "name": "smarty/smarty", + "type": "library", + "description": "Smarty - the compiling PHP template engine", + "keywords": ["templating"], + "homepage": "http://www.smarty.net", + "license": "LGPL-3.0", + "authors": [ + { + "name": "Monte Ohrt", + "email": "monte@ohrt.com" + }, + { + "name": "Uwe Tews", + "email": "uwe.tews@googlemail.com" + }, + { + "name": "Rodney Rehm", + "email": "rodney.rehm@medialize.de" + } + ], + "support": { + "irc": "irc://irc.freenode.org/smarty", + "issues": "https://github.com/smarty-php/smarty/issues", + "forum": "http://www.smarty.net/forums/" + }, + "require": { + "php": ">=5.2" + }, + "autoload": { + "files": ["libs/bootstrap.php"] + }, + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + } + +} diff --git a/vendor/smarty/smarty/demo/plugins/cacheresource.pdo.php b/vendor/smarty/smarty/demo/plugins/cacheresource.pdo.php index d1e2d6ace..24a94c1a0 100644 --- a/vendor/smarty/smarty/demo/plugins/cacheresource.pdo.php +++ b/vendor/smarty/smarty/demo/plugins/cacheresource.pdo.php @@ -91,7 +91,7 @@ class Smarty_CacheResource_Pdo extends Smarty_CacheResource_Custom * * @param PDO $pdo PDO : active connection * @param string $table : table (or view) name - * @param string $database : optionnal - if table is located in another db + * @param string $database : optional - if table is located in another db */ public function __construct(PDO $pdo, $table, $database = null) { diff --git a/vendor/smarty/smarty/error_reporting.ini b/vendor/smarty/smarty/error_reporting.ini new file mode 100644 index 000000000..496bbf5c2 --- /dev/null +++ b/vendor/smarty/smarty/error_reporting.ini @@ -0,0 +1 @@ +error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
\ No newline at end of file diff --git a/vendor/smarty/smarty/libs/Autoloader.php b/vendor/smarty/smarty/libs/Autoloader.php index d3b039caa..3a0da8faf 100644 --- a/vendor/smarty/smarty/libs/Autoloader.php +++ b/vendor/smarty/smarty/libs/Autoloader.php @@ -14,13 +14,13 @@ * require_once '...path/Autoloader.php'; * Smarty_Autoloader::register(); * or - * include '...path/bootstarp.php'; + * include '...path/bootstrap.php'; * * $smarty = new Smarty(); */ class Smarty_Autoloader { - /** + /** * Filepath to Smarty root * * @var string @@ -76,7 +76,7 @@ class Smarty_Autoloader self::$SMARTY_DIR = defined('SMARTY_DIR') ? SMARTY_DIR : dirname(__FILE__) . DIRECTORY_SEPARATOR; self::$SMARTY_SYSPLUGINS_DIR = defined('SMARTY_SYSPLUGINS_DIR') ? SMARTY_SYSPLUGINS_DIR : self::$SMARTY_DIR . 'sysplugins' . DIRECTORY_SEPARATOR; - if (version_compare(phpversion(), '5.3.0', '>=')) { + if (version_compare(PHP_VERSION, '5.3.0', '>=')) { spl_autoload_register(array(__CLASS__, 'autoload'), true, $prepend); } else { spl_autoload_register(array(__CLASS__, 'autoload')); diff --git a/vendor/smarty/smarty/libs/Smarty.class.php b/vendor/smarty/smarty/libs/Smarty.class.php index 57eedfb93..597fbbf0c 100644 --- a/vendor/smarty/smarty/libs/Smarty.class.php +++ b/vendor/smarty/smarty/libs/Smarty.class.php @@ -21,34 +21,44 @@ * smarty-discussion-subscribe@googlegroups.com * * @link http://www.smarty.net/ - * @copyright 2016 New Digital Group, Inc. - * @copyright 2016 Uwe Tews + * @copyright 2018 New Digital Group, Inc. + * @copyright 2018 Uwe Tews * @author Monte Ohrt <monte at ohrt dot com> - * @author Uwe Tews + * @author Uwe Tews <uwe dot tews at gmail dot com> * @author Rodney Rehm * @package Smarty - * @version 3.1.31 + * @version 3.1.32 */ - /** * set SMARTY_DIR to absolute path to Smarty library files. * Sets SMARTY_DIR only if user application has not already defined it. */ if (!defined('SMARTY_DIR')) { + /** + * + */ define('SMARTY_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR); } - /** * set SMARTY_SYSPLUGINS_DIR to absolute path to Smarty internal plugins. * Sets SMARTY_SYSPLUGINS_DIR only if user application has not already defined it. */ if (!defined('SMARTY_SYSPLUGINS_DIR')) { + /** + * + */ define('SMARTY_SYSPLUGINS_DIR', SMARTY_DIR . 'sysplugins' . DIRECTORY_SEPARATOR); } if (!defined('SMARTY_PLUGINS_DIR')) { + /** + * + */ define('SMARTY_PLUGINS_DIR', SMARTY_DIR . 'plugins' . DIRECTORY_SEPARATOR); } if (!defined('SMARTY_MBSTRING')) { + /** + * + */ define('SMARTY_MBSTRING', function_exists('mb_get_info')); } if (!defined('SMARTY_RESOURCE_CHAR_SET')) { @@ -64,14 +74,12 @@ if (!defined('SMARTY_RESOURCE_DATE_FORMAT')) { */ define('SMARTY_RESOURCE_DATE_FORMAT', '%b %e, %Y'); } - /** * Load Smarty_Autoloader */ if (!class_exists('Smarty_Autoloader')) { - include __DIR__ . '/bootstrap.php'; + include dirname(__FILE__) . '/bootstrap.php'; } - /** * Load always needed external class files */ @@ -95,337 +103,196 @@ require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_resource_file.php'; * * @method int clearAllCache(int $exp_time = null, string $type = null) * @method int clearCache(string $template_name, string $cache_id = null, string $compile_id = null, int $exp_time = null, string $type = null) - * @method int compileAllTemplates(string $extension = '.tpl', bool $force_compile = false, int $time_limit = 0, int $max_errors = null) - * @method int compileAllConfig(string $extension = '.conf', bool $force_compile = false, int $time_limit = 0, int $max_errors = null) + * @method int compileAllTemplates(string $extension = '.tpl', bool $force_compile = false, int $time_limit = 0, $max_errors = null) + * @method int compileAllConfig(string $extension = '.conf', bool $force_compile = false, int $time_limit = 0, $max_errors = null) * @method int clearCompiledTemplate($resource_name = null, $compile_id = null, $exp_time = null) */ class Smarty extends Smarty_Internal_TemplateBase { - /**#@+ - * constant definitions - */ - /** * smarty version */ - const SMARTY_VERSION = '3.1.31'; - + const SMARTY_VERSION = '3.1.32'; /** * define variable scopes */ - const SCOPE_LOCAL = 1; - - const SCOPE_PARENT = 2; - + const SCOPE_LOCAL = 1; + const SCOPE_PARENT = 2; const SCOPE_TPL_ROOT = 4; - - const SCOPE_ROOT = 8; - - const SCOPE_SMARTY = 16; - - const SCOPE_GLOBAL = 32; - + const SCOPE_ROOT = 8; + const SCOPE_SMARTY = 16; + const SCOPE_GLOBAL = 32; /** * define caching modes */ - const CACHING_OFF = 0; - + const CACHING_OFF = 0; const CACHING_LIFETIME_CURRENT = 1; - - const CACHING_LIFETIME_SAVED = 2; - + const CACHING_LIFETIME_SAVED = 2; /** * define constant for clearing cache files be saved expiration dates */ - const CLEAR_EXPIRED = - 1; - + const CLEAR_EXPIRED = -1; /** * define compile check modes */ - const COMPILECHECK_OFF = 0; - - const COMPILECHECK_ON = 1; - + const COMPILECHECK_OFF = 0; + const COMPILECHECK_ON = 1; const COMPILECHECK_CACHEMISS = 2; - /** * define debug modes */ - const DEBUG_OFF = 0; - - const DEBUG_ON = 1; - + const DEBUG_OFF = 0; + const DEBUG_ON = 1; const DEBUG_INDIVIDUAL = 2; - /** * modes for handling of "<?php ... ?>" tags in templates. */ const PHP_PASSTHRU = 0; //-> print tags as plain text - - const PHP_QUOTE = 1; //-> escape tags as entities - - const PHP_REMOVE = 2; //-> escape tags as entities - - const PHP_ALLOW = 3; //-> escape tags as entities - + const PHP_QUOTE = 1; //-> escape tags as entities + const PHP_REMOVE = 2; //-> escape tags as entities + const PHP_ALLOW = 3; //-> escape tags as entities /** * filter types */ - const FILTER_POST = 'post'; - - const FILTER_PRE = 'pre'; - - const FILTER_OUTPUT = 'output'; - + const FILTER_POST = 'post'; + const FILTER_PRE = 'pre'; + const FILTER_OUTPUT = 'output'; const FILTER_VARIABLE = 'variable'; - /** * plugin types */ - const PLUGIN_FUNCTION = 'function'; - - const PLUGIN_BLOCK = 'block'; - - const PLUGIN_COMPILER = 'compiler'; - - const PLUGIN_MODIFIER = 'modifier'; - + const PLUGIN_FUNCTION = 'function'; + const PLUGIN_BLOCK = 'block'; + const PLUGIN_COMPILER = 'compiler'; + const PLUGIN_MODIFIER = 'modifier'; const PLUGIN_MODIFIERCOMPILER = 'modifiercompiler'; - - /** - * Resource caching modes - * (not used since 3.1.30) - */ - const RESOURCE_CACHE_OFF = 0; - - const RESOURCE_CACHE_AUTOMATIC = 1; // cache template objects by rules - - const RESOURCE_CACHE_TEMPLATE = 2; // cache all template objects - - const RESOURCE_CACHE_ON = 4; // cache source and compiled resources - - /**#@-*/ - /** * assigned global tpl vars */ public static $global_tpl_vars = array(); - - /** - * error handler returned by set_error_handler() in Smarty::muteExpectedErrors() - */ - public static $_previous_error_handler = null; - - /** - * contains directories outside of SMARTY_DIR that are to be muted by muteExpectedErrors() - */ - public static $_muted_directories = array(); - /** * Flag denoting if Multibyte String functions are available */ public static $_MBSTRING = SMARTY_MBSTRING; - /** * The character set to adhere to (e.g. "UTF-8") */ public static $_CHARSET = SMARTY_RESOURCE_CHAR_SET; - /** * The date format to be used internally * (accepts date() and strftime()) */ public static $_DATE_FORMAT = SMARTY_RESOURCE_DATE_FORMAT; - /** * Flag denoting if PCRE should run in UTF-8 mode */ public static $_UTF8_MODIFIER = 'u'; - /** * Flag denoting if operating system is windows */ public static $_IS_WINDOWS = false; - - /**#@+ - * variables - */ - /** * auto literal on delimiters with whitespace * * @var boolean */ public $auto_literal = true; - /** * display error on not assigned variables * * @var boolean */ public $error_unassigned = false; - /** * look up relative file path in include_path * * @var boolean */ public $use_include_path = false; - - /** - * template directory - * - * @var array - */ - protected $template_dir = array('./templates/'); - - /** - * flags for normalized template directory entries - * - * @var array - */ - protected $_processedTemplateDir = array(); - /** * flag if template_dir is normalized * * @var bool */ public $_templateDirNormalized = false; - /** * joined template directory string used in cache keys * * @var string */ public $_joined_template_dir = null; - - /** - * config directory - * - * @var array - */ - protected $config_dir = array('./configs/'); - - /** - * flags for normalized template directory entries - * - * @var array - */ - protected $_processedConfigDir = array(); - /** * flag if config_dir is normalized * * @var bool */ public $_configDirNormalized = false; - /** * joined config directory string used in cache keys * * @var string */ public $_joined_config_dir = null; - /** * default template handler * * @var callable */ public $default_template_handler_func = null; - /** * default config handler * * @var callable */ public $default_config_handler_func = null; - /** * default plugin handler * * @var callable */ public $default_plugin_handler_func = null; - - /** - * compile directory - * - * @var string - */ - protected $compile_dir = './templates_c/'; - /** * flag if template_dir is normalized * * @var bool */ public $_compileDirNormalized = false; - - /** - * plugins directory - * - * @var array - */ - protected $plugins_dir = array(); - /** * flag if plugins_dir is normalized * * @var bool */ public $_pluginsDirNormalized = false; - - /** - * cache directory - * - * @var string - */ - protected $cache_dir = './cache/'; - /** * flag if template_dir is normalized * * @var bool */ public $_cacheDirNormalized = false; - /** * force template compiling? * * @var boolean */ public $force_compile = false; - - /** - * check template for modifications? - * - * @var boolean - */ - public $compile_check = true; - - /** + /** * use sub dirs for compiled/cached files? * * @var boolean */ public $use_sub_dirs = false; - /** * allow ambiguous resources (that are made unique by the resource handler) * * @var boolean */ public $allow_ambiguous_resources = false; - /** * merge compiled includes * * @var boolean */ public $merge_compiled_includes = false; - /* * flag for behaviour when extends: resource and {extends} tag are used simultaneous * if false disable execution of {extends} in templates called by extends resource. @@ -434,31 +301,30 @@ class Smarty extends Smarty_Internal_TemplateBase * @var boolean */ public $extends_recursion = true; - /** * force cache file creation * * @var boolean */ public $force_cache = false; - /** * template left-delimiter * * @var string */ public $left_delimiter = "{"; - /** * template right-delimiter * * @var string */ public $right_delimiter = "}"; - - /**#@+ - * security + /** + * array of strings which shall be treated as literal by compiler + * + * @var array string */ + public $literals = array(); /** * class name * This should be instance of Smarty_Security. @@ -467,29 +333,24 @@ class Smarty extends Smarty_Internal_TemplateBase * @see Smarty_Security */ public $security_class = 'Smarty_Security'; - /** * implementation of security class * * @var Smarty_Security */ public $security_policy = null; - /** * controls handling of PHP-blocks * * @var integer */ public $php_handling = self::PHP_PASSTHRU; - /** * controls if the php template file resource is allowed * * @var bool */ public $allow_php_templates = false; - - /**#@-*/ /** * debug mode * Setting this to true enables the debug-console. @@ -497,7 +358,6 @@ class Smarty extends Smarty_Internal_TemplateBase * @var boolean */ public $debugging = false; - /** * This determines if debugging is enable-able from the browser. * <ul> @@ -508,7 +368,6 @@ class Smarty extends Smarty_Internal_TemplateBase * @var string */ public $debugging_ctrl = 'NONE'; - /** * Name of debugging URL-param. * Only used when $debugging_ctrl is set to 'URL'. @@ -517,75 +376,54 @@ class Smarty extends Smarty_Internal_TemplateBase * @var string */ public $smarty_debug_id = 'SMARTY_DEBUG'; - /** * Path of debug template. * * @var string */ public $debug_tpl = null; - /** * When set, smarty uses this value as error_reporting-level. * * @var int */ public $error_reporting = null; - - /**#@+ - * config var settings - */ - /** * Controls whether variables with the same name overwrite each other. * * @var boolean */ public $config_overwrite = true; - /** * Controls whether config values of on/true/yes and off/false/no get converted to boolean. * * @var boolean */ public $config_booleanize = true; - /** * Controls whether hidden config sections/vars are read from the file. * * @var boolean */ public $config_read_hidden = false; - - /**#@-*/ - - /**#@+ - * resource locking - */ - /** * locking concurrent compiles * * @var boolean */ public $compile_locking = true; - /** * Controls whether cache resources should use locking mechanism * * @var boolean */ public $cache_locking = false; - /** * seconds to wait for acquiring a lock before ignoring the write lock * * @var float */ public $locking_timeout = 10; - - /**#@-*/ - /** * resource type used if none given * Must be an valid key of $registered_resources. @@ -593,7 +431,6 @@ class Smarty extends Smarty_Internal_TemplateBase * @var string */ public $default_resource_type = 'file'; - /** * caching type * Must be an element of $cache_resource_types. @@ -601,145 +438,160 @@ class Smarty extends Smarty_Internal_TemplateBase * @var string */ public $caching_type = 'file'; - /** * config type * * @var string */ public $default_config_type = 'file'; - /** * check If-Modified-Since headers * * @var boolean */ public $cache_modified_check = false; - /** * registered plugins * * @var array */ public $registered_plugins = array(); - /** * registered objects * * @var array */ public $registered_objects = array(); - /** * registered classes * * @var array */ public $registered_classes = array(); - /** * registered filters * * @var array */ public $registered_filters = array(); - /** * registered resources * * @var array */ public $registered_resources = array(); - /** * registered cache resources * * @var array */ public $registered_cache_resources = array(); - /** * autoload filter * * @var array */ public $autoload_filters = array(); - /** * default modifier * * @var array */ public $default_modifiers = array(); - /** * autoescape variable output * * @var boolean */ public $escape_html = false; - /** * start time for execution time calculation * * @var int */ public $start_time = 0; - /** * required by the compiler for BC * * @var string */ public $_current_file = null; - /** * internal flag to enable parser debugging * * @var bool */ public $_parserdebug = false; - /** * This object type (Smarty = 1, template = 2, data = 4) * * @var int */ public $_objType = 1; - /** * Debug object * * @var Smarty_Internal_Debug */ public $_debug = null; - /** - * Directory separator + * template directory + * + * @var array + */ + protected $template_dir = array('./templates/'); + /** + * flags for normalized template directory entries + * + * @var array + */ + protected $_processedTemplateDir = array(); + /** + * config directory + * + * @var array + */ + protected $config_dir = array('./configs/'); + /** + * flags for normalized template directory entries + * + * @var array + */ + protected $_processedConfigDir = array(); + /** + * compile directory * * @var string */ - public $ds = DIRECTORY_SEPARATOR; - + protected $compile_dir = './templates_c/'; + /** + * plugins directory + * + * @var array + */ + protected $plugins_dir = array(); + /** + * cache directory + * + * @var string + */ + protected $cache_dir = './cache/'; /** * removed properties * * @var string[] */ - private $obsoleteProperties = array('resource_caching', 'template_resource_caching', 'direct_access_security', - '_dir_perms', '_file_perms', 'plugin_search_order', - 'inheritance_merge_compiled_includes', 'resource_cache_mode',); - + protected $obsoleteProperties = array('resource_caching', 'template_resource_caching', 'direct_access_security', + '_dir_perms', '_file_perms', 'plugin_search_order', + 'inheritance_merge_compiled_includes', 'resource_cache_mode',); /** * List of private properties which will call getter/setter on a direct access * * @var string[] */ - private $accessMap = array('template_dir' => 'TemplateDir', 'config_dir' => 'ConfigDir', - 'plugins_dir' => 'PluginsDir', 'compile_dir' => 'CompileDir', - 'cache_dir' => 'CacheDir',); - - /**#@-*/ + protected $accessMap = array('template_dir' => 'TemplateDir', 'config_dir' => 'ConfigDir', + 'plugins_dir' => 'PluginsDir', 'compile_dir' => 'CompileDir', + 'cache_dir' => 'CacheDir',); /** * Initialize new Smarty object @@ -752,11 +604,9 @@ class Smarty extends Smarty_Internal_TemplateBase mb_internal_encoding(Smarty::$_CHARSET); } $this->start_time = microtime(true); - if (isset($_SERVER[ 'SCRIPT_NAME' ])) { Smarty::$global_tpl_vars[ 'SCRIPT_NAME' ] = new Smarty_Variable($_SERVER[ 'SCRIPT_NAME' ]); } - // Check if we're running on windows Smarty::$_IS_WINDOWS = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'; // let PCRE (preg_*) treat strings as ISO-8859-1 if we're not dealing with UTF-8 @@ -766,11 +616,33 @@ class Smarty extends Smarty_Internal_TemplateBase } /** + * Enable error handler to mute expected messages + * + * @return boolean + * @deprecated + */ + public static function muteExpectedErrors() + { + return Smarty_Internal_ErrorHandler::muteExpectedErrors(); + } + + /** + * Disable error handler muting expected messages + * + * @deprecated + */ + public static function unmuteExpectedErrors() + { + restore_error_handler(); + } + + /** * Check if a template resource exists * * @param string $resource_name template name * - * @return boolean status + * @return bool status + * @throws \SmartyException */ public function templateExists($resource_name) { @@ -801,28 +673,6 @@ class Smarty extends Smarty_Internal_TemplateBase public function disableSecurity() { $this->security_policy = null; - - return $this; - } - - /** - * Set template directory - * - * @param string|array $template_dir directory(s) of template sources - * @param bool $isConfig true for config_dir - * - * @return \Smarty current Smarty instance for chaining - */ - public function setTemplateDir($template_dir, $isConfig = false) - { - if ($isConfig) { - $this->config_dir = array(); - $this->_processedConfigDir = array(); - } else { - $this->template_dir = array(); - $this->_processedTemplateDir = array(); - } - $this->addTemplateDir($template_dir, null, $isConfig); return $this; } @@ -886,7 +736,7 @@ class Smarty extends Smarty_Internal_TemplateBase $dir = &$this->template_dir; } if ($isConfig ? !$this->_configDirNormalized : !$this->_templateDirNormalized) { - $this->_nomalizeTemplateConfig($isConfig); + $this->_normalizeTemplateConfig($isConfig); } if ($index !== null) { return isset($dir[ $index ]) ? $dir[ $index ] : null; @@ -895,15 +745,24 @@ class Smarty extends Smarty_Internal_TemplateBase } /** - * Set config directory + * Set template directory * - * @param $config_dir + * @param string|array $template_dir directory(s) of template sources + * @param bool $isConfig true for config_dir * - * @return Smarty current Smarty instance for chaining + * @return \Smarty current Smarty instance for chaining */ - public function setConfigDir($config_dir) + public function setTemplateDir($template_dir, $isConfig = false) { - return $this->setTemplateDir($config_dir, true); + if ($isConfig) { + $this->config_dir = array(); + $this->_processedConfigDir = array(); + } else { + $this->template_dir = array(); + $this->_processedTemplateDir = array(); + } + $this->addTemplateDir($template_dir, null, $isConfig); + return $this; } /** @@ -932,23 +791,21 @@ class Smarty extends Smarty_Internal_TemplateBase } /** - * Set plugins directory + * Set config directory * - * @param string|array $plugins_dir directory(s) of plugins + * @param $config_dir * * @return Smarty current Smarty instance for chaining */ - public function setPluginsDir($plugins_dir) + public function setConfigDir($config_dir) { - $this->plugins_dir = (array) $plugins_dir; - $this->_pluginsDirNormalized = false; - return $this; + return $this->setTemplateDir($config_dir, true); } /** * Adds directory of plugin files * - * @param null|array $plugins_dir + * @param null|array|string $plugins_dir * * @return Smarty current Smarty instance for chaining */ @@ -957,7 +814,7 @@ class Smarty extends Smarty_Internal_TemplateBase if (empty($this->plugins_dir)) { $this->plugins_dir[] = SMARTY_PLUGINS_DIR; } - $this->plugins_dir = array_merge($this->plugins_dir, (array) $plugins_dir); + $this->plugins_dir = array_merge($this->plugins_dir, (array)$plugins_dir); $this->_pluginsDirNormalized = false; return $this; } @@ -975,10 +832,10 @@ class Smarty extends Smarty_Internal_TemplateBase } if (!$this->_pluginsDirNormalized) { if (!is_array($this->plugins_dir)) { - $this->plugins_dir = (array) $this->plugins_dir; + $this->plugins_dir = (array)$this->plugins_dir; } foreach ($this->plugins_dir as $k => $v) { - $this->plugins_dir[ $k ] = $this->_realpath(rtrim($v, "/\\") . $this->ds, true); + $this->plugins_dir[ $k ] = $this->_realpath(rtrim($v, "/\\") . DIRECTORY_SEPARATOR, true); } $this->_cache[ 'plugin_files' ] = array(); $this->_pluginsDirNormalized = true; @@ -987,15 +844,16 @@ class Smarty extends Smarty_Internal_TemplateBase } /** + * Set plugins directory * - * @param string $compile_dir directory to store compiled templates in + * @param string|array $plugins_dir directory(s) of plugins * - * @return Smarty current Smarty instance for chaining + * @return Smarty current Smarty instance for chaining */ - public function setCompileDir($compile_dir) + public function setPluginsDir($plugins_dir) { - $this->_normalizeDir('compile_dir', $compile_dir); - $this->_compileDirNormalized = true; + $this->plugins_dir = (array)$plugins_dir; + $this->_pluginsDirNormalized = false; return $this; } @@ -1014,16 +872,15 @@ class Smarty extends Smarty_Internal_TemplateBase } /** - * Set cache directory * - * @param string $cache_dir directory to store cached templates in + * @param string $compile_dir directory to store compiled templates in * * @return Smarty current Smarty instance for chaining */ - public function setCacheDir($cache_dir) + public function setCompileDir($compile_dir) { - $this->_normalizeDir('cache_dir', $cache_dir); - $this->_cacheDirNormalized = true; + $this->_normalizeDir('compile_dir', $compile_dir); + $this->_compileDirNormalized = true; return $this; } @@ -1042,46 +899,17 @@ class Smarty extends Smarty_Internal_TemplateBase } /** - * Normalize and set directory string - * - * @param string $dirName cache_dir or compile_dir - * @param string $dir filepath of folder - */ - private function _normalizeDir($dirName, $dir) - { - $this->{$dirName} = $this->_realpath(rtrim($dir, "/\\") . $this->ds, true); - if (!isset(Smarty::$_muted_directories[ $this->{$dirName} ])) { - Smarty::$_muted_directories[ $this->{$dirName} ] = null; - } - } - - /** - * Normalize template_dir or config_dir + * Set cache directory * - * @param bool $isConfig true for config_dir + * @param string $cache_dir directory to store cached templates in * + * @return Smarty current Smarty instance for chaining */ - private function _nomalizeTemplateConfig($isConfig) + public function setCacheDir($cache_dir) { - if ($isConfig) { - $processed = &$this->_processedConfigDir; - $dir = &$this->config_dir; - } else { - $processed = &$this->_processedTemplateDir; - $dir = &$this->template_dir; - } - if (!is_array($dir)) { - $dir = (array) $dir; - } - foreach ($dir as $k => $v) { - if (!isset($processed[ $k ])) { - $dir[ $k ] = $v = $this->_realpath(rtrim($v, "/\\") . $this->ds, true); - $processed[ $k ] = true; - } - } - $isConfig ? $this->_configDirNormalized = true : $this->_templateDirNormalized = true; - $isConfig ? $this->_joined_config_dir = join('#', $this->config_dir) : - $this->_joined_template_dir = join('#', $this->template_dir); + $this->_normalizeDir('cache_dir', $cache_dir); + $this->_cacheDirNormalized = true; + return $this; } /** @@ -1093,7 +921,8 @@ class Smarty extends Smarty_Internal_TemplateBase * @param object $parent next higher level of Smarty variables * @param boolean $do_clone flag is Smarty object shall be cloned * - * @return object template object + * @return \Smarty_Internal_Template template object + * @throws \SmartyException */ public function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null, $do_clone = true) { @@ -1108,7 +937,7 @@ class Smarty extends Smarty_Internal_TemplateBase $data = null; } if (!$this->_templateDirNormalized) { - $this->_nomalizeTemplateConfig(false); + $this->_normalizeTemplateConfig(false); } $_templateId = $this->_getTemplateId($template, $cache_id, $compile_id); $tpl = null; @@ -1137,10 +966,10 @@ class Smarty extends Smarty_Internal_TemplateBase $tpl->tpl_vars[ $_key ] = new Smarty_Variable($_val); } } - if ($this->debugging || $this->debugging_ctrl == 'URL') { + if ($this->debugging || $this->debugging_ctrl === 'URL') { $tpl->smarty->_debug = new Smarty_Internal_Debug(); // check URL debugging control - if (!$this->debugging && $this->debugging_ctrl == 'URL') { + if (!$this->debugging && $this->debugging_ctrl === 'URL') { $tpl->smarty->_debug->debugUrl($tpl->smarty); } } @@ -1173,16 +1002,19 @@ class Smarty extends Smarty_Internal_TemplateBase * @param \Smarty_Internal_Template $template * * @return string + * @throws \SmartyException */ - public function _getTemplateId($template_name, $cache_id = null, $compile_id = null, $caching = null, + public function _getTemplateId($template_name, + $cache_id = null, + $compile_id = null, + $caching = null, Smarty_Internal_Template $template = null) { $template_name = (strpos($template_name, ':') === false) ? "{$this->default_resource_type}:{$template_name}" : $template_name; $cache_id = $cache_id === null ? $this->cache_id : $cache_id; $compile_id = $compile_id === null ? $this->compile_id : $compile_id; - $caching = (int) ($caching === null ? $this->caching : $caching); - + $caching = (int)($caching === null ? $this->caching : $caching); if ((isset($template) && strpos($template_name, ':.') !== false) || $this->allow_ambiguous_resources) { $_templateId = Smarty_Resource::getUniqueTemplateName((isset($template) ? $template : $this), $template_name) . @@ -1210,38 +1042,51 @@ class Smarty extends Smarty_Internal_TemplateBase */ public function _realpath($path, $realpath = null) { - $nds = $this->ds == '/' ? '\\' : '/'; - // normalize $this->ds - $path = str_replace($nds, $this->ds, $path); - preg_match('%^(?<root>(?:[[:alpha:]]:[\\\\]|/|[\\\\]{2}[[:alpha:]]+|[[:print:]]{2,}:[/]{2}|[\\\\])?)(?<path>(?:[[:print:]]*))$%', - $path, $parts); + static $nds = null; + static $sepDotsep = null; + static $sepDot = null; + static $sepSep =null; + if (!isset($nds)) { + $nds = array('/' => '\\', '\\' => '/'); + $sepDotsep = DIRECTORY_SEPARATOR . '.' . DIRECTORY_SEPARATOR; + $sepDot = DIRECTORY_SEPARATOR . '.'; + $sepSep = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR; + } + // normalize DIRECTORY_SEPARATOR + $path = str_replace(array($nds[DIRECTORY_SEPARATOR], $sepDotsep), DIRECTORY_SEPARATOR, $path); + if (strpos($path,$sepDot) === false && (($realpath === false && $path[0] === '.') || $realpath === null) && $path[0] !== '\\') { + return $path; + } + preg_match('%^(?<root>(?:[[:alpha:]]:[\\\\]|/|[\\\\]{2}[[:alpha:]]+|[[:print:]]{2,}:[/]{2}|[\\\\])?)(?<path>(.*))$%u', + $path, + $parts); $path = $parts[ 'path' ]; - if ($parts[ 'root' ] == '\\') { + if ($parts[ 'root' ] === '\\') { $parts[ 'root' ] = substr(getcwd(), 0, 2) . $parts[ 'root' ]; } else { if ($realpath !== null && !$parts[ 'root' ]) { - $path = getcwd() . $this->ds . $path; + $path = getcwd() . DIRECTORY_SEPARATOR . $path; } } - // remove noop 'DIRECTORY_SEPARATOR DIRECTORY_SEPARATOR' and 'DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR' patterns - $path = preg_replace('#([\\\\/]([.]?[\\\\/])+)#', $this->ds, $path); + // remove noop 'DIRECTORY_SEPARATOR DIRECTORY_SEPARATOR' and 'DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR' patterns + $path = str_replace(array($sepDotsep,$sepSep), DIRECTORY_SEPARATOR, $path); // resolve '..DIRECTORY_SEPARATOR' pattern, smallest first - if (strpos($path, '..' . $this->ds) != false && - preg_match_all('#(([.]?[\\\\/])*([.][.])[\\\\/]([.]?[\\\\/])*)+#', $path, $match) + if (strpos($path, '..' . DIRECTORY_SEPARATOR) !== false && + preg_match_all('#[\\\\/]([.][.][\\\\/])+#u', $path, $match) ) { $counts = array(); foreach ($match[ 0 ] as $m) { - $counts[] = (int) ((strlen($m) - 1) / 3); + $counts[] = (int)((strlen($m) - 1) / 3); } sort($counts); foreach ($counts as $count) { - $path = preg_replace('#(([\\\\/]([.]?[\\\\/])*[^\\\\/.]+){' . $count . - '}[\\\\/]([.]?[\\\\/])*([.][.][\\\\/]([.]?[\\\\/])*){' . $count . '})(?=[^.])#', - $this->ds, $path); + $path = preg_replace('#([\\\\/]+[^\\\\/]+){' . $count . + '}[\\\\/]+([.][.][\\\\/]+){' . $count . '}#u', + DIRECTORY_SEPARATOR, + $path); } } - - return $parts[ 'root' ] . $path; + return $realpath !== false ? $parts[ 'root' ] . $path : str_ireplace(getcwd(), '.', $parts[ 'root' ] . $path); } /** @@ -1254,24 +1099,6 @@ class Smarty extends Smarty_Internal_TemplateBase } /** - * Get Smarty object - * - * @return Smarty - */ - public function _getSmartyObj() - { - return $this; - } - - /** - * @param boolean $compile_check - */ - public function setCompileCheck($compile_check) - { - $this->compile_check = $compile_check; - } - - /** * @param boolean $use_sub_dirs */ public function setUseSubDirs($use_sub_dirs) @@ -1296,9 +1123,21 @@ class Smarty extends Smarty_Internal_TemplateBase } /** + * Return auto_literal flag + * + * @return boolean + */ + public function getAutoLiteral() + { + return $this->auto_literal; + } + + /** + * Set auto_literal flag + * * @param boolean $auto_literal */ - public function setAutoLiteral($auto_literal) + public function setAutoLiteral($auto_literal = true) { $this->auto_literal = $auto_literal; } @@ -1320,6 +1159,18 @@ class Smarty extends Smarty_Internal_TemplateBase } /** + * Get left delimiter + * + * @return string + */ + public function getLeftDelimiter() + { + return $this->left_delimiter; + } + + /** + * Set left delimiter + * * @param string $left_delimiter */ public function setLeftDelimiter($left_delimiter) @@ -1328,7 +1179,19 @@ class Smarty extends Smarty_Internal_TemplateBase } /** - * @param string $right_delimiter + * Get right delimiter + * + * @return string $right_delimiter + */ + public function getRightDelimiter() + { + return $this->right_delimiter; + } + + /** + * Set right delimiter + * + * @param string */ public function setRightDelimiter($right_delimiter) { @@ -1402,6 +1265,16 @@ class Smarty extends Smarty_Internal_TemplateBase } /** + * Get Smarty object + * + * @return Smarty + */ + public function _getSmartyObj() + { + return $this; + } + + /** * <<magic>> Generic getter. * Calls the appropriate getter function. * Issues an E_USER_NOTICE if no valid getter is found. @@ -1409,15 +1282,16 @@ class Smarty extends Smarty_Internal_TemplateBase * @param string $name property name * * @return mixed + * @throws \SmartyException */ public function __get($name) { if (isset($this->accessMap[ $name ])) { $method = 'get' . $this->accessMap[ $name ]; return $this->{$method}(); - } elseif (isset($this->_cache[ $name ])) { + } else if (isset($this->_cache[ $name ])) { return $this->_cache[ $name ]; - } elseif (in_array($name, $this->obsoleteProperties)) { + } else if (in_array($name, $this->obsoleteProperties)) { return null; } else { trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE); @@ -1432,13 +1306,15 @@ class Smarty extends Smarty_Internal_TemplateBase * * @param string $name property name * @param mixed $value parameter passed to setter + * + * @throws \SmartyException */ public function __set($name, $value) { if (isset($this->accessMap[ $name ])) { $method = 'set' . $this->accessMap[ $name ]; $this->{$method}($value); - } elseif (in_array($name, $this->obsoleteProperties)) { + } else if (in_array($name, $this->obsoleteProperties)) { return; } else { if (is_object($value) && method_exists($value, $name)) { @@ -1450,100 +1326,47 @@ class Smarty extends Smarty_Internal_TemplateBase } /** - * Error Handler to mute expected messages - * - * @link http://php.net/set_error_handler - * - * @param integer $errno Error level - * @param $errstr - * @param $errfile - * @param $errline - * @param $errcontext + * Normalize and set directory string * - * @return bool|void + * @param string $dirName cache_dir or compile_dir + * @param string $dir filepath of folder */ - public static function mutingErrorHandler($errno, $errstr, $errfile, $errline, $errcontext) + private function _normalizeDir($dirName, $dir) { - $_is_muted_directory = false; - - // add the SMARTY_DIR to the list of muted directories - if (!isset(Smarty::$_muted_directories[ SMARTY_DIR ])) { - $smarty_dir = realpath(SMARTY_DIR); - if ($smarty_dir !== false) { - Smarty::$_muted_directories[ SMARTY_DIR ] = - array('file' => $smarty_dir, 'length' => strlen($smarty_dir),); - } - } - - // walk the muted directories and test against $errfile - foreach (Smarty::$_muted_directories as $key => &$dir) { - if (!$dir) { - // resolve directory and length for speedy comparisons - $file = realpath($key); - if ($file === false) { - // this directory does not exist, remove and skip it - unset(Smarty::$_muted_directories[ $key ]); - continue; - } - $dir = array('file' => $file, 'length' => strlen($file),); - } - if (!strncmp($errfile, $dir[ 'file' ], $dir[ 'length' ])) { - $_is_muted_directory = true; - break; - } - } - // pass to next error handler if this error did not occur inside SMARTY_DIR - // or the error was within smarty but masked to be ignored - if (!$_is_muted_directory || ($errno && $errno & error_reporting())) { - if (Smarty::$_previous_error_handler) { - return call_user_func(Smarty::$_previous_error_handler, $errno, $errstr, $errfile, $errline, - $errcontext); - } else { - return false; + $this->{$dirName} = $this->_realpath(rtrim($dir, "/\\") . DIRECTORY_SEPARATOR, true); + if (class_exists('Smarty_Internal_ErrorHandler', false)) { + if (!isset(Smarty_Internal_ErrorHandler::$mutedDirectories[ $this->{$dirName} ])) { + Smarty_Internal_ErrorHandler::$mutedDirectories[ $this->{$dirName} ] = null; } } - return; } /** - * Enable error handler to mute expected messages + * Normalize template_dir or config_dir * - * @return void - */ - public static function muteExpectedErrors() - { - /* - error muting is done because some people implemented custom error_handlers using - http://php.net/set_error_handler and for some reason did not understand the following paragraph: - - It is important to remember that the standard PHP error handler is completely bypassed for the - error types specified by error_types unless the callback function returns FALSE. - error_reporting() settings will have no effect and your error handler will be called regardless - - however you are still able to read the current value of error_reporting and act appropriately. - Of particular note is that this value will be 0 if the statement that caused the error was - prepended by the @ error-control operator. - - Smarty deliberately uses @filemtime() over file_exists() and filemtime() in some places. Reasons include - - @filemtime() is almost twice as fast as using an additional file_exists() - - between file_exists() and filemtime() a possible race condition is opened, - which does not exist using the simple @filemtime() approach. - */ - $error_handler = array('Smarty', 'mutingErrorHandler'); - $previous = set_error_handler($error_handler); - - // avoid dead loops - if ($previous !== $error_handler) { - Smarty::$_previous_error_handler = $previous; - } - } - - /** - * Disable error handler muting expected messages + * @param bool $isConfig true for config_dir * - * @return void */ - public static function unmuteExpectedErrors() + private function _normalizeTemplateConfig($isConfig) { - restore_error_handler(); + if ($isConfig) { + $processed = &$this->_processedConfigDir; + $dir = &$this->config_dir; + } else { + $processed = &$this->_processedTemplateDir; + $dir = &$this->template_dir; + } + if (!is_array($dir)) { + $dir = (array)$dir; + } + foreach ($dir as $k => $v) { + if (!isset($processed[ $k ])) { + $dir[ $k ] = $v = $this->_realpath(rtrim($v, "/\\") . DIRECTORY_SEPARATOR, true); + $processed[ $k ] = true; + } + } + $isConfig ? $this->_configDirNormalized = true : $this->_templateDirNormalized = true; + $isConfig ? $this->_joined_config_dir = join('#', $this->config_dir) : + $this->_joined_template_dir = join('#', $this->template_dir); } } diff --git a/vendor/smarty/smarty/libs/SmartyBC.class.php b/vendor/smarty/smarty/libs/SmartyBC.class.php index 3955e4f24..f2230fc9c 100644 --- a/vendor/smarty/smarty/libs/SmartyBC.class.php +++ b/vendor/smarty/smarty/libs/SmartyBC.class.php @@ -100,6 +100,8 @@ class SmartyBC extends Smarty * @param string $function_impl the name of the PHP function to register * @param bool $cacheable * @param mixed $cache_attrs + * + * @throws \SmartyException */ public function register_function($function, $function_impl, $cacheable = true, $cache_attrs = null) { @@ -153,6 +155,8 @@ class SmartyBC extends Smarty * @param string $block_impl PHP function to register * @param bool $cacheable * @param mixed $cache_attrs + * + * @throws \SmartyException */ public function register_block($block, $block_impl, $cacheable = true, $cache_attrs = null) { @@ -175,6 +179,8 @@ class SmartyBC extends Smarty * @param string $function name of template function * @param string $function_impl name of PHP function to register * @param bool $cacheable + * + * @throws \SmartyException */ public function register_compiler_function($function, $function_impl, $cacheable = true) { @@ -196,6 +202,8 @@ class SmartyBC extends Smarty * * @param string $modifier name of template modifier * @param string $modifier_impl name of PHP function to register + * + * @throws \SmartyException */ public function register_modifier($modifier, $modifier_impl) { @@ -238,6 +246,8 @@ class SmartyBC extends Smarty * to a template before compiling * * @param callable $function + * + * @throws \SmartyException */ public function register_prefilter($function) { @@ -259,6 +269,8 @@ class SmartyBC extends Smarty * to a compiled template after compilation * * @param callable $function + * + * @throws \SmartyException */ public function register_postfilter($function) { @@ -280,6 +292,8 @@ class SmartyBC extends Smarty * to a template output * * @param callable $function + * + * @throws \SmartyException */ public function register_outputfilter($function) { @@ -301,6 +315,8 @@ class SmartyBC extends Smarty * * @param string $type filter type * @param string $name filter name + * + * @throws \SmartyException */ public function load_filter($type, $name) { @@ -341,7 +357,9 @@ class SmartyBC extends Smarty * @param string $cache_id * @param string $compile_id * - * @return boolean + * @return bool + * @throws \Exception + * @throws \SmartyException */ public function is_cached($tpl_file, $cache_id = null, $compile_id = null) { @@ -377,7 +395,8 @@ class SmartyBC extends Smarty * * @param string $tpl_file * - * @return boolean + * @return bool + * @throws \SmartyException */ public function template_exists($tpl_file) { diff --git a/vendor/smarty/smarty/libs/bootstrap.php b/vendor/smarty/smarty/libs/bootstrap.php index 32096087f..dad72fcb1 100644 --- a/vendor/smarty/smarty/libs/bootstrap.php +++ b/vendor/smarty/smarty/libs/bootstrap.php @@ -12,6 +12,6 @@ * Load and register Smarty Autoloader */ if (!class_exists('Smarty_Autoloader')) { - require __DIR__ . '/Autoloader.php'; + require dirname(__FILE__) . '/Autoloader.php'; } -Smarty_Autoloader::register(); +Smarty_Autoloader::register(true); diff --git a/vendor/smarty/smarty/libs/plugins/block.textformat.php b/vendor/smarty/smarty/libs/plugins/block.textformat.php index e2c5e3de4..310a420ee 100644 --- a/vendor/smarty/smarty/libs/plugins/block.textformat.php +++ b/vendor/smarty/smarty/libs/plugins/block.textformat.php @@ -5,22 +5,21 @@ * @package Smarty * @subpackage PluginsBlock */ - /** * Smarty {textformat}{/textformat} block plugin - * Type: block function<br> - * Name: textformat<br> + * Type: block function + * Name: textformat * Purpose: format text a certain way with preset styles - * or custom wrap/indent settings<br> + * or custom wrap/indent settings * Params: - * <pre> + * * - style - string (email) * - indent - integer (0) * - wrap - integer (80) * - wrap_char - string ("\n") * - indent_char - string (" ") * - wrap_boundary - boolean (true) - * </pre> + * * * @link http://www.smarty.net/manual/en/language.function.textformat.php {textformat} * (Smarty online manual) @@ -32,14 +31,16 @@ * * @return string content re-formatted * @author Monte Ohrt <monte at ohrt dot com> + * @throws \SmartyException */ -function smarty_block_textformat($params, $content, $template, &$repeat) +function smarty_block_textformat($params, $content, Smarty_Internal_Template $template, &$repeat) { if (is_null($content)) { return; } - if (Smarty::$_MBSTRING && !is_callable('smarty_mb_wordwrap')) { - require_once(SMARTY_PLUGINS_DIR . 'shared.mb_wordwrap.php'); + if (Smarty::$_MBSTRING) { + $template->_checkPlugins(array(array('function' => 'smarty_modifier_mb_wordwrap', + 'file' => SMARTY_PLUGINS_DIR . 'modifier.mb_wordwrap.php'))); } $style = null; @@ -71,11 +72,11 @@ function smarty_block_textformat($params, $content, $template, &$repeat) break; default: - trigger_error("textformat: unknown attribute '$_key'"); + trigger_error("textformat: unknown attribute '{$_key}'"); } } - if ($style == 'email') { + if ($style === 'email') { $wrap = 72; } // split into paragraphs @@ -87,15 +88,17 @@ function smarty_block_textformat($params, $content, $template, &$repeat) } // convert mult. spaces & special chars to single space $_paragraph = - preg_replace(array('!\s+!' . Smarty::$_UTF8_MODIFIER, '!(^\s+)|(\s+$)!' . Smarty::$_UTF8_MODIFIER), - array(' ', ''), $_paragraph); + preg_replace(array('!\s+!' . Smarty::$_UTF8_MODIFIER, + '!(^\s+)|(\s+$)!' . Smarty::$_UTF8_MODIFIER), + array(' ', + ''), $_paragraph); // indent first line if ($indent_first > 0) { $_paragraph = str_repeat($indent_char, $indent_first) . $_paragraph; } // wordwrap sentences if (Smarty::$_MBSTRING) { - $_paragraph = smarty_mb_wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut); + $_paragraph = smarty_modifier_mb_wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut); } else { $_paragraph = wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut); } diff --git a/vendor/smarty/smarty/libs/plugins/function.counter.php b/vendor/smarty/smarty/libs/plugins/function.counter.php index bcc8f498c..9610362d9 100644 --- a/vendor/smarty/smarty/libs/plugins/function.counter.php +++ b/vendor/smarty/smarty/libs/plugins/function.counter.php @@ -8,8 +8,8 @@ /** * Smarty {counter} function plugin - * Type: function<br> - * Name: counter<br> + * Type: function + * Name: counter * Purpose: print out a counter value * * @author Monte Ohrt <monte at ohrt dot com> @@ -63,7 +63,7 @@ function smarty_function_counter($params, $template) $counter[ 'direction' ] = $params[ 'direction' ]; } - if ($counter[ 'direction' ] == "down") { + if ($counter[ 'direction' ] === 'down') { $counter[ 'count' ] -= $counter[ 'skip' ]; } else { $counter[ 'count' ] += $counter[ 'skip' ]; diff --git a/vendor/smarty/smarty/libs/plugins/function.cycle.php b/vendor/smarty/smarty/libs/plugins/function.cycle.php index a76d49aed..b871524fc 100644 --- a/vendor/smarty/smarty/libs/plugins/function.cycle.php +++ b/vendor/smarty/smarty/libs/plugins/function.cycle.php @@ -8,12 +8,12 @@ /** * Smarty {cycle} function plugin - * Type: function<br> - * Name: cycle<br> - * Date: May 3, 2002<br> - * Purpose: cycle through given values<br> + * Type: function + * Name: cycle + * Date: May 3, 2002 + * Purpose: cycle through given values * Params: - * <pre> + * * - name - name of cycle (optional) * - values - comma separated list of values to cycle, or an array of values to cycle * (this can be left out for subsequent calls) @@ -22,13 +22,13 @@ * - advance - boolean - whether or not to advance the cycle * - delimiter - the value delimiter, default is "," * - assign - boolean, assigns to template var instead of printed. - * </pre> - * Examples:<br> - * <pre> + * + * Examples: + * * {cycle values="#eeeeee,#d0d0d0d"} * {cycle name=row values="one,two,three" reset=true} * {cycle name=row} - * </pre> + * * * @link http://www.smarty.net/manual/en/language.function.cycle.php {cycle} * (Smarty online manual) @@ -55,12 +55,12 @@ function smarty_function_cycle($params, $template) if (!isset($params[ 'values' ])) { if (!isset($cycle_vars[ $name ][ 'values' ])) { - trigger_error("cycle: missing 'values' parameter"); + trigger_error('cycle: missing \'values\' parameter'); return; } } else { - if (isset($cycle_vars[ $name ][ 'values' ]) && $cycle_vars[ $name ][ 'values' ] != $params[ 'values' ]) { + if (isset($cycle_vars[ $name ][ 'values' ]) && $cycle_vars[ $name ][ 'values' ] !== $params[ 'values' ]) { $cycle_vars[ $name ][ 'index' ] = 0; } $cycle_vars[ $name ][ 'values' ] = $params[ 'values' ]; diff --git a/vendor/smarty/smarty/libs/plugins/function.fetch.php b/vendor/smarty/smarty/libs/plugins/function.fetch.php index cb60dd918..9539e1fcc 100644 --- a/vendor/smarty/smarty/libs/plugins/function.fetch.php +++ b/vendor/smarty/smarty/libs/plugins/function.fetch.php @@ -8,8 +8,8 @@ /** * Smarty {fetch} plugin - * Type: function<br> - * Name: fetch<br> + * Type: function + * Name: fetch * Purpose: fetch file, web or ftp data and display results * * @link http://www.smarty.net/manual/en/language.function.fetch.php {fetch} @@ -25,7 +25,7 @@ function smarty_function_fetch($params, $template) { if (empty($params[ 'file' ])) { - trigger_error("[plugin] fetch parameter 'file' cannot be empty", E_USER_NOTICE); + trigger_error('[plugin] fetch parameter \'file\' cannot be empty', E_USER_NOTICE); return; } @@ -55,15 +55,15 @@ function smarty_function_fetch($params, $template) } $content = ''; - if ($protocol == 'http') { + if ($protocol === 'http') { // http fetch if ($uri_parts = parse_url($params[ 'file' ])) { // set defaults $host = $server_name = $uri_parts[ 'host' ]; $timeout = 30; - $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; - $agent = "Smarty Template Engine " . Smarty::SMARTY_VERSION; - $referer = ""; + $accept = 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*'; + $agent = 'Smarty Template Engine ' . Smarty::SMARTY_VERSION; + $referer = ''; $uri = !empty($uri_parts[ 'path' ]) ? $uri_parts[ 'path' ] : '/'; $uri .= !empty($uri_parts[ 'query' ]) ? '?' . $uri_parts[ 'query' ] : ''; $_is_proxy = false; @@ -81,29 +81,29 @@ function smarty_function_fetch($params, $template) // loop through parameters, setup headers foreach ($params as $param_key => $param_value) { switch ($param_key) { - case "file": - case "assign": - case "assign_headers": + case 'file': + case 'assign': + case 'assign_headers': break; - case "user": + case 'user': if (!empty($param_value)) { $user = $param_value; } break; - case "pass": + case 'pass': if (!empty($param_value)) { $pass = $param_value; } break; - case "accept": + case 'accept': if (!empty($param_value)) { $accept = $param_value; } break; - case "header": + case 'header': if (!empty($param_value)) { if (!preg_match('![\w\d-]+: .+!', $param_value)) { - trigger_error("[plugin] invalid header format '" . $param_value . "'", E_USER_NOTICE); + trigger_error("[plugin] invalid header format '{$param_value}'", E_USER_NOTICE); return; } else { @@ -111,41 +111,41 @@ function smarty_function_fetch($params, $template) } } break; - case "proxy_host": + case 'proxy_host': if (!empty($param_value)) { $proxy_host = $param_value; } break; - case "proxy_port": + case 'proxy_port': if (!preg_match('!\D!', $param_value)) { $proxy_port = (int) $param_value; } else { - trigger_error("[plugin] invalid value for attribute '" . $param_key . "'", E_USER_NOTICE); + trigger_error("[plugin] invalid value for attribute '{$param_key }'", E_USER_NOTICE); return; } break; - case "agent": + case 'agent': if (!empty($param_value)) { $agent = $param_value; } break; - case "referer": + case 'referer': if (!empty($param_value)) { $referer = $param_value; } break; - case "timeout": + case 'timeout': if (!preg_match('!\D!', $param_value)) { $timeout = (int) $param_value; } else { - trigger_error("[plugin] invalid value for attribute '" . $param_key . "'", E_USER_NOTICE); + trigger_error("[plugin] invalid value for attribute '{$param_key}'", E_USER_NOTICE); return; } break; default: - trigger_error("[plugin] unrecognized attribute '" . $param_key . "'", E_USER_NOTICE); + trigger_error("[plugin] unrecognized attribute '{$param_key}'", E_USER_NOTICE); return; } @@ -185,7 +185,7 @@ function smarty_function_fetch($params, $template) } } if (!empty($user) && !empty($pass)) { - fputs($fp, "Authorization: BASIC " . base64_encode("$user:$pass") . "\r\n"); + fputs($fp, 'Authorization: BASIC ' . base64_encode("$user:$pass") . "\r\n"); } fputs($fp, "\r\n"); diff --git a/vendor/smarty/smarty/libs/plugins/function.html_checkboxes.php b/vendor/smarty/smarty/libs/plugins/function.html_checkboxes.php index 04ce45733..d654caba6 100644 --- a/vendor/smarty/smarty/libs/plugins/function.html_checkboxes.php +++ b/vendor/smarty/smarty/libs/plugins/function.html_checkboxes.php @@ -5,22 +5,21 @@ * @package Smarty * @subpackage PluginsFunction */ - /** * Smarty {html_checkboxes} function plugin - * File: function.html_checkboxes.php<br> - * Type: function<br> - * Name: html_checkboxes<br> - * Date: 24.Feb.2003<br> - * Purpose: Prints out a list of checkbox input types<br> + * File: function.html_checkboxes.php + * Type: function + * Name: html_checkboxes + * Date: 24.Feb.2003 + * Purpose: Prints out a list of checkbox input types * Examples: - * <pre> + * * {html_checkboxes values=$ids output=$names} * {html_checkboxes values=$ids name='box' separator='<br>' output=$names} * {html_checkboxes values=$ids checked=$checked separator='<br>' output=$names} - * </pre> + * * Params: - * <pre> + * * - name (optional) - string default "checkbox" * - values (required) - array * - options (optional) - associative array @@ -29,7 +28,7 @@ * - output (optional) - the output next to each checkbox * - assign (optional) - assign the output as an array to this variable * - escape (optional) - escape the content (not value), defaults to true - * </pre> + * * * @link http://www.smarty.net/manual/en/language.function.html.checkboxes.php {html_checkboxes} * (Smarty online manual) @@ -37,17 +36,17 @@ * @author credits to Monte Ohrt <monte at ohrt dot com> * @version 1.0 * - * @param array $params parameters - * @param object $template template object + * @param array $params parameters + * @param Smarty_Internal_Template $template template object * * @return string * @uses smarty_function_escape_special_chars() + * @throws \SmartyException */ -function smarty_function_html_checkboxes($params, $template) +function smarty_function_html_checkboxes($params, Smarty_Internal_Template $template) { - if (!is_callable('smarty_function_escape_special_chars')) { - require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); - } + $template->_checkPlugins(array(array('function' => 'smarty_function_escape_special_chars', + 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'))); $name = 'checkbox'; $values = null; @@ -89,11 +88,11 @@ function smarty_function_html_checkboxes($params, $template) $selected = array(); foreach ($_val as $_sel) { if (is_object($_sel)) { - if (method_exists($_sel, "__toString")) { + if (method_exists($_sel, '__toString')) { $_sel = smarty_function_escape_special_chars((string) $_sel->__toString()); } else { - trigger_error("html_checkboxes: selected attribute contains an object of class '" . - get_class($_sel) . "' without __toString() method", E_USER_NOTICE); + trigger_error('html_checkboxes: selected attribute contains an object of class \'' . + get_class($_sel) . '\' without __toString() method', E_USER_NOTICE); continue; } } else { @@ -102,11 +101,11 @@ function smarty_function_html_checkboxes($params, $template) $selected[ $_sel ] = true; } } elseif (is_object($_val)) { - if (method_exists($_val, "__toString")) { + if (method_exists($_val, '__toString')) { $selected = smarty_function_escape_special_chars((string) $_val->__toString()); } else { - trigger_error("html_checkboxes: selected attribute is an object of class '" . get_class($_val) . - "' without __toString() method", E_USER_NOTICE); + trigger_error('html_checkboxes: selected attribute is an object of class \'' . get_class($_val) . + '\' without __toString() method', E_USER_NOTICE); } } else { $selected = smarty_function_escape_special_chars((string) $_val); @@ -129,7 +128,7 @@ function smarty_function_html_checkboxes($params, $template) case 'readonly': if (!empty($params[ 'strict' ])) { if (!is_scalar($_val)) { - trigger_error("html_options: $_key attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute", + trigger_error("html_options: {$_key} attribute must be a scalar, only boolean true or string '{$_key}' will actually add the attribute", E_USER_NOTICE); } @@ -145,7 +144,7 @@ function smarty_function_html_checkboxes($params, $template) if (!is_array($_val)) { $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; } else { - trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + trigger_error("html_checkboxes: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE); } break; } @@ -178,18 +177,30 @@ function smarty_function_html_checkboxes($params, $template) return implode("\n", $_html_result); } } - +/** + * @param $name + * @param $value + * @param $output + * @param $selected + * @param $extra + * @param $separator + * @param $labels + * @param $label_ids + * @param bool $escape + * + * @return string + */ function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels, - $label_ids, $escape = true) + $label_ids, $escape = true) { $_output = ''; if (is_object($value)) { - if (method_exists($value, "__toString")) { + if (method_exists($value, '__toString')) { $value = (string) $value->__toString(); } else { - trigger_error("html_options: value is an object of class '" . get_class($value) . - "' without __toString() method", E_USER_NOTICE); + trigger_error('html_options: value is an object of class \'' . get_class($value) . + '\' without __toString() method', E_USER_NOTICE); return ''; } @@ -198,11 +209,11 @@ function smarty_function_html_checkboxes_output($name, $value, $output, $selecte } if (is_object($output)) { - if (method_exists($output, "__toString")) { + if (method_exists($output, '__toString')) { $output = (string) $output->__toString(); } else { - trigger_error("html_options: output is an object of class '" . get_class($output) . - "' without __toString() method", E_USER_NOTICE); + trigger_error('html_options: output is an object of class \'' . get_class($output) . + '\' without __toString() method', E_USER_NOTICE); return ''; } diff --git a/vendor/smarty/smarty/libs/plugins/function.html_image.php b/vendor/smarty/smarty/libs/plugins/function.html_image.php index 6da8fc544..4fda72eef 100644 --- a/vendor/smarty/smarty/libs/plugins/function.html_image.php +++ b/vendor/smarty/smarty/libs/plugins/function.html_image.php @@ -8,20 +8,20 @@ /** * Smarty {html_image} function plugin - * Type: function<br> - * Name: html_image<br> - * Date: Feb 24, 2003<br> - * Purpose: format HTML tags for the image<br> - * Examples: {html_image file="/images/masthead.gif"}<br> - * Output: <img src="/images/masthead.gif" width=400 height=23><br> + * Type: function + * Name: html_image + * Date: Feb 24, 2003 + * Purpose: format HTML tags for the image + * Examples: {html_image file="/images/masthead.gif"} + * Output: <img src="/images/masthead.gif" width=400 height=23> * Params: - * <pre> + * * - file - (required) - file (and path) of image * - height - (optional) - image height (default actual height) * - width - (optional) - image width (default actual width) * - basedir - (optional) - base directory for absolute paths, default is environment variable DOCUMENT_ROOT * - path_prefix - prefix for path output (optional, default empty) - * </pre> + * * * @link http://www.smarty.net/manual/en/language.function.html.image.php {html_image} * (Smarty online manual) @@ -36,11 +36,10 @@ * @return string * @uses smarty_function_escape_special_chars() */ -function smarty_function_html_image($params, $template) +function smarty_function_html_image($params, Smarty_Internal_Template $template) { - if (!is_callable('smarty_function_escape_special_chars')) { - require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); - } + $template->_checkPlugins(array(array('function' => 'smarty_function_escape_special_chars', + 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'))); $alt = ''; $file = ''; @@ -66,7 +65,7 @@ function smarty_function_html_image($params, $template) if (!is_array($_val)) { $$_key = smarty_function_escape_special_chars($_val); } else { - throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + throw new SmartyException ("html_image: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE); } break; @@ -80,19 +79,19 @@ function smarty_function_html_image($params, $template) if (!is_array($_val)) { $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; } else { - throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + throw new SmartyException ("html_image: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE); } break; } } if (empty($file)) { - trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE); + trigger_error('html_image: missing \'file\' parameter', E_USER_NOTICE); return; } - if ($file[ 0 ] == '/') { + if ($file[ 0 ] === '/') { $_image_path = $basedir . $file; } else { $_image_path = $file; @@ -126,15 +125,15 @@ function smarty_function_html_image($params, $template) // FIXME: (rodneyrehm) getimagesize() loads the complete file off a remote resource, use custom [jpg,png,gif]header reader! if (!$_image_data = @getimagesize($_image_path)) { if (!file_exists($_image_path)) { - trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE); + trigger_error("html_image: unable to find '{$_image_path}'", E_USER_NOTICE); return; } elseif (!is_readable($_image_path)) { - trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE); + trigger_error("html_image: unable to read '{$_image_path}'", E_USER_NOTICE); return; } else { - trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE); + trigger_error("html_image: '{$_image_path}' is not a valid image file", E_USER_NOTICE); return; } diff --git a/vendor/smarty/smarty/libs/plugins/function.html_options.php b/vendor/smarty/smarty/libs/plugins/function.html_options.php index bc8f36e0b..b8b986493 100644 --- a/vendor/smarty/smarty/libs/plugins/function.html_options.php +++ b/vendor/smarty/smarty/libs/plugins/function.html_options.php @@ -5,15 +5,14 @@ * @package Smarty * @subpackage PluginsFunction */ - /** * Smarty {html_options} function plugin - * Type: function<br> - * Name: html_options<br> + * Type: function + * Name: html_options * Purpose: Prints the list of <option> tags generated from - * the passed parameters<br> + * the passed parameters * Params: - * <pre> + * * - name (optional) - string default "select" * - values (required) - if no options supplied) - array * - options (required) - if no values supplied) - associative array @@ -21,23 +20,25 @@ * - output (required) - if not options supplied) - array * - id (optional) - string default not set * - class (optional) - string default not set - * </pre> + * * * @link http://www.smarty.net/manual/en/language.function.html.options.php {html_image} * (Smarty online manual) * @author Monte Ohrt <monte at ohrt dot com> * @author Ralf Strehle (minor optimization) <ralf dot strehle at yahoo dot de> * - * @param array $params parameters + * @param array $params parameters + * + * @param \Smarty_Internal_Template $template * * @return string * @uses smarty_function_escape_special_chars() + * @throws \SmartyException */ -function smarty_function_html_options($params) +function smarty_function_html_options($params, Smarty_Internal_Template $template) { - if (!is_callable('smarty_function_escape_special_chars')) { - require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); - } + $template->_checkPlugins(array(array('function' => 'smarty_function_escape_special_chars', + 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'))); $name = null; $values = null; @@ -71,11 +72,11 @@ function smarty_function_html_options($params) $selected = array(); foreach ($_val as $_sel) { if (is_object($_sel)) { - if (method_exists($_sel, "__toString")) { + if (method_exists($_sel, '__toString')) { $_sel = smarty_function_escape_special_chars((string) $_sel->__toString()); } else { - trigger_error("html_options: selected attribute contains an object of class '" . - get_class($_sel) . "' without __toString() method", E_USER_NOTICE); + trigger_error('html_options: selected attribute contains an object of class \'' . + get_class($_sel) . '\' without __toString() method', E_USER_NOTICE); continue; } } else { @@ -84,11 +85,11 @@ function smarty_function_html_options($params) $selected[ $_sel ] = true; } } elseif (is_object($_val)) { - if (method_exists($_val, "__toString")) { + if (method_exists($_val, '__toString')) { $selected = smarty_function_escape_special_chars((string) $_val->__toString()); } else { - trigger_error("html_options: selected attribute is an object of class '" . get_class($_val) . - "' without __toString() method", E_USER_NOTICE); + trigger_error('html_options: selected attribute is an object of class \'' . get_class($_val) . + '\' without __toString() method', E_USER_NOTICE); } } else { $selected = smarty_function_escape_special_chars((string) $_val); @@ -102,7 +103,7 @@ function smarty_function_html_options($params) case 'readonly': if (!empty($params[ 'strict' ])) { if (!is_scalar($_val)) { - trigger_error("html_options: $_key attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute", + trigger_error("html_options: {$_key} attribute must be a scalar, only boolean true or string '{$_key}' will actually add the attribute", E_USER_NOTICE); } @@ -118,7 +119,7 @@ function smarty_function_html_options($params) if (!is_array($_val)) { $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; } else { - trigger_error("html_options: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + trigger_error("html_options: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE); } break; } @@ -154,7 +155,16 @@ function smarty_function_html_options($params) return $_html_result; } - +/** + * @param $key + * @param $value + * @param $selected + * @param $id + * @param $class + * @param $idx + * + * @return string + */ function smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, &$idx) { if (!is_array($value)) { @@ -170,11 +180,11 @@ function smarty_function_html_options_optoutput($key, $value, $selected, $id, $c $_html_class = !empty($class) ? ' class="' . $class . ' option"' : ''; $_html_id = !empty($id) ? ' id="' . $id . '-' . $idx . '"' : ''; if (is_object($value)) { - if (method_exists($value, "__toString")) { + if (method_exists($value, '__toString')) { $value = smarty_function_escape_special_chars((string) $value->__toString()); } else { - trigger_error("html_options: value is an object of class '" . get_class($value) . - "' without __toString() method", E_USER_NOTICE); + trigger_error('html_options: value is an object of class \'' . get_class($value) . + '\' without __toString() method', E_USER_NOTICE); return ''; } @@ -193,7 +203,16 @@ function smarty_function_html_options_optoutput($key, $value, $selected, $id, $c return $_html_result; } - +/** + * @param $key + * @param $values + * @param $selected + * @param $id + * @param $class + * @param $idx + * + * @return string + */ function smarty_function_html_options_optgroup($key, $values, $selected, $id, $class, &$idx) { $optgroup_html = '<optgroup label="' . smarty_function_escape_special_chars($key) . '">' . "\n"; diff --git a/vendor/smarty/smarty/libs/plugins/function.html_radios.php b/vendor/smarty/smarty/libs/plugins/function.html_radios.php index 6ef84328a..37feec63e 100644 --- a/vendor/smarty/smarty/libs/plugins/function.html_radios.php +++ b/vendor/smarty/smarty/libs/plugins/function.html_radios.php @@ -5,16 +5,15 @@ * @package Smarty * @subpackage PluginsFunction */ - /** * Smarty {html_radios} function plugin - * File: function.html_radios.php<br> - * Type: function<br> - * Name: html_radios<br> - * Date: 24.Feb.2003<br> - * Purpose: Prints out a list of radio input types<br> + * File: function.html_radios.php + * Type: function + * Name: html_radios + * Date: 24.Feb.2003 + * Purpose: Prints out a list of radio input types * Params: - * <pre> + * * - name (optional) - string default "radio" * - values (required) - array * - options (required) - associative array @@ -23,13 +22,13 @@ * - output (optional) - the output next to each radio button * - assign (optional) - assign the output as an array to this variable * - escape (optional) - escape the content (not value), defaults to true - * </pre> + * * Examples: - * <pre> + * * {html_radios values=$ids output=$names} * {html_radios values=$ids name='box' separator='<br>' output=$names} * {html_radios values=$ids checked=$checked separator='<br>' output=$names} - * </pre> + * * * @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios} * (Smarty online manual) @@ -42,12 +41,12 @@ * * @return string * @uses smarty_function_escape_special_chars() + * @throws \SmartyException */ -function smarty_function_html_radios($params, $template) +function smarty_function_html_radios($params, Smarty_Internal_Template $template) { - if (!is_callable('smarty_function_escape_special_chars')) { - require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); - } + $template->_checkPlugins(array(array('function' => 'smarty_function_escape_special_chars', + 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'))); $name = 'radio'; $values = null; @@ -72,11 +71,11 @@ function smarty_function_html_radios($params, $template) if (is_array($_val)) { trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING); } elseif (is_object($_val)) { - if (method_exists($_val, "__toString")) { + if (method_exists($_val, '__toString')) { $selected = smarty_function_escape_special_chars((string) $_val->__toString()); } else { - trigger_error("html_radios: selected attribute is an object of class '" . get_class($_val) . - "' without __toString() method", E_USER_NOTICE); + trigger_error('html_radios: selected attribute is an object of class \'' . get_class($_val) . + '\' without __toString() method', E_USER_NOTICE); } } else { $selected = (string) $_val; @@ -114,7 +113,7 @@ function smarty_function_html_radios($params, $template) case 'readonly': if (!empty($params[ 'strict' ])) { if (!is_scalar($_val)) { - trigger_error("html_options: $_key attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute", + trigger_error("html_options: {$_key} attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute", E_USER_NOTICE); } @@ -130,7 +129,7 @@ function smarty_function_html_radios($params, $template) if (!is_array($_val)) { $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; } else { - trigger_error("html_radios: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + trigger_error("html_radios: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE); } break; } @@ -165,18 +164,30 @@ function smarty_function_html_radios($params, $template) return implode("\n", $_html_result); } } - +/** + * @param $name + * @param $value + * @param $output + * @param $selected + * @param $extra + * @param $separator + * @param $labels + * @param $label_ids + * @param $escape + * + * @return string + */ function smarty_function_html_radios_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids, - $escape) + $escape) { $_output = ''; if (is_object($value)) { - if (method_exists($value, "__toString")) { + if (method_exists($value, '__toString')) { $value = (string) $value->__toString(); } else { - trigger_error("html_options: value is an object of class '" . get_class($value) . - "' without __toString() method", E_USER_NOTICE); + trigger_error('html_options: value is an object of class \'' . get_class($value) . + '\' without __toString() method', E_USER_NOTICE); return ''; } @@ -185,11 +196,11 @@ function smarty_function_html_radios_output($name, $value, $output, $selected, $ } if (is_object($output)) { - if (method_exists($output, "__toString")) { + if (method_exists($output, '__toString')) { $output = (string) $output->__toString(); } else { - trigger_error("html_options: output is an object of class '" . get_class($output) . - "' without __toString() method", E_USER_NOTICE); + trigger_error('html_options: output is an object of class \'' . get_class($output) . + '\' without __toString() method', E_USER_NOTICE); return ''; } diff --git a/vendor/smarty/smarty/libs/plugins/function.html_select_date.php b/vendor/smarty/smarty/libs/plugins/function.html_select_date.php index 3a48da0bb..1d63800e1 100644 --- a/vendor/smarty/smarty/libs/plugins/function.html_select_date.php +++ b/vendor/smarty/smarty/libs/plugins/function.html_select_date.php @@ -5,14 +5,13 @@ * @package Smarty * @subpackage PluginsFunction */ - /** * Smarty {html_select_date} plugin - * Type: function<br> - * Name: html_select_date<br> + * Type: function + * Name: html_select_date * Purpose: Prints the dropdowns for date selection. * ChangeLog: - * <pre> + * * - 1.0 initial release * - 1.1 added support for +/- N syntax for begin * and end year values. (Monte) @@ -28,7 +27,7 @@ * of 0000-00-00 dates (cybot, boots) * - 2.0 complete rewrite for performance, * added attributes month_names, *_id - * </pre> + * * * @link http://www.smarty.net/manual/en/language.function.html.select.date.php {html_select_date} * (Smarty online manual) @@ -37,18 +36,17 @@ * @author Monte Ohrt <monte at ohrt dot com> * @author Rodney Rehm * - * @param array $params parameters + * @param array $params parameters + * + * @param \Smarty_Internal_Template $template * * @return string + * @throws \SmartyException */ -function smarty_function_html_select_date($params) +function smarty_function_html_select_date($params, Smarty_Internal_Template $template) { - if (!is_callable('smarty_function_escape_special_chars')) { - require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); - } - if (!is_callable('smarty_make_timestamp')) { - require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); - } + $template->_checkPlugins(array(array('function' => 'smarty_function_escape_special_chars', + 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'))); // generate timestamps used for month names only static $_month_timestamps = null; static $_current_year = null; @@ -61,18 +59,18 @@ function smarty_function_html_select_date($params) } /* Default values. */ - $prefix = "Date_"; + $prefix = 'Date_'; $start_year = null; $end_year = null; $display_days = true; $display_months = true; $display_years = true; - $month_format = "%B"; + $month_format = '%B'; /* Write months as numbers by default GL */ - $month_value_format = "%m"; - $day_format = "%02d"; + $month_value_format = '%m'; + $day_format = '%02d'; /* Write day values using this format MB */ - $day_value_format = "%d"; + $day_value_format = '%d'; $year_as_text = false; /* Display years in reverse order? Ie. 2000,1999,.... */ $reverse_years = false; @@ -113,15 +111,17 @@ function smarty_function_html_select_date($params) switch ($_key) { case 'time': if (!is_array($_value) && $_value !== null) { + $template->_checkPlugins(array(array('function' => 'smarty_make_timestamp', + 'file' => SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'))); $time = smarty_make_timestamp($_value); } break; case 'month_names': - if (is_array($_value) && count($_value) == 12) { + if (is_array($_value) && count($_value) === 12) { $$_key = $_value; } else { - trigger_error("html_select_date: month_names must be an array of 12 strings", E_USER_NOTICE); + trigger_error('html_select_date: month_names must be an array of 12 strings', E_USER_NOTICE); } break; @@ -166,7 +166,7 @@ function smarty_function_html_select_date($params) if (!is_array($_value)) { $extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"'; } else { - trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + trigger_error("html_select_date: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE); } break; } @@ -177,7 +177,9 @@ function smarty_function_html_select_date($params) if (isset($params[ 'time' ]) && is_array($params[ 'time' ])) { if (isset($params[ 'time' ][ $prefix . 'Year' ])) { // $_REQUEST[$field_array] given - foreach (array('Y' => 'Year', 'm' => 'Month', 'd' => 'Day') as $_elementKey => $_elementName) { + foreach (array('Y' => 'Year', + 'm' => 'Month', + 'd' => 'Day') as $_elementKey => $_elementName) { $_variableName = '_' . strtolower($_elementName); $$_variableName = isset($params[ 'time' ][ $prefix . $_elementName ]) ? $params[ 'time' ][ $prefix . $_elementName ] : @@ -185,7 +187,9 @@ function smarty_function_html_select_date($params) } } elseif (isset($params[ 'time' ][ $field_array ][ $prefix . 'Year' ])) { // $_REQUEST given - foreach (array('Y' => 'Year', 'm' => 'Month', 'd' => 'Day') as $_elementKey => $_elementName) { + foreach (array('Y' => 'Year', + 'm' => 'Month', + 'd' => 'Day') as $_elementKey => $_elementName) { $_variableName = '_' . strtolower($_elementName); $$_variableName = isset($params[ 'time' ][ $field_array ][ $prefix . $_elementName ]) ? $params[ 'time' ][ $field_array ][ $prefix . $_elementName ] : date($_elementKey); @@ -206,14 +210,15 @@ function smarty_function_html_select_date($params) // make syntax "+N" or "-N" work with $start_year and $end_year // Note preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match) is slower than trim+substr - foreach (array('start', 'end') as $key) { + foreach (array('start', + 'end') as $key) { $key .= '_year'; $t = $$key; if ($t === null) { $$key = (int) $_current_year; - } elseif ($t[ 0 ] == '+') { + } elseif ($t[ 0 ] === '+') { $$key = (int) ($_current_year + (int) trim(substr($t, 1))); - } elseif ($t[ 0 ] == '-') { + } elseif ($t[ 0 ] === '-') { $$key = (int) ($_current_year - (int) trim(substr($t, 1))); } else { $$key = (int) $$key; @@ -301,8 +306,8 @@ function smarty_function_html_select_date($params) for ($i = 1; $i <= 12; $i ++) { $_val = sprintf('%02d', $i); $_text = isset($month_names) ? smarty_function_escape_special_chars($month_names[ $i ]) : - ($month_format == "%m" ? $_val : strftime($month_format, $_month_timestamps[ $i ])); - $_value = $month_value_format == "%m" ? $_val : strftime($month_value_format, $_month_timestamps[ $i ]); + ($month_format === '%m' ? $_val : strftime($month_format, $_month_timestamps[ $i ])); + $_value = $month_value_format === '%m' ? $_val : strftime($month_value_format, $_month_timestamps[ $i ]); $_html_months .= '<option value="' . $_value . '"' . ($_val == $_month ? ' selected="selected"' : '') . '>' . $_text . '</option>' . $option_separator; } @@ -339,8 +344,8 @@ function smarty_function_html_select_date($params) for ($i = 1; $i <= 31; $i ++) { $_val = sprintf('%02d', $i); - $_text = $day_format == '%02d' ? $_val : sprintf($day_format, $i); - $_value = $day_value_format == '%02d' ? $_val : sprintf($day_value_format, $i); + $_text = $day_format === '%02d' ? $_val : sprintf($day_format, $i); + $_value = $day_value_format === '%02d' ? $_val : sprintf($day_value_format, $i); $_html_days .= '<option value="' . $_value . '"' . ($_val == $_day ? ' selected="selected"' : '') . '>' . $_text . '</option>' . $option_separator; } diff --git a/vendor/smarty/smarty/libs/plugins/function.html_select_time.php b/vendor/smarty/smarty/libs/plugins/function.html_select_time.php index 89f0406f6..f7c3816e3 100644 --- a/vendor/smarty/smarty/libs/plugins/function.html_select_time.php +++ b/vendor/smarty/smarty/libs/plugins/function.html_select_time.php @@ -5,11 +5,10 @@ * @package Smarty * @subpackage PluginsFunction */ - /** * Smarty {html_select_time} function plugin - * Type: function<br> - * Name: html_select_time<br> + * Type: function + * Name: html_select_time * Purpose: Prints the dropdowns for time selection * * @link http://www.smarty.net/manual/en/language.function.html.select.time.php {html_select_time} @@ -17,20 +16,19 @@ * @author Roberto Berto <roberto@berto.net> * @author Monte Ohrt <monte AT ohrt DOT com> * - * @param array $params parameters + * @param array $params parameters + * + * @param \Smarty_Internal_Template $template * * @return string * @uses smarty_make_timestamp() + * @throws \SmartyException */ -function smarty_function_html_select_time($params) +function smarty_function_html_select_time($params, Smarty_Internal_Template $template) { - if (!is_callable('smarty_function_escape_special_chars')) { - require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); - } - if (!is_callable('smarty_make_timestamp')) { - require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); - } - $prefix = "Time_"; + $template->_checkPlugins(array(array('function' => 'smarty_function_escape_special_chars', + 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'))); + $prefix = 'Time_'; $field_array = null; $field_separator = "\n"; $option_separator = "\n"; @@ -80,6 +78,8 @@ function smarty_function_html_select_time($params) switch ($_key) { case 'time': if (!is_array($_value) && $_value !== null) { + $template->_checkPlugins(array(array('function' => 'smarty_make_timestamp', + 'file' => SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'))); $time = smarty_make_timestamp($_value); } break; @@ -139,7 +139,7 @@ function smarty_function_html_select_time($params) if (!is_array($_value)) { $extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"'; } else { - trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + trigger_error("html_select_date: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE); } break; } @@ -148,7 +148,9 @@ function smarty_function_html_select_time($params) if (isset($params[ 'time' ]) && is_array($params[ 'time' ])) { if (isset($params[ 'time' ][ $prefix . 'Hour' ])) { // $_REQUEST[$field_array] given - foreach (array('H' => 'Hour', 'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) { + foreach (array('H' => 'Hour', + 'i' => 'Minute', + 's' => 'Second') as $_elementKey => $_elementName) { $_variableName = '_' . strtolower($_elementName); $$_variableName = isset($params[ 'time' ][ $prefix . $_elementName ]) ? $params[ 'time' ][ $prefix . $_elementName ] : @@ -161,7 +163,9 @@ function smarty_function_html_select_time($params) list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); } elseif (isset($params[ 'time' ][ $field_array ][ $prefix . 'Hour' ])) { // $_REQUEST given - foreach (array('H' => 'Hour', 'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) { + foreach (array('H' => 'Hour', + 'i' => 'Minute', + 's' => 'Second') as $_elementKey => $_elementName) { $_variableName = '_' . strtolower($_elementName); $$_variableName = isset($params[ 'time' ][ $field_array ][ $prefix . $_elementName ]) ? $params[ 'time' ][ $field_array ][ $prefix . $_elementName ] : date($_elementKey); @@ -216,8 +220,8 @@ function smarty_function_html_select_time($params) $end = $use_24_hours ? 23 : 12; for ($i = $start; $i <= $end; $i ++) { $_val = sprintf('%02d', $i); - $_text = $hour_format == '%02d' ? $_val : sprintf($hour_format, $i); - $_value = $hour_value_format == '%02d' ? $_val : sprintf($hour_value_format, $i); + $_text = $hour_format === '%02d' ? $_val : sprintf($hour_format, $i); + $_value = $hour_value_format === '%02d' ? $_val : sprintf($hour_value_format, $i); if (!$use_24_hours) { $_hour12 = $_hour == 0 ? 12 : ($_hour <= 12 ? $_hour : $_hour - 12); @@ -263,8 +267,8 @@ function smarty_function_html_select_time($params) $selected = $_minute !== null ? ($_minute - $_minute % $minute_interval) : null; for ($i = 0; $i <= 59; $i += $minute_interval) { $_val = sprintf('%02d', $i); - $_text = $minute_format == '%02d' ? $_val : sprintf($minute_format, $i); - $_value = $minute_value_format == '%02d' ? $_val : sprintf($minute_value_format, $i); + $_text = $minute_format === '%02d' ? $_val : sprintf($minute_format, $i); + $_value = $minute_value_format === '%02d' ? $_val : sprintf($minute_value_format, $i); $_html_minutes .= '<option value="' . $_value . '"' . ($selected === $i ? ' selected="selected"' : '') . '>' . $_text . '</option>' . $option_separator; } @@ -304,8 +308,8 @@ function smarty_function_html_select_time($params) $selected = $_second !== null ? ($_second - $_second % $second_interval) : null; for ($i = 0; $i <= 59; $i += $second_interval) { $_val = sprintf('%02d', $i); - $_text = $second_format == '%02d' ? $_val : sprintf($second_format, $i); - $_value = $second_value_format == '%02d' ? $_val : sprintf($second_value_format, $i); + $_text = $second_format === '%02d' ? $_val : sprintf($second_format, $i); + $_value = $second_value_format === '%02d' ? $_val : sprintf($second_value_format, $i); $_html_seconds .= '<option value="' . $_value . '"' . ($selected === $i ? ' selected="selected"' : '') . '>' . $_text . '</option>' . $option_separator; } @@ -350,7 +354,10 @@ function smarty_function_html_select_time($params) } $_html = ''; - foreach (array('_html_hours', '_html_minutes', '_html_seconds', '_html_meridian') as $k) { + foreach (array('_html_hours', + '_html_minutes', + '_html_seconds', + '_html_meridian') as $k) { if (isset($$k)) { if ($_html) { $_html .= $field_separator; diff --git a/vendor/smarty/smarty/libs/plugins/function.html_table.php b/vendor/smarty/smarty/libs/plugins/function.html_table.php index 42e23e722..d9a9fd691 100644 --- a/vendor/smarty/smarty/libs/plugins/function.html_table.php +++ b/vendor/smarty/smarty/libs/plugins/function.html_table.php @@ -8,12 +8,12 @@ /** * Smarty {html_table} function plugin - * Type: function<br> - * Name: html_table<br> - * Date: Feb 17, 2003<br> - * Purpose: make an html table from an array of data<br> + * Type: function + * Name: html_table + * Date: Feb 17, 2003 + * Purpose: make an html table from an array of data * Params: - * <pre> + * * - loop - array to loop through * - cols - number of columns, comma separated list of column names * or array of column names @@ -28,13 +28,13 @@ * - hdir - horizontal direction (default: "right", means left-to-right) * - inner - inner loop (default "cols": print $loop line by line, * $loop will be printed column by column otherwise) - * </pre> + * * Examples: - * <pre> + * * {table loop=$data} * {table loop=$data cols=4 tr_attr='"bgcolor=red"'} * {table loop=$data cols="first,second,third" tr_attr=$colors} - * </pre> + * * * @author Monte Ohrt <monte at ohrt dot com> * @author credit to Messju Mohr <messju at lammfellpuschen dot de> @@ -127,7 +127,7 @@ function smarty_function_html_table($params) } if (is_array($cols)) { - $cols = ($hdir == 'right') ? $cols : array_reverse($cols); + $cols = ($hdir === 'right') ? $cols : array_reverse($cols); $output .= "<thead><tr>\n"; for ($r = 0; $r < $cols_count; $r ++) { @@ -141,11 +141,11 @@ function smarty_function_html_table($params) $output .= "<tbody>\n"; for ($r = 0; $r < $rows; $r ++) { $output .= "<tr" . smarty_function_html_table_cycle('tr', $tr_attr, $r) . ">\n"; - $rx = ($vdir == 'down') ? $r * $cols_count : ($rows - 1 - $r) * $cols_count; + $rx = ($vdir === 'down') ? $r * $cols_count : ($rows - 1 - $r) * $cols_count; for ($c = 0; $c < $cols_count; $c ++) { - $x = ($hdir == 'right') ? $rx + $c : $rx + $cols_count - 1 - $c; - if ($inner != 'cols') { + $x = ($hdir === 'right') ? $rx + $c : $rx + $cols_count - 1 - $c; + if ($inner !== 'cols') { /* shuffle x to loop over rows*/ $x = floor($x / $cols_count) + ($x % $cols_count) * $rows; } @@ -163,7 +163,13 @@ function smarty_function_html_table($params) return $output; } - +/** + * @param $name + * @param $var + * @param $no + * + * @return string + */ function smarty_function_html_table_cycle($name, $var, $no) { if (!is_array($var)) { diff --git a/vendor/smarty/smarty/libs/plugins/function.mailto.php b/vendor/smarty/smarty/libs/plugins/function.mailto.php index 9d2a5d2d5..0d817535a 100644 --- a/vendor/smarty/smarty/libs/plugins/function.mailto.php +++ b/vendor/smarty/smarty/libs/plugins/function.mailto.php @@ -8,35 +8,35 @@ /** * Smarty {mailto} function plugin - * Type: function<br> - * Name: mailto<br> + * Type: function + * Name: mailto * Date: May 21, 2002 - * Purpose: automate mailto address link creation, and optionally encode them.<br> + * Purpose: automate mailto address link creation, and optionally encode them. * Params: - * <pre> + * * - address - (required) - e-mail address * - text - (optional) - text to display, default is address * - encode - (optional) - can be one of: * * none : no encoding (default) * * javascript : encode with javascript * * javascript_charcode : encode with javascript charcode - * * hex : encode with hexidecimal (no javascript) + * * hex : encode with hexadecimal (no javascript) * - cc - (optional) - address(es) to carbon copy * - bcc - (optional) - address(es) to blind carbon copy * - subject - (optional) - e-mail subject * - newsgroups - (optional) - newsgroup(s) to post to * - followupto - (optional) - address(es) to follow up to * - extra - (optional) - extra tags for the href link - * </pre> + * * Examples: - * <pre> + * * {mailto address="me@domain.com"} * {mailto address="me@domain.com" encode="javascript"} * {mailto address="me@domain.com" encode="hex"} * {mailto address="me@domain.com" subject="Hello to you!"} * {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"} * {mailto address="me@domain.com" extra='class="mailto"'} - * </pre> + * * * @link http://www.smarty.net/manual/en/language.function.mailto.php {mailto} * (Smarty online manual) @@ -103,7 +103,7 @@ function smarty_function_mailto($params) return; } // FIXME: (rodneyrehm) document.write() excues me what? 1998 has passed! - if ($encode == 'javascript') { + if ($encode === 'javascript') { $string = 'document.write(\'<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>\');'; $js_encode = ''; @@ -112,7 +112,7 @@ function smarty_function_mailto($params) } return '<script type="text/javascript">eval(unescape(\'' . $js_encode . '\'))</script>'; - } elseif ($encode == 'javascript_charcode') { + } elseif ($encode === 'javascript_charcode') { $string = '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>'; for ($x = 0, $y = strlen($string); $x < $y; $x ++) { @@ -123,7 +123,7 @@ function smarty_function_mailto($params) implode(',', $ord) . "))" . "}\n" . "</script>\n"; return $_ret; - } elseif ($encode == 'hex') { + } elseif ($encode === 'hex') { preg_match('!^(.*)(\?.*)$!', $address, $match); if (!empty($match[ 2 ])) { trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.", E_USER_WARNING); diff --git a/vendor/smarty/smarty/libs/plugins/function.math.php b/vendor/smarty/smarty/libs/plugins/function.math.php index fc5db335c..396ad085e 100644 --- a/vendor/smarty/smarty/libs/plugins/function.math.php +++ b/vendor/smarty/smarty/libs/plugins/function.math.php @@ -9,8 +9,8 @@ /** * Smarty {math} function plugin - * Type: function<br> - * Name: math<br> + * Type: function + * Name: math * Purpose: handle math computations in template * * @link http://www.smarty.net/manual/en/language.function.math.php {math} @@ -38,7 +38,7 @@ function smarty_function_math($params, $template) $equation = $params[ 'equation' ]; // make sure parenthesis are balanced - if (substr_count($equation, "(") != substr_count($equation, ")")) { + if (substr_count($equation, '(') !== substr_count($equation, ')')) { trigger_error("math: unbalanced parenthesis", E_USER_WARNING); return; @@ -59,9 +59,9 @@ function smarty_function_math($params, $template) } foreach ($params as $key => $val) { - if ($key != "equation" && $key != "format" && $key != "assign") { + if ($key !== 'equation' && $key !== 'format' && $key !== 'assign') { // make sure value is not empty - if (strlen($val) == 0) { + if (strlen($val) === 0) { trigger_error("math: parameter '{$key}' is empty", E_USER_WARNING); return; @@ -86,7 +86,7 @@ function smarty_function_math($params, $template) } foreach ($params as $key => $val) { - if ($key != "equation" && $key != "format" && $key != "assign") { + if ($key !== 'equation' && $key !== 'format' && $key !== 'assign') { $equation = preg_replace("/\b$key\b/", " \$params['$key'] ", $equation); } } diff --git a/vendor/smarty/smarty/libs/plugins/modifier.capitalize.php b/vendor/smarty/smarty/libs/plugins/modifier.capitalize.php index 6513a0495..e354977b0 100644 --- a/vendor/smarty/smarty/libs/plugins/modifier.capitalize.php +++ b/vendor/smarty/smarty/libs/plugins/modifier.capitalize.php @@ -8,8 +8,8 @@ /** * Smarty capitalize modifier plugin - * Type: modifier<br> - * Name: capitalize<br> + * Type: modifier + * Name: capitalize * Purpose: capitalize words in the string * {@internal {$string|capitalize:true:true} is the fastest option for MBString enabled systems }} * @@ -72,7 +72,7 @@ function smarty_modifier_capitalize($string, $uc_digits = false, $lc_rest = fals return $upper_string; } -/* +/* * * Bug: create_function() use exhausts memory when used in long loops * Fix: use declared functions for callbacks instead of using create_function() @@ -80,21 +80,38 @@ function smarty_modifier_capitalize($string, $uc_digits = false, $lc_rest = fals * * @author Kyle Renfrow */ +/** + * @param $matches + * + * @return string + */ function smarty_mod_cap_mbconvert_cb($matches) { return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 2 ]), MB_CASE_UPPER, Smarty::$_CHARSET); } - +/** + * @param $matches + * + * @return string + */ function smarty_mod_cap_mbconvert2_cb($matches) { return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 3 ]), MB_CASE_UPPER, Smarty::$_CHARSET); } - +/** + * @param $matches + * + * @return string + */ function smarty_mod_cap_ucfirst_cb($matches) { return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 2 ])); } - +/** + * @param $matches + * + * @return string + */ function smarty_mod_cap_ucfirst2_cb($matches) { return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 3 ])); diff --git a/vendor/smarty/smarty/libs/plugins/modifier.date_format.php b/vendor/smarty/smarty/libs/plugins/modifier.date_format.php index bfe363c08..b45b2d4b8 100644 --- a/vendor/smarty/smarty/libs/plugins/modifier.date_format.php +++ b/vendor/smarty/smarty/libs/plugins/modifier.date_format.php @@ -8,10 +8,10 @@ /** * Smarty date_format modifier plugin - * Type: modifier<br> - * Name: date_format<br> - * Purpose: format datestamps via strftime<br> - * Input:<br> + * Type: modifier + * Name: date_format + * Purpose: format datestamps via strftime + * Input: * - string: input date string * - format: strftime format for output * - default_date: default date if $string is empty @@ -35,20 +35,36 @@ function smarty_modifier_date_format($string, $format = null, $default_date = '' /** * require_once the {@link shared.make_timestamp.php} plugin */ - if (!is_callable('smarty_make_timestamp')) { - require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); + static $is_loaded = false; + if (!$is_loaded) { + if (!is_callable('smarty_make_timestamp')) { + require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); + } + $is_loaded = true; } - if ($string != '' && $string != '0000-00-00' && $string != '0000-00-00 00:00:00') { + if ($string !== '' && $string !== '0000-00-00' && $string !== '0000-00-00 00:00:00') { $timestamp = smarty_make_timestamp($string); - } elseif ($default_date != '') { + } elseif ($default_date !== '') { $timestamp = smarty_make_timestamp($default_date); } else { return; } - if ($formatter == 'strftime' || ($formatter == 'auto' && strpos($format, '%') !== false)) { + if ($formatter === 'strftime' || ($formatter === 'auto' && strpos($format, '%') !== false)) { if (Smarty::$_IS_WINDOWS) { - $_win_from = array('%D', '%h', '%n', '%r', '%R', '%t', '%T'); - $_win_to = array('%m/%d/%y', '%b', "\n", '%I:%M:%S %p', '%H:%M', "\t", '%H:%M:%S'); + $_win_from = array('%D', + '%h', + '%n', + '%r', + '%R', + '%t', + '%T'); + $_win_to = array('%m/%d/%y', + '%b', + "\n", + '%I:%M:%S %p', + '%H:%M', + "\t", + '%H:%M:%S'); if (strpos($format, '%e') !== false) { $_win_from[] = '%e'; $_win_to[] = sprintf('%\' 2d', date('j', $timestamp)); diff --git a/vendor/smarty/smarty/libs/plugins/modifier.debug_print_var.php b/vendor/smarty/smarty/libs/plugins/modifier.debug_print_var.php index 34f85dcd5..2bd112154 100644 --- a/vendor/smarty/smarty/libs/plugins/modifier.debug_print_var.php +++ b/vendor/smarty/smarty/libs/plugins/modifier.debug_print_var.php @@ -8,8 +8,8 @@ /** * Smarty debug_print_var modifier plugin - * Type: modifier<br> - * Name: debug_print_var<br> + * Type: modifier + * Name: debug_print_var * Purpose: formats variable contents for display in the console * * @author Monte Ohrt <monte at ohrt dot com> @@ -28,7 +28,7 @@ function smarty_modifier_debug_print_var($var, $max = 10, $length = 40, $depth = switch (gettype($var)) { case 'array' : $results = '<b>Array (' . count($var) . ')</b>'; - if ($depth == $max) { + if ($depth === $max) { break; } foreach ($var as $curr_key => $curr_val) { @@ -46,7 +46,7 @@ function smarty_modifier_debug_print_var($var, $max = 10, $length = 40, $depth = $results .= ' called recursive'; break; } - if ($depth == $max) { + if ($depth === $max) { break; } $objects[] = $var; diff --git a/vendor/smarty/smarty/libs/plugins/modifier.escape.php b/vendor/smarty/smarty/libs/plugins/modifier.escape.php index 9c247b933..1ae87a7aa 100644 --- a/vendor/smarty/smarty/libs/plugins/modifier.escape.php +++ b/vendor/smarty/smarty/libs/plugins/modifier.escape.php @@ -8,8 +8,8 @@ /** * Smarty escape modifier plugin - * Type: modifier<br> - * Name: escape<br> + * Type: modifier + * Name: escape * Purpose: escape string for output * * @link http://www.smarty.net/docs/en/language.modifier.escape @@ -25,6 +25,8 @@ function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $double_encode = true) { static $_double_encode = null; + static $is_loaded_1 = false; + static $is_loaded_2 = false; if ($_double_encode === null) { $_double_encode = version_compare(PHP_VERSION, '5.2.3', '>='); } @@ -46,7 +48,9 @@ function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $ // php <5.2.3 - prevent double encoding $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); $string = htmlspecialchars($string, ENT_QUOTES, $char_set); - $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); + $string = str_replace(array('%%%SMARTY_START%%%', + '%%%SMARTY_END%%%'), array('&', + ';'), $string); return $string; } @@ -67,7 +71,9 @@ function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $ $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); $string = htmlspecialchars($string, ENT_QUOTES, $char_set); $string = - str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); + str_replace(array('%%%SMARTY_START%%%', + '%%%SMARTY_END%%%'), array('&', + ';'), $string); return $string; } @@ -86,7 +92,9 @@ function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $ } else { $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); $string = htmlentities($string, ENT_QUOTES, $char_set); - $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); + $string = str_replace(array('%%%SMARTY_START%%%', + '%%%SMARTY_END%%%'), array('&', + ';'), $string); return $string; } @@ -116,8 +124,11 @@ function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $ case 'hexentity': $return = ''; if (Smarty::$_MBSTRING) { - if (!is_callable('smarty_mb_to_unicode')) { - require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); + if (!$is_loaded_1) { + if (!is_callable('smarty_mb_to_unicode')) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); + } + $is_loaded_1 = true; } $return = ''; foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { @@ -137,8 +148,11 @@ function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $ case 'decentity': $return = ''; if (Smarty::$_MBSTRING) { - if (!is_callable('smarty_mb_to_unicode')) { - require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); + if (!$is_loaded_1) { + if (!is_callable('smarty_mb_to_unicode')) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); + } + $is_loaded_1 = true; } $return = ''; foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { @@ -157,25 +171,39 @@ function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $ case 'javascript': // escape quotes and backslashes, newlines, etc. - return strtr($string, array('\\' => '\\\\', "'" => "\\'", '"' => '\\"', "\r" => '\\r', "\n" => '\\n', + return strtr($string, array('\\' => '\\\\', + "'" => "\\'", + '"' => '\\"', + "\r" => '\\r', + "\n" => '\\n', '</' => '<\/')); case 'mail': if (Smarty::$_MBSTRING) { - if (!is_callable('smarty_mb_str_replace')) { - require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'); + if (!$is_loaded_2) { + if (!is_callable('smarty_mb_str_replace')) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'); + } + $is_loaded_2 = true; } - return smarty_mb_str_replace(array('@', '.'), array(' [AT] ', ' [DOT] '), $string); + return smarty_mb_str_replace(array('@', + '.'), array(' [AT] ', + ' [DOT] '), $string); } // no MBString fallback - return str_replace(array('@', '.'), array(' [AT] ', ' [DOT] '), $string); + return str_replace(array('@', + '.'), array(' [AT] ', + ' [DOT] '), $string); case 'nonstd': // escape non-standard chars, such as ms document quotes $return = ''; if (Smarty::$_MBSTRING) { - if (!is_callable('smarty_mb_to_unicode')) { - require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); + if (!$is_loaded_1) { + if (!is_callable('smarty_mb_to_unicode')) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); + } + $is_loaded_1 = true; } foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { if ($unicode >= 126) { diff --git a/vendor/smarty/smarty/libs/plugins/modifier.mb_wordwrap.php b/vendor/smarty/smarty/libs/plugins/modifier.mb_wordwrap.php new file mode 100644 index 000000000..93c6241ec --- /dev/null +++ b/vendor/smarty/smarty/libs/plugins/modifier.mb_wordwrap.php @@ -0,0 +1,75 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ +/** + * Smarty wordwrap modifier plugin + * Type: modifier + * Name: mb_wordwrap + * Purpose: Wrap a string to a given number of characters + * + + * @link http://php.net/manual/en/function.wordwrap.php for similarity + * + * @param string $str the string to wrap + * @param int $width the width of the output + * @param string $break the character used to break the line + * @param boolean $cut ignored parameter, just for the sake of + * + * @return string wrapped string + * @author Rodney Rehm + */ +function smarty_modifier_mb_wordwrap($str, $width = 75, $break = "\n", $cut = false) +{ + // break words into tokens using white space as a delimiter + $tokens = preg_split('!(\s)!S' . Smarty::$_UTF8_MODIFIER, $str, -1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE); + $length = 0; + $t = ''; + $_previous = false; + $_space = false; + + foreach ($tokens as $_token) { + $token_length = mb_strlen($_token, Smarty::$_CHARSET); + $_tokens = array($_token); + if ($token_length > $width) { + if ($cut) { + $_tokens = preg_split('!(.{' . $width . '})!S' . Smarty::$_UTF8_MODIFIER, + $_token, + -1, + PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE); + } + } + + foreach ($_tokens as $token) { + $_space = !!preg_match('!^\s$!S' . Smarty::$_UTF8_MODIFIER, $token); + $token_length = mb_strlen($token, Smarty::$_CHARSET); + $length += $token_length; + + if ($length > $width) { + // remove space before inserted break + if ($_previous) { + $t = mb_substr($t, 0, -1, Smarty::$_CHARSET); + } + + if (!$_space) { + // add the break before the token + if (!empty($t)) { + $t .= $break; + } + $length = $token_length; + } + } else if ($token === "\n") { + // hard break must reset counters + $length = 0; + } + $_previous = $_space; + // add the token + $t .= $token; + } + } + + return $t; +} diff --git a/vendor/smarty/smarty/libs/plugins/modifier.regex_replace.php b/vendor/smarty/smarty/libs/plugins/modifier.regex_replace.php index 85f41fdda..479aba875 100644 --- a/vendor/smarty/smarty/libs/plugins/modifier.regex_replace.php +++ b/vendor/smarty/smarty/libs/plugins/modifier.regex_replace.php @@ -8,8 +8,8 @@ /** * Smarty regex_replace modifier plugin - * Type: modifier<br> - * Name: regex_replace<br> + * Type: modifier + * Name: regex_replace * Purpose: regular expression search/replace * * @link http://smarty.php.net/manual/en/language.modifier.regex.replace.php diff --git a/vendor/smarty/smarty/libs/plugins/modifier.replace.php b/vendor/smarty/smarty/libs/plugins/modifier.replace.php index 9dca259d5..a1b043b64 100644 --- a/vendor/smarty/smarty/libs/plugins/modifier.replace.php +++ b/vendor/smarty/smarty/libs/plugins/modifier.replace.php @@ -8,8 +8,8 @@ /** * Smarty replace modifier plugin - * Type: modifier<br> - * Name: replace<br> + * Type: modifier + * Name: replace * Purpose: simple search/replace * * @link http://smarty.php.net/manual/en/language.modifier.replace.php replace (Smarty online manual) @@ -24,11 +24,15 @@ */ function smarty_modifier_replace($string, $search, $replace) { + static $is_loaded = false; if (Smarty::$_MBSTRING) { - if (!is_callable('smarty_mb_str_replace')) { - require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'); + if (!$is_loaded) { + if (!is_callable('smarty_mb_str_replace')) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'); + } + $is_loaded = true; } - return smarty_mb_str_replace($search, $replace, $string); + return smarty_mb_str_replace($search, $replace, $string); } return str_replace($search, $replace, $string); diff --git a/vendor/smarty/smarty/libs/plugins/modifier.spacify.php b/vendor/smarty/smarty/libs/plugins/modifier.spacify.php index e5c41ad8b..1e29fd553 100644 --- a/vendor/smarty/smarty/libs/plugins/modifier.spacify.php +++ b/vendor/smarty/smarty/libs/plugins/modifier.spacify.php @@ -8,8 +8,8 @@ /** * Smarty spacify modifier plugin - * Type: modifier<br> - * Name: spacify<br> + * Type: modifier + * Name: spacify * Purpose: add spaces between characters in a string * * @link http://smarty.php.net/manual/en/language.modifier.spacify.php spacify (Smarty online manual) diff --git a/vendor/smarty/smarty/libs/plugins/modifier.truncate.php b/vendor/smarty/smarty/libs/plugins/modifier.truncate.php index 6fe844259..bb9df92d7 100644 --- a/vendor/smarty/smarty/libs/plugins/modifier.truncate.php +++ b/vendor/smarty/smarty/libs/plugins/modifier.truncate.php @@ -8,8 +8,8 @@ /** * Smarty truncate modifier plugin - * Type: modifier<br> - * Name: truncate<br> + * Type: modifier + * Name: truncate * Purpose: Truncate a string to a certain length if necessary, * optionally splitting in the middle of a word, and * appending the $etc string or inserting $etc into the middle. @@ -27,7 +27,7 @@ */ function smarty_modifier_truncate($string, $length = 80, $etc = '...', $break_words = false, $middle = false) { - if ($length == 0) { + if ($length === 0) { return ''; } diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.cat.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.cat.php index db9d81fbf..919b03c39 100644 --- a/vendor/smarty/smarty/libs/plugins/modifiercompiler.cat.php +++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.cat.php @@ -8,11 +8,11 @@ /** * Smarty cat modifier plugin - * Type: modifier<br> - * Name: cat<br> - * Date: Feb 24, 2003<br> - * Purpose: catenate a value to a variable<br> - * Input: string to catenate<br> + * Type: modifier + * Name: cat + * Date: Feb 24, 2003 + * Purpose: catenate a value to a variable + * Input: string to catenate * Example: {$var|cat:"foo"} * * @link http://smarty.php.net/manual/en/language.modifier.cat.php cat diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_characters.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_characters.php index 0a3ce257b..8116aa327 100644 --- a/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_characters.php +++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_characters.php @@ -8,8 +8,8 @@ /** * Smarty count_characters modifier plugin - * Type: modifier<br> - * Name: count_characteres<br> + * Type: modifier + * Name: count_characters * Purpose: count the number of characters in a text * * @link http://www.smarty.net/manual/en/language.modifier.count.characters.php count_characters (Smarty online manual) @@ -21,7 +21,7 @@ */ function smarty_modifiercompiler_count_characters($params) { - if (!isset($params[ 1 ]) || $params[ 1 ] != 'true') { + if (!isset($params[ 1 ]) || $params[ 1 ] !== 'true') { return 'preg_match_all(\'/[^\s]/' . Smarty::$_UTF8_MODIFIER . '\',' . $params[ 0 ] . ', $tmp)'; } if (Smarty::$_MBSTRING) { diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_paragraphs.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_paragraphs.php index f7f447763..1917d290a 100644 --- a/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_paragraphs.php +++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_paragraphs.php @@ -8,8 +8,8 @@ /** * Smarty count_paragraphs modifier plugin - * Type: modifier<br> - * Name: count_paragraphs<br> + * Type: modifier + * Name: count_paragraphs * Purpose: count the number of paragraphs in a text * * @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_sentences.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_sentences.php index 20032925e..a782d8e0b 100644 --- a/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_sentences.php +++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_sentences.php @@ -8,7 +8,7 @@ /** * Smarty count_sentences modifier plugin - * Type: modifier<br> + * Type: modifier * Name: count_sentences * Purpose: count the number of sentences in a text * diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_words.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_words.php index f20a197cd..dc8500c75 100644 --- a/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_words.php +++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_words.php @@ -8,8 +8,8 @@ /** * Smarty count_words modifier plugin - * Type: modifier<br> - * Name: count_words<br> + * Type: modifier + * Name: count_words * Purpose: count the number of words in a text * * @link http://www.smarty.net/manual/en/language.modifier.count.words.php count_words (Smarty online manual) diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.default.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.default.php index 2c4c00a37..9fe5d4da2 100644 --- a/vendor/smarty/smarty/libs/plugins/modifiercompiler.default.php +++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.default.php @@ -8,8 +8,8 @@ /** * Smarty default modifier plugin - * Type: modifier<br> - * Name: default<br> + * Type: modifier + * Name: default * Purpose: designate default value for empty variables * * @link http://www.smarty.net/manual/en/language.modifier.default.php default (Smarty online manual) diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.escape.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.escape.php index 11565c2d9..6a6e01637 100644 --- a/vendor/smarty/smarty/libs/plugins/modifiercompiler.escape.php +++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.escape.php @@ -5,27 +5,27 @@ * @package Smarty * @subpackage PluginsModifierCompiler */ - /** * Smarty escape modifier plugin - * Type: modifier<br> - * Name: escape<br> + * Type: modifier + * Name: escape * Purpose: escape string for output * * @link http://www.smarty.net/docsv2/en/language.modifier.escape count_characters (Smarty online manual) * @author Rodney Rehm * - * @param array $params parameters - * @param $compiler + * @param array $params parameters + * @param Smarty_Internal_TemplateCompilerBase $compiler * * @return string with compiled code + * @throws \SmartyException */ -function smarty_modifiercompiler_escape($params, $compiler) +function smarty_modifiercompiler_escape($params, Smarty_Internal_TemplateCompilerBase $compiler) { static $_double_encode = null; - if (!is_callable('smarty_literal_compiler_param')) { - require_once(SMARTY_PLUGINS_DIR . 'shared.literal_compiler_param.php'); - } + static $is_loaded = false; + $compiler->template->_checkPlugins(array(array('function' => 'smarty_literal_compiler_param', + 'file' => SMARTY_PLUGINS_DIR . 'shared.literal_compiler_param.php'))); if ($_double_encode === null) { $_double_encode = version_compare(PHP_VERSION, '5.2.3', '>='); } @@ -100,14 +100,14 @@ function smarty_modifiercompiler_escape($params, $compiler) // could not optimize |escape call, so fallback to regular plugin if ($compiler->template->caching && ($compiler->tag_nocache | $compiler->nocache)) { - $compiler->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ 'escape' ][ 'modifier' ][ 'file' ] = + $compiler->required_plugins[ 'nocache' ][ 'escape' ][ 'modifier' ][ 'file' ] = SMARTY_PLUGINS_DIR . 'modifier.escape.php'; - $compiler->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ 'escape' ][ 'modifier' ][ 'function' ] = + $compiler->required_plugins[ 'nocache' ][ 'escape' ][ 'modifier' ][ 'function' ] = 'smarty_modifier_escape'; } else { - $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ 'escape' ][ 'modifier' ][ 'file' ] = + $compiler->required_plugins[ 'compiled' ][ 'escape' ][ 'modifier' ][ 'file' ] = SMARTY_PLUGINS_DIR . 'modifier.escape.php'; - $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ 'escape' ][ 'modifier' ][ 'function' ] = + $compiler->required_plugins[ 'compiled' ][ 'escape' ][ 'modifier' ][ 'function' ] = 'smarty_modifier_escape'; } diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.from_charset.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.from_charset.php index e25a95749..b5732db42 100644 --- a/vendor/smarty/smarty/libs/plugins/modifiercompiler.from_charset.php +++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.from_charset.php @@ -8,8 +8,8 @@ /** * Smarty from_charset modifier plugin - * Type: modifier<br> - * Name: from_charset<br> + * Type: modifier + * Name: from_charset * Purpose: convert character encoding from $charset to internal encoding * * @author Rodney Rehm diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.indent.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.indent.php index 851f18448..fede8aa74 100644 --- a/vendor/smarty/smarty/libs/plugins/modifiercompiler.indent.php +++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.indent.php @@ -8,8 +8,8 @@ /** * Smarty indent modifier plugin - * Type: modifier<br> - * Name: indent<br> + * Type: modifier + * Name: indent * Purpose: indent lines of text * * @link http://www.smarty.net/manual/en/language.modifier.indent.php indent (Smarty online manual) diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.lower.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.lower.php index a335eff7f..8c6c26a89 100644 --- a/vendor/smarty/smarty/libs/plugins/modifiercompiler.lower.php +++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.lower.php @@ -8,8 +8,8 @@ /** * Smarty lower modifier plugin - * Type: modifier<br> - * Name: lower<br> + * Type: modifier + * Name: lower * Purpose: convert string to lowercase * * @link http://www.smarty.net/manual/en/language.modifier.lower.php lower (Smarty online manual) diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.noprint.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.noprint.php index 4906908b4..455cfe14b 100644 --- a/vendor/smarty/smarty/libs/plugins/modifiercompiler.noprint.php +++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.noprint.php @@ -8,8 +8,8 @@ /** * Smarty noprint modifier plugin - * Type: modifier<br> - * Name: noprint<br> + * Type: modifier + * Name: noprint * Purpose: return an empty string * * @author Uwe Tews diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.string_format.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.string_format.php index bcf9883db..8d3bfa4e2 100644 --- a/vendor/smarty/smarty/libs/plugins/modifiercompiler.string_format.php +++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.string_format.php @@ -8,8 +8,8 @@ /** * Smarty string_format modifier plugin - * Type: modifier<br> - * Name: string_format<br> + * Type: modifier + * Name: string_format * Purpose: format strings via sprintf * * @link http://www.smarty.net/manual/en/language.modifier.string.format.php string_format (Smarty online manual) diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.strip.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.strip.php index 8173eed8f..3b7ade5ed 100644 --- a/vendor/smarty/smarty/libs/plugins/modifiercompiler.strip.php +++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.strip.php @@ -8,11 +8,11 @@ /** * Smarty strip modifier plugin - * Type: modifier<br> - * Name: strip<br> + * Type: modifier + * Name: strip * Purpose: Replace all repeated spaces, newlines, tabs - * with a single space or supplied replacement string.<br> - * Example: {$var|strip} {$var|strip:" "}<br> + * with a single space or supplied replacement string. + * Example: {$var|strip} {$var|strip:" "} * Date: September 25th, 2002 * * @link http://www.smarty.net/manual/en/language.modifier.strip.php strip (Smarty online manual) diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.strip_tags.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.strip_tags.php index e56bf9315..5ddca7a94 100644 --- a/vendor/smarty/smarty/libs/plugins/modifiercompiler.strip_tags.php +++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.strip_tags.php @@ -8,8 +8,8 @@ /** * Smarty strip_tags modifier plugin - * Type: modifier<br> - * Name: strip_tags<br> + * Type: modifier + * Name: strip_tags * Purpose: strip html tags from text * * @link http://www.smarty.net/docs/en/language.modifier.strip.tags.tpl strip_tags (Smarty online manual) @@ -21,7 +21,7 @@ */ function smarty_modifiercompiler_strip_tags($params) { - if (!isset($params[ 1 ]) || $params[ 1 ] === true || trim($params[ 1 ], '"') == 'true') { + if (!isset($params[ 1 ]) || $params[ 1 ] === true || trim($params[ 1 ], '"') === 'true') { return "preg_replace('!<[^>]*?>!', ' ', {$params[0]})"; } else { return 'strip_tags(' . $params[ 0 ] . ')'; diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.to_charset.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.to_charset.php index fea8d8273..889005712 100644 --- a/vendor/smarty/smarty/libs/plugins/modifiercompiler.to_charset.php +++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.to_charset.php @@ -8,8 +8,8 @@ /** * Smarty to_charset modifier plugin - * Type: modifier<br> - * Name: to_charset<br> + * Type: modifier + * Name: to_charset * Purpose: convert character encoding from internal encoding to $charset * * @author Rodney Rehm diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.unescape.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.unescape.php index a3409bc73..5a94e0727 100644 --- a/vendor/smarty/smarty/libs/plugins/modifiercompiler.unescape.php +++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.unescape.php @@ -8,8 +8,8 @@ /** * Smarty unescape modifier plugin - * Type: modifier<br> - * Name: unescape<br> + * Type: modifier + * Name: unescape * Purpose: unescape html entities * * @author Rodney Rehm @@ -26,7 +26,7 @@ function smarty_modifiercompiler_unescape($params) if (!isset($params[ 2 ])) { $params[ 2 ] = '\'' . addslashes(Smarty::$_CHARSET) . '\''; } else { - $params[ 2 ] = "'" . $params[ 2 ] . "'"; + $params[ 2 ] = "'{$params[ 2 ]}'"; } switch (trim($params[ 1 ], '"\'')) { diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.upper.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.upper.php index a083c4f7e..d0d5cc7c3 100644 --- a/vendor/smarty/smarty/libs/plugins/modifiercompiler.upper.php +++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.upper.php @@ -8,8 +8,8 @@ /** * Smarty upper modifier plugin - * Type: modifier<br> - * Name: lower<br> + * Type: modifier + * Name: lower * Purpose: convert string to uppercase * * @link http://smarty.php.net/manual/en/language.modifier.upper.php lower (Smarty online manual) diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.wordwrap.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.wordwrap.php index 91849738e..94a0cf602 100644 --- a/vendor/smarty/smarty/libs/plugins/modifiercompiler.wordwrap.php +++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.wordwrap.php @@ -5,22 +5,22 @@ * @package Smarty * @subpackage PluginsModifierCompiler */ - /** * Smarty wordwrap modifier plugin - * Type: modifier<br> - * Name: wordwrap<br> + * Type: modifier + * Name: wordwrap * Purpose: wrap a string of text at a given length * * @link http://smarty.php.net/manual/en/language.modifier.wordwrap.php wordwrap (Smarty online manual) * @author Uwe Tews * - * @param array $params parameters - * @param $compiler + * @param array $params parameters + * @param \Smarty_Internal_TemplateCompilerBase $compiler * * @return string with compiled code + * @throws \SmartyException */ -function smarty_modifiercompiler_wordwrap($params, $compiler) +function smarty_modifiercompiler_wordwrap($params, Smarty_Internal_TemplateCompilerBase $compiler) { if (!isset($params[ 1 ])) { $params[ 1 ] = 80; @@ -33,19 +33,7 @@ function smarty_modifiercompiler_wordwrap($params, $compiler) } $function = 'wordwrap'; if (Smarty::$_MBSTRING) { - if ($compiler->template->caching && ($compiler->tag_nocache | $compiler->nocache)) { - $compiler->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ 'wordwrap' ][ 'modifier' ][ 'file' ] = - SMARTY_PLUGINS_DIR . 'shared.mb_wordwrap.php'; - $compiler->template->required_plugins[ 'nocache' ][ 'wordwrap' ][ 'modifier' ][ 'function' ] = - 'smarty_mb_wordwrap'; - } else { - $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ 'wordwrap' ][ 'modifier' ][ 'file' ] = - SMARTY_PLUGINS_DIR . 'shared.mb_wordwrap.php'; - $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ 'wordwrap' ][ 'modifier' ][ 'function' ] = - 'smarty_mb_wordwrap'; - } - $function = 'smarty_mb_wordwrap'; + $function = $compiler->getPlugin('mb_wordwrap','modifier'); } - return $function . '(' . $params[ 0 ] . ',' . $params[ 1 ] . ',' . $params[ 2 ] . ',' . $params[ 3 ] . ')'; } diff --git a/vendor/smarty/smarty/libs/plugins/outputfilter.trimwhitespace.php b/vendor/smarty/smarty/libs/plugins/outputfilter.trimwhitespace.php index 1a67123a4..70a66d3da 100644 --- a/vendor/smarty/smarty/libs/plugins/outputfilter.trimwhitespace.php +++ b/vendor/smarty/smarty/libs/plugins/outputfilter.trimwhitespace.php @@ -24,7 +24,7 @@ function smarty_outputfilter_trimwhitespace($source) $_offset = 0; // Unify Line-Breaks to \n - $source = preg_replace("/\015\012|\015|\012/", "\n", $source); + $source = preg_replace('/\015\012|\015|\012/', "\n", $source); // capture Internet Explorer and KnockoutJS Conditional Comments if (preg_match_all('#<!--((\[[^\]]+\]>.*?<!\[[^\]]+\])|(\s*/?ko\s+.+))-->#is', $source, $matches, diff --git a/vendor/smarty/smarty/libs/plugins/shared.escape_special_chars.php b/vendor/smarty/smarty/libs/plugins/shared.escape_special_chars.php index b68fe4b9d..1d4c7284b 100644 --- a/vendor/smarty/smarty/libs/plugins/shared.escape_special_chars.php +++ b/vendor/smarty/smarty/libs/plugins/shared.escape_special_chars.php @@ -8,7 +8,7 @@ /** * escape_special_chars common function - * Function: smarty_function_escape_special_chars<br> + * Function: smarty_function_escape_special_chars * Purpose: used by other smarty functions to escape * special chars except for already escaped ones * diff --git a/vendor/smarty/smarty/libs/plugins/shared.make_timestamp.php b/vendor/smarty/smarty/libs/plugins/shared.make_timestamp.php index 67f862441..eb064607d 100644 --- a/vendor/smarty/smarty/libs/plugins/shared.make_timestamp.php +++ b/vendor/smarty/smarty/libs/plugins/shared.make_timestamp.php @@ -7,7 +7,7 @@ */ /** - * Function: smarty_make_timestamp<br> + * Function: smarty_make_timestamp * Purpose: used by other smarty functions to make a timestamp from a string. * * @author Monte Ohrt <monte at ohrt dot com> @@ -25,7 +25,7 @@ function smarty_make_timestamp($string) (interface_exists('DateTimeInterface', false) && $string instanceof DateTimeInterface) ) { return (int) $string->format('U'); // PHP 5.2 BC - } elseif (strlen($string) == 14 && ctype_digit($string)) { + } elseif (strlen($string) === 14 && ctype_digit($string)) { // it is mysql timestamp format of YYYYMMDDHHMMSS? return mktime(substr($string, 8, 2), substr($string, 10, 2), substr($string, 12, 2), substr($string, 4, 2), substr($string, 6, 2), substr($string, 0, 4)); @@ -35,7 +35,7 @@ function smarty_make_timestamp($string) } else { // strtotime should handle it $time = strtotime($string); - if ($time == - 1 || $time === false) { + if ($time === - 1 || $time === false) { // strtotime() was not able to parse $string, use "now": return time(); } diff --git a/vendor/smarty/smarty/libs/plugins/shared.mb_str_replace.php b/vendor/smarty/smarty/libs/plugins/shared.mb_str_replace.php index 0c3ffe258..300702933 100644 --- a/vendor/smarty/smarty/libs/plugins/shared.mb_str_replace.php +++ b/vendor/smarty/smarty/libs/plugins/shared.mb_str_replace.php @@ -6,14 +6,13 @@ * @subpackage PluginsShared */ if (!function_exists('smarty_mb_str_replace')) { - /** * Multibyte string replace * - * @param string $search the string to be searched - * @param string $replace the replacement string - * @param string $subject the source string - * @param int &$count number of matches found + * @param string|string[] $search the string to be searched + * @param string|string[] $replace the replacement string + * @param string $subject the source string + * @param int &$count number of matches found * * @return string replaced string * @author Rodney Rehm @@ -29,7 +28,7 @@ if (!function_exists('smarty_mb_str_replace')) { $string = smarty_mb_str_replace($search, $replace, $string, $c); $count += $c; } - } elseif (is_array($search)) { + } else if (is_array($search)) { if (!is_array($replace)) { foreach ($search as &$string) { $subject = smarty_mb_str_replace($string, $replace, $subject, $c); @@ -37,7 +36,7 @@ if (!function_exists('smarty_mb_str_replace')) { } } else { $n = max(count($search), count($replace)); - while ($n --) { + while ($n--) { $subject = smarty_mb_str_replace(current($search), current($replace), $subject, $c); $count += $c; next($search); @@ -49,7 +48,6 @@ if (!function_exists('smarty_mb_str_replace')) { $count = count($parts) - 1; $subject = implode($replace, $parts); } - return $subject; } } diff --git a/vendor/smarty/smarty/libs/plugins/shared.mb_unicode.php b/vendor/smarty/smarty/libs/plugins/shared.mb_unicode.php index 0f790b56a..7450148a4 100644 --- a/vendor/smarty/smarty/libs/plugins/shared.mb_unicode.php +++ b/vendor/smarty/smarty/libs/plugins/shared.mb_unicode.php @@ -20,12 +20,12 @@ function smarty_mb_to_unicode($string, $encoding = null) { if ($encoding) { - $expanded = mb_convert_encoding($string, "UTF-32BE", $encoding); + $expanded = mb_convert_encoding($string, 'UTF-32BE', $encoding); } else { - $expanded = mb_convert_encoding($string, "UTF-32BE"); + $expanded = mb_convert_encoding($string, 'UTF-32BE'); } - return unpack("N*", $expanded); + return unpack('N*', $expanded); } /** @@ -46,8 +46,8 @@ function smarty_mb_from_unicode($unicode, $encoding = null) $encoding = mb_internal_encoding(); } foreach ((array) $unicode as $utf32be) { - $character = pack("N*", $utf32be); - $t .= mb_convert_encoding($character, $encoding, "UTF-32BE"); + $character = pack('N*', $utf32be); + $t .= mb_convert_encoding($character, $encoding, 'UTF-32BE'); } return $t; diff --git a/vendor/smarty/smarty/libs/plugins/shared.mb_wordwrap.php b/vendor/smarty/smarty/libs/plugins/shared.mb_wordwrap.php deleted file mode 100644 index 21632a1c0..000000000 --- a/vendor/smarty/smarty/libs/plugins/shared.mb_wordwrap.php +++ /dev/null @@ -1,75 +0,0 @@ -<?php -/** - * Smarty shared plugin - * - * @package Smarty - * @subpackage PluginsShared - */ - -if (!function_exists('smarty_mb_wordwrap')) { - - /** - * Wrap a string to a given number of characters - * - * @link http://php.net/manual/en/function.wordwrap.php for similarity - * - * @param string $str the string to wrap - * @param int $width the width of the output - * @param string $break the character used to break the line - * @param boolean $cut ignored parameter, just for the sake of - * - * @return string wrapped string - * @author Rodney Rehm - */ - function smarty_mb_wordwrap($str, $width = 75, $break = "\n", $cut = false) - { - // break words into tokens using white space as a delimiter - $tokens = - preg_split('!(\s)!S' . Smarty::$_UTF8_MODIFIER, $str, - 1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE); - $length = 0; - $t = ''; - $_previous = false; - $_space = false; - - foreach ($tokens as $_token) { - $token_length = mb_strlen($_token, Smarty::$_CHARSET); - $_tokens = array($_token); - if ($token_length > $width) { - if ($cut) { - $_tokens = preg_split('!(.{' . $width . '})!S' . Smarty::$_UTF8_MODIFIER, $_token, - 1, - PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE); - } - } - - foreach ($_tokens as $token) { - $_space = !!preg_match('!^\s$!S' . Smarty::$_UTF8_MODIFIER, $token); - $token_length = mb_strlen($token, Smarty::$_CHARSET); - $length += $token_length; - - if ($length > $width) { - // remove space before inserted break - if ($_previous) { - $t = mb_substr($t, 0, - 1, Smarty::$_CHARSET); - } - - if (!$_space) { - // add the break before the token - if (!empty($t)) { - $t .= $break; - } - $length = $token_length; - } - } elseif ($token == "\n") { - // hard break must reset counters - $_previous = 0; - $length = 0; - } - $_previous = $_space; - // add the token - $t .= $token; - } - } - - return $t; - } -} diff --git a/vendor/smarty/smarty/libs/plugins/variablefilter.htmlspecialchars.php b/vendor/smarty/smarty/libs/plugins/variablefilter.htmlspecialchars.php index aecd1e7e7..3c85295db 100644 --- a/vendor/smarty/smarty/libs/plugins/variablefilter.htmlspecialchars.php +++ b/vendor/smarty/smarty/libs/plugins/variablefilter.htmlspecialchars.php @@ -5,15 +5,15 @@ * @package Smarty * @subpackage PluginsFilter */ - /** * Smarty htmlspecialchars variablefilter plugin * - * @param string $source input string + * @param string $source input string + * @param \Smarty_Internal_Template $template * * @return string filtered output */ -function smarty_variablefilter_htmlspecialchars($source) +function smarty_variablefilter_htmlspecialchars($source, Smarty_Internal_Template $template) { return htmlspecialchars($source, ENT_QUOTES, Smarty::$_CHARSET); } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_cacheresource_custom.php b/vendor/smarty/smarty/libs/sysplugins/smarty_cacheresource_custom.php index 8f1290e49..7a5920f43 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_cacheresource_custom.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_cacheresource_custom.php @@ -138,7 +138,7 @@ abstract class Smarty_CacheResource_Custom extends Smarty_CacheResource $_smarty_tpl->compile_id, $content, $timestamp); } if (isset($content)) { - eval("?>" . $content); + eval('?>' . $content); $cached->content = null; return true; } @@ -204,7 +204,8 @@ abstract class Smarty_CacheResource_Custom extends Smarty_CacheResource * @param string $compile_id compile id * @param integer $exp_time expiration time (number of seconds, not timestamp) * - * @return integer number of cache files deleted + * @return int number of cache files deleted + * @throws \SmartyException */ public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time) { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php b/vendor/smarty/smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php index bab1b5c09..ff065a278 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php @@ -104,7 +104,7 @@ abstract class Smarty_CacheResource_KeyValueStore extends Smarty_CacheResource } } if (isset($content)) { - eval("?>" . $content); + eval('?>' . $content); return true; } @@ -180,7 +180,8 @@ abstract class Smarty_CacheResource_KeyValueStore extends Smarty_CacheResource * @param string $compile_id compile id * @param integer $exp_time expiration time [being ignored] * - * @return integer number of cache files deleted [always -1] + * @return int number of cache files deleted [always -1] + * @throws \SmartyException * @uses buildCachedFilepath() to generate the CacheID * @uses invalidate() to mark CacheIDs parent chain as outdated * @uses delete() to remove CacheID from cache @@ -272,8 +273,8 @@ abstract class Smarty_CacheResource_KeyValueStore extends Smarty_CacheResource */ protected function addMetaTimestamp(&$content) { - $mt = explode(" ", microtime()); - $ts = pack("NN", $mt[ 1 ], (int) ($mt[ 0 ] * 100000000)); + $mt = explode(' ', microtime()); + $ts = pack('NN', $mt[ 1 ], (int) ($mt[ 0 ] * 100000000)); $content = $ts . $content; } @@ -370,7 +371,7 @@ abstract class Smarty_CacheResource_KeyValueStore extends Smarty_CacheResource /** * Translate a CacheID into the list of applicable InvalidationKeys. - * Splits "some|chain|into|an|array" into array( '#clearAll#', 'some', 'some|chain', 'some|chain|into', ... ) + * Splits 'some|chain|into|an|array' into array( '#clearAll#', 'some', 'some|chain', 'some|chain|into', ... ) * * @param string $cid CacheID to translate * @param string $resource_name template name diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_data.php b/vendor/smarty/smarty/libs/sysplugins/smarty_data.php index b9f5de9a5..743b117bf 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_data.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_data.php @@ -61,8 +61,8 @@ class Smarty_Data extends Smarty_Internal_Data foreach ($_parent as $_key => $_val) { $this->tpl_vars[ $_key ] = new Smarty_Variable($_val); } - } elseif ($_parent != null) { - throw new SmartyException("Wrong type for template variables"); + } elseif ($_parent !== null) { + throw new SmartyException('Wrong type for template variables'); } } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_block.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_block.php index a33ad1b11..780319f11 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_block.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_block.php @@ -38,7 +38,7 @@ class Smarty_Internal_Block public $prepend = false; /** - * Block calls {$smarty.block.child} + * Block calls $smarty.block.child * * @var bool */ @@ -67,7 +67,7 @@ class Smarty_Internal_Block /** * Smarty_Internal_Block constructor. - * - if outer level {block} of child template ($state == 1) save it as child root block + * - if outer level {block} of child template ($state === 1) save it as child root block * - otherwise process inheritance and render * * @param string $name block name diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_cacheresource_file.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_cacheresource_file.php index 7df4ddffb..f6ef09306 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_cacheresource_file.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_cacheresource_file.php @@ -7,7 +7,6 @@ * @author Uwe Tews * @author Rodney Rehm */ - /** * This class does contain all necessary methods for the HTML cache on file system * Implements the file system as resource for the HTML cache Version ussing nocache inserts. @@ -29,11 +28,14 @@ class Smarty_Internal_CacheResource_File extends Smarty_CacheResource { $source = &$_template->source; $smarty = &$_template->smarty; - $_compile_dir_sep = $smarty->use_sub_dirs ? $smarty->ds : '^'; + $_compile_dir_sep = $smarty->use_sub_dirs ? DIRECTORY_SEPARATOR : '^'; $_filepath = sha1($source->uid . $smarty->_joined_template_dir); $cached->filepath = $smarty->getCacheDir(); if (isset($_template->cache_id)) { - $cached->filepath .= preg_replace(array('![^\w|]+!', '![|]+!'), array('_', $_compile_dir_sep), + $cached->filepath .= preg_replace(array('![^\w|]+!', + '![|]+!'), + array('_', + $_compile_dir_sep), $_template->cache_id) . $_compile_dir_sep; } if (isset($_template->compile_id)) { @@ -41,8 +43,10 @@ class Smarty_Internal_CacheResource_File extends Smarty_CacheResource } // if use_sub_dirs, break file into directories if ($smarty->use_sub_dirs) { - $cached->filepath .= $_filepath[ 0 ] . $_filepath[ 1 ] . $smarty->ds . $_filepath[ 2 ] . $_filepath[ 3 ] . $smarty->ds . - $_filepath[ 4 ] . $_filepath[ 5 ] . $smarty->ds; + $cached->filepath .= $_filepath[ 0 ] . $_filepath[ 1 ] . DIRECTORY_SEPARATOR . $_filepath[ 2 ] . + $_filepath[ 3 ] . + DIRECTORY_SEPARATOR . + $_filepath[ 4 ] . $_filepath[ 5 ] . DIRECTORY_SEPARATOR; } $cached->filepath .= $_filepath; $basename = $source->handler->getBasename($source); @@ -83,12 +87,13 @@ class Smarty_Internal_CacheResource_File extends Smarty_CacheResource * * @return boolean true or false if the cached content does not exist */ - public function process(Smarty_Internal_Template $_smarty_tpl, Smarty_Template_Cached $cached = null, + public function process(Smarty_Internal_Template $_smarty_tpl, + Smarty_Template_Cached $cached = null, $update = false) { $_smarty_tpl->cached->valid = false; if ($update && defined('HHVM_VERSION')) { - eval("?>" . file_get_contents($_smarty_tpl->cached->filepath)); + eval('?>' . file_get_contents($_smarty_tpl->cached->filepath)); return true; } else { return @include $_smarty_tpl->cached->filepath; @@ -101,16 +106,20 @@ class Smarty_Internal_CacheResource_File extends Smarty_CacheResource * @param Smarty_Internal_Template $_template template object * @param string $content content to cache * - * @return boolean success + * @return bool success + * @throws \SmartyException */ public function writeCachedContent(Smarty_Internal_Template $_template, $content) { - if ($_template->smarty->ext->_writeFile->writeFile($_template->cached->filepath, $content, + if ($_template->smarty->ext->_writeFile->writeFile($_template->cached->filepath, + $content, $_template->smarty) === true ) { - if (function_exists('opcache_invalidate') && strlen(ini_get("opcache.restrict_api")) < 1) { + if (function_exists('opcache_invalidate') && + (!function_exists('ini_get') || strlen(ini_get('opcache.restrict_api'))) < 1 + ) { opcache_invalidate($_template->cached->filepath, true); - } elseif (function_exists('apc_compile_file')) { + } else if (function_exists('apc_compile_file')) { apc_compile_file($_template->cached->filepath); } $cached = $_template->cached; diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_append.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_append.php index 8539d6b2a..b3689e918 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_append.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_append.php @@ -24,6 +24,7 @@ class Smarty_Internal_Compile_Append extends Smarty_Internal_Compile_Assign * @param array $parameter array with compilation parameter * * @return string compiled code + * @throws \SmartyCompilerException */ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_assign.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_assign.php index 3bd33847b..cb2ea4257 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_assign.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_assign.php @@ -71,7 +71,7 @@ class Smarty_Internal_Compile_Assign extends Smarty_Internal_CompileBase $_scope = $compiler->convertScope($_attr, $this->valid_scopes); } // optional parameter - $_params = ""; + $_params = ''; if ($_nocache || $_scope) { $_params .= ' ,' . var_export($_nocache, true); } @@ -85,9 +85,9 @@ class Smarty_Internal_Compile_Assign extends Smarty_Internal_CompileBase $output .= "settype(\$_tmp_array, 'array');\n"; $output .= "}\n"; $output .= "\$_tmp_array{$parameter['smarty_internal_index']} = {$_attr['value']};\n"; - $output .= "\$_smarty_tpl->_assignInScope({$_var}, \$_tmp_array{$_params});\n?>"; + $output .= "\$_smarty_tpl->_assignInScope({$_var}, \$_tmp_array{$_params});?>"; } else { - $output = "<?php \$_smarty_tpl->_assignInScope({$_var}, {$_attr['value']}{$_params});\n?>"; + $output = "<?php \$_smarty_tpl->_assignInScope({$_var}, {$_attr['value']}{$_params});?>"; } return $output; } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block.php index 5098d62fe..88d6f37e9 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block.php @@ -22,7 +22,6 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_Compile_Shared_Inher * @see Smarty_Internal_CompileBase */ public $required_attributes = array('name'); - /** * Attribute definition: Overwrites base class. * @@ -30,7 +29,6 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_Compile_Shared_Inher * @see Smarty_Internal_CompileBase */ public $shorttag_order = array('name'); - /** * Attribute definition: Overwrites base class. * @@ -38,7 +36,6 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_Compile_Shared_Inher * @see Smarty_Internal_CompileBase */ public $option_flags = array('hide', 'nocache'); - /** * Attribute definition: Overwrites base class. * @@ -48,27 +45,19 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_Compile_Shared_Inher public $optional_attributes = array('assign'); /** - * Saved compiler object - * - * @var Smarty_Internal_TemplateCompilerBase - */ - public $compiler = null; - - /** * Compiles code for the {block} tag * * @param array $args array with attributes from parser * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object * @param array $parameter array with compilation parameter * - * @return bool true */ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) { if (!isset($compiler->_cache[ 'blockNesting' ])) { $compiler->_cache[ 'blockNesting' ] = 0; } - if ($compiler->_cache[ 'blockNesting' ] == 0) { + if ($compiler->_cache[ 'blockNesting' ] === 0) { // make sure that inheritance gets initialized in template code $this->registerInit($compiler); $this->option_flags = array('hide', 'nocache', 'append', 'prepend'); @@ -77,30 +66,24 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_Compile_Shared_Inher } // check and get attributes $_attr = $this->getAttributes($compiler, $args); - $compiler->_cache[ 'blockNesting' ] ++; + ++$compiler->_cache[ 'blockNesting' ]; $_className = 'Block_' . preg_replace('![^\w]+!', '_', uniqid(rand(), true)); $compiler->_cache[ 'blockName' ][ $compiler->_cache[ 'blockNesting' ] ] = $_attr[ 'name' ]; $compiler->_cache[ 'blockClass' ][ $compiler->_cache[ 'blockNesting' ] ] = $_className; $compiler->_cache[ 'blockParams' ][ $compiler->_cache[ 'blockNesting' ] ] = array(); $compiler->_cache[ 'blockParams' ][ 1 ][ 'subBlocks' ][ trim($_attr[ 'name' ], '"\'') ][] = $_className; - $this->openTag($compiler, 'block', array($_attr, $compiler->nocache, $compiler->parser->current_buffer, - $compiler->template->compiled->has_nocache_code, - $compiler->template->caching)); - // must whole block be nocache ? - if ($compiler->tag_nocache) { - $i = 0; - } + $this->openTag($compiler, + 'block', + array($_attr, $compiler->nocache, $compiler->parser->current_buffer, + $compiler->template->compiled->has_nocache_code, + $compiler->template->caching)); + $compiler->saveRequiredPlugins(true); $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; - // $compiler->suppressNocacheProcessing = true; - if ($_attr[ 'nocache' ] === true) { - //$compiler->trigger_template_error('nocache option not allowed', $compiler->parser->lex->taglineno); - } $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template(); $compiler->template->compiled->has_nocache_code = false; $compiler->suppressNocacheProcessing = true; } } - /** * Smarty Internal Plugin Compile BlockClose Class * @@ -126,7 +109,7 @@ class Smarty_Internal_Compile_Blockclose extends Smarty_Internal_Compile_Shared_ $_assign = isset($_attr[ 'assign' ]) ? $_attr[ 'assign' ] : null; unset($_attr[ 'assign' ], $_attr[ 'name' ]); foreach ($_attr as $name => $stat) { - if ((is_bool($stat) && $stat !== false) || (!is_bool($stat) && $stat != 'false')) { + if ((is_bool($stat) && $stat !== false) || (!is_bool($stat) && $stat !== 'false')) { $_block[ $name ] = 'true'; } } @@ -144,7 +127,8 @@ class Smarty_Internal_Compile_Blockclose extends Smarty_Internal_Compile_Shared_ $output .= "public \${$property} = " . var_export($value,true) .";\n"; } $output .= "public function callBlock(Smarty_Internal_Template \$_smarty_tpl) {\n"; - //$output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\n"; + $output .= $compiler->compileRequiredPlugins(); + $compiler->restoreRequiredPlugins(); if ($compiler->template->compiled->has_nocache_code) { $output .= "\$_smarty_tpl->cached->hashes['{$compiler->template->compiled->nocache_hash}'] = true;\n"; } @@ -167,32 +151,22 @@ class Smarty_Internal_Compile_Blockclose extends Smarty_Internal_Compile_Shared_ $compiler->parser->current_buffer->append_subtree($compiler->parser, new Smarty_Internal_ParseTree_Tag($compiler->parser, $output)); - $compiler->blockOrFunctionCode .= $f = $compiler->parser->current_buffer->to_smarty_php($compiler->parser); + $compiler->blockOrFunctionCode .= $compiler->parser->current_buffer->to_smarty_php($compiler->parser); $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template(); - // nocache plugins must be copied - if (!empty($compiler->template->compiled->required_plugins[ 'nocache' ])) { - foreach ($compiler->template->compiled->required_plugins[ 'nocache' ] as $plugin => $tmp) { - foreach ($tmp as $type => $data) { - $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin ][ $type ] = - $data; - } - } - } - // restore old status $compiler->template->compiled->has_nocache_code = $_has_nocache_code; $compiler->tag_nocache = $compiler->nocache; $compiler->nocache = $_nocache; $compiler->parser->current_buffer = $_buffer; $output = "<?php \n"; - if ($compiler->_cache[ 'blockNesting' ] == 1) { + if ($compiler->_cache[ 'blockNesting' ] === 1) { $output .= "\$_smarty_tpl->inheritance->instanceBlock(\$_smarty_tpl, '$_className', $_name);\n"; } else { $output .= "\$_smarty_tpl->inheritance->instanceBlock(\$_smarty_tpl, '$_className', $_name, \$this->tplIndex);\n"; } $output .= "?>\n"; - $compiler->_cache[ 'blockNesting' ] --; - if ($compiler->_cache[ 'blockNesting' ] == 0) { + --$compiler->_cache[ 'blockNesting' ]; + if ($compiler->_cache[ 'blockNesting' ] === 0) { unset($compiler->_cache[ 'blockNesting' ]); } $compiler->has_code = true; diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block_child.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block_child.php index bb070ebe3..1708f6482 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block_child.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block_child.php @@ -9,46 +9,16 @@ */ /** - * Smarty Internal Plugin Compile Block Parent Class + * Smarty Internal Plugin Compile Block Child Class * * @author Uwe Tews <uwe.tews@googlemail.com> */ -class Smarty_Internal_Compile_Block_Child extends Smarty_Internal_CompileBase +class Smarty_Internal_Compile_Block_Child extends Smarty_Internal_Compile_Child { /** - * Attribute definition: Overwrites base class. + * Tag name * - * @var array - * @see Smarty_Internal_CompileBase + * @var string */ - public $option_flags = array(); - - /** - * Saved compiler object - * - * @var Smarty_Internal_TemplateCompilerBase - */ - public $compiler = null; - - /** - * Compiles code for the {block_parent} tag - * - * @param array $args array with attributes from parser - * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object - * @param array $parameter array with compilation parameter - * - * @return bool true - */ - public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) - { - if (!isset($compiler->_cache[ 'blockNesting' ])) { - $compiler->trigger_template_error(' tag {$smarty.block.child} used outside {block} tags ', - $compiler->parser->lex->taglineno); - } - $compiler->has_code = true; - $compiler->suppressNocacheProcessing = true; - $compiler->_cache[ 'blockParams' ][ $compiler->_cache[ 'blockNesting' ] ][ 'callsChild' ] = 'true'; - $output = "<?php \n\$_smarty_tpl->inheritance->callChild(\$_smarty_tpl, \$this);\n?>\n"; - return $output; - } + public $tag = 'block_child'; }
\ No newline at end of file diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block_parent.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block_parent.php index 0ec1e8485..4f094ad61 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block_parent.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block_parent.php @@ -13,61 +13,19 @@ * * @author Uwe Tews <uwe.tews@googlemail.com> */ -class Smarty_Internal_Compile_Block_Parent extends Smarty_Internal_Compile_Shared_Inheritance +class Smarty_Internal_Compile_Block_Parent extends Smarty_Internal_Compile_Child { - - /** - * Attribute definition: Overwrites base class. - * - * @var array - * @see Smarty_Internal_CompileBase - */ - public $optional_attributes = array('name'); - - /** - * Attribute definition: Overwrites base class. - * - * @var array - * @see Smarty_Internal_CompileBase - */ - public $shorttag_order = array('name'); - /** - * Attribute definition: Overwrites base class. + * Tag name * - * @var array - * @see Smarty_Internal_CompileBase + * @var string */ - public $option_flags = array(); + public $tag = 'block_parent'; /** - * Saved compiler object - * - * @var Smarty_Internal_TemplateCompilerBase - */ - public $compiler = null; - - /** - * Compiles code for the {block_parent} tag - * - * @param array $args array with attributes from parser - * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object - * @param array $parameter array with compilation parameter + * Block type * - * @return bool true + * @var string */ - public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) - { - // check and get attributes - $_attr = $this->getAttributes($compiler, $args); - if (!isset($compiler->_cache[ 'blockNesting' ])) { - $compiler->trigger_template_error(' tag {$smarty.block.parent} used outside {block} tags ', - $compiler->parser->lex->taglineno); - } - $compiler->suppressNocacheProcessing = true; - $compiler->has_code = true; - $output = "<?php \n\$_smarty_tpl->inheritance->callParent(\$_smarty_tpl, \$this" . - (isset($_attr[ 'name' ]) ? ", {$_attr[ 'name' ]}" : '') . ");\n?>\n"; - return $output; - } + public $blockType = 'Parent'; }
\ No newline at end of file diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_break.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_break.php index 50157382a..09c25d238 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_break.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_break.php @@ -33,24 +33,34 @@ class Smarty_Internal_Compile_Break extends Smarty_Internal_CompileBase public $shorttag_order = array('levels'); /** + * Tag name may be overloaded by Smarty_Internal_Compile_Continue + * + * @var string + */ + public $tag = 'break'; + + /** * Compiles code for the {break} tag * - * @param array $args array with attributes from parser - * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object - * @param array $parameter array with compilation parameter + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object * * @return string compiled code + * @throws \SmartyCompilerException */ - public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) { list($levels, $foreachLevels) = $this->checkLevels($args, $compiler); - $output = "<?php\n"; - if ($foreachLevels) { + $output = "<?php "; + if ($foreachLevels > 0 && $this->tag === 'continue') { + $foreachLevels--; + } + if ($foreachLevels > 0) { /* @var Smarty_Internal_Compile_Foreach $foreachCompiler */ $foreachCompiler = $compiler->getTagCompiler('foreach'); $output .= $foreachCompiler->compileRestore($foreachLevels); } - $output .= "break {$levels};?>"; + $output .= "{$this->tag} {$levels};?>"; return $output; } @@ -59,12 +69,11 @@ class Smarty_Internal_Compile_Break extends Smarty_Internal_CompileBase * * @param array $args array with attributes from parser * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object - * @param string $tag tag name * * @return array * @throws \SmartyCompilerException */ - public function checkLevels($args, Smarty_Internal_TemplateCompilerBase $compiler, $tag = 'break') + public function checkLevels($args, Smarty_Internal_TemplateCompilerBase $compiler) { static $_is_loopy = array('for' => true, 'foreach' => true, 'while' => true, 'section' => true); // check and get attributes @@ -86,7 +95,7 @@ class Smarty_Internal_Compile_Break extends Smarty_Internal_CompileBase $stack_count = count($compiler->_tag_stack) - 1; $foreachLevels = 0; $lastTag = ''; - while ($level_count >= 0 && $stack_count >= 0) { + while ($level_count > 0 && $stack_count >= 0) { if (isset($_is_loopy[ $compiler->_tag_stack[ $stack_count ][ 0 ] ])) { $lastTag = $compiler->_tag_stack[ $stack_count ][ 0 ]; if ($level_count === 0) { @@ -99,10 +108,10 @@ class Smarty_Internal_Compile_Break extends Smarty_Internal_CompileBase } $stack_count --; } - if ($level_count != 0) { - $compiler->trigger_template_error("cannot {$tag} {$levels} level(s)", null, true); + if ($level_count !== 0) { + $compiler->trigger_template_error("cannot {$this->tag} {$levels} level(s)", null, true); } - if ($lastTag === 'foreach' && $tag === 'break') { + if ($lastTag === 'foreach' && $this->tag === 'break' && $foreachLevels > 0) { $foreachLevels --; } return array($levels, $foreachLevels); diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_call.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_call.php index 739df5eca..eb444d357 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_call.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_call.php @@ -57,7 +57,7 @@ class Smarty_Internal_Compile_Call extends Smarty_Internal_CompileBase // output will be stored in a smarty variable instead of being displayed $_assign = $_attr[ 'assign' ]; } - //$_name = trim($_attr['name'], "'\""); + //$_name = trim($_attr['name'], "''"); $_name = $_attr[ 'name' ]; unset($_attr[ 'name' ], $_attr[ 'assign' ], $_attr[ 'nocache' ]); // set flag (compiled code of {function} must be included in cache file @@ -74,7 +74,7 @@ class Smarty_Internal_Compile_Call extends Smarty_Internal_CompileBase $_paramsArray[] = "'$_key'=>$_value"; } } - $_params = 'array(' . implode(",", $_paramsArray) . ')'; + $_params = 'array(' . implode(',', $_paramsArray) . ')'; //$compiler->suppressNocacheProcessing = true; // was there an assign attribute if (isset($_assign)) { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_capture.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_capture.php index 34fc55f9d..564b1f63e 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_capture.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_capture.php @@ -45,11 +45,11 @@ class Smarty_Internal_Compile_Capture extends Smarty_Internal_CompileBase public static function compileSpecialVariable($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter = null) { $tag = trim($parameter[ 0 ], '"\''); - $name = isset($parameter[ 1 ]) ? $compiler->getId($parameter[ 1 ]) : false; + $name = isset($parameter[ 1 ]) ? $compiler->getId($parameter[ 1 ]) : null; if (!$name) { - $compiler->trigger_template_error("missing or illegal \$smarty.{$tag} name attribute", null, true); + //$compiler->trigger_template_error("missing or illegal \$smarty.{$tag} name attribute", null, true); } - return "\$_smarty_tpl->smarty->ext->_capture->getBuffer(\$_smarty_tpl, '{$name}')"; + return '$_smarty_tpl->smarty->ext->_capture->getBuffer($_smarty_tpl'.(isset($name)?", '{$name}')":')'); } /** diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_child.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_child.php new file mode 100644 index 000000000..8c7bbdf05 --- /dev/null +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_child.php @@ -0,0 +1,77 @@ +<?php +/* + * This file is part of Smarty. + * + * (c) 2015 Uwe Tews + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Smarty Internal Plugin Compile Child Class + * + * @author Uwe Tews <uwe.tews@googlemail.com> + */ +class Smarty_Internal_Compile_Child extends Smarty_Internal_CompileBase +{ + /** + * Attribute definition: Overwrites base class. + * + * @var array + * @see Smarty_Internal_CompileBase + */ + public $optional_attributes = array('assign'); + + /** + * Tag name + * + * @var string + */ + public $tag = 'child'; + + /** + * Block type + * + * @var string + */ + public $blockType = 'Child'; + + /** + * Compiles code for the {child} tag + * + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object + * @param array $parameter array with compilation parameter + * + * @return string compiled code + * @throws \SmartyCompilerException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + { + // check and get attributes + $_attr = $this->getAttributes($compiler, $args); + $tag = isset($parameter[0]) ? "'{$parameter[0]}'" : "'{{$this->tag}}'"; + if (!isset($compiler->_cache[ 'blockNesting' ])) { + $compiler->trigger_template_error("{$tag} used outside {block} tags ", + $compiler->parser->lex->taglineno); + } + $compiler->has_code = true; + $compiler->suppressNocacheProcessing = true; + if ($this->blockType === 'Child') { + $compiler->_cache[ 'blockParams' ][ $compiler->_cache[ 'blockNesting' ] ][ 'callsChild' ] = 'true'; + } + $_assign = isset($_attr[ 'assign' ]) ? $_attr[ 'assign' ] : null; + $output = "<?php \n"; + if (isset($_assign)) { + $output .= "ob_start();\n"; + } + $output .= '$_smarty_tpl->inheritance->call' . $this->blockType . '($_smarty_tpl, $this' . + ($this->blockType === 'Child' ? '' : ", {$tag}"). ");\n"; + if (isset($_assign)) { + $output .= "\$_smarty_tpl->assign({$_assign}, ob_get_clean());\n"; + } + $output .="?>\n"; + return $output; + } +}
\ No newline at end of file diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_continue.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_continue.php index 7492c7df2..19e5d4bee 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_continue.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_continue.php @@ -16,27 +16,10 @@ */ class Smarty_Internal_Compile_Continue extends Smarty_Internal_Compile_Break { - /** - * Compiles code for the {continue} tag - * - * @param array $args array with attributes from parser - * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object - * @param array $parameter array with compilation parameter - * - * @return string compiled code - * @throws \SmartyCompilerException - */ - public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) - { - list($levels, $foreachLevels) = $this->checkLevels($args, $compiler, 'continue'); - $output = "<?php\n"; - if ($foreachLevels > 1) { - /* @var Smarty_Internal_Compile_Foreach $foreachCompiler */ - $foreachCompiler = $compiler->getTagCompiler('foreach'); - $output .= $foreachCompiler->compileRestore($foreachLevels - 1); - } - $output .= "continue {$levels};?>"; - return $output; - } + * Tag name + * + * @var string + */ + public $tag = 'continue'; } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_eval.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_eval.php index 97a3c29c5..550f194e0 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_eval.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_eval.php @@ -58,13 +58,12 @@ class Smarty_Internal_Compile_Eval extends Smarty_Internal_CompileBase } // create template object - $_output = "\$_template = new {$compiler->smarty->template_class}('eval:'." . $_attr[ 'var' ] . - ", \$_smarty_tpl->smarty, \$_smarty_tpl);"; + $_output = "\$_template = new {$compiler->smarty->template_class}('eval:'.{$_attr[ 'var' ]}, \$_smarty_tpl->smarty, \$_smarty_tpl);"; //was there an assign attribute? if (isset($_assign)) { $_output .= "\$_smarty_tpl->assign($_assign,\$_template->fetch());"; } else { - $_output .= "echo \$_template->fetch();"; + $_output .= 'echo $_template->fetch();'; } return "<?php $_output ?>"; diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_extends.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_extends.php index 83cb80500..37bf8dd3f 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_extends.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_extends.php @@ -64,18 +64,18 @@ class Smarty_Internal_Compile_Extends extends Smarty_Internal_Compile_Shared_Inh // add code to initialize inheritance $this->registerInit($compiler, true); $file = trim($_attr[ 'file' ], '\'"'); - if (strlen($file) > 8 && substr($file, 0, 8) == 'extends:') { + if (strlen($file) > 8 && substr($file, 0, 8) === 'extends:') { // generate code for each template $files = array_reverse(explode('|', substr($file, 8))); $i = 0; foreach ($files as $file) { - if ($file[ 0 ] == '"') { + if ($file[ 0 ] === '"') { $file = trim($file, '".'); } else { $file = "'{$file}'"; } $i ++; - if ($i == count($files) && isset($_attr[ 'extends_resource' ])) { + if ($i === count($files) && isset($_attr[ 'extends_resource' ])) { $this->compileEndChild($compiler); } $this->compileInclude($compiler, $file); @@ -95,21 +95,24 @@ class Smarty_Internal_Compile_Extends extends Smarty_Internal_Compile_Shared_Inh * * @param \Smarty_Internal_TemplateCompilerBase $compiler * @param null|string $template optional inheritance parent template + * + * @throws \SmartyCompilerException + * @throws \SmartyException */ private function compileEndChild(Smarty_Internal_TemplateCompilerBase $compiler, $template = null) { $inlineUids = ''; if (isset($template) && $compiler->smarty->merge_compiled_includes) { $code = $compiler->compileTag('include', array($template, array('scope' => 'parent'))); - if (preg_match("/([,][\s]*['][a-z0-9]+['][,][\s]*[']content.*['])[)]/", $code, $match)) { + if (preg_match('/([,][\s]*[\'][a-z0-9]+[\'][,][\s]*[\']content.*[\'])[)]/', $code, $match)) { $inlineUids = $match[ 1 ]; } } $compiler->parser->template_postfix[] = new Smarty_Internal_ParseTree_Tag($compiler->parser, - "<?php \$_smarty_tpl->inheritance->endChild(\$_smarty_tpl" . + '<?php $_smarty_tpl->inheritance->endChild($_smarty_tpl' . (isset($template) ? - ', ' . $template . $inlineUids : - '') . ");\n?>\n"); + ", {$template}{$inlineUids}" : + '') . ");\n?>"); } /** @@ -117,6 +120,9 @@ class Smarty_Internal_Compile_Extends extends Smarty_Internal_Compile_Shared_Inh * * @param \Smarty_Internal_TemplateCompilerBase $compiler * @param string $template subtemplate name + * + * @throws \SmartyCompilerException + * @throws \SmartyException */ private function compileInclude(Smarty_Internal_TemplateCompilerBase $compiler, $template) { @@ -129,16 +135,17 @@ class Smarty_Internal_Compile_Extends extends Smarty_Internal_Compile_Shared_Inh /** * Create source code for {extends} from source components array * - * @param []\Smarty_Internal_Template_Source $components + * @param \Smarty_Internal_Template $template * * @return string */ - public static function extendsSourceArrayCode($components) + public static function extendsSourceArrayCode(Smarty_Internal_Template $template) { $resources = array(); - foreach ($components as $source) { + foreach ($template->source->components as $source) { $resources[] = $source->resource; } - return '{extends file=\'extends:' . join('|', $resources) . '\' extends_resource=true}'; + return $template->smarty->left_delimiter . 'extends file=\'extends:' . join('|', $resources) . + '\' extends_resource=true' . $template->smarty->right_delimiter; } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_for.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_for.php index e5e7c61c3..79848e521 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_for.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_for.php @@ -35,7 +35,7 @@ class Smarty_Internal_Compile_For extends Smarty_Internal_CompileBase public function compile($args, $compiler, $parameter) { $compiler->loopNesting ++; - if ($parameter == 0) { + if ($parameter === 0) { $this->required_attributes = array('start', 'to'); $this->optional_attributes = array('max', 'step'); } else { @@ -47,7 +47,7 @@ class Smarty_Internal_Compile_For extends Smarty_Internal_CompileBase $_attr = $this->getAttributes($compiler, $args); $output = "<?php\n"; - if ($parameter == 1) { + if ($parameter === 1) { foreach ($_attr[ 'start' ] as $_statement) { if (is_array($_statement[ 'var' ])) { $var = $_statement[ 'var' ][ 'var' ]; @@ -89,10 +89,10 @@ class Smarty_Internal_Compile_For extends Smarty_Internal_CompileBase } $output .= "if (\$_smarty_tpl->tpl_vars[$var]->total > 0) {\n"; $output .= "for (\$_smarty_tpl->tpl_vars[$var]->value{$index} = $_statement[value], \$_smarty_tpl->tpl_vars[$var]->iteration = 1;\$_smarty_tpl->tpl_vars[$var]->iteration <= \$_smarty_tpl->tpl_vars[$var]->total;\$_smarty_tpl->tpl_vars[$var]->value{$index} += \$_smarty_tpl->tpl_vars[$var]->step, \$_smarty_tpl->tpl_vars[$var]->iteration++) {\n"; - $output .= "\$_smarty_tpl->tpl_vars[$var]->first = \$_smarty_tpl->tpl_vars[$var]->iteration == 1;"; - $output .= "\$_smarty_tpl->tpl_vars[$var]->last = \$_smarty_tpl->tpl_vars[$var]->iteration == \$_smarty_tpl->tpl_vars[$var]->total;"; + $output .= "\$_smarty_tpl->tpl_vars[$var]->first = \$_smarty_tpl->tpl_vars[$var]->iteration === 1;"; + $output .= "\$_smarty_tpl->tpl_vars[$var]->last = \$_smarty_tpl->tpl_vars[$var]->iteration === \$_smarty_tpl->tpl_vars[$var]->total;"; } - $output .= "?>"; + $output .= '?>'; $this->openTag($compiler, 'for', array('for', $compiler->nocache)); // maybe nocache because of nocache variables @@ -161,10 +161,10 @@ class Smarty_Internal_Compile_Forclose extends Smarty_Internal_CompileBase list($openTag, $compiler->nocache) = $this->closeTag($compiler, array('for', 'forelse')); $output = "<?php }\n"; - if ($openTag != 'forelse') { + if ($openTag !== 'forelse') { $output .= "}\n"; } - $output .= "?>\n"; + $output .= "?>"; return $output; } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_foreach.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_foreach.php index 5ddd42d8a..471e92c3e 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_foreach.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_foreach.php @@ -78,14 +78,14 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_Compile_Private_Fo /** * Compiles code for the {foreach} tag * - * @param array $args array with attributes from parser - * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object - * @param array $parameter array with compilation parameter + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object * * @return string compiled code * @throws \SmartyCompilerException + * @throws \SmartyException */ - public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) { $compiler->loopNesting ++; // init @@ -118,7 +118,7 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_Compile_Private_Fo $fromName = $compiler->getVariableName($_attr[ 'from' ]); if ($fromName) { foreach (array('item', 'key') as $a) { - if (isset($attributes[ $a ]) && $attributes[ $a ] == $fromName) { + if (isset($attributes[ $a ]) && $attributes[ $a ] === $fromName) { $compiler->trigger_template_error("'{$a}' and 'from' may not have same variable name '{$fromName}'", null, true); } @@ -137,7 +137,7 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_Compile_Private_Fo if (!empty($this->matchResults[ 'named' ])) { $namedAttr = $this->matchResults[ 'named' ]; } - if (isset($_attr[ 'properties' ]) && preg_match_all("/['](.*?)[']/", $_attr[ 'properties' ], $match)) { + if (isset($_attr[ 'properties' ]) && preg_match_all('/[\'](.*?)[\']/', $_attr[ 'properties' ], $match)) { foreach ($match[ 1 ] as $prop) { if (in_array($prop, $this->itemProperties)) { $itemAttr[ $prop ] = true; @@ -229,7 +229,7 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_Compile_Private_Fo $output .= "{$itemVar}->first = !{$itemVar}->index;\n"; } if (isset($itemAttr[ 'last' ])) { - $output .= "{$itemVar}->last = {$itemVar}->iteration == {$itemVar}->total;\n"; + $output .= "{$itemVar}->last = {$itemVar}->iteration === {$itemVar}->total;\n"; } if (isset($foreachVar)) { if (isset($namedAttr[ 'iteration' ])) { @@ -242,13 +242,13 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_Compile_Private_Fo $output .= "{$foreachVar}->value['first'] = !{$foreachVar}->value['index'];\n"; } if (isset($namedAttr[ 'last' ])) { - $output .= "{$foreachVar}->value['last'] = {$foreachVar}->value['iteration'] == {$foreachVar}->value['total'];\n"; + $output .= "{$foreachVar}->value['last'] = {$foreachVar}->value['iteration'] === {$foreachVar}->value['total'];\n"; } } if (!empty($itemAttr)) { $output .= "{$local}saved = {$itemVar};\n"; } - $output .= "?>"; + $output .= '?>'; return $output; } @@ -262,7 +262,7 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_Compile_Private_Fo */ public function compileRestore($levels) { - return "\$_smarty_tpl->smarty->ext->_foreach->restore(\$_smarty_tpl, {$levels});\n"; + return "\$_smarty_tpl->smarty->ext->_foreach->restore(\$_smarty_tpl, {$levels});"; } } @@ -277,13 +277,12 @@ class Smarty_Internal_Compile_Foreachelse extends Smarty_Internal_CompileBase /** * Compiles code for the {foreachelse} tag * - * @param array $args array with attributes from parser - * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object - * @param array $parameter array with compilation parameter + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object * * @return string compiled code */ - public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) { // check and get attributes $_attr = $this->getAttributes($compiler, $args); @@ -291,10 +290,10 @@ class Smarty_Internal_Compile_Foreachelse extends Smarty_Internal_CompileBase list($openTag, $nocache, $local, $itemVar, $restore) = $this->closeTag($compiler, array('foreach')); $this->openTag($compiler, 'foreachelse', array('foreachelse', $nocache, $local, $itemVar, 0)); $output = "<?php\n"; - if ($restore == 2) { + if ($restore === 2) { $output .= "{$itemVar} = {$local}saved;\n"; } - $output .= "}\n} else {\n?>\n"; + $output .= "}\n} else {\n?>"; return $output; } } @@ -310,13 +309,13 @@ class Smarty_Internal_Compile_Foreachclose extends Smarty_Internal_CompileBase /** * Compiles code for the {/foreach} tag * - * @param array $args array with attributes from parser - * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object - * @param array $parameter array with compilation parameter + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object * * @return string compiled code - */ - public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + * @throws \SmartyCompilerException + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) { $compiler->loopNesting --; // must endblock be nocache? @@ -328,7 +327,7 @@ class Smarty_Internal_Compile_Foreachclose extends Smarty_Internal_CompileBase $this->closeTag($compiler, array('foreach', 'foreachelse')); $output = "<?php\n"; - if ($restore == 2) { + if ($restore === 2) { $output .= "{$itemVar} = {$local}saved;\n"; } if ($restore > 0) { @@ -338,7 +337,7 @@ class Smarty_Internal_Compile_Foreachclose extends Smarty_Internal_CompileBase /* @var Smarty_Internal_Compile_Foreach $foreachCompiler */ $foreachCompiler = $compiler->getTagCompiler('foreach'); $output .= $foreachCompiler->compileRestore(1); - $output .= "?>\n"; + $output .= "?>"; return $output; } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_function.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_function.php index b7cd9e1c0..909b767c8 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_function.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_function.php @@ -44,14 +44,13 @@ class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase /** * Compiles code for the {function} tag * - * @param array $args array with attributes from parser - * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object - * @param array $parameter array with compilation parameter + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object * * @return bool true * @throws \SmartyCompilerException */ - public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) { // check and get attributes $_attr = $this->getAttributes($compiler, $args); @@ -60,7 +59,7 @@ class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase $compiler->trigger_template_error('nocache option not allowed', null, true); } unset($_attr[ 'nocache' ]); - $_name = trim($_attr[ 'name' ], "'\""); + $_name = trim($_attr[ 'name' ], '\'"'); $compiler->parent_compiler->tpl_function[ $_name ] = array(); $save = array($_attr, $compiler->parser->current_buffer, $compiler->template->compiled->has_nocache_code, $compiler->template->caching); @@ -68,6 +67,7 @@ class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase // Init temporary context $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template(); $compiler->template->compiled->has_nocache_code = false; + $compiler->saveRequiredPlugins(true); return true; } } @@ -91,18 +91,17 @@ class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase /** * Compiles code for the {/function} tag * - * @param array $args array with attributes from parser - * @param object|\Smarty_Internal_TemplateCompilerBase $compiler compiler object - * @param array $parameter array with compilation parameter + * @param array $args array with attributes from parser + * @param object|\Smarty_Internal_TemplateCompilerBase $compiler compiler object * * @return bool true */ - public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) { $this->compiler = $compiler; $saved_data = $this->closeTag($compiler, array('function')); $_attr = $saved_data[ 0 ]; - $_name = trim($_attr[ 'name' ], "'\""); + $_name = trim($_attr[ 'name' ], '\'"'); $compiler->parent_compiler->tpl_function[ $_name ][ 'compiled_filepath' ] = $compiler->parent_compiler->template->compiled->filepath; $compiler->parent_compiler->tpl_function[ $_name ][ 'uid' ] = $compiler->template->source->uid; @@ -118,7 +117,7 @@ class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase } } if (!empty($_paramsArray)) { - $_params = 'array(' . implode(",", $_paramsArray) . ')'; + $_params = 'array(' . implode(',', $_paramsArray) . ')'; $_paramsCode = "\$params = array_merge($_params, \$params);\n"; } else { $_paramsCode = ''; @@ -134,15 +133,16 @@ class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase $output = "<?php\n"; $output .= "/* {$_funcNameCaching} */\n"; $output .= "if (!function_exists('{$_funcNameCaching}')) {\n"; - $output .= "function {$_funcNameCaching} (\$_smarty_tpl,\$params) {\n"; + $output .= "function {$_funcNameCaching} (Smarty_Internal_Template \$_smarty_tpl,\$params) {\n"; $output .= "ob_start();\n"; + $output .= $compiler->compileRequiredPlugins(); $output .= "\$_smarty_tpl->compiled->has_nocache_code = true;\n"; $output .= $_paramsCode; - $output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value, \$_smarty_tpl->isRenderingCache);\n}"; + $output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value, \$_smarty_tpl->isRenderingCache);\n}\n"; $output .= "\$params = var_export(\$params, true);\n"; $output .= "echo \"/*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/<?php "; $output .= "\\\$_smarty_tpl->smarty->ext->_tplFunction->saveTemplateVariables(\\\$_smarty_tpl, '{$_name}');\nforeach (\$params as \\\$key => \\\$value) {\n\\\$_smarty_tpl->tpl_vars[\\\$key] = new Smarty_Variable(\\\$value, \\\$_smarty_tpl->isRenderingCache);\n}\n?>"; - $output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\n\";?>"; + $output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\";?>"; $compiler->parser->current_buffer->append_subtree($compiler->parser, new Smarty_Internal_ParseTree_Tag($compiler->parser, $output)); @@ -166,9 +166,11 @@ class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase $output = "<?php\n"; $output .= "/* {$_funcName} */\n"; $output .= "if (!function_exists('{$_funcName}')) {\n"; - $output .= "function {$_funcName}(\$_smarty_tpl,\$params) {\n"; + $output .= "function {$_funcName}(Smarty_Internal_Template \$_smarty_tpl,\$params) {\n"; $output .= $_paramsCode; - $output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value, \$_smarty_tpl->isRenderingCache);\n}?>"; + $output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value, \$_smarty_tpl->isRenderingCache);\n}\n"; + $output .= $compiler->compileCheckPlugins(array_merge($compiler->required_plugins[ 'compiled' ], $compiler->required_plugins[ 'nocache' ])); + $output .= "?>\n"; $compiler->parser->current_buffer->append_subtree($compiler->parser, new Smarty_Internal_ParseTree_Tag($compiler->parser, $output)); @@ -180,19 +182,10 @@ class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase new Smarty_Internal_ParseTree_Tag($compiler->parser, $output)); $compiler->parent_compiler->blockOrFunctionCode .= $compiler->parser->current_buffer->to_smarty_php($compiler->parser); - // nocache plugins must be copied - if (!empty($compiler->template->compiled->required_plugins[ 'nocache' ])) { - foreach ($compiler->template->compiled->required_plugins[ 'nocache' ] as $plugin => $tmp) { - foreach ($tmp as $type => $data) { - $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin ][ $type ] = - $data; - } - } - } - // restore old buffer - + // restore old buffer $compiler->parser->current_buffer = $saved_data[ 1 ]; // restore old status + $compiler->restoreRequiredPlugins(); $compiler->template->compiled->has_nocache_code = $saved_data[ 2 ]; $compiler->template->caching = $saved_data[ 3 ]; return true; @@ -200,7 +193,7 @@ class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase /** * Remove nocache code - * + * * @param $match * * @return string diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_if.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_if.php index 14db55d4f..82436c266 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_if.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_if.php @@ -34,8 +34,8 @@ class Smarty_Internal_Compile_If extends Smarty_Internal_CompileBase // must whole block be nocache ? $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; - if (!array_key_exists("if condition", $parameter)) { - $compiler->trigger_template_error("missing if condition", null, true); + if (!isset($parameter['if condition'])) { + $compiler->trigger_template_error('missing if condition', null, true); } if (is_array($parameter[ 'if condition' ])) { @@ -49,9 +49,9 @@ class Smarty_Internal_Compile_If extends Smarty_Internal_CompileBase $compiler->setNocacheInVariable($var); } $prefixVar = $compiler->getNewPrefixVariable(); - $_output = "<?php {$prefixVar} = " . $parameter[ 'if condition' ][ 'value' ] . ";?>\n"; + $_output = "<?php {$prefixVar} = {$parameter[ 'if condition' ][ 'value' ]};?>\n"; $assignAttr = array(); - $assignAttr[][ 'value' ] = "{$prefixVar}"; + $assignAttr[][ 'value' ] = $prefixVar; $assignCompiler = new Smarty_Internal_Compile_Assign(); if (is_array($parameter[ 'if condition' ][ 'var' ])) { $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ][ 'var' ]; @@ -80,18 +80,17 @@ class Smarty_Internal_Compile_Else extends Smarty_Internal_CompileBase /** * Compiles code for the {else} tag * - * @param array $args array with attributes from parser - * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object - * @param array $parameter array with compilation parameter + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object * * @return string compiled code - */ - public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) { list($nesting, $compiler->tag_nocache) = $this->closeTag($compiler, array('if', 'elseif')); $this->openTag($compiler, 'else', array($nesting, $compiler->tag_nocache)); - return "<?php } else { ?>"; + return '<?php } else { ?>'; } } @@ -120,8 +119,8 @@ class Smarty_Internal_Compile_Elseif extends Smarty_Internal_CompileBase list($nesting, $compiler->tag_nocache) = $this->closeTag($compiler, array('if', 'elseif')); - if (!array_key_exists("if condition", $parameter)) { - $compiler->trigger_template_error("missing elseif condition", null, true); + if (!isset($parameter['if condition'])) { + $compiler->trigger_template_error('missing elseif condition', null, true); } $assignCode = ''; @@ -138,10 +137,10 @@ class Smarty_Internal_Compile_Elseif extends Smarty_Internal_CompileBase $compiler->setNocacheInVariable($var); } $prefixVar = $compiler->getNewPrefixVariable(); - $assignCode = "<?php {$prefixVar} = " . $parameter[ 'if condition' ][ 'value' ] . ";?>\n"; + $assignCode = "<?php {$prefixVar} = {$parameter[ 'if condition' ][ 'value' ]};?>\n"; $assignCompiler = new Smarty_Internal_Compile_Assign(); $assignAttr = array(); - $assignAttr[][ 'value' ] = "{$prefixVar}"; + $assignAttr[][ 'value' ] = $prefixVar; if (is_array($parameter[ 'if condition' ][ 'var' ])) { $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ][ 'var' ]; $assignCode .= $assignCompiler->compile($assignAttr, $compiler, @@ -188,13 +187,12 @@ class Smarty_Internal_Compile_Ifclose extends Smarty_Internal_CompileBase /** * Compiles code for the {/if} tag * - * @param array $args array with attributes from parser - * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object - * @param array $parameter array with compilation parameter + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object * * @return string compiled code */ - public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) { // must endblock be nocache? if ($compiler->nocache) { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_include.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_include.php index a81b0c740..70f22546c 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_include.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_include.php @@ -7,7 +7,6 @@ * @subpackage Compiler * @author Uwe Tews */ - /** * Smarty Internal Plugin Compile Include Class * @@ -20,7 +19,6 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase * caching mode to create nocache code but no cache file */ const CACHING_NOCACHE_CODE = 9999; - /** * Attribute definition: Overwrites base class. * @@ -28,7 +26,6 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase * @see Smarty_Internal_CompileBase */ public $required_attributes = array('file'); - /** * Attribute definition: Overwrites base class. * @@ -36,7 +33,6 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase * @see Smarty_Internal_CompileBase */ public $shorttag_order = array('file'); - /** * Attribute definition: Overwrites base class. * @@ -44,7 +40,6 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase * @see Smarty_Internal_CompileBase */ public $option_flags = array('nocache', 'inline', 'caching'); - /** * Attribute definition: Overwrites base class. * @@ -52,7 +47,6 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase * @see Smarty_Internal_CompileBase */ public $optional_attributes = array('_any'); - /** * Valid scope names * @@ -65,19 +59,19 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase /** * Compiles code for the {include} tag * - * @param array $args array with attributes from parser - * @param Smarty_Internal_SmartyTemplateCompiler $compiler compiler object - * @param array $parameter array with compilation parameter + * @param array $args array with attributes from parser + * @param Smarty_Internal_SmartyTemplateCompiler $compiler compiler object * - * @throws SmartyCompilerException - * @return string compiled code + * @return string + * @throws \Exception + * @throws \SmartyCompilerException + * @throws \SmartyException */ - public function compile($args, Smarty_Internal_SmartyTemplateCompiler $compiler, $parameter) + public function compile($args, Smarty_Internal_SmartyTemplateCompiler $compiler) { $uid = $t_hash = null; // check and get attributes $_attr = $this->getAttributes($compiler, $args); - $fullResourceName = $source_resource = $_attr[ 'file' ]; $variable_template = false; $cache_tpl = false; @@ -90,11 +84,11 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase $variable_template = true; } if (!$variable_template) { - if ($type != 'string') { + if ($type !== 'string') { $fullResourceName = "{$type}:{$name}"; $compiled = $compiler->parent_compiler->template->compiled; if (isset($compiled->includes[ $fullResourceName ])) { - $compiled->includes[ $fullResourceName ] ++; + $compiled->includes[ $fullResourceName ]++; $cache_tpl = true; } else { if ("{$compiler->template->source->type}:{$compiler->template->source->name}" == @@ -116,10 +110,8 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase } else { $variable_template = true; } - // scope setup $_scope = $compiler->convertScope($_attr, $this->valid_scopes); - // set flag to cache subtemplate object when called within loop or template name is variable. if ($cache_tpl || $variable_template || $compiler->loopNesting > 0) { $_cache_tpl = 'true'; @@ -128,18 +120,14 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase } // assume caching is off $_caching = Smarty::CACHING_OFF; - $call_nocache = $compiler->tag_nocache || $compiler->nocache; - // caching was on and {include} is not in nocache mode if ($compiler->template->caching && !$compiler->nocache && !$compiler->tag_nocache) { $_caching = self::CACHING_NOCACHE_CODE; } - // flag if included template code should be merged into caller $merge_compiled_includes = ($compiler->smarty->merge_compiled_includes || $_attr[ 'inline' ] === true) && !$compiler->template->source->handler->recompiled; - if ($merge_compiled_includes) { // variable template name ? if ($variable_template) { @@ -150,7 +138,6 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase $merge_compiled_includes = false; } } - /* * if the {include} tag provides individual parameter for caching or compile_id * the subtemplate must not be included into the common cache file and is treated like @@ -158,7 +145,7 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase * */ if ($_attr[ 'nocache' ] !== true && $_attr[ 'caching' ]) { - $_caching = $_new_caching = (int) $_attr[ 'caching' ]; + $_caching = $_new_caching = (int)$_attr[ 'caching' ]; $call_nocache = true; } else { $_new_caching = Smarty::CACHING_LIFETIME_CURRENT; @@ -182,7 +169,6 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase } else { $_compile_id = '$_smarty_tpl->compile_id'; } - // if subtemplate will be called in nocache mode do not merge if ($compiler->template->caching && $call_nocache) { $merge_compiled_includes = false; @@ -200,7 +186,6 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase $_assign = $_attr[ 'assign' ]; } } - $has_compiled_template = false; if ($merge_compiled_includes) { $c_id = isset($_attr[ 'compile_id' ]) ? $_attr[ 'compile_id' ] : $compiler->template->compile_id; @@ -232,17 +217,17 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase $_vars = 'array(' . join(',', $_pairs) . ')'; } $update_compile_id = $compiler->template->caching && !$compiler->tag_nocache && !$compiler->nocache && - $_compile_id != '$_smarty_tpl->compile_id'; + $_compile_id !== '$_smarty_tpl->compile_id'; if ($has_compiled_template && !$call_nocache) { $_output = "<?php\n"; if ($update_compile_id) { $_output .= $compiler->makeNocacheCode("\$_compile_id_save[] = \$_smarty_tpl->compile_id;\n\$_smarty_tpl->compile_id = {$_compile_id};\n"); } - if (!empty($_attr) && $_caching == 9999 && $compiler->template->caching) { + if (!empty($_attr) && $_caching === 9999 && $compiler->template->caching) { $_vars_nc = "foreach ($_vars as \$ik => \$iv) {\n"; $_vars_nc .= "\$_smarty_tpl->tpl_vars[\$ik] = new Smarty_Variable(\$iv);\n"; $_vars_nc .= "}\n"; - $_output .= substr($compiler->processNocacheCode('<?php ' . $_vars_nc . "?>\n", true), 6, - 3); + $_output .= substr($compiler->processNocacheCode('<?php ' . $_vars_nc . "?>\n", true), 6, -3); } if (isset($_assign)) { $_output .= "ob_start();\n"; @@ -254,11 +239,9 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase if ($update_compile_id) { $_output .= $compiler->makeNocacheCode("\$_smarty_tpl->compile_id = array_pop(\$_compile_id_save);\n"); } - $_output .= "?>\n"; - + $_output .= "?>"; return $_output; } - if ($call_nocache) { $compiler->tag_nocache = true; } @@ -277,7 +260,7 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase if ($update_compile_id) { $_output .= "\$_smarty_tpl->compile_id = array_pop(\$_compile_id_save);\n"; } - $_output .= "?>\n"; + $_output .= "?>"; return $_output; } @@ -289,9 +272,12 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase * @param string $t_hash * * @return bool + * @throws \Exception + * @throws \SmartyException */ public function compileInlineTemplate(Smarty_Internal_SmartyTemplateCompiler $compiler, - Smarty_Internal_Template $tpl, $t_hash) + Smarty_Internal_Template $tpl, + $t_hash) { $uid = $tpl->source->type . $tpl->source->uid; if (!($tpl->source->handler->uncompiled) && $tpl->source->exists) { @@ -309,29 +295,30 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase $tpl->mustCompile = true; $compiler->parent_compiler->mergedSubTemplatesData[ $uid ][ $t_hash ][ 'nocache_hash' ] = $tpl->compiled->nocache_hash; - if ($compiler->template->source->type == 'file') { - $sourceInfo = $compiler->template->source->filepath; + if ($tpl->source->type === 'file') { + $sourceInfo = $tpl->source->filepath; } else { - $basename = $compiler->template->source->handler->getBasename($compiler->template->source); - $sourceInfo = $compiler->template->source->type . ':' . - ($basename ? $basename : $compiler->template->source->name); + $basename = $tpl->source->handler->getBasename($tpl->source); + $sourceInfo = $tpl->source->type . ':' . + ($basename ? $basename : $tpl->source->name); } // get compiled code $compiled_code = "<?php\n\n"; $compiled_code .= "/* Start inline template \"{$sourceInfo}\" =============================*/\n"; - $compiled_code .= "function {$tpl->compiled->unifunc} (\$_smarty_tpl) {\n"; + $compiled_code .= "function {$tpl->compiled->unifunc} (Smarty_Internal_Template \$_smarty_tpl) {\n"; $compiled_code .= "?>\n" . $tpl->compiler->compileTemplateSource($tpl, null, $compiler->parent_compiler); $compiled_code .= "<?php\n"; $compiled_code .= "}\n?>\n"; $compiled_code .= $tpl->compiler->postFilter($tpl->compiler->blockOrFunctionCode); $compiled_code .= "<?php\n\n"; $compiled_code .= "/* End inline template \"{$sourceInfo}\" =============================*/\n"; - $compiled_code .= "?>"; + $compiled_code .= '?>'; unset($tpl->compiler); if ($tpl->compiled->has_nocache_code) { // replace nocache_hash $compiled_code = - str_replace("{$tpl->compiled->nocache_hash}", $compiler->template->compiled->nocache_hash, + str_replace("{$tpl->compiled->nocache_hash}", + $compiler->template->compiled->nocache_hash, $compiled_code); $compiler->template->compiled->has_nocache_code = true; } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_include_php.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_include_php.php index 77586da8b..e0aca93b3 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_include_php.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_include_php.php @@ -7,7 +7,6 @@ * @subpackage Compiler * @author Uwe Tews */ - /** * Smarty Internal Plugin Compile Insert Class * @@ -57,7 +56,6 @@ class Smarty_Internal_Compile_Include_Php extends Smarty_Internal_CompileBase } // check and get attributes $_attr = $this->getAttributes($compiler, $args); - /** @var Smarty_Internal_Template $_smarty_tpl * used in evaluated code */ @@ -74,8 +72,8 @@ class Smarty_Internal_Compile_Include_Php extends Smarty_Internal_CompileBase $_dir = $compiler->smarty->trusted_dir; } if (!empty($_dir)) { - foreach ((array) $_dir as $_script_dir) { - $_path = $compiler->smarty->_realpath($_script_dir . $compiler->smarty->ds . $_file, true); + foreach ((array)$_dir as $_script_dir) { + $_path = $compiler->smarty->_realpath($_script_dir . DIRECTORY_SEPARATOR . $_file, true); if (file_exists($_path)) { $_filepath = $_path; break; @@ -83,25 +81,22 @@ class Smarty_Internal_Compile_Include_Php extends Smarty_Internal_CompileBase } } } - if ($_filepath == false) { + if ($_filepath === false) { $compiler->trigger_template_error("{include_php} file '{$_file}' is not readable", null, true); } - if (isset($compiler->smarty->security_policy)) { $compiler->smarty->security_policy->isTrustedPHPDir($_filepath); } - if (isset($_attr[ 'assign' ])) { // output will be stored in a smarty variable instead of being displayed $_assign = $_attr[ 'assign' ]; } $_once = '_once'; if (isset($_attr[ 'once' ])) { - if ($_attr[ 'once' ] == 'false') { + if ($_attr[ 'once' ] === 'false') { $_once = ''; } } - if (isset($_assign)) { return "<?php ob_start();\ninclude{$_once} ('{$_filepath}');\n\$_smarty_tpl->assign({$_assign},ob_get_clean());\n?>"; } else { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_insert.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_insert.php index 02ef67c3a..e71abdce3 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_insert.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_insert.php @@ -1,5 +1,4 @@ <?php - /** * Smarty Internal Plugin Compile Insert * Compiles the {insert} tag @@ -24,7 +23,6 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase * @see Smarty_Internal_CompileBase */ public $required_attributes = array('name'); - /** * Attribute definition: Overwrites base class. * @@ -32,7 +30,6 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase * @see Smarty_Internal_CompileBase */ public $shorttag_order = array('name'); - /** * Attribute definition: Overwrites base class. * @@ -49,14 +46,12 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase * * @return string compiled code * @throws \SmartyCompilerException + * @throws \SmartyException */ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) { // check and get attributes $_attr = $this->getAttributes($compiler, $args); - //Does tag create output - $compiler->has_output = isset($_attr[ 'assign' ]) ? false : true; - $nocacheParam = $compiler->template->caching && ($compiler->tag_nocache || $compiler->nocache); if (!$nocacheParam) { // do not compile as nocache code @@ -66,7 +61,6 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase $_smarty_tpl = $compiler->template; $_name = null; $_script = null; - $_output = '<?php '; // save possible attributes eval('$_name = @' . $_attr[ 'name' ] . ';'); @@ -74,7 +68,7 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase // output will be stored in a smarty variable instead of being displayed $_assign = $_attr[ 'assign' ]; // create variable to make sure that the compiler knows about its nocache status - $var = trim($_attr[ 'assign' ], "'"); + $var = trim($_attr[ 'assign' ], '\''); if (isset($compiler->template->tpl_vars[ $var ])) { $compiler->template->tpl_vars[ $var ]->nocache = true; } else { @@ -96,8 +90,8 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase $_dir = $compiler->smarty instanceof SmartyBC ? $compiler->smarty->trusted_dir : null; } if (!empty($_dir)) { - foreach ((array) $_dir as $_script_dir) { - $_script_dir = rtrim($_script_dir, '/\\') . $compiler->smarty->ds; + foreach ((array)$_dir as $_script_dir) { + $_script_dir = rtrim($_script_dir, '/\\') . DIRECTORY_SEPARATOR; if (file_exists($_script_dir . $_script)) { $_filepath = $_script_dir . $_script; break; @@ -105,7 +99,7 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase } } } - if ($_filepath == false) { + if ($_filepath === false) { $compiler->trigger_template_error("{insert} missing script file '{$_script}'", null, true); } // code for script file loading @@ -113,7 +107,8 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase require_once $_filepath; if (!is_callable($_function)) { $compiler->trigger_template_error(" {insert} function '{$_function}' is not callable in script file '{$_script}'", - null, true); + null, + true); } } else { $_filepath = 'null'; @@ -122,7 +117,8 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase if (!is_callable($_function)) { // try plugin if (!$_function = $compiler->getPlugin($_name, 'insert')) { - $compiler->trigger_template_error("{insert} no function or plugin found for '{$_name}'", null, + $compiler->trigger_template_error("{insert} no function or plugin found for '{$_name}'", + null, true); } } @@ -149,7 +145,6 @@ class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase $_output .= "echo {$_function}({$_params},\$_smarty_tpl);?>"; } } - return $_output; } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_ldelim.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_ldelim.php index 7251dcd6c..c22e1a637 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_ldelim.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_ldelim.php @@ -16,7 +16,7 @@ */ class Smarty_Internal_Compile_Ldelim extends Smarty_Internal_CompileBase { - /** + /** * Compiles code for the {ldelim} tag * This tag does output the left delimiter * @@ -32,9 +32,6 @@ class Smarty_Internal_Compile_Ldelim extends Smarty_Internal_CompileBase if ($_attr[ 'nocache' ] === true) { $compiler->trigger_template_error('nocache option not allowed', null, true); } - // this tag does not return compiled code - $compiler->has_code = true; - return $compiler->smarty->left_delimiter; } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_make_nocache.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_make_nocache.php index 720dd68b3..f793ecbbf 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_make_nocache.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_make_nocache.php @@ -41,20 +41,18 @@ class Smarty_Internal_Compile_Make_Nocache extends Smarty_Internal_CompileBase /** * Compiles code for the {make_nocache} tag * - * @param array $args array with attributes from parser - * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object - * @param array $parameter array with compilation parameter + * @param array $args array with attributes from parser + * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object * * @return string compiled code - * @throws \SmartyCompilerException - */ - public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) + */ + public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) { // check and get attributes $_attr = $this->getAttributes($compiler, $args); if ($compiler->template->caching) { $output = "<?php \$_smarty_tpl->smarty->ext->_make_nocache->save(\$_smarty_tpl, {$_attr[ 'var' ]});\n?>\n"; - $compiler->has_code = true; + $compiler->template->compiled->has_nocache_code = true; $compiler->suppressNocacheProcessing = true; return $output; } else { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_parent.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_parent.php new file mode 100644 index 000000000..052479aef --- /dev/null +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_parent.php @@ -0,0 +1,32 @@ +<?php +/* + * This file is part of Smarty. + * + * (c) 2015 Uwe Tews + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Smarty Internal Plugin Compile Parent Class + * + * @author Uwe Tews <uwe.tews@googlemail.com> + */ +class Smarty_Internal_Compile_Parent extends Smarty_Internal_Compile_Child +{ + + /** + * Tag name + * + * @var string + */ + public $tag = 'parent'; + + /** + * Block type + * + * @var string + */ + public $blockType = 'Parent'; +}
\ No newline at end of file diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_block_plugin.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_block_plugin.php index 617564276..6c3f05aaa 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_block_plugin.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_block_plugin.php @@ -41,17 +41,19 @@ class Smarty_Internal_Compile_Private_Block_Plugin extends Smarty_Internal_Compi * @param string $function PHP function name * * @return string compiled code + * @throws \SmartyCompilerException + * @throws \SmartyException */ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter, $tag, $function = null) { - if (!isset($tag[ 5 ]) || substr($tag, - 5) != 'close') { + if (!isset($tag[ 5 ]) || substr($tag, - 5) !== 'close') { // opening tag of block plugin // check and get attributes $_attr = $this->getAttributes($compiler, $args); $this->nesting ++; unset($_attr[ 'nocache' ]); list($callback, $_paramsArray, $callable) = $this->setup($compiler, $_attr, $tag, $function); - $_params = 'array(' . implode(",", $_paramsArray) . ')'; + $_params = 'array(' . implode(',', $_paramsArray) . ')'; // compile code $output = "<?php "; @@ -63,7 +65,7 @@ class Smarty_Internal_Compile_Private_Block_Plugin extends Smarty_Internal_Compi $output .= "if (!is_callable({$callable})) {\nthrow new SmartyException('block tag \'{$tag}\' not callable or registered');\n}\n"; } $output .= "\$_smarty_tpl->smarty->_cache['_tag_stack'][] = array('{$tag}', {$_params});\n"; - $output .= "\$_block_repeat=true;\necho {$callback}({$_params}, null, \$_smarty_tpl, \$_block_repeat);\nwhile (\$_block_repeat) {\nob_start();\n?>"; + $output .= "\$_block_repeat=true;\necho {$callback}({$_params}, null, \$_smarty_tpl, \$_block_repeat);\nwhile (\$_block_repeat) {\nob_start();?>"; $this->openTag($compiler, $tag, array($_params, $compiler->nocache, $callback)); // maybe nocache because of nocache variables or nocache plugin $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; @@ -74,8 +76,6 @@ class Smarty_Internal_Compile_Private_Block_Plugin extends Smarty_Internal_Compi } // closing tag of block plugin, restore nocache list($_params, $compiler->nocache, $callback) = $this->closeTag($compiler, substr($tag, 0, - 5)); - //Does tag create output - $compiler->has_output = isset($_params[ 'assign' ]) ? false : true; // compile code if (!isset($parameter[ 'modifier_list' ])) { $mod_pre = $mod_post = $mod_content = ''; @@ -88,13 +88,10 @@ class Smarty_Internal_Compile_Private_Block_Plugin extends Smarty_Internal_Compi array('modifierlist' => $parameter[ 'modifier_list' ], 'value' => 'ob_get_clean()')) . ";\n"; } - $output = "<?php " . $mod_content . "\$_block_repeat=false;\n" . $mod_pre . - "echo {$callback}({$_params}, " . $mod_content2 . - ", \$_smarty_tpl, \$_block_repeat);\n" . $mod_post . "}\n"; - $output .= "array_pop(\$_smarty_tpl->smarty->_cache['_tag_stack']);"; - $output .= "?>"; + $output = "<?php {$mod_content}\$_block_repeat=false;\n{$mod_pre}echo {$callback}({$_params}, {$mod_content2}, \$_smarty_tpl, \$_block_repeat);\n{$mod_post}}\n"; + $output .= 'array_pop($_smarty_tpl->smarty->_cache[\'_tag_stack\']);?>'; } - return $output . "\n"; + return $output; } /** diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_foreachsection.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_foreachsection.php index bf569be3a..5161da645 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_foreachsection.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_foreachsection.php @@ -76,6 +76,8 @@ class Smarty_Internal_Compile_Private_ForeachSection extends Smarty_Internal_Com * * @param array $attributes * @param \Smarty_Internal_TemplateCompilerBase $compiler + * + * @throws \SmartyException */ public function scanForProperties($attributes, Smarty_Internal_TemplateCompilerBase $compiler) { @@ -110,8 +112,9 @@ class Smarty_Internal_Compile_Private_ForeachSection extends Smarty_Internal_Com public function buildPropertyPreg($named, $attributes) { if ($named) { - $this->resultOffsets[ 'named' ] = $this->startOffset + 3; - $this->propertyPreg .= "([\$]smarty[.]{$this->tagName}[.]{$attributes['name']}[.]("; + $this->resultOffsets[ 'named' ] = $this->startOffset + 4; + $this->propertyPreg .= "(([\$]smarty[.]{$this->tagName}[.]" . ($this->tagName === 'section' ? "|[\[]\s*" : '') + . "){$attributes['name']}[.]("; $properties = $this->nameProperties; } else { $this->resultOffsets[ 'item' ] = $this->startOffset + 3; @@ -161,6 +164,8 @@ class Smarty_Internal_Compile_Private_ForeachSection extends Smarty_Internal_Com * Find matches in all parent template source * * @param \Smarty_Internal_TemplateCompilerBase $compiler + * + * @throws \SmartyException */ public function matchParentTemplateSource(Smarty_Internal_TemplateCompilerBase $compiler) { @@ -171,7 +176,7 @@ class Smarty_Internal_Compile_Private_ForeachSection extends Smarty_Internal_Com if ($compiler !== $nextCompiler) { // get template source $_content = $nextCompiler->template->source->getContent(); - if ($_content != '') { + if ($_content !== '') { // run pre filter if required if ((isset($nextCompiler->smarty->autoload_filters[ 'pre' ]) || isset($nextCompiler->smarty->registered_filters[ 'pre' ])) diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_function_plugin.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_function_plugin.php index 26529bb68..9e9c65f59 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_function_plugin.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_function_plugin.php @@ -42,6 +42,8 @@ class Smarty_Internal_Compile_Private_Function_Plugin extends Smarty_Internal_Co * @param string $function PHP function name * * @return string compiled code + * @throws \SmartyCompilerException + * @throws \SmartyException */ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter, $tag, $function) { @@ -58,7 +60,7 @@ class Smarty_Internal_Compile_Private_Function_Plugin extends Smarty_Internal_Co $_paramsArray[] = "'$_key'=>$_value"; } } - $_params = 'array(' . implode(",", $_paramsArray) . ')'; + $_params = 'array(' . implode(',', $_paramsArray) . ')'; // compile code $output = "{$function}({$_params},\$_smarty_tpl)"; if (!empty($parameter[ 'modifierlist' ])) { @@ -66,8 +68,6 @@ class Smarty_Internal_Compile_Private_Function_Plugin extends Smarty_Internal_Co array('modifierlist' => $parameter[ 'modifierlist' ], 'value' => $output)); } - //Does tag create output - $compiler->has_output = true; $output = "<?php echo {$output};?>\n"; return $output; } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php index 2ee88db48..e83b7a243 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php @@ -26,6 +26,7 @@ class Smarty_Internal_Compile_Private_Modifier extends Smarty_Internal_CompileBa * * @return string compiled code * @throws \SmartyCompilerException + * @throws \SmartyException */ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter) { @@ -34,6 +35,7 @@ class Smarty_Internal_Compile_Private_Modifier extends Smarty_Internal_CompileBa $output = $parameter[ 'value' ]; // loop over list of modifiers foreach ($parameter[ 'modifierlist' ] as $single_modifier) { + /* @var string $modifier */ $modifier = $single_modifier[ 0 ]; $single_modifier[ 0 ] = $output; $params = implode(',', $single_modifier); @@ -48,20 +50,13 @@ class Smarty_Internal_Compile_Private_Modifier extends Smarty_Internal_CompileBa case 1: // registered modifier if (isset($compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ])) { - $function = - $compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ][ 0 ]; - if (!is_array($function)) { - $output = "{$function}({$params})"; - } else { - if (is_object($function[ 0 ])) { - $output = '$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][\'' . - $modifier . '\'][0][0]->' . $function[ 1 ] . '(' . $params . ')'; - } else { - $output = $function[ 0 ] . '::' . $function[ 1 ] . '(' . $params . ')'; - } + if (is_callable($compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ][ 0 ])) { + $output = + sprintf('call_user_func_array($_smarty_tpl->registered_plugins[ \'%s\' ][ %s ][ 0 ], array( %s ))', + Smarty::PLUGIN_MODIFIER, var_export($modifier, true), $params); + $compiler->known_modifier_type[ $modifier ] = $type; + break 2; } - $compiler->known_modifier_type[ $modifier ] = $type; - break 2; } break; case 2: @@ -135,8 +130,8 @@ class Smarty_Internal_Compile_Private_Modifier extends Smarty_Internal_CompileBa } } } - if (isset($compiler->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $modifier ][ Smarty::PLUGIN_MODIFIER ][ 'file' ]) || - isset($compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $modifier ][ Smarty::PLUGIN_MODIFIER ][ 'file' ]) + if (isset($compiler->required_plugins[ 'nocache' ][ $modifier ][ Smarty::PLUGIN_MODIFIER ][ 'file' ]) || + isset($compiler->required_plugins[ 'compiled' ][ $modifier ][ Smarty::PLUGIN_MODIFIER ][ 'file' ]) ) { // was a plugin $compiler->known_modifier_type[ $modifier ] = 4; @@ -148,10 +143,10 @@ class Smarty_Internal_Compile_Private_Modifier extends Smarty_Internal_CompileBa } } if (!isset($compiler->known_modifier_type[ $modifier ])) { - $compiler->trigger_template_error("unknown modifier \"" . $modifier . "\"", null, true); + $compiler->trigger_template_error("unknown modifier '{$modifier}'", null, true); } } return $output; } -} +}
\ No newline at end of file diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_object_function.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_object_function.php index 7f78a421e..8d6c7e397 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_object_function.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_object_function.php @@ -34,14 +34,13 @@ class Smarty_Internal_Compile_Private_Object_Function extends Smarty_Internal_Co * @param string $method name of method to call * * @return string compiled code + * @throws \SmartyCompilerException + * @throws \SmartyException */ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter, $tag, $method) { // check and get attributes $_attr = $this->getAttributes($compiler, $args); - //Does tag create output - $compiler->has_output = isset($_attr[ 'assign' ]) ? false : true; - unset($_attr[ 'nocache' ]); $_assign = null; if (isset($_attr[ 'assign' ])) { @@ -60,10 +59,10 @@ class Smarty_Internal_Compile_Private_Object_Function extends Smarty_Internal_Co $_paramsArray[] = "'$_key'=>$_value"; } } - $_params = 'array(' . implode(",", $_paramsArray) . ')'; + $_params = 'array(' . implode(',', $_paramsArray) . ')'; $output = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}({$_params},\$_smarty_tpl)"; } else { - $_params = implode(",", $_attr); + $_params = implode(',', $_attr); $output = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}({$_params})"; } } else { @@ -74,9 +73,6 @@ class Smarty_Internal_Compile_Private_Object_Function extends Smarty_Internal_Co $output = $compiler->compileTag('private_modifier', array(), array('modifierlist' => $parameter[ 'modifierlist' ], 'value' => $output)); } - //Does tag create output - $compiler->has_output = isset($_attr[ 'assign' ]) ? false : true; - if (empty($_assign)) { return "<?php echo {$output};?>\n"; } else { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_php.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_php.php index 8bff8499f..1d100f0d2 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_php.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_php.php @@ -40,38 +40,34 @@ class Smarty_Internal_Compile_Private_Php extends Smarty_Internal_CompileBase // check and get attributes $_attr = $this->getAttributes($compiler, $args); $compiler->has_code = false; - if ($_attr[ 'type' ] == 'xml') { + if ($_attr[ 'type' ] === 'xml') { $compiler->tag_nocache = true; $output = addcslashes($_attr[ 'code' ], "'\\"); $compiler->parser->current_buffer->append_subtree($compiler->parser, new Smarty_Internal_ParseTree_Tag($compiler->parser, - $compiler->processNocacheCode("<?php echo '" . - $output . - "';?>", + $compiler->processNocacheCode("<?php echo '{$output}';?>", true))); return ''; } - if ($_attr[ 'type' ] != 'tag') { - if ($compiler->php_handling == Smarty::PHP_REMOVE) { + if ($_attr[ 'type' ] !== 'tag') { + if ($compiler->php_handling === Smarty::PHP_REMOVE) { return ''; - } elseif ($compiler->php_handling == Smarty::PHP_QUOTE) { + } elseif ($compiler->php_handling === Smarty::PHP_QUOTE) { $output = preg_replace_callback('#(<\?(?:php|=)?)|(<%)|(<script\s+language\s*=\s*["\']?\s*php\s*["\']?\s*>)|(\?>)|(%>)|(<\/script>)#i', array($this, 'quote'), $_attr[ 'code' ]); $compiler->parser->current_buffer->append_subtree($compiler->parser, new Smarty_Internal_ParseTree_Text($output)); return ''; - } elseif ($compiler->php_handling == Smarty::PHP_PASSTHRU || $_attr[ 'type' ] == 'unmatched') { + } elseif ($compiler->php_handling === Smarty::PHP_PASSTHRU || $_attr[ 'type' ] === 'unmatched') { $compiler->tag_nocache = true; $output = addcslashes($_attr[ 'code' ], "'\\"); $compiler->parser->current_buffer->append_subtree($compiler->parser, new Smarty_Internal_ParseTree_Tag($compiler->parser, - $compiler->processNocacheCode("<?php echo '" . - $output . - "';?>", + $compiler->processNocacheCode("<?php echo '{$output}';?>", true))); return ''; - } elseif ($compiler->php_handling == Smarty::PHP_ALLOW) { + } elseif ($compiler->php_handling === Smarty::PHP_ALLOW) { if (!($compiler->smarty instanceof SmartyBC)) { $compiler->trigger_template_error('$smarty->php_handling PHP_ALLOW not allowed. Use SmartyBC to enable it', null, true); @@ -91,10 +87,10 @@ class Smarty_Internal_Compile_Private_Php extends Smarty_Internal_CompileBase $rdel = preg_quote($compiler->smarty->right_delimiter, '#'); preg_match("#^({$ldel}php\\s*)((.)*?)({$rdel})#", $_attr[ 'code' ], $match); if (!empty($match[ 2 ])) { - if ('nocache' == trim($match[ 2 ])) { + if ('nocache' === trim($match[ 2 ])) { $compiler->tag_nocache = true; } else { - $compiler->trigger_template_error("illegal value of option flag \"{$match[2]}\"", null, true); + $compiler->trigger_template_error("illegal value of option flag '{$match[2]}'", null, true); } } return preg_replace(array("#^{$ldel}\\s*php\\s*(.)*?{$rdel}#", "#{$ldel}\\s*/\\s*php\\s*{$rdel}$#"), @@ -107,9 +103,11 @@ class Smarty_Internal_Compile_Private_Php extends Smarty_Internal_CompileBase * * This code has been moved from lexer here fo easier debugging and maintenance * - * @param $lex + * @param Smarty_Internal_Templatelexer $lex + * + * @throws \SmartyCompilerException */ - public function parsePhp($lex) + public function parsePhp(Smarty_Internal_Templatelexer $lex) { $lex->token = Smarty_Internal_Templateparser::TP_PHP; $close = 0; @@ -142,16 +140,16 @@ class Smarty_Internal_Compile_Private_Php extends Smarty_Internal_CompileBase return; } $closeTag = "{$lex->smarty->left_delimiter}/php{$lex->smarty->right_delimiter}"; - if ($lex->value == $closeTag) { + if ($lex->value === $closeTag) { $lex->compiler->trigger_template_error("unexpected closing tag '{$closeTag}'"); } $lex->phpType = 'tag'; } - if ($lex->phpType == 'unmatched') { + if ($lex->phpType === 'unmatched') { return; } - if (($lex->phpType == 'php' || $lex->phpType == 'asp') && - ($lex->compiler->php_handling == Smarty::PHP_PASSTHRU || $lex->compiler->php_handling == Smarty::PHP_QUOTE) + if (($lex->phpType === 'php' || $lex->phpType === 'asp') && + ($lex->compiler->php_handling === Smarty::PHP_PASSTHRU || $lex->compiler->php_handling === Smarty::PHP_QUOTE) ) { return; } @@ -171,7 +169,7 @@ class Smarty_Internal_Compile_Private_Php extends Smarty_Internal_CompileBase $body = false; } else { $start = $pos + strlen($value); - $phpCommentStart = $value == '/*'; + $phpCommentStart = $value === '/*'; if ($phpCommentStart) { $phpCommentEnd = preg_match('~([*][/])~', $lex->data, $match, PREG_OFFSET_CAPTURE, $start); if ($phpCommentEnd) { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php index 811996bcc..2dde69488 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php @@ -67,7 +67,7 @@ class Smarty_Internal_Compile_Private_Print_Expression extends Smarty_Internal_C preg_match_all('/(\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'|"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|:|[^:]+)/', $single_default_modifier, $mod_array); for ($i = 0, $count = count($mod_array[ 0 ]); $i < $count; $i ++) { - if ($mod_array[ 0 ][ $i ] != ':') { + if ($mod_array[ 0 ][ $i ] !== ':') { $modifierlist[ $key ][] = $mod_array[ 0 ][ $i ]; } } @@ -100,18 +100,18 @@ class Smarty_Internal_Compile_Private_Print_Expression extends Smarty_Internal_C if (isset($compiler->smarty->autoload_filters[ Smarty::FILTER_VARIABLE ])) { foreach ((array) $compiler->template->smarty->autoload_filters[ Smarty::FILTER_VARIABLE ] as $name) { - $result = $this->compile_output_filter($compiler, $name, $output); + $result = $this->compile_variable_filter($compiler, $name, $output); if ($result !== false) { $output = $result; } else { // not found, throw exception - throw new SmartyException("Unable to load filter '{$name}'"); + throw new SmartyException("Unable to load variable filter '{$name}'"); } } } foreach ($compiler->variable_filters as $filter) { - if (count($filter) == 1 && - ($result = $this->compile_output_filter($compiler, $filter[ 0 ], $output)) !== false + if (count($filter) === 1 && + ($result = $this->compile_variable_filter($compiler, $filter[ 0 ], $output)) !== false ) { $output = $result; } else { @@ -120,9 +120,7 @@ class Smarty_Internal_Compile_Private_Print_Expression extends Smarty_Internal_C } } } - - $compiler->has_output = true; - $output = "<?php echo {$output};?>"; + $output = "<?php echo {$output};?>\n"; } return $output; @@ -134,29 +132,16 @@ class Smarty_Internal_Compile_Private_Print_Expression extends Smarty_Internal_C * @param string $output embedded output * * @return string + * @throws \SmartyException */ - private function compile_output_filter(Smarty_Internal_TemplateCompilerBase $compiler, $name, $output) + private function compile_variable_filter(Smarty_Internal_TemplateCompilerBase $compiler, $name, $output) { - $plugin_name = "smarty_variablefilter_{$name}"; - $path = $compiler->smarty->loadPlugin($plugin_name); - if ($path) { - /** - if ($compiler->template->caching) { - $compiler->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $name ][ Smarty::FILTER_VARIABLE ][ 'file' ] = - $path; - $compiler->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $name ][ Smarty::FILTER_VARIABLE ][ 'function' ] = - $plugin_name; - } else { - $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $name ][ Smarty::FILTER_VARIABLE ][ 'file' ] = - $path; - $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $name ][ Smarty::FILTER_VARIABLE ][ 'function' ] = - $plugin_name; - } - * */ - return "{$plugin_name}({$output},\$_smarty_tpl)"; - } else { + $function= $compiler->getPlugin($name, 'variablefilter'); + if ($function) { + return "{$function}({$output},\$_smarty_tpl)"; + } else { // not found return false; - } + } } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_registered_block.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_registered_block.php index 987bc96f3..bd88f1bf1 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_registered_block.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_registered_block.php @@ -61,7 +61,7 @@ class Smarty_Internal_Compile_Private_Registered_Block extends Smarty_Internal_C if (is_int($_key)) { $_paramsArray[] = "$_key=>$_value"; } elseif ($compiler->template->caching && in_array($_key, $tag_info[ 2 ])) { - $_value = str_replace("'", "^#^", $_value); + $_value = str_replace('\'', "^#^", $_value); $_paramsArray[] = "'$_key'=>^#^.var_export($_value,true).^#^"; } else { $_paramsArray[] = "'$_key'=>$_value"; diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_registered_function.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_registered_function.php index 7a4cbb7f7..467f9a49a 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_registered_function.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_registered_function.php @@ -33,6 +33,8 @@ class Smarty_Internal_Compile_Private_Registered_Function extends Smarty_Interna * @param string $tag name of function * * @return string compiled code + * @throws \SmartyCompilerException + * @throws \SmartyException */ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter, $tag) { @@ -41,10 +43,12 @@ class Smarty_Internal_Compile_Private_Registered_Function extends Smarty_Interna unset($_attr[ 'nocache' ]); if (isset($compiler->smarty->registered_plugins[ Smarty::PLUGIN_FUNCTION ][ $tag ])) { $tag_info = $compiler->smarty->registered_plugins[ Smarty::PLUGIN_FUNCTION ][ $tag ]; + $is_registered = true; } else { - $tag_info = $compiler->default_handler_plugins[ Smarty::PLUGIN_FUNCTION ][ $tag ]; + $tag_info = $compiler->default_handler_plugins[ Smarty::PLUGIN_FUNCTION ][ $tag ]; + $is_registered = false; } - // not cachable? + // not cacheable? $compiler->tag_nocache = $compiler->tag_nocache || !$tag_info[ 1 ]; // convert attributes into parameter array string $_paramsArray = array(); @@ -52,31 +56,31 @@ class Smarty_Internal_Compile_Private_Registered_Function extends Smarty_Interna if (is_int($_key)) { $_paramsArray[] = "$_key=>$_value"; } elseif ($compiler->template->caching && in_array($_key, $tag_info[ 2 ])) { - $_value = str_replace("'", "^#^", $_value); + $_value = str_replace('\'', "^#^", $_value); $_paramsArray[] = "'$_key'=>^#^.var_export($_value,true).^#^"; } else { $_paramsArray[] = "'$_key'=>$_value"; } } - $_params = 'array(' . implode(",", $_paramsArray) . ')'; - $function = $tag_info[ 0 ]; + $_params = 'array(' . implode(',', $_paramsArray) . ')'; // compile code - if (!is_array($function)) { - $output = "{$function}({$_params},\$_smarty_tpl)"; - } elseif (is_object($function[ 0 ])) { + if ($is_registered) { $output = - "\$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_FUNCTION]['{$tag}'][0][0]->{$function[1]}({$_params},\$_smarty_tpl)"; + "call_user_func_array( \$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_FUNCTION]['{$tag}'][0], array( {$_params},\$_smarty_tpl ) )"; } else { - $output = "{$function[0]}::{$function[1]}({$_params},\$_smarty_tpl)"; + $function = $tag_info[ 0 ]; + if (!is_array($function)) { + $output = "{$function}({$_params},\$_smarty_tpl)"; + } else { + $output = "{$function[0]}::{$function[1]}({$_params},\$_smarty_tpl)"; + } } if (!empty($parameter[ 'modifierlist' ])) { $output = $compiler->compileTag('private_modifier', array(), array('modifierlist' => $parameter[ 'modifierlist' ], 'value' => $output)); } - //Does tag create output - $compiler->has_output = true; $output = "<?php echo {$output};?>\n"; return $output; } -} +}
\ No newline at end of file diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_rdelim.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_rdelim.php index 2e6b43c17..e3d034da1 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_rdelim.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_rdelim.php @@ -14,7 +14,7 @@ * @package Smarty * @subpackage Compiler */ -class Smarty_Internal_Compile_Rdelim extends Smarty_Internal_CompileBase +class Smarty_Internal_Compile_Rdelim extends Smarty_Internal_Compile_Ldelim { /** * Compiles code for the {rdelim} tag @@ -28,13 +28,7 @@ class Smarty_Internal_Compile_Rdelim extends Smarty_Internal_CompileBase */ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) { - $_attr = $this->getAttributes($compiler, $args); - if ($_attr[ 'nocache' ] === true) { - $compiler->trigger_template_error('nocache option not allowed', null, true); - } - // this tag does not return compiled code - $compiler->has_code = true; - + parent::compile($args,$compiler); return $compiler->smarty->right_delimiter; } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_section.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_section.php index c3701fc63..6e80e0fde 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_section.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_section.php @@ -84,6 +84,7 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo * * @return string compiled code * @throws \SmartyCompilerException + * @throws \SmartyException */ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) { @@ -103,8 +104,7 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo // maybe nocache because of nocache variables $compiler->nocache = $compiler->nocache | $compiler->tag_nocache; - $initLocal = - array('saved' => "isset(\$_smarty_tpl->tpl_vars['__smarty_section_{$attributes['name']}']) ? \$_smarty_tpl->tpl_vars['__smarty_section_{$attributes['name']}'] : false",); + $initLocal = array(); $initNamedProperty = array(); $initFor = array(); $incFor = array(); @@ -140,12 +140,7 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo $v = "(is_array(@\$_loop=$attr_value) ? count(\$_loop) : max(0, (int) \$_loop))"; $t = 1; } - if (isset($namedAttr[ 'loop' ])) { - $initNamedProperty[ 'loop' ] = "'loop' => {$v}"; - if ($t == 1) { - $v = "{$sectionVar}->value['loop']"; - } - } elseif ($t == 1) { + if ($t === 1) { $initLocal[ 'loop' ] = $v; $v = "{$local}loop"; } @@ -162,11 +157,11 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo case 'step': if (is_numeric($attr_value)) { $v = (int) $attr_value; - $v = ($v == 0) ? 1 : $v; + $v = ($v === 0) ? 1 : $v; $t = 0; break; } - $initLocal[ 'step' ] = "((int)@$attr_value) == 0 ? 1 : (int)@$attr_value"; + $initLocal[ 'step' ] = "((int)@$attr_value) === 0 ? 1 : (int)@$attr_value"; $v = "{$local}step"; $t = 2; break; @@ -182,7 +177,7 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo $t = 3; break; } - if ($t == 3 && $compiler->getId($attr_value)) { + if ($t === 3 && $compiler->getId($attr_value)) { $t = 1; } $propValue[ $attr_name ] = $v; @@ -198,8 +193,8 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo $incFor[ 'iteration' ] = "{$propValue['iteration']}++"; $initFor[ 'iteration' ] = "{$propValue['iteration']} = 1"; - if ($propType[ 'step' ] == 0) { - if ($propValue[ 'step' ] == 1) { + if ($propType[ 'step' ] === 0) { + if ($propValue[ 'step' ] === 1) { $incFor[ 'index' ] = "{$sectionVar}->value['index']++"; } elseif ($propValue[ 'step' ] > 1) { $incFor[ 'index' ] = "{$sectionVar}->value['index'] += {$propValue['step']}"; @@ -213,7 +208,7 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo if (!isset($propValue[ 'max' ])) { $propValue[ 'max' ] = $propValue[ 'loop' ]; $propType[ 'max' ] = $propType[ 'loop' ]; - } elseif ($propType[ 'max' ] != 0) { + } elseif ($propType[ 'max' ] !== 0) { $propValue[ 'max' ] = "{$propValue['max']} < 0 ? {$propValue['loop']} : {$propValue['max']}"; $propType[ 'max' ] = 1; } else { @@ -226,11 +221,11 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo if (!isset($propValue[ 'start' ])) { $start_code = array(1 => "{$propValue['step']} > 0 ? ", 2 => '0', 3 => ' : ', 4 => $propValue[ 'loop' ], 5 => ' - 1'); - if ($propType[ 'loop' ] == 0) { + if ($propType[ 'loop' ] === 0) { $start_code[ 5 ] = ''; $start_code[ 4 ] = $propValue[ 'loop' ] - 1; } - if ($propType[ 'step' ] == 0) { + if ($propType[ 'step' ] === 0) { if ($propValue[ 'step' ] > 0) { $start_code = array(1 => '0'); $propType[ 'start' ] = 0; @@ -248,9 +243,9 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo 5 => ' : ', 6 => '-1', 7 => ', ', 8 => "{$propValue['start']} + {$propValue['loop']}", 10 => ')', 11 => ' : ', 12 => 'min(', 13 => $propValue[ 'start' ], 14 => ', ', 15 => "{$propValue['step']} > 0 ? ", 16 => $propValue[ 'loop' ], 17 => ' : ', - 18 => $propType[ 'loop' ] == 0 ? $propValue[ 'loop' ] - 1 : "{$propValue['loop']} - 1", + 18 => $propType[ 'loop' ] === 0 ? $propValue[ 'loop' ] - 1 : "{$propValue['loop']} - 1", 19 => ')'); - if ($propType[ 'step' ] == 0) { + if ($propType[ 'step' ] === 0) { $start_code[ 3 ] = $start_code[ 5 ] = $start_code[ 15 ] = $start_code[ 17 ] = ''; if ($propValue[ 'step' ] > 0) { $start_code[ 6 ] = $start_code[ 18 ] = ''; @@ -258,8 +253,8 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo $start_code[ 4 ] = $start_code[ 16 ] = ''; } } - if ($propType[ 'start' ] == 0) { - if ($propType[ 'loop' ] == 0) { + if ($propType[ 'start' ] === 0) { + if ($propType[ 'loop' ] === 0) { $start_code[ 8 ] = $propValue[ 'start' ] + $propValue[ 'loop' ]; } $propType[ 'start' ] = $propType[ 'step' ] + $propType[ 'loop' ]; @@ -268,7 +263,7 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo for ($i = 11; $i <= 19; $i ++) { $start_code[ $i ] = ''; } - if ($propType[ 'start' ] == 0) { + if ($propType[ 'start' ] === 0) { $start_code = array(max($propValue[ 'step' ] > 0 ? 0 : - 1, $propValue[ 'start' ] + $propValue[ 'loop' ])); } @@ -276,7 +271,7 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo for ($i = 1; $i <= 11; $i ++) { $start_code[ $i ] = ''; } - if ($propType[ 'start' ] == 0) { + if ($propType[ 'start' ] === 0) { $start_code = array(min($propValue[ 'step' ] > 0 ? $propValue[ 'loop' ] : $propValue[ 'loop' ] - 1, $propValue[ 'start' ])); @@ -285,7 +280,7 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo } $propValue[ 'start' ] = join('', $start_code); } - if ($propType[ 'start' ] != 0) { + if ($propType[ 'start' ] !== 0) { $initLocal[ 'start' ] = $propValue[ 'start' ]; $propValue[ 'start' ] = "{$local}start"; } @@ -298,7 +293,7 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo } else { $propType[ 'total' ] = $propType[ 'start' ] + $propType[ 'loop' ] + $propType[ 'step' ] + $propType[ 'max' ]; - if ($propType[ 'total' ] == 0) { + if ($propType[ 'total' ] === 0) { $propValue[ 'total' ] = min(ceil(($propValue[ 'step' ] > 0 ? $propValue[ 'loop' ] - $propValue[ 'start' ] : (int) $propValue[ 'start' ] + 1) / abs($propValue[ 'step' ])), $propValue[ 'max' ]); @@ -310,17 +305,17 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo if (!isset($propValue[ 'max' ])) { $total_code[ 1 ] = $total_code[ 17 ] = ''; } - if ($propType[ 'loop' ] + $propType[ 'start' ] == 0) { + if ($propType[ 'loop' ] + $propType[ 'start' ] === 0) { $total_code[ 5 ] = $propValue[ 'loop' ] - $propValue[ 'start' ]; $total_code[ 6 ] = $total_code[ 7 ] = ''; } - if ($propType[ 'start' ] == 0) { + if ($propType[ 'start' ] === 0) { $total_code[ 9 ] = (int) $propValue[ 'start' ] + 1; $total_code[ 10 ] = ''; } - if ($propType[ 'step' ] == 0) { + if ($propType[ 'step' ] === 0) { $total_code[ 13 ] = $total_code[ 15 ] = ''; - if ($propValue[ 'step' ] == 1 || $propValue[ 'step' ] == - 1) { + if ($propValue[ 'step' ] === 1 || $propValue[ 'step' ] === - 1) { $total_code[ 2 ] = $total_code[ 12 ] = $total_code[ 14 ] = $total_code[ 16 ] = ''; } elseif ($propValue[ 'step' ] < 0) { $total_code[ 14 ] = - $propValue[ 'step' ]; @@ -337,7 +332,7 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo } if (isset($namedAttr[ 'loop' ])) { - $initNamedProperty[ 'loop' ] = "'loop' => {$propValue['total']}"; + $initNamedProperty[ 'loop' ] = "'loop' => {$propValue['loop']}"; } if (isset($namedAttr[ 'total' ])) { $initNamedProperty[ 'total' ] = "'total' => {$propValue['total']}"; @@ -357,9 +352,9 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo $_vars = 'array(' . join(', ', $initNamedProperty) . ')'; $output .= "{$sectionVar} = new Smarty_Variable({$_vars});\n"; - $cond_code = "{$propValue['total']} != 0"; - if ($propType[ 'total' ] == 0) { - if ($propValue[ 'total' ] == 0) { + $cond_code = "{$propValue['total']} !== 0"; + if ($propType[ 'total' ] === 0) { + if ($propValue[ 'total' ] === 0) { $cond_code = 'false'; } else { $cond_code = 'true'; @@ -368,7 +363,7 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo if ($propType[ 'show' ] > 0) { $output .= "{$local}show = {$propValue['show']} ? {$cond_code} : false;\n"; $output .= "if ({$local}show) {\n"; - } elseif ($propValue[ 'show' ] == 'true') { + } elseif ($propValue[ 'show' ] === 'true') { $output .= "if ({$cond_code}) {\n"; } else { $output .= "if (false) {\n"; @@ -387,12 +382,12 @@ class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_Fo $output .= "{$sectionVar}->value['index_next'] = {$propValue['index']} + {$propValue['step']};\n"; } if (isset($namedAttr[ 'first' ])) { - $output .= "{$sectionVar}->value['first'] = ({$propValue['iteration']} == 1);\n"; + $output .= "{$sectionVar}->value['first'] = ({$propValue['iteration']} === 1);\n"; } if (isset($namedAttr[ 'last' ])) { - $output .= "{$sectionVar}->value['last'] = ({$propValue['iteration']} == {$propValue['total']});\n"; + $output .= "{$sectionVar}->value['last'] = ({$propValue['iteration']} === {$propValue['total']});\n"; } - $output .= "?>"; + $output .= '?>'; return $output; } @@ -454,15 +449,12 @@ class Smarty_Internal_Compile_Sectionclose extends Smarty_Internal_CompileBase $this->closeTag($compiler, array('section', 'sectionelse')); $output = "<?php\n"; - if ($openTag == 'sectionelse') { + if ($openTag === 'sectionelse') { $output .= "}\n"; } else { $output .= "}\n}\n"; } - $output .= "if ({$local}saved) {\n"; - $output .= "{$sectionVar} = {$local}saved;\n"; - $output .= "}\n"; - $output .= "?>"; + $output .= '?>'; return $output; } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_shared_inheritance.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_shared_inheritance.php index c95576596..a32173cd6 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_shared_inheritance.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_shared_inheritance.php @@ -17,30 +17,32 @@ class Smarty_Internal_Compile_Shared_Inheritance extends Smarty_Internal_CompileBase { /** - * Register post compile callback to compile inheritance initialization code + * Compile inheritance initialization code as prefix * * @param \Smarty_Internal_TemplateCompilerBase $compiler * @param bool|false $initChildSequence if true force child template */ - public function registerInit(Smarty_Internal_TemplateCompilerBase $compiler, $initChildSequence = false) + static function postCompile(Smarty_Internal_TemplateCompilerBase $compiler, $initChildSequence = false) { - if ($initChildSequence || !isset($compiler->_cache[ 'inheritanceInit' ])) { - $compiler->registerPostCompileCallback(array('Smarty_Internal_Compile_Shared_Inheritance', 'postCompile'), - array($initChildSequence), 'inheritanceInit', $initChildSequence); - - $compiler->_cache[ 'inheritanceInit' ] = true; - } + $compiler->prefixCompiledCode .= "<?php \$_smarty_tpl->_loadInheritance();\n\$_smarty_tpl->inheritance->init(\$_smarty_tpl, " . + var_export($initChildSequence, true) . ");\n?>\n"; } /** - * Compile inheritance initialization code as prefix + * Register post compile callback to compile inheritance initialization code * * @param \Smarty_Internal_TemplateCompilerBase $compiler * @param bool|false $initChildSequence if true force child template */ - static function postCompile(Smarty_Internal_TemplateCompilerBase $compiler, $initChildSequence = false) + public function registerInit(Smarty_Internal_TemplateCompilerBase $compiler, $initChildSequence = false) { - $compiler->prefixCompiledCode .= "<?php \$_smarty_tpl->_loadInheritance();\n\$_smarty_tpl->inheritance->init(\$_smarty_tpl, " . - var_export($initChildSequence, true) . ");\n?>\n"; + if ($initChildSequence || !isset($compiler->_cache['inheritanceInit'])) { + $compiler->registerPostCompileCallback(array('Smarty_Internal_Compile_Shared_Inheritance', 'postCompile'), + array($initChildSequence), + 'inheritanceInit', + $initChildSequence); + + $compiler->_cache['inheritanceInit'] = true; + } } }
\ No newline at end of file diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_while.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_while.php index 6025798c5..328d6551d 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_while.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_while.php @@ -33,8 +33,8 @@ class Smarty_Internal_Compile_While extends Smarty_Internal_CompileBase $_attr = $this->getAttributes($compiler, $args); $this->openTag($compiler, 'while', $compiler->nocache); - if (!array_key_exists("if condition", $parameter)) { - $compiler->trigger_template_error("missing while condition", null, true); + if (!array_key_exists('if condition', $parameter)) { + $compiler->trigger_template_error('missing while condition', null, true); } // maybe nocache because of nocache variables @@ -52,15 +52,15 @@ class Smarty_Internal_Compile_While extends Smarty_Internal_CompileBase $prefixVar = $compiler->getNewPrefixVariable(); $assignCompiler = new Smarty_Internal_Compile_Assign(); $assignAttr = array(); - $assignAttr[][ 'value' ] = "{$prefixVar}"; + $assignAttr[][ 'value' ] = $prefixVar; if (is_array($parameter[ 'if condition' ][ 'var' ])) { $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ][ 'var' ]; - $_output = "<?php while ({$prefixVar} = " . $parameter[ 'if condition' ][ 'value' ] . ") {?>"; + $_output = "<?php while ({$prefixVar} = {$parameter[ 'if condition' ][ 'value' ]}) {?>"; $_output .= $assignCompiler->compile($assignAttr, $compiler, array('smarty_internal_index' => $parameter[ 'if condition' ][ 'var' ][ 'smarty_internal_index' ])); } else { $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ]; - $_output = "<?php while ({$prefixVar} = " . $parameter[ 'if condition' ][ 'value' ] . ") {?>"; + $_output = "<?php while ({$prefixVar} = {$parameter[ 'if condition' ][ 'value' ]}) {?>"; $_output .= $assignCompiler->compile($assignAttr, $compiler, array()); } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compilebase.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compilebase.php index 08aab6f4e..656672b98 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compilebase.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compilebase.php @@ -45,15 +45,15 @@ abstract class Smarty_Internal_CompileBase public $option_flags = array('nocache'); /** - * Mapping array for boolqn option value - * + * Mapping array for boolean option value + * * @var array */ public $optionMap = array(1 => true, 0 => false, 'true' => true, 'false' => false); /** * Mapping array with attributes as key - * + * * @var array */ public $mapCache = array(); @@ -117,11 +117,11 @@ abstract class Smarty_Internal_CompileBase // check if all required attributes present foreach ($this->required_attributes as $attr) { if (!isset($_indexed_attr[ $attr ])) { - $compiler->trigger_template_error("missing \"" . $attr . "\" attribute", null, true); + $compiler->trigger_template_error("missing '{$attr}' attribute", null, true); } } // check for not allowed attributes - if ($this->optional_attributes != array('_any')) { + if ($this->optional_attributes !== array('_any')) { if (!isset($this->mapCache[ 'all' ])) { $this->mapCache[ 'all' ] = array_fill_keys(array_merge($this->required_attributes, $this->optional_attributes, @@ -129,7 +129,7 @@ abstract class Smarty_Internal_CompileBase } foreach ($_indexed_attr as $key => $dummy) { if (!isset($this->mapCache[ 'all' ][ $key ]) && $key !== 0) { - $compiler->trigger_template_error("unexpected \"" . $key . "\" attribute", null, true); + $compiler->trigger_template_error("unexpected '{$key}' attribute", null, true); } } } @@ -183,13 +183,12 @@ abstract class Smarty_Internal_CompileBase } } // wrong nesting of tags - $compiler->trigger_template_error("unclosed {$compiler->smarty->left_delimiter}" . $_openTag . - "{$compiler->smarty->right_delimiter} tag"); + $compiler->trigger_template_error("unclosed '{$compiler->smarty->left_delimiter}{$_openTag}{$compiler->smarty->right_delimiter}' tag"); return; } // wrong nesting of tags - $compiler->trigger_template_error("unexpected closing tag", null, true); + $compiler->trigger_template_error('unexpected closing tag', null, true); return; } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php index b1ef958cd..ada38869d 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php @@ -97,33 +97,38 @@ class Smarty_Internal_Config_File_Compiler * @param Smarty_Internal_Template $template * * @return bool true if compiling succeeded, false if it failed + * @throws \SmartyException */ public function compileTemplate(Smarty_Internal_Template $template) { $this->template = $template; $this->template->compiled->file_dependency[ $this->template->source->uid ] = - array($this->template->source->filepath, $this->template->source->getTimeStamp(), + array($this->template->source->filepath, + $this->template->source->getTimeStamp(), $this->template->source->type); if ($this->smarty->debugging) { - if (!isset( $this->smarty->_debug)) { - $this->smarty->_debug = new Smarty_Internal_Debug(); + if (!isset($this->smarty->_debug)) { + $this->smarty->_debug = new Smarty_Internal_Debug(); } $this->smarty->_debug->start_compile($this->template); } // init the lexer/parser to compile the config file - /* @var Smarty_Internal_ConfigFileLexer $this->lex */ - $this->lex = new $this->lexer_class(str_replace(array("\r\n", "\r"), "\n", $template->source->getContent()) . "\n", - $this); - /* @var Smarty_Internal_ConfigFileParser $this->parser */ + /* @var Smarty_Internal_ConfigFileLexer $this ->lex */ + $this->lex = new $this->lexer_class(str_replace(array("\r\n", + "\r"), "\n", $template->source->getContent()) . "\n", + $this); + /* @var Smarty_Internal_ConfigFileParser $this ->parser */ $this->parser = new $this->parser_class($this->lex, $this); - if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) { + if (function_exists('mb_internal_encoding') + && function_exists('ini_get') + && ((int) ini_get('mbstring.func_overload')) & 2 + ) { $mbEncoding = mb_internal_encoding(); mb_internal_encoding('ASCII'); } else { $mbEncoding = null; } - if ($this->smarty->_parserdebug) { $this->parser->PrintTrace(); } @@ -147,7 +152,7 @@ class Smarty_Internal_Config_File_Compiler $template_header = "<?php /* Smarty version " . Smarty::SMARTY_VERSION . ", created on " . strftime("%Y-%m-%d %H:%M:%S") . "\n"; - $template_header .= " compiled from \"" . $this->template->source->filepath . "\" */ ?>\n"; + $template_header .= " compiled from '{$this->template->source->filepath}' */ ?>\n"; $code = '<?php $_smarty_tpl->smarty->ext->configLoad->_loadConfigVars($_smarty_tpl, ' . var_export($this->config_data, true) . '); ?>'; diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_configfilelexer.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_configfilelexer.php index 7869ef384..454c9f828 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_configfilelexer.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_configfilelexer.php @@ -21,90 +21,72 @@ */ class Smarty_Internal_Configfilelexer { + const START = 1; + const VALUE = 2; + const NAKED_STRING_VALUE = 3; + const COMMENT = 4; + const SECTION = 5; + const TRIPPLE = 6; /** * Source * * @var string */ public $data; - /** * Source length * * @var int */ public $dataLength = null; - /** * byte counter * * @var int */ public $counter; - /** * token number * * @var int */ public $token; - /** * token value * * @var string */ public $value; - /** * current line * * @var int */ public $line; - /** * state number * * @var int */ public $state = 1; - /** * Smarty object * * @var Smarty */ public $smarty = null; - - /** - * compiler object - * - * @var Smarty_Internal_Config_File_Compiler - */ - private $compiler = null; - - /** - * copy of config_booleanize - * - * @var bool - */ - private $configBooleanize = false; - /** * trace file * * @var resource */ public $yyTraceFILE; - /** * trace prompt * * @var string */ public $yyTracePrompt; - /** * state names * @@ -112,31 +94,38 @@ class Smarty_Internal_Configfilelexer */ public $state_name = array(1 => 'START', 2 => 'VALUE', 3 => 'NAKED_STRING_VALUE', 4 => 'COMMENT', 5 => 'SECTION', 6 => 'TRIPPLE'); - + /** + * token names + * + * @var array + */ + public $smarty_token_names = array( // Text for parser error messages + ); + /** + * compiler object + * + * @var Smarty_Internal_Config_File_Compiler + */ + private $compiler = null; + /** + * copy of config_booleanize + * + * @var bool + */ + private $configBooleanize = false; /** * storage for assembled token patterns * * @var string */ private $yy_global_pattern1 = null; - private $yy_global_pattern2 = null; - private $yy_global_pattern3 = null; - private $yy_global_pattern4 = null; - private $yy_global_pattern5 = null; - private $yy_global_pattern6 = null; - - /** - * token names - * - * @var array - */ - public $smarty_token_names = array( // Text for parser error messages - ); + private $_yy_state = 1; + private $_yy_stack = array(); /** * constructor @@ -158,16 +147,17 @@ class Smarty_Internal_Configfilelexer $this->configBooleanize = $this->smarty->config_booleanize; } + public function replace($input) + { + return $input; + } // end function + public function PrintTrace() { $this->yyTraceFILE = fopen('php://output', 'w'); $this->yyTracePrompt = '<br>'; } - private $_yy_state = 1; - - private $_yy_stack = array(); - public function yylex() { return $this->{'yylex' . $this->_yy_state}(); @@ -176,14 +166,18 @@ class Smarty_Internal_Configfilelexer public function yypushstate($state) { if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%sState push %s\n", $this->yyTracePrompt, + fprintf($this->yyTraceFILE, + "%sState push %s\n", + $this->yyTracePrompt, isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state); } array_push($this->_yy_stack, $this->_yy_state); $this->_yy_state = $state; if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%snew State %s\n", $this->yyTracePrompt, + fprintf($this->yyTraceFILE, + "%snew State %s\n", + $this->yyTracePrompt, isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state); } @@ -192,13 +186,17 @@ class Smarty_Internal_Configfilelexer public function yypopstate() { if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%sState pop %s\n", $this->yyTracePrompt, + fprintf($this->yyTraceFILE, + "%sState pop %s\n", + $this->yyTracePrompt, isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state); } $this->_yy_state = array_pop($this->_yy_stack); if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%snew State %s\n", $this->yyTracePrompt, + fprintf($this->yyTraceFILE, + "%snew State %s\n", + $this->yyTracePrompt, isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state); } @@ -208,7 +206,9 @@ class Smarty_Internal_Configfilelexer { $this->_yy_state = $state; if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%sState set %s\n", $this->yyTracePrompt, + fprintf($this->yyTraceFILE, + "%sState set %s\n", + $this->yyTracePrompt, isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state); } @@ -218,7 +218,7 @@ class Smarty_Internal_Configfilelexer { if (!isset($this->yy_global_pattern1)) { $this->yy_global_pattern1 = - "/\G(#|;)|\G(\\[)|\G(\\])|\G(=)|\G([ \t\r]+)|\G(\n)|\G([0-9]*[a-zA-Z_]\\w*)|\G([\S\s])/isS"; + $this->replace("/\G(#|;)|\G(\\[)|\G(\\])|\G(=)|\G([ \t\r]+)|\G(\n)|\G([0-9]*[a-zA-Z_]\\w*)|\G([\S\s])/isS"); } if (!isset($this->dataLength)) { $this->dataLength = strlen($this->data); @@ -226,17 +226,18 @@ class Smarty_Internal_Configfilelexer if ($this->counter >= $this->dataLength) { return false; // end of input } - do { - if (preg_match($this->yy_global_pattern1, $this->data, $yymatches, null, $this->counter)) { + if (preg_match($this->yy_global_pattern1, $this->data, $yymatches, 0, $this->counter)) { if (!isset($yymatches[ 0 ][ 1 ])) { $yymatches = preg_grep("/(.|\s)+/", $yymatches); } else { $yymatches = array_filter($yymatches); } if (empty($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . - substr($this->data, $this->counter, 5) . '... state START'); + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr($this->data, + $this->counter, + 5) . '... state START'); } next($yymatches); // skip global match $this->token = key($yymatches); // token number @@ -247,11 +248,11 @@ class Smarty_Internal_Configfilelexer $this->line += substr_count($this->value, "\n"); // accept this token return true; - } elseif ($r === true) { + } else if ($r === true) { // we have changed state // process this token in the new state return $this->yylex(); - } elseif ($r === false) { + } else if ($r === false) { $this->counter += strlen($this->value); $this->line += substr_count($this->value, "\n"); if ($this->counter >= $this->dataLength) { @@ -261,63 +262,53 @@ class Smarty_Internal_Configfilelexer continue; } } else { - throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]); + throw new Exception('Unexpected input at line' . $this->line . + ': ' . $this->data[ $this->counter ]); } break; - } - while (true); - } // end function - - const START = 1; + } while (true); + } function yy_r1_1() { - $this->token = Smarty_Internal_Configfileparser::TPC_COMMENTSTART; $this->yypushstate(self::COMMENT); } function yy_r1_2() { - $this->token = Smarty_Internal_Configfileparser::TPC_OPENB; $this->yypushstate(self::SECTION); } function yy_r1_3() { - $this->token = Smarty_Internal_Configfileparser::TPC_CLOSEB; } function yy_r1_4() { - $this->token = Smarty_Internal_Configfileparser::TPC_EQUAL; $this->yypushstate(self::VALUE); - } + } // end function function yy_r1_5() { - return false; } function yy_r1_6() { - $this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE; } function yy_r1_7() { - $this->token = Smarty_Internal_Configfileparser::TPC_ID; } function yy_r1_8() { - $this->token = Smarty_Internal_Configfileparser::TPC_OTHER; } @@ -325,7 +316,7 @@ class Smarty_Internal_Configfilelexer { if (!isset($this->yy_global_pattern2)) { $this->yy_global_pattern2 = - "/\G([ \t\r]+)|\G(\\d+\\.\\d+(?=[ \t\r]*[\n#;]))|\G(\\d+(?=[ \t\r]*[\n#;]))|\G(\"\"\")|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*'(?=[ \t\r]*[\n#;]))|\G(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"(?=[ \t\r]*[\n#;]))|\G([a-zA-Z]+(?=[ \t\r]*[\n#;]))|\G([^\n]+?(?=[ \t\r]*\n))|\G(\n)/isS"; + $this->replace("/\G([ \t\r]+)|\G(\\d+\\.\\d+(?=[ \t\r]*[\n#;]))|\G(\\d+(?=[ \t\r]*[\n#;]))|\G(\"\"\")|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*'(?=[ \t\r]*[\n#;]))|\G(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"(?=[ \t\r]*[\n#;]))|\G([a-zA-Z]+(?=[ \t\r]*[\n#;]))|\G([^\n]+?(?=[ \t\r]*\n))|\G(\n)/isS"); } if (!isset($this->dataLength)) { $this->dataLength = strlen($this->data); @@ -333,17 +324,18 @@ class Smarty_Internal_Configfilelexer if ($this->counter >= $this->dataLength) { return false; // end of input } - do { - if (preg_match($this->yy_global_pattern2, $this->data, $yymatches, null, $this->counter)) { + if (preg_match($this->yy_global_pattern2, $this->data, $yymatches, 0, $this->counter)) { if (!isset($yymatches[ 0 ][ 1 ])) { $yymatches = preg_grep("/(.|\s)+/", $yymatches); } else { $yymatches = array_filter($yymatches); } if (empty($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . - substr($this->data, $this->counter, 5) . '... state VALUE'); + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr($this->data, + $this->counter, + 5) . '... state VALUE'); } next($yymatches); // skip global match $this->token = key($yymatches); // token number @@ -354,11 +346,11 @@ class Smarty_Internal_Configfilelexer $this->line += substr_count($this->value, "\n"); // accept this token return true; - } elseif ($r === true) { + } else if ($r === true) { // we have changed state // process this token in the new state return $this->yylex(); - } elseif ($r === false) { + } else if ($r === false) { $this->counter += strlen($this->value); $this->line += substr_count($this->value, "\n"); if ($this->counter >= $this->dataLength) { @@ -368,62 +360,52 @@ class Smarty_Internal_Configfilelexer continue; } } else { - throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]); + throw new Exception('Unexpected input at line' . $this->line . + ': ' . $this->data[ $this->counter ]); } break; - } - while (true); - } // end function - - const VALUE = 2; + } while (true); + } function yy_r2_1() { - return false; } function yy_r2_2() { - $this->token = Smarty_Internal_Configfileparser::TPC_FLOAT; $this->yypopstate(); } function yy_r2_3() { - $this->token = Smarty_Internal_Configfileparser::TPC_INT; $this->yypopstate(); } function yy_r2_4() { - $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES; $this->yypushstate(self::TRIPPLE); } function yy_r2_5() { - $this->token = Smarty_Internal_Configfileparser::TPC_SINGLE_QUOTED_STRING; $this->yypopstate(); } function yy_r2_6() { - $this->token = Smarty_Internal_Configfileparser::TPC_DOUBLE_QUOTED_STRING; $this->yypopstate(); - } + } // end function function yy_r2_7() { - if (!$this->configBooleanize || - !in_array(strtolower($this->value), Array("true", "false", "on", "off", "yes", "no")) - ) { + !in_array(strtolower($this->value), array('true', 'false', 'on', 'off', 'yes', 'no'))) { $this->yypopstate(); $this->yypushstate(self::NAKED_STRING_VALUE); return true; //reprocess in new state @@ -435,23 +417,21 @@ class Smarty_Internal_Configfilelexer function yy_r2_8() { - $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; $this->yypopstate(); } function yy_r2_9() { - $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; - $this->value = ""; + $this->value = ''; $this->yypopstate(); - } + } // end function public function yylex3() { if (!isset($this->yy_global_pattern3)) { - $this->yy_global_pattern3 = "/\G([^\n]+?(?=[ \t\r]*\n))/isS"; + $this->yy_global_pattern3 = $this->replace("/\G([^\n]+?(?=[ \t\r]*\n))/isS"); } if (!isset($this->dataLength)) { $this->dataLength = strlen($this->data); @@ -459,17 +439,18 @@ class Smarty_Internal_Configfilelexer if ($this->counter >= $this->dataLength) { return false; // end of input } - do { - if (preg_match($this->yy_global_pattern3, $this->data, $yymatches, null, $this->counter)) { + if (preg_match($this->yy_global_pattern3, $this->data, $yymatches, 0, $this->counter)) { if (!isset($yymatches[ 0 ][ 1 ])) { $yymatches = preg_grep("/(.|\s)+/", $yymatches); } else { $yymatches = array_filter($yymatches); } if (empty($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . - substr($this->data, $this->counter, 5) . '... state NAKED_STRING_VALUE'); + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr($this->data, + $this->counter, + 5) . '... state NAKED_STRING_VALUE'); } next($yymatches); // skip global match $this->token = key($yymatches); // token number @@ -480,11 +461,11 @@ class Smarty_Internal_Configfilelexer $this->line += substr_count($this->value, "\n"); // accept this token return true; - } elseif ($r === true) { + } else if ($r === true) { // we have changed state // process this token in the new state return $this->yylex(); - } elseif ($r === false) { + } else if ($r === false) { $this->counter += strlen($this->value); $this->line += substr_count($this->value, "\n"); if ($this->counter >= $this->dataLength) { @@ -494,18 +475,15 @@ class Smarty_Internal_Configfilelexer continue; } } else { - throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]); + throw new Exception('Unexpected input at line' . $this->line . + ': ' . $this->data[ $this->counter ]); } break; - } - while (true); - } // end function - - const NAKED_STRING_VALUE = 3; + } while (true); + } function yy_r3_1() { - $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; $this->yypopstate(); } @@ -513,7 +491,7 @@ class Smarty_Internal_Configfilelexer public function yylex4() { if (!isset($this->yy_global_pattern4)) { - $this->yy_global_pattern4 = "/\G([ \t\r]+)|\G([^\n]+?(?=[ \t\r]*\n))|\G(\n)/isS"; + $this->yy_global_pattern4 = $this->replace("/\G([ \t\r]+)|\G([^\n]+?(?=[ \t\r]*\n))|\G(\n)/isS"); } if (!isset($this->dataLength)) { $this->dataLength = strlen($this->data); @@ -521,17 +499,18 @@ class Smarty_Internal_Configfilelexer if ($this->counter >= $this->dataLength) { return false; // end of input } - do { - if (preg_match($this->yy_global_pattern4, $this->data, $yymatches, null, $this->counter)) { + if (preg_match($this->yy_global_pattern4, $this->data, $yymatches, 0, $this->counter)) { if (!isset($yymatches[ 0 ][ 1 ])) { $yymatches = preg_grep("/(.|\s)+/", $yymatches); } else { $yymatches = array_filter($yymatches); } if (empty($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . - substr($this->data, $this->counter, 5) . '... state COMMENT'); + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr($this->data, + $this->counter, + 5) . '... state COMMENT'); } next($yymatches); // skip global match $this->token = key($yymatches); // token number @@ -542,11 +521,11 @@ class Smarty_Internal_Configfilelexer $this->line += substr_count($this->value, "\n"); // accept this token return true; - } elseif ($r === true) { + } else if ($r === true) { // we have changed state // process this token in the new state return $this->yylex(); - } elseif ($r === false) { + } else if ($r === false) { $this->counter += strlen($this->value); $this->line += substr_count($this->value, "\n"); if ($this->counter >= $this->dataLength) { @@ -556,30 +535,25 @@ class Smarty_Internal_Configfilelexer continue; } } else { - throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]); + throw new Exception('Unexpected input at line' . $this->line . + ': ' . $this->data[ $this->counter ]); } break; - } - while (true); - } // end function - - const COMMENT = 4; + } while (true); + } function yy_r4_1() { - return false; } function yy_r4_2() { - $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING; - } + } // end function function yy_r4_3() { - $this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE; $this->yypopstate(); } @@ -587,7 +561,7 @@ class Smarty_Internal_Configfilelexer public function yylex5() { if (!isset($this->yy_global_pattern5)) { - $this->yy_global_pattern5 = "/\G(\\.)|\G(.*?(?=[\.=[\]\r\n]))/isS"; + $this->yy_global_pattern5 = $this->replace("/\G(\\.)|\G(.*?(?=[\.=[\]\r\n]))/isS"); } if (!isset($this->dataLength)) { $this->dataLength = strlen($this->data); @@ -595,17 +569,18 @@ class Smarty_Internal_Configfilelexer if ($this->counter >= $this->dataLength) { return false; // end of input } - do { - if (preg_match($this->yy_global_pattern5, $this->data, $yymatches, null, $this->counter)) { + if (preg_match($this->yy_global_pattern5, $this->data, $yymatches, 0, $this->counter)) { if (!isset($yymatches[ 0 ][ 1 ])) { $yymatches = preg_grep("/(.|\s)+/", $yymatches); } else { $yymatches = array_filter($yymatches); } if (empty($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . - substr($this->data, $this->counter, 5) . '... state SECTION'); + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr($this->data, + $this->counter, + 5) . '... state SECTION'); } next($yymatches); // skip global match $this->token = key($yymatches); // token number @@ -616,11 +591,11 @@ class Smarty_Internal_Configfilelexer $this->line += substr_count($this->value, "\n"); // accept this token return true; - } elseif ($r === true) { + } else if ($r === true) { // we have changed state // process this token in the new state return $this->yylex(); - } elseif ($r === false) { + } else if ($r === false) { $this->counter += strlen($this->value); $this->line += substr_count($this->value, "\n"); if ($this->counter >= $this->dataLength) { @@ -630,32 +605,28 @@ class Smarty_Internal_Configfilelexer continue; } } else { - throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]); + throw new Exception('Unexpected input at line' . $this->line . + ': ' . $this->data[ $this->counter ]); } break; - } - while (true); - } // end function - - const SECTION = 5; + } while (true); + } function yy_r5_1() { - $this->token = Smarty_Internal_Configfileparser::TPC_DOT; } function yy_r5_2() { - $this->token = Smarty_Internal_Configfileparser::TPC_SECTION; $this->yypopstate(); - } + } // end function public function yylex6() { if (!isset($this->yy_global_pattern6)) { - $this->yy_global_pattern6 = "/\G(\"\"\"(?=[ \t\r]*[\n#;]))|\G([\S\s])/isS"; + $this->yy_global_pattern6 = $this->replace("/\G(\"\"\"(?=[ \t\r]*[\n#;]))|\G([\S\s])/isS"); } if (!isset($this->dataLength)) { $this->dataLength = strlen($this->data); @@ -663,17 +634,18 @@ class Smarty_Internal_Configfilelexer if ($this->counter >= $this->dataLength) { return false; // end of input } - do { - if (preg_match($this->yy_global_pattern6, $this->data, $yymatches, null, $this->counter)) { + if (preg_match($this->yy_global_pattern6, $this->data, $yymatches, 0, $this->counter)) { if (!isset($yymatches[ 0 ][ 1 ])) { $yymatches = preg_grep("/(.|\s)+/", $yymatches); } else { $yymatches = array_filter($yymatches); } if (empty($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . - substr($this->data, $this->counter, 5) . '... state TRIPPLE'); + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr($this->data, + $this->counter, + 5) . '... state TRIPPLE'); } next($yymatches); // skip global match $this->token = key($yymatches); // token number @@ -684,11 +656,11 @@ class Smarty_Internal_Configfilelexer $this->line += substr_count($this->value, "\n"); // accept this token return true; - } elseif ($r === true) { + } else if ($r === true) { // we have changed state // process this token in the new state return $this->yylex(); - } elseif ($r === false) { + } else if ($r === false) { $this->counter += strlen($this->value); $this->line += substr_count($this->value, "\n"); if ($this->counter >= $this->dataLength) { @@ -698,18 +670,15 @@ class Smarty_Internal_Configfilelexer continue; } } else { - throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]); + throw new Exception('Unexpected input at line' . $this->line . + ': ' . $this->data[ $this->counter ]); } break; - } - while (true); - } // end function - - const TRIPPLE = 6; + } while (true); + } function yy_r6_1() { - $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES_END; $this->yypopstate(); $this->yypushstate(self::START); @@ -717,16 +686,14 @@ class Smarty_Internal_Configfilelexer function yy_r6_2() { - $to = strlen($this->data); preg_match("/\"\"\"[ \t\r]*[\n#;]/", $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter); if (isset($match[ 0 ][ 1 ])) { $to = $match[ 0 ][ 1 ]; } else { - $this->compiler->trigger_template_error("missing or misspelled literal closing tag"); + $this->compiler->trigger_template_error('missing or misspelled literal closing tag'); } $this->value = substr($this->data, $this->counter, $to - $this->counter); $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_TEXT; } - } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_configfileparser.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_configfileparser.php index b7551a2b5..1c76f7bc8 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_configfileparser.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_configfileparser.php @@ -1,70 +1,5 @@ <?php -class TPC_yyToken implements ArrayAccess -{ - public $string = ''; - - public $metadata = array(); - - public function __construct($s, $m = array()) - { - if ($s instanceof TPC_yyToken) { - $this->string = $s->string; - $this->metadata = $s->metadata; - } else { - $this->string = (string) $s; - if ($m instanceof TPC_yyToken) { - $this->metadata = $m->metadata; - } elseif (is_array($m)) { - $this->metadata = $m; - } - } - } - - public function __toString() - { - return $this->string; - } - - public function offsetExists($offset) - { - return isset($this->metadata[ $offset ]); - } - - public function offsetGet($offset) - { - return $this->metadata[ $offset ]; - } - - public function offsetSet($offset, $value) - { - if ($offset === null) { - if (isset($value[ 0 ])) { - $x = ($value instanceof TPC_yyToken) ? $value->metadata : $value; - $this->metadata = array_merge($this->metadata, $x); - - return; - } - $offset = count($this->metadata); - } - if ($value === null) { - return; - } - if ($value instanceof TPC_yyToken) { - if ($value->metadata) { - $this->metadata[ $offset ] = $value->metadata; - } - } elseif ($value) { - $this->metadata[ $offset ] = $value; - } - } - - public function offsetUnset($offset) - { - unset($this->metadata[ $offset ]); - } -} - class TPC_yyStackEntry { public $stateno; /* The state-number */ @@ -74,8 +9,6 @@ class TPC_yyStackEntry ** is the value of the token */ } -; - #line 12 "../smarty/lexer/smarty_internal_configfileparser.y" /** @@ -91,74 +24,250 @@ class TPC_yyStackEntry class Smarty_Internal_Configfileparser { #line 25 "../smarty/lexer/smarty_internal_configfileparser.y" - + const TPC_OPENB = 1; + const TPC_SECTION = 2; + const TPC_CLOSEB = 3; + const TPC_DOT = 4; + const TPC_ID = 5; + const TPC_EQUAL = 6; + const TPC_FLOAT = 7; + const TPC_INT = 8; + const TPC_BOOL = 9; + const TPC_SINGLE_QUOTED_STRING = 10; + const TPC_DOUBLE_QUOTED_STRING = 11; + const TPC_TRIPPLE_QUOTES = 12; + const TPC_TRIPPLE_TEXT = 13; + const TPC_TRIPPLE_QUOTES_END = 14; + const TPC_NAKED_STRING = 15; + const TPC_OTHER = 16; + const TPC_NEWLINE = 17; + const TPC_COMMENTSTART = 18; + const YY_NO_ACTION = 60; + const YY_ACCEPT_ACTION = 59; + const YY_ERROR_ACTION = 58; + const YY_SZ_ACTTAB = 38; + const YY_SHIFT_USE_DFLT = -8; + const YY_SHIFT_MAX = 19; + const YY_REDUCE_USE_DFLT = -21; + const YY_REDUCE_MAX = 10; + const YYNOCODE = 29; + const YYSTACKDEPTH = 100; + const YYNSTATE = 36; + const YYNRULE = 22; + const YYERRORSYMBOL = 19; + const YYERRSYMDT = 'yy0'; + const YYFALLBACK = 0; + static public $yy_action = array( + 29, 30, 34, 33, 24, 13, 19, 25, 35, 21, + 59, 8, 3, 1, 20, 12, 14, 31, 20, 12, + 15, 17, 23, 18, 27, 26, 4, 5, 6, 32, + 2, 11, 28, 22, 16, 9, 7, 10, + ); + static public $yy_lookahead = array( + 7, 8, 9, 10, 11, 12, 5, 27, 15, 16, + 20, 21, 23, 23, 17, 18, 13, 14, 17, 18, + 15, 2, 17, 4, 25, 26, 6, 3, 3, 14, + 23, 1, 24, 17, 2, 25, 22, 25, + ); + static public $yy_shift_ofst = array( + -8, 1, 1, 1, -7, -3, -3, 30, -8, -8, + -8, 19, 5, 3, 15, 16, 24, 25, 32, 20, + ); + static public $yy_reduce_ofst = array( + -10, -1, -1, -1, -20, 10, 12, 8, 14, 7, + -11, + ); + static public $yyExpectedTokens = array( + array(), + array(5, 17, 18,), + array(5, 17, 18,), + array(5, 17, 18,), + array(7, 8, 9, 10, 11, 12, 15, 16,), + array(17, 18,), + array(17, 18,), + array(1,), + array(), + array(), + array(), + array(2, 4,), + array(15, 17,), + array(13, 14,), + array(14,), + array(17,), + array(3,), + array(3,), + array(2,), + array(6,), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + ); + static public $yy_default = array( + 44, 37, 41, 40, 58, 58, 58, 36, 39, 44, + 44, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 55, 54, 57, 56, 50, 45, 43, 42, 38, 46, + 47, 52, 51, 49, 48, 53, + ); + public static $yyFallback = array(); + public static $yyRuleName = array( + 'start ::= global_vars sections', + 'global_vars ::= var_list', + 'sections ::= sections section', + 'sections ::=', + 'section ::= OPENB SECTION CLOSEB newline var_list', + 'section ::= OPENB DOT SECTION CLOSEB newline var_list', + 'var_list ::= var_list newline', + 'var_list ::= var_list var', + 'var_list ::=', + 'var ::= ID EQUAL value', + 'value ::= FLOAT', + 'value ::= INT', + 'value ::= BOOL', + 'value ::= SINGLE_QUOTED_STRING', + 'value ::= DOUBLE_QUOTED_STRING', + 'value ::= TRIPPLE_QUOTES TRIPPLE_TEXT TRIPPLE_QUOTES_END', + 'value ::= TRIPPLE_QUOTES TRIPPLE_QUOTES_END', + 'value ::= NAKED_STRING', + 'value ::= OTHER', + 'newline ::= NEWLINE', + 'newline ::= COMMENTSTART NEWLINE', + 'newline ::= COMMENTSTART NAKED_STRING NEWLINE', + ); + public static $yyRuleInfo = array( + array(0 => 20, 1 => 2), + array(0 => 21, 1 => 1), + array(0 => 22, 1 => 2), + array(0 => 22, 1 => 0), + array(0 => 24, 1 => 5), + array(0 => 24, 1 => 6), + array(0 => 23, 1 => 2), + array(0 => 23, 1 => 2), + array(0 => 23, 1 => 0), + array(0 => 26, 1 => 3), + array(0 => 27, 1 => 1), + array(0 => 27, 1 => 1), + array(0 => 27, 1 => 1), + array(0 => 27, 1 => 1), + array(0 => 27, 1 => 1), + array(0 => 27, 1 => 3), + array(0 => 27, 1 => 2), + array(0 => 27, 1 => 1), + array(0 => 27, 1 => 1), + array(0 => 25, 1 => 1), + array(0 => 25, 1 => 2), + array(0 => 25, 1 => 3), + ); + public static $yyReduceMap = array( + 0 => 0, + 2 => 0, + 3 => 0, + 19 => 0, + 20 => 0, + 21 => 0, + 1 => 1, + 4 => 4, + 5 => 5, + 6 => 6, + 7 => 7, + 8 => 8, + 9 => 9, + 10 => 10, + 11 => 11, + 12 => 12, + 13 => 13, + 14 => 14, + 15 => 15, + 16 => 16, + 17 => 17, + 18 => 17, + ); + /** + * helper map + * + * @var array + */ + private static $escapes_single = array('\\' => '\\', + '\'' => '\''); /** * result status * * @var bool */ public $successful = true; - /** * return value * * @var mixed */ public $retvalue = 0; - /** * @var */ public $yymajor; - /** - * lexer object + * compiler object * - * @var Smarty_Internal_Configfilelexer + * @var Smarty_Internal_Config_File_Compiler */ - private $lex; - + public $compiler = null; /** - * internal error flag + * smarty object * - * @var bool + * @var Smarty */ - private $internalError = false; - + public $smarty = null; + public $yyTraceFILE; + public $yyTracePrompt; + public $yyidx; + public $yyerrcnt; + public $yystack = array(); + public $yyTokenName = array( + '$', 'OPENB', 'SECTION', 'CLOSEB', + 'DOT', 'ID', 'EQUAL', 'FLOAT', + 'INT', 'BOOL', 'SINGLE_QUOTED_STRING', 'DOUBLE_QUOTED_STRING', + 'TRIPPLE_QUOTES', 'TRIPPLE_TEXT', 'TRIPPLE_QUOTES_END', 'NAKED_STRING', + 'OTHER', 'NEWLINE', 'COMMENTSTART', 'error', + 'start', 'global_vars', 'sections', 'var_list', + 'section', 'newline', 'var', 'value', + ); /** - * compiler object + * lexer object * - * @var Smarty_Internal_Config_File_Compiler + * @var Smarty_Internal_Configfilelexer */ - public $compiler = null; - + private $lex; /** - * smarty object + * internal error flag * - * @var Smarty + * @var bool */ - public $smarty = null; - + private $internalError = false; /** * copy of config_overwrite property * * @var bool */ private $configOverwrite = false; - /** * copy of config_read_hidden property * * @var bool */ private $configReadHidden = false; - - /** - * helper map - * - * @var array - */ - private static $escapes_single = Array('\\' => '\\', '\'' => '\''); + private $_retvalue; /** * constructor @@ -175,22 +284,12 @@ class Smarty_Internal_Configfileparser $this->configReadHidden = $this->smarty->config_read_hidden; } - /** - * parse optional boolean keywords - * - * @param string $str - * - * @return bool - */ - private function parse_bool($str) + public static function yy_destructor($yymajor, $yypminor) { - $str = strtolower($str); - if (in_array($str, array('on', 'yes', 'true'))) { - $res = true; - } else { - $res = false; + switch ($yymajor) { + default: + break; /* If no destructor action specified: do nothing */ } - return $res; } /** @@ -205,10 +304,8 @@ class Smarty_Internal_Configfileparser private static function parse_single_quoted_string($qstr) { $escaped_string = substr($qstr, 1, strlen($qstr) - 2); //remove outer quotes - - $ss = preg_split('/(\\\\.)/', $escaped_string, - 1, PREG_SPLIT_DELIM_CAPTURE); - - $str = ""; + $ss = preg_split('/(\\\\.)/', $escaped_string, -1, PREG_SPLIT_DELIM_CAPTURE); + $str = ''; foreach ($ss as $s) { if (strlen($s) === 2 && $s[ 0 ] === '\\') { if (isset(self::$escapes_single[ $s[ 1 ] ])) { @@ -218,8 +315,7 @@ class Smarty_Internal_Configfileparser $str .= $s; } return $str; - } - + } /* Index of top element in stack */ /** * parse double quoted string * @@ -231,8 +327,7 @@ class Smarty_Internal_Configfileparser { $inner_str = substr($qstr, 1, strlen($qstr) - 2); return stripcslashes($inner_str); - } - + } /* Shifts left before out of the error */ /** * parse triple quoted string * @@ -243,153 +338,12 @@ class Smarty_Internal_Configfileparser private static function parse_tripple_double_quoted_string($qstr) { return stripcslashes($qstr); - } - - /** - * set a config variable in target array - * - * @param array $var - * @param array $target_array - */ - private function set_var(Array $var, Array &$target_array) - { - $key = $var[ "key" ]; - $value = $var[ "value" ]; - - if ($this->configOverwrite || !isset($target_array[ 'vars' ][ $key ])) { - $target_array[ 'vars' ][ $key ] = $value; - } else { - settype($target_array[ 'vars' ][ $key ], 'array'); - $target_array[ 'vars' ][ $key ][] = $value; - } - } - - /** - * add config variable to global vars - * - * @param array $vars - */ - private function add_global_vars(Array $vars) - { - if (!isset($this->compiler->config_data[ 'vars' ])) { - $this->compiler->config_data[ 'vars' ] = Array(); - } - foreach ($vars as $var) { - $this->set_var($var, $this->compiler->config_data); - } - } - - /** - * add config variable to section - * - * @param string $section_name - * @param array $vars - */ - private function add_section_vars($section_name, Array $vars) - { - if (!isset($this->compiler->config_data[ 'sections' ][ $section_name ][ 'vars' ])) { - $this->compiler->config_data[ 'sections' ][ $section_name ][ 'vars' ] = Array(); - } - foreach ($vars as $var) { - $this->set_var($var, $this->compiler->config_data[ 'sections' ][ $section_name ]); - } - } - - const TPC_OPENB = 1; - - const TPC_SECTION = 2; - - const TPC_CLOSEB = 3; - - const TPC_DOT = 4; - - const TPC_ID = 5; - - const TPC_EQUAL = 6; - - const TPC_FLOAT = 7; - - const TPC_INT = 8; - - const TPC_BOOL = 9; - - const TPC_SINGLE_QUOTED_STRING = 10; - - const TPC_DOUBLE_QUOTED_STRING = 11; - - const TPC_TRIPPLE_QUOTES = 12; - - const TPC_TRIPPLE_TEXT = 13; - - const TPC_TRIPPLE_QUOTES_END = 14; - - const TPC_NAKED_STRING = 15; - - const TPC_OTHER = 16; - - const TPC_NEWLINE = 17; - - const TPC_COMMENTSTART = 18; - - const YY_NO_ACTION = 60; - - const YY_ACCEPT_ACTION = 59; - - const YY_ERROR_ACTION = 58; - - const YY_SZ_ACTTAB = 38; - - static public $yy_action = array(29, 30, 34, 33, 24, 13, 19, 25, 35, 21, 59, 8, 3, 1, 20, 12, 14, 31, 20, 12, 15, - 17, 23, 18, 27, 26, 4, 5, 6, 32, 2, 11, 28, 22, 16, 9, 7, 10,); - - static public $yy_lookahead = array(7, 8, 9, 10, 11, 12, 5, 27, 15, 16, 20, 21, 23, 23, 17, 18, 13, 14, 17, 18, 15, - 2, 17, 4, 25, 26, 6, 3, 3, 14, 23, 1, 24, 17, 2, 25, 22, 25,); - - const YY_SHIFT_USE_DFLT = - 8; - - const YY_SHIFT_MAX = 19; - - static public $yy_shift_ofst = array(- 8, 1, 1, 1, - 7, - 3, - 3, 30, - 8, - 8, - 8, 19, 5, 3, 15, 16, 24, 25, 32, - 20,); - - const YY_REDUCE_USE_DFLT = - 21; - - const YY_REDUCE_MAX = 10; - - static public $yy_reduce_ofst = array(- 10, - 1, - 1, - 1, - 20, 10, 12, 8, 14, 7, - 11,); - - static public $yyExpectedTokens = array(array(), array(5, 17, 18,), array(5, 17, 18,), array(5, 17, 18,), - array(7, 8, 9, 10, 11, 12, 15, 16,), array(17, 18,), array(17, 18,), - array(1,), array(), array(), array(), array(2, 4,), array(15, 17,), - array(13, 14,), array(14,), array(17,), array(3,), array(3,), array(2,), - array(6,), array(), array(), array(), array(), array(), array(), array(), - array(), array(), array(), array(), array(), array(), array(), array(), - array(),); - - static public $yy_default = array(44, 37, 41, 40, 58, 58, 58, 36, 39, 44, 44, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 55, 54, 57, 56, 50, 45, 43, 42, 38, 46, 47, 52, 51, 49, 48, 53,); - - const YYNOCODE = 29; - - const YYSTACKDEPTH = 100; - - const YYNSTATE = 36; - - const YYNRULE = 22; - - const YYERRORSYMBOL = 19; - - const YYERRSYMDT = 'yy0'; - - const YYFALLBACK = 0; - - public static $yyFallback = array(); - + } /* The parser's stack */ public function Trace($TraceFILE, $zTracePrompt) { if (!$TraceFILE) { $zTracePrompt = 0; - } elseif (!$zTracePrompt) { + } else if (!$zTracePrompt) { $TraceFILE = 0; } $this->yyTraceFILE = $TraceFILE; @@ -402,31 +356,6 @@ class Smarty_Internal_Configfileparser $this->yyTracePrompt = '<br>'; } - public $yyTraceFILE; - - public $yyTracePrompt; - - public $yyidx; /* Index of top element in stack */ - public $yyerrcnt; /* Shifts left before out of the error */ - public $yystack = array(); /* The parser's stack */ - - public $yyTokenName = array('$', 'OPENB', 'SECTION', 'CLOSEB', 'DOT', 'ID', 'EQUAL', 'FLOAT', 'INT', 'BOOL', - 'SINGLE_QUOTED_STRING', 'DOUBLE_QUOTED_STRING', 'TRIPPLE_QUOTES', 'TRIPPLE_TEXT', - 'TRIPPLE_QUOTES_END', 'NAKED_STRING', 'OTHER', 'NEWLINE', 'COMMENTSTART', 'error', - 'start', 'global_vars', 'sections', 'var_list', 'section', 'newline', 'var', 'value',); - - public static $yyRuleName = array('start ::= global_vars sections', 'global_vars ::= var_list', - 'sections ::= sections section', 'sections ::=', - 'section ::= OPENB SECTION CLOSEB newline var_list', - 'section ::= OPENB DOT SECTION CLOSEB newline var_list', - 'var_list ::= var_list newline', 'var_list ::= var_list var', 'var_list ::=', - 'var ::= ID EQUAL value', 'value ::= FLOAT', 'value ::= INT', 'value ::= BOOL', - 'value ::= SINGLE_QUOTED_STRING', 'value ::= DOUBLE_QUOTED_STRING', - 'value ::= TRIPPLE_QUOTES TRIPPLE_TEXT TRIPPLE_QUOTES_END', - 'value ::= TRIPPLE_QUOTES TRIPPLE_QUOTES_END', 'value ::= NAKED_STRING', - 'value ::= OTHER', 'newline ::= NEWLINE', 'newline ::= COMMENTSTART NEWLINE', - 'newline ::= COMMENTSTART NAKED_STRING NEWLINE',); - public function tokenName($tokenType) { if ($tokenType === 0) { @@ -435,15 +364,7 @@ class Smarty_Internal_Configfileparser if ($tokenType > 0 && $tokenType < count($this->yyTokenName)) { return $this->yyTokenName[ $tokenType ]; } else { - return "Unknown"; - } - } - - public static function yy_destructor($yymajor, $yypminor) - { - switch ($yymajor) { - default: - break; /* If no destructor action specified: do nothing */ + return 'Unknown'; } } @@ -454,12 +375,13 @@ class Smarty_Internal_Configfileparser } $yytos = array_pop($this->yystack); if ($this->yyTraceFILE && $this->yyidx >= 0) { - fwrite($this->yyTraceFILE, $this->yyTracePrompt . 'Popping ' . $this->yyTokenName[ $yytos->major ] . "\n"); + fwrite($this->yyTraceFILE, + $this->yyTracePrompt . 'Popping ' . $this->yyTokenName[ $yytos->major ] . + "\n"); } $yymajor = $yytos->major; self::yy_destructor($yymajor, $yytos->minor); - $this->yyidx --; - + $this->yyidx--; return $yymajor; } @@ -496,7 +418,7 @@ class Smarty_Internal_Configfileparser // reduce action $done = 0; do { - if ($done ++ == 100) { + if ($done++ === 100) { $this->yyidx = $yyidx; $this->yystack = $stack; // too much recursion prevents proper detection @@ -505,8 +427,9 @@ class Smarty_Internal_Configfileparser } $yyruleno = $yyact - self::YYNSTATE; $this->yyidx -= self::$yyRuleInfo[ $yyruleno ][ 1 ]; - $nextstate = $this->yy_find_reduce_action($this->yystack[ $this->yyidx ]->stateno, - self::$yyRuleInfo[ $yyruleno ][ 0 ]); + $nextstate = $this->yy_find_reduce_action( + $this->yystack[ $this->yyidx ]->stateno, + self::$yyRuleInfo[ $yyruleno ][ 0 ]); if (isset(self::$yyExpectedTokens[ $nextstate ])) { $expected = array_merge($expected, self::$yyExpectedTokens[ $nextstate ]); if (isset($res4[ $nextstate ][ $token ])) { @@ -517,8 +440,7 @@ class Smarty_Internal_Configfileparser } } else { if ($res4[ $nextstate ][ $token ] = - in_array($token, self::$yyExpectedTokens[ $nextstate ], true) - ) { + in_array($token, self::$yyExpectedTokens[ $nextstate ], true)) { $this->yyidx = $yyidx; $this->yystack = $stack; return array_unique($expected); @@ -527,20 +449,20 @@ class Smarty_Internal_Configfileparser } if ($nextstate < self::YYNSTATE) { // we need to shift a non-terminal - $this->yyidx ++; + $this->yyidx++; $x = new TPC_yyStackEntry; $x->stateno = $nextstate; $x->major = self::$yyRuleInfo[ $yyruleno ][ 0 ]; $this->yystack[ $this->yyidx ] = $x; continue 2; - } elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) { + } else if ($nextstate === self::YYNSTATE + self::YYNRULE + 1) { $this->yyidx = $yyidx; $this->yystack = $stack; // the last token was just ignored, we can't accept // by ignoring input, this is in essence ignoring a // syntax error! return array_unique($expected); - } elseif ($nextstate === self::YY_NO_ACTION) { + } else if ($nextstate === self::YY_NO_ACTION) { $this->yyidx = $yyidx; $this->yystack = $stack; // input accepted, but not shifted (I guess) @@ -548,15 +470,12 @@ class Smarty_Internal_Configfileparser } else { $yyact = $nextstate; } - } - while (true); + } while (true); } break; - } - while (true); + } while (true); $this->yyidx = $yyidx; $this->yystack = $stack; - return array_unique($expected); } @@ -585,7 +504,7 @@ class Smarty_Internal_Configfileparser // reduce action $done = 0; do { - if ($done ++ == 100) { + if ($done++ === 100) { $this->yyidx = $yyidx; $this->yystack = $stack; // too much recursion prevents proper detection @@ -594,8 +513,9 @@ class Smarty_Internal_Configfileparser } $yyruleno = $yyact - self::YYNSTATE; $this->yyidx -= self::$yyRuleInfo[ $yyruleno ][ 1 ]; - $nextstate = $this->yy_find_reduce_action($this->yystack[ $this->yyidx ]->stateno, - self::$yyRuleInfo[ $yyruleno ][ 0 ]); + $nextstate = $this->yy_find_reduce_action( + $this->yystack[ $this->yyidx ]->stateno, + self::$yyRuleInfo[ $yyruleno ][ 0 ]); if (isset($res2[ $nextstate ][ $token ])) { if ($res2[ $nextstate ][ $token ]) { $this->yyidx = $yyidx; @@ -604,9 +524,9 @@ class Smarty_Internal_Configfileparser } } else { if ($res2[ $nextstate ][ $token ] = (isset(self::$yyExpectedTokens[ $nextstate ]) && - in_array($token, self::$yyExpectedTokens[ $nextstate ], - true)) - ) { + in_array($token, + self::$yyExpectedTokens[ $nextstate ], + true))) { $this->yyidx = $yyidx; $this->yystack = $stack; return true; @@ -614,13 +534,13 @@ class Smarty_Internal_Configfileparser } if ($nextstate < self::YYNSTATE) { // we need to shift a non-terminal - $this->yyidx ++; + $this->yyidx++; $x = new TPC_yyStackEntry; $x->stateno = $nextstate; $x->major = self::$yyRuleInfo[ $yyruleno ][ 0 ]; $this->yystack[ $this->yyidx ] = $x; continue 2; - } elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) { + } else if ($nextstate === self::YYNSTATE + self::YYNRULE + 1) { $this->yyidx = $yyidx; $this->yystack = $stack; if (!$token) { @@ -631,7 +551,7 @@ class Smarty_Internal_Configfileparser // by ignoring input, this is in essence ignoring a // syntax error! return false; - } elseif ($nextstate === self::YY_NO_ACTION) { + } else if ($nextstate === self::YY_NO_ACTION) { $this->yyidx = $yyidx; $this->yystack = $stack; // input accepted, but not shifted (I guess) @@ -639,22 +559,18 @@ class Smarty_Internal_Configfileparser } else { $yyact = $nextstate; } - } - while (true); + } while (true); } break; - } - while (true); + } while (true); $this->yyidx = $yyidx; $this->yystack = $stack; - return true; } public function yy_find_shift_action($iLookAhead) { $stateno = $this->yystack[ $this->yyidx ]->stateno; - /* if ($this->yyidx < 0) return self::YY_NO_ACTION; */ if (!isset(self::$yy_shift_ofst[ $stateno ])) { // no shift actions @@ -664,23 +580,22 @@ class Smarty_Internal_Configfileparser if ($i === self::YY_SHIFT_USE_DFLT) { return self::$yy_default[ $stateno ]; } - if ($iLookAhead == self::YYNOCODE) { + if ($iLookAhead === self::YYNOCODE) { return self::YY_NO_ACTION; } $i += $iLookAhead; - if ($i < 0 || $i >= self::YY_SZ_ACTTAB || self::$yy_lookahead[ $i ] != $iLookAhead) { - if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback) && - ($iFallback = self::$yyFallback[ $iLookAhead ]) != 0 - ) { + if ($i < 0 || $i >= self::YY_SZ_ACTTAB || + self::$yy_lookahead[ $i ] != $iLookAhead) { + if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback) + && ($iFallback = self::$yyFallback[ $iLookAhead ]) != 0) { if ($this->yyTraceFILE) { fwrite($this->yyTraceFILE, - $this->yyTracePrompt . "FALLBACK " . $this->yyTokenName[ $iLookAhead ] . " => " . + $this->yyTracePrompt . 'FALLBACK ' . + $this->yyTokenName[ $iLookAhead ] . ' => ' . $this->yyTokenName[ $iFallback ] . "\n"); } - return $this->yy_find_shift_action($iFallback); } - return self::$yy_default[ $stateno ]; } else { return self::$yy_action[ $i ]; @@ -690,19 +605,19 @@ class Smarty_Internal_Configfileparser public function yy_find_reduce_action($stateno, $iLookAhead) { /* $stateno = $this->yystack[$this->yyidx]->stateno; */ - if (!isset(self::$yy_reduce_ofst[ $stateno ])) { return self::$yy_default[ $stateno ]; } $i = self::$yy_reduce_ofst[ $stateno ]; - if ($i == self::YY_REDUCE_USE_DFLT) { + if ($i === self::YY_REDUCE_USE_DFLT) { return self::$yy_default[ $stateno ]; } - if ($iLookAhead == self::YYNOCODE) { + if ($iLookAhead === self::YYNOCODE) { return self::YY_NO_ACTION; } $i += $iLookAhead; - if ($i < 0 || $i >= self::YY_SZ_ACTTAB || self::$yy_lookahead[ $i ] != $iLookAhead) { + if ($i < 0 || $i >= self::YY_SZ_ACTTAB || + self::$yy_lookahead[ $i ] != $iLookAhead) { return self::$yy_default[ $stateno ]; } else { return self::$yy_action[ $i ]; @@ -711,9 +626,9 @@ class Smarty_Internal_Configfileparser public function yy_shift($yyNewState, $yyMajor, $yypMinor) { - $this->yyidx ++; + $this->yyidx++; if ($this->yyidx >= self::YYSTACKDEPTH) { - $this->yyidx --; + $this->yyidx--; if ($this->yyTraceFILE) { fprintf($this->yyTraceFILE, "%sStack Overflow!\n", $this->yyTracePrompt); } @@ -721,10 +636,8 @@ class Smarty_Internal_Configfileparser $this->yy_pop_parser_stack(); } #line 239 "../smarty/lexer/smarty_internal_configfileparser.y" - $this->internalError = true; - $this->compiler->trigger_config_file_error("Stack overflow in configfile parser"); - + $this->compiler->trigger_config_file_error('Stack overflow in configfile parser'); return; } $yytos = new TPC_yyStackEntry; @@ -733,141 +646,132 @@ class Smarty_Internal_Configfileparser $yytos->minor = $yypMinor; $this->yystack[] = $yytos; if ($this->yyTraceFILE && $this->yyidx > 0) { - fprintf($this->yyTraceFILE, "%sShift %d\n", $this->yyTracePrompt, $yyNewState); + fprintf($this->yyTraceFILE, + "%sShift %d\n", + $this->yyTracePrompt, + $yyNewState); fprintf($this->yyTraceFILE, "%sStack:", $this->yyTracePrompt); - for ($i = 1; $i <= $this->yyidx; $i ++) { - fprintf($this->yyTraceFILE, " %s", $this->yyTokenName[ $this->yystack[ $i ]->major ]); + for ($i = 1; $i <= $this->yyidx; $i++) { + fprintf($this->yyTraceFILE, + " %s", + $this->yyTokenName[ $this->yystack[ $i ]->major ]); } fwrite($this->yyTraceFILE, "\n"); } } - public static $yyRuleInfo = array(array(0 => 20, 1 => 2), array(0 => 21, 1 => 1), array(0 => 22, 1 => 2), - array(0 => 22, 1 => 0), array(0 => 24, 1 => 5), array(0 => 24, 1 => 6), - array(0 => 23, 1 => 2), array(0 => 23, 1 => 2), array(0 => 23, 1 => 0), - array(0 => 26, 1 => 3), array(0 => 27, 1 => 1), array(0 => 27, 1 => 1), - array(0 => 27, 1 => 1), array(0 => 27, 1 => 1), array(0 => 27, 1 => 1), - array(0 => 27, 1 => 3), array(0 => 27, 1 => 2), array(0 => 27, 1 => 1), - array(0 => 27, 1 => 1), array(0 => 25, 1 => 1), array(0 => 25, 1 => 2), - array(0 => 25, 1 => 3),); - - public static $yyReduceMap = array(0 => 0, 2 => 0, 3 => 0, 19 => 0, 20 => 0, 21 => 0, 1 => 1, 4 => 4, 5 => 5, - 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10, 11 => 11, 12 => 12, 13 => 13, 14 => 14, - 15 => 15, 16 => 16, 17 => 17, 18 => 17,); - - #line 245 "../smarty/lexer/smarty_internal_configfileparser.y" function yy_r0() { $this->_retvalue = null; } - #line 250 "../smarty/lexer/smarty_internal_configfileparser.y" function yy_r1() { $this->add_global_vars($this->yystack[ $this->yyidx + 0 ]->minor); $this->_retvalue = null; } - #line 264 "../smarty/lexer/smarty_internal_configfileparser.y" function yy_r4() { - $this->add_section_vars($this->yystack[ $this->yyidx + - 3 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor); + $this->add_section_vars($this->yystack[ $this->yyidx + -3 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor); $this->_retvalue = null; } - #line 269 "../smarty/lexer/smarty_internal_configfileparser.y" + #line 245 "../smarty/lexer/smarty_internal_configfileparser.y" function yy_r5() { if ($this->configReadHidden) { - $this->add_section_vars($this->yystack[ $this->yyidx + - 3 ]->minor, + $this->add_section_vars($this->yystack[ $this->yyidx + -3 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor); } $this->_retvalue = null; } - #line 277 "../smarty/lexer/smarty_internal_configfileparser.y" + #line 250 "../smarty/lexer/smarty_internal_configfileparser.y" function yy_r6() { - $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor; + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor; } - #line 281 "../smarty/lexer/smarty_internal_configfileparser.y" + #line 264 "../smarty/lexer/smarty_internal_configfileparser.y" function yy_r7() { $this->_retvalue = - array_merge($this->yystack[ $this->yyidx + - 1 ]->minor, Array($this->yystack[ $this->yyidx + 0 ]->minor)); + array_merge($this->yystack[ $this->yyidx + -1 ]->minor, array($this->yystack[ $this->yyidx + 0 ]->minor)); } - #line 285 "../smarty/lexer/smarty_internal_configfileparser.y" + #line 269 "../smarty/lexer/smarty_internal_configfileparser.y" function yy_r8() { - $this->_retvalue = Array(); + $this->_retvalue = array(); } - #line 291 "../smarty/lexer/smarty_internal_configfileparser.y" + #line 277 "../smarty/lexer/smarty_internal_configfileparser.y" function yy_r9() { - $this->_retvalue = Array("key" => $this->yystack[ $this->yyidx + - 2 ]->minor, - "value" => $this->yystack[ $this->yyidx + 0 ]->minor); + $this->_retvalue = array('key' => $this->yystack[ $this->yyidx + -2 ]->minor, + 'value' => $this->yystack[ $this->yyidx + 0 ]->minor); } - #line 296 "../smarty/lexer/smarty_internal_configfileparser.y" + #line 281 "../smarty/lexer/smarty_internal_configfileparser.y" function yy_r10() { - $this->_retvalue = (float) $this->yystack[ $this->yyidx + 0 ]->minor; + $this->_retvalue = (float)$this->yystack[ $this->yyidx + 0 ]->minor; } - #line 300 "../smarty/lexer/smarty_internal_configfileparser.y" + #line 285 "../smarty/lexer/smarty_internal_configfileparser.y" function yy_r11() { - $this->_retvalue = (int) $this->yystack[ $this->yyidx + 0 ]->minor; + $this->_retvalue = (int)$this->yystack[ $this->yyidx + 0 ]->minor; } - #line 304 "../smarty/lexer/smarty_internal_configfileparser.y" + #line 291 "../smarty/lexer/smarty_internal_configfileparser.y" function yy_r12() { $this->_retvalue = $this->parse_bool($this->yystack[ $this->yyidx + 0 ]->minor); } - #line 308 "../smarty/lexer/smarty_internal_configfileparser.y" + #line 296 "../smarty/lexer/smarty_internal_configfileparser.y" function yy_r13() { $this->_retvalue = self::parse_single_quoted_string($this->yystack[ $this->yyidx + 0 ]->minor); } - #line 312 "../smarty/lexer/smarty_internal_configfileparser.y" + #line 300 "../smarty/lexer/smarty_internal_configfileparser.y" function yy_r14() { $this->_retvalue = self::parse_double_quoted_string($this->yystack[ $this->yyidx + 0 ]->minor); } - #line 316 "../smarty/lexer/smarty_internal_configfileparser.y" + #line 304 "../smarty/lexer/smarty_internal_configfileparser.y" function yy_r15() { - $this->_retvalue = self::parse_tripple_double_quoted_string($this->yystack[ $this->yyidx + - 1 ]->minor); + $this->_retvalue = self::parse_tripple_double_quoted_string($this->yystack[ $this->yyidx + -1 ]->minor); } - #line 320 "../smarty/lexer/smarty_internal_configfileparser.y" + #line 308 "../smarty/lexer/smarty_internal_configfileparser.y" function yy_r16() { $this->_retvalue = ''; } - #line 324 "../smarty/lexer/smarty_internal_configfileparser.y" + #line 312 "../smarty/lexer/smarty_internal_configfileparser.y" function yy_r17() { $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor; } - private $_retvalue; - + #line 316 "../smarty/lexer/smarty_internal_configfileparser.y" public function yy_reduce($yyruleno) { - if ($this->yyTraceFILE && $yyruleno >= 0 && $yyruleno < count(self::$yyRuleName)) { - fprintf($this->yyTraceFILE, "%sReduce (%d) [%s].\n", $this->yyTracePrompt, $yyruleno, + if ($this->yyTraceFILE && $yyruleno >= 0 + && $yyruleno < count(self::$yyRuleName)) { + fprintf($this->yyTraceFILE, + "%sReduce (%d) [%s].\n", + $this->yyTracePrompt, + $yyruleno, self::$yyRuleName[ $yyruleno ]); } - $this->_retvalue = $yy_lefthand_side = null; if (isset(self::$yyReduceMap[ $yyruleno ])) { // call the action @@ -878,14 +782,14 @@ class Smarty_Internal_Configfileparser $yygoto = self::$yyRuleInfo[ $yyruleno ][ 0 ]; $yysize = self::$yyRuleInfo[ $yyruleno ][ 1 ]; $this->yyidx -= $yysize; - for ($i = $yysize; $i; $i --) { + for ($i = $yysize; $i; $i--) { // pop all of the right-hand side parameters array_pop($this->yystack); } $yyact = $this->yy_find_reduce_action($this->yystack[ $this->yyidx ]->stateno, $yygoto); if ($yyact < self::YYNSTATE) { if (!$this->yyTraceFILE && $yysize) { - $this->yyidx ++; + $this->yyidx++; $x = new TPC_yyStackEntry; $x->stateno = $yyact; $x->major = $yygoto; @@ -894,11 +798,12 @@ class Smarty_Internal_Configfileparser } else { $this->yy_shift($yyact, $yygoto, $yy_lefthand_side); } - } elseif ($yyact == self::YYNSTATE + self::YYNRULE + 1) { + } else if ($yyact === self::YYNSTATE + self::YYNRULE + 1) { $this->yy_accept(); } } + #line 320 "../smarty/lexer/smarty_internal_configfileparser.y" public function yy_parse_failed() { if ($this->yyTraceFILE) { @@ -909,10 +814,10 @@ class Smarty_Internal_Configfileparser } } + #line 324 "../smarty/lexer/smarty_internal_configfileparser.y" public function yy_syntax_error($yymajor, $TOKEN) { #line 232 "../smarty/lexer/smarty_internal_configfileparser.y" - $this->internalError = true; $this->yymajor = $yymajor; $this->compiler->trigger_config_file_error(); @@ -927,7 +832,6 @@ class Smarty_Internal_Configfileparser $this->yy_pop_parser_stack(); } #line 225 "../smarty/lexer/smarty_internal_configfileparser.y" - $this->successful = !$this->internalError; $this->internalError = false; $this->retvalue = $this->_retvalue; @@ -936,10 +840,9 @@ class Smarty_Internal_Configfileparser public function doParse($yymajor, $yytokenvalue) { $yyerrorhit = 0; /* True if yymajor has invoked an error */ - if ($this->yyidx === null || $this->yyidx < 0) { $this->yyidx = 0; - $this->yyerrcnt = - 1; + $this->yyerrcnt = -1; $x = new TPC_yyStackEntry; $x->stateno = 0; $x->major = 0; @@ -947,53 +850,61 @@ class Smarty_Internal_Configfileparser $this->yystack[] = $x; } $yyendofinput = ($yymajor == 0); - if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%sInput %s\n", $this->yyTracePrompt, $this->yyTokenName[ $yymajor ]); + fprintf($this->yyTraceFILE, + "%sInput %s\n", + $this->yyTracePrompt, + $this->yyTokenName[ $yymajor ]); } - do { $yyact = $this->yy_find_shift_action($yymajor); - if ($yymajor < self::YYERRORSYMBOL && !$this->yy_is_expected_token($yymajor)) { + if ($yymajor < self::YYERRORSYMBOL && + !$this->yy_is_expected_token($yymajor)) { // force a syntax error $yyact = self::YY_ERROR_ACTION; } if ($yyact < self::YYNSTATE) { $this->yy_shift($yyact, $yymajor, $yytokenvalue); - $this->yyerrcnt --; + $this->yyerrcnt--; if ($yyendofinput && $this->yyidx >= 0) { $yymajor = 0; } else { $yymajor = self::YYNOCODE; } - } elseif ($yyact < self::YYNSTATE + self::YYNRULE) { + } else if ($yyact < self::YYNSTATE + self::YYNRULE) { $this->yy_reduce($yyact - self::YYNSTATE); - } elseif ($yyact == self::YY_ERROR_ACTION) { + } else if ($yyact === self::YY_ERROR_ACTION) { if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%sSyntax Error!\n", $this->yyTracePrompt); + fprintf($this->yyTraceFILE, + "%sSyntax Error!\n", + $this->yyTracePrompt); } if (self::YYERRORSYMBOL) { if ($this->yyerrcnt < 0) { $this->yy_syntax_error($yymajor, $yytokenvalue); } $yymx = $this->yystack[ $this->yyidx ]->major; - if ($yymx == self::YYERRORSYMBOL || $yyerrorhit) { + if ($yymx === self::YYERRORSYMBOL || $yyerrorhit) { if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%sDiscard input token %s\n", $this->yyTracePrompt, + fprintf($this->yyTraceFILE, + "%sDiscard input token %s\n", + $this->yyTracePrompt, $this->yyTokenName[ $yymajor ]); } $this->yy_destructor($yymajor, $yytokenvalue); $yymajor = self::YYNOCODE; } else { - while ($this->yyidx >= 0 && $yymx != self::YYERRORSYMBOL && - ($yyact = $this->yy_find_shift_action(self::YYERRORSYMBOL)) >= self::YYNSTATE) { + while ($this->yyidx >= 0 && + $yymx !== self::YYERRORSYMBOL && + ($yyact = $this->yy_find_shift_action(self::YYERRORSYMBOL)) >= self::YYNSTATE + ) { $this->yy_pop_parser_stack(); } if ($this->yyidx < 0 || $yymajor == 0) { $this->yy_destructor($yymajor, $yytokenvalue); $this->yy_parse_failed(); $yymajor = self::YYNOCODE; - } elseif ($yymx != self::YYERRORSYMBOL) { + } else if ($yymx !== self::YYERRORSYMBOL) { $u2 = 0; $this->yy_shift($yyact, self::YYERRORSYMBOL, $u2); } @@ -1015,8 +926,74 @@ class Smarty_Internal_Configfileparser $this->yy_accept(); $yymajor = self::YYNOCODE; } + } while ($yymajor !== self::YYNOCODE && $this->yyidx >= 0); + } + + /** + * parse optional boolean keywords + * + * @param string $str + * + * @return bool + */ + private function parse_bool($str) + { + $str = strtolower($str); + if (in_array($str, array('on', 'yes', 'true'))) { + $res = true; + } else { + $res = false; + } + return $res; + } + + /** + * set a config variable in target array + * + * @param array $var + * @param array $target_array + */ + private function set_var(array $var, array &$target_array) + { + $key = $var[ 'key' ]; + $value = $var[ 'value' ]; + if ($this->configOverwrite || !isset($target_array[ 'vars' ][ $key ])) { + $target_array[ 'vars' ][ $key ] = $value; + } else { + settype($target_array[ 'vars' ][ $key ], 'array'); + $target_array[ 'vars' ][ $key ][] = $value; + } + } + + /** + * add config variable to global vars + * + * @param array $vars + */ + private function add_global_vars(array $vars) + { + if (!isset($this->compiler->config_data[ 'vars' ])) { + $this->compiler->config_data[ 'vars' ] = array(); + } + foreach ($vars as $var) { + $this->set_var($var, $this->compiler->config_data); + } + } + + /** + * add config variable to section + * + * @param string $section_name + * @param array $vars + */ + private function add_section_vars($section_name, array $vars) + { + if (!isset($this->compiler->config_data[ 'sections' ][ $section_name ][ 'vars' ])) { + $this->compiler->config_data[ 'sections' ][ $section_name ][ 'vars' ] = array(); + } + foreach ($vars as $var) { + $this->set_var($var, $this->compiler->config_data[ 'sections' ][ $section_name ]); } - while ($yymajor != self::YYNOCODE && $this->yyidx >= 0); } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_data.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_data.php index fd9c3020b..37b917b14 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_data.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_data.php @@ -19,6 +19,7 @@ * The following methods will be dynamically loaded by the extension handler when they are called. * They are located in a corresponding Smarty_Internal_Method_xxxx class * + * @method mixed _getConfigVariable(string $varName, bool $errorEnable = true) * @method mixed getConfigVariable(string $varName, bool $errorEnable = true) * @method mixed getConfigVars(string $varName = null, bool $searchParents = true) * @method mixed getGlobal(string $varName = null) @@ -28,7 +29,7 @@ * @method Smarty_Internal_Data clearConfig(string $varName = null) * @method Smarty_Internal_Data configLoad(string $config_file, mixed $sections = null, string $scope = 'local') */ -class Smarty_Internal_Data +abstract class Smarty_Internal_Data { /** * This object type (Smarty = 1, template = 2, data = 4) @@ -54,7 +55,7 @@ class Smarty_Internal_Data /** * parent template (if any) * - * @var Smarty|Smarty_Internal_Template|Smarty_Internal_Data + * @var Smarty|Smarty_Internal_Template|Smarty_Data */ public $parent = null; @@ -100,7 +101,7 @@ class Smarty_Internal_Data $this->assign($_key, $_val, $nocache); } } else { - if ($tpl_var != '') { + if ($tpl_var !== '') { if ($this->_objType === 2) { /** @var Smarty_Internal_Template $this */ $this->_assignInScope($tpl_var, $value, $nocache); diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_debug.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_debug.php index f16bd3fb1..c826a1786 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_debug.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_debug.php @@ -193,6 +193,9 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data * * @param Smarty_Internal_Template|Smarty $obj object to debug * @param bool $full + * + * @throws \Exception + * @throws \SmartyException */ public function display_debug($obj, $full = false) { @@ -210,7 +213,7 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data // init properties by hand as user may have edited the original Smarty class $debObj->setPluginsDir(is_dir(__DIR__ . '/../plugins') ? __DIR__ . '/../plugins' : $smarty->getPluginsDir()); $debObj->force_compile = false; - $debObj->compile_check = true; + $debObj->compile_check = Smarty::COMPILECHECK_ON; $debObj->left_delimiter = '{'; $debObj->right_delimiter = '}'; $debObj->security_policy = null; @@ -224,7 +227,7 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data $debObj->autoload_filters = array(); $debObj->default_modifiers = array(); $debObj->escape_html = true; - $debObj->caching = false; + $debObj->caching = Smarty::CACHING_OFF; $debObj->compile_id = null; $debObj->cache_id = null; // prepare information of assigned variables @@ -239,7 +242,7 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data if ($obj->_isTplObj()) { $_template->assign('template_name', $obj->source->type . ':' . $obj->source->name); } - if ($obj->_objType == 1 || $full) { + if ($obj->_objType === 1 || $full) { $_template->assign('template_data', $this->template_data[ $this->index ]); } else { $_template->assign('template_data', null); @@ -247,7 +250,7 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data $_template->assign('assigned_vars', $_assigned_vars); $_template->assign('config_vars', $_config_vars); $_template->assign('execution_time', microtime(true) - $smarty->start_time); - $_template->assign('display_mode', $debugging == 2 || !$full); + $_template->assign('display_mode', $debugging === 2 || !$full); $_template->assign('offset', $this->offset * 50); echo $_template->fetch(); if (isset($full)) { @@ -281,15 +284,15 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data $tpl_vars = array(); foreach ($obj->tpl_vars as $key => $var) { foreach ($var as $varkey => $varvalue) { - if ($varkey == 'value') { + if ($varkey === 'value') { $tpl_vars[ $key ][ $varkey ] = $varvalue; } else { - if ($varkey == 'nocache') { - if ($varvalue == true) { + if ($varkey === 'nocache') { + if ($varvalue === true) { $tpl_vars[ $key ][ $varkey ] = $varvalue; } } else { - if ($varkey != 'scope' || $varvalue !== 0) { + if ($varkey !== 'scope' || $varvalue !== 0) { $tpl_vars[ $key ][ 'attributes' ][ $varkey ] = $varvalue; } } @@ -323,15 +326,15 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data foreach (Smarty::$global_tpl_vars as $key => $var) { if (!array_key_exists($key, $tpl_vars)) { foreach ($var as $varkey => $varvalue) { - if ($varkey == 'value') { + if ($varkey === 'value') { $tpl_vars[ $key ][ $varkey ] = $varvalue; } else { - if ($varkey == 'nocache') { - if ($varvalue == true) { + if ($varkey === 'nocache') { + if ($varvalue === true) { $tpl_vars[ $key ][ $varkey ] = $varvalue; } } else { - if ($varkey != 'scope' || $varvalue !== 0) { + if ($varkey !== 'scope' || $varvalue !== 0) { $tpl_vars[ $key ][ 'attributes' ][ $varkey ] = $varvalue; } } @@ -356,7 +359,7 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data { static $_is_stringy = array('string' => true, 'eval' => true); // calculate Uid if not already done - if ($template->source->uid == '') { + if ($template->source->uid === '') { $template->source->filepath; } $key = $template->source->uid; @@ -386,7 +389,7 @@ class Smarty_Internal_Debug extends Smarty_Internal_Data public function ignore(Smarty_Internal_Template $template) { // calculate Uid if not already done - if ($template->source->uid == '') { + if ($template->source->uid === '') { $template->source->filepath; } $this->ignore_uid[ $template->source->uid ] = true; diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_errorhandler.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_errorhandler.php new file mode 100644 index 000000000..831421833 --- /dev/null +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_errorhandler.php @@ -0,0 +1,112 @@ +<?php + +/** + * Smarty error handler + * + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + * + * @deprecated +Smarty does no longer use @filemtime() + */ +class Smarty_Internal_ErrorHandler +{ + /** + * contains directories outside of SMARTY_DIR that are to be muted by muteExpectedErrors() + */ + public static $mutedDirectories = array(); + /** + * error handler returned by set_error_handler() in self::muteExpectedErrors() + */ + private static $previousErrorHandler = null; + + /** + * Enable error handler to mute expected messages + * + * @return boolean + */ + public static function muteExpectedErrors() + { + /* + error muting is done because some people implemented custom error_handlers using + http://php.net/set_error_handler and for some reason did not understand the following paragraph: + + It is important to remember that the standard PHP error handler is completely bypassed for the + error types specified by error_types unless the callback function returns FALSE. + error_reporting() settings will have no effect and your error handler will be called regardless - + however you are still able to read the current value of error_reporting and act appropriately. + Of particular note is that this value will be 0 if the statement that caused the error was + prepended by the @ error-control operator. + + Smarty deliberately uses @filemtime() over file_exists() and filemtime() in some places. Reasons include + - @filemtime() is almost twice as fast as using an additional file_exists() + - between file_exists() and filemtime() a possible race condition is opened, + which does not exist using the simple @filemtime() approach. + */ + $error_handler = array('Smarty_Internal_ErrorHandler', 'mutingErrorHandler'); + $previous = set_error_handler($error_handler); + // avoid dead loops + if ($previous !== $error_handler) { + self::$previousErrorHandler = $previous; + } + } + + /** + * Error Handler to mute expected messages + * + * @link http://php.net/set_error_handler + * + * @param integer $errno Error level + * @param $errstr + * @param $errfile + * @param $errline + * @param $errcontext + * + * @return bool + */ + public static function mutingErrorHandler($errno, $errstr, $errfile, $errline, $errcontext) + { + $_is_muted_directory = false; + // add the SMARTY_DIR to the list of muted directories + if (!isset(self::$mutedDirectories[ SMARTY_DIR ])) { + $smarty_dir = realpath(SMARTY_DIR); + if ($smarty_dir !== false) { + self::$mutedDirectories[ SMARTY_DIR ] = + array('file' => $smarty_dir, 'length' => strlen($smarty_dir),); + } + } + // walk the muted directories and test against $errfile + foreach (self::$mutedDirectories as $key => &$dir) { + if (!$dir) { + // resolve directory and length for speedy comparisons + $file = realpath($key); + if ($file === false) { + // this directory does not exist, remove and skip it + unset(self::$mutedDirectories[ $key ]); + continue; + } + $dir = array('file' => $file, 'length' => strlen($file),); + } + if (!strncmp($errfile, $dir[ 'file' ], $dir[ 'length' ])) { + $_is_muted_directory = true; + break; + } + } + // pass to next error handler if this error did not occur inside SMARTY_DIR + // or the error was within smarty but masked to be ignored + if (!$_is_muted_directory || ($errno && $errno & error_reporting())) { + if (self::$previousErrorHandler) { + return call_user_func(self::$previousErrorHandler, + $errno, + $errstr, + $errfile, + $errline, + $errcontext); + } else { + return false; + } + } + } +}
\ No newline at end of file diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_extension_handler.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_extension_handler.php index 340e6dee1..90d3b81ea 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_extension_handler.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_extension_handler.php @@ -27,14 +27,15 @@ * Method extensions * @property Smarty_Internal_Method_GetTemplateVars $getTemplateVars * @property Smarty_Internal_Method_Append $append - * @property Smarty_Internal_Method_AppendByRef $appendByRef - * @property Smarty_Internal_Method_AssignGlobal $assignGlobal - * @property Smarty_Internal_Method_AssignByRef $assignByRef - * @property Smarty_Internal_Method_LoadFilter $loadFilter - * @property Smarty_Internal_Method_LoadPlugin $loadPlugin - * @property Smarty_Internal_Method_RegisterFilter $registerFilter - * @property Smarty_Internal_Method_RegisterObject $registerObject - * @property Smarty_Internal_Method_RegisterPlugin $registerPlugin + * @property Smarty_Internal_Method_AppendByRef $appendByRef + * @property Smarty_Internal_Method_AssignGlobal $assignGlobal + * @property Smarty_Internal_Method_AssignByRef $assignByRef + * @property Smarty_Internal_Method_LoadFilter $loadFilter + * @property Smarty_Internal_Method_LoadPlugin $loadPlugin + * @property Smarty_Internal_Method_RegisterFilter $registerFilter + * @property Smarty_Internal_Method_RegisterObject $registerObject + * @property Smarty_Internal_Method_RegisterPlugin $registerPlugin + * @property mixed|\Smarty_Template_Cached configLoad */ class Smarty_Internal_Extension_Handler { @@ -47,9 +48,9 @@ class Smarty_Internal_Extension_Handler * * @var array */ - private $_property_info = array('AutoloadFilters' => 0, 'DefaultModifiers' => 0, 'ConfigVars' => 0, - 'DebugTemplate' => 0, 'RegisteredObject' => 0, 'StreamVariable' => 0, - 'TemplateVars' => 0,);# + private $_property_info = array('AutoloadFilters' => 0, 'DefaultModifiers' => 0, 'ConfigVars' => 0, + 'DebugTemplate' => 0, 'RegisteredObject' => 0, 'StreamVariable' => 0, + 'TemplateVars' => 0, 'Literals' => 'Literals',);# private $resolvedProperties = array(); @@ -68,38 +69,62 @@ class Smarty_Internal_Extension_Handler /* @var Smarty $data ->smarty */ $smarty = isset($data->smarty) ? $data->smarty : $data; if (!isset($smarty->ext->$name)) { - $class = 'Smarty_Internal_Method_' . $this->upperCase($name); - if (preg_match('/^(set|get)([A-Z].*)$/', $name, $match)) { - $pn = ''; - if (!isset($this->_property_info[ $prop = $match[ 2 ] ])) { - // convert camel case to underscored name - $this->resolvedProperties[ $prop ] = $pn = strtolower(join('_', - preg_split('/([A-Z][^A-Z]*)/', $prop, - - 1, PREG_SPLIT_NO_EMPTY | - PREG_SPLIT_DELIM_CAPTURE))); - $this->_property_info[ $prop ] = - property_exists($data, $pn) ? 1 : ($data->_isTplObj() && property_exists($smarty, $pn) ? 2 : 0); + if (preg_match('/^((set|get)|(.*?))([A-Z].*)$/', $name, $match)) { + $basename = $this->upperCase($match[4]); + if (!isset($smarty->ext->$basename) && isset($this->_property_info[ $basename ]) && + is_string($this->_property_info[ $basename ])) { + $class = 'Smarty_Internal_Method_' . $this->_property_info[ $basename ]; + if (class_exists($class)) { + $classObj = new $class(); + $methodes = get_class_methods($classObj); + foreach ($methodes as $method) { + $smarty->ext->$method = $classObj; + } + } } - if ($this->_property_info[ $prop ]) { - $pn = $this->resolvedProperties[ $prop ]; - if ($match[ 1 ] == 'get') { - return $this->_property_info[ $prop ] == 1 ? $data->$pn : $data->smarty->$pn; - } else { - return $this->_property_info[ $prop ] == 1 ? $data->$pn = $args[ 0 ] : - $data->smarty->$pn = $args[ 0 ]; + if (!empty($match[2]) && !isset($smarty->ext->$name)) { + $class = 'Smarty_Internal_Method_' . $this->upperCase($name); + if (!class_exists($class)) { + $objType = $data->_objType; + $propertyType = false; + if (!isset($this->resolvedProperties[ $match[0] ][ $objType ])) { + $property = isset($this->resolvedProperties['property'][ $basename ]) ? + $this->resolvedProperties['property'][ $basename ] : + $property = $this->resolvedProperties['property'][ $basename ] = strtolower(join('_', + preg_split('/([A-Z][^A-Z]*)/', + $basename, + -1, + PREG_SPLIT_NO_EMPTY | + PREG_SPLIT_DELIM_CAPTURE))); + + if ($property !== false) { + if (property_exists($data, $property)) { + $propertyType = $this->resolvedProperties[ $match[0] ][ $objType ] = 1; + } else if (property_exists($smarty, $property)) { + $propertyType = $this->resolvedProperties[ $match[0] ][ $objType ] = 2; + } else { + $this->resolvedProperties['property'][ $basename ] = $property = false; + } + } + } else { + $propertyType = $this->resolvedProperties[ $match[0] ][ $objType ]; + $property = $this->resolvedProperties['property'][ $basename ]; + } + if ($propertyType) { + $obj = $propertyType === 1 ? $data : $smarty; + if ($match[2] === 'get') { + return $obj->$property; + } else if ($match[2] === 'set') { + return $obj->$property = $args[0]; + } + } } - } elseif (!class_exists($class)) { - throw new SmartyException("property '$pn' does not exist."); } } - if (class_exists($class)) { - $callback = array($smarty->ext->$name = new $class(), $name); - } - } else { - $callback = array($smarty->ext->$name, $name); } + $callback = array($smarty->ext->$name, $name); array_unshift($args, $data); - if (isset($callback) && $callback[ 0 ]->objMap | $data->_objType) { + if (isset($callback) && $callback[0]->objMap | $data->_objType) { return call_user_func_array($callback, $args); } return call_user_func_array(array(new Smarty_Internal_Undefined(), $name), $args); @@ -120,19 +145,6 @@ class Smarty_Internal_Extension_Handler } /** - * set extension property - * - * @param string $property_name property name - * @param mixed $value value - * - * @throws SmartyException - */ - public function __set($property_name, $value) - { - $this->$property_name = $value; - } - - /** * get extension object * * @param string $property_name property name @@ -143,7 +155,7 @@ class Smarty_Internal_Extension_Handler public function __get($property_name) { // object properties of runtime template extensions will start with '_' - if ($property_name[ 0 ] == '_') { + if ($property_name[0] === '_') { $class = 'Smarty_Internal_Runtime' . $this->upperCase($property_name); } else { $class = 'Smarty_Internal_Method_' . $this->upperCase($property_name); @@ -155,6 +167,19 @@ class Smarty_Internal_Extension_Handler } /** + * set extension property + * + * @param string $property_name property name + * @param mixed $value value + * + * @throws SmartyException + */ + public function __set($property_name, $value) + { + $this->$property_name = $value; + } + + /** * Call error handler for undefined method * * @param string $name unknown method-name diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_addautoloadfilters.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_addautoloadfilters.php index 3eef8a28c..7bd75bfb5 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_addautoloadfilters.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_addautoloadfilters.php @@ -11,7 +11,6 @@ */ class Smarty_Internal_Method_AddAutoloadFilters extends Smarty_Internal_Method_SetAutoloadFilters { - /** * Add autoload filters * @@ -25,6 +24,7 @@ class Smarty_Internal_Method_AddAutoloadFilters extends Smarty_Internal_Method_S * the appropriate types * * @return \Smarty|\Smarty_Internal_Template + * @throws \SmartyException */ public function addAutoloadFilters(Smarty_Internal_TemplateBase $obj, $filters, $type = null) { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_append.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_append.php index af6935919..a1422cf5a 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_append.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_append.php @@ -38,12 +38,12 @@ class Smarty_Internal_Method_Append if (is_array($tpl_var)) { // $tpl_var is an array, ignore $value foreach ($tpl_var as $_key => $_val) { - if ($_key != '') { + if ($_key !== '') { $this->append($data, $_key, $_val, $merge, $nocache); } } } else { - if ($tpl_var != '' && isset($value)) { + if ($tpl_var !== '' && isset($value)) { if (!isset($data->tpl_vars[ $tpl_var ])) { $tpl_var_inst = $data->ext->getTemplateVars->_getVariable($data, $tpl_var, null, true, false); if ($tpl_var_inst instanceof Smarty_Undefined_Variable) { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_appendbyref.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_appendbyref.php index 532ac9509..9185a8e83 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_appendbyref.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_appendbyref.php @@ -27,7 +27,7 @@ class Smarty_Internal_Method_AppendByRef */ public static function appendByRef(Smarty_Internal_Data $data, $tpl_var, &$value, $merge = false) { - if ($tpl_var != '' && isset($value)) { + if ($tpl_var !== '' && isset($value)) { if (!isset($data->tpl_vars[ $tpl_var ])) { $data->tpl_vars[ $tpl_var ] = new Smarty_Variable(); } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_assignbyref.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_assignbyref.php index 0060bbc5f..1c513ce99 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_assignbyref.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_assignbyref.php @@ -24,7 +24,7 @@ class Smarty_Internal_Method_AssignByRef */ public function assignByRef(Smarty_Internal_Data $data, $tpl_var, &$value, $nocache) { - if ($tpl_var != '') { + if ($tpl_var !== '') { $data->tpl_vars[ $tpl_var ] = new Smarty_Variable(null, $nocache); $data->tpl_vars[ $tpl_var ]->value = &$value; if ($data->_isTplObj() && $data->scope) { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_assignglobal.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_assignglobal.php index 3c2b26049..0e1690418 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_assignglobal.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_assignglobal.php @@ -30,7 +30,7 @@ class Smarty_Internal_Method_AssignGlobal */ public function assignGlobal(Smarty_Internal_Data $data, $varName, $value = null, $nocache = false) { - if ($varName != '') { + if ($varName !== '') { Smarty::$global_tpl_vars[ $varName ] = new Smarty_Variable($value, $nocache); $ptr = $data; while ($ptr->_isTplObj()) { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearallcache.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearallcache.php index 5879f9a06..9641e2baa 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearallcache.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearallcache.php @@ -28,7 +28,8 @@ class Smarty_Internal_Method_ClearAllCache * @param integer $exp_time expiration time * @param string $type resource type * - * @return integer number of cache files deleted + * @return int number of cache files deleted + * @throws \SmartyException */ public function clearAllCache(Smarty $smarty, $exp_time = null, $type = null) { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearcache.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearcache.php index 95649a777..6d56c13d5 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearcache.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearcache.php @@ -31,7 +31,8 @@ class Smarty_Internal_Method_ClearCache * @param integer $exp_time expiration time * @param string $type resource type * - * @return integer number of cache files deleted + * @return int number of cache files deleted + * @throws \SmartyException */ public function clearCache(Smarty $smarty, $template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null) diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php index a1f1a80bb..c019c59db 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php @@ -29,27 +29,27 @@ class Smarty_Internal_Method_ClearCompiledTemplate * @param string $compile_id compile id * @param integer $exp_time expiration time * - * @return integer number of template files deleted + * @return int number of template files deleted + * @throws \SmartyException */ public function clearCompiledTemplate(Smarty $smarty, $resource_name = null, $compile_id = null, $exp_time = null) { // clear template objects cache $smarty->_clearTemplateCache(); - $_compile_dir = $smarty->getCompileDir(); - if ($_compile_dir == '/') { //We should never want to delete this! + if ($_compile_dir === '/') { //We should never want to delete this! return 0; } $_compile_id = isset($compile_id) ? preg_replace('![^\w]+!', '_', $compile_id) : null; - $_dir_sep = $smarty->use_sub_dirs ? $smarty->ds : '^'; + $_dir_sep = $smarty->use_sub_dirs ? DIRECTORY_SEPARATOR : '^'; if (isset($resource_name)) { $_save_stat = $smarty->caching; - $smarty->caching = false; + $smarty->caching = Smarty::CACHING_OFF; /* @var Smarty_Internal_Template $tpl */ $tpl = $smarty->createTemplate($resource_name); $smarty->caching = $_save_stat; if (!$tpl->source->handler->uncompiled && !$tpl->source->handler->recompiled && $tpl->source->exists) { - $_resource_part_1 = basename(str_replace('^', $smarty->ds, $tpl->compiled->filepath)); + $_resource_part_1 = basename(str_replace('^', DIRECTORY_SEPARATOR, $tpl->compiled->filepath)); $_resource_part_1_length = strlen($_resource_part_1); } else { return 0; @@ -75,10 +75,10 @@ class Smarty_Internal_Method_ClearCompiledTemplate } $_compile = new RecursiveIteratorIterator($_compileDirs, RecursiveIteratorIterator::CHILD_FIRST); foreach ($_compile as $_file) { - if (substr(basename($_file->getPathname()), 0, 1) == '.') { + if (substr(basename($_file->getPathname()), 0, 1) === '.') { continue; } - $_filepath = (string) $_file; + $_filepath = (string)$_file; if ($_file->isDir()) { if (!$_compile->isDot()) { // delete folder if empty @@ -93,26 +93,32 @@ class Smarty_Internal_Method_ClearCompiledTemplate if ((!isset($_compile_id) || (isset($_filepath[ $_compile_id_part_length ]) && $a = !strncmp($_filepath, $_compile_id_part, $_compile_id_part_length))) && (!isset($resource_name) || (isset($_filepath[ $_resource_part_1_length ]) && - substr_compare($_filepath, $_resource_part_1, - - $_resource_part_1_length, $_resource_part_1_length) == + substr_compare($_filepath, + $_resource_part_1, + -$_resource_part_1_length, + $_resource_part_1_length) === 0) || (isset($_filepath[ $_resource_part_2_length ]) && - substr_compare($_filepath, $_resource_part_2, - - $_resource_part_2_length, - $_resource_part_2_length) == 0)) + substr_compare($_filepath, + $_resource_part_2, + -$_resource_part_2_length, + $_resource_part_2_length) === 0)) ) { if (isset($exp_time)) { - if (time() - @filemtime($_filepath) >= $exp_time) { + if (is_file($_filepath) && time() - filemtime($_filepath) >= $exp_time) { $unlink = true; } } else { $unlink = true; } } - - if ($unlink && @unlink($_filepath)) { - $_count ++; - if (function_exists('opcache_invalidate') && strlen(ini_get("opcache.restrict_api")) < 1) { + if ($unlink && is_file($_filepath) && @unlink($_filepath)) { + $_count++; + if (function_exists('opcache_invalidate') + && (!function_exists('ini_get') || strlen(ini_get('opcache.restrict_api')) < 1) + ) { opcache_invalidate($_filepath, true); + } else if (function_exists('apc_delete_file')) { + apc_delete_file($_filepath); } } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_compilealltemplates.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_compilealltemplates.php index 0abed2124..64912599f 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_compilealltemplates.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_compilealltemplates.php @@ -1,5 +1,4 @@ <?php - /** * Smarty Method CompileAllTemplates * @@ -31,7 +30,10 @@ class Smarty_Internal_Method_CompileAllTemplates * * @return integer number of template files recompiled */ - public function compileAllTemplates(Smarty $smarty, $extension = '.tpl', $force_compile = false, $time_limit = 0, + public function compileAllTemplates(Smarty $smarty, + $extension = '.tpl', + $force_compile = false, + $time_limit = 0, $max_errors = null) { return $this->compileAll($smarty, $extension, $force_compile, $time_limit, $max_errors); @@ -49,7 +51,11 @@ class Smarty_Internal_Method_CompileAllTemplates * * @return int number of template files compiled */ - protected function compileAll(Smarty $smarty, $extension, $force_compile, $time_limit, $max_errors, + protected function compileAll(Smarty $smarty, + $extension, + $force_compile, + $time_limit, + $max_errors, $isConfig = false) { // switch off time limit @@ -66,20 +72,20 @@ class Smarty_Internal_Method_CompileAllTemplates $_dir_2 = new RecursiveIteratorIterator($_dir_1); foreach ($_dir_2 as $_fileinfo) { $_file = $_fileinfo->getFilename(); - if (substr(basename($_fileinfo->getPathname()), 0, 1) == '.' || strpos($_file, '.svn') !== false) { + if (substr(basename($_fileinfo->getPathname()), 0, 1) === '.' || strpos($_file, '.svn') !== false) { continue; } - if (!substr_compare($_file, $extension, - strlen($extension)) == 0) { + if (!substr_compare($_file, $extension, -strlen($extension)) === 0) { continue; } - if ($_fileinfo->getPath() !== substr($_dir, 0, - 1)) { - $_file = substr($_fileinfo->getPath(), strlen($_dir)) . $smarty->ds . $_file; + if ($_fileinfo->getPath() !== substr($_dir, 0, -1)) { + $_file = substr($_fileinfo->getPath(), strlen($_dir)) . DIRECTORY_SEPARATOR . $_file; } echo "\n<br>", $_dir, '---', $_file; flush(); $_start_time = microtime(true); $_smarty = clone $smarty; - // + // $_smarty->_cache = array(); $_smarty->ext = new Smarty_Internal_Extension_Handler(); $_smarty->ext->objType = $_smarty->_objType; @@ -92,7 +98,7 @@ class Smarty_Internal_Method_CompileAllTemplates $isConfig ? Smarty_Template_Config::load($_tpl) : Smarty_Template_Source::load($_tpl); if ($_tpl->mustCompile()) { $_tpl->compileTemplateSource(); - $_count ++; + $_count++; echo ' compiled in ', microtime(true) - $_start_time, ' seconds'; flush(); } else { @@ -102,14 +108,14 @@ class Smarty_Internal_Method_CompileAllTemplates } catch (Exception $e) { echo "\n<br> ------>Error: ", $e->getMessage(), "<br><br>\n"; - $_error_count ++; + $_error_count++; } // free memory unset($_tpl); $_smarty->_clearTemplateCache(); - if ($max_errors !== null && $_error_count == $max_errors) { + if ($max_errors !== null && $_error_count === $max_errors) { echo "\n<br><br>too many errors\n"; - exit(); + exit(1); } } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_configload.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_configload.php index 6113eaf98..eb8672fe9 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_configload.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_configload.php @@ -30,7 +30,7 @@ class Smarty_Internal_Method_ConfigLoad * section or null * * @return \Smarty|\Smarty_Internal_Data|\Smarty_Internal_Template - * @throws \SmartyException + * @throws \Exception */ public function configLoad(Smarty_Internal_Data $data, $config_file, $sections = null) { @@ -52,7 +52,7 @@ class Smarty_Internal_Method_ConfigLoad * shall be loaded * * @return \Smarty|\Smarty_Internal_Data|\Smarty_Internal_Template - * @throws \SmartyException + * @throws \Exception */ public function _loadConfigFile(Smarty_Internal_Data $data, $config_file, $sections = null, $scope = 0) { @@ -83,7 +83,7 @@ class Smarty_Internal_Method_ConfigLoad $this->_assignConfigVars($tpl->parent->config_vars, $tpl, $new_config_vars); $tagScope = $tpl->source->scope; if ($tagScope >= 0) { - if ($tagScope == Smarty::SCOPE_LOCAL) { + if ($tagScope === Smarty::SCOPE_LOCAL) { $this->_updateVarStack($tpl, $new_config_vars); $tagScope = 0; if (!$tpl->scope) { @@ -94,6 +94,7 @@ class Smarty_Internal_Method_ConfigLoad $mergedScope = $tagScope | $tpl->scope; if ($mergedScope) { // update scopes + /* @var \Smarty_Internal_Template|\Smarty|\Smarty_Internal_Data $ptr */ foreach ($tpl->smarty->ext->_updateScope->_getAffectedScopes($tpl->parent, $mergedScope) as $ptr) { $this->_assignConfigVars($ptr->config_vars, $tpl, $new_config_vars); if ($tagScope && $ptr->_isTplObj() && isset($tpl->_cache[ 'varStack' ])) { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getautoloadfilters.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getautoloadfilters.php index d945a01e3..b957b60d2 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getautoloadfilters.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getautoloadfilters.php @@ -11,7 +11,6 @@ */ class Smarty_Internal_Method_GetAutoloadFilters extends Smarty_Internal_Method_SetAutoloadFilters { - /** * Get autoload filters * @@ -22,8 +21,9 @@ class Smarty_Internal_Method_GetAutoloadFilters extends Smarty_Internal_Method_S * for. Defaults to all autoload * filters * - * @return array array( 'type1' => array( 'filter1', 'filter2', … ) ) or array( 'filter1', 'filter2', …) if $type + * @return array array( 'type1' => array( 'filter1', 'filter2', … ) ) or array( 'filter1', 'filter2', …) if $type * was specified + * @throws \SmartyException */ public function getAutoloadFilters(Smarty_Internal_TemplateBase $obj, $type = null) { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getglobal.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getglobal.php index 7a8a9bc71..0f00da53c 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getglobal.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getglobal.php @@ -24,9 +24,9 @@ class Smarty_Internal_Method_GetGlobal * @api Smarty::getGlobal() * * @param \Smarty_Internal_Data $data - * @param string $varName variable name or null + * @param string $varName variable name or null * - * @return string variable value or or array of variables + * @return string|array variable value or or array of variables */ public function getGlobal(Smarty_Internal_Data $data, $varName = null) { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_gettags.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_gettags.php index 5718b69e9..afaa4b913 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_gettags.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_gettags.php @@ -28,6 +28,7 @@ class Smarty_Internal_Method_GetTags * @param null|string|Smarty_Internal_Template $template * * @return array of tag/attributes + * @throws \Exception * @throws \SmartyException */ public function getTags(Smarty_Internal_TemplateBase $obj, $template = null) @@ -52,11 +53,11 @@ class Smarty_Internal_Method_GetTags $tpl->_cache[ 'used_tags' ] = array(); $tpl->smarty->merge_compiled_includes = false; $tpl->smarty->disableSecurity(); - $tpl->caching = false; + $tpl->caching = Smarty::CACHING_OFF; $tpl->loadCompiler(); $tpl->compiler->compileTemplate($tpl); return $tpl->_cache[ 'used_tags' ]; } - throw new SmartyException("Missing template specification"); + throw new SmartyException('Missing template specification'); } }
\ No newline at end of file diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_gettemplatevars.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_gettemplatevars.php index 1759646f3..510bab0fc 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_gettemplatevars.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_gettemplatevars.php @@ -53,7 +53,7 @@ class Smarty_Internal_Method_GetTemplateVars } } // not found, try at parent - if ($searchParents) { + if ($searchParents && isset($_ptr->parent)) { $_ptr = $_ptr->parent; } else { $_ptr = null; @@ -93,7 +93,7 @@ class Smarty_Internal_Method_GetTemplateVars return $_ptr->tpl_vars[ $varName ]; } // not found, try at parent - if ($searchParents) { + if ($searchParents && isset($_ptr->parent)) { $_ptr = $_ptr->parent; } else { $_ptr = null; @@ -103,14 +103,11 @@ class Smarty_Internal_Method_GetTemplateVars // found it, return it return Smarty::$global_tpl_vars[ $varName ]; } - /* @var \Smarty $smarty */ - $smarty = isset($data->smarty) ? $data->smarty : $data; - if ($smarty->error_unassigned && $errorEnable) { + if ($errorEnable && $data->_getSmartyObj()->error_unassigned) { // force a notice $x = $$varName; } return new Smarty_Undefined_Variable; } - }
\ No newline at end of file diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_literals.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_literals.php new file mode 100644 index 000000000..08e1a473b --- /dev/null +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_literals.php @@ -0,0 +1,98 @@ +<?php + +/** + * Smarty Method GetLiterals + * + * Smarty::getLiterals() method + * + * @package Smarty + * @subpackage PluginsInternal + * @author Uwe Tews + */ +class Smarty_Internal_Method_Literals +{ + /** + * Valid for Smarty and template object + * + * @var int + */ + public $objMap = 3; + + /** + * Get literals + * + * @api Smarty::getLiterals() + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * + * @return array list of literals + */ + public function getLiterals(Smarty_Internal_TemplateBase $obj) + { + $smarty = $obj->_getSmartyObj(); + return (array)$smarty->literals; + } + + /** + * Add literals + * + * @api Smarty::addLiterals() + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param array|string $literals literal or list of literals + * to add + * + * @return \Smarty|\Smarty_Internal_Template + * @throws \SmartyException + */ + public function addLiterals(Smarty_Internal_TemplateBase $obj, $literals = null) + { + if (isset($literals)) { + $this->set($obj->_getSmartyObj(), (array)$literals); + } + return $obj; + } + + /** + * Set literals + * + * @api Smarty::setLiterals() + * + * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj + * @param array|string $literals literal or list of literals + * to set + * + * @return \Smarty|\Smarty_Internal_Template + * @throws \SmartyException + */ + public function setLiterals(Smarty_Internal_TemplateBase $obj, $literals = null) + { + $smarty = $obj->_getSmartyObj(); + $smarty->literals = array(); + if (!empty($literals)) { + $this->set($smarty, (array)$literals); + } + return $obj; + } + + /** + * common setter for literals for easier handling of duplicates the + * Smarty::$literals array gets filled with identical key values + * + * @param \Smarty $smarty + * @param array $literals + * + * @throws \SmartyException + */ + private function set(Smarty $smarty, $literals) + { + $literals = array_combine($literals, $literals); + $error = isset($literals[ $smarty->left_delimiter ]) ? array($smarty->left_delimiter) : array(); + $error = isset($literals[ $smarty->right_delimiter ]) ? $error[] = $smarty->right_delimiter : $error; + if (!empty($error)) { + throw new SmartyException('User defined literal(s) "' . $error . + '" may not be identical with left or right delimiter'); + } + $smarty->literals = array_merge((array)$smarty->literals, (array)$literals); + } +}
\ No newline at end of file diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_loadfilter.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_loadfilter.php index d092d876e..239fd6dd3 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_loadfilter.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_loadfilter.php @@ -58,7 +58,7 @@ class Smarty_Internal_Method_LoadFilter return true; } } - throw new SmartyException("{$type}filter \"{$name}\" not found or callable"); + throw new SmartyException("{$type}filter '{$name}' not found or callable"); } /** @@ -71,7 +71,7 @@ class Smarty_Internal_Method_LoadFilter public function _checkFilterType($type) { if (!isset($this->filterTypes[ $type ])) { - throw new SmartyException("Illegal filter type \"{$type}\""); + throw new SmartyException("Illegal filter type '{$type}'"); } } }
\ No newline at end of file diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_loadplugin.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_loadplugin.php index 50f3bfc2c..2454d9c9c 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_loadplugin.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_loadplugin.php @@ -76,7 +76,7 @@ class Smarty_Internal_Method_LoadPlugin } } $_file_names = array($_plugin_filename); - if ($_lower_filename != $_plugin_filename) { + if ($_lower_filename !== $_plugin_filename) { $_file_names[] = $_lower_filename; } $_p_dirs = $smarty->getPluginsDir(); diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_mustcompile.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_mustcompile.php index 0950ba9cf..62c16f626 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_mustcompile.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_mustcompile.php @@ -41,7 +41,7 @@ class Smarty_Internal_Method_MustCompile if ($_template->mustCompile === null) { $_template->mustCompile = (!$_template->source->handler->uncompiled && ($_template->smarty->force_compile || $_template->source->handler->recompiled || - !$_template->compiled->exists || ($_template->smarty->compile_check && + !$_template->compiled->exists || ($_template->compile_check && $_template->compiled->getTimeStamp() < $_template->source->getTimeStamp()))); } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaultconfighandler.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaultconfighandler.php index 43088a1d4..c8c5ae73f 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaultconfighandler.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaultconfighandler.php @@ -35,7 +35,7 @@ class Smarty_Internal_Method_RegisterDefaultConfigHandler if (is_callable($callback)) { $smarty->default_config_handler_func = $callback; } else { - throw new SmartyException("Default config handler not callable"); + throw new SmartyException('Default config handler not callable'); } return $obj; } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php index 569ea1062..4c5d396ed 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php @@ -35,7 +35,7 @@ class Smarty_Internal_Method_RegisterDefaultTemplateHandler if (is_callable($callback)) { $smarty->default_template_handler_func = $callback; } else { - throw new SmartyException("Default template handler not callable"); + throw new SmartyException('Default template handler not callable'); } return $obj; } @@ -62,7 +62,7 @@ class Smarty_Internal_Method_RegisterDefaultTemplateHandler if ($source->exists) { $source->timestamp = filemtime($_return); } else { - throw new SmartyException("Default handler: Unable to load " . + throw new SmartyException('Default handler: Unable to load ' . ($source->isConfig ? 'config' : 'template') . " default file '{$_return}' for '{$source->type}:{$source->name}'"); } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerfilter.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerfilter.php index ea8f75a85..77e41f37c 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerfilter.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerfilter.php @@ -46,7 +46,7 @@ class Smarty_Internal_Method_RegisterFilter $this->_checkFilterType($type); $name = isset($name) ? $name : $this->_getFilterName($callback); if (!is_callable($callback)) { - throw new SmartyException("{$type}filter \"{$name}\" not callable"); + throw new SmartyException("{$type}filter '{$name}' not callable"); } $smarty->registered_filters[ $type ][ $name ] = $callback; return $obj; @@ -82,7 +82,7 @@ class Smarty_Internal_Method_RegisterFilter public function _checkFilterType($type) { if (!isset($this->filterTypes[ $type ])) { - throw new SmartyException("Illegal filter type \"{$type}\""); + throw new SmartyException("Illegal filter type '{$type}'"); } } }
\ No newline at end of file diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerplugin.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerplugin.php index 91f065920..64bf0ef15 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerplugin.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerplugin.php @@ -40,9 +40,9 @@ class Smarty_Internal_Method_RegisterPlugin { $smarty = $obj->_getSmartyObj(); if (isset($smarty->registered_plugins[ $type ][ $name ])) { - throw new SmartyException("Plugin tag \"{$name}\" already registered"); + throw new SmartyException("Plugin tag '{$name}' already registered"); } elseif (!is_callable($callback)) { - throw new SmartyException("Plugin \"{$name}\" not callable"); + throw new SmartyException("Plugin '{$name}' not callable"); } else { $smarty->registered_plugins[ $type ][ $name ] = array($callback, (bool) $cacheable, (array) $cache_attr); } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_setautoloadfilters.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_setautoloadfilters.php index df5ca6405..29653b08e 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_setautoloadfilters.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_setautoloadfilters.php @@ -38,6 +38,7 @@ class Smarty_Internal_Method_SetAutoloadFilters * the appropriate types * * @return \Smarty|\Smarty_Internal_Template + * @throws \SmartyException */ public function setAutoloadFilters(Smarty_Internal_TemplateBase $obj, $filters, $type = null) { @@ -64,7 +65,7 @@ class Smarty_Internal_Method_SetAutoloadFilters public function _checkFilterType($type) { if (!isset($this->filterTypes[ $type ])) { - throw new SmartyException("Illegal filter type \"{$type}\""); + throw new SmartyException("Illegal filter type '{$type}'"); } } }
\ No newline at end of file diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unloadfilter.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unloadfilter.php index 9aa1d229b..1a5fdf19b 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unloadfilter.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unloadfilter.php @@ -22,7 +22,8 @@ class Smarty_Internal_Method_UnloadFilter extends Smarty_Internal_Method_LoadFil * @param string $type filter type * @param string $name filter name * - * @return bool + * @return Smarty_Internal_TemplateBase + * @throws \SmartyException */ public function unloadFilter(Smarty_Internal_TemplateBase $obj, $type, $name) { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterfilter.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterfilter.php index c5b88f57d..fcc4e5d89 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterfilter.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterfilter.php @@ -23,6 +23,7 @@ class Smarty_Internal_Method_UnregisterFilter extends Smarty_Internal_Method_Reg * @param callback|string $callback * * @return \Smarty|\Smarty_Internal_Template + * @throws \SmartyException */ public function unregisterFilter(Smarty_Internal_TemplateBase $obj, $type, $callback) { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_nocache_insert.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_nocache_insert.php index 65fc143cd..2629d51f7 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_nocache_insert.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_nocache_insert.php @@ -30,7 +30,7 @@ class Smarty_Internal_Nocache_Insert public static function compile($_function, $_attr, $_template, $_script, $_assign = null) { $_output = '<?php '; - if ($_script != 'null') { + if ($_script !== 'null') { // script which must be included // code for script file loading $_output .= "require_once '{$_script}';"; @@ -38,16 +38,15 @@ class Smarty_Internal_Nocache_Insert // call insert if (isset($_assign)) { $_output .= "\$_smarty_tpl->assign('{$_assign}' , {$_function} (" . var_export($_attr, true) . - ",\$_smarty_tpl), true);?>"; + ',\$_smarty_tpl), true);?>'; } else { - $_output .= "echo {$_function}(" . var_export($_attr, true) . ",\$_smarty_tpl);?>"; + $_output .= "echo {$_function}(" . var_export($_attr, true) . ',$_smarty_tpl);?>'; } $_tpl = $_template; while ($_tpl->_isSubTpl()) { $_tpl = $_tpl->parent; } - return "/*%%SmartyNocache:{$_tpl->compiled->nocache_hash}%%*/" . $_output . - "/*/%%SmartyNocache:{$_tpl->compiled->nocache_hash}%%*/"; + return "/*%%SmartyNocache:{$_tpl->compiled->nocache_hash}%%*/{$_output}/*/%%SmartyNocache:{$_tpl->compiled->nocache_hash}%%*/"; } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree.php index 32c9df094..b3e202efb 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree.php @@ -1,7 +1,7 @@ <?php /** - * Smarty Internal Plugin Templateparser Parsetrees - * These are classes to build parsetrees in the template parser + * Smarty Internal Plugin Templateparser Parsetree + * These are classes to build parsetree in the template parser * * @package Smarty * @subpackage Compiler diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_code.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_code.php index d0f0b3fd9..7bd0bc45c 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_code.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_code.php @@ -37,6 +37,6 @@ class Smarty_Internal_ParseTree_Code extends Smarty_Internal_ParseTree */ public function to_smarty_php(Smarty_Internal_Templateparser $parser) { - return sprintf("(%s)", $this->data); + return sprintf('(%s)', $this->data); } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_dq.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_dq.php index 8c2e0d993..a57e629c6 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_dq.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_dq.php @@ -74,8 +74,8 @@ class Smarty_Internal_ParseTree_Dq extends Smarty_Internal_ParseTree { $code = ''; foreach ($this->subtrees as $subtree) { - if ($code !== "") { - $code .= "."; + if ($code !== '') { + $code .= '.'; } if ($subtree instanceof Smarty_Internal_ParseTree_Tag) { $more_php = $subtree->assign_to_var($parser); diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_tag.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_tag.php index 9058aabfb..8e19ec294 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_tag.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_tag.php @@ -62,7 +62,7 @@ class Smarty_Internal_ParseTree_Tag extends Smarty_Internal_ParseTree $var = $parser->compiler->getNewPrefixVariable(); $tmp = $parser->compiler->appendCode('<?php ob_start();?>', $this->data); $tmp = $parser->compiler->appendCode($tmp, "<?php {$var}=ob_get_clean();?>"); - $parser->compiler->prefix_code[] = sprintf("%s", $tmp); + $parser->compiler->prefix_code[] = sprintf('%s', $tmp); return $var; } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_template.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_template.php index f6032351e..26612d4c7 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_template.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_template.php @@ -91,14 +91,14 @@ class Smarty_Internal_ParseTree_Template extends Smarty_Internal_ParseTree if ($this->subtrees[ $key ] instanceof Smarty_Internal_ParseTree_Text) { $subtree = $this->subtrees[ $key ]->to_smarty_php($parser); while ($key + 1 < $cnt && ($this->subtrees[ $key + 1 ] instanceof Smarty_Internal_ParseTree_Text || - $this->subtrees[ $key + 1 ]->data == '')) { + $this->subtrees[ $key + 1 ]->data === '')) { $key ++; - if ($this->subtrees[ $key ]->data == '') { + if ($this->subtrees[ $key ]->data === '') { continue; } $subtree .= $this->subtrees[ $key ]->to_smarty_php($parser); } - if ($subtree == '') { + if ($subtree === '') { continue; } $code .= preg_replace('/((<%)|(%>)|(<\?php)|(<\?)|(\?>)|(<\/?script))/', "<?php echo '\$1'; ?>\n", @@ -108,14 +108,14 @@ class Smarty_Internal_ParseTree_Template extends Smarty_Internal_ParseTree if ($this->subtrees[ $key ] instanceof Smarty_Internal_ParseTree_Tag) { $subtree = $this->subtrees[ $key ]->to_smarty_php($parser); while ($key + 1 < $cnt && ($this->subtrees[ $key + 1 ] instanceof Smarty_Internal_ParseTree_Tag || - $this->subtrees[ $key + 1 ]->data == '')) { + $this->subtrees[ $key + 1 ]->data === '')) { $key ++; - if ($this->subtrees[ $key ]->data == '') { + if ($this->subtrees[ $key ]->data === '') { continue; } $subtree = $parser->compiler->appendCode($subtree, $this->subtrees[ $key ]->to_smarty_php($parser)); } - if ($subtree == '') { + if ($subtree === '') { continue; } $code .= $subtree; diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_extends.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_extends.php index 4f1f09ea5..23a624729 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_extends.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_extends.php @@ -42,7 +42,7 @@ class Smarty_Internal_Resource_Extends extends Smarty_Resource foreach ($components as $component) { /* @var \Smarty_Template_Source $_s */ $_s = Smarty_Template_Source::load(null, $smarty, $component); - if ($_s->type == 'php') { + if ($_s->type === 'php') { throw new SmartyException("Resource type {$_s->type} cannot be used with the extends resource type"); } $sources[ $_s->uid ] = $_s; @@ -118,6 +118,9 @@ class Smarty_Internal_Resource_Extends extends Smarty_Resource * * @return bool */ + /** + * @return bool + */ public function checkTimestamps() { return false; diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_file.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_file.php index a58771a17..9dcda7fcb 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_file.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_file.php @@ -30,32 +30,32 @@ class Smarty_Internal_Resource_File extends Smarty_Resource { $file = $source->name; // absolute file ? - if ($file[ 0 ] == '/' || $file[ 1 ] == ':') { + if ($file[ 0 ] === '/' || $file[ 1 ] === ':') { $file = $source->smarty->_realpath($file, true); return is_file($file) ? $file : false; } // go relative to a given template? - if ($file[ 0 ] == '.' && $_template && $_template->_isSubTpl() && + if ($file[ 0 ] === '.' && $_template && $_template->_isSubTpl() && preg_match('#^[.]{1,2}[\\\/]#', $file) ) { - if ($_template->parent->source->type != 'file' && $_template->parent->source->type != 'extends' && + if ($_template->parent->source->type !== 'file' && $_template->parent->source->type !== 'extends' && !isset($_template->parent->_cache[ 'allow_relative_path' ]) ) { throw new SmartyException("Template '{$file}' cannot be relative to template of resource type '{$_template->parent->source->type}'"); } // normalize path - $path = $source->smarty->_realpath(dirname($_template->parent->source->filepath) . $source->smarty->ds . $file); + $path = $source->smarty->_realpath(dirname($_template->parent->source->filepath) . DIRECTORY_SEPARATOR . $file); // files relative to a template only get one shot return is_file($path) ? $path : false; } - // normalize $source->smarty->ds - if (strpos($file, $source->smarty->ds == '/' ? '\\' : '/') !== false) { - $file = str_replace($source->smarty->ds == '/' ? '\\' : '/', $source->smarty->ds, $file); + // normalize DIRECTORY_SEPARATOR + if (strpos($file, DIRECTORY_SEPARATOR === '/' ? '\\' : '/') !== false) { + $file = str_replace(DIRECTORY_SEPARATOR === '/' ? '\\' : '/', DIRECTORY_SEPARATOR, $file); } $_directories = $source->smarty->getTemplateDir(null, $source->isConfig); // template_dir index? - if ($file[ 0 ] == '[' && preg_match('#^\[([^\]]+)\](.+)$#', $file, $fileMatch)) { + if ($file[ 0 ] === '[' && preg_match('#^\[([^\]]+)\](.+)$#', $file, $fileMatch)) { $file = $fileMatch[ 2 ]; $_indices = explode(',', $fileMatch[ 1 ]); $_index_dirs = array(); @@ -90,7 +90,7 @@ class Smarty_Internal_Resource_File extends Smarty_Resource foreach ($_directories as $_directory) { $path = $_directory . $file; if (is_file($path)) { - return (strpos($path, '.' . $source->smarty->ds) !== false) ? $source->smarty->_realpath($path) : $path; + return (strpos($path, '.' . DIRECTORY_SEPARATOR) !== false) ? $source->smarty->_realpath($path) : $path; } } if (!isset($_index_dirs)) { @@ -112,6 +112,8 @@ class Smarty_Internal_Resource_File extends Smarty_Resource * * @param Smarty_Template_Source $source source object * @param Smarty_Internal_Template $_template template object + * + * @throws \SmartyException */ public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_php.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_php.php index 52e7096b3..6f685abe4 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_php.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_php.php @@ -19,25 +19,25 @@ class Smarty_Internal_Resource_Php extends Smarty_Internal_Resource_File public $uncompiled = true; /** - * container for short_open_tag directive's value before executing PHP templates + * Resource does implement populateCompiledFilepath() method * - * @var string + * @var bool */ - protected $short_open_tag; + public $hasCompiledHandler = true; /** - * Resource does implement populateCompiledFilepath() method + * container for short_open_tag directive's value before executing PHP templates * - * @var bool + * @var string */ - public $hasCompiledHandler = true; + protected $short_open_tag; /** * Create a new PHP Resource */ public function __construct() { - $this->short_open_tag = ini_get('short_open_tag'); + $this->short_open_tag = function_exists('ini_get') ? ini_get('short_open_tag') : 1; } /** @@ -57,6 +57,23 @@ class Smarty_Internal_Resource_Php extends Smarty_Internal_Resource_File } /** + * populate compiled object with compiled filepath + * + * @param Smarty_Template_Compiled $compiled compiled object + * @param Smarty_Internal_Template $_template template object (is ignored) + */ + public function populateCompiledFilepath(Smarty_Template_Compiled $compiled, Smarty_Internal_Template $_template) + { + $compiled->filepath = $_template->source->filepath; + $compiled->timestamp = $_template->source->timestamp; + $compiled->exists = $_template->source->exists; + $compiled->file_dependency[ $_template->source->uid ] = + array($compiled->filepath, + $compiled->timestamp, + $_template->source->type,); + } + + /** * Render and output the template (without using the compiler) * * @param Smarty_Template_Source $source source object @@ -68,10 +85,10 @@ class Smarty_Internal_Resource_Php extends Smarty_Internal_Resource_File public function renderUncompiled(Smarty_Template_Source $source, Smarty_Internal_Template $_template) { if (!$source->smarty->allow_php_templates) { - throw new SmartyException("PHP templates are disabled"); + throw new SmartyException('PHP templates are disabled'); } if (!$source->exists) { - throw new SmartyException("Unable to load template {$source->type} '{$source->name}'" . + throw new SmartyException("Unable to load template '{$source->type}:{$source->name}'" . ($_template->_isSubTpl() ? " in '{$_template->parent->template_resource}'" : '')); } @@ -79,28 +96,16 @@ class Smarty_Internal_Resource_Php extends Smarty_Internal_Resource_File extract($_template->getTemplateVars()); // include PHP template with short open tags enabled - ini_set('short_open_tag', '1'); + if (function_exists('ini_set')) { + ini_set('short_open_tag', '1'); + } /** @var Smarty_Internal_Template $_smarty_template * used in included file */ $_smarty_template = $_template; include($source->filepath); - ini_set('short_open_tag', $this->short_open_tag); - } - - /** - * populate compiled object with compiled filepath - * - * @param Smarty_Template_Compiled $compiled compiled object - * @param Smarty_Internal_Template $_template template object (is ignored) - */ - public function populateCompiledFilepath(Smarty_Template_Compiled $compiled, Smarty_Internal_Template $_template) - { - $compiled->filepath = $_template->source->filepath; - $compiled->timestamp = $_template->source->timestamp; - $compiled->exists = $_template->source->exists; - $compiled->file_dependency[ $_template->source->uid ] = - array($compiled->filepath, $compiled->timestamp, - $_template->source->type,); + if (function_exists('ini_set')) { + ini_set('short_open_tag', $this->short_open_tag); + } } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_stream.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_stream.php index b4248fbb5..f358db01d 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_stream.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_stream.php @@ -26,6 +26,7 @@ class Smarty_Internal_Resource_Stream extends Smarty_Resource_Recompiled * @param Smarty_Internal_Template $_template template object * * @return void + * @throws \SmartyException */ public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_string.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_string.php index f2610d9d6..0175d5182 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_string.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_string.php @@ -99,6 +99,9 @@ class Smarty_Internal_Resource_String extends Smarty_Resource * * @return bool */ + /** + * @return bool + */ public function checkTimestamps() { return false; diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_cachemodify.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_cachemodify.php index a91874a9f..dfbf7115b 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_cachemodify.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_cachemodify.php @@ -16,6 +16,9 @@ class Smarty_Internal_Runtime_CacheModify * @param \Smarty_Template_Cached $cached * @param \Smarty_Internal_Template $_template * @param string $content + * + * @throws \Exception + * @throws \SmartyException */ public function cacheModifiedCheck(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template, $content) { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_cacheresourcefile.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_cacheresourcefile.php index 7b7a9f685..a9ff5789a 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_cacheresourcefile.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_cacheresourcefile.php @@ -1,5 +1,4 @@ <?php - /** * Smarty cache resource file clear method * @@ -7,7 +6,6 @@ * @subpackage PluginsInternal * @author Uwe Tews */ - /** * Smarty Internal Runtime Cache Resource File Class * @@ -34,7 +32,7 @@ class Smarty_Internal_Runtime_CacheResourceFile $_dir_sep = $smarty->use_sub_dirs ? '/' : '^'; $_compile_id_offset = $smarty->use_sub_dirs ? 3 : 0; $_dir = $smarty->getCacheDir(); - if ($_dir == '/') { //We should never want to delete this! + if ($_dir === '/') { //We should never want to delete this! return 0; } $_dir_length = strlen($_dir); @@ -43,19 +41,17 @@ class Smarty_Internal_Runtime_CacheResourceFile $_cache_id_parts_count = count($_cache_id_parts); if ($smarty->use_sub_dirs) { foreach ($_cache_id_parts as $id_part) { - $_dir .= $id_part . $smarty->ds; + $_dir .= $id_part . DIRECTORY_SEPARATOR; } } } if (isset($resource_name)) { $_save_stat = $smarty->caching; - $smarty->caching = true; + $smarty->caching = Smarty::CACHING_LIFETIME_CURRENT; $tpl = new $smarty->template_class($resource_name, $smarty); $smarty->caching = $_save_stat; - // remove from template cache $tpl->source; // have the template registered before unset() - if ($tpl->source->exists) { $_resourcename_parts = basename(str_replace('^', '/', $tpl->cached->filepath)); } else { @@ -68,10 +64,10 @@ class Smarty_Internal_Runtime_CacheResourceFile $_cacheDirs = new RecursiveDirectoryIterator($_dir); $_cache = new RecursiveIteratorIterator($_cacheDirs, RecursiveIteratorIterator::CHILD_FIRST); foreach ($_cache as $_file) { - if (substr(basename($_file->getPathname()), 0, 1) == '.') { + if (substr(basename($_file->getPathname()), 0, 1) === '.') { continue; } - $_filepath = (string) $_file; + $_filepath = (string)$_file; // directory ? if ($_file->isDir()) { if (!$_cache->isDot()) { @@ -87,13 +83,13 @@ class Smarty_Internal_Runtime_CacheResourceFile $_parts_count = count($_parts); // check name if (isset($resource_name)) { - if ($_parts[ $_parts_count - 1 ] != $_resourcename_parts) { + if ($_parts[ $_parts_count - 1 ] !== $_resourcename_parts) { continue; } } // check compile id if (isset($_compile_id) && (!isset($_parts[ $_parts_count - 2 - $_compile_id_offset ]) || - $_parts[ $_parts_count - 2 - $_compile_id_offset ] != $_compile_id) + $_parts[ $_parts_count - 2 - $_compile_id_offset ] !== $_compile_id) ) { continue; } @@ -105,28 +101,34 @@ class Smarty_Internal_Runtime_CacheResourceFile if ($_parts_count < $_cache_id_parts_count) { continue; } - for ($i = 0; $i < $_cache_id_parts_count; $i ++) { - if ($_parts[ $i ] != $_cache_id_parts[ $i ]) { + for ($i = 0; $i < $_cache_id_parts_count; $i++) { + if ($_parts[ $i ] !== $_cache_id_parts[ $i ]) { continue 2; } } } - // expired ? - if (isset($exp_time)) { - if ($exp_time < 0) { - preg_match('#\'cache_lifetime\' =>\s*(\d*)#', file_get_contents($_file), $match); - if ($_time < (@filemtime($_file) + $match[ 1 ])) { - continue; - } - } else { - if ($_time - @filemtime($_file) < $exp_time) { - continue; + if (is_file($_filepath)) { + // expired ? + if (isset($exp_time)) { + if ($exp_time < 0) { + preg_match('#\'cache_lifetime\' =>\s*(\d*)#', file_get_contents($_filepath), $match); + if ($_time < (filemtime($_filepath) + $match[ 1 ])) { + continue; + } + } else { + if ($_time - filemtime($_filepath) < $exp_time) { + continue; + } } } - } - $_count += @unlink($_filepath) ? 1 : 0; - if (function_exists('opcache_invalidate') && strlen(ini_get("opcache.restrict_api")) < 1) { - opcache_invalidate($_filepath, true); + $_count += @unlink($_filepath) ? 1 : 0; + if (function_exists('opcache_invalidate') + && (!function_exists('ini_get') || strlen(ini_get("opcache.restrict_api")) < 1) + ) { + opcache_invalidate($_filepath, true); + } else if (function_exists('apc_delete_file')) { + apc_delete_file($_filepath); + } } } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_capture.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_capture.php index 69f1ce0cf..80ffa35b2 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_capture.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_capture.php @@ -64,7 +64,9 @@ class Smarty_Internal_Runtime_Capture if (!$this->isRegistered) { $this->register($_template); } - $this->captureStack[] = array($buffer, $assign, $append); + $this->captureStack[] = array($buffer, + $assign, + $append); $this->captureCount ++; ob_start(); } @@ -76,8 +78,10 @@ class Smarty_Internal_Runtime_Capture */ private function register(Smarty_Internal_Template $_template) { - $_template->startRenderCallbacks[] = array($this, 'startRender'); - $_template->endRenderCallbacks[] = array($this, 'endRender'); + $_template->startRenderCallbacks[] = array($this, + 'startRender'); + $_template->endRenderCallbacks[] = array($this, + 'endRender'); $this->startRender($_template); $this->isRegistered = true; } @@ -126,20 +130,24 @@ class Smarty_Internal_Runtime_Capture */ public function error(Smarty_Internal_Template $_template) { - throw new SmartyException("Not matching {capture}{/capture} in \"{$_template->template_resource}\""); + throw new SmartyException("Not matching {capture}{/capture} in '{$_template->template_resource}'"); } /** - * Return content of named capture buffer + * Return content of named capture buffer by key or as array * * @param \Smarty_Internal_Template $_template - * @param $name + * @param string|null $name * - * @return null + * @return string|string[]|null */ - public function getBuffer(Smarty_Internal_Template $_template, $name) + public function getBuffer(Smarty_Internal_Template $_template, $name = null) { - return isset($this->namedBuffer[ $name ]) ? $this->namedBuffer[ $name ] : null; + if (isset($name)) { + return isset($this->namedBuffer[ $name ]) ? $this->namedBuffer[ $name ] : null; + } else { + return $this->namedBuffer; + } } /** diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_codeframe.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_codeframe.php index e363712a6..f792496f9 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_codeframe.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_codeframe.php @@ -41,58 +41,55 @@ class Smarty_Internal_Runtime_CodeFrame $properties[ 'cache_lifetime' ] = $_template->cache_lifetime; } $output = "<?php\n"; - $output .= "/* Smarty version " . Smarty::SMARTY_VERSION . ", created on " . strftime("%Y-%m-%d %H:%M:%S") . - "\n from \"" . $_template->source->filepath . "\" */\n\n"; + $output .= "/* Smarty version {$properties[ 'version' ]}, created on " . strftime("%Y-%m-%d %H:%M:%S") . + "\n from '" . str_replace('*/','* /',$_template->source->filepath) . "' */\n\n"; $output .= "/* @var Smarty_Internal_Template \$_smarty_tpl */\n"; $dec = "\$_smarty_tpl->_decodeProperties(\$_smarty_tpl, " . var_export($properties, true) . ',' . - ($cache ? 'true' : 'false') . ")"; + ($cache ? 'true' : 'false') . ')'; $output .= "if ({$dec}) {\n"; $output .= "function {$properties['unifunc']} (Smarty_Internal_Template \$_smarty_tpl) {\n"; if (!$cache && !empty($compiler->tpl_function)) { - $output .= "\$_smarty_tpl->smarty->ext->_tplFunction->registerTplFunctions(\$_smarty_tpl, " . - var_export($compiler->tpl_function, true) . ");\n"; + $output .= '$_smarty_tpl->smarty->ext->_tplFunction->registerTplFunctions($_smarty_tpl, '; + $output .= var_export($compiler->tpl_function, true); + $output .= ");\n"; } if ($cache && isset($_template->smarty->ext->_tplFunction)) { $output .= "\$_smarty_tpl->smarty->ext->_tplFunction->registerTplFunctions(\$_smarty_tpl, " . var_export($_template->smarty->ext->_tplFunction->getTplFunction($_template), true) . ");\n"; } - // include code for plugins - if (!$cache) { - if (!empty($_template->compiled->required_plugins[ 'compiled' ])) { - foreach ($_template->compiled->required_plugins[ 'compiled' ] as $tmp) { - foreach ($tmp as $data) { - $file = addslashes($data[ 'file' ]); - if (is_array($data[ 'function' ])) { - $output .= "if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) require_once '{$file}';\n"; - } else { - $output .= "if (!is_callable('{$data['function']}')) require_once '{$file}';\n"; - } - } - } - } - if ($_template->caching && !empty($_template->compiled->required_plugins[ 'nocache' ])) { - $_template->compiled->has_nocache_code = true; - $output .= "echo '/*%%SmartyNocache:{$_template->compiled->nocache_hash}%%*/<?php \$_smarty = \$_smarty_tpl->smarty; "; - foreach ($_template->compiled->required_plugins[ 'nocache' ] as $tmp) { - foreach ($tmp as $data) { - $file = addslashes($data[ 'file' ]); - if (is_array($data[ 'function' ])) { - $output .= addslashes("if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) require_once '{$file}';\n"); - } else { - $output .= addslashes("if (!is_callable('{$data['function']}')) require_once '{$file}';\n"); - } - } - } - $output .= "?>/*/%%SmartyNocache:{$_template->compiled->nocache_hash}%%*/';\n"; - } + // include code for required plugins + if (!$cache && isset($compiler)) { + $output .= $compiler->compileRequiredPlugins(); } - $output .= "?>\n"; + $output .= "?>"; $output .= $content; $output .= "<?php }\n?>"; $output .= $functions; $output .= "<?php }\n"; // remove unneeded PHP tags - return preg_replace(array('/\s*\?>[\n]?<\?php\s*/', '/\?>\s*$/'), array("\n", ''), $output); + if (preg_match('/\s*\?>[\n]?<\?php\s*/', $output)) { + $curr_split = preg_split('/\s*\?>[\n]?<\?php\s*/', + $output); + preg_match_all('/\s*\?>[\n]?<\?php\s*/', + $output, + $curr_parts); + $output = ''; + foreach ($curr_split as $idx => $curr_output) { + $output .= $curr_output; + if (isset($curr_parts[ 0 ][ $idx ])) { + $output .= "\n"; + } + } + } + if (preg_match('/\?>\s*$/', $output)) { + $curr_split = preg_split('/\?>\s*$/', + $output); + $output = ''; + foreach ($curr_split as $idx => $curr_output) { + $output .= $curr_output; + } + } + return $output; } }
\ No newline at end of file diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_filterhandler.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_filterhandler.php index f6cfa7c44..9d7d2db2e 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_filterhandler.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_filterhandler.php @@ -48,11 +48,11 @@ class Smarty_Internal_Runtime_FilterHandler // loaded class of filter plugin $callback = array($plugin_name, 'execute'); } else { - throw new SmartyException("Auto load {$type}-filter plugin method \"{$plugin_name}::execute\" not callable"); + throw new SmartyException("Auto load {$type}-filter plugin method '{$plugin_name}::execute' not callable"); } } else { // nothing found, throw exception - throw new SmartyException("Unable to auto load {$type}-filter plugin \"{$plugin_name}\""); + throw new SmartyException("Unable to auto load {$type}-filter plugin '{$plugin_name}'"); } $content = call_user_func($callback, $content, $template); } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_foreach.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_foreach.php index 1e8655d92..8b60768bc 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_foreach.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_foreach.php @@ -50,7 +50,8 @@ class Smarty_Internal_Runtime_Foreach $total = empty($from) ? 0 : (($needTotal || isset($properties[ 'total' ])) ? count($from) : 1); } if (isset($tpl->tpl_vars[ $item ])) { - $saveVars[ 'item' ] = array($item, $tpl->tpl_vars[ $item ]); + $saveVars[ 'item' ] = array($item, + $tpl->tpl_vars[ $item ]); } $tpl->tpl_vars[ $item ] = new Smarty_Variable(null, $tpl->isRenderingCache); if ($total === 0) { @@ -58,7 +59,8 @@ class Smarty_Internal_Runtime_Foreach } else { if ($key) { if (isset($tpl->tpl_vars[ $key ])) { - $saveVars[ 'key' ] = array($key, $tpl->tpl_vars[ $key ]); + $saveVars[ 'key' ] = array($key, + $tpl->tpl_vars[ $key ]); } $tpl->tpl_vars[ $key ] = new Smarty_Variable(null, $tpl->isRenderingCache); } @@ -69,7 +71,8 @@ class Smarty_Internal_Runtime_Foreach if ($name) { $namedVar = "__smarty_foreach_{$name}"; if (isset($tpl->tpl_vars[ $namedVar ])) { - $saveVars[ 'named' ] = array($namedVar, $tpl->tpl_vars[ $namedVar ]); + $saveVars[ 'named' ] = array($namedVar, + $tpl->tpl_vars[ $namedVar ]); } $namedProp = array(); if (isset($properties[ 'total' ])) { @@ -91,6 +94,33 @@ class Smarty_Internal_Runtime_Foreach } /** + * + * [util function] counts an array, arrayAccess/traversable or PDOStatement object + * + * @param mixed $value + * + * @return int the count for arrays and objects that implement countable, 1 for other objects that don't, and 0 + * for empty elements + */ + public function count($value) + { + if ($value instanceof IteratorAggregate) { + // Note: getIterator() returns a Traversable, not an Iterator + // thus rewind() and valid() methods may not be present + return iterator_count($value->getIterator()); + } elseif ($value instanceof Iterator) { + return $value instanceof Generator ? 1 : iterator_count($value); + } elseif ($value instanceof Countable) { + return count($value); + } elseif ($value instanceof PDOStatement) { + return $value->rowCount(); + } elseif ($value instanceof Traversable) { + return iterator_count($value); + } + return count((array) $value); + } + + /** * Restore saved variables * * will be called by {break n} or {continue n} for the required number of levels @@ -114,36 +144,8 @@ class Smarty_Internal_Runtime_Foreach $tpl->tpl_vars[ $saveVars[ 'named' ][ 0 ] ] = $saveVars[ 'named' ][ 1 ]; } } - $levels--; + $levels --; } } - /* - * - * [util function] counts an array, arrayAccess/traversable or PDOStatement object - * - * @param mixed $value - * - * @return int the count for arrays and objects that implement countable, 1 for other objects that don't, and 0 - * for empty elements - */ - public function count($value) - { - if ($value instanceof Countable) { - return count($value); - } elseif ($value instanceof IteratorAggregate) { - // Note: getIterator() returns a Traversable, not an Iterator - // thus rewind() and valid() methods may not be present - return iterator_count($value->getIterator()); - } elseif ($value instanceof Iterator) { - return $value instanceof Generator ? 1 : iterator_count($value); - } elseif ($value instanceof PDOStatement) { - return $value->rowCount(); - } elseif ($value instanceof Traversable) { - return iterator_count($value); - } elseif ($value instanceof ArrayAccess) { - return $value->offsetExists(0) ? 1 : 0; - } - return count((array) $value); - } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_getincludepath.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_getincludepath.php index e12b0c57c..54b1bb3d5 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_getincludepath.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_getincludepath.php @@ -21,49 +21,42 @@ class Smarty_Internal_Runtime_GetIncludePath * @var string */ public $_include_path = ''; - /** * include path directory cache * * @var array */ public $_include_dirs = array(); - /** * include path directory cache * * @var array */ public $_user_dirs = array(); - /** * stream cache * - * @var string[] + * @var string[][] */ public $isFile = array(); - /** * stream cache * * @var string[] */ public $isPath = array(); - /** * stream cache * * @var int[] */ public $number = array(); - /** * status cache * * @var bool */ public $_has_stream_include = null; - /** * Number for array index * @@ -81,13 +74,13 @@ class Smarty_Internal_Runtime_GetIncludePath public function isNewIncludePath(Smarty $smarty) { $_i_path = get_include_path(); - if ($this->_include_path != $_i_path) { + if ($this->_include_path !== $_i_path) { $this->_include_dirs = array(); $this->_include_path = $_i_path; - $_dirs = (array) explode(PATH_SEPARATOR, $_i_path); + $_dirs = (array)explode(PATH_SEPARATOR, $_i_path); foreach ($_dirs as $_path) { if (is_dir($_path)) { - $this->_include_dirs[] = $smarty->_realpath($_path . $smarty->ds, true); + $this->_include_dirs[] = $smarty->_realpath($_path . DIRECTORY_SEPARATOR, true); } } return true; @@ -128,7 +121,7 @@ class Smarty_Internal_Runtime_GetIncludePath } // try PHP include_path foreach ($dirs as $dir) { - $dir_n = isset($this->number[ $dir ]) ? $this->number[ $dir ] : $this->number[ $dir ] = $this->counter ++; + $dir_n = isset($this->number[ $dir ]) ? $this->number[ $dir ] : $this->number[ $dir ] = $this->counter++; if (isset($this->isFile[ $dir_n ][ $file ])) { if ($this->isFile[ $dir_n ][ $file ]) { return $this->isFile[ $dir_n ][ $file ]; @@ -143,9 +136,9 @@ class Smarty_Internal_Runtime_GetIncludePath $dir = $this->_user_dirs[ $dir_n ]; } } else { - if ($dir[ 0 ] == '/' || $dir[ 1 ] == ':') { + if ($dir[ 0 ] === '/' || $dir[ 1 ] === ':') { $dir = str_ireplace(getcwd(), '.', $dir); - if ($dir[ 0 ] == '/' || $dir[ 1 ] == ':') { + if ($dir[ 0 ] === '/' || $dir[ 1 ] === ':') { $this->_user_dirs[ $dir_n ] = false; continue; } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_inheritance.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_inheritance.php index 7ec5924e6..b593b78eb 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_inheritance.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_inheritance.php @@ -46,7 +46,6 @@ class Smarty_Internal_Runtime_Inheritance /** * Array of template source objects - * - key template index * * @var Smarty_Template_Source[] */ @@ -70,12 +69,12 @@ class Smarty_Internal_Runtime_Inheritance public function init(Smarty_Internal_Template $tpl, $initChild, $blockNames = array()) { // if called while executing parent template it must be a sub-template with new inheritance root - if ($initChild && $this->state == 3 && (strpos($tpl->template_resource, 'extendsall') === false)) { + if ($initChild && $this->state === 3 && (strpos($tpl->template_resource, 'extendsall') === false)) { $tpl->inheritance = new Smarty_Internal_Runtime_Inheritance(); $tpl->inheritance->init($tpl, $initChild, $blockNames); return; } - $this->tplIndex ++; + ++$this->tplIndex; $this->sources[ $this->tplIndex ] = $tpl->source; // start of child sub template(s) @@ -85,12 +84,12 @@ class Smarty_Internal_Runtime_Inheritance //grab any output of child templates ob_start(); } - $this->inheritanceLevel ++; + ++$this->inheritanceLevel; // $tpl->startRenderCallbacks[ 'inheritance' ] = array($this, 'subTemplateStart'); // $tpl->endRenderCallbacks[ 'inheritance' ] = array($this, 'subTemplateEnd'); } // if state was waiting for parent change state to parent - if ($this->state == 2) { + if ($this->state === 2) { $this->state = 3; } } @@ -100,32 +99,46 @@ class Smarty_Internal_Runtime_Inheritance * - if outer level is reached flush output buffer and switch to wait for parent template state * * @param \Smarty_Internal_Template $tpl - * @param null|string $template optinal name of inheritance parent template + * @param null|string $template optional name of inheritance parent template * @param null|string $uid uid of inline template * @param null|string $func function call name of inline template + * + * @throws \Exception + * @throws \SmartyException */ public function endChild(Smarty_Internal_Template $tpl, $template = null, $uid = null, $func = null) { - $this->inheritanceLevel --; + --$this->inheritanceLevel; if (!$this->inheritanceLevel) { ob_end_clean(); $this->state = 2; } - if (isset($template) && (($tpl->parent->_isTplObj() && $tpl->parent->source->type !== 'extends') || $tpl->smarty->extends_recursion)) { - $tpl->_subTemplateRender($template, $tpl->cache_id, $tpl->compile_id, $tpl->caching ? 9999 : 0, - $tpl->cache_lifetime, array(), 2, false, $uid, $func); + if (isset($template) && (($tpl->parent->_isTplObj() && $tpl->parent->source->type !== 'extends') || + $tpl->smarty->extends_recursion)) { + $tpl->_subTemplateRender($template, + $tpl->cache_id, + $tpl->compile_id, + $tpl->caching ? 9999 : 0, + $tpl->cache_lifetime, + array(), + 2, + false, + $uid, + $func); } } /** * Smarty_Internal_Block constructor. - * - if outer level {block} of child template ($state == 1) save it as child root block + * - if outer level {block} of child template ($state === 1) save it as child root block * - otherwise process inheritance and render * * @param \Smarty_Internal_Template $tpl * @param $className * @param string $name * @param int|null $tplIndex index of outer level {block} if nested + * + * @throws \SmartyException */ public function instanceBlock(Smarty_Internal_Template $tpl, $className, $name, $tplIndex = null) { @@ -133,7 +146,7 @@ class Smarty_Internal_Runtime_Inheritance if (isset($this->childRoot[ $name ])) { $block->child = $this->childRoot[ $name ]; } - if ($this->state == 1) { + if ($this->state === 1) { $this->childRoot[ $name ] = $block; return; } @@ -164,7 +177,7 @@ class Smarty_Internal_Runtime_Inheritance } $block->parent = $parent; if ($block->append && !$block->prepend && isset($parent)) { - $this->callParent($tpl, $block); + $this->callParent($tpl, $block, '\'{block append}\''); } if ($block->callsChild || !isset($block->child) || ($block->child->hide && !isset($block->child->child))) { $this->callBlock($block, $tpl); @@ -172,7 +185,7 @@ class Smarty_Internal_Runtime_Inheritance $this->process($tpl, $block->child, $block); } if ($block->prepend && isset($parent)) { - $this->callParent($tpl, $block); + $this->callParent($tpl, $block, '{block prepend}'); if ($block->append) { if ($block->callsChild || !isset($block->child) || ($block->child->hide && !isset($block->child->child)) @@ -187,10 +200,13 @@ class Smarty_Internal_Runtime_Inheritance } /** - * Render child on {$smarty.block.child} + * Render child on \$smarty.block.child * * @param \Smarty_Internal_Template $tpl * @param \Smarty_Internal_Block $block + * + * @return null|string block content + * @throws \SmartyException */ public function callChild(Smarty_Internal_Template $tpl, Smarty_Internal_Block $block) { @@ -200,34 +216,27 @@ class Smarty_Internal_Runtime_Inheritance } /** - * Render parent on {$smarty.block.parent} or {block append/prepend} * + * Render parent block on \$smarty.block.parent or {block append/prepend} * * @param \Smarty_Internal_Template $tpl * @param \Smarty_Internal_Block $block + * @param string $tag * - * @param null $name - * + * @return null|string block content * @throws \SmartyException */ - public function callParent(Smarty_Internal_Template $tpl, Smarty_Internal_Block $block, $name = null) + public function callParent(Smarty_Internal_Template $tpl, Smarty_Internal_Block $block, $tag) { - if (isset($name)) { - $block = $block->parent; - while (isset($block)) { - if (isset($block->subBlocks[ $name ])) { - } else { - $block = $block->parent; - } - } - return; - } else if (isset($block->parent)) { + if (isset($block->parent)) { $this->callBlock($block->parent, $tpl); } else { - throw new SmartyException("inheritance: illegal {\$smarty.block.parent} or {block append/prepend} used in parent template '{$tpl->inheritance->sources[$block->tplIndex]->filepath}' block '{$block->name}'"); + throw new SmartyException("inheritance: illegal '{$tag}' used in child template '{$tpl->inheritance->sources[$block->tplIndex]->filepath}' block '{$block->name}'"); } } /** + * render block + * * @param \Smarty_Internal_Block $block * @param \Smarty_Internal_Template $tpl */ diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_tplfunction.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_tplfunction.php index f6b36f2a5..b86563cb3 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_tplfunction.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_tplfunction.php @@ -120,15 +120,13 @@ class Smarty_Internal_Runtime_TplFunction } // add template function code to cache file if (isset($tplPtr->cached)) { - /* @var Smarty_Template_Cached $cache */ - $cache = $tplPtr->cached; - $content = $cache->read($tplPtr); + $content = $tplPtr->cached->read($tplPtr); if ($content) { // check if we must update file dependency if (!preg_match("/'{$funcParam['uid']}'(.*?)'nocache_hash'/", $content, $match2)) { $content = preg_replace("/('file_dependency'(.*?)\()/", "\\1{$match1[0]}", $content); } - $tplPtr->smarty->ext->_updateCache->write($cache, $tplPtr, + $tplPtr->smarty->ext->_updateCache->write($tplPtr, preg_replace('/\s*\?>\s*$/', "\n", $content) . "\n" . preg_replace(array('/^\s*<\?php\s+/', '/\s*\?>\s*$/',), "\n", diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_updatecache.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_updatecache.php index ceee3b718..bb3e4e138 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_updatecache.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_updatecache.php @@ -22,6 +22,41 @@ class Smarty_Internal_Runtime_UpdateCache } /** + * Cache was invalid , so render from compiled and write to cache + * + * @param \Smarty_Template_Cached $cached + * @param \Smarty_Internal_Template $_template + * @param $no_output_filter + * + * @throws \Exception + */ + public function updateCache(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template, $no_output_filter) + { + ob_start(); + if (!isset($_template->compiled)) { + $_template->loadCompiled(); + } + $_template->compiled->render($_template); + if ($_template->smarty->debugging) { + $_template->smarty->_debug->start_cache($_template); + } + $this->removeNoCacheHash($cached, $_template, $no_output_filter); + $compile_check = (int)$_template->compile_check; + $_template->compile_check = Smarty::COMPILECHECK_OFF; + if ($_template->_isSubTpl()) { + $_template->compiled->unifunc = $_template->parent->compiled->unifunc; + } + if (!$_template->cached->processed) { + $_template->cached->process($_template, true); + } + $_template->compile_check = $compile_check; + $cached->getRenderedTemplateCode($_template); + if ($_template->smarty->debugging) { + $_template->smarty->_debug->end_cache($_template); + } + } + + /** * Sanitize content and write it to cache resource * * @param \Smarty_Template_Cached $cached @@ -30,35 +65,47 @@ class Smarty_Internal_Runtime_UpdateCache * * @throws \SmartyException */ - public function removeNoCacheHash(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template, + public function removeNoCacheHash(Smarty_Template_Cached $cached, + Smarty_Internal_Template $_template, $no_output_filter) { + $php_pattern = '/(<%|%>|<\?php|<\?|\?>|<script\s+language\s*=\s*[\"\']?\s*php\s*[\"\']?\s*>)/'; $content = ob_get_clean(); - unset($cached->hashes[ $_template->compiled->nocache_hash ]); - if (!empty($cached->hashes)) { - $hash_array = array(); - foreach ($cached->hashes as $hash => $foo) { - $hash_array[] = "/{$hash}/"; - } - $content = preg_replace($hash_array, $_template->compiled->nocache_hash, $content); - } + $hash_array = $cached->hashes; + $hash_array[$_template->compiled->nocache_hash] = true; + $hash_array = array_keys($hash_array); + $nocache_hash = '(' . implode('|', $hash_array) . ')'; $_template->cached->has_nocache_code = false; // get text between non-cached items $cache_split = - preg_split("!/\*%%SmartyNocache:{$_template->compiled->nocache_hash}%%\*\/(.+?)/\*/%%SmartyNocache:{$_template->compiled->nocache_hash}%%\*/!s", + preg_split("!/\*%%SmartyNocache:{$nocache_hash}%%\*\/(.+?)/\*/%%SmartyNocache:{$nocache_hash}%%\*/!s", $content); // get non-cached items - preg_match_all("!/\*%%SmartyNocache:{$_template->compiled->nocache_hash}%%\*\/(.+?)/\*/%%SmartyNocache:{$_template->compiled->nocache_hash}%%\*/!s", - $content, $cache_parts); + preg_match_all("!/\*%%SmartyNocache:{$nocache_hash}%%\*\/(.+?)/\*/%%SmartyNocache:{$nocache_hash}%%\*/!s", + $content, + $cache_parts); $content = ''; // loop over items, stitch back together foreach ($cache_split as $curr_idx => $curr_split) { - // escape PHP tags in template content - $content .= preg_replace('/(<%|%>|<\?php|<\?|\?>|<script\s+language\s*=\s*[\"\']?\s*php\s*[\"\']?\s*>)/', - "<?php echo '\$1'; ?>\n", $curr_split); + if (preg_match($php_pattern, $curr_split)) { + // escape PHP tags in template content + $php_split = preg_split($php_pattern, + $curr_split); + preg_match_all($php_pattern, + $curr_split, + $php_parts); + foreach ($php_split as $idx_php => $curr_php) { + $content .= $curr_php; + if (isset($php_parts[ 0 ][ $idx_php ])) { + $content .= "<?php echo '{$php_parts[ 1 ][ $idx_php ]}'; ?>\n"; + } + } + } else { + $content .= $curr_split; + } if (isset($cache_parts[ 0 ][ $curr_idx ])) { $_template->cached->has_nocache_code = true; - $content .= $cache_parts[ 1 ][ $curr_idx ]; + $content .= $cache_parts[ 2 ][ $curr_idx ]; } } if (!$no_output_filter && !$_template->cached->has_nocache_code && @@ -68,77 +115,43 @@ class Smarty_Internal_Runtime_UpdateCache $content = $_template->smarty->ext->_filterHandler->runFilter('output', $content, $_template); } // write cache file content - $this->writeCachedContent($cached, $_template, $content); - } - - /** - * Cache was invalid , so render from compiled and write to cache - * - * @param \Smarty_Template_Cached $cached - * @param \Smarty_Internal_Template $_template - * @param $no_output_filter - * - * @throws \Exception - */ - public function updateCache(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template, $no_output_filter) - { - ob_start(); - if (!isset($_template->compiled)) { - $_template->loadCompiled(); - } - $_template->compiled->render($_template); - if ($_template->smarty->debugging) { - $_template->smarty->_debug->start_cache($_template); - } - $this->removeNoCacheHash($cached, $_template, $no_output_filter); - $compile_check = $_template->smarty->compile_check; - $_template->smarty->compile_check = false; - if ($_template->_isSubTpl()) { - $_template->compiled->unifunc = $_template->parent->compiled->unifunc; - } - if (!$_template->cached->processed) { - $_template->cached->process($_template, true); - } - $_template->smarty->compile_check = $compile_check; - $cached->getRenderedTemplateCode($_template); - if ($_template->smarty->debugging) { - $_template->smarty->_debug->end_cache($_template); - } + $this->writeCachedContent($_template, $content); } /** * Writes the content to cache resource * - * @param \Smarty_Template_Cached $cached * @param Smarty_Internal_Template $_template * @param string $content * * @return bool */ - public function writeCachedContent(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template, $content) + public function writeCachedContent(Smarty_Internal_Template $_template, $content) { - if ($_template->source->handler->recompiled || !($_template->caching == Smarty::CACHING_LIFETIME_CURRENT || - $_template->caching == Smarty::CACHING_LIFETIME_SAVED) + if ($_template->source->handler->recompiled || !$_template->caching ) { // don't write cache file return false; } + if (!isset($_template->cached)) { + $_template->loadCached(); + } $content = $_template->smarty->ext->_codeFrame->create($_template, $content, '', true); - return $this->write($cached, $_template, $content); + return $this->write($_template, $content); } /** * Write this cache object to handler * - * @param \Smarty_Template_Cached $cached * @param Smarty_Internal_Template $_template template object * @param string $content content to cache * * @return bool success */ - public function write(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template, $content) + public function write(Smarty_Internal_Template $_template, $content) { if (!$_template->source->handler->recompiled) { + $cached = $_template->cached; if ($cached->handler->writeCachedContent($_template, $content)) { $cached->content = null; $cached->timestamp = time(); @@ -161,5 +174,4 @@ class Smarty_Internal_Runtime_UpdateCache return false; } - }
\ No newline at end of file diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_updatescope.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_updatescope.php index 79885321b..2d62c60bb 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_updatescope.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_updatescope.php @@ -82,7 +82,7 @@ class Smarty_Internal_Runtime_UpdateScope } /** - * Update varibale in other scope + * Update variable in other scope * * @param array $tpl_vars template variable array * @param \Smarty_Internal_Template $from diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_writefile.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_writefile.php index 7c462c6ca..dc9019f49 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_writefile.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_writefile.php @@ -6,7 +6,6 @@ * @subpackage PluginsInternal * @author Monte Ohrt */ - /** * Smarty Internal Write File Class * @@ -35,20 +34,30 @@ class Smarty_Internal_Runtime_WriteFile if ($_file_perms !== null) { $old_umask = umask(0); } - $_dirpath = dirname($_filepath); // if subdirs, create dir structure - if ($_dirpath !== '.' && !file_exists($_dirpath)) { - mkdir($_dirpath, $_dir_perms, true); + if ($_dirpath !== '.') { + $i = 0; + // loop if concurrency problem occurs + // see https://bugs.php.net/bug.php?id=35326 + while (!is_dir($_dirpath)) { + if (@mkdir($_dirpath, $_dir_perms, true)) { + break; + } + clearstatcache(); + if (++$i === 3) { + error_reporting($_error_reporting); + throw new SmartyException("unable to create directory {$_dirpath}"); + } + sleep(1); + } } - // write to tmp file, then move to overt file lock race condition - $_tmp_file = $_dirpath . $smarty->ds . str_replace(array('.', ','), '_', uniqid('wrt', true)); + $_tmp_file = $_dirpath . DIRECTORY_SEPARATOR . str_replace(array('.', ','), '_', uniqid('wrt', true)); if (!file_put_contents($_tmp_file, $_contents)) { error_reporting($_error_reporting); throw new SmartyException("unable to write file {$_tmp_file}"); } - /* * Windows' rename() fails if the destination exists, * Linux' rename() properly handles the overwrite. @@ -85,7 +94,6 @@ class Smarty_Internal_Runtime_WriteFile umask($old_umask); } error_reporting($_error_reporting); - return true; } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php index 8cd37dd56..bdf74065d 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php @@ -89,12 +89,16 @@ class Smarty_Internal_SmartyTemplateCompiler extends Smarty_Internal_TemplateCom then written to compiled files. */ // init the lexer/parser to compile the template $this->parser = - new $this->parser_class(new $this->lexer_class(str_replace(array("\r\n", "\r"), "\n", $_content), $this), + new $this->parser_class(new $this->lexer_class(str_replace(array("\r\n", + "\r"), "\n", $_content), $this), $this); if ($isTemplateSource && $this->template->caching) { $this->parser->insertPhpCode("<?php\n\$_smarty_tpl->compiled->nocache_hash = '{$this->nocache_hash}';\n?>\n"); } - if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) { + if (function_exists('mb_internal_encoding') + && function_exists('ini_get') + && ((int) ini_get('mbstring.func_overload')) & 2 + ) { $mbEncoding = mb_internal_encoding(); mb_internal_encoding('ASCII'); } else { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_template.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_template.php index f950606df..21f60f991 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_template.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_template.php @@ -17,6 +17,7 @@ * @property Smarty_Template_Compiled $compiled * @property Smarty_Template_Cached $cached * @property Smarty_Internal_TemplateCompilerBase $compiler + * @property mixed|\Smarty_Template_Cached registered_plugins * * The following methods will be dynamically loaded by the extension handler when they are called. * They are located in a corresponding Smarty_Internal_Method_xxxx class @@ -110,16 +111,18 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase public static $tplObjCache = array(); /** - * Template object cache for Smarty::isCached() == true + * Template object cache for Smarty::isCached() === true * * @var Smarty_Internal_Template[] */ public static $isCacheTplObj = array(); /** - * Subtemplate Info Cache + * Sub template Info Cache + * - index name + * - value use count * - * @var string[]int[] + * @var int[] */ public static $subTplInfo = array(); @@ -148,11 +151,9 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase // Smarty parameter $this->cache_id = $_cache_id === null ? $this->smarty->cache_id : $_cache_id; $this->compile_id = $_compile_id === null ? $this->smarty->compile_id : $_compile_id; - $this->caching = $_caching === null ? $this->smarty->caching : $_caching; - if ($this->caching === true) { - $this->caching = Smarty::CACHING_LIFETIME_CURRENT; - } + $this->caching = (int)($_caching === null ? $this->smarty->caching : $_caching); $this->cache_lifetime = $_cache_lifetime === null ? $this->smarty->cache_lifetime : $_cache_lifetime; + $this->compile_check = (int)$smarty->compile_check; $this->parent = $_parent; // Template resource $this->template_resource = $template_resource; @@ -170,6 +171,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase * @param null|bool $display true: display, false: fetch null: sub-template * * @return string + * @throws \Exception * @throws \SmartyException */ public function render($no_output_filter = true, $display = null) @@ -187,12 +189,10 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase } // disable caching for evaluated code if ($this->source->handler->recompiled) { - $this->caching = false; + $this->caching = Smarty::CACHING_OFF; } // read from cache or render - $isCacheTpl = - $this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED; - if ($isCacheTpl) { + if ($this->caching === Smarty::CACHING_LIFETIME_CURRENT || $this->caching === Smarty::CACHING_LIFETIME_SAVED) { if (!isset($this->cached) || $this->cached->cache_id !== $this->cache_id || $this->cached->compile_id !== $this->compile_id ) { @@ -234,15 +234,6 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase $this->smarty->_debug->display_debug($this, true); } } - if ($this->_isSubTpl()) { - foreach ($this->compiled->required_plugins as $code => $tmp1) { - foreach ($tmp1 as $name => $tmp) { - foreach ($tmp as $type => $data) { - $this->parent->compiled->required_plugins[ $code ][ $name ][ $type ] = $data; - } - } - } - } if (!$no_output_filter && (!$this->caching || $this->cached->has_nocache_code || $this->source->handler->recompiled) && (isset($this->smarty->autoload_filters[ 'output' ]) || @@ -269,6 +260,8 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase * @param string $uid file dependency uid * @param string $content_func function name * + * @throws \Exception + * @throws \SmartyException */ public function _subTemplateRender($template, $cache_id, $compile_id, $caching, $cache_lifetime, $data, $scope, $forceTplCache, $uid = null, $content_func = null) @@ -278,7 +271,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase $smarty = &$this->smarty; $_templateId = $smarty->_getTemplateId($template, $cache_id, $compile_id, $caching, $tpl); // recursive call ? - if (isset($tpl->templateId) ? $tpl->templateId : $tpl->_getTemplateId() != $_templateId) { + if (isset($tpl->templateId) ? $tpl->templateId : $tpl->_getTemplateId() !== $_templateId) { // already in template cache? if (isset(self::$tplObjCache[ $_templateId ])) { // copy data from cached object @@ -293,7 +286,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase } else { unset($tpl->compiled); } - if ($caching != 9999 && isset($cachedTpl->cached)) { + if ($caching !== 9999 && isset($cachedTpl->cached)) { $tpl->cached = $cachedTpl->cached; } else { unset($tpl->cached); @@ -315,7 +308,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase $tpl->source = Smarty_Template_Source::load($tpl); unset($tpl->compiled); } - if ($caching != 9999) { + if ($caching !== 9999) { unset($tpl->cached); } } @@ -343,7 +336,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase $tpl->tpl_vars[ $_key ] = new Smarty_Variable($_val, $this->isRenderingCache); } } - if ($tpl->caching == 9999) { + if ($tpl->caching === 9999) { if (!isset($tpl->compiled)) { $this->loadCompiled(true); } @@ -427,6 +420,39 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase } /** + * Check if plugins are callable require file otherwise + * + * @param array $plugins required plugins + * + * @throws \SmartyException + */ + public function _checkPlugins($plugins) { + static $checked = array(); + foreach($plugins as $plugin) { + $name = join('::', (array)$plugin[ 'function' ]); + if (!isset($checked[$name])) { + if (!is_callable($plugin['function'])) { + if (is_file($plugin['file'])) { + require_once $plugin['file']; + if (is_callable($plugin['function'])) { + $checked[ $name ] = true; + } + } + } else { + $checked[ $name ] = true; + } + } + if (!isset($checked[ $name ])) { + if (false !== $this->smarty->loadPlugin($name)) { + $checked[ $name ] = true; + } else { + throw new SmartyException("Plugin '{$name}' not callable"); + } + } + } + } + + /** * This function is executed automatically when a compiled or cached template file is included * - Decode saved properties from compiled template and cache files * - Check if compiled or cache file is valid @@ -451,12 +477,12 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase } $is_valid = true; if (!empty($properties[ 'file_dependency' ]) && - ((!$cache && $tpl->smarty->compile_check) || $tpl->smarty->compile_check == 1) + ((!$cache && $tpl->compile_check) || $tpl->compile_check === Smarty::COMPILECHECK_ON) ) { // check file dependencies at compiled code foreach ($properties[ 'file_dependency' ] as $_file_to_check) { - if ($_file_to_check[ 2 ] == 'file' || $_file_to_check[ 2 ] == 'php') { - if ($tpl->source->filepath == $_file_to_check[ 0 ]) { + if ($_file_to_check[ 2 ] === 'file' || $_file_to_check[ 2 ] === 'php') { + if ($tpl->source->filepath === $_file_to_check[ 0 ]) { // do not recheck current template continue; //$mtime = $tpl->source->getTimeStamp(); @@ -521,13 +547,14 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase */ public function writeCachedContent($content) { - return $this->smarty->ext->_updateCache->writeCachedContent($this->cached, $this, $content); + return $this->smarty->ext->_updateCache->writeCachedContent($this, $content); } /** * Get unique template id * * @return string + * @throws \SmartyException */ public function _getTemplateId() { @@ -540,7 +567,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase */ public function capture_error() { - throw new SmartyException("Not matching {capture} open/close in \"{$this->template_resource}\""); + throw new SmartyException("Not matching {capture} open/close in '{$this->template_resource}'"); } /** diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatebase.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatebase.php index c026a6644..6b959404c 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatebase.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatebase.php @@ -21,10 +21,12 @@ * * @method Smarty_Internal_TemplateBase addAutoloadFilters(mixed $filters, string $type = null) * @method Smarty_Internal_TemplateBase addDefaultModifier(mixed $modifiers) + * @method Smarty_Internal_TemplateBase addLiterals(mixed $literals) * @method Smarty_Internal_TemplateBase createData(Smarty_Internal_Data $parent = null, string $name = null) * @method array getAutoloadFilters(string $type = null) * @method string getDebugTemplate() * @method array getDefaultModifier() + * @method array getLiterals() * @method array getTags(mixed $template = null) * @method object getRegisteredObject(string $object_name) * @method Smarty_Internal_TemplateBase registerCacheResource(string $name, Smarty_CacheResource $resource_handler) @@ -35,14 +37,14 @@ * @method Smarty_Internal_TemplateBase registerResource(string $name, mixed $resource_handler) * @method Smarty_Internal_TemplateBase setAutoloadFilters(mixed $filters, string $type = null) * @method Smarty_Internal_TemplateBase setDebugTemplate(string $tpl_name) - * @method Smarty_Internal_TemplateBase setDefaultModifier(mixed $modifiers) + * @method Smarty_Internal_TemplateBase setDefaultModifiers(mixed $modifiers) + * @method Smarty_Internal_TemplateBase setLiterals(mixed $literals) * @method Smarty_Internal_TemplateBase unloadFilter(string $type, string $name) * @method Smarty_Internal_TemplateBase unregisterCacheResource(string $name) * @method Smarty_Internal_TemplateBase unregisterObject(string $object_name) * @method Smarty_Internal_TemplateBase unregisterPlugin(string $type, string $name) * @method Smarty_Internal_TemplateBase unregisterFilter(string $type, mixed $callback) * @method Smarty_Internal_TemplateBase unregisterResource(string $name) - * @method Smarty _getSmartyObj() */ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data { @@ -65,9 +67,16 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data /** * caching enabled * - * @var boolean + * @var int */ - public $caching = false; + public $caching = Smarty::CACHING_OFF; + + /** + * check template for modifications? + * + * @var int + */ + public $compile_check = Smarty::COMPILECHECK_ON; /** * cache lifetime in seconds @@ -115,6 +124,9 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data * @param mixed $cache_id cache id to be used with this template * @param mixed $compile_id compile id to be used with this template * @param object $parent next higher level of Smarty variables + * + * @throws \Exception + * @throws \SmartyException */ public function display($template = null, $cache_id = null, $compile_id = null, $parent = null) { @@ -133,7 +145,9 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data * @param mixed $compile_id compile id to be used with this template * @param object $parent next higher level of Smarty variables * - * @return boolean cache status + * @return bool cache status + * @throws \Exception + * @throws \SmartyException */ public function isCached($template = null, $cache_id = null, $compile_id = null, $parent = null) { @@ -173,26 +187,28 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data $saveVars = false; $template = $smarty->createTemplate($template, $cache_id, $compile_id, $parent ? $parent : $this, false); - if ($this->_objType == 1) { + if ($this->_objType === 1) { // set caching in template object $template->caching = $this->caching; } } + // make sure we have integer values + $template->caching = (int)$template->caching; // fetch template content $level = ob_get_level(); try { $_smarty_old_error_level = isset($smarty->error_reporting) ? error_reporting($smarty->error_reporting) : null; - if ($this->_objType == 2) { + if ($this->_objType === 2) { /* @var Smarty_Internal_Template $this */ $template->tplFunctions = $this->tplFunctions; $template->inheritance = $this->inheritance; } /* @var Smarty_Internal_Template $parent */ - if (isset($parent->_objType) && ($parent->_objType == 2) && !empty($parent->tplFunctions)) { + if (isset($parent->_objType) && ($parent->_objType === 2) && !empty($parent->tplFunctions)) { $template->tplFunctions = array_merge($parent->tplFunctions, $template->tplFunctions); } - if ($function == 2) { + if ($function === 2) { if ($template->caching) { // return cache status of template if (!isset($template->cached)) { @@ -320,11 +336,19 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data } /** - * @param boolean $caching + * @param int $compile_check + */ + public function setCompileCheck($compile_check) + { + $this->compile_check = (int)$compile_check; + } + + /** + * @param int $caching */ public function setCaching($caching) { - $this->caching = $caching; + $this->caching = (int)$caching; } /** diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php index 158d654c7..0d7284a0a 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php @@ -1,5 +1,4 @@ <?php - /** * Smarty Internal Plugin Smarty Template Compiler Base * This file contains the basic classes and methods for compiling Smarty templates with lexer/parser @@ -22,28 +21,36 @@ */ abstract class Smarty_Internal_TemplateCompilerBase { - + /** + * compile tag objects cache + * + * @var array + */ + static $_tag_objects = array(); + /** + * counter for prefix variable number + * + * @var int + */ + public static $prefixVariableNumber = 0; /** * Smarty object * * @var Smarty */ public $smarty = null; - /** * Parser object * * @var Smarty_Internal_Templateparser */ public $parser = null; - /** * hash for nocache sections * * @var mixed */ public $nocache_hash = null; - /** * suppress generation of nocache code * @@ -52,11 +59,11 @@ abstract class Smarty_Internal_TemplateCompilerBase public $suppressNocacheProcessing = false; /** - * compile tag objects cache + * caching enabled (copied from template object) * - * @var array + * @var int */ - static $_tag_objects = array(); + public $caching = 0; /** * tag stack @@ -64,175 +71,174 @@ abstract class Smarty_Internal_TemplateCompilerBase * @var array */ public $_tag_stack = array(); - + /** + * tag stack count + * + * @var array + */ + public $_tag_stack_count = array(); + /** + * Plugins used by template + * + * @var array + */ + public $required_plugins = array('compiled' => array(), 'nocache' => array()); + /** + * Required plugins stack + * + * @var array + */ + public $required_plugins_stack = array(); /** * current template * * @var Smarty_Internal_Template */ public $template = null; - /** * merged included sub template data * * @var array */ public $mergedSubTemplatesData = array(); - /** * merged sub template code * * @var array */ public $mergedSubTemplatesCode = array(); - /** * collected template properties during compilation * * @var array */ public $templateProperties = array(); - /** * source line offset for error messages * * @var int */ public $trace_line_offset = 0; - /** * trace uid * * @var string */ public $trace_uid = ''; - /** * trace file path * * @var string */ public $trace_filepath = ''; - /** * stack for tracing file and line of nested {block} tags * * @var array */ public $trace_stack = array(); - /** * plugins loaded by default plugin handler * * @var array */ public $default_handler_plugins = array(); - /** * saved preprocessed modifier list * * @var mixed */ public $default_modifier_list = null; - /** * force compilation of complete template as nocache * * @var boolean */ public $forceNocache = false; - /** * flag if compiled template file shall we written * * @var bool */ public $write_compiled_code = true; - /** * Template functions * * @var array */ public $tpl_function = array(); - /** * called sub functions from template function * * @var array */ public $called_functions = array(); - /** * compiled template or block function code * * @var string */ public $blockOrFunctionCode = ''; - /** * php_handling setting either from Smarty or security * * @var int */ public $php_handling = 0; - /** * flags for used modifier plugins * * @var array */ public $modifier_plugins = array(); - /** * type of already compiled modifier * * @var array */ public $known_modifier_type = array(); - /** * parent compiler object for merged subtemplates and template functions * * @var Smarty_Internal_TemplateCompilerBase */ public $parent_compiler = null; - /** * Flag true when compiling nocache section * * @var bool */ public $nocache = false; - /** * Flag true when tag is compiled as nocache * * @var bool */ public $tag_nocache = false; - /** * Compiled tag prefix code * * @var array */ public $prefix_code = array(); - + /** + * used prefix variables by current compiled tag + * + * @var array + */ + public $usedPrefixVariables = array(); /** * Prefix code stack * * @var array */ public $prefixCodeStack = array(); - /** * Tag has compiled code * * @var bool */ public $has_code = false; - /** * A variable string was compiled * @@ -241,70 +247,74 @@ abstract class Smarty_Internal_TemplateCompilerBase public $has_variable_string = false; /** - * Tag creates output - * - * @var bool - */ - public $has_output = false; - - /** * Stack for {setfilter} {/setfilter} * * @var array */ public $variable_filter_stack = array(); - /** * variable filters for {setfilter} {/setfilter} * * @var array */ public $variable_filters = array(); - /** * Nesting count of looping tags like {foreach}, {for}, {section}, {while} * * @var int */ public $loopNesting = 0; - /** * Strip preg pattern * * @var string */ public $stripRegEx = '![\t ]*[\r\n]+[\t ]*!'; - /** * plugin search order * * @var array */ - public $plugin_search_order = array('function', 'block', 'compiler', 'class'); - + public $plugin_search_order = array('function', + 'block', + 'compiler', + 'class'); /** * General storage area for tag compiler plugins * * @var array */ public $_cache = array(); - /** - * counter for prefix variable number + * Lexer preg pattern for left delimiter + * + * @var string + */ + private $ldelPreg = '[{]'; + /** + * Lexer preg pattern for right delimiter + * + * @var string + */ + private $rdelPreg = '[}]'; + /** + * Length of right delimiter * * @var int */ - public static $prefixVariableNumber = 0; - + private $rdelLength = 0; /** - * method to compile a Smarty template + * Length of left delimiter * - * @param mixed $_content template source - * @param bool $isTemplateSource + * @var int + */ + private $ldelLength = 0; + /** + * Lexer preg pattern for user literals * - * @return bool true if compiling succeeded, false if it failed + * @var string */ - abstract protected function doCompile($_content, $isTemplateSource = false); + private $literalPreg = ''; /** * Initialize compiler @@ -314,7 +324,10 @@ abstract class Smarty_Internal_TemplateCompilerBase public function __construct(Smarty $smarty) { $this->smarty = $smarty; - $this->nocache_hash = str_replace(array('.', ','), '_', uniqid(rand(), true)); + $this->nocache_hash = str_replace(array('.', + ','), + '_', + uniqid(rand(), true)); } /** @@ -327,15 +340,18 @@ abstract class Smarty_Internal_TemplateCompilerBase * @return bool true if compiling succeeded, false if it failed * @throws \Exception */ - public function compileTemplate(Smarty_Internal_Template $template, $nocache = null, + public function compileTemplate(Smarty_Internal_Template $template, + $nocache = null, Smarty_Internal_TemplateCompilerBase $parent_compiler = null) { // get code frame of compiled template $_compiled_code = $template->smarty->ext->_codeFrame->create($template, - $this->compileTemplateSource($template, $nocache, + $this->compileTemplateSource($template, + $nocache, $parent_compiler), $this->postFilter($this->blockOrFunctionCode) . - join('', $this->mergedSubTemplatesCode), false, + join('', $this->mergedSubTemplatesCode), + false, $this); return $_compiled_code; } @@ -350,7 +366,8 @@ abstract class Smarty_Internal_TemplateCompilerBase * @return string * @throws \Exception */ - public function compileTemplateSource(Smarty_Internal_Template $template, $nocache = null, + public function compileTemplateSource(Smarty_Internal_Template $template, + $nocache = null, Smarty_Internal_TemplateCompilerBase $parent_compiler = null) { try { @@ -377,6 +394,7 @@ abstract class Smarty_Internal_TemplateCompilerBase } else { $this->nocache_hash = $template->compiled->nocache_hash; } + $this->caching = $template->caching; // flag for nocache sections $this->nocache = $nocache; $this->tag_nocache = false; @@ -387,7 +405,8 @@ abstract class Smarty_Internal_TemplateCompilerBase // add file dependency if ($this->smarty->merge_compiled_includes || $this->template->source->handler->checkTimestamps()) { $this->parent_compiler->template->compiled->file_dependency[ $this->template->source->uid ] = - array($this->template->source->filepath, $this->template->source->getTimeStamp(), + array($this->template->source->filepath, + $this->template->source->getTimeStamp(), $this->template->source->type,); } $this->smarty->_current_file = $this->template->source->filepath; @@ -396,7 +415,7 @@ abstract class Smarty_Internal_TemplateCompilerBase // we have array of inheritance templates by extends: resource // generate corresponding source code sequence $_content = - Smarty_Internal_Compile_Extends::extendsSourceArrayCode($this->template->source->components); + Smarty_Internal_Compile_Extends::extendsSourceArrayCode($this->template); } else { // get template source $_content = $this->template->source->getContent(); @@ -453,7 +472,7 @@ abstract class Smarty_Internal_TemplateCompilerBase public function preFilter($_content) { // run pre filter if required - if ($_content != '' && + if ($_content !== '' && ((isset($this->smarty->autoload_filters[ 'pre' ]) || isset($this->smarty->registered_filters[ 'pre' ]))) ) { return $this->smarty->ext->_filterHandler->runFilter('pre', $_content, $this->template); @@ -489,257 +508,6 @@ abstract class Smarty_Internal_TemplateCompilerBase } /** - * Compile Tag - * - * @param string $tag tag name - * @param array $args array with tag attributes - * @param array $parameter array with compilation parameter - * - * @throws SmartyCompilerException - * @throws SmartyException - * @return string compiled code - */ - private function compileTag2($tag, $args, $parameter) - { - $plugin_type = ''; - // $args contains the attributes parsed and compiled by the lexer/parser - // assume that tag does compile into code, but creates no HTML output - $this->has_code = true; - $this->has_output = false; - // log tag/attributes - if (isset($this->smarty->_cache[ 'get_used_tags' ])) { - $this->template->_cache[ 'used_tags' ][] = array($tag, $args); - } - // check nocache option flag - foreach ($args as $arg) { - if (!is_array($arg)) { - if ($arg === "'nocache'" || $arg === 'nocache') { - $this->tag_nocache = true; - } - } else { - foreach ($arg as $k => $v) { - if (($k === "'nocache'" || $k === 'nocache') && (trim($v, "'\" ") == 'true')) { - $this->tag_nocache = true; - } - } - } - } - // compile the smarty tag (required compile classes to compile the tag are auto loaded) - if (($_output = $this->callTagCompiler($tag, $args, $parameter)) === false) { - if (isset($this->parent_compiler->tpl_function[ $tag ]) || - (isset ($this->template->smarty->ext->_tplFunction) && $this->template->smarty->ext->_tplFunction->getTplFunction($this->template, $tag) !== false)) { - // template defined by {template} tag - $args[ '_attr' ][ 'name' ] = "'" . $tag . "'"; - $_output = $this->callTagCompiler('call', $args, $parameter); - } - } - if ($_output !== false) { - if ($_output !== true) { - // did we get compiled code - if ($this->has_code) { - // Does it create output? - if ($this->has_output) { - $_output .= "\n"; - } - // return compiled code - return $_output; - } - } - // tag did not produce compiled code - return null; - } else { - // map_named attributes - if (isset($args[ '_attr' ])) { - foreach ($args[ '_attr' ] as $key => $attribute) { - if (is_array($attribute)) { - $args = array_merge($args, $attribute); - } - } - } - // not an internal compiler tag - if (strlen($tag) < 6 || substr($tag, - 5) != 'close') { - // check if tag is a registered object - if (isset($this->smarty->registered_objects[ $tag ]) && isset($parameter[ 'object_method' ])) { - $method = $parameter[ 'object_method' ]; - if (!in_array($method, $this->smarty->registered_objects[ $tag ][ 3 ]) && - (empty($this->smarty->registered_objects[ $tag ][ 1 ]) || - in_array($method, $this->smarty->registered_objects[ $tag ][ 1 ])) - ) { - return $this->callTagCompiler('private_object_function', $args, $parameter, $tag, $method); - } elseif (in_array($method, $this->smarty->registered_objects[ $tag ][ 3 ])) { - return $this->callTagCompiler('private_object_block_function', $args, $parameter, $tag, - $method); - } else { - // throw exception - $this->trigger_template_error('not allowed method "' . $method . '" in registered object "' . - $tag . '"', null, true); - } - } - // check if tag is registered - foreach (array(Smarty::PLUGIN_COMPILER, Smarty::PLUGIN_FUNCTION, Smarty::PLUGIN_BLOCK,) as $plugin_type) - { - if (isset($this->smarty->registered_plugins[ $plugin_type ][ $tag ])) { - // if compiler function plugin call it now - if ($plugin_type == Smarty::PLUGIN_COMPILER) { - $new_args = array(); - foreach ($args as $key => $mixed) { - if (is_array($mixed)) { - $new_args = array_merge($new_args, $mixed); - } else { - $new_args[ $key ] = $mixed; - } - } - if (!$this->smarty->registered_plugins[ $plugin_type ][ $tag ][ 1 ]) { - $this->tag_nocache = true; - } - return call_user_func_array($this->smarty->registered_plugins[ $plugin_type ][ $tag ][ 0 ], - array($new_args, $this)); - } - // compile registered function or block function - if ($plugin_type == Smarty::PLUGIN_FUNCTION || $plugin_type == Smarty::PLUGIN_BLOCK) { - return $this->callTagCompiler('private_registered_' . $plugin_type, $args, $parameter, - $tag); - } - } - } - // check plugins from plugins folder - foreach ($this->plugin_search_order as $plugin_type) { - if ($plugin_type == Smarty::PLUGIN_COMPILER && - $this->smarty->loadPlugin('smarty_compiler_' . $tag) && - (!isset($this->smarty->security_policy) || - $this->smarty->security_policy->isTrustedTag($tag, $this)) - ) { - $plugin = 'smarty_compiler_' . $tag; - if (is_callable($plugin)) { - // convert arguments format for old compiler plugins - $new_args = array(); - foreach ($args as $key => $mixed) { - if (is_array($mixed)) { - $new_args = array_merge($new_args, $mixed); - } else { - $new_args[ $key ] = $mixed; - } - } - - return $plugin($new_args, $this->smarty); - } - if (class_exists($plugin, false)) { - $plugin_object = new $plugin; - if (method_exists($plugin_object, 'compile')) { - return $plugin_object->compile($args, $this); - } - } - throw new SmartyException("Plugin \"{$tag}\" not callable"); - } else { - if ($function = $this->getPlugin($tag, $plugin_type)) { - if (!isset($this->smarty->security_policy) || - $this->smarty->security_policy->isTrustedTag($tag, $this) - ) { - return $this->callTagCompiler('private_' . $plugin_type . '_plugin', $args, $parameter, - $tag, $function); - } - } - } - } - if (is_callable($this->smarty->default_plugin_handler_func)) { - $found = false; - // look for already resolved tags - foreach ($this->plugin_search_order as $plugin_type) { - if (isset($this->default_handler_plugins[ $plugin_type ][ $tag ])) { - $found = true; - break; - } - } - if (!$found) { - // call default handler - foreach ($this->plugin_search_order as $plugin_type) { - if ($this->getPluginFromDefaultHandler($tag, $plugin_type)) { - $found = true; - break; - } - } - } - if ($found) { - // if compiler function plugin call it now - if ($plugin_type == Smarty::PLUGIN_COMPILER) { - $new_args = array(); - foreach ($args as $mixed) { - $new_args = array_merge($new_args, $mixed); - } - return call_user_func_array($this->default_handler_plugins[ $plugin_type ][ $tag ][ 0 ], - array($new_args, $this)); - } else { - return $this->callTagCompiler('private_registered_' . $plugin_type, $args, $parameter, - $tag); - } - } - } - } else { - // compile closing tag of block function - $base_tag = substr($tag, 0, - 5); - // check if closing tag is a registered object - if (isset($this->smarty->registered_objects[ $base_tag ]) && isset($parameter[ 'object_method' ])) { - $method = $parameter[ 'object_method' ]; - if (in_array($method, $this->smarty->registered_objects[ $base_tag ][ 3 ])) { - return $this->callTagCompiler('private_object_block_function', $args, $parameter, $tag, - $method); - } else { - // throw exception - $this->trigger_template_error('not allowed closing tag method "' . $method . - '" in registered object "' . $base_tag . '"', null, true); - } - } - // registered block tag ? - if (isset($this->smarty->registered_plugins[ Smarty::PLUGIN_BLOCK ][ $base_tag ]) || - isset($this->default_handler_plugins[ Smarty::PLUGIN_BLOCK ][ $base_tag ]) - ) { - return $this->callTagCompiler('private_registered_block', $args, $parameter, $tag); - } - // registered function tag ? - if (isset($this->smarty->registered_plugins[ Smarty::PLUGIN_FUNCTION ][ $tag ])) { - return $this->callTagCompiler('private_registered_function', $args, $parameter, $tag); - } - // block plugin? - if ($function = $this->getPlugin($base_tag, Smarty::PLUGIN_BLOCK)) { - return $this->callTagCompiler('private_block_plugin', $args, $parameter, $tag, $function); - } - // function plugin? - if ($function = $this->getPlugin($tag, Smarty::PLUGIN_FUNCTION)) { - if (!isset($this->smarty->security_policy) || - $this->smarty->security_policy->isTrustedTag($tag, $this) - ) { - return $this->callTagCompiler('private_function_plugin', $args, $parameter, $tag, $function); - } - } - // registered compiler plugin ? - if (isset($this->smarty->registered_plugins[ Smarty::PLUGIN_COMPILER ][ $tag ])) { - // if compiler function plugin call it now - $args = array(); - if (!$this->smarty->registered_plugins[ Smarty::PLUGIN_COMPILER ][ $tag ][ 1 ]) { - $this->tag_nocache = true; - } - return call_user_func_array($this->smarty->registered_plugins[ Smarty::PLUGIN_COMPILER ][ $tag ][ 0 ], - array($args, $this)); - } - if ($this->smarty->loadPlugin('smarty_compiler_' . $tag)) { - $plugin = 'smarty_compiler_' . $tag; - if (is_callable($plugin)) { - return $plugin($args, $this->smarty); - } - if (class_exists($plugin, false)) { - $plugin_object = new $plugin; - if (method_exists($plugin_object, 'compile')) { - return $plugin_object->compile($args, $this); - } - } - throw new SmartyException("Plugin \"{$tag}\" not callable"); - } - } - $this->trigger_template_error("unknown tag \"" . $tag . "\"", null, true); - } - } - - /** * compile variable * * @param string $variable @@ -748,11 +516,14 @@ abstract class Smarty_Internal_TemplateCompilerBase */ public function compileVariable($variable) { - if (strpos($variable, '(') == 0) { + if (!strpos($variable, '(')) { // not a variable variable $var = trim($variable, '\''); $this->tag_nocache = $this->tag_nocache | - $this->template->ext->getTemplateVars->_getVariable($this->template, $var, null, true, + $this->template->ext->getTemplateVars->_getVariable($this->template, + $var, + null, + true, false)->nocache; // todo $this->template->compiled->properties['variables'][$var] = $this->tag_nocache | $this->nocache; } @@ -779,6 +550,7 @@ abstract class Smarty_Internal_TemplateCompilerBase * @param array $parameter * * @return string + * @throws \SmartyCompilerException */ public function compilePHPFunctionCall($name, $parameter) { @@ -789,28 +561,33 @@ abstract class Smarty_Internal_TemplateCompilerBase $func_name = strtolower($name); $par = implode(',', $parameter); $parHasFuction = strpos($par, '(') !== false; - if ($func_name == 'isset') { - if (count($parameter) == 0) { - $this->trigger_template_error('Illegal number of paramer in "isset()"'); + if ($func_name === 'isset') { + if (count($parameter) === 0) { + $this->trigger_template_error('Illegal number of parameter in "isset()"'); } if ($parHasFuction) { - $prefixVar = $this->getNewPrefixVariable(); - $this->appendPrefixCode("<?php $prefixVar" . '=' . $par . ';?>'); - $isset_par = $prefixVar; + $pa = array(); + foreach ($parameter as $p) { + $pa[] = (strpos($p, '(') === false) ? ('isset(' . $p . ')') : ('(' . $p . ' !== null )'); + } + return '(' . implode(' && ', $pa) . ')'; } else { $isset_par = str_replace("')->value", "',null,true,false)->value", $par); } - return $name . "(" . $isset_par . ")"; - } elseif (in_array($func_name, array('empty', 'reset', 'current', 'end', 'prev', 'next'))) { - if (count($parameter) != 1) { - $this->trigger_template_error('Illegal number of paramer in "empty()"'); + return $name . '(' . $isset_par . ')'; + } else if (in_array($func_name, + array('empty', + 'reset', + 'current', + 'end', + 'prev', + 'next'))) { + if (count($parameter) !== 1) { + $this->trigger_template_error("Illegal number of parameter in '{$func_name()}'"); } - if ($func_name == 'empty') { - if ($parHasFuction) { - $prefixVar = $this->getNewPrefixVariable(); - $this->appendPrefixCode("<?php $prefixVar" . '=' . $par . ';?>'); - - return $func_name . '(' . $prefixVar . ')'; + if ($func_name === 'empty') { + if ($parHasFuction && version_compare(PHP_VERSION, '5.5.0', '<')) { + return '(' . $parameter[ 0 ] . ' === false )'; } else { return $func_name . '(' . str_replace("')->value", "',null,true,false)->value", $parameter[ 0 ]) . ')'; @@ -819,10 +596,10 @@ abstract class Smarty_Internal_TemplateCompilerBase return $func_name . '(' . $parameter[ 0 ] . ')'; } } else { - return $name . "(" . implode(',', $parameter) . ")"; + return $name . '(' . implode(',', $parameter) . ')'; } } else { - $this->trigger_template_error("unknown function \"" . $name . "\""); + $this->trigger_template_error("unknown function '{$name}'"); } } } @@ -838,7 +615,7 @@ abstract class Smarty_Internal_TemplateCompilerBase */ public function processText($text) { - if ((string) $text != '') { + if ((string)$text !== '') { $store = array(); $_store = 0; if ($this->parser->strip) { @@ -846,37 +623,39 @@ abstract class Smarty_Internal_TemplateCompilerBase // capture html elements not to be messed with $_offset = 0; if (preg_match_all('#(<script[^>]*>.*?</script[^>]*>)|(<textarea[^>]*>.*?</textarea[^>]*>)|(<pre[^>]*>.*?</pre[^>]*>)#is', - $text, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) { + $text, + $matches, + PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) { foreach ($matches as $match) { $store[] = $match[ 0 ][ 0 ]; $_length = strlen($match[ 0 ][ 0 ]); $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@'; $text = substr_replace($text, $replace, $match[ 0 ][ 1 ] - $_offset, $_length); - $_offset += $_length - strlen($replace); - $_store ++; + ++$_store; } } $expressions = array(// replace multiple spaces between tags by a single space - '#(:SMARTY@!@|>)[\040\011]+(?=@!@SMARTY:|<)#s' => '\1 \2', + '#(:SMARTY@!@|>)[\040\011]+(?=@!@SMARTY:|<)#s' => '\1 \2', // remove newline between tags - '#(:SMARTY@!@|>)[\040\011]*[\n]\s*(?=@!@SMARTY:|<)#s' => '\1\2', + '#(:SMARTY@!@|>)[\040\011]*[\n]\s*(?=@!@SMARTY:|<)#s' => '\1\2', // remove multiple spaces between attributes (but not in attribute values!) '#(([a-z0-9]\s*=\s*("[^"]*?")|(\'[^\']*?\'))|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \5', - '#>[\040\011]+$#Ss' => '> ', '#>[\040\011]*[\n]\s*$#Ss' => '>', - $this->stripRegEx => '',); - + '#>[\040\011]+$#Ss' => '> ', + '#>[\040\011]*[\n]\s*$#Ss' => '>', + $this->stripRegEx => '',); $text = preg_replace(array_keys($expressions), array_values($expressions), $text); $_offset = 0; - if (preg_match_all('#@!@SMARTY:([0-9]+):SMARTY@!@#is', $text, $matches, + if (preg_match_all('#@!@SMARTY:([0-9]+):SMARTY@!@#is', + $text, + $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) { foreach ($matches as $match) { $_length = strlen($match[ 0 ][ 0 ]); $replace = $store[ $match[ 1 ][ 0 ] ]; $text = substr_replace($text, $replace, $match[ 0 ][ 1 ] + $_offset, $_length); - $_offset += strlen($replace) - $_length; - $_store ++; + ++$_store; } } } else { @@ -900,10 +679,12 @@ abstract class Smarty_Internal_TemplateCompilerBase * @param mixed $param2 optional parameter * @param mixed $param3 optional parameter * - * @return string|bool compiled code or false + * @return bool|string compiled code or false + * @throws \SmartyCompilerException */ public function callTagCompiler($tag, $args, $param1 = null, $param2 = null, $param3 = null) { + /* @var Smarty_Internal_CompileBase $tagCompiler */ $tagCompiler = $this->getTagCompiler($tag); // compile this tag return $tagCompiler === false ? false : $tagCompiler->compile($args, $this, $param1, $param2, $param3); @@ -917,7 +698,8 @@ abstract class Smarty_Internal_TemplateCompilerBase * * @param string $tag tag name * - * @return Smarty_Internal_CompileBase|bool tag compiler object or false if not found + * @return bool|\Smarty_Internal_CompileBase tag compiler object or false if not found + * @throws \SmartyCompilerException */ public function getTagCompiler($tag) { @@ -945,65 +727,62 @@ abstract class Smarty_Internal_TemplateCompilerBase * @param string $plugin_type type of plugin * * @return string call name of function + * @throws \SmartyException */ public function getPlugin($plugin_name, $plugin_type) { $function = null; - if ($this->template->caching && ($this->nocache || $this->tag_nocache)) { - if (isset($this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ])) { + if ($this->caching && ($this->nocache || $this->tag_nocache)) { + if (isset($this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ])) { $function = - $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ]; - } elseif (isset($this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ])) { - $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ] = - $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ]; + $this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ]; + } else if (isset($this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ])) { + $this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ] = + $this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ]; $function = - $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ]; + $this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ]; } } else { - if (isset($this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ])) { + if (isset($this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ])) { $function = - $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ]; - } elseif (isset($this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ])) { - $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ] = - $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ]; + $this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ]; + } else if (isset($this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ])) { + $this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ] = + $this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ]; $function = - $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ]; + $this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ]; } } if (isset($function)) { - if ($plugin_type == 'modifier') { + if ($plugin_type === 'modifier') { $this->modifier_plugins[ $plugin_name ] = true; } - return $function; } // loop through plugin dirs and find the plugin $function = 'smarty_' . $plugin_type . '_' . $plugin_name; $file = $this->smarty->loadPlugin($function, false); - if (is_string($file)) { - if ($this->template->caching && ($this->nocache || $this->tag_nocache)) { - $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'file' ] = + if ($this->caching && ($this->nocache || $this->tag_nocache)) { + $this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'file' ] = $file; - $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ] = + $this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ] = $function; } else { - $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'file' ] = + $this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'file' ] = $file; - $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ] = + $this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ] = $function; } - if ($plugin_type == 'modifier') { + if ($plugin_type === 'modifier') { $this->modifier_plugins[ $plugin_name ] = true; } - return $function; } if (is_callable($function)) { // plugin function is defined in the script return $function; } - return false; } @@ -1013,7 +792,8 @@ abstract class Smarty_Internal_TemplateCompilerBase * @param string $tag name of tag * @param string $plugin_type type of plugin * - * @return boolean true if found + * @return bool true if found + * @throws \SmartyCompilerException */ public function getPluginFromDefaultHandler($tag, $plugin_type) { @@ -1021,36 +801,41 @@ abstract class Smarty_Internal_TemplateCompilerBase $script = null; $cacheable = true; $result = call_user_func_array($this->smarty->default_plugin_handler_func, - array($tag, $plugin_type, $this->template, &$callback, &$script, &$cacheable,)); + array($tag, + $plugin_type, + $this->template, + &$callback, + &$script, + &$cacheable,)); if ($result) { $this->tag_nocache = $this->tag_nocache || !$cacheable; if ($script !== null) { if (is_file($script)) { - if ($this->template->caching && ($this->nocache || $this->tag_nocache)) { - $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $tag ][ $plugin_type ][ 'file' ] = + if ($this->caching && ($this->nocache || $this->tag_nocache)) { + $this->required_plugins[ 'nocache' ][ $tag ][ $plugin_type ][ 'file' ] = $script; - $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $tag ][ $plugin_type ][ 'function' ] = + $this->required_plugins[ 'nocache' ][ $tag ][ $plugin_type ][ 'function' ] = $callback; } else { - $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $tag ][ $plugin_type ][ 'file' ] = + $this->required_plugins[ 'compiled' ][ $tag ][ $plugin_type ][ 'file' ] = $script; - $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $tag ][ $plugin_type ][ 'function' ] = + $this->required_plugins[ 'compiled' ][ $tag ][ $plugin_type ][ 'function' ] = $callback; } require_once $script; } else { - $this->trigger_template_error("Default plugin handler: Returned script file \"{$script}\" for \"{$tag}\" not found"); + $this->trigger_template_error("Default plugin handler: Returned script file '{$script}' for '{$tag}' not found"); } } if (is_callable($callback)) { - $this->default_handler_plugins[ $plugin_type ][ $tag ] = array($callback, true, array()); - + $this->default_handler_plugins[ $plugin_type ][ $tag ] = array($callback, + true, + array()); return true; } else { - $this->trigger_template_error("Default plugin handler: Returned callback for \"{$tag}\" not callable"); + $this->trigger_template_error("Default plugin handler: Returned callback for '{$tag}' not callable"); } } - return false; } @@ -1064,9 +849,9 @@ abstract class Smarty_Internal_TemplateCompilerBase */ public function appendCode($left, $right) { - if (preg_match('/\s*\?>\s*$/', $left) && preg_match('/^\s*<\?php\s+/', $right)) { - $left = preg_replace('/\s*\?>\s*$/', "\n", $left); - $left .= preg_replace('/^\s*<\?php\s+/', '', $right); + if (preg_match('/\s*\?>\s?$/D', $left) && preg_match('/^<\?php\s+/', $right)) { + $left = preg_replace('/\s*\?>\s?$/D', "\n", $left); + $left .= preg_replace('/^<\?php\s+/', '', $right); } else { $left .= $right; } @@ -1089,19 +874,18 @@ abstract class Smarty_Internal_TemplateCompilerBase // If the template is not evaluated and we have a nocache section and or a nocache tag if ($is_code && !empty($content)) { // generate replacement code - if ((!($this->template->source->handler->recompiled) || $this->forceNocache) && $this->template->caching && + if ((!($this->template->source->handler->recompiled) || $this->forceNocache) && $this->caching && !$this->suppressNocacheProcessing && ($this->nocache || $this->tag_nocache) ) { $this->template->compiled->has_nocache_code = true; $_output = addcslashes($content, '\'\\'); - $_output = str_replace("^#^", "'", $_output); - $_output = "<?php echo '/*%%SmartyNocache:{$this->nocache_hash}%%*/" . $_output . - "/*/%%SmartyNocache:{$this->nocache_hash}%%*/';?>\n"; + $_output = str_replace('^#^', '\'', $_output); + $_output = "<?php echo '/*%%SmartyNocache:{$this->nocache_hash}%%*/{$_output}/*/%%SmartyNocache:{$this->nocache_hash}%%*/';?>\n"; // make sure we include modifier plugins for nocache code foreach ($this->modifier_plugins as $plugin_name => $dummy) { - if (isset($this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ 'modifier' ])) { - $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ 'modifier' ] = - $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ 'modifier' ]; + if (isset($this->required_plugins[ 'compiled' ][ $plugin_name ][ 'modifier' ])) { + $this->required_plugins[ 'nocache' ][ $plugin_name ][ 'modifier' ] = + $this->required_plugins[ 'compiled' ][ $plugin_name ][ 'modifier' ]; } } } else { @@ -1113,7 +897,6 @@ abstract class Smarty_Internal_TemplateCompilerBase $this->modifier_plugins = array(); $this->suppressNocacheProcessing = false; $this->tag_nocache = false; - return $_output; } @@ -1176,11 +959,11 @@ abstract class Smarty_Internal_TemplateCompilerBase { $_scope = 0; if (isset($_attr[ 'scope' ])) { - $_scopeName = trim($_attr[ 'scope' ], "'\""); + $_scopeName = trim($_attr[ 'scope' ], '\'"'); if (is_numeric($_scopeName) && in_array($_scopeName, $validScopes)) { $_scope = $_scopeName; - } elseif (is_string($_scopeName)) { - $_scopeName = trim($_scopeName, "'\""); + } else if (is_string($_scopeName)) { + $_scopeName = trim($_scopeName, '\'"'); $_scope = isset($validScopes[ $_scopeName ]) ? $validScopes[ $_scopeName ] : false; } else { $_scope = false; @@ -1203,7 +986,7 @@ abstract class Smarty_Internal_TemplateCompilerBase public function makeNocacheCode($code) { return "echo '/*%%SmartyNocache:{$this->nocache_hash}%%*/<?php " . - str_replace("^#^", "'", addcslashes($code, '\'\\')) . + str_replace('^#^', '\'', addcslashes($code, '\'\\')) . "?>/*/%%SmartyNocache:{$this->nocache_hash}%%*/';\n"; } @@ -1225,22 +1008,23 @@ abstract class Smarty_Internal_TemplateCompilerBase if ($tagline === true) { // get line number of Tag $line = $lex->taglineno; - } elseif (!isset($line)) { + } else if (!isset($line)) { // get template source line which has error $line = $lex->line; } else { - $line = (int) $line; + $line = (int)$line; } - - if (in_array($this->template->source->type, array('eval', 'string'))) { - $templateName = $this->template->source->type . ':' . trim(preg_replace('![\t\r\n]+!', ' ', + if (in_array($this->template->source->type, + array('eval', + 'string'))) { + $templateName = $this->template->source->type . ':' . trim(preg_replace('![\t\r\n]+!', + ' ', strlen($lex->data) > 40 ? substr($lex->data, 0, 40) . '...' : $lex->data)); } else { $templateName = $this->template->source->type . ':' . $this->template->source->filepath; } - // $line += $this->trace_line_offset; $match = preg_split("/\n/", $lex->data); $error_text = @@ -1268,6 +1052,11 @@ abstract class Smarty_Internal_TemplateCompilerBase $error_text .= ', expected one of: ' . implode(' , ', $expect); } } + if ($this->smarty->_parserdebug) { + $this->parser->errorRunDown(); + echo ob_get_clean(); + flush(); + } $e = new SmartyCompilerException($error_text); $e->line = $line; $e->source = trim(preg_replace('![\t\r\n]+!', ' ', $match[ $line - 1 ])); @@ -1289,6 +1078,142 @@ abstract class Smarty_Internal_TemplateCompilerBase } /** + * enter double quoted string + * - save tag stack count + */ + public function enterDoubleQuote() + { + array_push($this->_tag_stack_count, $this->getTagStackCount()); + } + + /** + * Return tag stack count + * + * @return int + */ + public function getTagStackCount() + { + return count($this->_tag_stack); + } + + /** + * @param $lexerPreg + * + * @return mixed + */ + public function replaceDelimiter($lexerPreg) + { + return str_replace(array('SMARTYldel', 'SMARTYliteral', 'SMARTYrdel', 'SMARTYautoliteral', 'SMARTYal'), + array($this->ldelPreg, $this->literalPreg, $this->rdelPreg, + $this->smarty->getAutoLiteral() ? '{1,}' : '{9}', + $this->smarty->getAutoLiteral() ? '' : '\\s*'), + $lexerPreg); + } + + /** + * Build lexer regular expressions for left and right delimiter and user defined literals + */ + public function initDelimiterPreg() + { + $ldel = $this->smarty->getLeftDelimiter(); + $this->ldelLength = strlen($ldel); + $this->ldelPreg = ''; + foreach (str_split($ldel, 1) as $chr) { + $this->ldelPreg .= '[' . ($chr === '\\' ? '\\' : '') . $chr . ']'; + } + $rdel = $this->smarty->getRightDelimiter(); + $this->rdelLength = strlen($rdel); + $this->rdelPreg = ''; + foreach (str_split($rdel, 1) as $chr) { + $this->rdelPreg .= '[' . ($chr === '\\' ? '\\' : '') . $chr . ']'; + } + $literals = $this->smarty->getLiterals(); + if (!empty($literals)) { + foreach ($literals as $key => $literal) { + $literalPreg = ''; + foreach (str_split($literal, 1) as $chr) { + $literalPreg .= '[' . ($chr === '\\' ? '\\' : '') . $chr . ']'; + } + $literals[ $key ] = $literalPreg; + } + $this->literalPreg = '|' . implode('|', $literals); + } else { + $this->literalPreg = ''; + } + } + + /** + * leave double quoted string + * - throw exception if block in string was not closed + * + * @throws \SmartyCompilerException + */ + public function leaveDoubleQuote() + { + if (array_pop($this->_tag_stack_count) !== $this->getTagStackCount()) { + $tag = $this->getOpenBlockTag(); + $this->trigger_template_error("unclosed '{{$tag}}' in doubled quoted string", + null, + true); + } + } + + /** + * Get left delimiter preg + * + * @return string + */ + public function getLdelPreg() + { + return $this->ldelPreg; + } + + /** + * Get right delimiter preg + * + * @return string + */ + public function getRdelPreg() + { + return $this->rdelPreg; + } + + /** + * Get length of left delimiter + * + * @return int + */ + public function getLdelLength() + { + return $this->ldelLength; + } + + /** + * Get length of right delimiter + * + * @return int + */ + public function getRdelLength() + { + return $this->rdelLength; + } + + /** + * Get name of current open block tag + * + * @return string|boolean + */ + public function getOpenBlockTag() + { + $tagCount = $this->getTagStackCount(); + if ($tagCount) { + return $this->_tag_stack[ $tagCount - 1 ][ 0 ]; + } else { + return false; + } + } + + /** * Check if $value contains variable elements * * @param mixed $value @@ -1321,7 +1246,7 @@ abstract class Smarty_Internal_TemplateCompilerBase */ public function getNewPrefixVariable() { - self::$prefixVariableNumber ++; + ++self::$prefixVariableNumber; return $this->getPrefixVariable(); } @@ -1362,4 +1287,345 @@ abstract class Smarty_Internal_TemplateCompilerBase return $code; } + /** + * Save current required plugins + * + * @param bool $init if true init required plugins + */ + public function saveRequiredPlugins($init=false) + { + $this->required_plugins_stack[] = $this->required_plugins; + if ($init) { + $this->required_plugins = array('compiled' => array(), 'nocache' => array()); + } + } + + /** + * Restore required plugins + */ + public function restoreRequiredPlugins() + { + $this->required_plugins = array_pop($this->required_plugins_stack); + } + + /** + * Compile code to call Smarty_Internal_Template::_checkPlugins() + * for required plugins + * + * @return string + */ + public function compileRequiredPlugins() + { + $code = $this->compileCheckPlugins($this->required_plugins[ 'compiled' ]); + if ($this->caching && !empty($this->required_plugins[ 'nocache' ])) { + $code .= $this->makeNocacheCode($this->compileCheckPlugins($this->required_plugins[ 'nocache' ])); + } + return $code; + } + + /** + * Compile code to call Smarty_Internal_Template::_checkPlugins + * - checks if plugin is callable require otherwise + * + * @param $requiredPlugins + * + * @return string + */ + public function compileCheckPlugins($requiredPlugins) + { + if (!empty($requiredPlugins)) { + $plugins = array(); + foreach ($requiredPlugins as $plugin) { + foreach ($plugin as $data) { + $plugins[] = $data; + } + } + return '$_smarty_tpl->_checkPlugins(' . $this->getVarExport($plugins) . ');' . "\n"; + } else { + return ''; + } + } + + /** + * method to compile a Smarty template + * + * @param mixed $_content template source + * @param bool $isTemplateSource + * + * @return bool true if compiling succeeded, false if it failed + */ + abstract protected function doCompile($_content, $isTemplateSource = false); + + /** + * Compile Tag + * + * @param string $tag tag name + * @param array $args array with tag attributes + * @param array $parameter array with compilation parameter + * + * @throws SmartyCompilerException + * @throws SmartyException + * @return string compiled code + */ + private function compileTag2($tag, $args, $parameter) + { + $plugin_type = ''; + // $args contains the attributes parsed and compiled by the lexer/parser + // assume that tag does compile into code, but creates no HTML output + $this->has_code = true; + // log tag/attributes + if (isset($this->smarty->_cache[ 'get_used_tags' ])) { + $this->template->_cache[ 'used_tags' ][] = array($tag, + $args); + } + // check nocache option flag + foreach ($args as $arg) { + if (!is_array($arg)) { + if ($arg === "'nocache'" || $arg === 'nocache') { + $this->tag_nocache = true; + } + } else { + foreach ($arg as $k => $v) { + if (($k === "'nocache'" || $k === 'nocache') && (trim($v, "'\" ") === 'true')) { + $this->tag_nocache = true; + } + } + } + } + // compile the smarty tag (required compile classes to compile the tag are auto loaded) + if (($_output = $this->callTagCompiler($tag, $args, $parameter)) === false) { + if (isset($this->parent_compiler->tpl_function[ $tag ]) || + (isset ($this->template->smarty->ext->_tplFunction) && + $this->template->smarty->ext->_tplFunction->getTplFunction($this->template, $tag) !== false) + ) { + // template defined by {template} tag + $args[ '_attr' ][ 'name' ] = "'{$tag}'"; + $_output = $this->callTagCompiler('call', $args, $parameter); + } + } + if ($_output !== false) { + if ($_output !== true) { + // did we get compiled code + if ($this->has_code) { + // return compiled code + return $_output; + } + } + // tag did not produce compiled code + return null; + } else { + // map_named attributes + if (isset($args[ '_attr' ])) { + foreach ($args[ '_attr' ] as $key => $attribute) { + if (is_array($attribute)) { + $args = array_merge($args, $attribute); + } + } + } + // not an internal compiler tag + if (strlen($tag) < 6 || substr($tag, -5) !== 'close') { + // check if tag is a registered object + if (isset($this->smarty->registered_objects[ $tag ]) && isset($parameter[ 'object_method' ])) { + $method = $parameter[ 'object_method' ]; + if (!in_array($method, $this->smarty->registered_objects[ $tag ][ 3 ]) && + (empty($this->smarty->registered_objects[ $tag ][ 1 ]) || + in_array($method, $this->smarty->registered_objects[ $tag ][ 1 ])) + ) { + return $this->callTagCompiler('private_object_function', $args, $parameter, $tag, $method); + } else if (in_array($method, $this->smarty->registered_objects[ $tag ][ 3 ])) { + return $this->callTagCompiler('private_object_block_function', + $args, + $parameter, + $tag, + $method); + } else { + // throw exception + $this->trigger_template_error('not allowed method "' . $method . '" in registered object "' . + $tag . '"', + null, + true); + } + } + // check if tag is registered + foreach (array(Smarty::PLUGIN_COMPILER, + Smarty::PLUGIN_FUNCTION, + Smarty::PLUGIN_BLOCK,) as $plugin_type) { + if (isset($this->smarty->registered_plugins[ $plugin_type ][ $tag ])) { + // if compiler function plugin call it now + if ($plugin_type === Smarty::PLUGIN_COMPILER) { + $new_args = array(); + foreach ($args as $key => $mixed) { + if (is_array($mixed)) { + $new_args = array_merge($new_args, $mixed); + } else { + $new_args[ $key ] = $mixed; + } + } + if (!$this->smarty->registered_plugins[ $plugin_type ][ $tag ][ 1 ]) { + $this->tag_nocache = true; + } + return call_user_func_array($this->smarty->registered_plugins[ $plugin_type ][ $tag ][ 0 ], + array($new_args, + $this)); + } + // compile registered function or block function + if ($plugin_type === Smarty::PLUGIN_FUNCTION || $plugin_type === Smarty::PLUGIN_BLOCK) { + return $this->callTagCompiler('private_registered_' . $plugin_type, + $args, + $parameter, + $tag); + } + } + } + // check plugins from plugins folder + foreach ($this->plugin_search_order as $plugin_type) { + if ($plugin_type === Smarty::PLUGIN_COMPILER && + $this->smarty->loadPlugin('smarty_compiler_' . $tag) && + (!isset($this->smarty->security_policy) || + $this->smarty->security_policy->isTrustedTag($tag, $this)) + ) { + $plugin = 'smarty_compiler_' . $tag; + if (is_callable($plugin)) { + // convert arguments format for old compiler plugins + $new_args = array(); + foreach ($args as $key => $mixed) { + if (is_array($mixed)) { + $new_args = array_merge($new_args, $mixed); + } else { + $new_args[ $key ] = $mixed; + } + } + return $plugin($new_args, $this->smarty); + } + if (class_exists($plugin, false)) { + $plugin_object = new $plugin; + if (method_exists($plugin_object, 'compile')) { + return $plugin_object->compile($args, $this); + } + } + throw new SmartyException("Plugin '{$tag}' not callable"); + } else { + if ($function = $this->getPlugin($tag, $plugin_type)) { + if (!isset($this->smarty->security_policy) || + $this->smarty->security_policy->isTrustedTag($tag, $this) + ) { + return $this->callTagCompiler('private_' . $plugin_type . '_plugin', + $args, + $parameter, + $tag, + $function); + } + } + } + } + if (is_callable($this->smarty->default_plugin_handler_func)) { + $found = false; + // look for already resolved tags + foreach ($this->plugin_search_order as $plugin_type) { + if (isset($this->default_handler_plugins[ $plugin_type ][ $tag ])) { + $found = true; + break; + } + } + if (!$found) { + // call default handler + foreach ($this->plugin_search_order as $plugin_type) { + if ($this->getPluginFromDefaultHandler($tag, $plugin_type)) { + $found = true; + break; + } + } + } + if ($found) { + // if compiler function plugin call it now + if ($plugin_type === Smarty::PLUGIN_COMPILER) { + $new_args = array(); + foreach ($args as $key => $mixed) { + if (is_array($mixed)) { + $new_args = array_merge($new_args, $mixed); + } else { + $new_args[ $key ] = $mixed; + } + } + return call_user_func_array($this->default_handler_plugins[ $plugin_type ][ $tag ][ 0 ], + array($new_args, + $this)); + } else { + return $this->callTagCompiler('private_registered_' . $plugin_type, + $args, + $parameter, + $tag); + } + } + } + } else { + // compile closing tag of block function + $base_tag = substr($tag, 0, -5); + // check if closing tag is a registered object + if (isset($this->smarty->registered_objects[ $base_tag ]) && isset($parameter[ 'object_method' ])) { + $method = $parameter[ 'object_method' ]; + if (in_array($method, $this->smarty->registered_objects[ $base_tag ][ 3 ])) { + return $this->callTagCompiler('private_object_block_function', + $args, + $parameter, + $tag, + $method); + } else { + // throw exception + $this->trigger_template_error('not allowed closing tag method "' . $method . + '" in registered object "' . $base_tag . '"', + null, + true); + } + } + // registered block tag ? + if (isset($this->smarty->registered_plugins[ Smarty::PLUGIN_BLOCK ][ $base_tag ]) || + isset($this->default_handler_plugins[ Smarty::PLUGIN_BLOCK ][ $base_tag ]) + ) { + return $this->callTagCompiler('private_registered_block', $args, $parameter, $tag); + } + // registered function tag ? + if (isset($this->smarty->registered_plugins[ Smarty::PLUGIN_FUNCTION ][ $tag ])) { + return $this->callTagCompiler('private_registered_function', $args, $parameter, $tag); + } + // block plugin? + if ($function = $this->getPlugin($base_tag, Smarty::PLUGIN_BLOCK)) { + return $this->callTagCompiler('private_block_plugin', $args, $parameter, $tag, $function); + } + // function plugin? + if ($function = $this->getPlugin($tag, Smarty::PLUGIN_FUNCTION)) { + if (!isset($this->smarty->security_policy) || + $this->smarty->security_policy->isTrustedTag($tag, $this) + ) { + return $this->callTagCompiler('private_function_plugin', $args, $parameter, $tag, $function); + } + } + // registered compiler plugin ? + if (isset($this->smarty->registered_plugins[ Smarty::PLUGIN_COMPILER ][ $tag ])) { + // if compiler function plugin call it now + $args = array(); + if (!$this->smarty->registered_plugins[ Smarty::PLUGIN_COMPILER ][ $tag ][ 1 ]) { + $this->tag_nocache = true; + } + return call_user_func_array($this->smarty->registered_plugins[ Smarty::PLUGIN_COMPILER ][ $tag ][ 0 ], + array($args, + $this)); + } + if ($this->smarty->loadPlugin('smarty_compiler_' . $tag)) { + $plugin = 'smarty_compiler_' . $tag; + if (is_callable($plugin)) { + return $plugin($args, $this->smarty); + } + if (class_exists($plugin, false)) { + $plugin_object = new $plugin; + if (method_exists($plugin_object, 'compile')) { + return $plugin_object->compile($args, $this); + } + } + throw new SmartyException("Plugin '{$tag}' not callable"); + } + } + $this->trigger_template_error("unknown tag '{$tag}'", null, true); + } + } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatelexer.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatelexer.php index 8e870b75c..3045a7b0c 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatelexer.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatelexer.php @@ -18,231 +18,237 @@ */ class Smarty_Internal_Templatelexer { + const TEXT = 1; + const TAG = 2; + const TAGBODY = 3; + const LITERAL = 4; + const DOUBLEQUOTEDSTRING = 5; /** * Source * * @var string */ public $data; - /** * Source length * * @var int */ public $dataLength = null; - /** * byte counter * * @var int */ public $counter; - /** * token number * * @var int */ public $token; - /** * token value * * @var string */ public $value; - /** * current line * * @var int */ public $line; - /** * tag start line * * @var */ public $taglineno; - /** * php code type * * @var string */ public $phpType = ''; - - /** - * escaped left delimiter - * - * @var string - */ - public $ldel = ''; - - /** - * escaped left delimiter length - * - * @var int - */ - public $ldel_length = 0; - - /** - * escaped right delimiter - * - * @var string - */ - public $rdel = ''; - - /** - * escaped right delimiter length - * - * @var int - */ - public $rdel_length = 0; - /** * state number * * @var int */ public $state = 1; - /** * Smarty object * * @var Smarty */ public $smarty = null; - /** * compiler object * * @var Smarty_Internal_TemplateCompilerBase */ public $compiler = null; - - /** - * literal tag nesting level - * - * @var int - */ - private $literal_cnt = 0; - - /** - * PHP start tag string - * - * @var string - */ - /** * trace file * * @var resource */ public $yyTraceFILE; - /** * trace prompt * * @var string */ public $yyTracePrompt; - /** * XML flag true while processing xml * * @var bool */ public $is_xml = false; - /** * state names * * @var array */ public $state_name = array(1 => 'TEXT', 2 => 'TAG', 3 => 'TAGBODY', 4 => 'LITERAL', 5 => 'DOUBLEQUOTEDSTRING',); - /** - * storage for assembled token patterns + * token names + * + * @var array + */ + public $smarty_token_names = array( // Text for parser error messages + 'NOT' => '(!,not)', + 'OPENP' => '(', + 'CLOSEP' => ')', + 'OPENB' => '[', + 'CLOSEB' => ']', + 'PTR' => '->', + 'APTR' => '=>', + 'EQUAL' => '=', + 'NUMBER' => 'number', + 'UNIMATH' => '+" , "-', + 'MATH' => '*" , "/" , "%', + 'INCDEC' => '++" , "--', + 'SPACE' => ' ', + 'DOLLAR' => '$', + 'SEMICOLON' => ';', + 'COLON' => ':', + 'DOUBLECOLON' => '::', + 'AT' => '@', + 'HATCH' => '#', + 'QUOTE' => '"', + 'BACKTICK' => '`', + 'VERT' => '"|" modifier', + 'DOT' => '.', + 'COMMA' => '","', + 'QMARK' => '"?"', + 'ID' => 'id, name', + 'TEXT' => 'text', + 'LDELSLASH' => '{/..} closing tag', + 'LDEL' => '{...} Smarty tag', + 'COMMENT' => 'comment', + 'AS' => 'as', + 'TO' => 'to', + 'PHP' => '"<?php", "<%", "{php}" tag', + 'LOGOP' => '"<", "==" ... logical operator', + 'TLOGOP' => '"lt", "eq" ... logical operator; "is div by" ... if condition', + 'SCOND' => '"is even" ... if condition', + ); + /** + * literal tag nesting level + * + * @var int + */ + private $literal_cnt = 0; + /** + * preg token pattern for state TEXT * * @var string */ private $yy_global_pattern1 = null; - + /** + * preg token pattern for state TAG + * + * @var string + */ private $yy_global_pattern2 = null; - + /** + * preg token pattern for state TAGBODY + * + * @var string + */ private $yy_global_pattern3 = null; - + /** + * preg token pattern for state LITERAL + * + * @var string + */ private $yy_global_pattern4 = null; - - private $yy_global_pattern5 = null; - /** - * token names + * preg token pattern for state DOUBLEQUOTEDSTRING * - * @var array + * @var null */ - public $smarty_token_names = array( // Text for parser error messages - 'NOT' => '(!,not)', 'OPENP' => '(', 'CLOSEP' => ')', 'OPENB' => '[', - 'CLOSEB' => ']', 'PTR' => '->', 'APTR' => '=>', 'EQUAL' => '=', - 'NUMBER' => 'number', 'UNIMATH' => '+" , "-', 'MATH' => '*" , "/" , "%', - 'INCDEC' => '++" , "--', 'SPACE' => ' ', 'DOLLAR' => '$', - 'SEMICOLON' => ';', 'COLON' => ':', 'DOUBLECOLON' => '::', 'AT' => '@', - 'HATCH' => '#', 'QUOTE' => '"', 'BACKTICK' => '`', - 'VERT' => '"|" modifier', 'DOT' => '.', 'COMMA' => '","', - 'QMARK' => '"?"', 'ID' => 'id, name', 'TEXT' => 'text', - 'LDELSLASH' => '{/..} closing tag', 'LDEL' => '{...} Smarty tag', - 'COMMENT' => 'comment', 'AS' => 'as', 'TO' => 'to', - 'PHP' => '"<?php", "<%", "{php}" tag', - 'LOGOP' => '"<", "==" ... logical operator', - 'TLOGOP' => '"lt", "eq" ... logical operator; "is div by" ... if condition', - 'SCOND' => '"is even" ... if condition',); + private $yy_global_pattern5 = null; + private $_yy_state = 1; + private $_yy_stack = array(); /** * constructor * - * @param string $data template source + * @param string $source template source * @param Smarty_Internal_TemplateCompilerBase $compiler */ - function __construct($data, Smarty_Internal_TemplateCompilerBase $compiler) + function __construct($source, Smarty_Internal_TemplateCompilerBase $compiler) { - $this->data = $data; - $this->dataLength = strlen($data); + $this->data = $source; + $this->dataLength = strlen($this->data); $this->counter = 0; if (preg_match('/^\xEF\xBB\xBF/i', $this->data, $match)) { $this->counter += strlen($match[ 0 ]); } $this->line = 1; - $this->smarty = $compiler->smarty; + $this->smarty = $compiler->template->smarty; $this->compiler = $compiler; - $this->ldel = preg_quote($this->smarty->left_delimiter, '/'); - $this->ldel_length = strlen($this->smarty->left_delimiter); - $this->rdel = preg_quote($this->smarty->right_delimiter, '/'); - $this->rdel_length = strlen($this->smarty->right_delimiter); - $this->smarty_token_names[ 'LDEL' ] = $this->smarty->left_delimiter; - $this->smarty_token_names[ 'RDEL' ] = $this->smarty->right_delimiter; + $this->compiler->initDelimiterPreg(); + $this->smarty_token_names[ 'LDEL' ] = $this->smarty->getLeftDelimiter(); + $this->smarty_token_names[ 'RDEL' ] = $this->smarty->getRightDelimiter(); } + /** + * open lexer/parser trace file + * + */ public function PrintTrace() { $this->yyTraceFILE = fopen('php://output', 'w'); $this->yyTracePrompt = '<br>'; } - /* - * Check if this tag is autoliteral + /** + * replace placeholders with runtime preg code + * + * @param string $preg + * + * @return string */ - public function isAutoLiteral() + public function replace($preg) { - return $this->smarty->auto_literal && isset($this->value[ $this->ldel_length ]) ? - strpos(" \n\t\r", $this->value[ $this->ldel_length ]) !== false : false; + return $this->compiler->replaceDelimiter($preg); } - private $_yy_state = 1; - - private $_yy_stack = array(); + /** + * check if current value is an autoliteral left delimiter + * + * @return bool + */ + public function isAutoLiteral() + { + return $this->smarty->getAutoLiteral() && isset($this->value[ $this->compiler->getLdelLength() ]) ? + strpos(" \n\t\r", $this->value[ $this->compiler->getLdelLength() ]) !== false : false; + } // end function public function yylex() { @@ -252,14 +258,18 @@ class Smarty_Internal_Templatelexer public function yypushstate($state) { if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%sState push %s\n", $this->yyTracePrompt, + fprintf($this->yyTraceFILE, + "%sState push %s\n", + $this->yyTracePrompt, isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state); } array_push($this->_yy_stack, $this->_yy_state); $this->_yy_state = $state; if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%snew State %s\n", $this->yyTracePrompt, + fprintf($this->yyTraceFILE, + "%snew State %s\n", + $this->yyTracePrompt, isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state); } @@ -268,13 +278,17 @@ class Smarty_Internal_Templatelexer public function yypopstate() { if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%sState pop %s\n", $this->yyTracePrompt, + fprintf($this->yyTraceFILE, + "%sState pop %s\n", + $this->yyTracePrompt, isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state); } $this->_yy_state = array_pop($this->_yy_stack); if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%snew State %s\n", $this->yyTracePrompt, + fprintf($this->yyTraceFILE, + "%snew State %s\n", + $this->yyTracePrompt, isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state); } @@ -284,20 +298,19 @@ class Smarty_Internal_Templatelexer { $this->_yy_state = $state; if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%sState set %s\n", $this->yyTracePrompt, + fprintf($this->yyTraceFILE, + "%sState set %s\n", + $this->yyTracePrompt, isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state); } } - public function yylex1() +public function yylex1() { if (!isset($this->yy_global_pattern1)) { $this->yy_global_pattern1 = - "/\G([{][}])|\G(" . $this->ldel . "[*])|\G((" . $this->ldel . "\\s*php([ ].*?)?" . $this->rdel . ")|(" . - $this->ldel . "\\s*[\/]php" . $this->rdel . "))|\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . - ")|\G(" . $this->ldel . "\\s*)|\G(\\s*" . $this->rdel . - ")|\G((<[?]((php\\s+|=)|\\s+))|(<[%])|(<[?]xml\\s+)|(<script\\s+language\\s*=\\s*[\"']?\\s*php\\s*[\"']?\\s*>)|([?][>])|([%][>]))|\G([\S\s])/isS"; + $this->replace("/\G([{][}])|\G((SMARTYldel)SMARTYal[*])|\G((SMARTYldel)SMARTYalphp([ ].*?)?SMARTYrdel|(SMARTYldel)SMARTYal[\/]phpSMARTYrdel)|\G((SMARTYldel)SMARTYautoliteral\\s+SMARTYliteral)|\G((SMARTYldel)SMARTYalliteral\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/]literal\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal)|\G([<][?]((php\\s+|=)|\\s+)|[<][%]|[<][?]xml\\s+|[<]script\\s+language\\s*=\\s*[\"']?\\s*php\\s*[\"']?\\s*[>]|[?][>]|[%][>])|\G((.*?)(?=((SMARTYldel)SMARTYal|[<][?]((php\\s+|=)|\\s+)|[<][%]|[<][?]xml\\s+|[<]script\\s+language\\s*=\\s*[\"']?\\s*php\\s*[\"']?\\s*[>]|[?][>]|[%][>]SMARTYliteral))|[\s\S]+)/isS"); } if (!isset($this->dataLength)) { $this->dataLength = strlen($this->data); @@ -305,17 +318,18 @@ class Smarty_Internal_Templatelexer if ($this->counter >= $this->dataLength) { return false; // end of input } - do { - if (preg_match($this->yy_global_pattern1, $this->data, $yymatches, null, $this->counter)) { + if (preg_match($this->yy_global_pattern1, $this->data, $yymatches, 0, $this->counter)) { if (!isset($yymatches[ 0 ][ 1 ])) { $yymatches = preg_grep("/(.|\s)+/", $yymatches); } else { $yymatches = array_filter($yymatches); } if (empty($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . - substr($this->data, $this->counter, 5) . '... state TEXT'); + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr($this->data, + $this->counter, + 5) . '... state TEXT'); } next($yymatches); // skip global match $this->token = key($yymatches); // token number @@ -326,11 +340,11 @@ class Smarty_Internal_Templatelexer $this->line += substr_count($this->value, "\n"); // accept this token return true; - } elseif ($r === true) { + } else if ($r === true) { // we have changed state // process this token in the new state return $this->yylex(); - } elseif ($r === false) { + } else if ($r === false) { $this->counter += strlen($this->value); $this->line += substr_count($this->value, "\n"); if ($this->counter >= $this->dataLength) { @@ -340,101 +354,77 @@ class Smarty_Internal_Templatelexer continue; } } else { - throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]); + throw new Exception('Unexpected input at line' . $this->line . + ': ' . $this->data[ $this->counter ]); } break; - } - while (true); - } // end function - - const TEXT = 1; + } while (true); + } function yy_r1_1() { - $this->token = Smarty_Internal_Templateparser::TP_TEXT; } function yy_r1_2() { - - preg_match("/[*]{$this->rdel}/", $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter); + preg_match("/[*]{$this->compiler->getRdelPreg()}[\n]?/", + $this->data, + $match, + PREG_OFFSET_CAPTURE, + $this->counter); if (isset($match[ 0 ][ 1 ])) { $to = $match[ 0 ][ 1 ] + strlen($match[ 0 ][ 0 ]); } else { - $this->compiler->trigger_template_error("missing or misspelled comment closing tag '*{$this->smarty->right_delimiter}'"); + $this->compiler->trigger_template_error("missing or misspelled comment closing tag '{$this->smarty->getRightDelimiter()}'"); } $this->value = substr($this->data, $this->counter, $to - $this->counter); return false; } - function yy_r1_3() + function yy_r1_4() { - $this->compiler->getTagCompiler('private_php')->parsePhp($this); } - function yy_r1_7() + function yy_r1_8() { - - if ($this->smarty->auto_literal && isset($this->value[ $this->ldel_length ]) ? - strpos(" \n\t\r", $this->value[ $this->ldel_length ]) !== false : false - ) { - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } else { - $this->token = Smarty_Internal_Templateparser::TP_LITERALSTART; - $this->yypushstate(self::LITERAL); - } + $this->token = Smarty_Internal_Templateparser::TP_TEXT; } - function yy_r1_8() + function yy_r1_10() { - - if ($this->smarty->auto_literal && isset($this->value[ $this->ldel_length ]) ? - strpos(" \n\t\r", $this->value[ $this->ldel_length ]) !== false : false - ) { - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } else { - $this->yypushstate(self::TAG); - return true; - } + $this->token = Smarty_Internal_Templateparser::TP_LITERALSTART; + $this->yypushstate(self::LITERAL); } - function yy_r1_9() + function yy_r1_12() { + $this->token = Smarty_Internal_Templateparser::TP_LITERALEND; + $this->yypushstate(self::LITERAL); + } // end function - $this->token = Smarty_Internal_Templateparser::TP_TEXT; + function yy_r1_14() + { + $this->yypushstate(self::TAG); + return true; } - function yy_r1_10() + function yy_r1_16() { - $this->compiler->getTagCompiler('private_php')->parsePhp($this); } function yy_r1_19() { - - $to = $this->dataLength; - preg_match("/($this->ldel)|(<[?]((php\s+|=)|\s+))|(<[%])|(<[?]xml\s+)|(<script\s+language\s*=\s*[\"']?\s*php\s*[\"']?\s*>)|([?][>])|([%][>])/i", - $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter); - if (isset($match[ 0 ][ 1 ])) { - $to = $match[ 0 ][ 1 ]; - } - $this->value = substr($this->data, $this->counter, $to - $this->counter); $this->token = Smarty_Internal_Templateparser::TP_TEXT; } - public function yylex2() +public function yylex2() { if (!isset($this->yy_global_pattern2)) { $this->yy_global_pattern2 = - "/\G(" . $this->ldel . "\\s*(if|elseif|else if|while)\\s+)|\G(" . $this->ldel . "\\s*for\\s+)|\G(" . - $this->ldel . "\\s*foreach(?![^\s]))|\G(" . $this->ldel . "\\s*setfilter\\s+)|\G(" . $this->ldel . - "\\s*make_nocache\\s+)|\G(" . $this->ldel . "\\s*[0-9]*[a-zA-Z_]\\w*(\\s+nocache)?\\s*" . $this->rdel . - ")|\G(" . $this->ldel . "\\s*[\/](?:(?!block)[0-9]*[a-zA-Z_]\\w*)\\s*" . $this->rdel . ")|\G(" . - $this->ldel . "\\s*[$][0-9]*[a-zA-Z_]\\w*(\\s+nocache)?\\s*" . $this->rdel . ")|\G(" . $this->ldel . - "\\s*[\/])|\G(" . $this->ldel . "\\s*)/isS"; + $this->replace("/\G((SMARTYldel)SMARTYal(if|elseif|else if|while)\\s+)|\G((SMARTYldel)SMARTYalfor\\s+)|\G((SMARTYldel)SMARTYalforeach(?![^\s]))|\G((SMARTYldel)SMARTYalsetfilter\\s+)|\G((SMARTYldel)SMARTYalmake_nocache\\s+)|\G((SMARTYldel)SMARTYal[0-9]*[a-zA-Z_]\\w*(\\s+nocache)?\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[$]smarty\\.block\\.(child|parent)\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/][0-9]*[a-zA-Z_]\\w*\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[$][0-9]*[a-zA-Z_]\\w*(\\s+nocache)?\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/])|\G((SMARTYldel)SMARTYal)/isS"); } if (!isset($this->dataLength)) { $this->dataLength = strlen($this->data); @@ -442,17 +432,18 @@ class Smarty_Internal_Templatelexer if ($this->counter >= $this->dataLength) { return false; // end of input } - do { - if (preg_match($this->yy_global_pattern2, $this->data, $yymatches, null, $this->counter)) { + if (preg_match($this->yy_global_pattern2, $this->data, $yymatches, 0, $this->counter)) { if (!isset($yymatches[ 0 ][ 1 ])) { $yymatches = preg_grep("/(.|\s)+/", $yymatches); } else { $yymatches = array_filter($yymatches); } if (empty($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . - substr($this->data, $this->counter, 5) . '... state TAG'); + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr($this->data, + $this->counter, + 5) . '... state TAG'); } next($yymatches); // skip global match $this->token = key($yymatches); // token number @@ -463,11 +454,11 @@ class Smarty_Internal_Templatelexer $this->line += substr_count($this->value, "\n"); // accept this token return true; - } elseif ($r === true) { + } else if ($r === true) { // we have changed state // process this token in the new state return $this->yylex(); - } elseif ($r === false) { + } else if ($r === false) { $this->counter += strlen($this->value); $this->line += substr_count($this->value, "\n"); if ($this->counter >= $this->dataLength) { @@ -477,107 +468,102 @@ class Smarty_Internal_Templatelexer continue; } } else { - throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]); + throw new Exception('Unexpected input at line' . $this->line . + ': ' . $this->data[ $this->counter ]); } break; - } - while (true); - } // end function - - const TAG = 2; + } while (true); + } function yy_r2_1() { - $this->token = Smarty_Internal_Templateparser::TP_LDELIF; $this->yybegin(self::TAGBODY); $this->taglineno = $this->line; } - function yy_r2_3() + function yy_r2_4() { - $this->token = Smarty_Internal_Templateparser::TP_LDELFOR; $this->yybegin(self::TAGBODY); $this->taglineno = $this->line; } - function yy_r2_4() + function yy_r2_6() { - $this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH; $this->yybegin(self::TAGBODY); $this->taglineno = $this->line; } - function yy_r2_5() + function yy_r2_8() { - $this->token = Smarty_Internal_Templateparser::TP_LDELSETFILTER; $this->yybegin(self::TAGBODY); $this->taglineno = $this->line; } - function yy_r2_6() + function yy_r2_10() { - $this->token = Smarty_Internal_Templateparser::TP_LDELMAKENOCACHE; $this->yybegin(self::TAGBODY); $this->taglineno = $this->line; } - function yy_r2_7() + function yy_r2_12() { - $this->yypopstate(); $this->token = Smarty_Internal_Templateparser::TP_SIMPLETAG; $this->taglineno = $this->line; } - function yy_r2_9() + function yy_r2_15() { + $this->yypopstate(); + $this->token = Smarty_Internal_Templateparser::TP_SMARTYBLOCKCHILDPARENT; + $this->taglineno = $this->line; + } + function yy_r2_18() + { $this->yypopstate(); $this->token = Smarty_Internal_Templateparser::TP_CLOSETAG; $this->taglineno = $this->line; } - function yy_r2_10() + function yy_r2_20() { - - if ($this->_yy_stack[ count($this->_yy_stack) - 1 ] == self::TEXT) { + if ($this->_yy_stack[ count($this->_yy_stack) - 1 ] === self::TEXT) { $this->yypopstate(); $this->token = Smarty_Internal_Templateparser::TP_SIMPELOUTPUT; $this->taglineno = $this->line; } else { - $this->value = $this->smarty->left_delimiter; + $this->value = $this->smarty->getLeftDelimiter(); $this->token = Smarty_Internal_Templateparser::TP_LDEL; $this->yybegin(self::TAGBODY); $this->taglineno = $this->line; } - } + } // end function - function yy_r2_12() + function yy_r2_23() { - $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH; $this->yybegin(self::TAGBODY); $this->taglineno = $this->line; } - function yy_r2_13() + function yy_r2_25() { - $this->token = Smarty_Internal_Templateparser::TP_LDEL; $this->yybegin(self::TAGBODY); $this->taglineno = $this->line; } - public function yylex3() +public function yylex3() { if (!isset($this->yy_global_pattern3)) { - $this->yy_global_pattern3 = "/\G(\\s*" . $this->rdel . ")|\G(" . $this->ldel . - "\\s*)|\G([\"])|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|\G([$]smarty\\.block\\.(child|parent))|\G([$][0-9]*[a-zA-Z_]\\w*)|\G([$])|\G(\\s+is\\s+in\\s+)|\G(\\s+as\\s+)|\G(\\s+to\\s+)|\G(\\s+step\\s+)|\G(\\s+instanceof\\s+)|\G(\\s*(([!=][=]{1,2})|([<][=>]?)|([>][=]?)|[&|]{2})\\s*)|\G(\\s+(eq|ne|neq|gt|ge|gte|lt|le|lte|mod|and|or|xor)\\s+)|\G(\\s+(is\\s+(not\\s+)?(odd|even|div)\\s+by)\\s+)|\G(\\s+is\\s+(not\\s+)?(odd|even))|\G(([!]\\s*)|(not\\s+))|\G([(](int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)[)]\\s*)|\G(\\s*[(]\\s*)|\G(\\s*[)])|\G(\\[\\s*)|\G(\\s*\\])|\G(\\s*[-][>]\\s*)|\G(\\s*[=][>]\\s*)|\G(\\s*[=]\\s*)|\G(([+]|[-]){2})|\G(\\s*([+]|[-])\\s*)|\G(\\s*([*]{1,2}|[%\/^&]|[<>]{2})\\s*)|\G([@])|\G([#])|\G(\\s+[0-9]*[a-zA-Z_][a-zA-Z0-9_\-:]*\\s*[=]\\s*)|\G(([0-9]*[a-zA-Z_]\\w*)?(\\\\[0-9]*[a-zA-Z_]\\w*)+)|\G([0-9]*[a-zA-Z_]\\w*)|\G(\\d+)|\G([`])|\G([|])|\G([.])|\G(\\s*[,]\\s*)|\G(\\s*[;]\\s*)|\G([:]{2})|\G(\\s*[:]\\s*)|\G(\\s*[?]\\s*)|\G(0[xX][0-9a-fA-F]+)|\G(\\s+)|\G([\S\s])/isS"; + $this->yy_global_pattern3 = + $this->replace("/\G(\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal)|\G([\"])|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|\G([$][0-9]*[a-zA-Z_]\\w*)|\G([$])|\G(\\s+is\\s+in\\s+)|\G(\\s+as\\s+)|\G(\\s+to\\s+)|\G(\\s+step\\s+)|\G(\\s+instanceof\\s+)|\G(\\s*([!=][=]{1,2}|[<][=>]?|[>][=]?|[&|]{2})\\s*)|\G(\\s+(eq|ne|neq|gt|ge|gte|lt|le|lte|mod|and|or|xor)\\s+)|\G(\\s+is\\s+(not\\s+)?(odd|even|div)\\s+by\\s+)|\G(\\s+is\\s+(not\\s+)?(odd|even))|\G([!]\\s*|not\\s+)|\G([(](int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)[)]\\s*)|\G(\\s*[(]\\s*)|\G(\\s*[)])|\G(\\[\\s*)|\G(\\s*\\])|\G(\\s*[-][>]\\s*)|\G(\\s*[=][>]\\s*)|\G(\\s*[=]\\s*)|\G(([+]|[-]){2})|\G(\\s*([+]|[-])\\s*)|\G(\\s*([*]{1,2}|[%\/^&]|[<>]{2})\\s*)|\G([@])|\G([#])|\G(\\s+[0-9]*[a-zA-Z_][a-zA-Z0-9_\-:]*\\s*[=]\\s*)|\G(([0-9]*[a-zA-Z_]\\w*)?(\\\\[0-9]*[a-zA-Z_]\\w*)+)|\G([0-9]*[a-zA-Z_]\\w*)|\G(\\d+)|\G([`])|\G([|][@]?)|\G([.])|\G(\\s*[,]\\s*)|\G(\\s*[;]\\s*)|\G([:]{2})|\G(\\s*[:]\\s*)|\G(\\s*[?]\\s*)|\G(0[xX][0-9a-fA-F]+)|\G(\\s+)|\G([\S\s])/isS"); } if (!isset($this->dataLength)) { $this->dataLength = strlen($this->data); @@ -585,17 +571,18 @@ class Smarty_Internal_Templatelexer if ($this->counter >= $this->dataLength) { return false; // end of input } - do { - if (preg_match($this->yy_global_pattern3, $this->data, $yymatches, null, $this->counter)) { + if (preg_match($this->yy_global_pattern3, $this->data, $yymatches, 0, $this->counter)) { if (!isset($yymatches[ 0 ][ 1 ])) { $yymatches = preg_grep("/(.|\s)+/", $yymatches); } else { $yymatches = array_filter($yymatches); } if (empty($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . - substr($this->data, $this->counter, 5) . '... state TAGBODY'); + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr($this->data, + $this->counter, + 5) . '... state TAGBODY'); } next($yymatches); // skip global match $this->token = key($yymatches); // token number @@ -606,11 +593,11 @@ class Smarty_Internal_Templatelexer $this->line += substr_count($this->value, "\n"); // accept this token return true; - } elseif ($r === true) { + } else if ($r === true) { // we have changed state // process this token in the new state return $this->yylex(); - } elseif ($r === false) { + } else if ($r === false) { $this->counter += strlen($this->value); $this->line += substr_count($this->value, "\n"); if ($this->counter >= $this->dataLength) { @@ -620,213 +607,168 @@ class Smarty_Internal_Templatelexer continue; } } else { - throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]); + throw new Exception('Unexpected input at line' . $this->line . + ': ' . $this->data[ $this->counter ]); } break; - } - while (true); - } // end function - - const TAGBODY = 3; + } while (true); + } function yy_r3_1() { - $this->token = Smarty_Internal_Templateparser::TP_RDEL; $this->yypopstate(); } function yy_r3_2() { - - if ($this->smarty->auto_literal && isset($this->value[ $this->ldel_length ]) ? - strpos(" \n\t\r", $this->value[ $this->ldel_length ]) !== false : false - ) { - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } else { - $this->yypushstate(self::TAG); - return true; - } + $this->yypushstate(self::TAG); + return true; } - function yy_r3_3() + function yy_r3_4() { - $this->token = Smarty_Internal_Templateparser::TP_QUOTE; $this->yypushstate(self::DOUBLEQUOTEDSTRING); - } - - function yy_r3_4() - { - - $this->token = Smarty_Internal_Templateparser::TP_SINGLEQUOTESTRING; + $this->compiler->enterDoubleQuote(); } function yy_r3_5() { - - $this->token = Smarty_Internal_Templateparser::TP_SMARTYBLOCKCHILDPARENT; - $this->taglineno = $this->line; + $this->token = Smarty_Internal_Templateparser::TP_SINGLEQUOTESTRING; } - function yy_r3_7() + function yy_r3_6() { - $this->token = Smarty_Internal_Templateparser::TP_DOLLARID; } - function yy_r3_8() + function yy_r3_7() { - $this->token = Smarty_Internal_Templateparser::TP_DOLLAR; } - function yy_r3_9() + function yy_r3_8() { - $this->token = Smarty_Internal_Templateparser::TP_ISIN; } - function yy_r3_10() + function yy_r3_9() { - $this->token = Smarty_Internal_Templateparser::TP_AS; } - function yy_r3_11() + function yy_r3_10() { - $this->token = Smarty_Internal_Templateparser::TP_TO; } - function yy_r3_12() + function yy_r3_11() { - $this->token = Smarty_Internal_Templateparser::TP_STEP; } - function yy_r3_13() + function yy_r3_12() { - $this->token = Smarty_Internal_Templateparser::TP_INSTANCEOF; } - function yy_r3_14() + function yy_r3_13() { - $this->token = Smarty_Internal_Templateparser::TP_LOGOP; } - function yy_r3_19() + function yy_r3_15() { - $this->token = Smarty_Internal_Templateparser::TP_SLOGOP; } - function yy_r3_21() + function yy_r3_17() { - $this->token = Smarty_Internal_Templateparser::TP_TLOGOP; } - function yy_r3_25() + function yy_r3_20() { - $this->token = Smarty_Internal_Templateparser::TP_SINGLECOND; } - function yy_r3_28() + function yy_r3_23() { - $this->token = Smarty_Internal_Templateparser::TP_NOT; } - function yy_r3_31() + function yy_r3_24() { - $this->token = Smarty_Internal_Templateparser::TP_TYPECAST; } - function yy_r3_35() + function yy_r3_28() { - $this->token = Smarty_Internal_Templateparser::TP_OPENP; } - function yy_r3_36() + function yy_r3_29() { - $this->token = Smarty_Internal_Templateparser::TP_CLOSEP; } - function yy_r3_37() + function yy_r3_30() { - $this->token = Smarty_Internal_Templateparser::TP_OPENB; } - function yy_r3_38() + function yy_r3_31() { - $this->token = Smarty_Internal_Templateparser::TP_CLOSEB; } - function yy_r3_39() + function yy_r3_32() { - $this->token = Smarty_Internal_Templateparser::TP_PTR; } - function yy_r3_40() + function yy_r3_33() { - $this->token = Smarty_Internal_Templateparser::TP_APTR; } - function yy_r3_41() + function yy_r3_34() { - $this->token = Smarty_Internal_Templateparser::TP_EQUAL; } - function yy_r3_42() + function yy_r3_35() { - $this->token = Smarty_Internal_Templateparser::TP_INCDEC; } - function yy_r3_44() + function yy_r3_37() { - $this->token = Smarty_Internal_Templateparser::TP_UNIMATH; } - function yy_r3_46() + function yy_r3_39() { - $this->token = Smarty_Internal_Templateparser::TP_MATH; } - function yy_r3_48() + function yy_r3_41() { - $this->token = Smarty_Internal_Templateparser::TP_AT; } - function yy_r3_49() + function yy_r3_42() { - $this->token = Smarty_Internal_Templateparser::TP_HATCH; } - function yy_r3_50() + function yy_r3_43() { - // resolve conflicts with shorttag and right_delimiter starting with '=' - if (substr($this->data, $this->counter + strlen($this->value) - 1, $this->rdel_length) == - $this->smarty->right_delimiter - ) { - preg_match("/\s+/", $this->value, $match); + if (substr($this->data, $this->counter + strlen($this->value) - 1, $this->compiler->getRdelLength()) === + $this->smarty->getRightDelimiter()) { + preg_match('/\s+/', $this->value, $match); $this->value = $match[ 0 ]; $this->token = Smarty_Internal_Templateparser::TP_SPACE; } else { @@ -834,97 +776,82 @@ class Smarty_Internal_Templatelexer } } - function yy_r3_51() + function yy_r3_44() { - $this->token = Smarty_Internal_Templateparser::TP_NAMESPACE; } - function yy_r3_54() + function yy_r3_47() { - $this->token = Smarty_Internal_Templateparser::TP_ID; } - function yy_r3_55() + function yy_r3_48() { - $this->token = Smarty_Internal_Templateparser::TP_INTEGER; } - function yy_r3_56() + function yy_r3_49() { - $this->token = Smarty_Internal_Templateparser::TP_BACKTICK; $this->yypopstate(); } - function yy_r3_57() + function yy_r3_50() { - $this->token = Smarty_Internal_Templateparser::TP_VERT; } - function yy_r3_58() + function yy_r3_51() { - $this->token = Smarty_Internal_Templateparser::TP_DOT; } - function yy_r3_59() + function yy_r3_52() { - $this->token = Smarty_Internal_Templateparser::TP_COMMA; } - function yy_r3_60() + function yy_r3_53() { - $this->token = Smarty_Internal_Templateparser::TP_SEMICOLON; } - function yy_r3_61() + function yy_r3_54() { - $this->token = Smarty_Internal_Templateparser::TP_DOUBLECOLON; } - function yy_r3_62() + function yy_r3_55() { - $this->token = Smarty_Internal_Templateparser::TP_COLON; } - function yy_r3_63() + function yy_r3_56() { - $this->token = Smarty_Internal_Templateparser::TP_QMARK; } - function yy_r3_64() + function yy_r3_57() { - $this->token = Smarty_Internal_Templateparser::TP_HEX; } - function yy_r3_65() + function yy_r3_58() { - $this->token = Smarty_Internal_Templateparser::TP_SPACE; - } + } // end function - function yy_r3_66() + function yy_r3_59() { - $this->token = Smarty_Internal_Templateparser::TP_TEXT; } - public function yylex4() +public function yylex4() { if (!isset($this->yy_global_pattern4)) { $this->yy_global_pattern4 = - "/\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/]literal\\s*" . - $this->rdel . ")|\G([\S\s])/isS"; + $this->replace("/\G((SMARTYldel)SMARTYalliteral\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/]literal\\s*SMARTYrdel)|\G((.*?)(?=(SMARTYldel)SMARTYal[\/]?literalSMARTYrdel))/isS"); } if (!isset($this->dataLength)) { $this->dataLength = strlen($this->data); @@ -932,17 +859,18 @@ class Smarty_Internal_Templatelexer if ($this->counter >= $this->dataLength) { return false; // end of input } - do { - if (preg_match($this->yy_global_pattern4, $this->data, $yymatches, null, $this->counter)) { + if (preg_match($this->yy_global_pattern4, $this->data, $yymatches, 0, $this->counter)) { if (!isset($yymatches[ 0 ][ 1 ])) { $yymatches = preg_grep("/(.|\s)+/", $yymatches); } else { $yymatches = array_filter($yymatches); } if (empty($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . - substr($this->data, $this->counter, 5) . '... state LITERAL'); + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr($this->data, + $this->counter, + 5) . '... state LITERAL'); } next($yymatches); // skip global match $this->token = key($yymatches); // token number @@ -953,11 +881,11 @@ class Smarty_Internal_Templatelexer $this->line += substr_count($this->value, "\n"); // accept this token return true; - } elseif ($r === true) { + } else if ($r === true) { // we have changed state // process this token in the new state return $this->yylex(); - } elseif ($r === false) { + } else if ($r === false) { $this->counter += strlen($this->value); $this->line += substr_count($this->value, "\n"); if ($this->counter >= $this->dataLength) { @@ -967,27 +895,23 @@ class Smarty_Internal_Templatelexer continue; } } else { - throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]); + throw new Exception('Unexpected input at line' . $this->line . + ': ' . $this->data[ $this->counter ]); } break; - } - while (true); - } // end function - - const LITERAL = 4; + } while (true); + } function yy_r4_1() { - - $this->literal_cnt ++; + $this->literal_cnt++; $this->token = Smarty_Internal_Templateparser::TP_LITERAL; } - function yy_r4_2() + function yy_r4_3() { - if ($this->literal_cnt) { - $this->literal_cnt --; + $this->literal_cnt--; $this->token = Smarty_Internal_Templateparser::TP_LITERAL; } else { $this->token = Smarty_Internal_Templateparser::TP_LITERALEND; @@ -995,30 +919,16 @@ class Smarty_Internal_Templatelexer } } - function yy_r4_3() + function yy_r4_5() { - - $to = $this->dataLength; - preg_match("/{$this->ldel}[\/]?literal{$this->rdel}/i", $this->data, $match, PREG_OFFSET_CAPTURE, - $this->counter); - if (isset($match[ 0 ][ 1 ])) { - $to = $match[ 0 ][ 1 ]; - } else { - $this->compiler->trigger_template_error("missing or misspelled literal closing tag"); - } - $this->value = substr($this->data, $this->counter, $to - $this->counter); $this->token = Smarty_Internal_Templateparser::TP_LITERAL; - } + } // end function - public function yylex5() +public function yylex5() { if (!isset($this->yy_global_pattern5)) { $this->yy_global_pattern5 = - "/\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/]literal\\s*" . - $this->rdel . ")|\G(" . $this->ldel . "\\s*[\/])|\G(" . $this->ldel . "\\s*[0-9]*[a-zA-Z_]\\w*)|\G(" . - $this->ldel . - "\\s*)|\G([\"])|\G([`][$])|\G([$][0-9]*[a-zA-Z_]\\w*)|\G([$])|\G(([^\"\\\\]*?)((?:\\\\.[^\"\\\\]*?)*?)(?=(" . - $this->ldel . "|\\$|`\\$|\")))|\G([\S\s])/isS"; + $this->replace("/\G((SMARTYldel)SMARTYautoliteral\\s+SMARTYliteral)|\G((SMARTYldel)SMARTYalliteral\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/]literal\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/])|\G((SMARTYldel)SMARTYal[0-9]*[a-zA-Z_]\\w*)|\G((SMARTYldel)SMARTYal)|\G([\"])|\G([`][$])|\G([$][0-9]*[a-zA-Z_]\\w*)|\G([$])|\G(([^\"\\\\]*?)((?:\\\\.[^\"\\\\]*?)*?)(?=((SMARTYldel)SMARTYal|\\$|`\\$|\"SMARTYliteral)))/isS"); } if (!isset($this->dataLength)) { $this->dataLength = strlen($this->data); @@ -1026,17 +936,18 @@ class Smarty_Internal_Templatelexer if ($this->counter >= $this->dataLength) { return false; // end of input } - do { - if (preg_match($this->yy_global_pattern5, $this->data, $yymatches, null, $this->counter)) { + if (preg_match($this->yy_global_pattern5, $this->data, $yymatches, 0, $this->counter)) { if (!isset($yymatches[ 0 ][ 1 ])) { $yymatches = preg_grep("/(.|\s)+/", $yymatches); } else { $yymatches = array_filter($yymatches); } if (empty($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . ' an empty string. Input "' . - substr($this->data, $this->counter, 5) . '... state DOUBLEQUOTEDSTRING'); + throw new Exception('Error: lexing failed because a rule matched' . + ' an empty string. Input "' . substr($this->data, + $this->counter, + 5) . '... state DOUBLEQUOTEDSTRING'); } next($yymatches); // skip global match $this->token = key($yymatches); // token number @@ -1047,11 +958,11 @@ class Smarty_Internal_Templatelexer $this->line += substr_count($this->value, "\n"); // accept this token return true; - } elseif ($r === true) { + } else if ($r === true) { // we have changed state // process this token in the new state return $this->yylex(); - } elseif ($r === false) { + } else if ($r === false) { $this->counter += strlen($this->value); $this->line += substr_count($this->value, "\n"); if ($this->counter >= $this->dataLength) { @@ -1061,109 +972,75 @@ class Smarty_Internal_Templatelexer continue; } } else { - throw new Exception('Unexpected input at line' . $this->line . ': ' . $this->data[ $this->counter ]); + throw new Exception('Unexpected input at line' . $this->line . + ': ' . $this->data[ $this->counter ]); } break; - } - while (true); - } // end function - - const DOUBLEQUOTEDSTRING = 5; + } while (true); + } function yy_r5_1() { - $this->token = Smarty_Internal_Templateparser::TP_TEXT; } - function yy_r5_2() + function yy_r5_3() { - $this->token = Smarty_Internal_Templateparser::TP_TEXT; } - function yy_r5_3() + function yy_r5_5() { - - if ($this->smarty->auto_literal && isset($this->value[ $this->ldel_length ]) ? - strpos(" \n\t\r", $this->value[ $this->ldel_length ]) !== false : false - ) { - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } else { - $this->yypushstate(self::TAG); - return true; - } + $this->token = Smarty_Internal_Templateparser::TP_TEXT; } - function yy_r5_4() + function yy_r5_7() { - - if ($this->smarty->auto_literal && isset($this->value[ $this->ldel_length ]) ? - strpos(" \n\t\r", $this->value[ $this->ldel_length ]) !== false : false - ) { - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } else { - $this->yypushstate(self::TAG); - return true; - } + $this->yypushstate(self::TAG); + return true; } - function yy_r5_5() + function yy_r5_9() { - - if ($this->smarty->auto_literal && isset($this->value[ $this->ldel_length ]) ? - strpos(" \n\t\r", $this->value[ $this->ldel_length ]) !== false : false - ) { - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } else { - $this->token = Smarty_Internal_Templateparser::TP_LDEL; - $this->taglineno = $this->line; - $this->yypushstate(self::TAGBODY); - } + $this->yypushstate(self::TAG); + return true; } - function yy_r5_6() + function yy_r5_11() { + $this->token = Smarty_Internal_Templateparser::TP_LDEL; + $this->taglineno = $this->line; + $this->yypushstate(self::TAGBODY); + } + function yy_r5_13() + { $this->token = Smarty_Internal_Templateparser::TP_QUOTE; $this->yypopstate(); } - function yy_r5_7() + function yy_r5_14() { - $this->token = Smarty_Internal_Templateparser::TP_BACKTICK; - $this->value = substr($this->value, 0, - 1); + $this->value = substr($this->value, 0, -1); $this->yypushstate(self::TAGBODY); $this->taglineno = $this->line; } - function yy_r5_8() + function yy_r5_15() { - $this->token = Smarty_Internal_Templateparser::TP_DOLLARID; } - function yy_r5_9() + function yy_r5_16() { - - $this->token = Smarty_Internal_Templateparser::TP_TEXT; - } - - function yy_r5_10() - { - $this->token = Smarty_Internal_Templateparser::TP_TEXT; } - function yy_r5_14() + function yy_r5_17() { - - $to = $this->dataLength; - $this->value = substr($this->data, $this->counter, $to - $this->counter); $this->token = Smarty_Internal_Templateparser::TP_TEXT; } - }
\ No newline at end of file diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templateparser.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templateparser.php index bc74fe440..d8219daed 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templateparser.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templateparser.php @@ -1,70 +1,5 @@ <?php -class TP_yyToken implements ArrayAccess -{ - public $string = ''; - - public $metadata = array(); - - public function __construct($s, $m = array()) - { - if ($s instanceof TP_yyToken) { - $this->string = $s->string; - $this->metadata = $s->metadata; - } else { - $this->string = (string) $s; - if ($m instanceof TP_yyToken) { - $this->metadata = $m->metadata; - } elseif (is_array($m)) { - $this->metadata = $m; - } - } - } - - public function __toString() - { - return $this->string; - } - - public function offsetExists($offset) - { - return isset($this->metadata[ $offset ]); - } - - public function offsetGet($offset) - { - return $this->metadata[ $offset ]; - } - - public function offsetSet($offset, $value) - { - if ($offset === null) { - if (isset($value[ 0 ])) { - $x = ($value instanceof TP_yyToken) ? $value->metadata : $value; - $this->metadata = array_merge($this->metadata, $x); - - return; - } - $offset = count($this->metadata); - } - if ($value === null) { - return; - } - if ($value instanceof TP_yyToken) { - if ($value->metadata) { - $this->metadata[ $offset ] = $value->metadata; - } - } elseif ($value) { - $this->metadata[ $offset ] = $value; - } - } - - public function offsetUnset($offset) - { - unset($this->metadata[ $offset ]); - } -} - class TP_yyStackEntry { public $stateno; /* The state-number */ @@ -75,7 +10,6 @@ class TP_yyStackEntry } ; - #line 11 "../smarty/lexer/smarty_internal_templateparser.y" /** @@ -89,129 +23,1629 @@ class TP_yyStackEntry class Smarty_Internal_Templateparser { #line 23 "../smarty/lexer/smarty_internal_templateparser.y" - - const Err1 = "Security error: Call to private object member not allowed"; - - const Err2 = "Security error: Call to dynamic object member not allowed"; - - const Err3 = "PHP in template not allowed. Use SmartyBC to enable it"; - + const Err1 = 'Security error: Call to private object member not allowed'; + const Err2 = 'Security error: Call to dynamic object member not allowed'; + const Err3 = 'PHP in template not allowed. Use SmartyBC to enable it'; + const TP_VERT = 1; + const TP_COLON = 2; + const TP_UNIMATH = 3; + const TP_PHP = 4; + const TP_TEXT = 5; + const TP_STRIPON = 6; + const TP_STRIPOFF = 7; + const TP_LITERALSTART = 8; + const TP_LITERALEND = 9; + const TP_LITERAL = 10; + const TP_SIMPELOUTPUT = 11; + const TP_SIMPLETAG = 12; + const TP_SMARTYBLOCKCHILDPARENT = 13; + const TP_LDEL = 14; + const TP_RDEL = 15; + const TP_DOLLARID = 16; + const TP_EQUAL = 17; + const TP_ID = 18; + const TP_PTR = 19; + const TP_LDELMAKENOCACHE = 20; + const TP_LDELIF = 21; + const TP_LDELFOR = 22; + const TP_SEMICOLON = 23; + const TP_INCDEC = 24; + const TP_TO = 25; + const TP_STEP = 26; + const TP_LDELFOREACH = 27; + const TP_SPACE = 28; + const TP_AS = 29; + const TP_APTR = 30; + const TP_LDELSETFILTER = 31; + const TP_CLOSETAG = 32; + const TP_LDELSLASH = 33; + const TP_ATTR = 34; + const TP_INTEGER = 35; + const TP_COMMA = 36; + const TP_OPENP = 37; + const TP_CLOSEP = 38; + const TP_MATH = 39; + const TP_ISIN = 40; + const TP_QMARK = 41; + const TP_NOT = 42; + const TP_TYPECAST = 43; + const TP_HEX = 44; + const TP_DOT = 45; + const TP_INSTANCEOF = 46; + const TP_SINGLEQUOTESTRING = 47; + const TP_DOUBLECOLON = 48; + const TP_NAMESPACE = 49; + const TP_AT = 50; + const TP_HATCH = 51; + const TP_OPENB = 52; + const TP_CLOSEB = 53; + const TP_DOLLAR = 54; + const TP_LOGOP = 55; + const TP_SLOGOP = 56; + const TP_TLOGOP = 57; + const TP_SINGLECOND = 58; + const TP_QUOTE = 59; + const TP_BACKTICK = 60; + const YY_NO_ACTION = 511; + const YY_ACCEPT_ACTION = 510; + const YY_ERROR_ACTION = 509; + const YY_SZ_ACTTAB = 2178; + const YY_SHIFT_USE_DFLT = -23; + const YY_SHIFT_MAX = 227; + const YY_REDUCE_USE_DFLT = -68; + const YY_REDUCE_MAX = 176; + const YYNOCODE = 108; + const YYSTACKDEPTH = 500; + const YYNSTATE = 323; + const YYNRULE = 186; + const YYERRORSYMBOL = 61; + const YYERRSYMDT = 'yy0'; + const YYFALLBACK = 0; /** * result status * * @var bool */ public $successful = true; - /** * return value * * @var mixed */ public $retvalue = 0; - /** * @var */ public $yymajor; - /** * last index of array variable * * @var mixed */ public $last_index; - /** * last variable name * * @var string */ public $last_variable; - /** * root parse tree buffer * * @var Smarty_Internal_ParseTree */ public $root_buffer; - /** * current parse tree object * * @var Smarty_Internal_ParseTree */ public $current_buffer; - /** * lexer object * * @var Smarty_Internal_Templatelexer */ public $lex; - /** * internal error flag * * @var bool */ private $internalError = false; - /** * {strip} status * * @var bool */ public $strip = false; - /** * compiler object * * @var Smarty_Internal_TemplateCompilerBase */ public $compiler = null; - /** * smarty object * * @var Smarty */ public $smarty = null; - /** * template object * * @var Smarty_Internal_Template */ public $template = null; - /** * block nesting level * * @var int */ public $block_nesting_level = 0; - /** * security object * * @var Smarty_Security */ public $security = null; - /** * template prefix array * * @var \Smarty_Internal_ParseTree[] */ public $template_prefix = array(); - /** - * security object + * template prefix array * * @var \Smarty_Internal_ParseTree[] */ public $template_postfix = array(); + static public $yy_action = array( + 43, 266, 267, 379, 115, 203, 33, 201, 274, 275, + 281, 1, 13, 124, 93, 183, 379, 217, 6, 79, + 253, 89, 379, 16, 102, 425, 304, 252, 218, 249, + 211, 129, 190, 302, 26, 213, 425, 33, 11, 39, + 42, 283, 209, 13, 223, 385, 195, 233, 77, 3, + 236, 290, 43, 385, 170, 385, 75, 17, 385, 94, + 274, 275, 281, 1, 385, 128, 385, 196, 385, 217, + 6, 79, 80, 298, 158, 210, 102, 156, 174, 133, + 218, 249, 211, 85, 208, 290, 28, 264, 101, 264, + 199, 39, 42, 283, 209, 31, 312, 182, 195, 259, + 77, 3, 43, 290, 23, 172, 239, 174, 75, 288, + 274, 275, 281, 1, 167, 127, 256, 196, 248, 217, + 6, 79, 345, 40, 20, 305, 102, 248, 345, 157, + 218, 249, 211, 83, 208, 290, 26, 8, 174, 264, + 74, 39, 42, 283, 209, 131, 312, 292, 195, 74, + 77, 3, 43, 290, 295, 99, 243, 174, 75, 345, + 274, 275, 281, 1, 15, 126, 86, 196, 248, 217, + 6, 79, 345, 322, 161, 289, 102, 87, 345, 165, + 218, 249, 211, 290, 208, 115, 26, 128, 255, 221, + 74, 39, 42, 283, 209, 93, 312, 210, 195, 162, + 77, 3, 43, 290, 254, 235, 247, 304, 75, 27, + 274, 275, 281, 1, 172, 127, 425, 177, 248, 217, + 6, 79, 77, 174, 250, 290, 102, 425, 198, 14, + 218, 249, 211, 248, 208, 34, 26, 222, 206, 139, + 74, 39, 42, 283, 209, 198, 312, 23, 195, 291, + 77, 3, 43, 290, 300, 74, 198, 438, 75, 346, + 274, 275, 281, 1, 438, 127, 176, 196, 267, 217, + 6, 79, 346, 161, 289, 290, 102, 23, 346, 238, + 218, 249, 211, 33, 178, 263, 26, 160, 289, 13, + 37, 39, 42, 283, 209, 198, 312, 212, 195, 250, + 77, 3, 43, 290, 216, 189, 155, 97, 75, 381, + 274, 275, 281, 1, 149, 127, 264, 179, 18, 217, + 6, 79, 381, 94, 97, 237, 102, 140, 381, 251, + 218, 249, 211, 4, 194, 94, 26, 264, 198, 37, + 30, 39, 42, 283, 209, 198, 312, 212, 195, 129, + 77, 3, 43, 290, 219, 172, 11, 97, 75, 378, + 274, 275, 281, 1, 101, 127, 438, 186, 210, 217, + 6, 79, 378, 438, 12, 163, 102, 220, 378, 425, + 218, 249, 211, 302, 208, 213, 26, 225, 215, 187, + 425, 39, 42, 283, 209, 234, 312, 7, 195, 212, + 77, 3, 43, 290, 134, 9, 240, 425, 75, 97, + 274, 275, 281, 1, 264, 91, 109, 76, 425, 217, + 6, 79, 253, 293, 426, 16, 102, 251, 198, 252, + 218, 249, 211, 198, 208, 426, 26, 148, 198, 135, + 132, 39, 42, 283, 209, 143, 312, 264, 195, 264, + 77, 3, 43, 290, 138, 264, 205, 24, 75, 166, + 274, 275, 281, 1, 264, 125, 276, 196, 19, 217, + 6, 79, 454, 153, 13, 454, 102, 168, 290, 454, + 218, 249, 211, 174, 208, 314, 5, 136, 210, 251, + 152, 39, 42, 283, 209, 268, 312, 213, 195, 308, + 77, 3, 43, 290, 94, 169, 111, 144, 75, 251, + 274, 275, 281, 1, 229, 128, 7, 196, 313, 217, + 6, 79, 510, 90, 175, 111, 102, 164, 289, 174, + 218, 249, 211, 101, 208, 265, 28, 32, 128, 150, + 261, 39, 42, 283, 209, 10, 312, 317, 195, 224, + 77, 21, 269, 290, 232, 230, 282, 114, 75, 307, + 214, 213, 279, 22, 84, 103, 246, 181, 92, 64, + 260, 262, 454, 77, 93, 454, 290, 257, 316, 454, + 438, 228, 311, 197, 309, 78, 304, 271, 272, 273, + 270, 121, 258, 310, 274, 275, 281, 1, 17, 280, + 110, 284, 81, 217, 6, 79, 438, 146, 94, 438, + 102, 454, 151, 438, 218, 249, 211, 307, 214, 213, + 279, 278, 84, 103, 104, 180, 92, 56, 263, 159, + 130, 152, 93, 295, 137, 257, 316, 295, 251, 88, + 311, 197, 309, 82, 304, 307, 295, 213, 303, 295, + 100, 295, 295, 193, 105, 59, 295, 295, 295, 295, + 93, 295, 295, 257, 316, 295, 295, 295, 311, 197, + 309, 307, 304, 213, 277, 295, 100, 103, 295, 181, + 92, 64, 200, 297, 295, 253, 93, 295, 16, 257, + 316, 295, 252, 295, 311, 197, 309, 295, 304, 295, + 299, 295, 295, 295, 295, 295, 274, 275, 281, 2, + 295, 301, 295, 295, 295, 217, 6, 79, 253, 295, + 295, 16, 102, 299, 204, 252, 218, 249, 211, 274, + 275, 281, 2, 295, 301, 33, 295, 154, 217, 6, + 79, 13, 295, 295, 295, 102, 295, 295, 295, 218, + 249, 211, 295, 295, 286, 25, 307, 295, 213, 295, + 295, 100, 295, 295, 193, 105, 59, 295, 295, 295, + 295, 93, 295, 295, 257, 316, 295, 287, 25, 311, + 197, 309, 307, 304, 213, 295, 454, 100, 295, 454, + 193, 118, 67, 454, 296, 253, 295, 93, 16, 295, + 257, 316, 252, 295, 295, 311, 197, 309, 295, 304, + 295, 295, 307, 295, 213, 295, 188, 100, 295, 295, + 193, 118, 67, 295, 295, 454, 295, 93, 295, 295, + 257, 316, 295, 295, 226, 311, 197, 309, 295, 304, + 295, 295, 307, 295, 213, 295, 192, 100, 295, 295, + 193, 118, 67, 295, 295, 295, 295, 93, 295, 295, + 257, 316, 295, 295, 295, 311, 197, 309, 295, 304, + 295, 295, 307, 295, 213, 295, 191, 98, 295, 295, + 193, 118, 46, 295, 108, 295, 295, 93, 295, 295, + 257, 316, 295, 295, 295, 311, 197, 309, 307, 304, + 213, 295, 295, 98, 295, 295, 193, 118, 47, 295, + 219, 295, 295, 93, 295, 295, 257, 316, 295, 295, + 295, 311, 197, 309, 307, 304, 213, 295, 295, 100, + 295, 295, 193, 118, 45, 295, 295, 295, 295, 93, + 295, 295, 257, 316, 295, 295, 295, 311, 197, 309, + 295, 304, 295, 295, 307, 295, 213, 295, 295, 100, + 295, 295, 193, 118, 70, 295, 295, 295, 295, 93, + 295, 295, 257, 316, 295, 295, 295, 311, 197, 309, + 307, 304, 213, 295, 295, 100, 295, 295, 193, 118, + 49, 295, 295, 295, 295, 93, 295, 295, 257, 316, + 295, 295, 295, 311, 197, 309, 307, 304, 213, 295, + 295, 100, 295, 295, 193, 96, 66, 295, 295, 295, + 295, 93, 295, 295, 257, 316, 295, 295, 295, 311, + 197, 309, 295, 304, 295, 295, 307, 295, 213, 295, + 295, 100, 295, 295, 193, 118, 44, 295, 295, 295, + 295, 93, 295, 295, 257, 316, 295, 295, 295, 311, + 197, 309, 307, 304, 213, 295, 295, 100, 295, 295, + 193, 118, 58, 295, 295, 295, 295, 93, 295, 295, + 257, 316, 295, 295, 295, 311, 197, 309, 307, 304, + 213, 295, 295, 100, 295, 295, 193, 118, 54, 295, + 295, 295, 295, 93, 295, 295, 257, 316, 295, 295, + 295, 311, 197, 309, 295, 304, 295, 295, 307, 295, + 213, 295, 295, 100, 295, 295, 193, 118, 71, 295, + 295, 295, 295, 93, 295, 295, 257, 316, 295, 295, + 295, 311, 197, 309, 307, 304, 213, 295, 295, 100, + 295, 295, 193, 118, 65, 295, 295, 295, 295, 93, + 295, 295, 257, 316, 295, 295, 295, 311, 197, 309, + 307, 304, 213, 295, 295, 100, 295, 295, 193, 96, + 57, 295, 295, 295, 295, 93, 295, 295, 257, 316, + 295, 295, 295, 311, 197, 309, 295, 304, 295, 295, + 307, 295, 213, 295, 295, 100, 295, 295, 185, 106, + 53, 295, 295, 295, 295, 93, 295, 295, 257, 316, + 295, 295, 295, 311, 197, 309, 307, 304, 213, 295, + 295, 100, 295, 295, 193, 118, 60, 295, 295, 295, + 295, 93, 295, 295, 257, 316, 295, 295, 295, 311, + 197, 309, 307, 304, 213, 295, 295, 100, 295, 295, + 193, 118, 73, 295, 295, 295, 295, 93, 295, 295, + 257, 316, 295, 295, 295, 311, 197, 309, 295, 304, + 295, 295, 307, 295, 213, 295, 295, 100, 295, 295, + 193, 118, 55, 295, 295, 295, 295, 93, 295, 295, + 257, 316, 295, 295, 295, 311, 197, 309, 307, 304, + 213, 295, 295, 100, 295, 295, 193, 95, 68, 295, + 295, 295, 295, 93, 295, 295, 257, 316, 295, 295, + 295, 311, 197, 309, 307, 304, 213, 295, 295, 100, + 295, 295, 193, 118, 69, 295, 295, 295, 295, 93, + 295, 295, 257, 316, 295, 295, 295, 311, 197, 309, + 295, 304, 295, 295, 307, 295, 213, 295, 295, 100, + 295, 295, 193, 118, 51, 295, 295, 295, 295, 93, + 295, 295, 257, 316, 295, 295, 295, 311, 197, 309, + 307, 304, 213, 295, 295, 100, 295, 295, 184, 118, + 52, 295, 295, 295, 295, 93, 295, 295, 257, 316, + 295, 295, 295, 311, 197, 309, 307, 304, 213, 295, + 295, 100, 295, 295, 193, 118, 47, 295, 295, 295, + 295, 93, 295, 295, 257, 316, 295, 295, 295, 311, + 197, 309, 295, 304, 295, 295, 307, 295, 213, 295, + 295, 100, 295, 295, 193, 118, 50, 295, 295, 295, + 295, 93, 295, 295, 257, 316, 295, 295, 295, 311, + 197, 309, 307, 304, 213, 295, 295, 100, 295, 295, + 193, 118, 62, 295, 295, 295, 295, 93, 295, 295, + 257, 316, 295, 295, 295, 311, 197, 309, 307, 304, + 213, 295, 295, 100, 295, 295, 193, 118, 63, 295, + 295, 295, 295, 93, 295, 295, 257, 316, 295, 295, + 295, 311, 197, 309, 295, 304, 295, 295, 307, 295, + 213, 295, 295, 100, 295, 295, 193, 118, 61, 295, + 295, 295, 295, 93, 295, 295, 257, 316, 295, 295, + 295, 311, 197, 309, 307, 304, 213, 295, 295, 100, + 295, 295, 193, 118, 48, 295, 295, 295, 295, 93, + 295, 295, 257, 316, 391, 391, 391, 311, 197, 309, + 307, 304, 213, 295, 295, 100, 295, 295, 193, 118, + 72, 295, 295, 295, 295, 93, 295, 295, 257, 316, + 295, 295, 295, 311, 197, 309, 295, 304, 295, 295, + 425, 295, 391, 391, 295, 295, 295, 295, 307, 295, + 213, 425, 198, 100, 38, 295, 193, 112, 391, 391, + 391, 391, 38, 93, 295, 295, 295, 306, 295, 295, + 295, 311, 197, 309, 295, 304, 295, 35, 307, 33, + 213, 295, 295, 100, 295, 13, 193, 120, 295, 295, + 41, 36, 198, 93, 38, 295, 295, 231, 41, 36, + 295, 311, 197, 309, 295, 304, 319, 318, 315, 245, + 295, 207, 295, 295, 319, 318, 315, 245, 295, 33, + 454, 295, 295, 454, 295, 13, 207, 454, 438, 295, + 41, 36, 295, 295, 295, 454, 295, 295, 454, 295, + 295, 14, 454, 438, 295, 295, 319, 318, 315, 245, + 295, 198, 295, 38, 438, 295, 295, 438, 307, 454, + 213, 438, 320, 100, 295, 241, 193, 122, 295, 438, + 295, 295, 438, 93, 454, 295, 438, 295, 198, 295, + 38, 311, 197, 309, 295, 304, 307, 295, 213, 41, + 36, 100, 295, 295, 193, 117, 295, 295, 295, 295, + 295, 93, 295, 295, 295, 319, 318, 315, 245, 311, + 197, 309, 207, 304, 295, 295, 41, 36, 295, 295, + 295, 454, 295, 295, 454, 295, 295, 4, 454, 438, + 295, 295, 319, 318, 315, 245, 295, 294, 295, 295, + 295, 307, 295, 213, 295, 295, 100, 295, 295, 193, + 123, 295, 295, 295, 295, 438, 93, 295, 438, 141, + 454, 295, 438, 167, 311, 197, 309, 295, 304, 264, + 295, 295, 40, 20, 305, 295, 295, 307, 295, 213, + 295, 198, 100, 38, 295, 193, 116, 174, 307, 295, + 213, 295, 93, 100, 295, 295, 193, 113, 295, 295, + 311, 197, 309, 93, 304, 295, 198, 295, 38, 295, + 295, 311, 197, 309, 295, 304, 307, 295, 213, 41, + 36, 100, 295, 295, 193, 119, 295, 295, 295, 295, + 295, 93, 295, 321, 145, 319, 318, 315, 245, 311, + 197, 309, 207, 304, 41, 36, 295, 295, 295, 295, + 295, 454, 295, 295, 454, 295, 295, 295, 454, 438, + 319, 318, 315, 245, 198, 295, 38, 295, 198, 295, + 38, 295, 198, 295, 38, 295, 295, 295, 242, 295, + 295, 295, 285, 295, 295, 438, 171, 295, 438, 295, + 454, 295, 438, 295, 295, 295, 295, 454, 295, 295, + 454, 295, 41, 36, 454, 438, 41, 36, 295, 295, + 41, 36, 198, 295, 38, 295, 295, 295, 319, 318, + 315, 245, 319, 318, 315, 245, 319, 318, 315, 245, + 295, 438, 295, 147, 438, 295, 454, 167, 438, 295, + 295, 295, 295, 264, 295, 295, 40, 20, 305, 227, + 41, 36, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 174, 295, 295, 295, 295, 319, 318, 315, 245, + 198, 295, 38, 295, 198, 295, 38, 142, 198, 295, + 38, 167, 295, 295, 173, 295, 295, 264, 295, 295, + 40, 20, 305, 295, 295, 295, 107, 295, 198, 29, + 38, 295, 198, 295, 38, 174, 295, 295, 41, 36, + 295, 295, 41, 36, 295, 244, 41, 36, 295, 295, + 295, 295, 295, 295, 319, 318, 315, 245, 319, 318, + 315, 245, 319, 318, 315, 245, 41, 36, 295, 295, + 41, 36, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 319, 318, 315, 245, 319, 318, 315, 245, + 198, 295, 295, 295, 295, 295, 295, 295, 295, 295, + 295, 295, 295, 295, 349, 295, 295, 295, 202, 295, + 295, 295, 295, 295, 295, 295, 295, 33, 295, 295, + 295, 295, 295, 13, 295, 295, 425, 295, 295, 295, + 295, 295, 295, 295, 295, 295, 295, 425, + ); + static public $yy_lookahead = array( + 3, 9, 10, 15, 71, 17, 28, 74, 11, 12, + 13, 14, 34, 16, 81, 18, 28, 20, 21, 22, + 11, 82, 34, 14, 27, 37, 93, 18, 31, 32, + 33, 45, 35, 66, 37, 68, 48, 28, 52, 42, + 43, 44, 45, 34, 47, 15, 49, 16, 51, 52, + 53, 54, 3, 23, 77, 25, 59, 17, 28, 19, + 11, 12, 13, 14, 34, 16, 36, 18, 38, 20, + 21, 22, 105, 106, 94, 45, 27, 73, 101, 73, + 31, 32, 33, 77, 35, 54, 37, 83, 48, 83, + 65, 42, 43, 44, 45, 14, 47, 16, 49, 18, + 51, 52, 3, 54, 36, 101, 38, 101, 59, 15, + 11, 12, 13, 14, 77, 16, 35, 18, 24, 20, + 21, 22, 28, 86, 87, 88, 27, 24, 34, 73, + 31, 32, 33, 77, 35, 54, 37, 36, 101, 83, + 46, 42, 43, 44, 45, 16, 47, 70, 49, 46, + 51, 52, 3, 54, 53, 81, 53, 101, 59, 15, + 11, 12, 13, 14, 23, 16, 37, 18, 24, 20, + 21, 22, 28, 99, 97, 98, 27, 36, 34, 82, + 31, 32, 33, 54, 35, 71, 37, 16, 74, 18, + 46, 42, 43, 44, 45, 81, 47, 45, 49, 77, + 51, 52, 3, 54, 90, 53, 18, 93, 59, 30, + 11, 12, 13, 14, 101, 16, 37, 18, 24, 20, + 21, 22, 51, 101, 102, 54, 27, 48, 1, 17, + 31, 32, 33, 24, 35, 14, 37, 16, 50, 18, + 46, 42, 43, 44, 45, 1, 47, 36, 49, 38, + 51, 52, 3, 54, 60, 46, 1, 45, 59, 15, + 11, 12, 13, 14, 52, 16, 8, 18, 10, 20, + 21, 22, 28, 97, 98, 54, 27, 36, 34, 38, + 31, 32, 33, 28, 35, 95, 37, 97, 98, 34, + 2, 42, 43, 44, 45, 1, 47, 71, 49, 102, + 51, 52, 3, 54, 78, 79, 73, 81, 59, 15, + 11, 12, 13, 14, 71, 16, 83, 18, 17, 20, + 21, 22, 28, 19, 81, 24, 27, 73, 34, 96, + 31, 32, 33, 17, 35, 19, 37, 83, 1, 2, + 17, 42, 43, 44, 45, 1, 47, 71, 49, 45, + 51, 52, 3, 54, 78, 101, 52, 81, 59, 15, + 11, 12, 13, 14, 48, 16, 45, 18, 45, 20, + 21, 22, 28, 52, 14, 16, 27, 18, 34, 37, + 31, 32, 33, 66, 35, 68, 37, 45, 64, 65, + 48, 42, 43, 44, 45, 53, 47, 37, 49, 71, + 51, 52, 3, 54, 73, 37, 78, 37, 59, 81, + 11, 12, 13, 14, 83, 16, 48, 18, 48, 20, + 21, 22, 11, 106, 37, 14, 27, 96, 1, 18, + 31, 32, 33, 1, 35, 48, 37, 73, 1, 73, + 16, 42, 43, 44, 45, 73, 47, 83, 49, 83, + 51, 52, 3, 54, 73, 83, 19, 30, 59, 77, + 11, 12, 13, 14, 83, 16, 70, 18, 28, 20, + 21, 22, 11, 94, 34, 14, 27, 82, 54, 18, + 31, 32, 33, 101, 35, 53, 37, 94, 45, 96, + 94, 42, 43, 44, 45, 66, 47, 68, 49, 92, + 51, 52, 3, 54, 19, 77, 99, 94, 59, 96, + 11, 12, 13, 14, 38, 16, 37, 18, 92, 20, + 21, 22, 62, 63, 18, 99, 27, 97, 98, 101, + 31, 32, 33, 48, 35, 16, 37, 25, 16, 51, + 18, 42, 43, 44, 45, 37, 47, 18, 49, 18, + 51, 41, 9, 54, 53, 53, 15, 18, 59, 66, + 67, 68, 69, 2, 71, 72, 18, 74, 75, 76, + 18, 49, 11, 51, 81, 14, 54, 84, 85, 18, + 19, 18, 89, 90, 91, 18, 93, 4, 5, 6, + 7, 8, 18, 35, 11, 12, 13, 14, 17, 15, + 18, 35, 81, 20, 21, 22, 45, 51, 19, 48, + 27, 50, 94, 52, 31, 32, 33, 66, 67, 68, + 69, 83, 71, 72, 80, 74, 75, 76, 95, 94, + 81, 94, 81, 107, 94, 84, 85, 107, 96, 94, + 89, 90, 91, 81, 93, 66, 107, 68, 98, 107, + 71, 107, 107, 74, 75, 76, 107, 107, 107, 107, + 81, 107, 107, 84, 85, 107, 107, 107, 89, 90, + 91, 66, 93, 68, 69, 107, 71, 72, 107, 74, + 75, 76, 103, 104, 107, 11, 81, 107, 14, 84, + 85, 107, 18, 107, 89, 90, 91, 107, 93, 107, + 5, 107, 107, 107, 107, 107, 11, 12, 13, 14, + 107, 16, 107, 107, 107, 20, 21, 22, 11, 107, + 107, 14, 27, 5, 50, 18, 31, 32, 33, 11, + 12, 13, 14, 107, 16, 28, 107, 30, 20, 21, + 22, 34, 107, 107, 107, 27, 107, 107, 107, 31, + 32, 33, 107, 107, 59, 60, 66, 107, 68, 107, + 107, 71, 107, 107, 74, 75, 76, 107, 107, 107, + 107, 81, 107, 107, 84, 85, 107, 59, 60, 89, + 90, 91, 66, 93, 68, 107, 11, 71, 107, 14, + 74, 75, 76, 18, 104, 11, 107, 81, 14, 107, + 84, 85, 18, 107, 107, 89, 90, 91, 107, 93, + 107, 107, 66, 107, 68, 107, 100, 71, 107, 107, + 74, 75, 76, 107, 107, 50, 107, 81, 107, 107, + 84, 85, 107, 107, 50, 89, 90, 91, 107, 93, + 107, 107, 66, 107, 68, 107, 100, 71, 107, 107, + 74, 75, 76, 107, 107, 107, 107, 81, 107, 107, + 84, 85, 107, 107, 107, 89, 90, 91, 107, 93, + 107, 107, 66, 107, 68, 107, 100, 71, 107, 107, + 74, 75, 76, 107, 78, 107, 107, 81, 107, 107, + 84, 85, 107, 107, 107, 89, 90, 91, 66, 93, + 68, 107, 107, 71, 107, 107, 74, 75, 76, 107, + 78, 107, 107, 81, 107, 107, 84, 85, 107, 107, + 107, 89, 90, 91, 66, 93, 68, 107, 107, 71, + 107, 107, 74, 75, 76, 107, 107, 107, 107, 81, + 107, 107, 84, 85, 107, 107, 107, 89, 90, 91, + 107, 93, 107, 107, 66, 107, 68, 107, 107, 71, + 107, 107, 74, 75, 76, 107, 107, 107, 107, 81, + 107, 107, 84, 85, 107, 107, 107, 89, 90, 91, + 66, 93, 68, 107, 107, 71, 107, 107, 74, 75, + 76, 107, 107, 107, 107, 81, 107, 107, 84, 85, + 107, 107, 107, 89, 90, 91, 66, 93, 68, 107, + 107, 71, 107, 107, 74, 75, 76, 107, 107, 107, + 107, 81, 107, 107, 84, 85, 107, 107, 107, 89, + 90, 91, 107, 93, 107, 107, 66, 107, 68, 107, + 107, 71, 107, 107, 74, 75, 76, 107, 107, 107, + 107, 81, 107, 107, 84, 85, 107, 107, 107, 89, + 90, 91, 66, 93, 68, 107, 107, 71, 107, 107, + 74, 75, 76, 107, 107, 107, 107, 81, 107, 107, + 84, 85, 107, 107, 107, 89, 90, 91, 66, 93, + 68, 107, 107, 71, 107, 107, 74, 75, 76, 107, + 107, 107, 107, 81, 107, 107, 84, 85, 107, 107, + 107, 89, 90, 91, 107, 93, 107, 107, 66, 107, + 68, 107, 107, 71, 107, 107, 74, 75, 76, 107, + 107, 107, 107, 81, 107, 107, 84, 85, 107, 107, + 107, 89, 90, 91, 66, 93, 68, 107, 107, 71, + 107, 107, 74, 75, 76, 107, 107, 107, 107, 81, + 107, 107, 84, 85, 107, 107, 107, 89, 90, 91, + 66, 93, 68, 107, 107, 71, 107, 107, 74, 75, + 76, 107, 107, 107, 107, 81, 107, 107, 84, 85, + 107, 107, 107, 89, 90, 91, 107, 93, 107, 107, + 66, 107, 68, 107, 107, 71, 107, 107, 74, 75, + 76, 107, 107, 107, 107, 81, 107, 107, 84, 85, + 107, 107, 107, 89, 90, 91, 66, 93, 68, 107, + 107, 71, 107, 107, 74, 75, 76, 107, 107, 107, + 107, 81, 107, 107, 84, 85, 107, 107, 107, 89, + 90, 91, 66, 93, 68, 107, 107, 71, 107, 107, + 74, 75, 76, 107, 107, 107, 107, 81, 107, 107, + 84, 85, 107, 107, 107, 89, 90, 91, 107, 93, + 107, 107, 66, 107, 68, 107, 107, 71, 107, 107, + 74, 75, 76, 107, 107, 107, 107, 81, 107, 107, + 84, 85, 107, 107, 107, 89, 90, 91, 66, 93, + 68, 107, 107, 71, 107, 107, 74, 75, 76, 107, + 107, 107, 107, 81, 107, 107, 84, 85, 107, 107, + 107, 89, 90, 91, 66, 93, 68, 107, 107, 71, + 107, 107, 74, 75, 76, 107, 107, 107, 107, 81, + 107, 107, 84, 85, 107, 107, 107, 89, 90, 91, + 107, 93, 107, 107, 66, 107, 68, 107, 107, 71, + 107, 107, 74, 75, 76, 107, 107, 107, 107, 81, + 107, 107, 84, 85, 107, 107, 107, 89, 90, 91, + 66, 93, 68, 107, 107, 71, 107, 107, 74, 75, + 76, 107, 107, 107, 107, 81, 107, 107, 84, 85, + 107, 107, 107, 89, 90, 91, 66, 93, 68, 107, + 107, 71, 107, 107, 74, 75, 76, 107, 107, 107, + 107, 81, 107, 107, 84, 85, 107, 107, 107, 89, + 90, 91, 107, 93, 107, 107, 66, 107, 68, 107, + 107, 71, 107, 107, 74, 75, 76, 107, 107, 107, + 107, 81, 107, 107, 84, 85, 107, 107, 107, 89, + 90, 91, 66, 93, 68, 107, 107, 71, 107, 107, + 74, 75, 76, 107, 107, 107, 107, 81, 107, 107, + 84, 85, 107, 107, 107, 89, 90, 91, 66, 93, + 68, 107, 107, 71, 107, 107, 74, 75, 76, 107, + 107, 107, 107, 81, 107, 107, 84, 85, 107, 107, + 107, 89, 90, 91, 107, 93, 107, 107, 66, 107, + 68, 107, 107, 71, 107, 107, 74, 75, 76, 107, + 107, 107, 107, 81, 107, 107, 84, 85, 107, 107, + 107, 89, 90, 91, 66, 93, 68, 107, 107, 71, + 107, 107, 74, 75, 76, 107, 107, 107, 107, 81, + 107, 107, 84, 85, 1, 2, 3, 89, 90, 91, + 66, 93, 68, 107, 107, 71, 107, 107, 74, 75, + 76, 107, 107, 107, 107, 81, 107, 107, 84, 85, + 107, 107, 107, 89, 90, 91, 107, 93, 107, 107, + 37, 107, 39, 40, 107, 107, 107, 107, 66, 107, + 68, 48, 1, 71, 3, 107, 74, 75, 55, 56, + 57, 58, 3, 81, 107, 107, 107, 85, 107, 107, + 107, 89, 90, 91, 107, 93, 107, 26, 66, 28, + 68, 107, 107, 71, 107, 34, 74, 75, 107, 107, + 39, 40, 1, 81, 3, 107, 107, 85, 39, 40, + 107, 89, 90, 91, 107, 93, 55, 56, 57, 58, + 107, 2, 107, 107, 55, 56, 57, 58, 107, 28, + 11, 107, 107, 14, 107, 34, 2, 18, 19, 107, + 39, 40, 107, 107, 107, 11, 107, 107, 14, 107, + 107, 17, 18, 19, 107, 107, 55, 56, 57, 58, + 107, 1, 107, 3, 45, 107, 107, 48, 66, 50, + 68, 52, 53, 71, 107, 15, 74, 75, 107, 45, + 107, 107, 48, 81, 50, 107, 52, 107, 1, 107, + 3, 89, 90, 91, 107, 93, 66, 107, 68, 39, + 40, 71, 107, 107, 74, 75, 107, 107, 107, 107, + 107, 81, 107, 107, 107, 55, 56, 57, 58, 89, + 90, 91, 2, 93, 107, 107, 39, 40, 107, 107, + 107, 11, 107, 107, 14, 107, 107, 17, 18, 19, + 107, 107, 55, 56, 57, 58, 107, 60, 107, 107, + 107, 66, 107, 68, 107, 107, 71, 107, 107, 74, + 75, 107, 107, 107, 107, 45, 81, 107, 48, 73, + 50, 107, 52, 77, 89, 90, 91, 107, 93, 83, + 107, 107, 86, 87, 88, 107, 107, 66, 107, 68, + 107, 1, 71, 3, 107, 74, 75, 101, 66, 107, + 68, 107, 81, 71, 107, 107, 74, 75, 107, 107, + 89, 90, 91, 81, 93, 107, 1, 107, 3, 107, + 107, 89, 90, 91, 107, 93, 66, 107, 68, 39, + 40, 71, 107, 107, 74, 75, 107, 107, 107, 107, + 107, 81, 107, 53, 29, 55, 56, 57, 58, 89, + 90, 91, 2, 93, 39, 40, 107, 107, 107, 107, + 107, 11, 107, 107, 14, 107, 107, 107, 18, 19, + 55, 56, 57, 58, 1, 107, 3, 107, 1, 107, + 3, 107, 1, 107, 3, 107, 107, 107, 15, 107, + 107, 107, 15, 107, 107, 45, 15, 107, 48, 107, + 50, 107, 52, 107, 107, 107, 107, 11, 107, 107, + 14, 107, 39, 40, 18, 19, 39, 40, 107, 107, + 39, 40, 1, 107, 3, 107, 107, 107, 55, 56, + 57, 58, 55, 56, 57, 58, 55, 56, 57, 58, + 107, 45, 107, 73, 48, 107, 50, 77, 52, 107, + 107, 107, 107, 83, 107, 107, 86, 87, 88, 38, + 39, 40, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 101, 107, 107, 107, 107, 55, 56, 57, 58, + 1, 107, 3, 107, 1, 107, 3, 73, 1, 107, + 3, 77, 107, 107, 15, 107, 107, 83, 107, 107, + 86, 87, 88, 107, 107, 107, 23, 107, 1, 2, + 3, 107, 1, 107, 3, 101, 107, 107, 39, 40, + 107, 107, 39, 40, 107, 38, 39, 40, 107, 107, + 107, 107, 107, 107, 55, 56, 57, 58, 55, 56, + 57, 58, 55, 56, 57, 58, 39, 40, 107, 107, + 39, 40, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 55, 56, 57, 58, 55, 56, 57, 58, + 1, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 15, 107, 107, 107, 19, 107, + 107, 107, 107, 107, 107, 107, 107, 28, 107, 107, + 107, 107, 107, 34, 107, 107, 37, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 48, + ); + static public $yy_shift_ofst = array( + -23, 399, 399, 349, 99, 449, 449, 99, 349, 99, + 99, -3, 99, 99, 249, 99, 99, 99, 99, 299, + 99, 149, 199, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 299, 99, 99, 49, 49, 499, 499, + 499, 499, 499, 499, 1621, 1661, 1661, 1981, 2067, 2039, + 2047, 2043, 1747, 1850, 1720, 1941, 1937, 1875, 1933, 2071, + 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, + 2071, 2071, 1629, 1629, 522, 695, 2129, 171, 255, 129, + 718, 707, 9, 255, 316, 255, 129, 129, 304, 337, + 583, 1780, 244, 784, 221, 344, 294, 411, 40, 411, + 485, 359, 440, -22, -22, 427, 432, 424, -22, 359, + 437, 589, 227, 227, 227, 589, 227, 227, 227, 227, + -23, -23, -23, -23, 1679, 1694, 561, 1910, 1956, 81, + 674, 212, 461, -22, -22, -22, -14, -14, -22, 360, + -22, -22, -22, -22, -14, 31, 321, -22, -22, 301, + 321, -14, -14, -14, 31, -22, -22, -22, -14, -14, + 589, 589, 227, 508, 589, 288, 227, 227, 288, 227, + 227, -23, -23, -23, -23, -23, -23, 1573, 30, -12, + 94, 144, 775, 342, 194, 103, 179, 258, 211, 141, + 152, 68, 241, 209, 323, 387, 370, 368, 188, -8, + 101, 556, 567, 563, 552, 539, 548, 574, 443, 558, + 566, 582, 581, 584, 541, 543, 512, 519, 506, 476, + 479, 488, 508, 502, 501, 531, 529, 510, + ); + static public $yy_reduce_ofst = array( + 460, 493, 551, 579, 605, 832, 806, 776, 690, 746, + 716, 1134, 1216, 1242, 1160, 1298, 1022, 1052, 1078, 1104, + 1268, 1488, 1514, 1432, 1462, 1324, 1350, 1406, 1380, 1186, + 888, 996, 970, 940, 914, 858, 1552, 1582, 1745, 1690, + 1781, 1820, 1792, 1662, 1974, 1930, 1756, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 114, -33, 6, -67, 56, 226, + 317, 233, 331, 254, 77, 4, 276, 328, 190, 122, + 429, 396, -23, 393, 74, -23, -23, 393, 176, 413, + 176, 407, 381, 366, 364, -23, -23, 243, 372, 426, + 428, 430, -23, -23, 382, 176, -23, -23, -23, -23, + -23, 324, -23, -23, 537, 537, 537, 537, 537, 549, + 542, 537, 537, 538, 538, 538, 533, 533, 538, 540, + 538, 538, 538, 538, 533, 521, 518, 538, 538, 544, + 535, 533, 533, 533, 562, 538, 538, 538, 533, 533, + 550, 550, 113, 545, 550, 197, 113, 113, 197, 113, + 113, 379, 395, -20, 97, -61, 25, + ); + static public $yyExpectedTokens = array( + array(), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 53, 54, + 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 54, 59,), + array(3, 11, 12, 13, 14, 16, 18, 20, 21, 22, 27, 31, 32, 33, 35, 37, 42, 43, 44, 45, 47, 49, 51, 54, 59,), + array(1, 3, 26, 28, 34, 39, 40, 55, 56, 57, 58,), + array(1, 3, 28, 34, 39, 40, 55, 56, 57, 58,), + array(1, 3, 28, 34, 39, 40, 55, 56, 57, 58,), + array(1, 3, 38, 39, 40, 55, 56, 57, 58,), + array(1, 2, 3, 39, 40, 55, 56, 57, 58,), + array(1, 3, 15, 39, 40, 55, 56, 57, 58,), + array(1, 3, 38, 39, 40, 55, 56, 57, 58,), + array(1, 3, 23, 39, 40, 55, 56, 57, 58,), + array(1, 3, 39, 40, 55, 56, 57, 58, 60,), + array(1, 3, 39, 40, 53, 55, 56, 57, 58,), + array(1, 3, 15, 39, 40, 55, 56, 57, 58,), + array(1, 3, 15, 39, 40, 55, 56, 57, 58,), + array(1, 3, 15, 39, 40, 55, 56, 57, 58,), + array(1, 3, 29, 39, 40, 55, 56, 57, 58,), + array(1, 3, 15, 39, 40, 55, 56, 57, 58,), + array(1, 3, 39, 40, 55, 56, 57, 58,), + array(1, 3, 39, 40, 55, 56, 57, 58,), + array(1, 3, 39, 40, 55, 56, 57, 58,), + array(1, 3, 39, 40, 55, 56, 57, 58,), + array(1, 3, 39, 40, 55, 56, 57, 58,), + array(1, 3, 39, 40, 55, 56, 57, 58,), + array(1, 3, 39, 40, 55, 56, 57, 58,), + array(1, 3, 39, 40, 55, 56, 57, 58,), + array(1, 3, 39, 40, 55, 56, 57, 58,), + array(1, 3, 39, 40, 55, 56, 57, 58,), + array(1, 3, 39, 40, 55, 56, 57, 58,), + array(1, 3, 39, 40, 55, 56, 57, 58,), + array(1, 3, 39, 40, 55, 56, 57, 58,), + array(3, 39, 40, 55, 56, 57, 58,), + array(3, 39, 40, 55, 56, 57, 58,), + array(16, 18, 49, 51, 54,), + array(5, 11, 12, 13, 14, 16, 20, 21, 22, 27, 31, 32, 33, 59, 60,), + array(1, 15, 19, 28, 34, 37, 48,), + array(16, 18, 51, 54,), + array(1, 28, 34,), + array(16, 37, 54,), + array(5, 11, 12, 13, 14, 16, 20, 21, 22, 27, 31, 32, 33, 59, 60,), + array(11, 14, 18, 28, 30, 34,), + array(11, 14, 18, 28, 34,), + array(1, 28, 34,), + array(17, 19, 48,), + array(1, 28, 34,), + array(16, 37, 54,), + array(16, 37, 54,), + array(19, 45, 52,), + array(1, 2,), + array(4, 5, 6, 7, 8, 11, 12, 13, 14, 20, 21, 22, 27, 31, 32, 33,), + array(2, 11, 14, 17, 18, 19, 45, 48, 50, 52,), + array(1, 15, 28, 34,), + array(11, 14, 18, 50,), + array(14, 16, 18, 54,), + array(1, 15, 28, 34,), + array(1, 15, 28, 34,), + array(11, 14, 18,), + array(17, 19, 48,), + array(11, 14, 18,), + array(19, 48,), + array(16, 18,), + array(28, 34,), + array(28, 34,), + array(28, 34,), + array(1, 30,), + array(1, 53,), + array(16, 54,), + array(28, 34,), + array(16, 18,), + array(1, 19,), + array(19,), + array(1,), + array(1,), + array(1,), + array(19,), + array(1,), + array(1,), + array(1,), + array(1,), + array(), + array(), + array(), + array(), + array(2, 11, 14, 18, 19, 45, 48, 50, 52, 53,), + array(2, 11, 14, 17, 18, 19, 45, 48, 50, 52,), + array(2, 11, 14, 18, 19, 45, 48, 50, 52,), + array(2, 11, 14, 18, 19, 45, 48, 50, 52,), + array(11, 14, 18, 19, 45, 48, 50, 52,), + array(14, 16, 18, 35, 54,), + array(11, 14, 18, 50,), + array(17, 45, 52,), + array(11, 14, 18,), + array(28, 34,), + array(28, 34,), + array(28, 34,), + array(45, 52,), + array(45, 52,), + array(28, 34,), + array(14, 37,), + array(28, 34,), + array(28, 34,), + array(28, 34,), + array(28, 34,), + array(45, 52,), + array(16, 54,), + array(45, 52,), + array(28, 34,), + array(28, 34,), + array(17, 24,), + array(45, 52,), + array(45, 52,), + array(45, 52,), + array(45, 52,), + array(16, 54,), + array(28, 34,), + array(28, 34,), + array(28, 34,), + array(45, 52,), + array(45, 52,), + array(19,), + array(19,), + array(1,), + array(37,), + array(19,), + array(2,), + array(1,), + array(1,), + array(2,), + array(1,), + array(1,), + array(), + array(), + array(), + array(), + array(), + array(), + array(1, 2, 3, 37, 39, 40, 48, 55, 56, 57, 58,), + array(15, 23, 25, 28, 34, 36, 38, 45,), + array(15, 17, 28, 34, 37, 48,), + array(15, 24, 28, 34, 46,), + array(15, 24, 28, 34, 46,), + array(11, 14, 18, 50,), + array(37, 45, 48, 53,), + array(24, 46, 60,), + array(24, 46, 53,), + array(30, 37, 48,), + array(8, 10,), + array(36, 38,), + array(23, 36,), + array(45, 53,), + array(36, 38,), + array(36, 38,), + array(24, 46,), + array(17, 45,), + array(37, 48,), + array(37, 48,), + array(37, 48,), + array(18, 50,), + array(9, 10,), + array(36, 53,), + array(51,), + array(18,), + array(18,), + array(18,), + array(18,), + array(18,), + array(18,), + array(45,), + array(35,), + array(35,), + array(18,), + array(17,), + array(15,), + array(15,), + array(9,), + array(25,), + array(16,), + array(18,), + array(38,), + array(37,), + array(51,), + array(37,), + array(53,), + array(53,), + array(18,), + array(18,), + array(41,), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + array(), + ); + static public $yy_default = array( + 334, 509, 509, 494, 509, 509, 509, 473, 509, 473, + 473, 509, 509, 509, 509, 509, 509, 509, 509, 509, + 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, + 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, + 509, 509, 509, 509, 375, 375, 354, 509, 509, 509, + 509, 509, 509, 509, 509, 509, 347, 380, 509, 497, + 386, 495, 496, 471, 347, 359, 380, 472, 377, 397, + 382, 387, 401, 402, 509, 509, 413, 509, 375, 509, + 509, 375, 375, 375, 428, 375, 509, 509, 485, 366, + 323, 427, 389, 438, 509, 389, 389, 438, 428, 438, + 428, 509, 375, 375, 375, 389, 389, 509, 356, 509, + 369, 482, 400, 406, 371, 428, 396, 405, 389, 392, + 480, 332, 404, 393, 427, 427, 427, 427, 427, 509, + 440, 454, 438, 348, 364, 344, 436, 463, 365, 438, + 352, 355, 361, 357, 464, 509, 433, 362, 358, 509, + 431, 434, 435, 466, 509, 363, 350, 351, 465, 432, + 486, 460, 367, 438, 483, 475, 372, 395, 474, 370, + 422, 438, 479, 438, 479, 479, 332, 413, 409, 413, + 403, 403, 439, 413, 403, 403, 413, 330, 509, 509, + 409, 509, 509, 403, 409, 423, 413, 509, 509, 509, + 509, 509, 509, 509, 509, 509, 509, 509, 409, 509, + 411, 509, 509, 509, 509, 509, 383, 509, 509, 509, + 484, 509, 454, 418, 509, 509, 509, 415, 376, 388, + 447, 481, 446, 454, 445, 448, 453, 360, 468, 469, + 384, 459, 444, 450, 415, 490, 476, 477, 407, 368, + 478, 456, 457, 458, 416, 417, 443, 390, 391, 442, + 441, 425, 426, 437, 374, 353, 329, 331, 333, 328, + 327, 324, 325, 326, 335, 336, 341, 343, 373, 340, + 339, 337, 338, 408, 410, 506, 498, 499, 505, 461, + 455, 470, 342, 500, 503, 491, 493, 492, 501, 508, + 502, 504, 507, 462, 430, 398, 399, 421, 420, 419, + 412, 414, 418, 424, 451, 489, 394, 429, 488, 487, + 449, 452, 467, + ); + public static $yyFallback = array(); + public $yyTraceFILE; + public $yyTracePrompt; +public $yyidx; +public $yyerrcnt; +public $yystack = array(); + public $yyTokenName = array( + '$', 'VERT', 'COLON', 'UNIMATH', + 'PHP', 'TEXT', 'STRIPON', 'STRIPOFF', + 'LITERALSTART', 'LITERALEND', 'LITERAL', 'SIMPELOUTPUT', + 'SIMPLETAG', 'SMARTYBLOCKCHILDPARENT', 'LDEL', 'RDEL', + 'DOLLARID', 'EQUAL', 'ID', 'PTR', + 'LDELMAKENOCACHE', 'LDELIF', 'LDELFOR', 'SEMICOLON', + 'INCDEC', 'TO', 'STEP', 'LDELFOREACH', + 'SPACE', 'AS', 'APTR', 'LDELSETFILTER', + 'CLOSETAG', 'LDELSLASH', 'ATTR', 'INTEGER', + 'COMMA', 'OPENP', 'CLOSEP', 'MATH', + 'ISIN', 'QMARK', 'NOT', 'TYPECAST', + 'HEX', 'DOT', 'INSTANCEOF', 'SINGLEQUOTESTRING', + 'DOUBLECOLON', 'NAMESPACE', 'AT', 'HATCH', + 'OPENB', 'CLOSEB', 'DOLLAR', 'LOGOP', + 'SLOGOP', 'TLOGOP', 'SINGLECOND', 'QUOTE', + 'BACKTICK', 'error', 'start', 'template', + 'literal_e2', 'literal_e1', 'smartytag', 'tagbody', + 'tag', 'outattr', 'eqoutattr', 'varindexed', + 'output', 'attributes', 'variable', 'value', + 'expr', 'modifierlist', 'statement', 'statements', + 'foraction', 'varvar', 'modparameters', 'attribute', + 'ternary', 'array', 'tlop', 'lop', + 'scond', 'function', 'ns1', 'doublequoted_with_quotes', + 'static_class_access', 'object', 'arrayindex', 'indexdef', + 'varvarele', 'objectchain', 'objectelement', 'method', + 'params', 'modifier', 'modparameter', 'arrayelements', + 'arrayelement', 'doublequoted', 'doublequotedcontent', + ); + public static $yyRuleName = array( + 'start ::= template', + 'template ::= template PHP', + 'template ::= template TEXT', + 'template ::= template STRIPON', + 'template ::= template STRIPOFF', + 'template ::= template LITERALSTART literal_e2 LITERALEND', + 'literal_e2 ::= literal_e1 LITERALSTART literal_e1 LITERALEND', + 'literal_e2 ::= literal_e1', + 'literal_e1 ::= literal_e1 LITERAL', + 'literal_e1 ::=', + 'template ::= template smartytag', + 'template ::=', + 'smartytag ::= SIMPELOUTPUT', + 'smartytag ::= SIMPLETAG', + 'smartytag ::= SMARTYBLOCKCHILDPARENT', + 'smartytag ::= LDEL tagbody RDEL', + 'smartytag ::= tag RDEL', + 'tagbody ::= outattr', + 'tagbody ::= DOLLARID eqoutattr', + 'tagbody ::= varindexed eqoutattr', + 'eqoutattr ::= EQUAL outattr', + 'outattr ::= output attributes', + 'output ::= variable', + 'output ::= value', + 'output ::= expr', + 'tag ::= LDEL ID attributes', + 'tag ::= LDEL ID', + 'tag ::= LDEL ID modifierlist attributes', + 'tag ::= LDEL ID PTR ID attributes', + 'tag ::= LDEL ID PTR ID modifierlist attributes', + 'tag ::= LDELMAKENOCACHE DOLLARID', + 'tag ::= LDELIF expr', + 'tag ::= LDELIF expr attributes', + 'tag ::= LDELIF statement', + 'tag ::= LDELIF statement attributes', + 'tag ::= LDELFOR statements SEMICOLON expr SEMICOLON varindexed foraction attributes', + 'foraction ::= EQUAL expr', + 'foraction ::= INCDEC', + 'tag ::= LDELFOR statement TO expr attributes', + 'tag ::= LDELFOR statement TO expr STEP expr attributes', + 'tag ::= LDELFOREACH SPACE expr AS varvar attributes', + 'tag ::= LDELFOREACH SPACE expr AS varvar APTR varvar attributes', + 'tag ::= LDELFOREACH attributes', + 'tag ::= LDELSETFILTER ID modparameters', + 'tag ::= LDELSETFILTER ID modparameters modifierlist', + 'smartytag ::= CLOSETAG', + 'tag ::= LDELSLASH ID', + 'tag ::= LDELSLASH ID modifierlist', + 'tag ::= LDELSLASH ID PTR ID', + 'tag ::= LDELSLASH ID PTR ID modifierlist', + 'attributes ::= attributes attribute', + 'attributes ::= attribute', + 'attributes ::=', + 'attribute ::= SPACE ID EQUAL ID', + 'attribute ::= ATTR expr', + 'attribute ::= ATTR value', + 'attribute ::= SPACE ID', + 'attribute ::= SPACE expr', + 'attribute ::= SPACE value', + 'attribute ::= SPACE INTEGER EQUAL expr', + 'statements ::= statement', + 'statements ::= statements COMMA statement', + 'statement ::= DOLLARID EQUAL INTEGER', + 'statement ::= DOLLARID EQUAL expr', + 'statement ::= varindexed EQUAL expr', + 'statement ::= OPENP statement CLOSEP', + 'expr ::= value', + 'expr ::= ternary', + 'expr ::= DOLLARID COLON ID', + 'expr ::= expr MATH value', + 'expr ::= expr UNIMATH value', + 'expr ::= array', + 'expr ::= expr modifierlist', + 'expr ::= expr tlop value', + 'expr ::= expr lop expr', + 'expr ::= expr scond', + 'expr ::= expr ISIN array', + 'expr ::= expr ISIN value', + 'ternary ::= OPENP expr CLOSEP QMARK DOLLARID COLON expr', + 'ternary ::= OPENP expr CLOSEP QMARK expr COLON expr', + 'value ::= variable', + 'value ::= UNIMATH value', + 'value ::= NOT value', + 'value ::= TYPECAST value', + 'value ::= variable INCDEC', + 'value ::= HEX', + 'value ::= INTEGER', + 'value ::= INTEGER DOT INTEGER', + 'value ::= INTEGER DOT', + 'value ::= DOT INTEGER', + 'value ::= ID', + 'value ::= function', + 'value ::= OPENP expr CLOSEP', + 'value ::= variable INSTANCEOF ns1', + 'value ::= variable INSTANCEOF variable', + 'value ::= SINGLEQUOTESTRING', + 'value ::= doublequoted_with_quotes', + 'value ::= varindexed DOUBLECOLON static_class_access', + 'value ::= smartytag', + 'value ::= value modifierlist', + 'value ::= NAMESPACE', + 'value ::= ns1 DOUBLECOLON static_class_access', + 'ns1 ::= ID', + 'ns1 ::= NAMESPACE', + 'variable ::= DOLLARID', + 'variable ::= varindexed', + 'variable ::= varvar AT ID', + 'variable ::= object', + 'variable ::= HATCH ID HATCH', + 'variable ::= HATCH ID HATCH arrayindex', + 'variable ::= HATCH variable HATCH', + 'variable ::= HATCH variable HATCH arrayindex', + 'varindexed ::= DOLLARID arrayindex', + 'varindexed ::= varvar arrayindex', + 'arrayindex ::= arrayindex indexdef', + 'arrayindex ::=', + 'indexdef ::= DOT DOLLARID', + 'indexdef ::= DOT varvar', + 'indexdef ::= DOT varvar AT ID', + 'indexdef ::= DOT ID', + 'indexdef ::= DOT INTEGER', + 'indexdef ::= DOT LDEL expr RDEL', + 'indexdef ::= OPENB ID CLOSEB', + 'indexdef ::= OPENB ID DOT ID CLOSEB', + 'indexdef ::= OPENB SINGLEQUOTESTRING CLOSEB', + 'indexdef ::= OPENB INTEGER CLOSEB', + 'indexdef ::= OPENB DOLLARID CLOSEB', + 'indexdef ::= OPENB variable CLOSEB', + 'indexdef ::= OPENB value CLOSEB', + 'indexdef ::= OPENB expr CLOSEB', + 'indexdef ::= OPENB CLOSEB', + 'varvar ::= DOLLARID', + 'varvar ::= DOLLAR', + 'varvar ::= varvar varvarele', + 'varvarele ::= ID', + 'varvarele ::= SIMPELOUTPUT', + 'varvarele ::= LDEL expr RDEL', + 'object ::= varindexed objectchain', + 'objectchain ::= objectelement', + 'objectchain ::= objectchain objectelement', + 'objectelement ::= PTR ID arrayindex', + 'objectelement ::= PTR varvar arrayindex', + 'objectelement ::= PTR LDEL expr RDEL arrayindex', + 'objectelement ::= PTR ID LDEL expr RDEL arrayindex', + 'objectelement ::= PTR method', + 'function ::= ns1 OPENP params CLOSEP', + 'method ::= ID OPENP params CLOSEP', + 'method ::= DOLLARID OPENP params CLOSEP', + 'params ::= params COMMA expr', + 'params ::= expr', + 'params ::=', + 'modifierlist ::= modifierlist modifier modparameters', + 'modifierlist ::= modifier modparameters', + 'modifier ::= VERT AT ID', + 'modifier ::= VERT ID', + 'modparameters ::= modparameters modparameter', + 'modparameters ::=', + 'modparameter ::= COLON value', + 'modparameter ::= COLON array', + 'static_class_access ::= method', + 'static_class_access ::= method objectchain', + 'static_class_access ::= ID', + 'static_class_access ::= DOLLARID arrayindex', + 'static_class_access ::= DOLLARID arrayindex objectchain', + 'lop ::= LOGOP', + 'lop ::= SLOGOP', + 'tlop ::= TLOGOP', + 'scond ::= SINGLECOND', + 'array ::= OPENB arrayelements CLOSEB', + 'arrayelements ::= arrayelement', + 'arrayelements ::= arrayelements COMMA arrayelement', + 'arrayelements ::=', + 'arrayelement ::= value APTR expr', + 'arrayelement ::= ID APTR expr', + 'arrayelement ::= expr', + 'doublequoted_with_quotes ::= QUOTE QUOTE', + 'doublequoted_with_quotes ::= QUOTE doublequoted QUOTE', + 'doublequoted ::= doublequoted doublequotedcontent', + 'doublequoted ::= doublequotedcontent', + 'doublequotedcontent ::= BACKTICK variable BACKTICK', + 'doublequotedcontent ::= BACKTICK expr BACKTICK', + 'doublequotedcontent ::= DOLLARID', + 'doublequotedcontent ::= LDEL variable RDEL', + 'doublequotedcontent ::= LDEL expr RDEL', + 'doublequotedcontent ::= smartytag', + 'doublequotedcontent ::= TEXT', + ); + public static $yyRuleInfo = array( + array(0 => 62, 1 => 1), + array(0 => 63, 1 => 2), + array(0 => 63, 1 => 2), + array(0 => 63, 1 => 2), + array(0 => 63, 1 => 2), + array(0 => 63, 1 => 4), + array(0 => 64, 1 => 4), + array(0 => 64, 1 => 1), + array(0 => 65, 1 => 2), + array(0 => 65, 1 => 0), + array(0 => 63, 1 => 2), + array(0 => 63, 1 => 0), + array(0 => 66, 1 => 1), + array(0 => 66, 1 => 1), + array(0 => 66, 1 => 1), + array(0 => 66, 1 => 3), + array(0 => 66, 1 => 2), + array(0 => 67, 1 => 1), + array(0 => 67, 1 => 2), + array(0 => 67, 1 => 2), + array(0 => 70, 1 => 2), + array(0 => 69, 1 => 2), + array(0 => 72, 1 => 1), + array(0 => 72, 1 => 1), + array(0 => 72, 1 => 1), + array(0 => 68, 1 => 3), + array(0 => 68, 1 => 2), + array(0 => 68, 1 => 4), + array(0 => 68, 1 => 5), + array(0 => 68, 1 => 6), + array(0 => 68, 1 => 2), + array(0 => 68, 1 => 2), + array(0 => 68, 1 => 3), + array(0 => 68, 1 => 2), + array(0 => 68, 1 => 3), + array(0 => 68, 1 => 8), + array(0 => 80, 1 => 2), + array(0 => 80, 1 => 1), + array(0 => 68, 1 => 5), + array(0 => 68, 1 => 7), + array(0 => 68, 1 => 6), + array(0 => 68, 1 => 8), + array(0 => 68, 1 => 2), + array(0 => 68, 1 => 3), + array(0 => 68, 1 => 4), + array(0 => 66, 1 => 1), + array(0 => 68, 1 => 2), + array(0 => 68, 1 => 3), + array(0 => 68, 1 => 4), + array(0 => 68, 1 => 5), + array(0 => 73, 1 => 2), + array(0 => 73, 1 => 1), + array(0 => 73, 1 => 0), + array(0 => 83, 1 => 4), + array(0 => 83, 1 => 2), + array(0 => 83, 1 => 2), + array(0 => 83, 1 => 2), + array(0 => 83, 1 => 2), + array(0 => 83, 1 => 2), + array(0 => 83, 1 => 4), + array(0 => 79, 1 => 1), + array(0 => 79, 1 => 3), + array(0 => 78, 1 => 3), + array(0 => 78, 1 => 3), + array(0 => 78, 1 => 3), + array(0 => 78, 1 => 3), + array(0 => 76, 1 => 1), + array(0 => 76, 1 => 1), + array(0 => 76, 1 => 3), + array(0 => 76, 1 => 3), + array(0 => 76, 1 => 3), + array(0 => 76, 1 => 1), + array(0 => 76, 1 => 2), + array(0 => 76, 1 => 3), + array(0 => 76, 1 => 3), + array(0 => 76, 1 => 2), + array(0 => 76, 1 => 3), + array(0 => 76, 1 => 3), + array(0 => 84, 1 => 7), + array(0 => 84, 1 => 7), + array(0 => 75, 1 => 1), + array(0 => 75, 1 => 2), + array(0 => 75, 1 => 2), + array(0 => 75, 1 => 2), + array(0 => 75, 1 => 2), + array(0 => 75, 1 => 1), + array(0 => 75, 1 => 1), + array(0 => 75, 1 => 3), + array(0 => 75, 1 => 2), + array(0 => 75, 1 => 2), + array(0 => 75, 1 => 1), + array(0 => 75, 1 => 1), + array(0 => 75, 1 => 3), + array(0 => 75, 1 => 3), + array(0 => 75, 1 => 3), + array(0 => 75, 1 => 1), + array(0 => 75, 1 => 1), + array(0 => 75, 1 => 3), + array(0 => 75, 1 => 1), + array(0 => 75, 1 => 2), + array(0 => 75, 1 => 1), + array(0 => 75, 1 => 3), + array(0 => 90, 1 => 1), + array(0 => 90, 1 => 1), + array(0 => 74, 1 => 1), + array(0 => 74, 1 => 1), + array(0 => 74, 1 => 3), + array(0 => 74, 1 => 1), + array(0 => 74, 1 => 3), + array(0 => 74, 1 => 4), + array(0 => 74, 1 => 3), + array(0 => 74, 1 => 4), + array(0 => 71, 1 => 2), + array(0 => 71, 1 => 2), + array(0 => 94, 1 => 2), + array(0 => 94, 1 => 0), + array(0 => 95, 1 => 2), + array(0 => 95, 1 => 2), + array(0 => 95, 1 => 4), + array(0 => 95, 1 => 2), + array(0 => 95, 1 => 2), + array(0 => 95, 1 => 4), + array(0 => 95, 1 => 3), + array(0 => 95, 1 => 5), + array(0 => 95, 1 => 3), + array(0 => 95, 1 => 3), + array(0 => 95, 1 => 3), + array(0 => 95, 1 => 3), + array(0 => 95, 1 => 3), + array(0 => 95, 1 => 3), + array(0 => 95, 1 => 2), + array(0 => 81, 1 => 1), + array(0 => 81, 1 => 1), + array(0 => 81, 1 => 2), + array(0 => 96, 1 => 1), + array(0 => 96, 1 => 1), + array(0 => 96, 1 => 3), + array(0 => 93, 1 => 2), + array(0 => 97, 1 => 1), + array(0 => 97, 1 => 2), + array(0 => 98, 1 => 3), + array(0 => 98, 1 => 3), + array(0 => 98, 1 => 5), + array(0 => 98, 1 => 6), + array(0 => 98, 1 => 2), + array(0 => 89, 1 => 4), + array(0 => 99, 1 => 4), + array(0 => 99, 1 => 4), + array(0 => 100, 1 => 3), + array(0 => 100, 1 => 1), + array(0 => 100, 1 => 0), + array(0 => 77, 1 => 3), + array(0 => 77, 1 => 2), + array(0 => 101, 1 => 3), + array(0 => 101, 1 => 2), + array(0 => 82, 1 => 2), + array(0 => 82, 1 => 0), + array(0 => 102, 1 => 2), + array(0 => 102, 1 => 2), + array(0 => 92, 1 => 1), + array(0 => 92, 1 => 2), + array(0 => 92, 1 => 1), + array(0 => 92, 1 => 2), + array(0 => 92, 1 => 3), + array(0 => 87, 1 => 1), + array(0 => 87, 1 => 1), + array(0 => 86, 1 => 1), + array(0 => 88, 1 => 1), + array(0 => 85, 1 => 3), + array(0 => 103, 1 => 1), + array(0 => 103, 1 => 3), + array(0 => 103, 1 => 0), + array(0 => 104, 1 => 3), + array(0 => 104, 1 => 3), + array(0 => 104, 1 => 1), + array(0 => 91, 1 => 2), + array(0 => 91, 1 => 3), + array(0 => 105, 1 => 2), + array(0 => 105, 1 => 1), + array(0 => 106, 1 => 3), + array(0 => 106, 1 => 3), + array(0 => 106, 1 => 1), + array(0 => 106, 1 => 3), + array(0 => 106, 1 => 3), + array(0 => 106, 1 => 1), + array(0 => 106, 1 => 1), + ); + public static $yyReduceMap = array( + 0 => 0, + 1 => 1, + 2 => 2, + 3 => 3, + 4 => 4, + 5 => 5, + 6 => 6, + 7 => 7, + 22 => 7, + 23 => 7, + 24 => 7, + 37 => 7, + 57 => 7, + 58 => 7, + 66 => 7, + 67 => 7, + 71 => 7, + 80 => 7, + 85 => 7, + 86 => 7, + 91 => 7, + 95 => 7, + 96 => 7, + 100 => 7, + 102 => 7, + 107 => 7, + 169 => 7, + 174 => 7, + 8 => 8, + 9 => 9, + 10 => 10, + 12 => 12, + 13 => 13, + 14 => 14, + 15 => 15, + 16 => 16, + 17 => 17, + 18 => 18, + 19 => 19, + 20 => 20, + 21 => 21, + 25 => 25, + 26 => 26, + 27 => 27, + 28 => 28, + 29 => 29, + 30 => 30, + 31 => 31, + 32 => 32, + 34 => 32, + 33 => 33, + 35 => 35, + 36 => 36, + 38 => 38, + 39 => 39, + 40 => 40, + 41 => 41, + 42 => 42, + 43 => 43, + 44 => 44, + 45 => 45, + 46 => 46, + 47 => 47, + 48 => 48, + 49 => 49, + 50 => 50, + 51 => 51, + 60 => 51, + 149 => 51, + 153 => 51, + 157 => 51, + 158 => 51, + 52 => 52, + 150 => 52, + 156 => 52, + 53 => 53, + 54 => 54, + 55 => 54, + 56 => 56, + 134 => 56, + 59 => 59, + 61 => 61, + 62 => 62, + 63 => 62, + 64 => 64, + 65 => 65, + 68 => 68, + 69 => 69, + 70 => 69, + 72 => 72, + 99 => 72, + 73 => 73, + 74 => 74, + 75 => 75, + 76 => 76, + 77 => 77, + 78 => 78, + 79 => 79, + 81 => 81, + 83 => 81, + 84 => 81, + 114 => 81, + 82 => 82, + 87 => 87, + 88 => 88, + 89 => 89, + 90 => 90, + 92 => 92, + 93 => 93, + 94 => 93, + 97 => 97, + 98 => 98, + 101 => 101, + 103 => 103, + 104 => 104, + 105 => 105, + 106 => 106, + 108 => 108, + 109 => 109, + 110 => 110, + 111 => 111, + 112 => 112, + 113 => 113, + 115 => 115, + 171 => 115, + 116 => 116, + 117 => 117, + 118 => 118, + 119 => 119, + 120 => 120, + 121 => 121, + 129 => 121, + 122 => 122, + 123 => 123, + 124 => 124, + 125 => 124, + 127 => 124, + 128 => 124, + 126 => 126, + 130 => 130, + 131 => 131, + 132 => 132, + 175 => 132, + 133 => 133, + 135 => 135, + 136 => 136, + 137 => 137, + 138 => 138, + 139 => 139, + 140 => 140, + 141 => 141, + 142 => 142, + 143 => 143, + 144 => 144, + 145 => 145, + 146 => 146, + 147 => 147, + 148 => 148, + 151 => 151, + 152 => 152, + 154 => 154, + 155 => 155, + 159 => 159, + 160 => 160, + 161 => 161, + 162 => 162, + 163 => 163, + 164 => 164, + 165 => 165, + 166 => 166, + 167 => 167, + 168 => 168, + 170 => 170, + 172 => 172, + 173 => 173, + 176 => 176, + 177 => 177, + 178 => 178, + 179 => 179, + 182 => 179, + 180 => 180, + 183 => 180, + 181 => 181, + 184 => 184, + 185 => 185, + ); /* Index of top element in stack */ + private $_retvalue; /* Shifts left before out of the error */ /** * constructor @@ -227,7 +1661,7 @@ class Smarty_Internal_Templateparser $this->smarty = $this->template->smarty; $this->security = isset($this->smarty->security_policy) ? $this->smarty->security_policy : false; $this->current_buffer = $this->root_buffer = new Smarty_Internal_ParseTree_Template(); - } + } /* The parser's stack */ /** * insert PHP code in current buffer @@ -240,6 +1674,20 @@ class Smarty_Internal_Templateparser } /** + * error rundown + * + */ + public function errorRunDown() + { + while ($this->yystack !== array()) { + $this->yy_pop_parser_stack(); + } + if (is_resource($this->yyTraceFILE)) { + fclose($this->yyTraceFILE); + } + } + + /** * merge PHP code with prefix code and return parse tree tag object * * @param string $code @@ -257,637 +1705,11 @@ class Smarty_Internal_Templateparser return new Smarty_Internal_ParseTree_Tag($this, $this->compiler->processNocacheCode($tmp, true)); } - const TP_VERT = 1; - - const TP_COLON = 2; - - const TP_PHP = 3; - - const TP_TEXT = 4; - - const TP_STRIPON = 5; - - const TP_STRIPOFF = 6; - - const TP_LITERALSTART = 7; - - const TP_LITERALEND = 8; - - const TP_LITERAL = 9; - - const TP_RDEL = 10; - - const TP_SIMPELOUTPUT = 11; - - const TP_LDEL = 12; - - const TP_DOLLARID = 13; - - const TP_EQUAL = 14; - - const TP_SIMPLETAG = 15; - - const TP_ID = 16; - - const TP_PTR = 17; - - const TP_LDELMAKENOCACHE = 18; - - const TP_LDELIF = 19; - - const TP_LDELFOR = 20; - - const TP_SEMICOLON = 21; - - const TP_INCDEC = 22; - - const TP_TO = 23; - - const TP_STEP = 24; - - const TP_LDELFOREACH = 25; - - const TP_SPACE = 26; - - const TP_AS = 27; - - const TP_APTR = 28; - - const TP_LDELSETFILTER = 29; - - const TP_SMARTYBLOCKCHILDPARENT = 30; - - const TP_CLOSETAG = 31; - - const TP_LDELSLASH = 32; - - const TP_ATTR = 33; - - const TP_INTEGER = 34; - - const TP_COMMA = 35; - - const TP_OPENP = 36; - - const TP_CLOSEP = 37; - - const TP_MATH = 38; - - const TP_UNIMATH = 39; - - const TP_ISIN = 40; - - const TP_QMARK = 41; - - const TP_NOT = 42; - - const TP_TYPECAST = 43; - - const TP_HEX = 44; - - const TP_DOT = 45; - - const TP_INSTANCEOF = 46; - - const TP_SINGLEQUOTESTRING = 47; - - const TP_DOUBLECOLON = 48; - - const TP_NAMESPACE = 49; - - const TP_AT = 50; - - const TP_HATCH = 51; - - const TP_OPENB = 52; - - const TP_CLOSEB = 53; - - const TP_DOLLAR = 54; - - const TP_LOGOP = 55; - - const TP_SLOGOP = 56; - - const TP_TLOGOP = 57; - - const TP_SINGLECOND = 58; - - const TP_QUOTE = 59; - - const TP_BACKTICK = 60; - - const YY_NO_ACTION = 532; - - const YY_ACCEPT_ACTION = 531; - - const YY_ERROR_ACTION = 530; - - const YY_SZ_ACTTAB = 2114; - - static public $yy_action = array(268, 8, 132, 210, 245, 197, 183, 228, 7, 84, 176, 264, 275, 302, 112, 44, 36, 278, - 233, 136, 305, 221, 281, 203, 237, 26, 234, 202, 41, 104, 189, 39, 42, 256, 213, - 216, 224, 78, 207, 129, 82, 1, 316, 297, 102, 268, 8, 133, 79, 245, 80, 302, 228, - 7, 84, 330, 299, 82, 272, 112, 297, 273, 325, 233, 285, 305, 221, 214, 231, 34, 26, - 3, 101, 41, 230, 78, 39, 42, 256, 213, 35, 239, 314, 207, 300, 82, 1, 13, 297, 333, - 268, 8, 135, 79, 245, 201, 302, 228, 7, 84, 35, 85, 322, 109, 112, 29, 196, 13, - 233, 269, 305, 221, 237, 231, 249, 26, 136, 104, 41, 219, 78, 39, 42, 256, 213, - 459, 239, 267, 207, 355, 82, 1, 459, 297, 446, 268, 8, 135, 79, 245, 193, 302, 228, - 7, 84, 35, 446, 297, 28, 112, 247, 263, 13, 233, 82, 305, 221, 297, 231, 309, 26, - 185, 292, 41, 298, 78, 39, 42, 256, 213, 27, 239, 237, 207, 232, 82, 1, 104, 297, - 459, 268, 8, 135, 79, 245, 195, 459, 228, 7, 84, 446, 297, 283, 11, 112, 25, 188, - 282, 233, 236, 305, 221, 446, 204, 294, 26, 32, 318, 41, 90, 210, 39, 42, 256, 213, - 174, 239, 137, 207, 402, 82, 1, 210, 297, 9, 268, 8, 136, 79, 245, 201, 223, 228, - 7, 84, 402, 142, 235, 225, 112, 22, 227, 402, 233, 166, 305, 221, 35, 231, 27, 33, - 210, 101, 41, 13, 210, 39, 42, 256, 213, 361, 239, 302, 207, 399, 82, 1, 210, 297, - 101, 268, 8, 135, 79, 245, 201, 402, 228, 7, 84, 399, 235, 297, 109, 112, 447, 78, - 399, 233, 319, 305, 221, 402, 194, 172, 26, 279, 447, 41, 402, 307, 39, 42, 256, - 213, 182, 239, 16, 207, 296, 82, 1, 210, 297, 101, 268, 8, 131, 79, 245, 201, 357, - 228, 7, 84, 283, 11, 475, 475, 112, 282, 303, 475, 233, 24, 305, 221, 35, 231, 175, - 4, 279, 271, 41, 13, 109, 39, 42, 256, 213, 181, 239, 178, 207, 12, 82, 1, 16, 297, - 274, 268, 8, 135, 79, 245, 200, 475, 228, 7, 84, 475, 475, 283, 11, 112, 475, 189, - 282, 233, 210, 305, 221, 20, 231, 38, 26, 179, 292, 41, 148, 446, 39, 42, 256, 213, - 229, 239, 180, 207, 332, 82, 1, 446, 297, 190, 268, 8, 134, 79, 245, 201, 215, 228, - 7, 84, 168, 16, 188, 243, 112, 104, 189, 303, 233, 140, 305, 221, 325, 231, 255, - 26, 177, 214, 41, 218, 312, 39, 42, 256, 213, 277, 239, 128, 207, 101, 82, 1, 92, - 297, 2, 268, 8, 136, 79, 245, 201, 23, 228, 7, 84, 210, 108, 251, 184, 112, 297, - 304, 289, 233, 367, 305, 221, 137, 231, 315, 33, 220, 5, 41, 9, 5, 39, 42, 256, - 213, 35, 239, 189, 207, 113, 82, 311, 13, 297, 106, 446, 214, 212, 79, 116, 72, - 114, 258, 260, 261, 222, 102, 446, 214, 257, 280, 187, 308, 334, 270, 206, 242, - 152, 299, 210, 128, 83, 262, 250, 252, 253, 176, 332, 211, 329, 268, 8, 151, 143, - 245, 189, 178, 228, 7, 84, 210, 265, 332, 332, 112, 188, 21, 311, 233, 153, 305, - 221, 214, 212, 17, 122, 67, 114, 164, 141, 189, 13, 102, 149, 266, 257, 280, 183, - 332, 332, 270, 206, 242, 332, 299, 295, 44, 36, 278, 235, 311, 208, 279, 145, 169, - 214, 212, 91, 122, 67, 114, 189, 320, 332, 167, 102, 146, 139, 257, 280, 94, 171, - 159, 270, 206, 242, 332, 299, 210, 38, 311, 189, 332, 155, 209, 214, 212, 317, 122, - 53, 107, 123, 232, 332, 189, 102, 291, 400, 257, 280, 6, 217, 276, 270, 206, 242, - 311, 299, 297, 158, 313, 214, 212, 400, 122, 49, 107, 154, 117, 332, 400, 102, 30, - 446, 257, 280, 248, 332, 173, 270, 206, 242, 279, 299, 324, 446, 186, 292, 332, 95, - 279, 268, 10, 326, 170, 245, 88, 87, 228, 7, 84, 279, 138, 89, 279, 112, 86, 309, - 311, 233, 115, 305, 221, 214, 212, 254, 122, 67, 114, 105, 303, 163, 165, 102, 303, - 93, 257, 280, 303, 303, 303, 270, 206, 242, 303, 299, 303, 303, 303, 286, 19, 311, - 205, 303, 303, 303, 214, 212, 303, 116, 72, 114, 303, 43, 40, 37, 102, 303, 303, - 257, 280, 303, 303, 303, 270, 206, 242, 303, 299, 324, 327, 323, 288, 287, 303, - 303, 268, 10, 326, 331, 245, 303, 303, 228, 7, 84, 303, 303, 303, 303, 112, 303, - 303, 311, 233, 303, 305, 221, 214, 212, 303, 122, 70, 114, 303, 303, 303, 303, 102, - 303, 303, 257, 280, 303, 283, 11, 270, 206, 242, 282, 299, 303, 311, 303, 290, 19, - 303, 214, 212, 35, 122, 54, 114, 303, 303, 303, 13, 102, 162, 303, 257, 280, 183, - 303, 303, 270, 206, 242, 332, 299, 311, 44, 36, 278, 303, 214, 212, 303, 122, 68, - 114, 303, 303, 303, 303, 102, 189, 303, 257, 280, 303, 303, 303, 270, 206, 242, - 303, 299, 311, 303, 303, 303, 303, 214, 212, 303, 100, 73, 114, 303, 303, 303, 303, - 102, 303, 303, 257, 280, 303, 303, 303, 270, 206, 242, 303, 299, 311, 303, 303, - 303, 303, 214, 212, 303, 122, 77, 114, 303, 303, 303, 303, 102, 147, 303, 257, 280, - 183, 303, 303, 270, 206, 242, 332, 299, 311, 44, 36, 278, 303, 214, 212, 303, 122, - 76, 114, 303, 303, 303, 303, 102, 189, 303, 257, 280, 303, 303, 303, 270, 206, 242, - 303, 299, 311, 303, 303, 303, 303, 214, 212, 303, 99, 71, 114, 303, 303, 303, 303, - 102, 161, 303, 257, 280, 183, 303, 303, 270, 206, 242, 332, 299, 311, 44, 36, 278, - 303, 214, 212, 303, 122, 47, 114, 303, 303, 303, 303, 102, 189, 303, 257, 280, 303, - 303, 303, 270, 206, 242, 303, 299, 311, 303, 303, 303, 303, 214, 212, 303, 122, 59, - 114, 303, 303, 303, 303, 102, 150, 303, 257, 280, 183, 303, 303, 270, 206, 242, - 332, 299, 311, 44, 36, 278, 303, 214, 198, 303, 118, 55, 114, 303, 303, 303, 303, - 102, 189, 303, 257, 280, 303, 303, 303, 270, 206, 242, 303, 299, 311, 303, 303, - 303, 303, 214, 212, 303, 122, 69, 114, 303, 303, 303, 303, 102, 160, 303, 257, 280, - 183, 303, 303, 270, 206, 242, 332, 299, 311, 44, 36, 278, 303, 214, 97, 303, 81, - 48, 103, 303, 303, 303, 303, 102, 189, 303, 257, 280, 303, 303, 303, 270, 206, 242, - 303, 299, 311, 303, 303, 303, 303, 214, 212, 303, 122, 57, 114, 303, 303, 303, 303, - 102, 303, 303, 257, 280, 303, 303, 303, 270, 206, 242, 303, 299, 311, 303, 303, - 303, 303, 214, 212, 303, 122, 65, 114, 303, 303, 303, 303, 102, 303, 303, 257, 280, - 303, 303, 303, 270, 206, 242, 303, 299, 311, 303, 303, 303, 303, 214, 96, 303, 81, - 46, 103, 303, 303, 303, 303, 102, 303, 303, 257, 280, 303, 303, 303, 270, 206, 242, - 303, 299, 311, 303, 303, 303, 303, 214, 212, 303, 111, 50, 114, 303, 303, 303, 303, - 102, 303, 303, 257, 280, 303, 303, 303, 270, 206, 242, 303, 299, 311, 303, 303, - 303, 303, 214, 212, 303, 98, 61, 114, 303, 303, 303, 303, 102, 303, 303, 257, 280, - 303, 303, 303, 270, 206, 242, 303, 299, 311, 303, 303, 303, 303, 214, 199, 303, - 122, 56, 114, 303, 303, 303, 303, 102, 303, 303, 257, 280, 303, 303, 303, 270, 206, - 242, 303, 299, 311, 303, 303, 303, 303, 214, 212, 303, 122, 51, 114, 303, 303, 303, - 303, 102, 303, 303, 257, 280, 303, 303, 303, 270, 206, 242, 303, 299, 311, 303, - 303, 303, 303, 214, 212, 303, 122, 58, 114, 303, 303, 303, 303, 102, 303, 303, 257, - 280, 303, 303, 303, 270, 206, 242, 303, 299, 311, 303, 303, 303, 303, 214, 212, - 303, 122, 74, 114, 303, 303, 303, 303, 102, 303, 303, 257, 280, 303, 303, 303, 270, - 206, 242, 303, 299, 311, 303, 303, 303, 303, 214, 212, 303, 122, 62, 114, 303, 303, - 303, 303, 102, 303, 303, 257, 280, 303, 303, 303, 270, 206, 242, 303, 299, 311, - 303, 303, 303, 303, 214, 212, 303, 122, 60, 114, 303, 303, 303, 303, 102, 303, 303, - 257, 280, 303, 303, 303, 270, 206, 242, 303, 299, 311, 303, 303, 303, 303, 214, - 212, 303, 122, 45, 114, 303, 303, 303, 303, 102, 303, 303, 257, 280, 303, 303, 303, - 270, 206, 242, 303, 299, 311, 303, 303, 303, 303, 214, 212, 303, 122, 64, 114, 303, - 303, 303, 303, 102, 303, 303, 257, 280, 303, 303, 303, 270, 206, 242, 303, 299, - 311, 303, 303, 303, 303, 214, 212, 303, 122, 75, 114, 303, 303, 303, 303, 102, 303, - 303, 257, 280, 303, 303, 303, 270, 206, 242, 303, 299, 311, 303, 303, 303, 303, - 214, 212, 303, 122, 63, 114, 303, 303, 303, 303, 102, 303, 303, 257, 280, 303, 303, - 303, 270, 206, 242, 303, 299, 311, 303, 303, 303, 303, 214, 212, 303, 122, 66, 114, - 303, 303, 303, 303, 102, 303, 303, 257, 280, 303, 412, 412, 270, 206, 242, 303, - 299, 311, 303, 303, 303, 303, 214, 212, 303, 122, 53, 114, 303, 303, 303, 303, 102, - 303, 303, 257, 280, 210, 303, 303, 270, 206, 242, 303, 299, 446, 301, 412, 412, - 412, 303, 531, 52, 259, 260, 261, 222, 446, 303, 214, 303, 303, 35, 303, 412, 412, - 412, 412, 303, 13, 303, 303, 303, 303, 43, 40, 37, 210, 303, 303, 311, 303, 303, - 303, 303, 214, 212, 210, 130, 303, 114, 327, 323, 288, 287, 102, 303, 303, 303, - 241, 31, 303, 35, 270, 206, 242, 303, 299, 303, 13, 303, 303, 35, 303, 43, 40, 37, - 303, 303, 13, 303, 303, 303, 303, 43, 40, 37, 303, 303, 303, 311, 327, 323, 288, - 287, 214, 212, 210, 124, 303, 114, 327, 323, 288, 287, 102, 192, 303, 303, 310, - 303, 303, 303, 270, 206, 242, 311, 299, 226, 303, 303, 214, 212, 303, 120, 303, - 114, 475, 475, 303, 28, 102, 475, 459, 43, 40, 37, 303, 303, 270, 206, 242, 303, - 299, 303, 303, 303, 303, 303, 303, 311, 327, 323, 288, 287, 214, 212, 303, 126, - 303, 114, 459, 303, 303, 459, 102, 475, 303, 459, 226, 303, 303, 303, 270, 206, - 242, 303, 299, 475, 475, 226, 18, 303, 475, 459, 303, 303, 303, 303, 475, 475, 303, - 303, 226, 475, 459, 283, 11, 303, 303, 303, 282, 475, 475, 303, 303, 303, 475, 459, - 303, 303, 35, 459, 144, 303, 459, 303, 475, 13, 459, 303, 303, 303, 459, 303, 303, - 459, 311, 475, 303, 459, 321, 214, 212, 303, 119, 459, 114, 303, 459, 303, 475, - 102, 459, 303, 303, 303, 303, 303, 303, 270, 206, 242, 303, 299, 311, 210, 14, 303, - 303, 214, 212, 303, 127, 303, 114, 303, 284, 303, 303, 102, 129, 303, 303, 303, - 303, 102, 303, 270, 206, 242, 311, 299, 210, 303, 293, 214, 212, 299, 121, 303, - 114, 311, 43, 40, 37, 102, 214, 212, 303, 125, 303, 114, 303, 270, 206, 242, 102, - 299, 156, 327, 323, 288, 287, 210, 270, 206, 242, 210, 299, 43, 40, 37, 210, 303, - 303, 303, 244, 303, 303, 303, 303, 303, 303, 110, 303, 303, 327, 323, 288, 287, - 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 43, 40, 37, 210, 43, 40, 37, 210, - 303, 43, 40, 37, 240, 210, 303, 303, 191, 327, 323, 288, 287, 327, 323, 288, 287, - 303, 327, 323, 288, 287, 303, 306, 303, 303, 303, 303, 303, 303, 303, 303, 43, 40, - 37, 303, 43, 40, 37, 210, 303, 238, 43, 40, 37, 303, 303, 303, 303, 327, 323, 288, - 287, 327, 323, 288, 287, 15, 303, 327, 323, 288, 287, 303, 303, 303, 475, 475, 303, - 303, 303, 475, 459, 210, 303, 246, 43, 40, 37, 210, 303, 303, 303, 303, 303, 475, - 475, 283, 11, 303, 475, 459, 282, 327, 323, 288, 287, 303, 303, 303, 459, 303, 35, - 459, 157, 475, 303, 459, 303, 13, 43, 40, 37, 303, 303, 303, 43, 40, 37, 459, 303, - 303, 459, 303, 475, 328, 459, 327, 323, 288, 287, 303, 303, 327, 323, 288, 287, - 303, 406, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 406, 303, 406, 303, - 303, 406, 303, 303, 303, 303, 303, 303, 406, 303, 406, 303, 406, 303, 303, 303, - 303, 303, 303, 303, 235,); - - static public $yy_lookahead = array(11, 12, 13, 1, 15, 16, 76, 18, 19, 20, 7, 8, 9, 22, 25, 85, 86, 87, 29, 13, 31, - 32, 16, 34, 75, 36, 77, 78, 39, 80, 100, 42, 43, 44, 45, 71, 47, 46, 49, 75, 51, - 52, 53, 54, 80, 11, 12, 13, 59, 15, 16, 22, 18, 19, 20, 49, 92, 51, 66, 25, 54, - 69, 65, 29, 30, 31, 32, 70, 34, 14, 36, 35, 17, 39, 16, 46, 42, 43, 44, 45, 26, - 47, 53, 49, 10, 51, 52, 33, 54, 53, 11, 12, 13, 59, 15, 16, 22, 18, 19, 20, 26, - 104, 105, 48, 25, 12, 13, 33, 29, 16, 31, 32, 75, 34, 77, 36, 13, 80, 39, 16, - 46, 42, 43, 44, 45, 45, 47, 34, 49, 10, 51, 52, 52, 54, 36, 11, 12, 13, 59, 15, - 16, 22, 18, 19, 20, 26, 48, 54, 14, 25, 13, 34, 33, 29, 51, 31, 32, 54, 34, 94, - 36, 96, 97, 39, 97, 46, 42, 43, 44, 45, 14, 47, 75, 49, 77, 51, 52, 80, 54, 45, - 11, 12, 13, 59, 15, 16, 52, 18, 19, 20, 36, 54, 11, 12, 25, 21, 100, 16, 29, 45, - 31, 32, 48, 34, 16, 36, 14, 53, 39, 35, 1, 42, 43, 44, 45, 93, 47, 45, 49, 10, - 51, 52, 1, 54, 52, 11, 12, 13, 59, 15, 16, 50, 18, 19, 20, 26, 27, 45, 50, 25, - 12, 13, 33, 29, 16, 31, 32, 26, 34, 14, 36, 1, 17, 39, 33, 1, 42, 43, 44, 45, - 10, 47, 22, 49, 10, 51, 52, 1, 54, 17, 11, 12, 13, 59, 15, 16, 10, 18, 19, 20, - 26, 45, 54, 48, 25, 36, 46, 33, 29, 53, 31, 32, 26, 34, 93, 36, 95, 48, 39, 33, - 60, 42, 43, 44, 45, 81, 47, 35, 49, 37, 51, 52, 1, 54, 17, 11, 12, 13, 59, 15, - 16, 10, 18, 19, 20, 11, 12, 11, 12, 25, 16, 101, 16, 29, 14, 31, 32, 26, 34, 93, - 36, 95, 22, 39, 33, 48, 42, 43, 44, 45, 81, 47, 76, 49, 41, 51, 52, 35, 54, 37, - 11, 12, 13, 59, 15, 16, 50, 18, 19, 20, 11, 12, 11, 12, 25, 16, 100, 16, 29, 1, - 31, 32, 28, 34, 2, 36, 96, 97, 39, 72, 36, 42, 43, 44, 45, 17, 47, 76, 49, 82, - 51, 52, 48, 54, 16, 11, 12, 13, 59, 15, 16, 50, 18, 19, 20, 75, 35, 100, 37, 25, - 80, 100, 101, 29, 13, 31, 32, 65, 34, 37, 36, 13, 70, 39, 16, 91, 42, 43, 44, - 45, 16, 47, 98, 49, 17, 51, 52, 36, 54, 36, 11, 12, 13, 59, 15, 16, 12, 18, 19, - 20, 1, 48, 4, 76, 25, 54, 16, 105, 29, 10, 31, 32, 45, 34, 53, 36, 17, 36, 39, - 52, 36, 42, 43, 44, 45, 26, 47, 100, 49, 16, 51, 65, 33, 54, 80, 36, 70, 71, 59, - 73, 74, 75, 64, 65, 66, 67, 80, 48, 70, 83, 84, 76, 98, 91, 88, 89, 90, 72, 92, - 1, 98, 16, 3, 4, 5, 6, 7, 82, 102, 103, 11, 12, 72, 72, 15, 100, 76, 18, 19, 20, - 1, 16, 82, 82, 25, 100, 28, 65, 29, 51, 31, 32, 70, 71, 26, 73, 74, 75, 72, 72, - 100, 33, 80, 72, 10, 83, 84, 76, 82, 82, 88, 89, 90, 82, 92, 16, 85, 86, 87, 45, - 65, 99, 95, 72, 51, 70, 71, 76, 73, 74, 75, 100, 53, 82, 93, 80, 72, 13, 83, 84, - 76, 93, 72, 88, 89, 90, 82, 92, 1, 2, 65, 100, 82, 72, 99, 70, 71, 53, 73, 74, - 75, 16, 77, 82, 100, 80, 16, 10, 83, 84, 36, 14, 34, 88, 89, 90, 65, 92, 54, 72, - 13, 70, 71, 26, 73, 74, 75, 72, 77, 82, 33, 80, 23, 36, 83, 84, 82, 82, 72, 88, - 89, 90, 95, 92, 4, 48, 96, 97, 82, 81, 95, 11, 12, 13, 93, 15, 80, 80, 18, 19, - 20, 95, 80, 80, 95, 25, 80, 94, 65, 29, 79, 31, 32, 70, 71, 8, 73, 74, 75, 68, - 106, 93, 93, 80, 106, 93, 83, 84, 106, 106, 106, 88, 89, 90, 106, 92, 106, 106, - 106, 59, 60, 65, 99, 106, 106, 106, 70, 71, 106, 73, 74, 75, 106, 38, 39, 40, - 80, 106, 106, 83, 84, 106, 106, 106, 88, 89, 90, 106, 92, 4, 55, 56, 57, 58, - 106, 106, 11, 12, 13, 103, 15, 106, 106, 18, 19, 20, 106, 106, 106, 106, 25, - 106, 106, 65, 29, 106, 31, 32, 70, 71, 106, 73, 74, 75, 106, 106, 106, 106, 80, - 106, 106, 83, 84, 106, 11, 12, 88, 89, 90, 16, 92, 106, 65, 106, 59, 60, 106, - 70, 71, 26, 73, 74, 75, 106, 106, 106, 33, 80, 72, 106, 83, 84, 76, 106, 106, - 88, 89, 90, 82, 92, 65, 85, 86, 87, 106, 70, 71, 106, 73, 74, 75, 106, 106, 106, - 106, 80, 100, 106, 83, 84, 106, 106, 106, 88, 89, 90, 106, 92, 65, 106, 106, - 106, 106, 70, 71, 106, 73, 74, 75, 106, 106, 106, 106, 80, 106, 106, 83, 84, - 106, 106, 106, 88, 89, 90, 106, 92, 65, 106, 106, 106, 106, 70, 71, 106, 73, 74, - 75, 106, 106, 106, 106, 80, 72, 106, 83, 84, 76, 106, 106, 88, 89, 90, 82, 92, - 65, 85, 86, 87, 106, 70, 71, 106, 73, 74, 75, 106, 106, 106, 106, 80, 100, 106, - 83, 84, 106, 106, 106, 88, 89, 90, 106, 92, 65, 106, 106, 106, 106, 70, 71, 106, - 73, 74, 75, 106, 106, 106, 106, 80, 72, 106, 83, 84, 76, 106, 106, 88, 89, 90, - 82, 92, 65, 85, 86, 87, 106, 70, 71, 106, 73, 74, 75, 106, 106, 106, 106, 80, - 100, 106, 83, 84, 106, 106, 106, 88, 89, 90, 106, 92, 65, 106, 106, 106, 106, - 70, 71, 106, 73, 74, 75, 106, 106, 106, 106, 80, 72, 106, 83, 84, 76, 106, 106, - 88, 89, 90, 82, 92, 65, 85, 86, 87, 106, 70, 71, 106, 73, 74, 75, 106, 106, 106, - 106, 80, 100, 106, 83, 84, 106, 106, 106, 88, 89, 90, 106, 92, 65, 106, 106, - 106, 106, 70, 71, 106, 73, 74, 75, 106, 106, 106, 106, 80, 72, 106, 83, 84, 76, - 106, 106, 88, 89, 90, 82, 92, 65, 85, 86, 87, 106, 70, 71, 106, 73, 74, 75, 106, - 106, 106, 106, 80, 100, 106, 83, 84, 106, 106, 106, 88, 89, 90, 106, 92, 65, - 106, 106, 106, 106, 70, 71, 106, 73, 74, 75, 106, 106, 106, 106, 80, 106, 106, - 83, 84, 106, 106, 106, 88, 89, 90, 106, 92, 65, 106, 106, 106, 106, 70, 71, 106, - 73, 74, 75, 106, 106, 106, 106, 80, 106, 106, 83, 84, 106, 106, 106, 88, 89, 90, - 106, 92, 65, 106, 106, 106, 106, 70, 71, 106, 73, 74, 75, 106, 106, 106, 106, - 80, 106, 106, 83, 84, 106, 106, 106, 88, 89, 90, 106, 92, 65, 106, 106, 106, - 106, 70, 71, 106, 73, 74, 75, 106, 106, 106, 106, 80, 106, 106, 83, 84, 106, - 106, 106, 88, 89, 90, 106, 92, 65, 106, 106, 106, 106, 70, 71, 106, 73, 74, 75, - 106, 106, 106, 106, 80, 106, 106, 83, 84, 106, 106, 106, 88, 89, 90, 106, 92, - 65, 106, 106, 106, 106, 70, 71, 106, 73, 74, 75, 106, 106, 106, 106, 80, 106, - 106, 83, 84, 106, 106, 106, 88, 89, 90, 106, 92, 65, 106, 106, 106, 106, 70, 71, - 106, 73, 74, 75, 106, 106, 106, 106, 80, 106, 106, 83, 84, 106, 106, 106, 88, - 89, 90, 106, 92, 65, 106, 106, 106, 106, 70, 71, 106, 73, 74, 75, 106, 106, 106, - 106, 80, 106, 106, 83, 84, 106, 106, 106, 88, 89, 90, 106, 92, 65, 106, 106, - 106, 106, 70, 71, 106, 73, 74, 75, 106, 106, 106, 106, 80, 106, 106, 83, 84, - 106, 106, 106, 88, 89, 90, 106, 92, 65, 106, 106, 106, 106, 70, 71, 106, 73, 74, - 75, 106, 106, 106, 106, 80, 106, 106, 83, 84, 106, 106, 106, 88, 89, 90, 106, - 92, 65, 106, 106, 106, 106, 70, 71, 106, 73, 74, 75, 106, 106, 106, 106, 80, - 106, 106, 83, 84, 106, 106, 106, 88, 89, 90, 106, 92, 65, 106, 106, 106, 106, - 70, 71, 106, 73, 74, 75, 106, 106, 106, 106, 80, 106, 106, 83, 84, 106, 106, - 106, 88, 89, 90, 106, 92, 65, 106, 106, 106, 106, 70, 71, 106, 73, 74, 75, 106, - 106, 106, 106, 80, 106, 106, 83, 84, 106, 106, 106, 88, 89, 90, 106, 92, 65, - 106, 106, 106, 106, 70, 71, 106, 73, 74, 75, 106, 106, 106, 106, 80, 106, 106, - 83, 84, 106, 106, 106, 88, 89, 90, 106, 92, 65, 106, 106, 106, 106, 70, 71, 106, - 73, 74, 75, 106, 106, 106, 106, 80, 106, 106, 83, 84, 106, 106, 106, 88, 89, 90, - 106, 92, 65, 106, 106, 106, 106, 70, 71, 106, 73, 74, 75, 106, 106, 106, 106, - 80, 106, 106, 83, 84, 106, 1, 2, 88, 89, 90, 106, 92, 65, 106, 106, 106, 106, - 70, 71, 106, 73, 74, 75, 106, 106, 106, 106, 80, 106, 106, 83, 84, 1, 106, 106, - 88, 89, 90, 106, 92, 36, 10, 38, 39, 40, 106, 62, 63, 64, 65, 66, 67, 48, 106, - 70, 106, 106, 26, 106, 55, 56, 57, 58, 106, 33, 106, 106, 106, 106, 38, 39, 40, - 1, 106, 106, 65, 106, 106, 106, 106, 70, 71, 1, 73, 106, 75, 55, 56, 57, 58, 80, - 106, 106, 106, 84, 24, 106, 26, 88, 89, 90, 106, 92, 106, 33, 106, 106, 26, 106, - 38, 39, 40, 106, 106, 33, 106, 106, 106, 106, 38, 39, 40, 106, 106, 106, 65, 55, - 56, 57, 58, 70, 71, 1, 73, 106, 75, 55, 56, 57, 58, 80, 10, 106, 106, 84, 106, - 106, 106, 88, 89, 90, 65, 92, 2, 106, 106, 70, 71, 106, 73, 106, 75, 11, 12, - 106, 14, 80, 16, 17, 38, 39, 40, 106, 106, 88, 89, 90, 106, 92, 106, 106, 106, - 106, 106, 106, 65, 55, 56, 57, 58, 70, 71, 106, 73, 106, 75, 45, 106, 106, 48, - 80, 50, 106, 52, 2, 106, 106, 106, 88, 89, 90, 106, 92, 11, 12, 2, 14, 106, 16, - 17, 106, 106, 106, 106, 11, 12, 106, 106, 2, 16, 17, 11, 12, 106, 106, 106, 16, - 11, 12, 106, 106, 106, 16, 17, 106, 106, 26, 45, 28, 106, 48, 106, 50, 33, 52, - 106, 106, 106, 45, 106, 106, 48, 65, 50, 106, 52, 53, 70, 71, 106, 73, 45, 75, - 106, 48, 106, 50, 80, 52, 106, 106, 106, 106, 106, 106, 88, 89, 90, 106, 92, 65, - 1, 2, 106, 106, 70, 71, 106, 73, 106, 75, 106, 71, 106, 106, 80, 75, 106, 106, - 106, 106, 80, 106, 88, 89, 90, 65, 92, 1, 106, 89, 70, 71, 92, 73, 106, 75, 65, - 38, 39, 40, 80, 70, 71, 106, 73, 106, 75, 106, 88, 89, 90, 80, 92, 27, 55, 56, - 57, 58, 1, 88, 89, 90, 1, 92, 38, 39, 40, 1, 106, 106, 106, 10, 106, 106, 106, - 106, 106, 106, 21, 106, 106, 55, 56, 57, 58, 106, 106, 106, 106, 106, 106, 106, - 106, 106, 106, 38, 39, 40, 1, 38, 39, 40, 1, 106, 38, 39, 40, 10, 1, 106, 106, - 10, 55, 56, 57, 58, 55, 56, 57, 58, 106, 55, 56, 57, 58, 106, 60, 106, 106, 106, - 106, 106, 106, 106, 106, 38, 39, 40, 106, 38, 39, 40, 1, 106, 37, 38, 39, 40, - 106, 106, 106, 106, 55, 56, 57, 58, 55, 56, 57, 58, 2, 106, 55, 56, 57, 58, 106, - 106, 106, 11, 12, 106, 106, 106, 16, 17, 1, 106, 37, 38, 39, 40, 1, 106, 106, - 106, 106, 106, 11, 12, 11, 12, 106, 16, 17, 16, 55, 56, 57, 58, 106, 106, 106, - 45, 106, 26, 48, 28, 50, 106, 52, 106, 33, 38, 39, 40, 106, 106, 106, 38, 39, - 40, 45, 106, 106, 48, 106, 50, 53, 52, 55, 56, 57, 58, 106, 106, 55, 56, 57, 58, - 106, 10, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 21, 106, 23, 106, - 106, 26, 106, 106, 106, 106, 106, 106, 33, 106, 35, 106, 37, 106, 106, 106, 106, - 106, 106, 106, 45,); - - const YY_SHIFT_USE_DFLT = - 12; - - const YY_SHIFT_MAX = 238; - - static public $yy_shift_ofst = array(519, 349, 79, 349, 304, 79, 79, 304, 34, - 11, 34, 79, 394, 79, 79, 124, 79, - 169, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 259, 79, 79, 79, 79, 79, 79, 169, - 79, 214, 214, 439, 439, 439, 439, 439, 439, 1617, 1577, 1627, 1627, 1627, 1627, - 1627, 519, 1944, 1978, 2012, 1903, 1938, 1677, 1836, 1934, 1863, 1898, 1894, - 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 695, - 695, 6, 660, 459, 311, 103, 221, 411, 745, 1766, 2016, 783, 783, 411, 221, 411, - 427, 221, 607, 74, 119, 209, 266, 254, 228, 181, 55, 314, 3, 314, 235, 418, - 418, 584, 250, 528, 378, 297, 54, 518, 54, 539, 2, 2, 2, 2, 2, 2, 2, 2, 2, 252, - 252, - 12, 1697, 1759, 1748, 1995, 1772, 2014, 93, 361, 359, 134, 54, 137, 54, - 137, 54, 54, 54, 54, 54, 54, 54, 54, 80, 54, 54, 137, 137, 54, 54, 54, 54, 54, - 172, 54, 172, 444, 172, 320, 80, 172, 172, 172, 54, 172, 172, 687, 594, 2, 252, - 2, 382, 382, 2, 2, 252, 252, 2, - 12, - 12, - 12, - 12, - 12, 1550, 2068, 617, - 316, 154, 29, 240, 354, 98, 174, 236, 192, 272, 413, 249, 322, 381, 188, 36, - - 9, 598, 554, 424, 533, 525, 441, 498, 505, 473, 458, 450, 421, 559, 610, 594, - 627, 605, 564, 534, 392, 388, 629, 117, 58, 156, 313,); - - const YY_REDUCE_USE_DFLT = - 71; - - const YY_REDUCE_MAX = 192; - - static public $yy_reduce_ofst = array(1530, 426, 482, 656, 545, 515, 623, 571, 1017, 961, 1101, 1325, 933, 793, 849, - 821, 1465, 1157, 1129, 1185, 1073, 989, 1045, 1241, 1381, 1437, 1493, 1409, - 1269, 1297, 1353, 1213, 708, 737, 905, 877, 765, 1606, 1556, 1632, 1808, 1797, - 1771, 1666, 1743, 886, 491, 830, 491, 746, 942, 998, 438, - 70, - 70, - 70, - - 70, - 70, - 70, - 70, - 70, - 70, - 70, - 70, - 70, - 70, - 70, - 70, - 70, - - 70, - 70, - 70, - 70, - 70, - 70, - 70, - 70, - 70, 1777, - 3, 524, 460, - - 36, 511, - 51, 362, 487, 575, 567, 586, 37, 445, 97, 65, 317, 321, 541, 541, - 276, 276, 276, 414, 246, 290, 246, - 8, 201, 290, 344, 422, 340, 276, 461, - 387, 290, 486, 276, 530, 276, 276, 276, 276, 276, 435, 276, 276, 276, 276, - 570, 290, 276, 122, 122, 122, 122, 122, 122, 602, 589, 122, 122, 574, 606, - 574, 603, 574, 574, 574, 574, 574, 574, 574, 574, 581, 574, 574, 597, 596, - 574, 574, 574, 574, 574, 593, 574, 593, 609, 593, 611, 608, 593, 593, 593, - 574, 593, 593, 631, 612, 96, 67, 96, 230, 230, 96, 96, 67, 67, 96, 269, 224, - 588, 508, 501,); - - static public $yyExpectedTokens = array(array(3, 4, 5, 6, 7, 11, 12, 15, 18, 19, 20, 25, 29, 31, 32,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 30, 31, 32, 34, 36, 39, 42, - 43, 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 53, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 30, 31, 32, 34, 36, 39, 42, - 43, 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 52, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 54, 59,), - array(11, 12, 13, 15, 16, 18, 19, 20, 25, 29, 31, 32, 34, 36, 39, 42, 43, - 44, 45, 47, 49, 51, 54, 59,), - array(1, 24, 26, 33, 38, 39, 40, 55, 56, 57, 58,), - array(1, 10, 26, 33, 38, 39, 40, 55, 56, 57, 58,), - array(1, 26, 33, 38, 39, 40, 55, 56, 57, 58,), - array(1, 26, 33, 38, 39, 40, 55, 56, 57, 58,), - array(1, 26, 33, 38, 39, 40, 55, 56, 57, 58,), - array(1, 26, 33, 38, 39, 40, 55, 56, 57, 58,), - array(1, 26, 33, 38, 39, 40, 55, 56, 57, 58,), - array(3, 4, 5, 6, 7, 11, 12, 15, 18, 19, 20, 25, 29, 31, 32,), - array(1, 37, 38, 39, 40, 55, 56, 57, 58,), - array(1, 37, 38, 39, 40, 55, 56, 57, 58,), - array(1, 38, 39, 40, 53, 55, 56, 57, 58,), - array(1, 38, 39, 40, 55, 56, 57, 58, 60,), - array(1, 10, 38, 39, 40, 55, 56, 57, 58,), - array(1, 10, 38, 39, 40, 55, 56, 57, 58,), - array(1, 2, 38, 39, 40, 55, 56, 57, 58,), - array(1, 10, 38, 39, 40, 55, 56, 57, 58,), - array(1, 27, 38, 39, 40, 55, 56, 57, 58,), - array(1, 10, 38, 39, 40, 55, 56, 57, 58,), - array(1, 21, 38, 39, 40, 55, 56, 57, 58,), - array(1, 38, 39, 40, 55, 56, 57, 58,), - array(1, 38, 39, 40, 55, 56, 57, 58,), - array(1, 38, 39, 40, 55, 56, 57, 58,), - array(1, 38, 39, 40, 55, 56, 57, 58,), - array(1, 38, 39, 40, 55, 56, 57, 58,), - array(1, 38, 39, 40, 55, 56, 57, 58,), - array(1, 38, 39, 40, 55, 56, 57, 58,), - array(1, 38, 39, 40, 55, 56, 57, 58,), - array(1, 38, 39, 40, 55, 56, 57, 58,), - array(1, 38, 39, 40, 55, 56, 57, 58,), - array(1, 38, 39, 40, 55, 56, 57, 58,), - array(1, 38, 39, 40, 55, 56, 57, 58,), array(38, 39, 40, 55, 56, 57, 58,), - array(38, 39, 40, 55, 56, 57, 58,), array(13, 16, 49, 51, 54,), - array(4, 11, 12, 13, 15, 18, 19, 20, 25, 29, 31, 32, 59, 60,), - array(1, 10, 17, 26, 33, 36, 48,), array(1, 10, 26, 33,), - array(13, 16, 51, 54,), array(1, 26, 33,), array(13, 36, 54,), - array(4, 11, 12, 13, 15, 18, 19, 20, 25, 29, 31, 32, 59, 60,), - array(11, 12, 16, 26, 28, 33,), array(11, 12, 16, 26, 28, 33,), - array(11, 12, 16, 26, 33,), array(11, 12, 16, 26, 33,), array(13, 36, 54,), - array(1, 26, 33,), array(13, 36, 54,), array(17, 45, 52,), - array(1, 26, 33,), array(1, 2,), array(10, 22, 26, 33, 46,), - array(10, 22, 26, 33, 46,), array(1, 10, 26, 27, 33,), - array(1, 10, 26, 33,), array(1, 10, 26, 33,), array(12, 13, 16, 54,), - array(11, 12, 16, 50,), array(14, 17, 48,), array(11, 12, 16,), - array(7, 8, 9,), array(11, 12, 16,), array(14, 17, 48,), array(13, 16,), - array(13, 16,), array(13, 54,), array(1, 10,), array(26, 33,), - array(1, 17,), array(17, 48,), array(26, 33,), array(1, 28,), - array(26, 33,), array(1, 53,), array(1,), array(1,), array(1,), array(1,), - array(1,), array(1,), array(1,), array(1,), array(1,), array(17,), - array(17,), array(), array(2, 11, 12, 14, 16, 17, 45, 48, 50, 52,), - array(2, 11, 12, 16, 17, 45, 48, 50, 52, 53,), - array(2, 11, 12, 14, 16, 17, 45, 48, 50, 52,), - array(2, 11, 12, 16, 17, 45, 48, 50, 52,), - array(2, 11, 12, 16, 17, 45, 48, 50, 52,), - array(11, 12, 16, 17, 45, 48, 50, 52,), array(12, 13, 16, 34, 54,), - array(11, 12, 16, 50,), array(11, 12, 16,), array(14, 45, 52,), - array(26, 33,), array(13, 54,), array(26, 33,), array(13, 54,), - array(26, 33,), array(26, 33,), array(26, 33,), array(26, 33,), - array(26, 33,), array(26, 33,), array(26, 33,), array(26, 33,), - array(45, 52,), array(26, 33,), array(26, 33,), array(13, 54,), - array(13, 54,), array(26, 33,), array(26, 33,), array(26, 33,), - array(26, 33,), array(26, 33,), array(45, 52,), array(26, 33,), - array(45, 52,), array(12, 36,), array(45, 52,), array(14, 22,), - array(45, 52,), array(45, 52,), array(45, 52,), array(45, 52,), - array(26, 33,), array(45, 52,), array(45, 52,), array(8,), array(36,), - array(1,), array(17,), array(1,), array(2,), array(2,), array(1,), - array(1,), array(17,), array(17,), array(1,), array(), array(), array(), - array(), array(), array(1, 2, 36, 38, 39, 40, 48, 55, 56, 57, 58,), - array(10, 21, 23, 26, 33, 35, 37, 45,), array(10, 14, 26, 33, 36, 48,), - array(11, 12, 16, 50,), array(36, 45, 48, 53,), array(22, 46, 53,), - array(22, 46, 60,), array(28, 36, 48,), array(36, 48,), array(21, 35,), - array(45, 53,), array(14, 45,), array(35, 37,), array(36, 48,), - array(36, 48,), array(35, 37,), array(35, 37,), array(16, 50,), - array(35, 53,), array(22, 46,), array(34,), array(10,), array(16,), - array(51,), array(16,), array(36,), array(51,), array(16,), array(16,), - array(4,), array(16,), array(53,), array(16,), array(16,), array(36,), - array(13,), array(16,), array(53,), array(45,), array(37,), array(16,), - array(23,), array(34,), array(16,), array(14,), array(41,), array(), - array(), array(), array(), array(), array(), array(), array(), array(), - array(), array(), array(), array(), array(), array(), array(), array(), - array(), array(), array(), array(), array(), array(), array(), array(), - array(), array(), array(), array(), array(), array(), array(), array(), - array(), array(), array(), array(), array(), array(), array(), array(), - array(), array(), array(), array(), array(), array(), array(), array(), - array(), array(), array(), array(), array(), array(), array(), array(), - array(), array(), array(), array(), array(), array(), array(), array(), - array(), array(), array(), array(), array(), array(), array(), array(), - array(), array(), array(), array(), array(), array(), array(), array(), - array(), array(), array(), array(), array(), array(), array(), array(), - array(), array(), array(), array(), array(), array(), array(),); - - static public $yy_default = array(338, 515, 494, 530, 530, 494, 494, 530, 530, 530, 530, 530, 530, 530, 530, 530, - 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, - 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 396, 530, 396, - 359, 372, 362, 396, 335, 530, 530, 530, 530, 530, 530, 530, 530, 401, 530, 530, - 377, 517, 492, 493, 418, 516, 403, 401, 518, 398, 407, 408, 423, 422, 530, 530, - 434, 410, 530, 396, 530, 530, 396, 396, 396, 396, 530, 396, 530, 506, 396, 386, - 424, 424, 410, 410, 410, 530, 459, 449, 459, 530, 459, 449, 530, 530, 530, 410, - 396, 390, 449, 396, 410, 374, 410, 417, 426, 425, 410, 392, 421, 414, 413, 427, - 503, 449, 501, 448, 448, 448, 448, 448, 448, 530, 461, 459, 475, 382, 530, 381, - 530, 369, 366, 364, 368, 360, 363, 358, 370, 452, 384, 356, 530, 530, 385, 375, - 380, 379, 373, 455, 376, 484, 459, 487, 530, 454, 453, 486, 485, 383, 456, 457, - 350, 459, 443, 481, 387, 495, 496, 416, 391, 507, 504, 393, 500, 500, 500, 459, - 459, 434, 430, 434, 460, 434, 424, 424, 434, 434, 530, 430, 430, 530, 530, 444, - 530, 530, 530, 530, 424, 530, 530, 530, 530, 530, 505, 530, 530, 530, 342, 530, - 439, 530, 530, 475, 530, 530, 530, 430, 530, 530, 404, 432, 530, 530, 436, 439, - 480, 502, 440, 490, 465, 365, 436, 475, 394, 405, 343, 344, 345, 346, 347, 409, - 429, 411, 337, 336, 339, 340, 341, 431, 348, 397, 353, 464, 354, 463, 435, 378, - 351, 349, 489, 352, 433, 462, 419, 477, 415, 446, 478, 479, 438, 388, 519, 511, - 510, 521, 520, 412, 482, 437, 498, 497, 491, 476, 483, 451, 526, 527, 428, 499, - 450, 389, 524, 523, 488, 458, 420, 442, 445, 371, 471, 468, 474, 467, 466, 469, - 472, 470, 522, 509, 529, 528, 525, 508, 473, 513, 447, 514, 395, 512, 441,); - - const YYNOCODE = 107; - - const YYSTACKDEPTH = 500; - - const YYNSTATE = 335; - - const YYNRULE = 195; - - const YYERRORSYMBOL = 61; - - const YYERRSYMDT = 'yy0'; - - const YYFALLBACK = 0; - - public static $yyFallback = array(); - public function Trace($TraceFILE, $zTracePrompt) { if (!$TraceFILE) { $zTracePrompt = 0; - } elseif (!$zTracePrompt) { + } else if (!$zTracePrompt) { $TraceFILE = 0; } $this->yyTraceFILE = $TraceFILE; @@ -900,136 +1722,6 @@ class Smarty_Internal_Templateparser $this->yyTracePrompt = '<br>'; } - public $yyTraceFILE; - - public $yyTracePrompt; - - public $yyidx; /* Index of top element in stack */ - public $yyerrcnt; /* Shifts left before out of the error */ - public $yystack = array(); /* The parser's stack */ - - public $yyTokenName = array('$', 'VERT', 'COLON', 'PHP', 'TEXT', 'STRIPON', 'STRIPOFF', 'LITERALSTART', - 'LITERALEND', 'LITERAL', 'RDEL', 'SIMPELOUTPUT', 'LDEL', 'DOLLARID', 'EQUAL', - 'SIMPLETAG', 'ID', 'PTR', 'LDELMAKENOCACHE', 'LDELIF', 'LDELFOR', 'SEMICOLON', 'INCDEC', - 'TO', 'STEP', 'LDELFOREACH', 'SPACE', 'AS', 'APTR', 'LDELSETFILTER', - 'SMARTYBLOCKCHILDPARENT', 'CLOSETAG', 'LDELSLASH', 'ATTR', 'INTEGER', 'COMMA', 'OPENP', - 'CLOSEP', 'MATH', 'UNIMATH', 'ISIN', 'QMARK', 'NOT', 'TYPECAST', 'HEX', 'DOT', - 'INSTANCEOF', 'SINGLEQUOTESTRING', 'DOUBLECOLON', 'NAMESPACE', 'AT', 'HATCH', 'OPENB', - 'CLOSEB', 'DOLLAR', 'LOGOP', 'SLOGOP', 'TLOGOP', 'SINGLECOND', 'QUOTE', 'BACKTICK', - 'error', 'start', 'template', 'template_element', 'smartytag', 'literal', - 'text_content', 'literal_elements', 'literal_element', 'tag', 'variable', 'attributes', - 'value', 'expr', 'varindexed', 'modifierlist', 'statement', 'statements', 'foraction', - 'varvar', 'modparameters', 'attribute', 'ternary', 'array', 'tlop', 'lop', 'scond', - 'function', 'ns1', 'doublequoted_with_quotes', 'static_class_access', 'object', - 'arrayindex', 'indexdef', 'varvarele', 'objectchain', 'objectelement', 'method', - 'params', 'modifier', 'modparameter', 'arrayelements', 'arrayelement', 'doublequoted', - 'doublequotedcontent',); - - public static $yyRuleName = array('start ::= template', 'template ::= template_element', - 'template ::= template template_element', 'template ::=', - 'template_element ::= smartytag', 'template_element ::= literal', - 'template_element ::= PHP', 'template_element ::= text_content', - 'text_content ::= TEXT', 'text_content ::= text_content TEXT', - 'template_element ::= STRIPON', 'template_element ::= STRIPOFF', - 'literal ::= LITERALSTART LITERALEND', - 'literal ::= LITERALSTART literal_elements LITERALEND', - 'literal_elements ::= literal_elements literal_element', 'literal_elements ::=', - 'literal_element ::= literal', 'literal_element ::= LITERAL', - 'smartytag ::= tag RDEL', 'smartytag ::= SIMPELOUTPUT', 'tag ::= LDEL variable', - 'tag ::= LDEL variable attributes', 'tag ::= LDEL value', - 'tag ::= LDEL value attributes', 'tag ::= LDEL expr', - 'tag ::= LDEL expr attributes', 'tag ::= LDEL DOLLARID EQUAL value', - 'tag ::= LDEL DOLLARID EQUAL expr', 'tag ::= LDEL DOLLARID EQUAL expr attributes', - 'tag ::= LDEL varindexed EQUAL expr attributes', 'smartytag ::= SIMPLETAG', - 'tag ::= LDEL ID attributes', 'tag ::= LDEL ID', - 'tag ::= LDEL ID modifierlist attributes', 'tag ::= LDEL ID PTR ID attributes', - 'tag ::= LDEL ID PTR ID modifierlist attributes', - 'tag ::= LDELMAKENOCACHE DOLLARID', 'tag ::= LDELIF expr', - 'tag ::= LDELIF expr attributes', 'tag ::= LDELIF statement', - 'tag ::= LDELIF statement attributes', - 'tag ::= LDELFOR statements SEMICOLON expr SEMICOLON varindexed foraction attributes', - 'foraction ::= EQUAL expr', 'foraction ::= INCDEC', - 'tag ::= LDELFOR statement TO expr attributes', - 'tag ::= LDELFOR statement TO expr STEP expr attributes', - 'tag ::= LDELFOREACH attributes', - 'tag ::= LDELFOREACH SPACE value AS varvar attributes', - 'tag ::= LDELFOREACH SPACE value AS varvar APTR varvar attributes', - 'tag ::= LDELFOREACH SPACE expr AS varvar attributes', - 'tag ::= LDELFOREACH SPACE expr AS varvar APTR varvar attributes', - 'tag ::= LDELSETFILTER ID modparameters', - 'tag ::= LDELSETFILTER ID modparameters modifierlist', - 'tag ::= LDEL SMARTYBLOCKCHILDPARENT', 'smartytag ::= CLOSETAG', - 'tag ::= LDELSLASH ID', 'tag ::= LDELSLASH ID modifierlist', - 'tag ::= LDELSLASH ID PTR ID', 'tag ::= LDELSLASH ID PTR ID modifierlist', - 'attributes ::= attributes attribute', 'attributes ::= attribute', - 'attributes ::=', 'attribute ::= SPACE ID EQUAL ID', 'attribute ::= ATTR expr', - 'attribute ::= ATTR value', 'attribute ::= SPACE ID', 'attribute ::= SPACE expr', - 'attribute ::= SPACE value', 'attribute ::= SPACE INTEGER EQUAL expr', - 'statements ::= statement', 'statements ::= statements COMMA statement', - 'statement ::= DOLLARID EQUAL INTEGER', 'statement ::= DOLLARID EQUAL expr', - 'statement ::= varindexed EQUAL expr', 'statement ::= OPENP statement CLOSEP', - 'expr ::= value', 'expr ::= ternary', 'expr ::= DOLLARID COLON ID', - 'expr ::= expr MATH value', 'expr ::= expr UNIMATH value', 'expr ::= array', - 'expr ::= expr modifierlist', 'expr ::= expr tlop value', - 'expr ::= expr lop expr', 'expr ::= expr scond', 'expr ::= expr ISIN array', - 'expr ::= expr ISIN value', - 'ternary ::= OPENP expr CLOSEP QMARK DOLLARID COLON expr', - 'ternary ::= OPENP expr CLOSEP QMARK expr COLON expr', 'value ::= variable', - 'value ::= UNIMATH value', 'value ::= NOT value', 'value ::= TYPECAST value', - 'value ::= variable INCDEC', 'value ::= HEX', 'value ::= INTEGER', - 'value ::= INTEGER DOT INTEGER', 'value ::= INTEGER DOT', 'value ::= DOT INTEGER', - 'value ::= ID', 'value ::= function', 'value ::= OPENP expr CLOSEP', - 'value ::= variable INSTANCEOF ns1', 'value ::= variable INSTANCEOF variable', - 'value ::= SINGLEQUOTESTRING', 'value ::= doublequoted_with_quotes', - 'value ::= varindexed DOUBLECOLON static_class_access', 'value ::= smartytag', - 'value ::= value modifierlist', 'value ::= NAMESPACE', - 'value ::= ns1 DOUBLECOLON static_class_access', 'ns1 ::= ID', - 'ns1 ::= NAMESPACE', 'variable ::= DOLLARID', 'variable ::= varindexed', - 'variable ::= varvar AT ID', 'variable ::= object', 'variable ::= HATCH ID HATCH', - 'variable ::= HATCH ID HATCH arrayindex', 'variable ::= HATCH variable HATCH', - 'variable ::= HATCH variable HATCH arrayindex', - 'varindexed ::= DOLLARID arrayindex', 'varindexed ::= varvar arrayindex', - 'arrayindex ::= arrayindex indexdef', 'arrayindex ::=', - 'indexdef ::= DOT DOLLARID', 'indexdef ::= DOT varvar', - 'indexdef ::= DOT varvar AT ID', 'indexdef ::= DOT ID', - 'indexdef ::= DOT INTEGER', 'indexdef ::= DOT LDEL expr RDEL', - 'indexdef ::= OPENB ID CLOSEB', 'indexdef ::= OPENB ID DOT ID CLOSEB', - 'indexdef ::= OPENB SINGLEQUOTESTRING CLOSEB', - 'indexdef ::= OPENB INTEGER CLOSEB', 'indexdef ::= OPENB DOLLARID CLOSEB', - 'indexdef ::= OPENB variable CLOSEB', 'indexdef ::= OPENB value CLOSEB', - 'indexdef ::= OPENB expr CLOSEB', 'indexdef ::= OPENB CLOSEB', - 'varvar ::= DOLLARID', 'varvar ::= DOLLAR', 'varvar ::= varvar varvarele', - 'varvarele ::= ID', 'varvarele ::= SIMPELOUTPUT', 'varvarele ::= LDEL expr RDEL', - 'object ::= varindexed objectchain', 'objectchain ::= objectelement', - 'objectchain ::= objectchain objectelement', - 'objectelement ::= PTR ID arrayindex', 'objectelement ::= PTR varvar arrayindex', - 'objectelement ::= PTR LDEL expr RDEL arrayindex', - 'objectelement ::= PTR ID LDEL expr RDEL arrayindex', - 'objectelement ::= PTR method', 'function ::= ns1 OPENP params CLOSEP', - 'method ::= ID OPENP params CLOSEP', 'method ::= DOLLARID OPENP params CLOSEP', - 'params ::= params COMMA expr', 'params ::= expr', 'params ::=', - 'modifierlist ::= modifierlist modifier modparameters', - 'modifierlist ::= modifier modparameters', 'modifier ::= VERT AT ID', - 'modifier ::= VERT ID', 'modparameters ::= modparameters modparameter', - 'modparameters ::=', 'modparameter ::= COLON value', - 'modparameter ::= COLON array', 'static_class_access ::= method', - 'static_class_access ::= method objectchain', 'static_class_access ::= ID', - 'static_class_access ::= DOLLARID arrayindex', - 'static_class_access ::= DOLLARID arrayindex objectchain', 'lop ::= LOGOP', - 'lop ::= SLOGOP', 'tlop ::= TLOGOP', 'scond ::= SINGLECOND', - 'array ::= OPENB arrayelements CLOSEB', 'arrayelements ::= arrayelement', - 'arrayelements ::= arrayelements COMMA arrayelement', 'arrayelements ::=', - 'arrayelement ::= value APTR expr', 'arrayelement ::= ID APTR expr', - 'arrayelement ::= expr', 'doublequoted_with_quotes ::= QUOTE QUOTE', - 'doublequoted_with_quotes ::= QUOTE doublequoted QUOTE', - 'doublequoted ::= doublequoted doublequotedcontent', - 'doublequoted ::= doublequotedcontent', - 'doublequotedcontent ::= BACKTICK variable BACKTICK', - 'doublequotedcontent ::= BACKTICK expr BACKTICK', - 'doublequotedcontent ::= DOLLARID', 'doublequotedcontent ::= LDEL variable RDEL', - 'doublequotedcontent ::= LDEL expr RDEL', 'doublequotedcontent ::= smartytag', - 'doublequotedcontent ::= TEXT',); - public function tokenName($tokenType) { if ($tokenType === 0) { @@ -1038,7 +1730,7 @@ class Smarty_Internal_Templateparser if ($tokenType > 0 && $tokenType < count($this->yyTokenName)) { return $this->yyTokenName[ $tokenType ]; } else { - return "Unknown"; + return 'Unknown'; } } @@ -1057,12 +1749,13 @@ class Smarty_Internal_Templateparser } $yytos = array_pop($this->yystack); if ($this->yyTraceFILE && $this->yyidx >= 0) { - fwrite($this->yyTraceFILE, $this->yyTracePrompt . 'Popping ' . $this->yyTokenName[ $yytos->major ] . "\n"); + fwrite($this->yyTraceFILE, + $this->yyTracePrompt . 'Popping ' . $this->yyTokenName[ $yytos->major ] . + "\n"); } $yymajor = $yytos->major; self::yy_destructor($yymajor, $yytos->minor); - $this->yyidx --; - + $this->yyidx--; return $yymajor; } @@ -1099,7 +1792,7 @@ class Smarty_Internal_Templateparser // reduce action $done = 0; do { - if ($done ++ == 100) { + if ($done++ === 100) { $this->yyidx = $yyidx; $this->yystack = $stack; // too much recursion prevents proper detection @@ -1108,8 +1801,9 @@ class Smarty_Internal_Templateparser } $yyruleno = $yyact - self::YYNSTATE; $this->yyidx -= self::$yyRuleInfo[ $yyruleno ][ 1 ]; - $nextstate = $this->yy_find_reduce_action($this->yystack[ $this->yyidx ]->stateno, - self::$yyRuleInfo[ $yyruleno ][ 0 ]); + $nextstate = $this->yy_find_reduce_action( + $this->yystack[ $this->yyidx ]->stateno, + self::$yyRuleInfo[ $yyruleno ][ 0 ]); if (isset(self::$yyExpectedTokens[ $nextstate ])) { $expected = array_merge($expected, self::$yyExpectedTokens[ $nextstate ]); if (isset($res4[ $nextstate ][ $token ])) { @@ -1120,8 +1814,7 @@ class Smarty_Internal_Templateparser } } else { if ($res4[ $nextstate ][ $token ] = - in_array($token, self::$yyExpectedTokens[ $nextstate ], true) - ) { + in_array($token, self::$yyExpectedTokens[ $nextstate ], true)) { $this->yyidx = $yyidx; $this->yystack = $stack; return array_unique($expected); @@ -1130,20 +1823,20 @@ class Smarty_Internal_Templateparser } if ($nextstate < self::YYNSTATE) { // we need to shift a non-terminal - $this->yyidx ++; + $this->yyidx++; $x = new TP_yyStackEntry; $x->stateno = $nextstate; $x->major = self::$yyRuleInfo[ $yyruleno ][ 0 ]; $this->yystack[ $this->yyidx ] = $x; continue 2; - } elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) { + } else if ($nextstate === self::YYNSTATE + self::YYNRULE + 1) { $this->yyidx = $yyidx; $this->yystack = $stack; // the last token was just ignored, we can't accept // by ignoring input, this is in essence ignoring a // syntax error! return array_unique($expected); - } elseif ($nextstate === self::YY_NO_ACTION) { + } else if ($nextstate === self::YY_NO_ACTION) { $this->yyidx = $yyidx; $this->yystack = $stack; // input accepted, but not shifted (I guess) @@ -1151,15 +1844,12 @@ class Smarty_Internal_Templateparser } else { $yyact = $nextstate; } - } - while (true); + } while (true); } break; - } - while (true); + } while (true); $this->yyidx = $yyidx; $this->yystack = $stack; - return array_unique($expected); } @@ -1188,7 +1878,7 @@ class Smarty_Internal_Templateparser // reduce action $done = 0; do { - if ($done ++ == 100) { + if ($done++ === 100) { $this->yyidx = $yyidx; $this->yystack = $stack; // too much recursion prevents proper detection @@ -1197,8 +1887,9 @@ class Smarty_Internal_Templateparser } $yyruleno = $yyact - self::YYNSTATE; $this->yyidx -= self::$yyRuleInfo[ $yyruleno ][ 1 ]; - $nextstate = $this->yy_find_reduce_action($this->yystack[ $this->yyidx ]->stateno, - self::$yyRuleInfo[ $yyruleno ][ 0 ]); + $nextstate = $this->yy_find_reduce_action( + $this->yystack[ $this->yyidx ]->stateno, + self::$yyRuleInfo[ $yyruleno ][ 0 ]); if (isset($res2[ $nextstate ][ $token ])) { if ($res2[ $nextstate ][ $token ]) { $this->yyidx = $yyidx; @@ -1207,9 +1898,9 @@ class Smarty_Internal_Templateparser } } else { if ($res2[ $nextstate ][ $token ] = (isset(self::$yyExpectedTokens[ $nextstate ]) && - in_array($token, self::$yyExpectedTokens[ $nextstate ], - true)) - ) { + in_array($token, + self::$yyExpectedTokens[ $nextstate ], + true))) { $this->yyidx = $yyidx; $this->yystack = $stack; return true; @@ -1217,13 +1908,13 @@ class Smarty_Internal_Templateparser } if ($nextstate < self::YYNSTATE) { // we need to shift a non-terminal - $this->yyidx ++; + $this->yyidx++; $x = new TP_yyStackEntry; $x->stateno = $nextstate; $x->major = self::$yyRuleInfo[ $yyruleno ][ 0 ]; $this->yystack[ $this->yyidx ] = $x; continue 2; - } elseif ($nextstate == self::YYNSTATE + self::YYNRULE + 1) { + } else if ($nextstate === self::YYNSTATE + self::YYNRULE + 1) { $this->yyidx = $yyidx; $this->yystack = $stack; if (!$token) { @@ -1234,7 +1925,7 @@ class Smarty_Internal_Templateparser // by ignoring input, this is in essence ignoring a // syntax error! return false; - } elseif ($nextstate === self::YY_NO_ACTION) { + } else if ($nextstate === self::YY_NO_ACTION) { $this->yyidx = $yyidx; $this->yystack = $stack; // input accepted, but not shifted (I guess) @@ -1242,22 +1933,18 @@ class Smarty_Internal_Templateparser } else { $yyact = $nextstate; } - } - while (true); + } while (true); } break; - } - while (true); + } while (true); $this->yyidx = $yyidx; $this->yystack = $stack; - return true; } public function yy_find_shift_action($iLookAhead) { $stateno = $this->yystack[ $this->yyidx ]->stateno; - /* if ($this->yyidx < 0) return self::YY_NO_ACTION; */ if (!isset(self::$yy_shift_ofst[ $stateno ])) { // no shift actions @@ -1267,23 +1954,22 @@ class Smarty_Internal_Templateparser if ($i === self::YY_SHIFT_USE_DFLT) { return self::$yy_default[ $stateno ]; } - if ($iLookAhead == self::YYNOCODE) { + if ($iLookAhead === self::YYNOCODE) { return self::YY_NO_ACTION; } $i += $iLookAhead; - if ($i < 0 || $i >= self::YY_SZ_ACTTAB || self::$yy_lookahead[ $i ] != $iLookAhead) { - if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback) && - ($iFallback = self::$yyFallback[ $iLookAhead ]) != 0 - ) { + if ($i < 0 || $i >= self::YY_SZ_ACTTAB || + self::$yy_lookahead[ $i ] != $iLookAhead) { + if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback) + && ($iFallback = self::$yyFallback[ $iLookAhead ]) != 0) { if ($this->yyTraceFILE) { fwrite($this->yyTraceFILE, - $this->yyTracePrompt . "FALLBACK " . $this->yyTokenName[ $iLookAhead ] . " => " . + $this->yyTracePrompt . 'FALLBACK ' . + $this->yyTokenName[ $iLookAhead ] . ' => ' . $this->yyTokenName[ $iFallback ] . "\n"); } - return $this->yy_find_shift_action($iFallback); } - return self::$yy_default[ $stateno ]; } else { return self::$yy_action[ $i ]; @@ -1293,41 +1979,41 @@ class Smarty_Internal_Templateparser public function yy_find_reduce_action($stateno, $iLookAhead) { /* $stateno = $this->yystack[$this->yyidx]->stateno; */ - if (!isset(self::$yy_reduce_ofst[ $stateno ])) { return self::$yy_default[ $stateno ]; } $i = self::$yy_reduce_ofst[ $stateno ]; - if ($i == self::YY_REDUCE_USE_DFLT) { + if ($i === self::YY_REDUCE_USE_DFLT) { return self::$yy_default[ $stateno ]; } - if ($iLookAhead == self::YYNOCODE) { + if ($iLookAhead === self::YYNOCODE) { return self::YY_NO_ACTION; } $i += $iLookAhead; - if ($i < 0 || $i >= self::YY_SZ_ACTTAB || self::$yy_lookahead[ $i ] != $iLookAhead) { + if ($i < 0 || $i >= self::YY_SZ_ACTTAB || + self::$yy_lookahead[ $i ] != $iLookAhead) { return self::$yy_default[ $stateno ]; } else { return self::$yy_action[ $i ]; } } + #line 234 "../smarty/lexer/smarty_internal_templateparser.y" + public function yy_shift($yyNewState, $yyMajor, $yypMinor) { - $this->yyidx ++; + $this->yyidx++; if ($this->yyidx >= self::YYSTACKDEPTH) { - $this->yyidx --; + $this->yyidx--; if ($this->yyTraceFILE) { fprintf($this->yyTraceFILE, "%sStack Overflow!\n", $this->yyTracePrompt); } while ($this->yyidx >= 0) { $this->yy_pop_parser_stack(); } - #line 207 "../smarty/lexer/smarty_internal_templateparser.y" - + #line 221 "../smarty/lexer/smarty_internal_templateparser.y" $this->internalError = true; - $this->compiler->trigger_template_error("Stack overflow in template parser"); - + $this->compiler->trigger_template_error('Stack overflow in template parser'); return; } $yytos = new TP_yyStackEntry; @@ -1336,111 +2022,22 @@ class Smarty_Internal_Templateparser $yytos->minor = $yypMinor; $this->yystack[] = $yytos; if ($this->yyTraceFILE && $this->yyidx > 0) { - fprintf($this->yyTraceFILE, "%sShift %d\n", $this->yyTracePrompt, $yyNewState); + fprintf($this->yyTraceFILE, + "%sShift %d\n", + $this->yyTracePrompt, + $yyNewState); fprintf($this->yyTraceFILE, "%sStack:", $this->yyTracePrompt); - for ($i = 1; $i <= $this->yyidx; $i ++) { - fprintf($this->yyTraceFILE, " %s", $this->yyTokenName[ $this->yystack[ $i ]->major ]); + for ($i = 1; $i <= $this->yyidx; $i++) { + fprintf($this->yyTraceFILE, + " %s", + $this->yyTokenName[ $this->yystack[ $i ]->major ]); } fwrite($this->yyTraceFILE, "\n"); } } - public static $yyRuleInfo = array(array(0 => 62, 1 => 1), array(0 => 63, 1 => 1), array(0 => 63, 1 => 2), - array(0 => 63, 1 => 0), array(0 => 64, 1 => 1), array(0 => 64, 1 => 1), - array(0 => 64, 1 => 1), array(0 => 64, 1 => 1), array(0 => 67, 1 => 1), - array(0 => 67, 1 => 2), array(0 => 64, 1 => 1), array(0 => 64, 1 => 1), - array(0 => 66, 1 => 2), array(0 => 66, 1 => 3), array(0 => 68, 1 => 2), - array(0 => 68, 1 => 0), array(0 => 69, 1 => 1), array(0 => 69, 1 => 1), - array(0 => 65, 1 => 2), array(0 => 65, 1 => 1), array(0 => 70, 1 => 2), - array(0 => 70, 1 => 3), array(0 => 70, 1 => 2), array(0 => 70, 1 => 3), - array(0 => 70, 1 => 2), array(0 => 70, 1 => 3), array(0 => 70, 1 => 4), - array(0 => 70, 1 => 4), array(0 => 70, 1 => 5), array(0 => 70, 1 => 5), - array(0 => 65, 1 => 1), array(0 => 70, 1 => 3), array(0 => 70, 1 => 2), - array(0 => 70, 1 => 4), array(0 => 70, 1 => 5), array(0 => 70, 1 => 6), - array(0 => 70, 1 => 2), array(0 => 70, 1 => 2), array(0 => 70, 1 => 3), - array(0 => 70, 1 => 2), array(0 => 70, 1 => 3), array(0 => 70, 1 => 8), - array(0 => 79, 1 => 2), array(0 => 79, 1 => 1), array(0 => 70, 1 => 5), - array(0 => 70, 1 => 7), array(0 => 70, 1 => 2), array(0 => 70, 1 => 6), - array(0 => 70, 1 => 8), array(0 => 70, 1 => 6), array(0 => 70, 1 => 8), - array(0 => 70, 1 => 3), array(0 => 70, 1 => 4), array(0 => 70, 1 => 2), - array(0 => 65, 1 => 1), array(0 => 70, 1 => 2), array(0 => 70, 1 => 3), - array(0 => 70, 1 => 4), array(0 => 70, 1 => 5), array(0 => 72, 1 => 2), - array(0 => 72, 1 => 1), array(0 => 72, 1 => 0), array(0 => 82, 1 => 4), - array(0 => 82, 1 => 2), array(0 => 82, 1 => 2), array(0 => 82, 1 => 2), - array(0 => 82, 1 => 2), array(0 => 82, 1 => 2), array(0 => 82, 1 => 4), - array(0 => 78, 1 => 1), array(0 => 78, 1 => 3), array(0 => 77, 1 => 3), - array(0 => 77, 1 => 3), array(0 => 77, 1 => 3), array(0 => 77, 1 => 3), - array(0 => 74, 1 => 1), array(0 => 74, 1 => 1), array(0 => 74, 1 => 3), - array(0 => 74, 1 => 3), array(0 => 74, 1 => 3), array(0 => 74, 1 => 1), - array(0 => 74, 1 => 2), array(0 => 74, 1 => 3), array(0 => 74, 1 => 3), - array(0 => 74, 1 => 2), array(0 => 74, 1 => 3), array(0 => 74, 1 => 3), - array(0 => 83, 1 => 7), array(0 => 83, 1 => 7), array(0 => 73, 1 => 1), - array(0 => 73, 1 => 2), array(0 => 73, 1 => 2), array(0 => 73, 1 => 2), - array(0 => 73, 1 => 2), array(0 => 73, 1 => 1), array(0 => 73, 1 => 1), - array(0 => 73, 1 => 3), array(0 => 73, 1 => 2), array(0 => 73, 1 => 2), - array(0 => 73, 1 => 1), array(0 => 73, 1 => 1), array(0 => 73, 1 => 3), - array(0 => 73, 1 => 3), array(0 => 73, 1 => 3), array(0 => 73, 1 => 1), - array(0 => 73, 1 => 1), array(0 => 73, 1 => 3), array(0 => 73, 1 => 1), - array(0 => 73, 1 => 2), array(0 => 73, 1 => 1), array(0 => 73, 1 => 3), - array(0 => 89, 1 => 1), array(0 => 89, 1 => 1), array(0 => 71, 1 => 1), - array(0 => 71, 1 => 1), array(0 => 71, 1 => 3), array(0 => 71, 1 => 1), - array(0 => 71, 1 => 3), array(0 => 71, 1 => 4), array(0 => 71, 1 => 3), - array(0 => 71, 1 => 4), array(0 => 75, 1 => 2), array(0 => 75, 1 => 2), - array(0 => 93, 1 => 2), array(0 => 93, 1 => 0), array(0 => 94, 1 => 2), - array(0 => 94, 1 => 2), array(0 => 94, 1 => 4), array(0 => 94, 1 => 2), - array(0 => 94, 1 => 2), array(0 => 94, 1 => 4), array(0 => 94, 1 => 3), - array(0 => 94, 1 => 5), array(0 => 94, 1 => 3), array(0 => 94, 1 => 3), - array(0 => 94, 1 => 3), array(0 => 94, 1 => 3), array(0 => 94, 1 => 3), - array(0 => 94, 1 => 3), array(0 => 94, 1 => 2), array(0 => 80, 1 => 1), - array(0 => 80, 1 => 1), array(0 => 80, 1 => 2), array(0 => 95, 1 => 1), - array(0 => 95, 1 => 1), array(0 => 95, 1 => 3), array(0 => 92, 1 => 2), - array(0 => 96, 1 => 1), array(0 => 96, 1 => 2), array(0 => 97, 1 => 3), - array(0 => 97, 1 => 3), array(0 => 97, 1 => 5), array(0 => 97, 1 => 6), - array(0 => 97, 1 => 2), array(0 => 88, 1 => 4), array(0 => 98, 1 => 4), - array(0 => 98, 1 => 4), array(0 => 99, 1 => 3), array(0 => 99, 1 => 1), - array(0 => 99, 1 => 0), array(0 => 76, 1 => 3), array(0 => 76, 1 => 2), - array(0 => 100, 1 => 3), array(0 => 100, 1 => 2), array(0 => 81, 1 => 2), - array(0 => 81, 1 => 0), array(0 => 101, 1 => 2), array(0 => 101, 1 => 2), - array(0 => 91, 1 => 1), array(0 => 91, 1 => 2), array(0 => 91, 1 => 1), - array(0 => 91, 1 => 2), array(0 => 91, 1 => 3), array(0 => 86, 1 => 1), - array(0 => 86, 1 => 1), array(0 => 85, 1 => 1), array(0 => 87, 1 => 1), - array(0 => 84, 1 => 3), array(0 => 102, 1 => 1), array(0 => 102, 1 => 3), - array(0 => 102, 1 => 0), array(0 => 103, 1 => 3), array(0 => 103, 1 => 3), - array(0 => 103, 1 => 1), array(0 => 90, 1 => 2), array(0 => 90, 1 => 3), - array(0 => 104, 1 => 2), array(0 => 104, 1 => 1), array(0 => 105, 1 => 3), - array(0 => 105, 1 => 3), array(0 => 105, 1 => 1), array(0 => 105, 1 => 3), - array(0 => 105, 1 => 3), array(0 => 105, 1 => 1), array(0 => 105, 1 => 1),); - - public static $yyReduceMap = array(0 => 0, 1 => 1, 2 => 2, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 16 => 8, 17 => 8, - 43 => 8, 66 => 8, 67 => 8, 75 => 8, 76 => 8, 80 => 8, 89 => 8, 94 => 8, 95 => 8, - 100 => 8, 104 => 8, 105 => 8, 109 => 8, 111 => 8, 116 => 8, 178 => 8, 183 => 8, - 9 => 9, 10 => 10, 11 => 11, 12 => 12, 15 => 12, 13 => 13, 74 => 13, 14 => 14, - 90 => 14, 92 => 14, 93 => 14, 123 => 14, 18 => 18, 19 => 19, 20 => 20, 22 => 20, - 24 => 20, 21 => 21, 23 => 21, 25 => 21, 26 => 26, 27 => 26, 28 => 28, 29 => 29, - 30 => 30, 31 => 31, 32 => 32, 33 => 33, 34 => 34, 35 => 35, 36 => 36, 37 => 37, - 38 => 38, 40 => 38, 39 => 39, 41 => 41, 42 => 42, 44 => 44, 45 => 45, 46 => 46, - 47 => 47, 49 => 47, 48 => 48, 50 => 48, 51 => 51, 52 => 52, 53 => 53, 54 => 54, - 55 => 55, 56 => 56, 57 => 57, 58 => 58, 59 => 59, 60 => 60, 69 => 60, 158 => 60, - 162 => 60, 166 => 60, 167 => 60, 61 => 61, 159 => 61, 165 => 61, 62 => 62, - 63 => 63, 64 => 63, 65 => 65, 143 => 65, 68 => 68, 70 => 70, 71 => 71, 72 => 71, - 73 => 73, 77 => 77, 78 => 78, 79 => 78, 81 => 81, 108 => 81, 82 => 82, 83 => 83, - 84 => 84, 85 => 85, 86 => 86, 87 => 87, 88 => 88, 91 => 91, 96 => 96, 97 => 97, - 98 => 98, 99 => 99, 101 => 101, 102 => 102, 103 => 102, 106 => 106, 107 => 107, - 110 => 110, 112 => 112, 113 => 113, 114 => 114, 115 => 115, 117 => 117, - 118 => 118, 119 => 119, 120 => 120, 121 => 121, 122 => 122, 124 => 124, - 180 => 124, 125 => 125, 126 => 126, 127 => 127, 128 => 128, 129 => 129, - 130 => 130, 138 => 130, 131 => 131, 132 => 132, 133 => 133, 134 => 133, - 136 => 133, 137 => 133, 135 => 135, 139 => 139, 140 => 140, 141 => 141, - 184 => 141, 142 => 142, 144 => 144, 145 => 145, 146 => 146, 147 => 147, - 148 => 148, 149 => 149, 150 => 150, 151 => 151, 152 => 152, 153 => 153, - 154 => 154, 155 => 155, 156 => 156, 157 => 157, 160 => 160, 161 => 161, - 163 => 163, 164 => 164, 168 => 168, 169 => 169, 170 => 170, 171 => 171, - 172 => 172, 173 => 173, 174 => 174, 175 => 175, 176 => 176, 177 => 177, - 179 => 179, 181 => 181, 182 => 182, 185 => 185, 186 => 186, 187 => 187, - 188 => 188, 189 => 188, 191 => 188, 190 => 190, 192 => 192, 193 => 193, - 194 => 194,); - - #line 218 "../smarty/lexer/smarty_internal_templateparser.y" + #line 242 "../smarty/lexer/smarty_internal_templateparser.y" + function yy_r0() { $this->root_buffer->prepend_array($this, $this->template_prefix); @@ -1448,431 +2045,472 @@ class Smarty_Internal_Templateparser $this->_retvalue = $this->root_buffer->to_smarty_php($this); } - #line 228 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r1() - { - if ($this->yystack[ $this->yyidx + 0 ]->minor != null) { - $this->current_buffer->append_subtree($this, $this->yystack[ $this->yyidx + 0 ]->minor); - } - } - - #line 235 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r2() - { - if ($this->yystack[ $this->yyidx + 0 ]->minor != null) { - // because of possible code injection - $this->current_buffer->append_subtree($this, $this->yystack[ $this->yyidx + 0 ]->minor); - } - } - - #line 249 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r4() - { - if ($this->compiler->has_code) { - $this->_retvalue = $this->mergePrefixCode($this->yystack[ $this->yyidx + 0 ]->minor); - } else { - $this->_retvalue = null; - } - $this->compiler->has_variable_string = false; - $this->block_nesting_level = count($this->compiler->_tag_stack); - } - - #line 260 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r5() - { - $this->_retvalue = new Smarty_Internal_ParseTree_Text($this->yystack[ $this->yyidx + 0 ]->minor); - } + #line 251 "../smarty/lexer/smarty_internal_templateparser.y" - #line 264 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r6() + function yy_r1() { $code = $this->compiler->compileTag('private_php', array(array('code' => $this->yystack[ $this->yyidx + 0 ]->minor), - array('type' => $this->lex->phpType)), array()); + array('type' => $this->lex->phpType)), + array()); if ($this->compiler->has_code && !empty($code)) { $tmp = ''; foreach ($this->compiler->prefix_code as $code) { $tmp .= $code; } $this->compiler->prefix_code = array(); - $this->_retvalue = - new Smarty_Internal_ParseTree_Tag($this, $this->compiler->processNocacheCode($tmp . $code, true)); - } else { - $this->_retvalue = null; + $this->current_buffer->append_subtree($this, + new Smarty_Internal_ParseTree_Tag($this, + $this->compiler->processNocacheCode($tmp . + $code, + true))); } } - #line 275 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r7() + #line 255 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r2() { - $this->_retvalue = $this->compiler->processText($this->yystack[ $this->yyidx + 0 ]->minor); + $this->current_buffer->append_subtree($this, + $this->compiler->processText($this->yystack[ $this->yyidx + 0 ]->minor)); } - #line 279 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r8() + #line 259 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r3() { - $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor; + $this->strip = true; } - #line 283 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r9() + #line 264 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r4() { - $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor; + $this->strip = false; } - #line 288 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r10() + #line 269 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r5() { - $this->strip = true; + $this->current_buffer->append_subtree($this, + new Smarty_Internal_ParseTree_Text($this->yystack[ $this->yyidx + + -1 ]->minor)); } - #line 292 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r11() + #line 272 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r6() { - $this->strip = false; + $this->_retvalue = $this->yystack[ $this->yyidx + -3 ]->minor . $this->yystack[ $this->yyidx + -1 ]->minor; } - #line 297 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r12() + #line 276 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r7() { - $this->_retvalue = ''; + $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 301 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r13() + #line 281 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r8() { - $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor; + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 305 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r14() + #line 285 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r9() { - $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor; + $this->_retvalue = ''; } - #line 321 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r18() + #line 297 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r10() { - $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor; + if ($this->compiler->has_code) { + $this->current_buffer->append_subtree($this, + $this->mergePrefixCode($this->yystack[ $this->yyidx + 0 ]->minor)); + } + $this->compiler->has_variable_string = false; + $this->block_nesting_level = count($this->compiler->_tag_stack); } - #line 327 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r19() + #line 307 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r12() { - $var = - trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, $this->lex->ldel_length, - $this->lex->rdel_length), - ' $'); + $var = trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, + $this->compiler->getLdelLength(), + -$this->compiler->getRdelLength()), + ' $'); if (preg_match('/^(.*)(\s+nocache)$/', $var, $match)) { - $this->_retvalue = $this->compiler->compileTag('private_print_expression', array('nocache'), + $this->_retvalue = $this->compiler->compileTag('private_print_expression', + array('nocache'), array('value' => $this->compiler->compileVariable('\'' . $match[ 1 ] . '\''))); } else { - $this->_retvalue = $this->compiler->compileTag('private_print_expression', array(), + $this->_retvalue = $this->compiler->compileTag('private_print_expression', + array(), array('value' => $this->compiler->compileVariable('\'' . $var . '\''))); } } - #line 337 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r20() + #line 328 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r13() { - $this->_retvalue = $this->compiler->compileTag('private_print_expression', array(), - array('value' => $this->yystack[ $this->yyidx + 0 ]->minor)); + $tag = trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, + $this->compiler->getLdelLength(), + -$this->compiler->getRdelLength())); + if ($tag == 'strip') { + $this->strip = true; + $this->_retvalue = null;; + } else { + if (defined($tag)) { + if ($this->security) { + $this->security->isTrustedConstant($tag, $this->compiler); + } + $this->_retvalue = + $this->compiler->compileTag('private_print_expression', array(), array('value' => $tag)); + } else { + if (preg_match('/^(.*)(\s+nocache)$/', $tag, $match)) { + $this->_retvalue = $this->compiler->compileTag($match[ 1 ], array('\'nocache\'')); + } else { + $this->_retvalue = $this->compiler->compileTag($tag, array()); + } + } + } } - #line 341 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r21() + #line 339 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r14() { - $this->_retvalue = - $this->compiler->compileTag('private_print_expression', $this->yystack[ $this->yyidx + 0 ]->minor, - array('value' => $this->yystack[ $this->yyidx + - 1 ]->minor)); + $j = strrpos($this->yystack[ $this->yyidx + 0 ]->minor, '.'); + if ($this->yystack[ $this->yyidx + 0 ]->minor[ $j + 1 ] == 'c') { + // {$smarty.block.child} + $this->_retvalue = + $this->compiler->compileTag('child', array(), array($this->yystack[ $this->yyidx + 0 ]->minor));; + } else { + // {$smarty.block.parent} + $this->_retvalue = + $this->compiler->compileTag('parent', array(), array($this->yystack[ $this->yyidx + 0 ]->minor));; + } } - #line 364 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r26() + #line 343 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r15() { - $this->_retvalue = $this->compiler->compileTag('assign', array(array('value' => $this->yystack[ $this->yyidx + - 0 ]->minor), - array('var' => '\'' . - substr($this->yystack[ $this->yyidx + - - 2 ]->minor, - 1) . '\''))); + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor; } - #line 372 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r28() + #line 347 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r16() + { + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor; + } + + #line 356 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r17() + { + $this->_retvalue = $this->compiler->compileTag('private_print_expression', + $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ], + array('value' => $this->yystack[ $this->yyidx + + 0 ]->minor[ 0 ])); + } + + #line 360 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r18() { $this->_retvalue = $this->compiler->compileTag('assign', array_merge(array(array('value' => $this->yystack[ $this->yyidx + - - 1 ]->minor), + 0 ]->minor[ 0 ]), array('var' => '\'' . substr($this->yystack[ $this->yyidx + - - 3 ]->minor, + -1 ]->minor, 1) . '\'')), - $this->yystack[ $this->yyidx + 0 ]->minor)); + $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ])); } - #line 376 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r29() + #line 364 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r19() { $this->_retvalue = $this->compiler->compileTag('assign', array_merge(array(array('value' => $this->yystack[ $this->yyidx + - - 1 ]->minor), + 0 ]->minor[ 0 ]), array('var' => $this->yystack[ $this->yyidx + - - 3 ]->minor[ 'var' ])), - $this->yystack[ $this->yyidx + 0 ]->minor), + -1 ]->minor[ 'var' ])), + $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ]), array('smarty_internal_index' => $this->yystack[ $this->yyidx + - - 3 ]->minor[ 'smarty_internal_index' ])); + -1 ]->minor[ 'smarty_internal_index' ])); } - #line 381 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r30() + #line 368 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r20() { - $tag = - trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, $this->lex->ldel_length, - $this->lex->rdel_length)); - if ($tag == 'strip') { - $this->strip = true; - $this->_retvalue = null;; - } else { - if (defined($tag)) { - if ($this->security) { - $this->security->isTrustedConstant($tag, $this->compiler); - } - $this->_retvalue = - $this->compiler->compileTag('private_print_expression', array(), array('value' => $tag)); - } else { - if (preg_match('/^(.*)(\s+nocache)$/', $tag, $match)) { - $this->_retvalue = $this->compiler->compileTag($match[ 1 ], array("'nocache'")); - } else { - $this->_retvalue = $this->compiler->compileTag($tag, array()); - } - } - } + $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 403 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r31() + #line 383 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r21() { - if (defined($this->yystack[ $this->yyidx + - 1 ]->minor)) { + $this->_retvalue = array($this->yystack[ $this->yyidx + -1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor); + } + + #line 393 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r25() + { + if (defined($this->yystack[ $this->yyidx + -1 ]->minor)) { if ($this->security) { - $this->security->isTrustedConstant($this->yystack[ $this->yyidx + - 1 ]->minor, $this->compiler); + $this->security->isTrustedConstant($this->yystack[ $this->yyidx + -1 ]->minor, $this->compiler); } - $this->_retvalue = - $this->compiler->compileTag('private_print_expression', $this->yystack[ $this->yyidx + 0 ]->minor, - array('value' => $this->yystack[ $this->yyidx + - 1 ]->minor)); + $this->_retvalue = $this->compiler->compileTag('private_print_expression', + $this->yystack[ $this->yyidx + 0 ]->minor, + array('value' => $this->yystack[ $this->yyidx + + -1 ]->minor)); } else { - $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + - 1 ]->minor, + $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + -1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor); } } - #line 413 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r32() + #line 406 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r26() { if (defined($this->yystack[ $this->yyidx + 0 ]->minor)) { if ($this->security) { $this->security->isTrustedConstant($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler); } - $this->_retvalue = $this->compiler->compileTag('private_print_expression', array(), + $this->_retvalue = $this->compiler->compileTag('private_print_expression', + array(), array('value' => $this->yystack[ $this->yyidx + 0 ]->minor)); } else { $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + 0 ]->minor, array()); } } - #line 426 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r33() + #line 418 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r27() { - if (defined($this->yystack[ $this->yyidx + - 2 ]->minor)) { + if (defined($this->yystack[ $this->yyidx + -2 ]->minor)) { if ($this->security) { - $this->security->isTrustedConstant($this->yystack[ $this->yyidx + - 2 ]->minor, $this->compiler); + $this->security->isTrustedConstant($this->yystack[ $this->yyidx + -2 ]->minor, $this->compiler); } - $this->_retvalue = - $this->compiler->compileTag('private_print_expression', $this->yystack[ $this->yyidx + 0 ]->minor, - array('value' => $this->yystack[ $this->yyidx + - 2 ]->minor, - 'modifierlist' => $this->yystack[ $this->yyidx + - 1 ]->minor)); + $this->_retvalue = $this->compiler->compileTag('private_print_expression', + $this->yystack[ $this->yyidx + 0 ]->minor, + array('value' => $this->yystack[ $this->yyidx + + -2 ]->minor, + 'modifierlist' => $this->yystack[ $this->yyidx + + -1 ]->minor)); } else { - $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + - 2 ]->minor, + $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + -2 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor, array('modifierlist' => $this->yystack[ $this->yyidx + - - 1 ]->minor)); + -1 ]->minor)); } } - #line 438 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r34() + #line 423 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r28() { - $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + - 3 ]->minor, + $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + -3 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor, array('object_method' => $this->yystack[ $this->yyidx + - - 1 ]->minor)); + -1 ]->minor)); } - #line 443 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r35() + #line 428 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r29() { - $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + - 4 ]->minor, + $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + -4 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor, - array('modifierlist' => $this->yystack[ $this->yyidx + - - 1 ]->minor, + array('modifierlist' => $this->yystack[ $this->yyidx + + -1 ]->minor, 'object_method' => $this->yystack[ $this->yyidx + - - 2 ]->minor)); + -2 ]->minor)); } - #line 448 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r36() + #line 433 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r30() { - $this->_retvalue = $this->compiler->compileTag('make_nocache', array(array('var' => '\'' . - substr($this->yystack[ $this->yyidx + - 0 ]->minor, - 1) . '\''))); + $this->_retvalue = $this->compiler->compileTag('make_nocache', + array(array('var' => '\'' . substr($this->yystack[ $this->yyidx + + 0 ]->minor, + 1) . '\''))); } - #line 453 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r37() + #line 438 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r31() { - $tag = trim(substr($this->yystack[ $this->yyidx + - 1 ]->minor, $this->lex->ldel_length)); - $this->_retvalue = $this->compiler->compileTag(($tag == 'else if') ? 'elseif' : $tag, array(), + $tag = trim(substr($this->yystack[ $this->yyidx + -1 ]->minor, $this->compiler->getLdelLength())); + $this->_retvalue = $this->compiler->compileTag(($tag === 'else if') ? 'elseif' : $tag, + array(), array('if condition' => $this->yystack[ $this->yyidx + 0 ]->minor)); } - #line 458 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r38() + #line 443 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r32() { - $tag = trim(substr($this->yystack[ $this->yyidx + - 2 ]->minor, $this->lex->ldel_length)); - $this->_retvalue = $this->compiler->compileTag(($tag == 'else if') ? 'elseif' : $tag, + $tag = trim(substr($this->yystack[ $this->yyidx + -2 ]->minor, $this->compiler->getLdelLength())); + $this->_retvalue = $this->compiler->compileTag(($tag === 'else if') ? 'elseif' : $tag, $this->yystack[ $this->yyidx + 0 ]->minor, array('if condition' => $this->yystack[ $this->yyidx + - - 1 ]->minor)); + -1 ]->minor)); } - #line 463 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r39() + #line 454 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r33() { - $tag = trim(substr($this->yystack[ $this->yyidx + - 1 ]->minor, $this->lex->ldel_length)); - $this->_retvalue = $this->compiler->compileTag(($tag == 'else if') ? 'elseif' : $tag, array(), + $tag = trim(substr($this->yystack[ $this->yyidx + -1 ]->minor, $this->compiler->getLdelLength())); + $this->_retvalue = $this->compiler->compileTag(($tag === 'else if') ? 'elseif' : $tag, + array(), array('if condition' => $this->yystack[ $this->yyidx + 0 ]->minor)); } - #line 474 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r41() + #line 458 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r35() { - $this->_retvalue = $this->compiler->compileTag('for', array_merge($this->yystack[ $this->yyidx + 0 ]->minor, - array(array('start' => $this->yystack[ $this->yyidx + - - 6 ]->minor), - array('ifexp' => $this->yystack[ $this->yyidx + - - 4 ]->minor), - array('var' => $this->yystack[ $this->yyidx + - - 2 ]->minor), - array('step' => $this->yystack[ $this->yyidx + - - 1 ]->minor))), + $this->_retvalue = $this->compiler->compileTag('for', + array_merge($this->yystack[ $this->yyidx + 0 ]->minor, + array(array('start' => $this->yystack[ $this->yyidx + + -6 ]->minor), + array('ifexp' => $this->yystack[ $this->yyidx + + -4 ]->minor), + array('var' => $this->yystack[ $this->yyidx + + -2 ]->minor), + array('step' => $this->yystack[ $this->yyidx + + -1 ]->minor))), 1); } - #line 478 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r42() + #line 466 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r36() { $this->_retvalue = '=' . $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 486 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r44() + #line 470 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r38() { - $this->_retvalue = $this->compiler->compileTag('for', array_merge($this->yystack[ $this->yyidx + 0 ]->minor, - array(array('start' => $this->yystack[ $this->yyidx + - - 3 ]->minor), - array('to' => $this->yystack[ $this->yyidx + - - 1 ]->minor))), + $this->_retvalue = $this->compiler->compileTag('for', + array_merge($this->yystack[ $this->yyidx + 0 ]->minor, + array(array('start' => $this->yystack[ $this->yyidx + + -3 ]->minor), + array('to' => $this->yystack[ $this->yyidx + + -1 ]->minor))), 0); } - #line 490 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r45() + #line 475 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r39() { - $this->_retvalue = $this->compiler->compileTag('for', array_merge($this->yystack[ $this->yyidx + 0 ]->minor, - array(array('start' => $this->yystack[ $this->yyidx + - - 5 ]->minor), - array('to' => $this->yystack[ $this->yyidx + - - 3 ]->minor), - array('step' => $this->yystack[ $this->yyidx + - - 1 ]->minor))), + $this->_retvalue = $this->compiler->compileTag('for', + array_merge($this->yystack[ $this->yyidx + 0 ]->minor, + array(array('start' => $this->yystack[ $this->yyidx + + -5 ]->minor), + array('to' => $this->yystack[ $this->yyidx + + -3 ]->minor), + array('step' => $this->yystack[ $this->yyidx + + -1 ]->minor))), 0); } - #line 495 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r46() + #line 479 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r40() { - $this->_retvalue = $this->compiler->compileTag('foreach', $this->yystack[ $this->yyidx + 0 ]->minor); + $this->_retvalue = $this->compiler->compileTag('foreach', + array_merge($this->yystack[ $this->yyidx + 0 ]->minor, + array(array('from' => $this->yystack[ $this->yyidx + + -3 ]->minor), + array('item' => $this->yystack[ $this->yyidx + + -1 ]->minor)))); } - #line 500 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r47() + #line 482 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r41() { - $this->_retvalue = $this->compiler->compileTag('foreach', array_merge($this->yystack[ $this->yyidx + 0 ]->minor, - array(array('from' => $this->yystack[ $this->yyidx + - - 3 ]->minor), - array('item' => $this->yystack[ $this->yyidx + - - 1 ]->minor)))); + $this->_retvalue = $this->compiler->compileTag('foreach', + array_merge($this->yystack[ $this->yyidx + 0 ]->minor, + array(array('from' => $this->yystack[ $this->yyidx + + -5 ]->minor), + array('item' => $this->yystack[ $this->yyidx + + -1 ]->minor), + array('key' => $this->yystack[ $this->yyidx + + -3 ]->minor)))); } - #line 504 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r48() + #line 487 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r42() { - $this->_retvalue = $this->compiler->compileTag('foreach', array_merge($this->yystack[ $this->yyidx + 0 ]->minor, - array(array('from' => $this->yystack[ $this->yyidx + - - 5 ]->minor), - array('item' => $this->yystack[ $this->yyidx + - - 1 ]->minor), - array('key' => $this->yystack[ $this->yyidx + - - 3 ]->minor)))); + $this->_retvalue = $this->compiler->compileTag('foreach', $this->yystack[ $this->yyidx + 0 ]->minor); } - #line 517 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r51() + #line 491 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r43() { - $this->_retvalue = $this->compiler->compileTag('setfilter', array(), + $this->_retvalue = $this->compiler->compileTag('setfilter', + array(), array('modifier_list' => array(array_merge(array($this->yystack[ $this->yyidx + - - 1 ]->minor), + -1 ]->minor), $this->yystack[ $this->yyidx + 0 ]->minor)))); } - #line 521 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r52() + #line 497 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r44() { - $this->_retvalue = $this->compiler->compileTag('setfilter', array(), + $this->_retvalue = $this->compiler->compileTag('setfilter', + array(), array('modifier_list' => array_merge(array(array_merge(array($this->yystack[ $this->yyidx + - - 2 ]->minor), + -2 ]->minor), $this->yystack[ $this->yyidx + - - 1 ]->minor)), + -1 ]->minor)), $this->yystack[ $this->yyidx + 0 ]->minor))); } - #line 526 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r53() - { - $j = strrpos($this->yystack[ $this->yyidx + 0 ]->minor, '.'); - if ($this->yystack[ $this->yyidx + 0 ]->minor[ $j + 1 ] == 'c') { - // {$smarty.block.child} - $this->_retvalue = $this->compiler->compileTag('block_child', array());; - } else { - // {$smarty.block.parent} - $this->_retvalue = $this->compiler->compileTag('block_parent', array());; - } - } + #line 506 "../smarty/lexer/smarty_internal_templateparser.y" - #line 539 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r54() + function yy_r45() { - $tag = - trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, $this->lex->ldel_length, - $this->lex->rdel_length), - ' /'); - if ($tag == 'strip') { + $tag = trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, + $this->compiler->getLdelLength(), + -$this->compiler->getRdelLength()), + ' /'); + if ($tag === 'strip') { $this->strip = false; $this->_retvalue = null; } else { @@ -1880,222 +2518,269 @@ class Smarty_Internal_Templateparser } } - #line 548 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r55() + #line 510 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r46() { $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + 0 ]->minor . 'close', array()); } - #line 552 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r56() + #line 515 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r47() { - $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + - 1 ]->minor . 'close', array(), + $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + -1 ]->minor . 'close', + array(), array('modifier_list' => $this->yystack[ $this->yyidx + 0 ]->minor)); } - #line 557 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r57() + #line 519 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r48() { - $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + - 2 ]->minor . 'close', array(), + $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + -2 ]->minor . 'close', + array(), array('object_method' => $this->yystack[ $this->yyidx + 0 ]->minor)); } - #line 561 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r58() + #line 527 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r49() { - $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + - 3 ]->minor . 'close', array(), + $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + -3 ]->minor . 'close', + array(), array('object_method' => $this->yystack[ $this->yyidx + - - 1 ]->minor, + -1 ]->minor, 'modifier_list' => $this->yystack[ $this->yyidx + 0 ]->minor)); } - #line 569 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r59() + #line 533 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r50() { - $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor; + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor; $this->_retvalue[] = $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 575 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r60() + #line 538 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r51() { $this->_retvalue = array($this->yystack[ $this->yyidx + 0 ]->minor); } - #line 580 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r61() + #line 543 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r52() { $this->_retvalue = array(); } - #line 585 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r62() + #line 554 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r53() { if (defined($this->yystack[ $this->yyidx + 0 ]->minor)) { if ($this->security) { $this->security->isTrustedConstant($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler); } $this->_retvalue = - array($this->yystack[ $this->yyidx + - 2 ]->minor => $this->yystack[ $this->yyidx + 0 ]->minor); + array($this->yystack[ $this->yyidx + -2 ]->minor => $this->yystack[ $this->yyidx + 0 ]->minor); } else { $this->_retvalue = - array($this->yystack[ $this->yyidx + - 2 ]->minor => '\'' . $this->yystack[ $this->yyidx + 0 ]->minor . - '\''); + array($this->yystack[ $this->yyidx + -2 ]->minor => '\'' . $this->yystack[ $this->yyidx + 0 ]->minor . + '\''); } } - #line 596 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r63() + #line 562 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r54() { $this->_retvalue = - array(trim($this->yystack[ $this->yyidx + - 1 ]->minor, " =\n\r\t") => $this->yystack[ $this->yyidx + - 0 ]->minor); + array(trim($this->yystack[ $this->yyidx + -1 ]->minor, " =\n\r\t") => $this->yystack[ $this->yyidx + + 0 ]->minor); } - #line 604 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r65() + #line 574 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r56() { $this->_retvalue = '\'' . $this->yystack[ $this->yyidx + 0 ]->minor . '\''; } - #line 616 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r68() + #line 587 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r59() { $this->_retvalue = - array($this->yystack[ $this->yyidx + - 2 ]->minor => $this->yystack[ $this->yyidx + 0 ]->minor); + array($this->yystack[ $this->yyidx + -2 ]->minor => $this->yystack[ $this->yyidx + 0 ]->minor); } - #line 629 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r70() + #line 592 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r61() { - $this->yystack[ $this->yyidx + - 2 ]->minor[] = $this->yystack[ $this->yyidx + 0 ]->minor; - $this->_retvalue = $this->yystack[ $this->yyidx + - 2 ]->minor; + $this->yystack[ $this->yyidx + -2 ]->minor[] = $this->yystack[ $this->yyidx + 0 ]->minor; + $this->_retvalue = $this->yystack[ $this->yyidx + -2 ]->minor; } - #line 634 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r71() + #line 599 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r62() { - $this->_retvalue = array('var' => '\'' . substr($this->yystack[ $this->yyidx + - 2 ]->minor, 1) . '\'', + $this->_retvalue = array('var' => '\'' . substr($this->yystack[ $this->yyidx + -2 ]->minor, 1) . '\'', 'value' => $this->yystack[ $this->yyidx + 0 ]->minor); } - #line 641 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r73() + #line 603 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r64() { - $this->_retvalue = array('var' => $this->yystack[ $this->yyidx + - 2 ]->minor, + $this->_retvalue = array('var' => $this->yystack[ $this->yyidx + -2 ]->minor, 'value' => $this->yystack[ $this->yyidx + 0 ]->minor); } - #line 665 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r77() + #line 623 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r65() + { + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor; + } + + #line 628 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r68() { $this->_retvalue = - '$_smarty_tpl->getStreamVariable(\'' . substr($this->yystack[ $this->yyidx + - 2 ]->minor, 1) . '://' . + '$_smarty_tpl->getStreamVariable(\'' . substr($this->yystack[ $this->yyidx + -2 ]->minor, 1) . '://' . $this->yystack[ $this->yyidx + 0 ]->minor . '\')'; } - #line 670 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r78() + #line 642 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r69() { $this->_retvalue = - $this->yystack[ $this->yyidx + - 2 ]->minor . trim($this->yystack[ $this->yyidx + - 1 ]->minor) . + $this->yystack[ $this->yyidx + -2 ]->minor . trim($this->yystack[ $this->yyidx + -1 ]->minor) . $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 684 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r81() + #line 648 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r72() { - $this->_retvalue = $this->compiler->compileTag('private_modifier', array(), - array('value' => $this->yystack[ $this->yyidx + - 1 ]->minor, + $this->_retvalue = $this->compiler->compileTag('private_modifier', + array(), + array('value' => $this->yystack[ $this->yyidx + + -1 ]->minor, 'modifierlist' => $this->yystack[ $this->yyidx + 0 ]->minor)); } - #line 690 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r82() + #line 652 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r73() { $this->_retvalue = - $this->yystack[ $this->yyidx + - 1 ]->minor[ 'pre' ] . $this->yystack[ $this->yyidx + - 2 ]->minor . - $this->yystack[ $this->yyidx + - 1 ]->minor[ 'op' ] . $this->yystack[ $this->yyidx + 0 ]->minor . ')'; + $this->yystack[ $this->yyidx + -1 ]->minor[ 'pre' ] . $this->yystack[ $this->yyidx + -2 ]->minor . + $this->yystack[ $this->yyidx + -1 ]->minor[ 'op' ] . $this->yystack[ $this->yyidx + 0 ]->minor . ')'; } - #line 694 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r83() + #line 656 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r74() { - $this->_retvalue = $this->yystack[ $this->yyidx + - 2 ]->minor . $this->yystack[ $this->yyidx + - 1 ]->minor . + $this->_retvalue = $this->yystack[ $this->yyidx + -2 ]->minor . $this->yystack[ $this->yyidx + -1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 698 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r84() + #line 660 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r75() { - $this->_retvalue = - $this->yystack[ $this->yyidx + 0 ]->minor . $this->yystack[ $this->yyidx + - 1 ]->minor . ')'; + $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor . $this->yystack[ $this->yyidx + -1 ]->minor . ')'; } - #line 702 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r85() + #line 664 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r76() { - $this->_retvalue = 'in_array(' . $this->yystack[ $this->yyidx + - 2 ]->minor . ',' . - $this->yystack[ $this->yyidx + 0 ]->minor . ')'; + $this->_retvalue = + 'in_array(' . $this->yystack[ $this->yyidx + -2 ]->minor . ',' . $this->yystack[ $this->yyidx + 0 ]->minor . + ')'; } - #line 706 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r86() + #line 672 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r77() { - $this->_retvalue = 'in_array(' . $this->yystack[ $this->yyidx + - 2 ]->minor . ',(array)' . + $this->_retvalue = 'in_array(' . $this->yystack[ $this->yyidx + -2 ]->minor . ',(array)' . $this->yystack[ $this->yyidx + 0 ]->minor . ')'; } - #line 714 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r87() + #line 676 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r78() { - $this->_retvalue = $this->yystack[ $this->yyidx + - 5 ]->minor . ' ? ' . $this->compiler->compileVariable('\'' . - substr($this->yystack[ $this->yyidx + - - 2 ]->minor, - 1) . - '\'') . + $this->_retvalue = $this->yystack[ $this->yyidx + -5 ]->minor . ' ? ' . $this->compiler->compileVariable('\'' . + substr($this->yystack[ $this->yyidx + + -2 ]->minor, + 1) . + '\'') . ' : ' . $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 718 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r88() + #line 686 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r79() { $this->_retvalue = - $this->yystack[ $this->yyidx + - 5 ]->minor . ' ? ' . $this->yystack[ $this->yyidx + - 2 ]->minor . ' : ' . + $this->yystack[ $this->yyidx + -5 ]->minor . ' ? ' . $this->yystack[ $this->yyidx + -2 ]->minor . ' : ' . $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 733 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r91() + #line 691 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r81() + { + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor; + } + + #line 712 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r82() { $this->_retvalue = '!' . $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 754 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r96() + #line 716 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r87() { - $this->_retvalue = - $this->yystack[ $this->yyidx + - 2 ]->minor . '.' . $this->yystack[ $this->yyidx + 0 ]->minor; + $this->_retvalue = $this->yystack[ $this->yyidx + -2 ]->minor . '.' . $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 758 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r97() + #line 720 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r88() { - $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor . '.'; + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor . '.'; } - #line 762 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r98() + #line 725 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r89() { $this->_retvalue = '.' . $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 767 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r99() + #line 742 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r90() { if (defined($this->yystack[ $this->yyidx + 0 ]->minor)) { if ($this->security) { @@ -2107,90 +2792,99 @@ class Smarty_Internal_Templateparser } } - #line 784 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r101() + #line 746 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r92() { - $this->_retvalue = "(" . $this->yystack[ $this->yyidx + - 1 ]->minor . ")"; + $this->_retvalue = '(' . $this->yystack[ $this->yyidx + -1 ]->minor . ')'; } - #line 788 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r102() + #line 764 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r93() { - $this->_retvalue = $this->yystack[ $this->yyidx + - 2 ]->minor . $this->yystack[ $this->yyidx + - 1 ]->minor . + $this->_retvalue = $this->yystack[ $this->yyidx + -2 ]->minor . $this->yystack[ $this->yyidx + -1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 806 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r106() + #line 775 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r97() { $prefixVar = $this->compiler->getNewPrefixVariable(); - if ($this->yystack[ $this->yyidx + - 2 ]->minor[ 'var' ] == '\'smarty\'') { - $this->compiler->appendPrefixCode("<?php $prefixVar" . ' = ' . - $this->compiler->compileTag('private_special_variable', array(), + if ($this->yystack[ $this->yyidx + -2 ]->minor[ 'var' ] === '\'smarty\'') { + $this->compiler->appendPrefixCode("<?php {$prefixVar} = " . + $this->compiler->compileTag('private_special_variable', + array(), $this->yystack[ $this->yyidx + - - 2 ]->minor[ 'smarty_internal_index' ]) . + -2 ]->minor[ 'smarty_internal_index' ]) . ';?>'); } else { - $this->compiler->appendPrefixCode("<?php $prefixVar" . ' = ' . + $this->compiler->appendPrefixCode("<?php {$prefixVar} = " . $this->compiler->compileVariable($this->yystack[ $this->yyidx + - - 2 ]->minor[ 'var' ]) . - $this->yystack[ $this->yyidx + - 2 ]->minor[ 'smarty_internal_index' ] . + -2 ]->minor[ 'var' ]) . + $this->yystack[ $this->yyidx + -2 ]->minor[ 'smarty_internal_index' ] . ';?>'); } $this->_retvalue = $prefixVar . '::' . $this->yystack[ $this->yyidx + 0 ]->minor[ 0 ] . $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ]; } - #line 817 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r107() + #line 792 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r98() { $prefixVar = $this->compiler->getNewPrefixVariable(); $tmp = $this->compiler->appendCode('<?php ob_start();?>', $this->yystack[ $this->yyidx + 0 ]->minor); - $this->compiler->appendPrefixCode($this->compiler->appendCode($tmp, "<?php $prefixVar" . '=ob_get_clean();?>')); + $this->compiler->appendPrefixCode($this->compiler->appendCode($tmp, "<?php {$prefixVar} = ob_get_clean();?>")); $this->_retvalue = $prefixVar; } - #line 834 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r110() + #line 811 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r101() { - if (!in_array(strtolower($this->yystack[ $this->yyidx + - 2 ]->minor), array('self', 'parent')) && - (!$this->security || - $this->security->isTrustedStaticClassAccess($this->yystack[ $this->yyidx + - 2 ]->minor, - $this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler)) - ) { - if (isset($this->smarty->registered_classes[ $this->yystack[ $this->yyidx + - 2 ]->minor ])) { + if (!in_array(strtolower($this->yystack[ $this->yyidx + -2 ]->minor), array('self', 'parent')) && + (!$this->security || $this->security->isTrustedStaticClassAccess($this->yystack[ $this->yyidx + -2 ]->minor, + $this->yystack[ $this->yyidx + 0 ]->minor, + $this->compiler))) { + if (isset($this->smarty->registered_classes[ $this->yystack[ $this->yyidx + -2 ]->minor ])) { $this->_retvalue = - $this->smarty->registered_classes[ $this->yystack[ $this->yyidx + - 2 ]->minor ] . '::' . + $this->smarty->registered_classes[ $this->yystack[ $this->yyidx + -2 ]->minor ] . '::' . $this->yystack[ $this->yyidx + 0 ]->minor[ 0 ] . $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ]; } else { - $this->_retvalue = $this->yystack[ $this->yyidx + - 2 ]->minor . '::' . - $this->yystack[ $this->yyidx + 0 ]->minor[ 0 ] . - $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ]; + $this->_retvalue = + $this->yystack[ $this->yyidx + -2 ]->minor . '::' . $this->yystack[ $this->yyidx + 0 ]->minor[ 0 ] . + $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ]; } } else { - $this->compiler->trigger_template_error("static class '" . $this->yystack[ $this->yyidx + - 2 ]->minor . - "' is undefined or not allowed by security setting"); + $this->compiler->trigger_template_error('static class \'' . $this->yystack[ $this->yyidx + -2 ]->minor . + '\' is undefined or not allowed by security setting'); } } - #line 853 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r112() + #line 822 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r103() { $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 864 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r113() + #line 825 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r104() { $this->_retvalue = $this->compiler->compileVariable('\'' . substr($this->yystack[ $this->yyidx + 0 ]->minor, 1) . '\''); } - #line 867 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r114() + #line 838 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r105() { - if ($this->yystack[ $this->yyidx + 0 ]->minor[ 'var' ] == '\'smarty\'') { - $smarty_var = $this->compiler->compileTag('private_special_variable', array(), + if ($this->yystack[ $this->yyidx + 0 ]->minor[ 'var' ] === '\'smarty\'') { + $smarty_var = $this->compiler->compileTag('private_special_variable', + array(), $this->yystack[ $this->yyidx + 0 ]->minor[ 'smarty_internal_index' ]); $this->_retvalue = $smarty_var; @@ -2203,480 +2897,556 @@ class Smarty_Internal_Templateparser } } - #line 880 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r115() + #line 848 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r106() { - $this->_retvalue = '$_smarty_tpl->tpl_vars[' . $this->yystack[ $this->yyidx + - 2 ]->minor . ']->' . + $this->_retvalue = '$_smarty_tpl->tpl_vars[' . $this->yystack[ $this->yyidx + -2 ]->minor . ']->' . $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 890 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r117() + #line 852 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r108() { $this->_retvalue = - $this->compiler->compileConfigVariable("'" . $this->yystack[ $this->yyidx + - 1 ]->minor . "'"); + $this->compiler->compileConfigVariable('\'' . $this->yystack[ $this->yyidx + -1 ]->minor . '\''); } - #line 894 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r118() + #line 856 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r109() { $this->_retvalue = '(is_array($tmp = ' . - $this->compiler->compileConfigVariable("'" . $this->yystack[ $this->yyidx + - 2 ]->minor . - "'") . ') ? $tmp' . + $this->compiler->compileConfigVariable('\'' . $this->yystack[ $this->yyidx + -2 ]->minor . + '\'') . ') ? $tmp' . $this->yystack[ $this->yyidx + 0 ]->minor . ' :null)'; } - #line 898 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r119() + #line 860 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r110() { - $this->_retvalue = $this->compiler->compileConfigVariable($this->yystack[ $this->yyidx + - 1 ]->minor); + $this->_retvalue = $this->compiler->compileConfigVariable($this->yystack[ $this->yyidx + -1 ]->minor); } - #line 902 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r120() + #line 864 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r111() { $this->_retvalue = - '(is_array($tmp = ' . $this->compiler->compileConfigVariable($this->yystack[ $this->yyidx + - 2 ]->minor) . + '(is_array($tmp = ' . $this->compiler->compileConfigVariable($this->yystack[ $this->yyidx + -2 ]->minor) . ') ? $tmp' . $this->yystack[ $this->yyidx + 0 ]->minor . ' : null)'; } - #line 906 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r121() + #line 867 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r112() { - $this->_retvalue = array('var' => '\'' . substr($this->yystack[ $this->yyidx + - 1 ]->minor, 1) . '\'', + $this->_retvalue = array('var' => '\'' . substr($this->yystack[ $this->yyidx + -1 ]->minor, 1) . '\'', 'smarty_internal_index' => $this->yystack[ $this->yyidx + 0 ]->minor); } - #line 909 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r122() + #line 880 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r113() { - $this->_retvalue = array('var' => $this->yystack[ $this->yyidx + - 1 ]->minor, + $this->_retvalue = array('var' => $this->yystack[ $this->yyidx + -1 ]->minor, 'smarty_internal_index' => $this->yystack[ $this->yyidx + 0 ]->minor); } - #line 922 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r124() + #line 886 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r115() { return; } - #line 928 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r125() + #line 889 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r116() { $this->_retvalue = '[' . $this->compiler->compileVariable('\'' . substr($this->yystack[ $this->yyidx + 0 ]->minor, 1) . '\'') . ']'; } - #line 931 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r126() + #line 893 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r117() { $this->_retvalue = '[' . $this->compiler->compileVariable($this->yystack[ $this->yyidx + 0 ]->minor) . ']'; } - #line 935 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r127() + #line 897 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r118() { - $this->_retvalue = '[' . $this->compiler->compileVariable($this->yystack[ $this->yyidx + - 2 ]->minor) . '->' . + $this->_retvalue = '[' . $this->compiler->compileVariable($this->yystack[ $this->yyidx + -2 ]->minor) . '->' . $this->yystack[ $this->yyidx + 0 ]->minor . ']'; } - #line 939 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r128() + #line 901 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r119() { - $this->_retvalue = "['" . $this->yystack[ $this->yyidx + 0 ]->minor . "']"; + $this->_retvalue = '[\'' . $this->yystack[ $this->yyidx + 0 ]->minor . '\']'; } - #line 943 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r129() + #line 906 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r120() { $this->_retvalue = '[' . $this->yystack[ $this->yyidx + 0 ]->minor . ']'; } - #line 948 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r130() + #line 911 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r121() { - $this->_retvalue = '[' . $this->yystack[ $this->yyidx + - 1 ]->minor . ']'; + $this->_retvalue = '[' . $this->yystack[ $this->yyidx + -1 ]->minor . ']'; } - #line 953 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r131() + #line 915 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r122() { - $this->_retvalue = '[' . $this->compiler->compileTag('private_special_variable', array(), '[\'section\'][\'' . - $this->yystack[ $this->yyidx + - - 1 ]->minor . - '\'][\'index\']') . - ']'; + $this->_retvalue = '[' . $this->compiler->compileTag('private_special_variable', + array(), + '[\'section\'][\'' . + $this->yystack[ $this->yyidx + -1 ]->minor . + '\'][\'index\']') . ']'; } - #line 957 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r132() + #line 918 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r123() { - $this->_retvalue = '[' . $this->compiler->compileTag('private_special_variable', array(), '[\'section\'][\'' . - $this->yystack[ $this->yyidx + - - 3 ]->minor . - '\'][\'' . - $this->yystack[ $this->yyidx + - - 1 ]->minor . - '\']') . ']'; + $this->_retvalue = '[' . $this->compiler->compileTag('private_special_variable', + array(), + '[\'section\'][\'' . + $this->yystack[ $this->yyidx + -3 ]->minor . '\'][\'' . + $this->yystack[ $this->yyidx + -1 ]->minor . '\']') . ']'; } - #line 960 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r133() + #line 924 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r124() { - $this->_retvalue = '[' . $this->yystack[ $this->yyidx + - 1 ]->minor . ']'; + $this->_retvalue = '[' . $this->yystack[ $this->yyidx + -1 ]->minor . ']'; } - #line 966 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r135() + #line 940 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r126() { $this->_retvalue = '[' . $this->compiler->compileVariable('\'' . - substr($this->yystack[ $this->yyidx + - 1 ]->minor, + substr($this->yystack[ $this->yyidx + -1 ]->minor, 1) . '\'') . ']';; } - #line 982 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r139() + #line 950 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r130() { $this->_retvalue = '[]'; } - #line 992 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r140() + #line 954 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r131() { $this->_retvalue = '\'' . substr($this->yystack[ $this->yyidx + 0 ]->minor, 1) . '\''; } - #line 996 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r141() + #line 959 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r132() { - $this->_retvalue = "''"; + $this->_retvalue = '\'\''; } - #line 1001 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r142() + #line 967 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r133() { - $this->_retvalue = - $this->yystack[ $this->yyidx + - 1 ]->minor . '.' . $this->yystack[ $this->yyidx + 0 ]->minor; + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor . '.' . $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 1009 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r144() + #line 973 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r135() { - $var = - trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, $this->lex->ldel_length, - $this->lex->rdel_length), - ' $'); + $var = trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, + $this->compiler->getLdelLength(), + -$this->compiler->getRdelLength()), + ' $'); $this->_retvalue = $this->compiler->compileVariable('\'' . $var . '\''); } - #line 1015 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r145() + #line 980 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r136() { - $this->_retvalue = '(' . $this->yystack[ $this->yyidx + - 1 ]->minor . ')'; + $this->_retvalue = '(' . $this->yystack[ $this->yyidx + -1 ]->minor . ')'; } - #line 1022 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r146() + #line 989 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r137() { - if ($this->yystack[ $this->yyidx + - 1 ]->minor[ 'var' ] == '\'smarty\'') { - $this->_retvalue = $this->compiler->compileTag('private_special_variable', array(), + if ($this->yystack[ $this->yyidx + -1 ]->minor[ 'var' ] === '\'smarty\'') { + $this->_retvalue = $this->compiler->compileTag('private_special_variable', + array(), $this->yystack[ $this->yyidx + - - 1 ]->minor[ 'smarty_internal_index' ]) . + -1 ]->minor[ 'smarty_internal_index' ]) . $this->yystack[ $this->yyidx + 0 ]->minor; } else { - $this->_retvalue = $this->compiler->compileVariable($this->yystack[ $this->yyidx + - 1 ]->minor[ 'var' ]) . - $this->yystack[ $this->yyidx + - 1 ]->minor[ 'smarty_internal_index' ] . + $this->_retvalue = $this->compiler->compileVariable($this->yystack[ $this->yyidx + -1 ]->minor[ 'var' ]) . + $this->yystack[ $this->yyidx + -1 ]->minor[ 'smarty_internal_index' ] . $this->yystack[ $this->yyidx + 0 ]->minor; } } - #line 1031 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r147() + #line 994 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r138() { $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 1036 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r148() + #line 999 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r139() { - $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor; + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 1041 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r149() + #line 1006 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r140() { - if ($this->security && substr($this->yystack[ $this->yyidx + - 1 ]->minor, 0, 1) == '_') { + if ($this->security && substr($this->yystack[ $this->yyidx + -1 ]->minor, 0, 1) === '_') { $this->compiler->trigger_template_error(self::Err1); } $this->_retvalue = - '->' . $this->yystack[ $this->yyidx + - 1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor; + '->' . $this->yystack[ $this->yyidx + -1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 1048 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r150() + #line 1013 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r141() { if ($this->security) { $this->compiler->trigger_template_error(self::Err2); } - $this->_retvalue = '->{' . $this->compiler->compileVariable($this->yystack[ $this->yyidx + - 1 ]->minor) . + $this->_retvalue = '->{' . $this->compiler->compileVariable($this->yystack[ $this->yyidx + -1 ]->minor) . $this->yystack[ $this->yyidx + 0 ]->minor . '}'; } - #line 1055 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r151() + #line 1020 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r142() { if ($this->security) { $this->compiler->trigger_template_error(self::Err2); } $this->_retvalue = - '->{' . $this->yystack[ $this->yyidx + - 2 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor . '}'; + '->{' . $this->yystack[ $this->yyidx + -2 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor . '}'; } - #line 1062 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r152() + #line 1028 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r143() { if ($this->security) { $this->compiler->trigger_template_error(self::Err2); } - $this->_retvalue = '->{\'' . $this->yystack[ $this->yyidx + - 4 ]->minor . '\'.' . - $this->yystack[ $this->yyidx + - 2 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor . - '}'; + $this->_retvalue = + '->{\'' . $this->yystack[ $this->yyidx + -4 ]->minor . '\'.' . $this->yystack[ $this->yyidx + -2 ]->minor . + $this->yystack[ $this->yyidx + 0 ]->minor . '}'; } - #line 1070 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r153() + #line 1036 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r144() { $this->_retvalue = '->' . $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 1078 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r154() + #line 1044 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r145() { - $this->_retvalue = $this->compiler->compilePHPFunctionCall($this->yystack[ $this->yyidx + - 3 ]->minor, - $this->yystack[ $this->yyidx + - 1 ]->minor); + $this->_retvalue = $this->compiler->compilePHPFunctionCall($this->yystack[ $this->yyidx + -3 ]->minor, + $this->yystack[ $this->yyidx + -1 ]->minor); } - #line 1086 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r155() + #line 1051 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r146() { - if ($this->security && substr($this->yystack[ $this->yyidx + - 3 ]->minor, 0, 1) == '_') { + if ($this->security && substr($this->yystack[ $this->yyidx + -3 ]->minor, 0, 1) === '_') { $this->compiler->trigger_template_error(self::Err1); } - $this->_retvalue = $this->yystack[ $this->yyidx + - 3 ]->minor . "(" . - implode(',', $this->yystack[ $this->yyidx + - 1 ]->minor) . ")"; + $this->_retvalue = $this->yystack[ $this->yyidx + -3 ]->minor . '(' . + implode(',', $this->yystack[ $this->yyidx + -1 ]->minor) . ')'; } - #line 1093 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r156() + #line 1062 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r147() { if ($this->security) { $this->compiler->trigger_template_error(self::Err2); } $prefixVar = $this->compiler->getNewPrefixVariable(); - $this->compiler->appendPrefixCode("<?php $prefixVar" . '=' . $this->compiler->compileVariable('\'' . - substr($this->yystack[ $this->yyidx + - - 3 ]->minor, - 1) . - '\'') . ';?>'); - $this->_retvalue = $prefixVar . '(' . implode(',', $this->yystack[ $this->yyidx + - 1 ]->minor) . ')'; + $this->compiler->appendPrefixCode("<?php {$prefixVar} = " . $this->compiler->compileVariable('\'' . + substr($this->yystack[ $this->yyidx + + -3 ]->minor, + 1) . '\'') . + ';?>'); + $this->_retvalue = $prefixVar . '(' . implode(',', $this->yystack[ $this->yyidx + -1 ]->minor) . ')'; } - #line 1104 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r157() + #line 1079 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r148() { $this->_retvalue = - array_merge($this->yystack[ $this->yyidx + - 2 ]->minor, array($this->yystack[ $this->yyidx + 0 ]->minor)); + array_merge($this->yystack[ $this->yyidx + -2 ]->minor, array($this->yystack[ $this->yyidx + 0 ]->minor)); } - #line 1121 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r160() + #line 1083 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r151() { - $this->_retvalue = array_merge($this->yystack[ $this->yyidx + - 2 ]->minor, - array(array_merge($this->yystack[ $this->yyidx + - 1 ]->minor, + $this->_retvalue = array_merge($this->yystack[ $this->yyidx + -2 ]->minor, + array(array_merge($this->yystack[ $this->yyidx + -1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor))); } - #line 1125 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r161() + #line 1091 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r152() { $this->_retvalue = - array(array_merge($this->yystack[ $this->yyidx + - 1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor)); + array(array_merge($this->yystack[ $this->yyidx + -1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor)); } - #line 1133 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r163() + #line 1099 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r154() { $this->_retvalue = array($this->yystack[ $this->yyidx + 0 ]->minor); } - #line 1141 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r164() + #line 1118 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r155() { $this->_retvalue = - array_merge($this->yystack[ $this->yyidx + - 1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor); + array_merge($this->yystack[ $this->yyidx + -1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor); } - #line 1160 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r168() + #line 1123 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r159() { $this->_retvalue = array($this->yystack[ $this->yyidx + 0 ]->minor, '', 'method'); } - #line 1165 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r169() + #line 1128 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r160() { $this->_retvalue = - array($this->yystack[ $this->yyidx + - 1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor, 'method'); + array($this->yystack[ $this->yyidx + -1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor, 'method'); } - #line 1170 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r170() + #line 1133 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r161() { $this->_retvalue = array($this->yystack[ $this->yyidx + 0 ]->minor, ''); } - #line 1175 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r171() + #line 1138 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r162() { $this->_retvalue = - array($this->yystack[ $this->yyidx + - 1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor, 'property'); + array($this->yystack[ $this->yyidx + -1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor, 'property'); } - #line 1180 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r172() + #line 1144 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r163() { - $this->_retvalue = array($this->yystack[ $this->yyidx + - 2 ]->minor, - $this->yystack[ $this->yyidx + - 1 ]->minor . - $this->yystack[ $this->yyidx + 0 ]->minor, 'property'); + $this->_retvalue = array($this->yystack[ $this->yyidx + -2 ]->minor, + $this->yystack[ $this->yyidx + -1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor, + 'property'); } - #line 1186 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r173() + #line 1148 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r164() { $this->_retvalue = ' ' . trim($this->yystack[ $this->yyidx + 0 ]->minor) . ' '; } - #line 1190 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r174() - { - static $lops = - array('eq' => ' == ', 'ne' => ' != ', 'neq' => ' != ', 'gt' => ' > ', 'ge' => ' >= ', 'gte' => ' >= ', - 'lt' => ' < ', 'le' => ' <= ', 'lte' => ' <= ', 'mod' => ' % ', 'and' => ' && ', 'or' => ' || ', - 'xor' => ' xor ',); + #line 1167 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r165() + { + static $lops = array( + 'eq' => ' == ', + 'ne' => ' != ', + 'neq' => ' != ', + 'gt' => ' > ', + 'ge' => ' >= ', + 'gte' => ' >= ', + 'lt' => ' < ', + 'le' => ' <= ', + 'lte' => ' <= ', + 'mod' => ' % ', + 'and' => ' && ', + 'or' => ' || ', + 'xor' => ' xor ', + ); $op = strtolower(preg_replace('/\s*/', '', $this->yystack[ $this->yyidx + 0 ]->minor)); $this->_retvalue = $lops[ $op ]; } - #line 1209 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r175() + #line 1180 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r166() { - static $tlops = - array('isdivby' => array('op' => ' % ', 'pre' => '!('), 'isnotdivby' => array('op' => ' % ', 'pre' => '('), - 'isevenby' => array('op' => ' / ', 'pre' => '!(1 & '), - 'isnotevenby' => array('op' => ' / ', 'pre' => '(1 & '), - 'isoddby' => array('op' => ' / ', 'pre' => '(1 & '), - 'isnotoddby' => array('op' => ' / ', 'pre' => '!(1 & '),); + static $tlops = array( + 'isdivby' => array('op' => ' % ', 'pre' => '!('), + 'isnotdivby' => array('op' => ' % ', 'pre' => '('), + 'isevenby' => array('op' => ' / ', 'pre' => '!(1 & '), + 'isnotevenby' => array('op' => ' / ', 'pre' => '(1 & '), + 'isoddby' => array('op' => ' / ', 'pre' => '(1 & '), + 'isnotoddby' => array('op' => ' / ', 'pre' => '!(1 & '), + ); $op = strtolower(preg_replace('/\s*/', '', $this->yystack[ $this->yyidx + 0 ]->minor)); $this->_retvalue = $tlops[ $op ]; } - #line 1222 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r176() + #line 1194 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r167() { - static $scond = - array('iseven' => '!(1 & ', 'isnoteven' => '(1 & ', 'isodd' => '(1 & ', 'isnotodd' => '!(1 & ',); + static $scond = array( + 'iseven' => '!(1 & ', + 'isnoteven' => '(1 & ', + 'isodd' => '(1 & ', + 'isnotodd' => '!(1 & ', + ); $op = strtolower(str_replace(' ', '', $this->yystack[ $this->yyidx + 0 ]->minor)); $this->_retvalue = $scond[ $op ]; } - #line 1236 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r177() + #line 1202 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r168() { - $this->_retvalue = 'array(' . $this->yystack[ $this->yyidx + - 1 ]->minor . ')'; + $this->_retvalue = 'array(' . $this->yystack[ $this->yyidx + -1 ]->minor . ')'; } - #line 1244 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r179() + #line 1210 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r170() { - $this->_retvalue = - $this->yystack[ $this->yyidx + - 2 ]->minor . ',' . $this->yystack[ $this->yyidx + 0 ]->minor; + $this->_retvalue = $this->yystack[ $this->yyidx + -2 ]->minor . ',' . $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 1252 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r181() + #line 1214 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r172() { $this->_retvalue = - $this->yystack[ $this->yyidx + - 2 ]->minor . '=>' . $this->yystack[ $this->yyidx + 0 ]->minor; + $this->yystack[ $this->yyidx + -2 ]->minor . '=>' . $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 1256 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r182() + #line 1230 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r173() { $this->_retvalue = - '\'' . $this->yystack[ $this->yyidx + - 2 ]->minor . '\'=>' . $this->yystack[ $this->yyidx + 0 ]->minor; + '\'' . $this->yystack[ $this->yyidx + -2 ]->minor . '\'=>' . $this->yystack[ $this->yyidx + 0 ]->minor; } - #line 1272 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r185() + #line 1236 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r176() { - $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor->to_smarty_php($this); + $this->compiler->leaveDoubleQuote(); + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor->to_smarty_php($this); } - #line 1277 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r186() + #line 1241 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r177() { - $this->yystack[ $this->yyidx + - 1 ]->minor->append_subtree($this, $this->yystack[ $this->yyidx + 0 ]->minor); - $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor; + $this->yystack[ $this->yyidx + -1 ]->minor->append_subtree($this, $this->yystack[ $this->yyidx + 0 ]->minor); + $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor; } - #line 1282 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r187() + #line 1245 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r178() { $this->_retvalue = new Smarty_Internal_ParseTree_Dq($this, $this->yystack[ $this->yyidx + 0 ]->minor); } - #line 1286 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r188() + #line 1249 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r179() { - $this->_retvalue = new Smarty_Internal_ParseTree_Code('(string)' . $this->yystack[ $this->yyidx + - 1 ]->minor); + $this->_retvalue = new Smarty_Internal_ParseTree_Code('(string)' . $this->yystack[ $this->yyidx + -1 ]->minor); } - #line 1294 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r190() + #line 1253 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r180() + { + $this->_retvalue = + new Smarty_Internal_ParseTree_Code('(string)(' . $this->yystack[ $this->yyidx + -1 ]->minor . ')'); + } + + #line 1265 "../smarty/lexer/smarty_internal_templateparser.y" + + function yy_r181() { $this->_retvalue = new Smarty_Internal_ParseTree_Code('(string)$_smarty_tpl->tpl_vars[\'' . substr($this->yystack[ $this->yyidx + 0 ]->minor, 1) . '\']->value'); } - #line 1302 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r192() - { - $this->_retvalue = - new Smarty_Internal_ParseTree_Code('(string)(' . $this->yystack[ $this->yyidx + - 1 ]->minor . ')'); - } + #line 1269 "../smarty/lexer/smarty_internal_templateparser.y" - #line 1306 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r193() + function yy_r184() { $this->_retvalue = new Smarty_Internal_ParseTree_Tag($this, $this->yystack[ $this->yyidx + 0 ]->minor); } - #line 1310 "../smarty/lexer/smarty_internal_templateparser.y" - function yy_r194() + function yy_r185() { $this->_retvalue = new Smarty_Internal_ParseTree_DqContent($this->yystack[ $this->yyidx + 0 ]->minor); } - private $_retvalue; - public function yy_reduce($yyruleno) { - if ($this->yyTraceFILE && $yyruleno >= 0 && $yyruleno < count(self::$yyRuleName)) { - fprintf($this->yyTraceFILE, "%sReduce (%d) [%s].\n", $this->yyTracePrompt, $yyruleno, + if ($this->yyTraceFILE && $yyruleno >= 0 + && $yyruleno < count(self::$yyRuleName)) { + fprintf($this->yyTraceFILE, + "%sReduce (%d) [%s].\n", + $this->yyTracePrompt, + $yyruleno, self::$yyRuleName[ $yyruleno ]); } - $this->_retvalue = $yy_lefthand_side = null; if (isset(self::$yyReduceMap[ $yyruleno ])) { // call the action @@ -2687,14 +3457,14 @@ class Smarty_Internal_Templateparser $yygoto = self::$yyRuleInfo[ $yyruleno ][ 0 ]; $yysize = self::$yyRuleInfo[ $yyruleno ][ 1 ]; $this->yyidx -= $yysize; - for ($i = $yysize; $i; $i --) { + for ($i = $yysize; $i; $i--) { // pop all of the right-hand side parameters array_pop($this->yystack); } $yyact = $this->yy_find_reduce_action($this->yystack[ $this->yyidx ]->stateno, $yygoto); if ($yyact < self::YYNSTATE) { if (!$this->yyTraceFILE && $yysize) { - $this->yyidx ++; + $this->yyidx++; $x = new TP_yyStackEntry; $x->stateno = $yyact; $x->major = $yygoto; @@ -2703,7 +3473,7 @@ class Smarty_Internal_Templateparser } else { $this->yy_shift($yyact, $yygoto, $yy_lefthand_side); } - } elseif ($yyact == self::YYNSTATE + self::YYNRULE + 1) { + } else if ($yyact === self::YYNSTATE + self::YYNRULE + 1) { $this->yy_accept(); } } @@ -2720,8 +3490,7 @@ class Smarty_Internal_Templateparser public function yy_syntax_error($yymajor, $TOKEN) { - #line 200 "../smarty/lexer/smarty_internal_templateparser.y" - + #line 214 "../smarty/lexer/smarty_internal_templateparser.y" $this->internalError = true; $this->yymajor = $yymajor; $this->compiler->trigger_template_error(); @@ -2735,8 +3504,7 @@ class Smarty_Internal_Templateparser while ($this->yyidx >= 0) { $this->yy_pop_parser_stack(); } - #line 193 "../smarty/lexer/smarty_internal_templateparser.y" - + #line 207 "../smarty/lexer/smarty_internal_templateparser.y" $this->successful = !$this->internalError; $this->internalError = false; $this->retvalue = $this->_retvalue; @@ -2745,10 +3513,9 @@ class Smarty_Internal_Templateparser public function doParse($yymajor, $yytokenvalue) { $yyerrorhit = 0; /* True if yymajor has invoked an error */ - if ($this->yyidx === null || $this->yyidx < 0) { $this->yyidx = 0; - $this->yyerrcnt = - 1; + $this->yyerrcnt = -1; $x = new TP_yyStackEntry; $x->stateno = 0; $x->major = 0; @@ -2756,53 +3523,61 @@ class Smarty_Internal_Templateparser $this->yystack[] = $x; } $yyendofinput = ($yymajor == 0); - if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%sInput %s\n", $this->yyTracePrompt, $this->yyTokenName[ $yymajor ]); + fprintf($this->yyTraceFILE, + "%sInput %s\n", + $this->yyTracePrompt, + $this->yyTokenName[ $yymajor ]); } - do { $yyact = $this->yy_find_shift_action($yymajor); - if ($yymajor < self::YYERRORSYMBOL && !$this->yy_is_expected_token($yymajor)) { + if ($yymajor < self::YYERRORSYMBOL && + !$this->yy_is_expected_token($yymajor)) { // force a syntax error $yyact = self::YY_ERROR_ACTION; } if ($yyact < self::YYNSTATE) { $this->yy_shift($yyact, $yymajor, $yytokenvalue); - $this->yyerrcnt --; + $this->yyerrcnt--; if ($yyendofinput && $this->yyidx >= 0) { $yymajor = 0; } else { $yymajor = self::YYNOCODE; } - } elseif ($yyact < self::YYNSTATE + self::YYNRULE) { + } else if ($yyact < self::YYNSTATE + self::YYNRULE) { $this->yy_reduce($yyact - self::YYNSTATE); - } elseif ($yyact == self::YY_ERROR_ACTION) { + } else if ($yyact === self::YY_ERROR_ACTION) { if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%sSyntax Error!\n", $this->yyTracePrompt); + fprintf($this->yyTraceFILE, + "%sSyntax Error!\n", + $this->yyTracePrompt); } if (self::YYERRORSYMBOL) { if ($this->yyerrcnt < 0) { $this->yy_syntax_error($yymajor, $yytokenvalue); } $yymx = $this->yystack[ $this->yyidx ]->major; - if ($yymx == self::YYERRORSYMBOL || $yyerrorhit) { + if ($yymx === self::YYERRORSYMBOL || $yyerrorhit) { if ($this->yyTraceFILE) { - fprintf($this->yyTraceFILE, "%sDiscard input token %s\n", $this->yyTracePrompt, + fprintf($this->yyTraceFILE, + "%sDiscard input token %s\n", + $this->yyTracePrompt, $this->yyTokenName[ $yymajor ]); } $this->yy_destructor($yymajor, $yytokenvalue); $yymajor = self::YYNOCODE; } else { - while ($this->yyidx >= 0 && $yymx != self::YYERRORSYMBOL && - ($yyact = $this->yy_find_shift_action(self::YYERRORSYMBOL)) >= self::YYNSTATE) { + while ($this->yyidx >= 0 && + $yymx !== self::YYERRORSYMBOL && + ($yyact = $this->yy_find_shift_action(self::YYERRORSYMBOL)) >= self::YYNSTATE + ) { $this->yy_pop_parser_stack(); } if ($this->yyidx < 0 || $yymajor == 0) { $this->yy_destructor($yymajor, $yytokenvalue); $this->yy_parse_failed(); $yymajor = self::YYNOCODE; - } elseif ($yymx != self::YYERRORSYMBOL) { + } else if ($yymx !== self::YYERRORSYMBOL) { $u2 = 0; $this->yy_shift($yyact, self::YYERRORSYMBOL, $u2); } @@ -2824,8 +3599,7 @@ class Smarty_Internal_Templateparser $this->yy_accept(); $yymajor = self::YYNOCODE; } - } - while ($yymajor != self::YYNOCODE && $this->yyidx >= 0); + } while ($yymajor !== self::YYNOCODE && $this->yyidx >= 0); } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_testinstall.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_testinstall.php index 7cb575573..bea8b3a80 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_testinstall.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_testinstall.php @@ -28,15 +28,12 @@ class Smarty_Internal_TestInstall public static function testInstall(Smarty $smarty, &$errors = null) { $status = true; - if ($errors === null) { echo "<PRE>\n"; echo "Smarty Installation test...\n"; echo "Testing template directory...\n"; } - $_stream_resolve_include_path = function_exists('stream_resolve_include_path'); - // test if all registered template_dir are accessible foreach ($smarty->getTemplateDir() as $template_dir) { $_template_dir = $template_dir; @@ -50,12 +47,10 @@ class Smarty_Internal_TestInstall } else { $template_dir = $smarty->ext->_getIncludePath->getIncludePath($_template_dir, null, $smarty); } - if ($template_dir !== false) { if ($errors === null) { echo "$template_dir is OK.\n"; } - continue; } else { $status = false; @@ -66,7 +61,6 @@ class Smarty_Internal_TestInstall } else { $errors[ 'template_dir' ] = $message; } - continue; } } else { @@ -77,11 +71,9 @@ class Smarty_Internal_TestInstall } else { $errors[ 'template_dir' ] = $message; } - continue; } } - if (!is_dir($template_dir)) { $status = false; $message = "FAILED: $template_dir is not a directory"; @@ -90,7 +82,7 @@ class Smarty_Internal_TestInstall } else { $errors[ 'template_dir' ] = $message; } - } elseif (!is_readable($template_dir)) { + } else if (!is_readable($template_dir)) { $status = false; $message = "FAILED: $template_dir is not readable"; if ($errors === null) { @@ -104,11 +96,9 @@ class Smarty_Internal_TestInstall } } } - if ($errors === null) { echo "Testing compile directory...\n"; } - // test if registered compile_dir is accessible $__compile_dir = $smarty->getCompileDir(); $_compile_dir = realpath($__compile_dir); @@ -120,7 +110,7 @@ class Smarty_Internal_TestInstall } else { $errors[ 'compile_dir' ] = $message; } - } elseif (!is_dir($_compile_dir)) { + } else if (!is_dir($_compile_dir)) { $status = false; $message = "FAILED: {$_compile_dir} is not a directory"; if ($errors === null) { @@ -128,7 +118,7 @@ class Smarty_Internal_TestInstall } else { $errors[ 'compile_dir' ] = $message; } - } elseif (!is_readable($_compile_dir)) { + } else if (!is_readable($_compile_dir)) { $status = false; $message = "FAILED: {$_compile_dir} is not readable"; if ($errors === null) { @@ -136,7 +126,7 @@ class Smarty_Internal_TestInstall } else { $errors[ 'compile_dir' ] = $message; } - } elseif (!is_writable($_compile_dir)) { + } else if (!is_writable($_compile_dir)) { $status = false; $message = "FAILED: {$_compile_dir} is not writable"; if ($errors === null) { @@ -149,11 +139,9 @@ class Smarty_Internal_TestInstall echo "{$_compile_dir} is OK.\n"; } } - if ($errors === null) { echo "Testing plugins directory...\n"; } - // test if all registered plugins_dir are accessible // and if core plugins directory is still registered $_core_plugins_dir = realpath(dirname(__FILE__) . '/../plugins'); @@ -170,12 +158,10 @@ class Smarty_Internal_TestInstall } else { $plugin_dir = $smarty->ext->_getIncludePath->getIncludePath($_plugin_dir, null, $smarty); } - if ($plugin_dir !== false) { if ($errors === null) { echo "$plugin_dir is OK.\n"; } - continue; } else { $status = false; @@ -185,7 +171,6 @@ class Smarty_Internal_TestInstall } else { $errors[ 'plugins_dir' ] = $message; } - continue; } } else { @@ -196,11 +181,9 @@ class Smarty_Internal_TestInstall } else { $errors[ 'plugins_dir' ] = $message; } - continue; } } - if (!is_dir($plugin_dir)) { $status = false; $message = "FAILED: $plugin_dir is not a directory"; @@ -209,7 +192,7 @@ class Smarty_Internal_TestInstall } else { $errors[ 'plugins_dir' ] = $message; } - } elseif (!is_readable($plugin_dir)) { + } else if (!is_readable($plugin_dir)) { $status = false; $message = "FAILED: $plugin_dir is not readable"; if ($errors === null) { @@ -217,7 +200,7 @@ class Smarty_Internal_TestInstall } else { $errors[ 'plugins_dir' ] = $message; } - } elseif ($_core_plugins_dir && $_core_plugins_dir == realpath($plugin_dir)) { + } else if ($_core_plugins_dir && $_core_plugins_dir == realpath($plugin_dir)) { $_core_plugins_available = true; if ($errors === null) { echo "$plugin_dir is OK.\n"; @@ -233,15 +216,13 @@ class Smarty_Internal_TestInstall $message = "WARNING: Smarty's own libs/plugins is not available"; if ($errors === null) { echo $message . ".\n"; - } elseif (!isset($errors[ 'plugins_dir' ])) { + } else if (!isset($errors[ 'plugins_dir' ])) { $errors[ 'plugins_dir' ] = $message; } } - if ($errors === null) { echo "Testing cache directory...\n"; } - // test if all registered cache_dir is accessible $__cache_dir = $smarty->getCacheDir(); $_cache_dir = realpath($__cache_dir); @@ -253,7 +234,7 @@ class Smarty_Internal_TestInstall } else { $errors[ 'cache_dir' ] = $message; } - } elseif (!is_dir($_cache_dir)) { + } else if (!is_dir($_cache_dir)) { $status = false; $message = "FAILED: {$_cache_dir} is not a directory"; if ($errors === null) { @@ -261,7 +242,7 @@ class Smarty_Internal_TestInstall } else { $errors[ 'cache_dir' ] = $message; } - } elseif (!is_readable($_cache_dir)) { + } else if (!is_readable($_cache_dir)) { $status = false; $message = "FAILED: {$_cache_dir} is not readable"; if ($errors === null) { @@ -269,7 +250,7 @@ class Smarty_Internal_TestInstall } else { $errors[ 'cache_dir' ] = $message; } - } elseif (!is_writable($_cache_dir)) { + } else if (!is_writable($_cache_dir)) { $status = false; $message = "FAILED: {$_cache_dir} is not writable"; if ($errors === null) { @@ -282,11 +263,9 @@ class Smarty_Internal_TestInstall echo "{$_cache_dir} is OK.\n"; } } - if ($errors === null) { echo "Testing configs directory...\n"; } - // test if all registered config_dir are accessible foreach ($smarty->getConfigDir() as $config_dir) { $_config_dir = $config_dir; @@ -299,12 +278,10 @@ class Smarty_Internal_TestInstall } else { $config_dir = $smarty->ext->_getIncludePath->getIncludePath($_config_dir, null, $smarty); } - if ($config_dir !== false) { if ($errors === null) { echo "$config_dir is OK.\n"; } - continue; } else { $status = false; @@ -314,7 +291,6 @@ class Smarty_Internal_TestInstall } else { $errors[ 'config_dir' ] = $message; } - continue; } } else { @@ -325,11 +301,9 @@ class Smarty_Internal_TestInstall } else { $errors[ 'config_dir' ] = $message; } - continue; } } - if (!is_dir($config_dir)) { $status = false; $message = "FAILED: $config_dir is not a directory"; @@ -338,7 +312,7 @@ class Smarty_Internal_TestInstall } else { $errors[ 'config_dir' ] = $message; } - } elseif (!is_readable($config_dir)) { + } else if (!is_readable($config_dir)) { $status = false; $message = "FAILED: $config_dir is not readable"; if ($errors === null) { @@ -352,153 +326,165 @@ class Smarty_Internal_TestInstall } } } - if ($errors === null) { echo "Testing sysplugin files...\n"; } // test if sysplugins are available $source = SMARTY_SYSPLUGINS_DIR; if (is_dir($source)) { - $expectedSysplugins = array('smartycompilerexception.php' => true, 'smartyexception.php' => true, - 'smarty_cacheresource.php' => true, 'smarty_cacheresource_custom.php' => true, - 'smarty_cacheresource_keyvaluestore.php' => true, 'smarty_data.php' => true, - 'smarty_internal_block.php' => true, - 'smarty_internal_cacheresource_file.php' => true, - 'smarty_internal_compilebase.php' => true, - 'smarty_internal_compile_append.php' => true, - 'smarty_internal_compile_assign.php' => true, - 'smarty_internal_compile_block.php' => true, - 'smarty_internal_compile_block_child.php' => true, - 'smarty_internal_compile_block_parent.php' => true, - 'smarty_internal_compile_break.php' => true, - 'smarty_internal_compile_call.php' => true, - 'smarty_internal_compile_capture.php' => true, - 'smarty_internal_compile_config_load.php' => true, - 'smarty_internal_compile_continue.php' => true, - 'smarty_internal_compile_debug.php' => true, - 'smarty_internal_compile_eval.php' => true, - 'smarty_internal_compile_extends.php' => true, - 'smarty_internal_compile_for.php' => true, - 'smarty_internal_compile_foreach.php' => true, - 'smarty_internal_compile_function.php' => true, - 'smarty_internal_compile_if.php' => true, - 'smarty_internal_compile_include.php' => true, - 'smarty_internal_compile_include_php.php' => true, - 'smarty_internal_compile_insert.php' => true, - 'smarty_internal_compile_ldelim.php' => true, - 'smarty_internal_compile_make_nocache.php' => true, - 'smarty_internal_compile_nocache.php' => true, - 'smarty_internal_compile_private_block_plugin.php' => true, - 'smarty_internal_compile_private_foreachsection.php' => true, - 'smarty_internal_compile_private_function_plugin.php' => true, - 'smarty_internal_compile_private_modifier.php' => true, + $expectedSysplugins = array('smartycompilerexception.php' => true, + 'smartyexception.php' => true, + 'smarty_cacheresource.php' => true, + 'smarty_cacheresource_custom.php' => true, + 'smarty_cacheresource_keyvaluestore.php' => true, + 'smarty_data.php' => true, + 'smarty_internal_block.php' => true, + 'smarty_internal_cacheresource_file.php' => true, + 'smarty_internal_compilebase.php' => true, + 'smarty_internal_compile_append.php' => true, + 'smarty_internal_compile_assign.php' => true, + 'smarty_internal_compile_block.php' => true, + 'smarty_internal_compile_block_child.php' => true, + 'smarty_internal_compile_block_parent.php' => true, + 'smarty_internal_compile_child.php' => true, + 'smarty_internal_compile_parent.php' => true, + 'smarty_internal_compile_break.php' => true, + 'smarty_internal_compile_call.php' => true, + 'smarty_internal_compile_capture.php' => true, + 'smarty_internal_compile_config_load.php' => true, + 'smarty_internal_compile_continue.php' => true, + 'smarty_internal_compile_debug.php' => true, + 'smarty_internal_compile_eval.php' => true, + 'smarty_internal_compile_extends.php' => true, + 'smarty_internal_compile_for.php' => true, + 'smarty_internal_compile_foreach.php' => true, + 'smarty_internal_compile_function.php' => true, + 'smarty_internal_compile_if.php' => true, + 'smarty_internal_compile_include.php' => true, + 'smarty_internal_compile_include_php.php' => true, + 'smarty_internal_compile_insert.php' => true, + 'smarty_internal_compile_ldelim.php' => true, + 'smarty_internal_compile_make_nocache.php' => true, + 'smarty_internal_compile_nocache.php' => true, + 'smarty_internal_compile_private_block_plugin.php' => true, + 'smarty_internal_compile_private_foreachsection.php' => true, + 'smarty_internal_compile_private_function_plugin.php' => true, + 'smarty_internal_compile_private_modifier.php' => true, 'smarty_internal_compile_private_object_block_function.php' => true, - 'smarty_internal_compile_private_object_function.php' => true, - 'smarty_internal_compile_private_php.php' => true, - 'smarty_internal_compile_private_print_expression.php' => true, - 'smarty_internal_compile_private_registered_block.php' => true, - 'smarty_internal_compile_private_registered_function.php' => true, - 'smarty_internal_compile_private_special_variable.php' => true, - 'smarty_internal_compile_rdelim.php' => true, - 'smarty_internal_compile_section.php' => true, - 'smarty_internal_compile_setfilter.php' => true, - 'smarty_internal_compile_shared_inheritance.php' => true, - 'smarty_internal_compile_while.php' => true, - 'smarty_internal_configfilelexer.php' => true, - 'smarty_internal_configfileparser.php' => true, - 'smarty_internal_config_file_compiler.php' => true, - 'smarty_internal_data.php' => true, 'smarty_internal_debug.php' => true, - 'smarty_internal_extension_handler.php' => true, - 'smarty_internal_method_addautoloadfilters.php' => true, - 'smarty_internal_method_adddefaultmodifiers.php' => true, - 'smarty_internal_method_append.php' => true, - 'smarty_internal_method_appendbyref.php' => true, - 'smarty_internal_method_assignbyref.php' => true, - 'smarty_internal_method_assignglobal.php' => true, - 'smarty_internal_method_clearallassign.php' => true, - 'smarty_internal_method_clearallcache.php' => true, - 'smarty_internal_method_clearassign.php' => true, - 'smarty_internal_method_clearcache.php' => true, - 'smarty_internal_method_clearcompiledtemplate.php' => true, - 'smarty_internal_method_clearconfig.php' => true, - 'smarty_internal_method_compileallconfig.php' => true, - 'smarty_internal_method_compilealltemplates.php' => true, - 'smarty_internal_method_configload.php' => true, - 'smarty_internal_method_createdata.php' => true, - 'smarty_internal_method_getautoloadfilters.php' => true, - 'smarty_internal_method_getconfigvariable.php' => true, - 'smarty_internal_method_getconfigvars.php' => true, - 'smarty_internal_method_getdebugtemplate.php' => true, - 'smarty_internal_method_getdefaultmodifiers.php' => true, - 'smarty_internal_method_getglobal.php' => true, - 'smarty_internal_method_getregisteredobject.php' => true, - 'smarty_internal_method_getstreamvariable.php' => true, - 'smarty_internal_method_gettags.php' => true, - 'smarty_internal_method_gettemplatevars.php' => true, - 'smarty_internal_method_loadfilter.php' => true, - 'smarty_internal_method_loadplugin.php' => true, - 'smarty_internal_method_mustcompile.php' => true, - 'smarty_internal_method_registercacheresource.php' => true, - 'smarty_internal_method_registerclass.php' => true, - 'smarty_internal_method_registerdefaultconfighandler.php' => true, - 'smarty_internal_method_registerdefaultpluginhandler.php' => true, + 'smarty_internal_compile_private_object_function.php' => true, + 'smarty_internal_compile_private_php.php' => true, + 'smarty_internal_compile_private_print_expression.php' => true, + 'smarty_internal_compile_private_registered_block.php' => true, + 'smarty_internal_compile_private_registered_function.php' => true, + 'smarty_internal_compile_private_special_variable.php' => true, + 'smarty_internal_compile_rdelim.php' => true, + 'smarty_internal_compile_section.php' => true, + 'smarty_internal_compile_setfilter.php' => true, + 'smarty_internal_compile_shared_inheritance.php' => true, + 'smarty_internal_compile_while.php' => true, + 'smarty_internal_configfilelexer.php' => true, + 'smarty_internal_configfileparser.php' => true, + 'smarty_internal_config_file_compiler.php' => true, + 'smarty_internal_data.php' => true, + 'smarty_internal_debug.php' => true, + 'smarty_internal_errorhandler.php' => true, + 'smarty_internal_extension_handler.php' => true, + 'smarty_internal_method_addautoloadfilters.php' => true, + 'smarty_internal_method_adddefaultmodifiers.php' => true, + 'smarty_internal_method_append.php' => true, + 'smarty_internal_method_appendbyref.php' => true, + 'smarty_internal_method_assignbyref.php' => true, + 'smarty_internal_method_assignglobal.php' => true, + 'smarty_internal_method_clearallassign.php' => true, + 'smarty_internal_method_clearallcache.php' => true, + 'smarty_internal_method_clearassign.php' => true, + 'smarty_internal_method_clearcache.php' => true, + 'smarty_internal_method_clearcompiledtemplate.php' => true, + 'smarty_internal_method_clearconfig.php' => true, + 'smarty_internal_method_compileallconfig.php' => true, + 'smarty_internal_method_compilealltemplates.php' => true, + 'smarty_internal_method_configload.php' => true, + 'smarty_internal_method_createdata.php' => true, + 'smarty_internal_method_getautoloadfilters.php' => true, + 'smarty_internal_method_getconfigvariable.php' => true, + 'smarty_internal_method_getconfigvars.php' => true, + 'smarty_internal_method_getdebugtemplate.php' => true, + 'smarty_internal_method_getdefaultmodifiers.php' => true, + 'smarty_internal_method_getglobal.php' => true, + 'smarty_internal_method_getregisteredobject.php' => true, + 'smarty_internal_method_getstreamvariable.php' => true, + 'smarty_internal_method_gettags.php' => true, + 'smarty_internal_method_gettemplatevars.php' => true, + 'smarty_internal_method_literals.php' => true, + 'smarty_internal_method_loadfilter.php' => true, + 'smarty_internal_method_loadplugin.php' => true, + 'smarty_internal_method_mustcompile.php' => true, + 'smarty_internal_method_registercacheresource.php' => true, + 'smarty_internal_method_registerclass.php' => true, + 'smarty_internal_method_registerdefaultconfighandler.php' => true, + 'smarty_internal_method_registerdefaultpluginhandler.php' => true, 'smarty_internal_method_registerdefaulttemplatehandler.php' => true, - 'smarty_internal_method_registerfilter.php' => true, - 'smarty_internal_method_registerobject.php' => true, - 'smarty_internal_method_registerplugin.php' => true, - 'smarty_internal_method_registerresource.php' => true, - 'smarty_internal_method_setautoloadfilters.php' => true, - 'smarty_internal_method_setdebugtemplate.php' => true, - 'smarty_internal_method_setdefaultmodifiers.php' => true, - 'smarty_internal_method_unloadfilter.php' => true, - 'smarty_internal_method_unregistercacheresource.php' => true, - 'smarty_internal_method_unregisterfilter.php' => true, - 'smarty_internal_method_unregisterobject.php' => true, - 'smarty_internal_method_unregisterplugin.php' => true, - 'smarty_internal_method_unregisterresource.php' => true, - 'smarty_internal_nocache_insert.php' => true, - 'smarty_internal_parsetree.php' => true, - 'smarty_internal_parsetree_code.php' => true, - 'smarty_internal_parsetree_dq.php' => true, - 'smarty_internal_parsetree_dqcontent.php' => true, - 'smarty_internal_parsetree_tag.php' => true, - 'smarty_internal_parsetree_template.php' => true, - 'smarty_internal_parsetree_text.php' => true, - 'smarty_internal_resource_eval.php' => true, - 'smarty_internal_resource_extends.php' => true, - 'smarty_internal_resource_file.php' => true, - 'smarty_internal_resource_php.php' => true, - 'smarty_internal_resource_registered.php' => true, - 'smarty_internal_resource_stream.php' => true, - 'smarty_internal_resource_string.php' => true, - 'smarty_internal_runtime_cachemodify.php' => true, - 'smarty_internal_runtime_cacheresourcefile.php' => true, - 'smarty_internal_runtime_capture.php' => true, - 'smarty_internal_runtime_codeframe.php' => true, - 'smarty_internal_runtime_filterhandler.php' => true, - 'smarty_internal_runtime_foreach.php' => true, - 'smarty_internal_runtime_getincludepath.php' => true, - 'smarty_internal_runtime_inheritance.php' => true, - 'smarty_internal_runtime_make_nocache.php' => true, - 'smarty_internal_runtime_tplfunction.php' => true, - 'smarty_internal_runtime_updatecache.php' => true, - 'smarty_internal_runtime_updatescope.php' => true, - 'smarty_internal_runtime_writefile.php' => true, - 'smarty_internal_smartytemplatecompiler.php' => true, - 'smarty_internal_template.php' => true, - 'smarty_internal_templatebase.php' => true, - 'smarty_internal_templatecompilerbase.php' => true, - 'smarty_internal_templatelexer.php' => true, - 'smarty_internal_templateparser.php' => true, - 'smarty_internal_testinstall.php' => true, - 'smarty_internal_undefined.php' => true, 'smarty_resource.php' => true, - 'smarty_resource_custom.php' => true, 'smarty_resource_recompiled.php' => true, - 'smarty_resource_uncompiled.php' => true, 'smarty_security.php' => true, - 'smarty_template_cached.php' => true, 'smarty_template_compiled.php' => true, - 'smarty_template_config.php' => true, - 'smarty_template_resource_base.php' => true, - 'smarty_template_source.php' => true, 'smarty_undefined_variable.php' => true, - 'smarty_variable.php' => true,); + 'smarty_internal_method_registerfilter.php' => true, + 'smarty_internal_method_registerobject.php' => true, + 'smarty_internal_method_registerplugin.php' => true, + 'smarty_internal_method_registerresource.php' => true, + 'smarty_internal_method_setautoloadfilters.php' => true, + 'smarty_internal_method_setdebugtemplate.php' => true, + 'smarty_internal_method_setdefaultmodifiers.php' => true, + 'smarty_internal_method_unloadfilter.php' => true, + 'smarty_internal_method_unregistercacheresource.php' => true, + 'smarty_internal_method_unregisterfilter.php' => true, + 'smarty_internal_method_unregisterobject.php' => true, + 'smarty_internal_method_unregisterplugin.php' => true, + 'smarty_internal_method_unregisterresource.php' => true, + 'smarty_internal_nocache_insert.php' => true, + 'smarty_internal_parsetree.php' => true, + 'smarty_internal_parsetree_code.php' => true, + 'smarty_internal_parsetree_dq.php' => true, + 'smarty_internal_parsetree_dqcontent.php' => true, + 'smarty_internal_parsetree_tag.php' => true, + 'smarty_internal_parsetree_template.php' => true, + 'smarty_internal_parsetree_text.php' => true, + 'smarty_internal_resource_eval.php' => true, + 'smarty_internal_resource_extends.php' => true, + 'smarty_internal_resource_file.php' => true, + 'smarty_internal_resource_php.php' => true, + 'smarty_internal_resource_registered.php' => true, + 'smarty_internal_resource_stream.php' => true, + 'smarty_internal_resource_string.php' => true, + 'smarty_internal_runtime_cachemodify.php' => true, + 'smarty_internal_runtime_cacheresourcefile.php' => true, + 'smarty_internal_runtime_capture.php' => true, + 'smarty_internal_runtime_codeframe.php' => true, + 'smarty_internal_runtime_filterhandler.php' => true, + 'smarty_internal_runtime_foreach.php' => true, + 'smarty_internal_runtime_getincludepath.php' => true, + 'smarty_internal_runtime_inheritance.php' => true, + 'smarty_internal_runtime_make_nocache.php' => true, + 'smarty_internal_runtime_tplfunction.php' => true, + 'smarty_internal_runtime_updatecache.php' => true, + 'smarty_internal_runtime_updatescope.php' => true, + 'smarty_internal_runtime_writefile.php' => true, + 'smarty_internal_smartytemplatecompiler.php' => true, + 'smarty_internal_template.php' => true, + 'smarty_internal_templatebase.php' => true, + 'smarty_internal_templatecompilerbase.php' => true, + 'smarty_internal_templatelexer.php' => true, + 'smarty_internal_templateparser.php' => true, + 'smarty_internal_testinstall.php' => true, + 'smarty_internal_undefined.php' => true, + 'smarty_resource.php' => true, + 'smarty_resource_custom.php' => true, + 'smarty_resource_recompiled.php' => true, + 'smarty_resource_uncompiled.php' => true, + 'smarty_security.php' => true, + 'smarty_template_cached.php' => true, + 'smarty_template_compiled.php' => true, + 'smarty_template_config.php' => true, + 'smarty_template_resource_base.php' => true, + 'smarty_template_source.php' => true, + 'smarty_undefined_variable.php' => true, + 'smarty_variable.php' => true,); $iterator = new DirectoryIterator($source); foreach ($iterator as $file) { if (!$file->isDot()) { @@ -516,7 +502,7 @@ class Smarty_Internal_TestInstall } else { $errors[ 'sysplugins' ] = $message; } - } elseif ($errors === null) { + } else if ($errors === null) { echo "... OK\n"; } } else { @@ -528,36 +514,61 @@ class Smarty_Internal_TestInstall $errors[ 'sysplugins_dir_constant' ] = $message; } } - if ($errors === null) { echo "Testing plugin files...\n"; } // test if core plugins are available $source = SMARTY_PLUGINS_DIR; if (is_dir($source)) { - $expectedPlugins = - array('block.textformat.php' => true, 'function.counter.php' => true, 'function.cycle.php' => true, - 'function.fetch.php' => true, 'function.html_checkboxes.php' => true, - 'function.html_image.php' => true, 'function.html_options.php' => true, - 'function.html_radios.php' => true, 'function.html_select_date.php' => true, - 'function.html_select_time.php' => true, 'function.html_table.php' => true, - 'function.mailto.php' => true, 'function.math.php' => true, 'modifier.capitalize.php' => true, - 'modifier.date_format.php' => true, 'modifier.debug_print_var.php' => true, - 'modifier.escape.php' => true, 'modifier.regex_replace.php' => true, - 'modifier.replace.php' => true, 'modifier.spacify.php' => true, 'modifier.truncate.php' => true, - 'modifiercompiler.cat.php' => true, 'modifiercompiler.count_characters.php' => true, - 'modifiercompiler.count_paragraphs.php' => true, 'modifiercompiler.count_sentences.php' => true, - 'modifiercompiler.count_words.php' => true, 'modifiercompiler.default.php' => true, - 'modifiercompiler.escape.php' => true, 'modifiercompiler.from_charset.php' => true, - 'modifiercompiler.indent.php' => true, 'modifiercompiler.lower.php' => true, - 'modifiercompiler.noprint.php' => true, 'modifiercompiler.string_format.php' => true, - 'modifiercompiler.strip.php' => true, 'modifiercompiler.strip_tags.php' => true, - 'modifiercompiler.to_charset.php' => true, 'modifiercompiler.unescape.php' => true, - 'modifiercompiler.upper.php' => true, 'modifiercompiler.wordwrap.php' => true, - 'outputfilter.trimwhitespace.php' => true, 'shared.escape_special_chars.php' => true, - 'shared.literal_compiler_param.php' => true, 'shared.make_timestamp.php' => true, - 'shared.mb_str_replace.php' => true, 'shared.mb_unicode.php' => true, - 'shared.mb_wordwrap.php' => true, 'variablefilter.htmlspecialchars.php' => true,); + $expectedPlugins = array( + 'block.textformat.php' => true, + 'function.counter.php' => true, + 'function.cycle.php' => true, + 'function.fetch.php' => true, + 'function.html_checkboxes.php' => true, + 'function.html_image.php' => true, + 'function.html_options.php' => true, + 'function.html_radios.php' => true, + 'function.html_select_date.php' => true, + 'function.html_select_time.php' => true, + 'function.html_table.php' => true, + 'function.mailto.php' => true, + 'function.math.php' => true, + 'modifier.capitalize.php' => true, + 'modifier.date_format.php' => true, + 'modifier.debug_print_var.php' => true, + 'modifier.escape.php' => true, + 'modifier.mb_wordwrap.php' => true, + 'modifier.regex_replace.php' => true, + 'modifier.replace.php' => true, + 'modifier.spacify.php' => true, + 'modifier.truncate.php' => true, + 'modifiercompiler.cat.php' => true, + 'modifiercompiler.count_characters.php' => true, + 'modifiercompiler.count_paragraphs.php' => true, + 'modifiercompiler.count_sentences.php' => true, + 'modifiercompiler.count_words.php' => true, + 'modifiercompiler.default.php' => true, + 'modifiercompiler.escape.php' => true, + 'modifiercompiler.from_charset.php' => true, + 'modifiercompiler.indent.php' => true, + 'modifiercompiler.lower.php' => true, + 'modifiercompiler.noprint.php' => true, + 'modifiercompiler.string_format.php' => true, + 'modifiercompiler.strip.php' => true, + 'modifiercompiler.strip_tags.php' => true, + 'modifiercompiler.to_charset.php' => true, + 'modifiercompiler.unescape.php' => true, + 'modifiercompiler.upper.php' => true, + 'modifiercompiler.wordwrap.php' => true, + 'outputfilter.trimwhitespace.php' => true, + 'shared.escape_special_chars.php' => true, + 'shared.literal_compiler_param.php' => true, + 'shared.make_timestamp.php' => true, + 'shared.mb_str_replace.php' => true, + 'shared.mb_unicode.php' => true, + 'variablefilter.htmlspecialchars.php' => true, + ); $iterator = new DirectoryIterator($source); foreach ($iterator as $file) { if (!$file->isDot()) { @@ -575,7 +586,7 @@ class Smarty_Internal_TestInstall } else { $errors[ 'plugins' ] = $message; } - } elseif ($errors === null) { + } else if ($errors === null) { echo "... OK\n"; } } else { @@ -587,12 +598,10 @@ class Smarty_Internal_TestInstall $errors[ 'plugins_dir_constant' ] = $message; } } - if ($errors === null) { echo "Tests complete.\n"; echo "</PRE>\n"; } - return $status; } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_resource.php b/vendor/smarty/smarty/libs/sysplugins/smarty_resource.php index ea673ead1..b76b9c783 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_resource.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_resource.php @@ -21,31 +21,28 @@ abstract class Smarty_Resource { /** + * resource types provided by the core + * + * @var array + */ + public static $sysplugins = array('file' => 'smarty_internal_resource_file.php', + 'string' => 'smarty_internal_resource_string.php', + 'extends' => 'smarty_internal_resource_extends.php', + 'stream' => 'smarty_internal_resource_stream.php', + 'eval' => 'smarty_internal_resource_eval.php', + 'php' => 'smarty_internal_resource_php.php'); + /** * Source is bypassing compiler * * @var boolean */ public $uncompiled = false; - /** * Source must be recompiled on every occasion * * @var boolean */ public $recompiled = false; - - /** - * resource types provided by the core - * - * @var array - */ - public static $sysplugins = array('file' => 'smarty_internal_resource_file.php', - 'string' => 'smarty_internal_resource_string.php', - 'extends' => 'smarty_internal_resource_extends.php', - 'stream' => 'smarty_internal_resource_stream.php', - 'eval' => 'smarty_internal_resource_eval.php', - 'php' => 'smarty_internal_resource_php.php'); - /** * Flag if resource does implement populateCompiledFilepath() method * @@ -54,70 +51,6 @@ abstract class Smarty_Resource public $hasCompiledHandler = false; /** - * Load template's source into current template object - * - * @param Smarty_Template_Source $source source object - * - * @return string template source - * @throws SmartyException if source cannot be loaded - */ - abstract public function getContent(Smarty_Template_Source $source); - - /** - * populate Source Object with meta data from Resource - * - * @param Smarty_Template_Source $source source object - * @param Smarty_Internal_Template $_template template object - */ - abstract public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null); - - /** - * populate Source Object with timestamp and exists from Resource - * - * @param Smarty_Template_Source $source source object - */ - public function populateTimestamp(Smarty_Template_Source $source) - { - // intentionally left blank - } - - /** - * modify resource_name according to resource handlers specifications - * - * @param Smarty $smarty Smarty instance - * @param string $resource_name resource_name to make unique - * @param boolean $isConfig flag for config resource - * - * @return string unique resource name - */ - public function buildUniqueResourceName(Smarty $smarty, $resource_name, $isConfig = false) - { - if ($isConfig) { - if (!isset($smarty->_joined_config_dir)) { - $smarty->getTemplateDir(null, true); - } - return get_class($this) . '#' . $smarty->_joined_config_dir . '#' . $resource_name; - } else { - if (!isset($smarty->_joined_template_dir)) { - $smarty->getTemplateDir(); - } - return get_class($this) . '#' . $smarty->_joined_template_dir . '#' . $resource_name; - } - } - - /** - * Determine basename for compiled filename - * - * @param Smarty_Template_Source $source source object - * - * @return string resource's basename - */ - public function getBasename(Smarty_Template_Source $source) - { - return basename(preg_replace('![^\w]+!', '_', $source->name)); - } - - /** * Load Resource Handler * * @param Smarty $smarty smarty object @@ -132,20 +65,17 @@ abstract class Smarty_Resource if (isset($smarty->_cache[ 'resource_handlers' ][ $type ])) { return $smarty->_cache[ 'resource_handlers' ][ $type ]; } - // try registered resource if (isset($smarty->registered_resources[ $type ])) { return $smarty->_cache[ 'resource_handlers' ][ $type ] = $smarty->registered_resources[ $type ] instanceof Smarty_Resource ? $smarty->registered_resources[ $type ] : new Smarty_Internal_Resource_Registered(); } - // try sysplugins dir if (isset(self::$sysplugins[ $type ])) { $_resource_class = 'Smarty_Internal_Resource_' . ucfirst($type); return $smarty->_cache[ 'resource_handlers' ][ $type ] = new $_resource_class(); } - // try plugins dir $_resource_class = 'Smarty_Resource_' . ucfirst($type); if ($smarty->loadPlugin($_resource_class)) { @@ -159,7 +89,6 @@ abstract class Smarty_Resource return self::load($smarty, $type); } } - // try streams $_known_stream = stream_get_wrappers(); if (in_array($type, $_known_stream)) { @@ -169,9 +98,7 @@ abstract class Smarty_Resource } return $smarty->_cache[ 'resource_handlers' ][ $type ] = new Smarty_Internal_Resource_Stream(); } - // TODO: try default_(template|config)_handler - // give up throw new SmartyException("Unknown resource type '{$type}'"); } @@ -206,6 +133,7 @@ abstract class Smarty_Resource * @param string $template_resource template_resource to extract resource handler and name of * * @return string unique resource name + * @throws \SmartyException */ public static function getUniqueTemplateName($obj, $template_resource) { @@ -214,26 +142,15 @@ abstract class Smarty_Resource // TODO: optimize for Smarty's internal resource types $resource = Smarty_Resource::load($smarty, $type); // go relative to a given template? - $_file_is_dotted = $name[ 0 ] == '.' && ($name[ 1 ] == '.' || $name[ 1 ] == '/'); + $_file_is_dotted = $name[ 0 ] === '.' && ($name[ 1 ] === '.' || $name[ 1 ] === '/'); if ($obj->_isTplObj() && $_file_is_dotted && - ($obj->source->type == 'file' || $obj->parent->source->type == 'extends') + ($obj->source->type === 'file' || $obj->parent->source->type === 'extends') ) { - $name = $smarty->_realpath(dirname($obj->parent->source->filepath) . $smarty->ds . $name); + $name = $smarty->_realpath(dirname($obj->parent->source->filepath) . DIRECTORY_SEPARATOR . $name); } return $resource->buildUniqueResourceName($smarty, $name); } - /* - * Check if resource must check time stamps when when loading complied or cached templates. - * Resources like 'extends' which use source components my disable timestamp checks on own resource. - * - * @return bool - */ - public function checkTimestamps() - { - return true; - } - /** * initialize Source Object for given resource * wrapper for backward compatibility to versions < 3.1.22 @@ -243,12 +160,93 @@ abstract class Smarty_Resource * @param Smarty $smarty smarty object * @param string $template_resource resource identifier * - * @return Smarty_Template_Source Source Object + * @return \Smarty_Template_Source Source Object + * @throws \SmartyException */ - public static function source(Smarty_Internal_Template $_template = null, Smarty $smarty = null, + public static function source(Smarty_Internal_Template $_template = null, + Smarty $smarty = null, $template_resource = null) { return Smarty_Template_Source::load($_template, $smarty, $template_resource); } + + /** + * Load template's source into current template object + * + * @param Smarty_Template_Source $source source object + * + * @return string template source + * @throws SmartyException if source cannot be loaded + */ + abstract public function getContent(Smarty_Template_Source $source); + + /** + * populate Source Object with meta data from Resource + * + * @param Smarty_Template_Source $source source object + * @param Smarty_Internal_Template $_template template object + */ + abstract public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null); + + /** + * populate Source Object with timestamp and exists from Resource + * + * @param Smarty_Template_Source $source source object + */ + public function populateTimestamp(Smarty_Template_Source $source) + { + // intentionally left blank + } + + /** + * modify resource_name according to resource handlers specifications + * + * @param Smarty $smarty Smarty instance + * @param string $resource_name resource_name to make unique + * @param boolean $isConfig flag for config resource + * + * @return string unique resource name + */ + public function buildUniqueResourceName(Smarty $smarty, $resource_name, $isConfig = false) + { + if ($isConfig) { + if (!isset($smarty->_joined_config_dir)) { + $smarty->getTemplateDir(null, true); + } + return get_class($this) . '#' . $smarty->_joined_config_dir . '#' . $resource_name; + } else { + if (!isset($smarty->_joined_template_dir)) { + $smarty->getTemplateDir(); + } + return get_class($this) . '#' . $smarty->_joined_template_dir . '#' . $resource_name; + } + } + + /* + * Check if resource must check time stamps when when loading complied or cached templates. + * Resources like 'extends' which use source components my disable timestamp checks on own resource. + * + * @return bool + */ + + /** + * Determine basename for compiled filename + * + * @param Smarty_Template_Source $source source object + * + * @return string resource's basename + */ + public function getBasename(Smarty_Template_Source $source) + { + return basename(preg_replace('![^\w]+!', '_', $source->name)); + } + + /** + * @return bool + */ + public function checkTimestamps() + { + return true; + } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_resource_custom.php b/vendor/smarty/smarty/libs/sysplugins/smarty_resource_custom.php index 619f2d6f0..77f619eca 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_resource_custom.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_resource_custom.php @@ -47,7 +47,7 @@ abstract class Smarty_Resource_Custom extends Smarty_Resource */ public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null) { - $source->filepath = $source->type . ':' . $source->name; + $source->filepath = $source->type . ':' . substr(preg_replace('/[^A-Za-z0-9.]/','',$source->name),0,25); $source->uid = sha1($source->type . ':' . $source->name); $mtime = $this->fetchTimestamp($source->name); @@ -90,6 +90,6 @@ abstract class Smarty_Resource_Custom extends Smarty_Resource */ public function getBasename(Smarty_Template_Source $source) { - return basename($source->name); + return basename(substr(preg_replace('/[^A-Za-z0-9.]/','',$source->name),0,25)); } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_resource_recompiled.php b/vendor/smarty/smarty/libs/sysplugins/smarty_resource_recompiled.php index 7e51d1b1d..322cdabfa 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_resource_recompiled.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_resource_recompiled.php @@ -49,7 +49,7 @@ abstract class Smarty_Resource_Recompiled extends Smarty_Resource $_smarty_tpl->loadCompiler(); // call compiler try { - eval("?>" . $_smarty_tpl->compiler->compileTemplate($_smarty_tpl)); + eval('?>' . $_smarty_tpl->compiler->compileTemplate($_smarty_tpl)); } catch (Exception $e) { unset($_smarty_tpl->compiler); @@ -85,6 +85,9 @@ abstract class Smarty_Resource_Recompiled extends Smarty_Resource * * @return bool */ + /** + * @return bool + */ public function checkTimestamps() { return false; diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_resource_uncompiled.php b/vendor/smarty/smarty/libs/sysplugins/smarty_resource_uncompiled.php index 554f3aea3..a11e2c14c 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_resource_uncompiled.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_resource_uncompiled.php @@ -29,7 +29,7 @@ abstract class Smarty_Resource_Uncompiled extends Smarty_Resource * @var bool */ public $hasCompiledHandler = true; - + /** * populate compiled object with compiled filepath * diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_security.php b/vendor/smarty/smarty/libs/sysplugins/smarty_security.php index 4f75f7529..126f6fb46 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_security.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_security.php @@ -322,7 +322,7 @@ class Smarty_Security // fall back return $this->isTrustedStaticClass($class_name, $compiler); } - if ($params[ 2 ] == 'method') { + if ($params[ 2 ] === 'method') { $allowed = $this->trusted_static_methods; $name = substr($params[ 0 ], 0, strpos($params[ 0 ], '(')); } else { @@ -514,60 +514,39 @@ class Smarty_Security public function isTrustedResourceDir($filepath, $isConfig = null) { if ($this->_include_path_status !== $this->smarty->use_include_path) { - foreach ($this->_include_dir as $directory) { - unset($this->_resource_dir[ $directory ]); - } - if ($this->smarty->use_include_path) { - $this->_include_dir = array(); - $_dirs = $this->smarty->ext->_getIncludePath->getIncludePathDirs($this->smarty); - foreach ($_dirs as $directory) { - $this->_include_dir[] = $directory; - $this->_resource_dir[ $directory ] = true; - } + $_dir = $this->smarty->use_include_path ? $this->smarty->ext->_getIncludePath->getIncludePathDirs($this->smarty) : array(); + if ($this->_include_dir !== $_dir) { + $this->_updateResourceDir($this->_include_dir, $_dir); + $this->_include_dir = $_dir; } $this->_include_path_status = $this->smarty->use_include_path; } - if ($isConfig !== true && - (!isset($this->smarty->_cache[ 'template_dir_new' ]) || $this->smarty->_cache[ 'template_dir_new' ]) - ) { + if ($isConfig !== true) { $_dir = $this->smarty->getTemplateDir(); if ($this->_template_dir !== $_dir) { - foreach ($this->_template_dir as $directory) { - unset($this->_resource_dir[ $directory ]); - } - foreach ($_dir as $directory) { - $this->_resource_dir[ $directory ] = true; - } + $this->_updateResourceDir($this->_template_dir, $_dir); $this->_template_dir = $_dir; } - $this->smarty->_cache[ 'template_dir_new' ] = false; } - if ($isConfig !== false && - (!isset($this->smarty->_cache[ 'config_dir_new' ]) || $this->smarty->_cache[ 'config_dir_new' ]) - ) { + if ($isConfig !== false) { $_dir = $this->smarty->getConfigDir(); if ($this->_config_dir !== $_dir) { - foreach ($this->_config_dir as $directory) { - unset($this->_resource_dir[ $directory ]); - } - foreach ($_dir as $directory) { - $this->_resource_dir[ $directory ] = true; - } + $this->_updateResourceDir($this->_config_dir, $_dir); $this->_config_dir = $_dir; } - $this->smarty->_cache[ 'config_dir_new' ] = false; } - if ($this->_secure_dir !== (array) $this->secure_dir) { - foreach ($this->_secure_dir as $directory) { - unset($this->_resource_dir[ $directory ]); - } - foreach ((array) $this->secure_dir as $directory) { - $directory = $this->smarty->_realpath($directory . DIRECTORY_SEPARATOR, true); - $this->_resource_dir[ $directory ] = true; + if ($this->_secure_dir !== $this->secure_dir) { + $this->secure_dir = (array)$this->secure_dir; + foreach($this->secure_dir as $k => $d) { + $this->secure_dir[$k] = $this->smarty->_realpath($d.DIRECTORY_SEPARATOR,true); } - $this->_secure_dir = (array) $this->secure_dir; + $this->_updateResourceDir($this->_secure_dir, $this->secure_dir); + $this->_secure_dir = $this->secure_dir; + } + $addPath = $this->_checkDir($filepath, $this->_resource_dir); + if ($addPath !== false) { + $this->_resource_dir = array_merge($this->_resource_dir, $addPath); } - $this->_resource_dir = $this->_checkDir($filepath, $this->_resource_dir); return true; } @@ -622,40 +601,64 @@ class Smarty_Security $this->_php_resource_dir[ $directory ] = true; } } + $addPath = $this->_checkDir($filepath, $this->_php_resource_dir); + if ($addPath !== false) { + $this->_php_resource_dir = array_merge($this->_php_resource_dir, $addPath); + } + return true; + } - $this->_php_resource_dir = - $this->_checkDir($this->smarty->_realpath($filepath, true), $this->_php_resource_dir); - return true; + /** + * Remove old directories and its sub folders, add new directories + * + * @param array $oldDir + * @param array $newDir + */ + private function _updateResourceDir($oldDir, $newDir) { + foreach ($oldDir as $directory) { + $directory = $this->smarty->_realpath($directory, true); + $length = strlen($directory); + foreach ($this->_resource_dir as $dir) { + if (substr($dir, 0,$length) === $directory) { + unset($this->_resource_dir[ $dir ]); + } + } + } + foreach ($newDir as $directory) { + $directory = $this->smarty->_realpath($directory, true); + $this->_resource_dir[ $directory ] = true; + } } - /** * Check if file is inside a valid directory * * @param string $filepath * @param array $dirs valid directories * - * @return array + * @return array|bool * @throws \SmartyException */ private function _checkDir($filepath, $dirs) { $directory = dirname($filepath) . DIRECTORY_SEPARATOR; + if (isset($dirs[ $directory ])) { + return false; + } + $filepath = $this->smarty->_realpath($filepath, true); + $directory = dirname($filepath) . DIRECTORY_SEPARATOR; $_directory = array(); while (true) { - // remember the directory to add it to _resource_dir in case we're successful - $_directory[ $directory ] = true; - // test if the directory is trusted + // test if the directory is trusted if (isset($dirs[ $directory ])) { - // merge sub directories of current $directory into _resource_dir to speed up subsequent lookup - $dirs = array_merge($dirs, $_directory); - - return $dirs; + return $_directory; } // abort if we've reached root if (!preg_match('#[\\\/][^\\\/]+[\\\/]$#', $directory)) { break; } - // bubble up one level + // remember the directory to add it to _resource_dir in case we're successful + $_directory[ $directory ] = true; + // bubble up one level $directory = preg_replace('#[\\\/][^\\\/]+[\\\/]$#', DIRECTORY_SEPARATOR, $directory); } @@ -676,11 +679,11 @@ class Smarty_Security { if ($security_class instanceof Smarty_Security) { $smarty->security_policy = $security_class; - return; + return $smarty; } elseif (is_object($security_class)) { throw new SmartyException("Class '" . get_class($security_class) . "' must extend Smarty_Security."); } - if ($security_class == null) { + if ($security_class === null) { $security_class = $smarty->security_class; } if (!class_exists($security_class)) { @@ -690,7 +693,7 @@ class Smarty_Security } else { $smarty->security_policy = new $security_class($smarty); } - return; + return $smarty; } /** * Start template processing diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_template_cached.php b/vendor/smarty/smarty/libs/sysplugins/smarty_template_cached.php index 58f0daf28..45c83c895 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_template_cached.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_template_cached.php @@ -83,6 +83,8 @@ class Smarty_Template_Cached extends Smarty_Template_Resource_Base * create Cached Object container * * @param Smarty_Internal_Template $_template template object + * + * @throws \SmartyException */ public function __construct(Smarty_Internal_Template $_template) { @@ -105,8 +107,7 @@ class Smarty_Template_Cached extends Smarty_Template_Resource_Base $_template->cached = new Smarty_Template_Cached($_template); $_template->cached->handler->populate($_template->cached, $_template); // caching enabled ? - if (!($_template->caching == Smarty::CACHING_LIFETIME_CURRENT || - $_template->caching == Smarty::CACHING_LIFETIME_SAVED) || $_template->source->handler->recompiled + if (!$_template->caching || $_template->source->handler->recompiled ) { $_template->cached->valid = false; } @@ -162,13 +163,13 @@ class Smarty_Template_Cached extends Smarty_Template_Resource_Base } else { $this->valid = true; } - if ($this->valid && $_template->caching == Smarty::CACHING_LIFETIME_CURRENT && + if ($this->valid && $_template->caching === Smarty::CACHING_LIFETIME_CURRENT && $_template->cache_lifetime >= 0 && time() > ($this->timestamp + $_template->cache_lifetime) ) { // lifetime expired $this->valid = false; } - if ($this->valid && $_template->smarty->compile_check == 1 && + if ($this->valid && $_template->compile_check === Smarty::COMPILECHECK_ON && $_template->source->getTimeStamp() > $this->timestamp ) { $this->valid = false; diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_template_compiled.php b/vendor/smarty/smarty/libs/sysplugins/smarty_template_compiled.php index 18f9d562c..7ca2ebcb4 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_template_compiled.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_template_compiled.php @@ -11,7 +11,6 @@ */ class Smarty_Template_Compiled extends Smarty_Template_Resource_Base { - /** * nocache hash * @@ -49,21 +48,22 @@ class Smarty_Template_Compiled extends Smarty_Template_Resource_Base $this->filepath = $smarty->getCompileDir(); if (isset($_template->compile_id)) { $this->filepath .= preg_replace('![^\w]+!', '_', $_template->compile_id) . - ($smarty->use_sub_dirs ? $smarty->ds : '^'); + ($smarty->use_sub_dirs ? DIRECTORY_SEPARATOR : '^'); } // if use_sub_dirs, break file into directories if ($smarty->use_sub_dirs) { - $this->filepath .= $source->uid[ 0 ] . $source->uid[ 1 ] . $smarty->ds . $source->uid[ 2 ] . - $source->uid[ 3 ] . $smarty->ds . $source->uid[ 4 ] . $source->uid[ 5 ] . $smarty->ds; + $this->filepath .= $source->uid[ 0 ] . $source->uid[ 1 ] . DIRECTORY_SEPARATOR . $source->uid[ 2 ] . + $source->uid[ 3 ] . DIRECTORY_SEPARATOR . $source->uid[ 4 ] . $source->uid[ 5 ] . + DIRECTORY_SEPARATOR; } $this->filepath .= $source->uid . '_'; if ($source->isConfig) { - $this->filepath .= (int) $smarty->config_read_hidden + (int) $smarty->config_booleanize * 2 + - (int) $smarty->config_overwrite * 4; + $this->filepath .= (int)$smarty->config_read_hidden + (int)$smarty->config_booleanize * 2 + + (int)$smarty->config_overwrite * 4; } else { - $this->filepath .= (int) $smarty->merge_compiled_includes + (int) $smarty->escape_html * 2 + + $this->filepath .= (int)$smarty->merge_compiled_includes + (int)$smarty->escape_html * 2 + (($smarty->merge_compiled_includes && $source->type === 'extends') ? - (int) $smarty->extends_recursion * 4 : 0); + (int)$smarty->extends_recursion * 4 : 0); } $this->filepath .= '.' . $source->type; $basename = $source->handler->getBasename($source); @@ -81,64 +81,6 @@ class Smarty_Template_Compiled extends Smarty_Template_Resource_Base } /** - * load compiled template or compile from source - * - * @param Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template - * - * @throws Exception - */ - public function process(Smarty_Internal_Template $_smarty_tpl) - { - $source = &$_smarty_tpl->source; - $smarty = &$_smarty_tpl->smarty; - if ($source->handler->recompiled) { - $source->handler->process($_smarty_tpl); - } elseif (!$source->handler->uncompiled) { - if (!$this->exists || $smarty->force_compile || - ($smarty->compile_check && $source->getTimeStamp() > $this->getTimeStamp()) - ) { - $this->compileTemplateSource($_smarty_tpl); - $compileCheck = $smarty->compile_check; - $smarty->compile_check = false; - $this->loadCompiledTemplate($_smarty_tpl); - $smarty->compile_check = $compileCheck; - } else { - $_smarty_tpl->mustCompile = true; - @include($this->filepath); - if ($_smarty_tpl->mustCompile) { - $this->compileTemplateSource($_smarty_tpl); - $compileCheck = $smarty->compile_check; - $smarty->compile_check = false; - $this->loadCompiledTemplate($_smarty_tpl); - $smarty->compile_check = $compileCheck; - } - } - $_smarty_tpl->_subTemplateRegister(); - $this->processed = true; - } - } - - /** - * Load fresh compiled template by including the PHP file - * HHVM requires a work around because of a PHP incompatibility - * - * @param \Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template - */ - private function loadCompiledTemplate(Smarty_Internal_Template $_smarty_tpl) - { - if (function_exists('opcache_invalidate') && strlen(ini_get("opcache.restrict_api")) < 1) { - opcache_invalidate($this->filepath, true); - } elseif (function_exists('apc_compile_file')) { - apc_compile_file($this->filepath); - } - if (defined('HHVM_VERSION')) { - eval("?>" . file_get_contents($this->filepath)); - } else { - include($this->filepath); - } - } - - /** * render compiled template code * * @param Smarty_Internal_Template $_template @@ -180,6 +122,44 @@ class Smarty_Template_Compiled extends Smarty_Template_Resource_Base } /** + * load compiled template or compile from source + * + * @param Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template + * + * @throws Exception + */ + public function process(Smarty_Internal_Template $_smarty_tpl) + { + $source = &$_smarty_tpl->source; + $smarty = &$_smarty_tpl->smarty; + if ($source->handler->recompiled) { + $source->handler->process($_smarty_tpl); + } else if (!$source->handler->uncompiled) { + if (!$this->exists || $smarty->force_compile || + ($_smarty_tpl->compile_check && $source->getTimeStamp() > $this->getTimeStamp()) + ) { + $this->compileTemplateSource($_smarty_tpl); + $compileCheck = $_smarty_tpl->compile_check; + $_smarty_tpl->compile_check = Smarty::COMPILECHECK_OFF; + $this->loadCompiledTemplate($_smarty_tpl); + $_smarty_tpl->compile_check = $compileCheck; + } else { + $_smarty_tpl->mustCompile = true; + @include($this->filepath); + if ($_smarty_tpl->mustCompile) { + $this->compileTemplateSource($_smarty_tpl); + $compileCheck = $_smarty_tpl->compile_check; + $_smarty_tpl->compile_check = Smarty::COMPILECHECK_OFF; + $this->loadCompiledTemplate($_smarty_tpl); + $_smarty_tpl->compile_check = $compileCheck; + } + } + $_smarty_tpl->_subTemplateRegister(); + $this->processed = true; + } + } + + /** * compile template from source * * @param Smarty_Internal_Template $_template @@ -193,8 +173,8 @@ class Smarty_Template_Compiled extends Smarty_Template_Resource_Base $this->nocache_hash = null; $this->unifunc = null; // compile locking - $saved_timestamp = $_template->source->handler->recompiled ? false : $this->getTimeStamp(); - if ($saved_timestamp) { + if ($saved_timestamp = (!$_template->source->handler->recompiled && is_file($this->filepath))) { + $saved_timestamp = $this->getTimeStamp(); touch($this->filepath); } // compile locking @@ -205,7 +185,7 @@ class Smarty_Template_Compiled extends Smarty_Template_Resource_Base } catch (Exception $e) { // restore old timestamp in case of error - if ($saved_timestamp) { + if ($saved_timestamp && is_file($this->filepath)) { touch($this->filepath, $saved_timestamp); } unset($_template->compiler); @@ -221,7 +201,8 @@ class Smarty_Template_Compiled extends Smarty_Template_Resource_Base * @param Smarty_Internal_Template $_template template object * @param string $code compiled code * - * @return boolean success + * @return bool success + * @throws \SmartyException */ public function write(Smarty_Internal_Template $_template, $code) { @@ -252,4 +233,26 @@ class Smarty_Template_Compiled extends Smarty_Template_Resource_Base } return isset($this->content) ? $this->content : false; } + + /** + * Load fresh compiled template by including the PHP file + * HHVM requires a work around because of a PHP incompatibility + * + * @param \Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template + */ + private function loadCompiledTemplate(Smarty_Internal_Template $_smarty_tpl) + { + if (function_exists('opcache_invalidate') + && (!function_exists('ini_get') || strlen(ini_get("opcache.restrict_api")) < 1) + ) { + opcache_invalidate($this->filepath, true); + } else if (function_exists('apc_compile_file')) { + apc_compile_file($this->filepath); + } + if (defined('HHVM_VERSION')) { + eval('?>' . file_get_contents($this->filepath)); + } else { + include($this->filepath); + } + } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_template_resource_base.php b/vendor/smarty/smarty/libs/sysplugins/smarty_template_resource_base.php index 6cc008a10..951e02af3 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_template_resource_base.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_template_resource_base.php @@ -73,16 +73,11 @@ abstract class Smarty_Template_Resource_Base public $content = null; /** - * required plugins + * Included sub templates + * - index name + * - value use count * - * @var array - */ - public $required_plugins = array(); - - /** - * Included subtemplates - * - * @var array + * @var int[] */ public $includes = array(); diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_template_source.php b/vendor/smarty/smarty/libs/sysplugins/smarty_template_source.php index fdb3deaa8..4868706c8 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_template_source.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_template_source.php @@ -126,12 +126,13 @@ class Smarty_Template_Source /** * create Source Object container * - * @param Smarty_Resource $handler Resource Handler this source object communicates with - * @param Smarty $smarty Smarty instance this source object belongs to - * @param string $resource full template_resource - * @param string $type type of resource - * @param string $name resource name + * @param Smarty $smarty Smarty instance this source object belongs to + * @param string $resource full template_resource + * @param string $type type of resource + * @param string $name resource name * + * @throws \SmartyException + * @internal param \Smarty_Resource $handler Resource Handler this source object communicates with */ public function __construct(Smarty $smarty, $resource, $type, $name) { @@ -202,6 +203,7 @@ class Smarty_Template_Source * Get source content * * @return string + * @throws \SmartyException */ public function getContent() { diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_undefined_variable.php b/vendor/smarty/smarty/libs/sysplugins/smarty_undefined_variable.php index 88bc6f68c..e064f6551 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smarty_undefined_variable.php +++ b/vendor/smarty/smarty/libs/sysplugins/smarty_undefined_variable.php @@ -7,22 +7,18 @@ * @package Smarty * @subpackage Template */ -class Smarty_Undefined_Variable +class Smarty_Undefined_Variable extends Smarty_Variable { /** - * Returns FALSE for 'nocache' and NULL otherwise. + * Returns null for not existing properties * * @param string $name * - * @return bool + * @return null */ public function __get($name) { - if ($name == 'nocache') { - return false; - } else { return null; - } } /** @@ -32,6 +28,6 @@ class Smarty_Undefined_Variable */ public function __toString() { - return ""; + return ''; } } diff --git a/vendor/smarty/smarty/libs/sysplugins/smartycompilerexception.php b/vendor/smarty/smarty/libs/sysplugins/smartycompilerexception.php index 763bab159..f7ad39b93 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smartycompilerexception.php +++ b/vendor/smarty/smarty/libs/sysplugins/smartycompilerexception.php @@ -7,6 +7,9 @@ */ class SmartyCompilerException extends SmartyException { + /** + * @return string + */ public function __toString() { return ' --> Smarty Compiler: ' . $this->message . ' <-- '; diff --git a/vendor/smarty/smarty/libs/sysplugins/smartyexception.php b/vendor/smarty/smarty/libs/sysplugins/smartyexception.php index 431d8f8e9..7f7b9aa43 100644 --- a/vendor/smarty/smarty/libs/sysplugins/smartyexception.php +++ b/vendor/smarty/smarty/libs/sysplugins/smartyexception.php @@ -9,6 +9,9 @@ class SmartyException extends Exception { public static $escape = false; + /** + * @return string + */ public function __toString() { return ' --> Smarty: ' . (self::$escape ? htmlentities($this->message) : $this->message) . ' <-- '; diff --git a/view/css/conversation.css b/view/css/conversation.css index cff59aecb..e6324b30d 100644 --- a/view/css/conversation.css +++ b/view/css/conversation.css @@ -27,6 +27,16 @@ padding: 0.5rem; } +#jot-text-wrap { + position: relative; +} + +#profile-jot-reset { + position: absolute; + top: 0px; + right: 0px; +} + #profile-jot-text { resize: none; border-width: 0px; @@ -39,6 +49,7 @@ #profile-jot-text.jot-expanded { resize: vertical; + height: 200px; } #profile-jot-text.hover { @@ -125,7 +136,7 @@ a.wall-item-name-link { .wall-item-ago, .wall-item-ago i { font-size: 0.75rem; - line-height: 1; + line-height: 1.1; } .wall-item-ago .fa-check { @@ -286,7 +297,6 @@ code { font-size: 1em; padding: 1em 1.5em; display: block; - white-space: pre-wrap; } code.inline-code { diff --git a/view/css/default.css b/view/css/default.css index fc6da54f9..765a197d9 100644 --- a/view/css/default.css +++ b/view/css/default.css @@ -1,11 +1,3 @@ -header #banner { - position: fixed; - top: 0px; - width: 33%; - margin-left: 33%; - margin-right: 33%; -} - main { display: table; table-layout: fixed; diff --git a/view/css/mod_group.css b/view/css/mod_group.css index b828e551d..215064706 100644 --- a/view/css/mod_group.css +++ b/view/css/mod_group.css @@ -1,66 +1,19 @@ - -#group-new-submit-wrapper { - margin-top: 30px; -} -/* -#group-edit-form > label { - float: left; - width: 300px; -} - -#group-edit-form input { - float: left; - width: 175px; -} - -#group-edit-form .field { - clear: both; -} -*/ -#group-edit-submit-wrapper input { - clear: both; - width: 100px; -} - -#group-edit-select-end { - clear: both; -} -/* -#group-edit-name-label { - float: left; - width: 175px; - margin-top: 20px; - margin-bottom: 20px; +.mpall, +.mpgroup { + line-height: 1.2; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; } -#group-edit-name { - float: left; - width: 225px; - margin-top: 20px; - margin-bottom: 20px; +#groups-index th:nth-child(1), +#groups-index td:nth-child(1){ + white-space: nowrap; + padding: 7px 3px 7px 10px; } -#group-edit-name-wrapper { - - -} -*/ - -#group_members_select_label { - display: block; - float: left; - width: 175px; -} - -.group_members_select { - float: left; - width: 230px; - overflow: auto; -} - -#group_members_select_end { - clear: both; -} -#group-edit-name-end { - clear: both; +#groups-index th:nth-child(2), +#groups-index td:nth-child(2){ + text-align: center; + padding: 7px 10px 7px 7px; } diff --git a/view/css/mod_wiki.css b/view/css/mod_wiki.css index e0b02b414..7e47dca21 100644 --- a/view/css/mod_wiki.css +++ b/view/css/mod_wiki.css @@ -33,7 +33,7 @@ width: 100%; } -td i { +td > i { padding: 7px 5px; cursor: pointer; } @@ -55,6 +55,7 @@ pre code { padding: 1em 1.5em; display: block; white-space: pre-wrap; + word-break: break-all; } code { @@ -64,8 +65,9 @@ code { display: inline; padding: 0.2em 0.2em; white-space: pre-wrap; + word-break: break-all; } #wiki-content-container code { background: #F5F5F5; -}
\ No newline at end of file +} diff --git a/view/css/widgets.css b/view/css/widgets.css index 9730d6915..e330c38e1 100644 --- a/view/css/widgets.css +++ b/view/css/widgets.css @@ -182,6 +182,7 @@ a.wikilist { .notifications-textinput { padding: .75rem 0.85rem; + position: relative; } .notifications-textinput input { diff --git a/view/de-de/hmessages.po b/view/de-de/hmessages.po index d7ae365e5..8af9dce6b 100644 --- a/view/de-de/hmessages.po +++ b/view/de-de/hmessages.po @@ -8059,23 +8059,6 @@ msgstr "Um diese Nachrichten nicht mehr zu erhalten, passe bitte Deine Benachric msgid "To stop receiving these messages, please adjust your %s." msgstr "Um diese Nachrichten nicht mehr zu erhalten, passe bitte Deine %s an." -#: ../../Zotlabs/Lib/Enotify.php:66 -#, php-format -msgid "This email was sent by %1$s at %2$s." -msgstr "Diese Email wurde von %1$s auf %2$s gesendet." - -#: ../../Zotlabs/Lib/Enotify.php:67 -#, php-format -msgid "" -"To stop receiving these messages, please adjust your Notification Settings " -"at %s" -msgstr "Um diese Nachrichten nicht mehr zu erhalten, passe bitte Deine Benachrichtigungseinstellungen unter folgendem Link an: %s" - -#: ../../Zotlabs/Lib/Enotify.php:68 -#, php-format -msgid "To stop receiving these messages, please adjust your %s." -msgstr "Um diese Nachrichten nicht mehr zu erhalten, passe bitte Deine %s an." - #: ../../Zotlabs/Lib/Enotify.php:123 #, php-format msgid "%s <!item_type!>" @@ -10010,12 +9993,12 @@ msgid "Login failed." msgstr "Login fehlgeschlagen." #: ../../addon/openid/Mod_Id.php:85 ../../include/selectors.php:49 -#: ../../include/selectors.php:66 ../../include/channel.php:1481 +#: ../../include/selectors.php:66 ../../include/channel.php:1480 msgid "Male" msgstr "Männlich" #: ../../addon/openid/Mod_Id.php:87 ../../include/selectors.php:49 -#: ../../include/selectors.php:66 ../../include/channel.php:1479 +#: ../../include/selectors.php:66 ../../include/channel.php:1478 msgid "Female" msgstr "Weiblich" @@ -11882,11 +11865,11 @@ msgstr "Transsexuell" msgid "Hermaphrodite" msgstr "Zwitter" -#: ../../include/selectors.php:49 ../../include/channel.php:1485 +#: ../../include/selectors.php:49 ../../include/channel.php:1484 msgid "Neuter" msgstr "Geschlechtslos" -#: ../../include/selectors.php:49 ../../include/channel.php:1487 +#: ../../include/selectors.php:49 ../../include/channel.php:1486 msgid "Non-specific" msgstr "unklar" @@ -13331,23 +13314,23 @@ msgstr "Dein Profilfoto ändern" msgid "Trans" msgstr "Trans" -#: ../../include/channel.php:1529 +#: ../../include/channel.php:1528 msgid "Like this channel" msgstr "Dieser Kanal gefällt mir" -#: ../../include/channel.php:1553 +#: ../../include/channel.php:1552 msgid "j F, Y" msgstr "j. F Y" -#: ../../include/channel.php:1554 +#: ../../include/channel.php:1553 msgid "j F" msgstr "j. F" -#: ../../include/channel.php:1561 +#: ../../include/channel.php:1560 msgid "Birthday:" msgstr "Geburtstag:" -#: ../../include/channel.php:1574 +#: ../../include/channel.php:1573 #, php-format msgid "for %1$d %2$s" msgstr "seit %1$d %2$s" diff --git a/view/de-de/hstrings.php b/view/de-de/hstrings.php index 749afef5d..884267319 100644 --- a/view/de-de/hstrings.php +++ b/view/de-de/hstrings.php @@ -277,7 +277,7 @@ App::$strings["Name or caption"] = "Name oder Titel"; App::$strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""] = "Beispiele: „Horst Weidinger“, „Lisa und ihr Meerschweinchen“, „Fußball“, „Segelflieger-Forum“ "; App::$strings["Choose a short nickname"] = "Wähle einen kurzen Spitznamen"; App::$strings["Your nickname will be used to create an easy to remember channel address e.g. nickname%s"] = "Dein Spitzname wird verwendet, um eine leicht zu merkende Kanal-Adresse (ähnlich einer E-Mail-Adresse) zu erzeugen, die Du mit anderen austauschen kannst, z.B. nickname%s"; -App::$strings["Channel role and privacy"] = "Kanaltyp und Privatspäre-Einstellungen"; +App::$strings["Channel role and privacy"] = "Kanaltyp und Privatsphäre-Einstellungen"; App::$strings["Select a channel role with your privacy requirements."] = "Wähle einen passenden Kanaltyp mit den zugehörigen Voreinstellungen zur Privatsphäre."; App::$strings["Read more about roles"] = "Mehr Informationen über Rollen"; App::$strings["Create Channel"] = "Einen neuen Kanal anlegen"; diff --git a/view/es-es/hmessages.po b/view/es-es/hmessages.po index 94cce21a4..84983a60f 100644 --- a/view/es-es/hmessages.po +++ b/view/es-es/hmessages.po @@ -15,7 +15,7 @@ msgstr "" "Project-Id-Version: Redmatrix\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-04-23 11:34+0200\n" -"PO-Revision-Date: 2018-04-24 09:02+0000\n" +"PO-Revision-Date: 2018-05-15 09:50+0000\n" "Last-Translator: Manuel Jiménez Friaza <mjfriaza@disroot.org>\n" "Language-Team: Spanish (Spain) (http://www.transifex.com/Friendica/red-matrix/language/es_ES/)\n" "MIME-Version: 1.0\n" @@ -1282,7 +1282,7 @@ msgstr "Evento no encontrado." #: ../../Zotlabs/Module/Like.php:386 ../../include/conversation.php:119 #: ../../include/text.php:2008 ../../include/event.php:1153 msgid "event" -msgstr "evento" +msgstr "el/su evento" #: ../../Zotlabs/Module/Events.php:460 msgid "Edit event title" @@ -1473,7 +1473,7 @@ msgstr "foto" #: ../../addon/diaspora/Receiver.php:1500 ../../addon/pubcrawl/as.php:1405 #: ../../include/conversation.php:144 ../../include/text.php:2011 msgid "status" -msgstr "el mensaje de estado" +msgstr "el mensaje de estado " #: ../../Zotlabs/Module/Subthread.php:142 #, php-format @@ -4541,7 +4541,7 @@ msgstr "Ocultas" #: ../../Zotlabs/Module/Connections.php:75 #: ../../Zotlabs/Module/Connections.php:178 msgid "Archived/Unreachable" -msgstr "Archivado o inaccesible" +msgstr "Archivadas o inaccesibles" #: ../../Zotlabs/Module/Connections.php:80 #: ../../Zotlabs/Module/Connections.php:89 ../../Zotlabs/Module/Menu.php:116 @@ -8087,7 +8087,7 @@ msgstr "Por favor visite %s para ver y/o responder a su mensaje privado." #: ../../Zotlabs/Lib/Enotify.php:144 msgid "commented on" -msgstr "ha comentado sobre" +msgstr "ha comentado sobre " #: ../../Zotlabs/Lib/Enotify.php:155 msgid "liked" @@ -8137,12 +8137,12 @@ msgstr "Para ver o comentar la conversación, visite %s" #: ../../Zotlabs/Lib/Enotify.php:240 ../../Zotlabs/Lib/Enotify.php:241 #, php-format msgid "Please visit %s to approve or reject this comment." -msgstr "Por favor, visite %spara aprobar o rechazar este comentario." +msgstr "Por favor, visite %s para aprobar o rechazar este comentario." #: ../../Zotlabs/Lib/Enotify.php:299 #, php-format msgid "%1$s liked [zrl=%2$s]your %3$s[/zrl]" -msgstr "A %1$sle ha gustado [zrl=%2$s]su%3$s [/zrl]" +msgstr "A %1$sle ha gustado [zrl=%2$s]su %3$s [/zrl]" #: ../../Zotlabs/Lib/Enotify.php:313 #, php-format @@ -8197,7 +8197,7 @@ msgstr "%1$sle ha dado un toque en %2$s" #: ../../Zotlabs/Lib/Enotify.php:367 #, php-format msgid "%1$s [zrl=%2$s]poked you[/zrl]." -msgstr "%1$s [zrl=%2$s]le ha dado un toque[/zrl]." +msgstr "%1$s [zrl=%2$s] le ha dado un toque[/zrl]." #: ../../Zotlabs/Lib/Enotify.php:382 #, php-format @@ -8282,7 +8282,7 @@ msgstr "ha comentado la entrada de %s" #: ../../Zotlabs/Lib/Enotify.php:816 #, php-format msgid "edited a post dated %s" -msgstr "ha editado una entrada fechada el%s" +msgstr "ha editado una entrada fechada el %s" #: ../../Zotlabs/Lib/Enotify.php:820 #, php-format @@ -12669,7 +12669,7 @@ msgstr "Tipo de contenido de la página" #: ../../include/text.php:2018 msgid "activity" -msgstr "la actividad" +msgstr "la/su actividad" #: ../../include/text.php:2100 msgid "a-z, 0-9, -, and _ only" @@ -13963,7 +13963,7 @@ msgstr "Proveer nube de etiquetas personal en su página de canal" #: ../../include/taxonomy.php:320 msgid "Trending" -msgstr "Populares" +msgstr "Trending" #: ../../include/taxonomy.php:552 msgid "Keywords" diff --git a/view/es-es/hstrings.php b/view/es-es/hstrings.php index 5c575dc3f..d035cb699 100644 --- a/view/es-es/hstrings.php +++ b/view/es-es/hstrings.php @@ -24,7 +24,7 @@ App::$strings["Can chat with me"] = "Se puede chatear conmigo"; 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["Social Networking"] = "Redes sociales"; -App::$strings["Social - Party"] = "Social - Extra público"; +App::$strings["Social - Federation"] = "Social - Federación"; App::$strings["Social - Mostly Public"] = "Social - Público en su mayor parte"; App::$strings["Social - Restricted"] = "Social - Restringido"; App::$strings["Social - Private"] = "Social - Privado"; @@ -213,7 +213,7 @@ App::$strings["Event can not end before it has started."] = "Un evento no puede 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["event"] = "evento"; +App::$strings["event"] = "el/su evento"; App::$strings["Edit event title"] = "Editar el título del evento"; App::$strings["Required"] = "Obligatorio"; App::$strings["Categories (comma-separated list)"] = "Temas (lista separada por comas)"; @@ -257,7 +257,7 @@ App::$strings["Location (URL) to purchase app"] = "Dirección (URL) donde adquir App::$strings["Please login."] = "Por favor, inicie sesión."; App::$strings["Hub not found."] = "Servidor no encontrado"; App::$strings["photo"] = "foto"; -App::$strings["status"] = "el mensaje de estado"; +App::$strings["status"] = "el mensaje de estado "; App::$strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s está siguiendo %3\$s de %2\$s"; App::$strings["%1\$s stopped following %2\$s's %3\$s"] = "%1\$s ha dejado de seguir %3\$s de %2\$s"; App::$strings["Channel not found."] = "Canal no encontrado."; @@ -281,7 +281,8 @@ 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["A channel is a unique network identity. It can represent a person (social network profile), a forum (group), a business or celebrity page, a newsfeed, and many other things. Channels can make connections with other channels to share information with each other."] = "Un canal es una identidad única en la red. Puede representar a una persona (un perfil de una red social), un foro o grupo, un negocio o una página de una celebridad, un \"feed\" de noticias, y muchas otras cosas. Los canales pueden conectarse con otros canales para compartir información unos con otros."; +App::$strings["The type of channel you create affects the basic privacy settings, the permissions that are granted to connections/friends, and also the channel's visibility across the network."] = "El tipo de canal que cree afecta a la configuración básica de privacidad, a los permisos que se conceden a las conexiones/amigos y también a la visibilidad del canal en la red."; 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["Validate"] = "Validar"; 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."; @@ -730,7 +731,6 @@ App::$strings["May reduce spam activity"] = "Podría reducir la actividad de spa App::$strings["Default Privacy Group"] = "Grupo de canales predeterminado"; App::$strings["Use my default audience setting for the type of object published"] = "Usar los ajustes de mi audiencia predeterminada para el tipo de publicación"; App::$strings["Profile to assign new connections"] = "Perfil para asignar a las nuevas conexiones"; -App::$strings["Channel permissions category:"] = "Categoría de los permisos del canal:"; App::$strings["Default Permissions Group"] = "Grupo de permisos predeterminados"; App::$strings["Maximum private messages per day from unknown people:"] = "Máximo de mensajes privados por día de gente desconocida:"; App::$strings["Useful to reduce spamming"] = "Útil para reducir el envío de correo no deseado"; @@ -929,7 +929,7 @@ App::$strings["Active"] = "Activo/a"; App::$strings["Blocked"] = "Bloqueadas"; App::$strings["Ignored"] = "Ignoradas"; App::$strings["Hidden"] = "Ocultas"; -App::$strings["Archived/Unreachable"] = "Archivado o inaccesible"; +App::$strings["Archived/Unreachable"] = "Archivadas o inaccesibles"; App::$strings["New"] = "Nuevas"; App::$strings["All"] = "Todos/as"; App::$strings["Active Connections"] = "Conexiones activas"; @@ -1750,7 +1750,7 @@ App::$strings["%1\$s sent you a new private message at %2\$s."] = "%1\$s le ha e 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["commented on"] = "ha comentado sobre"; +App::$strings["commented on"] = "ha comentado sobre "; App::$strings["liked"] = "ha gustado de "; App::$strings["disliked"] = "no ha gustado de "; App::$strings["%1\$s %2\$s [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s%2\$s [zrl=%3\$s ]un %4\$s[/zrl]"; @@ -1760,8 +1760,8 @@ App::$strings["[\$Projectname:Notify] Moderated Comment to conversation #%1\$d b 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 commented on an item/conversation you have been following."] = "%1\$sha 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["Please visit %s to approve or reject this comment."] = "Por favor, visite %spara aprobar o rechazar este comentario."; -App::$strings["%1\$s liked [zrl=%2\$s]your %3\$s[/zrl]"] = "A %1\$sle ha gustado [zrl=%2\$s]su%3\$s [/zrl]"; +App::$strings["Please visit %s to approve or reject this comment."] = "Por favor, visite %s para aprobar o rechazar este comentario."; +App::$strings["%1\$s liked [zrl=%2\$s]your %3\$s[/zrl]"] = "A %1\$sle ha gustado [zrl=%2\$s]su %3\$s [/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 liked an item/conversation you created."] = "A %1\$s le ha gustado 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\")"; @@ -1772,7 +1772,7 @@ App::$strings["%1\$s tagged you at %2\$s"] = "%1\$sle ha etiquetado en %2\$s"; App::$strings["%1\$s [zrl=%2\$s]tagged you[/zrl]."] = "%1\$s [zrl=%2\$s]le ha etiquetado[/zrl]."; App::$strings["[\$Projectname:Notify] %1\$s poked you"] = "[\$Projectname:Aviso] %1\$s le ha dado un toque"; App::$strings["%1\$s poked you at %2\$s"] = "%1\$sle ha dado un toque en %2\$s"; -App::$strings["%1\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s [zrl=%2\$s]le ha dado un toque[/zrl]."; +App::$strings["%1\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$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 tagged your post at %2\$s"] = "%1\$sha etiquetado su entrada en %2\$s"; App::$strings["%1\$s tagged [zrl=%2\$s]your post[/zrl]"] = "%1\$s ha etiquetado [zrl=%2\$s]su entrada[/zrl]"; @@ -1790,7 +1790,7 @@ App::$strings["Please visit %s to approve or reject the suggestion."] = "Por fav 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["edited a post dated %s"] = "ha editado una entrada fechada el%s"; +App::$strings["edited a post dated %s"] = "ha editado una entrada fechada el %s"; App::$strings["edited a comment dated %s"] = "ha editado un comentario fechado el %s"; App::$strings["Wiki updated successfully"] = "El wiki se ha actualizado con éxito"; App::$strings["Wiki files deleted successfully"] = "Se han borrado con éxito los ficheros del wiki"; @@ -2304,6 +2304,12 @@ App::$strings["The default zoom level. (1:world, 18:highest, also depends on til 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["text to include in all outgoing posts from this site"] = "texto a incluir en todos los mensajes salientes de este sitio"; +App::$strings["Fuzzloc Settings updated."] = "Los ajustes de Fuzzloc se han actualizado."; +App::$strings["Fuzzloc allows you to blur your precise location if your channel uses browser location mapping."] = "Fuzzloc le permite desdibujar su ubicación precisa si su canal utiliza la asignación de ubicación del navegador."; +App::$strings["Enable Fuzzloc Plugin"] = "Habilitar el plugin Fuzzloc"; +App::$strings["Minimum offset in meters"] = "Offset mínimo en metros"; +App::$strings["Maximum offset in meters"] = "Offset máximo en metros"; +App::$strings["Fuzzloc Settings"] = "Ajustes de Fuzzloc"; 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"; @@ -2839,7 +2845,7 @@ App::$strings["HTML"] = "HTML"; App::$strings["Comanche Layout"] = "Plantilla de Comanche"; App::$strings["PHP"] = "PHP"; App::$strings["Page content type"] = "Tipo de contenido de la página"; -App::$strings["activity"] = "la actividad"; +App::$strings["activity"] = "la/su actividad"; App::$strings["a-z, 0-9, -, and _ only"] = "a-z, 0-9, -, and _ only"; App::$strings["Design Tools"] = "Herramientas de diseño web"; App::$strings["Pages"] = "Páginas"; @@ -3151,7 +3157,7 @@ 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["Trending"] = "Populares"; +App::$strings["Trending"] = "Trending"; App::$strings["Keywords"] = "Palabras clave"; App::$strings["have"] = "tener"; App::$strings["has"] = "tiene"; diff --git a/view/fr/hmessages.po b/view/fr/hmessages.po index e8257c5ca..8c75a9416 100644 --- a/view/fr/hmessages.po +++ b/view/fr/hmessages.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: Redmatrix\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-04-13 21:54+0200\n" -"PO-Revision-Date: 2018-04-16 12:24+0000\n" +"POT-Creation-Date: 2018-04-23 11:34+0200\n" +"PO-Revision-Date: 2018-05-26 07:06+0000\n" "Last-Translator: Philip Wittamore <philip@wittamore.com>\n" "Language-Team: French (http://www.transifex.com/Friendica/red-matrix/language/fr/)\n" "MIME-Version: 1.0\n" @@ -101,8 +101,8 @@ msgid "Social Networking" msgstr "Réseau social" #: ../../Zotlabs/Access/PermissionRoles.php:284 -msgid "Social - Party" -msgstr "Social - Fête" +msgid "Social - Federation" +msgstr "Sociale - Fédération" #: ../../Zotlabs/Access/PermissionRoles.php:285 msgid "Social - Mostly Public" @@ -256,7 +256,7 @@ msgstr "Accès refusé." msgid "Block Name" msgstr "Nom du Bloc" -#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2405 +#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2422 msgid "Blocks" msgstr "Blocs" @@ -425,7 +425,7 @@ msgstr "3. Cliquez sur [Ajouter]" #: ../../Zotlabs/Module/Admin/Profs.php:178 #: ../../Zotlabs/Module/Admin/Account_edit.php:74 #: ../../Zotlabs/Module/Admin/Security.php:104 -#: ../../Zotlabs/Module/Settings/Permcats.php:110 +#: ../../Zotlabs/Module/Settings/Permcats.php:115 #: ../../Zotlabs/Module/Settings/Channel.php:495 #: ../../Zotlabs/Module/Settings/Features.php:79 #: ../../Zotlabs/Module/Settings/Tokens.php:168 @@ -461,15 +461,16 @@ msgstr "3. Cliquez sur [Ajouter]" #: ../../addon/likebanner/likebanner.php:57 #: ../../addon/redphotos/redphotos.php:136 ../../addon/irc/irc.php:53 #: ../../addon/ljpost/ljpost.php:86 ../../addon/startpage/startpage.php:113 -#: ../../addon/diaspora/diaspora.php:823 +#: ../../addon/diaspora/diaspora.php:825 #: ../../addon/rainbowtag/rainbowtag.php:85 ../../addon/hzfiles/hzfiles.php:84 #: ../../addon/visage/visage.php:170 ../../addon/nsabait/nsabait.php:161 #: ../../addon/mailtest/mailtest.php:100 #: ../../addon/openstreetmap/openstreetmap.php:168 -#: ../../addon/rtof/rtof.php:101 ../../addon/jappixmini/jappixmini.php:371 +#: ../../addon/fuzzloc/fuzzloc.php:191 ../../addon/rtof/rtof.php:101 +#: ../../addon/jappixmini/jappixmini.php:371 #: ../../addon/superblock/superblock.php:120 ../../addon/nofed/nofed.php:80 #: ../../addon/redred/redred.php:119 ../../addon/logrot/logrot.php:35 -#: ../../addon/frphotos/frphotos.php:97 ../../addon/pubcrawl/pubcrawl.php:1069 +#: ../../addon/frphotos/frphotos.php:97 ../../addon/pubcrawl/pubcrawl.php:1072 #: ../../addon/chords/Mod_Chords.php:60 ../../addon/libertree/libertree.php:85 #: ../../addon/flattrwidget/flattrwidget.php:124 #: ../../addon/statusnet/statusnet.php:322 @@ -569,7 +570,7 @@ msgstr "Sommaire :" #: ../../Zotlabs/Module/Photos.php:817 ../../Zotlabs/Module/Photos.php:1273 #: ../../Zotlabs/Lib/Apps.php:754 ../../Zotlabs/Lib/Apps.php:833 #: ../../Zotlabs/Storage/Browser.php:164 ../../Zotlabs/Widget/Portfolio.php:95 -#: ../../Zotlabs/Widget/Album.php:84 ../../addon/pubcrawl/as.php:878 +#: ../../Zotlabs/Widget/Album.php:84 ../../addon/pubcrawl/as.php:891 #: ../../include/conversation.php:1160 msgid "Unknown" msgstr "Inconnu" @@ -687,7 +688,7 @@ msgstr "Tout supprimer" #: ../../Zotlabs/Module/Profile_photo.php:464 #: ../../Zotlabs/Module/Connedit.php:924 ../../Zotlabs/Module/Fbrowser.php:66 #: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:801 -#: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Module/Cover_photo.php:365 +#: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Module/Cover_photo.php:366 #: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138 #: ../../include/conversation.php:1389 ../../include/conversation.php:1438 msgid "Cancel" @@ -731,7 +732,7 @@ msgstr "Téléphone" #: ../../Zotlabs/Module/Connedit.php:910 ../../Zotlabs/Module/Profiles.php:787 #: ../../addon/openid/MysqlProvider.php:56 #: ../../addon/openid/MysqlProvider.php:57 ../../addon/rtof/rtof.php:93 -#: ../../addon/redred/redred.php:107 ../../include/network.php:1776 +#: ../../addon/redred/redred.php:107 ../../include/network.php:1770 msgid "Email" msgstr "Courriel" @@ -947,7 +948,7 @@ msgstr "Eléments étiquetés avec : %s" msgid "Search results for: %s" msgstr "Résultats de recherche pour : %s" -#: ../../Zotlabs/Module/Pubstream.php:93 +#: ../../Zotlabs/Module/Pubstream.php:95 #: ../../Zotlabs/Widget/Notifications.php:131 msgid "Public Stream" msgstr "Flux public" @@ -1093,8 +1094,8 @@ msgstr "Utiliser l'authentification distante, quand disponible" #: ../../addon/dwpost/dwpost.php:85 ../../addon/ljpost/ljpost.php:70 #: ../../addon/ljpost/ljpost.php:82 ../../addon/rainbowtag/rainbowtag.php:81 #: ../../addon/visage/visage.php:166 ../../addon/nsabait/nsabait.php:157 -#: ../../addon/rtof/rtof.php:81 ../../addon/rtof/rtof.php:85 -#: ../../addon/jappixmini/jappixmini.php:309 +#: ../../addon/fuzzloc/fuzzloc.php:178 ../../addon/rtof/rtof.php:81 +#: ../../addon/rtof/rtof.php:85 ../../addon/jappixmini/jappixmini.php:309 #: ../../addon/jappixmini/jappixmini.php:313 #: ../../addon/jappixmini/jappixmini.php:343 #: ../../addon/jappixmini/jappixmini.php:351 @@ -1145,8 +1146,8 @@ msgstr "Non" #: ../../addon/dwpost/dwpost.php:85 ../../addon/ljpost/ljpost.php:70 #: ../../addon/ljpost/ljpost.php:82 ../../addon/rainbowtag/rainbowtag.php:81 #: ../../addon/visage/visage.php:166 ../../addon/nsabait/nsabait.php:157 -#: ../../addon/rtof/rtof.php:81 ../../addon/rtof/rtof.php:85 -#: ../../addon/jappixmini/jappixmini.php:309 +#: ../../addon/fuzzloc/fuzzloc.php:178 ../../addon/rtof/rtof.php:81 +#: ../../addon/rtof/rtof.php:85 ../../addon/jappixmini/jappixmini.php:309 #: ../../addon/jappixmini/jappixmini.php:313 #: ../../addon/jappixmini/jappixmini.php:343 #: ../../addon/jappixmini/jappixmini.php:351 @@ -1463,13 +1464,13 @@ msgstr "Hub introuvable." #: ../../Zotlabs/Module/Subthread.php:111 ../../Zotlabs/Module/Tagger.php:69 #: ../../Zotlabs/Module/Like.php:384 #: ../../addon/redphotos/redphotohelper.php:71 -#: ../../addon/diaspora/Receiver.php:1500 ../../addon/pubcrawl/as.php:1388 +#: ../../addon/diaspora/Receiver.php:1500 ../../addon/pubcrawl/as.php:1405 #: ../../include/conversation.php:116 ../../include/text.php:2005 msgid "photo" msgstr "photo" #: ../../Zotlabs/Module/Subthread.php:111 ../../Zotlabs/Module/Like.php:384 -#: ../../addon/diaspora/Receiver.php:1500 ../../addon/pubcrawl/as.php:1388 +#: ../../addon/diaspora/Receiver.php:1500 ../../addon/pubcrawl/as.php:1405 #: ../../include/conversation.php:144 ../../include/text.php:2011 msgid "status" msgstr "état" @@ -1577,6 +1578,7 @@ msgid "" msgstr "Votre pseudo sera utilisé pour créer une adresse de canal facile à mémoriser, par ex. pseudo%s" #: ../../Zotlabs/Module/New_channel.php:149 +#: ../../Zotlabs/Module/Settings/Channel.php:539 #: ../../Zotlabs/Module/Register.php:257 msgid "Channel role and privacy" msgstr "Rôle et confidentialité du canal" @@ -1597,10 +1599,18 @@ msgstr "Créer le canal" #: ../../Zotlabs/Module/New_channel.php:153 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 est votre identité sur ce réseau. Il peut représenter une personne, un blog, ou un forum par exemple. Les canaux peuvent entrer en contact les uns avec les autres pour partager des informations avec des droits d'accès très fins." +"A channel is a unique network identity. It can represent a person (social " +"network profile), a forum (group), a business or celebrity page, a newsfeed," +" and many other things. Channels can make connections with other channels to" +" share information with each other." +msgstr "Un canal est une identité réseau unique. Il peut représenter une personne (profil de réseau social), un forum (groupe), une page commerciale ou de célébrités, un flux d'informations et bien d'autres choses. Les canaux peuvent établir des connexions avec d'autres canaux pour partager l'information entre eux." + +#: ../../Zotlabs/Module/New_channel.php:153 +msgid "" +"The type of channel you create affects the basic privacy settings, the " +"permissions that are granted to connections/friends, and also the channel's " +"visibility across the network." +msgstr "Le type de canal que vous créez affecte les paramètres de confidentialité de base, les permissions accordées aux connexions/amis, ainsi que la visibilité du canal sur le réseau." #: ../../Zotlabs/Module/New_channel.php:154 msgid "" @@ -2661,7 +2671,7 @@ msgstr "Paramètres du site sauvegardés." #: ../../Zotlabs/Module/Admin/Site.php:191 #: ../../view/theme/redbasic_c/php/config.php:15 -#: ../../view/theme/redbasic/php/config.php:15 ../../include/text.php:3089 +#: ../../view/theme/redbasic/php/config.php:15 ../../include/text.php:3106 msgid "Default" msgstr "Défaut" @@ -3028,7 +3038,7 @@ msgstr "Distributions par processus" msgid "" "Number of deliveries to attempt in a single operating system process. Adjust" " if necessary to tune system performance. Recommend: 1-5." -msgstr "Nombre de distributions à tenter au sein d'un seul processus système. Ajuster si nécessaire pour affiner la performance du système. Recommandé :1-5." +msgstr "Nombre de distributions à tenter au sein d'un seul processus système. Ajuster si nécessaire pour affiner la performance du système. Recommandé:1-5." #: ../../Zotlabs/Module/Admin/Site.php:347 msgid "Queue Threshold" @@ -3081,7 +3091,7 @@ msgstr "Charge système maximale au-delà de laquelle distribution et scrutation #: ../../Zotlabs/Module/Admin/Site.php:352 msgid "Expiration period in days for imported (grid/network) content" -msgstr "Délai d'expiration pour le contenu importé (réseau)" +msgstr "Délai d'expiration en jours pour le contenu importé (grille/réseau)" #: ../../Zotlabs/Module/Admin/Site.php:352 msgid "0 for no expiration of imported content" @@ -3365,51 +3375,55 @@ msgctxt "acl" msgid "Profile" msgstr "Profil" -#: ../../Zotlabs/Module/Moderate.php:62 +#: ../../Zotlabs/Module/Moderate.php:65 msgid "Comment approved" msgstr "Commentaire validé" -#: ../../Zotlabs/Module/Moderate.php:66 +#: ../../Zotlabs/Module/Moderate.php:69 msgid "Comment deleted" msgstr "Commentaire supprimé" -#: ../../Zotlabs/Module/Settings/Permcats.php:37 +#: ../../Zotlabs/Module/Settings/Permcats.php:23 +msgid "Permission Name is required." +msgstr "Le nom de permission est requis." + +#: ../../Zotlabs/Module/Settings/Permcats.php:42 msgid "Permission category saved." msgstr "Profil d'accès enregistré." -#: ../../Zotlabs/Module/Settings/Permcats.php:61 +#: ../../Zotlabs/Module/Settings/Permcats.php:66 msgid "" "Use this form to create permission rules for various classes of people or " "connections." msgstr "Utilisez ce formulaire pour créer des règles d'accès pour différentes catégories de personnes ou de contacts." -#: ../../Zotlabs/Module/Settings/Permcats.php:94 +#: ../../Zotlabs/Module/Settings/Permcats.php:99 msgid "Permission Categories" msgstr "Profils d'accès" -#: ../../Zotlabs/Module/Settings/Permcats.php:102 +#: ../../Zotlabs/Module/Settings/Permcats.php:107 msgid "Permission Name" msgstr "Nom du droit d'accès" -#: ../../Zotlabs/Module/Settings/Permcats.php:103 +#: ../../Zotlabs/Module/Settings/Permcats.php:108 #: ../../Zotlabs/Module/Settings/Tokens.php:161 #: ../../Zotlabs/Module/Connedit.php:891 ../../Zotlabs/Module/Defperms.php:250 msgid "My Settings" msgstr "Mes paramètres" -#: ../../Zotlabs/Module/Settings/Permcats.php:105 +#: ../../Zotlabs/Module/Settings/Permcats.php:110 #: ../../Zotlabs/Module/Settings/Tokens.php:163 #: ../../Zotlabs/Module/Connedit.php:886 ../../Zotlabs/Module/Defperms.php:248 msgid "inherited" msgstr "héritée" -#: ../../Zotlabs/Module/Settings/Permcats.php:108 +#: ../../Zotlabs/Module/Settings/Permcats.php:113 #: ../../Zotlabs/Module/Settings/Tokens.php:166 #: ../../Zotlabs/Module/Connedit.php:893 ../../Zotlabs/Module/Defperms.php:253 msgid "Individual Permissions" msgstr "Droits d'accès individuels" -#: ../../Zotlabs/Module/Settings/Permcats.php:109 +#: ../../Zotlabs/Module/Settings/Permcats.php:114 #: ../../Zotlabs/Module/Settings/Tokens.php:167 #: ../../Zotlabs/Module/Connedit.php:894 msgid "" @@ -3629,10 +3643,6 @@ msgstr "Utiliser mon paramètre de publication par défaut pour le type d'objet msgid "Profile to assign new connections" msgstr "Profil pour assigner de nouvelles connexions" -#: ../../Zotlabs/Module/Settings/Channel.php:539 -msgid "Channel permissions category:" -msgstr "Profils d'accès du canal :" - #: ../../Zotlabs/Module/Settings/Channel.php:540 msgid "Default Permissions Group" msgstr "Groupe d'accès par défaut" @@ -4260,7 +4270,7 @@ msgstr "Modifier l'album" #: ../../Zotlabs/Module/Embedphotos.php:158 #: ../../Zotlabs/Module/Photos.php:712 #: ../../Zotlabs/Module/Profile_photo.php:458 -#: ../../Zotlabs/Module/Cover_photo.php:361 +#: ../../Zotlabs/Module/Cover_photo.php:362 #: ../../Zotlabs/Storage/Browser.php:384 ../../Zotlabs/Widget/Cdav.php:133 #: ../../Zotlabs/Widget/Cdav.php:169 ../../Zotlabs/Widget/Portfolio.php:110 #: ../../Zotlabs/Widget/Album.php:97 @@ -4442,7 +4452,7 @@ msgstr "Authentifier" msgid "Permissions denied." msgstr "Accès refusés." -#: ../../Zotlabs/Module/Cal.php:344 ../../include/text.php:2429 +#: ../../Zotlabs/Module/Cal.php:344 ../../include/text.php:2446 msgid "Import" msgstr "Import" @@ -4906,7 +4916,7 @@ msgstr "Voir tout" #: ../../Zotlabs/Module/Photos.php:1160 ../../Zotlabs/Lib/ThreadItem.php:205 #: ../../include/conversation.php:1981 ../../include/channel.php:1539 -#: ../../include/taxonomy.php:601 +#: ../../include/taxonomy.php:661 msgctxt "noun" msgid "Like" msgid_plural "Likes" @@ -4923,7 +4933,7 @@ msgstr[1] "N'aime pas" #: ../../Zotlabs/Module/Photos.php:1265 msgid "Photo Tools" -msgstr "Ouitls pour photos" +msgstr "Outils pour photos" #: ../../Zotlabs/Module/Photos.php:1274 msgid "In This Photo:" @@ -4949,7 +4959,7 @@ msgid "Close" msgstr "Fermer" #: ../../Zotlabs/Module/Photos.php:1365 ../../Zotlabs/Module/Photos.php:1378 -#: ../../Zotlabs/Module/Photos.php:1379 ../../include/photos.php:663 +#: ../../Zotlabs/Module/Photos.php:1379 ../../include/photos.php:667 msgid "Recent Photos" msgstr "Photos récentes" @@ -5084,48 +5094,48 @@ msgstr "Intégrer une image de votre album photo" #: ../../Zotlabs/Module/Wiki.php:380 #: ../../Zotlabs/Module/Profile_photo.php:465 -#: ../../Zotlabs/Module/Cover_photo.php:366 +#: ../../Zotlabs/Module/Cover_photo.php:367 #: ../../include/conversation.php:1390 ../../include/conversation.php:1437 msgid "OK" msgstr "OK" #: ../../Zotlabs/Module/Wiki.php:381 #: ../../Zotlabs/Module/Profile_photo.php:466 -#: ../../Zotlabs/Module/Cover_photo.php:367 +#: ../../Zotlabs/Module/Cover_photo.php:368 #: ../../include/conversation.php:1320 msgid "Choose images to embed" msgstr "Choisissez des images à intégrer" #: ../../Zotlabs/Module/Wiki.php:382 #: ../../Zotlabs/Module/Profile_photo.php:467 -#: ../../Zotlabs/Module/Cover_photo.php:368 +#: ../../Zotlabs/Module/Cover_photo.php:369 #: ../../include/conversation.php:1321 msgid "Choose an album" msgstr "Choisir un album" #: ../../Zotlabs/Module/Wiki.php:383 #: ../../Zotlabs/Module/Profile_photo.php:468 -#: ../../Zotlabs/Module/Cover_photo.php:369 +#: ../../Zotlabs/Module/Cover_photo.php:370 msgid "Choose a different album" msgstr "Choisissez un autre album" #: ../../Zotlabs/Module/Wiki.php:384 #: ../../Zotlabs/Module/Profile_photo.php:469 -#: ../../Zotlabs/Module/Cover_photo.php:370 +#: ../../Zotlabs/Module/Cover_photo.php:371 #: ../../include/conversation.php:1323 msgid "Error getting album list" msgstr "Erreur venant de la liste de l'album" #: ../../Zotlabs/Module/Wiki.php:385 #: ../../Zotlabs/Module/Profile_photo.php:470 -#: ../../Zotlabs/Module/Cover_photo.php:371 +#: ../../Zotlabs/Module/Cover_photo.php:372 #: ../../include/conversation.php:1324 msgid "Error getting photo link" msgstr "Erreur provenant du lien de la photo" #: ../../Zotlabs/Module/Wiki.php:386 #: ../../Zotlabs/Module/Profile_photo.php:471 -#: ../../Zotlabs/Module/Cover_photo.php:372 +#: ../../Zotlabs/Module/Cover_photo.php:373 #: ../../include/conversation.php:1325 msgid "Error getting album" msgstr "Erreur venant de l'album" @@ -5262,7 +5272,7 @@ msgstr "L'image a été téléversée, mais le recadrage a échoué." #: ../../Zotlabs/Module/Profile_photo.php:120 #: ../../Zotlabs/Module/Profile_photo.php:248 -#: ../../include/photo/photo_driver.php:740 +#: ../../include/photo/photo_driver.php:741 msgid "Profile Photos" msgstr "Photos du profil" @@ -5301,12 +5311,12 @@ msgid "Photo not available." msgstr "Photo inaccessible." #: ../../Zotlabs/Module/Profile_photo.php:455 -#: ../../Zotlabs/Module/Cover_photo.php:358 +#: ../../Zotlabs/Module/Cover_photo.php:359 msgid "Upload File:" msgstr "Téléverser fichier :" #: ../../Zotlabs/Module/Profile_photo.php:456 -#: ../../Zotlabs/Module/Cover_photo.php:359 +#: ../../Zotlabs/Module/Cover_photo.php:360 msgid "Select a profile:" msgstr "Choisir un profil :" @@ -5324,28 +5334,28 @@ msgstr "Utiliser" #: ../../Zotlabs/Module/Profile_photo.php:462 #: ../../Zotlabs/Module/Profile_photo.php:463 -#: ../../Zotlabs/Module/Cover_photo.php:363 #: ../../Zotlabs/Module/Cover_photo.php:364 +#: ../../Zotlabs/Module/Cover_photo.php:365 msgid "Use a photo from your albums" msgstr "Utiliser une photo de vos albums" #: ../../Zotlabs/Module/Profile_photo.php:473 -#: ../../Zotlabs/Module/Cover_photo.php:375 +#: ../../Zotlabs/Module/Cover_photo.php:376 msgid "Select existing photo" msgstr "Sélectionner une photo existante" #: ../../Zotlabs/Module/Profile_photo.php:492 -#: ../../Zotlabs/Module/Cover_photo.php:392 +#: ../../Zotlabs/Module/Cover_photo.php:393 msgid "Crop Image" msgstr "Recadrer l'image" #: ../../Zotlabs/Module/Profile_photo.php:493 -#: ../../Zotlabs/Module/Cover_photo.php:393 +#: ../../Zotlabs/Module/Cover_photo.php:394 msgid "Please adjust the image cropping for optimum viewing." msgstr "Merci d'ajuster le cadre pour une visualisation optimale." #: ../../Zotlabs/Module/Profile_photo.php:495 -#: ../../Zotlabs/Module/Cover_photo.php:395 +#: ../../Zotlabs/Module/Cover_photo.php:396 msgid "Done Editing" msgstr "J'ai terminé" @@ -5875,7 +5885,7 @@ msgstr "Le menu pourra être utilisé pour stocker des favoris" msgid "Submit and proceed" msgstr "Valider et continuer" -#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2406 +#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2423 msgid "Menus" msgstr "Menus" @@ -5927,7 +5937,7 @@ msgstr "Titre du menu tel que vu par les visiteurs" msgid "Allow bookmarks" msgstr "Autoriser l'usage de favoris" -#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2407 +#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2424 msgid "Layouts" msgstr "Mises-en-page" @@ -6014,7 +6024,7 @@ 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 "Attention :modifier certains paramètres peut rendre votre canal inutilisable. Merci d'ignorer cette page à moins d'être suffisamment à l'aise de savoir comment utiliser correctement cette fonctionnalité." +msgstr "Attention:modifier certains paramètres peut rendre votre canal inutilisable. Merci d'ignorer cette page à moins d'être suffisamment à l'aise de savoir comment utiliser correctement cette fonctionnalité." #: ../../Zotlabs/Module/Defperms.php:239 msgid "" @@ -6295,7 +6305,7 @@ msgstr "Qui (si applicable)" #: ../../Zotlabs/Module/Profiles.php:762 msgid "Examples: cathy123, Cathy Williams, cathy@example.com" -msgstr "Exemples : marie123, Marie Deschamps, marie@exemple.com" +msgstr "Exemples : marie123, Marie Deschamps, marie@exemple.com" #: ../../Zotlabs/Module/Profiles.php:763 msgid "Since (date)" @@ -6835,12 +6845,12 @@ msgid "Previous action reversed." msgstr "Action précédente annulée." #: ../../Zotlabs/Module/Like.php:438 ../../addon/diaspora/Receiver.php:1529 -#: ../../addon/pubcrawl/as.php:1423 ../../include/conversation.php:160 +#: ../../addon/pubcrawl/as.php:1440 ../../include/conversation.php:160 #, php-format msgid "%1$s likes %2$s's %3$s" msgstr "%1$s aime %3$s de %2$s" -#: ../../Zotlabs/Module/Like.php:440 ../../addon/pubcrawl/as.php:1425 +#: ../../Zotlabs/Module/Like.php:440 ../../addon/pubcrawl/as.php:1442 #: ../../include/conversation.php:163 #, php-format msgid "%1$s doesn't like %2$s's %3$s" @@ -6933,7 +6943,7 @@ msgstr "À propos :" #: ../../include/conversation.php:1052 ../../include/channel.php:1376 #: ../../include/connections.php:110 msgid "Connect" -msgstr "Ajouter/Suivre" +msgstr "Lier" #: ../../Zotlabs/Module/Directory.php:339 msgid "Public Forum:" @@ -7353,7 +7363,7 @@ msgstr "%1$s a mis a jour sa %2$s" msgid "cover photo" msgstr "Photo principale" -#: ../../Zotlabs/Module/Cover_photo.php:360 +#: ../../Zotlabs/Module/Cover_photo.php:361 msgid "Change Cover Photo" msgstr "Changer la photo de couverture" @@ -7422,19 +7432,19 @@ msgstr "forum" msgid "Search Results For:" msgstr "Résultats de recherche pour :" -#: ../../Zotlabs/Module/Network.php:230 +#: ../../Zotlabs/Module/Network.php:229 msgid "Privacy group is empty" msgstr "Groupe de contacts vide" -#: ../../Zotlabs/Module/Network.php:240 +#: ../../Zotlabs/Module/Network.php:238 msgid "Privacy group: " msgstr "Groupe de contacts :" -#: ../../Zotlabs/Module/Network.php:268 +#: ../../Zotlabs/Module/Network.php:265 msgid "Invalid connection." msgstr "Contact non valide." -#: ../../Zotlabs/Module/Network.php:289 ../../addon/redred/redred.php:65 +#: ../../Zotlabs/Module/Network.php:285 ../../addon/redred/redred.php:65 msgid "Invalid channel." msgstr "Canal invalide." @@ -8273,7 +8283,7 @@ msgstr "a édité un commentaire daté du %s" msgid "Wiki updated successfully" msgstr "Wiki mis à jour avec succès" -#: ../../Zotlabs/Lib/NativeWiki.php:198 +#: ../../Zotlabs/Lib/NativeWiki.php:205 msgid "Wiki files deleted successfully" msgstr "Fichiers du wiki supprimés avec succès" @@ -8347,11 +8357,11 @@ msgstr "Signature du message incorrecte" msgid "Add Tag" msgstr "Ajouter une étiquette" -#: ../../Zotlabs/Lib/ThreadItem.php:281 ../../include/taxonomy.php:514 +#: ../../Zotlabs/Lib/ThreadItem.php:281 ../../include/taxonomy.php:575 msgid "like" msgstr "aiment" -#: ../../Zotlabs/Lib/ThreadItem.php:282 ../../include/taxonomy.php:515 +#: ../../Zotlabs/Lib/ThreadItem.php:282 ../../include/taxonomy.php:576 msgid "dislike" msgstr "n'aiment pas" @@ -8508,7 +8518,7 @@ msgstr "Bienvenue %s. L'authentification distante a fonctionné." msgid "parent" msgstr "retour" -#: ../../Zotlabs/Storage/Browser.php:131 ../../include/text.php:2828 +#: ../../Zotlabs/Storage/Browser.php:131 ../../include/text.php:2845 msgid "Collection" msgstr "Groupe de contacts" @@ -8653,9 +8663,9 @@ msgstr "Sélectionner un carnet d'adresses à importer dans" #: ../../Zotlabs/Widget/Appcategories.php:40 #: ../../include/contact_widgets.php:97 ../../include/contact_widgets.php:141 -#: ../../include/contact_widgets.php:186 ../../include/taxonomy.php:348 -#: ../../include/taxonomy.php:430 ../../include/taxonomy.php:450 -#: ../../include/taxonomy.php:471 +#: ../../include/contact_widgets.php:186 ../../include/taxonomy.php:409 +#: ../../include/taxonomy.php:491 ../../include/taxonomy.php:511 +#: ../../include/taxonomy.php:532 msgid "Categories" msgstr "Catégories" @@ -8843,8 +8853,8 @@ msgstr "Dossiers sauvegardés" msgid "Click to show more" msgstr "Cliquer pour voir plus" -#: ../../Zotlabs/Widget/Tagcloud.php:22 ../../include/taxonomy.php:388 -#: ../../include/taxonomy.php:409 +#: ../../Zotlabs/Widget/Tagcloud.php:22 ../../include/taxonomy.php:320 +#: ../../include/taxonomy.php:449 ../../include/taxonomy.php:470 msgid "Tags" msgstr "Étiquettes" @@ -9193,6 +9203,10 @@ msgstr "Les taches planifiées ne tournent pas." msgid "never" msgstr "jamais" +#: ../../store/[data]/smarty3/compiled/a0a1289f91f53b2c12e4e0b45ffe8291540ba895_0.file.cover_photo.tpl.php:123 +msgid "Cover Photo" +msgstr "Photo de couverture" + #: ../../view/theme/redbasic_c/php/config.php:16 #: ../../view/theme/redbasic_c/php/config.php:19 #: ../../view/theme/redbasic/php/config.php:16 @@ -10206,39 +10220,39 @@ msgstr "Déclarer un amour éternel pour" msgid "declared undying love for" msgstr "A déclaré l'amour éternel pour" -#: ../../addon/diaspora/diaspora.php:779 +#: ../../addon/diaspora/diaspora.php:781 msgid "Diaspora Protocol Settings updated." msgstr "Paramètres du protocole Diaspora mis à jour." -#: ../../addon/diaspora/diaspora.php:798 +#: ../../addon/diaspora/diaspora.php:800 msgid "" "The Diaspora protocol does not support location independence. Connections " "you make within that network may be unreachable from alternate channel " "locations." msgstr "Le protocole Diaspora ne gère pas les canaux localisés sur plusieurs serveurs. Vos contacts sur ce réseau peuvent donc être injoignables à partir des autres emplacements (clones) de ce canal." -#: ../../addon/diaspora/diaspora.php:801 +#: ../../addon/diaspora/diaspora.php:803 msgid "Enable the Diaspora protocol for this channel" msgstr "Activer le protocole Diaspora pour ce canal" -#: ../../addon/diaspora/diaspora.php:805 +#: ../../addon/diaspora/diaspora.php:807 msgid "Allow any Diaspora member to comment on your public posts" msgstr "Permettre à tous les membres de Diaspora de commenter vos publications publiques" -#: ../../addon/diaspora/diaspora.php:809 +#: ../../addon/diaspora/diaspora.php:811 msgid "Prevent your hashtags from being redirected to other sites" msgstr "Empêcher la redirection de vos mots-clés (hashtags) vers d'autres sites" -#: ../../addon/diaspora/diaspora.php:813 +#: ../../addon/diaspora/diaspora.php:815 msgid "" "Sign and forward posts and comments with no existing Diaspora signature" msgstr "Signer et faire suivre les publications et commentaires n'ayant aucune signature Diaspora" -#: ../../addon/diaspora/diaspora.php:818 +#: ../../addon/diaspora/diaspora.php:820 msgid "Followed hashtags (comma separated, do not include the #)" msgstr "Mots-clés suivis (séparer par une virgule, ne pas mettre le #)" -#: ../../addon/diaspora/diaspora.php:823 +#: ../../addon/diaspora/diaspora.php:825 msgid "Diaspora Protocol Settings" msgstr "Paramètres du protocole Diaspora" @@ -10481,6 +10495,32 @@ msgstr "Inclure un marqueur sur la carte." msgid "text to include in all outgoing posts from this site" msgstr "Texte à inclure dans tous les messages sortants de ce site" +#: ../../addon/fuzzloc/fuzzloc.php:148 +msgid "Fuzzloc Settings updated." +msgstr "Paramètres Fuzzloc mis à jour." + +#: ../../addon/fuzzloc/fuzzloc.php:175 +msgid "" +"Fuzzloc allows you to blur your precise location if your channel uses " +"browser location mapping." +msgstr "Fuzzloc vous permet de brouiller votre position précise si votre canal utilise la cartographie de position du navigateur." + +#: ../../addon/fuzzloc/fuzzloc.php:178 +msgid "Enable Fuzzloc Plugin" +msgstr "Activer le greffon Fuzzloc" + +#: ../../addon/fuzzloc/fuzzloc.php:182 +msgid "Minimum offset in meters" +msgstr "Décalage minimum en mètres" + +#: ../../addon/fuzzloc/fuzzloc.php:186 +msgid "Maximum offset in meters" +msgstr "Décalage maximum en mètres" + +#: ../../addon/fuzzloc/fuzzloc.php:191 +msgid "Fuzzloc Settings" +msgstr "Paramètres de Fuzzloc" + #: ../../addon/rtof/rtof.php:45 msgid "Post to Friendica" msgstr "Publier sur Friendica" @@ -10683,35 +10723,35 @@ msgstr "Identifiant de connexion Friendica" msgid "Friendica Login Password" msgstr "Mot de passe de connexion Friendica" -#: ../../addon/pubcrawl/as.php:1129 ../../addon/pubcrawl/as.php:1256 -#: ../../addon/pubcrawl/as.php:1432 ../../include/network.php:1775 +#: ../../addon/pubcrawl/as.php:1146 ../../addon/pubcrawl/as.php:1273 +#: ../../addon/pubcrawl/as.php:1449 ../../include/network.php:1769 msgid "ActivityPub" msgstr "ActivityPub" -#: ../../addon/pubcrawl/pubcrawl.php:1050 +#: ../../addon/pubcrawl/pubcrawl.php:1053 msgid "ActivityPub Protocol Settings updated." msgstr "Paramètres du protocole ActivityPub Protocol mise à jour." -#: ../../addon/pubcrawl/pubcrawl.php:1059 +#: ../../addon/pubcrawl/pubcrawl.php:1062 msgid "" "The ActivityPub protocol does not support location independence. Connections" " you make within that network may be unreachable from alternate channel " "locations." msgstr "Le protocole ActivityPub ne prend pas en charge l'indépendance de localisation. Les connexions que vous établissez au sein de ce réseau peuvent être inaccessibles à partir d'autres emplacements de canaux." -#: ../../addon/pubcrawl/pubcrawl.php:1062 +#: ../../addon/pubcrawl/pubcrawl.php:1065 msgid "Enable the ActivityPub protocol for this channel" msgstr "Activer le protocole ActivityPub pour ce canal." -#: ../../addon/pubcrawl/pubcrawl.php:1065 +#: ../../addon/pubcrawl/pubcrawl.php:1068 msgid "Send multi-media HTML articles" msgstr "Envoyer des articles HTML multimédia" -#: ../../addon/pubcrawl/pubcrawl.php:1065 +#: ../../addon/pubcrawl/pubcrawl.php:1068 msgid "Not supported by some microblog services such as Mastodon" msgstr "Non pris en charge par certains services de microblog tels que Mastodon." -#: ../../addon/pubcrawl/pubcrawl.php:1069 +#: ../../addon/pubcrawl/pubcrawl.php:1072 msgid "ActivityPub Protocol Settings" msgstr "Paramètres du protocole ActivityPub " @@ -12272,7 +12312,7 @@ msgid "Profile Details" msgstr "Détails du profil" #: ../../include/conversation.php:1837 ../../include/nav.php:404 -#: ../../include/photos.php:662 +#: ../../include/photos.php:666 msgid "Photo Albums" msgstr "Albums photo" @@ -12673,71 +12713,71 @@ msgstr "activité" msgid "a-z, 0-9, -, and _ only" msgstr "a-z, 0-9, -, -, et _ seulement" -#: ../../include/text.php:2402 +#: ../../include/text.php:2419 msgid "Design Tools" msgstr "Outils de conception" -#: ../../include/text.php:2408 +#: ../../include/text.php:2425 msgid "Pages" msgstr "Pages" -#: ../../include/text.php:2430 +#: ../../include/text.php:2447 msgid "Import website..." msgstr "Importer le site web…" -#: ../../include/text.php:2431 +#: ../../include/text.php:2448 msgid "Select folder to import" msgstr "Sélectionner le dossier à importer" -#: ../../include/text.php:2432 +#: ../../include/text.php:2449 msgid "Import from a zipped folder:" msgstr "Importer à partir d'un dossier zippé :" -#: ../../include/text.php:2433 +#: ../../include/text.php:2450 msgid "Import from cloud files:" msgstr "Importer à partir de fichiers dans le cloud :" -#: ../../include/text.php:2434 +#: ../../include/text.php:2451 msgid "/cloud/channel/path/to/folder" msgstr "/cloud/channel/chemain/du/repertoire" -#: ../../include/text.php:2435 +#: ../../include/text.php:2452 msgid "Enter path to website files" msgstr "Entrer le chemin vers les fichiers du site web" -#: ../../include/text.php:2436 +#: ../../include/text.php:2453 msgid "Select folder" msgstr "Sélectionner un répertoire" -#: ../../include/text.php:2437 +#: ../../include/text.php:2454 msgid "Export website..." msgstr "Exporter le site web…" -#: ../../include/text.php:2438 +#: ../../include/text.php:2455 msgid "Export to a zip file" msgstr "Exporter dans un fichier zip" -#: ../../include/text.php:2439 +#: ../../include/text.php:2456 msgid "website.zip" msgstr "website.zip" -#: ../../include/text.php:2440 +#: ../../include/text.php:2457 msgid "Enter a name for the zip file." msgstr "Entrer un nom pour le fichier zip." -#: ../../include/text.php:2441 +#: ../../include/text.php:2458 msgid "Export to cloud files" msgstr "Exporter dans des fichiers sur le cloud" -#: ../../include/text.php:2442 +#: ../../include/text.php:2459 msgid "/path/to/export/folder" msgstr "/chemin/vers/le/dossier/d'export" -#: ../../include/text.php:2443 +#: ../../include/text.php:2460 msgid "Enter a path to a cloud files destination." msgstr "Entrer le chemin vers le cloud de fichiers" -#: ../../include/text.php:2444 +#: ../../include/text.php:2461 msgid "Specify folder" msgstr "Spécifier un répertoire" @@ -12758,7 +12798,7 @@ msgstr "Saisir nom ou centre d'intérêt" #: ../../include/contact_widgets.php:21 msgid "Connect/Follow" -msgstr "Ajouter/Suivre" +msgstr "Lier et suivre" #: ../../include/contact_widgets.php:22 msgid "Examples: Robert Morgenstein, Fishing" @@ -13174,7 +13214,7 @@ msgstr "l'écriture dans la base de données a échoué." msgid "Empty path" msgstr "Chemin vide" -#: ../../include/security.php:532 +#: ../../include/security.php:541 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." @@ -13454,43 +13494,43 @@ msgstr "Travail, Fax" msgid "view full size" msgstr "voir en taille réelle" -#: ../../include/network.php:1770 ../../include/network.php:1771 +#: ../../include/network.php:1764 ../../include/network.php:1765 msgid "Friendica" msgstr "Friendica" -#: ../../include/network.php:1772 +#: ../../include/network.php:1766 msgid "OStatus" msgstr "OStatus" -#: ../../include/network.php:1773 +#: ../../include/network.php:1767 msgid "GNU-Social" msgstr "GNU-Social" -#: ../../include/network.php:1774 +#: ../../include/network.php:1768 msgid "RSS/Atom" msgstr "RSS/Atom" -#: ../../include/network.php:1777 +#: ../../include/network.php:1771 msgid "Diaspora" msgstr "Diaspora" -#: ../../include/network.php:1778 +#: ../../include/network.php:1772 msgid "Facebook" msgstr "Facebook" -#: ../../include/network.php:1779 +#: ../../include/network.php:1773 msgid "Zot" msgstr "Zot" -#: ../../include/network.php:1780 +#: ../../include/network.php:1774 msgid "LinkedIn" msgstr "Linkedin" -#: ../../include/network.php:1781 +#: ../../include/network.php:1775 msgid "XMPP/IM" msgstr "XMPP/IM" -#: ../../include/network.php:1782 +#: ../../include/network.php:1776 msgid "MySpace" msgstr "MySpace" @@ -13649,7 +13689,7 @@ msgstr "Notes privées" #: ../../include/features.php:115 msgid "Enables a tool to store notes and reminders (note: not encrypted)" -msgstr "Active un outil pour stocker des notes et des rappels (note :non chiffré)" +msgstr "Active un outil pour stocker des notes et des rappels (note:non chiffré)" #: ../../include/features.php:124 msgid "Create personal planning cards" @@ -13733,11 +13773,11 @@ msgstr "Contrôle d'accès et autorisations" #: ../../include/features.php:221 ../../include/group.php:328 msgid "Privacy Groups" -msgstr "Groupes de contacts" +msgstr "Groupes confidentiels" #: ../../include/features.php:222 msgid "Enable management and selection of privacy groups" -msgstr "Active la gestion et la sélection des groupes de contacts" +msgstr "Active la gestion et la sélection des groupes confidentiels" #: ../../include/features.php:230 msgid "Multiple Profiles" @@ -13962,31 +14002,35 @@ msgstr "Nuage de tags" msgid "Provide a personal tag cloud on your channel page" msgstr "Afficher un nuage de vos tags sur votre canal" -#: ../../include/taxonomy.php:491 +#: ../../include/taxonomy.php:320 +msgid "Trending" +msgstr "Tendance" + +#: ../../include/taxonomy.php:552 msgid "Keywords" msgstr "Mots-clefs" -#: ../../include/taxonomy.php:512 +#: ../../include/taxonomy.php:573 msgid "have" msgstr "ont" -#: ../../include/taxonomy.php:512 +#: ../../include/taxonomy.php:573 msgid "has" msgstr "a" -#: ../../include/taxonomy.php:513 +#: ../../include/taxonomy.php:574 msgid "want" msgstr "veulent" -#: ../../include/taxonomy.php:513 +#: ../../include/taxonomy.php:574 msgid "wants" msgstr "veut" -#: ../../include/taxonomy.php:514 +#: ../../include/taxonomy.php:575 msgid "likes" msgstr "aime" -#: ../../include/taxonomy.php:515 +#: ../../include/taxonomy.php:576 msgid "dislikes" msgstr "n'aime pas" @@ -14188,16 +14232,16 @@ msgid "Help and documentation" msgstr "Aide et documentation" #: ../../include/nav.php:179 -msgid "Search site @name, #tag, ?docs, content" -msgstr "Recherche @nom, #tag, contenu" +msgid "Search site @name, !forum, #tag, ?docs, content" +msgstr "Rechercher un site @nom, !forum, #etiquette, ?document, contenu" #: ../../include/nav.php:199 msgid "Site Setup and Configuration" msgstr "Configuration du site" #: ../../include/nav.php:290 -msgid "@name, #tag, ?doc, content" -msgstr "@nom, #étiquette, ?doc, contenu" +msgid "@name, !forum, #tag, ?doc, content" +msgstr "@nom, !forum, #etiquette, ?document, contenu" #: ../../include/nav.php:291 msgid "Please wait..." @@ -14224,21 +14268,21 @@ msgstr "L'image dépasse la taille limite de %lu octets" msgid "Image file is empty." msgstr "L'image est vide." -#: ../../include/photos.php:322 +#: ../../include/photos.php:326 msgid "Photo storage failed." msgstr "Le stockage de l'image a échoué." -#: ../../include/photos.php:371 +#: ../../include/photos.php:375 msgid "a new photo" msgstr "une nouvelle photo" -#: ../../include/photos.php:375 +#: ../../include/photos.php:379 #, php-format msgctxt "photo_upload" msgid "%1$s posted %2$s to %3$s" msgstr "%1$s a publié %2$s pour %3$s" -#: ../../include/photos.php:667 +#: ../../include/photos.php:671 msgid "Upload New Photos" msgstr "Ajouter des photos" @@ -14255,7 +14299,7 @@ msgstr "Impossible de vérifier la signature du canal" msgid "Unable to verify site signature for %s" msgstr "Impossible de vérifier la signature de site pour %s" -#: ../../include/zot.php:4206 +#: ../../include/zot.php:4219 msgid "invalid target signature" msgstr "signature de la cible invalide" diff --git a/view/fr/hstrings.php b/view/fr/hstrings.php index 6941f6321..cdf233584 100644 --- a/view/fr/hstrings.php +++ b/view/fr/hstrings.php @@ -24,7 +24,7 @@ App::$strings["Can chat with me"] = "Peut discuter avec moi"; App::$strings["Can source my public posts in derived channels"] = "Peut rediriger mes publications publiques vers des canaux dérivés"; App::$strings["Can administer my channel"] = "Peut administrer mon canal"; App::$strings["Social Networking"] = "Réseau social"; -App::$strings["Social - Party"] = "Social - Fête"; +App::$strings["Social - Federation"] = "Sociale - Fédération"; App::$strings["Social - Mostly Public"] = "Social - principalement public"; App::$strings["Social - Restricted"] = "Social - restreint"; App::$strings["Social - Private"] = "Social - privé"; @@ -281,7 +281,8 @@ App::$strings["Channel role and privacy"] = "Rôle et confidentialité du canal" App::$strings["Select a channel role with your privacy requirements."] = "Sélectionner un rôle de canal adapté à vos besoins de confidentialité."; App::$strings["Read more about roles"] = "En savoir plus sur les rôles"; App::$strings["Create Channel"] = "Créer le 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 est votre identité sur ce réseau. Il peut représenter une personne, un blog, ou un forum par exemple. Les canaux peuvent entrer en contact les uns avec les autres pour partager des informations avec des droits d'accès très fins."; +App::$strings["A channel is a unique network identity. It can represent a person (social network profile), a forum (group), a business or celebrity page, a newsfeed, and many other things. Channels can make connections with other channels to share information with each other."] = "Un canal est une identité réseau unique. Il peut représenter une personne (profil de réseau social), un forum (groupe), une page commerciale ou de célébrités, un flux d'informations et bien d'autres choses. Les canaux peuvent établir des connexions avec d'autres canaux pour partager l'information entre eux."; +App::$strings["The type of channel you create affects the basic privacy settings, the permissions that are granted to connections/friends, and also the channel's visibility across the network."] = "Le type de canal que vous créez affecte les paramètres de confidentialité de base, les permissions accordées aux connexions/amis, ainsi que la visibilité du canal sur le réseau."; App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "ou <a href=\"import\">importer un canal existant</a> d'un autre serveur."; App::$strings["Validate"] = "Valider"; App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "Il est impossible de supprimer un canal moins de 48 heures après avoir changé le mot de passe d'un compte."; @@ -597,7 +598,7 @@ App::$strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] App::$strings["Delivery interval"] = "Intervalle de distribution"; App::$strings["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."] = "Temporise le processus de distribution de tant de secondes pour réduire la charge sur le système. Valeurs recommandées : 4-5 pour les serveurs mutualisés, 2-3 pour les VPS. 0-1 pour les gros serveurs dédiés."; App::$strings["Deliveries per process"] = "Distributions par processus"; -App::$strings["Number of deliveries to attempt in a single operating system process. Adjust if necessary to tune system performance. Recommend: 1-5."] = "Nombre de distributions à tenter au sein d'un seul processus système. Ajuster si nécessaire pour affiner la performance du système. Recommandé :1-5."; +App::$strings["Number of deliveries to attempt in a single operating system process. Adjust if necessary to tune system performance. Recommend: 1-5."] = "Nombre de distributions à tenter au sein d'un seul processus système. Ajuster si nécessaire pour affiner la performance du système. Recommandé:1-5."; App::$strings["Queue Threshold"] = "Seuil de file d'attente"; App::$strings["Always defer immediate delivery if queue contains more than this number of entries."] = "Reportez toujours la livraison immédiate si la file d'attente contient plus que ce nombre d'entrées."; App::$strings["Poll interval"] = "Intervalle de scrutation"; @@ -608,7 +609,7 @@ App::$strings["Allow SVG thumbnails in file browser"] = "Autoriser les vignettes App::$strings["WARNING: SVG images may contain malicious code."] = "ATTENTION : les images SVG peuvent contenir du code malveillant."; App::$strings["Maximum Load Average"] = "Charge maximale moyenne"; App::$strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Charge système maximale au-delà de laquelle distribution et scrutation sont reportées - par défaut 50."; -App::$strings["Expiration period in days for imported (grid/network) content"] = "Délai d'expiration pour le contenu importé (réseau)"; +App::$strings["Expiration period in days for imported (grid/network) content"] = "Délai d'expiration en jours pour le contenu importé (grille/réseau)"; App::$strings["0 for no expiration of imported content"] = "0 pour ne pas expirer le contenu importé"; App::$strings["Do not expire any posts which have comments less than this many days ago"] = "Ne pas considérer comme expirés les messages qui ont reçu des commentaires depuis moins de ce nombre de jours"; App::$strings["Public servers: Optional landing (marketing) webpage for new registrants"] = "Serveurs publics : page Web facultative d'atterrissage (marketing) pour les nouveaux inscrits."; @@ -672,6 +673,7 @@ App::$strings["Visible to:"] = "Visible par :"; App::$strings["__ctx:acl__ Profile"] = "Profil"; App::$strings["Comment approved"] = "Commentaire validé"; App::$strings["Comment deleted"] = "Commentaire supprimé"; +App::$strings["Permission Name is required."] = "Le nom de permission est requis."; App::$strings["Permission category saved."] = "Profil d'accès enregistré."; App::$strings["Use this form to create permission rules for various classes of people or connections."] = "Utilisez ce formulaire pour créer des règles d'accès pour différentes catégories de personnes ou de contacts."; App::$strings["Permission Categories"] = "Profils d'accès"; @@ -727,7 +729,6 @@ App::$strings["May reduce spam activity"] = "Contribue à réduire l'impact des App::$strings["Default Privacy Group"] = "Groupe de contacts par défaut :"; App::$strings["Use my default audience setting for the type of object published"] = "Utiliser mon paramètre de publication par défaut pour le type d'objet publié"; App::$strings["Profile to assign new connections"] = "Profil pour assigner de nouvelles connexions"; -App::$strings["Channel permissions category:"] = "Profils d'accès du canal :"; App::$strings["Default Permissions Group"] = "Groupe d'accès par défaut"; App::$strings["Maximum private messages per day from unknown people:"] = "Nombre maximum de messages privés émanant d'inconnus, par jour :"; App::$strings["Useful to reduce spamming"] = "Utile pour réduire les indésirables"; @@ -1020,7 +1021,7 @@ App::$strings["__ctx:noun__ Dislike"] = array( 0 => "N'aime pas", 1 => "N'aime pas", ); -App::$strings["Photo Tools"] = "Ouitls pour photos"; +App::$strings["Photo Tools"] = "Outils pour photos"; App::$strings["In This Photo:"] = "Dans cette photo :"; App::$strings["Map"] = "Carte"; App::$strings["__ctx:noun__ Likes"] = "Aime"; @@ -1265,7 +1266,7 @@ App::$strings["comment"] = "commentaire"; App::$strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s a étiqueté le %3\$s de %2\$s avec %4\$s"; App::$strings["This setting requires special processing and editing has been blocked."] = "Ce paramètre nécessité un traitement spécial, les modifications ont été bloquées."; App::$strings["Configuration Editor"] = "Editeur de configuration"; -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."] = "Attention :modifier certains paramètres peut rendre votre canal inutilisable. Merci d'ignorer cette page à moins d'être suffisamment à l'aise de savoir comment utiliser correctement cette fonctionnalité."; +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."] = "Attention:modifier certains paramètres peut rendre votre canal inutilisable. Merci d'ignorer cette page à moins d'être suffisamment à l'aise de savoir comment utiliser correctement cette fonctionnalité."; App::$strings["If enabled, connection requests will be approved without your interaction"] = "Si cette option est activée, les demandes de connexion seront approuvées sans votre intervention."; App::$strings["Automatic approval settings"] = "Paramètres d'approbation automatique"; App::$strings["Some individual permissions may have been preset or locked based on your channel type and privacy settings."] = "Certaines permissions individuelles peuvent avoir été prédéfinies ou verrouillées en fonction de votre type de canal et de vos paramètres de confidentialité."; @@ -1333,7 +1334,7 @@ App::$strings["Locality/City"] = "Ville"; App::$strings["Region/State"] = "Région"; App::$strings["Postal/Zip code"] = "Code postal"; App::$strings["Who (if applicable)"] = "Qui (si applicable)"; -App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Exemples : marie123, Marie Deschamps, marie@exemple.com"; +App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Exemples : marie123, Marie Deschamps, marie@exemple.com"; App::$strings["Since (date)"] = "Depuis (date)"; App::$strings["Tell us about yourself"] = "Parlez nous de vous..."; App::$strings["Homepage URL"] = "URL de mon site Internet :"; @@ -1484,7 +1485,7 @@ App::$strings["Location:"] = "Emplacement :"; App::$strings["Description:"] = "Description :"; App::$strings["Hometown:"] = "Ville natale :"; App::$strings["About:"] = "À propos :"; -App::$strings["Connect"] = "Ajouter/Suivre"; +App::$strings["Connect"] = "Lier"; App::$strings["Public Forum:"] = "Forum public :"; App::$strings["Keywords: "] = "Mots-clefs :"; App::$strings["Don't suggest"] = "Ne pas suggérer"; @@ -2001,6 +2002,7 @@ App::$strings["Website SSL certificate is not valid. Please correct."] = "Le cer App::$strings["[\$Projectname] Cron tasks not running on %s"] = "[\$Projectname] Tâches Cron inactives sur %s"; App::$strings["Cron/Scheduled tasks not running."] = "Les taches planifiées ne tournent pas."; App::$strings["never"] = "jamais"; +App::$strings["Cover Photo"] = "Photo de couverture"; App::$strings["Focus (Hubzilla default)"] = "Focus (par défaut pour Hubzilla)"; App::$strings["Theme settings"] = "Paramètres du thème"; App::$strings["Narrow navbar"] = "Barre de navigation fine"; @@ -2300,6 +2302,12 @@ App::$strings["The default zoom level. (1:world, 18:highest, also depends on til App::$strings["Include marker on map"] = "Inclure le marqueur sur la carte"; App::$strings["Include a marker on the map."] = "Inclure un marqueur sur la carte."; App::$strings["text to include in all outgoing posts from this site"] = "Texte à inclure dans tous les messages sortants de ce site"; +App::$strings["Fuzzloc Settings updated."] = "Paramètres Fuzzloc mis à jour."; +App::$strings["Fuzzloc allows you to blur your precise location if your channel uses browser location mapping."] = "Fuzzloc vous permet de brouiller votre position précise si votre canal utilise la cartographie de position du navigateur."; +App::$strings["Enable Fuzzloc Plugin"] = "Activer le greffon Fuzzloc"; +App::$strings["Minimum offset in meters"] = "Décalage minimum en mètres"; +App::$strings["Maximum offset in meters"] = "Décalage maximum en mètres"; +App::$strings["Fuzzloc Settings"] = "Paramètres de Fuzzloc"; App::$strings["Post to Friendica"] = "Publier sur Friendica"; App::$strings["rtof Settings saved."] = "Paramètres rtof sauvegardés."; App::$strings["Allow posting to Friendica"] = "Autoriser la publication sur Friendica"; @@ -2860,7 +2868,7 @@ App::$strings["%d invitation available"] = array( ); App::$strings["Find Channels"] = "Trouver des canaux"; App::$strings["Enter name or interest"] = "Saisir nom ou centre d'intérêt"; -App::$strings["Connect/Follow"] = "Ajouter/Suivre"; +App::$strings["Connect/Follow"] = "Lier et suivre"; App::$strings["Examples: Robert Morgenstein, Fishing"] = "Exemples: Guillaume Martin, Course à pieds"; App::$strings["Random Profile"] = "Un profil au hasard"; App::$strings["Invite Friends"] = "Inviter des amis"; @@ -3071,7 +3079,7 @@ App::$strings["Web Pages"] = "Pages web"; App::$strings["Provide managed web pages on your channel"] = "Fournir des pages web, sous votre contrôle, sur votre canal"; App::$strings["Provide a wiki for your channel"] = "Fournir un wiki pour votre canal."; App::$strings["Private Notes"] = "Notes privées"; -App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Active un outil pour stocker des notes et des rappels (note :non chiffré)"; +App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Active un outil pour stocker des notes et des rappels (note:non chiffré)"; App::$strings["Create personal planning cards"] = "Créer des cartes de planification personnelle"; App::$strings["Create interactive articles"] = "Créer des articles interactifs"; App::$strings["Navigation Channel Select"] = "Sélection du canal par la navigation"; @@ -3091,8 +3099,8 @@ App::$strings["Allows creation of complex directory search queries"] = "Autorise App::$strings["Advanced Theme and Layout Settings"] = "Paramètres avancés du thème et de l'agencement."; App::$strings["Allows fine tuning of themes and page layouts"] = "Autoriser la personnalisation fine des thèmes et des agencements."; App::$strings["Access Control and Permissions"] = "Contrôle d'accès et autorisations"; -App::$strings["Privacy Groups"] = "Groupes de contacts"; -App::$strings["Enable management and selection of privacy groups"] = "Active la gestion et la sélection des groupes de contacts"; +App::$strings["Privacy Groups"] = "Groupes confidentiels"; +App::$strings["Enable management and selection of privacy groups"] = "Active la gestion et la sélection des groupes confidentiels"; App::$strings["Multiple Profiles"] = "Profils multiples"; App::$strings["Ability to create multiple profiles"] = "Possibilité de créer plusieurs profils"; App::$strings["Provide alternate connection permission roles."] = "Fournir des rôles d'accès différents pour ce contact."; @@ -3147,6 +3155,7 @@ App::$strings["Star Posts"] = "Pouvoir mettre en avant les publications"; App::$strings["Ability to mark special posts with a star indicator"] = "Pouvoir marquer certaines publications d'une étoile"; App::$strings["Tag Cloud"] = "Nuage de tags"; App::$strings["Provide a personal tag cloud on your channel page"] = "Afficher un nuage de vos tags sur votre canal"; +App::$strings["Trending"] = "Tendance"; App::$strings["Keywords"] = "Mots-clefs"; App::$strings["have"] = "ont"; App::$strings["has"] = "a"; @@ -3217,9 +3226,9 @@ App::$strings["Take me home"] = "Retourner sur mon serveur"; App::$strings["Log me out of this site"] = "Déconnectez-moi de ce site"; App::$strings["Create an account"] = "Créer un compte"; App::$strings["Help and documentation"] = "Aide et documentation"; -App::$strings["Search site @name, #tag, ?docs, content"] = "Recherche @nom, #tag, contenu"; +App::$strings["Search site @name, !forum, #tag, ?docs, content"] = "Rechercher un site @nom, !forum, #etiquette, ?document, contenu"; App::$strings["Site Setup and Configuration"] = "Configuration du site"; -App::$strings["@name, #tag, ?doc, content"] = "@nom, #étiquette, ?doc, contenu"; +App::$strings["@name, !forum, #tag, ?doc, content"] = "@nom, !forum, #etiquette, ?document, contenu"; App::$strings["Please wait..."] = "Merci de patienter..."; App::$strings["Add Apps"] = "Ajouter des applications"; App::$strings["Arrange Apps"] = "Réarranger les applications"; diff --git a/view/js/autocomplete.js b/view/js/autocomplete.js index be632a07e..54eb03e13 100644 --- a/view/js/autocomplete.js +++ b/view/js/autocomplete.js @@ -7,21 +7,6 @@ function contact_search(term, callback, backend_url, type, extra_channels, spine if(spinelement) { $(spinelement).show(); } - // Check if there is a cached result that contains the same information we would get with a full server-side search - var bt = backend_url+type; - if(!(bt in contact_search.cache)) contact_search.cache[bt] = {}; - - var lterm = term.toLowerCase(); // Ignore case - for(var t in contact_search.cache[bt]) { - if(lterm.indexOf(t) >= 0) { // A more broad search has been performed already, so use those results - $(spinelement).hide(); - // Filter old results locally - var matching = contact_search.cache[bt][t].filter(function (x) { return (x.name.toLowerCase().indexOf(lterm) >= 0 || (typeof x.nick !== 'undefined' && x.nick.toLowerCase().indexOf(lterm) >= 0)); }); // Need to check that nick exists because groups don't have one - matching.unshift({taggable:false, text: term, replace: term}); - setTimeout(function() { callback(matching); } , 1); // Use "pseudo-thread" to avoid some problems - return; - } - } var postdata = { start:0, @@ -38,12 +23,7 @@ function contact_search(term, callback, backend_url, type, extra_channels, spine url: backend_url, data: postdata, dataType: 'json', - success: function(data){ - // Cache results if we got them all (more information would not improve results) - // data.count represents the maximum number of items - if(data.items.length -1 < data.count) { - contact_search.cache[bt][lterm] = data.items; - } + success: function(data) { var items = data.items.slice(0); items.unshift({taggable:false, text: term, replace: term}); callback(items); @@ -60,7 +40,7 @@ function contact_format(item) { var desc = ((item.label) ? item.nick + ' ' + item.label : item.nick); if(typeof desc === 'undefined') desc = ''; if(desc) desc = ' ('+desc+')'; - return "<div class='{0} dropdown-item dropdown-notification clearfix' title='{4}'><img class='menu-img-2' src='{1}'><span class='contactname'>{2}</span><span class='dropdown-sub-text'>{3}</span></div>".format(item.taggable, item.photo, item.name, desc, typeof(item.link) !== 'undefined' ? item.link : desc.replace('(','').replace(')','')); + return "<div class='{0} dropdown-item dropdown-notification clearfix' title='{4}'><img class='menu-img-2' src='{1}'><span class='contactname'>{2}</span><span class='dropdown-sub-text'>{4}</span></div>".format(item.taggable, item.photo, item.name, desc, typeof(item.link) !== 'undefined' ? item.link : desc.replace('(','').replace(')','')); } else return "<div>" + item.text + "</div>"; @@ -84,13 +64,8 @@ function editor_replace(item) { } // $2 ensures that prefix (@,@!) is preserved - var id = item.id; - // 16 chars of hash should be enough. Full hash could be used if it can be done in a visually appealing way. - // 16 chars is also the minimum length in the backend (otherwise it's interpreted as a local id). - if(id.length > 16) - id = item.id.substring(0,16); - return '$1$2' + item.nick.replace(' ', '') + '+' + id + ' '; + return '$1$2{' + item.link + '} '; } function basic_replace(item) { @@ -107,11 +82,6 @@ function trim_replace(item) { return '$1'+item.name; } - -function submit_form(e) { - $(e).parents('form').submit(); -} - function getWord(text, caretPos) { var index = text.indexOf(caretPos); var postText = text.substring(caretPos, caretPos+13); @@ -185,12 +155,17 @@ function string2bb(element) { */ (function( $ ) { $.fn.editor_autocomplete = function(backend_url, extra_channels) { + + if(! this.length) + return; + if (typeof extra_channels === 'undefined') extra_channels = false; // Autocomplete contacts contacts = { - match: /(^|\s)(@\!*)([^ \n]+)$/, + match: /(^|\s)(@\!*)([^ \n]{2,})$/, index: 3, + cache: true, search: function(term, callback) { contact_search(term, callback, backend_url, 'c', extra_channels, spinelement=false); }, replace: editor_replace, template: contact_format @@ -198,8 +173,9 @@ function string2bb(element) { // Autocomplete forums forums = { - match: /(^|\s)(\!\!*)([^ \n]+)$/, + match: /(^|\s)(\!\!*)([^ \n]{2,})$/, index: 3, + cache: true, search: function(term, callback) { contact_search(term, callback, backend_url, 'f', extra_channels, spinelement=false); }, replace: editor_replace, template: contact_format @@ -210,6 +186,7 @@ function string2bb(element) { tags = { match: /(^|\s)(\#)([^ \n]{2,})$/, index: 3, + cache: true, search: function(term, callback) { $.getJSON('/hashtags/' + '$f=&t=' + term).done(function(data) { callback($.map(data, function(entry) { return entry.text.toLowerCase().indexOf(term.toLowerCase()) === 0 ? entry : null; })); }); }, replace: function(item) { return "$1$2" + item.text + ' '; }, context: function(text) { return text.toLowerCase(); }, @@ -220,13 +197,23 @@ function string2bb(element) { smilies = { match: /(^|\s)(:[a-z_:]{2,})$/, index: 2, + cache: true, search: function(term, callback) { $.getJSON('/smilies/json').done(function(data) { callback($.map(data, function(entry) { return entry.text.indexOf(term) === 0 ? entry : null; })); }); }, //template: function(item) { return item.icon + item.text; }, replace: function(item) { return "$1" + item.text + ' '; }, template: smiley_format }; this.attr('autocomplete','off'); - this.textcomplete([contacts,forums,smilies,tags], {className:'acpopup', zIndex:1020}); + + var Textarea = Textcomplete.editors.Textarea; + + $(this).each(function() { + var editor = new Textarea(this); + var textcomplete = new Textcomplete(editor); + textcomplete.register([contacts,forums,smilies,tags], {className:'acpopup', zIndex:1020}); + }); + + }; })( jQuery ); @@ -235,10 +222,15 @@ function string2bb(element) { */ (function( $ ) { $.fn.search_autocomplete = function(backend_url) { + + if(! this.length) + return; + // Autocomplete contacts contacts = { - match: /(^@)([^\n]{3,})$/, + match: /(^@)([^\n]{2,})$/, index: 2, + cache: true, search: function(term, callback) { contact_search(term, callback, backend_url, 'x', [], spinelement='#nav-search-spinner'); }, replace: basic_replace, template: contact_format, @@ -246,8 +238,9 @@ function string2bb(element) { // Autocomplete forums forums = { - match: /(^\!)([^\n]{3,})$/, + match: /(^\!)([^\n]{2,})$/, index: 2, + cache: true, search: function(term, callback) { contact_search(term, callback, backend_url, 'f', [], spinelement='#nav-search-spinner'); }, replace: basic_replace, template: contact_format @@ -255,8 +248,9 @@ function string2bb(element) { // Autocomplete hashtags tags = { - match: /(^\#)([^ \n]{3,})$/, + match: /(^\#)([^ \n]{2,})$/, index: 2, + cache: true, search: function(term, callback) { $.getJSON('/hashtags/' + '$f=&t=' + term).done(function(data) { callback($.map(data, function(entry) { return entry.text.toLowerCase().indexOf(term.toLowerCase()) === 0 ? entry : null; })); }); }, replace: function(item) { return "$1" + item.text + ' '; }, context: function(text) { return text.toLowerCase(); }, @@ -264,65 +258,105 @@ function string2bb(element) { }; this.attr('autocomplete', 'off'); - var a = this.textcomplete([contacts,forums,tags], {className:'acpopup', maxCount:100, zIndex: 1020, appendTo:'nav'}); - a.on('textComplete:select', function(e, value, strategy) { submit_form(this); }); + + var textcomplete; + var Textarea = Textcomplete.editors.Textarea; + + $(this).each(function() { + var editor = new Textarea(this); + textcomplete = new Textcomplete(editor); + textcomplete.register([contacts,forums,tags], {className:'acpopup', maxCount:100, zIndex: 1020, appendTo:'nav'}); + }); + + textcomplete.on('selected', function() { this.editor.el.form.submit(); }); + }; })( jQuery ); (function( $ ) { $.fn.contact_autocomplete = function(backend_url, typ, autosubmit, onselect) { + + if(! this.length) + return; + if(typeof typ === 'undefined') typ = ''; if(typeof autosubmit === 'undefined') autosubmit = false; // Autocomplete contacts contacts = { - match: /(^)([^\n]+)$/, + match: /(^)([^\n]{2,})$/, index: 2, + cache: true, search: function(term, callback) { contact_search(term, callback, backend_url, typ,[], spinelement=false); }, replace: basic_replace, template: contact_format, }; this.attr('autocomplete','off'); - var a = this.textcomplete([contacts], {className:'acpopup', zIndex:1020}); + + var textcomplete; + var Textarea = Textcomplete.editors.Textarea; + + $(this).each(function() { + var editor = new Textarea(this); + textcomplete = new Textcomplete(editor); + textcomplete.register([contacts], {className:'acpopup', zIndex:1020}); + }); if(autosubmit) - a.on('textComplete:select', function(e,value,strategy) { submit_form(this); }); + textcomplete.on('selected', function() { this.editor.el.form.submit(); }); if(typeof onselect !== 'undefined') - a.on('textComplete:select', function(e, value, strategy) { onselect(value); }); + textcomplete.on('select', function() { var item = this.dropdown.getActiveItem(); onselect(item.searchResult.data); }); }; })( jQuery ); (function( $ ) { $.fn.name_autocomplete = function(backend_url, typ, autosubmit, onselect) { + + if(! this.length) + return; + if(typeof typ === 'undefined') typ = ''; if(typeof autosubmit === 'undefined') autosubmit = false; // Autocomplete contacts names = { - match: /(^)([^\n]+)$/, + match: /(^)([^\n]{2,})$/, index: 2, + cache: true, search: function(term, callback) { contact_search(term, callback, backend_url, typ,[], spinelement=false); }, replace: trim_replace, template: contact_format, }; this.attr('autocomplete','off'); - var a = this.textcomplete([names], {className:'acpopup', zIndex:1020}); + + var textcomplete; + var Textarea = Textcomplete.editors.Textarea; + + $(this).each(function() { + var editor = new Textarea(this); + textcomplete = new Textcomplete(editor); + textcomplete.register([names], {className:'acpopup', zIndex:1020}); + }); if(autosubmit) - a.on('textComplete:select', function(e,value,strategy) { submit_form(this); }); + textcomplete.on('selected', function() { this.editor.el.form.submit(); }); if(typeof onselect !== 'undefined') - a.on('textComplete:select', function(e, value, strategy) { onselect(value); }); + textcomplete.on('select', function() { var item = this.dropdown.getActiveItem(); onselect(item.searchResult.data); }); + }; })( jQuery ); (function( $ ) { $.fn.bbco_autocomplete = function(type) { + if(! this.length) + return; + 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', 'observer.language','embed', 'highlight', 'url', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6']; var open_elements = ['observer.baseurl', 'observer.address', 'observer.photo', 'observer.name', 'observer.webname', 'observer.url', '*', 'hr', ]; @@ -380,11 +414,16 @@ function string2bb(element) { }; this.attr('autocomplete','off'); - var a = this.textcomplete([bbco], {className:'acpopup', zIndex:1020}); - a.on('textComplete:select', function(e, value, strategy) { value; }); + var Textarea = Textcomplete.editors.Textarea; + + $(this).each(function() { + var editor = new Textarea(this); + var textcomplete = new Textcomplete(editor); + textcomplete.register([bbco], {className:'acpopup', zIndex:1020}); + }); - a.keypress(function(e){ + this.keypress(function(e){ if (e.keyCode == 13) { var x = listNewLineAutocomplete(this.id); if(x) { diff --git a/view/js/main.js b/view/js/main.js index acb9b462f..17f94dd16 100644 --- a/view/js/main.js +++ b/view/js/main.js @@ -62,6 +62,9 @@ $(document).ready(function() { numbers : aStr['t17'], }; + //mod_mail only + $(".mail-conv-detail .autotime").timeago(); + savedTitle = document.title; updateInit(); @@ -420,6 +423,14 @@ function notificationsUpdate(cached_data) { // Put the object into storage sessionStorage.setItem('notifications_cache', JSON.stringify(data)); + var fnotifs = []; + if(data.forums) { + $.each(data.forums_sub, function() { + fnotifs.push(this); + }); + handleNotificationsItems('forums', fnotifs); + } + if(data.invalid == 1) { window.location.href=window.location.href; } @@ -451,7 +462,7 @@ function notificationsUpdate(cached_data) { } function handleNotifications(data) { - if(data.network || data.home || data.intros || data.register || data.mail || data.all_events || data.notify || data.files || data.pubs) { + if(data.network || data.home || data.intros || data.register || data.mail || data.all_events || data.notify || data.files || data.pubs || data.forums) { $('.notifications-btn').css('opacity', 1); $('#no_notifications').hide(); } @@ -495,13 +506,13 @@ function handleNotifications(data) { } function handleNotificationsItems(notifyType, data) { - var notifications_tpl= unescape($("#nav-notifications-template[rel=template]").html()); + var notifications_tpl = ((notifyType == 'forums') ? unescape($("#nav-notifications-forums-template[rel=template]").html()) : unescape($("#nav-notifications-template[rel=template]").html())); var notify_menu = $("#nav-" + notifyType + "-menu"); notify_menu.html(''); $(data).each(function() { - html = notifications_tpl.format(this.notify_link,this.photo,this.name,this.message,this.when,this.hclass,this.b64mid,this.notify_id,this.thread_top); + html = notifications_tpl.format(this.notify_link,this.photo,this.name,this.message,this.when,this.hclass,this.b64mid,this.notify_id,this.thread_top,this.unseen,this.private_forum); notify_menu.append(html); }); @@ -812,6 +823,15 @@ function updateInit() { if (initialLoad && (sessionStorage.getItem('notifications_cache') !== null)) { var cached_data = JSON.parse(sessionStorage.getItem('notifications_cache')); notificationsUpdate(cached_data); + + var fnotifs = []; + if(cached_data.forums) { + $.each(cached_data.forums_sub, function() { + fnotifs.push(this); + }); + handleNotificationsItems('forums', fnotifs); + } + } if(! src) { @@ -1022,6 +1042,7 @@ function loadNotificationItems(notifyType) { } console.log('updating ' + notifyType + ' notifications...'); + $.get(pingExCmd, function(data) { if(data.invalid == 1) { window.location.href=window.location.href; @@ -1057,7 +1078,9 @@ function doprofilelike(ident, verb) { $.get('like/' + ident + '?verb=' + verb, function() { window.location.href=window.location.href; }); } + function dropItem(url, object) { + var confirm = confirmDelete(); if(confirm) { $('body').css('cursor', 'wait'); diff --git a/view/js/mod_connections.js b/view/js/mod_connections.js index 68add4eed..db18e078d 100644 --- a/view/js/mod_connections.js +++ b/view/js/mod_connections.js @@ -3,14 +3,3 @@ $(document).ready(function() { $(".autotime").timeago(); }); -$("#contacts-search").keyup(function(event){ - if(event.keyCode == 13){ - $("#contacts-search").click(); - } -}); -$(".autocomplete-w1 .selected").keyup(function(event){ - if(event.keyCode == 13){ - $("#contacts-search").click(); - } -}); - diff --git a/view/js/mod_mail.js b/view/js/mod_mail.js index 15a45519b..917e5414c 100644 --- a/view/js/mod_mail.js +++ b/view/js/mod_mail.js @@ -2,7 +2,6 @@ $(document).ready(function() { $("#recip").name_autocomplete(baseurl + '/acl', 'm', false, function(data) { $("#recip-complete").val(data.xid); }); - $(".autotime").timeago() $('#prvmail-text').bbco_autocomplete('bbcode'); - $("#prvmail-text").editor_autocomplete(baseurl+"/acl"); + $("#prvmail-text").editor_autocomplete(baseurl+"/acl"); }); diff --git a/view/js/mod_new_channel.js b/view/js/mod_new_channel.js index e78de2596..10a94796c 100644 --- a/view/js/mod_new_channel.js +++ b/view/js/mod_new_channel.js @@ -1,43 +1,88 @@ $(document).ready(function() { - - $("#newchannel-submit-button").attr('disabled','disabled'); + $("#id_name").focus(); $("#id_name").blur(function() { - $("#name-spinner").show(); - var zreg_name = $("#id_name").val(); - $.get("new_channel/autofill.json?f=&name=" + encodeURIComponent(zreg_name),function(data) { - $("#id_nickname").val(data); - if(data.error) { - $("#help_name").html(""); - zFormError("#help_name",data.error); - } - else { - $("#newchannel-submit-button").removeAttr('disabled'); - } - $("#name-spinner").hide(); - }); + if(validate_name()) { + var zreg_name = $("#id_name").val(); + $("#name_help_loading").show(); + $("#name_help_text").hide(); + $.get("new_channel/autofill.json?f=&name=" + encodeURIComponent(zreg_name),function(data) { + $("#id_nickname").val(data); + $("#id_nickname").addClass('is-validated'); + $("#name_help_loading").hide(); + $("#name_help_text").show(); + }); + } }); - $("#id_nickname").click(function() { - $("#newchannel-submit-button").attr('disabled','disabled'); + $("#id_nickname").on('input', function() { + $("#id_nickname").removeClass('is-validated'); }); - }); + $("#newchannel-form").on('submit', function(event) { + if(! validate_name()) { + $("#id_name").focus() + return false; + } + + if(! validate_channel()) { + $("#id_nickname").focus() + return false; + } + + if(! $("#id_nickname").hasClass('is-validated')) { + event.preventDefault(); + } + }); + }); function validate_channel() { - $("#nick-spinner").show(); + if($("#id_nickname").hasClass('is-validated')) + return true; + + $("#nick_help_loading").show(); + $("#nick_help_text").hide(); + var zreg_name = $("#id_name").val(); var zreg_nick = $("#id_nickname").val(); - $.get("new_channel/checkaddr.json?f=&nick=" + encodeURIComponent(zreg_nick),function(data) { + $.get("new_channel/checkaddr.json?f=&nick=" + encodeURIComponent(zreg_nick) + '&name=' + encodeURIComponent(zreg_name),function(data) { $("#id_nickname").val(data); - if(data.error) { - $("#help_nickname").html(""); - zFormError("#help_nickname",data.error); + if(data !== zreg_nick) { + $("#id_nickname").addClass('is-validated'); + $("#help_nickname").addClass('text-danger').removeClass('text-muted'); + $("#help_nickname").html(aStr['nick_invld1'] + data + aStr['nick_invld2']); + $("#id_nickname").focus(); } else { - $("#newchannel-submit-button").removeAttr('disabled'); + $("#id_nickname").addClass('is-validated'); + $("#help_nickname").addClass('text-success').removeClass('text-muted').removeClass('text-danger'); + $("#help_nickname").html(aStr['nick_valid']); } - $("#nick-spinner").hide(); + $("#nick_help_loading").hide(); + $("#nick_help_text").show(); + }); + return true; + + } + + function validate_name() { + if($("#id_name").hasClass('is-validated')) + return true; + + var verbs = [ aStr['lovely'], aStr['wonderful'], aStr['fantastic'], aStr['great'] ]; + var verb = verbs[Math.floor((Math.random() * 4) + 0)]; + if(! $("#id_name").val()) { + $("#id_name").focus(); + $("#help_name").addClass('text-danger').removeClass('text-muted'); + $("#help_name").html(aStr['name_empty']); + return false; + } + else { + $("#help_name").addClass('text-success').removeClass('text-muted').removeClass('text-danger'); + $("#help_name").html(aStr['name_ok1'] + verb + aStr['name_ok2']); + $("#id_name").addClass('is-validated'); + return true; + } } diff --git a/view/nl/hmessages.po b/view/nl/hmessages.po index 5d22d74a5..c98121122 100644 --- a/view/nl/hmessages.po +++ b/view/nl/hmessages.po @@ -8378,7 +8378,7 @@ msgstr "Afleveringsrapport" msgid "%d comment" msgid_plural "%d comments" msgstr[0] "%d reactie" -msgstr[1] "%d reacties getoond" +msgstr[1] "%d reacties" #: ../../Zotlabs/Lib/ThreadItem.php:343 ../../Zotlabs/Lib/ThreadItem.php:344 #, php-format diff --git a/view/nl/hstrings.php b/view/nl/hstrings.php index 07ecb0602..3581950aa 100644 --- a/view/nl/hstrings.php +++ b/view/nl/hstrings.php @@ -1816,7 +1816,7 @@ App::$strings["share"] = "delen"; App::$strings["Delivery Report"] = "Afleveringsrapport"; App::$strings["%d comment"] = array( 0 => "%d reactie", - 1 => "%d reacties getoond", + 1 => "%d reacties", ); App::$strings["View %s's profile - %s"] = "Profiel van %s bekijken - %s"; App::$strings["to"] = "aan"; diff --git a/view/pdl/mod_apps.pdl b/view/pdl/mod_apps.pdl index 8bd407372..32e2ce560 100644 --- a/view/pdl/mod_apps.pdl +++ b/view/pdl/mod_apps.pdl @@ -1,4 +1,5 @@ [region=aside] +[widget=appstore][/widget] [widget=appcategories][/widget] [/region] [region=right_aside] diff --git a/view/pdl/mod_network.pdl b/view/pdl/mod_network.pdl index 09fdba573..a4bdf0a9f 100644 --- a/view/pdl/mod_network.pdl +++ b/view/pdl/mod_network.pdl @@ -1,9 +1,8 @@ [region=aside] -[widget=collections][/widget] -[widget=forums][/widget] -[widget=suggestions][/widget] +[widget=activity_order][/widget] +[widget=activity_filter][/widget] [widget=savedsearch][/widget] -[widget=filer][/widget] +[widget=suggestions][/widget] [widget=notes][/widget] [/region] diff --git a/view/php/full.php b/view/php/full.php index 094874766..1a9cd9a84 100644 --- a/view/php/full.php +++ b/view/php/full.php @@ -1,14 +1,15 @@ -<!DOCTYPE html> +<!DOCTYPE html > <html prefix="og: http://ogp.me/ns#"> <head> <title><?php if(x($page,'title')) echo $page['title'] ?></title> <script>var baseurl="<?php echo z_root() ?>";</script> <?php if(x($page,'htmlhead')) echo $page['htmlhead'] ?> </head> -<body> +<body <?php if($page['direction']) echo 'dir="rtl"' ?> > + <?php if(x($page,'banner')) echo $page['banner']; ?> <header><?php if(x($page,'header')) echo $page['header']; ?></header> - <nav class="navbar fixed-top navbar-expand-md navbar-dark bg-dark"><?php if(x($page,'nav')) echo $page['nav']; ?></nav> - <section><?php if(x($page,'content')) echo $page['content']; ?> + <nav class="navbar fixed-top navbar-expand-lg navbar-dark bg-dark"><?php if(x($page,'nav')) echo $page['nav']; ?></nav> + <section id="region_2"><?php if(x($page,'content')) echo $page['content']; ?> <div id="page-footer"></div> </section> </body> diff --git a/view/php/theme_init.php b/view/php/theme_init.php index f2c46da28..dd8dcb5ee 100644 --- a/view/php/theme_init.php +++ b/view/php/theme_init.php @@ -15,9 +15,8 @@ head_add_js('jquery.js'); head_add_js('/library/justifiedGallery/jquery.justifiedGallery.min.js'); head_add_js('/library/sprintf.js/dist/sprintf.min.js'); -//head_add_js('jquery.textinputs.js'); +head_add_js('/library/textcomplete/textcomplete.min.js'); head_add_js('autocomplete.js'); -head_add_js('/library/jquery-textcomplete/jquery.textcomplete.js'); head_add_js('/library/jquery.timeago.js'); head_add_js('/library/readmore.js/readmore.js'); diff --git a/view/ru/hmessages.po b/view/ru/hmessages.po index 023e2674f..f7ea3df15 100644 --- a/view/ru/hmessages.po +++ b/view/ru/hmessages.po @@ -1,7842 +1,14886 @@ -# Hubzilla Project -# Copyright (C) 2012-2014 the Hubzilla Project -# This file is distributed under the same license as the Red package. -# +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# # Translators: -# Alex <info@pixelbits.de>, 2013-2014 -# vislav <bizadmin@list.ru>, 2014 -# puser, 2014 +# Alex <info@pixelbits.de>, 2016-2017 +# Max Kostikov <max@kostikov.co>, 2018 +#, fuzzy msgid "" msgstr "" -"Project-Id-Version: Hubzilla\n" +"Project-Id-Version: hubzilla\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-06-27 00:02-0700\n" -"PO-Revision-Date: 2014-06-30 12:10+0000\n" -"Last-Translator: Alex <info@pixelbits.de>\n" -"Language-Team: Russian (http://www.transifex.com/projects/p/red-matrix/language/ru/)\n" +"POT-Creation-Date: 2018-04-23 11:34+0200\n" +"PO-Revision-Date: 2018-07-22 19:32+0000\n" +"Last-Translator: Max Kostikov <max@kostikov.co>\n" +"Language-Team: Russian (http://www.transifex.com/Friendica/hubzilla/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" -Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : (n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2))\n +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : (n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2))\n" -#: ../../include/dba/dba_driver.php:50 -#, php-format -msgid "Cannot locate DNS info for database server '%s'" -msgstr "" +#: ../../util/nconfig.php:34 +msgid "Source channel not found." +msgstr "Канал-источник не найден." -#: ../../include/photo/photo_driver.php:643 ../../include/photos.php:51 -#: ../../mod/profile_photo.php:142 ../../mod/profile_photo.php:301 -#: ../../mod/profile_photo.php:421 ../../mod/photos.php:91 -#: ../../mod/photos.php:653 ../../mod/photos.php:675 -msgid "Profile Photos" -msgstr "Фотографии профиля" +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:19 +msgid "lonely" +msgstr "одинокий" -#: ../../include/bbcode.php:128 ../../include/bbcode.php:648 -#: ../../include/bbcode.php:651 ../../include/bbcode.php:656 -#: ../../include/bbcode.php:659 ../../include/bbcode.php:662 -#: ../../include/bbcode.php:665 ../../include/bbcode.php:670 -#: ../../include/bbcode.php:673 ../../include/bbcode.php:678 -#: ../../include/bbcode.php:681 ../../include/bbcode.php:684 -#: ../../include/bbcode.php:687 -msgid "Image/photo" -msgstr "Изображение / фото" +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:20 +msgid "drunk" +msgstr "пьяный" -#: ../../include/bbcode.php:163 ../../include/bbcode.php:698 -msgid "Encrypted content" -msgstr "Зашифрованное содержание" +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:21 +msgid "horny" +msgstr "возбуждённый" -#: ../../include/bbcode.php:179 -msgid "QR code" -msgstr "QR код" +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:22 +msgid "stoned" +msgstr "под кайфом" -#: ../../include/bbcode.php:228 -#, php-format -msgid "%1$s wrote the following %2$s %3$s" -msgstr "%1$s написал следующее %2$s %3$s" +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:23 +msgid "fucked up" +msgstr "облажался" -#: ../../include/bbcode.php:230 -msgid "post" -msgstr "сообщение" +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:24 +msgid "clusterfucked" +msgstr "в полной заднице" -#: ../../include/bbcode.php:616 ../../include/bbcode.php:636 -msgid "$1 wrote:" -msgstr "$1 писал:" +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:25 +msgid "crazy" +msgstr "сумасшедший" -#: ../../include/oembed.php:171 -msgid "Embedded content" -msgstr "Внедренное содержание" +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:26 +msgid "hurt" +msgstr "обиженный" -#: ../../include/oembed.php:180 -msgid "Embedding disabled" -msgstr "Внедрение отключенно" +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:27 +msgid "sleepy" +msgstr "сонный" -#: ../../include/notify.php:23 -msgid "created a new post" -msgstr "создал новое сообщение" +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:28 +msgid "grumpy" +msgstr "сердитый" -#: ../../include/notify.php:24 -#, php-format -msgid "commented on %s's post" -msgstr "прокомментировал %s's сообщение" +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:29 +msgid "high" +msgstr "кайфует" + +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:30 +msgid "semi-conscious" +msgstr "в полубезсознании" + +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:31 +msgid "in love" +msgstr "влюблённый" + +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:32 +msgid "in lust" +msgstr "похотливый" + +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:33 +msgid "naked" +msgstr "обнажённый" + +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:34 +msgid "stinky" +msgstr "вонючий" + +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:35 +msgid "sweaty" +msgstr "потный" + +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:36 +msgid "bleeding out" +msgstr "истекающий кровью" + +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:37 +msgid "victorious" +msgstr "победивший" + +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:38 +msgid "defeated" +msgstr "проигравший" + +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:39 +msgid "envious" +msgstr "завидует" + +#: ../../extend/addon/hzaddons/moremoods/moremoods.php:40 +msgid "jealous" +msgstr "ревнует" + +#: ../../extend/addon/hzaddons/dwpost/dwpost.php:42 +msgid "Post to Dreamwidth" +msgstr "Публиковать в Dreamwidth" + +#: ../../extend/addon/hzaddons/dwpost/dwpost.php:73 +msgid "Enable Dreamwidth Post Plugin" +msgstr "Включить плагин публикаций Dreamwidth" + +#: ../../extend/addon/hzaddons/dwpost/dwpost.php:73 +#: ../../extend/addon/hzaddons/dwpost/dwpost.php:85 +#: ../../extend/addon/hzaddons/xmpp/xmpp.php:53 +#: ../../extend/addon/hzaddons/ijpost/ijpost.php:73 +#: ../../extend/addon/hzaddons/ijpost/ijpost.php:85 +#: ../../extend/addon/hzaddons/planets/planets.php:149 +#: ../../extend/addon/hzaddons/libertree/libertree.php:69 +#: ../../extend/addon/hzaddons/libertree/libertree.php:81 +#: ../../extend/addon/hzaddons/authchoose/authchoose.php:67 +#: ../../extend/addon/hzaddons/smileybutton/smileybutton.php:211 +#: ../../extend/addon/hzaddons/smileybutton/smileybutton.php:215 +#: ../../extend/addon/hzaddons/nsfw/nsfw.php:84 +#: ../../extend/addon/hzaddons/flattrwidget/flattrwidget.php:120 +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:219 +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:223 +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:227 +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:231 +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:309 +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:313 +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:343 +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:351 +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:355 +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:359 +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:70 +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:82 +#: ../../extend/addon/hzaddons/twitter/twitter.php:243 +#: ../../extend/addon/hzaddons/twitter/twitter.php:252 +#: ../../extend/addon/hzaddons/twitter/twitter.php:261 +#: ../../extend/addon/hzaddons/fuzzloc/fuzzloc.php:178 +#: ../../extend/addon/hzaddons/rtof/rtof.php:81 +#: ../../extend/addon/hzaddons/rtof/rtof.php:85 +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:389 +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:411 +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:415 +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:424 +#: ../../extend/addon/hzaddons/rainbowtag/rainbowtag.php:81 +#: ../../extend/addon/hzaddons/visage/visage.php:166 +#: ../../extend/addon/hzaddons/cart/cart.php:1206 +#: ../../extend/addon/hzaddons/cart/cart.php:1213 +#: ../../extend/addon/hzaddons/cart/cart.php:1221 +#: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:99 +#: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:104 +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:73 +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:653 +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:657 +#: ../../extend/addon/hzaddons/nsabait/nsabait.php:157 +#: ../../extend/addon/hzaddons/nofed/nofed.php:72 +#: ../../extend/addon/hzaddons/nofed/nofed.php:76 +#: ../../extend/addon/hzaddons/redred/redred.php:95 +#: ../../extend/addon/hzaddons/redred/redred.php:99 +#: ../../extend/addon/hzaddons/wppost/wppost.php:82 +#: ../../extend/addon/hzaddons/wppost/wppost.php:105 +#: ../../extend/addon/hzaddons/wppost/wppost.php:109 ../../boot.php:1621 +#: ../../view/theme/redbasic/php/config.php:98 ../../include/dir_fns.php:143 +#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145 +#: ../../Zotlabs/Module/Photos.php:702 ../../Zotlabs/Module/Events.php:470 +#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Removeme.php:63 +#: ../../Zotlabs/Module/Api.php:99 ../../Zotlabs/Module/Sources.php:116 +#: ../../Zotlabs/Module/Sources.php:151 +#: ../../Zotlabs/Module/Filestorage.php:178 +#: ../../Zotlabs/Module/Filestorage.php:186 +#: ../../Zotlabs/Module/Connedit.php:396 ../../Zotlabs/Module/Connedit.php:779 +#: ../../Zotlabs/Module/Mitem.php:176 ../../Zotlabs/Module/Mitem.php:177 +#: ../../Zotlabs/Module/Mitem.php:256 ../../Zotlabs/Module/Mitem.php:257 +#: ../../Zotlabs/Module/Admin/Site.php:266 +#: ../../Zotlabs/Module/Defperms.php:180 ../../Zotlabs/Module/Menu.php:162 +#: ../../Zotlabs/Module/Menu.php:221 +#: ../../Zotlabs/Module/Settings/Channel.php:315 +#: ../../Zotlabs/Module/Settings/Display.php:100 +#: ../../Zotlabs/Module/Import.php:554 ../../Zotlabs/Module/Import.php:558 +#: ../../Zotlabs/Module/Import.php:559 ../../Zotlabs/Module/Wiki.php:218 +#: ../../Zotlabs/Module/Wiki.php:219 ../../Zotlabs/Module/Profiles.php:681 +#: ../../Zotlabs/Storage/Browser.php:405 +msgid "No" +msgstr "Нет" -#: ../../include/conversation.php:120 ../../include/text.php:1705 -#: ../../mod/subthread.php:72 ../../mod/subthread.php:174 -#: ../../mod/tagger.php:45 ../../mod/like.php:254 -msgid "photo" -msgstr "фото" +#: ../../extend/addon/hzaddons/dwpost/dwpost.php:73 +#: ../../extend/addon/hzaddons/dwpost/dwpost.php:85 +#: ../../extend/addon/hzaddons/xmpp/xmpp.php:53 +#: ../../extend/addon/hzaddons/ijpost/ijpost.php:73 +#: ../../extend/addon/hzaddons/ijpost/ijpost.php:85 +#: ../../extend/addon/hzaddons/planets/planets.php:149 +#: ../../extend/addon/hzaddons/libertree/libertree.php:69 +#: ../../extend/addon/hzaddons/libertree/libertree.php:81 +#: ../../extend/addon/hzaddons/authchoose/authchoose.php:67 +#: ../../extend/addon/hzaddons/smileybutton/smileybutton.php:211 +#: ../../extend/addon/hzaddons/smileybutton/smileybutton.php:215 +#: ../../extend/addon/hzaddons/nsfw/nsfw.php:84 +#: ../../extend/addon/hzaddons/flattrwidget/flattrwidget.php:120 +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:219 +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:223 +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:227 +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:231 +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:309 +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:313 +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:343 +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:351 +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:355 +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:359 +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:70 +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:82 +#: ../../extend/addon/hzaddons/twitter/twitter.php:243 +#: ../../extend/addon/hzaddons/twitter/twitter.php:252 +#: ../../extend/addon/hzaddons/twitter/twitter.php:261 +#: ../../extend/addon/hzaddons/fuzzloc/fuzzloc.php:178 +#: ../../extend/addon/hzaddons/rtof/rtof.php:81 +#: ../../extend/addon/hzaddons/rtof/rtof.php:85 +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:389 +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:411 +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:415 +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:424 +#: ../../extend/addon/hzaddons/rainbowtag/rainbowtag.php:81 +#: ../../extend/addon/hzaddons/visage/visage.php:166 +#: ../../extend/addon/hzaddons/cart/cart.php:1206 +#: ../../extend/addon/hzaddons/cart/cart.php:1213 +#: ../../extend/addon/hzaddons/cart/cart.php:1221 +#: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:99 +#: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:104 +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:73 +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:653 +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:657 +#: ../../extend/addon/hzaddons/nsabait/nsabait.php:157 +#: ../../extend/addon/hzaddons/nofed/nofed.php:72 +#: ../../extend/addon/hzaddons/nofed/nofed.php:76 +#: ../../extend/addon/hzaddons/redred/redred.php:95 +#: ../../extend/addon/hzaddons/redred/redred.php:99 +#: ../../extend/addon/hzaddons/wppost/wppost.php:82 +#: ../../extend/addon/hzaddons/wppost/wppost.php:105 +#: ../../extend/addon/hzaddons/wppost/wppost.php:109 ../../boot.php:1621 +#: ../../view/theme/redbasic/php/config.php:98 ../../include/dir_fns.php:143 +#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145 +#: ../../Zotlabs/Module/Photos.php:702 ../../Zotlabs/Module/Events.php:470 +#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Removeme.php:63 +#: ../../Zotlabs/Module/Api.php:98 ../../Zotlabs/Module/Sources.php:116 +#: ../../Zotlabs/Module/Sources.php:151 +#: ../../Zotlabs/Module/Filestorage.php:178 +#: ../../Zotlabs/Module/Filestorage.php:186 +#: ../../Zotlabs/Module/Connedit.php:396 ../../Zotlabs/Module/Mitem.php:176 +#: ../../Zotlabs/Module/Mitem.php:177 ../../Zotlabs/Module/Mitem.php:256 +#: ../../Zotlabs/Module/Mitem.php:257 ../../Zotlabs/Module/Admin/Site.php:268 +#: ../../Zotlabs/Module/Defperms.php:180 ../../Zotlabs/Module/Menu.php:162 +#: ../../Zotlabs/Module/Menu.php:221 +#: ../../Zotlabs/Module/Settings/Channel.php:315 +#: ../../Zotlabs/Module/Settings/Display.php:100 +#: ../../Zotlabs/Module/Import.php:554 ../../Zotlabs/Module/Import.php:558 +#: ../../Zotlabs/Module/Import.php:559 ../../Zotlabs/Module/Wiki.php:218 +#: ../../Zotlabs/Module/Wiki.php:219 ../../Zotlabs/Module/Profiles.php:681 +#: ../../Zotlabs/Storage/Browser.php:405 +msgid "Yes" +msgstr "Да" -#: ../../include/conversation.php:123 ../../include/text.php:1708 -#: ../../mod/tagger.php:49 -msgid "event" -msgstr "мероприятие" +#: ../../extend/addon/hzaddons/dwpost/dwpost.php:77 +msgid "Dreamwidth username" +msgstr "Имя пользователя Dreamwidth" + +#: ../../extend/addon/hzaddons/dwpost/dwpost.php:81 +msgid "Dreamwidth password" +msgstr "Пароль Dreamwidth" + +#: ../../extend/addon/hzaddons/dwpost/dwpost.php:85 +msgid "Post to Dreamwidth by default" +msgstr "Публиковать в Dreamwidth по умолчанию" + +#: ../../extend/addon/hzaddons/dwpost/dwpost.php:89 +msgid "Dreamwidth Post Settings" +msgstr "Настройки публикаций в Dreamwidth" + +#: ../../extend/addon/hzaddons/dwpost/dwpost.php:89 +#: ../../extend/addon/hzaddons/mailtest/mailtest.php:100 +#: ../../extend/addon/hzaddons/superblock/superblock.php:120 +#: ../../extend/addon/hzaddons/xmpp/xmpp.php:69 +#: ../../extend/addon/hzaddons/hubwall/hubwall.php:95 +#: ../../extend/addon/hzaddons/ijpost/ijpost.php:89 +#: ../../extend/addon/hzaddons/planets/planets.php:153 +#: ../../extend/addon/hzaddons/libertree/libertree.php:85 +#: ../../extend/addon/hzaddons/authchoose/authchoose.php:71 +#: ../../extend/addon/hzaddons/logrot/logrot.php:35 +#: ../../extend/addon/hzaddons/redfiles/redfiles.php:124 +#: ../../extend/addon/hzaddons/smileybutton/smileybutton.php:219 +#: ../../extend/addon/hzaddons/nsfw/nsfw.php:92 +#: ../../extend/addon/hzaddons/flattrwidget/flattrwidget.php:124 +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:237 +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:371 +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:86 +#: ../../extend/addon/hzaddons/openstreetmap/openstreetmap.php:168 +#: ../../extend/addon/hzaddons/likebanner/likebanner.php:57 +#: ../../extend/addon/hzaddons/twitter/twitter.php:218 +#: ../../extend/addon/hzaddons/twitter/twitter.php:265 +#: ../../extend/addon/hzaddons/pubcrawl/pubcrawl.php:1159 +#: ../../extend/addon/hzaddons/diaspora/diaspora.php:830 +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:53 +#: ../../extend/addon/hzaddons/skeleton/skeleton.php:65 +#: ../../extend/addon/hzaddons/gnusoc/gnusoc.php:284 +#: ../../extend/addon/hzaddons/startpage/startpage.php:113 +#: ../../extend/addon/hzaddons/pageheader/pageheader.php:48 +#: ../../extend/addon/hzaddons/fuzzloc/fuzzloc.php:191 +#: ../../extend/addon/hzaddons/rtof/rtof.php:101 +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:322 +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:380 +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:432 +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:900 +#: ../../extend/addon/hzaddons/rainbowtag/rainbowtag.php:85 +#: ../../extend/addon/hzaddons/frphotos/frphotos.php:97 +#: ../../extend/addon/hzaddons/piwik/piwik.php:95 +#: ../../extend/addon/hzaddons/redphotos/redphotos.php:136 +#: ../../extend/addon/hzaddons/visage/visage.php:170 +#: ../../extend/addon/hzaddons/cart/cart.php:1251 +#: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:144 +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:78 +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:647 +#: ../../extend/addon/hzaddons/nsabait/nsabait.php:161 +#: ../../extend/addon/hzaddons/hzfiles/hzfiles.php:84 +#: ../../extend/addon/hzaddons/nofed/nofed.php:80 +#: ../../extend/addon/hzaddons/redred/redred.php:119 +#: ../../extend/addon/hzaddons/chords/Mod_Chords.php:60 +#: ../../extend/addon/hzaddons/irc/irc.php:53 +#: ../../extend/addon/hzaddons/wppost/wppost.php:113 +#: ../../view/theme/redbasic/php/config.php:93 ../../include/js_strings.php:22 +#: ../../Zotlabs/Lib/ThreadItem.php:757 ../../Zotlabs/Widget/Wiki_pages.php:40 +#: ../../Zotlabs/Widget/Wiki_pages.php:97 +#: ../../Zotlabs/Widget/Eventstools.php:16 ../../Zotlabs/Module/Appman.php:153 +#: ../../Zotlabs/Module/Photos.php:1087 ../../Zotlabs/Module/Photos.php:1127 +#: ../../Zotlabs/Module/Photos.php:1245 ../../Zotlabs/Module/Connect.php:98 +#: ../../Zotlabs/Module/Poke.php:200 ../../Zotlabs/Module/Events.php:493 +#: ../../Zotlabs/Module/Pdledit.php:98 ../../Zotlabs/Module/Mail.php:431 +#: ../../Zotlabs/Module/Xchan.php:15 ../../Zotlabs/Module/Sources.php:117 +#: ../../Zotlabs/Module/Sources.php:154 +#: ../../Zotlabs/Module/Filestorage.php:183 +#: ../../Zotlabs/Module/Editpost.php:85 ../../Zotlabs/Module/Connedit.php:887 +#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Setup.php:308 +#: ../../Zotlabs/Module/Setup.php:349 ../../Zotlabs/Module/Mitem.php:259 +#: ../../Zotlabs/Module/Admin/Addons.php:438 +#: ../../Zotlabs/Module/Admin/Site.php:309 +#: ../../Zotlabs/Module/Admin/Logs.php:84 +#: ../../Zotlabs/Module/Admin/Accounts.php:168 +#: ../../Zotlabs/Module/Admin/Security.php:112 +#: ../../Zotlabs/Module/Admin/Profs.php:178 +#: ../../Zotlabs/Module/Admin/Themes.php:158 +#: ../../Zotlabs/Module/Admin/Features.php:66 +#: ../../Zotlabs/Module/Admin/Account_edit.php:74 +#: ../../Zotlabs/Module/Admin/Channels.php:147 +#: ../../Zotlabs/Module/Email_validation.php:40 +#: ../../Zotlabs/Module/Invite.php:151 ../../Zotlabs/Module/Defperms.php:249 +#: ../../Zotlabs/Module/Settings/Features.php:79 +#: ../../Zotlabs/Module/Settings/Channel.php:516 +#: ../../Zotlabs/Module/Settings/Featured.php:54 +#: ../../Zotlabs/Module/Settings/Account.php:118 +#: ../../Zotlabs/Module/Settings/Display.php:192 +#: ../../Zotlabs/Module/Settings/Permcats.php:115 +#: ../../Zotlabs/Module/Settings/Oauth2.php:85 +#: ../../Zotlabs/Module/Settings/Oauth.php:88 +#: ../../Zotlabs/Module/Settings/Tokens.php:168 +#: ../../Zotlabs/Module/Chat.php:196 ../../Zotlabs/Module/Chat.php:242 +#: ../../Zotlabs/Module/Rate.php:166 ../../Zotlabs/Module/Locs.php:121 +#: ../../Zotlabs/Module/Import.php:565 ../../Zotlabs/Module/Pconfig.php:107 +#: ../../Zotlabs/Module/Wiki.php:206 ../../Zotlabs/Module/Group.php:121 +#: ../../Zotlabs/Module/Group.php:137 ../../Zotlabs/Module/Profiles.php:723 +#: ../../Zotlabs/Module/Thing.php:326 ../../Zotlabs/Module/Thing.php:379 +#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Import_items.php:129 +msgid "Submit" +msgstr "Отправить" -#: ../../include/conversation.php:126 ../../mod/like.php:72 -msgid "channel" -msgstr "канал" +#: ../../extend/addon/hzaddons/mdpost/mdpost.php:40 ../../include/text.php:1886 +#: ../../Zotlabs/Widget/Wiki_pages.php:36 +#: ../../Zotlabs/Widget/Wiki_pages.php:93 ../../Zotlabs/Module/Wiki.php:208 +#: ../../Zotlabs/Module/Wiki.php:350 +msgid "Markdown" +msgstr "Разметка" -#: ../../include/conversation.php:148 ../../include/text.php:1711 -#: ../../mod/subthread.php:72 ../../mod/subthread.php:174 -#: ../../mod/tagger.php:53 ../../mod/like.php:254 -msgid "status" -msgstr "статус" +#: ../../extend/addon/hzaddons/mdpost/mdpost.php:41 +msgid "Use markdown for editing posts" +msgstr "Использовать язык разметки для редактирования публикаций" -#: ../../include/conversation.php:150 ../../include/text.php:1713 -#: ../../mod/tagger.php:55 -msgid "comment" -msgstr "комментарий" +#: ../../extend/addon/hzaddons/randpost/randpost.php:97 +msgid "You're welcome." +msgstr "Пожалуйста." -#: ../../include/conversation.php:164 ../../mod/like.php:291 -#, php-format -msgid "%1$s likes %2$s's %3$s" -msgstr "%1$s нравится %2$s's %3$s" +#: ../../extend/addon/hzaddons/randpost/randpost.php:98 +msgid "Ah shucks..." +msgstr "О, чёрт..." -#: ../../include/conversation.php:167 ../../mod/like.php:293 -#, php-format -msgid "%1$s doesn't like %2$s's %3$s" -msgstr "%1$s не нравится %2$s's %3$s" +#: ../../extend/addon/hzaddons/randpost/randpost.php:99 +msgid "Don't mention it." +msgstr "Не стоит благодарности." -#: ../../include/conversation.php:204 -#, php-format -msgid "%1$s is now connected with %2$s" -msgstr "%1$s теперь соединен с %2$s" +#: ../../extend/addon/hzaddons/randpost/randpost.php:100 +msgid "<blush>" +msgstr "<краснею>" -#: ../../include/conversation.php:239 -#, php-format -msgid "%1$s poked %2$s" -msgstr "%1$s подпихнул %2$s" +#: ../../extend/addon/hzaddons/mailtest/mailtest.php:19 +msgid "Send test email" +msgstr "Отправить тестовый email" -#: ../../include/conversation.php:243 ../../include/text.php:895 -msgid "poked" -msgstr "подпихнул" +#: ../../extend/addon/hzaddons/mailtest/mailtest.php:50 +#: ../../extend/addon/hzaddons/hubwall/hubwall.php:50 +msgid "No recipients found." +msgstr "Получателей не найдено." -#: ../../include/conversation.php:261 ../../mod/mood.php:63 -#, php-format -msgctxt "mood" -msgid "%1$s is %2$s" -msgstr "" +#: ../../extend/addon/hzaddons/mailtest/mailtest.php:66 +msgid "Mail sent." +msgstr "Сообщение отправлено" -#: ../../include/conversation.php:634 ../../include/ItemObject.php:114 -msgid "Select" -msgstr "Выбрать" +#: ../../extend/addon/hzaddons/mailtest/mailtest.php:68 +msgid "Sending of mail failed." +msgstr "Не удалось отправить сообщение." -#: ../../include/conversation.php:635 ../../include/apps.php:232 -#: ../../include/ItemObject.php:108 ../../mod/settings.php:578 -#: ../../mod/connedit.php:398 ../../mod/photos.php:1046 -#: ../../mod/group.php:176 ../../mod/admin.php:758 ../../mod/admin.php:888 -#: ../../mod/thing.php:236 -#: ../../view/tpl/smarty3/compiled/de0b699d2fc212753c3f166003476a343ca00174.file.cloud_directory.tpl.php:84 -msgid "Delete" +#: ../../extend/addon/hzaddons/mailtest/mailtest.php:77 +msgid "Mail Test" +msgstr "Тестовое сообщение" + +#: ../../extend/addon/hzaddons/mailtest/mailtest.php:96 +#: ../../extend/addon/hzaddons/hubwall/hubwall.php:92 +msgid "Message subject" +msgstr "Тема сообщения" + +#: ../../extend/addon/hzaddons/donate/donate.php:21 +msgid "Project Servers and Resources" +msgstr "Серверы и ресурсы проекта" + +#: ../../extend/addon/hzaddons/donate/donate.php:22 +msgid "Project Creator and Tech Lead" +msgstr "Создатель проекта и технический руководитель" + +#: ../../extend/addon/hzaddons/donate/donate.php:23 +msgid "Admin, developer, directorymin, support bloke" +msgstr "Администратор, разработчик, администратор каталога, поддержка" + +#: ../../extend/addon/hzaddons/donate/donate.php:50 +msgid "" +"And the hundreds of other people and organisations who helped make the " +"Hubzilla possible." +msgstr "И сотни других людей и организаций которые помогали в создании Hubzilla." + +#: ../../extend/addon/hzaddons/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 "Проекты Redmatrix / Hubzilla предоставляются, в основном, добровольцами, которые предоставляют свое время и опыт и, часто, оплачивают из своего кармана услуги, которыми они делятся с другими." + +#: ../../extend/addon/hzaddons/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 "Здесь нет корпоративного финансирования и рекламы, мы не собираем и не продаем вашу личную информацию. (Мы не контролируем вашу личную информацию - <strong>это делаете вы</strong>.)" + +#: ../../extend/addon/hzaddons/donate/donate.php:55 +msgid "" +"Help support our ground-breaking work in decentralisation, web identity, and " +"privacy." +msgstr "Помогите поддержать нашу новаторскую работу в областях децентрализации, веб-идентификации и конфиденциальности." + +#: ../../extend/addon/hzaddons/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 "В ваших пожертвованиях поддерживают серверы и службы, а также помогают нам предоставлять новые возможности и продолжать развитие." + +#: ../../extend/addon/hzaddons/donate/donate.php:60 +msgid "Donate" +msgstr "Пожертвовать" + +#: ../../extend/addon/hzaddons/donate/donate.php:62 +msgid "" +"Choose a project, developer, or public hub to support with a one-time " +"donation" +msgstr "Выберите проект, разработчика или общедоступный узел для поддержки в форме единоразового пожертвования" + +#: ../../extend/addon/hzaddons/donate/donate.php:63 +msgid "Donate Now" +msgstr "Пожертвовать сейчас" + +#: ../../extend/addon/hzaddons/donate/donate.php:64 +msgid "" +"<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)" +msgstr "<strong><em>или</em></strong> станьте спонсором проекта (только для Hubzilla)" + +#: ../../extend/addon/hzaddons/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 "Пожалуйста, если желаете, укажите ваше имя для отображения в списке спонсоров." + +#: ../../extend/addon/hzaddons/donate/donate.php:66 +msgid "Sponsor" +msgstr "Спонсор" + +#: ../../extend/addon/hzaddons/donate/donate.php:69 +msgid "Special thanks to: " +msgstr "Особые благодарности:" + +#: ../../extend/addon/hzaddons/superblock/superblock.php:112 +msgid "Currently blocked" +msgstr "В настоящее время заблокирован" + +#: ../../extend/addon/hzaddons/superblock/superblock.php:114 +msgid "No channels currently blocked" +msgstr "В настоящее время никакие каналы не блокируются" + +#: ../../extend/addon/hzaddons/superblock/superblock.php:116 +#: ../../Zotlabs/Module/Photos.php:1025 ../../Zotlabs/Module/Tagrm.php:137 +#: ../../Zotlabs/Module/Admin/Addons.php:455 +msgid "Remove" msgstr "Удалить" -#: ../../include/conversation.php:642 ../../include/ItemObject.php:89 -#: ../../mod/photos.php:844 -msgid "Private Message" -msgstr "Личное сообщение" +#: ../../extend/addon/hzaddons/superblock/superblock.php:120 +msgid "Superblock Settings" +msgstr "Настройки Superblock" -#: ../../include/conversation.php:649 ../../include/ItemObject.php:182 -msgid "Message is verified" -msgstr "Сообщение проверено" +#: ../../extend/addon/hzaddons/superblock/superblock.php:345 +msgid "Block Completely" +msgstr "Заблокировать полностью" -#: ../../include/conversation.php:669 -#, php-format -msgid "View %s's profile @ %s" -msgstr "Просмотр %s's профиля @ %s" +#: ../../extend/addon/hzaddons/superblock/superblock.php:394 +msgid "superblock settings updated" +msgstr "Настройки Superblock обновлены." -#: ../../include/conversation.php:683 -msgid "Categories:" -msgstr "Категории:" +#: ../../extend/addon/hzaddons/xmpp/xmpp.php:31 +msgid "XMPP settings updated." +msgstr "Настройки XMPP обновлены." -#: ../../include/conversation.php:684 -msgid "Filed under:" -msgstr "Хранить под:" +#: ../../extend/addon/hzaddons/xmpp/xmpp.php:53 +msgid "Enable Chat" +msgstr "Включить чат" -#: ../../include/conversation.php:693 ../../include/ItemObject.php:250 -#, php-format -msgid " from %s" -msgstr " от %s" +#: ../../extend/addon/hzaddons/xmpp/xmpp.php:58 +msgid "Individual credentials" +msgstr "Индивидуальные разрешения" + +#: ../../extend/addon/hzaddons/xmpp/xmpp.php:64 +msgid "Jabber BOSH server" +msgstr "Сервер Jabber BOSH" + +#: ../../extend/addon/hzaddons/xmpp/xmpp.php:69 +msgid "XMPP Settings" +msgstr "Настройки XMPP" + +#: ../../extend/addon/hzaddons/xmpp/xmpp.php:91 +#: ../../extend/addon/hzaddons/msgfooter/msgfooter.php:46 +#: ../../extend/addon/hzaddons/gravatar/gravatar.php:150 +msgid "Save Settings" +msgstr "Сохранить настройки" + +#: ../../extend/addon/hzaddons/xmpp/xmpp.php:92 +msgid "Jabber BOSH host" +msgstr "Узел Jabber BOSH" + +#: ../../extend/addon/hzaddons/xmpp/xmpp.php:93 +msgid "Use central userbase" +msgstr "Использовать центральную базу данных" + +#: ../../extend/addon/hzaddons/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 "" +"Если включено, участники автоматически войдут на сервер ejabberd, который должен " +"быть установлен на этом компьютере с синхронизированными учетными данными через " +"скрипт \"auth_ejabberd.php\"." + +#: ../../extend/addon/hzaddons/xmpp/xmpp.php:102 +#: ../../extend/addon/hzaddons/logrot/logrot.php:54 +#: ../../extend/addon/hzaddons/msgfooter/msgfooter.php:54 +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:82 +#: ../../extend/addon/hzaddons/openstreetmap/openstreetmap.php:184 +#: ../../extend/addon/hzaddons/twitter/twitter.php:772 +#: ../../extend/addon/hzaddons/piwik/piwik.php:116 +#: ../../Zotlabs/Module/Defperms.php:103 +#: ../../Zotlabs/Module/Settings/Channel.php:272 +msgid "Settings updated." +msgstr "Настройки обновлены." + +#: ../../extend/addon/hzaddons/hubwall/hubwall.php:19 +msgid "Send email to all members" +msgstr "Отправить email всем участникам" -#: ../../include/conversation.php:696 ../../include/ItemObject.php:253 +#: ../../extend/addon/hzaddons/hubwall/hubwall.php:33 +#: ../../Zotlabs/Lib/Enotify.php:65 #, php-format -msgid "last edited: %s" -msgstr "" +msgid "%s Administrator" +msgstr "администратор %s" -#: ../../include/conversation.php:697 ../../include/ItemObject.php:254 +#: ../../extend/addon/hzaddons/hubwall/hubwall.php:73 #, php-format -msgid "Expires: %s" -msgstr "" +msgid "%1$d of %2$d messages sent." +msgstr "%1$d из %2$d сообщений отправлено." -#: ../../include/conversation.php:712 -msgid "View in context" -msgstr "Показать в контексте" +#: ../../extend/addon/hzaddons/hubwall/hubwall.php:81 +msgid "Send email to all hub members." +msgstr "Отправить email всем участникам узла." -#: ../../include/conversation.php:714 ../../include/conversation.php:1130 -#: ../../include/ItemObject.php:294 ../../mod/editblock.php:120 -#: ../../mod/editlayout.php:115 ../../mod/editpost.php:121 -#: ../../mod/editwebpage.php:152 ../../mod/photos.php:977 -#: ../../mod/mail.php:222 ../../mod/mail.php:336 -msgid "Please wait" -msgstr "Подождите пожалуйста" +#: ../../extend/addon/hzaddons/hubwall/hubwall.php:93 +msgid "Sender Email address" +msgstr "Адрес электронной почты отправителя" -#: ../../include/conversation.php:841 -msgid "remove" -msgstr "удалить" +#: ../../extend/addon/hzaddons/hubwall/hubwall.php:94 +msgid "Test mode (only send to hub administrator)" +msgstr "Тестовый режим (отправка только администратору узла)" -#: ../../include/conversation.php:845 -msgid "Loading..." -msgstr "Загрузка..." +#: ../../extend/addon/hzaddons/buglink/buglink.php:16 +#: ../../Zotlabs/Lib/Apps.php:295 +msgid "Report Bug" +msgstr "Сообщить об ошибке" -#: ../../include/conversation.php:846 -msgid "Delete Selected Items" -msgstr "Удалить выбранные элементы" +#: ../../extend/addon/hzaddons/ijpost/ijpost.php:42 +msgid "Post to Insanejournal" +msgstr "Опубликовать в InsaneJournal" -#: ../../include/conversation.php:937 -msgid "View Source" -msgstr "Просмотр источника" +#: ../../extend/addon/hzaddons/ijpost/ijpost.php:73 +msgid "Enable InsaneJournal Post Plugin" +msgstr "Включить плагин публикаций InsaneJournal" -#: ../../include/conversation.php:938 -msgid "Follow Thread" -msgstr "Следовать теме" +#: ../../extend/addon/hzaddons/ijpost/ijpost.php:77 +msgid "InsaneJournal username" +msgstr "Имя пользователя InsaneJournal" -#: ../../include/conversation.php:939 -msgid "View Status" -msgstr "Просмотр состояния" +#: ../../extend/addon/hzaddons/ijpost/ijpost.php:81 +msgid "InsaneJournal password" +msgstr "Пароль InsaneJournal" -#: ../../include/conversation.php:940 ../../include/nav.php:81 -#: ../../mod/connedit.php:351 ../../mod/connedit.php:465 -msgid "View Profile" -msgstr "Просмотр профиля" +#: ../../extend/addon/hzaddons/ijpost/ijpost.php:85 +msgid "Post to InsaneJournal by default" +msgstr "Публиковать в InsaneJournal по умолчанию" -#: ../../include/conversation.php:941 -msgid "View Photos" -msgstr "Просмотр фотографий" +#: ../../extend/addon/hzaddons/ijpost/ijpost.php:89 +msgid "InsaneJournal Post Settings" +msgstr "Настройки публикаций в InsaneJournal" -#: ../../include/conversation.php:942 -msgid "Matrix Activity" -msgstr "Активность матрицы" +#: ../../extend/addon/hzaddons/ijpost/ijpost.php:104 +msgid "Insane Journal Settings saved." +msgstr "Настройки InsaneJournal сохранены." -#: ../../include/conversation.php:943 -msgid "Edit Contact" -msgstr "Редактировать контакт" +#: ../../extend/addon/hzaddons/dirstats/dirstats.php:94 +msgid "Hubzilla Directory Stats" +msgstr "Каталог статистики Hubzilla" -#: ../../include/conversation.php:944 -msgid "Send PM" -msgstr "Отправить личное сообщение" +#: ../../extend/addon/hzaddons/dirstats/dirstats.php:95 +msgid "Total Hubs" +msgstr "Всего хабов" -#: ../../include/conversation.php:945 ../../include/apps.php:135 -msgid "Poke" -msgstr "Подпихнуть" +#: ../../extend/addon/hzaddons/dirstats/dirstats.php:97 +msgid "Hubzilla Hubs" +msgstr "Хабы Hubzilla" -#: ../../include/conversation.php:1001 -#, php-format -msgid "%s likes this." -msgstr "%s нравится это." +#: ../../extend/addon/hzaddons/dirstats/dirstats.php:99 +msgid "Friendica Hubs" +msgstr "Хабы Friendica" -#: ../../include/conversation.php:1001 -#, php-format -msgid "%s doesn't like this." -msgstr "%s не нравится это." +#: ../../extend/addon/hzaddons/dirstats/dirstats.php:101 +msgid "Diaspora Pods" +msgstr "Стручки Diaspora" -#: ../../include/conversation.php:1005 -#, 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 чел.</span> нравится это." -msgstr[1] "<span %1$s>%2$d чел.</span> нравится это." -msgstr[2] "<span %1$s>%2$d чел.</span> нравится это." +#: ../../extend/addon/hzaddons/dirstats/dirstats.php:103 +msgid "Hubzilla Channels" +msgstr "Каналы Hubzilla" -#: ../../include/conversation.php:1007 -#, 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] "" -msgstr[2] "<span %1$s>%2$d чел.</span> не нравится это." +#: ../../extend/addon/hzaddons/dirstats/dirstats.php:105 +msgid "Friendica Channels" +msgstr "Каналы Friendica" -#: ../../include/conversation.php:1013 -msgid "and" -msgstr "и" +#: ../../extend/addon/hzaddons/dirstats/dirstats.php:107 +msgid "Diaspora Channels" +msgstr "Каналы Diaspora" -#: ../../include/conversation.php:1016 -#, php-format -msgid ", and %d other people" -msgid_plural ", and %d other people" -msgstr[0] "" -msgstr[1] "" -msgstr[2] ", и %d другие люди" +#: ../../extend/addon/hzaddons/dirstats/dirstats.php:109 +msgid "Aged 35 and above" +msgstr "Возраст 35 и выше" -#: ../../include/conversation.php:1017 -#, php-format -msgid "%s like this." -msgstr "%s нравится это." +#: ../../extend/addon/hzaddons/dirstats/dirstats.php:111 +msgid "Aged 34 and under" +msgstr "Возраст 34 и ниже" -#: ../../include/conversation.php:1017 -#, php-format -msgid "%s don't like this." -msgstr "%s не нравится это." +#: ../../extend/addon/hzaddons/dirstats/dirstats.php:113 +msgid "Average Age" +msgstr "Средний возраст" -#: ../../include/conversation.php:1074 -msgid "Visible to <strong>everybody</strong>" -msgstr "Видно для <strong>всех</strong>" +#: ../../extend/addon/hzaddons/dirstats/dirstats.php:115 +msgid "Known Chatrooms" +msgstr "Известные чаты" -#: ../../include/conversation.php:1075 ../../mod/mail.php:171 -#: ../../mod/mail.php:269 -msgid "Please enter a link URL:" -msgstr "Пожалуйста, введите URL ссылки:" +#: ../../extend/addon/hzaddons/dirstats/dirstats.php:117 +msgid "Known Tags" +msgstr "Известные теги" -#: ../../include/conversation.php:1076 -msgid "Please enter a video link/URL:" -msgstr "Пожалуйста, введите URL видео-ссылки:" +#: ../../extend/addon/hzaddons/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 "Обратите внимание, что статистика Diaspora и Friendica это только те, о которых ** этот каталог ** знает, а не все известные в сети. Это также относится и к чатам." + +#: ../../extend/addon/hzaddons/chess/chess.php:353 +#: ../../extend/addon/hzaddons/chess/chess.php:542 +msgid "Invalid game." +msgstr "Недействительная игра" + +#: ../../extend/addon/hzaddons/chess/chess.php:359 +#: ../../extend/addon/hzaddons/chess/chess.php:582 +msgid "You are not a player in this game." +msgstr "Вы не играете в эту игру." + +#: ../../extend/addon/hzaddons/chess/chess.php:415 +msgid "You must be a local channel to create a game." +msgstr "Ваш канал должен быть локальным чтобы создать игру." + +#: ../../extend/addon/hzaddons/chess/chess.php:433 +msgid "You must select one opponent that is not yourself." +msgstr "Вы должны выбрать противника который не является вами." + +#: ../../extend/addon/hzaddons/chess/chess.php:444 +msgid "Random color chosen." +msgstr "Выбран случайный цвет." + +#: ../../extend/addon/hzaddons/chess/chess.php:452 +msgid "Error creating new game." +msgstr "Ошибка создания новой игры." + +#: ../../extend/addon/hzaddons/chess/chess.php:486 +#: ../../include/channel.php:1151 +msgid "Requested channel is not available." +msgstr "Запрошенный канал не доступен." -#: ../../include/conversation.php:1077 -msgid "Please enter an audio link/URL:" -msgstr "Пожалуйста, введите URL аудио-ссылки:" +#: ../../extend/addon/hzaddons/chess/chess.php:500 +msgid "You must select a local channel /chess/channelname" +msgstr "Вы должны выбрать локальный канал /chess/channelname" -#: ../../include/conversation.php:1078 -msgid "Tag term:" -msgstr "Теги:" +#: ../../extend/addon/hzaddons/chess/chess.php:508 +#: ../../Zotlabs/Module/Channel.php:35 ../../Zotlabs/Module/Ochannel.php:32 +#: ../../Zotlabs/Module/Chat.php:25 +msgid "You must be logged in to see this page." +msgstr "Вы должны авторизоваться, чтобы увидеть эту страницу." -#: ../../include/conversation.php:1079 ../../mod/filer.php:49 -msgid "Save to Folder:" -msgstr "Сохранить в папку:" +#: ../../extend/addon/hzaddons/chess/chess.php:1066 +msgid "Enable notifications" +msgstr "Включить оповещения" -#: ../../include/conversation.php:1080 -msgid "Where are you right now?" -msgstr "Где вы сейчас?" +#: ../../extend/addon/hzaddons/planets/planets.php:121 +msgid "Planets Settings updated." +msgstr "Настройки Planets обновлены." -#: ../../include/conversation.php:1081 ../../mod/editpost.php:52 -#: ../../mod/mail.php:172 ../../mod/mail.php:270 -msgid "Expires YYYY-MM-DD HH:MM" -msgstr "" +#: ../../extend/addon/hzaddons/planets/planets.php:149 +msgid "Enable Planets Plugin" +msgstr "Включить плагин Planets" -#: ../../include/conversation.php:1091 ../../include/page_widgets.php:40 -#: ../../include/ItemObject.php:592 ../../mod/editblock.php:141 -#: ../../mod/editlayout.php:135 ../../mod/editpost.php:140 -#: ../../mod/editwebpage.php:174 ../../mod/photos.php:997 -#: ../../mod/webpages.php:124 -msgid "Preview" -msgstr "Предварительный просмотр" +#: ../../extend/addon/hzaddons/planets/planets.php:153 +msgid "Planets Settings" +msgstr "Настройки Planets" -#: ../../include/conversation.php:1105 ../../mod/photos.php:976 -#: ../../mod/layouts.php:113 -msgid "Share" -msgstr "Поделиться" +#: ../../extend/addon/hzaddons/libertree/libertree.php:38 +msgid "Post to Libertree" +msgstr "Опубликовать в Libertree" -#: ../../include/conversation.php:1107 ../../mod/editwebpage.php:139 -msgid "Page link title" -msgstr "Ссылка заголовока страницы" +#: ../../extend/addon/hzaddons/libertree/libertree.php:69 +msgid "Enable Libertree Post Plugin" +msgstr "Включить плагин публикаций Libertree" -#: ../../include/conversation.php:1110 -msgid "Post as" -msgstr "" +#: ../../extend/addon/hzaddons/libertree/libertree.php:73 +msgid "Libertree API token" +msgstr "Токен Libertree API" -#: ../../include/conversation.php:1111 ../../mod/editblock.php:112 -#: ../../mod/editlayout.php:107 ../../mod/editpost.php:113 -#: ../../mod/editwebpage.php:144 ../../mod/mail.php:219 ../../mod/mail.php:332 -msgid "Upload photo" -msgstr "Загрузить фотографию" +#: ../../extend/addon/hzaddons/libertree/libertree.php:77 +msgid "Libertree site URL" +msgstr "URL сайта Libertree" -#: ../../include/conversation.php:1112 -msgid "upload photo" -msgstr "загрузить фотографию" +#: ../../extend/addon/hzaddons/libertree/libertree.php:81 +msgid "Post to Libertree by default" +msgstr "Публиковать в Libertree по умолчанию" -#: ../../include/conversation.php:1113 ../../mod/editblock.php:113 -#: ../../mod/editlayout.php:108 ../../mod/editpost.php:114 -#: ../../mod/editwebpage.php:145 ../../mod/mail.php:220 ../../mod/mail.php:333 -msgid "Attach file" -msgstr "Прикрепить файл" +#: ../../extend/addon/hzaddons/libertree/libertree.php:85 +msgid "Libertree Post Settings" +msgstr "Настройки публикаций в Libertree" -#: ../../include/conversation.php:1114 -msgid "attach file" -msgstr "прикрепить файл" +#: ../../extend/addon/hzaddons/libertree/libertree.php:99 +msgid "Libertree Settings saved." +msgstr "Настройки Libertree сохранены." -#: ../../include/conversation.php:1115 ../../mod/editblock.php:114 -#: ../../mod/editlayout.php:109 ../../mod/editpost.php:115 -#: ../../mod/editwebpage.php:146 ../../mod/mail.php:221 ../../mod/mail.php:334 -msgid "Insert web link" -msgstr "Вставить веб-ссылку" +#: ../../extend/addon/hzaddons/authchoose/authchoose.php:67 +msgid "Only authenticate automatically to sites of your friends" +msgstr "Автоматически аутентифицироватся только на сайтах ваших друзей" -#: ../../include/conversation.php:1116 -msgid "web link" -msgstr "веб-ссылка" +#: ../../extend/addon/hzaddons/authchoose/authchoose.php:67 +msgid "By default you are automatically authenticated anywhere in the network" +msgstr "По умолчанию вы автоматически аутентифицируетесь во всей сети" -#: ../../include/conversation.php:1117 -msgid "Insert video link" -msgstr "Вставить видео-ссылку" +#: ../../extend/addon/hzaddons/authchoose/authchoose.php:71 +msgid "Authchoose Settings" +msgstr "Настройки выбора аутентификации" -#: ../../include/conversation.php:1118 -msgid "video link" -msgstr "видео-ссылка" +#: ../../extend/addon/hzaddons/authchoose/authchoose.php:85 +msgid "Atuhchoose Settings updated." +msgstr "Настройки выбора аутентификации обновлены." -#: ../../include/conversation.php:1119 -msgid "Insert audio link" -msgstr "Вставить аудио-ссылку" +#: ../../extend/addon/hzaddons/logrot/logrot.php:36 +msgid "Logfile archive directory" +msgstr "Каталог архивирования журнала" -#: ../../include/conversation.php:1120 -msgid "audio link" -msgstr "аудио-ссылка" +#: ../../extend/addon/hzaddons/logrot/logrot.php:36 +msgid "Directory to store rotated logs" +msgstr "Каталог для хранения заархивированных журналов" -#: ../../include/conversation.php:1121 ../../mod/editblock.php:118 -#: ../../mod/editlayout.php:113 ../../mod/editpost.php:119 -#: ../../mod/editwebpage.php:150 -msgid "Set your location" -msgstr "Указание своего расположения" +#: ../../extend/addon/hzaddons/logrot/logrot.php:37 +msgid "Logfile size in bytes before rotating" +msgstr "Размер файла журнала в байтах для архивирования" -#: ../../include/conversation.php:1122 -msgid "set location" -msgstr "указание расположения" +#: ../../extend/addon/hzaddons/logrot/logrot.php:38 +msgid "Number of logfiles to retain" +msgstr "Количество сохраняемых файлов журналов" -#: ../../include/conversation.php:1123 ../../mod/editblock.php:119 -#: ../../mod/editlayout.php:114 ../../mod/editpost.php:120 -#: ../../mod/editwebpage.php:151 -msgid "Clear browser location" -msgstr "Стереть указание расположения" +#: ../../extend/addon/hzaddons/qrator/qrator.php:48 +msgid "QR code" +msgstr "QR-код" + +#: ../../extend/addon/hzaddons/qrator/qrator.php:63 +msgid "QR Generator" +msgstr "Генератор QR-кодов" + +#: ../../extend/addon/hzaddons/qrator/qrator.php:64 +msgid "Enter some text" +msgstr "Введите любой текст" + +#: ../../extend/addon/hzaddons/msgfooter/msgfooter.php:47 +msgid "text to include in all outgoing posts from this site" +msgstr "текст, который будет добавлен во все исходящие публикации с этого сайта" + +#: ../../extend/addon/hzaddons/redfiles/redfilehelper.php:64 +msgid "file" +msgstr "файл" + +#: ../../extend/addon/hzaddons/redfiles/redfiles.php:109 +#: ../../extend/addon/hzaddons/frphotos/frphotos.php:82 +#: ../../extend/addon/hzaddons/redphotos/redphotos.php:119 +#: ../../extend/addon/hzaddons/hzfiles/hzfiles.php:73 +#: ../../include/items.php:364 ../../Zotlabs/Web/WebServer.php:122 +#: ../../Zotlabs/Module/Subthread.php:86 ../../Zotlabs/Module/Like.php:296 +#: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:68 +#: ../../Zotlabs/Module/Group.php:83 ../../Zotlabs/Module/Profperm.php:28 +#: ../../Zotlabs/Module/Cloud.php:126 ../../Zotlabs/Module/Import_items.php:120 +msgid "Permission denied" +msgstr "Доступ запрещен" -#: ../../include/conversation.php:1124 -msgid "clear location" -msgstr "стереть указание расположения" +#: ../../extend/addon/hzaddons/redfiles/redfiles.php:119 +msgid "Redmatrix File Storage Import" +msgstr "Импорт файлового хранилища Redmatrix" -#: ../../include/conversation.php:1126 ../../mod/editblock.php:132 -#: ../../mod/editlayout.php:126 ../../mod/editpost.php:132 -#: ../../mod/editwebpage.php:167 -msgid "Set title" -msgstr "Заголовок" +#: ../../extend/addon/hzaddons/redfiles/redfiles.php:120 +msgid "This will import all your Redmatrix cloud files to this channel." +msgstr "Это позволит импортировать все ваши файлы в Redmatrix в этот канал." -#: ../../include/conversation.php:1129 ../../mod/editblock.php:135 -#: ../../mod/editlayout.php:129 ../../mod/editpost.php:134 -#: ../../mod/editwebpage.php:169 -msgid "Categories (comma-separated list)" -msgstr "Категории (список через запятую)" +#: ../../extend/addon/hzaddons/redfiles/redfiles.php:121 +#: ../../extend/addon/hzaddons/redphotos/redphotos.php:131 +msgid "Redmatrix Server base URL" +msgstr "Базовый URL сервера Redmatrix" -#: ../../include/conversation.php:1131 ../../mod/editblock.php:121 -#: ../../mod/editlayout.php:116 ../../mod/editpost.php:122 -#: ../../mod/editwebpage.php:153 -msgid "Permission settings" -msgstr "Настройки разрешений" +#: ../../extend/addon/hzaddons/redfiles/redfiles.php:122 +#: ../../extend/addon/hzaddons/redphotos/redphotos.php:132 +msgid "Redmatrix Login Username" +msgstr "Имя пользователя Redmatrix" -#: ../../include/conversation.php:1132 -msgid "permissions" -msgstr "разрешения" - -#: ../../include/conversation.php:1139 ../../mod/editblock.php:129 -#: ../../mod/editlayout.php:123 ../../mod/editpost.php:129 -#: ../../mod/editwebpage.php:162 -msgid "Public post" -msgstr "Публичное сообщение" - -#: ../../include/conversation.php:1141 ../../mod/editblock.php:136 -#: ../../mod/editlayout.php:130 ../../mod/editpost.php:135 -#: ../../mod/editwebpage.php:170 -msgid "Example: bob@example.com, mary@example.com" -msgstr "Пример: bob@example.com, mary@example.com" - -#: ../../include/conversation.php:1154 ../../mod/editblock.php:146 -#: ../../mod/editlayout.php:140 ../../mod/editpost.php:146 -#: ../../mod/editwebpage.php:179 ../../mod/mail.php:226 ../../mod/mail.php:339 -msgid "Set expiration date" -msgstr "" +#: ../../extend/addon/hzaddons/redfiles/redfiles.php:123 +#: ../../extend/addon/hzaddons/redphotos/redphotos.php:133 +msgid "Redmatrix Login Password" +msgstr "Пароль Redmatrix" -#: ../../include/conversation.php:1156 ../../include/ItemObject.php:595 -#: ../../mod/editpost.php:148 ../../mod/mail.php:228 ../../mod/mail.php:341 -msgid "Encrypt text" -msgstr "" +#: ../../extend/addon/hzaddons/smileybutton/smileybutton.php:211 +msgid "Deactivate the feature" +msgstr "Деактивировать функцию" -#: ../../include/conversation.php:1158 ../../mod/editpost.php:150 -msgid "OK" -msgstr "OK" +#: ../../extend/addon/hzaddons/smileybutton/smileybutton.php:215 +msgid "Hide the button and show the smilies directly." +msgstr "Скрыть кнопку и сразу показывать смайлики." -#: ../../include/conversation.php:1159 ../../mod/settings.php:516 -#: ../../mod/settings.php:542 ../../mod/editpost.php:151 -#: ../../mod/fbrowser.php:82 ../../mod/fbrowser.php:117 ../../mod/tagrm.php:11 -#: ../../mod/tagrm.php:94 -msgid "Cancel" -msgstr "Отменить" +#: ../../extend/addon/hzaddons/smileybutton/smileybutton.php:219 +msgid "Smileybutton Settings" +msgstr "Настройки кнопки смайликов" -#: ../../include/conversation.php:1401 -msgid "Discover" -msgstr "Обнаруженные" +#: ../../extend/addon/hzaddons/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 "Этот плагин просматривает публикации для слов / текста, которые вы указываете ниже, и сворачивает любой контент, содержащий эти ключевые слова, поэтому он не отображается в неподходящее время, например, сексуальные инсинуации, которые могут быть неправильными в настройке работы. Например, мы рекомендуем отмечать любой контент, содержащий наготу, тегом #NSFW. Этот фильтр также способен реагировать на любое другое указанное вами слово / текст и может использоваться в качестве фильтра содержимого общего назначения." + +#: ../../extend/addon/hzaddons/nsfw/nsfw.php:84 +msgid "Enable Content filter" +msgstr "Включить фильтрацию содержимого" + +#: ../../extend/addon/hzaddons/nsfw/nsfw.php:88 +msgid "Comma separated list of keywords to hide" +msgstr "Список ключевых слов для скрытия, через запятую" + +#: ../../extend/addon/hzaddons/nsfw/nsfw.php:88 +msgid "Word, /regular-expression/, lang=xx, lang!=xx" +msgstr "слово, /регулярное_выражение/, lang=xx, lang!=xx" + +#: ../../extend/addon/hzaddons/nsfw/nsfw.php:92 +msgid "Not Safe For Work Settings" +msgstr "Настройка \"Not Safe For Work\"" + +#: ../../extend/addon/hzaddons/nsfw/nsfw.php:92 +msgid "General Purpose Content Filter" +msgstr "Фильтр содержимого общего назначения" + +#: ../../extend/addon/hzaddons/nsfw/nsfw.php:110 +msgid "NSFW Settings saved." +msgstr "Настройки NSFW сохранены." + +#: ../../extend/addon/hzaddons/nsfw/nsfw.php:207 +msgid "Possible adult content" +msgstr "Возможно содержимое для взрослых" + +#: ../../extend/addon/hzaddons/nsfw/nsfw.php:222 +#, php-format +msgid "%s - view" +msgstr "%s - просмотр" + +#: ../../extend/addon/hzaddons/flattrwidget/flattrwidget.php:45 +msgid "Flattr this!" +msgstr "" + +#: ../../extend/addon/hzaddons/flattrwidget/flattrwidget.php:83 +msgid "Flattr widget settings updated." +msgstr "Настройки виджета Flattr обновлены." + +#: ../../extend/addon/hzaddons/flattrwidget/flattrwidget.php:100 +msgid "Flattr user" +msgstr "Пользователь Flattr" + +#: ../../extend/addon/hzaddons/flattrwidget/flattrwidget.php:104 +msgid "URL of the Thing to flattr" +msgstr "URL ccылки на Flattr" + +#: ../../extend/addon/hzaddons/flattrwidget/flattrwidget.php:104 +msgid "If empty channel URL is used" +msgstr "Если пусто, то используется URL канала" + +#: ../../extend/addon/hzaddons/flattrwidget/flattrwidget.php:108 +msgid "Title of the Thing to flattr" +msgstr "Заголовок вещи на Flattr" + +#: ../../extend/addon/hzaddons/flattrwidget/flattrwidget.php:108 +msgid "If empty \"channel name on The Hubzilla\" will be used" +msgstr "Если пусто, то будет использовано \"Название канала Hubzilla\"" + +#: ../../extend/addon/hzaddons/flattrwidget/flattrwidget.php:112 +msgid "Static or dynamic flattr button" +msgstr "Статическая или динамическая кнопка Flattr" + +#: ../../extend/addon/hzaddons/flattrwidget/flattrwidget.php:112 +msgid "static" +msgstr "статическая" + +#: ../../extend/addon/hzaddons/flattrwidget/flattrwidget.php:112 +msgid "dynamic" +msgstr "динамическая" + +#: ../../extend/addon/hzaddons/flattrwidget/flattrwidget.php:116 +msgid "Alignment of the widget" +msgstr "Выравнивание виджета" + +#: ../../extend/addon/hzaddons/flattrwidget/flattrwidget.php:116 +msgid "left" +msgstr "слева" + +#: ../../extend/addon/hzaddons/flattrwidget/flattrwidget.php:116 +msgid "right" +msgstr "справа" + +#: ../../extend/addon/hzaddons/flattrwidget/flattrwidget.php:120 +msgid "Enable Flattr widget" +msgstr "Включить виджет Flattr" + +#: ../../extend/addon/hzaddons/flattrwidget/flattrwidget.php:124 +msgid "Flattr Widget Settings" +msgstr "Настройки виджета Flattr" + +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:40 +#: ../../extend/addon/hzaddons/openid/Mod_Id.php:53 +#: ../../extend/addon/hzaddons/keepout/keepout.php:36 +#: ../../include/attach.php:150 ../../include/attach.php:197 +#: ../../include/attach.php:270 ../../include/attach.php:379 +#: ../../include/attach.php:393 ../../include/attach.php:400 +#: ../../include/attach.php:482 ../../include/attach.php:1042 +#: ../../include/attach.php:1116 ../../include/attach.php:1281 +#: ../../include/items.php:3653 ../../include/photos.php:27 +#: ../../Zotlabs/Lib/Chatroom.php:133 ../../Zotlabs/Web/WebServer.php:123 +#: ../../Zotlabs/Module/Appman.php:87 ../../Zotlabs/Module/Photos.php:69 +#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Poke.php:149 +#: ../../Zotlabs/Module/Achievements.php:34 +#: ../../Zotlabs/Module/Connections.php:29 ../../Zotlabs/Module/Item.php:229 +#: ../../Zotlabs/Module/Item.php:246 ../../Zotlabs/Module/Item.php:256 +#: ../../Zotlabs/Module/Item.php:1108 ../../Zotlabs/Module/Events.php:271 +#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78 +#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Settings.php:59 +#: ../../Zotlabs/Module/Notifications.php:11 +#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Mail.php:146 +#: ../../Zotlabs/Module/Card_edit.php:51 ../../Zotlabs/Module/Suggest.php:28 +#: ../../Zotlabs/Module/Channel.php:115 ../../Zotlabs/Module/Channel.php:281 +#: ../../Zotlabs/Module/Channel.php:320 ../../Zotlabs/Module/Block.php:24 +#: ../../Zotlabs/Module/Block.php:74 ../../Zotlabs/Module/Api.php:24 +#: ../../Zotlabs/Module/Viewsrc.php:19 ../../Zotlabs/Module/Sources.php:77 +#: ../../Zotlabs/Module/Profile_photo.php:302 +#: ../../Zotlabs/Module/Profile_photo.php:315 +#: ../../Zotlabs/Module/Common.php:38 ../../Zotlabs/Module/Message.php:18 +#: ../../Zotlabs/Module/Filestorage.php:15 +#: ../../Zotlabs/Module/Filestorage.php:70 +#: ../../Zotlabs/Module/Filestorage.php:96 +#: ../../Zotlabs/Module/Filestorage.php:140 ../../Zotlabs/Module/Page.php:34 +#: ../../Zotlabs/Module/Page.php:133 ../../Zotlabs/Module/Editblock.php:67 +#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Connedit.php:389 +#: ../../Zotlabs/Module/Webpages.php:118 +#: ../../Zotlabs/Module/Editwebpage.php:68 +#: ../../Zotlabs/Module/Editwebpage.php:89 +#: ../../Zotlabs/Module/Editwebpage.php:107 +#: ../../Zotlabs/Module/Editwebpage.php:121 +#: ../../Zotlabs/Module/Editlayout.php:67 +#: ../../Zotlabs/Module/Editlayout.php:90 ../../Zotlabs/Module/Moderate.php:13 +#: ../../Zotlabs/Module/Articles.php:68 ../../Zotlabs/Module/Bookmarks.php:64 +#: ../../Zotlabs/Module/Sharedwithme.php:16 ../../Zotlabs/Module/Setup.php:209 +#: ../../Zotlabs/Module/Mitem.php:129 ../../Zotlabs/Module/Invite.php:17 +#: ../../Zotlabs/Module/Invite.php:94 ../../Zotlabs/Module/Blocks.php:73 +#: ../../Zotlabs/Module/Blocks.php:80 ../../Zotlabs/Module/Cover_photo.php:313 +#: ../../Zotlabs/Module/Cover_photo.php:326 ../../Zotlabs/Module/Like.php:185 +#: ../../Zotlabs/Module/Defperms.php:173 ../../Zotlabs/Module/Menu.php:129 +#: ../../Zotlabs/Module/Menu.php:140 ../../Zotlabs/Module/Manage.php:10 +#: ../../Zotlabs/Module/Settings/Features.php:38 +#: ../../Zotlabs/Module/Chat.php:100 ../../Zotlabs/Module/Chat.php:105 +#: ../../Zotlabs/Module/Rate.php:113 ../../Zotlabs/Module/Locs.php:87 +#: ../../Zotlabs/Module/Viewconnections.php:28 +#: ../../Zotlabs/Module/Viewconnections.php:33 +#: ../../Zotlabs/Module/New_channel.php:105 +#: ../../Zotlabs/Module/New_channel.php:130 ../../Zotlabs/Module/Network.php:15 +#: ../../Zotlabs/Module/Regmod.php:20 +#: ../../Zotlabs/Module/Service_limits.php:11 ../../Zotlabs/Module/Cards.php:72 +#: ../../Zotlabs/Module/Register.php:77 +#: ../../Zotlabs/Module/Article_edit.php:51 ../../Zotlabs/Module/Wiki.php:50 +#: ../../Zotlabs/Module/Wiki.php:273 ../../Zotlabs/Module/Wiki.php:404 +#: ../../Zotlabs/Module/Group.php:12 ../../Zotlabs/Module/Group.php:24 +#: ../../Zotlabs/Module/Profiles.php:198 ../../Zotlabs/Module/Profiles.php:635 +#: ../../Zotlabs/Module/Profile.php:85 ../../Zotlabs/Module/Profile.php:101 +#: ../../Zotlabs/Module/Thing.php:280 ../../Zotlabs/Module/Thing.php:300 +#: ../../Zotlabs/Module/Thing.php:341 ../../Zotlabs/Module/Display.php:449 +#: ../../Zotlabs/Module/Cloud.php:40 ../../Zotlabs/Module/Mood.php:116 +msgid "Permission denied." +msgstr "Доступ запрещен." -#: ../../include/conversation.php:1404 -msgid "Imported public streams" -msgstr "" +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:148 +msgid "You are now authenticated to pumpio." +msgstr "Вы аутентифицированы в Pump.io" -#: ../../include/conversation.php:1409 -msgid "Commented Order" -msgstr "По комментариям" +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:149 +msgid "return to the featured settings page" +msgstr "Вернутся к странице настроек" -#: ../../include/conversation.php:1412 -msgid "Sort by Comment Date" -msgstr "Сортировка по дате создания комментариев" +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:163 +msgid "Post to Pump.io" +msgstr "Опубликовать в Pump.io" -#: ../../include/conversation.php:1416 -msgid "Posted Order" -msgstr "По добавлениям" +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:198 +msgid "Pump.io servername" +msgstr "Имя сервера Pump.io" -#: ../../include/conversation.php:1419 -msgid "Sort by Post Date" -msgstr "Сортировка по дате создания сообщения" +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:198 +msgid "Without \"http://\" or \"https://\"" +msgstr "Без \"http://\" или \"https://\"" -#: ../../include/conversation.php:1424 ../../include/widgets.php:82 -msgid "Personal" -msgstr "Личные" +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:202 +msgid "Pump.io username" +msgstr "Имя пользователя Pump.io" -#: ../../include/conversation.php:1427 -msgid "Posts that mention or involve you" -msgstr "Сообщения, в которых упоминули или вовлекли вас" +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:202 +msgid "Without the servername" +msgstr "без имени сервера" -#: ../../include/conversation.php:1433 ../../mod/connections.php:211 -#: ../../mod/connections.php:224 ../../mod/menu.php:61 -msgid "New" -msgstr "Новые" +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:213 +msgid "You are not authenticated to pumpio" +msgstr "Вы не аутентифицированы на Pump.io" -#: ../../include/conversation.php:1436 -msgid "Activity Stream - by date" -msgstr "Лента активности - по дате" +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:215 +msgid "(Re-)Authenticate your pump.io connection" +msgstr "Аутентифицировать (повторно) ваше соединение с Pump.io" -#: ../../include/conversation.php:1442 -msgid "Starred" -msgstr "Помеченные" +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:219 +msgid "Enable pump.io Post Plugin" +msgstr "Включить плагин публикаций Pump.io" -#: ../../include/conversation.php:1445 -msgid "Favourite Posts" -msgstr "Фаворит-сообщения" +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:223 +msgid "Post to pump.io by default" +msgstr "Публиковать в Pump.io по умолчанию" -#: ../../include/conversation.php:1452 -msgid "Spam" -msgstr "Спам" +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:227 +msgid "Should posts be public" +msgstr "Публикации должны быть общедоступными" -#: ../../include/conversation.php:1455 -msgid "Posts flagged as SPAM" -msgstr "Как СПАМ помеченные сообщения" +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:231 +msgid "Mirror all public posts" +msgstr "Отображать все общедоступные публикации" -#: ../../include/conversation.php:1488 ../../mod/admin.php:892 -msgid "Channel" -msgstr "Канал" +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:237 +msgid "Pump.io Post Settings" +msgstr "Настройки публикаций в Pump.io" -#: ../../include/conversation.php:1491 -msgid "Status Messages and Posts" -msgstr "" +#: ../../extend/addon/hzaddons/pumpio/pumpio.php:266 +msgid "PumpIO Settings saved." +msgstr "Настройки публикаций в Pump.io сохранены." -#: ../../include/conversation.php:1500 -msgid "About" -msgstr "О себе" +#: ../../extend/addon/hzaddons/bookmarker/bookmarker.php:38 +#: ../../Zotlabs/Lib/ThreadItem.php:403 +msgid "Save Bookmarks" +msgstr "Сохранить закладки" -#: ../../include/conversation.php:1503 -msgid "Profile Details" -msgstr "Сведения о профиле" +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:305 +#: ../../include/channel.php:1396 ../../include/channel.php:1567 +msgid "Status:" +msgstr "Статус:" -#: ../../include/conversation.php:1509 ../../include/nav.php:84 -#: ../../include/apps.php:129 ../../mod/fbrowser.php:25 -msgid "Photos" -msgstr "Фотографии" +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:309 +msgid "Activate addon" +msgstr "Активировать расширение" + +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:313 +msgid "Hide Jappixmini Chat-Widget from the webinterface" +msgstr "Скрыть виджет чата Jappixmini из веб-интерфейса" + +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:318 +msgid "Jabber username" +msgstr "Имя пользователя Jabber" + +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:324 +msgid "Jabber server" +msgstr "Сервер Jabber" + +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:330 +msgid "Jabber BOSH host URL" +msgstr "URL узла Jabber BOSH" + +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:337 +msgid "Jabber password" +msgstr "Пароль Jabber" + +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:343 +msgid "Encrypt Jabber password with Hubzilla password" +msgstr "Зашифровать пароль Jabber с помощью пароля Hubzilla" + +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:343 +#: ../../Zotlabs/Module/Settings/Channel.php:592 +#: ../../Zotlabs/Module/Settings/Channel.php:597 +#: ../../Zotlabs/Module/Settings/Channel.php:598 +#: ../../Zotlabs/Module/Settings/Channel.php:599 +msgid "Recommended" +msgstr "рекомендовано" + +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:347 +#: ../../extend/addon/hzaddons/redred/redred.php:115 +msgid "Hubzilla password" +msgstr "Пароль Hubzilla" + +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:351 +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:355 +msgid "Approve subscription requests from Hubzilla contacts automatically" +msgstr "Утверждать запросы на подписку от контактов Hubzilla автоматически" + +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:359 +msgid "Purge internal list of jabber addresses of contacts" +msgstr "Очистить внутренний список адресов контактов Jabber" + +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:364 +msgid "Configuration Help" +msgstr "Помощь по конфигурации" + +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:368 +#: ../../Zotlabs/Module/Cdav.php:1183 ../../Zotlabs/Module/Connedit.php:919 +#: ../../Zotlabs/Module/Profiles.php:796 +msgid "Add Contact" +msgstr "Добавить контакт" -#: ../../include/conversation.php:1512 ../../include/photos.php:313 -msgid "Photo Albums" -msgstr "Фотоальбомы" +#: ../../extend/addon/hzaddons/jappixmini/jappixmini.php:371 +msgid "Jappix Mini Settings" +msgstr "Настройки Jappix Mini" -#: ../../include/conversation.php:1518 ../../include/nav.php:85 -#: ../../include/reddav.php:1051 ../../include/apps.php:125 -#: ../../mod/fbrowser.php:114 -msgid "Files" -msgstr "Файлы" +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:42 +msgid "Post to LiveJournal" +msgstr "Опубликовать в LiveJournal" -#: ../../include/conversation.php:1521 -msgid "Files and Storage" -msgstr "" +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:70 +msgid "Enable LiveJournal Post Plugin" +msgstr "Включить плагин публикаций LiveJournal" -#: ../../include/conversation.php:1530 ../../include/conversation.php:1533 -msgid "Chatrooms" -msgstr "Чаты" +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:74 +msgid "LiveJournal username" +msgstr "Имя пользователя LiveJournal" -#: ../../include/conversation.php:1540 ../../include/nav.php:93 -#: ../../include/apps.php:119 -msgid "Bookmarks" -msgstr "Закладки" +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:78 +msgid "LiveJournal password" +msgstr "Пароль LiveJournal" -#: ../../include/conversation.php:1543 -msgid "Saved Bookmarks" -msgstr "Сохранённые закладки" +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:82 +msgid "Post to LiveJournal by default" +msgstr "Публиковать в LiveJournal по умолчанию" -#: ../../include/conversation.php:1551 ../../include/nav.php:95 -#: ../../include/apps.php:126 ../../mod/webpages.php:79 -msgid "Webpages" -msgstr "Веб-страницы" +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:86 +msgid "LiveJournal Post Settings" +msgstr "Настройки публикаций в LiveJournal" -#: ../../include/conversation.php:1554 -msgid "Manage Webpages" -msgstr "Управление веб-страниц" +#: ../../extend/addon/hzaddons/ljpost/ljpost.php:101 +msgid "LiveJournal Settings saved." +msgstr "Настройки LiveJournal сохранены." -#: ../../include/page_widgets.php:6 -msgid "New Page" -msgstr "Новая страница" +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:57 +msgid "Errors encountered deleting database table " +msgstr "Возникшие при удалении таблицы базы данных ошибки" -#: ../../include/page_widgets.php:8 ../../include/page_widgets.php:36 -#: ../../include/apps.php:231 ../../include/menu.php:42 -#: ../../include/ItemObject.php:96 ../../mod/settings.php:577 -#: ../../mod/blocks.php:94 ../../mod/connections.php:393 -#: ../../mod/editblock.php:111 ../../mod/editlayout.php:106 -#: ../../mod/editpost.php:112 ../../mod/editwebpage.php:143 -#: ../../mod/thing.php:235 ../../mod/layouts.php:112 ../../mod/menu.php:59 -#: ../../mod/webpages.php:120 -#: ../../view/tpl/smarty3/compiled/de0b699d2fc212753c3f166003476a343ca00174.file.cloud_directory.tpl.php:80 -msgid "Edit" -msgstr "Редактировать" +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:95 +#: ../../extend/addon/hzaddons/twitter/twitter.php:779 +msgid "Submit Settings" +msgstr "Отправить настройки" -#: ../../include/page_widgets.php:39 ../../mod/blocks.php:97 -#: ../../mod/layouts.php:116 ../../mod/webpages.php:123 -msgid "View" -msgstr "Просмотр" +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:96 +msgid "Drop tables when uninstalling?" +msgstr "Удалить таблицы при деинсталляции?" -#: ../../include/page_widgets.php:41 ../../mod/webpages.php:125 -msgid "Actions" +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:96 +msgid "" +"If checked, the Rendezvous database tables will be deleted when the plugin " +"is uninstalled." +msgstr "Если включено, то таблицы базы данных Rendezvous будут удалены при удалении плагина." + +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:97 +msgid "Mapbox Access Token" +msgstr "Токен доступа к Mapbox" + +#: ../../extend/addon/hzaddons/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 "Если вы введете токен доступа к Mapbox, он будет использоваться для извлечения фрагментов карты из Mapbox вместо стандартного сервера OpenStreetMap." + +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:162 +msgid "Rendezvous" msgstr "" -#: ../../include/page_widgets.php:42 ../../mod/webpages.php:126 -msgid "Page Link" -msgstr "Ссылка страницы" +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:167 +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/page_widgets.php:43 ../../mod/webpages.php:127 -msgid "Title" -msgstr "Заголовок" +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:168 +msgid "Welcome to Rendezvous!" +msgstr "Добро пожаловать в Rendezvous!" -#: ../../include/page_widgets.php:44 ../../mod/webpages.php:128 -msgid "Created" -msgstr "Создано" +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:169 +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 "" +"Введите ваше имя для вступления в это Rendezvous. Для того, чтобы делиться вашим " +"положением с другими участниками, нажмите \"GPS control\". Когда ваше местоположение " +"определно, красная точка появится и остальные смогут увидеть вас на карте." + +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:171 +msgid "Let's meet here" +msgstr "Давайте встретимся здесь" + +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:172 +#: ../../Zotlabs/Lib/NativeWikiPage.php:558 +#: ../../Zotlabs/Widget/Wiki_page_history.php:22 +#: ../../Zotlabs/Module/Cdav.php:1170 ../../Zotlabs/Module/Connedit.php:906 +#: ../../Zotlabs/Module/Sharedwithme.php:105 +#: ../../Zotlabs/Module/Admin/Channels.php:159 +#: ../../Zotlabs/Module/Settings/Oauth2.php:87 +#: ../../Zotlabs/Module/Settings/Oauth2.php:115 +#: ../../Zotlabs/Module/Settings/Oauth.php:90 +#: ../../Zotlabs/Module/Settings/Oauth.php:116 +#: ../../Zotlabs/Module/Chat.php:251 ../../Zotlabs/Module/Wiki.php:209 +#: ../../Zotlabs/Module/Group.php:125 ../../Zotlabs/Storage/Browser.php:285 +msgid "Name" +msgstr "Имя" -#: ../../include/page_widgets.php:45 ../../mod/webpages.php:129 -msgid "Edited" -msgstr "Отредактирован" +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:173 +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:659 +#: ../../Zotlabs/Module/Appman.php:143 ../../Zotlabs/Module/Cdav.php:871 +#: ../../Zotlabs/Module/Events.php:473 ../../Zotlabs/Module/Rbmark.php:101 +msgid "Description" +msgstr "Описание" + +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:174 +msgid "New marker" +msgstr "Новый маркер" + +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:175 +msgid "Edit marker" +msgstr "Редактировать маркер" + +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:176 +msgid "New identity" +msgstr "Новый идентификатор" -#: ../../include/security.php:301 +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:177 +msgid "Delete marker" +msgstr "Удалить маркер" + +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:178 +msgid "Delete member" +msgstr "Удалить участника" + +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:179 +msgid "Edit proximity alert" +msgstr "Изменить оповещение о близости" + +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:180 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 "" +"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 "Оповещение о близости будет произведено, если этот участник находится на определённом расстоянии от вас. <br><br>Введите радиус в метрах (0 для отключения):" -#: ../../include/account.php:23 -msgid "Not a valid email address" -msgstr "Не действительный адрес электронной почты" +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:180 +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:185 +msgid "distance" +msgstr "расстояние" -#: ../../include/account.php:25 -msgid "Your email domain is not among those allowed on this site" -msgstr "Домен электронной почты не входит в число тех, которые разрешены на этом сайте" +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:181 +msgid "Proximity alert distance (meters)" +msgstr "Расстояние для уведомления о близости (метров)" -#: ../../include/account.php:31 -msgid "Your email address is already registered at this site." -msgstr "Ваш адрес электронной почты уже зарегистрирован на этом сайте." +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:182 +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:184 +msgid "" +"A proximity alert will be issued when you are within a certain radius of the " +"marker location.<br><br>Enter a radius in meters (0 to disable):" +msgstr "Оповещение о близости будет произведено, если вы находитесь на определённом расстоянии местоположения маркера. <br><br>Введите радиус в метрах (0 для отключения):" -#: ../../include/account.php:64 -msgid "An invitation is required." -msgstr "Требуется приглашение." +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:183 +msgid "Marker proximity alert" +msgstr "Маркер уведомления о близости" -#: ../../include/account.php:68 -msgid "Invitation could not be verified." -msgstr "Не удалось проверить приглашение." +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:186 +msgid "Reminder note" +msgstr "Напоминание" -#: ../../include/account.php:119 -msgid "Please enter the required information." -msgstr "Пожалуйста, введите необходимую информацию." +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:187 +msgid "" +"Enter a note to be displayed when you are within the specified proximity..." +msgstr "Введите сообщение для отображения когда вы находитесь рядом" -#: ../../include/account.php:187 -msgid "Failed to store account information." -msgstr "Не удалось сохранить информацию аккаунта." +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:199 +msgid "Add new rendezvous" +msgstr "Добавить новое Rendezvous." -#: ../../include/account.php:273 -#, php-format -msgid "Registration request at %s" -msgstr "Требуется регистрация на %s" +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:200 +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 "Создайте новое Rendezvous и поделитесь ссылкой доступа с теми, кого вы хотите пригласить в группу. Тот, кто откроет эту ссылку, станет её участником. Участники могут видеть местоположение, добавлять маркеры на карту или делится своим собственным местоположением с группой." + +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:232 +msgid "You have no rendezvous. Press the button above to create a rendezvous!" +msgstr "У вас нет Rendezvous. Нажмите на кнопку ниже чтобы создать его!" + +#: ../../extend/addon/hzaddons/rendezvous/rendezvous.php:401 +#: ../../Zotlabs/Module/Setup.php:707 +msgid "Errors encountered creating database tables." +msgstr "При создании базы данных возникли ошибки." -#: ../../include/account.php:275 ../../include/account.php:302 -#: ../../include/account.php:359 -msgid "Administrator" -msgstr "Администратор" +#: ../../extend/addon/hzaddons/openstreetmap/openstreetmap.php:146 +msgid "View Larger" +msgstr "Увеличить" -#: ../../include/account.php:297 -msgid "your registration password" -msgstr "Ваш пароль регистрации" +#: ../../extend/addon/hzaddons/openstreetmap/openstreetmap.php:169 +msgid "Tile Server URL" +msgstr "URL сервера Tile" -#: ../../include/account.php:300 ../../include/account.php:357 -#, php-format -msgid "Registration details for %s" -msgstr "Регистрационные данные для %s" +#: ../../extend/addon/hzaddons/openstreetmap/openstreetmap.php:169 +msgid "" +"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank" +"\">public tile servers</a>" +msgstr "Список <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">общедоступных серверов</a>" -#: ../../include/account.php:366 -msgid "Account approved." -msgstr "Аккаунт утвержден." +#: ../../extend/addon/hzaddons/openstreetmap/openstreetmap.php:170 +msgid "Nominatim (reverse geocoding) Server URL" +msgstr "URL сервера Nominatim (обратное геокодирование)" -#: ../../include/account.php:400 -#, php-format -msgid "Registration revoked for %s" -msgstr "Регистрация отозвана для %s" +#: ../../extend/addon/hzaddons/openstreetmap/openstreetmap.php:170 +msgid "" +"A list of <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target=" +"\"_blank\">Nominatim servers</a>" +msgstr "Список <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target=\"_blank\">серверов Nominatim</a>" -#: ../../include/photos.php:15 ../../include/attach.php:119 -#: ../../include/attach.php:166 ../../include/attach.php:229 -#: ../../include/attach.php:243 ../../include/attach.php:283 -#: ../../include/attach.php:297 ../../include/attach.php:322 -#: ../../include/attach.php:513 ../../include/attach.php:585 -#: ../../include/chat.php:116 ../../include/items.php:3680 -#: ../../mod/mood.php:112 ../../mod/mitem.php:73 ../../mod/achievements.php:27 -#: ../../mod/settings.php:492 ../../mod/poke.php:128 ../../mod/api.php:26 -#: ../../mod/api.php:31 ../../mod/authtest.php:13 ../../mod/profile.php:64 -#: ../../mod/profile.php:72 ../../mod/block.php:22 ../../mod/block.php:72 -#: ../../mod/profile_photo.php:263 ../../mod/profile_photo.php:276 -#: ../../mod/blocks.php:29 ../../mod/blocks.php:44 ../../mod/profiles.php:152 -#: ../../mod/profiles.php:462 ../../mod/bookmarks.php:46 -#: ../../mod/channel.php:89 ../../mod/channel.php:193 -#: ../../mod/channel.php:236 ../../mod/chat.php:90 ../../mod/chat.php:95 -#: ../../mod/register.php:68 ../../mod/regmod.php:18 ../../mod/common.php:35 -#: ../../mod/network.php:12 ../../mod/connections.php:169 -#: ../../mod/connedit.php:221 ../../mod/delegate.php:6 ../../mod/page.php:30 -#: ../../mod/page.php:80 ../../mod/setup.php:203 ../../mod/editblock.php:34 -#: ../../mod/pdledit.php:21 ../../mod/editlayout.php:48 -#: ../../mod/editpost.php:13 ../../mod/editwebpage.php:44 -#: ../../mod/editwebpage.php:83 ../../mod/photos.php:68 -#: ../../mod/photos.php:526 ../../mod/sources.php:66 ../../mod/events.php:141 -#: ../../mod/filestorage.php:10 ../../mod/filestorage.php:59 -#: ../../mod/filestorage.php:75 ../../mod/filestorage.php:98 -#: ../../mod/fsuggest.php:78 ../../mod/suggest.php:26 ../../mod/group.php:9 -#: ../../mod/thing.php:249 ../../mod/thing.php:266 ../../mod/thing.php:301 -#: ../../mod/invite.php:13 ../../mod/invite.php:104 ../../mod/item.php:179 -#: ../../mod/item.php:187 ../../mod/item.php:898 ../../mod/layouts.php:27 -#: ../../mod/layouts.php:39 ../../mod/viewconnections.php:22 -#: ../../mod/viewconnections.php:27 ../../mod/viewsrc.php:12 -#: ../../mod/mail.php:108 ../../mod/manage.php:6 ../../mod/menu.php:44 -#: ../../mod/webpages.php:40 ../../mod/message.php:16 -#: ../../mod/new_channel.php:66 ../../mod/new_channel.php:97 -#: ../../mod/notifications.php:66 ../../mod/appman.php:66 ../../index.php:186 -#: ../../index.php:361 -msgid "Permission denied." -msgstr "Доступ запрещен." +#: ../../extend/addon/hzaddons/openstreetmap/openstreetmap.php:171 +msgid "Default zoom" +msgstr "Масштаб по умолчанию" + +#: ../../extend/addon/hzaddons/openstreetmap/openstreetmap.php:171 +msgid "" +"The default zoom level. (1:world, 18:highest, also depends on tile server)" +msgstr "Уровень размера по умолчанию (1 - весь мир, 18 - максимальный; зависит от сервера)." + +#: ../../extend/addon/hzaddons/openstreetmap/openstreetmap.php:172 +msgid "Include marker on map" +msgstr "Включите маркер на карте" -#: ../../include/photos.php:89 +#: ../../extend/addon/hzaddons/openstreetmap/openstreetmap.php:172 +msgid "Include a marker on the map." +msgstr "Включить маркер на карте" + +#: ../../extend/addon/hzaddons/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 "Мы столкнулись с проблемой входа с предоставленным вами OpenID. Пожалуйста, проверьте корректность его написания." + +#: ../../extend/addon/hzaddons/openid/openid.php:49 +msgid "The error message was:" +msgstr "Сообщение об ошибке было:" + +#: ../../extend/addon/hzaddons/openid/Mod_Openid.php:30 +msgid "OpenID protocol error. No ID returned." +msgstr "Ошибка протокола OpenID. Идентификатор не возвращён." + +#: ../../extend/addon/hzaddons/openid/Mod_Openid.php:76 +#: ../../extend/addon/hzaddons/openid/Mod_Openid.php:178 +#: ../../Zotlabs/Zot/Auth.php:264 #, php-format -msgid "Image exceeds website size limit of %lu bytes" -msgstr "" +msgid "Welcome %s. Remote authentication successful." +msgstr "Добро пожаловать %s. Удаленная аутентификация успешно завершена." -#: ../../include/photos.php:96 -msgid "Image file is empty." -msgstr "файл пуст." +#: ../../extend/addon/hzaddons/openid/Mod_Openid.php:188 +#: ../../include/auth.php:317 +msgid "Login failed." +msgstr "Не удалось войти." -#: ../../include/photos.php:123 ../../mod/profile_photo.php:216 -msgid "Unable to process image" -msgstr "Не удается обработать изображение" +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:52 +msgid "First Name" +msgstr "Имя" -#: ../../include/photos.php:186 -msgid "Photo storage failed." -msgstr "Ошибка в банке фотографий" +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:53 +msgid "Last Name" +msgstr "Фамилия" + +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:54 +#: ../../extend/addon/hzaddons/redred/redred.php:111 +msgid "Nickname" +msgstr "Псевдоним" + +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:55 +msgid "Full Name" +msgstr "Полное имя" + +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:56 +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:57 +#: ../../extend/addon/hzaddons/rtof/rtof.php:93 +#: ../../extend/addon/hzaddons/redred/redred.php:107 +#: ../../include/network.php:1769 ../../Zotlabs/Module/Cdav.php:1174 +#: ../../Zotlabs/Module/Connedit.php:910 +#: ../../Zotlabs/Module/Admin/Accounts.php:171 +#: ../../Zotlabs/Module/Admin/Accounts.php:183 +#: ../../Zotlabs/Module/Profiles.php:787 +msgid "Email" +msgstr "Электронная почта" + +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:58 +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:59 +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:60 +#: ../../Zotlabs/Lib/Apps.php:326 +msgid "Profile Photo" +msgstr "Фотография профиля" + +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:61 +msgid "Profile Photo 16px" +msgstr "Фотография профиля 16px" + +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:62 +msgid "Profile Photo 32px" +msgstr "Фотография профиля 32px" + +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:63 +msgid "Profile Photo 48px" +msgstr "Фотография профиля 48px" + +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:64 +msgid "Profile Photo 64px" +msgstr "Фотография профиля 64px" + +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:65 +msgid "Profile Photo 80px" +msgstr "Фотография профиля 80px" + +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:66 +msgid "Profile Photo 128px" +msgstr "Фотография профиля 128px" + +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:67 +msgid "Timezone" +msgstr "Часовой пояс" + +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:68 +#: ../../Zotlabs/Module/Profiles.php:767 +msgid "Homepage URL" +msgstr "URL домашней страницы" + +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:69 +#: ../../Zotlabs/Lib/Apps.php:324 +msgid "Language" +msgstr "Язык" + +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:70 +msgid "Birth Year" +msgstr "Год рождения" + +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:71 +msgid "Birth Month" +msgstr "Месяц рождения" + +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:72 +msgid "Birth Day" +msgstr "День рождения" + +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:73 +msgid "Birthdate" +msgstr "Дата рождения" + +#: ../../extend/addon/hzaddons/openid/MysqlProvider.php:74 +#: ../../Zotlabs/Module/Profiles.php:486 +msgid "Gender" +msgstr "Гендер" -#: ../../include/photos.php:317 ../../mod/photos.php:691 -#: ../../mod/photos.php:1193 -msgid "Upload New Photos" -msgstr "Загрузить новые фотографии" +#: ../../extend/addon/hzaddons/openid/Mod_Id.php:85 +#: ../../include/channel.php:1480 ../../include/selectors.php:49 +#: ../../include/selectors.php:66 +msgid "Male" +msgstr "Мужчина" -#: ../../include/acl_selectors.php:240 -msgid "Visible to everybody" -msgstr "Видно всем" +#: ../../extend/addon/hzaddons/openid/Mod_Id.php:87 +#: ../../include/channel.php:1478 ../../include/selectors.php:49 +#: ../../include/selectors.php:66 +msgid "Female" +msgstr "Женщина" -#: ../../include/acl_selectors.php:241 -msgid "Show" -msgstr "Показывать" +#: ../../extend/addon/hzaddons/likebanner/likebanner.php:51 +msgid "Your Webbie:" +msgstr "Ваш Webbie:" -#: ../../include/acl_selectors.php:242 -msgid "Don't show" -msgstr "Не показывать" +#: ../../extend/addon/hzaddons/likebanner/likebanner.php:54 +msgid "Fontsize (px):" +msgstr "Размер шрифта (px):" -#: ../../include/acl_selectors.php:248 ../../mod/chat.php:209 -#: ../../mod/photos.php:604 ../../mod/photos.php:952 -#: ../../mod/filestorage.php:128 -msgid "Permissions" -msgstr "Разрешения" +#: ../../extend/addon/hzaddons/likebanner/likebanner.php:68 +msgid "Link:" +msgstr "Ссылка:" -#: ../../include/acl_selectors.php:249 ../../include/ItemObject.php:289 -msgid "Close" -msgstr "Закрыть" +#: ../../extend/addon/hzaddons/likebanner/likebanner.php:70 +msgid "Like us on Hubzilla" +msgstr "Нравится на Hubzilla" -#: ../../include/activities.php:39 -msgid " and " -msgstr "и" +#: ../../extend/addon/hzaddons/likebanner/likebanner.php:72 +msgid "Embed:" +msgstr "Встроить:" -#: ../../include/activities.php:47 -msgid "public profile" -msgstr "Публичный профиль" +#: ../../extend/addon/hzaddons/sendzid/sendzid.php:25 +msgid "Extended Identity Sharing" +msgstr "Расширенный обмен идентификацией" -#: ../../include/activities.php:52 -#, php-format -msgid "%1$s changed %2$s to “%3$s”" -msgstr "%1$s изменил %2$s на “%3$s”" +#: ../../extend/addon/hzaddons/sendzid/sendzid.php:26 +msgid "" +"Share your identity with all websites on the internet. When disabled, " +"identity is only shared with $Projectname sites." +msgstr "Поделиться вашим идентификатором на всех веб-сайтах в Интернет. Если выключено, то идентификатор доступен только для сайтов $Projectname." + +#: ../../extend/addon/hzaddons/ldapauth/ldapauth.php:70 +msgid "An account has been created for you." +msgstr "Учётная запись, которая была для вас создана." + +#: ../../extend/addon/hzaddons/ldapauth/ldapauth.php:77 +msgid "Authentication successful but rejected: account creation is disabled." +msgstr "Аутентификация выполнена успешно, но отклонена: создание учетной записи отключено." + +#: ../../extend/addon/hzaddons/twitter/twitter.php:99 +msgid "Post to Twitter" +msgstr "Опубликовать в Twitter" + +#: ../../extend/addon/hzaddons/twitter/twitter.php:155 +msgid "Twitter settings updated." +msgstr "Настройки Twitter обновлены" + +#: ../../extend/addon/hzaddons/twitter/twitter.php:184 +msgid "" +"No consumer key pair for Twitter found. Please contact your site " +"administrator." +msgstr "Не найдено пары ключей для Twitter. Пожалуйста, свяжитесь с администратором сайта." + +#: ../../extend/addon/hzaddons/twitter/twitter.php:206 +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 "В этой установке Hubzilla плагин Twitter был включён, однако пока он не подключён к вашему аккаунту в Twitter. Для этого нажмите на кнопку ниже для получения PIN-кода от Twitter который нужно скопировать в поле ввода и отправить форму. Только ваши <strong>общедоступные</strong> публикации будут опубликованы в Twitter." + +#: ../../extend/addon/hzaddons/twitter/twitter.php:208 +msgid "Log in with Twitter" +msgstr "Войти в Twitter" + +#: ../../extend/addon/hzaddons/twitter/twitter.php:211 +msgid "Copy the PIN from Twitter here" +msgstr "Скопируйте PIN-код из Twitter здесь" + +#: ../../extend/addon/hzaddons/twitter/twitter.php:233 +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:401 +msgid "Currently connected to: " +msgstr "В настоящее время подключён к:" + +#: ../../extend/addon/hzaddons/twitter/twitter.php:238 +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>Замечание</strong>: Из-за настроек конфиденциальности (<em>скрыть данные своего профиля от неизвестных зрителей?</em>) cсылка, потенциально включенная в общедоступные публикации, переданные в Twitter, приведет посетителя к пустой странице, информирующей его о том, что доступ к вашему профилю был ограничен." + +#: ../../extend/addon/hzaddons/twitter/twitter.php:243 +msgid "Allow posting to Twitter" +msgstr "Разрешить публиковать в Twitter" + +#: ../../extend/addon/hzaddons/twitter/twitter.php:243 +msgid "" +"If enabled your public postings can be posted to the associated Twitter " +"account" +msgstr "Если включено, ваши общедоступные публикации будут опубликованы в связанной учётной записи Twitter" + +#: ../../extend/addon/hzaddons/twitter/twitter.php:247 +msgid "Twitter post length" +msgstr "Длина публикации Twitter" + +#: ../../extend/addon/hzaddons/twitter/twitter.php:247 +msgid "Maximum tweet length" +msgstr "Максимальная длина твита" + +#: ../../extend/addon/hzaddons/twitter/twitter.php:252 +msgid "Send public postings to Twitter by default" +msgstr "Отправлять общедоступные публикации в Twitter по умолчанию" + +#: ../../extend/addon/hzaddons/twitter/twitter.php:252 +msgid "" +"If enabled your public postings will be posted to the associated Twitter " +"account by default" +msgstr "Если включено, ваши общедоступные публикации будут опубликованы в связанной учётной записи Twitter по умолчанию" + +#: ../../extend/addon/hzaddons/twitter/twitter.php:261 +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:424 +msgid "Clear OAuth configuration" +msgstr "Очистить конфигурацию OAuth" + +#: ../../extend/addon/hzaddons/twitter/twitter.php:270 +msgid "Twitter Post Settings" +msgstr "Настройки публикаций в Twitter" + +#: ../../extend/addon/hzaddons/twitter/twitter.php:781 +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:894 +#: ../../Zotlabs/Module/Settings/Oauth.php:91 +#: ../../Zotlabs/Module/Settings/Oauth.php:117 +msgid "Consumer Key" +msgstr "Ключ клиента" + +#: ../../extend/addon/hzaddons/twitter/twitter.php:782 +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:893 +#: ../../Zotlabs/Module/Settings/Oauth2.php:88 +#: ../../Zotlabs/Module/Settings/Oauth2.php:116 +#: ../../Zotlabs/Module/Settings/Oauth.php:92 +#: ../../Zotlabs/Module/Settings/Oauth.php:118 +msgid "Consumer Secret" +msgstr "Код клиента" + +#: ../../extend/addon/hzaddons/adultphotoflag/adultphotoflag.php:24 +msgid "Flag Adult Photos" +msgstr "Пометка фотографий для взрослых" + +#: ../../extend/addon/hzaddons/adultphotoflag/adultphotoflag.php:25 +msgid "" +"Provide photo edit option to hide inappropriate photos from default album " +"view" +msgstr "Предоставьте возможность редактирования фотографий, чтобы скрыть неприемлемые фотографии из альбома по умолчанию" + +#: ../../extend/addon/hzaddons/pubcrawl/as.php:961 +#: ../../include/conversation.php:1165 ../../Zotlabs/Lib/Apps.php:819 +#: ../../Zotlabs/Lib/Apps.php:898 ../../Zotlabs/Widget/Album.php:84 +#: ../../Zotlabs/Widget/Portfolio.php:95 ../../Zotlabs/Module/Cdav.php:786 +#: ../../Zotlabs/Module/Cdav.php:787 ../../Zotlabs/Module/Cdav.php:794 +#: ../../Zotlabs/Module/Photos.php:822 ../../Zotlabs/Module/Photos.php:1278 +#: ../../Zotlabs/Module/Embedphotos.php:146 +#: ../../Zotlabs/Storage/Browser.php:164 +msgid "Unknown" +msgstr "Неизвестный" + +#: ../../extend/addon/hzaddons/pubcrawl/as.php:1219 +#: ../../extend/addon/hzaddons/pubcrawl/as.php:1374 +#: ../../extend/addon/hzaddons/pubcrawl/as.php:1553 +#: ../../include/network.php:1768 +msgid "ActivityPub" +msgstr "" + +#: ../../extend/addon/hzaddons/pubcrawl/as.php:1509 +#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1530 +#: ../../extend/addon/hzaddons/redphotos/redphotohelper.php:71 +#: ../../include/conversation.php:116 ../../include/text.php:2022 +#: ../../Zotlabs/Module/Subthread.php:111 ../../Zotlabs/Module/Tagger.php:69 +#: ../../Zotlabs/Module/Like.php:384 +msgid "photo" +msgstr "фото" -#: ../../include/activities.php:53 +#: ../../extend/addon/hzaddons/pubcrawl/as.php:1509 +#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1530 +#: ../../include/conversation.php:144 ../../include/text.php:2028 +#: ../../Zotlabs/Module/Subthread.php:111 ../../Zotlabs/Module/Like.php:384 +msgid "status" +msgstr "статус" + +#: ../../extend/addon/hzaddons/pubcrawl/as.php:1544 +#: ../../extend/addon/hzaddons/diaspora/Receiver.php:1559 +#: ../../include/conversation.php:160 ../../Zotlabs/Module/Like.php:438 #, php-format -msgid "Visit %1$s's %2$s" -msgstr "Посетить %1$s's %2$s" +msgid "%1$s likes %2$s's %3$s" +msgstr "%1$s нравится %3$s %2$s" -#: ../../include/activities.php:56 +#: ../../extend/addon/hzaddons/pubcrawl/as.php:1546 +#: ../../include/conversation.php:163 ../../Zotlabs/Module/Like.php:440 #, php-format -msgid "%1$s has an updated %2$s, changing %3$s." +msgid "%1$s doesn't like %2$s's %3$s" +msgstr "%1$s не нравится %2$s %3$s" + +#: ../../extend/addon/hzaddons/pubcrawl/pubcrawl.php:1136 +msgid "ActivityPub Protocol Settings updated." +msgstr "Настройки протокола ActivityPub обновлены." + +#: ../../extend/addon/hzaddons/pubcrawl/pubcrawl.php:1145 +msgid "" +"The ActivityPub protocol does not support location independence. Connections " +"you make within that network may be unreachable from alternate channel " +"locations." +msgstr "Протокол ActivityPub не поддерживает независимость от расположения. Ваши контакты установленные в этой сети могут быть недоступны из альтернативных мест размещения канала. " + +#: ../../extend/addon/hzaddons/pubcrawl/pubcrawl.php:1148 +msgid "Enable the ActivityPub protocol for this channel" +msgstr "Включить протокол ActivityPub для этого канала" + +#: ../../extend/addon/hzaddons/pubcrawl/pubcrawl.php:1151 +msgid "Deliver to ActivityPub recipients in privacy groups" +msgstr "Доставить получателям ActivityPub в группах безопасности" + +#: ../../extend/addon/hzaddons/pubcrawl/pubcrawl.php:1151 +msgid "" +"May result in a large number of mentions and expose all the members of your " +"privacy group" +msgstr "Может привести к большому количеству упоминаний и раскрытию участников группы безопасности" + +#: ../../extend/addon/hzaddons/pubcrawl/pubcrawl.php:1155 +msgid "Send multi-media HTML articles" +msgstr "Отправить HTML статьи с мультимедиа" + +#: ../../extend/addon/hzaddons/pubcrawl/pubcrawl.php:1155 +msgid "Not supported by some microblog services such as Mastodon" +msgstr "Не поддерживается некоторыми микроблогами, например Mastodon" + +#: ../../extend/addon/hzaddons/pubcrawl/pubcrawl.php:1159 +msgid "ActivityPub Protocol Settings" +msgstr "Настройки протокола ActivityPub" + +#: ../../extend/addon/hzaddons/diaspora/import_diaspora.php:16 +msgid "No username found in import file." +msgstr "Имя пользователя не найдено в файле для импорта." + +#: ../../extend/addon/hzaddons/diaspora/import_diaspora.php:41 +#: ../../include/import.php:72 +msgid "Unable to create a unique channel address. Import failed." +msgstr "Не удалось создать уникальный адрес канала. Импорт не завершен." + +#: ../../extend/addon/hzaddons/diaspora/import_diaspora.php:139 +#: ../../Zotlabs/Module/Import.php:513 +msgid "Import completed." +msgstr "Импорт завершен." + +#: ../../extend/addon/hzaddons/diaspora/util.php:308 +#: ../../extend/addon/hzaddons/diaspora/util.php:321 +#: ../../extend/addon/hzaddons/diaspora/p.php:48 +#: ../../Zotlabs/Lib/Enotify.php:61 +msgid "$projectname" msgstr "" -#: ../../include/api.php:1016 -msgid "Public Timeline" -msgstr "Публичная шкала времени" +#: ../../extend/addon/hzaddons/diaspora/diaspora.php:786 +msgid "Diaspora Protocol Settings updated." +msgstr "Настройки протокола Diaspora обновлены." -#: ../../include/attach.php:224 ../../include/attach.php:278 -msgid "Item was not found." -msgstr "Элемент не найден." +#: ../../extend/addon/hzaddons/diaspora/diaspora.php:805 +msgid "" +"The Diaspora protocol does not support location independence. Connections " +"you make within that network may be unreachable from alternate channel " +"locations." +msgstr "Прокол Diaspora не поддерживает независимость от расположения. Ваши контакты установленные в этой сети могут быть недоступны из альтернативных мест размещения канала." -#: ../../include/attach.php:335 -msgid "No source file." -msgstr "Нет исходного файла." +#: ../../extend/addon/hzaddons/diaspora/diaspora.php:808 +msgid "Enable the Diaspora protocol for this channel" +msgstr "Включить протокол Diaspora для этого канала" -#: ../../include/attach.php:352 -msgid "Cannot locate file to replace" -msgstr "Не удается найти файл, чтобы заменить" +#: ../../extend/addon/hzaddons/diaspora/diaspora.php:812 +msgid "Allow any Diaspora member to comment on your public posts" +msgstr "Разрешить любому участнику Diaspora комментировать ваши общедоступные публикации" -#: ../../include/attach.php:370 -msgid "Cannot locate file to revise/update" -msgstr "Не удается найти файл для пересмотра / обновления" +#: ../../extend/addon/hzaddons/diaspora/diaspora.php:816 +msgid "Prevent your hashtags from being redirected to other sites" +msgstr "Предотвратить перенаправление тегов на другие сайты" + +#: ../../extend/addon/hzaddons/diaspora/diaspora.php:820 +msgid "Sign and forward posts and comments with no existing Diaspora signature" +msgstr "Подписывать и отправлять публикации и комментарии с несуществующей подписью Diaspora" + +#: ../../extend/addon/hzaddons/diaspora/diaspora.php:825 +msgid "Followed hashtags (comma separated, do not include the #)" +msgstr "Отслеживаемые теги (через запятую, исключая #)" -#: ../../include/attach.php:381 +#: ../../extend/addon/hzaddons/diaspora/diaspora.php:830 +msgid "Diaspora Protocol Settings" +msgstr "Настройки протокола Diaspora" + +#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2102 +#: ../../Zotlabs/Module/Like.php:448 #, php-format -msgid "File exceeds size limit of %d" -msgstr "Файл превышает предельный размер %d" +msgid "%1$s is attending %2$s's %3$s" +msgstr "%1$s посещает %2$s%3$s" -#: ../../include/attach.php:393 +#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2104 +#: ../../Zotlabs/Module/Like.php:450 #, php-format -msgid "You have reached your limit of %1$.0f Mbytes attachment storage." +msgid "%1$s is not attending %2$s's %3$s" +msgstr "%1$s не посещает %2$s%3$s" + +#: ../../extend/addon/hzaddons/diaspora/Receiver.php:2106 +#: ../../Zotlabs/Module/Like.php:452 +#, php-format +msgid "%1$s may attend %2$s's %3$s" +msgstr "%1$s может посетить %2$s%3$s" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:50 +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:128 +msgid "System defaults:" +msgstr "Системные по умолчанию:" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:54 +msgid "Preferred Clipart IDs" +msgstr "Предпочитаемый Clipart ID" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:54 +msgid "List of preferred clipart ids. These will be shown first." +msgstr "Список предпочитаемых Clipart ID. Эти будут показаны первыми." + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:55 +msgid "Default Search Term" +msgstr "Условие поиска по умолчанию" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:55 +msgid "The default search term. These will be shown second." +msgstr "Условие поиска по умолчанию. Показываются во вторую очередь." + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:56 +msgid "Return After" +msgstr "Вернуться после" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:56 +msgid "Page to load after image selection." +msgstr "Страница для загрузки после выбора изображения." + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:57 +#: ../../include/conversation.php:1037 ../../include/nav.php:108 +#: ../../Zotlabs/Lib/Apps.php:309 ../../Zotlabs/Module/Connedit.php:594 +msgid "View Profile" +msgstr "Просмотреть профиль" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:58 +#: ../../include/nav.php:113 ../../include/channel.php:1300 +msgid "Edit Profile" +msgstr "Редактировать профиль" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:59 +msgid "Profile List" +msgstr "Список профилей" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:61 +msgid "Order of Preferred" +msgstr "Порядок предпочтения" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:61 +msgid "Sort order of preferred clipart ids." +msgstr "Порядок сортировки предпочитаемых Clipart ID. " + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:62 +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:68 +msgid "Newest first" +msgstr "Новое первым" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:65 +msgid "As entered" +msgstr "По мере ввода" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:67 +msgid "Order of other" +msgstr "Порядок других" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:67 +msgid "Sort order of other clipart ids." +msgstr "Порядок сортировки остальных Clipart ID." + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:69 +msgid "Most downloaded first" +msgstr "Самое загружаемое первым" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:70 +msgid "Most liked first" +msgstr "Самое нравящееся первым" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:72 +msgid "Preferred IDs Message" +msgstr "Сообщение от предпочитаемых ID" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:72 +msgid "Message to display above preferred results." +msgstr "Отображаемое сообщение над предпочитаемыми результатами." + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:78 +msgid "Uploaded by: " +msgstr "Загружено:" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:78 +msgid "Drawn by: " +msgstr "Нарисовано:" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:182 +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:194 +msgid "Use this image" +msgstr "Использовать это изображение" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:192 +msgid "Or select from a free OpenClipart.org image:" +msgstr "Или выберите из бесплатных изображений на OpenClipart.org" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:195 +msgid "Search Term" +msgstr "Условие поиска" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:232 +msgid "Unknown error. Please try again later." +msgstr "Неизвестная ошибка. Пожалуйста, повторите попытку позже." + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:298 +#: ../../Zotlabs/Module/Profile_photo.php:218 +msgid "" +"Shift-reload the page or clear browser cache if the new photo does not " +"display immediately." +msgstr "Если новая фотография не отображается немедленно то нажмите Shift + \"Обновить\" для очистки кэша браузера" + +#: ../../extend/addon/hzaddons/openclipatar/openclipatar.php:308 +msgid "Profile photo updated successfully." +msgstr "Фотография профиля обновлена успешно." + +#: ../../extend/addon/hzaddons/tour/tour.php:76 +msgid "Edit your profile and change settings." +msgstr "Отредактировать ваш профиль и изменить настройки." + +#: ../../extend/addon/hzaddons/tour/tour.php:77 +msgid "Click here to see activity from your connections." +msgstr "Нажмите сюда для отображения активности ваши контактов." + +#: ../../extend/addon/hzaddons/tour/tour.php:78 +msgid "Click here to see your channel home." +msgstr "Нажмите сюда чтобы увидеть главную страницу вашего канала." + +#: ../../extend/addon/hzaddons/tour/tour.php:79 +msgid "You can access your private messages from here." +msgstr "Вы можете получить доступ с личной переписке здесь." + +#: ../../extend/addon/hzaddons/tour/tour.php:80 +msgid "Create new events here." +msgstr "Создать новое событие здесь." + +#: ../../extend/addon/hzaddons/tour/tour.php:81 +msgid "" +"You can accept new connections and change permissions for existing ones " +"here. You can also e.g. create groups of contacts." +msgstr "Вы можете подключать новые контакты и менять разрешения для существующих здесь. Также вы можете создавать их группы." + +#: ../../extend/addon/hzaddons/tour/tour.php:82 +msgid "System notifications will arrive here" +msgstr "Системные оповещения будут показываться здесь" + +#: ../../extend/addon/hzaddons/tour/tour.php:83 +msgid "Search for content and users" +msgstr "Поиск пользователей и содержимого" + +#: ../../extend/addon/hzaddons/tour/tour.php:84 +msgid "Browse for new contacts" +msgstr "Поиск новых контактов" + +#: ../../extend/addon/hzaddons/tour/tour.php:85 +msgid "Launch installed apps" +msgstr "Запустить установленные приложения" + +#: ../../extend/addon/hzaddons/tour/tour.php:86 +msgid "Looking for help? Click here." +msgstr "Нужна помощь? Нажмите сюда." + +#: ../../extend/addon/hzaddons/tour/tour.php:87 +msgid "" +"New events have occurred in your network. Click here to see what has " +"happened!" +msgstr "Новые события произошли в вашей сети. Нажмите здесь для того, чтобы знать что случилось!" + +#: ../../extend/addon/hzaddons/tour/tour.php:88 +msgid "You have received a new private message. Click here to see from who!" +msgstr "Вы получили новое личное сообщение. Нажмите чтобы увидеть от кого!" + +#: ../../extend/addon/hzaddons/tour/tour.php:89 +msgid "There are events this week. Click here too see which!" +msgstr "На этой неделе есть события. Нажмите здесь чтобы увидеть какие!" + +#: ../../extend/addon/hzaddons/tour/tour.php:90 +msgid "You have received a new introduction. Click here to see who!" +msgstr "Вы были представлены. Нажмите чтобы увидеть кому!" + +#: ../../extend/addon/hzaddons/tour/tour.php:91 +msgid "" +"There is a new system notification. Click here to see what has happened!" +msgstr "Это новое системное уведомление. Нажмите чтобы посмотреть что случилось!" + +#: ../../extend/addon/hzaddons/tour/tour.php:94 +msgid "Click here to share text, images, videos and sound." +msgstr "Нажмите сюда чтобы поделиться текстом, изображениями, видео или треком." + +#: ../../extend/addon/hzaddons/tour/tour.php:95 +msgid "You can write an optional title for your update (good for long posts)." +msgstr "Вы можете написать необязательный заголовок для вашей публикации (желательно для больших постов)." + +#: ../../extend/addon/hzaddons/tour/tour.php:96 +msgid "Entering some categories here makes it easier to find your post later." +msgstr "Введите категории здесь чтобы было проще найти вашу публикацию позднее." + +#: ../../extend/addon/hzaddons/tour/tour.php:97 +msgid "Share photos, links, location, etc." +msgstr "Поделиться фотографией, ссылками, местоположение и т.п." + +#: ../../extend/addon/hzaddons/tour/tour.php:98 +msgid "" +"Only want to share content for a while? Make it expire at a certain date." +msgstr "Хотите только поделиться временным содержимым? Установите срок его действия." + +#: ../../extend/addon/hzaddons/tour/tour.php:99 +msgid "You can password protect content." +msgstr "Вы можете защитить содержимое паролем." + +#: ../../extend/addon/hzaddons/tour/tour.php:100 +msgid "Choose who you share with." +msgstr "Выбрать с кем поделиться." + +#: ../../extend/addon/hzaddons/tour/tour.php:102 +msgid "Click here when you are done." +msgstr "Нажмите здесь когда закончите." + +#: ../../extend/addon/hzaddons/tour/tour.php:105 +msgid "Adjust from which channels posts should be displayed." +msgstr "Настройте из каких каналов должны отображаться публикации." + +#: ../../extend/addon/hzaddons/tour/tour.php:106 +msgid "Only show posts from channels in the specified privacy group." +msgstr "Показывать только публикации из определённой группы безопасности." + +#: ../../extend/addon/hzaddons/tour/tour.php:110 +msgid "" +"Easily find posts containing tags (keywords preceded by the \"#\" symbol)." +msgstr "Лёгкий поиск сообщения, содержащего теги (ключевые слова, которым предшествует символ #)." + +#: ../../extend/addon/hzaddons/tour/tour.php:111 +msgid "Easily find posts in given category." +msgstr "Лёгкий поиск публикаций в данной категории." + +#: ../../extend/addon/hzaddons/tour/tour.php:112 +msgid "Easily find posts by date." +msgstr "Лёгкий поиск публикаций по дате." + +#: ../../extend/addon/hzaddons/tour/tour.php:113 +msgid "" +"Suggested users who have volounteered to be shown as suggestions, and who we " +"think you might find interesting." +msgstr "Рекомендуемые пользователи, которые были представлены в качестве предложений, и которые, по нашему мнению, могут оказаться интересными." + +#: ../../extend/addon/hzaddons/tour/tour.php:114 +msgid "Here you see channels you have connected to." +msgstr "Здесь вы видите каналы, к которым вы подключились." + +#: ../../extend/addon/hzaddons/tour/tour.php:115 +msgid "Save your search so you can repeat it at a later date." +msgstr "Сохраните ваш поиск с тем, чтобы повторить его позже." + +#: ../../extend/addon/hzaddons/tour/tour.php:118 +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 "Если вы видите этот значок, вы можете быть уверены, что отправитель - это тот, кто это говорит. Это нормально, что не всегда можно проверить отправителя, поэтому значок иногда будет отсутствовать. Обычно об этом не нужно беспокоиться." + +#: ../../extend/addon/hzaddons/tour/tour.php:119 +msgid "" +"Danger! It seems someone tried to forge a message! This message is not " +"necessarily from who it says it is from!" +msgstr "Опасность! Кажется, кто-то пытался подделать сообщение! Это сообщение не обязательно от того, от кого оно значится!" + +#: ../../extend/addon/hzaddons/tour/tour.php:126 +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 "" +"Добро пожаловать в Hubzilla! Желаете получить обзор пользовательского интерфейса?</p> " +"<p>Вы можете его приостановаить и в любое время перезагрузив страницу или перейдя на другую.</p>" +"<p>Также вы можете нажать клавишу \"Назад\"" -#: ../../include/attach.php:475 -msgid "File upload failed. Possible system limit or action terminated." -msgstr "Загрузка файла не удалась. Возможно система перегружена или попытка прекращена." +#: ../../extend/addon/hzaddons/skeleton/skeleton.php:59 +msgid "Some setting" +msgstr "Некоторые настройки" -#: ../../include/attach.php:487 -msgid "Stored file could not be verified. Upload failed." -msgstr "Файл для сохранения не проверен. Загрузка не удалась." +#: ../../extend/addon/hzaddons/skeleton/skeleton.php:61 +msgid "A setting" +msgstr "Настройка" -#: ../../include/attach.php:528 ../../include/attach.php:545 -msgid "Path not available." -msgstr "Путь недоступен." +#: ../../extend/addon/hzaddons/skeleton/skeleton.php:64 +msgid "Skeleton Settings" +msgstr "Настройки скелета" -#: ../../include/attach.php:590 -msgid "Empty pathname" +#: ../../extend/addon/hzaddons/upload_limits/upload_limits.php:25 +msgid "Show Upload Limits" +msgstr "Показать ограничения на загрузку" + +#: ../../extend/addon/hzaddons/upload_limits/upload_limits.php:27 +msgid "Hubzilla configured maximum size: " +msgstr "Максимальный размер настроенный в Hubzilla:" + +#: ../../extend/addon/hzaddons/upload_limits/upload_limits.php:28 +msgid "PHP upload_max_filesize: " msgstr "" -#: ../../include/attach.php:606 -msgid "duplicate filename or path" +#: ../../extend/addon/hzaddons/upload_limits/upload_limits.php:29 +msgid "PHP post_max_size (must be larger than upload_max_filesize): " msgstr "" -#: ../../include/attach.php:630 -msgid "Path not found." -msgstr "Путь не найден." +#: ../../extend/addon/hzaddons/gnusoc/gnusoc.php:258 +msgid "GNU-Social Protocol Settings updated." +msgstr "Настройки протокола GNU Social обновлены." -#: ../../include/attach.php:674 -msgid "mkdir failed." -msgstr "mkdir безуспешно." +#: ../../extend/addon/hzaddons/gnusoc/gnusoc.php:277 +msgid "" +"The GNU-Social protocol does not support location independence. Connections " +"you make within that network may be unreachable from alternate channel " +"locations." +msgstr "Прокол GNU Social не поддерживает независимость от расположения. Ваши контакты установленные в этой сети могут быть недоступны из альтернативных мест размещения канала." -#: ../../include/attach.php:678 -msgid "database storage failed." +#: ../../extend/addon/hzaddons/gnusoc/gnusoc.php:280 +msgid "Enable the GNU-Social protocol for this channel" +msgstr "Включить протокол GNU Social для этого канала" + +#: ../../extend/addon/hzaddons/gnusoc/gnusoc.php:284 +msgid "GNU-Social Protocol Settings" +msgstr "Настройки протокола GNU Social" + +#: ../../extend/addon/hzaddons/gnusoc/gnusoc.php:480 +msgid "Follow" +msgstr "Отслеживать" + +#: ../../extend/addon/hzaddons/gnusoc/gnusoc.php:483 +#, php-format +msgid "%1$s is now following %2$s" +msgstr "%1$s сейчас отслеживает %2$s" + +#: ../../extend/addon/hzaddons/gallery/gallery.php:42 +#: ../../extend/addon/hzaddons/gallery/Mod_Gallery.php:111 +msgid "Gallery" +msgstr "Галерея" + +#: ../../extend/addon/hzaddons/gallery/gallery.php:45 +msgid "Photo Gallery" +msgstr "Фотогалерея" + +#: ../../extend/addon/hzaddons/startpage/startpage.php:109 +msgid "Page to load after login" +msgstr "Страница для загрузки после входа" + +#: ../../extend/addon/hzaddons/startpage/startpage.php:109 +msgid "" +"Examples: "apps", "network?f=&gid=37" (privacy " +"collection), "channel" or "notifications/system" (leave " +"blank for default network page (grid)." +msgstr "Примеры: "apps", "network?f=&gid=37" (privacy collection), "channel" or "notifications/system" (оставьте пустым для для страницы сети по умолчанию)." + +#: ../../extend/addon/hzaddons/startpage/startpage.php:113 +msgid "Startpage Settings" +msgstr "Настройки стартовой страницы" + +#: ../../extend/addon/hzaddons/pageheader/pageheader.php:43 +msgid "Message to display on every page on this server" +msgstr "Отображаемое сообщение на каждой странице на этом сервере." + +#: ../../extend/addon/hzaddons/pageheader/pageheader.php:48 +msgid "Pageheader Settings" +msgstr "Настройки шапки страницы" + +#: ../../extend/addon/hzaddons/pageheader/pageheader.php:64 +msgid "pageheader Settings saved." +msgstr "Настройки шапки страницы сохранены." + +#: ../../extend/addon/hzaddons/tictac/tictac.php:21 +msgid "Three Dimensional Tic-Tac-Toe" +msgstr "Tic-Tac-Toe в трёх измерениях" + +#: ../../extend/addon/hzaddons/tictac/tictac.php:54 +msgid "3D Tic-Tac-Toe" msgstr "" -#: ../../include/bb2diaspora.php:441 ../../include/event.php:11 -msgid "l F d, Y \\@ g:i A" -msgstr "l F d, Y \\@ g:i A" +#: ../../extend/addon/hzaddons/tictac/tictac.php:59 +msgid "New game" +msgstr "Новая игра" -#: ../../include/bb2diaspora.php:447 ../../include/event.php:20 -msgid "Starts:" -msgstr "Начало:" +#: ../../extend/addon/hzaddons/tictac/tictac.php:60 +msgid "New game with handicap" +msgstr "Новая игра с форой" -#: ../../include/bb2diaspora.php:455 ../../include/event.php:30 -msgid "Finishes:" -msgstr "\t\nКонец:" +#: ../../extend/addon/hzaddons/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 "Трехмерный Tic-Tac-Toe похож на традиционную игру, за исключением того, что игра идёт на нескольких уровнях одновременно." -#: ../../include/bb2diaspora.php:463 ../../include/event.php:40 -#: ../../include/identity.php:726 ../../mod/directory.php:156 -#: ../../mod/dirprofile.php:105 ../../mod/events.php:485 -msgid "Location:" -msgstr "Откуда:" +#: ../../extend/addon/hzaddons/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/nav.php:77 ../../include/nav.php:101 ../../boot.php:1464 -msgid "Logout" -msgstr "Выход" +#: ../../extend/addon/hzaddons/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/nav.php:77 ../../include/nav.php:101 -msgid "End this session" -msgstr "Закончить эту сессию" +#: ../../extend/addon/hzaddons/tictac/tictac.php:183 +msgid "You go first..." +msgstr "Вы начинаете..." -#: ../../include/nav.php:80 ../../include/nav.php:135 -msgid "Home" -msgstr "Мой канал" +#: ../../extend/addon/hzaddons/tictac/tictac.php:188 +msgid "I'm going first this time..." +msgstr "На этот раз начинаю я..." -#: ../../include/nav.php:80 -msgid "Your posts and conversations" -msgstr "Ваши сообщения и разговоры" +#: ../../extend/addon/hzaddons/tictac/tictac.php:194 +msgid "You won!" +msgstr "Вы выиграли!" -#: ../../include/nav.php:81 -msgid "Your profile page" -msgstr "Страницa вашего профиля" +#: ../../extend/addon/hzaddons/tictac/tictac.php:200 +#: ../../extend/addon/hzaddons/tictac/tictac.php:225 +msgid "\"Cat\" game!" +msgstr "Ничья!" -#: ../../include/nav.php:83 -msgid "Edit Profiles" -msgstr "Редактирование профилей" +#: ../../extend/addon/hzaddons/tictac/tictac.php:223 +msgid "I won!" +msgstr "Я выиграл!" -#: ../../include/nav.php:83 -msgid "Manage/Edit profiles" -msgstr "Управление / Редактирование профилей" +#: ../../extend/addon/hzaddons/fuzzloc/fuzzloc.php:148 +msgid "Fuzzloc Settings updated." +msgstr "Настройки Fuzzloc обновлены." -#: ../../include/nav.php:84 -msgid "Your photos" -msgstr "Ваши фотографии" +#: ../../extend/addon/hzaddons/fuzzloc/fuzzloc.php:175 +msgid "" +"Fuzzloc allows you to blur your precise location if your channel uses " +"browser location mapping." +msgstr "Fuzzloc позволяет размыть ваше точное местоположение, если ваш канал использует сопоставление местоположений браузера." -#: ../../include/nav.php:85 -msgid "Your files" -msgstr "Ваши файлы" +#: ../../extend/addon/hzaddons/fuzzloc/fuzzloc.php:178 +msgid "Enable Fuzzloc Plugin" +msgstr "Включить плагин Fuzzloc" -#: ../../include/nav.php:90 ../../include/apps.php:136 -msgid "Chat" -msgstr "Чат" +#: ../../extend/addon/hzaddons/fuzzloc/fuzzloc.php:182 +msgid "Minimum offset in meters" +msgstr "Минимальное смещение в метрах" -#: ../../include/nav.php:90 -msgid "Your chatrooms" -msgstr "Ваши чаты" +#: ../../extend/addon/hzaddons/fuzzloc/fuzzloc.php:186 +msgid "Maximum offset in meters" +msgstr "Максимальное смещение в метрах" -#: ../../include/nav.php:93 -msgid "Your bookmarks" -msgstr "Ваши закладки" +#: ../../extend/addon/hzaddons/fuzzloc/fuzzloc.php:191 +msgid "Fuzzloc Settings" +msgstr "Настройки Fuzzloc" -#: ../../include/nav.php:95 -msgid "Your webpages" -msgstr "Ваши веб-страницы" +#: ../../extend/addon/hzaddons/rtof/rtof.php:45 +msgid "Post to Friendica" +msgstr "Опубликовать в Friendica" -#: ../../include/nav.php:99 ../../include/apps.php:121 ../../boot.php:1465 -msgid "Login" -msgstr "Войти" +#: ../../extend/addon/hzaddons/rtof/rtof.php:62 +msgid "rtof Settings saved." +msgstr "Настройки rtof сохранены." -#: ../../include/nav.php:99 -msgid "Sign in" -msgstr "Войти" +#: ../../extend/addon/hzaddons/rtof/rtof.php:81 +msgid "Allow posting to Friendica" +msgstr "Разрешить публиковать в Friendica" -#: ../../include/nav.php:116 -#, php-format -msgid "%s - click to logout" -msgstr "%s - нажмите чтобы выйти" +#: ../../extend/addon/hzaddons/rtof/rtof.php:85 +msgid "Send public postings to Friendica by default" +msgstr "Отправлять общедоступные публикации во Friendica по умолчанию" -#: ../../include/nav.php:121 -msgid "Click to authenticate to your home hub" +#: ../../extend/addon/hzaddons/rtof/rtof.php:89 +msgid "Friendica API Path" +msgstr "Путь к Friendica API" + +#: ../../extend/addon/hzaddons/rtof/rtof.php:89 +#: ../../extend/addon/hzaddons/redred/redred.php:103 +msgid "https://{sitename}/api" msgstr "" -#: ../../include/nav.php:135 -msgid "Home Page" -msgstr "Моя страница" +#: ../../extend/addon/hzaddons/rtof/rtof.php:93 +msgid "Friendica login name" +msgstr "Имя входа Friendica" -#: ../../include/nav.php:139 ../../mod/register.php:206 ../../boot.php:1441 -msgid "Register" -msgstr "Регистрация" +#: ../../extend/addon/hzaddons/rtof/rtof.php:97 +msgid "Friendica password" +msgstr "Пароль Friendica" -#: ../../include/nav.php:139 -msgid "Create an account" -msgstr "Создать аккаунт" +#: ../../extend/addon/hzaddons/rtof/rtof.php:101 +msgid "Hubzilla to Friendica Post Settings" +msgstr "Настройки публикаций Hubzilla для Friendica" -#: ../../include/nav.php:144 ../../include/apps.php:132 ../../mod/help.php:60 -#: ../../mod/help.php:65 -msgid "Help" -msgstr "Помощь" +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:143 +msgid "Post to GNU social" +msgstr "Опубликовать в GNU Social" -#: ../../include/nav.php:144 -msgid "Help and documentation" -msgstr "Справочная информация и документация" +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:195 +msgid "" +"Please contact your site administrator.<br />The provided API URL is not " +"valid." +msgstr "Пожалуйста свяжитесь с администратором сайта. <br />Предоставленный URL API недействителен." -#: ../../include/nav.php:147 ../../include/widgets.php:79 -#: ../../mod/apps.php:33 -msgid "Apps" -msgstr "Приложения" +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:232 +msgid "We could not contact the GNU social API with the Path you entered." +msgstr "Нам не удалось установить контакт с GNU Social API по введённому вами пути" -#: ../../include/nav.php:147 -msgid "Applications, utilities, links, games" -msgstr "" +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:266 +msgid "GNU social settings updated." +msgstr "Настройки GNU Social обновлены." -#: ../../include/nav.php:149 ../../include/text.php:813 -#: ../../include/text.php:827 ../../include/apps.php:137 -#: ../../mod/search.php:29 -msgid "Search" -msgstr "Поиск" +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:310 +msgid "Globally Available GNU social OAuthKeys" +msgstr "Глобально доступные ключи OAuthKeys GNU Social" -#: ../../include/nav.php:149 -msgid "Search site content" -msgstr "Поиск по содержанию сайту" +#: ../../extend/addon/hzaddons/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 "Существуют предварительно настроенные пары ключей OAuth для некоторых доступных серверов GNU social. Если вы используете один из них, используйте эти учетные данные. <br />Если вы не хотите подключаться к какому-либо другому серверу GNU social (см. ниже)." -#: ../../include/nav.php:152 ../../include/apps.php:131 -#: ../../mod/directory.php:210 -msgid "Directory" -msgstr "Каталог" +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:327 +msgid "Provide your own OAuth Credentials" +msgstr "Предоставьте ваши собственные регистрационные данные OAuth" -#: ../../include/nav.php:152 -msgid "Channel Locator" -msgstr "Локатор каналов" +#: ../../extend/addon/hzaddons/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 "Не найдена пользовательская пара ключей для GNU social. Зарегистрируйте свою учетную запись Hubzilla в качестве настольного клиента в своей учетной записи GNU social, скопируйте cюда пару ключей пользователя и введите корневой каталог базы API. <br />Прежде чем регистрировать свою собственную пару ключей OAuth, спросите администратора, если ли уже пара ключей для этой установки Hubzilla в вашем GNU social." + +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:333 +msgid "OAuth Consumer Key" +msgstr "Ключ клиента OAuth" + +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:337 +msgid "OAuth Consumer Secret" +msgstr "Пароль клиента OAuth" + +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:341 +msgid "Base API Path" +msgstr "Основной путь к API" + +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:341 +msgid "Remember the trailing /" +msgstr "Запомнить закрывающий /" + +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:345 +msgid "GNU social application name" +msgstr "Имя приложения GNU social" + +#: ../../extend/addon/hzaddons/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 "Чтобы подключиться к вашей учетной записи GNU social нажмите кнопку ниже для получения кода безопасности из GNU social, который вы должны скопировать в поле ввода ниже и отправить форму. Только ваши общедоступные сообщения будут опубликованы в GNU social." -#: ../../include/nav.php:163 ../../include/apps.php:123 -msgid "Matrix" -msgstr "Матрица" +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:370 +msgid "Log in with GNU social" +msgstr "Войти с GNU social" -#: ../../include/nav.php:163 -msgid "Your matrix" -msgstr "Собственная матрица" +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:373 +msgid "Copy the security code from GNU social here" +msgstr "Скопируйте код безопасности GNU social здесь" -#: ../../include/nav.php:164 -msgid "Mark all matrix notifications seen" -msgstr "Пометить все оповещения матрицы как прочитанное" +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:383 +msgid "Cancel Connection Process" +msgstr "Отменить процесс подключения" -#: ../../include/nav.php:166 ../../include/apps.php:127 -msgid "Channel Home" -msgstr "Главная канала" +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:385 +msgid "Current GNU social API is" +msgstr "Текущий GNU social API" -#: ../../include/nav.php:166 -msgid "Channel home" -msgstr "Главная канала" +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:389 +msgid "Cancel GNU social Connection" +msgstr "Отменить подключение с GNU social" -#: ../../include/nav.php:167 -msgid "Mark all channel notifications seen" -msgstr "Пометить все оповещения канала как прочитанное" +#: ../../extend/addon/hzaddons/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>Замечание</strong>: Из-за настроек конфиденциальности (<em>скрыть данные своего профиля от неизвестных зрителей?</em>) cсылка, потенциально включенная в общедоступные публикации, переданные в GNU social, приведет посетителя к пустой странице, информирующей его о том, что доступ к вашему профилю был ограничен." -#: ../../include/nav.php:170 ../../mod/connections.php:386 -msgid "Connections" -msgstr "Контакты" +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:411 +msgid "Allow posting to GNU social" +msgstr "Разрешить публиковать в GNU social" -#: ../../include/nav.php:173 -msgid "Notices" -msgstr "Оповещения" +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:411 +msgid "" +"If enabled your public postings can be posted to the associated GNU-social " +"account" +msgstr "Если включено, ваши общедоступные публикации будут опубликованы в связанной учётной записи GNU social" -#: ../../include/nav.php:173 -msgid "Notifications" -msgstr "Оповещения" +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:415 +msgid "Post to GNU social by default" +msgstr "Публиковать в GNU social по умолчанию" -#: ../../include/nav.php:174 -msgid "See all notifications" -msgstr "Просмотреть все оповещения" +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:415 +msgid "" +"If enabled your public postings will be posted to the associated GNU-social " +"account by default" +msgstr "Если включено, ваши общедоступные публикации будут опубликованы в связанной учётной записи GNU social по умолчанию" -#: ../../include/nav.php:175 ../../mod/notifications.php:99 -msgid "Mark all system notifications seen" -msgstr "Пометить все оповещения как прочитанное" +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:432 +msgid "GNU social Post Settings" +msgstr "Настройки публикаций GNU social" -#: ../../include/nav.php:177 ../../include/apps.php:133 -msgid "Mail" -msgstr "Переписка" +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:891 +#: ../../Zotlabs/Module/Admin/Site.php:317 +msgid "Site name" +msgstr "Название сайта" -#: ../../include/nav.php:177 -msgid "Private mail" -msgstr "Ваша личная переписка" +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:892 +msgid "API URL" +msgstr "" -#: ../../include/nav.php:178 -msgid "See all private messages" -msgstr "Просмотреть все личные сообщения" +#: ../../extend/addon/hzaddons/statusnet/statusnet.php:895 +msgid "Application name" +msgstr "Название приложения" -#: ../../include/nav.php:179 -msgid "Mark all private messages seen" -msgstr "Пометить все личные сообщения как прочитанное" +#: ../../extend/addon/hzaddons/rainbowtag/rainbowtag.php:81 +msgid "Enable Rainbowtag" +msgstr "Включить Rainbowtag" -#: ../../include/nav.php:180 -msgid "Inbox" -msgstr "Входящие" +#: ../../extend/addon/hzaddons/rainbowtag/rainbowtag.php:85 +msgid "Rainbowtag Settings" +msgstr "Настройки Rainbowtag" -#: ../../include/nav.php:181 -msgid "Outbox" -msgstr "Исходящие" +#: ../../extend/addon/hzaddons/rainbowtag/rainbowtag.php:101 +msgid "Rainbowtag Settings saved." +msgstr "Настройки Rainbowtag сохранены." -#: ../../include/nav.php:182 ../../include/widgets.php:536 -msgid "New Message" -msgstr "Новое личное сообщение" +#: ../../extend/addon/hzaddons/frphotos/frphotos.php:92 +msgid "Friendica Photo Album Import" +msgstr "Импортировать альбом фотографий Friendica" -#: ../../include/nav.php:185 ../../include/apps.php:130 -#: ../../mod/events.php:377 -msgid "Events" -msgstr "Мероприятия" +#: ../../extend/addon/hzaddons/frphotos/frphotos.php:93 +msgid "This will import all your Friendica photo albums to this Red channel." +msgstr "Это позволит импортировать все ваши альбомы фотографий Friendica в этот канал." -#: ../../include/nav.php:185 -msgid "Event Calendar" -msgstr "Календарь мероприятий" +#: ../../extend/addon/hzaddons/frphotos/frphotos.php:94 +msgid "Friendica Server base URL" +msgstr "Базовый URL сервера Friendica" -#: ../../include/nav.php:186 -msgid "See all events" -msgstr "Показать все мероприятия" +#: ../../extend/addon/hzaddons/frphotos/frphotos.php:95 +msgid "Friendica Login Username" +msgstr "Имя пользователя для входа Friendica" -#: ../../include/nav.php:187 -msgid "Mark all events seen" -msgstr "Пометить все мероприятия как прочитанное" +#: ../../extend/addon/hzaddons/frphotos/frphotos.php:96 +msgid "Friendica Login Password" +msgstr "Пароль для входа Firendica" -#: ../../include/nav.php:189 ../../include/apps.php:122 -msgid "Channel Select" -msgstr "Выбор каналов" +#: ../../extend/addon/hzaddons/piwik/piwik.php:85 +msgid "" +"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> " +"analytics tool." +msgstr "Этот сайт отслеживается с помощью инструментов аналитики <a href='http://www.piwik.org'>Piwik</a>." -#: ../../include/nav.php:189 -msgid "Manage Your Channels" -msgstr "Управление каналов" +#: ../../extend/addon/hzaddons/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 "Если вы не хотите, чтобы ваши визиты регистрировались таким образом, вы <a href='%s'>можете отключить cookie с тем, чтобы Piwik не отслеживал дальнейшие посещения сайта</a>." -#: ../../include/nav.php:191 ../../include/apps.php:124 -#: ../../include/widgets.php:514 ../../mod/admin.php:978 -#: ../../mod/admin.php:1183 -msgid "Settings" -msgstr "Настройки" +#: ../../extend/addon/hzaddons/piwik/piwik.php:96 +msgid "Piwik Base URL" +msgstr "Базовый URL Piwik" -#: ../../include/nav.php:191 -msgid "Account/Channel Settings" -msgstr "Настройки аккаунта/канала" +#: ../../extend/addon/hzaddons/piwik/piwik.php:96 +msgid "" +"Absolute path to your Piwik installation. (without protocol (http/s), with " +"trailing slash)" +msgstr "Абсолютный путь к вашей установке Piwik (без типа протокола, с начальным слэшем)" -#: ../../include/nav.php:199 ../../mod/admin.php:117 -msgid "Admin" -msgstr "Администрация" +#: ../../extend/addon/hzaddons/piwik/piwik.php:97 +msgid "Site ID" +msgstr "ID сайта" -#: ../../include/nav.php:199 -msgid "Site Setup and Configuration" -msgstr "Установка и конфигурация сайта" +#: ../../extend/addon/hzaddons/piwik/piwik.php:98 +msgid "Show opt-out cookie link?" +msgstr "Показывать ссылку на отказ от использования cookies?" -#: ../../include/nav.php:224 -msgid "Nothing new here" -msgstr "Ничего нового здесь" +#: ../../extend/addon/hzaddons/piwik/piwik.php:99 +msgid "Asynchronous tracking" +msgstr "Асинхронное отслеживание" -#: ../../include/nav.php:228 -msgid "Please wait..." -msgstr "Подождите пожалуйста ..." +#: ../../extend/addon/hzaddons/piwik/piwik.php:100 +msgid "Enable frontend JavaScript error tracking" +msgstr "Включить отслеживание ошибок JavaScript на фронтенде." + +#: ../../extend/addon/hzaddons/piwik/piwik.php:100 +msgid "This feature requires Piwik >= 2.2.0" +msgstr "Эта функция требует версию Piwik >= 2.2.0" + +#: ../../extend/addon/hzaddons/redphotos/redphotos.php:106 +msgid "Photos imported" +msgstr "Фотографии импортированы" + +#: ../../extend/addon/hzaddons/redphotos/redphotos.php:129 +msgid "Redmatrix Photo Album Import" +msgstr "Импортировать альбом фотографий Redmatrix" -#: ../../include/bookmarks.php:42 +#: ../../extend/addon/hzaddons/redphotos/redphotos.php:130 +msgid "This will import all your Redmatrix photo albums to this channel." +msgstr "Это позволит импортировать все ваши альбомы фотографий Redmatrix в этот канал." + +#: ../../extend/addon/hzaddons/redphotos/redphotos.php:134 +msgid "Import just this album" +msgstr "Импортировать только этот альбом" + +#: ../../extend/addon/hzaddons/redphotos/redphotos.php:134 +msgid "Leave blank to import all albums" +msgstr "Оставьте пустым для импорта всех альбомов" + +#: ../../extend/addon/hzaddons/redphotos/redphotos.php:135 +msgid "Maximum count to import" +msgstr "Максимальное количество для импорта" + +#: ../../extend/addon/hzaddons/redphotos/redphotos.php:135 +msgid "0 or blank to import all available" +msgstr "0 или пусто для импорта всех доступных" + +#: ../../extend/addon/hzaddons/opensearch/opensearch.php:26 #, php-format -msgid "%1$s's bookmarks" -msgstr "Закладки пользователя %1$s" +msgctxt "opensearch" +msgid "Search %1$s (%2$s)" +msgstr "Искать %1$s (%2$s)" -#: ../../include/chat.php:10 -msgid "Missing room name" +#: ../../extend/addon/hzaddons/opensearch/opensearch.php:28 +msgctxt "opensearch" +msgid "$Projectname" msgstr "" -#: ../../include/chat.php:19 -msgid "Duplicate room name" +#: ../../extend/addon/hzaddons/opensearch/opensearch.php:42 +#: ../../Zotlabs/Lib/Enotify.php:66 ../../Zotlabs/Module/Home.php:74 +#: ../../Zotlabs/Module/Home.php:82 +msgid "$Projectname" msgstr "" -#: ../../include/chat.php:68 ../../include/chat.php:76 -msgid "Invalid room specifier." -msgstr "" +#: ../../extend/addon/hzaddons/opensearch/opensearch.php:43 +msgid "Search $Projectname" +msgstr "Поиск $Projectname" -#: ../../include/chat.php:105 -msgid "Room not found." +#: ../../extend/addon/hzaddons/visage/visage.php:93 +msgid "Recent Channel/Profile Viewers" +msgstr "Последние просмотры канала / профиля" + +#: ../../extend/addon/hzaddons/visage/visage.php:98 +msgid "This plugin/addon has not been configured." +msgstr "Это расширение не было настроено." + +#: ../../extend/addon/hzaddons/visage/visage.php:99 +#, php-format +msgid "Please visit the Visage settings on %s" +msgstr "Пожалуйста, посетите настройки Visage на %s" + +#: ../../extend/addon/hzaddons/visage/visage.php:99 +msgid "your feature settings page" +msgstr "страница ваших установочных параметров" + +#: ../../extend/addon/hzaddons/visage/visage.php:112 +msgid "No entries." +msgstr "Нет записей." + +#: ../../extend/addon/hzaddons/visage/visage.php:166 +msgid "Enable Visage Visitor Logging" +msgstr "Включить журналирование посетителей Visage" + +#: ../../extend/addon/hzaddons/visage/visage.php:170 +msgid "Visage Settings" +msgstr "Настройки Visage" + +#: ../../extend/addon/hzaddons/cart/manual_payments.php:7 +msgid "Error: order mismatch. Please try again." +msgstr "Ошибка: несоответствие заказа. Пожалуйста, попробуйте ещё раз" + +#: ../../extend/addon/hzaddons/cart/manual_payments.php:30 +msgid "Manual payments are not enabled." +msgstr "Ручные платежи не подключены." + +#: ../../extend/addon/hzaddons/cart/manual_payments.php:37 +#: ../../extend/addon/hzaddons/cart/cart.php:1442 +#: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:417 +msgid "Order not found." +msgstr "Заказ не найден." + +#: ../../extend/addon/hzaddons/cart/manual_payments.php:46 +msgid "Finished" +msgstr "Завершено" + +#: ../../extend/addon/hzaddons/cart/manual_payments.php:62 +#: ../../extend/addon/hzaddons/cart/cart.php:1420 +#: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:481 +#: ../../extend/addon/hzaddons/cart/myshop.php:51 +#: ../../Zotlabs/Module/Wiki.php:68 +msgid "Invalid channel" +msgstr "Недействительный канал" + +#: ../../extend/addon/hzaddons/cart/cart.php:467 +msgid "[cart] Item Added" +msgstr "[cart] Элемент добавлен" + +#: ../../extend/addon/hzaddons/cart/cart.php:851 +msgid "Order already checked out." +msgstr "Заказ уже проверен." + +#: ../../extend/addon/hzaddons/cart/cart.php:1204 +msgid "Enable Shopping Cart" +msgstr "Включить корзину" + +#: ../../extend/addon/hzaddons/cart/cart.php:1211 +msgid "Enable Test Catalog" +msgstr "Включить тестовый каталог" + +#: ../../extend/addon/hzaddons/cart/cart.php:1219 +msgid "Enable Manual Payments" +msgstr "Включить ручные платежи" + +#: ../../extend/addon/hzaddons/cart/cart.php:1238 +msgid "Base Merchant Currency" +msgstr "Основная торговая валюта" + +#: ../../extend/addon/hzaddons/cart/cart.php:1250 +msgid "Cart - Base Settings" +msgstr "Корзина - Основные настройки" + +#: ../../extend/addon/hzaddons/cart/cart.php:1271 +#: ../../extend/addon/hzaddons/cart/cart.php:1274 +msgid "Shop" +msgstr "Магазин" + +#: ../../extend/addon/hzaddons/cart/cart.php:1293 +#: ../../Zotlabs/Module/Wiki.php:30 +msgid "Profile Unavailable." +msgstr "Профиль недоступен." + +#: ../../extend/addon/hzaddons/cart/cart.php:1324 +#: ../../extend/addon/hzaddons/cart/myshop.php:125 +msgid "Order Not Found" +msgstr "Заказ не найден" + +#: ../../extend/addon/hzaddons/cart/cart.php:1401 +msgid "You must be logged into the Grid to shop." +msgstr "Вы должны быть в сети для доступа к магазину" + +#: ../../extend/addon/hzaddons/cart/cart.php:1411 +msgid "Cart Not Enabled (profile: " +msgstr "Корзина не подключена (профиль:" + +#: ../../extend/addon/hzaddons/cart/cart.php:1451 +msgid "Access denied." +msgstr "Доступ запрещён." + +#: ../../extend/addon/hzaddons/cart/cart.php:1503 +#: ../../extend/addon/hzaddons/cart/cart.php:1647 +msgid "No Order Found" +msgstr "Нет найденных заказов" + +#: ../../extend/addon/hzaddons/cart/cart.php:1512 +msgid "An unknown error has occurred Please start again." +msgstr "Произошла неизвестная ошибка. Пожалуйста, начните снова." + +#: ../../extend/addon/hzaddons/cart/cart.php:1680 +msgid "Invalid Payment Type. Please start again." +msgstr "Недействительный тип платежа. Пожалуйста, начните снова." + +#: ../../extend/addon/hzaddons/cart/cart.php:1687 +msgid "Order not found" +msgstr "Заказ не найден" + +#: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:97 +msgid "Enable Paypal Button Module" +msgstr "Включить модуль кнопки Paypal" + +#: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:102 +msgid "Use Production Key" +msgstr "Использовать ключ Production" + +#: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:109 +msgid "Paypal Sandbox Client Key" +msgstr "Ключ клиента Paypal Sandbox" + +#: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:116 +msgid "Paypal Sandbox Secret Key" +msgstr "Секретный ключ Paypal Sandbox" + +#: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:122 +msgid "Paypal Production Client Key" +msgstr "Ключ клиента Paypal Production" + +#: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:129 +msgid "Paypal Production Secret Key" +msgstr "Секретный ключ Paypal Production" + +#: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:143 +msgid "Cart - Paypal Addon" +msgstr "Корзина - Paypal плагин" + +#: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:277 +msgid "Paypal button payments are not enabled." +msgstr "Кнопка Paypal для платежей не включена." + +#: ../../extend/addon/hzaddons/cart/submodules/paypalbutton.php:295 +msgid "" +"Paypal button payments are not properly configured. Please choose another " +"payment option." +msgstr "Кнопка Paypal для платежей настроена неправильно. Пожалуйста, используйте другой вариант оплаты." + +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:71 +msgid "Enable Hubzilla Services Module" +msgstr "Включить модуль сервиса Hubzilla" + +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:77 +msgid "Cart - Hubzilla Services Addon" +msgstr "Корзина - плагин сервиса Hubzilla" + +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:169 +msgid "New Sku" +msgstr "Новый код" + +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:204 +msgid "Cannot save edits to locked item." +msgstr "Невозможно сохранить изменения заблокированной позиции." + +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:252 +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:339 +msgid "SKU not found." +msgstr "Код не найден." + +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:305 +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:309 +msgid "Invalid Activation Directive." +msgstr "Недействительная директива активации." + +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:380 +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:384 +msgid "Invalid Deactivation Directive." +msgstr "Недействительная директива деактивации" + +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:570 +msgid "Add to this privacy group" +msgstr "Добавить в эту группу безопасности" + +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:586 +msgid "Set user service class" +msgstr "Установить класс обслуживания пользователя" + +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:613 +msgid "You must be using a local account to purchase this service." +msgstr "Вы должны использовать локальную учётноую запись для покупки этого сервиса." + +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:651 +msgid "Changes Locked" +msgstr "Изменения заблокированы" + +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:655 +msgid "Item available for purchase." +msgstr "Позиция доступна для приобретения." + +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:662 +msgid "Price" +msgstr "Цена" + +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:665 +msgid "Add buyer to privacy group" +msgstr "Добавить покупателя в группу безопасности" + +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:670 +msgid "Add buyer as connection" +msgstr "Добавить покупателя как контакт" + +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:677 +#: ../../extend/addon/hzaddons/cart/submodules/hzservices.php:718 +msgid "Set Service Class" +msgstr "Установить класс обслуживания" + +#: ../../extend/addon/hzaddons/cart/myshop.php:44 +msgid "Access Denied." +msgstr "Доступ запрещён." + +#: ../../extend/addon/hzaddons/cart/myshop.php:155 +#: ../../extend/addon/hzaddons/cart/myshop.php:191 +#: ../../extend/addon/hzaddons/cart/myshop.php:225 +#: ../../extend/addon/hzaddons/cart/myshop.php:273 +#: ../../extend/addon/hzaddons/cart/myshop.php:308 +#: ../../extend/addon/hzaddons/cart/myshop.php:331 +msgid "Access Denied" +msgstr "Доступ запрещён" + +#: ../../extend/addon/hzaddons/cart/myshop.php:200 +#: ../../extend/addon/hzaddons/cart/myshop.php:234 +#: ../../extend/addon/hzaddons/cart/myshop.php:283 +#: ../../extend/addon/hzaddons/cart/myshop.php:341 +msgid "Invalid Item" +msgstr "Недействительный элемент" + +#: ../../extend/addon/hzaddons/nsabait/nsabait.php:125 +msgid "Nsabait Settings updated." +msgstr "Настройки Nsabait обновлены" + +#: ../../extend/addon/hzaddons/nsabait/nsabait.php:157 +msgid "Enable NSAbait Plugin" +msgstr "Включить плагин NSAbait" + +#: ../../extend/addon/hzaddons/nsabait/nsabait.php:161 +msgid "NSAbait Settings" +msgstr "Настройки Nsabait" + +#: ../../extend/addon/hzaddons/hzfiles/hzfiles.php:79 +msgid "Hubzilla File Storage Import" +msgstr "Импорт файлового хранилища Hubzilla" + +#: ../../extend/addon/hzaddons/hzfiles/hzfiles.php:80 +msgid "This will import all your cloud files from another server." +msgstr "Это позволит импортировать все ваши файлы с другого сервера." + +#: ../../extend/addon/hzaddons/hzfiles/hzfiles.php:81 +msgid "Hubzilla Server base URL" +msgstr "Базовый URL сервера Hubzilla" + +#: ../../extend/addon/hzaddons/hzfiles/hzfiles.php:82 +msgid "Since modified date yyyy-mm-dd" +msgstr "Начиная с даты изменений yyyy-mm-dd" + +#: ../../extend/addon/hzaddons/hzfiles/hzfiles.php:83 +msgid "Until modified date yyyy-mm-dd" +msgstr "Заканчивая датой изменений yyyy-mm-dd" + +#: ../../extend/addon/hzaddons/nofed/nofed.php:42 +msgid "Federate" +msgstr "" + +#: ../../extend/addon/hzaddons/nofed/nofed.php:56 +msgid "nofed Settings saved." +msgstr "Настройки nofed сохранены." + +#: ../../extend/addon/hzaddons/nofed/nofed.php:72 +msgid "Allow Federation Toggle" +msgstr "Разрешить переключение федерации" + +#: ../../extend/addon/hzaddons/nofed/nofed.php:76 +msgid "Federate posts by default" +msgstr "Разрешить федерацию публикаций по умолчанию" + +#: ../../extend/addon/hzaddons/nofed/nofed.php:80 +msgid "NoFed Settings" +msgstr "Настройки NoFed" + +#: ../../extend/addon/hzaddons/gravatar/gravatar.php:123 +msgid "generic profile image" +msgstr "Стандартное изображение профиля" + +#: ../../extend/addon/hzaddons/gravatar/gravatar.php:124 +msgid "random geometric pattern" +msgstr "Случайный геометрический рисунок" + +#: ../../extend/addon/hzaddons/gravatar/gravatar.php:125 +msgid "monster face" +msgstr "Лицо чудовища" + +#: ../../extend/addon/hzaddons/gravatar/gravatar.php:126 +msgid "computer generated face" +msgstr "Сгенерированное компьютером лицо" + +#: ../../extend/addon/hzaddons/gravatar/gravatar.php:127 +msgid "retro arcade style face" +msgstr "Лицо в стиле старой аркадной игры" + +#: ../../extend/addon/hzaddons/gravatar/gravatar.php:128 +msgid "Hub default profile photo" +msgstr "Фотография профиля по умолчанию" + +#: ../../extend/addon/hzaddons/gravatar/gravatar.php:143 +msgid "Information" +msgstr "Информация" + +#: ../../extend/addon/hzaddons/gravatar/gravatar.php:143 +msgid "" +"Libravatar addon is installed, too. Please disable Libravatar addon or this " +"Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if " +"nothing was found at Libravatar." +msgstr "Плагин Libravatar также установлен. Пожалуйста, отключите плагин Libravatar или этот плагин Gravatar. Если Плагин Libravatar ничего не найдёт, он вернётся в Gravatar." + +#: ../../extend/addon/hzaddons/gravatar/gravatar.php:151 +msgid "Default avatar image" +msgstr "Изображение аватара по умолчанию" + +#: ../../extend/addon/hzaddons/gravatar/gravatar.php:151 +msgid "Select default avatar image if none was found at Gravatar. See README" +msgstr "Выберите изображения аватар по умолчанию если ничего не было найдено в Gravatar (см. README)." + +#: ../../extend/addon/hzaddons/gravatar/gravatar.php:152 +msgid "Rating of images" +msgstr "Оценки изображений" + +#: ../../extend/addon/hzaddons/gravatar/gravatar.php:152 +msgid "Select the appropriate avatar rating for your site. See README" +msgstr "Выберите подходящую оценку аватара для вашего сайта (см. README)." + +#: ../../extend/addon/hzaddons/gravatar/gravatar.php:165 +msgid "Gravatar settings updated." +msgstr "Настройки Gravatar обновлены." + +#: ../../extend/addon/hzaddons/redred/redred.php:45 +msgid "Post to Red" +msgstr "Опубликовать в Red" + +#: ../../extend/addon/hzaddons/redred/redred.php:60 +msgid "Channel is required." +msgstr "Необходим канал." + +#: ../../extend/addon/hzaddons/redred/redred.php:65 +#: ../../Zotlabs/Module/Network.php:304 +msgid "Invalid channel." +msgstr "Недействительный канал." + +#: ../../extend/addon/hzaddons/redred/redred.php:76 +msgid "redred Settings saved." +msgstr "Настройки RedRed сохранены." + +#: ../../extend/addon/hzaddons/redred/redred.php:95 +msgid "Allow posting to another Hubzilla Channel" +msgstr "Разрешить публиковать в другой канал Hubzilla" + +#: ../../extend/addon/hzaddons/redred/redred.php:99 +msgid "Send public postings to Hubzilla channel by default" +msgstr "Отправлять общедоступные публикации в канал Hubzilla по умолчанию" + +#: ../../extend/addon/hzaddons/redred/redred.php:103 +msgid "Hubzilla API Path" +msgstr "Путь к Hubzilla API" + +#: ../../extend/addon/hzaddons/redred/redred.php:107 +msgid "Hubzilla login name" +msgstr "Имя входа Hubzilla" + +#: ../../extend/addon/hzaddons/redred/redred.php:111 +msgid "Hubzilla channel name" +msgstr "Название канала Hubzilla" + +#: ../../extend/addon/hzaddons/redred/redred.php:119 +msgid "Hubzilla Crosspost Settings" +msgstr "Настройки перекрёстных публикаций Hubzilla" + +#: ../../extend/addon/hzaddons/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/chat.php:126 -msgid "Room is full" +#: ../../extend/addon/hzaddons/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/taxonomy.php:210 -msgid "Tags" -msgstr "Тэги" +#: ../../extend/addon/hzaddons/chords/Mod_Chords.php:48 +msgid "" +"Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, " +"E7b13b11 ..." +msgstr "Примеры действительных включают A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..." -#: ../../include/taxonomy.php:227 -msgid "Keywords" -msgstr "Ключевые слова" +#: ../../extend/addon/hzaddons/chords/Mod_Chords.php:51 +msgid "Guitar Chords" +msgstr "Гитарные аккорды" -#: ../../include/taxonomy.php:252 -msgid "have" -msgstr "иметь" +#: ../../extend/addon/hzaddons/chords/Mod_Chords.php:52 +msgid "The complete online chord dictionary" +msgstr "Полный онлайн словарь аккордов" -#: ../../include/taxonomy.php:252 -msgid "has" -msgstr "есть" +#: ../../extend/addon/hzaddons/chords/Mod_Chords.php:57 +msgid "Tuning" +msgstr "Настройка" -#: ../../include/taxonomy.php:253 -msgid "want" -msgstr "хотеть" +#: ../../extend/addon/hzaddons/chords/Mod_Chords.php:58 +msgid "Chord name: example: Em7" +msgstr "Наименование аккорда - example: Em7" -#: ../../include/taxonomy.php:253 -msgid "wants" -msgstr "хочет" +#: ../../extend/addon/hzaddons/chords/Mod_Chords.php:59 +msgid "Show for left handed stringing" +msgstr "Показывать струны для левшей" -#: ../../include/taxonomy.php:254 ../../include/ItemObject.php:208 -msgid "like" -msgstr "нравится" +#: ../../extend/addon/hzaddons/chords/chords.php:33 +msgid "Quick Reference" +msgstr "Быстрая ссылка" -#: ../../include/taxonomy.php:254 -msgid "likes" -msgstr "нравится" +#: ../../extend/addon/hzaddons/notifyadmin/notifyadmin.php:34 +msgid "New registration" +msgstr "Новая регистрация" -#: ../../include/taxonomy.php:255 ../../include/ItemObject.php:209 -msgid "dislike" -msgstr "не-нравится" +#: ../../extend/addon/hzaddons/notifyadmin/notifyadmin.php:40 +#: ../../Zotlabs/Module/Invite.php:82 +#, php-format +msgid "%s : Message delivery failed." +msgstr "%s : Доставка сообщения не удалась." -#: ../../include/taxonomy.php:255 -msgid "dislikes" -msgstr "не-нравится" +#: ../../extend/addon/hzaddons/notifyadmin/notifyadmin.php:42 +#, php-format +msgid "Message sent to %s. New account registration: %s" +msgstr "Сообщение отправлено в %s. Регистрация нового аккаунта: %s" -#: ../../include/taxonomy.php:338 ../../include/identity.php:968 -#: ../../include/ItemObject.php:134 -msgctxt "noun" -msgid "Like" -msgid_plural "Likes" -msgstr[0] "нравится" -msgstr[1] "нравится" -msgstr[2] "нравится" +#: ../../extend/addon/hzaddons/irc/irc.php:45 +msgid "Channels to auto connect" +msgstr "Каналы для автоматического подключения" -#: ../../include/comanche.php:35 ../../view/theme/apw/php/config.php:185 -#: ../../view/theme/redbasic/php/config.php:84 -msgid "Default" -msgstr "По умолчанию" +#: ../../extend/addon/hzaddons/irc/irc.php:45 +#: ../../extend/addon/hzaddons/irc/irc.php:49 +msgid "Comma separated list" +msgstr "Список, разделённый запятыми" + +#: ../../extend/addon/hzaddons/irc/irc.php:49 +#: ../../extend/addon/hzaddons/irc/irc.php:96 +msgid "Popular Channels" +msgstr "Популярные каналы" + +#: ../../extend/addon/hzaddons/irc/irc.php:53 +msgid "IRC Settings" +msgstr "Настройки IRC" + +#: ../../extend/addon/hzaddons/irc/irc.php:69 +msgid "IRC settings saved." +msgstr "Настройки IRC сохранены" + +#: ../../extend/addon/hzaddons/irc/irc.php:74 +msgid "IRC Chatroom" +msgstr "Чат IRC" + +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:19 +msgid "bitchslap" +msgstr "дать леща" -#: ../../include/contact_selectors.php:30 -msgid "Unknown | Not categorised" -msgstr "Неизвестные | Без категории" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:19 +msgid "bitchslapped" +msgstr "получил леща" -#: ../../include/contact_selectors.php:31 -msgid "Block immediately" -msgstr "Немедленно заблокировать" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:20 +msgid "shag" +msgstr "вздрючить" -#: ../../include/contact_selectors.php:32 -msgid "Shady, spammer, self-marketer" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:20 +msgid "shagged" +msgstr "вздрюченный" + +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:21 +msgid "patent" msgstr "" -#: ../../include/contact_selectors.php:33 -msgid "Known to me, but no opinion" -msgstr "Известныo мне, но нет своего мнения" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:21 +msgid "patented" +msgstr "" -#: ../../include/contact_selectors.php:34 -msgid "OK, probably harmless" -msgstr "OK, наверное безвредно" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:22 +msgid "hug" +msgstr "обнять" -#: ../../include/contact_selectors.php:35 -msgid "Reputable, has my trust" -msgstr "Авторитетно, имеет мое доверие" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:22 +msgid "hugged" +msgstr "обнятый" -#: ../../include/contact_selectors.php:54 -msgid "Frequently" -msgstr "Часто" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:23 +msgid "murder" +msgstr "убить" -#: ../../include/contact_selectors.php:55 -msgid "Hourly" -msgstr "Ежечасно" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:23 +msgid "murdered" +msgstr "убитый" -#: ../../include/contact_selectors.php:56 -msgid "Twice daily" -msgstr "Два раза в день" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:24 +msgid "worship" +msgstr "почитать" -#: ../../include/contact_selectors.php:57 -msgid "Daily" -msgstr "Ежедневно" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:24 +msgid "worshipped" +msgstr "почитаемый" -#: ../../include/contact_selectors.php:58 -msgid "Weekly" -msgstr "Еженедельно" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:25 +msgid "kiss" +msgstr "целовать" -#: ../../include/contact_selectors.php:59 -msgid "Monthly" -msgstr "Ежемесячно" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:25 +msgid "kissed" +msgstr "поцелованный" -#: ../../include/contact_selectors.php:74 -msgid "Friendica" -msgstr "Friendica" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:26 +msgid "tempt" +msgstr "искушать" -#: ../../include/contact_selectors.php:75 -msgid "OStatus" -msgstr "OStatus" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:26 +msgid "tempted" +msgstr "искушённый" -#: ../../include/contact_selectors.php:76 -msgid "RSS/Atom" -msgstr "RSS/Atom" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:27 +msgid "raise eyebrows at" +msgstr "поднять брови" -#: ../../include/contact_selectors.php:77 ../../mod/admin.php:754 -#: ../../mod/admin.php:763 ../../boot.php:1467 -msgid "Email" -msgstr "E-mail" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:27 +msgid "raised their eyebrows at" +msgstr "поднял брови" -#: ../../include/contact_selectors.php:78 -msgid "Diaspora" -msgstr "Diaspora" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:28 +msgid "insult" +msgstr "оскорбить" -#: ../../include/contact_selectors.php:79 -msgid "Facebook" -msgstr "Facebook" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:28 +msgid "insulted" +msgstr "оскорблённый" -#: ../../include/contact_selectors.php:80 -msgid "Zot!" -msgstr "Zot!" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:29 +msgid "praise" +msgstr "хвалить" -#: ../../include/contact_selectors.php:81 -msgid "LinkedIn" -msgstr "LinkedIn" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:29 +msgid "praised" +msgstr "похваленный" -#: ../../include/contact_selectors.php:82 -msgid "XMPP/IM" -msgstr "XMPP/IM" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:30 +msgid "be dubious of" +msgstr "усомниться" -#: ../../include/contact_selectors.php:83 -msgid "MySpace" -msgstr "MySpace" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:30 +msgid "was dubious of" +msgstr "усомнился" -#: ../../include/contact_widgets.php:14 -#, php-format -msgid "%d invitation available" -msgid_plural "%d invitations available" -msgstr[0] "имеется %d приглашение" -msgstr[1] "имеются %d приглашения" -msgstr[2] "имеется %d приглашений" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:31 +msgid "eat" +msgstr "есть" -#: ../../include/contact_widgets.php:19 ../../mod/admin.php:446 -msgid "Advanced" -msgstr "Дополнительно" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:31 +msgid "ate" +msgstr "съел" -#: ../../include/contact_widgets.php:22 -msgid "Find Channels" -msgstr "Поиск контактов" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:32 +msgid "giggle and fawn at" +msgstr "" -#: ../../include/contact_widgets.php:23 -msgid "Enter name or interest" -msgstr "Впишите имя или интерес" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:32 +msgid "giggled and fawned at" +msgstr "" -#: ../../include/contact_widgets.php:24 -msgid "Connect/Follow" -msgstr "Подключить/следовать" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:33 +msgid "doubt" +msgstr "сомневаться" -#: ../../include/contact_widgets.php:25 -msgid "Examples: Robert Morgenstein, Fishing" -msgstr "Примеры: Владимир Ильич, Революционер" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:33 +msgid "doubted" +msgstr "сомневался" -#: ../../include/contact_widgets.php:26 ../../mod/connections.php:392 -#: ../../mod/directory.php:206 ../../mod/directory.php:211 -msgid "Find" -msgstr "Поиск" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:34 +msgid "glare" +msgstr "" -#: ../../include/contact_widgets.php:27 ../../mod/suggest.php:59 -msgid "Channel Suggestions" -msgstr "Рекомендации каналов" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:34 +msgid "glared at" +msgstr "" -#: ../../include/contact_widgets.php:29 -msgid "Random Profile" -msgstr "Случайные" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:35 +msgid "fuck" +msgstr "трахнуть" -#: ../../include/contact_widgets.php:30 -msgid "Invite Friends" -msgstr "Пригласить друзей" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:35 +msgid "fucked" +msgstr "трахнул" -#: ../../include/contact_widgets.php:32 -msgid "Exammple: name=fred and country=iceland" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:36 +msgid "bonk" msgstr "" -#: ../../include/contact_widgets.php:33 -msgid "Advanced Find" -msgstr "Расширенный поиск" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:36 +msgid "bonked" +msgstr "" -#: ../../include/contact_widgets.php:58 ../../include/features.php:66 -#: ../../include/widgets.php:296 -msgid "Saved Folders" -msgstr "Запомненные папки" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:37 +msgid "declare undying love for" +msgstr "признаться в любви к" -#: ../../include/contact_widgets.php:61 ../../include/contact_widgets.php:95 -#: ../../include/widgets.php:299 -msgid "Everything" -msgstr "Все" +#: ../../extend/addon/hzaddons/morepokes/morepokes.php:37 +msgid "declared undying love for" +msgstr "признался в любви к" -#: ../../include/contact_widgets.php:92 ../../include/widgets.php:29 -msgid "Categories" -msgstr "Категории" +#: ../../extend/addon/hzaddons/wppost/wppost.php:45 +msgid "Post to WordPress" +msgstr "Опубликовать в WordPress" -#: ../../include/contact_widgets.php:125 -#, php-format -msgid "%d connection in common" -msgid_plural "%d connections in common" -msgstr[0] "%d совместный контакт" -msgstr[1] "%d совместных контакта" -msgstr[2] "%d совместных контактов" +#: ../../extend/addon/hzaddons/wppost/wppost.php:82 +msgid "Enable WordPress Post Plugin" +msgstr "Включить плагин публикаций WordPress" -#: ../../include/contact_widgets.php:130 -msgid "show more" -msgstr "показать все" +#: ../../extend/addon/hzaddons/wppost/wppost.php:86 +msgid "WordPress username" +msgstr "Имя пользователя WordPress" -#: ../../include/event.php:326 -msgid "This event has been added to your calendar." -msgstr "Это событие было добавлено в календарь." +#: ../../extend/addon/hzaddons/wppost/wppost.php:90 +msgid "WordPress password" +msgstr "Пароль WordPress" -#: ../../include/datetime.php:43 ../../include/datetime.php:45 -msgid "Miscellaneous" -msgstr "Прочее" +#: ../../extend/addon/hzaddons/wppost/wppost.php:94 +msgid "WordPress API URL" +msgstr "URL API WordPress" -#: ../../include/datetime.php:152 ../../include/datetime.php:284 -msgid "year" -msgstr "год" +#: ../../extend/addon/hzaddons/wppost/wppost.php:95 +msgid "Typically https://your-blog.tld/xmlrpc.php" +msgstr "Обычно https://your-blog.tld/xmlrpc.php" -#: ../../include/datetime.php:157 ../../include/datetime.php:285 -msgid "month" -msgstr "месяц" +#: ../../extend/addon/hzaddons/wppost/wppost.php:98 +msgid "WordPress blogid" +msgstr "" -#: ../../include/datetime.php:162 ../../include/datetime.php:287 -msgid "day" -msgstr "день" +#: ../../extend/addon/hzaddons/wppost/wppost.php:99 +msgid "For multi-user sites such as wordpress.com, otherwise leave blank" +msgstr "Для многопользовательских сайтов, таких, как wordpress.com. В противном случае оставьте пустым" -#: ../../include/datetime.php:275 -msgid "never" -msgstr "никогда" +#: ../../extend/addon/hzaddons/wppost/wppost.php:105 +msgid "Post to WordPress by default" +msgstr "Публиковать в WordPress по умолчанию" -#: ../../include/datetime.php:281 -msgid "less than a second ago" -msgstr "менее чем одну секунду назад" +#: ../../extend/addon/hzaddons/wppost/wppost.php:109 +msgid "Forward comments (requires hubzilla_wp plugin)" +msgstr "Пересылать комментарии (требуется плагин hubzilla_wp)" -#: ../../include/datetime.php:284 -msgid "years" -msgstr "лет" +#: ../../extend/addon/hzaddons/wppost/wppost.php:113 +msgid "WordPress Post Settings" +msgstr "Настройки публикации в WordPress" -#: ../../include/datetime.php:285 -msgid "months" -msgstr "мес." +#: ../../extend/addon/hzaddons/wppost/wppost.php:129 +msgid "Wordpress Settings saved." +msgstr "Настройки WordPress сохранены." -#: ../../include/datetime.php:286 -msgid "week" -msgstr "неделя" +#: ../../extend/addon/hzaddons/wholikesme/wholikesme.php:29 +msgid "Who likes me?" +msgstr "Кому я нравлюсь?" -#: ../../include/datetime.php:286 -msgid "weeks" -msgstr "недель" +#: ../../extend/addon/hzaddons/testdrive/testdrive.php:104 +#, php-format +msgid "Your account on %s will expire in a few days." +msgstr "Ваш аккаунт на %s перестанет работать через несколько дней." -#: ../../include/datetime.php:287 -msgid "days" -msgstr "дней" +#: ../../extend/addon/hzaddons/testdrive/testdrive.php:105 +msgid "Your $Productname test account is about to expire." +msgstr "Срок действия пробного аккаунта в $Productname близок к окончанию." -#: ../../include/datetime.php:288 -msgid "hour" -msgstr "час" +#: ../../boot.php:1595 +msgid "Create an account to access services and applications" +msgstr "Создайте аккаунт для доступа к службам и приложениям" -#: ../../include/datetime.php:288 -msgid "hours" -msgstr "часов" +#: ../../boot.php:1596 ../../include/nav.php:158 +#: ../../Zotlabs/Module/Register.php:294 +msgid "Register" +msgstr "Регистрация" -#: ../../include/datetime.php:289 -msgid "minute" -msgstr "минута" +#: ../../boot.php:1615 ../../include/nav.php:105 ../../include/nav.php:134 +#: ../../include/nav.php:153 +msgid "Logout" +msgstr "Выход" -#: ../../include/datetime.php:289 -msgid "minutes" -msgstr "мин." +#: ../../boot.php:1616 ../../include/nav.php:120 ../../include/nav.php:124 +#: ../../Zotlabs/Lib/Apps.php:301 +msgid "Login" +msgstr "Войти" -#: ../../include/datetime.php:290 -msgid "second" -msgstr "секунда" +#: ../../boot.php:1617 ../../include/channel.php:2334 +#: ../../Zotlabs/Module/Rmagic.php:75 +msgid "Remote Authentication" +msgstr "Удаленная аутентификация" -#: ../../include/datetime.php:290 -msgid "seconds" -msgstr "секунд" +#: ../../boot.php:1619 +msgid "Login/Email" +msgstr "Пользователь / email" -#: ../../include/datetime.php:299 -#, php-format -msgid "%1$d %2$s ago" -msgstr "%1$d %2$s назад" +#: ../../boot.php:1620 +msgid "Password" +msgstr "Пароль" + +#: ../../boot.php:1621 +msgid "Remember me" +msgstr "Запомнить меня" -#: ../../include/datetime.php:504 +#: ../../boot.php:1624 +msgid "Forgot your password?" +msgstr "Забыли пароль или логин?" + +#: ../../boot.php:1625 ../../Zotlabs/Module/Lostpass.php:91 +msgid "Password Reset" +msgstr "Сбросить пароль" + +#: ../../boot.php:2408 #, php-format -msgid "%1$s's birthday" -msgstr "%1$s's День Рождения" +msgid "[$Projectname] Website SSL error for %s" +msgstr "[$Projectname] Ошибка SSL/TLS веб-сайта для %s" -#: ../../include/datetime.php:505 +#: ../../boot.php:2413 +msgid "Website SSL certificate is not valid. Please correct." +msgstr "SSL/TLS сертификат веб-сайт недействителен. Исправьте это." + +#: ../../boot.php:2529 #, php-format -msgid "Happy Birthday %1$s" -msgstr "С Днем Рождения %1$s" +msgid "[$Projectname] Cron tasks not running on %s" +msgstr "[$Projectname] Задания Cron не запущены на %s" -#: ../../include/dir_fns.php:36 -msgid "Sort Options" -msgstr "Параметры сортировки" +#: ../../boot.php:2534 +msgid "Cron/Scheduled tasks not running." +msgstr "Задания Cron / планировщика не запущены." -#: ../../include/dir_fns.php:37 -msgid "Alphabetic" -msgstr "По алфавиту" +#: ../../boot.php:2535 ../../include/datetime.php:238 +msgid "never" +msgstr "никогд" -#: ../../include/dir_fns.php:38 -msgid "Reverse Alphabetic" -msgstr "По обратному алфавиту" +#: ../../view/theme/redbasic/php/config.php:15 ../../include/text.php:3078 +#: ../../Zotlabs/Module/Admin/Site.php:198 +msgid "Default" +msgstr "По умолчанию" -#: ../../include/dir_fns.php:39 -msgid "Newest to Oldest" -msgstr "От новых к старым" +#: ../../view/theme/redbasic/php/config.php:16 +#: ../../view/theme/redbasic/php/config.php:19 +msgid "Focus (Hubzilla default)" +msgstr "Фокус (по умолчанию Hubzilla)" -#: ../../include/dir_fns.php:51 -msgid "Enable Safe Search" -msgstr "" +#: ../../view/theme/redbasic/php/config.php:97 +msgid "Theme settings" +msgstr "Настройки темы" -#: ../../include/dir_fns.php:53 -msgid "Disable Safe Search" -msgstr "" +#: ../../view/theme/redbasic/php/config.php:98 +msgid "Narrow navbar" +msgstr "Узкая панель навигации" -#: ../../include/dir_fns.php:55 -msgid "Safe Mode" -msgstr "Безопасный режим" +#: ../../view/theme/redbasic/php/config.php:99 +msgid "Navigation bar background color" +msgstr "Панель навигации, цвет фона" -#: ../../include/enotify.php:41 -msgid "Hubzilla Notification" -msgstr "Оповещения Red матрицы" +#: ../../view/theme/redbasic/php/config.php:100 +msgid "Navigation bar icon color " +msgstr "Панель навигации, цвет значков" -#: ../../include/enotify.php:42 -msgid "hubzilla" -msgstr "hubzilla" +#: ../../view/theme/redbasic/php/config.php:101 +msgid "Navigation bar active icon color " +msgstr "Панель навигации, цвет активного значка" -#: ../../include/enotify.php:44 -msgid "Thank You," -msgstr "Спасибо," +#: ../../view/theme/redbasic/php/config.php:102 +msgid "Link color" +msgstr "цвет ссылок" -#: ../../include/enotify.php:46 -#, php-format -msgid "%s Administrator" -msgstr "%s администратор" +#: ../../view/theme/redbasic/php/config.php:103 +msgid "Set font-color for banner" +msgstr "Цвет текста в шапке" -#: ../../include/enotify.php:81 -#, php-format -msgid "%s <!item_type!>" -msgstr "%s <!item_type!>" +#: ../../view/theme/redbasic/php/config.php:104 +msgid "Set the background color" +msgstr "Цвет фона" -#: ../../include/enotify.php:85 -#, php-format -msgid "[Red:Notify] New mail received at %s" -msgstr "[Red:Уведомление] Получено новое сообщение в %s" +#: ../../view/theme/redbasic/php/config.php:105 +msgid "Set the background image" +msgstr "Фоновое изображение" + +#: ../../view/theme/redbasic/php/config.php:106 +msgid "Set the background color of items" +msgstr "Цвет фона элементов" + +#: ../../view/theme/redbasic/php/config.php:107 +msgid "Set the background color of comments" +msgstr "Цвет фона комментариев" + +#: ../../view/theme/redbasic/php/config.php:108 +msgid "Set font-size for the entire application" +msgstr "Установить системный размер шрифта" + +#: ../../view/theme/redbasic/php/config.php:108 +msgid "Examples: 1rem, 100%, 16px" +msgstr "Например: 1rem, 100%, 16px" + +#: ../../view/theme/redbasic/php/config.php:109 +msgid "Set font-color for posts and comments" +msgstr "Цвет шрифта для постов и комментариев" -#: ../../include/enotify.php:87 +#: ../../view/theme/redbasic/php/config.php:110 +msgid "Set radius of corners" +msgstr "Радиус скруглений" + +#: ../../view/theme/redbasic/php/config.php:110 +msgid "Example: 4px" +msgstr "Например: 4px" + +#: ../../view/theme/redbasic/php/config.php:111 +msgid "Set shadow depth of photos" +msgstr "Глубина теней фотографий" + +#: ../../view/theme/redbasic/php/config.php:112 +msgid "Set maximum width of content region in pixel" +msgstr "Максимальная ширина содержания региона (в пикселях)" + +#: ../../view/theme/redbasic/php/config.php:112 +msgid "Leave empty for default width" +msgstr "Оставьте пустым для ширины по умолчанию" + +#: ../../view/theme/redbasic/php/config.php:113 +msgid "Set size of conversation author photo" +msgstr "Размер фотографии автора беседы" + +#: ../../view/theme/redbasic/php/config.php:114 +msgid "Set size of followup author photos" +msgstr "Размер фотографий подписчиков" + +#: ../../include/bbcode.php:200 ../../include/bbcode.php:1202 +#: ../../include/bbcode.php:1205 ../../include/bbcode.php:1210 +#: ../../include/bbcode.php:1213 ../../include/bbcode.php:1216 +#: ../../include/bbcode.php:1219 ../../include/bbcode.php:1224 +#: ../../include/bbcode.php:1227 ../../include/bbcode.php:1232 +#: ../../include/bbcode.php:1235 ../../include/bbcode.php:1238 +#: ../../include/bbcode.php:1241 +msgid "Image/photo" +msgstr "Изображение / фотография" + +#: ../../include/bbcode.php:239 ../../include/bbcode.php:1252 +msgid "Encrypted content" +msgstr "Зашифрованное содержание" + +#: ../../include/bbcode.php:255 #, php-format -msgid "%1$s, %2$s sent you a new private message at %3$s." -msgstr "" +msgid "Install %1$s element %2$s" +msgstr "Установить %1$s элемент %2$s" -#: ../../include/enotify.php:88 +#: ../../include/bbcode.php:259 #, php-format -msgid "%1$s sent you %2$s." -msgstr "%1$s послал вам %2$s." +msgid "" +"This post contains an installable %s element, however you lack permissions " +"to install it on this site." +msgstr "Эта публикация содержит устанавливаемый %s элемент, однако у вас нет разрешений для его установки на этом сайте." -#: ../../include/enotify.php:88 -msgid "a private message" -msgstr "личное сообщение" +#: ../../include/bbcode.php:269 ../../Zotlabs/Module/Impel.php:43 +msgid "webpage" +msgstr "веб-страница" -#: ../../include/enotify.php:89 -#, php-format -msgid "Please visit %s to view and/or reply to your private messages." -msgstr "Пожалуйста, посетите %s для просмотра и/или ответа на ваши личные сообщения." +#: ../../include/bbcode.php:272 ../../Zotlabs/Module/Impel.php:53 +msgid "layout" +msgstr "шаблон" + +#: ../../include/bbcode.php:275 ../../Zotlabs/Module/Impel.php:48 +msgid "block" +msgstr "заблокировать" + +#: ../../include/bbcode.php:278 ../../Zotlabs/Module/Impel.php:60 +msgid "menu" +msgstr "меню" + +#: ../../include/bbcode.php:350 +msgid "card" +msgstr "карточка" + +#: ../../include/bbcode.php:352 +msgid "article" +msgstr "статья" + +#: ../../include/bbcode.php:354 ../../include/markdown.php:160 +#: ../../Zotlabs/Module/Tagger.php:77 +msgid "post" +msgstr "публикация" -#: ../../include/enotify.php:144 +#: ../../include/bbcode.php:358 ../../include/markdown.php:158 #, php-format -msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]" -msgstr "" +msgid "%1$s wrote the following %2$s %3$s" +msgstr "%1$s была создана %2$s %3$s" + +#: ../../include/bbcode.php:435 ../../include/bbcode.php:443 +msgid "Click to open/close" +msgstr "Нажмите, чтобы открыть/закрыть" + +#: ../../include/bbcode.php:443 +msgid "spoiler" +msgstr "спойлер" + +#: ../../include/bbcode.php:456 +msgid "View article" +msgstr "Просмотр статей" + +#: ../../include/bbcode.php:456 +msgid "View summary" +msgstr "Просмотр резюме" + +#: ../../include/bbcode.php:746 ../../include/bbcode.php:916 +#: ../../Zotlabs/Lib/NativeWikiPage.php:597 +msgid "Different viewers will see this text differently" +msgstr "Различные зрители увидят этот текст по-разному" + +#: ../../include/bbcode.php:1190 +msgid "$1 wrote:" +msgstr "$1 писал:" + +#: ../../include/account.php:36 +msgid "Not a valid email address" +msgstr "Недействительный адрес электронной почты" + +#: ../../include/account.php:38 +msgid "Your email domain is not among those allowed on this site" +msgstr "Домен электронной почты не входит в число тех, которые разрешены на этом сайте" + +#: ../../include/account.php:44 +msgid "Your email address is already registered at this site." +msgstr "Ваш адрес электронной почты уже зарегистрирован на этом сайте." + +#: ../../include/account.php:76 +msgid "An invitation is required." +msgstr "Требуется приглашение." + +#: ../../include/account.php:80 +msgid "Invitation could not be verified." +msgstr "Не удалось проверить приглашение." + +#: ../../include/account.php:158 +msgid "Please enter the required information." +msgstr "Пожалуйста, введите необходимую информацию." + +#: ../../include/account.php:225 +msgid "Failed to store account information." +msgstr "Не удалось сохранить информацию аккаунта." -#: ../../include/enotify.php:152 +#: ../../include/account.php:314 #, php-format -msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]" -msgstr "" +msgid "Registration confirmation for %s" +msgstr "Подтверждение регистрации для %s" -#: ../../include/enotify.php:161 +#: ../../include/account.php:385 #, php-format -msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]" -msgstr "" +msgid "Registration request at %s" +msgstr "Запрос регистрации на %s" -#: ../../include/enotify.php:172 +#: ../../include/account.php:407 +msgid "your registration password" +msgstr "ваш пароль регистрации" + +#: ../../include/account.php:413 ../../include/account.php:475 #, php-format -msgid "[Red:Notify] Comment to conversation #%1$d by %2$s" -msgstr "[Red:Уведомление] Комментарий к разговору #%1$d по %2$s" +msgid "Registration details for %s" +msgstr "Регистрационные данные для %s" -#: ../../include/enotify.php:173 +#: ../../include/account.php:486 +msgid "Account approved." +msgstr "Аккаунт утвержден." + +#: ../../include/account.php:526 #, php-format -msgid "%1$s, %2$s commented on an item/conversation you have been following." -msgstr "" +msgid "Registration revoked for %s" +msgstr "Регистрация отозвана для %s" + +#: ../../include/account.php:805 ../../include/account.php:807 +msgid "Click here to upgrade." +msgstr "Нажмите здесь для обновления." + +#: ../../include/account.php:813 +msgid "This action exceeds the limits set by your subscription plan." +msgstr "Это действие превышает ограничения, установленные в вашем плане." -#: ../../include/enotify.php:176 ../../include/enotify.php:191 -#: ../../include/enotify.php:217 ../../include/enotify.php:236 -#: ../../include/enotify.php:250 +#: ../../include/account.php:818 +msgid "This action is not available under your subscription plan." +msgstr "Это действие невозможно из-за ограничений в вашем плане." + +#: ../../include/auth.php:192 +msgid "Delegation session ended." +msgstr "Делегированная сессия завершена." + +#: ../../include/auth.php:196 +msgid "Logged out." +msgstr "Вышел из системы." + +#: ../../include/auth.php:291 +msgid "Email validation is incomplete. Please check your email." +msgstr "Проверка email не завершена. Пожалуйста, проверьте вашу почту." + +#: ../../include/auth.php:307 +msgid "Failed authentication" +msgstr "Ошибка аутентификации" + +#: ../../include/conversation.php:119 ../../include/event.php:1153 +#: ../../include/text.php:2025 ../../Zotlabs/Module/Events.php:260 +#: ../../Zotlabs/Module/Tagger.php:73 ../../Zotlabs/Module/Like.php:386 +msgid "event" +msgstr "событие" + +#: ../../include/conversation.php:122 ../../Zotlabs/Module/Like.php:121 +msgid "channel" +msgstr "канал" + +#: ../../include/conversation.php:146 ../../include/text.php:2030 +#: ../../Zotlabs/Module/Tagger.php:79 +msgid "comment" +msgstr "комментарий" + +#: ../../include/conversation.php:169 #, php-format -msgid "Please visit %s to view and/or reply to the conversation." -msgstr "Пожалуйста, посетите %s для просмотра и/или ответа разговора." +msgid "likes %1$s's %2$s" +msgstr "Нравится %1$s %2$s" -#: ../../include/enotify.php:182 +#: ../../include/conversation.php:172 #, php-format -msgid "[Red:Notify] %s posted to your profile wall" -msgstr "[Red:Уведомление] %s добавил сообщениe на стену вашего профиля" +msgid "doesn't like %1$s's %2$s" +msgstr "Не нравится %1$s %2$s" -#: ../../include/enotify.php:184 +#: ../../include/conversation.php:212 #, php-format -msgid "%1$s, %2$s posted to your profile wall at %3$s" -msgstr "" +msgid "%1$s is now connected with %2$s" +msgstr "%1$s теперь в контакте с %2$s" -#: ../../include/enotify.php:186 +#: ../../include/conversation.php:247 #, php-format -msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]" -msgstr "" +msgid "%1$s poked %2$s" +msgstr "%1$s ткнул %2$s" -#: ../../include/enotify.php:210 +#: ../../include/conversation.php:251 ../../include/text.php:1140 +#: ../../include/text.php:1144 +msgid "poked" +msgstr "ткнут" + +#: ../../include/conversation.php:268 ../../Zotlabs/Module/Mood.php:67 #, php-format -msgid "[Red:Notify] %s tagged you" -msgstr "[Red:Уведомление] %s добавил у вас тег" +msgctxt "mood" +msgid "%1$s is %2$s" +msgstr "%1$s в %2$s" + +#: ../../include/conversation.php:483 ../../Zotlabs/Lib/ThreadItem.php:431 +msgid "This is an unsaved preview" +msgstr "Это несохранённый просмотр" + +#: ../../include/conversation.php:619 ../../Zotlabs/Module/Photos.php:1142 +msgctxt "title" +msgid "Likes" +msgstr "Нравится" + +#: ../../include/conversation.php:619 ../../Zotlabs/Module/Photos.php:1142 +msgctxt "title" +msgid "Dislikes" +msgstr "Не нравится" + +#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1143 +msgctxt "title" +msgid "Agree" +msgstr "Согласен" + +#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1143 +msgctxt "title" +msgid "Disagree" +msgstr "Против" + +#: ../../include/conversation.php:620 ../../Zotlabs/Module/Photos.php:1143 +msgctxt "title" +msgid "Abstain" +msgstr "Воздерживаюсь" + +#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1144 +msgctxt "title" +msgid "Attending" +msgstr "Присоединившиеся" + +#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1144 +msgctxt "title" +msgid "Not attending" +msgstr "Не присоединившиеся" + +#: ../../include/conversation.php:621 ../../Zotlabs/Module/Photos.php:1144 +msgctxt "title" +msgid "Might attend" +msgstr "Могут присоединиться" + +#: ../../include/conversation.php:690 ../../Zotlabs/Lib/ThreadItem.php:158 +msgid "Select" +msgstr "Выбрать" + +#: ../../include/conversation.php:691 ../../include/conversation.php:736 +#: ../../Zotlabs/Lib/ThreadItem.php:148 ../../Zotlabs/Lib/Apps.php:476 +#: ../../Zotlabs/Module/Cdav.php:897 ../../Zotlabs/Module/Cdav.php:1187 +#: ../../Zotlabs/Module/Photos.php:1208 +#: ../../Zotlabs/Module/Connections.php:289 +#: ../../Zotlabs/Module/Card_edit.php:129 +#: ../../Zotlabs/Module/Editblock.php:139 ../../Zotlabs/Module/Connedit.php:654 +#: ../../Zotlabs/Module/Connedit.php:923 ../../Zotlabs/Module/Webpages.php:242 +#: ../../Zotlabs/Module/Editwebpage.php:167 +#: ../../Zotlabs/Module/Editlayout.php:138 +#: ../../Zotlabs/Module/Admin/Accounts.php:175 +#: ../../Zotlabs/Module/Admin/Profs.php:176 +#: ../../Zotlabs/Module/Admin/Channels.php:149 +#: ../../Zotlabs/Module/Blocks.php:162 +#: ../../Zotlabs/Module/Settings/Oauth2.php:151 +#: ../../Zotlabs/Module/Settings/Oauth.php:151 +#: ../../Zotlabs/Module/Article_edit.php:129 +#: ../../Zotlabs/Module/Profiles.php:800 ../../Zotlabs/Module/Thing.php:267 +#: ../../Zotlabs/Storage/Browser.php:291 +msgid "Delete" +msgstr "Удалить" -#: ../../include/enotify.php:211 +#: ../../include/conversation.php:695 ../../Zotlabs/Lib/ThreadItem.php:247 +msgid "Toggle Star Status" +msgstr "Переключить статус пометки" + +#: ../../include/conversation.php:700 ../../Zotlabs/Lib/ThreadItem.php:97 +msgid "Private Message" +msgstr "Личное сообщение" + +#: ../../include/conversation.php:707 ../../Zotlabs/Lib/ThreadItem.php:258 +msgid "Message signature validated" +msgstr "Подпись сообщения проверена" + +#: ../../include/conversation.php:708 ../../Zotlabs/Lib/ThreadItem.php:259 +msgid "Message signature incorrect" +msgstr "Подпись сообщения неверная" + +#: ../../include/conversation.php:735 ../../Zotlabs/Module/Connections.php:303 +#: ../../Zotlabs/Module/Admin/Accounts.php:173 +msgid "Approve" +msgstr "Утвердить" + +#: ../../include/conversation.php:739 #, php-format -msgid "%1$s, %2$s tagged you at %3$s" -msgstr "" +msgid "View %s's profile @ %s" +msgstr "Просмотреть профиль %s @ %s" + +#: ../../include/conversation.php:759 +msgid "Categories:" +msgstr "Категории:" -#: ../../include/enotify.php:212 +#: ../../include/conversation.php:760 +msgid "Filed under:" +msgstr "Хранить под:" + +#: ../../include/conversation.php:766 ../../Zotlabs/Lib/ThreadItem.php:367 #, php-format -msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]." -msgstr "" +msgid "from %s" +msgstr "от %s" -#: ../../include/enotify.php:225 +#: ../../include/conversation.php:769 ../../Zotlabs/Lib/ThreadItem.php:370 #, php-format -msgid "[Red:Notify] %1$s poked you" -msgstr "[Red:Уведомление] %1$s подпихнул вас" +msgid "last edited: %s" +msgstr "последнее редактирование: %s" -#: ../../include/enotify.php:226 +#: ../../include/conversation.php:770 ../../Zotlabs/Lib/ThreadItem.php:371 #, php-format -msgid "%1$s, %2$s poked you at %3$s" -msgstr "" +msgid "Expires: %s" +msgstr "Срок действия: %s" + +#: ../../include/conversation.php:785 +msgid "View in context" +msgstr "Показать в контексте" + +#: ../../include/conversation.php:787 ../../Zotlabs/Lib/ThreadItem.php:432 +#: ../../Zotlabs/Module/Photos.php:1108 +msgid "Please wait" +msgstr "Подождите пожалуйста" + +#: ../../include/conversation.php:886 +msgid "remove" +msgstr "удалить" + +#: ../../include/conversation.php:890 +msgid "Loading..." +msgstr "Загрузка..." + +#: ../../include/conversation.php:891 +msgid "Delete Selected Items" +msgstr "Удалить выбранные элементы" + +#: ../../include/conversation.php:934 +msgid "View Source" +msgstr "Просмотреть источник" + +#: ../../include/conversation.php:944 +msgid "Follow Thread" +msgstr "Следить за темой" + +#: ../../include/conversation.php:953 +msgid "Unfollow Thread" +msgstr "Прекратить отслеживать тему" -#: ../../include/enotify.php:227 +#: ../../include/conversation.php:1047 ../../Zotlabs/Module/Connedit.php:615 +msgid "Recent Activity" +msgstr "Последние действия" + +#: ../../include/conversation.php:1057 ../../include/channel.php:1376 +#: ../../include/connections.php:110 ../../Zotlabs/Widget/Suggestions.php:44 +#: ../../Zotlabs/Widget/Follow.php:32 ../../Zotlabs/Module/Suggest.php:56 +#: ../../Zotlabs/Module/Directory.php:338 +msgid "Connect" +msgstr "Подключить" + +#: ../../include/conversation.php:1067 +msgid "Edit Connection" +msgstr "Редактировать контакт" + +#: ../../include/conversation.php:1077 +msgid "Message" +msgstr "Сообщение" + +#: ../../include/conversation.php:1087 ../../Zotlabs/Module/Pubsites.php:35 +#: ../../Zotlabs/Module/Ratings.php:97 +msgid "Ratings" +msgstr "Оценки" + +#: ../../include/conversation.php:1097 ../../Zotlabs/Lib/Apps.php:316 +#: ../../Zotlabs/Module/Poke.php:182 +msgid "Poke" +msgstr "Ткнуть" + +#: ../../include/conversation.php:1211 #, php-format -msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]." -msgstr "" +msgid "%s likes this." +msgstr "%s нравится это." -#: ../../include/enotify.php:243 +#: ../../include/conversation.php:1211 #, php-format -msgid "[Red:Notify] %s tagged your post" -msgstr "[Red:Уведомление] %s добавил у вас в сообщении тег" +msgid "%s doesn't like this." +msgstr "%s не нравится это." -#: ../../include/enotify.php:244 +#: ../../include/conversation.php:1215 #, php-format -msgid "%1$s, %2$s tagged your post at %3$s" -msgstr "" +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 человеку</span> это нравится." +msgstr[1] "<span %1$s>%2$d человекам</span> это нравится." +msgstr[2] "<span %1$s>%2$d человекам</span> это нравится." -#: ../../include/enotify.php:245 +#: ../../include/conversation.php:1217 #, php-format -msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]" -msgstr "" +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 человеку</span> это не нравится." +msgstr[1] "<span %1$s>%2$d человекам</span> это не нравится." +msgstr[2] "<span %1$s>%2$d человекам</span> это не нравится." -#: ../../include/enotify.php:257 -msgid "[Red:Notify] Introduction received" -msgstr "[Red:Уведомление] введение получено" +#: ../../include/conversation.php:1223 +msgid "and" +msgstr "и" -#: ../../include/enotify.php:258 +#: ../../include/conversation.php:1226 #, php-format -msgid "%1$s, you've received an new connection request from '%2$s' at %3$s" -msgstr "" +msgid ", and %d other people" +msgid_plural ", and %d other people" +msgstr[0] ", и ещё %d человеку" +msgstr[1] ", и ещё %d человекам" +msgstr[2] ", и ещё %d человекам" -#: ../../include/enotify.php:259 +#: ../../include/conversation.php:1227 #, php-format -msgid "" -"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s." -msgstr "" +msgid "%s like this." +msgstr "%s нравится это." -#: ../../include/enotify.php:263 ../../include/enotify.php:282 +#: ../../include/conversation.php:1227 #, php-format -msgid "You may visit their profile at %s" -msgstr "Вы можете посетить профиль в %s" +msgid "%s don't like this." +msgstr "%s не нравится это." -#: ../../include/enotify.php:265 -#, php-format -msgid "Please visit %s to approve or reject the connection request." -msgstr "" +#: ../../include/conversation.php:1270 +msgid "Set your location" +msgstr "Задать своё местоположение" -#: ../../include/enotify.php:272 -msgid "[Red:Notify] Friend suggestion received" -msgstr "[Red:Уведомление] Получено предложение дружить" +#: ../../include/conversation.php:1271 +msgid "Clear browser location" +msgstr "Очистить местоположение из браузера" -#: ../../include/enotify.php:273 -#, php-format -msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s" -msgstr "" +#: ../../include/conversation.php:1283 ../../Zotlabs/Module/Mail.php:288 +#: ../../Zotlabs/Module/Mail.php:430 ../../Zotlabs/Module/Card_edit.php:101 +#: ../../Zotlabs/Module/Editblock.php:116 +#: ../../Zotlabs/Module/Editwebpage.php:143 ../../Zotlabs/Module/Chat.php:207 +#: ../../Zotlabs/Module/Article_edit.php:101 +msgid "Insert web link" +msgstr "Вставить веб-ссылку" -#: ../../include/enotify.php:274 -#, php-format -msgid "" -"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from " -"%4$s." -msgstr "" +#: ../../include/conversation.php:1287 +msgid "Embed (existing) photo from your photo albums" +msgstr "Встроить (существующее) фото из вашего фотоальбома" -#: ../../include/enotify.php:280 -msgid "Name:" -msgstr "Имя:" +#: ../../include/conversation.php:1322 ../../Zotlabs/Module/Mail.php:241 +#: ../../Zotlabs/Module/Mail.php:362 ../../Zotlabs/Module/Chat.php:205 +msgid "Please enter a link URL:" +msgstr "Пожалуйста введите URL ссылки:" -#: ../../include/enotify.php:281 -msgid "Photo:" -msgstr "Фото:" +#: ../../include/conversation.php:1323 +msgid "Tag term:" +msgstr "Теги:" -#: ../../include/enotify.php:284 -#, php-format -msgid "Please visit %s to approve or reject the suggestion." -msgstr "" +#: ../../include/conversation.php:1324 +msgid "Where are you right now?" +msgstr "Где вы сейчас?" -#: ../../include/reddav.php:915 -#: ../../view/tpl/smarty3/compiled/de0b699d2fc212753c3f166003476a343ca00174.file.cloud_directory.tpl.php:52 -#: ../../view/tpl/smarty3/compiled/de0b699d2fc212753c3f166003476a343ca00174.file.cloud_directory.tpl.php:55 -msgid "parent" -msgstr "" +#: ../../include/conversation.php:1327 +#: ../../Zotlabs/Module/Profile_photo.php:467 +#: ../../Zotlabs/Module/Cover_photo.php:401 ../../Zotlabs/Module/Wiki.php:381 +msgid "Choose images to embed" +msgstr "Выбрать изображения для встраивания" + +#: ../../include/conversation.php:1328 +#: ../../Zotlabs/Module/Profile_photo.php:468 +#: ../../Zotlabs/Module/Cover_photo.php:402 ../../Zotlabs/Module/Wiki.php:382 +msgid "Choose an album" +msgstr "Выбрать альбом" + +#: ../../include/conversation.php:1329 +msgid "Choose a different album..." +msgstr "Выбрать другой альбом..." + +#: ../../include/conversation.php:1330 +#: ../../Zotlabs/Module/Profile_photo.php:470 +#: ../../Zotlabs/Module/Cover_photo.php:404 ../../Zotlabs/Module/Wiki.php:384 +msgid "Error getting album list" +msgstr "Ошибка получения списка альбомов" + +#: ../../include/conversation.php:1331 +#: ../../Zotlabs/Module/Profile_photo.php:471 +#: ../../Zotlabs/Module/Cover_photo.php:405 ../../Zotlabs/Module/Wiki.php:385 +msgid "Error getting photo link" +msgstr "Ошибка получения ссылки на фотографию" + +#: ../../include/conversation.php:1332 +#: ../../Zotlabs/Module/Profile_photo.php:472 +#: ../../Zotlabs/Module/Cover_photo.php:406 ../../Zotlabs/Module/Wiki.php:386 +msgid "Error getting album" +msgstr "Ошибка получения альбома" + +#: ../../include/conversation.php:1333 +msgid "Comments enabled" +msgstr "Комментарии включены" + +#: ../../include/conversation.php:1334 +msgid "Comments disabled" +msgstr "Комментарии отключены" + +#: ../../include/conversation.php:1341 ../../Zotlabs/Lib/ThreadItem.php:767 +#: ../../Zotlabs/Module/Photos.php:1128 ../../Zotlabs/Module/Events.php:478 +#: ../../Zotlabs/Module/Webpages.php:247 +msgid "Preview" +msgstr "Предварительный просмотр" -#: ../../include/reddav.php:940 -msgid "Collection" -msgstr "Коллекция" +#: ../../include/conversation.php:1374 ../../Zotlabs/Widget/Cdav.php:124 +#: ../../Zotlabs/Module/Photos.php:1107 ../../Zotlabs/Module/Layouts.php:194 +#: ../../Zotlabs/Module/Webpages.php:241 ../../Zotlabs/Module/Blocks.php:161 +#: ../../Zotlabs/Module/Wiki.php:287 +msgid "Share" +msgstr "Поделиться" -#: ../../include/reddav.php:943 -msgid "Principal" -msgstr "" +#: ../../include/conversation.php:1383 +msgid "Page link name" +msgstr "Название ссылки на страницу " -#: ../../include/reddav.php:946 -msgid "Addressbook" -msgstr "Адресная книга" +#: ../../include/conversation.php:1386 +msgid "Post as" +msgstr "Опубликовать как" -#: ../../include/reddav.php:949 -msgid "Calendar" -msgstr "Календарь" +#: ../../include/conversation.php:1388 ../../Zotlabs/Lib/ThreadItem.php:758 +msgid "Bold" +msgstr "Жирный" -#: ../../include/reddav.php:952 -msgid "Schedule Inbox" +#: ../../include/conversation.php:1389 ../../Zotlabs/Lib/ThreadItem.php:759 +msgid "Italic" +msgstr "Курсив" + +#: ../../include/conversation.php:1390 ../../Zotlabs/Lib/ThreadItem.php:760 +msgid "Underline" +msgstr "Подчеркнутый" + +#: ../../include/conversation.php:1391 ../../Zotlabs/Lib/ThreadItem.php:761 +msgid "Quote" +msgstr "Цитата" + +#: ../../include/conversation.php:1392 ../../Zotlabs/Lib/ThreadItem.php:762 +msgid "Code" +msgstr "Код" + +#: ../../include/conversation.php:1393 ../../Zotlabs/Lib/ThreadItem.php:764 +msgid "Attach/Upload file" +msgstr "Прикрепить/загрузить файл" + +#: ../../include/conversation.php:1396 ../../Zotlabs/Module/Wiki.php:378 +msgid "Embed an image from your albums" +msgstr "Встроить изображение из ваших альбомов" + +#: ../../include/conversation.php:1397 ../../include/conversation.php:1446 +#: ../../Zotlabs/Module/Cdav.php:899 ../../Zotlabs/Module/Cdav.php:1188 +#: ../../Zotlabs/Module/Fbrowser.php:66 ../../Zotlabs/Module/Fbrowser.php:88 +#: ../../Zotlabs/Module/Card_edit.php:131 +#: ../../Zotlabs/Module/Profile_photo.php:465 +#: ../../Zotlabs/Module/Editblock.php:141 ../../Zotlabs/Module/Editpost.php:109 +#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138 +#: ../../Zotlabs/Module/Connedit.php:924 +#: ../../Zotlabs/Module/Editwebpage.php:169 +#: ../../Zotlabs/Module/Editlayout.php:140 +#: ../../Zotlabs/Module/Admin/Addons.php:423 +#: ../../Zotlabs/Module/Cover_photo.php:399 +#: ../../Zotlabs/Module/Settings/Oauth2.php:86 +#: ../../Zotlabs/Module/Settings/Oauth2.php:114 +#: ../../Zotlabs/Module/Settings/Oauth.php:89 +#: ../../Zotlabs/Module/Settings/Oauth.php:115 +#: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Module/Article_edit.php:131 +#: ../../Zotlabs/Module/Wiki.php:347 ../../Zotlabs/Module/Wiki.php:379 +#: ../../Zotlabs/Module/Profiles.php:801 +msgid "Cancel" +msgstr "Отменить" + +#: ../../include/conversation.php:1398 ../../include/conversation.php:1445 +#: ../../Zotlabs/Module/Profile_photo.php:466 +#: ../../Zotlabs/Module/Cover_photo.php:400 ../../Zotlabs/Module/Wiki.php:380 +msgid "OK" msgstr "" -#: ../../include/reddav.php:955 -msgid "Schedule Outbox" +#: ../../include/conversation.php:1400 +msgid "Toggle voting" +msgstr "Подключить голосование" + +#: ../../include/conversation.php:1403 +msgid "Disable comments" +msgstr "Отключить комментарии" + +#: ../../include/conversation.php:1404 +msgid "Toggle comments" +msgstr "Переключить комментарии" + +#: ../../include/conversation.php:1409 ../../Zotlabs/Module/Photos.php:703 +#: ../../Zotlabs/Module/Photos.php:1073 ../../Zotlabs/Module/Card_edit.php:117 +#: ../../Zotlabs/Module/Editblock.php:129 +#: ../../Zotlabs/Module/Article_edit.php:117 +msgid "Title (optional)" +msgstr "Заголовок (необязательно)" + +#: ../../include/conversation.php:1412 +msgid "Categories (optional, comma-separated list)" +msgstr "Категории (необязательно, список через запятую)" + +#: ../../include/conversation.php:1413 ../../Zotlabs/Module/Events.php:479 +msgid "Permission settings" +msgstr "Настройки разрешений" + +#: ../../include/conversation.php:1435 +msgid "Other networks and post services" +msgstr "Другие сети и службы публикаций" + +#: ../../include/conversation.php:1438 ../../Zotlabs/Module/Mail.php:292 +#: ../../Zotlabs/Module/Mail.php:434 +msgid "Set expiration date" +msgstr "Установить срок действия" + +#: ../../include/conversation.php:1441 +msgid "Set publish date" +msgstr "Установить дату публикации" + +#: ../../include/conversation.php:1443 ../../Zotlabs/Lib/ThreadItem.php:771 +#: ../../Zotlabs/Module/Mail.php:294 ../../Zotlabs/Module/Mail.php:436 +#: ../../Zotlabs/Module/Chat.php:206 +msgid "Encrypt text" +msgstr "Зашифровать текст" + +#: ../../include/conversation.php:1702 +msgid "Commented Order" +msgstr "По комментариям" + +#: ../../include/conversation.php:1705 +msgid "Sort by Comment Date" +msgstr "Сортировать по дате комментария" + +#: ../../include/conversation.php:1709 +msgid "Posted Order" +msgstr "По публикациям" + +#: ../../include/conversation.php:1712 +msgid "Sort by Post Date" +msgstr "Сортировать по дате публикации" + +#: ../../include/conversation.php:1717 ../../Zotlabs/Module/Profiles.php:733 +msgid "Personal" +msgstr "Личное" + +#: ../../include/conversation.php:1720 +msgid "Posts that mention or involve you" +msgstr "Публикации, где вы были упомянуты или участвовали" + +#: ../../include/conversation.php:1726 ../../Zotlabs/Module/Connections.php:80 +#: ../../Zotlabs/Module/Connections.php:89 +#: ../../Zotlabs/Module/Notifications.php:50 ../../Zotlabs/Module/Menu.php:179 +msgid "New" +msgstr "Новые" + +#: ../../include/conversation.php:1729 +msgid "Activity Stream - by date" +msgstr "Поток активности - по дате" + +#: ../../include/conversation.php:1735 +msgid "Starred" +msgstr "Отмеченые" + +#: ../../include/conversation.php:1738 +msgid "Favourite Posts" +msgstr "Любимые публикации" + +#: ../../include/conversation.php:1745 +msgid "Spam" +msgstr "Спам" + +#: ../../include/conversation.php:1748 +msgid "Posts flagged as SPAM" +msgstr "Публикация помечена как спам" + +#: ../../include/conversation.php:1820 ../../include/nav.php:370 +#: ../../Zotlabs/Module/Admin/Channels.php:154 +msgid "Channel" +msgstr "Канал" + +#: ../../include/conversation.php:1823 ../../include/nav.php:373 +msgid "Status Messages and Posts" +msgstr "Статусы и публикации" + +#: ../../include/conversation.php:1833 ../../include/nav.php:383 +#: ../../Zotlabs/Module/Help.php:80 +msgid "About" +msgstr "О себе" + +#: ../../include/conversation.php:1836 ../../include/nav.php:386 +msgid "Profile Details" +msgstr "Информация о профиле" + +#: ../../include/conversation.php:1843 ../../include/nav.php:393 +#: ../../Zotlabs/Lib/Apps.php:310 ../../Zotlabs/Module/Fbrowser.php:29 +msgid "Photos" +msgstr "Фотографии" + +#: ../../include/conversation.php:1846 ../../include/nav.php:396 +#: ../../include/photos.php:667 +msgid "Photo Albums" +msgstr "Фотоальбомы" + +#: ../../include/conversation.php:1851 ../../include/nav.php:401 +#: ../../Zotlabs/Lib/Apps.php:305 ../../Zotlabs/Module/Fbrowser.php:85 +#: ../../Zotlabs/Storage/Browser.php:272 +msgid "Files" +msgstr "Файлы" + +#: ../../include/conversation.php:1854 ../../include/nav.php:404 +msgid "Files and Storage" +msgstr "Файлы и хранилище" + +#: ../../include/conversation.php:1862 ../../include/conversation.php:1865 +#: ../../Zotlabs/Lib/Apps.php:311 +msgid "Events" +msgstr "События" + +#: ../../include/conversation.php:1876 ../../include/conversation.php:1879 +#: ../../include/nav.php:426 ../../include/nav.php:429 +#: ../../Zotlabs/Widget/Chatroom_list.php:16 +msgid "Chatrooms" +msgstr "Чаты" + +#: ../../include/conversation.php:1891 ../../include/nav.php:439 +msgid "Bookmarks" +msgstr "Закладки" + +#: ../../include/conversation.php:1894 ../../include/nav.php:442 +msgid "Saved Bookmarks" +msgstr "Сохранённые закладки" + +#: ../../include/conversation.php:1902 ../../include/nav.php:450 +#: ../../include/features.php:123 ../../Zotlabs/Lib/Apps.php:293 +#: ../../Zotlabs/Module/Cards.php:42 ../../Zotlabs/Module/Cards.php:194 +msgid "Cards" +msgstr "Карточки" + +#: ../../include/conversation.php:1905 ../../include/nav.php:453 +msgid "View Cards" +msgstr "Просмотреть карточки" + +#: ../../include/conversation.php:1913 +msgid "articles" +msgstr "статьи" + +#: ../../include/conversation.php:1916 ../../include/nav.php:464 +msgid "View Articles" +msgstr "Просмотр статей" + +#: ../../include/conversation.php:1924 ../../include/nav.php:473 +#: ../../Zotlabs/Lib/Apps.php:306 ../../Zotlabs/Module/Webpages.php:237 +msgid "Webpages" +msgstr "Веб-страницы" + +#: ../../include/conversation.php:1927 ../../include/nav.php:476 +msgid "View Webpages" +msgstr "Просмотр веб-страниц" + +#: ../../include/conversation.php:1937 ../../include/nav.php:486 +#: ../../Zotlabs/Module/Wiki.php:197 +msgid "Wikis" msgstr "" -#: ../../include/reddav.php:1033 -#, php-format -msgid "%1$s used" +#: ../../include/conversation.php:1940 ../../include/nav.php:489 +#: ../../include/features.php:96 ../../Zotlabs/Lib/Apps.php:307 +msgid "Wiki" msgstr "" -#: ../../include/reddav.php:1038 +#: ../../include/conversation.php:1990 ../../include/taxonomy.php:661 +#: ../../include/channel.php:1539 ../../Zotlabs/Lib/ThreadItem.php:216 +#: ../../Zotlabs/Module/Photos.php:1165 +msgctxt "noun" +msgid "Like" +msgid_plural "Likes" +msgstr[0] "Нравится" +msgstr[1] "Нравится" +msgstr[2] "Нравится" + +#: ../../include/conversation.php:1993 ../../Zotlabs/Lib/ThreadItem.php:221 +#: ../../Zotlabs/Module/Photos.php:1170 +msgctxt "noun" +msgid "Dislike" +msgid_plural "Dislikes" +msgstr[0] "Не нравится" +msgstr[1] "Не нравится" +msgstr[2] "Не нравится" + +#: ../../include/conversation.php:1996 +msgctxt "noun" +msgid "Attending" +msgid_plural "Attending" +msgstr[0] "Посетит" +msgstr[1] "Посетят" +msgstr[2] "Посетят" + +#: ../../include/conversation.php:1999 +msgctxt "noun" +msgid "Not Attending" +msgid_plural "Not Attending" +msgstr[0] "Не посетит" +msgstr[1] "Не посетят" +msgstr[2] "Не посетят" + +#: ../../include/conversation.php:2002 +msgctxt "noun" +msgid "Undecided" +msgid_plural "Undecided" +msgstr[0] "Не решил" +msgstr[1] "Не решили" +msgstr[2] "Не решили" + +#: ../../include/conversation.php:2005 +msgctxt "noun" +msgid "Agree" +msgid_plural "Agrees" +msgstr[0] "Согласен" +msgstr[1] "Согласны" +msgstr[2] "Согласны" + +#: ../../include/conversation.php:2008 +msgctxt "noun" +msgid "Disagree" +msgid_plural "Disagrees" +msgstr[0] "Не согласен" +msgstr[1] "Не согласны" +msgstr[2] "Не согласны" + +#: ../../include/conversation.php:2011 +msgctxt "noun" +msgid "Abstain" +msgid_plural "Abstains" +msgstr[0] "Воздержался" +msgstr[1] "Воздержались" +msgstr[2] "Воздержались" + +#: ../../include/zot.php:772 +msgid "Invalid data packet" +msgstr "Неверный пакет данных" + +#: ../../include/zot.php:799 +msgid "Unable to verify channel signature" +msgstr "Невозможно проверить подпись канала" + +#: ../../include/zot.php:2557 #, php-format -msgid "%1$s used of %2$s (%3$s%)" +msgid "Unable to verify site signature for %s" +msgstr "Невозможно проверить подпись сайта %s" + +#: ../../include/zot.php:4221 +msgid "invalid target signature" +msgstr "недопустимая целевая подпись" + +#: ../../include/event.php:24 ../../include/event.php:71 +msgid "l F d, Y \\@ g:i A" msgstr "" -#: ../../include/reddav.php:1104 -msgid "Create new folder" -msgstr "Создать новую папку" +#: ../../include/event.php:32 ../../include/event.php:75 +msgid "Starts:" +msgstr "Начало:" -#: ../../include/reddav.php:1107 ../../mod/mitem.php:142 ../../mod/menu.php:84 -#: ../../mod/new_channel.php:117 -msgid "Create" -msgstr "Создать" +#: ../../include/event.php:42 ../../include/event.php:79 +msgid "Finishes:" +msgstr "Окончание:" -#: ../../include/reddav.php:1111 -msgid "Upload file" -msgstr "Загрузить файл" +#: ../../include/event.php:54 ../../include/event.php:86 +#: ../../include/channel.php:1391 ../../Zotlabs/Module/Directory.php:324 +msgid "Location:" +msgstr "Местоположение:" -#: ../../include/reddav.php:1114 ../../mod/profile_photo.php:361 -msgid "Upload" -msgstr "Загрузка" +#: ../../include/event.php:1011 +msgid "This event has been added to your calendar." +msgstr "Это событие было добавлено в ваш календарь." -#: ../../include/features.php:23 -msgid "General Features" -msgstr "Главные функции" +#: ../../include/event.php:1227 +msgid "Not specified" +msgstr "Не указано" -#: ../../include/features.php:25 -msgid "Content Expiration" -msgstr "" +#: ../../include/event.php:1228 +msgid "Needs Action" +msgstr "Требует действия" -#: ../../include/features.php:25 -msgid "Remove posts/comments and/or private messages at a future time" -msgstr "Удалять посты/комментарии и/или личные сообщения" +#: ../../include/event.php:1229 +msgid "Completed" +msgstr "Завершено" -#: ../../include/features.php:26 -msgid "Multiple Profiles" -msgstr "Несколько профилей" +#: ../../include/event.php:1230 +msgid "In Process" +msgstr "В процессе" -#: ../../include/features.php:26 -msgid "Ability to create multiple profiles" -msgstr "Возможность создания нескольких профилей" +#: ../../include/event.php:1231 +msgid "Cancelled" +msgstr "Отменено" -#: ../../include/features.php:27 -msgid "Web Pages" -msgstr "Веб-страницы" +#: ../../include/event.php:1308 ../../include/connections.php:696 +#: ../../Zotlabs/Module/Cdav.php:1179 ../../Zotlabs/Module/Connedit.php:915 +#: ../../Zotlabs/Module/Profiles.php:792 +msgid "Mobile" +msgstr "Мобильный" -#: ../../include/features.php:27 -msgid "Provide managed web pages on your channel" -msgstr "" +#: ../../include/event.php:1309 ../../include/connections.php:697 +#: ../../Zotlabs/Module/Cdav.php:1180 ../../Zotlabs/Module/Connedit.php:916 +#: ../../Zotlabs/Module/Profiles.php:793 +msgid "Home" +msgstr "Домашний" + +#: ../../include/event.php:1310 ../../include/connections.php:698 +msgid "Home, Voice" +msgstr "Дом, голос" + +#: ../../include/event.php:1311 ../../include/connections.php:699 +msgid "Home, Fax" +msgstr "Дом, факс" + +#: ../../include/event.php:1312 ../../include/connections.php:700 +#: ../../Zotlabs/Module/Cdav.php:1181 ../../Zotlabs/Module/Connedit.php:917 +#: ../../Zotlabs/Module/Profiles.php:794 +msgid "Work" +msgstr "Рабочий" + +#: ../../include/event.php:1313 ../../include/connections.php:701 +msgid "Work, Voice" +msgstr "Работа, голос" + +#: ../../include/event.php:1314 ../../include/connections.php:702 +msgid "Work, Fax" +msgstr "Работа, факс" + +#: ../../include/event.php:1315 ../../include/event.php:1322 +#: ../../include/selectors.php:49 ../../include/selectors.php:66 +#: ../../include/selectors.php:104 ../../include/selectors.php:140 +#: ../../include/connections.php:703 ../../include/connections.php:710 +#: ../../Zotlabs/Access/PermissionRoles.php:306 +#: ../../Zotlabs/Module/Cdav.php:1182 ../../Zotlabs/Module/Connedit.php:918 +#: ../../Zotlabs/Module/Settings/Channel.php:496 +#: ../../Zotlabs/Module/New_channel.php:172 +#: ../../Zotlabs/Module/Register.php:233 ../../Zotlabs/Module/Profiles.php:795 +msgid "Other" +msgstr "Другой" -#: ../../include/features.php:28 -msgid "Private Notes" -msgstr "Личные заметки" +#: ../../include/attach.php:265 ../../include/attach.php:374 +msgid "Item was not found." +msgstr "Элемент не найден." -#: ../../include/features.php:28 -msgid "Enables a tool to store notes and reminders" -msgstr "" +#: ../../include/attach.php:282 +msgid "Unknown error." +msgstr "Неизвестная ошибка." -#: ../../include/features.php:33 -msgid "Extended Identity Sharing" -msgstr "Расширенный обмен идентичности" +#: ../../include/attach.php:567 +msgid "No source file." +msgstr "Нет исходного файла." -#: ../../include/features.php:33 -msgid "" -"Share your identity with all websites on the internet. When disabled, " -"identity is only shared with sites in the matrix." -msgstr "" +#: ../../include/attach.php:589 +msgid "Cannot locate file to replace" +msgstr "Не удается найти файл для замены" -#: ../../include/features.php:34 -msgid "Expert Mode" -msgstr "Экспертный режим" +#: ../../include/attach.php:608 +msgid "Cannot locate file to revise/update" +msgstr "Не удается найти файл для пересмотра / обновления" -#: ../../include/features.php:34 -msgid "Enable Expert Mode to provide advanced configuration options" -msgstr "" +#: ../../include/attach.php:750 +#, php-format +msgid "File exceeds size limit of %d" +msgstr "Файл превышает предельный размер %d" -#: ../../include/features.php:35 -msgid "Premium Channel" -msgstr "Премиум канал" +#: ../../include/attach.php:771 +#, php-format +msgid "You have reached your limit of %1$.0f Mbytes attachment storage." +msgstr "Вы достигли предела %1$.0f Мбайт для хранения вложений." -#: ../../include/features.php:35 -msgid "" -"Allows you to set restrictions and terms on those that connect with your " -"channel" -msgstr "" +#: ../../include/attach.php:953 +msgid "File upload failed. Possible system limit or action terminated." +msgstr "Загрузка файла не удалась. Возможно система перегружена или попытка прекращена." -#: ../../include/features.php:40 -msgid "Post Composition Features" -msgstr "" +#: ../../include/attach.php:982 +msgid "Stored file could not be verified. Upload failed." +msgstr "Файл для сохранения не может быть проверен. Загрузка не удалась." -#: ../../include/features.php:41 -msgid "Richtext Editor" -msgstr "Редактор RichText" +#: ../../include/attach.php:1056 ../../include/attach.php:1072 +msgid "Path not available." +msgstr "Путь недоступен." -#: ../../include/features.php:41 -msgid "Enable richtext editor" -msgstr "Включить редактор RichText" +#: ../../include/attach.php:1121 ../../include/attach.php:1286 +msgid "Empty pathname" +msgstr "Пустое имя пути" -#: ../../include/features.php:42 -msgid "Post Preview" -msgstr "Предварительный просмотр сообщения" +#: ../../include/attach.php:1147 +msgid "duplicate filename or path" +msgstr "дублирующееся имя файла или пути" -#: ../../include/features.php:42 -msgid "Allow previewing posts and comments before publishing them" -msgstr "Разрешить предварительный просмотр сообщений и комментариев перед их публикацией" +#: ../../include/attach.php:1172 +msgid "Path not found." +msgstr "Путь не найден." -#: ../../include/features.php:43 ../../include/widgets.php:503 -#: ../../mod/sources.php:88 -msgid "Channel Sources" -msgstr "Источники канала" +#: ../../include/attach.php:1240 +msgid "mkdir failed." +msgstr "mkdir не удался" -#: ../../include/features.php:43 -msgid "Automatically import channel content from other channels or feeds" -msgstr "" +#: ../../include/attach.php:1244 +msgid "database storage failed." +msgstr "ошибка при записи базы данных." -#: ../../include/features.php:44 -msgid "Even More Encryption" -msgstr "Еще больше шифрования" +#: ../../include/attach.php:1292 +msgid "Empty path" +msgstr "Пустое имя пути" -#: ../../include/features.php:44 -msgid "" -"Allow optional encryption of content end-to-end with a shared secret key" -msgstr "" +#: ../../include/feedutils.php:860 ../../include/text.php:1451 +msgid "unknown" +msgstr "неизвестный" -#: ../../include/features.php:49 -msgid "Network and Stream Filtering" -msgstr "Фильтрация сети и потока" +#: ../../include/bookmarks.php:34 +#, php-format +msgid "%1$s's bookmarks" +msgstr "Закладки пользователя %1$s" -#: ../../include/features.php:50 -msgid "Search by Date" -msgstr "Поиск по дате" +#: ../../include/dir_fns.php:141 +msgid "Directory Options" +msgstr "Параметры каталога" -#: ../../include/features.php:50 -msgid "Ability to select posts by date ranges" -msgstr "Возможность выбора сообщений по датам" +#: ../../include/dir_fns.php:143 +msgid "Safe Mode" +msgstr "Безопасный режим" -#: ../../include/features.php:51 -msgid "Collections Filter" -msgstr "Фильтр коллекций" +#: ../../include/dir_fns.php:144 +msgid "Public Forums Only" +msgstr "Только публичные форумы" -#: ../../include/features.php:51 -msgid "Enable widget to display Network posts only from selected collections" -msgstr "" +#: ../../include/dir_fns.php:145 +msgid "This Website Only" +msgstr "Только этот веб-сайт" -#: ../../include/features.php:52 ../../include/widgets.php:265 -msgid "Saved Searches" -msgstr "Запомненные поиски" +#: ../../include/network.php:760 +msgid "view full size" +msgstr "посмотреть в полный размер" -#: ../../include/features.php:52 -msgid "Save search terms for re-use" -msgstr "Сохранять результаты поиска для повторного использования" +#: ../../include/network.php:1763 ../../include/network.php:1764 +msgid "Friendica" +msgstr "" + +#: ../../include/network.php:1765 +msgid "OStatus" +msgstr "" -#: ../../include/features.php:53 -msgid "Network Personal Tab" -msgstr "Сеть - Личная вкладка" +#: ../../include/network.php:1766 +msgid "GNU-Social" +msgstr "GNU social" -#: ../../include/features.php:53 -msgid "Enable tab to display only Network posts that you've interacted on" +#: ../../include/network.php:1767 +msgid "RSS/Atom" msgstr "" -#: ../../include/features.php:54 -msgid "Network New Tab" -msgstr "Сеть - Новая вкладка" +#: ../../include/network.php:1770 +msgid "Diaspora" +msgstr "" -#: ../../include/features.php:54 -msgid "Enable tab to display all new Network activity" +#: ../../include/network.php:1771 +msgid "Facebook" msgstr "" -#: ../../include/features.php:55 -msgid "Affinity Tool" -msgstr "Инструмент сходства или соответствия" +#: ../../include/network.php:1772 +msgid "Zot" +msgstr "" -#: ../../include/features.php:55 -msgid "Filter stream activity by depth of relationships" +#: ../../include/network.php:1773 +msgid "LinkedIn" msgstr "" -#: ../../include/features.php:56 -msgid "Suggest Channels" +#: ../../include/network.php:1774 +msgid "XMPP/IM" msgstr "" -#: ../../include/features.php:56 -msgid "Show channel suggestions" +#: ../../include/network.php:1775 +msgid "MySpace" msgstr "" -#: ../../include/features.php:61 -msgid "Post/Comment Tools" -msgstr "Инструменты сообщений/комментарий " +#: ../../include/activities.php:41 +msgid " and " +msgstr " и " -#: ../../include/features.php:63 -msgid "Edit Sent Posts" -msgstr "Редактировать отправленные сообщения" +#: ../../include/activities.php:49 +msgid "public profile" +msgstr "общедоступный профиль" -#: ../../include/features.php:63 -msgid "Edit and correct posts and comments after sending" -msgstr "Редактировать и исправлять сообщения и комментарии после отправки" +#: ../../include/activities.php:58 +#, php-format +msgid "%1$s changed %2$s to “%3$s”" +msgstr "%1$s изменил %2$s на “%3$s”" -#: ../../include/features.php:64 -msgid "Tagging" -msgstr "Пометка" +#: ../../include/activities.php:59 +#, php-format +msgid "Visit %1$s's %2$s" +msgstr "Посетить %1$s %2$s" -#: ../../include/features.php:64 -msgid "Ability to tag existing posts" -msgstr "Возможность использовать теги" +#: ../../include/activities.php:62 +#, php-format +msgid "%1$s has an updated %2$s, changing %3$s." +msgstr "%1$s обновлено %2$s, изменено %3$s." -#: ../../include/features.php:65 -msgid "Post Categories" -msgstr "Категории сообщения" +#: ../../include/nav.php:88 +msgid "Remote authentication" +msgstr "Удаленная аутентификация" -#: ../../include/features.php:65 -msgid "Add categories to your posts" -msgstr "Добавить категории для ваших сообщений" +#: ../../include/nav.php:88 +msgid "Click to authenticate to your home hub" +msgstr "Нажмите, чтобы аутентифицировать себя на домашнем узле" -#: ../../include/features.php:66 -msgid "Ability to file posts under folders" -msgstr "" +#: ../../include/nav.php:94 ../../Zotlabs/Lib/Apps.php:302 +#: ../../Zotlabs/Module/Manage.php:170 +msgid "Channel Manager" +msgstr "Менеджер каналов" + +#: ../../include/nav.php:94 +msgid "Manage your channels" +msgstr "Управление вашими каналами" + +#: ../../include/nav.php:97 ../../include/group.php:320 +#: ../../include/features.php:221 ../../Zotlabs/Widget/Activity_filter.php:68 +#: ../../Zotlabs/Module/Group.php:113 ../../Zotlabs/Module/Group.php:124 +msgid "Privacy Groups" +msgstr "Группы безопасности" + +#: ../../include/nav.php:97 +msgid "Manage your privacy groups" +msgstr "Управление вашим группами безопасности" + +#: ../../include/nav.php:99 ../../Zotlabs/Lib/Apps.php:304 +#: ../../Zotlabs/Widget/Settings_menu.php:141 +#: ../../Zotlabs/Widget/Newmember.php:46 +#: ../../Zotlabs/Module/Admin/Addons.php:344 +#: ../../Zotlabs/Module/Admin/Themes.php:125 +msgid "Settings" +msgstr "Настройки" -#: ../../include/features.php:67 -msgid "Dislike Posts" -msgstr "Сообщение не нравится" +#: ../../include/nav.php:99 +msgid "Account/Channel Settings" +msgstr "Настройки аккаунта / канала" -#: ../../include/features.php:67 -msgid "Ability to dislike posts/comments" -msgstr "Возможность выбора нравится/не-нравится" +#: ../../include/nav.php:105 ../../include/nav.php:134 +msgid "End this session" +msgstr "Закончить эту сессию" -#: ../../include/features.php:68 -msgid "Star Posts" -msgstr "Помечать сообщения" +#: ../../include/nav.php:108 +msgid "Your profile page" +msgstr "Страницa вашего профиля" -#: ../../include/features.php:68 -msgid "Ability to mark special posts with a star indicator" -msgstr "" +#: ../../include/nav.php:111 ../../include/channel.php:1296 +#: ../../Zotlabs/Module/Profiles.php:830 +msgid "Edit Profiles" +msgstr "Редактирование профилей" -#: ../../include/features.php:69 -msgid "Tag Cloud" -msgstr "Облако тегов" +#: ../../include/nav.php:111 +msgid "Manage/Edit profiles" +msgstr "Управление / редактирование профилей" -#: ../../include/features.php:69 -msgid "Provide a personal tag cloud on your channel page" -msgstr "" +#: ../../include/nav.php:113 ../../Zotlabs/Widget/Newmember.php:28 +msgid "Edit your profile" +msgstr "Редактировать профиль" -#: ../../include/follow.php:23 -msgid "Channel is blocked on this site." -msgstr "Канал блокируется на этом сайте." +#: ../../include/nav.php:120 ../../include/nav.php:124 +msgid "Sign in" +msgstr "Войти" -#: ../../include/follow.php:28 -msgid "Channel location missing." -msgstr "Местоположение канала отсутствует." +#: ../../include/nav.php:151 +msgid "Take me home" +msgstr "Домой" -#: ../../include/follow.php:54 -msgid "Response from remote channel was incomplete." -msgstr "" +#: ../../include/nav.php:153 +msgid "Log me out of this site" +msgstr "Выйти с этого сайта" -#: ../../include/follow.php:85 -msgid "Channel was deleted and no longer exists." -msgstr "" +#: ../../include/nav.php:158 +msgid "Create an account" +msgstr "Создать аккаунт" -#: ../../include/follow.php:132 -msgid "Channel discovery failed." -msgstr "Не удалось обнаружить канал." +#: ../../include/nav.php:170 ../../include/nav.php:272 +#: ../../include/help.php:68 ../../include/help.php:74 +#: ../../Zotlabs/Lib/Apps.php:313 ../../Zotlabs/Module/Layouts.php:186 +msgid "Help" +msgstr "Помощь" -#: ../../include/follow.php:149 -msgid "local account not found." -msgstr "локальный аккаунт не найден." +#: ../../include/nav.php:170 +msgid "Help and documentation" +msgstr "Справочная информация и документация" -#: ../../include/follow.php:158 -msgid "Cannot connect to yourself." -msgstr "Нельзя подключиться к самому себе." +#: ../../include/nav.php:185 ../../include/acl_selectors.php:118 +#: ../../include/text.php:1062 ../../include/text.php:1074 +#: ../../Zotlabs/Lib/Apps.php:318 ../../Zotlabs/Widget/Sitesearch.php:31 +#: ../../Zotlabs/Widget/Activity_filter.php:148 +#: ../../Zotlabs/Module/Connections.php:335 ../../Zotlabs/Module/Search.php:44 +msgid "Search" +msgstr "Поиск" + +#: ../../include/nav.php:185 +msgid "Search site @name, !forum, #tag, ?docs, content" +msgstr "Искать на сайте @name, !forum, #tag, ?docs, содержимое" + +#: ../../include/nav.php:191 ../../Zotlabs/Widget/Admin.php:55 +msgid "Admin" +msgstr "Администрирование" + +#: ../../include/nav.php:191 +msgid "Site Setup and Configuration" +msgstr "Установка и конфигурация сайта" + +#: ../../include/nav.php:276 ../../Zotlabs/Widget/Notifications.php:162 +#: ../../Zotlabs/Module/Connedit.php:852 ../../Zotlabs/Module/Defperms.php:240 +#: ../../Zotlabs/Module/New_channel.php:154 +#: ../../Zotlabs/Module/New_channel.php:161 +msgid "Loading" +msgstr "Загрузка" + +#: ../../include/nav.php:282 +msgid "@name, !forum, #tag, ?doc, content" +msgstr "@name, !forum, #tag, ?docs, содержимое" + +#: ../../include/nav.php:283 +msgid "Please wait..." +msgstr "Подождите пожалуйста ..." + +#: ../../include/nav.php:289 +msgid "Add Apps" +msgstr "Добавить приложения" + +#: ../../include/nav.php:290 +msgid "Arrange Apps" +msgstr "Управление приложениями" + +#: ../../include/nav.php:291 +msgid "Toggle System Apps" +msgstr "Переключить системные приложения" + +#: ../../include/nav.php:412 ../../include/nav.php:415 +#: ../../Zotlabs/Storage/Browser.php:140 +msgid "Calendar" +msgstr "Календарь" + +#: ../../include/nav.php:461 ../../include/features.php:133 +#: ../../Zotlabs/Lib/Apps.php:292 ../../Zotlabs/Module/Articles.php:38 +#: ../../Zotlabs/Module/Articles.php:191 +msgid "Articles" +msgstr "Статьи" + +#: ../../include/help.php:34 +msgid "Help:" +msgstr "Помощь:" + +#: ../../include/help.php:78 +msgid "Not Found" +msgstr "Не найдено" + +#: ../../include/help.php:81 ../../Zotlabs/Lib/NativeWikiPage.php:519 +#: ../../Zotlabs/Web/Router.php:167 ../../Zotlabs/Module/Block.php:77 +#: ../../Zotlabs/Module/Page.php:136 ../../Zotlabs/Module/Display.php:141 +#: ../../Zotlabs/Module/Display.php:158 ../../Zotlabs/Module/Display.php:175 +msgid "Page not found." +msgstr "Страница не найдена." -#: ../../include/group.php:25 +#: ../../include/group.php:22 msgid "" "A deleted group with this name was revived. Existing item permissions " "<strong>may</strong> apply to this group and any future members. If this is " "not what you intended, please create another group with a different name." -msgstr "" - -#: ../../include/group.php:223 -msgid "Default privacy group for new contacts" -msgstr "Группа конфиденциальности по умолчанию для новых контактов" - -#: ../../include/group.php:242 ../../mod/admin.php:763 -msgid "All Channels" -msgstr "Все каналы" +msgstr "Удаленная группа с этим названием была восстановлена. Существующие разрешения пункт <strong>могут</strong> применяться к этой группе и к её будущих участников. Если это не то, чего вы хотели, пожалуйста, создайте другую группу с другим именем." #: ../../include/group.php:264 +msgid "Add new connections to this privacy group" +msgstr "Добавить новые контакты в группу безопасности" + +#: ../../include/group.php:298 msgid "edit" msgstr "редактировать" -#: ../../include/group.php:285 -msgid "Collections" -msgstr "Коллекции" +#: ../../include/group.php:321 +msgid "Edit group" +msgstr "Редактировать группу" -#: ../../include/group.php:286 -msgid "Edit collection" -msgstr "Редактировать коллекцию" +#: ../../include/group.php:322 +msgid "Add privacy group" +msgstr "Добавить группу безопасности" -#: ../../include/group.php:287 -msgid "Create a new collection" -msgstr "Создать новую коллекцию" +#: ../../include/group.php:323 +msgid "Channels not in any privacy group" +msgstr "Каналы не включены ни в одну группу безопасности" -#: ../../include/group.php:288 -msgid "Channels not in any collection" -msgstr "Контакты не в какой коллекции" - -#: ../../include/group.php:290 ../../include/widgets.php:266 +#: ../../include/group.php:325 ../../Zotlabs/Widget/Savedsearch.php:84 msgid "add" msgstr "добавить" -#: ../../include/identity.php:30 ../../mod/item.php:1270 -msgid "Unable to obtain identity information from database" -msgstr "Невозможно получить идентификационную информацию из базы данных" - -#: ../../include/identity.php:63 -msgid "Empty name" -msgstr "Пустое имя" - -#: ../../include/identity.php:65 -msgid "Name too long" -msgstr "Слишком длинное имя" - -#: ../../include/identity.php:166 -msgid "No account identifier" -msgstr "идентификатор аккаунта отсутствует" - -#: ../../include/identity.php:176 -msgid "Nickname is required." -msgstr "Требуется псевдоним." - -#: ../../include/identity.php:190 -msgid "Reserved nickname. Please choose another." -msgstr "" +#: ../../include/import.php:25 +msgid "Unable to import a removed channel." +msgstr "Невозможно импортировать удалённый канал." -#: ../../include/identity.php:195 +#: ../../include/import.php:51 msgid "" -"Nickname has unsupported characters or is already being used on this site." -msgstr "Псевдоним имеет недопустимые символы или уже используется на этом сайте." +"Cannot create a duplicate channel identifier on this system. Import failed." +msgstr "Не удалось создать дублирующийся идентификатор канала. Импорт невозможен." -#: ../../include/identity.php:258 -msgid "Unable to retrieve created identity" -msgstr "" +#: ../../include/import.php:116 +msgid "Cloned channel not found. Import failed." +msgstr "Клон канала не найден. Импорт невозможен." -#: ../../include/identity.php:317 -msgid "Default Profile" -msgstr "Профиль по умолчанию" +#: ../../include/photo/photo_driver.php:741 +#: ../../Zotlabs/Module/Profile_photo.php:120 +#: ../../Zotlabs/Module/Profile_photo.php:248 +msgid "Profile Photos" +msgstr "Фотографии профиля" -#: ../../include/identity.php:342 ../../include/widgets.php:400 -#: ../../include/profile_selectors.php:42 ../../mod/connedit.php:431 -msgid "Friends" -msgstr "Друзья" +#: ../../include/taxonomy.php:320 +msgid "Trending" +msgstr "В тренде" -#: ../../include/identity.php:509 -msgid "Requested channel is not available." -msgstr "Запрашиваемый канал не доступен." +#: ../../include/taxonomy.php:320 ../../include/taxonomy.php:449 +#: ../../include/taxonomy.php:470 ../../Zotlabs/Widget/Tagcloud.php:22 +msgid "Tags" +msgstr "Теги" -#: ../../include/identity.php:557 ../../mod/achievements.php:8 -#: ../../mod/profile.php:16 ../../mod/blocks.php:10 ../../mod/connect.php:13 -#: ../../mod/filestorage.php:40 ../../mod/layouts.php:8 -#: ../../mod/webpages.php:8 -msgid "Requested profile is not available." -msgstr "Запрашиваемый профиль не доступен." +#: ../../include/taxonomy.php:409 ../../include/taxonomy.php:491 +#: ../../include/taxonomy.php:511 ../../include/taxonomy.php:532 +#: ../../include/contact_widgets.php:97 ../../include/contact_widgets.php:141 +#: ../../include/contact_widgets.php:186 +#: ../../Zotlabs/Widget/Appcategories.php:43 +msgid "Categories" +msgstr "Категории" -#: ../../include/identity.php:675 ../../include/widgets.php:128 -#: ../../include/widgets.php:168 ../../include/Contact.php:107 -#: ../../mod/directory.php:183 ../../mod/dirprofile.php:164 -#: ../../mod/suggest.php:51 ../../mod/match.php:62 -msgid "Connect" -msgstr "Подключить" +#: ../../include/taxonomy.php:552 +msgid "Keywords" +msgstr "Ключевые слова" -#: ../../include/identity.php:689 ../../mod/profiles.php:612 -msgid "Change profile photo" -msgstr "Изменить фотографию профиля" +#: ../../include/taxonomy.php:573 +msgid "have" +msgstr "иметь" -#: ../../include/identity.php:695 -msgid "Profiles" -msgstr "Профили" +#: ../../include/taxonomy.php:573 +msgid "has" +msgstr "есть" -#: ../../include/identity.php:695 -msgid "Manage/edit profiles" -msgstr "Управление / Редактирование профилей" +#: ../../include/taxonomy.php:574 +msgid "want" +msgstr "хотеть" -#: ../../include/identity.php:696 ../../mod/profiles.php:613 -msgid "Create New Profile" -msgstr "Создать новый профиль" +#: ../../include/taxonomy.php:574 +msgid "wants" +msgstr "хотеть" -#: ../../include/identity.php:699 -msgid "Edit Profile" -msgstr "Редактировать профиль" +#: ../../include/taxonomy.php:575 ../../Zotlabs/Lib/ThreadItem.php:285 +msgid "like" +msgstr "нравится" -#: ../../include/identity.php:710 ../../mod/profiles.php:624 -msgid "Profile Image" -msgstr "Изображение профиля" +#: ../../include/taxonomy.php:575 +msgid "likes" +msgstr "нравится" -#: ../../include/identity.php:713 ../../mod/profiles.php:627 -msgid "visible to everybody" -msgstr "видно всем" +#: ../../include/taxonomy.php:576 ../../Zotlabs/Lib/ThreadItem.php:286 +msgid "dislike" +msgstr "не нравится" -#: ../../include/identity.php:714 ../../mod/profiles.php:628 -msgid "Edit visibility" -msgstr "Редактировать видимость" +#: ../../include/taxonomy.php:576 +msgid "dislikes" +msgstr "не нравится" -#: ../../include/identity.php:728 ../../include/identity.php:952 -#: ../../mod/directory.php:158 -msgid "Gender:" -msgstr "Пол:" +#: ../../include/zid.php:351 +#, php-format +msgid "OpenWebAuth: %1$s welcomes %2$s" +msgstr "OpenWebAuth: %1$s приветствует %2$s" -#: ../../include/identity.php:729 ../../include/identity.php:996 -#: ../../mod/directory.php:160 -msgid "Status:" -msgstr "Статус:" +#: ../../include/language.php:397 ../../include/text.php:1866 +msgid "default" +msgstr "по умолчанию" -#: ../../include/identity.php:730 ../../include/identity.php:1007 -#: ../../mod/directory.php:162 -msgid "Homepage:" -msgstr "Домашняя страница:" +#: ../../include/language.php:410 +msgid "Select an alternate language" +msgstr "Выбор дополнительного языка" -#: ../../include/identity.php:731 ../../mod/dirprofile.php:151 -msgid "Online Now" -msgstr "Сейчас в сети" +#: ../../include/follow.php:37 +msgid "Channel is blocked on this site." +msgstr "Канал блокируется на этом сайте." -#: ../../include/identity.php:796 ../../include/identity.php:876 -#: ../../mod/ping.php:262 -msgid "g A l F d" -msgstr "g A l F d" +#: ../../include/follow.php:42 +msgid "Channel location missing." +msgstr "Местоположение канала отсутствует." -#: ../../include/identity.php:797 ../../include/identity.php:877 -msgid "F d" -msgstr "F d" +#: ../../include/follow.php:84 +msgid "Response from remote channel was incomplete." +msgstr "Ответ удаленного канала неполный." -#: ../../include/identity.php:842 ../../include/identity.php:917 -#: ../../mod/ping.php:284 -msgid "[today]" -msgstr "[сегодня]" +#: ../../include/follow.php:96 +msgid "Premium channel - please visit:" +msgstr "Премимум-канал - пожалуйста посетите:" + +#: ../../include/follow.php:110 +msgid "Channel was deleted and no longer exists." +msgstr "Канал удален и больше не существует." -#: ../../include/identity.php:854 -msgid "Birthday Reminders" -msgstr "Напоминания о Днях Рождения" +#: ../../include/follow.php:165 +msgid "Remote channel or protocol unavailable." +msgstr "Удалённый канал или протокол недоступен." -#: ../../include/identity.php:855 -msgid "Birthdays this week:" -msgstr "Дни Рождения на этой неделе:" +#: ../../include/follow.php:188 +msgid "Channel discovery failed." +msgstr "Не удалось обнаружить канал." -#: ../../include/identity.php:910 -msgid "[No description]" -msgstr "[без описания]" +#: ../../include/follow.php:200 +msgid "Protocol disabled." +msgstr "Протокол отключен." -#: ../../include/identity.php:928 -msgid "Event Reminders" -msgstr "Напоминания мероприятий" +#: ../../include/follow.php:211 +msgid "Cannot connect to yourself." +msgstr "Нельзя подключиться к самому себе." -#: ../../include/identity.php:929 -msgid "Events this week:" -msgstr "Мероприятия на этой неделе:" +#: ../../include/acl_selectors.php:33 +#: ../../Zotlabs/Lib/PermissionDescription.php:34 +msgid "Visible to your default audience" +msgstr "Видно вашей аудитории по умолчанию." -#: ../../include/identity.php:942 ../../include/identity.php:1050 -#: ../../include/apps.php:128 ../../mod/profperm.php:112 +#: ../../include/acl_selectors.php:88 ../../Zotlabs/Module/Acl.php:120 +#: ../../Zotlabs/Module/Lockview.php:117 ../../Zotlabs/Module/Lockview.php:153 +msgctxt "acl" msgid "Profile" msgstr "Профиль" -#: ../../include/identity.php:950 ../../mod/settings.php:935 -msgid "Full Name:" -msgstr "Полное имя:" +#: ../../include/acl_selectors.php:106 +#: ../../Zotlabs/Lib/PermissionDescription.php:107 +msgid "Only me" +msgstr "Только мне" -#: ../../include/identity.php:957 -msgid "Like this channel" -msgstr "нравиться этот канал" +#: ../../include/acl_selectors.php:113 +msgid "Who can see this?" +msgstr "Кто может это видеть?" -#: ../../include/identity.php:981 -msgid "j F, Y" -msgstr "j F, Y" - -#: ../../include/identity.php:982 -msgid "j F" -msgstr "j F" +#: ../../include/acl_selectors.php:114 +msgid "Custom selection" +msgstr "Настраиваемый выбор" -#: ../../include/identity.php:989 -msgid "Birthday:" -msgstr "День Рождения:" +#: ../../include/acl_selectors.php:115 +msgid "" +"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit " +"the scope of \"Show\"." +msgstr "" +"Нажмите \"Показать\" чтобы разрешить просмотр. \"Не показывать\" позволит вам " +"переопределить и ограничить область показа." -#: ../../include/identity.php:993 -msgid "Age:" -msgstr "Возраст:" +#: ../../include/acl_selectors.php:116 +msgid "Show" +msgstr "Показать" -#: ../../include/identity.php:1002 -#, php-format -msgid "for %1$d %2$s" -msgstr "для %1$d %2$s" +#: ../../include/acl_selectors.php:117 +msgid "Don't show" +msgstr "Не показывать" -#: ../../include/identity.php:1005 ../../mod/profiles.php:535 -msgid "Sexual Preference:" -msgstr "Сексуальная ориентация:" +#: ../../include/acl_selectors.php:123 ../../Zotlabs/Module/Photos.php:707 +#: ../../Zotlabs/Module/Photos.php:1076 +#: ../../Zotlabs/Module/Filestorage.php:170 +#: ../../Zotlabs/Module/Connedit.php:676 ../../Zotlabs/Module/Chat.php:235 +#: ../../Zotlabs/Module/Thing.php:319 ../../Zotlabs/Module/Thing.php:372 +msgid "Permissions" +msgstr "Разрешения" -#: ../../include/identity.php:1009 ../../mod/profiles.php:537 -msgid "Hometown:" -msgstr "Родной город:" +#: ../../include/acl_selectors.php:125 ../../Zotlabs/Lib/ThreadItem.php:426 +#: ../../Zotlabs/Module/Photos.php:1298 +msgid "Close" +msgstr "Закрыть" -#: ../../include/identity.php:1011 -msgid "Tags:" -msgstr "Тэги:" +#: ../../include/acl_selectors.php:150 +#, 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 "Разрешения публикации %s не могут быть изменены %s после того, как ею поделились. Эти разрешения устанавливают кому разрешено просматривать эту публикацию." -#: ../../include/identity.php:1013 ../../mod/profiles.php:538 -msgid "Political Views:" -msgstr "Политические взгляды:" +#: ../../include/datetime.php:58 ../../Zotlabs/Widget/Newmember.php:44 +#: ../../Zotlabs/Module/Profiles.php:736 +msgid "Miscellaneous" +msgstr "Прочее" -#: ../../include/identity.php:1015 -msgid "Religion:" -msgstr "Религия:" +#: ../../include/datetime.php:140 +msgid "Birthday" +msgstr "День рождения" -#: ../../include/identity.php:1017 ../../mod/directory.php:164 -msgid "About:" -msgstr "О себе:" +#: ../../include/datetime.php:140 +msgid "Age: " +msgstr "Возраст:" -#: ../../include/identity.php:1019 -msgid "Hobbies/Interests:" -msgstr "Хобби / интересы:" +#: ../../include/datetime.php:140 +msgid "YYYY-MM-DD or MM-DD" +msgstr "YYYY-MM-DD или MM-DD" -#: ../../include/identity.php:1021 ../../mod/profiles.php:541 -msgid "Likes:" -msgstr "Что вам нравится:" +#: ../../include/datetime.php:211 ../../Zotlabs/Module/Appman.php:141 +#: ../../Zotlabs/Module/Appman.php:142 ../../Zotlabs/Module/Events.php:460 +#: ../../Zotlabs/Module/Events.php:465 ../../Zotlabs/Module/Profiles.php:745 +#: ../../Zotlabs/Module/Profiles.php:749 +msgid "Required" +msgstr "Требуется" -#: ../../include/identity.php:1023 ../../mod/profiles.php:542 -msgid "Dislikes:" -msgstr "Что вам не нравится:" +#: ../../include/datetime.php:244 +msgid "less than a second ago" +msgstr "менее чем одну секунду" -#: ../../include/identity.php:1026 -msgid "Contact information and Social Networks:" -msgstr "Информация и социальные сети контакта:" +#: ../../include/datetime.php:262 +#, php-format +msgctxt "e.g. 22 hours ago, 1 minute ago" +msgid "%1$d %2$s ago" +msgstr "%1$d %2$s назад" -#: ../../include/identity.php:1028 -msgid "My other channels:" -msgstr "Мои другие каналы:" +#: ../../include/datetime.php:273 +msgctxt "relative_date" +msgid "year" +msgid_plural "years" +msgstr[0] "год" +msgstr[1] "года" +msgstr[2] "лет" -#: ../../include/identity.php:1030 -msgid "Musical interests:" -msgstr "Музыкальные интересы:" +#: ../../include/datetime.php:276 +msgctxt "relative_date" +msgid "month" +msgid_plural "months" +msgstr[0] "месяц" +msgstr[1] "месяца" +msgstr[2] "месяцев" -#: ../../include/identity.php:1032 -msgid "Books, literature:" -msgstr "Книги, литература:" +#: ../../include/datetime.php:279 +msgctxt "relative_date" +msgid "week" +msgid_plural "weeks" +msgstr[0] "неделю" +msgstr[1] "недели" +msgstr[2] "недель" -#: ../../include/identity.php:1034 -msgid "Television:" -msgstr "Телевидение:" +#: ../../include/datetime.php:282 +msgctxt "relative_date" +msgid "day" +msgid_plural "days" +msgstr[0] "день" +msgstr[1] "дня" +msgstr[2] "дней" -#: ../../include/identity.php:1036 -msgid "Film/dance/culture/entertainment:" -msgstr "Кино / танцы / культура / развлечения:" +#: ../../include/datetime.php:285 +msgctxt "relative_date" +msgid "hour" +msgid_plural "hours" +msgstr[0] "час" +msgstr[1] "часа" +msgstr[2] "часов" -#: ../../include/identity.php:1038 -msgid "Love/Romance:" -msgstr "Любовь / Романс:" +#: ../../include/datetime.php:288 +msgctxt "relative_date" +msgid "minute" +msgid_plural "minutes" +msgstr[0] "минуту" +msgstr[1] "минуты" +msgstr[2] "минут" -#: ../../include/identity.php:1040 -msgid "Work/employment:" -msgstr "Работа / Занятость:" +#: ../../include/datetime.php:291 +msgctxt "relative_date" +msgid "second" +msgid_plural "seconds" +msgstr[0] "секунду" +msgstr[1] "секунды" +msgstr[2] "секунд" -#: ../../include/identity.php:1042 -msgid "School/education:" -msgstr "Школа / образование:" +#: ../../include/datetime.php:520 +#, php-format +msgid "%1$s's birthday" +msgstr "У %1$s День рождения" -#: ../../include/identity.php:1052 -msgid "Like this thing" -msgstr "нравится этo" +#: ../../include/datetime.php:521 +#, php-format +msgid "Happy Birthday %1$s" +msgstr "С Днем рождения %1$s !" -#: ../../include/network.php:652 -msgid "view full size" -msgstr "посмотреть в полный размер" +#: ../../include/dba/dba_driver.php:178 +#, php-format +msgid "Cannot locate DNS info for database server '%s'" +msgstr "Не удается найти DNS информацию для сервера базы данных '%s'" -#: ../../include/text.php:320 +#: ../../include/text.php:492 msgid "prev" msgstr "предыдущий" -#: ../../include/text.php:322 +#: ../../include/text.php:494 msgid "first" msgstr "первый" -#: ../../include/text.php:351 +#: ../../include/text.php:523 msgid "last" msgstr "последний" -#: ../../include/text.php:354 +#: ../../include/text.php:526 msgid "next" msgstr "следующий" -#: ../../include/text.php:366 +#: ../../include/text.php:537 msgid "older" -msgstr "старший" +msgstr "старше" -#: ../../include/text.php:368 +#: ../../include/text.php:539 msgid "newer" msgstr "новее" -#: ../../include/text.php:729 +#: ../../include/text.php:963 msgid "No connections" msgstr "Нет контактов" -#: ../../include/text.php:742 +#: ../../include/text.php:975 ../../Zotlabs/Lib/Apps.php:298 +#: ../../Zotlabs/Module/Connections.php:331 +msgid "Connections" +msgstr "Контакты" + +#: ../../include/text.php:995 #, php-format -msgid "%d Connection" -msgid_plural "%d Connections" -msgstr[0] "%d контакт" -msgstr[1] "%d контакта" -msgstr[2] "%d контактов" +msgid "View all %s connections" +msgstr "Просмотреть все %s контактов" -#: ../../include/text.php:754 -msgid "View Connections" -msgstr "Просмотр контактов" +#: ../../include/text.php:1051 +#, php-format +msgid "Network: %s" +msgstr "Сеть: %s" -#: ../../include/text.php:815 ../../include/text.php:829 -#: ../../include/widgets.php:186 ../../mod/rbmark.php:28 -#: ../../mod/rbmark.php:98 ../../mod/filer.php:50 +#: ../../include/text.php:1063 ../../include/text.php:1075 +#: ../../Zotlabs/Widget/Notes.php:18 ../../Zotlabs/Module/Rbmark.php:32 +#: ../../Zotlabs/Module/Rbmark.php:104 ../../Zotlabs/Module/Admin/Profs.php:94 +#: ../../Zotlabs/Module/Admin/Profs.php:114 ../../Zotlabs/Module/Filer.php:53 msgid "Save" msgstr "Запомнить" -#: ../../include/text.php:895 +#: ../../include/text.php:1140 ../../include/text.php:1144 msgid "poke" -msgstr "подпихнуть" +msgstr "Ткнуть" -#: ../../include/text.php:896 +#: ../../include/text.php:1145 msgid "ping" -msgstr "пинг - проверка связи" +msgstr "Пингануть" -#: ../../include/text.php:896 +#: ../../include/text.php:1145 msgid "pinged" -msgstr "" +msgstr "Отпингован" -#: ../../include/text.php:897 +#: ../../include/text.php:1146 msgid "prod" -msgstr "" +msgstr "Подтолкнуть" -#: ../../include/text.php:897 +#: ../../include/text.php:1146 msgid "prodded" -msgstr "" +msgstr "Подтолкнут" -#: ../../include/text.php:898 +#: ../../include/text.php:1147 msgid "slap" -msgstr "" +msgstr "Шлёпнуть" -#: ../../include/text.php:898 +#: ../../include/text.php:1147 msgid "slapped" -msgstr "" +msgstr "Шлёпнут" -#: ../../include/text.php:899 +#: ../../include/text.php:1148 msgid "finger" -msgstr "" +msgstr "Указать" -#: ../../include/text.php:899 +#: ../../include/text.php:1148 msgid "fingered" -msgstr "" +msgstr "Указан" -#: ../../include/text.php:900 +#: ../../include/text.php:1149 msgid "rebuff" -msgstr "" +msgstr "Дать отпор" -#: ../../include/text.php:900 +#: ../../include/text.php:1149 msgid "rebuffed" -msgstr "" +msgstr "Дан отпор" -#: ../../include/text.php:909 +#: ../../include/text.php:1172 msgid "happy" msgstr "счастливый" -#: ../../include/text.php:910 +#: ../../include/text.php:1173 msgid "sad" msgstr "грустный" -#: ../../include/text.php:911 +#: ../../include/text.php:1174 msgid "mellow" msgstr "спокойный" -#: ../../include/text.php:912 +#: ../../include/text.php:1175 msgid "tired" msgstr "усталый" -#: ../../include/text.php:913 +#: ../../include/text.php:1176 msgid "perky" msgstr "весёлый" -#: ../../include/text.php:914 +#: ../../include/text.php:1177 msgid "angry" msgstr "сердитый" -#: ../../include/text.php:915 -msgid "stupified" +#: ../../include/text.php:1178 +msgid "stupefied" msgstr "отупевший" -#: ../../include/text.php:916 +#: ../../include/text.php:1179 msgid "puzzled" -msgstr "недоумённый" +msgstr "недоумевающий" -#: ../../include/text.php:917 +#: ../../include/text.php:1180 msgid "interested" msgstr "заинтересованный" -#: ../../include/text.php:918 +#: ../../include/text.php:1181 msgid "bitter" -msgstr "озлобленный" +msgstr "едкий" -#: ../../include/text.php:919 +#: ../../include/text.php:1182 msgid "cheerful" msgstr "бодрый" -#: ../../include/text.php:920 +#: ../../include/text.php:1183 msgid "alive" msgstr "энергичный" -#: ../../include/text.php:921 +#: ../../include/text.php:1184 msgid "annoyed" msgstr "раздражённый" -#: ../../include/text.php:922 +#: ../../include/text.php:1185 msgid "anxious" msgstr "обеспокоенный" -#: ../../include/text.php:923 +#: ../../include/text.php:1186 msgid "cranky" msgstr "капризный" -#: ../../include/text.php:924 +#: ../../include/text.php:1187 msgid "disturbed" msgstr "встревоженный" -#: ../../include/text.php:925 +#: ../../include/text.php:1188 msgid "frustrated" msgstr "разочарованный" -#: ../../include/text.php:926 +#: ../../include/text.php:1189 msgid "depressed" -msgstr "" +msgstr "подавленный" -#: ../../include/text.php:927 +#: ../../include/text.php:1190 msgid "motivated" msgstr "мотивированный" -#: ../../include/text.php:928 +#: ../../include/text.php:1191 msgid "relaxed" msgstr "расслабленный" -#: ../../include/text.php:929 +#: ../../include/text.php:1192 msgid "surprised" msgstr "удивленный" -#: ../../include/text.php:1090 +#: ../../include/text.php:1371 ../../include/js_strings.php:86 msgid "Monday" msgstr "Понедельник" -#: ../../include/text.php:1090 +#: ../../include/text.php:1371 ../../include/js_strings.php:87 msgid "Tuesday" msgstr "Вторник" -#: ../../include/text.php:1090 +#: ../../include/text.php:1371 ../../include/js_strings.php:88 msgid "Wednesday" msgstr "Среда" -#: ../../include/text.php:1090 +#: ../../include/text.php:1371 ../../include/js_strings.php:89 msgid "Thursday" msgstr "Четверг" -#: ../../include/text.php:1090 +#: ../../include/text.php:1371 ../../include/js_strings.php:90 msgid "Friday" msgstr "Пятница" -#: ../../include/text.php:1090 +#: ../../include/text.php:1371 ../../include/js_strings.php:91 msgid "Saturday" msgstr "Суббота" -#: ../../include/text.php:1090 +#: ../../include/text.php:1371 ../../include/js_strings.php:85 msgid "Sunday" msgstr "Воскресенье" -#: ../../include/text.php:1094 +#: ../../include/text.php:1375 ../../include/js_strings.php:61 msgid "January" msgstr "Январь" -#: ../../include/text.php:1094 +#: ../../include/text.php:1375 ../../include/js_strings.php:62 msgid "February" msgstr "Февраль" -#: ../../include/text.php:1094 +#: ../../include/text.php:1375 ../../include/js_strings.php:63 msgid "March" msgstr "Март" -#: ../../include/text.php:1094 +#: ../../include/text.php:1375 ../../include/js_strings.php:64 msgid "April" msgstr "Апрель" -#: ../../include/text.php:1094 +#: ../../include/text.php:1375 msgid "May" msgstr "Май" -#: ../../include/text.php:1094 +#: ../../include/text.php:1375 ../../include/js_strings.php:66 msgid "June" msgstr "Июнь" -#: ../../include/text.php:1094 +#: ../../include/text.php:1375 ../../include/js_strings.php:67 msgid "July" msgstr "Июль" -#: ../../include/text.php:1094 +#: ../../include/text.php:1375 ../../include/js_strings.php:68 msgid "August" msgstr "Август" -#: ../../include/text.php:1094 +#: ../../include/text.php:1375 ../../include/js_strings.php:69 msgid "September" msgstr "Сентябрь" -#: ../../include/text.php:1094 +#: ../../include/text.php:1375 ../../include/js_strings.php:70 msgid "October" msgstr "Октябрь" -#: ../../include/text.php:1094 +#: ../../include/text.php:1375 ../../include/js_strings.php:71 msgid "November" msgstr "Ноябрь" -#: ../../include/text.php:1094 +#: ../../include/text.php:1375 ../../include/js_strings.php:72 msgid "December" msgstr "Декабрь" -#: ../../include/text.php:1172 -msgid "unknown.???" -msgstr "неизвестный.???" +#: ../../include/text.php:1449 +msgid "Unknown Attachment" +msgstr "Неизвестное вложение" -#: ../../include/text.php:1173 -msgid "bytes" -msgstr "байт" +#: ../../include/text.php:1451 ../../Zotlabs/Module/Sharedwithme.php:107 +#: ../../Zotlabs/Storage/Browser.php:287 +msgid "Size" +msgstr "Размер" -#: ../../include/text.php:1208 +#: ../../include/text.php:1487 msgid "remove category" -msgstr "" +msgstr "удалить категорию" -#: ../../include/text.php:1257 +#: ../../include/text.php:1561 msgid "remove from file" -msgstr "" +msgstr "удалить из файла" -#: ../../include/text.php:1318 ../../include/text.php:1330 -msgid "Click to open/close" -msgstr "Нажмите, чтобы открыть/закрыть" +#: ../../include/text.php:1703 ../../include/message.php:12 +msgid "Download binary/encrypted content" +msgstr "Загрузить двоичное / зашифрованное содержимое" -#: ../../include/text.php:1485 ../../mod/events.php:355 +#: ../../include/text.php:1844 ../../Zotlabs/Module/Events.php:660 +#: ../../Zotlabs/Module/Cal.php:315 msgid "Link to Source" msgstr "Ссылка на источник" -#: ../../include/text.php:1504 -msgid "Select a page layout: " +#: ../../include/text.php:1874 +msgid "Page layout" +msgstr "Шаблон страницы" + +#: ../../include/text.php:1874 +msgid "You can create your own with the layouts tool" +msgstr "Вы можете создать свой собственный с помощью инструмента шаблонов" + +#: ../../include/text.php:1884 ../../Zotlabs/Widget/Wiki_pages.php:36 +#: ../../Zotlabs/Widget/Wiki_pages.php:93 ../../Zotlabs/Module/Wiki.php:208 +#: ../../Zotlabs/Module/Wiki.php:350 +msgid "BBcode" msgstr "" -#: ../../include/text.php:1507 ../../include/text.php:1572 -msgid "default" -msgstr "по умолчанию" +#: ../../include/text.php:1885 +msgid "HTML" +msgstr "" + +#: ../../include/text.php:1887 ../../Zotlabs/Widget/Wiki_pages.php:36 +#: ../../Zotlabs/Widget/Wiki_pages.php:93 ../../Zotlabs/Module/Wiki.php:208 +msgid "Text" +msgstr "Текст" -#: ../../include/text.php:1543 -msgid "Page content type: " +#: ../../include/text.php:1888 +msgid "Comanche Layout" +msgstr "Шаблон Comanche" + +#: ../../include/text.php:1893 +msgid "PHP" msgstr "" -#: ../../include/text.php:1584 -msgid "Select an alternate language" -msgstr "Выбор альтернативного языка" +#: ../../include/text.php:1902 +msgid "Page content type" +msgstr "Тип содержимого страницы" -#: ../../include/text.php:1718 +#: ../../include/text.php:2035 msgid "activity" msgstr "активность" -#: ../../include/text.php:1977 -msgid "Design" -msgstr "Дизайн" +#: ../../include/text.php:2135 +msgid "a-z, 0-9, -, and _ only" +msgstr "Только a-z, 0-9, -, и _" + +#: ../../include/text.php:2455 +msgid "Design Tools" +msgstr "Инструменты дизайна" -#: ../../include/text.php:1979 +#: ../../include/text.php:2458 ../../Zotlabs/Module/Blocks.php:154 msgid "Blocks" -msgstr "Блоки" +msgstr "Блокировки" -#: ../../include/text.php:1980 +#: ../../include/text.php:2459 ../../Zotlabs/Module/Menu.php:170 msgid "Menus" msgstr "Меню" -#: ../../include/text.php:1981 +#: ../../include/text.php:2460 ../../Zotlabs/Module/Layouts.php:184 msgid "Layouts" msgstr "Шаблоны" -#: ../../include/text.php:1982 +#: ../../include/text.php:2461 msgid "Pages" msgstr "Страницы" -#: ../../include/apps.php:118 -msgid "Site Admin" -msgstr "Админ сайта" +#: ../../include/text.php:2482 ../../Zotlabs/Module/Cal.php:344 +msgid "Import" +msgstr "Импортировать" -#: ../../include/apps.php:120 -msgid "Address Book" -msgstr "Адресная книга" +#: ../../include/text.php:2483 +msgid "Import website..." +msgstr "Импорт веб-сайта..." -#: ../../include/apps.php:134 ../../mod/mood.php:131 -msgid "Mood" -msgstr "Настроение" +#: ../../include/text.php:2484 +msgid "Select folder to import" +msgstr "Выбрать каталог для импорта" -#: ../../include/apps.php:138 -msgid "Probe" +#: ../../include/text.php:2485 +msgid "Import from a zipped folder:" +msgstr "Импортировать из каталога в zip-архиве:" + +#: ../../include/text.php:2486 +msgid "Import from cloud files:" +msgstr "Импортировать из сетевых файлов:" + +#: ../../include/text.php:2487 +msgid "/cloud/channel/path/to/folder" msgstr "" -#: ../../include/apps.php:139 -msgid "Suggest" +#: ../../include/text.php:2488 +msgid "Enter path to website files" +msgstr "Введите путь к файлам веб-сайта" + +#: ../../include/text.php:2489 +msgid "Select folder" +msgstr "Выбрать каталог" + +#: ../../include/text.php:2490 +msgid "Export website..." +msgstr "Экспорт веб-сайта..." + +#: ../../include/text.php:2491 +msgid "Export to a zip file" +msgstr "Экспортировать в ZIP файл." + +#: ../../include/text.php:2492 +msgid "website.zip" msgstr "" -#: ../../include/apps.php:224 ../../mod/settings.php:79 -#: ../../mod/settings.php:541 -msgid "Update" -msgstr "Обновление" +#: ../../include/text.php:2493 +msgid "Enter a name for the zip file." +msgstr "Введите имя для ZIP файла." -#: ../../include/apps.php:224 -msgid "Install" -msgstr "Установка" +#: ../../include/text.php:2494 +msgid "Export to cloud files" +msgstr "Эскпортировать в сетевые файлы:" -#: ../../include/apps.php:229 -msgid "Purchase" +#: ../../include/text.php:2495 +msgid "/path/to/export/folder" msgstr "" -#: ../../include/apps.php:313 ../../include/apps.php:364 -#: ../../mod/connedit.php:434 -msgid "Unknown" -msgstr "Неизвестный" +#: ../../include/text.php:2496 +msgid "Enter a path to a cloud files destination." +msgstr "Введите путь к расположению сетевых файлов." -#: ../../include/zot.php:607 -msgid "Invalid data packet" -msgstr "Неверный пакет данных" +#: ../../include/text.php:2497 +msgid "Specify folder" +msgstr "Указать каталог" -#: ../../include/zot.php:617 -msgid "Unable to verify channel signature" -msgstr "Невозможно проверить сигнатуру канала" +#: ../../include/text.php:2817 ../../Zotlabs/Storage/Browser.php:131 +msgid "Collection" +msgstr "Коллекция" -#: ../../include/zot.php:814 +#: ../../include/security.php:541 +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 "Не верный токен безопасности для формы. Вероятно, это произошло потому, что форма была открыта слишком долго (> 3-х часов) перед его отправкой." + +#: ../../include/menu.php:118 ../../include/channel.php:1296 +#: ../../include/channel.php:1300 ../../Zotlabs/Lib/ThreadItem.php:128 +#: ../../Zotlabs/Lib/Apps.php:475 ../../Zotlabs/Widget/Cdav.php:126 +#: ../../Zotlabs/Widget/Cdav.php:162 ../../Zotlabs/Module/Connections.php:281 +#: ../../Zotlabs/Module/Connections.php:319 +#: ../../Zotlabs/Module/Connections.php:339 +#: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Module/Card_edit.php:99 +#: ../../Zotlabs/Module/Editblock.php:114 ../../Zotlabs/Module/Webpages.php:240 +#: ../../Zotlabs/Module/Editwebpage.php:142 +#: ../../Zotlabs/Module/Editlayout.php:114 +#: ../../Zotlabs/Module/Admin/Profs.php:175 ../../Zotlabs/Module/Blocks.php:160 +#: ../../Zotlabs/Module/Menu.php:175 +#: ../../Zotlabs/Module/Settings/Oauth2.php:150 +#: ../../Zotlabs/Module/Settings/Oauth.php:150 +#: ../../Zotlabs/Module/Article_edit.php:99 ../../Zotlabs/Module/Wiki.php:202 +#: ../../Zotlabs/Module/Wiki.php:362 ../../Zotlabs/Module/Group.php:216 +#: ../../Zotlabs/Module/Thing.php:266 ../../Zotlabs/Storage/Browser.php:290 +msgid "Edit" +msgstr "Изменить" + +#: ../../include/items.php:891 ../../include/items.php:951 +msgid "(Unknown)" +msgstr "(Неизвестный)" + +#: ../../include/items.php:1137 +msgid "Visible to anybody on the internet." +msgstr "Виден всем в интернете." + +#: ../../include/items.php:1139 +msgid "Visible to you only." +msgstr "Видно только вам." + +#: ../../include/items.php:1141 +msgid "Visible to anybody in this network." +msgstr "Видно всем в этой сети." + +#: ../../include/items.php:1143 +msgid "Visible to anybody authenticated." +msgstr "Видно всем аутентифицированным." + +#: ../../include/items.php:1145 #, php-format -msgid "Unable to verify site signature for %s" -msgstr "" +msgid "Visible to anybody on %s." +msgstr "Видно всем в %s." -#: ../../include/message.php:18 -msgid "No recipient provided." -msgstr "" +#: ../../include/items.php:1147 +msgid "Visible to all connections." +msgstr "Видно всем контактам." -#: ../../include/message.php:23 -msgid "[no subject]" -msgstr "[без темы]" +#: ../../include/items.php:1149 +msgid "Visible to approved connections." +msgstr "Видно только одобренным контактам." -#: ../../include/message.php:42 -msgid "Unable to determine sender." -msgstr "Невозможно определить отправителя." +#: ../../include/items.php:1151 +msgid "Visible to specific connections." +msgstr "Видно указанным контактам." -#: ../../include/message.php:143 -msgid "Stored post could not be verified." -msgstr "" +#: ../../include/items.php:3566 ../../Zotlabs/Module/Viewsrc.php:25 +#: ../../Zotlabs/Module/Filestorage.php:24 ../../Zotlabs/Module/Admin.php:62 +#: ../../Zotlabs/Module/Admin/Addons.php:259 +#: ../../Zotlabs/Module/Admin/Themes.php:72 ../../Zotlabs/Module/Thing.php:94 +#: ../../Zotlabs/Module/Display.php:46 ../../Zotlabs/Module/Display.php:453 +msgid "Item not found." +msgstr "Элемент не найден." -#: ../../include/plugin.php:486 ../../include/plugin.php:488 -msgid "Click here to upgrade." -msgstr "Нажмите здесь, чтобы обновить." +#: ../../include/items.php:4125 ../../Zotlabs/Module/Group.php:51 +#: ../../Zotlabs/Module/Group.php:181 +msgid "Privacy group not found." +msgstr "Группа безопасности не найдена." -#: ../../include/plugin.php:494 -msgid "This action exceeds the limits set by your subscription plan." -msgstr "" +#: ../../include/items.php:4141 +msgid "Privacy group is empty." +msgstr "Группа безопасности пуста" -#: ../../include/plugin.php:499 -msgid "This action is not available under your subscription plan." -msgstr "" +#: ../../include/items.php:4148 +#, php-format +msgid "Privacy group: %s" +msgstr "Группа безопасности: %s" -#: ../../include/widgets.php:80 -msgid "System" -msgstr "Система" +#: ../../include/items.php:4158 ../../Zotlabs/Module/Connedit.php:850 +#, php-format +msgid "Connection: %s" +msgstr "Контакт: %s" -#: ../../include/widgets.php:83 -msgid "Create Personal App" -msgstr "Создать собственное приложение" +#: ../../include/items.php:4160 +msgid "Connection not found." +msgstr "Контакт не найден." -#: ../../include/widgets.php:84 -msgid "Edit Personal App" -msgstr "Редактировать собственное приложение" +#: ../../include/items.php:4502 ../../Zotlabs/Module/Cover_photo.php:269 +msgid "female" +msgstr "женщина" -#: ../../include/widgets.php:130 ../../mod/suggest.php:53 -msgid "Ignore/Hide" -msgstr "Игнорировать / Скрыть" +#: ../../include/items.php:4503 ../../Zotlabs/Module/Cover_photo.php:270 +#, php-format +msgid "%1$s updated her %2$s" +msgstr "%1$s обновила её %2$s" -#: ../../include/widgets.php:136 ../../mod/connections.php:267 -msgid "Suggestions" -msgstr "Рекомендации" +#: ../../include/items.php:4504 ../../Zotlabs/Module/Cover_photo.php:271 +msgid "male" +msgstr "мужчина" -#: ../../include/widgets.php:137 -msgid "See more..." -msgstr "Просмотреть больше..." +#: ../../include/items.php:4505 ../../Zotlabs/Module/Cover_photo.php:272 +#, php-format +msgid "%1$s updated his %2$s" +msgstr "%1$s обновил его %2$s" -#: ../../include/widgets.php:159 +#: ../../include/items.php:4507 ../../Zotlabs/Module/Cover_photo.php:274 #, php-format -msgid "You have %1$.0f of %2$.0f allowed connections." -msgstr "" +msgid "%1$s updated their %2$s" +msgstr "%1$s обновили их %2$s" -#: ../../include/widgets.php:165 -msgid "Add New Connection" -msgstr "Добавить новый контакт" +#: ../../include/items.php:4509 +msgid "profile photo" +msgstr "Фотография профиля" -#: ../../include/widgets.php:166 -msgid "Enter the channel address" -msgstr "Введите адрес канала" +#: ../../include/items.php:4700 +#, php-format +msgid "[Edited %s]" +msgstr "[Отредактировано %s]" -#: ../../include/widgets.php:167 -msgid "Example: bob@example.com, http://example.com/barbara" -msgstr "Пример: bob@example.com, http://example.com/barbara" +#: ../../include/items.php:4700 +msgctxt "edit_activity" +msgid "Post" +msgstr "Публикация" -#: ../../include/widgets.php:184 -msgid "Notes" -msgstr "Заметки" +#: ../../include/items.php:4700 +msgctxt "edit_activity" +msgid "Comment" +msgstr "Комментарий" -#: ../../include/widgets.php:256 -msgid "Remove term" -msgstr "Удалить термин" +#: ../../include/contact_widgets.php:11 +#, php-format +msgid "%d invitation available" +msgid_plural "%d invitations available" +msgstr[0] "доступно %d приглашение" +msgstr[1] "доступны %d приглашения" +msgstr[2] "доступны %d приглашений" -#: ../../include/widgets.php:335 -msgid "Archives" -msgstr "Архивы" +#: ../../include/contact_widgets.php:16 ../../Zotlabs/Module/Admin/Site.php:313 +msgid "Advanced" +msgstr "Дополнительно" -#: ../../include/widgets.php:397 -msgid "Refresh" -msgstr "Обновить" +#: ../../include/contact_widgets.php:19 +msgid "Find Channels" +msgstr "Поиск каналов" -#: ../../include/widgets.php:398 ../../mod/connedit.php:428 -msgid "Me" -msgstr "Я" +#: ../../include/contact_widgets.php:20 +msgid "Enter name or interest" +msgstr "Впишите имя или интерес" + +#: ../../include/contact_widgets.php:21 +msgid "Connect/Follow" +msgstr "Подключить / отслеживать" + +#: ../../include/contact_widgets.php:22 +msgid "Examples: Robert Morgenstein, Fishing" +msgstr "Примеры: Владимир Ильич, Революционер" -#: ../../include/widgets.php:399 ../../mod/connedit.php:430 -msgid "Best Friends" -msgstr "Лучшие друзья" +#: ../../include/contact_widgets.php:23 +#: ../../Zotlabs/Module/Connections.php:338 +#: ../../Zotlabs/Module/Directory.php:401 +#: ../../Zotlabs/Module/Directory.php:406 +msgid "Find" +msgstr "Поиск" -#: ../../include/widgets.php:401 -msgid "Co-workers" -msgstr "Сотрудники" +#: ../../include/contact_widgets.php:24 ../../Zotlabs/Module/Suggest.php:64 +#: ../../Zotlabs/Module/Directory.php:405 +msgid "Channel Suggestions" +msgstr "Рекомендации каналов" -#: ../../include/widgets.php:402 ../../mod/connedit.php:432 -msgid "Former Friends" -msgstr "Приятели" +#: ../../include/contact_widgets.php:26 +msgid "Random Profile" +msgstr "Случайный профиль" -#: ../../include/widgets.php:403 ../../mod/connedit.php:433 -msgid "Acquaintances" -msgstr "Знакомые" +#: ../../include/contact_widgets.php:27 +msgid "Invite Friends" +msgstr "Пригласить друзей" -#: ../../include/widgets.php:404 -msgid "Everybody" -msgstr "Все" +#: ../../include/contact_widgets.php:29 +msgid "Advanced example: name=fred and country=iceland" +msgstr "Расширенный пример: name=ivan and country=russia" -#: ../../include/widgets.php:436 -msgid "Account settings" -msgstr "Настройки аккаунта" +#: ../../include/contact_widgets.php:53 ../../include/features.php:488 +#: ../../Zotlabs/Widget/Filer.php:28 +#: ../../Zotlabs/Widget/Activity_filter.php:134 +msgid "Saved Folders" +msgstr "Сохранённые каталоги" -#: ../../include/widgets.php:442 -msgid "Channel settings" -msgstr "Настройки канала" +#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:100 +#: ../../include/contact_widgets.php:144 ../../include/contact_widgets.php:189 +#: ../../Zotlabs/Widget/Appcategories.php:46 ../../Zotlabs/Widget/Filer.php:31 +msgid "Everything" +msgstr "Всё" -#: ../../include/widgets.php:448 -msgid "Additional features" -msgstr "Дополнительные функции" +#: ../../include/contact_widgets.php:223 +msgid "Common Connections" +msgstr "Общие контакты" -#: ../../include/widgets.php:454 -msgid "Feature settings" -msgstr "Настройки компонентов" +#: ../../include/contact_widgets.php:228 +#, php-format +msgid "View all %d common connections" +msgstr "Просмотреть все %d общих контактов" -#: ../../include/widgets.php:460 -msgid "Display settings" -msgstr "Настройки отображения" +#: ../../include/channel.php:35 +msgid "Unable to obtain identity information from database" +msgstr "Невозможно получить идентификационную информацию из базы данных" -#: ../../include/widgets.php:466 -msgid "Connected apps" -msgstr "Подключенные приложения" +#: ../../include/channel.php:68 +msgid "Empty name" +msgstr "Пустое имя" -#: ../../include/widgets.php:472 -msgid "Export channel" -msgstr "Экспорт канала" +#: ../../include/channel.php:71 +msgid "Name too long" +msgstr "Слишком длинное имя" -#: ../../include/widgets.php:484 -msgid "Automatic Permissions (Advanced)" -msgstr "Автоматические разрешения (дополнительно)" +#: ../../include/channel.php:188 +msgid "No account identifier" +msgstr "Идентификатор аккаунта отсутствует" -#: ../../include/widgets.php:494 -msgid "Premium Channel Settings" -msgstr "Настройки премиум канала" +#: ../../include/channel.php:200 +msgid "Nickname is required." +msgstr "Требуется псевдоним." -#: ../../include/widgets.php:531 -msgid "Check Mail" -msgstr "Проверить снова" +#: ../../include/channel.php:214 ../../include/channel.php:599 +#: ../../Zotlabs/Module/Changeaddr.php:46 +msgid "Reserved nickname. Please choose another." +msgstr "Зарезервированый псевдоним. Пожалуйста, выберите другой." -#: ../../include/widgets.php:612 -msgid "Chat Rooms" -msgstr "Чаты" +#: ../../include/channel.php:219 ../../include/channel.php:604 +#: ../../Zotlabs/Module/Changeaddr.php:51 +msgid "" +"Nickname has unsupported characters or is already being used on this site." +msgstr "Псевдоним имеет недопустимые символы или уже используется на этом сайте." -#: ../../include/widgets.php:630 -msgid "Bookmarked Chatrooms" -msgstr "Закладки чатов" +#: ../../include/channel.php:277 +msgid "Unable to retrieve created identity" +msgstr "Не удается получить созданный идентификатор" -#: ../../include/widgets.php:648 -msgid "Suggested Chatrooms" -msgstr "Рекомендуемые чаты" +#: ../../include/channel.php:373 +msgid "Default Profile" +msgstr "Профиль по умолчанию" -#: ../../include/ItemObject.php:118 -msgid "Save to Folder" -msgstr "Сохранить в папку" +#: ../../include/channel.php:437 ../../include/channel.php:438 +#: ../../include/channel.php:445 ../../include/selectors.php:123 +#: ../../Zotlabs/Widget/Affinity.php:24 ../../Zotlabs/Module/Connedit.php:711 +#: ../../Zotlabs/Module/Settings/Channel.php:68 +#: ../../Zotlabs/Module/Settings/Channel.php:72 +#: ../../Zotlabs/Module/Settings/Channel.php:73 +#: ../../Zotlabs/Module/Settings/Channel.php:76 +#: ../../Zotlabs/Module/Settings/Channel.php:87 +msgid "Friends" +msgstr "Друзья" -#: ../../include/ItemObject.php:130 ../../include/ItemObject.php:142 -msgid "View all" -msgstr "Просмотреть все" +#: ../../include/channel.php:532 ../../include/channel.php:621 +msgid "Unable to retrieve modified identity" +msgstr "Не удается найти изменённый идентификатор" + +#: ../../include/channel.php:1197 ../../Zotlabs/Module/Connect.php:17 +#: ../../Zotlabs/Module/Achievements.php:15 ../../Zotlabs/Module/Layouts.php:31 +#: ../../Zotlabs/Module/Filestorage.php:51 +#: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Webpages.php:33 +#: ../../Zotlabs/Module/Editwebpage.php:32 +#: ../../Zotlabs/Module/Editlayout.php:31 ../../Zotlabs/Module/Articles.php:29 +#: ../../Zotlabs/Module/Hcard.php:12 ../../Zotlabs/Module/Blocks.php:33 +#: ../../Zotlabs/Module/Menu.php:91 ../../Zotlabs/Module/Cards.php:33 +#: ../../Zotlabs/Module/Profile.php:20 +msgid "Requested profile is not available." +msgstr "Запрашиваемый профиль не доступен." -#: ../../include/ItemObject.php:139 -msgctxt "noun" -msgid "Dislike" -msgid_plural "Dislikes" -msgstr[0] "не-нравится" -msgstr[1] "не-нравится" -msgstr[2] "не-нравится" +#: ../../include/channel.php:1289 ../../Zotlabs/Module/Profiles.php:728 +msgid "Change profile photo" +msgstr "Изменить фотографию профиля" -#: ../../include/ItemObject.php:167 -msgid "Add Star" -msgstr "Добавить маркировку" +#: ../../include/channel.php:1297 +msgid "Create New Profile" +msgstr "Создать новый профиль" -#: ../../include/ItemObject.php:168 -msgid "Remove Star" -msgstr "Удалить маркировку" +#: ../../include/channel.php:1315 ../../Zotlabs/Module/Profiles.php:820 +msgid "Profile Image" +msgstr "Изображение профиля" -#: ../../include/ItemObject.php:169 -msgid "Toggle Star Status" -msgstr "Переключить статус маркировки" +#: ../../include/channel.php:1318 +msgid "Visible to everybody" +msgstr "Видно всем" -#: ../../include/ItemObject.php:173 -msgid "starred" -msgstr "помеченные" +#: ../../include/channel.php:1319 ../../Zotlabs/Module/Profiles.php:725 +#: ../../Zotlabs/Module/Profiles.php:824 +msgid "Edit visibility" +msgstr "Редактировать видимость" -#: ../../include/ItemObject.php:190 -msgid "Add Tag" -msgstr "Добавить тег" +#: ../../include/channel.php:1395 ../../include/channel.php:1523 +msgid "Gender:" +msgstr "Пол:" -#: ../../include/ItemObject.php:208 ../../mod/photos.php:974 -msgid "I like this (toggle)" -msgstr "мне это нравится (переключение)" +#: ../../include/channel.php:1397 ../../include/channel.php:1591 +msgid "Homepage:" +msgstr "Домашняя страница:" -#: ../../include/ItemObject.php:209 ../../mod/photos.php:975 -msgid "I don't like this (toggle)" -msgstr "мне это не нравится (переключение)" +#: ../../include/channel.php:1398 +msgid "Online Now" +msgstr "Сейчас в сети" -#: ../../include/ItemObject.php:211 -msgid "Share This" -msgstr "Поделиться этим" +#: ../../include/channel.php:1451 +msgid "Change your profile photo" +msgstr "Изменить фотографию вашего профиля" -#: ../../include/ItemObject.php:211 -msgid "share" -msgstr "поделиться" +#: ../../include/channel.php:1482 +msgid "Trans" +msgstr "Трансексуал" + +#: ../../include/channel.php:1484 ../../include/selectors.php:49 +msgid "Neuter" +msgstr "Среднего рода" + +#: ../../include/channel.php:1486 ../../include/selectors.php:49 +msgid "Non-specific" +msgstr "Неспецифический" + +#: ../../include/channel.php:1521 ../../Zotlabs/Module/Settings/Channel.php:522 +msgid "Full Name:" +msgstr "Полное имя:" + +#: ../../include/channel.php:1528 +msgid "Like this channel" +msgstr "нравится этот канал" + +#: ../../include/channel.php:1552 +msgid "j F, Y" +msgstr "" -#: ../../include/ItemObject.php:235 ../../include/ItemObject.php:236 +#: ../../include/channel.php:1553 +msgid "j F" +msgstr "" + +#: ../../include/channel.php:1560 +msgid "Birthday:" +msgstr "День рождения:" + +#: ../../include/channel.php:1564 ../../Zotlabs/Module/Directory.php:319 +msgid "Age:" +msgstr "Возраст:" + +#: ../../include/channel.php:1573 #, php-format -msgid "View %s's profile - %s" -msgstr "Просмотр %s's профиля - %s" +msgid "for %1$d %2$s" +msgstr "для %1$d %2$s" -#: ../../include/ItemObject.php:237 -msgid "to" -msgstr "к" +#: ../../include/channel.php:1585 +msgid "Tags:" +msgstr "Теги:" -#: ../../include/ItemObject.php:238 -msgid "via" -msgstr "через" +#: ../../include/channel.php:1589 +msgid "Sexual Preference:" +msgstr "Сексуальные предпочтения:" -#: ../../include/ItemObject.php:239 -msgid "Wall-to-Wall" -msgstr "Стена-к-Стене" +#: ../../include/channel.php:1593 ../../Zotlabs/Module/Directory.php:335 +msgid "Hometown:" +msgstr "Родной город:" -#: ../../include/ItemObject.php:240 -msgid "via Wall-To-Wall:" -msgstr "через Стена-к-Стене:" +#: ../../include/channel.php:1595 +msgid "Political Views:" +msgstr "Политические взгляды:" -#: ../../include/ItemObject.php:274 -msgid "Save Bookmarks" -msgstr "Сохранить закладки" +#: ../../include/channel.php:1597 +msgid "Religion:" +msgstr "Религия:" -#: ../../include/ItemObject.php:275 -msgid "Add to Calendar" -msgstr "Добавить в календарь" +#: ../../include/channel.php:1599 ../../Zotlabs/Module/Directory.php:337 +msgid "About:" +msgstr "О себе:" -#: ../../include/ItemObject.php:283 -msgctxt "noun" -msgid "Likes" -msgstr "нравится" +#: ../../include/channel.php:1601 +msgid "Hobbies/Interests:" +msgstr "Хобби / интересы:" -#: ../../include/ItemObject.php:284 -msgctxt "noun" -msgid "Dislikes" -msgstr "не-нравится" +#: ../../include/channel.php:1603 +msgid "Likes:" +msgstr "Что вам нравится:" + +#: ../../include/channel.php:1605 +msgid "Dislikes:" +msgstr "Что вам не нравится:" + +#: ../../include/channel.php:1607 +msgid "Contact information and Social Networks:" +msgstr "Контактная информация и социальные сети:" + +#: ../../include/channel.php:1609 +msgid "My other channels:" +msgstr "Мои другие каналы:" + +#: ../../include/channel.php:1611 +msgid "Musical interests:" +msgstr "Музыкальные интересы:" + +#: ../../include/channel.php:1613 +msgid "Books, literature:" +msgstr "Книги, литература:" + +#: ../../include/channel.php:1615 +msgid "Television:" +msgstr "Телевидение:" + +#: ../../include/channel.php:1617 +msgid "Film/dance/culture/entertainment:" +msgstr "Кино / танцы / культура / развлечения:" + +#: ../../include/channel.php:1619 +msgid "Love/Romance:" +msgstr "Любовь / романтика:" + +#: ../../include/channel.php:1621 +msgid "Work/employment:" +msgstr "Работа / занятость:" + +#: ../../include/channel.php:1623 +msgid "School/education:" +msgstr "Школа / образование:" + +#: ../../include/channel.php:1644 ../../Zotlabs/Module/Profperm.php:113 +msgid "Profile" +msgstr "Профиль" + +#: ../../include/channel.php:1646 +msgid "Like this thing" +msgstr "нравится этo" + +#: ../../include/channel.php:1647 ../../Zotlabs/Module/Events.php:691 +#: ../../Zotlabs/Module/Cal.php:341 +msgid "Export" +msgstr "Экспорт" + +#: ../../include/channel.php:2081 ../../Zotlabs/Module/Cover_photo.php:276 +msgid "cover photo" +msgstr "фотография обложки" + +#: ../../include/channel.php:2335 ../../Zotlabs/Module/Rmagic.php:76 +msgid "Enter your channel address (e.g. channel@example.com)" +msgstr "Введите адрес вашего канала (например: channel@example.com)" + +#: ../../include/channel.php:2336 ../../Zotlabs/Module/Rmagic.php:77 +msgid "Authenticate" +msgstr "Проверка подлинности" -#: ../../include/ItemObject.php:315 +#: ../../include/channel.php:2490 ../../Zotlabs/Module/Admin/Accounts.php:91 #, php-format -msgid "%d comment" -msgid_plural "%d comments" -msgstr[0] "%d комментарий" -msgstr[1] "%d комментария" -msgstr[2] "%d комментариев" +msgid "Account '%s' deleted" +msgstr "Аккаунт '%s' удален" -#: ../../include/ItemObject.php:316 ../../include/js_strings.php:7 -msgid "[+] show all" -msgstr "[+] показать все" +#: ../../include/features.php:56 +msgid "General Features" +msgstr "Главные функции" -#: ../../include/ItemObject.php:580 ../../mod/photos.php:993 -#: ../../mod/photos.php:1080 -msgid "This is you" -msgstr "Это вы" +#: ../../include/features.php:60 ../../Zotlabs/Widget/Newmember.php:62 +msgid "New Member Links" +msgstr "Ссылки для новичков" -#: ../../include/ItemObject.php:582 ../../include/js_strings.php:6 -#: ../../mod/photos.php:995 ../../mod/photos.php:1082 -msgid "Comment" -msgstr "Комментарий" +#: ../../include/features.php:61 +msgid "Display new member quick links menu" +msgstr "Показать меню быстрых ссылок для новых участников" -#: ../../include/ItemObject.php:583 ../../mod/mood.php:135 -#: ../../mod/settings.php:515 ../../mod/settings.php:627 -#: ../../mod/settings.php:655 ../../mod/settings.php:679 -#: ../../mod/settings.php:749 ../../mod/settings.php:927 -#: ../../mod/poke.php:166 ../../mod/profiles.php:515 ../../mod/chat.php:177 -#: ../../mod/chat.php:211 ../../mod/connect.php:92 ../../mod/connedit.php:476 -#: ../../mod/setup.php:307 ../../mod/setup.php:350 ../../mod/pdledit.php:58 -#: ../../mod/photos.php:563 ../../mod/photos.php:668 ../../mod/photos.php:956 -#: ../../mod/photos.php:996 ../../mod/photos.php:1083 -#: ../../mod/sources.php:104 ../../mod/sources.php:138 -#: ../../mod/events.php:492 ../../mod/filestorage.php:137 -#: ../../mod/fsuggest.php:108 ../../mod/group.php:81 ../../mod/admin.php:442 -#: ../../mod/admin.php:751 ../../mod/admin.php:886 ../../mod/admin.php:1019 -#: ../../mod/admin.php:1218 ../../mod/admin.php:1305 ../../mod/thing.php:286 -#: ../../mod/thing.php:329 ../../mod/import.php:393 ../../mod/invite.php:156 -#: ../../mod/mail.php:223 ../../mod/mail.php:335 ../../mod/appman.php:99 -#: ../../view/theme/apw/php/config.php:256 -#: ../../view/theme/blogga/php/config.php:67 -#: ../../view/theme/blogga/view/theme/blog/config.php:67 -#: ../../view/theme/redbasic/php/config.php:99 -msgid "Submit" -msgstr "Отправить" +#: ../../include/features.php:69 +msgid "Advanced Profiles" +msgstr "Расширенные профили" -#: ../../include/ItemObject.php:584 -msgid "Bold" -msgstr "Жирный" +#: ../../include/features.php:70 +msgid "Additional profile sections and selections" +msgstr "Дополнительные секции и выборы профиля" -#: ../../include/ItemObject.php:585 -msgid "Italic" -msgstr "Курсив" +#: ../../include/features.php:78 +msgid "Profile Import/Export" +msgstr "Импорт / экспорт профиля" -#: ../../include/ItemObject.php:586 -msgid "Underline" -msgstr "Подчеркнутый" +#: ../../include/features.php:79 +msgid "Save and load profile details across sites/channels" +msgstr "Сохранение и загрузка настроек профиля на всех сайтах / каналах" -#: ../../include/ItemObject.php:587 -msgid "Quote" -msgstr "Цитата" +#: ../../include/features.php:87 +msgid "Web Pages" +msgstr "Веб-страницы" -#: ../../include/ItemObject.php:588 -msgid "Code" -msgstr "Код" +#: ../../include/features.php:88 +msgid "Provide managed web pages on your channel" +msgstr "Предоставлять управляемые веб-страницы на Вашем канале" -#: ../../include/ItemObject.php:589 -msgid "Image" -msgstr "Изображение" +#: ../../include/features.php:97 +msgid "Provide a wiki for your channel" +msgstr "Предоставьте Wiki для вашего канала" -#: ../../include/ItemObject.php:590 -msgid "Link" -msgstr "Ссылка" +#: ../../include/features.php:114 +msgid "Private Notes" +msgstr "Личные заметки" -#: ../../include/ItemObject.php:591 -msgid "Video" -msgstr "Видео" +#: ../../include/features.php:115 +msgid "Enables a tool to store notes and reminders (note: not encrypted)" +msgstr "Включает инструмент для хранения заметок и напоминаний (прим.: не зашифровано)" -#: ../../include/js_strings.php:5 -msgid "Delete this item?" -msgstr "Удалить этот элемент?" +#: ../../include/features.php:124 +msgid "Create personal planning cards" +msgstr "Создать личные карточки планирования" -#: ../../include/js_strings.php:8 -msgid "[-] show less" -msgstr "[-] показать меньше" +#: ../../include/features.php:134 +msgid "Create interactive articles" +msgstr "Создать интерактивные статьи" -#: ../../include/js_strings.php:9 -msgid "[+] expand" -msgstr "[+] развернуть" +#: ../../include/features.php:142 +msgid "Navigation Channel Select" +msgstr "Выбор канала навигации" -#: ../../include/js_strings.php:10 -msgid "[-] collapse" -msgstr "[-] свернуть" +#: ../../include/features.php:143 +msgid "Change channels directly from within the navigation dropdown menu" +msgstr "Изменить канал напрямую из выпадающего меню" -#: ../../include/js_strings.php:11 -msgid "Password too short" -msgstr "Пароль слишком короткий" +#: ../../include/features.php:151 +msgid "Photo Location" +msgstr "Местоположение фотографии" -#: ../../include/js_strings.php:12 -msgid "Passwords do not match" -msgstr "Пароли не совпадают" +#: ../../include/features.php:152 +msgid "If location data is available on uploaded photos, link this to a map." +msgstr "Если данные о местоположении доступны на загруженных фотографий, связать их с картой." -#: ../../include/js_strings.php:13 ../../mod/photos.php:39 -msgid "everybody" -msgstr "все" +#: ../../include/features.php:160 +msgid "Access Controlled Chatrooms" +msgstr "Получить доступ к контролируемым чатам" -#: ../../include/js_strings.php:14 -msgid "Secret Passphrase" -msgstr "Тайный пароль" +#: ../../include/features.php:161 +msgid "Provide chatrooms and chat services with access control." +msgstr "Предоставлять чаты и их службы с контролем доступа." -#: ../../include/js_strings.php:15 -msgid "Passphrase hint" -msgstr "" +#: ../../include/features.php:170 +msgid "Smart Birthdays" +msgstr "\"Умные\" Дни рождений" -#: ../../include/js_strings.php:16 -msgid "Notice: Permissions have changed but have not yet been submitted." -msgstr "" +#: ../../include/features.php:171 +msgid "" +"Make birthday events timezone aware in case your friends are scattered " +"across the planet." +msgstr "Сделать уведомления о днях рождения зависимыми от часового пояса в том случае, если ваши друзья разбросаны по планете." -#: ../../include/js_strings.php:17 -msgid "close all" -msgstr "закрыть все" +#: ../../include/features.php:179 +msgid "Event Timezone Selection" +msgstr "Выбор часового пояса события" -#: ../../include/js_strings.php:19 -msgid "timeago.prefixAgo" -msgstr "timeago.prefixAgo" +#: ../../include/features.php:180 +msgid "Allow event creation in timezones other than your own." +msgstr "Разрешить создание события в часовой зоне отличной от вашей" -#: ../../include/js_strings.php:20 -msgid "timeago.prefixFromNow" -msgstr "timeago.prefixFromNow" +#: ../../include/features.php:189 +msgid "Premium Channel" +msgstr "Премиум-канал" -#: ../../include/js_strings.php:21 -msgid "ago" -msgstr "тому назад" +#: ../../include/features.php:190 +msgid "" +"Allows you to set restrictions and terms on those that connect with your " +"channel" +msgstr "Позволяет установить ограничения и условия для подключающихся к вашему каналу" -#: ../../include/js_strings.php:22 -msgid "from now" -msgstr "с этого времени" +#: ../../include/features.php:198 +msgid "Advanced Directory Search" +msgstr "Расширенный поиск в каталоге" -#: ../../include/js_strings.php:23 -msgid "less than a minute" -msgstr "менее чем одну минуту назад" +#: ../../include/features.php:199 +msgid "Allows creation of complex directory search queries" +msgstr "Позволяет создание сложных поисковых запросов в каталоге" -#: ../../include/js_strings.php:24 -msgid "about a minute" -msgstr "около минуты" +#: ../../include/features.php:207 +msgid "Advanced Theme and Layout Settings" +msgstr "Расширенный настройки темы и отображения" -#: ../../include/js_strings.php:25 -#, php-format -msgid "%d minutes" -msgstr "%d мин." +#: ../../include/features.php:208 +msgid "Allows fine tuning of themes and page layouts" +msgstr "Разрешает тонкую настройку тем и шаблонов страниц" -#: ../../include/js_strings.php:26 -msgid "about an hour" -msgstr "около часа" +#: ../../include/features.php:217 +msgid "Access Control and Permissions" +msgstr "Управление доступом и разрешениями" -#: ../../include/js_strings.php:27 -#, php-format -msgid "about %d hours" -msgstr "около %d час." +#: ../../include/features.php:222 +msgid "Enable management and selection of privacy groups" +msgstr "Включить управление и выбор групп безопасности" -#: ../../include/js_strings.php:28 -msgid "a day" -msgstr "день" +#: ../../include/features.php:230 +msgid "Multiple Profiles" +msgstr "Несколько профилей" -#: ../../include/js_strings.php:29 -#, php-format -msgid "%d days" -msgstr "%d дн." +#: ../../include/features.php:231 +msgid "Ability to create multiple profiles" +msgstr "Возможность создания нескольких профилей" -#: ../../include/js_strings.php:30 -msgid "about a month" -msgstr "около месяца" +#: ../../include/features.php:240 ../../Zotlabs/Widget/Settings_menu.php:108 +#: ../../Zotlabs/Module/Settings/Permcats.php:99 +msgid "Permission Categories" +msgstr "Категории разрешений" -#: ../../include/js_strings.php:31 -#, php-format -msgid "%d months" -msgstr "%d мес." +#: ../../include/features.php:241 +msgid "Create custom connection permission limits" +msgstr "Создать пользовательские ограничения на доступ к подключению" -#: ../../include/js_strings.php:32 -msgid "about a year" -msgstr "около года" +#: ../../include/features.php:249 +msgid "OAuth1 Clients" +msgstr "Клиенты OAuth1" -#: ../../include/js_strings.php:33 -#, php-format -msgid "%d years" -msgstr "%d лет" +#: ../../include/features.php:250 +msgid "Manage OAuth1 authenticatication tokens for mobile and remote apps." +msgstr "Управлять токенами аутентификации OAuth1 для мобильных и удалённых приложений." -#: ../../include/js_strings.php:34 -msgid " " -msgstr " " +#: ../../include/features.php:258 +msgid "OAuth2 Clients" +msgstr "Клиенты OAuth2" -#: ../../include/js_strings.php:35 -msgid "timeago.numbers" -msgstr "timeago.numbers" +#: ../../include/features.php:259 +msgid "Manage OAuth2 authenticatication tokens for mobile and remote apps." +msgstr "Управлять токенами аутентификации OAuth2 для мобильных и удалённых приложений." -#: ../../include/Contact.php:123 -msgid "New window" -msgstr "Новое окно" +#: ../../include/features.php:267 +msgid "Access Tokens" +msgstr "Токены доступа" -#: ../../include/Contact.php:124 -msgid "Open the selected location in a different window or browser tab" -msgstr "Откройте выбранное местоположение в другом окне или вкладке браузера" +#: ../../include/features.php:268 +msgid "Create access tokens so that non-members can access private content." +msgstr "Создать токены доступа для доступа к приватному содержимому." -#: ../../include/profile_selectors.php:6 -msgid "Male" -msgstr "Мужской" +#: ../../include/features.php:279 +msgid "Post Composition Features" +msgstr "Функции создания публикаций" -#: ../../include/profile_selectors.php:6 -msgid "Female" -msgstr "Женский" +#: ../../include/features.php:283 +msgid "Large Photos" +msgstr "Большие фотографии" + +#: ../../include/features.php:284 +msgid "" +"Include large (1024px) photo thumbnails in posts. If not enabled, use small " +"(640px) photo thumbnails" +msgstr "Включить большие (1024px) миниатюры изображений в публикациях. Если не включено, использовать маленькие (640px) миниатюры." + +#: ../../include/features.php:292 ../../Zotlabs/Widget/Settings_menu.php:133 +#: ../../Zotlabs/Module/Sources.php:99 +msgid "Channel Sources" +msgstr "Источники канала" + +#: ../../include/features.php:293 +msgid "Automatically import channel content from other channels or feeds" +msgstr "Автоматический импорт контента из других каналов или лент" + +#: ../../include/features.php:301 +msgid "Even More Encryption" +msgstr "Еще больше шифрования" + +#: ../../include/features.php:302 +msgid "" +"Allow optional encryption of content end-to-end with a shared secret key" +msgstr "Разрешить дополнительное end-to-end шифрование содержимого с общим секретным ключом" + +#: ../../include/features.php:310 +msgid "Enable Voting Tools" +msgstr "Включить инструменты голосования" + +#: ../../include/features.php:311 +msgid "Provide a class of post which others can vote on" +msgstr "Предоставь класс публикаций с возможностью голосования" + +#: ../../include/features.php:319 +msgid "Disable Comments" +msgstr "Отключить комментарии" + +#: ../../include/features.php:320 +msgid "Provide the option to disable comments for a post" +msgstr "Предоставить возможность отключать комментарии для публикаций" + +#: ../../include/features.php:328 +msgid "Delayed Posting" +msgstr "Задержанная публикация" + +#: ../../include/features.php:329 +msgid "Allow posts to be published at a later date" +msgstr "Разрешить размешать публикации следующими датами" + +#: ../../include/features.php:337 +msgid "Content Expiration" +msgstr "Истечение срока действия содержимого" + +#: ../../include/features.php:338 +msgid "Remove posts/comments and/or private messages at a future time" +msgstr "Удалять публикации / комментарии и / или личные сообщения" + +#: ../../include/features.php:346 +msgid "Suppress Duplicate Posts/Comments" +msgstr "Подавлять дублирующие публикации / комментарии" + +#: ../../include/features.php:347 +msgid "" +"Prevent posts with identical content to be published with less than two " +"minutes in between submissions." +msgstr "Предотвращает появление публикаций с одинаковым содержимым если интервал между ними менее 2 минут" + +#: ../../include/features.php:355 +msgid "Auto-save drafts of posts and comments" +msgstr "Автоматически сохранять черновики публикаций и комментариев" + +#: ../../include/features.php:356 +msgid "" +"Automatically saves post and comment drafts in local browser storage to help " +"prevent accidental loss of compositions" +msgstr "Автоматически сохраняет черновики публикаций и комментариев в локальном хранилище браузера для предотвращения их случайной утраты" + +#: ../../include/features.php:367 +msgid "Network and Stream Filtering" +msgstr "Фильтрация сети и потока" + +#: ../../include/features.php:371 +msgid "Search by Date" +msgstr "Поиск по дате" + +#: ../../include/features.php:372 +msgid "Ability to select posts by date ranges" +msgstr "Возможность выбора сообщений по диапазонам дат" + +#: ../../include/features.php:381 ../../Zotlabs/Widget/Savedsearch.php:83 +msgid "Saved Searches" +msgstr "Сохранённые поиски" + +#: ../../include/features.php:382 +msgid "Save search terms for re-use" +msgstr "Сохранять результаты поиска для повторного использования" -#: ../../include/profile_selectors.php:6 +#: ../../include/features.php:390 +msgid "Alternate Stream Order" +msgstr "Отображение потока" + +#: ../../include/features.php:391 +msgid "" +"Ability to order the stream by last post date, last comment date or " +"unthreaded activities" +msgstr "Возможность показывать поток по дате последнего сообщения, последнего комментария или в порядке поступления" + +#: ../../include/features.php:399 +msgid "Contact Filter" +msgstr "Фильтр контактов" + +#: ../../include/features.php:400 +msgid "Ability to display only posts of a selected contact" +msgstr "Возможность показа публикаций только от выбранных контактов" + +#: ../../include/features.php:408 +msgid "Forum Filter" +msgstr "Фильтр по форумам" + +#: ../../include/features.php:409 +msgid "Ability to display only posts of a specific forum" +msgstr "Возможность показа публикаций только определённого форума" + +#: ../../include/features.php:417 +msgid "Personal Posts Filter" +msgstr "Персональный фильтр публикаций" + +#: ../../include/features.php:418 +msgid "Ability to display only posts that you've interacted on" +msgstr "Возможность показа только тех публикаций с которыми вы взаимодействовали" + +#: ../../include/features.php:426 +msgid "Affinity Tool" +msgstr "Инструмент сходства / соответствия" + +#: ../../include/features.php:427 +msgid "Filter stream activity by depth of relationships" +msgstr "Фильтровать потоки активности по глубине отношений" + +#: ../../include/features.php:435 ../../Zotlabs/Lib/Apps.php:300 +msgid "Suggest Channels" +msgstr "Предлагаемые каналы" + +#: ../../include/features.php:436 +msgid "Show friend and connection suggestions" +msgstr "Показать предложения в друзья" + +#: ../../include/features.php:444 +msgid "Connection Filtering" +msgstr "Фильтрация контактов" + +#: ../../include/features.php:445 +msgid "Filter incoming posts from connections based on keywords/content" +msgstr "Фильтр входящих сообщений от контактов на основе ключевых слов / контента" + +#: ../../include/features.php:457 +msgid "Post/Comment Tools" +msgstr "Инструменты публикаций / комментариев" + +#: ../../include/features.php:461 +msgid "Community Tagging" +msgstr "Отметки сообщества" + +#: ../../include/features.php:462 +msgid "Ability to tag existing posts" +msgstr "Возможность помечать тегами существующие публикации" + +#: ../../include/features.php:470 +msgid "Post Categories" +msgstr "Категории публикаций" + +#: ../../include/features.php:471 +msgid "Add categories to your posts" +msgstr "Добавить категории для ваших публикаций" + +#: ../../include/features.php:479 +msgid "Emoji Reactions" +msgstr "Реакции Emoji" + +#: ../../include/features.php:480 +msgid "Add emoji reaction ability to posts" +msgstr "Возможность добавлять реакции Emoji к публикациям" + +#: ../../include/features.php:489 +msgid "Ability to file posts under folders" +msgstr "Возможность размещать публикации в каталогах" + +#: ../../include/features.php:497 +msgid "Dislike Posts" +msgstr "Не нравящиеся публикации" + +#: ../../include/features.php:498 +msgid "Ability to dislike posts/comments" +msgstr "Возможность отмечать не нравящиеся публикации / комментарии" + +#: ../../include/features.php:506 +msgid "Star Posts" +msgstr "Помечать сообщения" + +#: ../../include/features.php:507 +msgid "Ability to mark special posts with a star indicator" +msgstr "Возможность отметить специальные сообщения индикатором-звёздочкой" + +#: ../../include/features.php:515 +msgid "Tag Cloud" +msgstr "Облако тегов" + +#: ../../include/features.php:516 +msgid "Provide a personal tag cloud on your channel page" +msgstr "Показывает личное облако тегов на странице канала" + +#: ../../include/message.php:40 +msgid "Unable to determine sender." +msgstr "Невозможно определить отправителя." + +#: ../../include/message.php:79 +msgid "No recipient provided." +msgstr "Получатель не предоставлен." + +#: ../../include/message.php:84 +msgid "[no subject]" +msgstr "[без темы]" + +#: ../../include/message.php:214 +msgid "Stored post could not be verified." +msgstr "Сохранённая публикация не может быть проверена." + +#: ../../include/selectors.php:30 +msgid "Frequently" +msgstr "Часто" + +#: ../../include/selectors.php:31 +msgid "Hourly" +msgstr "Ежечасно" + +#: ../../include/selectors.php:32 +msgid "Twice daily" +msgstr "Дважды в день" + +#: ../../include/selectors.php:33 +msgid "Daily" +msgstr "Ежедневно" + +#: ../../include/selectors.php:34 +msgid "Weekly" +msgstr "Еженедельно" + +#: ../../include/selectors.php:35 +msgid "Monthly" +msgstr "Ежемесячно" + +#: ../../include/selectors.php:49 msgid "Currently Male" msgstr "В настоящее время мужской" -#: ../../include/profile_selectors.php:6 +#: ../../include/selectors.php:49 msgid "Currently Female" msgstr "В настоящее время женский" -#: ../../include/profile_selectors.php:6 +#: ../../include/selectors.php:49 msgid "Mostly Male" msgstr "В основном мужской" -#: ../../include/profile_selectors.php:6 +#: ../../include/selectors.php:49 msgid "Mostly Female" msgstr "В основном женский" -#: ../../include/profile_selectors.php:6 +#: ../../include/selectors.php:49 msgid "Transgender" -msgstr "Транссексуал" +msgstr "Трансгендер" -#: ../../include/profile_selectors.php:6 +#: ../../include/selectors.php:49 msgid "Intersex" -msgstr "Intersex" +msgstr "Интерсексуал" -#: ../../include/profile_selectors.php:6 +#: ../../include/selectors.php:49 msgid "Transsexual" msgstr "Транссексуал" -#: ../../include/profile_selectors.php:6 +#: ../../include/selectors.php:49 msgid "Hermaphrodite" msgstr "Гермафродит" -#: ../../include/profile_selectors.php:6 -msgid "Neuter" -msgstr "Среднего рода" - -#: ../../include/profile_selectors.php:6 -msgid "Non-specific" -msgstr "Неспецифический" - -#: ../../include/profile_selectors.php:6 -msgid "Other" -msgstr "Другой" - -#: ../../include/profile_selectors.php:6 +#: ../../include/selectors.php:49 msgid "Undecided" -msgstr "Нерешительный" +msgstr "Не решил" -#: ../../include/profile_selectors.php:23 +#: ../../include/selectors.php:85 ../../include/selectors.php:104 msgid "Males" -msgstr "Самец" +msgstr "Мужчины" -#: ../../include/profile_selectors.php:23 +#: ../../include/selectors.php:85 ../../include/selectors.php:104 msgid "Females" -msgstr "Самка" +msgstr "Женщины" -#: ../../include/profile_selectors.php:23 +#: ../../include/selectors.php:85 msgid "Gay" msgstr "Гей" -#: ../../include/profile_selectors.php:23 +#: ../../include/selectors.php:85 msgid "Lesbian" msgstr "Лесбиянка" -#: ../../include/profile_selectors.php:23 +#: ../../include/selectors.php:85 msgid "No Preference" msgstr "Без предпочтений" -#: ../../include/profile_selectors.php:23 +#: ../../include/selectors.php:85 msgid "Bisexual" -msgstr "Двуполый" +msgstr "Бисексуал" -#: ../../include/profile_selectors.php:23 +#: ../../include/selectors.php:85 msgid "Autosexual" -msgstr "Autosexual" +msgstr "Автосексуал" -#: ../../include/profile_selectors.php:23 +#: ../../include/selectors.php:85 msgid "Abstinent" -msgstr "Воздержанный" +msgstr "Воздержание" -#: ../../include/profile_selectors.php:23 +#: ../../include/selectors.php:85 msgid "Virgin" -msgstr "Девственница" +msgstr "Девственник" -#: ../../include/profile_selectors.php:23 +#: ../../include/selectors.php:85 msgid "Deviant" msgstr "Отклоняющийся от нормы" -#: ../../include/profile_selectors.php:23 +#: ../../include/selectors.php:85 msgid "Fetish" -msgstr "Фетиш" +msgstr "Фетишист" -#: ../../include/profile_selectors.php:23 +#: ../../include/selectors.php:85 msgid "Oodles" msgstr "Множественный" -#: ../../include/profile_selectors.php:23 +#: ../../include/selectors.php:85 msgid "Nonsexual" -msgstr "Несексуальный" +msgstr "Асексуал" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 ../../include/selectors.php:140 msgid "Single" -msgstr "Одинок" +msgstr "Одиночка" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Lonely" -msgstr "Уединенный" +msgstr "Одинокий" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Available" -msgstr "Доступный" +msgstr "Свободен" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Unavailable" -msgstr "Недоступный" +msgstr "Занят" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Has crush" -msgstr "Столкновение" +msgstr "Влюблён" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Infatuated" -msgstr "Влюбленный" +msgstr "без ума" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 ../../include/selectors.php:140 msgid "Dating" -msgstr "Датировка" +msgstr "Встречаюсь" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Unfaithful" msgstr "Неверный" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Sex Addict" -msgstr "Секс наркоман" +msgstr "Эротоман" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Friends/Benefits" -msgstr "Друзья / Преимущества" +msgstr "Друзья / Выгоды" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Casual" -msgstr "Случайный" +msgstr "Легкомысленный" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Engaged" -msgstr "Помолвленный" +msgstr "Помолвлен" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 ../../include/selectors.php:140 msgid "Married" -msgstr "Женат" +msgstr "В браке" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Imaginarily married" -msgstr "Мысленно женат" +msgstr "В воображаемом браке" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Partners" -msgstr "Партнеры" +msgstr "Партнёрство" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 ../../include/selectors.php:140 msgid "Cohabiting" msgstr "Сожительствующие" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Common law" -msgstr "" +msgstr "Гражданский брак" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Happy" -msgstr "Счастливый" +msgstr "Счастлив" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Not looking" msgstr "Не нуждаюсь" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Swinger" -msgstr "" +msgstr "Свингер" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Betrayed" -msgstr "" +msgstr "Предан" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 ../../include/selectors.php:140 msgid "Separated" -msgstr "" +msgstr "Разделён" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Unstable" -msgstr "Колеблющийся" +msgstr "Нестабильно" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 ../../include/selectors.php:140 msgid "Divorced" -msgstr "Разведенный" +msgstr "В разводе" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Imaginarily divorced" -msgstr "Мысленно разведенный" +msgstr "В воображаемом разводе" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 ../../include/selectors.php:140 msgid "Widowed" -msgstr "Овдовевший" +msgstr "Вдовец / вдова" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Uncertain" msgstr "Неопределенный" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 ../../include/selectors.php:140 msgid "It's complicated" msgstr "Это сложно" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Don't care" -msgstr "Не заботьтесь" +msgstr "Всё равно" -#: ../../include/profile_selectors.php:42 +#: ../../include/selectors.php:123 msgid "Ask me" msgstr "Спроси меня" -#: ../../include/auth.php:79 -msgid "Logged out." -msgstr "Вышел из системы." +#: ../../include/js_strings.php:5 +msgid "Delete this item?" +msgstr "Удалить этот элемент?" -#: ../../include/auth.php:198 -msgid "Failed authentication" -msgstr "Ошибка аутентификации" +#: ../../include/js_strings.php:6 ../../Zotlabs/Lib/ThreadItem.php:756 +#: ../../Zotlabs/Module/Photos.php:1126 ../../Zotlabs/Module/Photos.php:1244 +msgid "Comment" +msgstr "Комментарий" -#: ../../include/auth.php:213 ../../mod/openid.php:188 -msgid "Login failed." -msgstr "Не удалось войти." +#: ../../include/js_strings.php:7 ../../Zotlabs/Lib/ThreadItem.php:463 +#, php-format +msgid "%s show all" +msgstr "%s показать всё" -#: ../../include/items.php:306 ../../mod/profperm.php:23 -#: ../../mod/subthread.php:49 ../../mod/group.php:68 ../../mod/like.php:202 -#: ../../index.php:360 -msgid "Permission denied" -msgstr "Доступ запрещен" +#: ../../include/js_strings.php:8 +#, php-format +msgid "%s show less" +msgstr "%s показать меньше" -#: ../../include/items.php:830 -msgid "(Unknown)" -msgstr "(Неизвестный)" +#: ../../include/js_strings.php:9 +#, php-format +msgid "%s expand" +msgstr "%s развернуть" -#: ../../include/items.php:3618 ../../mod/home.php:67 ../../mod/display.php:32 -#: ../../mod/filestorage.php:18 ../../mod/admin.php:159 -#: ../../mod/admin.php:923 ../../mod/admin.php:1126 ../../mod/thing.php:78 -#: ../../mod/viewsrc.php:18 -msgid "Item not found." -msgstr "Элемент не найден." +#: ../../include/js_strings.php:10 +#, php-format +msgid "%s collapse" +msgstr "%s свернуть" -#: ../../include/items.php:4051 ../../mod/group.php:38 ../../mod/group.php:140 -msgid "Collection not found." -msgstr "Коллекция не найдена." +#: ../../include/js_strings.php:11 +msgid "Password too short" +msgstr "Пароль слишком короткий" -#: ../../include/items.php:4066 -msgid "Collection is empty." -msgstr "Коллекция пуста." +#: ../../include/js_strings.php:12 +msgid "Passwords do not match" +msgstr "Пароли не совпадают" -#: ../../include/items.php:4073 -#, php-format -msgid "Collection: %s" -msgstr "Коллекции: %s" +#: ../../include/js_strings.php:13 +msgid "everybody" +msgstr "все" -#: ../../include/items.php:4084 -#, php-format -msgid "Connection: %s" -msgstr "Контакты: %s" +#: ../../include/js_strings.php:14 +msgid "Secret Passphrase" +msgstr "Тайный пароль" -#: ../../include/items.php:4087 -msgid "Connection not found." -msgstr "Контакт не найден." +#: ../../include/js_strings.php:15 +msgid "Passphrase hint" +msgstr "Подсказка для пароля" + +#: ../../include/js_strings.php:16 +msgid "Notice: Permissions have changed but have not yet been submitted." +msgstr "Уведомление: Права доступа изменились, но до сих пор не сохранены." -#: ../../include/permissions.php:13 -msgid "Can view my \"public\" stream and posts" -msgstr "Может просматривать мои \"публичные\" поток и сообщения" +#: ../../include/js_strings.php:17 +msgid "close all" +msgstr "закрыть все" -#: ../../include/permissions.php:14 -msgid "Can view my \"public\" channel profile" -msgstr "Может просматривать мой \"публичный\" профиль канала" +#: ../../include/js_strings.php:18 +msgid "Nothing new here" +msgstr "Здесь нет ничего нового" -#: ../../include/permissions.php:15 -msgid "Can view my \"public\" photo albums" -msgstr "Может просматривать мои \"публичные\" фотоальбомы" +#: ../../include/js_strings.php:19 +msgid "Rate This Channel (this is public)" +msgstr "Оценкa этoго канала (общедоступно)" -#: ../../include/permissions.php:16 -msgid "Can view my \"public\" address book" -msgstr "Может просматривать мою \"публичную\" адресную книгу" +#: ../../include/js_strings.php:20 ../../Zotlabs/Module/Connedit.php:870 +#: ../../Zotlabs/Module/Rate.php:155 +msgid "Rating" +msgstr "Оценка" -#: ../../include/permissions.php:17 -msgid "Can view my \"public\" file storage" -msgstr "Может просматривать мои \"публичные\" файлы" +#: ../../include/js_strings.php:21 +msgid "Describe (optional)" +msgstr "Охарактеризовать (необязательно)" -#: ../../include/permissions.php:18 -msgid "Can view my \"public\" pages" -msgstr "Может просматривать мои \"публичные\" страницы" +#: ../../include/js_strings.php:23 +msgid "Please enter a link URL" +msgstr "Пожалуйста, введите URL ссылки" -#: ../../include/permissions.php:21 -msgid "Can send me their channel stream and posts" -msgstr "Может прислать мне свои потоки и сообщения" +#: ../../include/js_strings.php:24 +msgid "Unsaved changes. Are you sure you wish to leave this page?" +msgstr "Есть несохраненные изменения. Вы уверены, что хотите покинуть эту страницу?" -#: ../../include/permissions.php:22 -msgid "Can post on my channel page (\"wall\")" -msgstr "Может публиковать на моей странице канала (\"стена\")" +#: ../../include/js_strings.php:25 ../../Zotlabs/Module/Cdav.php:872 +#: ../../Zotlabs/Module/Pubsites.php:52 ../../Zotlabs/Module/Events.php:475 +#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Profiles.php:509 +#: ../../Zotlabs/Module/Profiles.php:734 +msgid "Location" +msgstr "Место" -#: ../../include/permissions.php:23 -msgid "Can comment on my posts" -msgstr "Может комментировать мои сообщения" +#: ../../include/js_strings.php:26 +msgid "lovely" +msgstr "прекрасно" -#: ../../include/permissions.php:24 -msgid "Can send me private mail messages" -msgstr "Может отправлять мне личные сообщения по эл. почте" +#: ../../include/js_strings.php:27 +msgid "wonderful" +msgstr "замечательно" -#: ../../include/permissions.php:25 -msgid "Can post photos to my photo albums" -msgstr "Может публиковать фотографии в мои фотоальбомы" +#: ../../include/js_strings.php:28 +msgid "fantastic" +msgstr "фантастично" -#: ../../include/permissions.php:26 -msgid "Can forward to all my channel contacts via post @mentions" -msgstr "" +#: ../../include/js_strings.php:29 +msgid "great" +msgstr "отлично" -#: ../../include/permissions.php:26 -msgid "Advanced - useful for creating group forum channels" -msgstr "" +#: ../../include/js_strings.php:30 +msgid "" +"Your chosen nickname was either already taken or not valid. Please use our " +"suggestion (" +msgstr "Выбранный вами псевдоним уже используется или недействителен. Попробуйте использовать наше предложение (" -#: ../../include/permissions.php:27 -msgid "Can chat with me (when available)" -msgstr "Можете общаться со мной в чате (при наличии)" +#: ../../include/js_strings.php:31 +msgid ") or enter a new one." +msgstr ") или введите новый." + +#: ../../include/js_strings.php:32 +msgid "Thank you, this nickname is valid." +msgstr "Спасибо, этот псевдоним может быть использован." -#: ../../include/permissions.php:28 -msgid "Can write to my \"public\" file storage" -msgstr "Может писать в моё \"публичное\" хранилище файлов" +#: ../../include/js_strings.php:33 +msgid "A channel name is required." +msgstr "Требуется название канала." -#: ../../include/permissions.php:29 -msgid "Can edit my \"public\" pages" -msgstr "Может редактировать мои \"публичные\" страницы" +#: ../../include/js_strings.php:34 +msgid "This is a " +msgstr "Это " -#: ../../include/permissions.php:31 -msgid "Can source my \"public\" posts in derived channels" +#: ../../include/js_strings.php:35 +msgid " channel name" +msgstr " название канала" + +#: ../../include/js_strings.php:41 +msgid "timeago.prefixAgo" msgstr "" -#: ../../include/permissions.php:31 -msgid "Somewhat advanced - very useful in open communities" +#: ../../include/js_strings.php:42 +msgid "timeago.prefixFromNow" msgstr "" -#: ../../include/permissions.php:33 -msgid "Can administer my channel resources" -msgstr "Может администрировать мои ресурсы канала" +#: ../../include/js_strings.php:43 +msgid "timeago.suffixAgo" +msgstr "назад" -#: ../../include/permissions.php:33 -msgid "" -"Extremely advanced. Leave this alone unless you know what you are doing" +#: ../../include/js_strings.php:44 +msgid "timeago.suffixFromNow" msgstr "" -#: ../../mod/mood.php:132 -msgid "Set your current mood and tell your friends" -msgstr "" +#: ../../include/js_strings.php:47 +msgid "less than a minute" +msgstr "менее чем одну минуту" -#: ../../mod/mitem.php:14 ../../mod/menu.php:92 -msgid "Menu not found." -msgstr "Меню не найдено." +#: ../../include/js_strings.php:48 +msgid "about a minute" +msgstr "около минуты" -#: ../../mod/mitem.php:47 -msgid "Menu element updated." -msgstr "Меню обновлено." +#: ../../include/js_strings.php:49 +#, php-format +msgid "%d minutes" +msgstr "%d минут" -#: ../../mod/mitem.php:51 -msgid "Unable to update menu element." -msgstr "" +#: ../../include/js_strings.php:50 +msgid "about an hour" +msgstr "около часа" -#: ../../mod/mitem.php:57 -msgid "Menu element added." -msgstr "Элемент меню добавлен." +#: ../../include/js_strings.php:51 +#, php-format +msgid "about %d hours" +msgstr "около %d часов" -#: ../../mod/mitem.php:61 -msgid "Unable to add menu element." -msgstr "Невозможно добавить элемент меню." +#: ../../include/js_strings.php:52 +msgid "a day" +msgstr "день" -#: ../../mod/mitem.php:78 ../../mod/dirprofile.php:175 ../../mod/menu.php:120 -#: ../../mod/xchan.php:27 -msgid "Not found." -msgstr "Не найдено." +#: ../../include/js_strings.php:53 +#, php-format +msgid "%d days" +msgstr "%d дней" -#: ../../mod/mitem.php:96 -msgid "Manage Menu Elements" -msgstr "Управление элементов меню" +#: ../../include/js_strings.php:54 +msgid "about a month" +msgstr "около месяца" -#: ../../mod/mitem.php:99 -msgid "Edit menu" -msgstr "Редактировать меню" +#: ../../include/js_strings.php:55 +#, php-format +msgid "%d months" +msgstr "%d месяцев" -#: ../../mod/mitem.php:102 -msgid "Edit element" -msgstr "Редактировать элемент" +#: ../../include/js_strings.php:56 +msgid "about a year" +msgstr "около года" -#: ../../mod/mitem.php:103 -msgid "Drop element" -msgstr "Удалить элемент" +#: ../../include/js_strings.php:57 +#, php-format +msgid "%d years" +msgstr "%d лет" -#: ../../mod/mitem.php:104 -msgid "New element" -msgstr "Новый элемент" +#: ../../include/js_strings.php:58 +msgid " " +msgstr " " -#: ../../mod/mitem.php:105 -msgid "Edit this menu container" +#: ../../include/js_strings.php:59 +msgid "timeago.numbers" msgstr "" -#: ../../mod/mitem.php:106 -msgid "Add menu element" -msgstr "Добавить элемент меню" +#: ../../include/js_strings.php:65 +msgctxt "long" +msgid "May" +msgstr "Май" -#: ../../mod/mitem.php:107 -msgid "Delete this menu item" -msgstr "Удалить элемент меню" +#: ../../include/js_strings.php:73 +msgid "Jan" +msgstr "Янв" -#: ../../mod/mitem.php:108 -msgid "Edit this menu item" -msgstr "Редактировать элемент меню" +#: ../../include/js_strings.php:74 +msgid "Feb" +msgstr "Фев" -#: ../../mod/mitem.php:131 -msgid "New Menu Element" -msgstr "Новый элемент меню" +#: ../../include/js_strings.php:75 +msgid "Mar" +msgstr "Мар" -#: ../../mod/mitem.php:133 ../../mod/mitem.php:176 -msgid "Menu Item Permissions" -msgstr "" +#: ../../include/js_strings.php:76 +msgid "Apr" +msgstr "Апр" -#: ../../mod/mitem.php:134 ../../mod/mitem.php:177 ../../mod/settings.php:960 -msgid "(click to open/close)" -msgstr "(нажмите, чтобы открыть / закрыть)" +#: ../../include/js_strings.php:77 +msgctxt "short" +msgid "May" +msgstr "Май" -#: ../../mod/mitem.php:136 ../../mod/mitem.php:180 -msgid "Link text" -msgstr "Текст ссылки" +#: ../../include/js_strings.php:78 +msgid "Jun" +msgstr "Июн" -#: ../../mod/mitem.php:137 ../../mod/mitem.php:181 -msgid "URL of link" -msgstr "URL ссылки" +#: ../../include/js_strings.php:79 +msgid "Jul" +msgstr "Июл" -#: ../../mod/mitem.php:138 ../../mod/mitem.php:182 -msgid "Use Red magic-auth if available" -msgstr "" +#: ../../include/js_strings.php:80 +msgid "Aug" +msgstr "Авг" -#: ../../mod/mitem.php:139 ../../mod/mitem.php:183 -msgid "Open link in new window" -msgstr "Открыть ссылку в новом окне" +#: ../../include/js_strings.php:81 +msgid "Sep" +msgstr "Сен" -#: ../../mod/mitem.php:141 ../../mod/mitem.php:185 -msgid "Order in list" -msgstr "" +#: ../../include/js_strings.php:82 +msgid "Oct" +msgstr "Окт" -#: ../../mod/mitem.php:141 ../../mod/mitem.php:185 -msgid "Higher numbers will sink to bottom of listing" -msgstr "" +#: ../../include/js_strings.php:83 +msgid "Nov" +msgstr "Ноя" -#: ../../mod/mitem.php:154 -msgid "Menu item not found." -msgstr "Элемент меню не найден." +#: ../../include/js_strings.php:84 +msgid "Dec" +msgstr "Дек" -#: ../../mod/mitem.php:163 -msgid "Menu item deleted." -msgstr "Элемент меню удален." +#: ../../include/js_strings.php:92 +msgid "Sun" +msgstr "Вск" -#: ../../mod/mitem.php:165 -msgid "Menu item could not be deleted." -msgstr "" +#: ../../include/js_strings.php:93 +msgid "Mon" +msgstr "Пон" -#: ../../mod/mitem.php:174 -msgid "Edit Menu Element" -msgstr "Редактировать элемент меню" +#: ../../include/js_strings.php:94 +msgid "Tue" +msgstr "Вт" -#: ../../mod/mitem.php:186 ../../mod/menu.php:114 -msgid "Modify" -msgstr "Изменить" +#: ../../include/js_strings.php:95 +msgid "Wed" +msgstr "Ср" -#: ../../mod/ping.php:192 -msgid "sent you a private message" -msgstr "отправил вам личное сообщение" +#: ../../include/js_strings.php:96 +msgid "Thu" +msgstr "Чет" -#: ../../mod/ping.php:250 -msgid "added your channel" -msgstr "добавил ваш канал" +#: ../../include/js_strings.php:97 +msgid "Fri" +msgstr "Пят" -#: ../../mod/ping.php:294 -msgid "posted an event" -msgstr "" +#: ../../include/js_strings.php:98 +msgid "Sat" +msgstr "Суб" -#: ../../mod/acl.php:239 -msgid "network" -msgstr "сеть" +#: ../../include/js_strings.php:99 +msgctxt "calendar" +msgid "today" +msgstr "сегодня" -#: ../../mod/settings.php:71 -msgid "Name is required" -msgstr "Необходимо имя" +#: ../../include/js_strings.php:100 +msgctxt "calendar" +msgid "month" +msgstr "месяц" -#: ../../mod/settings.php:75 -msgid "Key and Secret are required" -msgstr "" +#: ../../include/js_strings.php:101 +msgctxt "calendar" +msgid "week" +msgstr "неделя" -#: ../../mod/settings.php:195 -msgid "Passwords do not match. Password unchanged." -msgstr "Пароли не совпадают. Пароль не изменён." +#: ../../include/js_strings.php:102 +msgctxt "calendar" +msgid "day" +msgstr "день" -#: ../../mod/settings.php:199 -msgid "Empty passwords are not allowed. Password unchanged." -msgstr "Пустые пароли не допускаются. Пароль не изменён." +#: ../../include/js_strings.php:103 +msgctxt "calendar" +msgid "All day" +msgstr "Весь день" -#: ../../mod/settings.php:212 -msgid "Password changed." -msgstr "Пароль изменен." +#: ../../include/oembed.php:224 +msgid "View PDF" +msgstr "Просмотреть PDF" -#: ../../mod/settings.php:214 -msgid "Password update failed. Please try again." -msgstr "Изменение пароля закончилось неуспешно. Пожалуйста, попробуйте еще раз." +#: ../../include/oembed.php:347 +msgid " by " +msgstr " по " -#: ../../mod/settings.php:228 -msgid "Not valid email." -msgstr "Не действительный адрес электронной почты." +#: ../../include/oembed.php:348 +msgid " on " +msgstr " на " -#: ../../mod/settings.php:231 -msgid "Protected email address. Cannot change to that email." -msgstr "Защищенный адрес электронной почты. Нельзя изменить." +#: ../../include/oembed.php:377 +msgid "Embedded content" +msgstr "Встроенное содержимое" -#: ../../mod/settings.php:240 -msgid "System failure storing new email. Please try again." -msgstr "" +#: ../../include/oembed.php:386 +msgid "Embedding disabled" +msgstr "Встраивание отключено" -#: ../../mod/settings.php:443 -msgid "Settings updated." -msgstr "Настройки обновленны." +#: ../../include/photos.php:151 +#, php-format +msgid "Image exceeds website size limit of %lu bytes" +msgstr "Файл превышает предельный размер для сайта в %lu байт" -#: ../../mod/settings.php:514 ../../mod/settings.php:540 -#: ../../mod/settings.php:576 -msgid "Add application" -msgstr "Добавить приложения" +#: ../../include/photos.php:162 +msgid "Image file is empty." +msgstr "Файл изображения пуст." -#: ../../mod/settings.php:517 ../../mod/settings.php:543 -#: ../../mod/admin.php:893 -#: ../../view/tpl/smarty3/compiled/de0b699d2fc212753c3f166003476a343ca00174.file.cloud_directory.tpl.php:35 -msgid "Name" -msgstr "Имя" +#: ../../include/photos.php:196 ../../Zotlabs/Module/Profile_photo.php:225 +#: ../../Zotlabs/Module/Cover_photo.php:205 +msgid "Unable to process image" +msgstr "Не удается обработать изображение" -#: ../../mod/settings.php:517 -msgid "Name of application" -msgstr "Название приложения" +#: ../../include/photos.php:327 +msgid "Photo storage failed." +msgstr "Ошибка хранилища фотографий." -#: ../../mod/settings.php:518 ../../mod/settings.php:544 -msgid "Consumer Key" -msgstr "Ключ клиента" +#: ../../include/photos.php:376 +msgid "a new photo" +msgstr "новая фотография" -#: ../../mod/settings.php:518 ../../mod/settings.php:519 -msgid "Automatically generated - change if desired. Max length 20" -msgstr "" +#: ../../include/photos.php:380 +#, php-format +msgctxt "photo_upload" +msgid "%1$s posted %2$s to %3$s" +msgstr "%1$s опубликовал %2$s в %3$s" -#: ../../mod/settings.php:519 ../../mod/settings.php:545 -msgid "Consumer Secret" -msgstr "Секрет клиента" +#: ../../include/photos.php:668 ../../Zotlabs/Module/Photos.php:1370 +#: ../../Zotlabs/Module/Photos.php:1383 ../../Zotlabs/Module/Photos.php:1384 +msgid "Recent Photos" +msgstr "Последние фотографии" -#: ../../mod/settings.php:520 ../../mod/settings.php:546 -msgid "Redirect" -msgstr "Перенаправление" +#: ../../include/photos.php:672 +msgid "Upload New Photos" +msgstr "Загрузить новые фотографии" -#: ../../mod/settings.php:520 -msgid "" -"Redirect URI - leave blank unless your application specifically requires " -"this" -msgstr "" +#: ../../include/connections.php:133 +msgid "New window" +msgstr "Новое окно" -#: ../../mod/settings.php:521 ../../mod/settings.php:547 -msgid "Icon url" -msgstr "URL-адрес значка" +#: ../../include/connections.php:134 +msgid "Open the selected location in a different window or browser tab" +msgstr "Открыть выбранное местоположение в другом окне или вкладке браузера" -#: ../../mod/settings.php:521 -msgid "Optional" -msgstr "Необязательно" +#: ../../Zotlabs/Lib/NativeWiki.php:151 +msgid "Wiki updated successfully" +msgstr "Wiki успешно обновлена" -#: ../../mod/settings.php:532 -msgid "You can't edit this application." -msgstr "Вы не можете редактировать это приложение." +#: ../../Zotlabs/Lib/NativeWiki.php:205 +msgid "Wiki files deleted successfully" +msgstr "Wiki успешно удалена" -#: ../../mod/settings.php:575 -msgid "Connected Apps" -msgstr "Подключенные приложения" +#: ../../Zotlabs/Lib/Techlevels.php:10 +msgid "0. Beginner/Basic" +msgstr "Начинающий / Базовый" -#: ../../mod/settings.php:579 -msgid "Client key starts with" -msgstr "" +#: ../../Zotlabs/Lib/Techlevels.php:11 +msgid "1. Novice - not skilled but willing to learn" +msgstr "1. Новичок - не опытный, но желающий учиться" -#: ../../mod/settings.php:580 -msgid "No name" -msgstr "Без названия" +#: ../../Zotlabs/Lib/Techlevels.php:12 +msgid "2. Intermediate - somewhat comfortable" +msgstr "2. Промежуточный - более удобный" -#: ../../mod/settings.php:581 -msgid "Remove authorization" -msgstr "Удалить разрешение" +#: ../../Zotlabs/Lib/Techlevels.php:13 +msgid "3. Advanced - very comfortable" +msgstr "3. Продвинутый - очень удобный" -#: ../../mod/settings.php:592 -msgid "No feature settings configured" -msgstr "Параметры функций не настроены" +#: ../../Zotlabs/Lib/Techlevels.php:14 +msgid "4. Expert - I can write computer code" +msgstr "4. Эксперт - я умею программировать" -#: ../../mod/settings.php:600 -msgid "Feature Settings" -msgstr "Настройки функции" +#: ../../Zotlabs/Lib/Techlevels.php:15 +msgid "5. Wizard - I probably know more than you do" +msgstr "5. Волшебник - возможно я знаю больше чем ты" -#: ../../mod/settings.php:623 -msgid "Account Settings" -msgstr "Настройки аккаунта" +#: ../../Zotlabs/Lib/PermissionDescription.php:108 +msgid "Public" +msgstr "Общедоступно" -#: ../../mod/settings.php:624 -msgid "Password Settings" -msgstr "Настройки пароля" +#: ../../Zotlabs/Lib/PermissionDescription.php:109 +msgid "Anybody in the $Projectname network" +msgstr "Любому в сети $Projectname" -#: ../../mod/settings.php:625 -msgid "New Password:" -msgstr "Новый пароль:" +#: ../../Zotlabs/Lib/PermissionDescription.php:110 +#, php-format +msgid "Any account on %s" +msgstr "Любой аккаунт в %s" -#: ../../mod/settings.php:626 -msgid "Confirm:" -msgstr "Подтверждение:" +#: ../../Zotlabs/Lib/PermissionDescription.php:111 +msgid "Any of my connections" +msgstr "Любой из моих контактов" -#: ../../mod/settings.php:626 -msgid "Leave password fields blank unless changing" -msgstr "Оставьте поля пустыми, если не меняется" +#: ../../Zotlabs/Lib/PermissionDescription.php:112 +msgid "Only connections I specifically allow" +msgstr "Только те контакты, кому я дам разрешение" -#: ../../mod/settings.php:628 ../../mod/settings.php:936 -msgid "Email Address:" -msgstr "Адрес электронной почты:" +#: ../../Zotlabs/Lib/PermissionDescription.php:113 +msgid "Anybody authenticated (could include visitors from other networks)" +msgstr "Любой аутентифицированный (может включать посетителей их других сетей)" -#: ../../mod/settings.php:629 -msgid "Remove Account" -msgstr "Удалить аккаунт" +#: ../../Zotlabs/Lib/PermissionDescription.php:114 +msgid "Any connections including those who haven't yet been approved" +msgstr "Любые контакты включая те, которые вы ещё не одобрили" -#: ../../mod/settings.php:630 -msgid "Warning: This action is permanent and cannot be reversed." -msgstr "" +#: ../../Zotlabs/Lib/PermissionDescription.php:150 +msgid "" +"This is your default setting for the audience of your normal stream, and " +"posts." +msgstr "Это настройка по умолчанию для аудитории ваших обычных потоков и публикаций" -#: ../../mod/settings.php:646 -msgid "Off" -msgstr "Выкл." +#: ../../Zotlabs/Lib/PermissionDescription.php:151 +msgid "" +"This is your default setting for who can view your default channel profile" +msgstr "Это настройка по умолчанию для тех, кто может просматривать профиль вашего основного канала" -#: ../../mod/settings.php:646 -msgid "On" -msgstr "Вкл." +#: ../../Zotlabs/Lib/PermissionDescription.php:152 +msgid "This is your default setting for who can view your connections" +msgstr "Это настройка по умолчанию для тех, кто может просматривать ваши контакты" -#: ../../mod/settings.php:653 -msgid "Additional Features" -msgstr "Дополнительные функции" +#: ../../Zotlabs/Lib/PermissionDescription.php:153 +msgid "" +"This is your default setting for who can view your file storage and photos" +msgstr "Это настройка по умолчанию для тех, кто может просматривать ваше хранилище файлов и фотографий" -#: ../../mod/settings.php:678 -msgid "Connector Settings" -msgstr "Настройки соединителя" +#: ../../Zotlabs/Lib/PermissionDescription.php:154 +msgid "This is your default setting for the audience of your webpages" +msgstr "Это настройка по умолчанию для аудитории ваших веб-страниц" -#: ../../mod/settings.php:708 ../../mod/admin.php:390 -msgid "No special theme for mobile devices" -msgstr "Нет специальной темы для мобильных устройств" +#: ../../Zotlabs/Lib/ThreadItem.php:152 ../../Zotlabs/Storage/Browser.php:280 +msgid "Admin Delete" +msgstr "Удалено администратором" -#: ../../mod/settings.php:717 -#, php-format -msgid "%s - (Experimental)" -msgstr "%s - (экспериментальный)" +#: ../../Zotlabs/Lib/ThreadItem.php:162 ../../Zotlabs/Module/Filer.php:54 +msgid "Save to Folder" +msgstr "Сохранить в каталог" -#: ../../mod/settings.php:747 -msgid "Display Settings" -msgstr "Настройки отображения" +#: ../../Zotlabs/Lib/ThreadItem.php:183 +msgid "I will attend" +msgstr "Я буду присутствовать" -#: ../../mod/settings.php:753 -msgid "Display Theme:" -msgstr "Тема отображения:" +#: ../../Zotlabs/Lib/ThreadItem.php:183 +msgid "I will not attend" +msgstr "Я не буду присутствовать" -#: ../../mod/settings.php:754 -msgid "Mobile Theme:" -msgstr "Мобильная тема отображения:" +#: ../../Zotlabs/Lib/ThreadItem.php:183 +msgid "I might attend" +msgstr "Я возможно буду присутствовать" -#: ../../mod/settings.php:755 -msgid "Update browser every xx seconds" -msgstr "Обновление браузера каждые ХХ секунд" +#: ../../Zotlabs/Lib/ThreadItem.php:193 +msgid "I agree" +msgstr "Я согласен" -#: ../../mod/settings.php:755 -msgid "Minimum of 10 seconds, no maximum" -msgstr "Минимум 10 секунд, без максимума" +#: ../../Zotlabs/Lib/ThreadItem.php:193 +msgid "I disagree" +msgstr "Я не согласен" -#: ../../mod/settings.php:756 -msgid "Maximum number of conversations to load at any time:" -msgstr "" +#: ../../Zotlabs/Lib/ThreadItem.php:193 +msgid "I abstain" +msgstr "Я воздержался" -#: ../../mod/settings.php:756 -msgid "Maximum of 100 items" -msgstr "Максимум 100 элементов" +#: ../../Zotlabs/Lib/ThreadItem.php:212 ../../Zotlabs/Lib/ThreadItem.php:224 +#: ../../Zotlabs/Module/Photos.php:1161 ../../Zotlabs/Module/Photos.php:1173 +msgid "View all" +msgstr "Просмотреть все" -#: ../../mod/settings.php:757 -msgid "Don't show emoticons" -msgstr "Не показывать emoticons" +#: ../../Zotlabs/Lib/ThreadItem.php:267 +msgid "Add Tag" +msgstr "Добавить тег" -#: ../../mod/settings.php:758 -msgid "System Page Layout Editor - (advanced)" -msgstr "" +#: ../../Zotlabs/Lib/ThreadItem.php:285 ../../Zotlabs/Module/Photos.php:1105 +msgid "I like this (toggle)" +msgstr "мне это нравится (переключение)" -#: ../../mod/settings.php:793 -msgid "Nobody except yourself" -msgstr "Никто, кроме вас" +#: ../../Zotlabs/Lib/ThreadItem.php:286 ../../Zotlabs/Module/Photos.php:1106 +msgid "I don't like this (toggle)" +msgstr "мне это не нравится (переключение)" -#: ../../mod/settings.php:794 -msgid "Only those you specifically allow" -msgstr "Только комы вы разрешили" +#: ../../Zotlabs/Lib/ThreadItem.php:290 +msgid "Share This" +msgstr "Поделиться этим" -#: ../../mod/settings.php:795 -msgid "Approved connections" -msgstr "Утвержденные контакты" +#: ../../Zotlabs/Lib/ThreadItem.php:290 +msgid "share" +msgstr "поделиться" -#: ../../mod/settings.php:796 -msgid "Any connections" -msgstr "Все контакты" +#: ../../Zotlabs/Lib/ThreadItem.php:299 +msgid "Delivery Report" +msgstr "Отчёт о доставке" -#: ../../mod/settings.php:797 -msgid "Anybody on this website" -msgstr "Любой на этом веб-сайте" +#: ../../Zotlabs/Lib/ThreadItem.php:317 +#, php-format +msgid "%d comment" +msgid_plural "%d comments" +msgstr[0] "%d комментарий" +msgstr[1] "%d комментария" +msgstr[2] "%d комментариев" -#: ../../mod/settings.php:798 -msgid "Anybody in this network" -msgstr "Любой в этой сети" +#: ../../Zotlabs/Lib/ThreadItem.php:347 ../../Zotlabs/Lib/ThreadItem.php:348 +#, php-format +msgid "View %s's profile - %s" +msgstr "Просмотр %s профиля - %s" -#: ../../mod/settings.php:799 -msgid "Anybody authenticated" -msgstr "" +#: ../../Zotlabs/Lib/ThreadItem.php:351 +msgid "to" +msgstr "к" -#: ../../mod/settings.php:800 -msgid "Anybody on the internet" -msgstr "Любой в интернете" +#: ../../Zotlabs/Lib/ThreadItem.php:352 +msgid "via" +msgstr "через" -#: ../../mod/settings.php:877 -msgid "Publish your default profile in the network directory" -msgstr "Публикация вашего профиля по умолчанию в каталоге сети" +#: ../../Zotlabs/Lib/ThreadItem.php:353 +msgid "Wall-to-Wall" +msgstr "Стена-к-Стене" -#: ../../mod/settings.php:877 ../../mod/settings.php:882 -#: ../../mod/settings.php:953 ../../mod/api.php:106 ../../mod/profiles.php:493 -#: ../../mod/admin.php:420 -msgid "No" -msgstr "Нет" +#: ../../Zotlabs/Lib/ThreadItem.php:354 +msgid "via Wall-To-Wall:" +msgstr "через Стена-к-Стене:" -#: ../../mod/settings.php:877 ../../mod/settings.php:882 -#: ../../mod/settings.php:953 ../../mod/api.php:105 ../../mod/profiles.php:492 -#: ../../mod/admin.php:422 -msgid "Yes" -msgstr "Да" +#: ../../Zotlabs/Lib/ThreadItem.php:379 +msgid "Attend" +msgstr "Посетить" -#: ../../mod/settings.php:882 -msgid "Allow us to suggest you as a potential friend to new members?" -msgstr "" +#: ../../Zotlabs/Lib/ThreadItem.php:380 +msgid "Attendance Options" +msgstr "Параметры посещаемости" -#: ../../mod/settings.php:886 ../../mod/profile_photo.php:365 -msgid "or" -msgstr "или" +#: ../../Zotlabs/Lib/ThreadItem.php:381 +msgid "Vote" +msgstr "Голосовать" -#: ../../mod/settings.php:891 -msgid "Your channel address is" -msgstr "Адрес канала:" +#: ../../Zotlabs/Lib/ThreadItem.php:382 +msgid "Voting Options" +msgstr "Параметры голосования" -#: ../../mod/settings.php:925 -msgid "Channel Settings" -msgstr "Настройки канала" +#: ../../Zotlabs/Lib/ThreadItem.php:404 +msgid "Add to Calendar" +msgstr "Добавить в календарь" -#: ../../mod/settings.php:934 -msgid "Basic Settings" -msgstr "Основные настройки" +#: ../../Zotlabs/Lib/ThreadItem.php:413 +#: ../../Zotlabs/Module/Notifications.php:60 +msgid "Mark all seen" +msgstr "Отметить как просмотренное" -#: ../../mod/settings.php:937 -msgid "Your Timezone:" -msgstr "Часовой пояс:" +#: ../../Zotlabs/Lib/ThreadItem.php:420 ../../Zotlabs/Module/Photos.php:1292 +msgctxt "noun" +msgid "Likes" +msgstr "Нравится" -#: ../../mod/settings.php:938 -msgid "Default Post Location:" -msgstr "Откуда по умолчанию:" +#: ../../Zotlabs/Lib/ThreadItem.php:421 ../../Zotlabs/Module/Photos.php:1293 +msgctxt "noun" +msgid "Dislikes" +msgstr "Не нравится" -#: ../../mod/settings.php:938 -msgid "Geographical location to display on your posts" -msgstr "" +#: ../../Zotlabs/Lib/ThreadItem.php:754 ../../Zotlabs/Module/Photos.php:1124 +#: ../../Zotlabs/Module/Photos.php:1242 +msgid "This is you" +msgstr "Это вы" -#: ../../mod/settings.php:939 -msgid "Use Browser Location:" -msgstr "Использовать указание браузерa:" +#: ../../Zotlabs/Lib/ThreadItem.php:763 +msgid "Image" +msgstr "Изображение" -#: ../../mod/settings.php:941 -msgid "Adult Content" -msgstr "Содержимое для взрослых" +#: ../../Zotlabs/Lib/ThreadItem.php:765 +msgid "Insert Link" +msgstr "Вставить ссылку" -#: ../../mod/settings.php:941 -msgid "" -"This channel frequently or regularly publishes adult content. (Please tag " -"any adult material and/or nudity with #NSFW)" -msgstr "" +#: ../../Zotlabs/Lib/ThreadItem.php:766 +msgid "Video" +msgstr "Видео" -#: ../../mod/settings.php:943 -msgid "Security and Privacy Settings" -msgstr "Параметры безопасности и конфиденциальности" +#: ../../Zotlabs/Lib/ThreadItem.php:776 +msgid "Your full name (required)" +msgstr "Ваше полное имя (требуется)" -#: ../../mod/settings.php:945 -msgid "Hide my online presence" -msgstr "Скрыть мое присутствие" +#: ../../Zotlabs/Lib/ThreadItem.php:777 +msgid "Your email address (required)" +msgstr "Ваш адрес электронной почты (требуется)" -#: ../../mod/settings.php:945 -msgid "Prevents displaying in your profile that you are online" -msgstr "Предотвращает показ в вашем профиле, что вы онлайн" +#: ../../Zotlabs/Lib/ThreadItem.php:778 +msgid "Your website URL (optional)" +msgstr "URL вашего вебсайта (необязательно)" -#: ../../mod/settings.php:947 -msgid "Simple Privacy Settings:" -msgstr "Быстрые настройки:" +#: ../../Zotlabs/Lib/Apps.php:291 ../../Zotlabs/Module/Apps.php:50 +msgid "Apps" +msgstr "Приложения" -#: ../../mod/settings.php:948 -msgid "" -"Very Public - <em>extremely permissive (should be used with caution)</em>" -msgstr "" +#: ../../Zotlabs/Lib/Apps.php:294 +msgid "Site Admin" +msgstr "Администратор сайта" -#: ../../mod/settings.php:949 -msgid "" -"Typical - <em>default public, privacy when desired (similar to social " -"network permissions but with improved privacy)</em>" -msgstr "" +#: ../../Zotlabs/Lib/Apps.php:296 +msgid "View Bookmarks" +msgstr "Просмотреть закадки" -#: ../../mod/settings.php:950 -msgid "Private - <em>default private, never open or public</em>" -msgstr "" +#: ../../Zotlabs/Lib/Apps.php:297 +msgid "My Chatrooms" +msgstr "Мои чаты" -#: ../../mod/settings.php:951 -msgid "Blocked - <em>default blocked to/from everybody</em>" -msgstr "" +#: ../../Zotlabs/Lib/Apps.php:299 +msgid "Remote Diagnostics" +msgstr "Удалённая диагностика" -#: ../../mod/settings.php:953 -msgid "Allow others to tag your posts" -msgstr "Разрешить другим помечать сообщения" +#: ../../Zotlabs/Lib/Apps.php:303 +msgid "Activity" +msgstr "Активность" -#: ../../mod/settings.php:953 -msgid "" -"Often used by the community to retro-actively flag inappropriate content" -msgstr "" +#: ../../Zotlabs/Lib/Apps.php:308 +msgid "Channel Home" +msgstr "Главная канала" -#: ../../mod/settings.php:955 -msgid "Advanced Privacy Settings" -msgstr "Дополнительные настройки" +#: ../../Zotlabs/Lib/Apps.php:312 +msgid "Directory" +msgstr "Каталог" -#: ../../mod/settings.php:957 -msgid "Expire other channel content after this many days" -msgstr "" +#: ../../Zotlabs/Lib/Apps.php:314 +msgid "Mail" +msgstr "Переписка" -#: ../../mod/settings.php:957 -msgid "0 or blank prevents expiration" -msgstr "" +#: ../../Zotlabs/Lib/Apps.php:315 ../../Zotlabs/Module/Mood.php:135 +msgid "Mood" +msgstr "Настроение" -#: ../../mod/settings.php:958 -msgid "Maximum Friend Requests/Day:" -msgstr "" +#: ../../Zotlabs/Lib/Apps.php:317 +msgid "Chat" +msgstr "Чат" -#: ../../mod/settings.php:958 -msgid "May reduce spam activity" -msgstr "Может уменьшить активность спам" +#: ../../Zotlabs/Lib/Apps.php:319 +msgid "Probe" +msgstr "Проба" -#: ../../mod/settings.php:959 -msgid "Default Post Permissions" -msgstr "Настройки по умолчанию" +#: ../../Zotlabs/Lib/Apps.php:320 +msgid "Suggest" +msgstr "Предложить" + +#: ../../Zotlabs/Lib/Apps.php:321 +msgid "Random Channel" +msgstr "Случайный канал" + +#: ../../Zotlabs/Lib/Apps.php:322 +msgid "Invite" +msgstr "Пригласить" + +#: ../../Zotlabs/Lib/Apps.php:323 ../../Zotlabs/Widget/Admin.php:26 +msgid "Features" +msgstr "Функции" + +#: ../../Zotlabs/Lib/Apps.php:325 +msgid "Post" +msgstr "Публикация" + +#: ../../Zotlabs/Lib/Apps.php:456 ../../Zotlabs/Module/Cdav.php:1186 +#: ../../Zotlabs/Module/Connedit.php:922 +#: ../../Zotlabs/Module/Admin/Addons.php:453 +#: ../../Zotlabs/Module/Settings/Oauth2.php:40 +#: ../../Zotlabs/Module/Settings/Oauth2.php:113 +#: ../../Zotlabs/Module/Settings/Oauth.php:43 +#: ../../Zotlabs/Module/Settings/Oauth.php:114 +#: ../../Zotlabs/Module/Profiles.php:799 +msgid "Update" +msgstr "Обновить" -#: ../../mod/settings.php:971 -msgid "Maximum private messages per day from unknown people:" -msgstr "Максимальное количество личных сообщений от незнакомых людей:" +#: ../../Zotlabs/Lib/Apps.php:456 ../../Zotlabs/Module/Admin/Addons.php:422 +msgid "Install" +msgstr "Установить" -#: ../../mod/settings.php:971 -msgid "Useful to reduce spamming" -msgstr "Полезно для уменьшения активности спам" +#: ../../Zotlabs/Lib/Apps.php:473 +msgid "Purchase" +msgstr "Купить" + +#: ../../Zotlabs/Lib/Apps.php:477 +msgid "Undelete" +msgstr "Восстановить" + +#: ../../Zotlabs/Lib/Apps.php:485 +msgid "Add to app-tray" +msgstr "Добавить в app-tray" + +#: ../../Zotlabs/Lib/Apps.php:486 +msgid "Remove from app-tray" +msgstr "Удалить из app-tray" + +#: ../../Zotlabs/Lib/Apps.php:487 +msgid "Pin to navbar" +msgstr "Добавить на панель навигации" + +#: ../../Zotlabs/Lib/Apps.php:488 +msgid "Unpin from navbar" +msgstr "Удалить с панели навигации" + +#: ../../Zotlabs/Lib/Enotify.php:60 +msgid "$Projectname Notification" +msgstr "Оповещение $Projectname " + +#: ../../Zotlabs/Lib/Enotify.php:63 +msgid "Thank You," +msgstr "Спасибо," + +#: ../../Zotlabs/Lib/Enotify.php:66 +#, php-format +msgid "This email was sent by %1$s at %2$s." +msgstr "Это письмо было отправлено %1$s на %2$s." + +#: ../../Zotlabs/Lib/Enotify.php:67 +#, php-format +msgid "" +"To stop receiving these messages, please adjust your Notification Settings " +"at %s" +msgstr "Чтобы прекратить получать эти сообщения, настройте параметры уведомлений в %s" -#: ../../mod/settings.php:974 +#: ../../Zotlabs/Lib/Enotify.php:68 +#, php-format +msgid "To stop receiving these messages, please adjust your %s." +msgstr "Чтобы прекратить получать эти сообщения, пожалуйста измените %s." + +#: ../../Zotlabs/Lib/Enotify.php:68 +#: ../../Zotlabs/Module/Settings/Channel.php:570 msgid "Notification Settings" msgstr "Настройки уведомлений" -#: ../../mod/settings.php:975 -msgid "By default post a status message when:" +#: ../../Zotlabs/Lib/Enotify.php:123 +#, php-format +msgid "%s <!item_type!>" msgstr "" -#: ../../mod/settings.php:976 -msgid "accepting a friend request" -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:127 +#, php-format +msgid "[$Projectname:Notify] New mail received at %s" +msgstr "[$Projectname:Notify] Получено новое сообщение в %s" -#: ../../mod/settings.php:977 -msgid "joining a forum/community" -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:129 +#, php-format +msgid "%1$s sent you a new private message at %2$s." +msgstr "%1$s отправил вам новое личное сообщение в %2$s." -#: ../../mod/settings.php:978 -msgid "making an <em>interesting</em> profile change" -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:130 +#, php-format +msgid "%1$s sent you %2$s." +msgstr "%1$s послал вам %2$s." -#: ../../mod/settings.php:979 -msgid "Send a notification email when:" -msgstr "Отправить уведомление по электронной почте, если:" +#: ../../Zotlabs/Lib/Enotify.php:130 +msgid "a private message" +msgstr "личное сообщение" -#: ../../mod/settings.php:980 -msgid "You receive a connection request" -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:131 +#, php-format +msgid "Please visit %s to view and/or reply to your private messages." +msgstr "Пожалуйста, посетите %s для просмотра и/или ответа на ваши личные сообщения." -#: ../../mod/settings.php:981 -msgid "Your connections are confirmed" -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:144 +msgid "commented on" +msgstr " прокомментировал в" -#: ../../mod/settings.php:982 -msgid "Someone writes on your profile wall" +#: ../../Zotlabs/Lib/Enotify.php:155 +msgid "liked" +msgstr "понравилось" + +#: ../../Zotlabs/Lib/Enotify.php:158 +msgid "disliked" +msgstr "не понравилось" + +#: ../../Zotlabs/Lib/Enotify.php:201 +#, php-format +msgid "%1$s %2$s [zrl=%3$s]a %4$s[/zrl]" msgstr "" -#: ../../mod/settings.php:983 -msgid "Someone writes a followup comment" +#: ../../Zotlabs/Lib/Enotify.php:209 +#, php-format +msgid "%1$s %2$s [zrl=%3$s]%4$s's %5$s[/zrl]" msgstr "" -#: ../../mod/settings.php:984 -msgid "You receive a private message" -msgstr "Вы получили личное сообщение" +#: ../../Zotlabs/Lib/Enotify.php:218 +#, php-format +msgid "%1$s %2$s [zrl=%3$s]your %4$s[/zrl]" +msgstr "%1$s%2$s [zrl=%3$s]ваш %4$s[/zrl]" -#: ../../mod/settings.php:985 -msgid "You receive a friend suggestion" -msgstr "Вы получили предложение дружить" +#: ../../Zotlabs/Lib/Enotify.php:230 +#, php-format +msgid "[$Projectname:Notify] Moderated Comment to conversation #%1$d by %2$s" +msgstr "[$Projectname:Notify] Отмодерирован комментарий к беседе #%1$d по %2$s" -#: ../../mod/settings.php:986 -msgid "You are tagged in a post" -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:232 +#, php-format +msgid "[$Projectname:Notify] Comment to conversation #%1$d by %2$s" +msgstr "[$Projectname:Notify] Комментарий к беседе #%1$d по %2$s" -#: ../../mod/settings.php:987 -msgid "You are poked/prodded/etc. in a post" -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:233 +#, php-format +msgid "%1$s commented on an item/conversation you have been following." +msgstr "%1$s прокомментировал тему / беседу за которым вы следите." -#: ../../mod/settings.php:990 -msgid "Advanced Account/Page Type Settings" -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:236 ../../Zotlabs/Lib/Enotify.php:317 +#: ../../Zotlabs/Lib/Enotify.php:333 ../../Zotlabs/Lib/Enotify.php:358 +#: ../../Zotlabs/Lib/Enotify.php:375 ../../Zotlabs/Lib/Enotify.php:388 +#, php-format +msgid "Please visit %s to view and/or reply to the conversation." +msgstr "Пожалуйста, посетите %s для просмотра и / или ответа в беседе." -#: ../../mod/settings.php:991 -msgid "Change the behaviour of this account for special situations" -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:240 ../../Zotlabs/Lib/Enotify.php:241 +#, php-format +msgid "Please visit %s to approve or reject this comment." +msgstr "Пожалуйста посетитет %s для одобрения и отклонения комментария." -#: ../../mod/settings.php:994 -msgid "" -"Please enable expert mode (in <a href=\"settings/features\">Settings > " -"Additional features</a>) to adjust!" -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:299 +#, php-format +msgid "%1$s liked [zrl=%2$s]your %3$s[/zrl]" +msgstr "%1$s понравился [zrl=%2$s]ваш %3$s[/zrl]" -#: ../../mod/settings.php:995 -msgid "Miscellaneous Settings" -msgstr "Дополнительные настройки" +#: ../../Zotlabs/Lib/Enotify.php:313 +#, php-format +msgid "[$Projectname:Notify] Like received to conversation #%1$d by %2$s" +msgstr "[$Projectname:Notify] Беседа получила отметку \"нравится\" #%1$d от %2$s" -#: ../../mod/settings.php:997 -msgid "Personal menu to display in your channel pages" -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:314 +#, php-format +msgid "%1$s liked an item/conversation you created." +msgstr "%1$s нравится тема / беседа которую вы создали." -#: ../../mod/poke.php:159 -msgid "Poke/Prod" -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:325 +#, php-format +msgid "[$Projectname:Notify] %s posted to your profile wall" +msgstr "[$Projectname:Notify] %s сделал публикацию на стене вашего профиля" -#: ../../mod/poke.php:160 -msgid "poke, prod or do other things to somebody" -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:327 +#, php-format +msgid "%1$s posted to your profile wall at %2$s" +msgstr "%1$s сделал публикацию на стене вашего профиля в %2$s" -#: ../../mod/poke.php:161 -msgid "Recipient" -msgstr "Получатель" +#: ../../Zotlabs/Lib/Enotify.php:329 +#, php-format +msgid "%1$s posted to [zrl=%2$s]your wall[/zrl]" +msgstr "%1$s опубликовал на [zrl=%2$s]вашей стене[/zrl]" -#: ../../mod/poke.php:162 -msgid "Choose what you wish to do to recipient" -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:352 +#, php-format +msgid "[$Projectname:Notify] %s tagged you" +msgstr "[$Projectname:Notify] %s отметил вас" -#: ../../mod/poke.php:165 -msgid "Make this post private" -msgstr "Сделать это сообщение личным" +#: ../../Zotlabs/Lib/Enotify.php:353 +#, php-format +msgid "%1$s tagged you at %2$s" +msgstr "%1$s отметил вас в %2$s" -#: ../../mod/api.php:76 ../../mod/api.php:102 -msgid "Authorize application connection" -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:354 +#, php-format +msgid "%1$s [zrl=%2$s]tagged you[/zrl]." +msgstr "%1$s [zrl=%2$s]отметил вас[/zrl]." -#: ../../mod/api.php:77 -msgid "Return to your app and insert this Securty Code:" -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:365 +#, php-format +msgid "[$Projectname:Notify] %1$s poked you" +msgstr "[$Projectname:Notify] %1$s ткнул вас" -#: ../../mod/api.php:89 -msgid "Please login to continue." -msgstr "Пожалуйста, войдите, чтобы продолжить." +#: ../../Zotlabs/Lib/Enotify.php:366 +#, php-format +msgid "%1$s poked you at %2$s" +msgstr "%1$s ткнул вас в %2$s" -#: ../../mod/api.php:104 -msgid "" -"Do you want to authorize this application to access your posts and contacts," -" and/or create new posts for you?" -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:367 +#, php-format +msgid "%1$s [zrl=%2$s]poked you[/zrl]." +msgstr "%1$s [zrl=%2$s]ткнул вас[/zrl]." -#: ../../mod/post.php:226 -msgid "" -"Remote authentication blocked. You are logged into this site locally. Please" -" logout and retry." -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:382 +#, php-format +msgid "[$Projectname:Notify] %s tagged your post" +msgstr "[$Projectname:Notify] %s отметил вашу публикацию" -#: ../../mod/post.php:257 ../../mod/openid.php:72 ../../mod/openid.php:178 +#: ../../Zotlabs/Lib/Enotify.php:383 #, php-format -msgid "Welcome %s. Remote authentication successful." -msgstr "Добро пожаловать %s. Удаленная аутентификация успешно завершена." +msgid "%1$s tagged your post at %2$s" +msgstr "%1$s отметил вашу публикацию на %2$s" -#: ../../mod/attach.php:9 -msgid "Item not available." -msgstr "Элемент недоступен." +#: ../../Zotlabs/Lib/Enotify.php:384 +#, php-format +msgid "%1$s tagged [zrl=%2$s]your post[/zrl]" +msgstr "%1$s отметил [zrl=%2$s]вашу публикацию[/zrl]" + +#: ../../Zotlabs/Lib/Enotify.php:395 +msgid "[$Projectname:Notify] Introduction received" +msgstr "[$Projectname:Notify] Получено приглашение" -#: ../../mod/probe.php:23 ../../mod/probe.php:29 +#: ../../Zotlabs/Lib/Enotify.php:396 #, php-format -msgid "Fetching URL returns error: %1$s" -msgstr "" +msgid "You've received an new connection request from '%1$s' at %2$s" +msgstr "Вы получили новый запрос контакта от '%1$s' в %2$s" -#: ../../mod/block.php:27 ../../mod/page.php:35 -msgid "Invalid item." -msgstr "Недействительный элемент." +#: ../../Zotlabs/Lib/Enotify.php:397 +#, php-format +msgid "You've received [zrl=%1$s]a new connection request[/zrl] from %2$s." +msgstr "Вы получили [zrl=%1$s]новый запрос контакта[/zrl] от %2$s." -#: ../../mod/block.php:39 ../../mod/chanview.php:77 ../../mod/page.php:47 -#: ../../mod/home.php:54 ../../mod/wall_upload.php:28 -msgid "Channel not found." -msgstr "Канал не найден." +#: ../../Zotlabs/Lib/Enotify.php:400 ../../Zotlabs/Lib/Enotify.php:418 +#, php-format +msgid "You may visit their profile at %s" +msgstr "Вы можете увидеть его профиль по ссылке %s" -#: ../../mod/block.php:75 ../../mod/page.php:83 ../../mod/display.php:100 -#: ../../mod/help.php:72 ../../index.php:236 -msgid "Page not found." -msgstr "Страница не найдена." +#: ../../Zotlabs/Lib/Enotify.php:402 +#, php-format +msgid "Please visit %s to approve or reject the connection request." +msgstr "Пожалуйста, посетите %s, чтобы одобрить или отклонить запрос контакта." -#: ../../mod/profile_photo.php:108 -msgid "Image uploaded but image cropping failed." -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:409 +msgid "[$Projectname:Notify] Friend suggestion received" +msgstr "[$Projectname:Notify] Получено предложение дружить" -#: ../../mod/profile_photo.php:161 -msgid "Image resize failed." -msgstr "Изменение размера изображения не удалось." +#: ../../Zotlabs/Lib/Enotify.php:410 +#, php-format +msgid "You've received a friend suggestion from '%1$s' at %2$s" +msgstr "Вы получили предложение дружить от '%1$s' в %2$s" -#: ../../mod/profile_photo.php:205 -msgid "" -"Shift-reload the page or clear browser cache if the new photo does not " -"display immediately." -msgstr "" +#: ../../Zotlabs/Lib/Enotify.php:411 +#, php-format +msgid "You've received [zrl=%1$s]a friend suggestion[/zrl] for %2$s from %3$s." +msgstr "Вы получили [zrl=%1$s]предложение дружить[/zrl] для %2$s от %3$s." -#: ../../mod/profile_photo.php:232 +#: ../../Zotlabs/Lib/Enotify.php:416 +msgid "Name:" +msgstr "Имя:" + +#: ../../Zotlabs/Lib/Enotify.php:417 +msgid "Photo:" +msgstr "Фото:" + +#: ../../Zotlabs/Lib/Enotify.php:420 #, php-format -msgid "Image exceeds size limit of %d" -msgstr "" +msgid "Please visit %s to approve or reject the suggestion." +msgstr "Пожалуйста, посетите %s, чтобы одобрить или отклонить предложение." -#: ../../mod/profile_photo.php:241 -msgid "Unable to process image." -msgstr "Невозможно обработать изображение." +#: ../../Zotlabs/Lib/Enotify.php:640 +msgid "[$Projectname:Notify]" +msgstr "[$Projectname:Уведомление]" -#: ../../mod/profile_photo.php:290 ../../mod/profile_photo.php:339 -msgid "Photo not available." -msgstr "Фотография не доступна." +#: ../../Zotlabs/Lib/Enotify.php:808 +msgid "created a new post" +msgstr "создал новую публикацию" -#: ../../mod/profile_photo.php:358 -msgid "Upload File:" -msgstr "Загрузить файл:" +#: ../../Zotlabs/Lib/Enotify.php:809 +#, php-format +msgid "commented on %s's post" +msgstr "прокомментировал публикацию %s" -#: ../../mod/profile_photo.php:359 -msgid "Select a profile:" -msgstr "Выберите профиль:" +#: ../../Zotlabs/Lib/Enotify.php:816 +#, php-format +msgid "edited a post dated %s" +msgstr "отредактировал публикацию датированную %s" -#: ../../mod/profile_photo.php:360 -msgid "Upload Profile Photo" -msgstr "Загрузить фотографию профиля" +#: ../../Zotlabs/Lib/Enotify.php:820 +#, php-format +msgid "edited a comment dated %s" +msgstr "отредактировал комментарий датированный %s" -#: ../../mod/profile_photo.php:365 -msgid "skip this step" -msgstr "пропустить этот шаг" +#: ../../Zotlabs/Lib/NativeWikiPage.php:42 +#: ../../Zotlabs/Lib/NativeWikiPage.php:93 +msgid "(No Title)" +msgstr "(нет заголовка)" -#: ../../mod/profile_photo.php:365 -msgid "select a photo from your photo albums" -msgstr "" +#: ../../Zotlabs/Lib/NativeWikiPage.php:107 +msgid "Wiki page create failed." +msgstr "Не удалось создать страницу Wiki." -#: ../../mod/profile_photo.php:379 -msgid "Crop Image" -msgstr "Обрезать изображение" +#: ../../Zotlabs/Lib/NativeWikiPage.php:120 +msgid "Wiki not found." +msgstr "Wiki не найдена." -#: ../../mod/profile_photo.php:380 -msgid "Please adjust the image cropping for optimum viewing." -msgstr "" +#: ../../Zotlabs/Lib/NativeWikiPage.php:131 +msgid "Destination name already exists" +msgstr "Имя назначения уже существует" -#: ../../mod/profile_photo.php:382 -msgid "Done Editing" -msgstr "Закончить редактирование" +#: ../../Zotlabs/Lib/NativeWikiPage.php:163 +#: ../../Zotlabs/Lib/NativeWikiPage.php:359 +msgid "Page not found" +msgstr "Страница не найдена." -#: ../../mod/profile_photo.php:425 -msgid "Image uploaded successfully." -msgstr "Загрузка изображениея прошла успешно." +#: ../../Zotlabs/Lib/NativeWikiPage.php:194 +msgid "Error reading page content" +msgstr "Ошибка чтения содержимого страницы" + +#: ../../Zotlabs/Lib/NativeWikiPage.php:350 +#: ../../Zotlabs/Lib/NativeWikiPage.php:400 +#: ../../Zotlabs/Lib/NativeWikiPage.php:467 +#: ../../Zotlabs/Lib/NativeWikiPage.php:508 +msgid "Error reading wiki" +msgstr "Ошибка чтения Wiki" + +#: ../../Zotlabs/Lib/NativeWikiPage.php:388 +msgid "Page update failed." +msgstr "Не удалось обновить страницу." + +#: ../../Zotlabs/Lib/NativeWikiPage.php:422 +msgid "Nothing deleted" +msgstr "Ничего не удалено" + +#: ../../Zotlabs/Lib/NativeWikiPage.php:488 +msgid "Compare: object not found." +msgstr "Сравнение: объект не найден." + +#: ../../Zotlabs/Lib/NativeWikiPage.php:494 +msgid "Page updated" +msgstr "Страница обновлена" + +#: ../../Zotlabs/Lib/NativeWikiPage.php:497 +msgid "Untitled" +msgstr "Не озаглавлено" + +#: ../../Zotlabs/Lib/NativeWikiPage.php:503 +msgid "Wiki resource_id required for git commit" +msgstr "Требуется resource_id Wiki для отправки в Git" + +#: ../../Zotlabs/Lib/NativeWikiPage.php:559 +#: ../../Zotlabs/Widget/Wiki_page_history.php:23 +msgctxt "wiki_history" +msgid "Message" +msgstr "Сообщение" + +#: ../../Zotlabs/Lib/Permcat.php:82 +msgctxt "permcat" +msgid "default" +msgstr "по умолчанию" -#: ../../mod/profile_photo.php:427 -msgid "Image upload failed." -msgstr "Загрузка изображениея прошла безуспешно." +#: ../../Zotlabs/Lib/Permcat.php:133 +msgctxt "permcat" +msgid "follower" +msgstr "поклонник" + +#: ../../Zotlabs/Lib/Permcat.php:137 +msgctxt "permcat" +msgid "contributor" +msgstr "участник" -#: ../../mod/profile_photo.php:436 +#: ../../Zotlabs/Lib/Permcat.php:141 +msgctxt "permcat" +msgid "publisher" +msgstr "издатель" + +#: ../../Zotlabs/Lib/DB_Upgrade.php:83 #, php-format -msgid "Image size reduction [%s] failed." -msgstr "" +msgid "Update Error at %s" +msgstr "Ошибка обновления на %s" -#: ../../mod/blocks.php:66 -msgid "Block Name" -msgstr "Название блока" +#: ../../Zotlabs/Lib/DB_Upgrade.php:89 +#, php-format +msgid "Update %s failed. See error logs." +msgstr "Выполнение %s неудачно. Проверьте системный журнал." -#: ../../mod/profiles.php:18 ../../mod/profiles.php:138 -#: ../../mod/profiles.php:168 ../../mod/profiles.php:472 -msgid "Profile not found." -msgstr "Профиль не найден." +#: ../../Zotlabs/Lib/Chatroom.php:23 +msgid "Missing room name" +msgstr "Отсутствует название комнаты" -#: ../../mod/profiles.php:38 -msgid "Profile deleted." -msgstr "Профиль удален." +#: ../../Zotlabs/Lib/Chatroom.php:32 +msgid "Duplicate room name" +msgstr "Название комнаты дублируется" -#: ../../mod/profiles.php:56 ../../mod/profiles.php:92 -msgid "Profile-" -msgstr "Профиль-" +#: ../../Zotlabs/Lib/Chatroom.php:82 ../../Zotlabs/Lib/Chatroom.php:90 +msgid "Invalid room specifier." +msgstr "Неверный указатель комнаты." -#: ../../mod/profiles.php:77 ../../mod/profiles.php:120 -msgid "New profile created." -msgstr "Новый профиль создан." +#: ../../Zotlabs/Lib/Chatroom.php:122 +msgid "Room not found." +msgstr "Комната не найдена." -#: ../../mod/profiles.php:98 -msgid "Profile unavailable to clone." -msgstr "Профиль недоступен для клонирования." +#: ../../Zotlabs/Lib/Chatroom.php:143 +msgid "Room is full" +msgstr "Комната переполнена" -#: ../../mod/profiles.php:178 -msgid "Profile Name is required." -msgstr "Имя профиля требуется." +#: ../../Zotlabs/Widget/Activity_order.php:86 +msgid "Commented Date" +msgstr "По комментариям" -#: ../../mod/profiles.php:294 -msgid "Marital Status" -msgstr "Семейное положение" +#: ../../Zotlabs/Widget/Activity_order.php:90 +msgid "Order by last commented date" +msgstr "Сортировка по дате последнего комментария" -#: ../../mod/profiles.php:298 -msgid "Romantic Partner" -msgstr "Романтический партнер" +#: ../../Zotlabs/Widget/Activity_order.php:93 +msgid "Posted Date" +msgstr "По публикациям" -#: ../../mod/profiles.php:302 -msgid "Likes" -msgstr "нравится" +#: ../../Zotlabs/Widget/Activity_order.php:97 +msgid "Order by last posted date" +msgstr "Сортировка по дате последней публикации" -#: ../../mod/profiles.php:306 -msgid "Dislikes" -msgstr "не-нравится" +#: ../../Zotlabs/Widget/Activity_order.php:100 +msgid "Date Unthreaded" +msgstr "По порядку" -#: ../../mod/profiles.php:310 -msgid "Work/Employment" -msgstr "Работа / Занятость" +#: ../../Zotlabs/Widget/Activity_order.php:104 +msgid "Order unthreaded by date" +msgstr "Сортировка в порядке поступления" -#: ../../mod/profiles.php:313 -msgid "Religion" -msgstr "Религия" +#: ../../Zotlabs/Widget/Activity_order.php:119 +msgid "Activity Order" +msgstr "Сортировка активности" -#: ../../mod/profiles.php:317 -msgid "Political Views" -msgstr "Политические взгляды" +#: ../../Zotlabs/Widget/Admin.php:22 ../../Zotlabs/Module/Admin/Site.php:308 +msgid "Site" +msgstr "Сайт" -#: ../../mod/profiles.php:321 -msgid "Gender" -msgstr "Пол" +#: ../../Zotlabs/Widget/Admin.php:23 ../../Zotlabs/Module/Admin.php:96 +#: ../../Zotlabs/Module/Admin/Accounts.php:167 +#: ../../Zotlabs/Module/Admin/Accounts.php:180 +msgid "Accounts" +msgstr "Учётные записи" -#: ../../mod/profiles.php:325 -msgid "Sexual Preference" -msgstr "Сексуальная ориентация" +#: ../../Zotlabs/Widget/Admin.php:23 ../../Zotlabs/Widget/Admin.php:60 +msgid "Member registrations waiting for confirmation" +msgstr "Регистрации участников, ожидающие подверждения" -#: ../../mod/profiles.php:329 -msgid "Homepage" -msgstr "Домашняя страница" +#: ../../Zotlabs/Widget/Admin.php:24 ../../Zotlabs/Module/Admin.php:114 +#: ../../Zotlabs/Module/Admin/Channels.php:146 +msgid "Channels" +msgstr "Каналы" -#: ../../mod/profiles.php:333 -msgid "Interests" -msgstr "Интересы" +#: ../../Zotlabs/Widget/Admin.php:25 ../../Zotlabs/Module/Admin/Security.php:93 +msgid "Security" +msgstr "Безопасность" -#: ../../mod/profiles.php:337 ../../mod/admin.php:893 -msgid "Address" -msgstr "Адрес" +#: ../../Zotlabs/Widget/Admin.php:27 ../../Zotlabs/Module/Admin/Addons.php:342 +#: ../../Zotlabs/Module/Admin/Addons.php:437 +msgid "Addons" +msgstr "Расширения" -#: ../../mod/profiles.php:344 ../../mod/pubsites.php:25 -msgid "Location" -msgstr "Место" +#: ../../Zotlabs/Widget/Admin.php:28 ../../Zotlabs/Module/Admin/Themes.php:123 +#: ../../Zotlabs/Module/Admin/Themes.php:157 +msgid "Themes" +msgstr "Темы" -#: ../../mod/profiles.php:427 -msgid "Profile updated." -msgstr "Профиль обновлен." +#: ../../Zotlabs/Widget/Admin.php:29 +msgid "Inspect queue" +msgstr "Просмотр очереди" -#: ../../mod/profiles.php:491 -msgid "Hide your contact/friend list from viewers of this profile?" -msgstr "Скрывать от просмотра ваш список контактов/друзей в этом профиле?" +#: ../../Zotlabs/Widget/Admin.php:30 ../../Zotlabs/Module/Admin/Profs.php:168 +msgid "Profile Fields" +msgstr "Поля профиля" -#: ../../mod/profiles.php:514 -msgid "Edit Profile Details" -msgstr "Редактирование профиля" +#: ../../Zotlabs/Widget/Admin.php:31 +msgid "DB updates" +msgstr "Обновление базы данных" -#: ../../mod/profiles.php:516 -msgid "View this profile" -msgstr "Посмотреть этот профиль" +#: ../../Zotlabs/Widget/Admin.php:48 ../../Zotlabs/Widget/Admin.php:58 +#: ../../Zotlabs/Module/Admin/Logs.php:83 +msgid "Logs" +msgstr "Журналы" -#: ../../mod/profiles.php:517 -msgid "Change Profile Photo" -msgstr "Изменить фотографию профиля" +#: ../../Zotlabs/Widget/Admin.php:56 +msgid "Addon Features" +msgstr "Настройки расширений" -#: ../../mod/profiles.php:518 -msgid "Create a new profile using these settings" -msgstr "Создайте новый профиль со следующими настройками" +#: ../../Zotlabs/Widget/Tasklist.php:23 +msgid "Tasks" +msgstr "Задачи" -#: ../../mod/profiles.php:519 -msgid "Clone this profile" -msgstr "Клонировать этот профиль" +#: ../../Zotlabs/Widget/Suggestions.php:46 ../../Zotlabs/Module/Suggest.php:58 +msgid "Ignore/Hide" +msgstr "Игнорировать / cкрыть" -#: ../../mod/profiles.php:520 -msgid "Delete this profile" -msgstr "Удалить этот профиль" +#: ../../Zotlabs/Widget/Suggestions.php:51 +msgid "Suggestions" +msgstr "Рекомендации" -#: ../../mod/profiles.php:521 -msgid "Profile Name:" -msgstr "Имя профиля:" +#: ../../Zotlabs/Widget/Suggestions.php:52 +msgid "See more..." +msgstr "Просмотреть больше..." -#: ../../mod/profiles.php:522 -msgid "Your Full Name:" -msgstr "Ваше полное имя:" +#: ../../Zotlabs/Widget/Conversations.php:17 +msgid "Received Messages" +msgstr "Полученные сообщения" -#: ../../mod/profiles.php:523 -msgid "Title/Description:" -msgstr "Название / Описание:" +#: ../../Zotlabs/Widget/Conversations.php:21 +msgid "Sent Messages" +msgstr "Отправленные сообщения" -#: ../../mod/profiles.php:524 -msgid "Your Gender:" -msgstr "Ваш пол:" +#: ../../Zotlabs/Widget/Conversations.php:25 +msgid "Conversations" +msgstr "Беседы" -#: ../../mod/profiles.php:525 -#, php-format -msgid "Birthday (%s):" -msgstr "Ваш День Рождения (%s):" +#: ../../Zotlabs/Widget/Conversations.php:37 +msgid "No messages." +msgstr "Сообщений нет." -#: ../../mod/profiles.php:526 -msgid "Street Address:" -msgstr "Улица:" +#: ../../Zotlabs/Widget/Conversations.php:57 +msgid "Delete conversation" +msgstr "Удалить беседу" + +#: ../../Zotlabs/Widget/Cdav.php:37 +msgid "Select Channel" +msgstr "Выбрать канал" + +#: ../../Zotlabs/Widget/Cdav.php:42 +msgid "Read-write" +msgstr "Чтение-запись" + +#: ../../Zotlabs/Widget/Cdav.php:43 +msgid "Read-only" +msgstr "Только чтение" + +#: ../../Zotlabs/Widget/Cdav.php:117 +msgid "My Calendars" +msgstr "Мои календари" + +#: ../../Zotlabs/Widget/Cdav.php:119 +msgid "Shared Calendars" +msgstr "Общие календари" + +#: ../../Zotlabs/Widget/Cdav.php:123 +msgid "Share this calendar" +msgstr "Поделиться этим календарём" + +#: ../../Zotlabs/Widget/Cdav.php:125 +msgid "Calendar name and color" +msgstr "Имя и цвет календаря" + +#: ../../Zotlabs/Widget/Cdav.php:127 +msgid "Create new calendar" +msgstr "Создать новый календарь" + +#: ../../Zotlabs/Widget/Cdav.php:128 ../../Zotlabs/Widget/Cdav.php:165 +#: ../../Zotlabs/Module/Cdav.php:1185 ../../Zotlabs/Module/Layouts.php:185 +#: ../../Zotlabs/Module/Connedit.php:921 ../../Zotlabs/Module/Webpages.php:239 +#: ../../Zotlabs/Module/Articles.php:96 ../../Zotlabs/Module/Blocks.php:159 +#: ../../Zotlabs/Module/Menu.php:181 ../../Zotlabs/Module/New_channel.php:188 +#: ../../Zotlabs/Module/Cards.php:100 ../../Zotlabs/Module/Profiles.php:798 +#: ../../Zotlabs/Storage/Browser.php:276 ../../Zotlabs/Storage/Browser.php:390 +msgid "Create" +msgstr "Создать" -#: ../../mod/profiles.php:527 -msgid "Locality/City:" -msgstr "Населенный пункт / город:" +#: ../../Zotlabs/Widget/Cdav.php:129 +msgid "Calendar Name" +msgstr "Имя календаря" + +#: ../../Zotlabs/Widget/Cdav.php:130 +msgid "Calendar Tools" +msgstr "Инструменты календаря" + +#: ../../Zotlabs/Widget/Cdav.php:131 +msgid "Import calendar" +msgstr "Импортировать календарь" + +#: ../../Zotlabs/Widget/Cdav.php:132 +msgid "Select a calendar to import to" +msgstr "Выбрать календарь для импорта в" + +#: ../../Zotlabs/Widget/Cdav.php:133 ../../Zotlabs/Widget/Cdav.php:169 +#: ../../Zotlabs/Widget/Album.php:97 ../../Zotlabs/Widget/Portfolio.php:110 +#: ../../Zotlabs/Module/Photos.php:717 +#: ../../Zotlabs/Module/Profile_photo.php:459 +#: ../../Zotlabs/Module/Cover_photo.php:395 +#: ../../Zotlabs/Module/Embedphotos.php:158 +#: ../../Zotlabs/Storage/Browser.php:392 +msgid "Upload" +msgstr "Загрузка" -#: ../../mod/profiles.php:528 -msgid "Postal/Zip Code:" -msgstr "Почтовый индекс:" +#: ../../Zotlabs/Widget/Cdav.php:159 +msgid "Addressbooks" +msgstr "Адресные книги" -#: ../../mod/profiles.php:529 -msgid "Country:" -msgstr "Страна:" +#: ../../Zotlabs/Widget/Cdav.php:161 +msgid "Addressbook name" +msgstr "Имя адресной книги" -#: ../../mod/profiles.php:530 -msgid "Region/State:" -msgstr "Регион / Область:" +#: ../../Zotlabs/Widget/Cdav.php:163 +msgid "Create new addressbook" +msgstr "Создать новую адресную книгу" -#: ../../mod/profiles.php:531 -msgid "<span class=\"heart\">♥</span> Marital Status:" -msgstr "" +#: ../../Zotlabs/Widget/Cdav.php:164 +msgid "Addressbook Name" +msgstr "Имя адресной книги" -#: ../../mod/profiles.php:532 -msgid "Who: (if applicable)" -msgstr "Кто: (если это применимо)" +#: ../../Zotlabs/Widget/Cdav.php:166 +msgid "Addressbook Tools" +msgstr "Инструменты адресной книги" -#: ../../mod/profiles.php:533 -msgid "Examples: cathy123, Cathy Williams, cathy@example.com" -msgstr "Примеры: cathy123, Cathy Williams, cathy@example.com" +#: ../../Zotlabs/Widget/Cdav.php:167 +msgid "Import addressbook" +msgstr "Импортировать адресную книгу" -#: ../../mod/profiles.php:534 -msgid "Since [date]:" -msgstr "С тех пор [date]:" +#: ../../Zotlabs/Widget/Cdav.php:168 +msgid "Select an addressbook to import to" +msgstr "Выбрать адресную книгу для импорта в" -#: ../../mod/profiles.php:536 -msgid "Homepage URL:" -msgstr "URL-адрес домашней страницы:" +#: ../../Zotlabs/Widget/Activity.php:50 +msgctxt "widget" +msgid "Activity" +msgstr "Активность" -#: ../../mod/profiles.php:539 -msgid "Religious Views:" -msgstr "Религиозные взгляды:" +#: ../../Zotlabs/Widget/Hq_controls.php:14 +msgid "HQ Control Panel" +msgstr "Панель управления HQ" -#: ../../mod/profiles.php:540 -msgid "Keywords:" -msgstr "Ключевые слова:" +#: ../../Zotlabs/Widget/Hq_controls.php:17 +msgid "Create a new post" +msgstr "Создать новую публикацию" -#: ../../mod/profiles.php:543 -msgid "Example: fishing photography software" -msgstr "Пример: fishing photography software" +#: ../../Zotlabs/Widget/Wiki_pages.php:32 +#: ../../Zotlabs/Widget/Wiki_pages.php:89 +msgid "Add new page" +msgstr "Добавить новую страницу" -#: ../../mod/profiles.php:544 -msgid "Used in directory listings" -msgstr "" +#: ../../Zotlabs/Widget/Wiki_pages.php:39 +#: ../../Zotlabs/Widget/Wiki_pages.php:96 ../../Zotlabs/Module/Dreport.php:151 +msgid "Options" +msgstr "Параметры" -#: ../../mod/profiles.php:545 -msgid "Tell us about yourself..." -msgstr "Расскажите нам о себе ..." +#: ../../Zotlabs/Widget/Wiki_pages.php:83 +msgid "Wiki Pages" +msgstr "Wiki страницы" -#: ../../mod/profiles.php:546 -msgid "Hobbies/Interests" -msgstr "Хобби / интересы" +#: ../../Zotlabs/Widget/Wiki_pages.php:94 +msgid "Page name" +msgstr "Название страницы" -#: ../../mod/profiles.php:547 -msgid "Contact information and Social Networks" -msgstr "Информация и социальные сети контакта" +#: ../../Zotlabs/Widget/Mailmenu.php:13 +msgid "Private Mail Menu" +msgstr "Меню личной переписки" -#: ../../mod/profiles.php:548 -msgid "My other channels" -msgstr "Мои другие контакты" +#: ../../Zotlabs/Widget/Mailmenu.php:15 +msgid "Combined View" +msgstr "Комбинированный вид" -#: ../../mod/profiles.php:549 -msgid "Musical interests" -msgstr "Музыкальные интересы" +#: ../../Zotlabs/Widget/Mailmenu.php:20 +msgid "Inbox" +msgstr "Входящие" -#: ../../mod/profiles.php:550 -msgid "Books, literature" -msgstr "Книги, литература" +#: ../../Zotlabs/Widget/Mailmenu.php:25 +msgid "Outbox" +msgstr "Исходящие" -#: ../../mod/profiles.php:551 -msgid "Television" -msgstr "Телевидение" +#: ../../Zotlabs/Widget/Mailmenu.php:30 +msgid "New Message" +msgstr "Новое сообщение" -#: ../../mod/profiles.php:552 -msgid "Film/dance/culture/entertainment" -msgstr "Кино / танцы / культура / развлечения" +#: ../../Zotlabs/Widget/Photo_rand.php:58 ../../Zotlabs/Widget/Photo.php:48 +msgid "photo/image" +msgstr "фотография / изображение" -#: ../../mod/profiles.php:553 -msgid "Love/romance" -msgstr "Любовь / Романс" +#: ../../Zotlabs/Widget/Archive.php:43 +msgid "Archives" +msgstr "Архивы" -#: ../../mod/profiles.php:554 -msgid "Work/employment" -msgstr "Работа / Занятость" +#: ../../Zotlabs/Widget/Eventstools.php:13 +msgid "Events Tools" +msgstr "Инструменты для событий" -#: ../../mod/profiles.php:555 -msgid "School/education" -msgstr "Школа / образование" +#: ../../Zotlabs/Widget/Eventstools.php:14 +msgid "Export Calendar" +msgstr "Экспортировать календарь" -#: ../../mod/profiles.php:560 -msgid "" -"This is your <strong>public</strong> profile.<br />It <strong>may</strong> " -"be visible to anybody using the internet." -msgstr "" +#: ../../Zotlabs/Widget/Eventstools.php:15 +msgid "Import Calendar" +msgstr "Импортировать календарь" -#: ../../mod/profiles.php:570 ../../mod/directory.php:143 -#: ../../mod/dirprofile.php:92 -msgid "Age: " -msgstr "Возраст:" +#: ../../Zotlabs/Widget/Wiki_list.php:15 +msgid "Wiki List" +msgstr "Список Wiki" -#: ../../mod/profiles.php:609 -msgid "Edit/Manage Profiles" -msgstr "Редактирование / Управление профилей" +#: ../../Zotlabs/Widget/Settings_menu.php:35 +msgid "Account settings" +msgstr "Настройки аккаунта" -#: ../../mod/profiles.php:610 -msgid "Add profile things" -msgstr "" +#: ../../Zotlabs/Widget/Settings_menu.php:41 +msgid "Channel settings" +msgstr "Выбор канала" -#: ../../mod/profiles.php:611 -msgid "Include desirable objects in your profile" -msgstr "" +#: ../../Zotlabs/Widget/Settings_menu.php:50 +msgid "Additional features" +msgstr "Дополнительные функции" -#: ../../mod/bookmarks.php:38 -msgid "Bookmark added" -msgstr "Закладка добавлена" +#: ../../Zotlabs/Widget/Settings_menu.php:57 +msgid "Addon settings" +msgstr "Настройки расширений" -#: ../../mod/bookmarks.php:58 -msgid "My Bookmarks" -msgstr "Мои закладки" +#: ../../Zotlabs/Widget/Settings_menu.php:63 +msgid "Display settings" +msgstr "Настройки отображения" -#: ../../mod/bookmarks.php:69 -msgid "My Connections Bookmarks" -msgstr "Закладки моих контактов" +#: ../../Zotlabs/Widget/Settings_menu.php:70 +msgid "Manage locations" +msgstr "Управление местоположением" -#: ../../mod/profperm.php:29 ../../mod/profperm.php:58 -msgid "Invalid profile identifier." -msgstr "" +#: ../../Zotlabs/Widget/Settings_menu.php:77 +msgid "Export channel" +msgstr "Экспортировать канал" -#: ../../mod/profperm.php:110 -msgid "Profile Visibility Editor" -msgstr "Редактор видимости профиля" +#: ../../Zotlabs/Widget/Settings_menu.php:84 +msgid "OAuth1 apps" +msgstr "Приложения OAuth1" -#: ../../mod/profperm.php:114 -msgid "Click on a contact to add or remove." -msgstr "Нажмите на канал, чтобы добавить или удалить." +#: ../../Zotlabs/Widget/Settings_menu.php:92 +msgid "OAuth2 apps" +msgstr "Приложения OAuth2" -#: ../../mod/profperm.php:123 -msgid "Visible To" -msgstr "Видно" +#: ../../Zotlabs/Widget/Settings_menu.php:100 +#: ../../Zotlabs/Module/Settings/Tokens.php:150 +msgid "Guest Access Tokens" +msgstr "Токен гостевого доступа" -#: ../../mod/profperm.php:139 ../../mod/connections.php:279 -msgid "All Connections" -msgstr "Все контакты" +#: ../../Zotlabs/Widget/Settings_menu.php:117 +#: ../../Zotlabs/Module/Connedit.php:850 ../../Zotlabs/Module/Defperms.php:238 +msgid "Connection Default Permissions" +msgstr "Разрешения по умолчанию для контакта" -#: ../../mod/pubsites.php:16 -msgid "Public Sites" -msgstr "Публичные сайты" +#: ../../Zotlabs/Widget/Settings_menu.php:125 +msgid "Premium Channel Settings" +msgstr "Настройки премиум-канала" -#: ../../mod/pubsites.php:19 -msgid "" -"The listed sites allow public registration into the Hubzilla. All sites in" -" the matrix are interlinked so membership on any of them conveys membership " -"in the matrix as a whole. Some sites may require subscription or provide " -"tiered service plans. The provider links <strong>may</strong> provide " -"additional details." -msgstr "" +#: ../../Zotlabs/Widget/Album.php:78 ../../Zotlabs/Widget/Portfolio.php:87 +#: ../../Zotlabs/Module/Photos.php:816 ../../Zotlabs/Module/Photos.php:1355 +#: ../../Zotlabs/Module/Embedphotos.php:140 +msgid "View Photo" +msgstr "Посмотреть фотографию" -#: ../../mod/pubsites.php:25 -msgid "Site URL" -msgstr "URL веб-сайта" +#: ../../Zotlabs/Widget/Album.php:95 ../../Zotlabs/Widget/Portfolio.php:108 +#: ../../Zotlabs/Module/Photos.php:847 ../../Zotlabs/Module/Embedphotos.php:156 +msgid "Edit Album" +msgstr "Редактировать Фотоальбом" -#: ../../mod/pubsites.php:25 -msgid "Access Type" -msgstr "Тип доступа" +#: ../../Zotlabs/Widget/Pubsites.php:12 ../../Zotlabs/Module/Pubsites.php:24 +msgid "Public Hubs" +msgstr "Публичные хабы" -#: ../../mod/pubsites.php:25 -msgid "Registration Policy" -msgstr "Правила регистрации" +#: ../../Zotlabs/Widget/Notes.php:16 +msgid "Notes" +msgstr "Заметки" -#: ../../mod/channel.php:25 ../../mod/chat.php:19 -msgid "You must be logged in to see this page." -msgstr "Вы должны авторизоваться, чтобы увидеть эту страницу." +#: ../../Zotlabs/Widget/Chatroom_list.php:20 +msgid "Overview" +msgstr "Обзор" -#: ../../mod/channel.php:86 -msgid "Insufficient permissions. Request redirected to profile page." -msgstr "" +#: ../../Zotlabs/Widget/Appstore.php:11 +msgid "App Collections" +msgstr "Коллекции приложений" -#: ../../mod/rbmark.php:88 -msgid "Select a bookmark folder" -msgstr "" +#: ../../Zotlabs/Widget/Appstore.php:13 +msgid "Available Apps" +msgstr "Доступные приложения" -#: ../../mod/rbmark.php:93 -msgid "Save Bookmark" -msgstr "Сохранить закладки" +#: ../../Zotlabs/Widget/Appstore.php:14 +msgid "Installed apps" +msgstr "Установленные приложения" -#: ../../mod/rbmark.php:94 -msgid "URL of bookmark" -msgstr "" +#: ../../Zotlabs/Widget/Bookmarkedchats.php:24 +msgid "Bookmarked Chatrooms" +msgstr "Закладки чатов" -#: ../../mod/rbmark.php:95 ../../mod/appman.php:93 -msgid "Description" -msgstr "Описание" +#: ../../Zotlabs/Widget/Follow.php:22 +#, php-format +msgid "You have %1$.0f of %2$.0f allowed connections." +msgstr "У вас есть %1$.0f из %2$.0f разрешенных контактов." -#: ../../mod/rbmark.php:99 -msgid "Or enter new bookmark folder name" -msgstr "" +#: ../../Zotlabs/Widget/Follow.php:29 +msgid "Add New Connection" +msgstr "Добавить новый контакт" -#: ../../mod/chat.php:167 -msgid "Room not found" -msgstr "" +#: ../../Zotlabs/Widget/Follow.php:30 +msgid "Enter channel address" +msgstr "Введите адрес канала" -#: ../../mod/chat.php:178 -msgid "Leave Room" -msgstr "" +#: ../../Zotlabs/Widget/Follow.php:31 +msgid "Examples: bob@example.com, https://example.com/barbara" +msgstr "Пример: ivan@example.com, http://example.com/ivan" -#: ../../mod/chat.php:179 -msgid "Delete This Room" -msgstr "" +#: ../../Zotlabs/Widget/Chatroom_members.php:11 +msgid "Chat Members" +msgstr "Участники чата" -#: ../../mod/chat.php:180 -msgid "I am away right now" -msgstr "" +#: ../../Zotlabs/Widget/Suggestedchats.php:32 +msgid "Suggested Chatrooms" +msgstr "Рекомендуемые чаты" -#: ../../mod/chat.php:181 -msgid "I am online" -msgstr "Я в сети" +#: ../../Zotlabs/Widget/Rating.php:51 +msgid "Rating Tools" +msgstr "Инструменты оценки" -#: ../../mod/chat.php:183 -msgid "Bookmark this room" -msgstr "" +#: ../../Zotlabs/Widget/Rating.php:55 ../../Zotlabs/Widget/Rating.php:57 +msgid "Rate Me" +msgstr "Оценить меня" -#: ../../mod/chat.php:207 ../../mod/chat.php:229 -msgid "New Chatroom" -msgstr "Новый чат" +#: ../../Zotlabs/Widget/Rating.php:60 +msgid "View Ratings" +msgstr "Просмотр оценок" -#: ../../mod/chat.php:208 -msgid "Chatroom Name" -msgstr "Название чата" +#: ../../Zotlabs/Widget/Savedsearch.php:75 +msgid "Remove term" +msgstr "Удалить термин" + +#: ../../Zotlabs/Widget/Affinity.php:22 ../../Zotlabs/Module/Connedit.php:709 +msgid "Me" +msgstr "Я" -#: ../../mod/chat.php:225 +#: ../../Zotlabs/Widget/Affinity.php:23 ../../Zotlabs/Module/Connedit.php:710 +msgid "Family" +msgstr "Семья" + +#: ../../Zotlabs/Widget/Affinity.php:25 ../../Zotlabs/Module/Connedit.php:712 +msgid "Acquaintances" +msgstr "Знакомые" + +#: ../../Zotlabs/Widget/Affinity.php:26 ../../Zotlabs/Module/Connections.php:94 +#: ../../Zotlabs/Module/Connections.php:108 +#: ../../Zotlabs/Module/Connedit.php:713 +msgid "All" +msgstr "Все" + +#: ../../Zotlabs/Widget/Affinity.php:45 +msgid "Refresh" +msgstr "Обновить" + +#: ../../Zotlabs/Widget/Activity_filter.php:24 +msgid "Personal Posts" +msgstr "Личные публикации" + +#: ../../Zotlabs/Widget/Activity_filter.php:28 +msgid "Show posts that mention or involve me" +msgstr "Показывать публикации где вы были упомянуты или привлечены" + +#: ../../Zotlabs/Widget/Activity_filter.php:39 +msgid "Starred Posts" +msgstr "Отмеченные публикации" + +#: ../../Zotlabs/Widget/Activity_filter.php:43 +msgid "Show posts that I have starred" +msgstr "Показывать публикации которые я отметил" + +#: ../../Zotlabs/Widget/Activity_filter.php:63 #, php-format -msgid "%1$s's Chatrooms" -msgstr "Чаты пользователя %1$s" +msgid "Show posts related to the %s privacy group" +msgstr "Показывать публикации относящиеся к группе безопасности %s" -#: ../../mod/register.php:43 -msgid "Maximum daily site registrations exceeded. Please try again tomorrow." -msgstr "" +#: ../../Zotlabs/Widget/Activity_filter.php:72 +msgid "Show my privacy groups" +msgstr "Показывать мои группы безопасности" + +#: ../../Zotlabs/Widget/Activity_filter.php:93 +msgid "Show posts to this forum" +msgstr "Показывать публикации этого форума" + +#: ../../Zotlabs/Widget/Activity_filter.php:100 +#: ../../Zotlabs/Widget/Notifications.php:119 +#: ../../Zotlabs/Widget/Notifications.php:120 +#: ../../Zotlabs/Widget/Forums.php:100 +msgid "Forums" +msgstr "Форумы" + +#: ../../Zotlabs/Widget/Activity_filter.php:104 +msgid "Show forums" +msgstr "Показывать форумы" + +#: ../../Zotlabs/Widget/Activity_filter.php:128 +#, php-format +msgid "Show posts that I have filed to %s" +msgstr "Показывать публикации которые я добавил в %s" + +#: ../../Zotlabs/Widget/Activity_filter.php:138 +msgid "Show filed post categories" +msgstr "Показывать категории добавленных публикаций" + +#: ../../Zotlabs/Widget/Activity_filter.php:152 +msgid "Panel search" +msgstr "Панель поиска" + +#: ../../Zotlabs/Widget/Activity_filter.php:162 +#: ../../Zotlabs/Widget/Notifications.php:27 +#: ../../Zotlabs/Widget/Notifications.php:46 +#: ../../Zotlabs/Widget/Notifications.php:122 +#: ../../Zotlabs/Widget/Notifications.php:153 +msgid "Filter by name" +msgstr "Отфильтровать по имени" + +#: ../../Zotlabs/Widget/Activity_filter.php:177 +msgid "Remove active filter" +msgstr "Удалить активный фильтр" + +#: ../../Zotlabs/Widget/Activity_filter.php:193 +msgid "Activity Filters" +msgstr "Фильтры активности" + +#: ../../Zotlabs/Widget/Cover_photo.php:54 +msgid "Click to show more" +msgstr "Нажмите чтобы показать больше" + +#: ../../Zotlabs/Widget/Notifications.php:16 +msgid "New Network Activity" +msgstr "Новая сетевая активность" + +#: ../../Zotlabs/Widget/Notifications.php:17 +msgid "New Network Activity Notifications" +msgstr "Новые уведомления о сетевой активности" + +#: ../../Zotlabs/Widget/Notifications.php:20 +msgid "View your network activity" +msgstr "Просмотреть вашу сетевую активность" + +#: ../../Zotlabs/Widget/Notifications.php:23 +msgid "Mark all notifications read" +msgstr "Пометить уведомления как прочитанные" + +#: ../../Zotlabs/Widget/Notifications.php:26 +#: ../../Zotlabs/Widget/Notifications.php:45 +#: ../../Zotlabs/Widget/Notifications.php:152 +msgid "Show new posts only" +msgstr "Показывать только новые публикации" + +#: ../../Zotlabs/Widget/Notifications.php:35 +msgid "New Home Activity" +msgstr "Новая локальная активность" + +#: ../../Zotlabs/Widget/Notifications.php:36 +msgid "New Home Activity Notifications" +msgstr "Новые уведомления локальной активности" + +#: ../../Zotlabs/Widget/Notifications.php:39 +msgid "View your home activity" +msgstr "Просмотреть локальную активность" + +#: ../../Zotlabs/Widget/Notifications.php:42 +#: ../../Zotlabs/Widget/Notifications.php:149 +msgid "Mark all notifications seen" +msgstr "Пометить уведомления как просмотренные" + +#: ../../Zotlabs/Widget/Notifications.php:54 +msgid "New Mails" +msgstr "Новая переписка" + +#: ../../Zotlabs/Widget/Notifications.php:55 +msgid "New Mails Notifications" +msgstr "Уведомления о новой переписке" + +#: ../../Zotlabs/Widget/Notifications.php:58 +msgid "View your private mails" +msgstr "Просмотреть вашу личную переписку" + +#: ../../Zotlabs/Widget/Notifications.php:61 +msgid "Mark all messages seen" +msgstr "Пометить сообщения как просмотренные" + +#: ../../Zotlabs/Widget/Notifications.php:69 +msgid "New Events" +msgstr "Новые события" + +#: ../../Zotlabs/Widget/Notifications.php:70 +msgid "New Events Notifications" +msgstr "Уведомления о новых событиях" + +#: ../../Zotlabs/Widget/Notifications.php:73 +msgid "View events" +msgstr "Просмотреть события" + +#: ../../Zotlabs/Widget/Notifications.php:76 +msgid "Mark all events seen" +msgstr "Пометить все события как просмотренные" -#: ../../mod/register.php:49 +#: ../../Zotlabs/Widget/Notifications.php:84 +#: ../../Zotlabs/Module/Connections.php:147 +msgid "New Connections" +msgstr "Новые контакты" + +#: ../../Zotlabs/Widget/Notifications.php:85 +msgid "New Connections Notifications" +msgstr "Уведомления о новых контактах" + +#: ../../Zotlabs/Widget/Notifications.php:88 +msgid "View all connections" +msgstr "Просмотр всех контактов" + +#: ../../Zotlabs/Widget/Notifications.php:96 +msgid "New Files" +msgstr "Новые файлы" + +#: ../../Zotlabs/Widget/Notifications.php:97 +msgid "New Files Notifications" +msgstr "Уведомления о новых файлах" + +#: ../../Zotlabs/Widget/Notifications.php:104 +#: ../../Zotlabs/Widget/Notifications.php:105 +msgid "Notices" +msgstr "Оповещения" + +#: ../../Zotlabs/Widget/Notifications.php:108 +msgid "View all notices" +msgstr "Просмотреть все оповещения" + +#: ../../Zotlabs/Widget/Notifications.php:111 +msgid "Mark all notices seen" +msgstr "Пометить все оповещения как просмотренные" + +#: ../../Zotlabs/Widget/Notifications.php:132 +msgid "New Registrations" +msgstr "Новые регистрации" + +#: ../../Zotlabs/Widget/Notifications.php:133 +msgid "New Registrations Notifications" +msgstr "Уведомления о новых регистрациях" + +#: ../../Zotlabs/Widget/Notifications.php:142 +#: ../../Zotlabs/Module/Pubstream.php:95 +msgid "Public Stream" +msgstr "Публичный поток" + +#: ../../Zotlabs/Widget/Notifications.php:143 +msgid "Public Stream Notifications" +msgstr "Уведомления публичного потока" + +#: ../../Zotlabs/Widget/Notifications.php:146 +msgid "View the public stream" +msgstr "Просмотреть публичный поток" + +#: ../../Zotlabs/Widget/Notifications.php:161 +msgid "Sorry, you have got no notifications at the moment" +msgstr "Извините, но сейчас у вас нет уведомлений" + +#: ../../Zotlabs/Widget/Newmember.php:24 +msgid "Profile Creation" +msgstr "Создание профиля" + +#: ../../Zotlabs/Widget/Newmember.php:26 +msgid "Upload profile photo" +msgstr "Загрузить фотографию профиля" + +#: ../../Zotlabs/Widget/Newmember.php:27 +msgid "Upload cover photo" +msgstr "Загрузить фотографию обложки" + +#: ../../Zotlabs/Widget/Newmember.php:31 +msgid "Find and Connect with others" +msgstr "Найти и вступить в контакт" + +#: ../../Zotlabs/Widget/Newmember.php:33 +msgid "View the directory" +msgstr "Просмотреть каталог" + +#: ../../Zotlabs/Widget/Newmember.php:34 ../../Zotlabs/Module/Go.php:38 +msgid "View friend suggestions" +msgstr "Просмотр рекомендуемых друзей" + +#: ../../Zotlabs/Widget/Newmember.php:35 +msgid "Manage your connections" +msgstr "Управлять вашими контактами" + +#: ../../Zotlabs/Widget/Newmember.php:38 +msgid "Communicate" +msgstr "Связаться" + +#: ../../Zotlabs/Widget/Newmember.php:40 +msgid "View your channel homepage" +msgstr "Домашняя страница канала" + +#: ../../Zotlabs/Widget/Newmember.php:41 +msgid "View your network stream" +msgstr "Просмотреть ваш сетевой поток" + +#: ../../Zotlabs/Widget/Newmember.php:47 +msgid "Documentation" +msgstr "Документация" + +#: ../../Zotlabs/Widget/Newmember.php:58 +msgid "View public stream" +msgstr "Просмотреть публичный поток" + +#: ../../Zotlabs/Access/PermissionRoles.php:283 +msgid "Social Networking" +msgstr "Социальная Сеть" + +#: ../../Zotlabs/Access/PermissionRoles.php:284 +msgid "Social - Federation" +msgstr "Социальная - Федерация" + +#: ../../Zotlabs/Access/PermissionRoles.php:285 +msgid "Social - Mostly Public" +msgstr "Социальная - В основном общественный" + +#: ../../Zotlabs/Access/PermissionRoles.php:286 +msgid "Social - Restricted" +msgstr "Социальная - Ограниченный" + +#: ../../Zotlabs/Access/PermissionRoles.php:287 +msgid "Social - Private" +msgstr "Социальная - Частный" + +#: ../../Zotlabs/Access/PermissionRoles.php:290 +msgid "Community Forum" +msgstr "Форум сообщества" + +#: ../../Zotlabs/Access/PermissionRoles.php:291 +msgid "Forum - Mostly Public" +msgstr "Форум - В основном общественный" + +#: ../../Zotlabs/Access/PermissionRoles.php:292 +msgid "Forum - Restricted" +msgstr "Форум - Ограниченный" + +#: ../../Zotlabs/Access/PermissionRoles.php:293 +msgid "Forum - Private" +msgstr "Форум - Частный" + +#: ../../Zotlabs/Access/PermissionRoles.php:296 +msgid "Feed Republish" +msgstr "Публиковать ленты новостей" + +#: ../../Zotlabs/Access/PermissionRoles.php:297 +msgid "Feed - Mostly Public" +msgstr "Ленты новостей - В основном общественный" + +#: ../../Zotlabs/Access/PermissionRoles.php:298 +msgid "Feed - Restricted" +msgstr "Ленты новостей - Ограниченный" + +#: ../../Zotlabs/Access/PermissionRoles.php:301 +msgid "Special Purpose" +msgstr "Спец. назначение" + +#: ../../Zotlabs/Access/PermissionRoles.php:302 +msgid "Special - Celebrity/Soapbox" +msgstr "Спец. назначение - Знаменитость/Soapbox" + +#: ../../Zotlabs/Access/PermissionRoles.php:303 +msgid "Special - Group Repository" +msgstr "Спец. назначение - Групповой репозиторий" + +#: ../../Zotlabs/Access/PermissionRoles.php:307 +msgid "Custom/Expert Mode" +msgstr "Экспертный режим" + +#: ../../Zotlabs/Access/Permissions.php:56 +msgid "Can view my channel stream and posts" +msgstr "Может просматривать мою ленту и сообщения" + +#: ../../Zotlabs/Access/Permissions.php:57 +msgid "Can send me their channel stream and posts" +msgstr "Может присылать мне свои потоки и сообщения" + +#: ../../Zotlabs/Access/Permissions.php:58 +msgid "Can view my default channel profile" +msgstr "Может просматривать мой стандартный профиль канала" + +#: ../../Zotlabs/Access/Permissions.php:59 +msgid "Can view my connections" +msgstr "Может просматривать мои контакты" + +#: ../../Zotlabs/Access/Permissions.php:60 +msgid "Can view my file storage and photos" +msgstr "Может просматривать мое хранилище файлов" + +#: ../../Zotlabs/Access/Permissions.php:61 +msgid "Can upload/modify my file storage and photos" +msgstr "Может загружать/изменять мои файлы и фотографии в хранилище" + +#: ../../Zotlabs/Access/Permissions.php:62 +msgid "Can view my channel webpages" +msgstr "Может просматривать мои веб-страницы" + +#: ../../Zotlabs/Access/Permissions.php:63 +msgid "Can view my wiki pages" +msgstr "Может просматривать мои вики-страницы" + +#: ../../Zotlabs/Access/Permissions.php:64 +msgid "Can create/edit my channel webpages" +msgstr "Может редактировать мои веб-страницы" + +#: ../../Zotlabs/Access/Permissions.php:65 +msgid "Can write to my wiki pages" +msgstr "Может редактировать мои вики-страницы" + +#: ../../Zotlabs/Access/Permissions.php:66 +msgid "Can post on my channel (wall) page" +msgstr "Может публиковать на моей странице канала" + +#: ../../Zotlabs/Access/Permissions.php:67 +msgid "Can comment on or like my posts" +msgstr "Может прокомментировать или отмечать как понравившиеся мои посты" + +#: ../../Zotlabs/Access/Permissions.php:68 +msgid "Can send me private mail messages" +msgstr "Может отправлять мне личные сообщения по эл. почте" + +#: ../../Zotlabs/Access/Permissions.php:69 +msgid "Can like/dislike profiles and profile things" +msgstr "Может комментировать или отмечать как нравится/ненравится мой профиль" + +#: ../../Zotlabs/Access/Permissions.php:70 +msgid "Can forward to all my channel connections via ! mentions in posts" +msgstr "Может пересылать всем подписчикам моего канала используя ! в публикациях" + +#: ../../Zotlabs/Access/Permissions.php:71 +msgid "Can chat with me" +msgstr "Может общаться со мной в чате" + +#: ../../Zotlabs/Access/Permissions.php:72 +msgid "Can source my public posts in derived channels" +msgstr "Может использовать мои публичные сообщения в клонированных лентах сообщений" + +#: ../../Zotlabs/Access/Permissions.php:73 +msgid "Can administer my channel" +msgstr "Может администрировать мой канал" + +#: ../../Zotlabs/Zot/Auth.php:152 msgid "" -"Please indicate acceptance of the Terms of Service. Registration failed." -msgstr "" +"Remote authentication blocked. You are logged into this site locally. Please " +"logout and retry." +msgstr "Удалённая аутентификация заблокирована. Вы вошли на этот сайт локально. Пожалуйста, выйдите и попробуйте ещё раз." -#: ../../mod/register.php:77 -msgid "Passwords do not match." -msgstr "Пароли не совпадают." +#: ../../Zotlabs/Module/Appman.php:39 ../../Zotlabs/Module/Appman.php:56 +msgid "App installed." +msgstr "Приложение установлено." -#: ../../mod/register.php:105 +#: ../../Zotlabs/Module/Appman.php:49 +msgid "Malformed app." +msgstr "Неработающее приложение." + +#: ../../Zotlabs/Module/Appman.php:130 +msgid "Embed code" +msgstr "Встроить код" + +#: ../../Zotlabs/Module/Appman.php:136 +msgid "Edit App" +msgstr "Редактировать приложение" + +#: ../../Zotlabs/Module/Appman.php:136 +msgid "Create App" +msgstr "Создать приложение" + +#: ../../Zotlabs/Module/Appman.php:141 +msgid "Name of app" +msgstr "Наименование приложения" + +#: ../../Zotlabs/Module/Appman.php:142 +msgid "Location (URL) of app" +msgstr "Местоположение (URL) приложения" + +#: ../../Zotlabs/Module/Appman.php:144 +msgid "Photo icon URL" +msgstr "URL пиктограммы" + +#: ../../Zotlabs/Module/Appman.php:144 +msgid "80 x 80 pixels - optional" +msgstr "80 x 80 пикселей - необязательно" + +#: ../../Zotlabs/Module/Appman.php:145 +msgid "Categories (optional, comma separated list)" +msgstr "Категории (необязательно, список через запятую)" + +#: ../../Zotlabs/Module/Appman.php:146 +msgid "Version ID" +msgstr "ID версии" + +#: ../../Zotlabs/Module/Appman.php:147 +msgid "Price of app" +msgstr "Цена приложения" + +#: ../../Zotlabs/Module/Appman.php:148 +msgid "Location (URL) to purchase app" +msgstr "Ссылка (URL) для покупки приложения" + +#: ../../Zotlabs/Module/Acl.php:359 +msgid "network" +msgstr "сеть" + +#: ../../Zotlabs/Module/Cdav.php:785 +msgid "INVALID EVENT DISMISSED!" +msgstr "НЕДЕЙСТВИТЕЛЬНОЕ СОБЫТИЕ ОТКЛОНЕНО!" + +#: ../../Zotlabs/Module/Cdav.php:786 +msgid "Summary: " +msgstr "Резюме:" + +#: ../../Zotlabs/Module/Cdav.php:787 +msgid "Date: " +msgstr "Дата:" + +#: ../../Zotlabs/Module/Cdav.php:788 ../../Zotlabs/Module/Cdav.php:795 +msgid "Reason: " +msgstr "Причина:" + +#: ../../Zotlabs/Module/Cdav.php:793 +msgid "INVALID CARD DISMISSED!" +msgstr "НЕДЕЙСТВИТЕЛЬНАЯ КАРТОЧКА ОТКЛОНЕНА!" + +#: ../../Zotlabs/Module/Cdav.php:794 +msgid "Name: " +msgstr "Имя:" + +#: ../../Zotlabs/Module/Cdav.php:868 ../../Zotlabs/Module/Events.php:460 +msgid "Event title" +msgstr "Наименование события" + +#: ../../Zotlabs/Module/Cdav.php:869 ../../Zotlabs/Module/Events.php:466 +msgid "Start date and time" +msgstr "Дата и время начала" + +#: ../../Zotlabs/Module/Cdav.php:869 ../../Zotlabs/Module/Cdav.php:870 +msgid "Example: YYYY-MM-DD HH:mm" +msgstr "Пример: YYYY-MM-DD HH:mm" + +#: ../../Zotlabs/Module/Cdav.php:870 +msgid "End date and time" +msgstr "Дата и время окончания" + +#: ../../Zotlabs/Module/Cdav.php:879 ../../Zotlabs/Module/Photos.php:976 +#: ../../Zotlabs/Module/Events.php:689 ../../Zotlabs/Module/Events.php:698 +#: ../../Zotlabs/Module/Cal.php:339 ../../Zotlabs/Module/Cal.php:346 +msgid "Previous" +msgstr "Предыдущая" + +#: ../../Zotlabs/Module/Cdav.php:880 ../../Zotlabs/Module/Photos.php:985 +#: ../../Zotlabs/Module/Events.php:690 ../../Zotlabs/Module/Events.php:699 +#: ../../Zotlabs/Module/Cal.php:340 ../../Zotlabs/Module/Cal.php:347 +#: ../../Zotlabs/Module/Setup.php:263 +msgid "Next" +msgstr "Следующая" + +#: ../../Zotlabs/Module/Cdav.php:881 ../../Zotlabs/Module/Events.php:700 +#: ../../Zotlabs/Module/Cal.php:348 +msgid "Today" +msgstr "Сегодня" + +#: ../../Zotlabs/Module/Cdav.php:882 ../../Zotlabs/Module/Events.php:695 +msgid "Month" +msgstr "Месяц" + +#: ../../Zotlabs/Module/Cdav.php:883 ../../Zotlabs/Module/Events.php:696 +msgid "Week" +msgstr "Неделя" + +#: ../../Zotlabs/Module/Cdav.php:884 ../../Zotlabs/Module/Events.php:697 +msgid "Day" +msgstr "День" + +#: ../../Zotlabs/Module/Cdav.php:885 +msgid "List month" +msgstr "Просмотреть месяц" + +#: ../../Zotlabs/Module/Cdav.php:886 +msgid "List week" +msgstr "Просмотреть неделю" + +#: ../../Zotlabs/Module/Cdav.php:887 +msgid "List day" +msgstr "Просмотреть день" + +#: ../../Zotlabs/Module/Cdav.php:894 +msgid "More" +msgstr "Больше" + +#: ../../Zotlabs/Module/Cdav.php:895 +msgid "Less" +msgstr "Меньше" + +#: ../../Zotlabs/Module/Cdav.php:896 +msgid "Select calendar" +msgstr "Выбрать календарь" + +#: ../../Zotlabs/Module/Cdav.php:898 +msgid "Delete all" +msgstr "Удалить всё" + +#: ../../Zotlabs/Module/Cdav.php:900 +msgid "Sorry! Editing of recurrent events is not yet implemented." +msgstr "Простите, но редактирование повторяющихся событий пока не реализовано." + +#: ../../Zotlabs/Module/Cdav.php:1171 ../../Zotlabs/Module/Connedit.php:907 +msgid "Organisation" +msgstr "Организация" + +#: ../../Zotlabs/Module/Cdav.php:1172 ../../Zotlabs/Module/Connedit.php:908 +msgid "Title" +msgstr "Наименование" + +#: ../../Zotlabs/Module/Cdav.php:1173 ../../Zotlabs/Module/Connedit.php:909 +#: ../../Zotlabs/Module/Profiles.php:786 +msgid "Phone" +msgstr "Телефон" + +#: ../../Zotlabs/Module/Cdav.php:1175 ../../Zotlabs/Module/Connedit.php:911 +#: ../../Zotlabs/Module/Profiles.php:788 +msgid "Instant messenger" +msgstr "Мессенджер" + +#: ../../Zotlabs/Module/Cdav.php:1176 ../../Zotlabs/Module/Connedit.php:912 +#: ../../Zotlabs/Module/Profiles.php:789 +msgid "Website" +msgstr "Веб-сайт" + +#: ../../Zotlabs/Module/Cdav.php:1177 ../../Zotlabs/Module/Connedit.php:913 +#: ../../Zotlabs/Module/Admin/Channels.php:160 +#: ../../Zotlabs/Module/Locs.php:118 ../../Zotlabs/Module/Profiles.php:502 +#: ../../Zotlabs/Module/Profiles.php:790 +msgid "Address" +msgstr "Адрес" + +#: ../../Zotlabs/Module/Cdav.php:1178 ../../Zotlabs/Module/Connedit.php:914 +#: ../../Zotlabs/Module/Profiles.php:791 +msgid "Note" +msgstr "Заметка" + +#: ../../Zotlabs/Module/Cdav.php:1184 ../../Zotlabs/Module/Connedit.php:920 +#: ../../Zotlabs/Module/Profiles.php:797 +msgid "Add Field" +msgstr "Добавить поле" + +#: ../../Zotlabs/Module/Cdav.php:1189 ../../Zotlabs/Module/Connedit.php:925 +msgid "P.O. Box" +msgstr "абонентский ящик" + +#: ../../Zotlabs/Module/Cdav.php:1190 ../../Zotlabs/Module/Connedit.php:926 +msgid "Additional" +msgstr "Дополнительно" + +#: ../../Zotlabs/Module/Cdav.php:1191 ../../Zotlabs/Module/Connedit.php:927 +msgid "Street" +msgstr "Улица" + +#: ../../Zotlabs/Module/Cdav.php:1192 ../../Zotlabs/Module/Connedit.php:928 +msgid "Locality" +msgstr "Населённый пункт" + +#: ../../Zotlabs/Module/Cdav.php:1193 ../../Zotlabs/Module/Connedit.php:929 +msgid "Region" +msgstr "Регион" + +#: ../../Zotlabs/Module/Cdav.php:1194 ../../Zotlabs/Module/Connedit.php:930 +msgid "ZIP Code" +msgstr "Индекс" + +#: ../../Zotlabs/Module/Cdav.php:1195 ../../Zotlabs/Module/Connedit.php:931 +#: ../../Zotlabs/Module/Profiles.php:757 +msgid "Country" +msgstr "Страна" + +#: ../../Zotlabs/Module/Cdav.php:1242 +msgid "Default Calendar" +msgstr "Календарь по умолчанию" + +#: ../../Zotlabs/Module/Cdav.php:1252 +msgid "Default Addressbook" +msgstr "Адресная книга по умолчанию" + +#: ../../Zotlabs/Module/Go.php:21 +msgid "This page is available only to site members" +msgstr "Эта страница доступна только для подписчиков сайта" + +#: ../../Zotlabs/Module/Go.php:27 +msgid "Welcome" +msgstr "Добро пожаловать" + +#: ../../Zotlabs/Module/Go.php:29 +msgid "What would you like to do?" +msgstr "Что бы вы хотели сделать?" + +#: ../../Zotlabs/Module/Go.php:31 msgid "" -"Registration successful. Please check your email for validation " -"instructions." -msgstr "" +"Please bookmark this page if you would like to return to it in the future" +msgstr "Пожалуйста, запомните эту страницу если вы хотите вернуться на неё в будущем" -#: ../../mod/register.php:111 -msgid "Your registration is pending approval by the site owner." -msgstr "" +#: ../../Zotlabs/Module/Go.php:35 +msgid "Upload a profile photo" +msgstr "Загрузить фотографию профиля" -#: ../../mod/register.php:114 -msgid "Your registration can not be processed." -msgstr "Ваша регистрация не может быть обработана." +#: ../../Zotlabs/Module/Go.php:36 +msgid "Upload a cover photo" +msgstr "Загрузить фотографию обложки" -#: ../../mod/register.php:147 -msgid "Registration on this site/hub is by approval only." -msgstr "" +#: ../../Zotlabs/Module/Go.php:37 +msgid "Edit your default profile" +msgstr "Редактировать ваш профиль по умолчанию" -#: ../../mod/register.php:148 -msgid "<a href=\"pubsites\">Register at another affiliated site/hub</a>" -msgstr "" +#: ../../Zotlabs/Module/Go.php:39 +msgid "View the channel directory" +msgstr "Просмотр каталога каналов" + +#: ../../Zotlabs/Module/Go.php:40 +msgid "View/edit your channel settings" +msgstr "Просмотреть / редактировать настройки вашего канала" + +#: ../../Zotlabs/Module/Go.php:41 +msgid "View the site or project documentation" +msgstr "Просмотр документации сайта / проекта" -#: ../../mod/register.php:156 +#: ../../Zotlabs/Module/Go.php:42 +msgid "Visit your channel homepage" +msgstr "Посетить страницу вашего канала" + +#: ../../Zotlabs/Module/Go.php:43 msgid "" -"This site has exceeded the number of allowed daily account registrations. " -"Please try again tomorrow." -msgstr "" +"View your connections and/or add somebody whose address you already know" +msgstr "Просмотреть ваши контакты и / или добавить кого-то чей адрес в уже знаете" -#: ../../mod/register.php:167 -msgid "Terms of Service" -msgstr "Условия предоставления услуг" +#: ../../Zotlabs/Module/Go.php:44 +msgid "" +"View your personal stream (this may be empty until you add some connections)" +msgstr "Ваш персональный поток (может быть пуст пока вы не добавите контакты)" + +#: ../../Zotlabs/Module/Go.php:52 +msgid "View the public stream. Warning: this content is not moderated" +msgstr "Просмотр публичного потока. Предупреждение: этот контент не модерируется" + +#: ../../Zotlabs/Module/Photos.php:78 +msgid "Page owner information could not be retrieved." +msgstr "Информация о владельце страницы не может быть получена." -#: ../../mod/register.php:173 +#: ../../Zotlabs/Module/Photos.php:94 ../../Zotlabs/Module/Photos.php:113 +msgid "Album not found." +msgstr "Альбом не найден." + +#: ../../Zotlabs/Module/Photos.php:103 +msgid "Delete Album" +msgstr "Удалить альбом" + +#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1088 +msgid "Delete Photo" +msgstr "Удалить фотографию" + +#: ../../Zotlabs/Module/Photos.php:545 ../../Zotlabs/Module/Ratings.php:83 +#: ../../Zotlabs/Module/Search.php:17 +#: ../../Zotlabs/Module/Viewconnections.php:23 +#: ../../Zotlabs/Module/Directory.php:63 ../../Zotlabs/Module/Directory.php:68 +#: ../../Zotlabs/Module/Display.php:30 +msgid "Public access denied." +msgstr "Общественный доступ запрещен." + +#: ../../Zotlabs/Module/Photos.php:556 +msgid "No photos selected" +msgstr "Никакие фотографии не выбраны" + +#: ../../Zotlabs/Module/Photos.php:605 +msgid "Access to this item is restricted." +msgstr "Доступ к этому элементу ограничен." + +#: ../../Zotlabs/Module/Photos.php:651 #, php-format -msgid "I accept the %s for this website" -msgstr "" +msgid "%1$.2f MB of %2$.2f MB photo storage used." +msgstr "Вы использовали %1$.2f мегабайт из %2$.2f для хранения фото." -#: ../../mod/register.php:175 +#: ../../Zotlabs/Module/Photos.php:654 #, php-format -msgid "I am over 13 years of age and accept the %s for this website" -msgstr "" +msgid "%1$.2f MB photo storage used." +msgstr "Вы использовали %1$.2f мегабайт для хранения фото." -#: ../../mod/register.php:189 ../../mod/admin.php:443 -msgid "Registration" -msgstr "Регистрация" +#: ../../Zotlabs/Module/Photos.php:696 +msgid "Upload Photos" +msgstr "Загрузить фотографии" -#: ../../mod/register.php:194 -msgid "Membership on this site is by invitation only." -msgstr "" +#: ../../Zotlabs/Module/Photos.php:700 +msgid "Enter an album name" +msgstr "Введите название альбома" -#: ../../mod/register.php:195 -msgid "Please enter your invitation code" -msgstr "Пожалуйста, введите Ваш код приглашения" +#: ../../Zotlabs/Module/Photos.php:701 +msgid "or select an existing album (doubleclick)" +msgstr "или выберите существующий альбом (двойной щелчок)" -#: ../../mod/register.php:198 -msgid "Your email address" -msgstr "Ваш адрес электронной почты" +#: ../../Zotlabs/Module/Photos.php:702 +msgid "Create a status post for this upload" +msgstr "Сделать публикацию о статусе для этой загрузки" -#: ../../mod/register.php:199 -msgid "Choose a password" -msgstr "Выберите пароль" +#: ../../Zotlabs/Module/Photos.php:704 +msgid "Description (optional)" +msgstr "Описание (необязательно)" -#: ../../mod/register.php:200 -msgid "Please re-enter your password" -msgstr "Пожалуйста, введите пароль еще раз" +#: ../../Zotlabs/Module/Photos.php:790 +msgid "Show Newest First" +msgstr "Показать новые первыми" -#: ../../mod/chatsvc.php:111 -msgid "Away" -msgstr "Нет на месте" +#: ../../Zotlabs/Module/Photos.php:792 +msgid "Show Oldest First" +msgstr "Показать старые первыми" -#: ../../mod/chatsvc.php:115 -msgid "Online" -msgstr "Сейчас в сети" +#: ../../Zotlabs/Module/Photos.php:849 ../../Zotlabs/Module/Photos.php:1386 +msgid "Add Photos" +msgstr "Добавить фотографии" -#: ../../mod/regmod.php:12 -msgid "Please login." -msgstr "Войдите пожалуйста." +#: ../../Zotlabs/Module/Photos.php:897 +msgid "Permission denied. Access to this item may be restricted." +msgstr "Доступ запрещен. Доступ к этому элементу может быть ограничен." -#: ../../mod/cloud.php:113 -msgid "Hubzilla - Guests: Username: {your email address}, Password: +++" -msgstr "" +#: ../../Zotlabs/Module/Photos.php:899 +msgid "Photo not available" +msgstr "Фотография не доступна" -#: ../../mod/removeme.php:49 -msgid "Remove This Channel" -msgstr "Удалить этот канал" +#: ../../Zotlabs/Module/Photos.php:957 +msgid "Use as profile photo" +msgstr "Использовать в качестве фотографии профиля" -#: ../../mod/removeme.php:50 -msgid "" -"This will completely remove this channel from the network. Once this has " -"been done it is not recoverable." -msgstr "" +#: ../../Zotlabs/Module/Photos.php:958 +msgid "Use as cover photo" +msgstr "Использовать в качестве фотографии обложки" -#: ../../mod/removeme.php:51 -msgid "Please enter your password for verification:" -msgstr "Пожалуйста, введите пароль для проверки:" +#: ../../Zotlabs/Module/Photos.php:965 +msgid "Private Photo" +msgstr "Личная фотография" -#: ../../mod/removeme.php:52 -msgid "Remove this channel and all its clones from the network" -msgstr "Удалить этот канал и все его клоны из сети" +#: ../../Zotlabs/Module/Photos.php:980 +msgid "View Full Size" +msgstr "Посмотреть в полный размер" -#: ../../mod/removeme.php:52 -msgid "" -"By default only the instance of the channel located on this hub will be " -"removed from the network" -msgstr "" +#: ../../Zotlabs/Module/Photos.php:1062 +msgid "Edit photo" +msgstr "Редактировать фотографию" -#: ../../mod/removeme.php:53 -msgid "Remove Channel" -msgstr "Удалить канал" +#: ../../Zotlabs/Module/Photos.php:1064 +msgid "Rotate CW (right)" +msgstr "Повернуть CW (направо)" -#: ../../mod/common.php:10 -msgid "No channel." -msgstr "Не канал." +#: ../../Zotlabs/Module/Photos.php:1065 +msgid "Rotate CCW (left)" +msgstr "Повернуть CCW (налево)" -#: ../../mod/common.php:39 -msgid "Common connections" -msgstr "Общие контакты" +#: ../../Zotlabs/Module/Photos.php:1068 +msgid "Move photo to album" +msgstr "Переместить фотографию в альбом" -#: ../../mod/common.php:44 -msgid "No connections in common." -msgstr "Общих контактов нет." +#: ../../Zotlabs/Module/Photos.php:1069 +msgid "Enter a new album name" +msgstr "Введите новое название альбома" -#: ../../mod/rmagic.php:38 +#: ../../Zotlabs/Module/Photos.php:1070 +msgid "or select an existing one (doubleclick)" +msgstr "или выбрать существующую (двойной щелчок)" + +#: ../../Zotlabs/Module/Photos.php:1075 +msgid "Add a Tag" +msgstr "Добавить тег" + +#: ../../Zotlabs/Module/Photos.php:1083 +msgid "Example: @bob, @Barbara_Jensen, @jim@example.com" +msgstr "Пример: @bob, @Barbara_Jensen, @jim@example.com" + +#: ../../Zotlabs/Module/Photos.php:1086 +msgid "Flag as adult in album view" +msgstr "Пометить как альбом \"для взрослых\"" + +#: ../../Zotlabs/Module/Photos.php:1270 +msgid "Photo Tools" +msgstr "Фото-Инструменты" + +#: ../../Zotlabs/Module/Photos.php:1279 +msgid "In This Photo:" +msgstr "На этой фотографии:" + +#: ../../Zotlabs/Module/Photos.php:1284 +msgid "Map" +msgstr "Карта" + +#: ../../Zotlabs/Module/Pubsites.php:27 msgid "" -"We encountered a problem while logging in with the OpenID you provided. " -"Please check the correct spelling of the ID." -msgstr "" +"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 "Указанные хабы разрешают публичную регистрацию для сети $Projectname. Все хабы в сети взаимосвязаны, поэтому членство в любом из них передает членство во всю сеть. Некоторым хабам может потребоваться подписка или предоставление многоуровневых планов обслуживания. Сам хаб <strong>может</strong> предоставить дополнительные сведения." -#: ../../mod/rmagic.php:38 -msgid "The error message was:" -msgstr "Сообщение об ошибке было:" +#: ../../Zotlabs/Module/Pubsites.php:33 +msgid "Hub URL" +msgstr "URL сервера" -#: ../../mod/rmagic.php:42 -msgid "Authentication failed." -msgstr "Ошибка проверки подлинности." +#: ../../Zotlabs/Module/Pubsites.php:33 +msgid "Access Type" +msgstr "Тип доступа" -#: ../../mod/rmagic.php:78 -msgid "Remote Authentication" -msgstr "Удаленная аутентификация" +#: ../../Zotlabs/Module/Pubsites.php:33 +msgid "Registration Policy" +msgstr "Политика регистрации" -#: ../../mod/rmagic.php:79 -msgid "Enter your channel address (e.g. channel@example.com)" -msgstr "Введите адрес вашего канала (например: channel@example.com)" +#: ../../Zotlabs/Module/Pubsites.php:33 +msgid "Stats" +msgstr "Статистика" -#: ../../mod/rmagic.php:80 -msgid "Authenticate" -msgstr "Проверка подлинности" +#: ../../Zotlabs/Module/Pubsites.php:33 +msgid "Software" +msgstr "Программное обеспечение" -#: ../../mod/connect.php:55 ../../mod/connect.php:103 +#: ../../Zotlabs/Module/Pubsites.php:49 +msgid "Rate" +msgstr "Оценка" + +#: ../../Zotlabs/Module/Pubsites.php:60 ../../Zotlabs/Module/Events.php:694 +#: ../../Zotlabs/Module/Layouts.php:198 ../../Zotlabs/Module/Webpages.php:246 +#: ../../Zotlabs/Module/Blocks.php:166 ../../Zotlabs/Module/Wiki.php:204 +msgid "View" +msgstr "Просмотр" + +#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109 msgid "Continue" msgstr "Продолжить" -#: ../../mod/connect.php:84 +#: ../../Zotlabs/Module/Connect.php:90 msgid "Premium Channel Setup" msgstr "Установка премиум канала" -#: ../../mod/connect.php:86 +#: ../../Zotlabs/Module/Connect.php:92 msgid "Enable premium channel connection restrictions" -msgstr "" +msgstr "Включить ограничения для премиум канала" -#: ../../mod/connect.php:87 +#: ../../Zotlabs/Module/Connect.php:93 msgid "" "Please enter your restrictions or conditions, such as paypal receipt, usage " "guidelines, etc." -msgstr "" +msgstr "Пожалуйста введите ваши ограничения или условия, такие, как оплата PayPal, правила использования и т.п." -#: ../../mod/connect.php:89 ../../mod/connect.php:109 +#: ../../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 "" +msgstr "Этот канал до подключения может требовать дополнительных шагов или подтверждений следующих условий:" -#: ../../mod/connect.php:90 +#: ../../Zotlabs/Module/Connect.php:96 msgid "" "Potential connections will then see the following text before proceeding:" -msgstr "" +msgstr "Потенциальные соединения будут видеть следующий предварительный текст:" -#: ../../mod/connect.php:91 ../../mod/connect.php:112 +#: ../../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 "" +"By continuing, I certify that I have complied with any instructions provided " +"on this page." +msgstr "Продолжая, я подтверждаю что я выполнил все условия представленные на данной странице." -#: ../../mod/connect.php:100 +#: ../../Zotlabs/Module/Connect.php:106 msgid "(No specific instructions have been provided by the channel owner.)" -msgstr "" +msgstr "(Владельцем канала не было представлено никаких специальных инструкций.)" -#: ../../mod/connect.php:108 +#: ../../Zotlabs/Module/Connect.php:114 msgid "Restricted or Premium Channel" msgstr "Ограниченный или Премиум канал" -#: ../../mod/network.php:79 -msgid "No such group" -msgstr "Нет такой группы" +#: ../../Zotlabs/Module/Poke.php:183 +msgid "Poke somebody" +msgstr "Ткнуть кого-нибудь" -#: ../../mod/network.php:118 -msgid "Search Results For:" -msgstr "Результаты поиска для:" +#: ../../Zotlabs/Module/Poke.php:186 +msgid "Poke/Prod" +msgstr "Толкнуть / подтолкнуть" -#: ../../mod/network.php:172 -msgid "Collection is empty" -msgstr "Коллекция пуста" +#: ../../Zotlabs/Module/Poke.php:187 +msgid "Poke, prod or do other things to somebody" +msgstr "Толкнуть, подтолкнуть или сделать что-то ещё с кем-то" -#: ../../mod/network.php:180 -msgid "Collection: " -msgstr "Коллекции: " +#: ../../Zotlabs/Module/Poke.php:194 +msgid "Recipient" +msgstr "Получатель" -#: ../../mod/network.php:193 -msgid "Connection: " -msgstr "Контакты: " +#: ../../Zotlabs/Module/Poke.php:195 +msgid "Choose what you wish to do to recipient" +msgstr "Выбрать что вы хотите сделать с получателем" -#: ../../mod/network.php:196 -msgid "Invalid connection." -msgstr "" +#: ../../Zotlabs/Module/Poke.php:198 ../../Zotlabs/Module/Poke.php:199 +msgid "Make this post private" +msgstr "Сделать эту публикацию приватной" -#: ../../mod/connections.php:37 ../../mod/connedit.php:64 -msgid "Could not access contact record." -msgstr "" +#: ../../Zotlabs/Module/Oexchange.php:27 +msgid "Unable to find your hub." +msgstr "Невозможно найти ваш сервер" -#: ../../mod/connections.php:51 ../../mod/connedit.php:78 -msgid "Could not locate selected profile." -msgstr "" +#: ../../Zotlabs/Module/Oexchange.php:41 +msgid "Post successful." +msgstr "Успешно опубликовано." -#: ../../mod/connections.php:94 ../../mod/connedit.php:131 -msgid "Connection updated." -msgstr "Связи обновленны." +#: ../../Zotlabs/Module/Impel.php:183 +#, php-format +msgid "%s element installed" +msgstr "%s элемент установлен" -#: ../../mod/connections.php:96 ../../mod/connedit.php:133 -msgid "Failed to update connection record." -msgstr "" +#: ../../Zotlabs/Module/Impel.php:186 +#, php-format +msgid "%s element installation failed" +msgstr "%sустановка элемента неудачна." -#: ../../mod/connections.php:191 ../../mod/connections.php:292 -msgid "Blocked" -msgstr "Заблокированные" +#: ../../Zotlabs/Module/Ping.php:332 +msgid "sent you a private message" +msgstr "отправил вам личное сообщение" -#: ../../mod/connections.php:196 ../../mod/connections.php:299 -msgid "Ignored" -msgstr "Игнорируемые" +#: ../../Zotlabs/Module/Ping.php:385 +msgid "added your channel" +msgstr "добавил ваш канал" -#: ../../mod/connections.php:201 ../../mod/connections.php:313 -msgid "Hidden" -msgstr "Скрытые" +#: ../../Zotlabs/Module/Ping.php:409 +msgid "requires approval" +msgstr "Требуется подтверждение" -#: ../../mod/connections.php:206 ../../mod/connections.php:306 -msgid "Archived" -msgstr "Зархивированные" +#: ../../Zotlabs/Module/Ping.php:419 +msgid "g A l F d" +msgstr "g A l F d" -#: ../../mod/connections.php:230 ../../mod/connections.php:245 -msgid "All" -msgstr "Все" +#: ../../Zotlabs/Module/Ping.php:437 +msgid "[today]" +msgstr "[сегодня]" -#: ../../mod/connections.php:240 ../../mod/connections.php:320 -msgid "Unconnected" -msgstr "Неприсоединенные" +#: ../../Zotlabs/Module/Ping.php:446 +msgid "posted an event" +msgstr "событие опубликовано" -#: ../../mod/connections.php:270 -msgid "Suggest new connections" -msgstr "Предлагать новые контакты" +#: ../../Zotlabs/Module/Ping.php:479 +msgid "shared a file with you" +msgstr "с вами поделились файлом" -#: ../../mod/connections.php:273 -msgid "New Connections" -msgstr "Новые контакты" +#: ../../Zotlabs/Module/Ping.php:654 +msgid "Private forum" +msgstr "Частный форум" -#: ../../mod/connections.php:276 -msgid "Show pending (new) connections" -msgstr "Просмотр (новых) ждущих контактов" +#: ../../Zotlabs/Module/Ping.php:654 +msgid "Public forum" +msgstr "Публичный форум" -#: ../../mod/connections.php:282 -msgid "Show all connections" -msgstr "Просмотр всех контактов" +#: ../../Zotlabs/Module/Achievements.php:38 +msgid "Some blurb about what to do when you're new here" +msgstr "Некоторые предложения о том, что делать, если вы здесь новичок " -#: ../../mod/connections.php:285 -msgid "Unblocked" -msgstr "Разрешенные" +#: ../../Zotlabs/Module/Connections.php:55 +#: ../../Zotlabs/Module/Connections.php:112 +#: ../../Zotlabs/Module/Connections.php:256 +msgid "Active" +msgstr "Активен" -#: ../../mod/connections.php:288 -msgid "Only show unblocked connections" -msgstr "Показать только разрешенные контакты" +#: ../../Zotlabs/Module/Connections.php:60 +#: ../../Zotlabs/Module/Connections.php:164 +#: ../../Zotlabs/Module/Connections.php:261 +msgid "Blocked" +msgstr "Заблокирован" + +#: ../../Zotlabs/Module/Connections.php:65 +#: ../../Zotlabs/Module/Connections.php:171 +#: ../../Zotlabs/Module/Connections.php:260 +msgid "Ignored" +msgstr "Игнорируется" + +#: ../../Zotlabs/Module/Connections.php:70 +#: ../../Zotlabs/Module/Connections.php:185 +#: ../../Zotlabs/Module/Connections.php:259 +msgid "Hidden" +msgstr "Скрыт" + +#: ../../Zotlabs/Module/Connections.php:75 +#: ../../Zotlabs/Module/Connections.php:178 +msgid "Archived/Unreachable" +msgstr "Заархивировано / недоступно" -#: ../../mod/connections.php:295 +#: ../../Zotlabs/Module/Connections.php:140 +msgid "Active Connections" +msgstr "Активные контакты" + +#: ../../Zotlabs/Module/Connections.php:143 +msgid "Show active connections" +msgstr "Показать активные контакты" + +#: ../../Zotlabs/Module/Connections.php:150 +msgid "Show pending (new) connections" +msgstr "Просмотр (новых) ожидающих контактов" + +#: ../../Zotlabs/Module/Connections.php:167 msgid "Only show blocked connections" msgstr "Показать только заблокированные контакты" -#: ../../mod/connections.php:302 +#: ../../Zotlabs/Module/Connections.php:174 msgid "Only show ignored connections" msgstr "Показать только проигнорированные контакты" -#: ../../mod/connections.php:309 -msgid "Only show archived connections" -msgstr "Показать только архивированные контакты" +#: ../../Zotlabs/Module/Connections.php:181 +msgid "Only show archived/unreachable connections" +msgstr "Показать только заархивированные / недоступные контакты" -#: ../../mod/connections.php:316 +#: ../../Zotlabs/Module/Connections.php:188 msgid "Only show hidden connections" msgstr "Показать только скрытые контакты" -#: ../../mod/connections.php:323 -msgid "Only show one-way connections" -msgstr "" +#: ../../Zotlabs/Module/Connections.php:200 +#: ../../Zotlabs/Module/Profperm.php:140 +msgid "All Connections" +msgstr "Все контакты" + +#: ../../Zotlabs/Module/Connections.php:203 +msgid "Show all connections" +msgstr "Просмотр всех контактов" -#: ../../mod/connections.php:368 +#: ../../Zotlabs/Module/Connections.php:257 +msgid "Pending approval" +msgstr "Ожидающие подтверждения" + +#: ../../Zotlabs/Module/Connections.php:258 +msgid "Archived" +msgstr "Зархивирован" + +#: ../../Zotlabs/Module/Connections.php:262 +msgid "Not connected at this location" +msgstr "Не подключено в этом месте" + +#: ../../Zotlabs/Module/Connections.php:279 #, php-format msgid "%1$s [%2$s]" -msgstr "%1$s [%2$s]" +msgstr "" -#: ../../mod/connections.php:369 -msgid "Edit contact" +#: ../../Zotlabs/Module/Connections.php:280 +msgid "Edit connection" msgstr "Редактировать контакт" -#: ../../mod/connections.php:390 +#: ../../Zotlabs/Module/Connections.php:282 +msgid "Delete connection" +msgstr "Удалить контакт" + +#: ../../Zotlabs/Module/Connections.php:291 +msgid "Channel address" +msgstr "Адрес канала" + +#: ../../Zotlabs/Module/Connections.php:293 +msgid "Network" +msgstr "Сеть" + +#: ../../Zotlabs/Module/Connections.php:296 +msgid "Call" +msgstr "Вызов" + +#: ../../Zotlabs/Module/Connections.php:298 +msgid "Status" +msgstr "Статус" + +#: ../../Zotlabs/Module/Connections.php:300 +msgid "Connected" +msgstr "Подключено" + +#: ../../Zotlabs/Module/Connections.php:302 +msgid "Approve connection" +msgstr "Утвердить контакт" + +#: ../../Zotlabs/Module/Connections.php:304 +msgid "Ignore connection" +msgstr "Игнорировать контакт" + +#: ../../Zotlabs/Module/Connections.php:305 +#: ../../Zotlabs/Module/Connedit.php:630 +msgid "Ignore" +msgstr "Игнорировать" + +#: ../../Zotlabs/Module/Connections.php:306 +msgid "Recent activity" +msgstr "Последние действия" + +#: ../../Zotlabs/Module/Connections.php:336 msgid "Search your connections" -msgstr "Поиск ваших связей" +msgstr "Поиск ваших контактов" -#: ../../mod/connections.php:391 -msgid "Finding: " -msgstr "Поиск:" +#: ../../Zotlabs/Module/Connections.php:337 +msgid "Connections search" +msgstr "Поиск контаков" -#: ../../mod/rpost.php:97 ../../mod/editpost.php:42 -msgid "Edit post" -msgstr "Редактировать сообщение" +#: ../../Zotlabs/Module/Item.php:194 +msgid "Unable to locate original post." +msgstr "Не удалось найти оригинальную публикацию." -#: ../../mod/connedit.php:243 -msgid "Could not access address book record." +#: ../../Zotlabs/Module/Item.php:477 +msgid "Empty post discarded." +msgstr "Пустая публикация отклонена." + +#: ../../Zotlabs/Module/Item.php:864 +msgid "Duplicate post suppressed." +msgstr "Подавлена дублирующаяся публикация." + +#: ../../Zotlabs/Module/Item.php:1009 +msgid "System error. Post not saved." +msgstr "Системная ошибка. Публикация не сохранена." + +#: ../../Zotlabs/Module/Item.php:1045 +msgid "Your comment is awaiting approval." +msgstr "Ваш комментарий ожидает одобрения." + +#: ../../Zotlabs/Module/Item.php:1162 +msgid "Unable to obtain post information from database." +msgstr "Невозможно получить информацию о публикации из базы данных" + +#: ../../Zotlabs/Module/Item.php:1191 +#, php-format +msgid "You have reached your limit of %1$.0f top level posts." +msgstr "Вы достигли вашего ограничения в %1$.0f публикаций высокого уровня." + +#: ../../Zotlabs/Module/Item.php:1198 +#, php-format +msgid "You have reached your limit of %1$.0f webpages." +msgstr "Вы достигли вашего ограничения в %1$.0f страниц." + +#: ../../Zotlabs/Module/Events.php:25 +msgid "Calendar entries imported." +msgstr "События календаря импортированы." + +#: ../../Zotlabs/Module/Events.php:27 +msgid "No calendar entries found." +msgstr "Не найдено событий в календаре." + +#: ../../Zotlabs/Module/Events.php:110 +msgid "Event can not end before it has started." +msgstr "Событие не может завершиться до его начала." + +#: ../../Zotlabs/Module/Events.php:112 ../../Zotlabs/Module/Events.php:121 +#: ../../Zotlabs/Module/Events.php:143 +msgid "Unable to generate preview." +msgstr "Невозможно создать предварительный просмотр." + +#: ../../Zotlabs/Module/Events.php:119 +msgid "Event title and start time are required." +msgstr "Требуются наименование события и время начала." + +#: ../../Zotlabs/Module/Events.php:141 ../../Zotlabs/Module/Events.php:265 +msgid "Event not found." +msgstr "Событие не найдено." + +#: ../../Zotlabs/Module/Events.php:460 +msgid "Edit event title" +msgstr "Редактировать наименование события" + +#: ../../Zotlabs/Module/Events.php:462 +msgid "Categories (comma-separated list)" +msgstr "Категории (список через запятую)" + +#: ../../Zotlabs/Module/Events.php:463 +msgid "Edit Category" +msgstr "Редактировать категорию" + +#: ../../Zotlabs/Module/Events.php:463 +msgid "Category" +msgstr "Категория" + +#: ../../Zotlabs/Module/Events.php:466 +msgid "Edit start date and time" +msgstr "Редактировать дату и время начала" + +#: ../../Zotlabs/Module/Events.php:467 ../../Zotlabs/Module/Events.php:470 +msgid "Finish date and time are not known or not relevant" +msgstr "Дата и время окончания неизвестны или неприменимы" + +#: ../../Zotlabs/Module/Events.php:469 +msgid "Edit finish date and time" +msgstr "Редактировать дату и время окончания" + +#: ../../Zotlabs/Module/Events.php:469 +msgid "Finish date and time" +msgstr "Дата и время окончания" + +#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Events.php:472 +msgid "Adjust for viewer timezone" +msgstr "Настройте просмотр часовых поясов" + +#: ../../Zotlabs/Module/Events.php:471 +msgid "" +"Important for events that happen in a particular place. Not practical for " +"global holidays." +msgstr "Важно для событий, которые происходят в определённом месте. Не подходит для всеобщих праздников." + +#: ../../Zotlabs/Module/Events.php:473 +msgid "Edit Description" +msgstr "Редактировать описание" + +#: ../../Zotlabs/Module/Events.php:475 +msgid "Edit Location" +msgstr "Редактировать местоположение" + +#: ../../Zotlabs/Module/Events.php:489 +msgid "Timezone:" +msgstr "Часовой пояс:" + +#: ../../Zotlabs/Module/Events.php:494 +msgid "Advanced Options" +msgstr "Дополнительные настройки" + +#: ../../Zotlabs/Module/Events.php:605 ../../Zotlabs/Module/Cal.php:266 +msgid "l, F j" msgstr "" -#: ../../mod/connedit.php:257 -msgid "Refresh failed - channel is currently unavailable." +#: ../../Zotlabs/Module/Events.php:633 +msgid "Edit event" +msgstr "Редактировать событие" + +#: ../../Zotlabs/Module/Events.php:635 +msgid "Delete event" +msgstr "Удалить событие" + +#: ../../Zotlabs/Module/Events.php:669 +msgid "calendar" +msgstr "календарь" + +#: ../../Zotlabs/Module/Events.php:688 ../../Zotlabs/Module/Cal.php:338 +msgid "Edit Event" +msgstr "Редактировать событие" + +#: ../../Zotlabs/Module/Events.php:688 ../../Zotlabs/Module/Cal.php:338 +msgid "Create Event" +msgstr "Создать событие" + +#: ../../Zotlabs/Module/Events.php:731 +msgid "Event removed" +msgstr "Событие удалено" + +#: ../../Zotlabs/Module/Events.php:734 +msgid "Failed to remove event" +msgstr "Не удалось удалить событие" + +#: ../../Zotlabs/Module/Layouts.php:129 ../../Zotlabs/Module/Layouts.php:189 +#: ../../Zotlabs/Module/Editlayout.php:128 +msgid "Layout Name" +msgstr "Название шаблона" + +#: ../../Zotlabs/Module/Layouts.php:132 ../../Zotlabs/Module/Editlayout.php:129 +msgid "Layout Description (Optional)" +msgstr "Описание шаблона (необязательно)" + +#: ../../Zotlabs/Module/Layouts.php:186 +msgid "Comanche page description language help" +msgstr "Помощь по языку описания страниц Comanche " + +#: ../../Zotlabs/Module/Layouts.php:190 +msgid "Layout Description" +msgstr "Описание шаблона" + +#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:251 +#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Menu.php:177 +msgid "Created" +msgstr "Создано" + +#: ../../Zotlabs/Module/Layouts.php:192 ../../Zotlabs/Module/Webpages.php:252 +#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Menu.php:178 +msgid "Edited" +msgstr "Отредактировано" + +#: ../../Zotlabs/Module/Layouts.php:195 +msgid "Download PDL file" +msgstr "Загрузить PDL файл" + +#: ../../Zotlabs/Module/Notifications.php:55 ../../Zotlabs/Module/Notify.php:61 +msgid "No more system notifications." +msgstr "Нет новых оповещений системы." + +#: ../../Zotlabs/Module/Notifications.php:59 ../../Zotlabs/Module/Notify.php:65 +msgid "System Notifications" +msgstr "Системные оповещения " + +#: ../../Zotlabs/Module/Pdledit.php:21 +msgid "Layout updated." +msgstr "Шаблон обновлен." + +#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:219 +msgid "Feature disabled." +msgstr "Функция отключена." + +#: ../../Zotlabs/Module/Pdledit.php:47 ../../Zotlabs/Module/Pdledit.php:90 +msgid "Edit System Page Description" +msgstr "Редактировать описание системной страницы" + +#: ../../Zotlabs/Module/Pdledit.php:68 +msgid "(modified)" +msgstr "(изменено)" + +#: ../../Zotlabs/Module/Pdledit.php:68 ../../Zotlabs/Module/Lostpass.php:133 +msgid "Reset" +msgstr "Сбросить" + +#: ../../Zotlabs/Module/Pdledit.php:85 +msgid "Layout not found." +msgstr "Шаблон не найден." + +#: ../../Zotlabs/Module/Pdledit.php:91 +msgid "Module Name:" +msgstr "Имя модуля:" + +#: ../../Zotlabs/Module/Pdledit.php:92 +msgid "Layout Help" +msgstr "Помощь к шаблону" + +#: ../../Zotlabs/Module/Pdledit.php:93 +msgid "Edit another layout" +msgstr "Редактировать другой шаблон" + +#: ../../Zotlabs/Module/Pdledit.php:94 +msgid "System layout" +msgstr "Системный шаблон" + +#: ../../Zotlabs/Module/Mail.php:73 +msgid "Unable to lookup recipient." +msgstr "Не удалось найти получателя." + +#: ../../Zotlabs/Module/Mail.php:80 +msgid "Unable to communicate with requested channel." +msgstr "Не удалось установить связь с запрашиваемым каналом." + +#: ../../Zotlabs/Module/Mail.php:87 +msgid "Cannot verify requested channel." +msgstr "Не удалось установить подлинность требуемого канала." + +#: ../../Zotlabs/Module/Mail.php:105 +msgid "Selected channel has private message restrictions. Send failed." +msgstr "Выбранный канал ограничивает частные сообщения. Отправка не удалась." + +#: ../../Zotlabs/Module/Mail.php:160 +msgid "Messages" +msgstr "Сообщения" + +#: ../../Zotlabs/Module/Mail.php:173 +msgid "message" +msgstr "сообщение" + +#: ../../Zotlabs/Module/Mail.php:214 +msgid "Message recalled." +msgstr "Сообщение отозванно." + +#: ../../Zotlabs/Module/Mail.php:227 +msgid "Conversation removed." +msgstr "Разговор удален." + +#: ../../Zotlabs/Module/Mail.php:242 ../../Zotlabs/Module/Mail.php:363 +msgid "Expires YYYY-MM-DD HH:MM" +msgstr "Истекает YYYY-MM-DD HH:MM" + +#: ../../Zotlabs/Module/Mail.php:270 +msgid "Requested channel is not in this network" +msgstr "Запрашиваемый канал не доступен." + +#: ../../Zotlabs/Module/Mail.php:278 +msgid "Send Private Message" +msgstr "Отправить личное сообщение" + +#: ../../Zotlabs/Module/Mail.php:279 ../../Zotlabs/Module/Mail.php:421 +msgid "To:" +msgstr "Кому:" + +#: ../../Zotlabs/Module/Mail.php:282 ../../Zotlabs/Module/Mail.php:423 +msgid "Subject:" +msgstr "Тема:" + +#: ../../Zotlabs/Module/Mail.php:285 ../../Zotlabs/Module/Invite.php:140 +msgid "Your message:" +msgstr "Сообщение:" + +#: ../../Zotlabs/Module/Mail.php:287 ../../Zotlabs/Module/Mail.php:429 +msgid "Attach file" +msgstr "Прикрепить файл" + +#: ../../Zotlabs/Module/Mail.php:289 +msgid "Send" +msgstr "Отправить" + +#: ../../Zotlabs/Module/Mail.php:393 +msgid "Delete message" +msgstr "Удалить сообщение" + +#: ../../Zotlabs/Module/Mail.php:394 +msgid "Delivery report" +msgstr "Отчёт о доставке" + +#: ../../Zotlabs/Module/Mail.php:395 +msgid "Recall message" +msgstr "Отозвать сообщение" + +#: ../../Zotlabs/Module/Mail.php:397 +msgid "Message has been recalled." +msgstr "Сообщение отозванно" + +#: ../../Zotlabs/Module/Mail.php:414 +msgid "Delete Conversation" +msgstr "Удалить разговор" + +#: ../../Zotlabs/Module/Mail.php:416 +msgid "" +"No secure communications available. You <strong>may</strong> be able to " +"respond from the sender's profile page." +msgstr "Безопасная связь недоступна. Вы <strong>можете</strong> попытаться ответить со страницы профиля отправителя." + +#: ../../Zotlabs/Module/Mail.php:420 +msgid "Send Reply" +msgstr "Отправить ответ" + +#: ../../Zotlabs/Module/Mail.php:425 +#, php-format +msgid "Your message for %s (%s):" +msgstr "Ваше сообщение для %s (%s):" + +#: ../../Zotlabs/Module/Removeme.php:35 +msgid "" +"Channel removals are not allowed within 48 hours of changing the account " +"password." +msgstr "Удаление канала не разрешается в течении 48 часов после смены пароля у аккаунта." + +#: ../../Zotlabs/Module/Removeme.php:60 +msgid "Remove This Channel" +msgstr "Удалить этот канал" + +#: ../../Zotlabs/Module/Removeme.php:61 +#: ../../Zotlabs/Module/Removeaccount.php:58 +#: ../../Zotlabs/Module/Changeaddr.php:78 +msgid "WARNING: " +msgstr "ПРЕДУПРЕЖДЕНИЕ:" + +#: ../../Zotlabs/Module/Removeme.php:61 +msgid "This channel will be completely removed from the network. " +msgstr "Этот канал будет полностью удалён из сети." + +#: ../../Zotlabs/Module/Removeme.php:61 +#: ../../Zotlabs/Module/Removeaccount.php:58 +msgid "This action is permanent and can not be undone!" +msgstr "Это действие необратимо и не может быть отменено!" + +#: ../../Zotlabs/Module/Removeme.php:62 +#: ../../Zotlabs/Module/Removeaccount.php:59 +#: ../../Zotlabs/Module/Changeaddr.php:79 +msgid "Please enter your password for verification:" +msgstr "Пожалуйста, введите ваш пароль для проверки:" + +#: ../../Zotlabs/Module/Removeme.php:63 +msgid "Remove this channel and all its clones from the network" +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" +msgstr "По умолчанию только представление канала расположенное на данном хабе будет удалено из сети" + +#: ../../Zotlabs/Module/Removeme.php:64 +#: ../../Zotlabs/Module/Settings/Channel.php:622 +msgid "Remove Channel" +msgstr "Удаление канала" + +#: ../../Zotlabs/Module/Hq.php:134 ../../Zotlabs/Module/Channel.php:164 +#: ../../Zotlabs/Module/Pubstream.php:80 ../../Zotlabs/Module/Network.php:204 +#: ../../Zotlabs/Module/Display.php:81 +msgid "Reset form" +msgstr "Очистить форму" + +#: ../../Zotlabs/Module/Hq.php:140 +msgid "Welcome to Hubzilla!" +msgstr "Добро пожаловать в Hubzilla!" + +#: ../../Zotlabs/Module/Hq.php:140 +msgid "You have got no unseen posts..." +msgstr "У вас нет видимых публикаций..." + +#: ../../Zotlabs/Module/Card_edit.php:17 ../../Zotlabs/Module/Card_edit.php:33 +#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95 +#: ../../Zotlabs/Module/Editpost.php:24 ../../Zotlabs/Module/Editwebpage.php:80 +#: ../../Zotlabs/Module/Editlayout.php:79 +#: ../../Zotlabs/Module/Article_edit.php:17 +#: ../../Zotlabs/Module/Article_edit.php:33 +msgid "Item not found" +msgstr "Элемент не найден" + +#: ../../Zotlabs/Module/Card_edit.php:44 ../../Zotlabs/Module/Block.php:41 +#: ../../Zotlabs/Module/Page.php:75 ../../Zotlabs/Module/Cal.php:62 +#: ../../Zotlabs/Module/Wall_upload.php:31 +#: ../../Zotlabs/Module/Article_edit.php:44 +#: ../../Zotlabs/Module/Chanview.php:96 +msgid "Channel not found." +msgstr "Канал не найден." + +#: ../../Zotlabs/Module/Card_edit.php:128 +msgid "Edit Card" +msgstr "Редактировать карточку" + +#: ../../Zotlabs/Module/Xchan.php:10 +msgid "Xchan Lookup" +msgstr "Поиск Xchan" + +#: ../../Zotlabs/Module/Xchan.php:13 +msgid "Lookup xchan beginning with (or webbie): " +msgstr "Запрос Xchan начинается с (или webbie):" + +#: ../../Zotlabs/Module/Xchan.php:41 ../../Zotlabs/Module/Mitem.php:134 +#: ../../Zotlabs/Module/Menu.php:231 +msgid "Not found." +msgstr "Не найдено." + +#: ../../Zotlabs/Module/Suggest.php:39 +msgid "" +"No suggestions available. If this is a new site, please try again in 24 " +"hours." +msgstr "Нет предложений. Если это новый сайт, повторите попытку через 24 часа." + +#: ../../Zotlabs/Module/Channel.php:50 ../../Zotlabs/Module/Hcard.php:37 +#: ../../Zotlabs/Module/Profile.php:45 +msgid "Posts and comments" +msgstr "Публикации и комментарии" + +#: ../../Zotlabs/Module/Channel.php:57 ../../Zotlabs/Module/Hcard.php:44 +#: ../../Zotlabs/Module/Profile.php:52 +msgid "Only posts" +msgstr "Только публикации" + +#: ../../Zotlabs/Module/Channel.php:112 +msgid "Insufficient permissions. Request redirected to profile page." +msgstr "Недостаточно прав. Запрос перенаправлен на страницу профиля." + +#: ../../Zotlabs/Module/Channel.php:129 ../../Zotlabs/Module/Network.php:174 +msgid "Search Results For:" +msgstr "Результаты поиска для:" + +#: ../../Zotlabs/Module/Help.php:23 +msgid "Documentation Search" +msgstr "Поиск документации" + +#: ../../Zotlabs/Module/Help.php:81 ../../Zotlabs/Module/Group.php:126 +msgid "Members" +msgstr "Участники" + +#: ../../Zotlabs/Module/Help.php:82 +msgid "Administrators" +msgstr "Администраторы" + +#: ../../Zotlabs/Module/Help.php:83 +msgid "Developers" +msgstr "Разработчики" + +#: ../../Zotlabs/Module/Help.php:84 +msgid "Tutorials" +msgstr "Руководства" + +#: ../../Zotlabs/Module/Help.php:95 +msgid "$Projectname Documentation" +msgstr "$Projectname Документация" + +#: ../../Zotlabs/Module/Help.php:96 +msgid "Contents" +msgstr "Содержимое" + +#: ../../Zotlabs/Module/Regdir.php:49 ../../Zotlabs/Module/Dirsearch.php:25 +msgid "This site is not a directory server" +msgstr "Этот сайт не является сервером каталога" + +#: ../../Zotlabs/Module/Uexport.php:57 ../../Zotlabs/Module/Uexport.php:58 +msgid "Export Channel" +msgstr "Экспорт канала" + +#: ../../Zotlabs/Module/Uexport.php:59 +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 "Экспортировать основную информацию из канала в файл. Служит в качестве резервной копии ваших контактов, основных данных и профиля, однако не включает содержимое. Может быть использовано для импорта ваши данных на новый сервер." + +#: ../../Zotlabs/Module/Uexport.php:60 +msgid "Export Content" +msgstr "Экспортировать содержимое" + +#: ../../Zotlabs/Module/Uexport.php:61 +msgid "" +"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." +msgstr "Экспортировать информацию из вашего канала и его содержимое в резервную копию в формате JSON которая может быть использована для восстановления или импорта на другом сервере. Сохраняет все ваши контакты, разрешения, данные профиля и публикации за несколько месяцев. Файл может иметь очень большой размер. Пожалуйста, будьте терпеливы и подождите несколько минут пока не начнётся загрузка." + +#: ../../Zotlabs/Module/Uexport.php:63 +msgid "Export your posts from a given year." +msgstr "Экспортировать ваши публикации за данный год." + +#: ../../Zotlabs/Module/Uexport.php:65 +msgid "" +"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." +msgstr "Вы также можете экспортировать ваши публикации и беседы за определённый месяц или год. Выберите дату в панели местоположения в браузере. Если экспорт будет неудачным (это возможно, например, из-за исчерпания памяти на сервере), повторите попытку, выбрав меньший диапазон дат." + +#: ../../Zotlabs/Module/Uexport.php:66 +#, php-format +msgid "" +"To select all posts for a given year, such as this year, visit <a href=\"%1$s" +"\">%2$s</a>" +msgstr "Для выбора всех публикаций заданного года, например текущего, посетите <a href=\"%1$s\">%2$s</a>" + +#: ../../Zotlabs/Module/Uexport.php:67 +#, php-format +msgid "" +"To select all posts for a given month, such as January of this year, visit " +"<a href=\"%1$s\">%2$s</a>" +msgstr "Для выбора всех публикаций заданного месяца, например за январь сего года, посетите <a href=\"%1$s\">%2$s</a>" + +#: ../../Zotlabs/Module/Uexport.php:68 +#, 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 "" +"Данные файлы с содержимым могут быть импортированы и восстановлены на любом " +"содержащем ваш канал сайте. Посетите <a href=\"%1$s\">%2$s</a>. Для лучших " +"результатов пожалуйста производите импорт и восстановление в порядке датировки " +"(старые сначала)." -#: ../../mod/connedit.php:264 -msgid "Channel has been unblocked" -msgstr "Канал разблокирован" +#: ../../Zotlabs/Module/Chatsvc.php:131 +msgid "Away" +msgstr "Нет на месте" -#: ../../mod/connedit.php:265 -msgid "Channel has been blocked" -msgstr "Канал заблокирован" +#: ../../Zotlabs/Module/Chatsvc.php:136 +msgid "Online" +msgstr "В сети" -#: ../../mod/connedit.php:269 ../../mod/connedit.php:281 -#: ../../mod/connedit.php:293 ../../mod/connedit.php:305 -#: ../../mod/connedit.php:320 -msgid "Unable to set address book parameters." +#: ../../Zotlabs/Module/Block.php:29 ../../Zotlabs/Module/Page.php:39 +msgid "Invalid item." +msgstr "Недействительный элемент." + +#: ../../Zotlabs/Module/Api.php:74 ../../Zotlabs/Module/Api.php:95 +msgid "Authorize application connection" +msgstr "Авторизовать подключение приложения" + +#: ../../Zotlabs/Module/Api.php:75 +msgid "Return to your app and insert this Security Code:" +msgstr "Вернитесь к своему приложению и вставьте этот код безопасности:" + +#: ../../Zotlabs/Module/Api.php:85 +msgid "Please login to continue." +msgstr "Пожалуйста, войдите, чтобы продолжить." + +#: ../../Zotlabs/Module/Api.php:97 +msgid "" +"Do you want to authorize this application to access your posts and contacts, " +"and/or create new posts for you?" +msgstr "Вы хотите авторизовать это приложение для доступа к вашим публикациям и контактам и / или созданию новых публикаций?" + +#: ../../Zotlabs/Module/Viewsrc.php:43 +msgid "item" +msgstr "пункт" + +#: ../../Zotlabs/Module/Ratings.php:70 +msgid "No ratings" +msgstr "Оценок нет" + +#: ../../Zotlabs/Module/Ratings.php:98 +msgid "Rating: " +msgstr "Оценкa:" + +#: ../../Zotlabs/Module/Ratings.php:99 +msgid "Website: " +msgstr "Веб-сайт:" + +#: ../../Zotlabs/Module/Ratings.php:101 +msgid "Description: " +msgstr "Описание:" + +#: ../../Zotlabs/Module/Sources.php:38 +msgid "Failed to create source. No channel selected." +msgstr "Не удалось создать источник. Канал не выбран." + +#: ../../Zotlabs/Module/Sources.php:54 +msgid "Source created." +msgstr "Источник создан." + +#: ../../Zotlabs/Module/Sources.php:67 +msgid "Source updated." +msgstr "Источник обновлен." + +#: ../../Zotlabs/Module/Sources.php:93 +msgid "*" msgstr "" -#: ../../mod/connedit.php:276 -msgid "Channel has been unignored" -msgstr "Канал не проигнорирован" +#: ../../Zotlabs/Module/Sources.php:100 +msgid "Manage remote sources of content for your channel." +msgstr "Управлять удалённым источниками содержимого для вашего канала" + +#: ../../Zotlabs/Module/Sources.php:101 ../../Zotlabs/Module/Sources.php:111 +msgid "New Source" +msgstr "Новый источник" + +#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:146 +msgid "" +"Import all or selected content from the following channel into this channel " +"and distribute it according to your channel settings." +msgstr "Импортировать всё или выбранное содержимое из следующего канала в этот канал и распределить его в соответствии с вашими настройками." + +#: ../../Zotlabs/Module/Sources.php:113 ../../Zotlabs/Module/Sources.php:147 +msgid "Only import content with these words (one per line)" +msgstr "Импортировать содержимое только с этим текстом (построчно)" + +#: ../../Zotlabs/Module/Sources.php:113 ../../Zotlabs/Module/Sources.php:147 +msgid "Leave blank to import all public content" +msgstr "Оставьте пустым для импорта всего общедоступного содержимого" + +#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:153 +msgid "Channel Name" +msgstr "Название канала" + +#: ../../Zotlabs/Module/Sources.php:115 ../../Zotlabs/Module/Sources.php:150 +msgid "" +"Add the following categories to posts imported from this source (comma " +"separated)" +msgstr "Добавить следующие категории к импортированным публикациям из этого источника (через запятые)" + +#: ../../Zotlabs/Module/Sources.php:115 ../../Zotlabs/Module/Sources.php:150 +#: ../../Zotlabs/Module/Settings/Oauth.php:94 +msgid "Optional" +msgstr "Необязательно" + +#: ../../Zotlabs/Module/Sources.php:116 ../../Zotlabs/Module/Sources.php:151 +msgid "Resend posts with this channel as author" +msgstr "Отправить публикации в этот канал повторно как автор" + +#: ../../Zotlabs/Module/Sources.php:116 ../../Zotlabs/Module/Sources.php:151 +msgid "Copyrights may apply" +msgstr "Могут применяться авторские права" + +#: ../../Zotlabs/Module/Sources.php:136 ../../Zotlabs/Module/Sources.php:166 +msgid "Source not found." +msgstr "Источник не найден." + +#: ../../Zotlabs/Module/Sources.php:143 +msgid "Edit Source" +msgstr "Редактировать источник" + +#: ../../Zotlabs/Module/Sources.php:144 +msgid "Delete Source" +msgstr "Удалить источник" + +#: ../../Zotlabs/Module/Sources.php:174 +msgid "Source removed" +msgstr "Источник удален" + +#: ../../Zotlabs/Module/Sources.php:176 +msgid "Unable to remove source." +msgstr "Невозможно удалить источник." + +#: ../../Zotlabs/Module/Siteinfo.php:21 +msgid "About this site" +msgstr "Об этом сайте" + +#: ../../Zotlabs/Module/Siteinfo.php:22 +msgid "Site Name" +msgstr "Название сайта" + +#: ../../Zotlabs/Module/Siteinfo.php:24 ../../Zotlabs/Module/Admin/Site.php:325 +msgid "Site Information" +msgstr "Информация о сайте" + +#: ../../Zotlabs/Module/Siteinfo.php:26 +msgid "Administrator" +msgstr "Администратор" + +#: ../../Zotlabs/Module/Siteinfo.php:28 ../../Zotlabs/Module/Register.php:241 +msgid "Terms of Service" +msgstr "Условия предоставления услуг" + +#: ../../Zotlabs/Module/Siteinfo.php:29 +msgid "Software and Project information" +msgstr "Информация о программном обеспечении и проекте" + +#: ../../Zotlabs/Module/Siteinfo.php:30 +msgid "This site is powered by $Projectname" +msgstr "Этот сайт работает на $Projectname" + +#: ../../Zotlabs/Module/Siteinfo.php:31 +msgid "" +"Federated and decentralised networking and identity services provided by Zot" +msgstr "Объединенные и децентрализованные сети и службы идентификациии обеспечиваются Zot" + +#: ../../Zotlabs/Module/Siteinfo.php:34 +msgid "Additional federated transport protocols:" +msgstr "Дополнительные федеративные транспортные протоколы:" + +#: ../../Zotlabs/Module/Siteinfo.php:36 +#, php-format +msgid "Version %s" +msgstr "Версия %s" + +#: ../../Zotlabs/Module/Siteinfo.php:37 +msgid "Project homepage" +msgstr "Домашняя страница проекта" + +#: ../../Zotlabs/Module/Siteinfo.php:38 +msgid "Developer homepage" +msgstr "Домашняя страница разработчика" + +#: ../../Zotlabs/Module/Profile_photo.php:66 +#: ../../Zotlabs/Module/Cover_photo.php:57 +msgid "Image uploaded but image cropping failed." +msgstr "Изображение загружено но обрезка не удалась." + +#: ../../Zotlabs/Module/Profile_photo.php:142 +#: ../../Zotlabs/Module/Cover_photo.php:191 +msgid "Image resize failed." +msgstr "Не удалось изменить размер изображения." + +#: ../../Zotlabs/Module/Profile_photo.php:260 +#: ../../Zotlabs/Module/Cover_photo.php:229 +msgid "Image upload failed." +msgstr "Загрузка изображения не удалась." + +#: ../../Zotlabs/Module/Profile_photo.php:279 +#: ../../Zotlabs/Module/Cover_photo.php:246 +msgid "Unable to process image." +msgstr "Невозможно обработать изображение." + +#: ../../Zotlabs/Module/Profile_photo.php:343 +#: ../../Zotlabs/Module/Profile_photo.php:390 +#: ../../Zotlabs/Module/Cover_photo.php:339 +#: ../../Zotlabs/Module/Cover_photo.php:354 +msgid "Photo not available." +msgstr "Фотография недоступна." + +#: ../../Zotlabs/Module/Profile_photo.php:454 +msgid "" +"Your default profile photo is visible to anybody on the internet. Profile " +"photos for alternate profiles will inherit the permissions of the profile" +msgstr "Фотография вашего профиля по умолчанию видна всем в Интернете. Фотографияпрофиля для альтернативных профилей наследуют разрешения текущего профиля" + +#: ../../Zotlabs/Module/Profile_photo.php:454 +msgid "" +"Your profile photo is visible to anybody on the internet and may be " +"distributed to other websites." +msgstr "Фотография вашего профиля видна всем в Интернете и может быть отправлена на другие сайты." + +#: ../../Zotlabs/Module/Profile_photo.php:456 +#: ../../Zotlabs/Module/Cover_photo.php:392 +msgid "Upload File:" +msgstr "Загрузить файл:" + +#: ../../Zotlabs/Module/Profile_photo.php:457 +#: ../../Zotlabs/Module/Cover_photo.php:393 +msgid "Select a profile:" +msgstr "Выбрать профиль:" + +#: ../../Zotlabs/Module/Profile_photo.php:458 +msgid "Use Photo for Profile" +msgstr "Использовать фотографию для профиля" + +#: ../../Zotlabs/Module/Profile_photo.php:458 +msgid "Change Profile Photo" +msgstr "Изменить фотографию профиля" + +#: ../../Zotlabs/Module/Profile_photo.php:459 +msgid "Use" +msgstr "Использовать" + +#: ../../Zotlabs/Module/Profile_photo.php:463 +#: ../../Zotlabs/Module/Profile_photo.php:464 +#: ../../Zotlabs/Module/Cover_photo.php:397 +#: ../../Zotlabs/Module/Cover_photo.php:398 +msgid "Use a photo from your albums" +msgstr "Использовать фотографию из ваших альбомов" + +#: ../../Zotlabs/Module/Profile_photo.php:469 +#: ../../Zotlabs/Module/Cover_photo.php:403 ../../Zotlabs/Module/Wiki.php:383 +msgid "Choose a different album" +msgstr "Выбрать другой альбом" + +#: ../../Zotlabs/Module/Profile_photo.php:474 +#: ../../Zotlabs/Module/Cover_photo.php:409 +msgid "Select existing photo" +msgstr "Выбрать существующую фотографию" + +#: ../../Zotlabs/Module/Profile_photo.php:493 +#: ../../Zotlabs/Module/Cover_photo.php:426 +msgid "Crop Image" +msgstr "Обрезать изображение" + +#: ../../Zotlabs/Module/Profile_photo.php:494 +#: ../../Zotlabs/Module/Cover_photo.php:427 +msgid "Please adjust the image cropping for optimum viewing." +msgstr "Пожалуйста настройте обрезку изображения для оптимального просмотра." + +#: ../../Zotlabs/Module/Profile_photo.php:496 +#: ../../Zotlabs/Module/Cover_photo.php:429 +msgid "Done Editing" +msgstr "Закончить редактирование" + +#: ../../Zotlabs/Module/Subthread.php:142 +#, php-format +msgid "%1$s is following %2$s's %3$s" +msgstr "%1$s отслеживает %2$s's %3$s" + +#: ../../Zotlabs/Module/Subthread.php:144 +#, php-format +msgid "%1$s stopped following %2$s's %3$s" +msgstr "%1$s прекратил отслеживать %2$s's %3$s" + +#: ../../Zotlabs/Module/Common.php:14 +msgid "No channel." +msgstr "Канала нет." + +#: ../../Zotlabs/Module/Common.php:45 +msgid "No connections in common." +msgstr "Общих контактов нет." + +#: ../../Zotlabs/Module/Common.php:65 +msgid "View Common Connections" +msgstr "Просмотр общий контактов" + +#: ../../Zotlabs/Module/Filestorage.php:79 +msgid "Permission Denied." +msgstr "Доступ запрещен." + +#: ../../Zotlabs/Module/Filestorage.php:112 +msgid "File not found." +msgstr "Файл не найден." + +#: ../../Zotlabs/Module/Filestorage.php:165 +msgid "Edit file permissions" +msgstr "Редактировать разрешения файла" + +#: ../../Zotlabs/Module/Filestorage.php:177 +msgid "Set/edit permissions" +msgstr "Редактировать разрешения" + +#: ../../Zotlabs/Module/Filestorage.php:178 +msgid "Include all files and sub folders" +msgstr "Включить все файлы и подкаталоги" + +#: ../../Zotlabs/Module/Filestorage.php:179 +msgid "Return to file list" +msgstr "Вернутся к списку файлов" + +#: ../../Zotlabs/Module/Filestorage.php:181 +msgid "Copy/paste this code to attach file to a post" +msgstr "Копировать / вставить этот код для прикрепления файла к публикации" + +#: ../../Zotlabs/Module/Filestorage.php:182 +msgid "Copy/paste this URL to link file from a web page" +msgstr "Копировать / вставить эту URL для ссылки на файл со страницы" + +#: ../../Zotlabs/Module/Filestorage.php:184 +msgid "Share this file" +msgstr "Поделиться этим файлом" -#: ../../mod/connedit.php:277 -msgid "Channel has been ignored" -msgstr "Канал проигнорирован" +#: ../../Zotlabs/Module/Filestorage.php:185 +msgid "Show URL to this file" +msgstr "Показать URL этого файла" -#: ../../mod/connedit.php:288 -msgid "Channel has been unarchived" -msgstr "Канал разархивирован" +#: ../../Zotlabs/Module/Filestorage.php:186 +#: ../../Zotlabs/Storage/Browser.php:405 +msgid "Show in your contacts shared folder" +msgstr "Показать общий каталог в ваших контактах" -#: ../../mod/connedit.php:289 -msgid "Channel has been archived" -msgstr "Канал заархивирован" +#: ../../Zotlabs/Module/Tagger.php:48 +msgid "Post not found." +msgstr "Публикация не найдена" -#: ../../mod/connedit.php:300 -msgid "Channel has been unhidden" -msgstr "Канал открыт" +#: ../../Zotlabs/Module/Tagger.php:119 +#, php-format +msgid "%1$s tagged %2$s's %3$s with %4$s" +msgstr "%1$s отметил тегом %2$s %3$s с %4$s" -#: ../../mod/connedit.php:301 -msgid "Channel has been hidden" -msgstr "Канал скрыт" +#: ../../Zotlabs/Module/Page.php:173 +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/Editblock.php:113 ../../Zotlabs/Module/Blocks.php:97 +#: ../../Zotlabs/Module/Blocks.php:155 +msgid "Block Name" +msgstr "Название блока" + +#: ../../Zotlabs/Module/Editblock.php:138 +msgid "Edit Block" +msgstr "Редактировать блок" + +#: ../../Zotlabs/Module/Editpost.php:38 ../../Zotlabs/Module/Editpost.php:43 +msgid "Item is not editable" +msgstr "Элемент нельзя редактировать" + +#: ../../Zotlabs/Module/Editpost.php:108 ../../Zotlabs/Module/Rpost.php:144 +msgid "Edit post" +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/Removeaccount.php:35 +msgid "" +"Account removals are not allowed within 48 hours of changing the account " +"password." +msgstr "Удаление канала не разрешается в течении 48 часов после смены пароля у аккаунта." + +#: ../../Zotlabs/Module/Removeaccount.php:57 +msgid "Remove This Account" +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:60 +msgid "" +"Remove this account, all its channels and all its channel clones from the " +"network" +msgstr "Удалить этот аккаунт, все его каналы и их клоны из сети." + +#: ../../Zotlabs/Module/Removeaccount.php:60 +msgid "" +"By default only the instances of the channels located on this hub will be " +"removed from the network" +msgstr "По умолчанию только представление канала расположенное на данном хабе будет удалено из сети" + +#: ../../Zotlabs/Module/Removeaccount.php:61 +#: ../../Zotlabs/Module/Settings/Account.php:120 +msgid "Remove Account" +msgstr "Удалить аккаунт" + +#: ../../Zotlabs/Module/Admin.php:97 +msgid "Blocked accounts" +msgstr "Заблокированные аккаунты" + +#: ../../Zotlabs/Module/Admin.php:98 +msgid "Expired accounts" +msgstr "Просроченные аккаунты" + +#: ../../Zotlabs/Module/Admin.php:99 +msgid "Expiring accounts" +msgstr "Близкие к просрочке аккаунты" + +#: ../../Zotlabs/Module/Admin.php:115 ../../Zotlabs/Module/Locs.php:119 +msgid "Primary" +msgstr "Основной" + +#: ../../Zotlabs/Module/Admin.php:116 +msgid "Clones" +msgstr "Клоны" + +#: ../../Zotlabs/Module/Admin.php:122 +msgid "Message queues" +msgstr "Очередь сообщений" + +#: ../../Zotlabs/Module/Admin.php:136 +msgid "Your software should be updated" +msgstr "Ваше программное обеспечение должно быть обновлено" + +#: ../../Zotlabs/Module/Admin.php:140 ../../Zotlabs/Module/Admin/Addons.php:341 +#: ../../Zotlabs/Module/Admin/Addons.php:436 +#: ../../Zotlabs/Module/Admin/Site.php:307 +#: ../../Zotlabs/Module/Admin/Logs.php:82 +#: ../../Zotlabs/Module/Admin/Accounts.php:166 +#: ../../Zotlabs/Module/Admin/Security.php:92 +#: ../../Zotlabs/Module/Admin/Themes.php:122 +#: ../../Zotlabs/Module/Admin/Themes.php:156 +#: ../../Zotlabs/Module/Admin/Channels.php:145 +msgid "Administration" +msgstr "Администрирование" + +#: ../../Zotlabs/Module/Admin.php:141 +msgid "Summary" +msgstr "Резюме" + +#: ../../Zotlabs/Module/Admin.php:144 +msgid "Registered accounts" +msgstr "Зарегистрированные аккаунты" + +#: ../../Zotlabs/Module/Admin.php:145 +msgid "Pending registrations" +msgstr "Ждут утверждения" + +#: ../../Zotlabs/Module/Admin.php:146 +msgid "Registered channels" +msgstr "Зарегистрированные каналы" + +#: ../../Zotlabs/Module/Admin.php:147 +msgid "Active addons" +msgstr "Активные расширения" + +#: ../../Zotlabs/Module/Admin.php:148 +msgid "Version" +msgstr "Версия системы" -#: ../../mod/connedit.php:315 -msgid "Channel has been approved" -msgstr "Канал одобрен" +#: ../../Zotlabs/Module/Admin.php:149 +msgid "Repository version (master)" +msgstr "Версия репозитория (master)" -#: ../../mod/connedit.php:316 -msgid "Channel has been unapproved" -msgstr "Канал не одобрен" +#: ../../Zotlabs/Module/Admin.php:150 +msgid "Repository version (dev)" +msgstr "Версия репозитория (dev)" -#: ../../mod/connedit.php:334 +#: ../../Zotlabs/Module/Connedit.php:79 ../../Zotlabs/Module/Defperms.php:59 +msgid "Could not access contact record." +msgstr "Не удалось получить доступ к записи контакта." + +#: ../../Zotlabs/Module/Connedit.php:109 +msgid "Could not locate selected profile." +msgstr "Не удалось обнаружить выбранный профиль." + +#: ../../Zotlabs/Module/Connedit.php:246 +msgid "Connection updated." +msgstr "Контакты обновлены." + +#: ../../Zotlabs/Module/Connedit.php:248 +msgid "Failed to update connection record." +msgstr "Не удалось обновить запись контакта." + +#: ../../Zotlabs/Module/Connedit.php:302 +msgid "is now connected to" +msgstr "теперь подключён к" + +#: ../../Zotlabs/Module/Connedit.php:427 +msgid "Could not access address book record." +msgstr "Не удалось получить доступ к записи адресной книги." + +#: ../../Zotlabs/Module/Connedit.php:475 +msgid "Refresh failed - channel is currently unavailable." +msgstr "Обновление невозможно - в настоящее время канал недоступен." + +#: ../../Zotlabs/Module/Connedit.php:490 ../../Zotlabs/Module/Connedit.php:499 +#: ../../Zotlabs/Module/Connedit.php:508 ../../Zotlabs/Module/Connedit.php:517 +#: ../../Zotlabs/Module/Connedit.php:530 +msgid "Unable to set address book parameters." +msgstr "Не удалось получить доступ к параметрам адресной книги." + +#: ../../Zotlabs/Module/Connedit.php:554 msgid "Connection has been removed." -msgstr "Соединение было удалено." +msgstr "Контакт был удалён." -#: ../../mod/connedit.php:354 +#: ../../Zotlabs/Module/Connedit.php:597 #, php-format msgid "View %s's profile" -msgstr "Просмотр %s's профиля" +msgstr "Просмотр %s профиля" -#: ../../mod/connedit.php:358 +#: ../../Zotlabs/Module/Connedit.php:601 msgid "Refresh Permissions" msgstr "Обновить разрешения" -#: ../../mod/connedit.php:361 +#: ../../Zotlabs/Module/Connedit.php:604 msgid "Fetch updated permissions" -msgstr "" +msgstr "Получить обновлённые разрешения" -#: ../../mod/connedit.php:365 -msgid "Recent Activity" -msgstr "" +#: ../../Zotlabs/Module/Connedit.php:608 +msgid "Refresh Photo" +msgstr "Обновить фотографию" + +#: ../../Zotlabs/Module/Connedit.php:611 +msgid "Fetch updated photo" +msgstr "Получить обновлённую фотографию" -#: ../../mod/connedit.php:368 +#: ../../Zotlabs/Module/Connedit.php:618 msgid "View recent posts and comments" -msgstr "" +msgstr "Просмотреть последние публикации и комментарии" -#: ../../mod/connedit.php:372 ../../mod/connedit.php:515 -#: ../../mod/admin.php:760 +#: ../../Zotlabs/Module/Connedit.php:622 +#: ../../Zotlabs/Module/Admin/Accounts.php:177 msgid "Unblock" -msgstr "Разрешить" +msgstr "Разблокировать" -#: ../../mod/connedit.php:372 ../../mod/connedit.php:515 -#: ../../mod/admin.php:759 +#: ../../Zotlabs/Module/Connedit.php:622 +#: ../../Zotlabs/Module/Admin/Accounts.php:176 msgid "Block" -msgstr "Заблокировать" +msgstr "Блокировать" + +#: ../../Zotlabs/Module/Connedit.php:625 +msgid "Block (or Unblock) all communications with this connection" +msgstr "Блокировать (или разблокировать) связи с этим контактом" -#: ../../mod/connedit.php:375 -msgid "Block or Unblock this connection" -msgstr "Запретить или разрешить этот канал" +#: ../../Zotlabs/Module/Connedit.php:626 +msgid "This connection is blocked!" +msgstr "Этот контакт заблокирован!" -#: ../../mod/connedit.php:379 ../../mod/connedit.php:516 +#: ../../Zotlabs/Module/Connedit.php:630 msgid "Unignore" msgstr "Не игнорировать" -#: ../../mod/connedit.php:379 ../../mod/connedit.php:516 -#: ../../mod/notifications.php:51 -msgid "Ignore" -msgstr "Игнорировать" +#: ../../Zotlabs/Module/Connedit.php:633 +msgid "Ignore (or Unignore) all inbound communications from this connection" +msgstr "Игнорировать (или не игнорировать) все связи для этого контакта" -#: ../../mod/connedit.php:382 -msgid "Ignore or Unignore this connection" -msgstr "Игнорировать или не игнорировать этот канал" +#: ../../Zotlabs/Module/Connedit.php:634 +msgid "This connection is ignored!" +msgstr "Этот контакт игнорируется!" -#: ../../mod/connedit.php:385 +#: ../../Zotlabs/Module/Connedit.php:638 msgid "Unarchive" msgstr "Разархивировать" -#: ../../mod/connedit.php:385 +#: ../../Zotlabs/Module/Connedit.php:638 msgid "Archive" msgstr "Заархивировать" -#: ../../mod/connedit.php:388 -msgid "Archive or Unarchive this connection" -msgstr " Заархивировать или разархивировать этот канал" +#: ../../Zotlabs/Module/Connedit.php:641 +msgid "" +"Archive (or Unarchive) this connection - mark channel dead but keep content" +msgstr "Заархивировать (или разархивировать) этот контакт - пометить канал отключённым но сохранить содержимое" + +#: ../../Zotlabs/Module/Connedit.php:642 +msgid "This connection is archived!" +msgstr "Этот контакт заархивирован!" -#: ../../mod/connedit.php:391 +#: ../../Zotlabs/Module/Connedit.php:646 msgid "Unhide" msgstr "Показать" -#: ../../mod/connedit.php:391 +#: ../../Zotlabs/Module/Connedit.php:646 msgid "Hide" msgstr "Скрыть" -#: ../../mod/connedit.php:394 -msgid "Hide or Unhide this connection" -msgstr "Скрыть или показывать этот канал" +#: ../../Zotlabs/Module/Connedit.php:649 +msgid "Hide or Unhide this connection from your other connections" +msgstr "Скрыть или показать этот контакт от / для остальных" + +#: ../../Zotlabs/Module/Connedit.php:650 +msgid "This connection is hidden!" +msgstr "Этот контакт скрыт!" -#: ../../mod/connedit.php:401 +#: ../../Zotlabs/Module/Connedit.php:657 msgid "Delete this connection" msgstr "Удалить этот контакт" -#: ../../mod/connedit.php:444 ../../mod/connedit.php:473 +#: ../../Zotlabs/Module/Connedit.php:665 +msgid "Fetch Vcard" +msgstr "Получить vCard" + +#: ../../Zotlabs/Module/Connedit.php:668 +msgid "Fetch electronic calling card for this connection" +msgstr "Получить электронную телефонную карточку для этого контакта" + +#: ../../Zotlabs/Module/Connedit.php:679 +msgid "Open Individual Permissions section by default" +msgstr "Открывать раздел \"Индивидуальные разрешения\" по умолчанию" + +#: ../../Zotlabs/Module/Connedit.php:702 +msgid "Affinity" +msgstr "Сходство" + +#: ../../Zotlabs/Module/Connedit.php:705 +msgid "Open Set Affinity section by default" +msgstr "Открыть секцию установления сходства по умолчанию" + +#: ../../Zotlabs/Module/Connedit.php:739 +msgid "Filter" +msgstr "Фильтр" + +#: ../../Zotlabs/Module/Connedit.php:742 +msgid "Open Custom Filter section by default" +msgstr "Открывать секцию \"Настраиваемый фильтр\" по умолчанию" + +#: ../../Zotlabs/Module/Connedit.php:779 msgid "Approve this connection" msgstr "Утвердить этот контакт" -#: ../../mod/connedit.php:444 +#: ../../Zotlabs/Module/Connedit.php:779 msgid "Accept connection to allow communication" -msgstr "" +msgstr "Принять контакт чтобы разрешить связь" -#: ../../mod/connedit.php:460 -msgid "Automatic Permissions Settings" -msgstr "Настройки автоматических разрешений" +#: ../../Zotlabs/Module/Connedit.php:784 +msgid "Set Affinity" +msgstr "Установить сходство" -#: ../../mod/connedit.php:460 -#, php-format -msgid "Connections: settings for %s" -msgstr "" +#: ../../Zotlabs/Module/Connedit.php:787 +msgid "Set Profile" +msgstr "Установить профиль" + +#: ../../Zotlabs/Module/Connedit.php:790 +msgid "Set Affinity & Profile" +msgstr "Установить сходство и профиль" -#: ../../mod/connedit.php:464 +#: ../../Zotlabs/Module/Connedit.php:838 +msgid "This connection is unreachable from this location." +msgstr "Этот контакт недоступен для данного местоположения" + +#: ../../Zotlabs/Module/Connedit.php:839 +msgid "This connection may be unreachable from other channel locations." +msgstr "Этот контакт может быть недоступен из других мест размещения канала" + +#: ../../Zotlabs/Module/Connedit.php:841 +msgid "Location independence is not supported by their network." +msgstr "Независимое местоположение не поддерживается их сетью." + +#: ../../Zotlabs/Module/Connedit.php:847 msgid "" -"When receiving a channel introduction, any permissions provided here will be" -" applied to the new connection automatically and the introduction approved. " -"Leave this page if you do not wish to use this feature." -msgstr "" +"This connection is unreachable from this location. Location independence is " +"not supported by their network." +msgstr "Этот контакт недоступен из данного местоположения. Независимое местоположение не поддерживается их сетью." + +#: ../../Zotlabs/Module/Connedit.php:851 ../../Zotlabs/Module/Defperms.php:239 +msgid "Apply these permissions automatically" +msgstr "Применить эти разрешения автоматически" -#: ../../mod/connedit.php:466 +#: ../../Zotlabs/Module/Connedit.php:851 +msgid "Connection requests will be approved without your interaction" +msgstr "Запросы контактов будут одобрены без вашего участия" + +#: ../../Zotlabs/Module/Connedit.php:852 ../../Zotlabs/Module/Defperms.php:240 +msgid "Permission role" +msgstr "Роль разрешения" + +#: ../../Zotlabs/Module/Connedit.php:853 ../../Zotlabs/Module/Defperms.php:241 +msgid "Add permission role" +msgstr "Добавить роль разрешения" + +#: ../../Zotlabs/Module/Connedit.php:860 +msgid "This connection's primary address is" +msgstr "Главный адрес это контакта" + +#: ../../Zotlabs/Module/Connedit.php:861 +msgid "Available locations:" +msgstr "Доступные расположения:" + +#: ../../Zotlabs/Module/Connedit.php:866 ../../Zotlabs/Module/Defperms.php:245 +msgid "" +"The permissions indicated on this page will be applied to all new " +"connections." +msgstr "Разрешения, указанные на этой странице, будут применяться ко всем новым соединениям." + +#: ../../Zotlabs/Module/Connedit.php:867 +msgid "Connection Tools" +msgstr "Инструменты контактов" + +#: ../../Zotlabs/Module/Connedit.php:869 msgid "Slide to adjust your degree of friendship" -msgstr "" +msgstr "Прокрутить для настройки степени дружбы" -#: ../../mod/connedit.php:472 -msgid "inherited" -msgstr "унаследованный" +#: ../../Zotlabs/Module/Connedit.php:871 +msgid "Slide to adjust your rating" +msgstr "Прокрутить для настройки оценки" -#: ../../mod/connedit.php:474 -msgid "Connection has no individual permissions!" -msgstr "" +#: ../../Zotlabs/Module/Connedit.php:872 ../../Zotlabs/Module/Connedit.php:877 +msgid "Optionally explain your rating" +msgstr "Объясните свою оценку (не обязательно)" -#: ../../mod/connedit.php:475 +#: ../../Zotlabs/Module/Connedit.php:874 +msgid "Custom Filter" +msgstr "Настраиваемый фильтр" + +#: ../../Zotlabs/Module/Connedit.php:875 +msgid "Only import posts with this text" +msgstr "Импортировать публикации только с этим текстом" + +#: ../../Zotlabs/Module/Connedit.php:875 ../../Zotlabs/Module/Connedit.php:876 +#: ../../Zotlabs/Module/Admin/Site.php:347 +#: ../../Zotlabs/Module/Admin/Site.php:348 msgid "" -"This may be appropriate based on your <a href=\"settings\">privacy " -"settings</a>, though you may wish to review the \"Advanced Permissions\"." -msgstr "" +"words one per line or #tags or /patterns/ or lang=xx, leave blank to import " +"all posts" +msgstr "слова по одному в строку, #тег, /шаблон/ или lang=xxl; оставьте пустым для импорта всех публикаций" -#: ../../mod/connedit.php:477 -msgid "Profile Visibility" -msgstr "Видимость профиля" +#: ../../Zotlabs/Module/Connedit.php:876 +msgid "Do not import posts with this text" +msgstr "Не импортировать публикации с этим текстом" -#: ../../mod/connedit.php:478 +#: ../../Zotlabs/Module/Connedit.php:878 +msgid "This information is public!" +msgstr "Эта информация общедоступна!" + +#: ../../Zotlabs/Module/Connedit.php:883 +msgid "Connection Pending Approval" +msgstr "Ожидающие подтверждения контактов" + +#: ../../Zotlabs/Module/Connedit.php:886 ../../Zotlabs/Module/Defperms.php:248 +#: ../../Zotlabs/Module/Settings/Permcats.php:110 +#: ../../Zotlabs/Module/Settings/Tokens.php:163 +msgid "inherited" +msgstr "наследуется" + +#: ../../Zotlabs/Module/Connedit.php:888 #, php-format msgid "" "Please choose the profile you would like to display to %s when viewing your " "profile securely." -msgstr "" - -#: ../../mod/connedit.php:479 -msgid "Contact Information / Notes" -msgstr "Информация / Примечания о канале" +msgstr "Пожалуйста, выберите профиль который вы хотит показывать в %s при безопасном просмотре." -#: ../../mod/connedit.php:480 -msgid "Edit contact notes" -msgstr "Редактировать примечания канала" - -#: ../../mod/connedit.php:482 +#: ../../Zotlabs/Module/Connedit.php:890 +#: ../../Zotlabs/Module/Settings/Tokens.php:160 msgid "Their Settings" msgstr "Их настройки" -#: ../../mod/connedit.php:483 +#: ../../Zotlabs/Module/Connedit.php:891 ../../Zotlabs/Module/Defperms.php:250 +#: ../../Zotlabs/Module/Settings/Permcats.php:108 +#: ../../Zotlabs/Module/Settings/Tokens.php:161 msgid "My Settings" msgstr "Мои настройки" -#: ../../mod/connedit.php:485 -msgid "Clear/Disable Automatic Permissions" -msgstr "" - -#: ../../mod/connedit.php:486 -msgid "Forum Members" -msgstr "Участники форума" - -#: ../../mod/connedit.php:487 -msgid "Soapbox" -msgstr "Soapbox" - -#: ../../mod/connedit.php:488 -msgid "Full Sharing (typical social network permissions)" -msgstr "" - -#: ../../mod/connedit.php:489 -msgid "Cautious Sharing " -msgstr "" - -#: ../../mod/connedit.php:490 -msgid "Follow Only" -msgstr "Только следовать" - -#: ../../mod/connedit.php:491 +#: ../../Zotlabs/Module/Connedit.php:893 ../../Zotlabs/Module/Defperms.php:253 +#: ../../Zotlabs/Module/Settings/Permcats.php:113 +#: ../../Zotlabs/Module/Settings/Tokens.php:166 msgid "Individual Permissions" msgstr "Индивидуальные разрешения" -#: ../../mod/connedit.php:492 +#: ../../Zotlabs/Module/Connedit.php:894 +#: ../../Zotlabs/Module/Settings/Permcats.php:114 +#: ../../Zotlabs/Module/Settings/Tokens.php:167 msgid "" -"Some permissions may be inherited from your channel <a " -"href=\"settings\">privacy settings</a>, which have higher priority than " -"individual settings. Changing those inherited settings on this page will " -"have no effect." +"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 "" +"Некоторые разрешения могут наследовать из <a href=\"settings\"><strong>настроек " +"приватности</strong></a> ваших каналов которые могут иметь более высокий приоритет " +"чем индивидуальные. Вы <strong>не можете</strong> менять эти настройки здесь." -#: ../../mod/connedit.php:493 -msgid "Advanced Permissions" -msgstr "Дополнительные разрешения" - -#: ../../mod/connedit.php:494 -msgid "Simple Permissions (select one and submit)" +#: ../../Zotlabs/Module/Connedit.php:895 +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 "" +"Некоторые разрешения могут быть унаследованы из <a href=\"settings\"><strong>настроек " +"приватности</strong></a> вашего канала, которые могут иметь более высокий приоритет " +"чем индивидуальные. Вы можете изменить эти настройки, однако они не будут применены до " +"изменения переданных по наследству настроек." -#: ../../mod/connedit.php:498 -#, php-format -msgid "Visit %s's profile - %s" -msgstr "Посетить %s's профиль - %s" +#: ../../Zotlabs/Module/Connedit.php:896 +msgid "Last update:" +msgstr "Последнее обновление:" -#: ../../mod/connedit.php:499 -msgid "Block/Unblock contact" -msgstr "Запретить/разрешить контакт" +#: ../../Zotlabs/Module/Connedit.php:904 +msgid "Details" +msgstr "Сведения" -#: ../../mod/connedit.php:500 -msgid "Ignore contact" -msgstr "Игнорировать контакт" +#: ../../Zotlabs/Module/Webpages.php:54 +msgid "Import Webpage Elements" +msgstr "Импортировать части веб-страницы" -#: ../../mod/connedit.php:501 -msgid "Repair URL settings" -msgstr "Ремонт настройки URL" +#: ../../Zotlabs/Module/Webpages.php:55 +msgid "Import selected" +msgstr "Импортировать выбранное" -#: ../../mod/connedit.php:502 -msgid "View conversations" -msgstr "Просмотр разговоров" +#: ../../Zotlabs/Module/Webpages.php:78 +msgid "Export Webpage Elements" +msgstr "Экспортировать часть веб-страницы" -#: ../../mod/connedit.php:504 -msgid "Delete contact" -msgstr "Удалить контакт" +#: ../../Zotlabs/Module/Webpages.php:79 +msgid "Export selected" +msgstr "Экспортировать выбранное" -#: ../../mod/connedit.php:507 -msgid "Last update:" -msgstr "Последнее обновление:" +#: ../../Zotlabs/Module/Webpages.php:248 +msgid "Actions" +msgstr "Действия" -#: ../../mod/connedit.php:509 -msgid "Update public posts" -msgstr "Обновить публичные сообщения" +#: ../../Zotlabs/Module/Webpages.php:249 +msgid "Page Link" +msgstr "Ссылка страницы" -#: ../../mod/connedit.php:511 -msgid "Update now" -msgstr "Обновить сейчас" +#: ../../Zotlabs/Module/Webpages.php:250 +msgid "Page Title" +msgstr "Заголовок страницы" -#: ../../mod/connedit.php:517 -msgid "Currently blocked" -msgstr "В настоящее время заблокирован" +#: ../../Zotlabs/Module/Webpages.php:280 +msgid "Invalid file type." +msgstr "Неверный тип файла." -#: ../../mod/connedit.php:518 -msgid "Currently ignored" -msgstr "В настоящее время игнорируются" +#: ../../Zotlabs/Module/Webpages.php:292 +msgid "Error opening zip file" +msgstr "Ошибка открытия ZIP файла" -#: ../../mod/connedit.php:519 -msgid "Currently archived" -msgstr "В настоящее время зархивированны" +#: ../../Zotlabs/Module/Webpages.php:303 +msgid "Invalid folder path." +msgstr "Неверный путь к каталогу." -#: ../../mod/connedit.php:520 -msgid "Currently pending" -msgstr "В настоящее время в ожидании" +#: ../../Zotlabs/Module/Webpages.php:330 +msgid "No webpage elements detected." +msgstr "Не обнаружено частей веб-страницы." -#: ../../mod/connedit.php:521 -msgid "Hide this contact from others" -msgstr "Скрыть этот канал от других" +#: ../../Zotlabs/Module/Webpages.php:405 +msgid "Import complete." +msgstr "Импорт завершен." -#: ../../mod/connedit.php:521 -msgid "" -"Replies/likes to your public posts <strong>may</strong> still be visible" -msgstr "" +#: ../../Zotlabs/Module/Editwebpage.php:139 +msgid "Page link" +msgstr "Ссылка страницы" -#: ../../mod/delegate.php:95 -msgid "No potential page delegates located." -msgstr "" +#: ../../Zotlabs/Module/Editwebpage.php:166 +msgid "Edit Webpage" +msgstr "Редактировать веб-страницу" -#: ../../mod/delegate.php:121 -msgid "Delegate Page Management" -msgstr "" +#: ../../Zotlabs/Module/Editlayout.php:137 +msgid "Edit Layout" +msgstr "Редактировать шаблон" -#: ../../mod/delegate.php:123 -msgid "" -"Delegates are able to manage all aspects of this account/page except for " -"basic account settings. Please do not delegate your personal account to " -"anybody that you do not trust completely." -msgstr "" +#: ../../Zotlabs/Module/Dirsearch.php:33 +msgid "This directory server requires an access token" +msgstr "Для доступа к этому серверу каталогов требуется токен" -#: ../../mod/delegate.php:124 -msgid "Existing Page Managers" -msgstr "" +#: ../../Zotlabs/Module/Moderate.php:65 +msgid "Comment approved" +msgstr "Комментарий одобрен" -#: ../../mod/delegate.php:126 -msgid "Existing Page Delegates" -msgstr "" +#: ../../Zotlabs/Module/Moderate.php:69 +msgid "Comment deleted" +msgstr "Комментарий удалён" -#: ../../mod/delegate.php:128 -msgid "Potential Delegates" -msgstr "" +#: ../../Zotlabs/Module/Articles.php:95 +msgid "Add Article" +msgstr "Добавить статью" -#: ../../mod/delegate.php:130 ../../mod/photos.php:906 ../../mod/tagrm.php:93 -msgid "Remove" -msgstr "Удалить" +#: ../../Zotlabs/Module/Bookmarks.php:56 +msgid "Bookmark added" +msgstr "Закладка добавлена" -#: ../../mod/delegate.php:131 -msgid "Add" -msgstr "Добавить" +#: ../../Zotlabs/Module/Bookmarks.php:79 +msgid "My Bookmarks" +msgstr "Мои закладки" -#: ../../mod/delegate.php:132 -msgid "No entries." -msgstr "Нет записей." +#: ../../Zotlabs/Module/Bookmarks.php:90 +msgid "My Connections Bookmarks" +msgstr "Закладки моих контактов" -#: ../../mod/search.php:13 ../../mod/directory.php:15 -#: ../../mod/dirprofile.php:9 ../../mod/display.php:9 ../../mod/photos.php:443 -#: ../../mod/viewconnections.php:17 -msgid "Public access denied." -msgstr "Общественный доступ запрещен." +#: ../../Zotlabs/Module/Sharedwithme.php:104 +msgid "Files: shared with me" +msgstr "Файлы: поделились со мной" -#: ../../mod/directory.php:146 ../../mod/dirprofile.php:95 -msgid "Gender: " -msgstr "Пол:" +#: ../../Zotlabs/Module/Sharedwithme.php:106 +msgid "NEW" +msgstr "НОВОЕ" -#: ../../mod/directory.php:207 -msgid "Finding:" -msgstr "Поиск:" +#: ../../Zotlabs/Module/Sharedwithme.php:108 +#: ../../Zotlabs/Storage/Browser.php:288 +msgid "Last Modified" +msgstr "Последнее изменение" -#: ../../mod/directory.php:215 -msgid "next page" -msgstr "следующая страница" +#: ../../Zotlabs/Module/Sharedwithme.php:109 +msgid "Remove all files" +msgstr "Удалить все файлы" -#: ../../mod/directory.php:215 -msgid "previous page" -msgstr "предыдущая страница" +#: ../../Zotlabs/Module/Sharedwithme.php:110 +msgid "Remove this file" +msgstr "Удалить этот файл" -#: ../../mod/directory.php:222 -msgid "No entries (some entries may be hidden)." -msgstr "" +#: ../../Zotlabs/Module/Rbmark.php:94 +msgid "Select a bookmark folder" +msgstr "Выбрать каталог для закладок" -#: ../../mod/dirprofile.php:108 -msgid "Status: " -msgstr "Статус:" +#: ../../Zotlabs/Module/Rbmark.php:99 +msgid "Save Bookmark" +msgstr "Сохранить закладку" -#: ../../mod/dirprofile.php:109 -msgid "Sexual Preference: " -msgstr "Сексуальная ориентация:" +#: ../../Zotlabs/Module/Rbmark.php:100 +msgid "URL of bookmark" +msgstr "URL закладки" -#: ../../mod/dirprofile.php:111 -msgid "Homepage: " -msgstr "Домашняя страница:" +#: ../../Zotlabs/Module/Rbmark.php:105 +msgid "Or enter new bookmark folder name" +msgstr "или введите новое имя каталога закладок" -#: ../../mod/dirprofile.php:112 -msgid "Hometown: " -msgstr "Город проживания:" +#: ../../Zotlabs/Module/Cal.php:69 +msgid "Permissions denied." +msgstr "Доступ запрещен." -#: ../../mod/dirprofile.php:114 -msgid "About: " -msgstr "О себе:" +#: ../../Zotlabs/Module/Authorize.php:17 +msgid "Unknown App" +msgstr "Неизвестное приложение" -#: ../../mod/dirprofile.php:162 -msgid "Keywords: " -msgstr "Ключевые слова:" +#: ../../Zotlabs/Module/Authorize.php:22 +msgid "Authorize" +msgstr "Авторизовать" -#: ../../mod/dirsearch.php:21 -msgid "This site is not a directory server" -msgstr "Этот сайт не является сервером каталога" +#: ../../Zotlabs/Module/Authorize.php:23 +#, php-format +msgid "Do you authorize the app %s to access your channel data?" +msgstr "Авторизуете ли вы приложение %s для доступа к данным вашего канала?" -#: ../../mod/home.php:81 -msgid "Hubzilla - "The Network"" -msgstr "" +#: ../../Zotlabs/Module/Authorize.php:25 +msgid "Allow" +msgstr "Разрешить" + +#: ../../Zotlabs/Module/Authorize.php:26 +#: ../../Zotlabs/Module/Admin/Accounts.php:174 +msgid "Deny" +msgstr "Запретить" -#: ../../mod/home.php:94 +#: ../../Zotlabs/Module/Search.php:230 #, php-format -msgid "Welcome to %s" -msgstr "Добро пожаловать в %s" +msgid "Items tagged with: %s" +msgstr "Объекты помечены как: %s" -#: ../../mod/setup.php:162 -msgid "Hubzilla Server - Setup" -msgstr "Hubzilla Сервер - Установка" +#: ../../Zotlabs/Module/Search.php:232 +#, php-format +msgid "Search results for: %s" +msgstr "Результаты поиска для: %s" + +#: ../../Zotlabs/Module/Setup.php:170 +msgid "$Projectname Server - Setup" +msgstr "$Projectname сервер - Установка" -#: ../../mod/setup.php:168 +#: ../../Zotlabs/Module/Setup.php:174 msgid "Could not connect to database." msgstr "Не удалось подключиться к серверу баз данных." -#: ../../mod/setup.php:172 +#: ../../Zotlabs/Module/Setup.php:178 msgid "" "Could not connect to specified site URL. Possible SSL certificate or DNS " "issue." -msgstr "" +msgstr "Не удалось подключиться к указанному URL. Вероятно проблема с SSL сертификатом или DNS." -#: ../../mod/setup.php:179 +#: ../../Zotlabs/Module/Setup.php:185 msgid "Could not create table." msgstr "Не удалось создать таблицу." -#: ../../mod/setup.php:185 +#: ../../Zotlabs/Module/Setup.php:191 msgid "Your site database has been installed." msgstr "Ваша база данных установлена." -#: ../../mod/setup.php:190 +#: ../../Zotlabs/Module/Setup.php:197 msgid "" -"You may need to import the file \"install/database.sql\" manually using " -"phpmyadmin or mysql." -msgstr "" +"You may need to import the file \"install/schema_xxx.sql\" manually using a " +"database client." +msgstr "Вам может понадобится импортировать файл \"install/schema_xxx.sql\" вручную используя клиент базы данных." -#: ../../mod/setup.php:191 ../../mod/setup.php:260 ../../mod/setup.php:655 +#: ../../Zotlabs/Module/Setup.php:198 ../../Zotlabs/Module/Setup.php:262 +#: ../../Zotlabs/Module/Setup.php:749 msgid "Please see the file \"install/INSTALL.txt\"." msgstr "Пожалуйста, обратитесь к файлу \"install/INSTALL.txt\"." -#: ../../mod/setup.php:257 +#: ../../Zotlabs/Module/Setup.php:259 msgid "System check" msgstr "Проверка системы" -#: ../../mod/setup.php:261 ../../mod/events.php:380 -msgid "Next" -msgstr "Следующая" - -#: ../../mod/setup.php:262 +#: ../../Zotlabs/Module/Setup.php:264 msgid "Check again" -msgstr "Проверить снова" +msgstr "Перепроверить" -#: ../../mod/setup.php:284 +#: ../../Zotlabs/Module/Setup.php:286 msgid "Database connection" msgstr "Подключение к базе данных" -#: ../../mod/setup.php:285 +#: ../../Zotlabs/Module/Setup.php:287 msgid "" -"In order to install Hubzilla we need to know how to connect to your " +"In order to install $Projectname we need to know how to connect to your " "database." -msgstr "" +msgstr "Для установки $Projectname необходимо знать как подключиться к ваше базе данных." -#: ../../mod/setup.php:286 +#: ../../Zotlabs/Module/Setup.php:288 msgid "" "Please contact your hosting provider or site administrator if you have " "questions about these settings." -msgstr "" +msgstr "Пожалуйста, свяжитесь с вашим хостинг провайдером или администрацией сайта если у вас есть вопросы об этих настройках." -#: ../../mod/setup.php:287 +#: ../../Zotlabs/Module/Setup.php:289 msgid "" "The database you specify below should already exist. If it does not, please " "create it before continuing." -msgstr "" +msgstr "Указанная ниже база данных должна существовать. Если это не так, пожалуйста, создайте её перед тем, как продолжить." -#: ../../mod/setup.php:291 +#: ../../Zotlabs/Module/Setup.php:293 msgid "Database Server Name" -msgstr "Имя сервера базы данных" +msgstr "Имя сервера баз данных" -#: ../../mod/setup.php:291 -msgid "Default is localhost" -msgstr "По умолчанию localhost" +#: ../../Zotlabs/Module/Setup.php:293 +msgid "Default is 127.0.0.1" +msgstr "По умолчанию 127.0.0.1" -#: ../../mod/setup.php:292 +#: ../../Zotlabs/Module/Setup.php:294 msgid "Database Port" -msgstr "Порт базы данных" +msgstr "Порт сервера баз данных" -#: ../../mod/setup.php:292 +#: ../../Zotlabs/Module/Setup.php:294 msgid "Communication port number - use 0 for default" msgstr "Порт коммуникации - используйте 0 по умолчанию" -#: ../../mod/setup.php:293 +#: ../../Zotlabs/Module/Setup.php:295 msgid "Database Login Name" msgstr "Имя для подключения к базе данных" -#: ../../mod/setup.php:294 +#: ../../Zotlabs/Module/Setup.php:296 msgid "Database Login Password" msgstr "Пароль для подключения к базе данных" -#: ../../mod/setup.php:295 +#: ../../Zotlabs/Module/Setup.php:297 msgid "Database Name" msgstr "Имя базы данных" -#: ../../mod/setup.php:297 ../../mod/setup.php:339 +#: ../../Zotlabs/Module/Setup.php:298 +msgid "Database Type" +msgstr "Тип базы данных" + +#: ../../Zotlabs/Module/Setup.php:300 ../../Zotlabs/Module/Setup.php:341 msgid "Site administrator email address" msgstr "Адрес электронной почты администратора сайта" -#: ../../mod/setup.php:297 ../../mod/setup.php:339 +#: ../../Zotlabs/Module/Setup.php:300 ../../Zotlabs/Module/Setup.php:341 msgid "" "Your account email address must match this in order to use the web admin " "panel." -msgstr "" +msgstr "Ваш адрес электронной почты должен соответствовать этому для использования веб-панели администратора." -#: ../../mod/setup.php:298 ../../mod/setup.php:341 +#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:343 msgid "Website URL" msgstr "URL веб-сайта" -#: ../../mod/setup.php:298 ../../mod/setup.php:341 +#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:343 msgid "Please use SSL (https) URL if available." msgstr "Пожалуйста, используйте SSL (https) URL если возможно." -#: ../../mod/setup.php:301 ../../mod/setup.php:344 +#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:345 msgid "Please select a default timezone for your website" msgstr "Пожалуйста, выберите часовой пояс по умолчанию для вашего сайта" -#: ../../mod/setup.php:328 +#: ../../Zotlabs/Module/Setup.php:330 msgid "Site settings" msgstr "Настройки сайта" -#: ../../mod/setup.php:387 +#: ../../Zotlabs/Module/Setup.php:384 +msgid "PHP version 5.5 or greater is required." +msgstr "Требуется PHP версии 5.5 или выше" + +#: ../../Zotlabs/Module/Setup.php:385 +msgid "PHP version" +msgstr "Версия PHP" + +#: ../../Zotlabs/Module/Setup.php:401 msgid "Could not find a command line version of PHP in the web server PATH." -msgstr "" +msgstr "Не удалось найти консольную версию PHP в путях переменной PATH веб-сервера." -#: ../../mod/setup.php:388 +#: ../../Zotlabs/Module/Setup.php:402 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 "" +msgstr "Если у вас на сервере не установлена консольная версия PHP вы не сможете запустить фоновый опрос через cron. " -#: ../../mod/setup.php:392 +#: ../../Zotlabs/Module/Setup.php:406 msgid "PHP executable path" -msgstr "PHP executable путь" +msgstr "Пусть к исполняемому модулю PHP" -#: ../../mod/setup.php:392 +#: ../../Zotlabs/Module/Setup.php:406 msgid "" "Enter full path to php executable. You can leave this blank to continue the " "installation." -msgstr "" +msgstr "Введите полный путь к исполняемому модулю PHP. Вы можете оставить его пустым для продолжения установки." -#: ../../mod/setup.php:397 +#: ../../Zotlabs/Module/Setup.php:411 msgid "Command line PHP" -msgstr "Command line PHP" +msgstr "Командная строка PHP" + +#: ../../Zotlabs/Module/Setup.php:421 +msgid "" +"Unable to check command line PHP, as shell_exec() is disabled. This is " +"required." +msgstr "Невозможно проверить командную строку PHP поскольку требуемая функция shell_exec() отключена." -#: ../../mod/setup.php:406 +#: ../../Zotlabs/Module/Setup.php:424 msgid "" "The command line version of PHP on your system does not have " "\"register_argc_argv\" enabled." -msgstr "" +msgstr "В консольной версии PHP в вашей системе отключена опция \"register_argc_argv\"." -#: ../../mod/setup.php:407 +#: ../../Zotlabs/Module/Setup.php:425 msgid "This is required for message delivery to work." -msgstr "Это требуется для доставки сообщений." +msgstr "Это необходимо для функционирования доставки сообщений." -#: ../../mod/setup.php:409 +#: ../../Zotlabs/Module/Setup.php:428 msgid "PHP register_argc_argv" -msgstr "PHP register_argc_argv" +msgstr "" + +#: ../../Zotlabs/Module/Setup.php:446 +#, 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 "Максимально разрешённый общий размер загрузок установлен в %s. Максимальный размер одной загрузки установлен в %s. Вам разрешено загружать до %d файлов за один приём." + +#: ../../Zotlabs/Module/Setup.php:451 +msgid "You can adjust these settings in the server php.ini file." +msgstr "Вы можете изменить эти настройки в файле php.ini на сервере." + +#: ../../Zotlabs/Module/Setup.php:453 +msgid "PHP upload limits" +msgstr "Максимальный размер загрузки в PHP" -#: ../../mod/setup.php:430 +#: ../../Zotlabs/Module/Setup.php:476 msgid "" "Error: the \"openssl_pkey_new\" function on this system is not able to " "generate encryption keys" -msgstr "" +msgstr "Ошибка: функция \"openssl_pkey_new\" не может сгенерировать ключи шифрования" -#: ../../mod/setup.php:431 +#: ../../Zotlabs/Module/Setup.php:477 msgid "" -"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\"." msgstr "Если работаете под Windows, см. \"http://www.php.net/manual/en/openssl.installation.php\"." -#: ../../mod/setup.php:433 +#: ../../Zotlabs/Module/Setup.php:480 msgid "Generate encryption keys" msgstr "Генерация ключей шифрования" -#: ../../mod/setup.php:440 +#: ../../Zotlabs/Module/Setup.php:497 msgid "libCurl PHP module" -msgstr "libCurl PHP модуль" +msgstr "" -#: ../../mod/setup.php:441 +#: ../../Zotlabs/Module/Setup.php:498 msgid "GD graphics PHP module" -msgstr "GD graphics PHP модуль" +msgstr "" -#: ../../mod/setup.php:442 +#: ../../Zotlabs/Module/Setup.php:499 msgid "OpenSSL PHP module" -msgstr "OpenSSL PHP модуль" +msgstr "" -#: ../../mod/setup.php:443 -msgid "mysqli PHP module" -msgstr "mysqli PHP модуль" +#: ../../Zotlabs/Module/Setup.php:500 +msgid "PDO database PHP module" +msgstr "" -#: ../../mod/setup.php:444 +#: ../../Zotlabs/Module/Setup.php:501 msgid "mb_string PHP module" -msgstr "mb_string PHP модуль" +msgstr "" -#: ../../mod/setup.php:445 -msgid "mcrypt PHP module" -msgstr "mcrypt PHP модуль" +#: ../../Zotlabs/Module/Setup.php:502 +msgid "xml PHP module" +msgstr "" + +#: ../../Zotlabs/Module/Setup.php:503 +msgid "zip PHP module" +msgstr "" -#: ../../mod/setup.php:450 ../../mod/setup.php:452 +#: ../../Zotlabs/Module/Setup.php:507 ../../Zotlabs/Module/Setup.php:509 msgid "Apache mod_rewrite module" -msgstr "Apache mod_rewrite модуль" +msgstr "" -#: ../../mod/setup.php:450 +#: ../../Zotlabs/Module/Setup.php:507 msgid "" "Error: Apache webserver mod-rewrite module is required but not installed." -msgstr "Ошибка: Apache веб-сервер модуль mod-rewrite требуется, но не установлен." +msgstr "Ошибка: требуемый модуль mod_rewrite веб-сервера Apache не установлен." + +#: ../../Zotlabs/Module/Setup.php:513 ../../Zotlabs/Module/Setup.php:516 +msgid "exec" +msgstr "" + +#: ../../Zotlabs/Module/Setup.php:513 +msgid "" +"Error: exec is required but is either not installed or has been disabled in " +"php.ini" +msgstr "" -#: ../../mod/setup.php:456 ../../mod/setup.php:459 -msgid "proc_open" -msgstr "proc_open" +#: ../../Zotlabs/Module/Setup.php:519 ../../Zotlabs/Module/Setup.php:522 +msgid "shell_exec" +msgstr "" -#: ../../mod/setup.php:456 +#: ../../Zotlabs/Module/Setup.php:519 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 "Ошибка: proc_open требуется, но не установлен или отключен в php.ini" +msgstr "" -#: ../../mod/setup.php:464 +#: ../../Zotlabs/Module/Setup.php:527 msgid "Error: libCURL PHP module required but not installed." -msgstr "Ошибка: Модуль libCURL PHP требуется, но не установлен." +msgstr "" -#: ../../mod/setup.php:468 +#: ../../Zotlabs/Module/Setup.php:531 msgid "" "Error: GD graphics PHP module with JPEG support required but not installed." -msgstr "Ошибка: GD graphics PHP модуль с поддержкой JPEG требуется, но не установлен." +msgstr "" -#: ../../mod/setup.php:472 +#: ../../Zotlabs/Module/Setup.php:535 msgid "Error: openssl PHP module required but not installed." -msgstr "Ошибка: openssl PHP модуль требуется, но не установлен." +msgstr "" -#: ../../mod/setup.php:476 -msgid "Error: mysqli PHP module required but not installed." -msgstr "Ошибка: mysqli PHP модуль требуется, но не установлен." +#: ../../Zotlabs/Module/Setup.php:539 +msgid "Error: PDO database PHP module required but not installed." +msgstr "" -#: ../../mod/setup.php:480 +#: ../../Zotlabs/Module/Setup.php:543 msgid "Error: mb_string PHP module required but not installed." -msgstr "Ошибка: mb_string PHP модуль требуется, но не установлен." +msgstr "" -#: ../../mod/setup.php:484 -msgid "Error: mcrypt PHP module required but not installed." -msgstr "Ошибка: mcrypt PHP модуль требуется, но не установлен." +#: ../../Zotlabs/Module/Setup.php:547 +msgid "Error: xml PHP module required for DAV but not installed." +msgstr "" -#: ../../mod/setup.php:500 -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 "Веб-установщик должен быть в состоянии создать файл с именем \".htconfig.php\" в верхней папке вашего веб-сервера, но он не в состоянии сделать это." +#: ../../Zotlabs/Module/Setup.php:551 +msgid "Error: zip PHP module required but not installed." +msgstr "" -#: ../../mod/setup.php:501 -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." +#: ../../Zotlabs/Module/Setup.php:570 ../../Zotlabs/Module/Setup.php:579 +msgid ".htconfig.php is writable" msgstr "" -#: ../../mod/setup.php:502 +#: ../../Zotlabs/Module/Setup.php:575 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." +"The web installer needs to be able to create a file called \".htconfig.php\" " +"in the top folder of your web server and it is unable to do so." msgstr "" -#: ../../mod/setup.php:503 +#: ../../Zotlabs/Module/Setup.php:576 msgid "" -"You can alternatively skip this procedure and perform a manual installation." -" Please see the file \"install/INSTALL.txt\" for instructions." -msgstr "Вы можете пропустить эту процедуру и выполнить установку вручную. Обратитесь к файлу \"install/INSTALL.txt\" для получения инструкций." +"This is most often a permission setting, as the web server may not be able " +"to write files in your folder - even if you can." +msgstr "" -#: ../../mod/setup.php:506 -msgid ".htconfig.php is writable" -msgstr ".htconfig.php доступен для записи" +#: ../../Zotlabs/Module/Setup.php:577 +msgid "Please see install/INSTALL.txt for additional information." +msgstr "" -#: ../../mod/setup.php:516 +#: ../../Zotlabs/Module/Setup.php:593 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 "" -#: ../../mod/setup.php:517 +#: ../../Zotlabs/Module/Setup.php:594 +#, php-format msgid "" "In order to store these compiled templates, the web server needs to have " -"write access to the directory view/tpl/smarty3/ under the Red top level " -"folder." +"write access to the directory %s under the top level web folder." msgstr "" -#: ../../mod/setup.php:518 ../../mod/setup.php:536 +#: ../../Zotlabs/Module/Setup.php:595 ../../Zotlabs/Module/Setup.php:616 msgid "" -"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." msgstr "" -#: ../../mod/setup.php:519 +#: ../../Zotlabs/Module/Setup.php:596 +#, php-format msgid "" "Note: as a security measure, you should give the web server write access to " -"view/tpl/smarty3/ only--not the template files (.tpl) that it contains." +"%s only--not the template files (.tpl) that it contains." msgstr "" -#: ../../mod/setup.php:522 -msgid "view/tpl/smarty3 is writable" -msgstr "view/tpl/smarty3 доступен для записи" +#: ../../Zotlabs/Module/Setup.php:599 +#, php-format +msgid "%s is writable" +msgstr "%s доступен для записи" -#: ../../mod/setup.php:535 +#: ../../Zotlabs/Module/Setup.php:615 msgid "" -"Red 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 top level " +"web folder" +msgstr "Эта программа использует каталог хранения для загруженных файлов. Для веб-сервера требуется доступ на запись начиная с верхнего уровня каталога хранения." -#: ../../mod/setup.php:539 +#: ../../Zotlabs/Module/Setup.php:619 msgid "store is writable" -msgstr "" +msgstr "хранилище доступно для записи" -#: ../../mod/setup.php:569 +#: ../../Zotlabs/Module/Setup.php:651 msgid "" -"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 site." msgstr "" -#: ../../mod/setup.php:570 +#: ../../Zotlabs/Module/Setup.php:652 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 "" -#: ../../mod/setup.php:571 +#: ../../Zotlabs/Module/Setup.php:653 msgid "" "This restriction is incorporated because public posts from you may for " "example contain references to images on your own hub." -msgstr "" +msgstr "Эти ограничения приняты поскольку ваши общедоступные публикации могут, например, содержать ссылки на изображения на вашем собственном хабе." -#: ../../mod/setup.php:572 +#: ../../Zotlabs/Module/Setup.php:654 msgid "" -"If your certificate is not recognised, members of other sites (who may " +"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 "" -#: ../../mod/setup.php:573 +#: ../../Zotlabs/Module/Setup.php:655 msgid "" "This can cause usability issues elsewhere (not just on your own site) so we " "must insist on this requirement." msgstr "" -#: ../../mod/setup.php:574 +#: ../../Zotlabs/Module/Setup.php:656 msgid "" -"Providers are available that issue free certificates which are browser-" -"valid." +"Providers are available that issue free certificates which are browser-valid." +msgstr "" + +#: ../../Zotlabs/Module/Setup.php:658 +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 "" -#: ../../mod/setup.php:576 +#: ../../Zotlabs/Module/Setup.php:660 msgid "SSL certificate validation" -msgstr "проверка сертификата SSL" +msgstr "" -#: ../../mod/setup.php:582 +#: ../../Zotlabs/Module/Setup.php:666 msgid "" "Url rewrite in .htaccess is not working. Check your server configuration." +"Test: " msgstr "" -#: ../../mod/setup.php:584 +#: ../../Zotlabs/Module/Setup.php:669 msgid "Url rewrite is working" -msgstr "Url rewrite работает" +msgstr "Перезапись URL работает" -#: ../../mod/setup.php:594 +#: ../../Zotlabs/Module/Setup.php:683 msgid "" "The database configuration file \".htconfig.php\" could not be written. " "Please use the enclosed text to create a configuration file in your web " "server root." msgstr "" -#: ../../mod/setup.php:618 -msgid "Errors encountered creating database tables." -msgstr "" - -#: ../../mod/setup.php:653 -msgid "<h1>What next</h1>" -msgstr "<h1>Что дальше</h1>" +#: ../../Zotlabs/Module/Setup.php:747 +msgid "<h1>What next?</h1>" +msgstr "<h1>Что дальше? </h1>" -#: ../../mod/setup.php:654 +#: ../../Zotlabs/Module/Setup.php:748 msgid "" -"IMPORTANT: You will need to [manually] setup a scheduled task for the " -"poller." -msgstr "" - -#: ../../mod/editblock.php:8 ../../mod/editblock.php:27 -#: ../../mod/editblock.php:53 ../../mod/editlayout.php:36 -#: ../../mod/editpost.php:20 ../../mod/editwebpage.php:32 -msgid "Item not found" -msgstr "Элемент не найден" - -#: ../../mod/editblock.php:77 -msgid "Edit Block" -msgstr "Редактировать блок" +"IMPORTANT: You will need to [manually] setup a scheduled task for the poller." +msgstr "Вам понадобится [вручную] настроить запланированную задачу для опрашивателя." -#: ../../mod/editblock.php:87 -msgid "Delete block?" -msgstr "Удалить блок?" +#: ../../Zotlabs/Module/Lockview.php:75 +msgid "Remote privacy information not available." +msgstr "Удаленная информация о конфиденциальности недоступна." -#: ../../mod/editblock.php:115 ../../mod/editlayout.php:110 -#: ../../mod/editpost.php:116 ../../mod/editwebpage.php:147 -msgid "Insert YouTube video" -msgstr "Вставить YouTube видео" +#: ../../Zotlabs/Module/Lockview.php:96 +msgid "Visible to:" +msgstr "Видимо для:" -#: ../../mod/editblock.php:116 ../../mod/editlayout.php:111 -#: ../../mod/editpost.php:117 ../../mod/editwebpage.php:148 -msgid "Insert Vorbis [.ogg] video" -msgstr "Вставить Vorbis [.ogg] видео" +#: ../../Zotlabs/Module/Follow.php:36 +msgid "Connection added." +msgstr "Контакт добавлен." -#: ../../mod/editblock.php:117 ../../mod/editlayout.php:112 -#: ../../mod/editpost.php:118 ../../mod/editwebpage.php:149 -msgid "Insert Vorbis [.ogg] audio" -msgstr "Вставить Vorbis [.ogg] музыку" +#: ../../Zotlabs/Module/Mitem.php:31 ../../Zotlabs/Module/Menu.php:208 +msgid "Menu not found." +msgstr "Меню не найдено" -#: ../../mod/editblock.php:153 -msgid "Delete Block" -msgstr "Удалить блок" +#: ../../Zotlabs/Module/Mitem.php:63 +msgid "Unable to create element." +msgstr "Невозможно создать элемент." -#: ../../mod/pdledit.php:13 -msgid "Layout updated." -msgstr "Шаблон обновлен." - -#: ../../mod/pdledit.php:28 ../../mod/pdledit.php:53 -msgid "Edit System Page Description" -msgstr "" +#: ../../Zotlabs/Module/Mitem.php:87 +msgid "Unable to update menu element." +msgstr "Невозможно обновить элемент меню." -#: ../../mod/pdledit.php:48 -msgid "Layout not found." -msgstr "Шаблон не найден" +#: ../../Zotlabs/Module/Mitem.php:103 +msgid "Unable to add menu element." +msgstr "Невозможно добавить элемент меню." -#: ../../mod/pdledit.php:54 -msgid "Module Name:" -msgstr "Имя модуля:" +#: ../../Zotlabs/Module/Mitem.php:167 ../../Zotlabs/Module/Mitem.php:246 +msgid "Menu Item Permissions" +msgstr "Разрешения на пункт меню" -#: ../../mod/pdledit.php:55 ../../mod/layouts.php:59 -msgid "Layout Help" -msgstr "Помощь к шаблону" +#: ../../Zotlabs/Module/Mitem.php:168 ../../Zotlabs/Module/Mitem.php:247 +#: ../../Zotlabs/Module/Settings/Channel.php:549 +msgid "(click to open/close)" +msgstr "(нажмите чтобы открыть/закрыть)" -#: ../../mod/editlayout.php:72 -msgid "Edit Layout" -msgstr "Редактировать шаблон" +#: ../../Zotlabs/Module/Mitem.php:174 ../../Zotlabs/Module/Mitem.php:191 +msgid "Link Name" +msgstr "Имя ссылки" -#: ../../mod/editlayout.php:82 -msgid "Delete layout?" -msgstr "Удалить шаблон?" +#: ../../Zotlabs/Module/Mitem.php:175 ../../Zotlabs/Module/Mitem.php:255 +msgid "Link or Submenu Target" +msgstr "Ссылка или цель подменю" -#: ../../mod/editlayout.php:146 -msgid "Delete Layout" -msgstr "Удалить шаблон" +#: ../../Zotlabs/Module/Mitem.php:175 +msgid "Enter URL of the link or select a menu name to create a submenu" +msgstr "Введите URL ссылки или выберите имя меню для создания подменю" -#: ../../mod/editpost.php:31 -msgid "Item is not editable" -msgstr "Элемент нельзя редактировать" +#: ../../Zotlabs/Module/Mitem.php:176 ../../Zotlabs/Module/Mitem.php:256 +msgid "Use magic-auth if available" +msgstr "Использовать magic-auth если возможно" -#: ../../mod/editpost.php:53 -msgid "Delete item?" -msgstr "Удалить элемент?" +#: ../../Zotlabs/Module/Mitem.php:177 ../../Zotlabs/Module/Mitem.php:257 +msgid "Open link in new window" +msgstr "Открыть ссылку в новом окне" -#: ../../mod/editwebpage.php:106 -msgid "Edit Webpage" -msgstr "Редактировать веб-страницу" +#: ../../Zotlabs/Module/Mitem.php:178 ../../Zotlabs/Module/Mitem.php:258 +msgid "Order in list" +msgstr "Порядок в списке" -#: ../../mod/editwebpage.php:116 -msgid "Delete webpage?" -msgstr "Удалить веб-страницу?" +#: ../../Zotlabs/Module/Mitem.php:178 ../../Zotlabs/Module/Mitem.php:258 +msgid "Higher numbers will sink to bottom of listing" +msgstr "Большие значения в конце списка" -#: ../../mod/editwebpage.php:186 -msgid "Delete Webpage" -msgstr "Удалить веб-страницу" +#: ../../Zotlabs/Module/Mitem.php:179 +msgid "Submit and finish" +msgstr "Отправить и завершить" -#: ../../mod/siteinfo.php:57 -#, php-format -msgid "Version %s" -msgstr "Версия %s" +#: ../../Zotlabs/Module/Mitem.php:180 +msgid "Submit and continue" +msgstr "Отправить и продолжить" -#: ../../mod/siteinfo.php:76 -msgid "Installed plugins/addons/apps:" -msgstr "" +#: ../../Zotlabs/Module/Mitem.php:189 +msgid "Menu:" +msgstr "Меню:" -#: ../../mod/siteinfo.php:89 -msgid "No installed plugins/addons/apps" -msgstr "" +#: ../../Zotlabs/Module/Mitem.php:192 +msgid "Link Target" +msgstr "Цель ссылки" -#: ../../mod/siteinfo.php:97 -msgid "Red" -msgstr "Red" +#: ../../Zotlabs/Module/Mitem.php:195 +msgid "Edit menu" +msgstr "Редактировать меню" -#: ../../mod/siteinfo.php:98 -msgid "" -"This is a hub of the Hubzilla - a global cooperative network of " -"decentralised privacy enhanced websites." -msgstr "" +#: ../../Zotlabs/Module/Mitem.php:198 +msgid "Edit element" +msgstr "Редактировать элемент" -#: ../../mod/siteinfo.php:101 -msgid "Running at web location" -msgstr "" +#: ../../Zotlabs/Module/Mitem.php:199 +msgid "Drop element" +msgstr "Удалить элемент" -#: ../../mod/siteinfo.php:102 -msgid "" -"Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more " -"about the Hubzilla." -msgstr "Пожалуйста посетите <a href=\"http://getzot.com\">GetZot.com</a> чтобы узнать больше о Hubzilla." +#: ../../Zotlabs/Module/Mitem.php:200 +msgid "New element" +msgstr "Новый элемент" -#: ../../mod/siteinfo.php:103 -msgid "Bug reports and issues: please visit" -msgstr "" +#: ../../Zotlabs/Module/Mitem.php:201 +msgid "Edit this menu container" +msgstr "Редактировать контейнер меню" -#: ../../mod/siteinfo.php:106 -msgid "" -"Suggestions, praise, etc. - please email \"hubzilla\" at librelist - dot " -"com" -msgstr "" +#: ../../Zotlabs/Module/Mitem.php:202 +msgid "Add menu element" +msgstr "Добавить элемент меню" -#: ../../mod/siteinfo.php:108 -msgid "Site Administrators" -msgstr "Администратор сайта" +#: ../../Zotlabs/Module/Mitem.php:203 +msgid "Delete this menu item" +msgstr "Удалить этот элемент меню" -#: ../../mod/photos.php:77 -msgid "Page owner information could not be retrieved." -msgstr "" +#: ../../Zotlabs/Module/Mitem.php:204 +msgid "Edit this menu item" +msgstr "Редактировать этот элемент меню" -#: ../../mod/photos.php:97 -msgid "Album not found." -msgstr "Альбом не найден." +#: ../../Zotlabs/Module/Mitem.php:222 +msgid "Menu item not found." +msgstr "Элемент меню не найден." -#: ../../mod/photos.php:119 ../../mod/photos.php:669 -msgid "Delete Album" -msgstr "Удалить альбом" +#: ../../Zotlabs/Module/Mitem.php:235 +msgid "Menu item deleted." +msgstr "Элемент меню удалён." -#: ../../mod/photos.php:159 ../../mod/photos.php:957 -msgid "Delete Photo" -msgstr "Удалить фотографию" +#: ../../Zotlabs/Module/Mitem.php:237 +msgid "Menu item could not be deleted." +msgstr "Невозможно удалить элемент меню." -#: ../../mod/photos.php:453 -msgid "No photos selected" -msgstr "Никакие фотографии не выбраны" +#: ../../Zotlabs/Module/Mitem.php:244 +msgid "Edit Menu Element" +msgstr "Редактировать элемент меню" -#: ../../mod/photos.php:500 -msgid "Access to this item is restricted." -msgstr "Доступ к этому элементу ограничен." +#: ../../Zotlabs/Module/Mitem.php:254 +msgid "Link text" +msgstr "Текст ссылки" -#: ../../mod/photos.php:574 +#: ../../Zotlabs/Module/Admin/Addons.php:289 #, php-format -msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage." -msgstr "Вы использовали %1$.2f мегабайт из %2$.2f для хранения фото." +msgid "Plugin %s disabled." +msgstr "Плагин %s отключен." -#: ../../mod/photos.php:577 +#: ../../Zotlabs/Module/Admin/Addons.php:294 #, php-format -msgid "You have used %1$.2f Mbytes of photo storage." -msgstr "Вы использовали %1$.2f мегабайт для хранения фото." +msgid "Plugin %s enabled." +msgstr "Плагин %s включен." -#: ../../mod/photos.php:596 -msgid "Upload Photos" -msgstr "Загрузить фотографии" +#: ../../Zotlabs/Module/Admin/Addons.php:310 +#: ../../Zotlabs/Module/Admin/Themes.php:95 +msgid "Disable" +msgstr "Запретить" -#: ../../mod/photos.php:600 ../../mod/photos.php:664 -msgid "New album name: " -msgstr "Название нового альбома:" +#: ../../Zotlabs/Module/Admin/Addons.php:313 +#: ../../Zotlabs/Module/Admin/Themes.php:97 +msgid "Enable" +msgstr "Разрешить" -#: ../../mod/photos.php:601 -msgid "or existing album name: " -msgstr "или существующий альбом:" +#: ../../Zotlabs/Module/Admin/Addons.php:343 +#: ../../Zotlabs/Module/Admin/Themes.php:124 +msgid "Toggle" +msgstr "Переключить" -#: ../../mod/photos.php:602 -msgid "Do not show a status post for this upload" -msgstr "Не показывать пост о состоянии этой загрузки" +#: ../../Zotlabs/Module/Admin/Addons.php:351 +#: ../../Zotlabs/Module/Admin/Themes.php:134 +msgid "Author: " +msgstr "Автор: " -#: ../../mod/photos.php:653 ../../mod/photos.php:675 ../../mod/photos.php:1129 -#: ../../mod/photos.php:1144 -msgid "Contact Photos" -msgstr "Фотографии контакта" +#: ../../Zotlabs/Module/Admin/Addons.php:352 +#: ../../Zotlabs/Module/Admin/Themes.php:135 +msgid "Maintainer: " +msgstr "Сопровождающий:" -#: ../../mod/photos.php:679 -msgid "Edit Album" -msgstr "Редактировать Фотоальбом" +#: ../../Zotlabs/Module/Admin/Addons.php:353 +msgid "Minimum project version: " +msgstr "Минимальная версия проекта:" -#: ../../mod/photos.php:685 -msgid "Show Newest First" -msgstr "Показать новые первыми" +#: ../../Zotlabs/Module/Admin/Addons.php:354 +msgid "Maximum project version: " +msgstr "Максимальная версия проекта:" -#: ../../mod/photos.php:687 -msgid "Show Oldest First" -msgstr "Показать старые первыми" +#: ../../Zotlabs/Module/Admin/Addons.php:355 +msgid "Minimum PHP version: " +msgstr "Минимальная версия PHP:" -#: ../../mod/photos.php:730 ../../mod/photos.php:1176 -msgid "View Photo" -msgstr "Посмотреть фотографию" +#: ../../Zotlabs/Module/Admin/Addons.php:356 +msgid "Compatible Server Roles: " +msgstr "Совместимые роли сервера:" -#: ../../mod/photos.php:776 -msgid "Permission denied. Access to this item may be restricted." -msgstr "" +#: ../../Zotlabs/Module/Admin/Addons.php:357 +msgid "Requires: " +msgstr "Необходимо:" -#: ../../mod/photos.php:778 -msgid "Photo not available" -msgstr "Фотография не доступна" +#: ../../Zotlabs/Module/Admin/Addons.php:358 +#: ../../Zotlabs/Module/Admin/Addons.php:442 +msgid "Disabled - version incompatibility" +msgstr "Отключено - несовместимость версий" -#: ../../mod/photos.php:838 -msgid "Use as profile photo" -msgstr "Использовать в качестве фотографии профиля" +#: ../../Zotlabs/Module/Admin/Addons.php:411 +msgid "Enter the public git repository URL of the addon repo." +msgstr "Введите URL публичного репозитория расширений git" -#: ../../mod/photos.php:862 -msgid "View Full Size" -msgstr "Посмотреть в полный размер" +#: ../../Zotlabs/Module/Admin/Addons.php:412 +msgid "Addon repo git URL" +msgstr "URL репозитория расширений git" -#: ../../mod/photos.php:940 -msgid "Edit photo" -msgstr "Редактировать фотографию" +#: ../../Zotlabs/Module/Admin/Addons.php:413 +msgid "Custom repo name" +msgstr "Пользовательское имя репозитория" -#: ../../mod/photos.php:942 -msgid "Rotate CW (right)" -msgstr "Повернуть CW (направо)" +#: ../../Zotlabs/Module/Admin/Addons.php:413 +msgid "(optional)" +msgstr "(необязательно)" -#: ../../mod/photos.php:943 -msgid "Rotate CCW (left)" -msgstr "Повернуть CCW (налево)" +#: ../../Zotlabs/Module/Admin/Addons.php:414 +msgid "Download Addon Repo" +msgstr "Загрузить репозиторий расширений" -#: ../../mod/photos.php:946 -msgid "New album name" -msgstr "Новое название альбома:" +#: ../../Zotlabs/Module/Admin/Addons.php:421 +msgid "Install new repo" +msgstr "Установить новый репозиторий" -#: ../../mod/photos.php:949 -msgid "Caption" -msgstr "Подпись" +#: ../../Zotlabs/Module/Admin/Addons.php:445 +msgid "Manage Repos" +msgstr "Управление репозиториями" -#: ../../mod/photos.php:951 -msgid "Add a Tag" -msgstr "Добавить тег" +#: ../../Zotlabs/Module/Admin/Addons.php:446 +msgid "Installed Addon Repositories" +msgstr "Установленные репозитории расширений" -#: ../../mod/photos.php:954 -msgid "" -"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping" -msgstr "Например: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping" +#: ../../Zotlabs/Module/Admin/Addons.php:447 +msgid "Install a New Addon Repository" +msgstr "Установить новый репозиторий расширений" -#: ../../mod/photos.php:1107 -msgid "In This Photo:" -msgstr "" +#: ../../Zotlabs/Module/Admin/Addons.php:454 +msgid "Switch branch" +msgstr "Переключить ветку" -#: ../../mod/photos.php:1182 -msgid "View Album" -msgstr "Посмотреть фотоальбом" +#: ../../Zotlabs/Module/Admin/Site.php:172 +msgid "Site settings updated." +msgstr "Настройки сайта обновлены." -#: ../../mod/photos.php:1191 -msgid "Recent Photos" -msgstr "Последние фотографии" +#: ../../Zotlabs/Module/Admin/Site.php:209 +#: ../../Zotlabs/Module/Settings/Display.php:130 +#, php-format +msgid "%s - (Incompatible)" +msgstr "%s - (несовместимо)" -#: ../../mod/sources.php:32 -msgid "Failed to create source. No channel selected." -msgstr "" +#: ../../Zotlabs/Module/Admin/Site.php:216 +msgid "mobile" +msgstr "мобильный" -#: ../../mod/sources.php:45 -msgid "Source created." -msgstr "Источник создан" +#: ../../Zotlabs/Module/Admin/Site.php:218 +msgid "experimental" +msgstr "экспериментальный" -#: ../../mod/sources.php:57 -msgid "Source updated." -msgstr "Источник обновлен." +#: ../../Zotlabs/Module/Admin/Site.php:220 +msgid "unsupported" +msgstr "неподдерживаемый" -#: ../../mod/sources.php:82 -msgid "*" -msgstr "*" +#: ../../Zotlabs/Module/Admin/Site.php:267 +msgid "Yes - with approval" +msgstr "Да - требует подтверждения" -#: ../../mod/sources.php:89 -msgid "Manage remote sources of content for your channel." -msgstr "" +#: ../../Zotlabs/Module/Admin/Site.php:273 +msgid "My site is not a public server" +msgstr "Мой сайт не является публичным сервером" -#: ../../mod/sources.php:90 ../../mod/sources.php:100 -msgid "New Source" -msgstr "Новый источник" +#: ../../Zotlabs/Module/Admin/Site.php:274 +msgid "My site has paid access only" +msgstr "Мой сайт доступен только с оплатой " -#: ../../mod/sources.php:101 ../../mod/sources.php:133 -msgid "" -"Import all or selected content from the following channel into this channel " -"and distribute it according to your channel settings." -msgstr "" +#: ../../Zotlabs/Module/Admin/Site.php:275 +msgid "My site has free access only" +msgstr "На моём сайте разрешён свободный доступ" -#: ../../mod/sources.php:102 ../../mod/sources.php:134 -msgid "Only import content with these words (one per line)" -msgstr "" +#: ../../Zotlabs/Module/Admin/Site.php:276 +msgid "My site offers free accounts with optional paid upgrades" +msgstr "На моём сайте разрешены бесплатные аккаунты с дополнительными платными услугами" -#: ../../mod/sources.php:102 ../../mod/sources.php:134 -msgid "Leave blank to import all public content" -msgstr "" +#: ../../Zotlabs/Module/Admin/Site.php:288 +msgid "Beginner/Basic" +msgstr "Начинающий/Базовый" -#: ../../mod/sources.php:103 ../../mod/sources.php:137 -#: ../../mod/new_channel.php:110 -msgid "Channel Name" -msgstr "Имя канала" +#: ../../Zotlabs/Module/Admin/Site.php:289 +msgid "Novice - not skilled but willing to learn" +msgstr "Новичок - не опытный, но желающий учиться" -#: ../../mod/sources.php:123 ../../mod/sources.php:150 -msgid "Source not found." -msgstr "Источник не найден." +#: ../../Zotlabs/Module/Admin/Site.php:290 +msgid "Intermediate - somewhat comfortable" +msgstr "Промежуточный - более удобный" -#: ../../mod/sources.php:130 -msgid "Edit Source" -msgstr "Редактировать источник" +#: ../../Zotlabs/Module/Admin/Site.php:291 +msgid "Advanced - very comfortable" +msgstr "Продвинутый - очень удобный" -#: ../../mod/sources.php:131 -msgid "Delete Source" -msgstr "Удалить источник" +#: ../../Zotlabs/Module/Admin/Site.php:292 +msgid "Expert - I can write computer code" +msgstr "Эксперт - я умею программировать" -#: ../../mod/sources.php:158 -msgid "Source removed" -msgstr "Источник удален" +#: ../../Zotlabs/Module/Admin/Site.php:293 +msgid "Wizard - I probably know more than you do" +msgstr "Волшебник - возможно я знаю больше чем ты" -#: ../../mod/sources.php:160 -msgid "Unable to remove source." -msgstr "" +#: ../../Zotlabs/Module/Admin/Site.php:299 +msgid "Default permission role for new accounts" +msgstr "Разрешения по умолчанию для новых аккаунтов" -#: ../../mod/filer.php:49 -msgid "- select -" -msgstr "- выбрать -" +#: ../../Zotlabs/Module/Admin/Site.php:299 +msgid "" +"This role will be used for the first channel created after registration." +msgstr "Эта роль будет использоваться для первого канала, созданного после регистрации." -#: ../../mod/events.php:72 -msgid "Event title and start time are required." -msgstr "Название события и время начала требуется." +#: ../../Zotlabs/Module/Admin/Site.php:310 +#: ../../Zotlabs/Module/Register.php:278 +msgid "Registration" +msgstr "Регистрация" -#: ../../mod/events.php:310 -msgid "l, F j" -msgstr "l, F j" +#: ../../Zotlabs/Module/Admin/Site.php:311 +msgid "File upload" +msgstr "Загрузка файла" -#: ../../mod/events.php:332 -msgid "Edit event" -msgstr "Редактировать мероприятие" +#: ../../Zotlabs/Module/Admin/Site.php:312 +msgid "Policies" +msgstr "Правила" -#: ../../mod/events.php:378 -msgid "Create New Event" -msgstr "Создать новое мероприятие" +#: ../../Zotlabs/Module/Admin/Site.php:319 +msgid "Site default technical skill level" +msgstr "Уровень технических навыков на сайте по умолчанию" -#: ../../mod/events.php:379 -msgid "Previous" -msgstr "Предыдущая" +#: ../../Zotlabs/Module/Admin/Site.php:319 +msgid "Used to provide a member experience matched to technical comfort level" +msgstr "Используется чтобы обеспечить удобство на уровне технических навыков пользователя" -#: ../../mod/events.php:450 -msgid "hour:minute" -msgstr "часы:минуты" +#: ../../Zotlabs/Module/Admin/Site.php:321 +msgid "Lock the technical skill level setting" +msgstr "Заблокировать уровень технических навыков" -#: ../../mod/events.php:470 -msgid "Event details" -msgstr "Детали мероприятия" +#: ../../Zotlabs/Module/Admin/Site.php:321 +msgid "Members can set their own technical comfort level by default" +msgstr "Участники могут выбрать уровень своих технических навыков по умолчанию" -#: ../../mod/events.php:471 -#, php-format -msgid "Format is %s %s. Starting date and Title are required." -msgstr "Формат: %s %s. Дата начала и название необходимы." +#: ../../Zotlabs/Module/Admin/Site.php:323 +msgid "Banner/Logo" +msgstr "Баннер / логотип" -#: ../../mod/events.php:473 -msgid "Event Starts:" -msgstr "Начало мероприятия:" +#: ../../Zotlabs/Module/Admin/Site.php:323 +msgid "Unfiltered HTML/CSS/JS is allowed" +msgstr "Разрешён нефильтруемый HTML/CSS/JS" -#: ../../mod/events.php:473 ../../mod/events.php:487 ../../mod/appman.php:91 -#: ../../mod/appman.php:92 -msgid "Required" -msgstr "Необходимо" +#: ../../Zotlabs/Module/Admin/Site.php:324 +msgid "Administrator Information" +msgstr "Информация об администраторе" -#: ../../mod/events.php:476 -msgid "Finish date/time is not known or not relevant" -msgstr "Дата окончания или время окончания не известно / не релевантно." +#: ../../Zotlabs/Module/Admin/Site.php:324 +msgid "" +"Contact information for site administrators. Displayed on siteinfo page. " +"BBCode can be used here" +msgstr "Контактная информация для администраторов сайта. Показывается на информационной странице сайта. Можно использовать BBCode." -#: ../../mod/events.php:478 -msgid "Event Finishes:" -msgstr "\t\nКонец мероприятий:" +#: ../../Zotlabs/Module/Admin/Site.php:325 +msgid "" +"Publicly visible description of this site. Displayed on siteinfo page. " +"BBCode can be used here" +msgstr "Публичное видимое описание сайта. Показывается на информационной странице сайта. Можно использовать BBCode." -#: ../../mod/events.php:481 -msgid "Adjust for viewer timezone" -msgstr "Отрегулируйте для просмотра часовых поясов" +#: ../../Zotlabs/Module/Admin/Site.php:326 +msgid "System language" +msgstr "Язык системы" -#: ../../mod/events.php:483 -msgid "Description:" -msgstr "Описание:" +#: ../../Zotlabs/Module/Admin/Site.php:327 +msgid "System theme" +msgstr "Системная тема" -#: ../../mod/events.php:487 -msgid "Title:" -msgstr "Заголовок:" +#: ../../Zotlabs/Module/Admin/Site.php:327 +msgid "" +"Default system theme - may be over-ridden by user profiles - <a href='#' " +"id='cnftheme'>change theme settings</a>" +msgstr "Системная тема по умолчанию - может быть изменена в профиле пользователя - <a href='#' id='cnftheme'>изменить параметры темы</a>." -#: ../../mod/events.php:489 -msgid "Share this event" -msgstr "Поделиться этим мероприятием" +#: ../../Zotlabs/Module/Admin/Site.php:330 +msgid "Allow Feeds as Connections" +msgstr "Разрешить ленты новостей как контакты" -#: ../../mod/filestorage.php:68 -msgid "Permission Denied." -msgstr "Доступ запрещен." +#: ../../Zotlabs/Module/Admin/Site.php:330 +msgid "(Heavy system resource usage)" +msgstr "(Высокое использование системных ресурсов)" -#: ../../mod/filestorage.php:85 -msgid "File not found." -msgstr "Файл не найден." +#: ../../Zotlabs/Module/Admin/Site.php:331 +msgid "Maximum image size" +msgstr "Максимальный размер изображения" -#: ../../mod/filestorage.php:122 -msgid "Edit file permissions" -msgstr "Редактировать разрешения файла" +#: ../../Zotlabs/Module/Admin/Site.php:331 +msgid "" +"Maximum size in bytes of uploaded images. Default is 0, which means no " +"limits." +msgstr "Максимальный размер загруженных изображений в байтах. По умолчанию 0 или без ограничений." -#: ../../mod/filestorage.php:131 -msgid "Set/edit permissions" -msgstr "" +#: ../../Zotlabs/Module/Admin/Site.php:332 +msgid "Does this site allow new member registration?" +msgstr "Разрешается ли регистрация новых пользователей на этом сайте?" -#: ../../mod/filestorage.php:132 -msgid "Include all files and sub folders" -msgstr "" +#: ../../Zotlabs/Module/Admin/Site.php:333 +msgid "Invitation only" +msgstr "Только по приглашениям" -#: ../../mod/filestorage.php:133 -msgid "Return to file list" +#: ../../Zotlabs/Module/Admin/Site.php:333 +msgid "" +"Only allow new member registrations with an invitation code. Above register " +"policy must be set to Yes." msgstr "" +"Регистрация пользователей разрешается только по приглашениям. Вышеуказанная " +"политика регистрация должны быть установлена в \"Да\"." -#: ../../mod/filestorage.php:135 -msgid "Copy/paste this code to attach file to a post" -msgstr "" +#: ../../Zotlabs/Module/Admin/Site.php:334 +msgid "Minimum age" +msgstr "Минимальный возраст" -#: ../../mod/filestorage.php:136 -msgid "Copy/paste this URL to link file from a web page" -msgstr "" +#: ../../Zotlabs/Module/Admin/Site.php:334 +msgid "Minimum age (in years) for who may register on this site." +msgstr "Минимальный возраст (в годах) для регистрации на этом сайте." -#: ../../mod/follow.php:25 -msgid "Channel added." -msgstr "Контакт добавлен." +#: ../../Zotlabs/Module/Admin/Site.php:335 +msgid "Which best describes the types of account offered by this hub?" +msgstr "Как лучше описать тип учётных записей предлагаемых на этом хабе?" -#: ../../mod/subthread.php:103 -#, php-format -msgid "%1$s is following %2$s's %3$s" -msgstr "%1$s следит %2$s's %3$s" +#: ../../Zotlabs/Module/Admin/Site.php:336 +msgid "Register text" +msgstr "Текст регистрации" -#: ../../mod/fsuggest.php:20 ../../mod/fsuggest.php:92 -msgid "Contact not found." -msgstr "Контакт не найден." +#: ../../Zotlabs/Module/Admin/Site.php:336 +msgid "Will be displayed prominently on the registration page." +msgstr "Будет отображаться на странице регистрации на видном месте." -#: ../../mod/fsuggest.php:63 -msgid "Friend suggestion sent." -msgstr "Предложение дружить отправлено." +#: ../../Zotlabs/Module/Admin/Site.php:338 +msgid "Site homepage to show visitors (default: login box)" +msgstr "Домашняя страница, которая будет показываться посетителям сайт (по умочанию - форма входа)." -#: ../../mod/fsuggest.php:97 -msgid "Suggest Friends" -msgstr "Пригласить друзей" +#: ../../Zotlabs/Module/Admin/Site.php:338 +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 "например: 'public' для показа публичного потока, 'page/sys/home' показывает системную страницу home или 'include:home.html' для подключения файла." -#: ../../mod/fsuggest.php:99 -#, php-format -msgid "Suggest a friend for %s" -msgstr "" +#: ../../Zotlabs/Module/Admin/Site.php:339 +msgid "Preserve site homepage URL" +msgstr "Сохранить URL главной страницы сайта" -#: ../../mod/suggest.php:35 +#: ../../Zotlabs/Module/Admin/Site.php:339 msgid "" -"No suggestions available. If this is a new site, please try again in 24 " -"hours." -msgstr "" +"Present the site homepage in a frame at the original location instead of " +"redirecting" +msgstr "Показывать домашнюю страницу сайта во фрейме вместо стандартной переадресации" -#: ../../mod/group.php:20 -msgid "Collection created." -msgstr "Коллекция создана." +#: ../../Zotlabs/Module/Admin/Site.php:340 +msgid "Accounts abandoned after x days" +msgstr "Аккаунты считаются заброшенными после N дней" -#: ../../mod/group.php:26 -msgid "Could not create collection." -msgstr "Не удалось создать коллекцию." +#: ../../Zotlabs/Module/Admin/Site.php:340 +msgid "" +"Will not waste system resources polling external sites for abandonded " +"accounts. Enter 0 for no time limit." +msgstr "Системные ресурсы не будут расходоваться для опроса внешних сайтов для заброшенных аккаунтов. Введите 0 для отсутствия ограничений." -#: ../../mod/group.php:54 -msgid "Collection updated." -msgstr "" +#: ../../Zotlabs/Module/Admin/Site.php:341 +msgid "Allowed friend domains" +msgstr "Разрешенные домены друзей" -#: ../../mod/group.php:86 -msgid "Create a collection of channels." -msgstr "Создать коллекцию контактов" +#: ../../Zotlabs/Module/Admin/Site.php:341 +msgid "" +"Comma separated list of domains which are allowed to establish friendships " +"with this site. Wildcards are accepted. Empty to allow any domains" +msgstr "Список разделённых запятыми доменов с которыми разрешено устанавливать дружеские отношения на этом сайте. Wildcards разрешены. Пусто означает разрешены любые домены." -#: ../../mod/group.php:87 ../../mod/group.php:183 -msgid "Collection Name: " -msgstr "Название коллекции:" +#: ../../Zotlabs/Module/Admin/Site.php:342 +msgid "Verify Email Addresses" +msgstr "Проверка адреса электронной почты" -#: ../../mod/group.php:89 ../../mod/group.php:186 -msgid "Members are visible to other channels" -msgstr "Пользователи могут видеть другие каналы" +#: ../../Zotlabs/Module/Admin/Site.php:342 +msgid "" +"Check to verify email addresses used in account registration (recommended)." +msgstr "Включите для проверки адреса электронной почты использованного при регистрации (рекомендуется)." -#: ../../mod/group.php:107 -msgid "Collection removed." -msgstr "Коллекция удалена." +#: ../../Zotlabs/Module/Admin/Site.php:343 +msgid "Force publish" +msgstr "Принудительно публиковать" -#: ../../mod/group.php:109 -msgid "Unable to remove collection." -msgstr "Невозможно удалить коллекцию." +#: ../../Zotlabs/Module/Admin/Site.php:343 +msgid "" +"Check to force all profiles on this site to be listed in the site directory." +msgstr "Включите для принудительного включения всех учётных записей на данном сайте в каталог." -#: ../../mod/group.php:182 -msgid "Collection Editor" -msgstr "Редактор коллекций" +#: ../../Zotlabs/Module/Admin/Site.php:344 +msgid "Import Public Streams" +msgstr "Импортированные публичные потоки" -#: ../../mod/group.php:196 -msgid "Members" -msgstr "Участники" +#: ../../Zotlabs/Module/Admin/Site.php:344 +msgid "" +"Import and allow access to public content pulled from other sites. Warning: " +"this content is unmoderated." +msgstr "Импортировать и разрешить публичный доступ к загружаемым с других сайтов потоков. Внимание - этот контент не может модерироваться." -#: ../../mod/group.php:198 -msgid "All Connected Channels" -msgstr "Все подключенные контакы" +#: ../../Zotlabs/Module/Admin/Site.php:345 +msgid "Site only Public Streams" +msgstr "Публичные потоки только с сайта" -#: ../../mod/group.php:231 -msgid "Click on a channel to add or remove." -msgstr "Нажмите на канал, чтобы добавить или удалить." +#: ../../Zotlabs/Module/Admin/Site.php:345 +msgid "" +"Allow access to public content originating only from this site if Imported " +"Public Streams are disabled." +msgstr "Разрешить доступ к общедоступному контенту, исходящему только с этого сайта, если импортированные публичные потоки отключены." -#: ../../mod/tagger.php:98 -#, php-format -msgid "%1$s tagged %2$s's %3$s with %4$s" +#: ../../Zotlabs/Module/Admin/Site.php:346 +msgid "Allow anybody on the internet to access the Public streams" +msgstr "Разрешить всем доступ к публичным потокам" + +#: ../../Zotlabs/Module/Admin/Site.php:346 +msgid "" +"Disable to require authentication before viewing. Warning: this content is " +"unmoderated." +msgstr "Отключите если для просмотра требуется аутентификация. Внимание - этот контент не может модерироваться." + +#: ../../Zotlabs/Module/Admin/Site.php:347 +msgid "Only import Public stream posts with this text" +msgstr "Импортировать только публичные потоки с этим текстом" + +#: ../../Zotlabs/Module/Admin/Site.php:348 +msgid "Do not import Public stream posts with this text" +msgstr "Не импортировать публичные потоки с этим текстом" + +#: ../../Zotlabs/Module/Admin/Site.php:351 +msgid "Login on Homepage" +msgstr "Вход на домашней странице" + +#: ../../Zotlabs/Module/Admin/Site.php:351 +msgid "" +"Present a login box to visitors on the home page if no other content has " +"been configured." +msgstr "Предоставлять форму входа для посетителей на домашней странице если другого содержимого не настроено." + +#: ../../Zotlabs/Module/Admin/Site.php:352 +msgid "Enable context help" +msgstr "Включить контекстную помощь" + +#: ../../Zotlabs/Module/Admin/Site.php:352 +msgid "" +"Display contextual help for the current page when the help button is pressed." msgstr "" +"Показывать контекстную помощь для текущей странице при нажатии на кнопку \"Помощь\"." -#: ../../mod/help.php:43 ../../mod/help.php:49 ../../mod/help.php:55 -msgid "Help:" -msgstr "Помощь:" +#: ../../Zotlabs/Module/Admin/Site.php:354 +msgid "Reply-to email address for system generated email." +msgstr "Адрес email Reply-to для генерируемых системой сообщений." -#: ../../mod/help.php:69 ../../index.php:233 -msgid "Not Found" -msgstr "Не найдено" +#: ../../Zotlabs/Module/Admin/Site.php:355 +msgid "Sender (From) email address for system generated email." +msgstr "Адрес email отправителя (From) для генерируемых системой сообщений." -#: ../../mod/tagrm.php:41 -msgid "Tag removed" -msgstr "Тег удален" +#: ../../Zotlabs/Module/Admin/Site.php:356 +msgid "Name of email sender for system generated email." +msgstr "Имя отправителя для генерируемых системой сообщений." -#: ../../mod/tagrm.php:79 -msgid "Remove Item Tag" -msgstr "Удалить Тег" +#: ../../Zotlabs/Module/Admin/Site.php:358 +msgid "Directory Server URL" +msgstr "URL сервера каталогов" -#: ../../mod/tagrm.php:81 -msgid "Select a tag to remove: " -msgstr "Выбрать тег для удаления: " +#: ../../Zotlabs/Module/Admin/Site.php:358 +msgid "Default directory server" +msgstr "Сервер каталогов по умолчанию" -#: ../../mod/admin.php:52 -msgid "Theme settings updated." -msgstr "Настройки темы обновленны." +#: ../../Zotlabs/Module/Admin/Site.php:360 +msgid "Proxy user" +msgstr "Имя пользователя proxy-сервера" -#: ../../mod/admin.php:92 ../../mod/admin.php:441 -msgid "Site" -msgstr "Сайт" +#: ../../Zotlabs/Module/Admin/Site.php:361 +msgid "Proxy URL" +msgstr "URL proxy-сервера" -#: ../../mod/admin.php:93 -msgid "Accounts" -msgstr "Пользователи" +#: ../../Zotlabs/Module/Admin/Site.php:362 +msgid "Network timeout" +msgstr "Время ожидания сети" -#: ../../mod/admin.php:94 ../../mod/admin.php:885 -msgid "Channels" -msgstr "Каналы" +#: ../../Zotlabs/Module/Admin/Site.php:362 +msgid "Value is in seconds. Set to 0 for unlimited (not recommended)." +msgstr "Значение в секундах. Если установлен в 0 - без ограничений (не рекомендуется)." -#: ../../mod/admin.php:95 ../../mod/admin.php:976 ../../mod/admin.php:1018 -msgid "Plugins" -msgstr "Плагины" +#: ../../Zotlabs/Module/Admin/Site.php:363 +msgid "Delivery interval" +msgstr "Интервал доставки" -#: ../../mod/admin.php:96 ../../mod/admin.php:1181 ../../mod/admin.php:1217 -msgid "Themes" -msgstr "Темы" +#: ../../Zotlabs/Module/Admin/Site.php:363 +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 "Значение задержки фоновых процессов доставки в секундах для снижения нагрузки на систему. Рекомендуется 4-5 для серверов совместного использования, 2-3 для частных виртуальных и 0-1 для выделенных серверов." -#: ../../mod/admin.php:97 ../../mod/admin.php:541 -msgid "Server" -msgstr "Серверы" +#: ../../Zotlabs/Module/Admin/Site.php:364 +msgid "Deliveries per process" +msgstr "Доставок на процесс" -#: ../../mod/admin.php:98 -msgid "DB updates" -msgstr "Обновление базы данных" +#: ../../Zotlabs/Module/Admin/Site.php:364 +msgid "" +"Number of deliveries to attempt in a single operating system process. Adjust " +"if necessary to tune system performance. Recommend: 1-5." +msgstr "Количество доставок для одного процесса. Настройте в соответствии с производительностью системы. Рекомендуется 1-5." -#: ../../mod/admin.php:112 ../../mod/admin.php:119 ../../mod/admin.php:1304 -msgid "Logs" -msgstr "Журналы" +#: ../../Zotlabs/Module/Admin/Site.php:365 +msgid "Queue Threshold" +msgstr "Порог очереди" -#: ../../mod/admin.php:118 -msgid "Plugin Features" -msgstr "Функции плагинов" +#: ../../Zotlabs/Module/Admin/Site.php:365 +msgid "" +"Always defer immediate delivery if queue contains more than this number of " +"entries." +msgstr "Всегда откладывать немедленную доставку, если в очереди содержится большее количество записей, чем это." -#: ../../mod/admin.php:120 -msgid "User registrations waiting for confirmation" -msgstr "Регистрации пользователей, которые ждут подтверждения" +#: ../../Zotlabs/Module/Admin/Site.php:366 +msgid "Poll interval" +msgstr "Интервал опроса" -#: ../../mod/admin.php:197 -msgid "Message queues" -msgstr "Очередь недоставленных сообщений" +#: ../../Zotlabs/Module/Admin/Site.php:366 +msgid "" +"Delay background polling processes by this many seconds to reduce system " +"load. If 0, use delivery interval." +msgstr "Задержка фоновых процессов опроса на указанное количество секунд для снижения нагрузки на систему. Если 0 - использовать интервал доставки." -#: ../../mod/admin.php:202 ../../mod/admin.php:440 ../../mod/admin.php:540 -#: ../../mod/admin.php:749 ../../mod/admin.php:884 ../../mod/admin.php:975 -#: ../../mod/admin.php:1017 ../../mod/admin.php:1180 ../../mod/admin.php:1216 -#: ../../mod/admin.php:1303 -msgid "Administration" -msgstr "Администрация" +#: ../../Zotlabs/Module/Admin/Site.php:367 +msgid "Path to ImageMagick convert program" +msgstr "Путь к ImageMagick" -#: ../../mod/admin.php:203 -msgid "Summary" -msgstr "Резюме" +#: ../../Zotlabs/Module/Admin/Site.php:367 +msgid "" +"If set, use this program to generate photo thumbnails for huge images ( > " +"4000 pixels in either dimension), otherwise memory exhaustion may occur. " +"Example: /usr/bin/convert" +msgstr "При установке эта программа генерирует миниатюры изображений для больших файлов (свыше 4000 в любом измерении) для предотвращения утечки памяти. Пример: /usr/bin/convert" -#: ../../mod/admin.php:205 -msgid "Registered users" -msgstr "Всего пользователeй" +#: ../../Zotlabs/Module/Admin/Site.php:368 +msgid "Allow SVG thumbnails in file browser" +msgstr "Разрешить SVG миниатюры в просмотрщике файлов" -#: ../../mod/admin.php:207 ../../mod/admin.php:544 -msgid "Pending registrations" -msgstr "Ждут утверждения" +#: ../../Zotlabs/Module/Admin/Site.php:368 +msgid "WARNING: SVG images may contain malicious code." +msgstr "Внимание: изображения SVG могут содержать вредоносный код." -#: ../../mod/admin.php:208 -msgid "Version" -msgstr "Версия системы" +#: ../../Zotlabs/Module/Admin/Site.php:369 +msgid "Maximum Load Average" +msgstr "Максимальная средняя нагрузка" -#: ../../mod/admin.php:210 ../../mod/admin.php:545 -msgid "Active plugins" -msgstr "Активные плагины" +#: ../../Zotlabs/Module/Admin/Site.php:369 +msgid "" +"Maximum system load before delivery and poll processes are deferred - " +"default 50." +msgstr "Максимальная нагрузка системы для откладывания процессов опроса и доставки - по умолчанию 50." -#: ../../mod/admin.php:361 -msgid "Site settings updated." -msgstr "Настройки сайта обновлены." +#: ../../Zotlabs/Module/Admin/Site.php:370 +msgid "Expiration period in days for imported (grid/network) content" +msgstr "Срок хранения в днях для импортированного содержимого (из матрицы / сети)." -#: ../../mod/admin.php:392 -msgid "No special theme for accessibility" -msgstr "" +#: ../../Zotlabs/Module/Admin/Site.php:370 +msgid "0 for no expiration of imported content" +msgstr "0 для постоянного хранения импортированного содержимого" -#: ../../mod/admin.php:421 -msgid "Yes - with approval" -msgstr "" +#: ../../Zotlabs/Module/Admin/Site.php:371 +msgid "" +"Do not expire any posts which have comments less than this many days ago" +msgstr "Продлевать строк хранения для любых публикаций, которые имею комментарии возрастом менее этого значения" -#: ../../mod/admin.php:427 -msgid "My site is not a public server" -msgstr "" +#: ../../Zotlabs/Module/Admin/Site.php:373 +msgid "" +"Public servers: Optional landing (marketing) webpage for new registrants" +msgstr "Публичные серверы: необязательная маркетинговая лэндинг-страница для новых пользователей" -#: ../../mod/admin.php:428 -msgid "My site has paid access only" -msgstr "" +#: ../../Zotlabs/Module/Admin/Site.php:373 +#, php-format +msgid "Create this page first. Default is %s/register" +msgstr "Создать эту страницу первой. По умолчанию %s/register" -#: ../../mod/admin.php:429 -msgid "My site has free access only" -msgstr "" +#: ../../Zotlabs/Module/Admin/Site.php:374 +msgid "Page to display after creating a new channel" +msgstr "Страница для показа после создания нового канала" -#: ../../mod/admin.php:430 -msgid "My site offers free accounts with optional paid upgrades" -msgstr "" +#: ../../Zotlabs/Module/Admin/Site.php:374 +msgid "Default: profiles" +msgstr "По умолчанию: профили" -#: ../../mod/admin.php:444 -msgid "File upload" -msgstr "Загрузка файла" +#: ../../Zotlabs/Module/Admin/Site.php:376 +msgid "Optional: site location" +msgstr "Необязательно: место размещения сайта" -#: ../../mod/admin.php:445 -msgid "Policies" -msgstr "Правила" +#: ../../Zotlabs/Module/Admin/Site.php:376 +msgid "Region or country" +msgstr "Регион или страна" -#: ../../mod/admin.php:450 -msgid "Site name" -msgstr "Название сайта" +#: ../../Zotlabs/Module/Admin/Logs.php:28 +msgid "Log settings updated." +msgstr "Настройки журнала обновлены." -#: ../../mod/admin.php:451 -msgid "Banner/Logo" -msgstr "Баннер / логотип" +#: ../../Zotlabs/Module/Admin/Logs.php:85 +msgid "Clear" +msgstr "Очистить" -#: ../../mod/admin.php:452 -msgid "Administrator Information" -msgstr "Информация об администраторе" +#: ../../Zotlabs/Module/Admin/Logs.php:91 +msgid "Debugging" +msgstr "Отладка" -#: ../../mod/admin.php:452 +#: ../../Zotlabs/Module/Admin/Logs.php:92 +msgid "Log file" +msgstr "Файл журнала" + +#: ../../Zotlabs/Module/Admin/Logs.php:92 msgid "" -"Contact information for site administrators. Displayed on siteinfo page. " -"BBCode can be used here" -msgstr "" +"Must be writable by web server. Relative to your top-level webserver " +"directory." +msgstr "Должен быть доступен для записи веб-сервером. Пусть относителен основного каталога веб-сайта." -#: ../../mod/admin.php:453 -msgid "System language" -msgstr "Язык системы" +#: ../../Zotlabs/Module/Admin/Logs.php:93 +msgid "Log level" +msgstr "Уровень журнала" -#: ../../mod/admin.php:454 -msgid "System theme" -msgstr "Тема системы" +#: ../../Zotlabs/Module/Admin/Accounts.php:37 +#, php-format +msgid "%s account blocked/unblocked" +msgid_plural "%s account blocked/unblocked" +msgstr[0] "%s аккаунт блокирован/разблокирован" +msgstr[1] "%s аккаунта блокированы/разблокированы" +msgstr[2] "%s аккаунтов блокированы/разблокированы" -#: ../../mod/admin.php:454 -msgid "" -"Default system theme - may be over-ridden by user profiles - <a href='#' " -"id='cnftheme'>change theme settings</a>" -msgstr "" +#: ../../Zotlabs/Module/Admin/Accounts.php:44 +#, php-format +msgid "%s account deleted" +msgid_plural "%s accounts deleted" +msgstr[0] "%s аккаунт удалён" +msgstr[1] "%s аккаунта удалёны" +msgstr[2] "%s аккаунтов удалёны" -#: ../../mod/admin.php:455 -msgid "Mobile system theme" -msgstr "Мобильная тема системы" +#: ../../Zotlabs/Module/Admin/Accounts.php:80 +msgid "Account not found" +msgstr "Аккаунт не найден" -#: ../../mod/admin.php:455 -msgid "Theme for mobile devices" -msgstr "Тема для мобильных устройств" +#: ../../Zotlabs/Module/Admin/Accounts.php:99 +#, php-format +msgid "Account '%s' blocked" +msgstr "Аккаунт '%s' заблокирован" -#: ../../mod/admin.php:456 -msgid "Accessibility system theme" -msgstr "" +#: ../../Zotlabs/Module/Admin/Accounts.php:107 +#, php-format +msgid "Account '%s' unblocked" +msgstr "Аккаунт '%s' разблокирован" -#: ../../mod/admin.php:456 -msgid "Accessibility theme" -msgstr "" +#: ../../Zotlabs/Module/Admin/Accounts.php:169 +#: ../../Zotlabs/Module/Admin/Channels.php:148 +msgid "select all" +msgstr "выбрать все" -#: ../../mod/admin.php:457 -msgid "Channel to use for this website's static pages" -msgstr "" +#: ../../Zotlabs/Module/Admin/Accounts.php:170 +msgid "Registrations waiting for confirm" +msgstr "Регистрации ждут подтверждения" -#: ../../mod/admin.php:457 -msgid "Site Channel" -msgstr "Канал сайта" +#: ../../Zotlabs/Module/Admin/Accounts.php:171 +msgid "Request date" +msgstr "Дата запроса" -#: ../../mod/admin.php:459 -msgid "Maximum image size" -msgstr "Максимальный размер" +#: ../../Zotlabs/Module/Admin/Accounts.php:172 +msgid "No registrations." +msgstr "Нет новых регистраций." -#: ../../mod/admin.php:459 -msgid "" -"Maximum size in bytes of uploaded images. Default is 0, which means no " -"limits." +#: ../../Zotlabs/Module/Admin/Accounts.php:182 +msgid "ID" msgstr "" -#: ../../mod/admin.php:460 -msgid "Does this site allow new member registration?" -msgstr "" +#: ../../Zotlabs/Module/Admin/Accounts.php:184 +msgid "All Channels" +msgstr "Все каналы" -#: ../../mod/admin.php:461 -msgid "Which best describes the types of account offered by this hub?" -msgstr "" +#: ../../Zotlabs/Module/Admin/Accounts.php:185 +msgid "Register date" +msgstr "Дата регистрации" -#: ../../mod/admin.php:462 -msgid "Register text" -msgstr "Текст регистрации" +#: ../../Zotlabs/Module/Admin/Accounts.php:186 +msgid "Last login" +msgstr "Последний вход" -#: ../../mod/admin.php:462 -msgid "Will be displayed prominently on the registration page." -msgstr "" +#: ../../Zotlabs/Module/Admin/Accounts.php:187 +msgid "Expires" +msgstr "Срок действия" -#: ../../mod/admin.php:463 -msgid "Accounts abandoned after x days" -msgstr "" +#: ../../Zotlabs/Module/Admin/Accounts.php:188 +msgid "Service Class" +msgstr "Класс обслуживания" -#: ../../mod/admin.php:463 +#: ../../Zotlabs/Module/Admin/Accounts.php:190 msgid "" -"Will not waste system resources polling external sites for abandonded " -"accounts. Enter 0 for no time limit." +"Selected accounts will be deleted!\\n\\nEverything these accounts had posted " +"on this site will be permanently deleted!\\n\\nAre you sure?" msgstr "" +"Выбранные учётные записи будут удалены!\n\nВсё что было ими опубликовано на " +"этом сайте будет удалено навсегда!\n\nВы уверены?" -#: ../../mod/admin.php:464 -msgid "Allowed friend domains" -msgstr "Разрешенные домены друзей" - -#: ../../mod/admin.php:464 +#: ../../Zotlabs/Module/Admin/Accounts.php:191 msgid "" -"Comma separated list of domains which are allowed to establish friendships " -"with this site. Wildcards are accepted. Empty to allow any domains" +"The account {0} will be deleted!\\n\\nEverything this account has posted on " +"this site will be permanently deleted!\\n\\nAre you sure?" msgstr "" +"Этот аккаунт {0} будет удалён!\n\nВсё что им было опубликовано на этом сайте " +"будет удалено навсегда!\n\nВы уверены?" -#: ../../mod/admin.php:465 -msgid "Allowed email domains" -msgstr "Разрешенные домены электронной почты" - -#: ../../mod/admin.php:465 +#: ../../Zotlabs/Module/Admin/Security.php:83 msgid "" -"Comma separated list of domains which are allowed in email addresses for " -"registrations to this site. Wildcards are accepted. Empty to allow any " -"domains" +"By default, unfiltered HTML is allowed in embedded media. This is inherently " +"insecure." msgstr "" +"По умолчанию, HTML без фильтрации доступен во встраиваемых медиа. Это небезопасно." -#: ../../mod/admin.php:466 -msgid "Block public" -msgstr "Блокировать публичный доступ" - -#: ../../mod/admin.php:466 +#: ../../Zotlabs/Module/Admin/Security.php:86 msgid "" -"Check to block public access to all otherwise public personal pages on this " -"site unless you are currently logged in." +"The recommended setting is to only allow unfiltered HTML from the following " +"sites:" msgstr "" +"Рекомендуется настроить разрешения использовать HTML без фильтрации только для следующих сайтов:" -#: ../../mod/admin.php:467 -msgid "Force publish" -msgstr "Заставить публиковать" - -#: ../../mod/admin.php:467 +#: ../../Zotlabs/Module/Admin/Security.php:87 msgid "" -"Check to force all profiles on this site to be listed in the site directory." +"https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/" +"<br />https://vimeo.com/<br />https://soundcloud.com/<br />" msgstr "" -#: ../../mod/admin.php:468 -msgid "Disable discovery tab" -msgstr "Отключить вкладку \"обнаруженные\"" +#: ../../Zotlabs/Module/Admin/Security.php:88 +msgid "" +"All other embedded content will be filtered, <strong>unless</strong> " +"embedded content from that site is explicitly blocked." +msgstr "се остальные встроенные материалы будут отфильтрованы, <strong>если </strong> встроенное содержимое с этого сайта явно заблокировано." + +#: ../../Zotlabs/Module/Admin/Security.php:95 +msgid "Block public" +msgstr "Блокировать публичный доступ" -#: ../../mod/admin.php:468 +#: ../../Zotlabs/Module/Admin/Security.php:95 msgid "" -"Remove the tab in the network view with public content pulled from sources " -"chosen for this site." -msgstr "" +"Check to block public access to all otherwise public personal pages on this " +"site unless you are currently authenticated." +msgstr "Установите флажок для блокировки публичного доступа ко всем другим общедоступным страницам на этом сайте, если вы в настоящее время не аутентифицированы." -#: ../../mod/admin.php:469 -msgid "No login on Homepage" -msgstr "" +#: ../../Zotlabs/Module/Admin/Security.php:96 +msgid "Provide a cloud root directory" +msgstr "Предоставить корневой каталог в облаке" -#: ../../mod/admin.php:469 +#: ../../Zotlabs/Module/Admin/Security.php:96 msgid "" -"Check to hide the login form from your sites homepage when visitors arrive " -"who are not logged in (e.g. when you put the content of the homepage in via " -"the site channel)." -msgstr "" +"The cloud root directory lists all channel names which provide public files" +msgstr "В корневом каталоге облака показываются все имена каналов, которые предоставляют общедоступные файлы" -#: ../../mod/admin.php:471 -msgid "Proxy user" -msgstr "Proxy пользователь" +#: ../../Zotlabs/Module/Admin/Security.php:97 +msgid "Show total disk space available to cloud uploads" +msgstr "Показывать общее доступное для загрузок место в хранилище" -#: ../../mod/admin.php:472 -msgid "Proxy URL" -msgstr "Proxy URL" +#: ../../Zotlabs/Module/Admin/Security.php:98 +msgid "Set \"Transport Security\" HTTP header" +msgstr "Установить HTTP-заголовок \"Transport Security\"" -#: ../../mod/admin.php:473 -msgid "Network timeout" -msgstr "Время ожидания сети" +#: ../../Zotlabs/Module/Admin/Security.php:99 +msgid "Set \"Content Security Policy\" HTTP header" +msgstr "Установить HTTP-заголовок \"Content Security Policy\"" -#: ../../mod/admin.php:473 -msgid "Value is in seconds. Set to 0 for unlimited (not recommended)." -msgstr "" +#: ../../Zotlabs/Module/Admin/Security.php:100 +msgid "Allowed email domains" +msgstr "Разрешённые домены email" -#: ../../mod/admin.php:474 -msgid "Delivery interval" -msgstr "Интервал доставки" +#: ../../Zotlabs/Module/Admin/Security.php:100 +msgid "" +"Comma separated list of domains which are allowed in email addresses for " +"registrations to this site. Wildcards are accepted. Empty to allow any " +"domains" +msgstr "Список разделённых запятыми доменов для которых разрешена регистрация на этом сайте. Wildcards разрешены. Если пусто то разрешены любые домены." + +#: ../../Zotlabs/Module/Admin/Security.php:101 +msgid "Not allowed email domains" +msgstr "Запрещённые домены email" -#: ../../mod/admin.php:474 +#: ../../Zotlabs/Module/Admin/Security.php:101 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 "" +"Comma separated list of domains which are not allowed in email addresses for " +"registrations to this site. Wildcards are accepted. Empty to allow any " +"domains, unless allowed domains have been defined." +msgstr "Список разделённых запятыми доменов для которых запрещена регистрация на этом сайте. Wildcards разрешены. Если пусто то разрешены любые домены до тех пор, пока разрешённые домены не будут указаны." -#: ../../mod/admin.php:475 -msgid "Poll interval" -msgstr "Интервал опроса" +#: ../../Zotlabs/Module/Admin/Security.php:102 +msgid "Allow communications only from these sites" +msgstr "Разрешить связь только с этими сайтами" -#: ../../mod/admin.php:475 +#: ../../Zotlabs/Module/Admin/Security.php:102 msgid "" -"Delay background polling processes by this many seconds to reduce system " -"load. If 0, use delivery interval." -msgstr "" +"One site per line. Leave empty to allow communication from anywhere by " +"default" +msgstr "Один сайт на строку. Оставьте пустым для разрешения взаимодействия без ограничений (по умочанию)." -#: ../../mod/admin.php:476 -msgid "Maximum Load Average" -msgstr "" +#: ../../Zotlabs/Module/Admin/Security.php:103 +msgid "Block communications from these sites" +msgstr "Блокировать связь с этими сайтами" + +#: ../../Zotlabs/Module/Admin/Security.php:104 +msgid "Allow communications only from these channels" +msgstr "Разрешить связь только для этих каналов" -#: ../../mod/admin.php:476 +#: ../../Zotlabs/Module/Admin/Security.php:104 msgid "" -"Maximum system load before delivery and poll processes are deferred - " -"default 50." -msgstr "" +"One channel (hash) per line. Leave empty to allow from any channel by default" +msgstr "Один канал (или его хэш) на строку. Оставьте пустым для разрешения взаимодействия с любым каналом (по умолчанию)." -#: ../../mod/admin.php:532 -msgid "No server found" -msgstr "Сервер не найден" +#: ../../Zotlabs/Module/Admin/Security.php:105 +msgid "Block communications from these channels" +msgstr "Блокировать связь с этими каналами" -#: ../../mod/admin.php:539 ../../mod/admin.php:763 -msgid "ID" -msgstr "ID" +#: ../../Zotlabs/Module/Admin/Security.php:106 +msgid "Only allow embeds from secure (SSL) websites and links." +msgstr "Разрешать встраивание только для безопасных (SSL/TLS) сайтов и ссылок." -#: ../../mod/admin.php:539 -msgid "for channel" -msgstr "для канала" +#: ../../Zotlabs/Module/Admin/Security.php:107 +msgid "Allow unfiltered embedded HTML content only from these domains" +msgstr "Разрешить встраивать нефильтруемое HTML-содержимое только для этих доменов" -#: ../../mod/admin.php:539 -msgid "on server" -msgstr "на сервере" +#: ../../Zotlabs/Module/Admin/Security.php:107 +msgid "One site per line. By default embedded content is filtered." +msgstr "Один сайт на строку. По умолчанию встраиваемое содержимое фильтруется." -#: ../../mod/admin.php:539 -msgid "Status" -msgstr "Статус" +#: ../../Zotlabs/Module/Admin/Security.php:108 +msgid "Block embedded HTML from these domains" +msgstr "Блокировать встраивание HTML-содержимого для этих доменов" -#: ../../mod/admin.php:560 +#: ../../Zotlabs/Module/Admin/Dbsync.php:19 msgid "Update has been marked successful" -msgstr "" +msgstr "Обновление было помечено как успешное" -#: ../../mod/admin.php:570 +#: ../../Zotlabs/Module/Admin/Dbsync.php:31 #, php-format msgid "Executing %s failed. Check system logs." -msgstr "" +msgstr "Выполнение %s неудачно. Проверьте системный журнал." -#: ../../mod/admin.php:573 +#: ../../Zotlabs/Module/Admin/Dbsync.php:34 #, php-format msgid "Update %s was successfully applied." -msgstr "" +msgstr "Обновление %sбыло успешно применено." -#: ../../mod/admin.php:577 +#: ../../Zotlabs/Module/Admin/Dbsync.php:38 #, php-format msgid "Update %s did not return a status. Unknown if it succeeded." -msgstr "" +msgstr "Обновление %s не вернуло статус. Неизвестно было ли оно успешным." -#: ../../mod/admin.php:580 +#: ../../Zotlabs/Module/Admin/Dbsync.php:41 #, php-format msgid "Update function %s could not be found." -msgstr "" - -#: ../../mod/admin.php:595 -msgid "No failed updates." -msgstr "Ошибок обновлений нет." +msgstr "Функция обновления %sне может быть найдена." -#: ../../mod/admin.php:599 +#: ../../Zotlabs/Module/Admin/Dbsync.php:59 msgid "Failed Updates" msgstr "Обновления с ошибками" -#: ../../mod/admin.php:601 +#: ../../Zotlabs/Module/Admin/Dbsync.php:61 msgid "Mark success (if update was manually applied)" -msgstr "" +msgstr "Пометить успешным (если обновление было применено вручную)" -#: ../../mod/admin.php:602 +#: ../../Zotlabs/Module/Admin/Dbsync.php:62 msgid "Attempt to execute this update step automatically" -msgstr "" +msgstr "Попытаться применить это обновление автоматически" -#: ../../mod/admin.php:628 -#, php-format -msgid "%s user blocked/unblocked" -msgid_plural "%s users blocked/unblocked" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +#: ../../Zotlabs/Module/Admin/Dbsync.php:67 +msgid "No failed updates." +msgstr "Ошибок обновлений нет." -#: ../../mod/admin.php:635 -#, php-format -msgid "%s user deleted" -msgid_plural "%s users deleted" -msgstr[0] "%s канал удален" -msgstr[1] "%s канала удалены" -msgstr[2] "%s каналов удалено" +#: ../../Zotlabs/Module/Admin/Profs.php:89 +msgid "New Profile Field" +msgstr "Поле нового профиля" + +#: ../../Zotlabs/Module/Admin/Profs.php:90 +#: ../../Zotlabs/Module/Admin/Profs.php:110 +msgid "Field nickname" +msgstr "Псевдоним поля" + +#: ../../Zotlabs/Module/Admin/Profs.php:90 +#: ../../Zotlabs/Module/Admin/Profs.php:110 +msgid "System name of field" +msgstr "Системное имя поля" + +#: ../../Zotlabs/Module/Admin/Profs.php:91 +#: ../../Zotlabs/Module/Admin/Profs.php:111 +msgid "Input type" +msgstr "Тип ввода" + +#: ../../Zotlabs/Module/Admin/Profs.php:92 +#: ../../Zotlabs/Module/Admin/Profs.php:112 +msgid "Field Name" +msgstr "Имя поля" + +#: ../../Zotlabs/Module/Admin/Profs.php:92 +#: ../../Zotlabs/Module/Admin/Profs.php:112 +msgid "Label on profile pages" +msgstr "Метка на странице профиля" + +#: ../../Zotlabs/Module/Admin/Profs.php:93 +#: ../../Zotlabs/Module/Admin/Profs.php:113 +msgid "Help text" +msgstr "Текст подсказки" + +#: ../../Zotlabs/Module/Admin/Profs.php:93 +#: ../../Zotlabs/Module/Admin/Profs.php:113 +msgid "Additional info (optional)" +msgstr "Дополнительная информация (необязательно)" + +#: ../../Zotlabs/Module/Admin/Profs.php:103 +msgid "Field definition not found" +msgstr "Определения поля не найдено" + +#: ../../Zotlabs/Module/Admin/Profs.php:109 +msgid "Edit Profile Field" +msgstr "Редактировать поле профиля" + +#: ../../Zotlabs/Module/Admin/Profs.php:169 +msgid "Basic Profile Fields" +msgstr "Основные поля профиля" + +#: ../../Zotlabs/Module/Admin/Profs.php:170 +msgid "Advanced Profile Fields" +msgstr "Дополнительные поля профиля" + +#: ../../Zotlabs/Module/Admin/Profs.php:170 +msgid "(In addition to basic fields)" +msgstr "(к основым полям)" + +#: ../../Zotlabs/Module/Admin/Profs.php:172 +msgid "All available fields" +msgstr "Все доступные поля" + +#: ../../Zotlabs/Module/Admin/Profs.php:173 +msgid "Custom Fields" +msgstr "Настраиваемые поля" + +#: ../../Zotlabs/Module/Admin/Profs.php:177 +msgid "Create Custom Field" +msgstr "Создать настраиваемое поле" + +#: ../../Zotlabs/Module/Admin/Themes.php:26 +msgid "Theme settings updated." +msgstr "Настройки темы обновленны." -#: ../../mod/admin.php:666 -msgid "Account not found" -msgstr "Аккаунт не найден" +#: ../../Zotlabs/Module/Admin/Themes.php:61 +msgid "No themes found." +msgstr "Темы не найдены." -#: ../../mod/admin.php:677 -#, php-format -msgid "User '%s' deleted" -msgstr "Пользователь '%s' удален" +#: ../../Zotlabs/Module/Admin/Themes.php:116 +msgid "Screenshot" +msgstr "Снимок экрана" -#: ../../mod/admin.php:686 -#, php-format -msgid "User '%s' unblocked" -msgstr "Пользователь '%s' разрешен" +#: ../../Zotlabs/Module/Admin/Themes.php:162 +msgid "[Experimental]" +msgstr "[экспериментальный]" + +#: ../../Zotlabs/Module/Admin/Themes.php:163 +msgid "[Unsupported]" +msgstr "[неподдерживаемый]" + +#: ../../Zotlabs/Module/Admin/Features.php:55 +#: ../../Zotlabs/Module/Admin/Features.php:56 +#: ../../Zotlabs/Module/Settings/Features.php:65 +msgid "Off" +msgstr "Выкл." + +#: ../../Zotlabs/Module/Admin/Features.php:55 +#: ../../Zotlabs/Module/Admin/Features.php:56 +#: ../../Zotlabs/Module/Settings/Features.php:65 +msgid "On" +msgstr "Вкл." -#: ../../mod/admin.php:686 +#: ../../Zotlabs/Module/Admin/Features.php:56 #, php-format -msgid "User '%s' blocked" -msgstr "Пользователь '%s' заблокирован" +msgid "Lock feature %s" +msgstr "Заблокировать функцию \"%s\"" -#: ../../mod/admin.php:750 ../../mod/admin.php:762 -msgid "Users" -msgstr "Пользователи" +#: ../../Zotlabs/Module/Admin/Features.php:64 +msgid "Manage Additional Features" +msgstr "Управлять дополнительными функциями" -#: ../../mod/admin.php:752 ../../mod/admin.php:887 -msgid "select all" -msgstr "выбрать все" +#: ../../Zotlabs/Module/Admin/Queue.php:35 +msgid "Queue Statistics" +msgstr "Статистика очереди" -#: ../../mod/admin.php:753 -msgid "User registrations waiting for confirm" -msgstr "Регистрации пользователей ждут подтверждения" +#: ../../Zotlabs/Module/Admin/Queue.php:36 +msgid "Total Entries" +msgstr "Всего записей" -#: ../../mod/admin.php:754 -msgid "Request date" -msgstr "Дата запроса" +#: ../../Zotlabs/Module/Admin/Queue.php:37 +msgid "Priority" +msgstr "Приоритет" -#: ../../mod/admin.php:755 -msgid "No registrations." -msgstr "Новых регистраций пока нет." +#: ../../Zotlabs/Module/Admin/Queue.php:38 +msgid "Destination URL" +msgstr "Конечный URL-адрес" -#: ../../mod/admin.php:756 -msgid "Approve" -msgstr "Утвердить" +#: ../../Zotlabs/Module/Admin/Queue.php:39 +msgid "Mark hub permanently offline" +msgstr "Пометить хаб как постоянно отключенный" -#: ../../mod/admin.php:757 -msgid "Deny" -msgstr "Запретить" +#: ../../Zotlabs/Module/Admin/Queue.php:40 +msgid "Empty queue for this hub" +msgstr "Освободить очередь для этого хаба" -#: ../../mod/admin.php:763 -msgid "Register date" -msgstr "Дата регистрации" +#: ../../Zotlabs/Module/Admin/Queue.php:41 +msgid "Last known contact" +msgstr "Последний известный контакт" -#: ../../mod/admin.php:763 -msgid "Last login" -msgstr "Последний вход" +#: ../../Zotlabs/Module/Admin/Account_edit.php:29 +#, php-format +msgid "Password changed for account %d." +msgstr "Пароль для аккаунта %d изменён." -#: ../../mod/admin.php:763 -msgid "Expires" -msgstr "" +#: ../../Zotlabs/Module/Admin/Account_edit.php:46 +msgid "Account settings updated." +msgstr "Настройки аккаунта обновлены." -#: ../../mod/admin.php:763 -msgid "Service Class" -msgstr "Класс службы" +#: ../../Zotlabs/Module/Admin/Account_edit.php:61 +msgid "Account not found." +msgstr "Учётная запись не найдена." -#: ../../mod/admin.php:765 -msgid "" -"Selected users will be deleted!\\n\\nEverything these users had posted on " -"this site will be permanently deleted!\\n\\nAre you sure?" -msgstr "" +#: ../../Zotlabs/Module/Admin/Account_edit.php:68 +msgid "Account Edit" +msgstr "Редактировать аккаунт" -#: ../../mod/admin.php:766 -msgid "" -"The user {0} will be deleted!\\n\\nEverything this user has posted on this " -"site will be permanently deleted!\\n\\nAre you sure?" -msgstr "" +#: ../../Zotlabs/Module/Admin/Account_edit.php:69 +msgid "New Password" +msgstr "Новый пароль" + +#: ../../Zotlabs/Module/Admin/Account_edit.php:70 +msgid "New Password again" +msgstr "Повторите новый пароль" + +#: ../../Zotlabs/Module/Admin/Account_edit.php:71 +msgid "Technical skill level" +msgstr "Уровень технических навыков" -#: ../../mod/admin.php:799 +#: ../../Zotlabs/Module/Admin/Account_edit.php:72 +msgid "Account language (for emails)" +msgstr "Язык сообщения для email" + +#: ../../Zotlabs/Module/Admin/Account_edit.php:73 +msgid "Service class" +msgstr "Класс обслуживания" + +#: ../../Zotlabs/Module/Admin/Channels.php:31 #, php-format msgid "%s channel censored/uncensored" -msgid_plural "%s channelss censored/uncensored" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgid_plural "%s channels censored/uncensored" +msgstr[0] "%s канал цензурируется/нецензурируется" +msgstr[1] "%s канала цензурируются/нецензурируются" +msgstr[2] "%s каналов цензурируются/нецензурируются" -#: ../../mod/admin.php:806 +#: ../../Zotlabs/Module/Admin/Channels.php:40 +#, php-format +msgid "%s channel code allowed/disallowed" +msgid_plural "%s channels code allowed/disallowed" +msgstr[0] "в %s канале код разрешён/запрещён" +msgstr[1] "в %s каналах код разрешён/запрещён" +msgstr[2] "в %s каналах код разрешён/запрещён" + +#: ../../Zotlabs/Module/Admin/Channels.php:46 #, php-format msgid "%s channel deleted" msgid_plural "%s channels deleted" -msgstr[0] "%s канал удален" +msgstr[0] "%s канал удалён" msgstr[1] "%s канала удалены" -msgstr[2] "%s каналы удалены" +msgstr[2] "%s каналов удалены" -#: ../../mod/admin.php:825 +#: ../../Zotlabs/Module/Admin/Channels.php:65 msgid "Channel not found" msgstr "Канал не найден" -#: ../../mod/admin.php:836 +#: ../../Zotlabs/Module/Admin/Channels.php:75 #, php-format msgid "Channel '%s' deleted" -msgstr "Канал '%s' удален" +msgstr "Канал '%s' удалён" -#: ../../mod/admin.php:846 +#: ../../Zotlabs/Module/Admin/Channels.php:87 +#, php-format +msgid "Channel '%s' censored" +msgstr "Канал '%s' цензурируется" + +#: ../../Zotlabs/Module/Admin/Channels.php:87 #, php-format msgid "Channel '%s' uncensored" -msgstr "" +msgstr "Канал '%s' нецензурируется" -#: ../../mod/admin.php:846 +#: ../../Zotlabs/Module/Admin/Channels.php:98 #, php-format -msgid "Channel '%s' censored" -msgstr "" +msgid "Channel '%s' code allowed" +msgstr "Код в канале '%s' разрешён" + +#: ../../Zotlabs/Module/Admin/Channels.php:98 +#, php-format +msgid "Channel '%s' code disallowed" +msgstr "Код в канале '%s' запрещён" -#: ../../mod/admin.php:889 +#: ../../Zotlabs/Module/Admin/Channels.php:150 msgid "Censor" -msgstr "" +msgstr "Цензурировать" -#: ../../mod/admin.php:890 +#: ../../Zotlabs/Module/Admin/Channels.php:151 msgid "Uncensor" -msgstr "" +msgstr "Нецензурировать" -#: ../../mod/admin.php:893 +#: ../../Zotlabs/Module/Admin/Channels.php:152 +msgid "Allow Code" +msgstr "Разрешить код" + +#: ../../Zotlabs/Module/Admin/Channels.php:153 +msgid "Disallow Code" +msgstr "Запретить код" + +#: ../../Zotlabs/Module/Admin/Channels.php:158 msgid "UID" -msgstr "UID" +msgstr "" -#: ../../mod/admin.php:895 +#: ../../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 "" +"Выбранные каналы будут удалены!\n\nВсё что было опубликовано в этих каналах на " +"этом сайте будет удалено навсегда!\n\nВы уверены?" -#: ../../mod/admin.php:896 +#: ../../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 "" +"Канал {0} будет удалён!\n\nВсё что было опубликовано в этом канале на этом сайте " +"будет удалено навсегда!\n\nВы уверены?" + +#: ../../Zotlabs/Module/Email_validation.php:24 +#: ../../Zotlabs/Module/Email_resend.php:12 +msgid "Token verification failed." +msgstr "Не удалось выполнить проверку токена." + +#: ../../Zotlabs/Module/Email_validation.php:36 +msgid "Email Verification Required" +msgstr "Требуется проверка адреса email" -#: ../../mod/admin.php:935 +#: ../../Zotlabs/Module/Email_validation.php:37 #, php-format -msgid "Plugin %s disabled." -msgstr "Плагин %s отключен." +msgid "" +"A verification token was sent to your email address [%s]. Enter that token " +"here to complete the account verification step. Please allow a few minutes " +"for delivery, and check your spam folder if you do not see the message." +msgstr "" +"Проверочный токен был выслн на ваш адрес электронной почты {%s]. Введите этот " +"токен здесь для завершения этапа проверки учётной записи. Пожалуйста, подождите " +"несколько минут для завершения доставки и проверьте вашу папку \"Спам\" если вы " +"не видите письма." + +#: ../../Zotlabs/Module/Email_validation.php:38 +msgid "Resend Email" +msgstr "Выслать повторно" + +#: ../../Zotlabs/Module/Email_validation.php:41 +msgid "Validation token" +msgstr "Проверочный токен" -#: ../../mod/admin.php:939 +#: ../../Zotlabs/Module/Invite.php:29 +msgid "Total invitation limit exceeded." +msgstr "Превышено общее количество приглашений." + +#: ../../Zotlabs/Module/Invite.php:53 #, php-format -msgid "Plugin %s enabled." -msgstr "Плагин %s включен." +msgid "%s : Not a valid email address." +msgstr "%s : Недействительный адрес электронной почты." -#: ../../mod/admin.php:949 ../../mod/admin.php:1151 -msgid "Disable" -msgstr "Запретить" +#: ../../Zotlabs/Module/Invite.php:67 +msgid "Please join us on $Projectname" +msgstr "Присоединятесь к $Projectname !" -#: ../../mod/admin.php:951 ../../mod/admin.php:1153 -msgid "Enable" -msgstr "Разрешить" +#: ../../Zotlabs/Module/Invite.php:77 +msgid "Invitation limit exceeded. Please contact your site administrator." +msgstr "Превышен лимит приглашений. Пожалуйста, свяжитесь с администрацией сайта." -#: ../../mod/admin.php:977 ../../mod/admin.php:1182 -msgid "Toggle" -msgstr "Переключить" +#: ../../Zotlabs/Module/Invite.php:86 +#, php-format +msgid "%d message sent." +msgid_plural "%d messages sent." +msgstr[0] "%d сообщение отправлено." +msgstr[1] "%d сообщения отправлено." +msgstr[2] "%d сообщений отправлено." -#: ../../mod/admin.php:985 ../../mod/admin.php:1192 -msgid "Author: " -msgstr "Автор: " +#: ../../Zotlabs/Module/Invite.php:107 +msgid "You have no more invitations available" +msgstr "У вас больше нет приглашений" -#: ../../mod/admin.php:986 ../../mod/admin.php:1193 -msgid "Maintainer: " -msgstr "Обслуживающий: " +#: ../../Zotlabs/Module/Invite.php:138 +msgid "Send invitations" +msgstr "Отправить приглашение" -#: ../../mod/admin.php:1115 -msgid "No themes found." -msgstr "Темы не найдены." +#: ../../Zotlabs/Module/Invite.php:139 +msgid "Enter email addresses, one per line:" +msgstr "Введите адреса электронной почты, по одному в строке:" -#: ../../mod/admin.php:1174 -msgid "Screenshot" -msgstr "Скриншот" +#: ../../Zotlabs/Module/Invite.php:141 +msgid "Please join my community on $Projectname." +msgstr "Присоединятесь к нашему сообществу $Projectname !" -#: ../../mod/admin.php:1222 -msgid "[Experimental]" -msgstr "[экспериментальный]" +#: ../../Zotlabs/Module/Invite.php:143 +msgid "You will need to supply this invitation code:" +msgstr "Вам нужно предоставит этот код приглашения:" -#: ../../mod/admin.php:1223 -msgid "[Unsupported]" -msgstr "[неподдерживаемый]" +#: ../../Zotlabs/Module/Invite.php:144 +msgid "1. Register at any $Projectname location (they are all inter-connected)" +msgstr "1. Зарегистрируйтесь на любом из серверов $Projectname" -#: ../../mod/admin.php:1250 -msgid "Log settings updated." -msgstr "Настройки журнала обновленны." +#: ../../Zotlabs/Module/Invite.php:146 +msgid "2. Enter my $Projectname network address into the site searchbar." +msgstr "2. Введите сетевой адрес $Projectname в поисковой строке сайта" -#: ../../mod/admin.php:1306 -msgid "Clear" -msgstr "Очистить" +#: ../../Zotlabs/Module/Invite.php:147 +msgid "or visit" +msgstr "или посетите" -#: ../../mod/admin.php:1312 -msgid "Debugging" -msgstr "Включить/Выключить" +#: ../../Zotlabs/Module/Invite.php:149 +msgid "3. Click [Connect]" +msgstr "Нажать [Подключиться]" -#: ../../mod/admin.php:1313 -msgid "Log file" -msgstr "Файл журнала" +#: ../../Zotlabs/Module/Blocks.php:156 +msgid "Block Title" +msgstr "Заблокировать заголовок" -#: ../../mod/admin.php:1313 -msgid "" -"Must be writable by web server. Relative to your Red top-level directory." -msgstr "Должна быть доступна для записи веб-сервером. Относительно верхнего уровня веб-сайта." +#: ../../Zotlabs/Module/Cover_photo.php:168 +#: ../../Zotlabs/Module/Cover_photo.php:218 +msgid "Cover Photos" +msgstr "Фотографии обложки" -#: ../../mod/admin.php:1314 -msgid "Log level" -msgstr "Уровень журнала" +#: ../../Zotlabs/Module/Cover_photo.php:390 +msgid "Your cover photo may be visible to anybody on the internet" +msgstr "Фотография вашей обложки может быть видна всем в Интернете" -#: ../../mod/thing.php:98 -msgid "Thing updated" -msgstr "" +#: ../../Zotlabs/Module/Cover_photo.php:394 +msgid "Change Cover Photo" +msgstr "Изменить фотографию обложки" -#: ../../mod/thing.php:158 -msgid "Object store: failed" -msgstr "" +#: ../../Zotlabs/Module/Like.php:54 +msgid "Like/Dislike" +msgstr "Нравится / не нравится" -#: ../../mod/thing.php:162 -msgid "Thing added" +#: ../../Zotlabs/Module/Like.php:59 +msgid "This action is restricted to members." +msgstr "Это действие доступно только участникам." + +#: ../../Zotlabs/Module/Like.php:60 +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 "" +"Пожалуйста, для продолжения <a href=\"rmagic\"> войдите с вашим $Projectname " +"ID</a> или <a href=\"register\">зарегистрируйтесь как новый участник $Projectname</a>." + +#: ../../Zotlabs/Module/Like.php:109 ../../Zotlabs/Module/Like.php:135 +#: ../../Zotlabs/Module/Like.php:173 +msgid "Invalid request." +msgstr "Неверный запрос." + +#: ../../Zotlabs/Module/Like.php:150 +msgid "thing" +msgstr "предмет" -#: ../../mod/thing.php:182 +#: ../../Zotlabs/Module/Like.php:196 +msgid "Channel unavailable." +msgstr "Канал недоступен." + +#: ../../Zotlabs/Module/Like.php:244 +msgid "Previous action reversed." +msgstr "Предыдущее действие отменено." + +#: ../../Zotlabs/Module/Like.php:442 #, php-format -msgid "OBJ: %1$s %2$s %3$s" -msgstr "" +msgid "%1$s agrees with %2$s's %3$s" +msgstr "%1$s согласен с %2$s %3$s" -#: ../../mod/thing.php:234 -msgid "Show Thing" -msgstr "" +#: ../../Zotlabs/Module/Like.php:444 +#, php-format +msgid "%1$s doesn't agree with %2$s's %3$s" +msgstr "%1$s не согласен с %2$s %3$s" -#: ../../mod/thing.php:241 -msgid "item not found." -msgstr "Элемент не найден." +#: ../../Zotlabs/Module/Like.php:446 +#, php-format +msgid "%1$s abstains from a decision on %2$s's %3$s" +msgstr "%1$s воздерживается от решения по %2$s%3$s" -#: ../../mod/thing.php:272 -msgid "Edit Thing" -msgstr "" +#: ../../Zotlabs/Module/Like.php:564 +msgid "Action completed." +msgstr "Действие завершено." -#: ../../mod/thing.php:274 ../../mod/thing.php:321 -msgid "Select a profile" -msgstr "Выберите профиль" +#: ../../Zotlabs/Module/Like.php:565 +msgid "Thank you." +msgstr "Спасибо." -#: ../../mod/thing.php:278 ../../mod/thing.php:324 -msgid "Post an activity" -msgstr "" +#: ../../Zotlabs/Module/Defperms.php:239 +#: ../../Zotlabs/Module/Settings/Channel.php:488 +msgid "" +"If enabled, connection requests will be approved without your interaction" +msgstr "Если включено, запросы контактов будут одобрены без вашего участия" -#: ../../mod/thing.php:278 ../../mod/thing.php:324 -msgid "Only sends to viewers of the applicable profile" -msgstr "" +#: ../../Zotlabs/Module/Defperms.php:246 +msgid "Automatic approval settings" +msgstr "Настройки автоматического одобрения" -#: ../../mod/thing.php:280 ../../mod/thing.php:326 -msgid "Name of thing e.g. something" -msgstr "" +#: ../../Zotlabs/Module/Defperms.php:254 +msgid "" +"Some individual permissions may have been preset or locked based on your " +"channel type and privacy settings." +msgstr "Некоторые индивидуальные разрешения могут быть предустановлены или заблокированы на основании типа вашего канала и настроек приватности." -#: ../../mod/thing.php:282 ../../mod/thing.php:327 -msgid "URL of thing (optional)" -msgstr "" +#: ../../Zotlabs/Module/Menu.php:67 +msgid "Unable to update menu." +msgstr "Невозможно обновить меню." -#: ../../mod/thing.php:284 ../../mod/thing.php:328 -msgid "URL for photo of thing (optional)" -msgstr "" +#: ../../Zotlabs/Module/Menu.php:78 +msgid "Unable to create menu." +msgstr "Невозможно создать меню." -#: ../../mod/thing.php:319 -msgid "Add Thing to your Profile" +#: ../../Zotlabs/Module/Menu.php:160 ../../Zotlabs/Module/Menu.php:173 +msgid "Menu Name" +msgstr "Название меню" + +#: ../../Zotlabs/Module/Menu.php:160 +msgid "Unique name (not visible on webpage) - required" +msgstr "Уникальное название (не видимо на странице) - требуется" + +#: ../../Zotlabs/Module/Menu.php:161 ../../Zotlabs/Module/Menu.php:174 +msgid "Menu Title" +msgstr "Заголовок меню" + +#: ../../Zotlabs/Module/Menu.php:161 +msgid "Visible on webpage - leave empty for no title" +msgstr "Видимость на странице - оставьте пустым если не хотите иметь заголовок" + +#: ../../Zotlabs/Module/Menu.php:162 +msgid "Allow Bookmarks" +msgstr "Разрешить закладки" + +#: ../../Zotlabs/Module/Menu.php:162 ../../Zotlabs/Module/Menu.php:221 +msgid "Menu may be used to store saved bookmarks" +msgstr "Меню может использоваться, чтобы сохранить закладки" + +#: ../../Zotlabs/Module/Menu.php:163 ../../Zotlabs/Module/Menu.php:224 +msgid "Submit and proceed" +msgstr "Отправить и обработать" + +#: ../../Zotlabs/Module/Menu.php:176 ../../Zotlabs/Module/Locs.php:120 +msgid "Drop" +msgstr "Удалить" + +#: ../../Zotlabs/Module/Menu.php:180 +msgid "Bookmarks allowed" +msgstr "Закладки разрешены" + +#: ../../Zotlabs/Module/Menu.php:182 +msgid "Delete this menu" +msgstr "Удалить это меню" + +#: ../../Zotlabs/Module/Menu.php:183 ../../Zotlabs/Module/Menu.php:218 +msgid "Edit menu contents" +msgstr "Редактировать содержание меню" + +#: ../../Zotlabs/Module/Menu.php:184 +msgid "Edit this menu" +msgstr "Редактировать это меню" + +#: ../../Zotlabs/Module/Menu.php:200 +msgid "Menu could not be deleted." +msgstr "Меню не может быть удалено." + +#: ../../Zotlabs/Module/Menu.php:213 +msgid "Edit Menu" +msgstr "Редактировать меню" + +#: ../../Zotlabs/Module/Menu.php:217 +msgid "Add or remove entries to this menu" +msgstr "Добавить или удалить пункты этого меню" + +#: ../../Zotlabs/Module/Menu.php:219 +msgid "Menu name" +msgstr "Название меню" + +#: ../../Zotlabs/Module/Menu.php:219 +msgid "Must be unique, only seen by you" +msgstr "Должно быть уникальным (видно только вам)" + +#: ../../Zotlabs/Module/Menu.php:220 +msgid "Menu title" +msgstr "Заголовок меню" + +#: ../../Zotlabs/Module/Menu.php:220 +msgid "Menu title as seen by others" +msgstr "Видимый другими заголовок меню" + +#: ../../Zotlabs/Module/Menu.php:221 +msgid "Allow bookmarks" +msgstr "Разрешить закладки" + +#: ../../Zotlabs/Module/Manage.php:138 ../../Zotlabs/Module/New_channel.php:147 +#, php-format +msgid "You have created %1$.0f of %2$.0f allowed channels." +msgstr "Вы создали %1$.0f из %2$.0f возможных каналов." + +#: ../../Zotlabs/Module/Manage.php:145 +msgid "Create a new channel" +msgstr "Создать новый канал" + +#: ../../Zotlabs/Module/Manage.php:145 ../../Zotlabs/Module/Chat.php:256 +#: ../../Zotlabs/Module/Wiki.php:205 ../../Zotlabs/Module/Profiles.php:831 +msgid "Create New" +msgstr "Создать новый" + +#: ../../Zotlabs/Module/Manage.php:171 +msgid "Current Channel" +msgstr "Текущий канал" + +#: ../../Zotlabs/Module/Manage.php:173 +msgid "Switch to one of your channels by selecting it." +msgstr "Выбрать и переключиться на один из ваших каналов" + +#: ../../Zotlabs/Module/Manage.php:174 +msgid "Default Channel" +msgstr "Основной канал" + +#: ../../Zotlabs/Module/Manage.php:175 +msgid "Make Default" +msgstr "Сделать основным" + +#: ../../Zotlabs/Module/Manage.php:178 +#, php-format +msgid "%d new messages" +msgstr "%d новых сообщений" + +#: ../../Zotlabs/Module/Manage.php:179 +#, php-format +msgid "%d new introductions" +msgstr "%d новых представлений" + +#: ../../Zotlabs/Module/Manage.php:181 +msgid "Delegated Channel" +msgstr "Делегированный канал" + +#: ../../Zotlabs/Module/Changeaddr.php:35 +msgid "" +"Channel name changes are not allowed within 48 hours of changing the account " +"password." +msgstr "Изменение названия канала не разрешается в течении 48 часов после смены пароля у аккаунта." + +#: ../../Zotlabs/Module/Changeaddr.php:77 +msgid "Change channel nickname/address" +msgstr "Изменить псевдоним / адрес канала" + +#: ../../Zotlabs/Module/Changeaddr.php:78 +msgid "Any/all connections on other networks will be lost!" +msgstr "Любые / все контакты в других сетях будут утеряны!" + +#: ../../Zotlabs/Module/Changeaddr.php:80 +msgid "New channel address" +msgstr "Новый адрес канала" + +#: ../../Zotlabs/Module/Changeaddr.php:81 +msgid "Rename Channel" +msgstr "Переименовать канал" + +#: ../../Zotlabs/Module/Settings/Features.php:73 +msgid "Additional Features" +msgstr "Дополнительные функции" + +#: ../../Zotlabs/Module/Settings/Features.php:74 +#: ../../Zotlabs/Module/Settings/Account.php:116 +msgid "Your technical skill level" +msgstr "Ваш уровень технических навыков" + +#: ../../Zotlabs/Module/Settings/Features.php:74 +#: ../../Zotlabs/Module/Settings/Account.php:116 +msgid "" +"Used to provide a member experience and additional features consistent with " +"your comfort level" +msgstr "Используется чтобы обеспечить соответствие опыта пользователя и функций на комфортном для вас уровне" + +#: ../../Zotlabs/Module/Settings/Channel.php:333 +msgid "Nobody except yourself" +msgstr "Никто кроме вас" + +#: ../../Zotlabs/Module/Settings/Channel.php:334 +msgid "Only those you specifically allow" +msgstr "Только персонально разрешённые" + +#: ../../Zotlabs/Module/Settings/Channel.php:335 +msgid "Approved connections" +msgstr "Одобренные контакты" + +#: ../../Zotlabs/Module/Settings/Channel.php:336 +msgid "Any connections" +msgstr "Любые контакты" + +#: ../../Zotlabs/Module/Settings/Channel.php:337 +msgid "Anybody on this website" +msgstr "Любой на этом сайте" + +#: ../../Zotlabs/Module/Settings/Channel.php:338 +msgid "Anybody in this network" +msgstr "Любой в этой сети" + +#: ../../Zotlabs/Module/Settings/Channel.php:339 +msgid "Anybody authenticated" +msgstr "Любой аутентифицированный" + +#: ../../Zotlabs/Module/Settings/Channel.php:340 +msgid "Anybody on the internet" +msgstr "Любой в интернете" + +#: ../../Zotlabs/Module/Settings/Channel.php:415 +msgid "Publish your default profile in the network directory" +msgstr "Публиковать ваш профиль по умолчанию в сетевом каталоге" + +#: ../../Zotlabs/Module/Settings/Channel.php:420 +msgid "Allow us to suggest you as a potential friend to new members?" +msgstr "Разрешить предлагать вас как потенциального друга для новых пользователей?" + +#: ../../Zotlabs/Module/Settings/Channel.php:424 +msgid "or" +msgstr "или" + +#: ../../Zotlabs/Module/Settings/Channel.php:433 +msgid "Your channel address is" +msgstr "Адрес вашего канала" + +#: ../../Zotlabs/Module/Settings/Channel.php:436 +msgid "Your files/photos are accessible via WebDAV at" +msgstr "Ваши файы / фотографии доступны через WebDAV по" + +#: ../../Zotlabs/Module/Settings/Channel.php:488 +msgid "Automatic membership approval" +msgstr "Членство одобрено автоматически" + +#: ../../Zotlabs/Module/Settings/Channel.php:514 +msgid "Channel Settings" +msgstr "Выбор канала" + +#: ../../Zotlabs/Module/Settings/Channel.php:521 +msgid "Basic Settings" +msgstr "Основные настройки" + +#: ../../Zotlabs/Module/Settings/Channel.php:523 +#: ../../Zotlabs/Module/Settings/Account.php:119 +msgid "Email Address:" +msgstr "Адрес email:" + +#: ../../Zotlabs/Module/Settings/Channel.php:524 +msgid "Your Timezone:" +msgstr "Часовой пояс:" + +#: ../../Zotlabs/Module/Settings/Channel.php:525 +msgid "Default Post Location:" +msgstr "Расположение по умолчанию:" + +#: ../../Zotlabs/Module/Settings/Channel.php:525 +msgid "Geographical location to display on your posts" +msgstr "Показывать географическое положение в ваших публикациях" + +#: ../../Zotlabs/Module/Settings/Channel.php:526 +msgid "Use Browser Location:" +msgstr "Определять расположение из браузера" + +#: ../../Zotlabs/Module/Settings/Channel.php:528 +msgid "Adult Content" +msgstr "Содержимое для взрослых" + +#: ../../Zotlabs/Module/Settings/Channel.php:528 +msgid "" +"This channel frequently or regularly publishes adult content. (Please tag " +"any adult material and/or nudity with #NSFW)" +msgstr "Этот канал часто или регулярно публикует содержимое для взрослых. Пожалуйста, помечайте любой такой материал тегом #NSFW" + +#: ../../Zotlabs/Module/Settings/Channel.php:530 +msgid "Security and Privacy Settings" +msgstr "Безопасность и настройки приватности" + +#: ../../Zotlabs/Module/Settings/Channel.php:532 +msgid "Your permissions are already configured. Click to view/adjust" +msgstr "Ваши разрешения уже настроены. Нажмите чтобы просмотреть или изменить" + +#: ../../Zotlabs/Module/Settings/Channel.php:534 +msgid "Hide my online presence" +msgstr "Скрывать моё присутствие онлайн" + +#: ../../Zotlabs/Module/Settings/Channel.php:534 +msgid "Prevents displaying in your profile that you are online" +msgstr "Предотвращает отображения статуса \"в сети\" в вашем профиле" + +#: ../../Zotlabs/Module/Settings/Channel.php:536 +msgid "Simple Privacy Settings:" +msgstr "Простые настройки безопасности:" + +#: ../../Zotlabs/Module/Settings/Channel.php:537 +msgid "" +"Very Public - <em>extremely permissive (should be used with caution)</em>" +msgstr "Полностью открытый - <em>сверхлиберальный (должен использоваться с осторожностью)</em>" + +#: ../../Zotlabs/Module/Settings/Channel.php:538 +msgid "" +"Typical - <em>default public, privacy when desired (similar to social " +"network permissions but with improved privacy)</em>" +msgstr "Обычный - <em>открытый по умолчанию, приватность по желанию (как в социальных сетях, но с улучшенными настройками)</em>" + +#: ../../Zotlabs/Module/Settings/Channel.php:539 +msgid "Private - <em>default private, never open or public</em>" +msgstr "Частный - <em>частный по умочанию, не открытый и не публичный</em>" + +#: ../../Zotlabs/Module/Settings/Channel.php:540 +msgid "Blocked - <em>default blocked to/from everybody</em>" +msgstr "Закрытый - <em>заблокированный по умолчанию от / для всех</em>" + +#: ../../Zotlabs/Module/Settings/Channel.php:542 +msgid "Allow others to tag your posts" +msgstr "Разрешить другим отмечать ваши публикации" + +#: ../../Zotlabs/Module/Settings/Channel.php:542 +msgid "" +"Often used by the community to retro-actively flag inappropriate content" +msgstr "Часто используется сообществом для маркировки неподобающего содержания" + +#: ../../Zotlabs/Module/Settings/Channel.php:544 +msgid "Channel Permission Limits" +msgstr "Ограничения разрешений канала" + +#: ../../Zotlabs/Module/Settings/Channel.php:546 +msgid "Expire other channel content after this many days" +msgstr "Храненить содержимое других каналов, дней" + +#: ../../Zotlabs/Module/Settings/Channel.php:546 +msgid "0 or blank to use the website limit." +msgstr "0 или пусто - использовать настройки сайта." + +#: ../../Zotlabs/Module/Settings/Channel.php:546 +#, php-format +msgid "This website expires after %d days." +msgstr "Срок хранения содержимого этого сайта истекает через %d дней" + +#: ../../Zotlabs/Module/Settings/Channel.php:546 +msgid "This website does not expire imported content." +msgstr "Срок хранения импортированного содержимого этого сайта не ограничен." + +#: ../../Zotlabs/Module/Settings/Channel.php:546 +msgid "The website limit takes precedence if lower than your limit." +msgstr "Ограничение сайта имеет приоритет если ниже вашего значения." + +#: ../../Zotlabs/Module/Settings/Channel.php:547 +msgid "Maximum Friend Requests/Day:" +msgstr "Запросов в друзья в день:" + +#: ../../Zotlabs/Module/Settings/Channel.php:547 +msgid "May reduce spam activity" +msgstr "Может ограничить спам активность" + +#: ../../Zotlabs/Module/Settings/Channel.php:548 +msgid "Default Privacy Group" +msgstr "Группа конфиденциальности по умолчанию" + +#: ../../Zotlabs/Module/Settings/Channel.php:550 +msgid "Use my default audience setting for the type of object published" +msgstr "Использовать настройки аудитории по умолчанию для типа опубликованного объекта" + +#: ../../Zotlabs/Module/Settings/Channel.php:551 +msgid "Profile to assign new connections" +msgstr "Назначить профиль для новых контактов" + +#: ../../Zotlabs/Module/Settings/Channel.php:560 +#: ../../Zotlabs/Module/New_channel.php:177 +#: ../../Zotlabs/Module/Register.php:266 +msgid "Channel role and privacy" +msgstr "Роль и конфиденциальность канала" + +#: ../../Zotlabs/Module/Settings/Channel.php:561 +msgid "Default Permissions Group" +msgstr "Группа разрешений по умолчанию" + +#: ../../Zotlabs/Module/Settings/Channel.php:567 +msgid "Maximum private messages per day from unknown people:" +msgstr "Максимально количество сообщений от незнакомых людей, в день:" + +#: ../../Zotlabs/Module/Settings/Channel.php:567 +msgid "Useful to reduce spamming" +msgstr "Полезно для сокращения количества спама" + +#: ../../Zotlabs/Module/Settings/Channel.php:571 +msgid "By default post a status message when:" +msgstr "По умолчанию публиковать новый статус при:" + +#: ../../Zotlabs/Module/Settings/Channel.php:572 +msgid "accepting a friend request" +msgstr "одобрении запроса в друзья" + +#: ../../Zotlabs/Module/Settings/Channel.php:573 +msgid "joining a forum/community" +msgstr "вступлении в сообщество / форум" + +#: ../../Zotlabs/Module/Settings/Channel.php:574 +msgid "making an <em>interesting</em> profile change" +msgstr "<em>интересном</em> изменении профиля" + +#: ../../Zotlabs/Module/Settings/Channel.php:575 +msgid "Send a notification email when:" +msgstr "Отправить уведомление по email когда:" + +#: ../../Zotlabs/Module/Settings/Channel.php:576 +msgid "You receive a connection request" +msgstr "вы получили новый запрос контакта" + +#: ../../Zotlabs/Module/Settings/Channel.php:577 +msgid "Your connections are confirmed" +msgstr "ваш запрос контакта был одобрен" + +#: ../../Zotlabs/Module/Settings/Channel.php:578 +msgid "Someone writes on your profile wall" +msgstr "кто-то написал на стене вашего профиля" + +#: ../../Zotlabs/Module/Settings/Channel.php:579 +msgid "Someone writes a followup comment" +msgstr "кто-то пишет комментарий" + +#: ../../Zotlabs/Module/Settings/Channel.php:580 +msgid "You receive a private message" +msgstr "вы получили личное сообщение" + +#: ../../Zotlabs/Module/Settings/Channel.php:581 +msgid "You receive a friend suggestion" +msgstr "вы получили предложение друзей" + +#: ../../Zotlabs/Module/Settings/Channel.php:582 +msgid "You are tagged in a post" +msgstr "вы были отмечены в публикации" + +#: ../../Zotlabs/Module/Settings/Channel.php:583 +msgid "You are poked/prodded/etc. in a post" +msgstr "вас толкнули, подтолкнули и т.п. в публикации" + +#: ../../Zotlabs/Module/Settings/Channel.php:585 +msgid "Someone likes your post/comment" +msgstr "кому-то нравится ваша публикация / комментарий" + +#: ../../Zotlabs/Module/Settings/Channel.php:588 +msgid "Show visual notifications including:" +msgstr "Показывать визуальные оповещения включая:" + +#: ../../Zotlabs/Module/Settings/Channel.php:590 +msgid "Unseen grid activity" +msgstr "невидимую сетевую активность" + +#: ../../Zotlabs/Module/Settings/Channel.php:591 +msgid "Unseen channel activity" +msgstr "невидимую активность в канале" + +#: ../../Zotlabs/Module/Settings/Channel.php:592 +msgid "Unseen private messages" +msgstr "невидимое личное сообщение" + +#: ../../Zotlabs/Module/Settings/Channel.php:593 +msgid "Upcoming events" +msgstr "грядущие события" + +#: ../../Zotlabs/Module/Settings/Channel.php:594 +msgid "Events today" +msgstr "события сегодня" + +#: ../../Zotlabs/Module/Settings/Channel.php:595 +msgid "Upcoming birthdays" +msgstr "грядущие дни рождения" + +#: ../../Zotlabs/Module/Settings/Channel.php:595 +msgid "Not available in all themes" +msgstr "не доступно во всех темах" + +#: ../../Zotlabs/Module/Settings/Channel.php:596 +msgid "System (personal) notifications" +msgstr "системные (личные) уведомления" + +#: ../../Zotlabs/Module/Settings/Channel.php:597 +msgid "System info messages" +msgstr "сообщения с системной информацией" + +#: ../../Zotlabs/Module/Settings/Channel.php:598 +msgid "System critical alerts" +msgstr "критические уведомления системы" + +#: ../../Zotlabs/Module/Settings/Channel.php:599 +msgid "New connections" +msgstr "новые контакты" + +#: ../../Zotlabs/Module/Settings/Channel.php:600 +msgid "System Registrations" +msgstr "системные регистрации" + +#: ../../Zotlabs/Module/Settings/Channel.php:601 +msgid "Unseen shared files" +msgstr "невидимые общие файлы" + +#: ../../Zotlabs/Module/Settings/Channel.php:602 +msgid "Unseen public activity" +msgstr "невидимая публичная активность" + +#: ../../Zotlabs/Module/Settings/Channel.php:603 +msgid "Unseen likes and dislikes" +msgstr "невидимые лайки и дислайки" + +#: ../../Zotlabs/Module/Settings/Channel.php:604 +msgid "Unseen forum posts" +msgstr "Невидимые публикации на форуме" + +#: ../../Zotlabs/Module/Settings/Channel.php:605 +msgid "Email notification hub (hostname)" +msgstr "Центр уведомлений по email (имя хоста)" + +#: ../../Zotlabs/Module/Settings/Channel.php:605 +#, php-format +msgid "" +"If your channel is mirrored to multiple hubs, set this to your preferred " +"location. This will prevent duplicate email notifications. Example: %s" +msgstr "Если ваш канал зеркалируется в нескольких местах, это ваше предпочтительное местоположение. Это должно предотвратить дублировать уведомлений по email. Например: %s" + +#: ../../Zotlabs/Module/Settings/Channel.php:606 +msgid "Show new wall posts, private messages and connections under Notices" +msgstr "Показать новые сообщения на стене, личные сообщения и контакты в \"Уведомлениях\"" + +#: ../../Zotlabs/Module/Settings/Channel.php:608 +msgid "Notify me of events this many days in advance" +msgstr "Уведомлять меня о событиях заранее, дней" + +#: ../../Zotlabs/Module/Settings/Channel.php:608 +msgid "Must be greater than 0" +msgstr "Должно быть больше 0" + +#: ../../Zotlabs/Module/Settings/Channel.php:614 +msgid "Advanced Account/Page Type Settings" +msgstr "Дополнительные настройки учётной записи / страницы" + +#: ../../Zotlabs/Module/Settings/Channel.php:615 +msgid "Change the behaviour of this account for special situations" +msgstr "Изменить поведение этого аккаунта в особых ситуациях" + +#: ../../Zotlabs/Module/Settings/Channel.php:617 +msgid "Miscellaneous Settings" +msgstr "Дополнительные настройки" + +#: ../../Zotlabs/Module/Settings/Channel.php:618 +msgid "Default photo upload folder" +msgstr "Каталог загрузки фотографий по умолчанию" + +#: ../../Zotlabs/Module/Settings/Channel.php:618 +#: ../../Zotlabs/Module/Settings/Channel.php:619 +msgid "%Y - current year, %m - current month" +msgstr "%Y - текущий год, %y - текущий месяц" + +#: ../../Zotlabs/Module/Settings/Channel.php:619 +msgid "Default file upload folder" +msgstr "Каталог загрузки файлов по умолчанию" + +#: ../../Zotlabs/Module/Settings/Channel.php:621 +msgid "Personal menu to display in your channel pages" +msgstr "Персональное меню для отображения на странице вашего канала" + +#: ../../Zotlabs/Module/Settings/Channel.php:623 +msgid "Remove this channel." +msgstr "Удалить этот канал." + +#: ../../Zotlabs/Module/Settings/Channel.php:624 +msgid "Firefox Share $Projectname provider" msgstr "" -#: ../../mod/import.php:36 +#: ../../Zotlabs/Module/Settings/Channel.php:625 +msgid "Start calendar week on Monday" +msgstr "Начинать календарную неделю с понедельника" + +#: ../../Zotlabs/Module/Settings/Featured.php:23 +msgid "Affinity Slider settings updated." +msgstr "Обновлены настройки слайдера cходства." + +#: ../../Zotlabs/Module/Settings/Featured.php:38 +msgid "No feature settings configured" +msgstr "Параметры функций не настроены" + +#: ../../Zotlabs/Module/Settings/Featured.php:45 +msgid "Default maximum affinity level" +msgstr "Максимальный уровень сходства по умолчанию." + +#: ../../Zotlabs/Module/Settings/Featured.php:45 +msgid "0-99 default 99" +msgstr "0-99 (по умолчанию 99)" + +#: ../../Zotlabs/Module/Settings/Featured.php:50 +msgid "Default minimum affinity level" +msgstr "Минимальный уровень сходства по умолчанию." + +#: ../../Zotlabs/Module/Settings/Featured.php:50 +msgid "0-99 - default 0" +msgstr "0-99 (по умолчанию 0)" + +#: ../../Zotlabs/Module/Settings/Featured.php:54 +msgid "Affinity Slider Settings" +msgstr "Настройки слайдера сходства" + +#: ../../Zotlabs/Module/Settings/Featured.php:67 +msgid "Addon Settings" +msgstr "Настройки расширений" + +#: ../../Zotlabs/Module/Settings/Featured.php:68 +msgid "Please save/submit changes to any panel before opening another." +msgstr "Пожалуйста сохраните / отправьте изменения на панели прежде чем открывать другую." + +#: ../../Zotlabs/Module/Settings/Account.php:20 +msgid "Not valid email." +msgstr "Не действительный адрес email." + +#: ../../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 "Системная ошибка сохранения email. Пожалуйста попробуйте ещё раз." + +#: ../../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:121 +msgid "Remove this account including all its channels" +msgstr "Удалить этот аккаунт включая все каналы" + +#: ../../Zotlabs/Module/Settings/Display.php:139 +#, php-format +msgid "%s - (Experimental)" +msgstr "%s - (экспериментальный)" + +#: ../../Zotlabs/Module/Settings/Display.php:187 +msgid "Display Settings" +msgstr "Настройки отображения" + +#: ../../Zotlabs/Module/Settings/Display.php:188 +msgid "Theme Settings" +msgstr "Настройки темы" + +#: ../../Zotlabs/Module/Settings/Display.php:189 +msgid "Custom Theme Settings" +msgstr "Дополнительные настройки темы" + +#: ../../Zotlabs/Module/Settings/Display.php:190 +msgid "Content Settings" +msgstr "Настройки содержимого" + +#: ../../Zotlabs/Module/Settings/Display.php:196 +msgid "Display Theme:" +msgstr "Тема отображения:" + +#: ../../Zotlabs/Module/Settings/Display.php:197 +msgid "Select scheme" +msgstr "Выбрать схему" + +#: ../../Zotlabs/Module/Settings/Display.php:199 +msgid "Preload images before rendering the page" +msgstr "Предзагрузка изображений перед обработкой страницы" + +#: ../../Zotlabs/Module/Settings/Display.php:199 +msgid "" +"The subjective page load time will be longer but the page will be ready when " +"displayed" +msgstr "Субъективное время загрузки страницы будет длиннее, но страница будет готова при отображении" + +#: ../../Zotlabs/Module/Settings/Display.php:200 +msgid "Enable user zoom on mobile devices" +msgstr "Включить масштабирование на мобильных устройствах" + +#: ../../Zotlabs/Module/Settings/Display.php:201 +msgid "Update browser every xx seconds" +msgstr "Обновление браузера каждые N секунд" + +#: ../../Zotlabs/Module/Settings/Display.php:201 +msgid "Minimum of 10 seconds, no maximum" +msgstr "Минимум 10 секунд, без максимума" + +#: ../../Zotlabs/Module/Settings/Display.php:202 +msgid "Maximum number of conversations to load at any time:" +msgstr "Максимальное количество бесед для загрузки одновременно:" + +#: ../../Zotlabs/Module/Settings/Display.php:202 +msgid "Maximum of 100 items" +msgstr "Максимум 100 элементов" + +#: ../../Zotlabs/Module/Settings/Display.php:203 +msgid "Show emoticons (smilies) as images" +msgstr "Показывать эмотиконы (смайлики) как изображения" + +#: ../../Zotlabs/Module/Settings/Display.php:204 +msgid "Provide channel menu in navigation bar" +msgstr "Показывать меню канала в панели навигации" + +#: ../../Zotlabs/Module/Settings/Display.php:204 +msgid "Default: channel menu located in app menu" +msgstr "По умолчанию каналы расположены в меню приложения" + +#: ../../Zotlabs/Module/Settings/Display.php:205 +msgid "Manual conversation updates" +msgstr "Обновление бесед вручную" + +#: ../../Zotlabs/Module/Settings/Display.php:205 +msgid "Default is on, turning this off may increase screen jumping" +msgstr "Включено по умолчанию, выключение может привести к рывкам в отображении" + +#: ../../Zotlabs/Module/Settings/Display.php:206 +msgid "Link post titles to source" +msgstr "Ссылки на источник заголовков публикаций" + +#: ../../Zotlabs/Module/Settings/Display.php:207 +msgid "System Page Layout Editor - (advanced)" +msgstr "Системный редактор макета страницы - (продвинутый)" + +#: ../../Zotlabs/Module/Settings/Display.php:210 +msgid "Use blog/list mode on channel page" +msgstr "Использовать режим блога / списка на странице канала" + +#: ../../Zotlabs/Module/Settings/Display.php:210 +#: ../../Zotlabs/Module/Settings/Display.php:211 +msgid "(comments displayed separately)" +msgstr "(комментарии отображаются отдельно)" + +#: ../../Zotlabs/Module/Settings/Display.php:211 +msgid "Use blog/list mode on grid page" +msgstr "Использовать режим блога / списка на странице матрицы" + +#: ../../Zotlabs/Module/Settings/Display.php:212 +msgid "Channel page max height of content (in pixels)" +msgstr "Максимальная высота содержания канала (в пикселях)" + +#: ../../Zotlabs/Module/Settings/Display.php:212 +#: ../../Zotlabs/Module/Settings/Display.php:213 +msgid "click to expand content exceeding this height" +msgstr "нажмите, чтобы увеличить содержимое, превышающее эту высоту" + +#: ../../Zotlabs/Module/Settings/Display.php:213 +msgid "Grid page max height of content (in pixels)" +msgstr "Максимальная высота содержания на страницах матрицы (в пикселях)" + +#: ../../Zotlabs/Module/Settings/Permcats.php:23 +msgid "Permission Name is required." +msgstr "Требуется имя разрешения" + +#: ../../Zotlabs/Module/Settings/Permcats.php:42 +msgid "Permission category saved." +msgstr "Категория разрешения сохранена." + +#: ../../Zotlabs/Module/Settings/Permcats.php:66 +msgid "" +"Use this form to create permission rules for various classes of people or " +"connections." +msgstr "Используйте эту форму для создания правил разрешений для различных групп людей и контактов." + +#: ../../Zotlabs/Module/Settings/Permcats.php:107 +msgid "Permission Name" +msgstr "Имя разрешения" + +#: ../../Zotlabs/Module/Settings/Oauth2.php:36 +msgid "Name and Secret are required" +msgstr "Требуются имя и код" + +#: ../../Zotlabs/Module/Settings/Oauth2.php:84 +msgid "Add OAuth2 application" +msgstr "Добавить приложение OAuth2" + +#: ../../Zotlabs/Module/Settings/Oauth2.php:87 +#: ../../Zotlabs/Module/Settings/Oauth2.php:115 +#: ../../Zotlabs/Module/Settings/Oauth.php:90 +msgid "Name of application" +msgstr "Название приложения" + +#: ../../Zotlabs/Module/Settings/Oauth2.php:88 +#: ../../Zotlabs/Module/Settings/Oauth2.php:116 +#: ../../Zotlabs/Module/Settings/Oauth.php:91 +#: ../../Zotlabs/Module/Settings/Oauth.php:92 +msgid "Automatically generated - change if desired. Max length 20" +msgstr "Сгенерирован автоматические - измените если требуется. Макс. длина 20" + +#: ../../Zotlabs/Module/Settings/Oauth2.php:89 +#: ../../Zotlabs/Module/Settings/Oauth2.php:117 +#: ../../Zotlabs/Module/Settings/Oauth.php:93 +#: ../../Zotlabs/Module/Settings/Oauth.php:119 +msgid "Redirect" +msgstr "Перенаправление" + +#: ../../Zotlabs/Module/Settings/Oauth2.php:89 +#: ../../Zotlabs/Module/Settings/Oauth2.php:117 +#: ../../Zotlabs/Module/Settings/Oauth.php:93 +msgid "" +"Redirect URI - leave blank unless your application specifically requires this" +msgstr "URI перенаправления - оставьте пустыми до тех пока ваше приложение не требует этого" + +#: ../../Zotlabs/Module/Settings/Oauth2.php:90 +#: ../../Zotlabs/Module/Settings/Oauth2.php:118 +msgid "Grant Types" +msgstr "Разрешить типы" + +#: ../../Zotlabs/Module/Settings/Oauth2.php:90 +#: ../../Zotlabs/Module/Settings/Oauth2.php:91 +#: ../../Zotlabs/Module/Settings/Oauth2.php:118 +#: ../../Zotlabs/Module/Settings/Oauth2.php:119 +msgid "leave blank unless your application sepcifically requires this" +msgstr "оставьте пустыми до тех пока ваше приложение не требует этого" + +#: ../../Zotlabs/Module/Settings/Oauth2.php:91 +#: ../../Zotlabs/Module/Settings/Oauth2.php:119 +msgid "Authorization scope" +msgstr "Область полномочий" + +#: ../../Zotlabs/Module/Settings/Oauth2.php:103 +msgid "OAuth2 Application not found." +msgstr "Приложение OAuth2 не найдено." + +#: ../../Zotlabs/Module/Settings/Oauth2.php:112 +#: ../../Zotlabs/Module/Settings/Oauth2.php:149 +#: ../../Zotlabs/Module/Settings/Oauth.php:87 +#: ../../Zotlabs/Module/Settings/Oauth.php:113 +#: ../../Zotlabs/Module/Settings/Oauth.php:149 +msgid "Add application" +msgstr "Добавить приложение" + +#: ../../Zotlabs/Module/Settings/Oauth2.php:148 +msgid "Connected OAuth2 Apps" +msgstr "Подключённые приложения OAuth2" + +#: ../../Zotlabs/Module/Settings/Oauth2.php:152 +#: ../../Zotlabs/Module/Settings/Oauth.php:152 +msgid "Client key starts with" +msgstr "Ключ клиента начинаетя с" + +#: ../../Zotlabs/Module/Settings/Oauth2.php:153 +#: ../../Zotlabs/Module/Settings/Oauth.php:153 +msgid "No name" +msgstr "Без названия" + +#: ../../Zotlabs/Module/Settings/Oauth2.php:154 +#: ../../Zotlabs/Module/Settings/Oauth.php:154 +msgid "Remove authorization" +msgstr "Удалить разрешение" + +#: ../../Zotlabs/Module/Settings/Oauth.php:35 +msgid "Name is required" +msgstr "Необходимо имя" + +#: ../../Zotlabs/Module/Settings/Oauth.php:39 +msgid "Key and Secret are required" +msgstr "Требуются ключ и код" + +#: ../../Zotlabs/Module/Settings/Oauth.php:94 +#: ../../Zotlabs/Module/Settings/Oauth.php:120 +msgid "Icon url" +msgstr "URL значка" + +#: ../../Zotlabs/Module/Settings/Oauth.php:105 +msgid "Application not found." +msgstr "Приложение не найдено." + +#: ../../Zotlabs/Module/Settings/Oauth.php:148 +msgid "Connected Apps" +msgstr "Подключенные приложения" + +#: ../../Zotlabs/Module/Settings/Tokens.php:31 +#, php-format +msgid "This channel is limited to %d tokens" +msgstr "Этот канал ограничен %d токенами" + +#: ../../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 "Вы также можете предоставить доступ в стиле <em>dropbox</em> для друзей и коллег, добавив имя и пароль для входа на любой URL-адрес сайта. Например:" + +#: ../../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 "Срок действия (yyyy-mm-dd)" + +#: ../../Zotlabs/Module/Chat.php:181 +msgid "Room not found" +msgstr "Комната не найдена" + +#: ../../Zotlabs/Module/Chat.php:197 +msgid "Leave Room" +msgstr "Покинуть комнату" + +#: ../../Zotlabs/Module/Chat.php:198 +msgid "Delete Room" +msgstr "Удалить комнату" + +#: ../../Zotlabs/Module/Chat.php:199 +msgid "I am away right now" +msgstr "Я сейчас отошёл" + +#: ../../Zotlabs/Module/Chat.php:200 +msgid "I am online" +msgstr "Я на связи" + +#: ../../Zotlabs/Module/Chat.php:202 +msgid "Bookmark this room" +msgstr "Запомнить эту комнату" + +#: ../../Zotlabs/Module/Chat.php:232 +msgid "New Chatroom" +msgstr "Новый чат" + +#: ../../Zotlabs/Module/Chat.php:233 +msgid "Chatroom name" +msgstr "Название чата" + +#: ../../Zotlabs/Module/Chat.php:234 +msgid "Expiration of chats (minutes)" +msgstr "Завершение чатов (минут)" + +#: ../../Zotlabs/Module/Chat.php:250 +#, php-format +msgid "%1$s's Chatrooms" +msgstr "Чаты пользователя %1$s" + +#: ../../Zotlabs/Module/Chat.php:255 +msgid "No chatrooms available" +msgstr "Нет доступных чатов" + +#: ../../Zotlabs/Module/Chat.php:259 +msgid "Expiration" +msgstr "Срок действия" + +#: ../../Zotlabs/Module/Chat.php:260 +msgid "min" +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 "Удалённый канал [%s] (пока неизвестен на этом сайте)" + +#: ../../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/Probe.php:30 ../../Zotlabs/Module/Probe.php:34 +#, php-format +msgid "Fetching URL returns error: %1$s" +msgstr "Загрузка URL возвращает ошибку: %1$s" + +#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54 +msgid "Location not found." +msgstr "Местоположение не найдено" + +#: ../../Zotlabs/Module/Locs.php:62 +msgid "Location lookup failed." +msgstr "Поиск местоположения не удался" + +#: ../../Zotlabs/Module/Locs.php:66 +msgid "" +"Please select another location to become primary before removing the primary " +"location." +msgstr "Пожалуйста, выберите другое местоположение в качестве основного прежде чем удалить предыдущее" + +#: ../../Zotlabs/Module/Locs.php:95 +msgid "Syncing locations" +msgstr "Синхронизировать местоположение" + +#: ../../Zotlabs/Module/Locs.php:105 +msgid "No locations found." +msgstr "Местоположений не найдено" + +#: ../../Zotlabs/Module/Locs.php:116 +msgid "Manage Channel Locations" +msgstr "Управление местоположением канала" + +#: ../../Zotlabs/Module/Locs.php:122 +msgid "Sync Now" +msgstr "Синхронизировать" + +#: ../../Zotlabs/Module/Locs.php:123 +msgid "Please wait several minutes between consecutive operations." +msgstr "Пожалуйста, подождите несколько минут между последовательными операциями." + +#: ../../Zotlabs/Module/Locs.php:124 +msgid "" +"When possible, drop a location by logging into that website/hub and removing " +"your channel." +msgstr "По возможности, очистите местоположение, войдя на этот веб-сайт / хаб и удалив свой канал." + +#: ../../Zotlabs/Module/Locs.php:125 +msgid "Use this form to drop the location if the hub is no longer operating." +msgstr "Используйте эту форму, чтобы удалить местоположение, если хаб больше не функционирует." + +#: ../../Zotlabs/Module/Import.php:66 ../../Zotlabs/Module/Import_items.php:48 msgid "Nothing to import." msgstr "Ничего импортировать." -#: ../../mod/import.php:58 +#: ../../Zotlabs/Module/Import.php:81 ../../Zotlabs/Module/Import.php:97 +#: ../../Zotlabs/Module/Import_items.php:72 msgid "Unable to download data from old server" -msgstr "Невозможно загрузить данные из старого сервера" +msgstr "Невозможно загрузить данные со старого сервера" -#: ../../mod/import.php:64 +#: ../../Zotlabs/Module/Import.php:104 ../../Zotlabs/Module/Import_items.php:77 msgid "Imported file is empty." msgstr "Импортированный файл пуст." -#: ../../mod/import.php:88 -msgid "" -"Cannot create a duplicate channel identifier on this system. Import failed." -msgstr "" - -#: ../../mod/import.php:106 -msgid "Channel clone failed. Import failed." -msgstr "" - -#: ../../mod/import.php:116 -msgid "Cloned channel not found. Import failed." -msgstr "" +#: ../../Zotlabs/Module/Import.php:146 +#, php-format +msgid "Your service plan only allows %d channels." +msgstr "Ваш класс обслуживания разрешает только %d каналов." -#: ../../mod/import.php:364 -msgid "Import completed." -msgstr "Импорт завершен." +#: ../../Zotlabs/Module/Import.php:173 +msgid "No channel. Import failed." +msgstr "Канала нет. Импорт невозможен." -#: ../../mod/import.php:377 +#: ../../Zotlabs/Module/Import.php:541 msgid "You must be logged in to use this feature." msgstr "Вы должны войти в систему, чтобы использовать эту функцию." -#: ../../mod/import.php:382 +#: ../../Zotlabs/Module/Import.php:546 msgid "Import Channel" -msgstr "Импорт канала" +msgstr "Импортировать канал" -#: ../../mod/import.php:383 +#: ../../Zotlabs/Module/Import.php:547 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. Only identity and connections/relationships will " -"be imported. Importation of content is not yet available." -msgstr "" +"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 "Используйте эту форм для импорта существующего канала с другого сервера / хаба. Вы можете получить идентификационные данные канала со старого сервера / хаба через сеть или предоставить файл экспорта." -#: ../../mod/import.php:384 +#: ../../Zotlabs/Module/Import.php:548 +#: ../../Zotlabs/Module/Import_items.php:127 msgid "File to Upload" msgstr "Файл для загрузки" -#: ../../mod/import.php:385 +#: ../../Zotlabs/Module/Import.php:549 msgid "Or provide the old server/hub details" -msgstr "" +msgstr "или предоставьте данные старого сервера" -#: ../../mod/import.php:386 +#: ../../Zotlabs/Module/Import.php:551 msgid "Your old identity address (xyz@example.com)" msgstr "Ваш старый адрес идентичности (xyz@example.com)" -#: ../../mod/import.php:387 +#: ../../Zotlabs/Module/Import.php:552 msgid "Your old login email address" msgstr "Ваш старый адрес электронной почты" -#: ../../mod/import.php:388 +#: ../../Zotlabs/Module/Import.php:553 msgid "Your old login password" msgstr "Ваш старый пароль" -#: ../../mod/import.php:389 +#: ../../Zotlabs/Module/Import.php:554 +msgid "Import a few months of posts if possible (limited by available memory" +msgstr "Импортировать несколько месяцев публикаций если возможно (ограничено доступной памятью)" + +#: ../../Zotlabs/Module/Import.php:556 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 "" +"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 "Для любого варианта, пожалуйста, выберите, следует ли сделать этот хаб вашим новым основным адресом, или ваше прежнее местоположение должно продолжить выполнять эту роль. Вы сможете отправлять сообщения из любого местоположения, но только одно может быть помечено как основное место для файлов, фотографий и мультимедиа." -#: ../../mod/import.php:390 +#: ../../Zotlabs/Module/Import.php:558 msgid "Make this hub my primary location" -msgstr "" +msgstr "Сделать этот хаб главным" -#: ../../mod/invite.php:25 -msgid "Total invitation limit exceeded." -msgstr "" +#: ../../Zotlabs/Module/Import.php:559 +msgid "Move this channel (disable all previous locations)" +msgstr "Переместить это канал (отключить все предыдущие месторасположения)" -#: ../../mod/invite.php:49 -#, php-format -msgid "%s : Not a valid email address." -msgstr "%s : Не действительный адрес электронной почты." +#: ../../Zotlabs/Module/Import.php:560 +msgid "Use this channel nickname instead of the one provided" +msgstr "Использовать псевдоним этого канала вместо предоставленного" -#: ../../mod/invite.php:76 -msgid "Please join us on Red" -msgstr "Пожалуйста, присоединяйтесь к нам в Red" +#: ../../Zotlabs/Module/Import.php:560 +msgid "" +"Leave blank to keep your existing channel nickname. You will be randomly " +"assigned a similar nickname if either name is already allocated on this site." +msgstr "Оставьте пустым для сохранения существующего псевдонима канала. Вам будет случайным образом назначен похожий псевдоним если такое имя уже выделено на этом сайте." -#: ../../mod/invite.php:87 -msgid "Invitation limit exceeded. Please contact your site administrator." -msgstr "" +#: ../../Zotlabs/Module/Import.php:562 +msgid "" +"This process may take several minutes to complete. Please submit the form " +"only once and leave this page open until finished." +msgstr "Процесс может занять несколько минут. Пожалуйста, отправьте форму только один раз и оставьте эту страницу открытой до завершения." -#: ../../mod/invite.php:92 -#, php-format -msgid "%s : Message delivery failed." -msgstr "%s : Доставка сообщения не удалась." +#: ../../Zotlabs/Module/Viewconnections.php:65 +msgid "No connections." +msgstr "Контактов нет." -#: ../../mod/invite.php:96 +#: ../../Zotlabs/Module/Viewconnections.php:83 #, php-format -msgid "%d message sent." -msgid_plural "%d messages sent." -msgstr[0] "%d сообщение отправленно." -msgstr[1] "%d сообщения отправленно." -msgstr[2] "%d сообщений отправленно." - -#: ../../mod/invite.php:115 -msgid "You have no more invitations available" -msgstr "У вас больше нет приглашений" +msgid "Visit %s's profile [%s]" +msgstr "Посетить %s профиль [%s]" -#: ../../mod/invite.php:141 -msgid "Send invitations" -msgstr "Послать приглашения" +#: ../../Zotlabs/Module/Viewconnections.php:113 +msgid "View Connections" +msgstr "Просмотр контактов" -#: ../../mod/invite.php:142 -msgid "Enter email addresses, one per line:" -msgstr "Введите адреса электронной почты, по одному на строку:" +#: ../../Zotlabs/Module/Rmagic.php:35 +msgid "Authentication failed." +msgstr "Ошибка аутентификации." -#: ../../mod/invite.php:143 ../../mod/mail.php:216 ../../mod/mail.php:328 -msgid "Your message:" -msgstr "Сообщение:" +#: ../../Zotlabs/Module/New_channel.php:156 +msgid "Your real name is recommended." +msgstr "Рекомендуется использовать ваше настоящее имя." -#: ../../mod/invite.php:144 +#: ../../Zotlabs/Module/New_channel.php:157 msgid "" -"You are cordially invited to join me and some other close friends on the Red" -" Matrix - a revolutionary new decentralised communication and information " -"tool." +"Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation " +"Group\"" msgstr "" +"Примеры: \"Иван Иванов\", \"Оксана и Кони\", \"Футболист\", \"Тимур и его команда\"" -#: ../../mod/invite.php:146 -msgid "You will need to supply this invitation code: $invite_code" +#: ../../Zotlabs/Module/New_channel.php:162 +msgid "" +"This will be used to create a unique network address (like an email address)." msgstr "" +"Это будет использовано для создания уникального сетевого адреса (наподобие email)." + +#: ../../Zotlabs/Module/New_channel.php:164 +msgid "Allowed characters are a-z 0-9, - and _" +msgstr "Разрешённые символы a-z 0-9, - и _" -#: ../../mod/invite.php:147 -msgid "Please visit my channel at" -msgstr "Пожалуйста, посетите мой канал на" +#: ../../Zotlabs/Module/New_channel.php:174 +msgid "Channel name" +msgstr "Название канала" + +#: ../../Zotlabs/Module/New_channel.php:176 +#: ../../Zotlabs/Module/Register.php:265 +msgid "Choose a short nickname" +msgstr "Выберите короткий псевдоним" -#: ../../mod/invite.php:151 +#: ../../Zotlabs/Module/New_channel.php:177 msgid "" -"Once you have registered (on ANY Hubzilla site - they are all inter-" -"connected), please connect with my Hubzilla channel address:" -msgstr "" +"Select a channel permission role compatible with your usage needs and " +"privacy requirements." +msgstr "Выберите разрешения для канала в соответствии с вашими потребностями и требованиями безопасности." -#: ../../mod/invite.php:153 -msgid "Click the [Register] link on the following page to join." -msgstr "" +#: ../../Zotlabs/Module/New_channel.php:177 +#: ../../Zotlabs/Module/Register.php:266 +msgid "Read more about channel permission roles" +msgstr "Прочитать больше о разрешениях для каналов" + +#: ../../Zotlabs/Module/New_channel.php:180 +msgid "Create a Channel" +msgstr "Создать канал" -#: ../../mod/invite.php:155 +#: ../../Zotlabs/Module/New_channel.php:181 msgid "" -"For more information about the Hubzilla Project and why it has the " -"potential to change the internet as we know it, please visit " -"http://getzot.com" -msgstr "Чтобы узнать больше о проекте Hubzilla, и чтобы узнать почему он имеет потенциал для изменения привычного нам Интернета, пожалуйста, посетите http://getzot.com" +"A channel is a unique network identity. It can represent a person (social " +"network profile), a forum (group), a business or celebrity page, a newsfeed, " +"and many other things." +msgstr "Канал это уникальная сетевая идентичность. Он может представлять человека (профиль в социальной сети), форум или группу, бизнес или страницу знаменитости, новостную ленту и многие другие вещи." -#: ../../mod/item.php:147 -msgid "Unable to locate original post." -msgstr "Не удалось найти оригинал." +#: ../../Zotlabs/Module/New_channel.php:182 +msgid "" +"or <a href=\"import\">import an existing channel</a> from another location." +msgstr "или <a href=\"import\">импортировать существующий канал</a> из другого места." -#: ../../mod/item.php:372 -msgid "Empty post discarded." -msgstr "Отказаться от пустой почты." +#: ../../Zotlabs/Module/New_channel.php:187 +msgid "Validate" +msgstr "Проверить" -#: ../../mod/item.php:414 -msgid "Executable content type not permitted to this channel." -msgstr "" +#: ../../Zotlabs/Module/Apps.php:53 +msgid "Manage apps" +msgstr "Управление приложениями" -#: ../../mod/item.php:832 -msgid "System error. Post not saved." -msgstr "Системная ошибка. Сообщение не сохранено." +#: ../../Zotlabs/Module/Apps.php:54 +msgid "Create new app" +msgstr "Создать новое приложение" -#: ../../mod/item.php:1275 -#, php-format -msgid "You have reached your limit of %1$.0f top level posts." -msgstr "" +#: ../../Zotlabs/Module/Directory.php:106 +msgid "No default suggestions were found." +msgstr "Предложений по умолчанию не найдено." -#: ../../mod/item.php:1281 +#: ../../Zotlabs/Module/Directory.php:255 #, php-format -msgid "You have reached your limit of %1$.0f webpages." -msgstr "" +msgid "%d rating" +msgid_plural "%d ratings" +msgstr[0] "%d оценка" +msgstr[1] "%d оценки" +msgstr[2] "%d оценок" -#: ../../mod/update_channel.php:43 ../../mod/update_display.php:25 -#: ../../mod/update_network.php:23 ../../mod/update_search.php:46 -msgid "[Embedded content - reload page to view]" -msgstr "" +#: ../../Zotlabs/Module/Directory.php:266 +msgid "Gender: " +msgstr "Пол:" -#: ../../mod/layouts.php:62 -msgid "Help with this feature" -msgstr "" +#: ../../Zotlabs/Module/Directory.php:268 +msgid "Status: " +msgstr "Статус:" -#: ../../mod/layouts.php:84 -msgid "Layout Name" -msgstr "Название шаблона" +#: ../../Zotlabs/Module/Directory.php:270 +msgid "Homepage: " +msgstr "Домашняя страница:" -#: ../../mod/like.php:97 -msgid "thing" -msgstr "" +#: ../../Zotlabs/Module/Directory.php:330 +msgid "Description:" +msgstr "Описание:" -#: ../../mod/lockview.php:30 ../../mod/lockview.php:36 -msgid "Remote privacy information not available." -msgstr "" +#: ../../Zotlabs/Module/Directory.php:339 +msgid "Public Forum:" +msgstr "Публичный форум:" -#: ../../mod/lockview.php:45 -msgid "Visible to:" -msgstr "Кому видно:" +#: ../../Zotlabs/Module/Directory.php:342 +msgid "Keywords: " +msgstr "Ключевые слова:" -#: ../../mod/viewconnections.php:58 -msgid "No connections." -msgstr "Никаких связей." +#: ../../Zotlabs/Module/Directory.php:345 +msgid "Don't suggest" +msgstr "Не предлагать" -#: ../../mod/viewconnections.php:70 -#, php-format -msgid "Visit %s's profile [%s]" -msgstr "Посетить %s's профиль [%s]" +#: ../../Zotlabs/Module/Directory.php:347 +msgid "Common connections (estimated):" +msgstr "Общие контакты (оценочно):" -#: ../../mod/viewconnections.php:85 -msgid "View Connnections" -msgstr "Просмотр контактов" +#: ../../Zotlabs/Module/Directory.php:396 +msgid "Global Directory" +msgstr "Глобальный каталог" -#: ../../mod/lostpass.php:15 -msgid "No valid account found." -msgstr "Действительный аккаунт не найден." +#: ../../Zotlabs/Module/Directory.php:396 +msgid "Local Directory" +msgstr "Локальный каталог" -#: ../../mod/lostpass.php:29 -msgid "Password reset request issued. Check your email." -msgstr "" +#: ../../Zotlabs/Module/Directory.php:402 +msgid "Finding:" +msgstr "Поиск:" -#: ../../mod/lostpass.php:35 ../../mod/lostpass.php:102 -#, php-format -msgid "Site Member (%s)" -msgstr "Участник сайта (%s)" +#: ../../Zotlabs/Module/Directory.php:407 +msgid "next page" +msgstr "следующая страница" + +#: ../../Zotlabs/Module/Directory.php:407 +msgid "previous page" +msgstr "предыдущая страница" + +#: ../../Zotlabs/Module/Directory.php:408 +msgid "Sort options" +msgstr "Параметры сортировки" + +#: ../../Zotlabs/Module/Directory.php:409 +msgid "Alphabetic" +msgstr "По алфавиту" + +#: ../../Zotlabs/Module/Directory.php:410 +msgid "Reverse Alphabetic" +msgstr "Против алфавита" + +#: ../../Zotlabs/Module/Directory.php:411 +msgid "Newest to Oldest" +msgstr "От новых к старым" -#: ../../mod/lostpass.php:40 +#: ../../Zotlabs/Module/Directory.php:412 +msgid "Oldest to Newest" +msgstr "От старых к новым" + +#: ../../Zotlabs/Module/Directory.php:429 +msgid "No entries (some entries may be hidden)." +msgstr "Нет записей (некоторые записи могут быть скрыты)." + +#: ../../Zotlabs/Module/Filer.php:52 +msgid "Enter a folder name" +msgstr "Введите название каталога" + +#: ../../Zotlabs/Module/Filer.php:52 +msgid "or select an existing folder (doubleclick)" +msgstr "или выберите существующий каталог (двойной щелчок)" + +#: ../../Zotlabs/Module/Dreport.php:45 +msgid "Invalid message" +msgstr "Неверное сообщение" + +#: ../../Zotlabs/Module/Dreport.php:78 +msgid "no results" +msgstr "Ничего не найдено." + +#: ../../Zotlabs/Module/Dreport.php:93 +msgid "channel sync processed" +msgstr "синхронизация канала завершена" + +#: ../../Zotlabs/Module/Dreport.php:97 +msgid "queued" +msgstr "в очереди" + +#: ../../Zotlabs/Module/Dreport.php:101 +msgid "posted" +msgstr "опубликовано" + +#: ../../Zotlabs/Module/Dreport.php:105 +msgid "accepted for delivery" +msgstr "принято к доставке" + +#: ../../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 "Password reset requested at %s" -msgstr "Требуется сброс пароля на %s" +msgid "Delivery report for %1$s" +msgstr "Отчёт о доставке для %1$s" -#: ../../mod/lostpass.php:63 -msgid "" -"Request could not be verified. (You may have previously submitted it.) " -"Password reset failed." -msgstr "" +#: ../../Zotlabs/Module/Dreport.php:152 +msgid "Redeliver" +msgstr "Доставить повторно" -#: ../../mod/lostpass.php:85 ../../boot.php:1475 -msgid "Password Reset" -msgstr "Сбросить пароль" +#: ../../Zotlabs/Module/Network.php:116 +msgid "No such group" +msgstr "Нет такой группы" -#: ../../mod/lostpass.php:86 -msgid "Your password has been reset as requested." -msgstr "Ваш пароль в соответствии с просьбой сброшен." +#: ../../Zotlabs/Module/Network.php:157 +msgid "No such channel" +msgstr "Нет такого канала" -#: ../../mod/lostpass.php:87 -msgid "Your new password is" -msgstr "Ваш новый пароль" +#: ../../Zotlabs/Module/Network.php:242 +msgid "Privacy group is empty" +msgstr "Группа безопасности пуста" -#: ../../mod/lostpass.php:88 -msgid "Save or copy your new password - and then" -msgstr "" +#: ../../Zotlabs/Module/Network.php:253 +msgid "Privacy group: " +msgstr "Группа безопасности: " -#: ../../mod/lostpass.php:89 -msgid "click here to login" -msgstr "нажмите здесь чтобы выйти" +#: ../../Zotlabs/Module/Regmod.php:15 +msgid "Please login." +msgstr "Пожалуйста, войдите." + +#: ../../Zotlabs/Module/Service_limits.php:23 +msgid "No service class restrictions found." +msgstr "Ограничений класса обслуживание не найдено." -#: ../../mod/lostpass.php:90 +#: ../../Zotlabs/Module/Cards.php:99 +msgid "Add Card" +msgstr "Добавить карточку" + +#: ../../Zotlabs/Module/Apporder.php:44 +msgid "Change Order of Pinned Navbar Apps" +msgstr "Изменить порядок приложений на панели навигации" + +#: ../../Zotlabs/Module/Apporder.php:44 +msgid "Change Order of App Tray Apps" +msgstr "Изменить порядок приложений в лотке" + +#: ../../Zotlabs/Module/Apporder.php:45 msgid "" -"Your password may be changed from the <em>Settings</em> page after " -"successful login." -msgstr "" +"Use arrows to move the corresponding app left (top) or right (bottom) in the " +"navbar" +msgstr "Используйте стрелки для перемещения приложения влево (вверх) или вправо (вниз) в панели навигации" -#: ../../mod/lostpass.php:107 -#, php-format -msgid "Your password has changed at %s" -msgstr "Пароль изменен на %s" +#: ../../Zotlabs/Module/Apporder.php:45 +msgid "Use arrows to move the corresponding app up or down in the app tray" +msgstr "Используйте стрелки для перемещения приложения вверх или вниз в лотке" -#: ../../mod/lostpass.php:122 -msgid "Forgot your Password?" -msgstr "Забыли пароль или логин?" +#: ../../Zotlabs/Module/Register.php:49 +msgid "Maximum daily site registrations exceeded. Please try again tomorrow." +msgstr "Превышено максимальное количество регистраций на сегодня. Пожалуйста, попробуйте снова завтра." -#: ../../mod/lostpass.php:123 +#: ../../Zotlabs/Module/Register.php:55 msgid "" -"Enter your email address and submit to have your password reset. Then check " -"your email for further instructions." +"Please indicate acceptance of the Terms of Service. Registration failed." msgstr "" +"Пожалуйста, подтвердите согласие с \"Условиями обслуживания\". Регистрация не удалась." -#: ../../mod/lostpass.php:124 -msgid "Email Address" -msgstr "Адрес электронной почты" +#: ../../Zotlabs/Module/Register.php:89 +msgid "Passwords do not match." +msgstr "Пароли не совпадают." -#: ../../mod/lostpass.php:125 -msgid "Reset" -msgstr "Сброс" +#: ../../Zotlabs/Module/Register.php:132 +msgid "Registration successful. Continue to create your first channel..." +msgstr "Регистрация завершена успешно. Для продолжения создайте свой первый канал..." -#: ../../mod/magic.php:70 -msgid "Hub not found." -msgstr "Hub не найден." +#: ../../Zotlabs/Module/Register.php:135 +msgid "" +"Registration successful. Please check your email for validation instructions." +msgstr "Регистрация завершена успешно. Пожалуйста проверьте вашу электронную почту для подтверждения." -#: ../../mod/vote.php:97 -msgid "Total votes" -msgstr "" +#: ../../Zotlabs/Module/Register.php:142 +msgid "Your registration is pending approval by the site owner." +msgstr "Ваша регистрация ожидает одобрения администрации сайта." -#: ../../mod/vote.php:98 -msgid "Average Rating" -msgstr "" +#: ../../Zotlabs/Module/Register.php:145 +msgid "Your registration can not be processed." +msgstr "Ваша регистрация не может быть обработана." -#: ../../mod/mail.php:33 -msgid "Unable to lookup recipient." -msgstr "" +#: ../../Zotlabs/Module/Register.php:192 +msgid "Registration on this hub is disabled." +msgstr "Регистрация на этом хабе отключена." -#: ../../mod/mail.php:41 -msgid "Unable to communicate with requested channel." -msgstr "" +#: ../../Zotlabs/Module/Register.php:201 +msgid "Registration on this hub is by approval only." +msgstr "Регистрация на этом хабе только по утверждению." -#: ../../mod/mail.php:48 -msgid "Cannot verify requested channel." -msgstr "" +#: ../../Zotlabs/Module/Register.php:202 ../../Zotlabs/Module/Register.php:211 +msgid "<a href=\"pubsites\">Register at another affiliated hub.</a>" +msgstr "<a href=\"pubsites\">Зарегистрироваться на другом хабе.</a>" -#: ../../mod/mail.php:74 -msgid "Selected channel has private message restrictions. Send failed." -msgstr "" +#: ../../Zotlabs/Module/Register.php:210 +msgid "Registration on this hub is by invitation only." +msgstr "Регистрация на этом хабе доступна только по приглашениям." -#: ../../mod/mail.php:121 ../../mod/message.php:31 -msgid "Messages" -msgstr "Переписка" +#: ../../Zotlabs/Module/Register.php:221 +msgid "" +"This site has exceeded the number of allowed daily account registrations. " +"Please try again tomorrow." +msgstr "Этот сайт превысил максимальное количество регистраций на сегодня. Пожалуйста, попробуйте снова завтра. " -#: ../../mod/mail.php:132 -msgid "Message deleted." -msgstr "Сообщение удалено." +#: ../../Zotlabs/Module/Register.php:247 +#, php-format +msgid "I accept the %s for this website" +msgstr "Я принимаю %s для этого веб-сайта." -#: ../../mod/mail.php:149 -msgid "Message recalled." -msgstr "" +#: ../../Zotlabs/Module/Register.php:254 +#, php-format +msgid "I am over %s years of age and accept the %s for this website" +msgstr "Мой возраст превышает %s лет и я принимаю %s для этого веб-сайта." -#: ../../mod/mail.php:206 -msgid "Send Private Message" -msgstr "Отправить личное сообщение" +#: ../../Zotlabs/Module/Register.php:259 +msgid "Your email address" +msgstr "Ваш адрес электронной почты" -#: ../../mod/mail.php:207 ../../mod/mail.php:323 -msgid "To:" -msgstr "Кому:" +#: ../../Zotlabs/Module/Register.php:260 +msgid "Choose a password" +msgstr "Выберите пароль" -#: ../../mod/mail.php:212 ../../mod/mail.php:325 -msgid "Subject:" -msgstr "Тема:" +#: ../../Zotlabs/Module/Register.php:261 +msgid "Please re-enter your password" +msgstr "Пожалуйста, введите пароль еще раз" -#: ../../mod/mail.php:249 -msgid "Message not found." -msgstr "Сообщение не найдено." +#: ../../Zotlabs/Module/Register.php:262 +msgid "Please enter your invitation code" +msgstr "Пожалуйста, введите Ваш код приглашения" -#: ../../mod/mail.php:292 ../../mod/message.php:72 -msgid "Delete message" -msgstr "Удалить сообщение" +#: ../../Zotlabs/Module/Register.php:263 +msgid "Your Name" +msgstr "Ваше имя" -#: ../../mod/mail.php:293 -msgid "Recall message" -msgstr "" +#: ../../Zotlabs/Module/Register.php:263 +msgid "Real names are preferred." +msgstr "Предпочтительны реальные имена." -#: ../../mod/mail.php:295 -msgid "Message has been recalled." -msgstr "" +#: ../../Zotlabs/Module/Register.php:265 +#, php-format +msgid "" +"Your nickname will be used to create an easy to remember channel address e." +"g. nickname%s" +msgstr "Ваш псевдоним будет использован для создания легко запоминаемого адреса канала, напр. nickname %s" -#: ../../mod/mail.php:312 -msgid "Private Conversation" -msgstr "Личный разговор" +#: ../../Zotlabs/Module/Register.php:266 +msgid "" +"Select a channel permission role for your usage needs and privacy " +"requirements." +msgstr "Выберите разрешения для канала в зависимости от ваших потребностей и требований приватности." -#: ../../mod/mail.php:316 -msgid "Delete conversation" -msgstr "Удалить разговор" +#: ../../Zotlabs/Module/Register.php:267 +msgid "no" +msgstr "нет" -#: ../../mod/mail.php:318 +#: ../../Zotlabs/Module/Register.php:267 +msgid "yes" +msgstr "да" + +#: ../../Zotlabs/Module/Register.php:295 msgid "" -"No secure communications available. You <strong>may</strong> be able to " -"respond from the sender's profile page." -msgstr "" +"This site requires email verification. After completing this form, please " +"check your email for further instructions." +msgstr "Этот сайт требует проверку адреса электронной почты. После заполнения этой формы, пожалуйста, проверьте ваш почтовый ящик для дальнейших инструкций." -#: ../../mod/mail.php:322 -msgid "Send Reply" -msgstr "Отправить снова" +#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59 +msgid "This setting requires special processing and editing has been blocked." +msgstr "Этот параметр требует специальной обработки и редактирования и был заблокирован." -#: ../../mod/manage.php:64 -#, php-format -msgid "You have created %1$.0f of %2$.0f allowed channels." -msgstr "" +#: ../../Zotlabs/Module/Pconfig.php:48 +msgid "Configuration Editor" +msgstr "Редактор конфигурации" -#: ../../mod/manage.php:72 -msgid "Create a new channel" -msgstr "Создать новый канал" +#: ../../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 "Предупреждение. Изменение некоторых настроек может привести к неработоспособности вашего канала. Пожалуйста, покиньте эту страницу, если вы точно не значете, как правильно использовать эту функцию." -#: ../../mod/manage.php:77 -msgid "Channel Manager" -msgstr "Настройки канала" +#: ../../Zotlabs/Module/Article_edit.php:128 +msgid "Edit Article" +msgstr "Редактировать статью" -#: ../../mod/manage.php:78 -msgid "Current Channel" -msgstr "Текущий канал" +#: ../../Zotlabs/Module/Wiki.php:44 ../../Zotlabs/Module/Cloud.php:123 +msgid "Not found" +msgstr "Не найдено." -#: ../../mod/manage.php:80 -msgid "Attach to one of your channels by selecting it." -msgstr "" +#: ../../Zotlabs/Module/Wiki.php:124 +msgid "Error retrieving wiki" +msgstr "Ошибка при получении Wiki" -#: ../../mod/manage.php:81 -msgid "Default Channel" -msgstr "Канал по умолчанию" +#: ../../Zotlabs/Module/Wiki.php:131 +msgid "Error creating zip file export folder" +msgstr "Ошибка при создании zip-файла при экспорте каталога" -#: ../../mod/manage.php:82 -msgid "Make Default" -msgstr "Сделать стандартным" +#: ../../Zotlabs/Module/Wiki.php:182 +msgid "Error downloading wiki: " +msgstr "Ошибка загрузки Wiki:" -#: ../../mod/wall_upload.php:34 -msgid "Wall Photos" -msgstr "Стена фотографий" +#: ../../Zotlabs/Module/Wiki.php:203 +msgid "Download" +msgstr "Загрузить" -#: ../../mod/match.php:16 -msgid "Profile Match" -msgstr "Профиль Совпадение" +#: ../../Zotlabs/Module/Wiki.php:207 +msgid "Wiki name" +msgstr "Название Wiki" -#: ../../mod/match.php:24 -msgid "No keywords to match. Please add keywords to your default profile." -msgstr "" +#: ../../Zotlabs/Module/Wiki.php:208 +msgid "Content type" +msgstr "Тип содержимого" -#: ../../mod/match.php:61 -msgid "is interested in:" -msgstr "заинтересован в:" +#: ../../Zotlabs/Module/Wiki.php:210 ../../Zotlabs/Storage/Browser.php:286 +msgid "Type" +msgstr "Тип" -#: ../../mod/match.php:69 -msgid "No matches" -msgstr "Нет соответствий" +#: ../../Zotlabs/Module/Wiki.php:211 +msgid "Any type" +msgstr "Любой тип" -#: ../../mod/menu.php:21 -msgid "Menu updated." -msgstr "Меню обновлено." +#: ../../Zotlabs/Module/Wiki.php:218 +msgid "Lock content type" +msgstr "Зафиксировать тип содержимого" -#: ../../mod/menu.php:25 -msgid "Unable to update menu." -msgstr "Невозможно обновление меню." +#: ../../Zotlabs/Module/Wiki.php:219 +msgid "Create a status post for this wiki" +msgstr "Создать публикацию о статусе этой Wiki" -#: ../../mod/menu.php:30 -msgid "Menu created." -msgstr "Меню создано." +#: ../../Zotlabs/Module/Wiki.php:220 +msgid "Edit Wiki Name" +msgstr "Редактировать наименование Wiki" -#: ../../mod/menu.php:34 -msgid "Unable to create menu." -msgstr "Невозможно создать меню." +#: ../../Zotlabs/Module/Wiki.php:262 +msgid "Wiki not found" +msgstr "Wiki не найдена" -#: ../../mod/menu.php:57 -msgid "Manage Menus" -msgstr "Управление меню" +#: ../../Zotlabs/Module/Wiki.php:286 +msgid "Rename page" +msgstr "Переименовать страницу" -#: ../../mod/menu.php:60 -msgid "Drop" -msgstr "Удалить" +#: ../../Zotlabs/Module/Wiki.php:307 +msgid "Error retrieving page content" +msgstr "Ошибка при получении содержимого страницы" -#: ../../mod/menu.php:62 -msgid "Create a new menu" -msgstr "Создать новое меню" +#: ../../Zotlabs/Module/Wiki.php:315 ../../Zotlabs/Module/Wiki.php:317 +msgid "New page" +msgstr "Новая страница" -#: ../../mod/menu.php:63 -msgid "Delete this menu" -msgstr "Удалить это меню" +#: ../../Zotlabs/Module/Wiki.php:345 +msgid "Revision Comparison" +msgstr "Сравнение ревизий" -#: ../../mod/menu.php:64 ../../mod/menu.php:109 -msgid "Edit menu contents" -msgstr "Редактировать содержание меню" +#: ../../Zotlabs/Module/Wiki.php:346 +msgid "Revert" +msgstr "Вернуть" -#: ../../mod/menu.php:65 -msgid "Edit this menu" -msgstr "Редактировать это меню" +#: ../../Zotlabs/Module/Wiki.php:353 +msgid "Short description of your changes (optional)" +msgstr "Краткое описание ваших изменений (необязательно)" -#: ../../mod/menu.php:80 -msgid "New Menu" -msgstr "Новое меню" +#: ../../Zotlabs/Module/Wiki.php:362 +msgid "Source" +msgstr "Источник" -#: ../../mod/menu.php:81 ../../mod/menu.php:110 -msgid "Menu name" -msgstr "Название меню" +#: ../../Zotlabs/Module/Wiki.php:372 +msgid "New page name" +msgstr "Новое имя страницы" -#: ../../mod/menu.php:81 ../../mod/menu.php:110 -msgid "Must be unique, only seen by you" -msgstr "" +#: ../../Zotlabs/Module/Wiki.php:377 +msgid "Embed image from photo albums" +msgstr "Встроить изображение из фотоальбома" -#: ../../mod/menu.php:82 ../../mod/menu.php:111 -msgid "Menu title" -msgstr "Название меню" +#: ../../Zotlabs/Module/Wiki.php:462 +msgid "Error creating wiki. Invalid name." +msgstr "Ошибка создания Wiki. Неверное имя." -#: ../../mod/menu.php:82 ../../mod/menu.php:111 -msgid "Menu title as seen by others" -msgstr "" +#: ../../Zotlabs/Module/Wiki.php:469 +msgid "A wiki with this name already exists." +msgstr "Wiki с таким именем уже существует." -#: ../../mod/menu.php:83 ../../mod/menu.php:112 -msgid "Allow bookmarks" -msgstr "Разрешить закладки" +#: ../../Zotlabs/Module/Wiki.php:482 +msgid "Wiki created, but error creating Home page." +msgstr "Wiki создана, но возникла ошибка при создании домашней страницы" -#: ../../mod/menu.php:83 ../../mod/menu.php:112 -msgid "Menu may be used to store saved bookmarks" -msgstr "Меню может использоваться, чтобы сохранить закладки" +#: ../../Zotlabs/Module/Wiki.php:489 +msgid "Error creating wiki" +msgstr "Ошибка при создании Wiki" -#: ../../mod/menu.php:98 -msgid "Menu deleted." -msgstr "Меню удалено." +#: ../../Zotlabs/Module/Wiki.php:512 +msgid "Error updating wiki. Invalid name." +msgstr "Ошибка при обновлении Wiki. Неверное имя." -#: ../../mod/menu.php:100 -msgid "Menu could not be deleted." -msgstr "Меню не может быть удален." +#: ../../Zotlabs/Module/Wiki.php:532 +msgid "Error updating wiki" +msgstr "Ошибка при обновлении Wiki" -#: ../../mod/menu.php:106 -msgid "Edit Menu" -msgstr "Редактировать меню" +#: ../../Zotlabs/Module/Wiki.php:547 +msgid "Wiki delete permission denied." +msgstr "Нет прав на удаление Wiki." -#: ../../mod/menu.php:108 -msgid "Add or remove entries to this menu" -msgstr "" +#: ../../Zotlabs/Module/Wiki.php:557 +msgid "Error deleting wiki" +msgstr "Ошибка удаления Wiki" -#: ../../mod/message.php:41 -msgid "Conversation removed." -msgstr "Разговор удален." +#: ../../Zotlabs/Module/Wiki.php:590 +msgid "New page created" +msgstr "Создана новая страница" -#: ../../mod/message.php:56 -msgid "No messages." -msgstr "Нет сообщений." +#: ../../Zotlabs/Module/Wiki.php:711 +msgid "Cannot delete Home" +msgstr "Невозможно удалить домашнюю страницу" -#: ../../mod/message.php:74 -msgid "D, d M Y - g:i A" -msgstr "D, d M Y - g:i A" +#: ../../Zotlabs/Module/Wiki.php:775 +msgid "Current Revision" +msgstr "Текущая ревизия" -#: ../../mod/new_channel.php:107 -msgid "Add a Channel" -msgstr "Добавить контакт" +#: ../../Zotlabs/Module/Wiki.php:775 +msgid "Selected Revision" +msgstr "Выбранная ревизия" -#: ../../mod/new_channel.php:108 -msgid "" -"A channel is your own collection of related web pages. A channel can be used" -" to hold social network profiles, blogs, conversation groups and forums, " -"celebrity pages, and much more. You may create as many channels as your " -"service provider allows." -msgstr "" +#: ../../Zotlabs/Module/Wiki.php:825 +msgid "You must be authenticated." +msgstr "Вы должны быть аутентифицированы." -#: ../../mod/new_channel.php:111 -msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" " -msgstr "" +#: ../../Zotlabs/Module/Magic.php:76 +msgid "Hub not found." +msgstr "Узел не найден." -#: ../../mod/new_channel.php:112 -msgid "Choose a short nickname" -msgstr "Выберите короткий псевдоним" +#: ../../Zotlabs/Module/Attach.php:13 +msgid "Item not available." +msgstr "Элемент недоступен." -#: ../../mod/new_channel.php:113 -msgid "" -"Your nickname will be used to create an easily remembered channel address " -"(like an email address) which you can share with others." -msgstr "" +#: ../../Zotlabs/Module/Group.php:35 +msgid "Privacy group created." +msgstr "Группа безопасности создана." -#: ../../mod/new_channel.php:114 -msgid "Or <a href=\"import\">import an existing channel</a> from another location" -msgstr "" +#: ../../Zotlabs/Module/Group.php:38 +msgid "Could not create privacy group." +msgstr "Не удалось создать группу безопасности." -#: ../../mod/notifications.php:26 -msgid "Invalid request identifier." -msgstr "" +#: ../../Zotlabs/Module/Group.php:67 +msgid "Privacy group updated." +msgstr "Группа безопасности обновлена." -#: ../../mod/notifications.php:35 -msgid "Discard" -msgstr "Отменить" +#: ../../Zotlabs/Module/Group.php:114 +msgid "Add Group" +msgstr "Добавить группу" -#: ../../mod/notifications.php:94 ../../mod/notify.php:53 -msgid "No more system notifications." -msgstr "Новых оповещений системы пока нет." +#: ../../Zotlabs/Module/Group.php:118 +msgid "Privacy group name" +msgstr "Имя группы безопасности" -#: ../../mod/notifications.php:98 ../../mod/notify.php:57 -msgid "System Notifications" -msgstr "Системные оповещения " +#: ../../Zotlabs/Module/Group.php:119 ../../Zotlabs/Module/Group.php:220 +msgid "Members are visible to other channels" +msgstr "Участники канала видимые для остальных" -#: ../../mod/oexchange.php:23 -msgid "Unable to find your hub." -msgstr "" +#: ../../Zotlabs/Module/Group.php:151 +msgid "Privacy group removed." +msgstr "Группа безопасности удалена." -#: ../../mod/oexchange.php:37 -msgid "Post successful." -msgstr "Публикация прошла успешно." +#: ../../Zotlabs/Module/Group.php:153 +msgid "Unable to remove privacy group." +msgstr "Ну удалось удалить группу безопасности." -#: ../../mod/zfinger.php:23 -msgid "invalid target signature" -msgstr "" +#: ../../Zotlabs/Module/Group.php:215 +#, php-format +msgid "Privacy Group: %s" +msgstr "Группа безопасности: %s" -#: ../../mod/openid.php:26 -msgid "OpenID protocol error. No ID returned." -msgstr "" +#: ../../Zotlabs/Module/Group.php:217 +msgid "Privacy group name: " +msgstr "Название группы безопасности: " -#: ../../mod/appman.php:28 ../../mod/appman.php:44 -msgid "App installed." -msgstr "Приложение установлено ." +#: ../../Zotlabs/Module/Group.php:222 +msgid "Delete Group" +msgstr "Удалить группу" -#: ../../mod/appman.php:37 -msgid "Malformed app." -msgstr "" +#: ../../Zotlabs/Module/Group.php:232 +msgid "Group members" +msgstr "Члены группы" -#: ../../mod/appman.php:80 -msgid "Embed code" -msgstr "Код для вставки" +#: ../../Zotlabs/Module/Group.php:234 +msgid "Not in this group" +msgstr "Не в этой группе" -#: ../../mod/appman.php:86 -msgid "Edit App" -msgstr "Редактировать приложение" +#: ../../Zotlabs/Module/Group.php:266 +msgid "Click a channel to toggle membership" +msgstr "Нажмите на канал для просмотра членства" -#: ../../mod/appman.php:86 -msgid "Create App" -msgstr "Создать приложение" +#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:184 +#: ../../Zotlabs/Module/Profiles.php:241 ../../Zotlabs/Module/Profiles.php:659 +msgid "Profile not found." +msgstr "Профиль не найден." -#: ../../mod/appman.php:91 -msgid "Name of app" -msgstr "Название приложения" +#: ../../Zotlabs/Module/Profiles.php:44 +msgid "Profile deleted." +msgstr "Профиль удален." -#: ../../mod/appman.php:92 -msgid "Location (URL) of app" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:105 +msgid "Profile-" +msgstr "Профиль -" -#: ../../mod/appman.php:94 -msgid "Photo icon URL" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:90 ../../Zotlabs/Module/Profiles.php:127 +msgid "New profile created." +msgstr "Новый профиль создан." -#: ../../mod/appman.php:94 -msgid "80 x 80 pixels - optional" -msgstr "80 x 80 pixels - необязательно" +#: ../../Zotlabs/Module/Profiles.php:111 +msgid "Profile unavailable to clone." +msgstr "Профиль недоступен для клонирования." -#: ../../mod/appman.php:95 -msgid "Version ID" -msgstr "Версия ID" +#: ../../Zotlabs/Module/Profiles.php:146 +msgid "Profile unavailable to export." +msgstr "Профиль недоступен для экспорта." -#: ../../mod/appman.php:96 -msgid "Price of app" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:252 +msgid "Profile Name is required." +msgstr "Требуется имя профиля." -#: ../../mod/appman.php:97 -msgid "Location (URL) to purchase app" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:459 +msgid "Marital Status" +msgstr "Семейное положение" -#: ../../view/theme/apw/php/config.php:202 -#: ../../view/theme/apw/php/config.php:236 -msgid "Schema Default" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:463 +msgid "Romantic Partner" +msgstr "Романтический партнер" -#: ../../view/theme/apw/php/config.php:203 -msgid "Sans-Serif" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:467 ../../Zotlabs/Module/Profiles.php:772 +msgid "Likes" +msgstr "Нравится" -#: ../../view/theme/apw/php/config.php:204 -msgid "Monospace" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:471 ../../Zotlabs/Module/Profiles.php:773 +msgid "Dislikes" +msgstr "Не нравится" -#: ../../view/theme/apw/php/config.php:259 -#: ../../view/theme/blogga/php/config.php:69 -#: ../../view/theme/blogga/view/theme/blog/config.php:69 -#: ../../view/theme/redbasic/php/config.php:102 -msgid "Theme settings" -msgstr "Настройки темы" +#: ../../Zotlabs/Module/Profiles.php:475 ../../Zotlabs/Module/Profiles.php:780 +msgid "Work/Employment" +msgstr "Работа / Занятость" -#: ../../view/theme/apw/php/config.php:260 -#: ../../view/theme/redbasic/php/config.php:103 -msgid "Set scheme" -msgstr "Установить схему" +#: ../../Zotlabs/Module/Profiles.php:478 +msgid "Religion" +msgstr "Религия" -#: ../../view/theme/apw/php/config.php:261 -#: ../../view/theme/redbasic/php/config.php:124 -msgid "Set font-size for posts and comments" -msgstr "Установить размер шрифта для сообщений и комментариев" +#: ../../Zotlabs/Module/Profiles.php:482 +msgid "Political Views" +msgstr "Политические взгляды" -#: ../../view/theme/apw/php/config.php:262 -msgid "Set font face" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:490 +msgid "Sexual Preference" +msgstr "Сексуальная ориентация" -#: ../../view/theme/apw/php/config.php:263 -msgid "Set iconset" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:494 +msgid "Homepage" +msgstr "Домашняя страница" -#: ../../view/theme/apw/php/config.php:264 -msgid "Set big shadow size, default 15px 15px 15px" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:498 +msgid "Interests" +msgstr "Интересы" -#: ../../view/theme/apw/php/config.php:265 -msgid "Set small shadow size, default 5px 5px 5px" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:594 +msgid "Profile updated." +msgstr "Профиль обновлен." -#: ../../view/theme/apw/php/config.php:266 -msgid "Set shadow colour, default #000" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:678 +msgid "Hide your connections list from viewers of this profile" +msgstr "Скрывать от просмотра ваш список контактов в этом профиле" -#: ../../view/theme/apw/php/config.php:267 -msgid "Set radius size, default 5px" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:722 +msgid "Edit Profile Details" +msgstr "Редактирование профиля" -#: ../../view/theme/apw/php/config.php:268 -msgid "Set line-height for posts and comments" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:724 +msgid "View this profile" +msgstr "Посмотреть этот профиль" -#: ../../view/theme/apw/php/config.php:269 -msgid "Set background image" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:726 +msgid "Profile Tools" +msgstr "Инструменты профиля" -#: ../../view/theme/apw/php/config.php:270 -msgid "Set background attachment" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:727 +msgid "Change cover photo" +msgstr "Изменить фотографию обложки" -#: ../../view/theme/apw/php/config.php:271 -msgid "Set background colour" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:729 +msgid "Create a new profile using these settings" +msgstr "Создать новый профиль со следующими настройками" -#: ../../view/theme/apw/php/config.php:272 -msgid "Set section background image" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:730 +msgid "Clone this profile" +msgstr "Клонировать этот профиль" -#: ../../view/theme/apw/php/config.php:273 -msgid "Set section background colour" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:731 +msgid "Delete this profile" +msgstr "Удалить этот профиль" -#: ../../view/theme/apw/php/config.php:274 -msgid "Set colour of items - use hex" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:732 +msgid "Add profile things" +msgstr "Добавить в профиль" -#: ../../view/theme/apw/php/config.php:275 -msgid "Set colour of links - use hex" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:735 +msgid "Relationship" +msgstr "Отношения" -#: ../../view/theme/apw/php/config.php:276 -msgid "Set max-width for items. Default 400px" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:738 +msgid "Import profile from file" +msgstr "Импортировать профиль из файла" -#: ../../view/theme/apw/php/config.php:277 -msgid "Set min-width for items. Default 240px" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:739 +msgid "Export profile to file" +msgstr "Экспортировать профиль в файл" -#: ../../view/theme/apw/php/config.php:278 -msgid "Set the generic content wrapper width. Default 48%" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:740 +msgid "Your gender" +msgstr "Ваш пол" -#: ../../view/theme/apw/php/config.php:279 -msgid "Set colour of fonts - use hex" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:741 +msgid "Marital status" +msgstr "Семейное положение" -#: ../../view/theme/apw/php/config.php:280 -msgid "Set background-size element" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:742 +msgid "Sexual preference" +msgstr "Сексуальная ориентация" -#: ../../view/theme/apw/php/config.php:281 -msgid "Item opacity" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:745 +msgid "Profile name" +msgstr "Имя профиля" -#: ../../view/theme/apw/php/config.php:282 -msgid "Display post previews only" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:747 +msgid "This is your default profile." +msgstr "Это ваш профиль по умолчанию." -#: ../../view/theme/apw/php/config.php:283 -msgid "Display side bar on channel page" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:749 +msgid "Your full name" +msgstr "Ваше полное имя" -#: ../../view/theme/apw/php/config.php:284 -msgid "Colour of the navigation bar" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:750 +msgid "Title/Description" +msgstr "Заголовок / описание" -#: ../../view/theme/apw/php/config.php:285 -msgid "Item float" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:753 +msgid "Street address" +msgstr "Улица, дом, квартира" -#: ../../view/theme/apw/php/config.php:286 -msgid "Left offset of the section element" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:754 +msgid "Locality/City" +msgstr "Населенный пункт / город" -#: ../../view/theme/apw/php/config.php:287 -msgid "Right offset of the section element" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:755 +msgid "Region/State" +msgstr "Регион / Область" -#: ../../view/theme/apw/php/config.php:288 -msgid "Section width" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:756 +msgid "Postal/Zip code" +msgstr "Почтовый индекс" -#: ../../view/theme/apw/php/config.php:289 -msgid "Left offset of the aside" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:762 +msgid "Who (if applicable)" +msgstr "Кто (если применимо)" -#: ../../view/theme/apw/php/config.php:290 -msgid "Right offset of the aside element" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:762 +msgid "Examples: cathy123, Cathy Williams, cathy@example.com" +msgstr "Примеры: ivan1990, Ivan Petrov, ivan@example.com" -#: ../../view/theme/blogga/php/config.php:47 -#: ../../view/theme/blogga/view/theme/blog/config.php:47 -msgid "None" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:763 +msgid "Since (date)" +msgstr "С (дата)" -#: ../../view/theme/blogga/php/config.php:70 -#: ../../view/theme/blogga/view/theme/blog/config.php:70 -msgid "Header image" -msgstr "Графика заголовока" +#: ../../Zotlabs/Module/Profiles.php:766 +msgid "Tell us about yourself" +msgstr "Расскажите нам о себе" -#: ../../view/theme/blogga/php/config.php:71 -#: ../../view/theme/blogga/view/theme/blog/config.php:71 -msgid "Header image only on profile pages" -msgstr "" +#: ../../Zotlabs/Module/Profiles.php:768 +msgid "Hometown" +msgstr "Родной город" -#: ../../view/theme/redbasic/php/config.php:104 -msgid "Narrow navbar" -msgstr "Узкая панель навигации" +#: ../../Zotlabs/Module/Profiles.php:769 +msgid "Political views" +msgstr "Политические взгляды" -#: ../../view/theme/redbasic/php/config.php:105 -msgid "Navigation bar background colour" -msgstr "Панель навигации, цвет фона" +#: ../../Zotlabs/Module/Profiles.php:770 +msgid "Religious views" +msgstr "Религиозные взгляды" -#: ../../view/theme/redbasic/php/config.php:106 -msgid "Navigation bar gradient top colour" -msgstr "Панель навигации, цвет градиента вверху" +#: ../../Zotlabs/Module/Profiles.php:771 +msgid "Keywords used in directory listings" +msgstr "Ключевые слова для участия в каталоге" -#: ../../view/theme/redbasic/php/config.php:107 -msgid "Navigation bar gradient bottom colour" -msgstr "Панель навигации, цвет градиента внизу" +#: ../../Zotlabs/Module/Profiles.php:771 +msgid "Example: fishing photography software" +msgstr "Например: fishing photography software" -#: ../../view/theme/redbasic/php/config.php:108 -msgid "Navigation active button gradient top colour" -msgstr "Панель навигации, цвет градиента вверху активной кнопки" +#: ../../Zotlabs/Module/Profiles.php:774 +msgid "Musical interests" +msgstr "Музыкальные интересы" -#: ../../view/theme/redbasic/php/config.php:109 -msgid "Navigation active button gradient bottom colour" -msgstr "Панель навигации, цвет градиента внизу активной кнопки" +#: ../../Zotlabs/Module/Profiles.php:775 +msgid "Books, literature" +msgstr "Книги, литература" -#: ../../view/theme/redbasic/php/config.php:110 -msgid "Navigation bar border colour " -msgstr "Панель навигации, цвет границы" +#: ../../Zotlabs/Module/Profiles.php:776 +msgid "Television" +msgstr "Телевидение" -#: ../../view/theme/redbasic/php/config.php:111 -msgid "Navigation bar icon colour " -msgstr "Панель навигации, цвет значков" +#: ../../Zotlabs/Module/Profiles.php:777 +msgid "Film/Dance/Culture/Entertainment" +msgstr "Кино / танцы / культура / развлечения" -#: ../../view/theme/redbasic/php/config.php:112 -msgid "Navigation bar active icon colour " -msgstr "Панель навигации, цвет активного значка" +#: ../../Zotlabs/Module/Profiles.php:778 +msgid "Hobbies/Interests" +msgstr "Хобби / интересы" -#: ../../view/theme/redbasic/php/config.php:113 -msgid "link colour" -msgstr "Цвет ссылок" +#: ../../Zotlabs/Module/Profiles.php:779 +msgid "Love/Romance" +msgstr "Любовь / романтические отношения" -#: ../../view/theme/redbasic/php/config.php:114 -msgid "Set font-colour for banner" -msgstr "Цвет текста в шапке" +#: ../../Zotlabs/Module/Profiles.php:781 +msgid "School/Education" +msgstr "Школа / образование" -#: ../../view/theme/redbasic/php/config.php:115 -msgid "Set the background colour" -msgstr "Цвет фона на странице канала" +#: ../../Zotlabs/Module/Profiles.php:782 +msgid "Contact information and social networks" +msgstr "Информация и социальные сети для связи" -#: ../../view/theme/redbasic/php/config.php:116 -msgid "Set the background image" -msgstr "Фоновое изображение" +#: ../../Zotlabs/Module/Profiles.php:783 +msgid "My other channels" +msgstr "Мои другие контакты" -#: ../../view/theme/redbasic/php/config.php:117 -msgid "Set the background colour of items" -msgstr "Цвет фона для постов и других элементов" +#: ../../Zotlabs/Module/Profiles.php:785 +msgid "Communications" +msgstr "Связи" -#: ../../view/theme/redbasic/php/config.php:118 -msgid "Set the background colour of comments" -msgstr "Цвет фона для комментариев" +#: ../../Zotlabs/Module/Email_resend.php:30 +msgid "Email verification resent" +msgstr "Сообщение для проверки email отправлено повторно" -#: ../../view/theme/redbasic/php/config.php:119 -msgid "Set the border colour of comments" -msgstr "Цвет границы для области комментариев" +#: ../../Zotlabs/Module/Email_resend.php:33 +msgid "Unable to resend email verification message." +msgstr "Невозможно повторно отправить сообщение для проверки email" -#: ../../view/theme/redbasic/php/config.php:120 -msgid "Set the indent for comments" -msgstr "" +#: ../../Zotlabs/Module/Profile.php:93 +msgid "vcard" +msgstr "vCard" + +#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63 +msgid "Invalid profile identifier." +msgstr "Неверный идентификатор профиля" -#: ../../view/theme/redbasic/php/config.php:121 -msgid "Set the basic colour for item icons" -msgstr "Основной цвет в иконках редактирования" +#: ../../Zotlabs/Module/Profperm.php:111 +msgid "Profile Visibility Editor" +msgstr "Редактор видимости профиля" -#: ../../view/theme/redbasic/php/config.php:122 -msgid "Set the hover colour for item icons" -msgstr "Цвет в иконках редактирования при наведении мыши" +#: ../../Zotlabs/Module/Profperm.php:115 +msgid "Click on a contact to add or remove." +msgstr "Нажмите на контакт, чтобы добавить или удалить." -#: ../../view/theme/redbasic/php/config.php:123 -msgid "Set font-size for the entire application" -msgstr "Установить размер шрифта для системы в целом" +#: ../../Zotlabs/Module/Profperm.php:124 +msgid "Visible To" +msgstr "Видно" -#: ../../view/theme/redbasic/php/config.php:125 -msgid "Set font-colour for posts and comments" -msgstr "Цвет шрифта для постов и комментариев" +#: ../../Zotlabs/Module/Thing.php:120 +msgid "Thing updated" +msgstr "Обновлено" -#: ../../view/theme/redbasic/php/config.php:126 -msgid "Set radius of corners" -msgstr "Радиус скруглений" +#: ../../Zotlabs/Module/Thing.php:172 +msgid "Object store: failed" +msgstr "Хранлищие объектов: неудача" -#: ../../view/theme/redbasic/php/config.php:127 -msgid "Set shadow depth of photos" -msgstr "" +#: ../../Zotlabs/Module/Thing.php:176 +msgid "Thing added" +msgstr "Добавлено" -#: ../../view/theme/redbasic/php/config.php:128 -msgid "Set maximum width of conversation regions" +#: ../../Zotlabs/Module/Thing.php:202 +#, php-format +msgid "OBJ: %1$s %2$s %3$s" msgstr "" -#: ../../view/theme/redbasic/php/config.php:129 -msgid "Center conversation regions" -msgstr "" +#: ../../Zotlabs/Module/Thing.php:265 +msgid "Show Thing" +msgstr "Показать" -#: ../../view/theme/redbasic/php/config.php:130 -msgid "Set minimum opacity of nav bar - to hide it" -msgstr "Панель навигации, прозрачность" +#: ../../Zotlabs/Module/Thing.php:272 +msgid "item not found." +msgstr "Элемент не найден." -#: ../../view/theme/redbasic/php/config.php:131 -msgid "Set size of conversation author photo" -msgstr "" +#: ../../Zotlabs/Module/Thing.php:305 +msgid "Edit Thing" +msgstr "Редактировать" -#: ../../view/theme/redbasic/php/config.php:132 -msgid "Set size of followup author photos" -msgstr "" +#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:364 +msgid "Select a profile" +msgstr "Выбрать профиль" -#: ../../view/theme/redbasic/php/config.php:133 -msgid "Sloppy photo albums" -msgstr "" +#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:367 +msgid "Post an activity" +msgstr "Опубликовать мероприятие" -#: ../../view/theme/redbasic/php/config.php:133 -msgid "Are you a clean desk or a messy desk person?" -msgstr "" +#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:367 +msgid "Only sends to viewers of the applicable profile" +msgstr "Отправлять только подходящий профиль" -#: ../../view/tpl/smarty3/compiled/de0b699d2fc212753c3f166003476a343ca00174.file.cloud_directory.tpl.php:38 -msgid "Type" -msgstr "Тип" +#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:369 +msgid "Name of thing e.g. something" +msgstr "Наименование, например \"нечто\"" -#: ../../view/tpl/smarty3/compiled/de0b699d2fc212753c3f166003476a343ca00174.file.cloud_directory.tpl.php:40 -msgid "Size" -msgstr "Размер" +#: ../../Zotlabs/Module/Thing.php:315 ../../Zotlabs/Module/Thing.php:370 +msgid "URL of thing (optional)" +msgstr "URL (необязательно)" -#: ../../view/tpl/smarty3/compiled/de0b699d2fc212753c3f166003476a343ca00174.file.cloud_directory.tpl.php:42 -msgid "Last modified" -msgstr "Последнее изменение" +#: ../../Zotlabs/Module/Thing.php:317 ../../Zotlabs/Module/Thing.php:371 +msgid "URL for photo of thing (optional)" +msgstr "URL для фотографии (необязательно)" -#: ../../view/tpl/smarty3/compiled/de0b699d2fc212753c3f166003476a343ca00174.file.cloud_directory.tpl.php:85 -msgid "Are you sure you want to delete this item?" -msgstr "Вы уверены, что хотите удалить этот элемент?" +#: ../../Zotlabs/Module/Thing.php:362 +msgid "Add Thing to your Profile" +msgstr "Добавить к вашему профилю" -#: ../../view/tpl/smarty3/compiled/de0b699d2fc212753c3f166003476a343ca00174.file.cloud_directory.tpl.php:103 -msgid "Total" -msgstr "Всего" +#: ../../Zotlabs/Module/Display.php:394 +msgid "Article" +msgstr "Статья" -#: ../../boot.php:1273 +#: ../../Zotlabs/Module/Display.php:446 +msgid "Item has been removed." +msgstr "Элемент был удалён." + +#: ../../Zotlabs/Module/Home.php:92 #, php-format -msgid "Update %s failed. See error logs." -msgstr "" +msgid "Welcome to %s" +msgstr "Добро пожаловать в %s" + +#: ../../Zotlabs/Module/Cloud.php:129 +msgid "Please refresh page" +msgstr "Пожалуйста обновите страницу" + +#: ../../Zotlabs/Module/Cloud.php:132 +msgid "Unknown error" +msgstr "Неизвестная ошибка" + +#: ../../Zotlabs/Module/Lostpass.php:19 +msgid "No valid account found." +msgstr "Действительный аккаунт не найден." + +#: ../../Zotlabs/Module/Lostpass.php:33 +msgid "Password reset request issued. Check your email." +msgstr "Запрос на сброс пароля отправлен. Проверьте вашу электронную почту." -#: ../../boot.php:1276 +#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:108 #, php-format -msgid "Update Error at %s" -msgstr "Ошибка обновления на %s" +msgid "Site Member (%s)" +msgstr "Участник сайта (%s)" -#: ../../boot.php:1440 +#: ../../Zotlabs/Module/Lostpass.php:44 ../../Zotlabs/Module/Lostpass.php:49 +#, php-format +msgid "Password reset requested at %s" +msgstr "Запроше сброс пароля на %s" + +#: ../../Zotlabs/Module/Lostpass.php:68 msgid "" -"Create an account to access services and applications within the Hubzilla" -msgstr "" +"Request could not be verified. (You may have previously submitted it.) " +"Password reset failed." +msgstr "Запрос не может быть проверен. (Вы могли отправить его раньше). Сброс пароля не возможен." -#: ../../boot.php:1468 -msgid "Password" -msgstr "Пароль" +#: ../../Zotlabs/Module/Lostpass.php:92 +msgid "Your password has been reset as requested." +msgstr "Ваш пароль в соответствии с просьбой сброшен." -#: ../../boot.php:1469 -msgid "Remember me" -msgstr "Запомнить" +#: ../../Zotlabs/Module/Lostpass.php:93 +msgid "Your new password is" +msgstr "Ваш новый пароль" -#: ../../boot.php:1474 -msgid "Forgot your password?" -msgstr "Забыли пароль или логин?" +#: ../../Zotlabs/Module/Lostpass.php:94 +msgid "Save or copy your new password - and then" +msgstr "Сохраните ваш новый пароль и затем" -#: ../../boot.php:1539 -msgid "permission denied" -msgstr "доступ запрещен" +#: ../../Zotlabs/Module/Lostpass.php:95 +msgid "click here to login" +msgstr "нажмите здесь чтобы войти" + +#: ../../Zotlabs/Module/Lostpass.php:96 +msgid "" +"Your password may be changed from the <em>Settings</em> page after " +"successful login." +msgstr "Ваш пароль может быть изменён на странице <em>Настройки</em>после успешного входа." + +#: ../../Zotlabs/Module/Lostpass.php:117 +#, php-format +msgid "Your password has changed at %s" +msgstr "Пароль был изменен на %s" -#: ../../boot.php:1540 -msgid "Got Zot?" -msgstr "Got Zot?" +#: ../../Zotlabs/Module/Lostpass.php:130 +msgid "Forgot your Password?" +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." +msgstr "Введите ваш адрес электронной почты и нажмите отправить чтобы сбросить пароль. Затем проверьте ваш почтовый ящик для дальнейших инструкций. " + +#: ../../Zotlabs/Module/Lostpass.php:132 +msgid "Email Address" +msgstr "Адрес электронной почты" + +#: ../../Zotlabs/Module/Mood.php:136 +msgid "Set your current mood and tell your friends" +msgstr "Установить текущее настроение и рассказать друзьям" + +#: ../../Zotlabs/Module/Import_items.php:93 +#, php-format +msgid "Warning: Database versions differ by %1$d updates." +msgstr "Предупреждение: Версия базы данных отличается от %1$d обновления." + +#: ../../Zotlabs/Module/Import_items.php:108 +msgid "Import completed" +msgstr "Импорт завершён." + +#: ../../Zotlabs/Module/Import_items.php:125 +msgid "Import Items" +msgstr "Импортировать объекты" + +#: ../../Zotlabs/Module/Import_items.php:126 +msgid "Use this form to import existing posts and content from an export file." +msgstr "Используйте эту форму для импорта существующих публикаций и содержимого из файла." + +#: ../../Zotlabs/Module/Chanview.php:139 +msgid "toggle full screen mode" +msgstr "переключение полноэкранного режима" + +#: ../../Zotlabs/Storage/Browser.php:107 ../../Zotlabs/Storage/Browser.php:289 +msgid "parent" +msgstr "источник" + +#: ../../Zotlabs/Storage/Browser.php:134 +msgid "Principal" +msgstr "Субъект" + +#: ../../Zotlabs/Storage/Browser.php:137 +msgid "Addressbook" +msgstr "Адресная книга" + +#: ../../Zotlabs/Storage/Browser.php:143 +msgid "Schedule Inbox" +msgstr "План занятий входящий" + +#: ../../Zotlabs/Storage/Browser.php:146 +msgid "Schedule Outbox" +msgstr "План занятий исходящий" + +#: ../../Zotlabs/Storage/Browser.php:273 +msgid "Total" +msgstr "Всего" + +#: ../../Zotlabs/Storage/Browser.php:275 +msgid "Shared" +msgstr "Общие" + +#: ../../Zotlabs/Storage/Browser.php:277 +msgid "Add Files" +msgstr "Добавить файлы" + +#: ../../Zotlabs/Storage/Browser.php:361 +#, php-format +msgid "You are using %1$s of your available file storage." +msgstr "Вы используете %1$s из доступного вам хранилища файлов." + +#: ../../Zotlabs/Storage/Browser.php:366 +#, php-format +msgid "You are using %1$s of %2$s available file storage. (%3$s%)" +msgstr "Вы используете %1$s из %2$s доступного хранилища файлов (%3$s%)." + +#: ../../Zotlabs/Storage/Browser.php:377 +msgid "WARNING:" +msgstr "Предупреждение:" + +#: ../../Zotlabs/Storage/Browser.php:389 +msgid "Create new folder" +msgstr "Создать новую папку" + +#: ../../Zotlabs/Storage/Browser.php:391 +msgid "Upload file" +msgstr "Загрузить файл" -#: ../../boot.php:1970 -msgid "toggle mobile" -msgstr "мобильное подключение" +#: ../../Zotlabs/Storage/Browser.php:404 +msgid "Drop files here to immediately upload" +msgstr "Поместите файлы сюда для немедленной загрузки" diff --git a/view/ru/hstrings.php b/view/ru/hstrings.php index 4e42df2fc..45fc75773 100644 --- a/view/ru/hstrings.php +++ b/view/ru/hstrings.php @@ -2,568 +2,1140 @@ if(! function_exists("string_plural_select_ru")) { function string_plural_select_ru($n){ - return ($n%10==1 && $n%100!=11 ? 0 : $n%10>=2 && $n%10<=4 && ($n%100<10 || $n%100>=20) ? 1 : 2);; + return ($n%10==1 && $n%100!=11 ? 0 : ($n%10>=2 && $n%10<=4 && ($n%100<12 || $n%100>14) ? 1 : 2)); }} -; -App::$strings["Cannot locate DNS info for database server '%s'"] = ""; -App::$strings["Profile Photos"] = "Фотографии профиля"; -App::$strings["Image/photo"] = "Изображение / фото"; +App::$rtl = 0; +App::$strings["Source channel not found."] = "Канал-источник не найден."; +App::$strings["lonely"] = "одинокий"; +App::$strings["drunk"] = "пьяный"; +App::$strings["horny"] = "возбуждённый"; +App::$strings["stoned"] = "под кайфом"; +App::$strings["fucked up"] = "облажался"; +App::$strings["clusterfucked"] = "в полной заднице"; +App::$strings["crazy"] = "сумасшедший"; +App::$strings["hurt"] = "обиженный"; +App::$strings["sleepy"] = "сонный"; +App::$strings["grumpy"] = "сердитый"; +App::$strings["high"] = "кайфует"; +App::$strings["semi-conscious"] = "в полубезсознании"; +App::$strings["in love"] = "влюблённый"; +App::$strings["in lust"] = "похотливый"; +App::$strings["naked"] = "обнажённый"; +App::$strings["stinky"] = "вонючий"; +App::$strings["sweaty"] = "потный"; +App::$strings["bleeding out"] = "истекающий кровью"; +App::$strings["victorious"] = "победивший"; +App::$strings["defeated"] = "проигравший"; +App::$strings["envious"] = "завидует"; +App::$strings["jealous"] = "ревнует"; +App::$strings["Post to Dreamwidth"] = "Публиковать в Dreamwidth"; +App::$strings["Enable Dreamwidth Post Plugin"] = "Включить плагин публикаций Dreamwidth"; +App::$strings["No"] = "Нет"; +App::$strings["Yes"] = "Да"; +App::$strings["Dreamwidth username"] = "Имя пользователя Dreamwidth"; +App::$strings["Dreamwidth password"] = "Пароль Dreamwidth"; +App::$strings["Post to Dreamwidth by default"] = "Публиковать в Dreamwidth по умолчанию"; +App::$strings["Dreamwidth Post Settings"] = "Настройки публикаций в Dreamwidth"; +App::$strings["Submit"] = "Отправить"; +App::$strings["Markdown"] = "Разметка"; +App::$strings["Use markdown for editing posts"] = "Использовать язык разметки для редактирования публикаций"; +App::$strings["You're welcome."] = "Пожалуйста."; +App::$strings["Ah shucks..."] = "О, чёрт..."; +App::$strings["Don't mention it."] = "Не стоит благодарности."; +App::$strings["<blush>"] = "<краснею>"; +App::$strings["Send test email"] = "Отправить тестовый email"; +App::$strings["No recipients found."] = "Получателей не найдено."; +App::$strings["Mail sent."] = "Сообщение отправлено"; +App::$strings["Sending of mail failed."] = "Не удалось отправить сообщение."; +App::$strings["Mail Test"] = "Тестовое сообщение"; +App::$strings["Message subject"] = "Тема сообщения"; +App::$strings["Project Servers and Resources"] = "Серверы и ресурсы проекта"; +App::$strings["Project Creator and Tech Lead"] = "Создатель проекта и технический руководитель"; +App::$strings["Admin, developer, directorymin, support bloke"] = "Администратор, разработчик, администратор каталога, поддержка"; +App::$strings["And the hundreds of other people and organisations who helped make the Hubzilla possible."] = "И сотни других людей и организаций которые помогали в создании 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."] = "Проекты Redmatrix / Hubzilla предоставляются, в основном, добровольцами, которые предоставляют свое время и опыт и, часто, оплачивают из своего кармана услуги, которыми они делятся с другими."; +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>.)"] = "Здесь нет корпоративного финансирования и рекламы, мы не собираем и не продаем вашу личную информацию. (Мы не контролируем вашу личную информацию - <strong>это делаете вы</strong>.)"; +App::$strings["Help support our ground-breaking work in decentralisation, web identity, and privacy."] = "Помогите поддержать нашу новаторскую работу в областях децентрализации, веб-идентификации и конфиденциальности."; +App::$strings["Your donations keep servers and services running and also helps us to provide innovative new features and continued development."] = "В ваших пожертвованиях поддерживают серверы и службы, а также помогают нам предоставлять новые возможности и продолжать развитие."; +App::$strings["Donate"] = "Пожертвовать"; +App::$strings["Choose a project, developer, or public hub to support with a one-time donation"] = "Выберите проект, разработчика или общедоступный узел для поддержки в форме единоразового пожертвования"; +App::$strings["Donate Now"] = "Пожертвовать сейчас"; +App::$strings["<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)"] = "<strong><em>или</em></strong> станьте спонсором проекта (только для Hubzilla)"; +App::$strings["Please indicate if you would like your first name or full name (or nothing) to appear in our sponsor listing"] = "Пожалуйста, если желаете, укажите ваше имя для отображения в списке спонсоров."; +App::$strings["Sponsor"] = "Спонсор"; +App::$strings["Special thanks to: "] = "Особые благодарности:"; +App::$strings["Currently blocked"] = "В настоящее время заблокирован"; +App::$strings["No channels currently blocked"] = "В настоящее время никакие каналы не блокируются"; +App::$strings["Remove"] = "Удалить"; +App::$strings["Superblock Settings"] = "Настройки Superblock"; +App::$strings["Block Completely"] = "Заблокировать полностью"; +App::$strings["superblock settings updated"] = "Настройки Superblock обновлены."; +App::$strings["XMPP settings updated."] = "Настройки XMPP обновлены."; +App::$strings["Enable Chat"] = "Включить чат"; +App::$strings["Individual credentials"] = "Индивидуальные разрешения"; +App::$strings["Jabber BOSH server"] = "Сервер Jabber BOSH"; +App::$strings["XMPP Settings"] = "Настройки XMPP"; +App::$strings["Save Settings"] = "Сохранить настройки"; +App::$strings["Jabber BOSH host"] = "Узел Jabber BOSH"; +App::$strings["Use central userbase"] = "Использовать центральную базу данных"; +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."] = "Если включено, участники автоматически войдут на сервер ejabberd, который должен быть установлен на этом компьютере с синхронизированными учетными данными через скрипт \"auth_ejabberd.php\"."; +App::$strings["Settings updated."] = "Настройки обновлены."; +App::$strings["Send email to all members"] = "Отправить email всем участникам"; +App::$strings["%s Administrator"] = "администратор %s"; +App::$strings["%1\$d of %2\$d messages sent."] = "%1\$d из %2\$d сообщений отправлено."; +App::$strings["Send email to all hub members."] = "Отправить email всем участникам узла."; +App::$strings["Sender Email address"] = "Адрес электронной почты отправителя"; +App::$strings["Test mode (only send to hub administrator)"] = "Тестовый режим (отправка только администратору узла)"; +App::$strings["Report Bug"] = "Сообщить об ошибке"; +App::$strings["Post to Insanejournal"] = "Опубликовать в InsaneJournal"; +App::$strings["Enable InsaneJournal Post Plugin"] = "Включить плагин публикаций InsaneJournal"; +App::$strings["InsaneJournal username"] = "Имя пользователя InsaneJournal"; +App::$strings["InsaneJournal password"] = "Пароль InsaneJournal"; +App::$strings["Post to InsaneJournal by default"] = "Публиковать в InsaneJournal по умолчанию"; +App::$strings["InsaneJournal Post Settings"] = "Настройки публикаций в InsaneJournal"; +App::$strings["Insane Journal Settings saved."] = "Настройки InsaneJournal сохранены."; +App::$strings["Hubzilla Directory Stats"] = "Каталог статистики Hubzilla"; +App::$strings["Total Hubs"] = "Всего хабов"; +App::$strings["Hubzilla Hubs"] = "Хабы Hubzilla"; +App::$strings["Friendica Hubs"] = "Хабы Friendica"; +App::$strings["Diaspora Pods"] = "Стручки Diaspora"; +App::$strings["Hubzilla Channels"] = "Каналы Hubzilla"; +App::$strings["Friendica Channels"] = "Каналы Friendica"; +App::$strings["Diaspora Channels"] = "Каналы Diaspora"; +App::$strings["Aged 35 and above"] = "Возраст 35 и выше"; +App::$strings["Aged 34 and under"] = "Возраст 34 и ниже"; +App::$strings["Average Age"] = "Средний возраст"; +App::$strings["Known Chatrooms"] = "Известные чаты"; +App::$strings["Known 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,"] = "Обратите внимание, что статистика Diaspora и Friendica это только те, о которых ** этот каталог ** знает, а не все известные в сети. Это также относится и к чатам."; +App::$strings["Invalid game."] = "Недействительная игра"; +App::$strings["You are not a player in this game."] = "Вы не играете в эту игру."; +App::$strings["You must be a local channel to create a game."] = "Ваш канал должен быть локальным чтобы создать игру."; +App::$strings["You must select one opponent that is not yourself."] = "Вы должны выбрать противника который не является вами."; +App::$strings["Random color chosen."] = "Выбран случайный цвет."; +App::$strings["Error creating new game."] = "Ошибка создания новой игры."; +App::$strings["Requested channel is not available."] = "Запрошенный канал не доступен."; +App::$strings["You must select a local channel /chess/channelname"] = "Вы должны выбрать локальный канал /chess/channelname"; +App::$strings["You must be logged in to see this page."] = "Вы должны авторизоваться, чтобы увидеть эту страницу."; +App::$strings["Enable notifications"] = "Включить оповещения"; +App::$strings["Planets Settings updated."] = "Настройки Planets обновлены."; +App::$strings["Enable Planets Plugin"] = "Включить плагин Planets"; +App::$strings["Planets Settings"] = "Настройки Planets"; +App::$strings["Post to Libertree"] = "Опубликовать в Libertree"; +App::$strings["Enable Libertree Post Plugin"] = "Включить плагин публикаций Libertree"; +App::$strings["Libertree API token"] = "Токен Libertree API"; +App::$strings["Libertree site URL"] = "URL сайта Libertree"; +App::$strings["Post to Libertree by default"] = "Публиковать в Libertree по умолчанию"; +App::$strings["Libertree Post Settings"] = "Настройки публикаций в Libertree"; +App::$strings["Libertree Settings saved."] = "Настройки Libertree сохранены."; +App::$strings["Only authenticate automatically to sites of your friends"] = "Автоматически аутентифицироватся только на сайтах ваших друзей"; +App::$strings["By default you are automatically authenticated anywhere in the network"] = "По умолчанию вы автоматически аутентифицируетесь во всей сети"; +App::$strings["Authchoose Settings"] = "Настройки выбора аутентификации"; +App::$strings["Atuhchoose Settings updated."] = "Настройки выбора аутентификации обновлены."; +App::$strings["Logfile archive directory"] = "Каталог архивирования журнала"; +App::$strings["Directory to store rotated logs"] = "Каталог для хранения заархивированных журналов"; +App::$strings["Logfile size in bytes before rotating"] = "Размер файла журнала в байтах для архивирования"; +App::$strings["Number of logfiles to retain"] = "Количество сохраняемых файлов журналов"; +App::$strings["QR code"] = "QR-код"; +App::$strings["QR Generator"] = "Генератор QR-кодов"; +App::$strings["Enter some text"] = "Введите любой текст"; +App::$strings["text to include in all outgoing posts from this site"] = "текст, который будет добавлен во все исходящие публикации с этого сайта"; +App::$strings["file"] = "файл"; +App::$strings["Permission denied"] = "Доступ запрещен"; +App::$strings["Redmatrix File Storage Import"] = "Импорт файлового хранилища Redmatrix"; +App::$strings["This will import all your Redmatrix cloud files to this channel."] = "Это позволит импортировать все ваши файлы в Redmatrix в этот канал."; +App::$strings["Redmatrix Server base URL"] = "Базовый URL сервера Redmatrix"; +App::$strings["Redmatrix Login Username"] = "Имя пользователя Redmatrix"; +App::$strings["Redmatrix Login Password"] = "Пароль Redmatrix"; +App::$strings["Deactivate the feature"] = "Деактивировать функцию"; +App::$strings["Hide the button and show the smilies directly."] = "Скрыть кнопку и сразу показывать смайлики."; +App::$strings["Smileybutton Settings"] = "Настройки кнопки смайликов"; +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."] = "Этот плагин просматривает публикации для слов / текста, которые вы указываете ниже, и сворачивает любой контент, содержащий эти ключевые слова, поэтому он не отображается в неподходящее время, например, сексуальные инсинуации, которые могут быть неправильными в настройке работы. Например, мы рекомендуем отмечать любой контент, содержащий наготу, тегом #NSFW. Этот фильтр также способен реагировать на любое другое указанное вами слово / текст и может использоваться в качестве фильтра содержимого общего назначения."; +App::$strings["Enable Content filter"] = "Включить фильтрацию содержимого"; +App::$strings["Comma separated list of keywords to hide"] = "Список ключевых слов для скрытия, через запятую"; +App::$strings["Word, /regular-expression/, lang=xx, lang!=xx"] = "слово, /регулярное_выражение/, lang=xx, lang!=xx"; +App::$strings["Not Safe For Work Settings"] = "Настройка \"Not Safe For Work\""; +App::$strings["General Purpose Content Filter"] = "Фильтр содержимого общего назначения"; +App::$strings["NSFW Settings saved."] = "Настройки NSFW сохранены."; +App::$strings["Possible adult content"] = "Возможно содержимое для взрослых"; +App::$strings["%s - view"] = "%s - просмотр"; +App::$strings["Flattr this!"] = ""; +App::$strings["Flattr widget settings updated."] = "Настройки виджета Flattr обновлены."; +App::$strings["Flattr user"] = "Пользователь Flattr"; +App::$strings["URL of the Thing to flattr"] = "URL ccылки на Flattr"; +App::$strings["If empty channel URL is used"] = "Если пусто, то используется URL канала"; +App::$strings["Title of the Thing to flattr"] = "Заголовок вещи на Flattr"; +App::$strings["If empty \"channel name on The Hubzilla\" will be used"] = "Если пусто, то будет использовано \"Название канала Hubzilla\""; +App::$strings["Static or dynamic flattr button"] = "Статическая или динамическая кнопка Flattr"; +App::$strings["static"] = "статическая"; +App::$strings["dynamic"] = "динамическая"; +App::$strings["Alignment of the widget"] = "Выравнивание виджета"; +App::$strings["left"] = "слева"; +App::$strings["right"] = "справа"; +App::$strings["Enable Flattr widget"] = "Включить виджет Flattr"; +App::$strings["Flattr Widget Settings"] = "Настройки виджета Flattr"; +App::$strings["Permission denied."] = "Доступ запрещен."; +App::$strings["You are now authenticated to pumpio."] = "Вы аутентифицированы в Pump.io"; +App::$strings["return to the featured settings page"] = "Вернутся к странице настроек"; +App::$strings["Post to Pump.io"] = "Опубликовать в Pump.io"; +App::$strings["Pump.io servername"] = "Имя сервера Pump.io"; +App::$strings["Without \"http://\" or \"https://\""] = "Без \"http://\" или \"https://\""; +App::$strings["Pump.io username"] = "Имя пользователя Pump.io"; +App::$strings["Without the servername"] = "без имени сервера"; +App::$strings["You are not authenticated to pumpio"] = "Вы не аутентифицированы на Pump.io"; +App::$strings["(Re-)Authenticate your pump.io connection"] = "Аутентифицировать (повторно) ваше соединение с Pump.io"; +App::$strings["Enable pump.io Post Plugin"] = "Включить плагин публикаций Pump.io"; +App::$strings["Post to pump.io by default"] = "Публиковать в Pump.io по умолчанию"; +App::$strings["Should posts be public"] = "Публикации должны быть общедоступными"; +App::$strings["Mirror all public posts"] = "Отображать все общедоступные публикации"; +App::$strings["Pump.io Post Settings"] = "Настройки публикаций в Pump.io"; +App::$strings["PumpIO Settings saved."] = "Настройки публикаций в Pump.io сохранены."; +App::$strings["Save Bookmarks"] = "Сохранить закладки"; +App::$strings["Status:"] = "Статус:"; +App::$strings["Activate addon"] = "Активировать расширение"; +App::$strings["Hide Jappixmini Chat-Widget from the webinterface"] = "Скрыть виджет чата Jappixmini из веб-интерфейса"; +App::$strings["Jabber username"] = "Имя пользователя Jabber"; +App::$strings["Jabber server"] = "Сервер Jabber"; +App::$strings["Jabber BOSH host URL"] = "URL узла Jabber BOSH"; +App::$strings["Jabber password"] = "Пароль Jabber"; +App::$strings["Encrypt Jabber password with Hubzilla password"] = "Зашифровать пароль Jabber с помощью пароля Hubzilla"; +App::$strings["Recommended"] = "рекомендовано"; +App::$strings["Hubzilla password"] = "Пароль Hubzilla"; +App::$strings["Approve subscription requests from Hubzilla contacts automatically"] = "Утверждать запросы на подписку от контактов Hubzilla автоматически"; +App::$strings["Purge internal list of jabber addresses of contacts"] = "Очистить внутренний список адресов контактов Jabber"; +App::$strings["Configuration Help"] = "Помощь по конфигурации"; +App::$strings["Add Contact"] = "Добавить контакт"; +App::$strings["Jappix Mini Settings"] = "Настройки Jappix Mini"; +App::$strings["Post to LiveJournal"] = "Опубликовать в LiveJournal"; +App::$strings["Enable LiveJournal Post Plugin"] = "Включить плагин публикаций LiveJournal"; +App::$strings["LiveJournal username"] = "Имя пользователя LiveJournal"; +App::$strings["LiveJournal password"] = "Пароль LiveJournal"; +App::$strings["Post to LiveJournal by default"] = "Публиковать в LiveJournal по умолчанию"; +App::$strings["LiveJournal Post Settings"] = "Настройки публикаций в LiveJournal"; +App::$strings["LiveJournal Settings saved."] = "Настройки LiveJournal сохранены."; +App::$strings["Errors encountered deleting database table "] = "Возникшие при удалении таблицы базы данных ошибки"; +App::$strings["Submit Settings"] = "Отправить настройки"; +App::$strings["Drop tables when uninstalling?"] = "Удалить таблицы при деинсталляции?"; +App::$strings["If checked, the Rendezvous database tables will be deleted when the plugin is uninstalled."] = "Если включено, то таблицы базы данных Rendezvous будут удалены при удалении плагина."; +App::$strings["Mapbox Access Token"] = "Токен доступа к 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."] = "Если вы введете токен доступа к Mapbox, он будет использоваться для извлечения фрагментов карты из Mapbox вместо стандартного сервера OpenStreetMap."; +App::$strings["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."] = "Этот идентификатор был удалён другим участником из-за неактивности. Пожалуйста нажмите кнопку \"Новый идентификатор\" для обновления страницы и получения нового идентификатора. Вы можете использовать то же имя."; +App::$strings["Welcome to Rendezvous!"] = "Добро пожаловать в 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."] = "Введите ваше имя для вступления в это Rendezvous. Для того, чтобы делиться вашим положением с другими участниками, нажмите \"GPS control\". Когда ваше местоположение определно, красная точка появится и остальные смогут увидеть вас на карте."; +App::$strings["Let's meet here"] = "Давайте встретимся здесь"; +App::$strings["Name"] = "Имя"; +App::$strings["Description"] = "Описание"; +App::$strings["New marker"] = "Новый маркер"; +App::$strings["Edit marker"] = "Редактировать маркер"; +App::$strings["New identity"] = "Новый идентификатор"; +App::$strings["Delete marker"] = "Удалить маркер"; +App::$strings["Delete member"] = "Удалить участника"; +App::$strings["Edit proximity alert"] = "Изменить оповещение о близости"; +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):"] = "Оповещение о близости будет произведено, если этот участник находится на определённом расстоянии от вас. <br><br>Введите радиус в метрах (0 для отключения):"; +App::$strings["distance"] = "расстояние"; +App::$strings["Proximity alert distance (meters)"] = "Расстояние для уведомления о близости (метров)"; +App::$strings["A proximity alert will be issued when you are within a certain radius of the marker location.<br><br>Enter a radius in meters (0 to disable):"] = "Оповещение о близости будет произведено, если вы находитесь на определённом расстоянии местоположения маркера. <br><br>Введите радиус в метрах (0 для отключения):"; +App::$strings["Marker proximity alert"] = "Маркер уведомления о близости"; +App::$strings["Reminder note"] = "Напоминание"; +App::$strings["Enter a note to be displayed when you are within the specified proximity..."] = "Введите сообщение для отображения когда вы находитесь рядом"; +App::$strings["Add new rendezvous"] = "Добавить новое Rendezvous."; +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."] = "Создайте новое Rendezvous и поделитесь ссылкой доступа с теми, кого вы хотите пригласить в группу. Тот, кто откроет эту ссылку, станет её участником. Участники могут видеть местоположение, добавлять маркеры на карту или делится своим собственным местоположением с группой."; +App::$strings["You have no rendezvous. Press the button above to create a rendezvous!"] = "У вас нет Rendezvous. Нажмите на кнопку ниже чтобы создать его!"; +App::$strings["Errors encountered creating database tables."] = "При создании базы данных возникли ошибки."; +App::$strings["View Larger"] = "Увеличить"; +App::$strings["Tile Server URL"] = "URL сервера Tile"; +App::$strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">public tile servers</a>"] = "Список <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">общедоступных серверов</a>"; +App::$strings["Nominatim (reverse geocoding) Server URL"] = "URL сервера Nominatim (обратное геокодирование)"; +App::$strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target=\"_blank\">Nominatim servers</a>"] = "Список <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target=\"_blank\">серверов Nominatim</a>"; +App::$strings["Default zoom"] = "Масштаб по умолчанию"; +App::$strings["The default zoom level. (1:world, 18:highest, also depends on tile server)"] = "Уровень размера по умолчанию (1 - весь мир, 18 - максимальный; зависит от сервера)."; +App::$strings["Include marker on map"] = "Включите маркер на карте"; +App::$strings["Include a marker on the map."] = "Включить маркер на карте"; +App::$strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Мы столкнулись с проблемой входа с предоставленным вами OpenID. Пожалуйста, проверьте корректность его написания."; +App::$strings["The error message was:"] = "Сообщение об ошибке было:"; +App::$strings["OpenID protocol error. No ID returned."] = "Ошибка протокола OpenID. Идентификатор не возвращён."; +App::$strings["Welcome %s. Remote authentication successful."] = "Добро пожаловать %s. Удаленная аутентификация успешно завершена."; +App::$strings["Login failed."] = "Не удалось войти."; +App::$strings["First Name"] = "Имя"; +App::$strings["Last Name"] = "Фамилия"; +App::$strings["Nickname"] = "Псевдоним"; +App::$strings["Full Name"] = "Полное имя"; +App::$strings["Email"] = "Электронная почта"; +App::$strings["Profile Photo"] = "Фотография профиля"; +App::$strings["Profile Photo 16px"] = "Фотография профиля 16px"; +App::$strings["Profile Photo 32px"] = "Фотография профиля 32px"; +App::$strings["Profile Photo 48px"] = "Фотография профиля 48px"; +App::$strings["Profile Photo 64px"] = "Фотография профиля 64px"; +App::$strings["Profile Photo 80px"] = "Фотография профиля 80px"; +App::$strings["Profile Photo 128px"] = "Фотография профиля 128px"; +App::$strings["Timezone"] = "Часовой пояс"; +App::$strings["Homepage URL"] = "URL домашней страницы"; +App::$strings["Language"] = "Язык"; +App::$strings["Birth Year"] = "Год рождения"; +App::$strings["Birth Month"] = "Месяц рождения"; +App::$strings["Birth Day"] = "День рождения"; +App::$strings["Birthdate"] = "Дата рождения"; +App::$strings["Gender"] = "Гендер"; +App::$strings["Male"] = "Мужчина"; +App::$strings["Female"] = "Женщина"; +App::$strings["Your Webbie:"] = "Ваш Webbie:"; +App::$strings["Fontsize (px):"] = "Размер шрифта (px):"; +App::$strings["Link:"] = "Ссылка:"; +App::$strings["Like us on Hubzilla"] = "Нравится на Hubzilla"; +App::$strings["Embed:"] = "Встроить:"; +App::$strings["Extended Identity Sharing"] = "Расширенный обмен идентификацией"; +App::$strings["Share your identity with all websites on the internet. When disabled, identity is only shared with \$Projectname sites."] = "Поделиться вашим идентификатором на всех веб-сайтах в Интернет. Если выключено, то идентификатор доступен только для сайтов \$Projectname."; +App::$strings["An account has been created for you."] = "Учётная запись, которая была для вас создана."; +App::$strings["Authentication successful but rejected: account creation is disabled."] = "Аутентификация выполнена успешно, но отклонена: создание учетной записи отключено."; +App::$strings["Post to Twitter"] = "Опубликовать в Twitter"; +App::$strings["Twitter settings updated."] = "Настройки Twitter обновлены"; +App::$strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Не найдено пары ключей для Twitter. Пожалуйста, свяжитесь с администратором сайта."; +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."] = "В этой установке Hubzilla плагин Twitter был включён, однако пока он не подключён к вашему аккаунту в Twitter. Для этого нажмите на кнопку ниже для получения PIN-кода от Twitter который нужно скопировать в поле ввода и отправить форму. Только ваши <strong>общедоступные</strong> публикации будут опубликованы в Twitter."; +App::$strings["Log in with Twitter"] = "Войти в Twitter"; +App::$strings["Copy the PIN from Twitter here"] = "Скопируйте PIN-код из Twitter здесь"; +App::$strings["Currently connected to: "] = "В настоящее время подключён к:"; +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>Замечание</strong>: Из-за настроек конфиденциальности (<em>скрыть данные своего профиля от неизвестных зрителей?</em>) cсылка, потенциально включенная в общедоступные публикации, переданные в Twitter, приведет посетителя к пустой странице, информирующей его о том, что доступ к вашему профилю был ограничен."; +App::$strings["Allow posting to Twitter"] = "Разрешить публиковать в Twitter"; +App::$strings["If enabled your public postings can be posted to the associated Twitter account"] = "Если включено, ваши общедоступные публикации будут опубликованы в связанной учётной записи Twitter"; +App::$strings["Twitter post length"] = "Длина публикации Twitter"; +App::$strings["Maximum tweet length"] = "Максимальная длина твита"; +App::$strings["Send public postings to Twitter by default"] = "Отправлять общедоступные публикации в Twitter по умолчанию"; +App::$strings["If enabled your public postings will be posted to the associated Twitter account by default"] = "Если включено, ваши общедоступные публикации будут опубликованы в связанной учётной записи Twitter по умолчанию"; +App::$strings["Clear OAuth configuration"] = "Очистить конфигурацию OAuth"; +App::$strings["Twitter Post Settings"] = "Настройки публикаций в Twitter"; +App::$strings["Consumer Key"] = "Ключ клиента"; +App::$strings["Consumer Secret"] = "Код клиента"; +App::$strings["Flag Adult Photos"] = "Пометка фотографий для взрослых"; +App::$strings["Provide photo edit option to hide inappropriate photos from default album view"] = "Предоставьте возможность редактирования фотографий, чтобы скрыть неприемлемые фотографии из альбома по умолчанию"; +App::$strings["Unknown"] = "Неизвестный"; +App::$strings["ActivityPub"] = ""; +App::$strings["photo"] = "фото"; +App::$strings["status"] = "статус"; +App::$strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s нравится %3\$s %2\$s"; +App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s не нравится %2\$s %3\$s"; +App::$strings["ActivityPub Protocol Settings updated."] = "Настройки протокола ActivityPub обновлены."; +App::$strings["The ActivityPub protocol does not support location independence. Connections you make within that network may be unreachable from alternate channel locations."] = "Протокол ActivityPub не поддерживает независимость от расположения. Ваши контакты установленные в этой сети могут быть недоступны из альтернативных мест размещения канала. "; +App::$strings["Enable the ActivityPub protocol for this channel"] = "Включить протокол ActivityPub для этого канала"; +App::$strings["Deliver to ActivityPub recipients in privacy groups"] = "Доставить получателям ActivityPub в группах безопасности"; +App::$strings["May result in a large number of mentions and expose all the members of your privacy group"] = "Может привести к большому количеству упоминаний и раскрытию участников группы безопасности"; +App::$strings["Send multi-media HTML articles"] = "Отправить HTML статьи с мультимедиа"; +App::$strings["Not supported by some microblog services such as Mastodon"] = "Не поддерживается некоторыми микроблогами, например Mastodon"; +App::$strings["ActivityPub Protocol Settings"] = "Настройки протокола ActivityPub"; +App::$strings["No username found in import file."] = "Имя пользователя не найдено в файле для импорта."; +App::$strings["Unable to create a unique channel address. Import failed."] = "Не удалось создать уникальный адрес канала. Импорт не завершен."; +App::$strings["Import completed."] = "Импорт завершен."; +App::$strings["\$projectname"] = ""; +App::$strings["Diaspora Protocol Settings updated."] = "Настройки протокола Diaspora обновлены."; +App::$strings["The Diaspora protocol does not support location independence. Connections you make within that network may be unreachable from alternate channel locations."] = "Прокол Diaspora не поддерживает независимость от расположения. Ваши контакты установленные в этой сети могут быть недоступны из альтернативных мест размещения канала."; +App::$strings["Enable the Diaspora protocol for this channel"] = "Включить протокол Diaspora для этого канала"; +App::$strings["Allow any Diaspora member to comment on your public posts"] = "Разрешить любому участнику Diaspora комментировать ваши общедоступные публикации"; +App::$strings["Prevent your hashtags from being redirected to other sites"] = "Предотвратить перенаправление тегов на другие сайты"; +App::$strings["Sign and forward posts and comments with no existing Diaspora signature"] = "Подписывать и отправлять публикации и комментарии с несуществующей подписью Diaspora"; +App::$strings["Followed hashtags (comma separated, do not include the #)"] = "Отслеживаемые теги (через запятую, исключая #)"; +App::$strings["Diaspora Protocol Settings"] = "Настройки протокола Diaspora"; +App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%1\$s посещает %2\$s%3\$s"; +App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s не посещает %2\$s%3\$s"; +App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s может посетить %2\$s%3\$s"; +App::$strings["System defaults:"] = "Системные по умолчанию:"; +App::$strings["Preferred Clipart IDs"] = "Предпочитаемый Clipart ID"; +App::$strings["List of preferred clipart ids. These will be shown first."] = "Список предпочитаемых Clipart ID. Эти будут показаны первыми."; +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["View Profile"] = "Просмотреть профиль"; +App::$strings["Edit Profile"] = "Редактировать профиль"; +App::$strings["Profile List"] = "Список профилей"; +App::$strings["Order of Preferred"] = "Порядок предпочтения"; +App::$strings["Sort order of preferred clipart ids."] = "Порядок сортировки предпочитаемых Clipart ID. "; +App::$strings["Newest first"] = "Новое первым"; +App::$strings["As entered"] = "По мере ввода"; +App::$strings["Order of other"] = "Порядок других"; +App::$strings["Sort order of other clipart ids."] = "Порядок сортировки остальных Clipart ID."; +App::$strings["Most downloaded first"] = "Самое загружаемое первым"; +App::$strings["Most liked first"] = "Самое нравящееся первым"; +App::$strings["Preferred IDs Message"] = "Сообщение от предпочитаемых ID"; +App::$strings["Message to display above preferred results."] = "Отображаемое сообщение над предпочитаемыми результатами."; +App::$strings["Uploaded by: "] = "Загружено:"; +App::$strings["Drawn by: "] = "Нарисовано:"; +App::$strings["Use this image"] = "Использовать это изображение"; +App::$strings["Or select from a free OpenClipart.org image:"] = "Или выберите из бесплатных изображений на OpenClipart.org"; +App::$strings["Search Term"] = "Условие поиска"; +App::$strings["Unknown error. Please try again later."] = "Неизвестная ошибка. Пожалуйста, повторите попытку позже."; +App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Если новая фотография не отображается немедленно то нажмите Shift + \"Обновить\" для очистки кэша браузера"; +App::$strings["Profile photo updated successfully."] = "Фотография профиля обновлена успешно."; +App::$strings["Edit your profile and change settings."] = "Отредактировать ваш профиль и изменить настройки."; +App::$strings["Click here to see activity from your connections."] = "Нажмите сюда для отображения активности ваши контактов."; +App::$strings["Click here to see your channel home."] = "Нажмите сюда чтобы увидеть главную страницу вашего канала."; +App::$strings["You can access your private messages from here."] = "Вы можете получить доступ с личной переписке здесь."; +App::$strings["Create new events here."] = "Создать новое событие здесь."; +App::$strings["You can accept new connections and change permissions for existing ones here. You can also e.g. create groups of contacts."] = "Вы можете подключать новые контакты и менять разрешения для существующих здесь. Также вы можете создавать их группы."; +App::$strings["System notifications will arrive here"] = "Системные оповещения будут показываться здесь"; +App::$strings["Search for content and users"] = "Поиск пользователей и содержимого"; +App::$strings["Browse for new contacts"] = "Поиск новых контактов"; +App::$strings["Launch installed apps"] = "Запустить установленные приложения"; +App::$strings["Looking for help? Click here."] = "Нужна помощь? Нажмите сюда."; +App::$strings["New events have occurred in your network. Click here to see what has happened!"] = "Новые события произошли в вашей сети. Нажмите здесь для того, чтобы знать что случилось!"; +App::$strings["You have received a new private message. Click here to see from who!"] = "Вы получили новое личное сообщение. Нажмите чтобы увидеть от кого!"; +App::$strings["There are events this week. Click here too see which!"] = "На этой неделе есть события. Нажмите здесь чтобы увидеть какие!"; +App::$strings["You have received a new introduction. Click here to see who!"] = "Вы были представлены. Нажмите чтобы увидеть кому!"; +App::$strings["There is a new system notification. Click here to see what has happened!"] = "Это новое системное уведомление. Нажмите чтобы посмотреть что случилось!"; +App::$strings["Click here to share text, images, videos and sound."] = "Нажмите сюда чтобы поделиться текстом, изображениями, видео или треком."; +App::$strings["You can write an optional title for your update (good for long posts)."] = "Вы можете написать необязательный заголовок для вашей публикации (желательно для больших постов)."; +App::$strings["Entering some categories here makes it easier to find your post later."] = "Введите категории здесь чтобы было проще найти вашу публикацию позднее."; +App::$strings["Share photos, links, location, etc."] = "Поделиться фотографией, ссылками, местоположение и т.п."; +App::$strings["Only want to share content for a while? Make it expire at a certain date."] = "Хотите только поделиться временным содержимым? Установите срок его действия."; +App::$strings["You can password protect content."] = "Вы можете защитить содержимое паролем."; +App::$strings["Choose who you share with."] = "Выбрать с кем поделиться."; +App::$strings["Click here when you are done."] = "Нажмите здесь когда закончите."; +App::$strings["Adjust from which channels posts should be displayed."] = "Настройте из каких каналов должны отображаться публикации."; +App::$strings["Only show posts from channels in the specified privacy group."] = "Показывать только публикации из определённой группы безопасности."; +App::$strings["Easily find posts containing tags (keywords preceded by the \"#\" symbol)."] = "Лёгкий поиск сообщения, содержащего теги (ключевые слова, которым предшествует символ #)."; +App::$strings["Easily find posts in given category."] = "Лёгкий поиск публикаций в данной категории."; +App::$strings["Easily find posts by date."] = "Лёгкий поиск публикаций по дате."; +App::$strings["Suggested users who have volounteered to be shown as suggestions, and who we think you might find interesting."] = "Рекомендуемые пользователи, которые были представлены в качестве предложений, и которые, по нашему мнению, могут оказаться интересными."; +App::$strings["Here you see channels you have connected to."] = "Здесь вы видите каналы, к которым вы подключились."; +App::$strings["Save your search so you can repeat it at a later date."] = "Сохраните ваш поиск с тем, чтобы повторить его позже."; +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."] = "Если вы видите этот значок, вы можете быть уверены, что отправитель - это тот, кто это говорит. Это нормально, что не всегда можно проверить отправителя, поэтому значок иногда будет отсутствовать. Обычно об этом не нужно беспокоиться."; +App::$strings["Danger! It seems someone tried to forge a message! This message is not necessarily from who it says it is from!"] = "Опасность! Кажется, кто-то пытался подделать сообщение! Это сообщение не обязательно от того, от кого оно значится!"; +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"] = "Добро пожаловать в Hubzilla! Желаете получить обзор пользовательского интерфейса?</p> <p>Вы можете его приостановаить и в любое время перезагрузив страницу или перейдя на другую.</p><p>Также вы можете нажать клавишу \"Назад\""; +App::$strings["Some setting"] = "Некоторые настройки"; +App::$strings["A setting"] = "Настройка"; +App::$strings["Skeleton Settings"] = "Настройки скелета"; +App::$strings["Show Upload Limits"] = "Показать ограничения на загрузку"; +App::$strings["Hubzilla configured maximum size: "] = "Максимальный размер настроенный в Hubzilla:"; +App::$strings["PHP upload_max_filesize: "] = ""; +App::$strings["PHP post_max_size (must be larger than upload_max_filesize): "] = ""; +App::$strings["GNU-Social Protocol Settings updated."] = "Настройки протокола GNU Social обновлены."; +App::$strings["The GNU-Social protocol does not support location independence. Connections you make within that network may be unreachable from alternate channel locations."] = "Прокол GNU Social не поддерживает независимость от расположения. Ваши контакты установленные в этой сети могут быть недоступны из альтернативных мест размещения канала."; +App::$strings["Enable the GNU-Social protocol for this channel"] = "Включить протокол GNU Social для этого канала"; +App::$strings["GNU-Social Protocol Settings"] = "Настройки протокола GNU Social"; +App::$strings["Follow"] = "Отслеживать"; +App::$strings["%1\$s is now following %2\$s"] = "%1\$s сейчас отслеживает %2\$s"; +App::$strings["Gallery"] = "Галерея"; +App::$strings["Photo Gallery"] = "Фотогалерея"; +App::$strings["Page to load after login"] = "Страница для загрузки после входа"; +App::$strings["Examples: "apps", "network?f=&gid=37" (privacy collection), "channel" or "notifications/system" (leave blank for default network page (grid)."] = "Примеры: "apps", "network?f=&gid=37" (privacy collection), "channel" or "notifications/system" (оставьте пустым для для страницы сети по умолчанию)."; +App::$strings["Startpage Settings"] = "Настройки стартовой страницы"; +App::$strings["Message to display on every page on this server"] = "Отображаемое сообщение на каждой странице на этом сервере."; +App::$strings["Pageheader Settings"] = "Настройки шапки страницы"; +App::$strings["pageheader Settings saved."] = "Настройки шапки страницы сохранены."; +App::$strings["Three Dimensional Tic-Tac-Toe"] = "Tic-Tac-Toe в трёх измерениях"; +App::$strings["3D Tic-Tac-Toe"] = ""; +App::$strings["New game"] = "Новая игра"; +App::$strings["New game with handicap"] = "Новая игра с форой"; +App::$strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Трехмерный Tic-Tac-Toe похож на традиционную игру, за исключением того, что игра идёт на нескольких уровнях одновременно."; +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."] = "Имеется три уровня. Вы выигрываете, получая три подряд на любом уровне, а также вверх, вниз и по диагонали на разных уровнях."; +App::$strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Игра с форой отключает центральную позицию на среднем уровне, потому что игрок, претендующий на этот квадрат, часто имеет несправедливое преимущество."; +App::$strings["You go first..."] = "Вы начинаете..."; +App::$strings["I'm going first this time..."] = "На этот раз начинаю я..."; +App::$strings["You won!"] = "Вы выиграли!"; +App::$strings["\"Cat\" game!"] = "Ничья!"; +App::$strings["I won!"] = "Я выиграл!"; +App::$strings["Fuzzloc Settings updated."] = "Настройки Fuzzloc обновлены."; +App::$strings["Fuzzloc allows you to blur your precise location if your channel uses browser location mapping."] = "Fuzzloc позволяет размыть ваше точное местоположение, если ваш канал использует сопоставление местоположений браузера."; +App::$strings["Enable Fuzzloc Plugin"] = "Включить плагин Fuzzloc"; +App::$strings["Minimum offset in meters"] = "Минимальное смещение в метрах"; +App::$strings["Maximum offset in meters"] = "Максимальное смещение в метрах"; +App::$strings["Fuzzloc Settings"] = "Настройки Fuzzloc"; +App::$strings["Post to Friendica"] = "Опубликовать в Friendica"; +App::$strings["rtof Settings saved."] = "Настройки rtof сохранены."; +App::$strings["Allow posting to Friendica"] = "Разрешить публиковать в Friendica"; +App::$strings["Send public postings to Friendica by default"] = "Отправлять общедоступные публикации во Friendica по умолчанию"; +App::$strings["Friendica API Path"] = "Путь к Friendica API"; +App::$strings["https://{sitename}/api"] = ""; +App::$strings["Friendica login name"] = "Имя входа Friendica"; +App::$strings["Friendica password"] = "Пароль Friendica"; +App::$strings["Hubzilla to Friendica Post Settings"] = "Настройки публикаций Hubzilla для Friendica"; +App::$strings["Post to GNU social"] = "Опубликовать в GNU Social"; +App::$strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Пожалуйста свяжитесь с администратором сайта. <br />Предоставленный URL API недействителен."; +App::$strings["We could not contact the GNU social API with the Path you entered."] = "Нам не удалось установить контакт с GNU Social API по введённому вами пути"; +App::$strings["GNU social settings updated."] = "Настройки GNU Social обновлены."; +App::$strings["Globally Available GNU social OAuthKeys"] = "Глобально доступные ключи OAuthKeys GNU Social"; +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)."] = "Существуют предварительно настроенные пары ключей OAuth для некоторых доступных серверов GNU social. Если вы используете один из них, используйте эти учетные данные. <br />Если вы не хотите подключаться к какому-либо другому серверу GNU social (см. ниже)."; +App::$strings["Provide your own OAuth Credentials"] = "Предоставьте ваши собственные регистрационные данные 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."] = "Не найдена пользовательская пара ключей для GNU social. Зарегистрируйте свою учетную запись Hubzilla в качестве настольного клиента в своей учетной записи GNU social, скопируйте cюда пару ключей пользователя и введите корневой каталог базы API. <br />Прежде чем регистрировать свою собственную пару ключей OAuth, спросите администратора, если ли уже пара ключей для этой установки Hubzilla в вашем GNU social."; +App::$strings["OAuth Consumer Key"] = "Ключ клиента OAuth"; +App::$strings["OAuth Consumer Secret"] = "Пароль клиента OAuth"; +App::$strings["Base API Path"] = "Основной путь к API"; +App::$strings["Remember the trailing /"] = "Запомнить закрывающий /"; +App::$strings["GNU social application name"] = "Имя приложения 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."] = "Чтобы подключиться к вашей учетной записи GNU social нажмите кнопку ниже для получения кода безопасности из GNU social, который вы должны скопировать в поле ввода ниже и отправить форму. Только ваши общедоступные сообщения будут опубликованы в GNU social."; +App::$strings["Log in with GNU social"] = "Войти с GNU social"; +App::$strings["Copy the security code from GNU social here"] = "Скопируйте код безопасности GNU social здесь"; +App::$strings["Cancel Connection Process"] = "Отменить процесс подключения"; +App::$strings["Current GNU social API is"] = "Текущий GNU social API"; +App::$strings["Cancel GNU social Connection"] = "Отменить подключение с GNU social"; +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>Замечание</strong>: Из-за настроек конфиденциальности (<em>скрыть данные своего профиля от неизвестных зрителей?</em>) cсылка, потенциально включенная в общедоступные публикации, переданные в GNU social, приведет посетителя к пустой странице, информирующей его о том, что доступ к вашему профилю был ограничен."; +App::$strings["Allow posting to GNU social"] = "Разрешить публиковать в GNU social"; +App::$strings["If enabled your public postings can be posted to the associated GNU-social account"] = "Если включено, ваши общедоступные публикации будут опубликованы в связанной учётной записи GNU social"; +App::$strings["Post to GNU social by default"] = "Публиковать в GNU social по умолчанию"; +App::$strings["If enabled your public postings will be posted to the associated GNU-social account by default"] = "Если включено, ваши общедоступные публикации будут опубликованы в связанной учётной записи GNU social по умолчанию"; +App::$strings["GNU social Post Settings"] = "Настройки публикаций GNU social"; +App::$strings["Site name"] = "Название сайта"; +App::$strings["API URL"] = ""; +App::$strings["Application name"] = "Название приложения"; +App::$strings["Enable Rainbowtag"] = "Включить Rainbowtag"; +App::$strings["Rainbowtag Settings"] = "Настройки Rainbowtag"; +App::$strings["Rainbowtag Settings saved."] = "Настройки Rainbowtag сохранены."; +App::$strings["Friendica Photo Album Import"] = "Импортировать альбом фотографий Friendica"; +App::$strings["This will import all your Friendica photo albums to this Red channel."] = "Это позволит импортировать все ваши альбомы фотографий Friendica в этот канал."; +App::$strings["Friendica Server base URL"] = "Базовый URL сервера Friendica"; +App::$strings["Friendica Login Username"] = "Имя пользователя для входа Friendica"; +App::$strings["Friendica Login Password"] = "Пароль для входа Firendica"; +App::$strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Этот сайт отслеживается с помощью инструментов аналитики <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)."] = "Если вы не хотите, чтобы ваши визиты регистрировались таким образом, вы <a href='%s'>можете отключить cookie с тем, чтобы Piwik не отслеживал дальнейшие посещения сайта</a>."; +App::$strings["Piwik Base URL"] = "Базовый URL Piwik"; +App::$strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "Абсолютный путь к вашей установке Piwik (без типа протокола, с начальным слэшем)"; +App::$strings["Site ID"] = "ID сайта"; +App::$strings["Show opt-out cookie link?"] = "Показывать ссылку на отказ от использования cookies?"; +App::$strings["Asynchronous tracking"] = "Асинхронное отслеживание"; +App::$strings["Enable frontend JavaScript error tracking"] = "Включить отслеживание ошибок JavaScript на фронтенде."; +App::$strings["This feature requires Piwik >= 2.2.0"] = "Эта функция требует версию Piwik >= 2.2.0"; +App::$strings["Photos imported"] = "Фотографии импортированы"; +App::$strings["Redmatrix Photo Album Import"] = "Импортировать альбом фотографий Redmatrix"; +App::$strings["This will import all your Redmatrix photo albums to this channel."] = "Это позволит импортировать все ваши альбомы фотографий Redmatrix в этот канал."; +App::$strings["Import just this album"] = "Импортировать только этот альбом"; +App::$strings["Leave blank to import all albums"] = "Оставьте пустым для импорта всех альбомов"; +App::$strings["Maximum count to import"] = "Максимальное количество для импорта"; +App::$strings["0 or blank to import all available"] = "0 или пусто для импорта всех доступных"; +App::$strings["__ctx:opensearch__ Search %1\$s (%2\$s)"] = "Искать %1\$s (%2\$s)"; +App::$strings["__ctx:opensearch__ \$Projectname"] = ""; +App::$strings["\$Projectname"] = ""; +App::$strings["Search \$Projectname"] = "Поиск \$Projectname"; +App::$strings["Recent Channel/Profile Viewers"] = "Последние просмотры канала / профиля"; +App::$strings["This plugin/addon has not been configured."] = "Это расширение не было настроено."; +App::$strings["Please visit the Visage settings on %s"] = "Пожалуйста, посетите настройки Visage на %s"; +App::$strings["your feature settings page"] = "страница ваших установочных параметров"; +App::$strings["No entries."] = "Нет записей."; +App::$strings["Enable Visage Visitor Logging"] = "Включить журналирование посетителей Visage"; +App::$strings["Visage Settings"] = "Настройки Visage"; +App::$strings["Error: order mismatch. Please try again."] = "Ошибка: несоответствие заказа. Пожалуйста, попробуйте ещё раз"; +App::$strings["Manual payments are not enabled."] = "Ручные платежи не подключены."; +App::$strings["Order not found."] = "Заказ не найден."; +App::$strings["Finished"] = "Завершено"; +App::$strings["Invalid channel"] = "Недействительный канал"; +App::$strings["[cart] Item Added"] = "[cart] Элемент добавлен"; +App::$strings["Order already checked out."] = "Заказ уже проверен."; +App::$strings["Enable Shopping Cart"] = "Включить корзину"; +App::$strings["Enable Test Catalog"] = "Включить тестовый каталог"; +App::$strings["Enable Manual Payments"] = "Включить ручные платежи"; +App::$strings["Base Merchant Currency"] = "Основная торговая валюта"; +App::$strings["Cart - Base Settings"] = "Корзина - Основные настройки"; +App::$strings["Shop"] = "Магазин"; +App::$strings["Profile Unavailable."] = "Профиль недоступен."; +App::$strings["Order Not Found"] = "Заказ не найден"; +App::$strings["You must be logged into the Grid to shop."] = "Вы должны быть в сети для доступа к магазину"; +App::$strings["Cart Not Enabled (profile: "] = "Корзина не подключена (профиль:"; +App::$strings["Access denied."] = "Доступ запрещён."; +App::$strings["No Order Found"] = "Нет найденных заказов"; +App::$strings["An unknown error has occurred Please start again."] = "Произошла неизвестная ошибка. Пожалуйста, начните снова."; +App::$strings["Invalid Payment Type. Please start again."] = "Недействительный тип платежа. Пожалуйста, начните снова."; +App::$strings["Order not found"] = "Заказ не найден"; +App::$strings["Enable Paypal Button Module"] = "Включить модуль кнопки Paypal"; +App::$strings["Use Production Key"] = "Использовать ключ Production"; +App::$strings["Paypal Sandbox Client Key"] = "Ключ клиента Paypal Sandbox"; +App::$strings["Paypal Sandbox Secret Key"] = "Секретный ключ Paypal Sandbox"; +App::$strings["Paypal Production Client Key"] = "Ключ клиента Paypal Production"; +App::$strings["Paypal Production Secret Key"] = "Секретный ключ Paypal Production"; +App::$strings["Cart - Paypal Addon"] = "Корзина - Paypal плагин"; +App::$strings["Paypal button payments are not enabled."] = "Кнопка Paypal для платежей не включена."; +App::$strings["Paypal button payments are not properly configured. Please choose another payment option."] = "Кнопка Paypal для платежей настроена неправильно. Пожалуйста, используйте другой вариант оплаты."; +App::$strings["Enable Hubzilla Services Module"] = "Включить модуль сервиса Hubzilla"; +App::$strings["Cart - Hubzilla Services Addon"] = "Корзина - плагин сервиса Hubzilla"; +App::$strings["New Sku"] = "Новый код"; +App::$strings["Cannot save edits to locked item."] = "Невозможно сохранить изменения заблокированной позиции."; +App::$strings["SKU not found."] = "Код не найден."; +App::$strings["Invalid Activation Directive."] = "Недействительная директива активации."; +App::$strings["Invalid Deactivation Directive."] = "Недействительная директива деактивации"; +App::$strings["Add to this privacy group"] = "Добавить в эту группу безопасности"; +App::$strings["Set user service class"] = "Установить класс обслуживания пользователя"; +App::$strings["You must be using a local account to purchase this service."] = "Вы должны использовать локальную учётноую запись для покупки этого сервиса."; +App::$strings["Changes Locked"] = "Изменения заблокированы"; +App::$strings["Item available for purchase."] = "Позиция доступна для приобретения."; +App::$strings["Price"] = "Цена"; +App::$strings["Add buyer to privacy group"] = "Добавить покупателя в группу безопасности"; +App::$strings["Add buyer as connection"] = "Добавить покупателя как контакт"; +App::$strings["Set Service Class"] = "Установить класс обслуживания"; +App::$strings["Access Denied."] = "Доступ запрещён."; +App::$strings["Access Denied"] = "Доступ запрещён"; +App::$strings["Invalid Item"] = "Недействительный элемент"; +App::$strings["Nsabait Settings updated."] = "Настройки Nsabait обновлены"; +App::$strings["Enable NSAbait Plugin"] = "Включить плагин NSAbait"; +App::$strings["NSAbait Settings"] = "Настройки Nsabait"; +App::$strings["Hubzilla File Storage Import"] = "Импорт файлового хранилища Hubzilla"; +App::$strings["This will import all your cloud files from another server."] = "Это позволит импортировать все ваши файлы с другого сервера."; +App::$strings["Hubzilla Server base URL"] = "Базовый URL сервера Hubzilla"; +App::$strings["Since modified date yyyy-mm-dd"] = "Начиная с даты изменений yyyy-mm-dd"; +App::$strings["Until modified date yyyy-mm-dd"] = "Заканчивая датой изменений yyyy-mm-dd"; +App::$strings["Federate"] = ""; +App::$strings["nofed Settings saved."] = "Настройки nofed сохранены."; +App::$strings["Allow Federation Toggle"] = "Разрешить переключение федерации"; +App::$strings["Federate posts by default"] = "Разрешить федерацию публикаций по умолчанию"; +App::$strings["NoFed Settings"] = "Настройки NoFed"; +App::$strings["generic profile image"] = "Стандартное изображение профиля"; +App::$strings["random geometric pattern"] = "Случайный геометрический рисунок"; +App::$strings["monster face"] = "Лицо чудовища"; +App::$strings["computer generated face"] = "Сгенерированное компьютером лицо"; +App::$strings["retro arcade style face"] = "Лицо в стиле старой аркадной игры"; +App::$strings["Hub default profile photo"] = "Фотография профиля по умолчанию"; +App::$strings["Information"] = "Информация"; +App::$strings["Libravatar addon is installed, too. Please disable Libravatar addon or this Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if nothing was found at Libravatar."] = "Плагин Libravatar также установлен. Пожалуйста, отключите плагин Libravatar или этот плагин Gravatar. Если Плагин Libravatar ничего не найдёт, он вернётся в Gravatar."; +App::$strings["Default avatar image"] = "Изображение аватара по умолчанию"; +App::$strings["Select default avatar image if none was found at Gravatar. See README"] = "Выберите изображения аватар по умолчанию если ничего не было найдено в Gravatar (см. README)."; +App::$strings["Rating of images"] = "Оценки изображений"; +App::$strings["Select the appropriate avatar rating for your site. See README"] = "Выберите подходящую оценку аватара для вашего сайта (см. README)."; +App::$strings["Gravatar settings updated."] = "Настройки Gravatar обновлены."; +App::$strings["Post to Red"] = "Опубликовать в Red"; +App::$strings["Channel is required."] = "Необходим канал."; +App::$strings["Invalid channel."] = "Недействительный канал."; +App::$strings["redred Settings saved."] = "Настройки RedRed сохранены."; +App::$strings["Allow posting to another Hubzilla Channel"] = "Разрешить публиковать в другой канал Hubzilla"; +App::$strings["Send public postings to Hubzilla channel by default"] = "Отправлять общедоступные публикации в канал Hubzilla по умолчанию"; +App::$strings["Hubzilla API Path"] = "Путь к Hubzilla API"; +App::$strings["Hubzilla login name"] = "Имя входа Hubzilla"; +App::$strings["Hubzilla channel name"] = "Название канала Hubzilla"; +App::$strings["Hubzilla Crosspost Settings"] = "Настройки перекрёстных публикаций Hubzilla"; +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 ..."] = "Примеры действительных включают A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."; +App::$strings["Guitar Chords"] = "Гитарные аккорды"; +App::$strings["The complete online chord dictionary"] = "Полный онлайн словарь аккордов"; +App::$strings["Tuning"] = "Настройка"; +App::$strings["Chord name: example: Em7"] = "Наименование аккорда - example: Em7"; +App::$strings["Show for left handed stringing"] = "Показывать струны для левшей"; +App::$strings["Quick Reference"] = "Быстрая ссылка"; +App::$strings["New registration"] = "Новая регистрация"; +App::$strings["%s : Message delivery failed."] = "%s : Доставка сообщения не удалась."; +App::$strings["Message sent to %s. New account registration: %s"] = "Сообщение отправлено в %s. Регистрация нового аккаунта: %s"; +App::$strings["Channels to auto connect"] = "Каналы для автоматического подключения"; +App::$strings["Comma separated list"] = "Список, разделённый запятыми"; +App::$strings["Popular Channels"] = "Популярные каналы"; +App::$strings["IRC Settings"] = "Настройки IRC"; +App::$strings["IRC settings saved."] = "Настройки IRC сохранены"; +App::$strings["IRC Chatroom"] = "Чат IRC"; +App::$strings["bitchslap"] = "дать леща"; +App::$strings["bitchslapped"] = "получил леща"; +App::$strings["shag"] = "вздрючить"; +App::$strings["shagged"] = "вздрюченный"; +App::$strings["patent"] = ""; +App::$strings["patented"] = ""; +App::$strings["hug"] = "обнять"; +App::$strings["hugged"] = "обнятый"; +App::$strings["murder"] = "убить"; +App::$strings["murdered"] = "убитый"; +App::$strings["worship"] = "почитать"; +App::$strings["worshipped"] = "почитаемый"; +App::$strings["kiss"] = "целовать"; +App::$strings["kissed"] = "поцелованный"; +App::$strings["tempt"] = "искушать"; +App::$strings["tempted"] = "искушённый"; +App::$strings["raise eyebrows at"] = "поднять брови"; +App::$strings["raised their eyebrows at"] = "поднял брови"; +App::$strings["insult"] = "оскорбить"; +App::$strings["insulted"] = "оскорблённый"; +App::$strings["praise"] = "хвалить"; +App::$strings["praised"] = "похваленный"; +App::$strings["be dubious of"] = "усомниться"; +App::$strings["was dubious of"] = "усомнился"; +App::$strings["eat"] = "есть"; +App::$strings["ate"] = "съел"; +App::$strings["giggle and fawn at"] = ""; +App::$strings["giggled and fawned at"] = ""; +App::$strings["doubt"] = "сомневаться"; +App::$strings["doubted"] = "сомневался"; +App::$strings["glare"] = ""; +App::$strings["glared at"] = ""; +App::$strings["fuck"] = "трахнуть"; +App::$strings["fucked"] = "трахнул"; +App::$strings["bonk"] = ""; +App::$strings["bonked"] = ""; +App::$strings["declare undying love for"] = "признаться в любви к"; +App::$strings["declared undying love for"] = "признался в любви к"; +App::$strings["Post to WordPress"] = "Опубликовать в WordPress"; +App::$strings["Enable WordPress Post Plugin"] = "Включить плагин публикаций WordPress"; +App::$strings["WordPress username"] = "Имя пользователя WordPress"; +App::$strings["WordPress password"] = "Пароль WordPress"; +App::$strings["WordPress API URL"] = "URL API WordPress"; +App::$strings["Typically https://your-blog.tld/xmlrpc.php"] = "Обычно https://your-blog.tld/xmlrpc.php"; +App::$strings["WordPress blogid"] = ""; +App::$strings["For multi-user sites such as wordpress.com, otherwise leave blank"] = "Для многопользовательских сайтов, таких, как wordpress.com. В противном случае оставьте пустым"; +App::$strings["Post to WordPress by default"] = "Публиковать в WordPress по умолчанию"; +App::$strings["Forward comments (requires hubzilla_wp plugin)"] = "Пересылать комментарии (требуется плагин hubzilla_wp)"; +App::$strings["WordPress Post Settings"] = "Настройки публикации в WordPress"; +App::$strings["Wordpress Settings saved."] = "Настройки WordPress сохранены."; +App::$strings["Who likes me?"] = "Кому я нравлюсь?"; +App::$strings["Your account on %s will expire in a few days."] = "Ваш аккаунт на %s перестанет работать через несколько дней."; +App::$strings["Your $Productname test account is about to expire."] = "Срок действия пробного аккаунта в $Productname близок к окончанию."; +App::$strings["Create an account to access services and applications"] = "Создайте аккаунт для доступа к службам и приложениям"; +App::$strings["Register"] = "Регистрация"; +App::$strings["Logout"] = "Выход"; +App::$strings["Login"] = "Войти"; +App::$strings["Remote Authentication"] = "Удаленная аутентификация"; +App::$strings["Login/Email"] = "Пользователь / email"; +App::$strings["Password"] = "Пароль"; +App::$strings["Remember me"] = "Запомнить меня"; +App::$strings["Forgot your password?"] = "Забыли пароль или логин?"; +App::$strings["Password Reset"] = "Сбросить пароль"; +App::$strings["[\$Projectname] Website SSL error for %s"] = "[\$Projectname] Ошибка SSL/TLS веб-сайта для %s"; +App::$strings["Website SSL certificate is not valid. Please correct."] = "SSL/TLS сертификат веб-сайт недействителен. Исправьте это."; +App::$strings["[\$Projectname] Cron tasks not running on %s"] = "[\$Projectname] Задания Cron не запущены на %s"; +App::$strings["Cron/Scheduled tasks not running."] = "Задания Cron / планировщика не запущены."; +App::$strings["never"] = "никогд"; +App::$strings["Default"] = "По умолчанию"; +App::$strings["Focus (Hubzilla default)"] = "Фокус (по умолчанию Hubzilla)"; +App::$strings["Theme settings"] = "Настройки темы"; +App::$strings["Narrow navbar"] = "Узкая панель навигации"; +App::$strings["Navigation bar background color"] = "Панель навигации, цвет фона"; +App::$strings["Navigation bar icon color "] = "Панель навигации, цвет значков"; +App::$strings["Navigation bar active icon color "] = "Панель навигации, цвет активного значка"; +App::$strings["Link color"] = "цвет ссылок"; +App::$strings["Set font-color for banner"] = "Цвет текста в шапке"; +App::$strings["Set the background color"] = "Цвет фона"; +App::$strings["Set the background image"] = "Фоновое изображение"; +App::$strings["Set the background color of items"] = "Цвет фона элементов"; +App::$strings["Set the background color of comments"] = "Цвет фона комментариев"; +App::$strings["Set font-size for the entire application"] = "Установить системный размер шрифта"; +App::$strings["Examples: 1rem, 100%, 16px"] = "Например: 1rem, 100%, 16px"; +App::$strings["Set font-color for posts and comments"] = "Цвет шрифта для постов и комментариев"; +App::$strings["Set radius of corners"] = "Радиус скруглений"; +App::$strings["Example: 4px"] = "Например: 4px"; +App::$strings["Set shadow depth of photos"] = "Глубина теней фотографий"; +App::$strings["Set maximum width of content region in pixel"] = "Максимальная ширина содержания региона (в пикселях)"; +App::$strings["Leave empty for default width"] = "Оставьте пустым для ширины по умолчанию"; +App::$strings["Set size of conversation author photo"] = "Размер фотографии автора беседы"; +App::$strings["Set size of followup author photos"] = "Размер фотографий подписчиков"; +App::$strings["Image/photo"] = "Изображение / фотография"; App::$strings["Encrypted content"] = "Зашифрованное содержание"; -App::$strings["QR code"] = "QR код"; -App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s написал следующее %2\$s %3\$s"; -App::$strings["post"] = "сообщение"; +App::$strings["Install %1\$s element %2\$s"] = "Установить %1\$s элемент %2\$s"; +App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Эта публикация содержит устанавливаемый %s элемент, однако у вас нет разрешений для его установки на этом сайте."; +App::$strings["webpage"] = "веб-страница"; +App::$strings["layout"] = "шаблон"; +App::$strings["block"] = "заблокировать"; +App::$strings["menu"] = "меню"; +App::$strings["card"] = "карточка"; +App::$strings["article"] = "статья"; +App::$strings["post"] = "публикация"; +App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s была создана %2\$s %3\$s"; +App::$strings["Click to open/close"] = "Нажмите, чтобы открыть/закрыть"; +App::$strings["spoiler"] = "спойлер"; +App::$strings["View article"] = "Просмотр статей"; +App::$strings["View summary"] = "Просмотр резюме"; +App::$strings["Different viewers will see this text differently"] = "Различные зрители увидят этот текст по-разному"; App::$strings["$1 wrote:"] = "$1 писал:"; -App::$strings["Embedded content"] = "Внедренное содержание"; -App::$strings["Embedding disabled"] = "Внедрение отключенно"; -App::$strings["created a new post"] = "создал новое сообщение"; -App::$strings["commented on %s's post"] = "прокомментировал %s's сообщение"; -App::$strings["photo"] = "фото"; -App::$strings["event"] = "мероприятие"; +App::$strings["Not a valid email address"] = "Недействительный адрес электронной почты"; +App::$strings["Your email domain is not among those allowed on this site"] = "Домен электронной почты не входит в число тех, которые разрешены на этом сайте"; +App::$strings["Your email address is already registered at this site."] = "Ваш адрес электронной почты уже зарегистрирован на этом сайте."; +App::$strings["An invitation is required."] = "Требуется приглашение."; +App::$strings["Invitation could not be verified."] = "Не удалось проверить приглашение."; +App::$strings["Please enter the required information."] = "Пожалуйста, введите необходимую информацию."; +App::$strings["Failed to store account information."] = "Не удалось сохранить информацию аккаунта."; +App::$strings["Registration confirmation for %s"] = "Подтверждение регистрации для %s"; +App::$strings["Registration request at %s"] = "Запрос регистрации на %s"; +App::$strings["your registration password"] = "ваш пароль регистрации"; +App::$strings["Registration details for %s"] = "Регистрационные данные для %s"; +App::$strings["Account approved."] = "Аккаунт утвержден."; +App::$strings["Registration revoked for %s"] = "Регистрация отозвана для %s"; +App::$strings["Click here to upgrade."] = "Нажмите здесь для обновления."; +App::$strings["This action exceeds the limits set by your subscription plan."] = "Это действие превышает ограничения, установленные в вашем плане."; +App::$strings["This action is not available under your subscription plan."] = "Это действие невозможно из-за ограничений в вашем плане."; +App::$strings["Delegation session ended."] = "Делегированная сессия завершена."; +App::$strings["Logged out."] = "Вышел из системы."; +App::$strings["Email validation is incomplete. Please check your email."] = "Проверка email не завершена. Пожалуйста, проверьте вашу почту."; +App::$strings["Failed authentication"] = "Ошибка аутентификации"; +App::$strings["event"] = "событие"; App::$strings["channel"] = "канал"; -App::$strings["status"] = "статус"; App::$strings["comment"] = "комментарий"; -App::$strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s нравится %2\$s's %3\$s"; -App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s не нравится %2\$s's %3\$s"; -App::$strings["%1\$s is now connected with %2\$s"] = "%1\$s теперь соединен с %2\$s"; -App::$strings["%1\$s poked %2\$s"] = "%1\$s подпихнул %2\$s"; -App::$strings["poked"] = "подпихнул"; -App::$strings["__ctx:mood__ %1\$s is %2\$s"] = ""; +App::$strings["likes %1\$s's %2\$s"] = "Нравится %1\$s %2\$s"; +App::$strings["doesn't like %1\$s's %2\$s"] = "Не нравится %1\$s %2\$s"; +App::$strings["%1\$s is now connected with %2\$s"] = "%1\$s теперь в контакте с %2\$s"; +App::$strings["%1\$s poked %2\$s"] = "%1\$s ткнул %2\$s"; +App::$strings["poked"] = "ткнут"; +App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s в %2\$s"; +App::$strings["This is an unsaved preview"] = "Это несохранённый просмотр"; +App::$strings["__ctx:title__ Likes"] = "Нравится"; +App::$strings["__ctx:title__ Dislikes"] = "Не нравится"; +App::$strings["__ctx:title__ Agree"] = "Согласен"; +App::$strings["__ctx:title__ Disagree"] = "Против"; +App::$strings["__ctx:title__ Abstain"] = "Воздерживаюсь"; +App::$strings["__ctx:title__ Attending"] = "Присоединившиеся"; +App::$strings["__ctx:title__ Not attending"] = "Не присоединившиеся"; +App::$strings["__ctx:title__ Might attend"] = "Могут присоединиться"; App::$strings["Select"] = "Выбрать"; App::$strings["Delete"] = "Удалить"; +App::$strings["Toggle Star Status"] = "Переключить статус пометки"; App::$strings["Private Message"] = "Личное сообщение"; -App::$strings["Message is verified"] = "Сообщение проверено"; -App::$strings["View %s's profile @ %s"] = "Просмотр %s's профиля @ %s"; +App::$strings["Message signature validated"] = "Подпись сообщения проверена"; +App::$strings["Message signature incorrect"] = "Подпись сообщения неверная"; +App::$strings["Approve"] = "Утвердить"; +App::$strings["View %s's profile @ %s"] = "Просмотреть профиль %s @ %s"; App::$strings["Categories:"] = "Категории:"; App::$strings["Filed under:"] = "Хранить под:"; -App::$strings[" from %s"] = " от %s"; -App::$strings["last edited: %s"] = ""; -App::$strings["Expires: %s"] = ""; +App::$strings["from %s"] = "от %s"; +App::$strings["last edited: %s"] = "последнее редактирование: %s"; +App::$strings["Expires: %s"] = "Срок действия: %s"; App::$strings["View in context"] = "Показать в контексте"; App::$strings["Please wait"] = "Подождите пожалуйста"; App::$strings["remove"] = "удалить"; App::$strings["Loading..."] = "Загрузка..."; App::$strings["Delete Selected Items"] = "Удалить выбранные элементы"; -App::$strings["View Source"] = "Просмотр источника"; -App::$strings["Follow Thread"] = "Следовать теме"; -App::$strings["View Status"] = "Просмотр состояния"; -App::$strings["View Profile"] = "Просмотр профиля"; -App::$strings["View Photos"] = "Просмотр фотографий"; -App::$strings["Matrix Activity"] = "Активность матрицы"; -App::$strings["Edit Contact"] = "Редактировать контакт"; -App::$strings["Send PM"] = "Отправить личное сообщение"; -App::$strings["Poke"] = "Подпихнуть"; +App::$strings["View Source"] = "Просмотреть источник"; +App::$strings["Follow Thread"] = "Следить за темой"; +App::$strings["Unfollow Thread"] = "Прекратить отслеживать тему"; +App::$strings["Recent Activity"] = "Последние действия"; +App::$strings["Connect"] = "Подключить"; +App::$strings["Edit Connection"] = "Редактировать контакт"; +App::$strings["Message"] = "Сообщение"; +App::$strings["Ratings"] = "Оценки"; +App::$strings["Poke"] = "Ткнуть"; App::$strings["%s likes this."] = "%s нравится это."; App::$strings["%s doesn't like this."] = "%s не нравится это."; App::$strings["<span %1\$s>%2\$d people</span> like this."] = array( - 0 => "<span %1\$s>%2\$d чел.</span> нравится это.", - 1 => "<span %1\$s>%2\$d чел.</span> нравится это.", - 2 => "<span %1\$s>%2\$d чел.</span> нравится это.", + 0 => "<span %1\$s>%2\$d человеку</span> это нравится.", + 1 => "<span %1\$s>%2\$d человекам</span> это нравится.", + 2 => "<span %1\$s>%2\$d человекам</span> это нравится.", ); App::$strings["<span %1\$s>%2\$d people</span> don't like this."] = array( - 0 => "", - 1 => "", - 2 => "<span %1\$s>%2\$d чел.</span> не нравится это.", + 0 => "<span %1\$s>%2\$d человеку</span> это не нравится.", + 1 => "<span %1\$s>%2\$d человекам</span> это не нравится.", + 2 => "<span %1\$s>%2\$d человекам</span> это не нравится.", ); App::$strings["and"] = "и"; App::$strings[", and %d other people"] = array( - 0 => "", - 1 => "", - 2 => ", и %d другие люди", + 0 => ", и ещё %d человеку", + 1 => ", и ещё %d человекам", + 2 => ", и ещё %d человекам", ); App::$strings["%s like this."] = "%s нравится это."; App::$strings["%s don't like this."] = "%s не нравится это."; -App::$strings["Visible to <strong>everybody</strong>"] = "Видно для <strong>всех</strong>"; -App::$strings["Please enter a link URL:"] = "Пожалуйста, введите URL ссылки:"; -App::$strings["Please enter a video link/URL:"] = "Пожалуйста, введите URL видео-ссылки:"; -App::$strings["Please enter an audio link/URL:"] = "Пожалуйста, введите URL аудио-ссылки:"; +App::$strings["Set your location"] = "Задать своё местоположение"; +App::$strings["Clear browser location"] = "Очистить местоположение из браузера"; +App::$strings["Insert web link"] = "Вставить веб-ссылку"; +App::$strings["Embed (existing) photo from your photo albums"] = "Встроить (существующее) фото из вашего фотоальбома"; +App::$strings["Please enter a link URL:"] = "Пожалуйста введите URL ссылки:"; App::$strings["Tag term:"] = "Теги:"; -App::$strings["Save to Folder:"] = "Сохранить в папку:"; App::$strings["Where are you right now?"] = "Где вы сейчас?"; -App::$strings["Expires YYYY-MM-DD HH:MM"] = ""; +App::$strings["Choose images to embed"] = "Выбрать изображения для встраивания"; +App::$strings["Choose an album"] = "Выбрать альбом"; +App::$strings["Choose a different album..."] = "Выбрать другой альбом..."; +App::$strings["Error getting album list"] = "Ошибка получения списка альбомов"; +App::$strings["Error getting photo link"] = "Ошибка получения ссылки на фотографию"; +App::$strings["Error getting album"] = "Ошибка получения альбома"; +App::$strings["Comments enabled"] = "Комментарии включены"; +App::$strings["Comments disabled"] = "Комментарии отключены"; App::$strings["Preview"] = "Предварительный просмотр"; App::$strings["Share"] = "Поделиться"; -App::$strings["Page link title"] = "Ссылка заголовока страницы"; -App::$strings["Post as"] = ""; -App::$strings["Upload photo"] = "Загрузить фотографию"; -App::$strings["upload photo"] = "загрузить фотографию"; -App::$strings["Attach file"] = "Прикрепить файл"; -App::$strings["attach file"] = "прикрепить файл"; -App::$strings["Insert web link"] = "Вставить веб-ссылку"; -App::$strings["web link"] = "веб-ссылка"; -App::$strings["Insert video link"] = "Вставить видео-ссылку"; -App::$strings["video link"] = "видео-ссылка"; -App::$strings["Insert audio link"] = "Вставить аудио-ссылку"; -App::$strings["audio link"] = "аудио-ссылка"; -App::$strings["Set your location"] = "Указание своего расположения"; -App::$strings["set location"] = "указание расположения"; -App::$strings["Clear browser location"] = "Стереть указание расположения"; -App::$strings["clear location"] = "стереть указание расположения"; -App::$strings["Set title"] = "Заголовок"; -App::$strings["Categories (comma-separated list)"] = "Категории (список через запятую)"; -App::$strings["Permission settings"] = "Настройки разрешений"; -App::$strings["permissions"] = "разрешения"; -App::$strings["Public post"] = "Публичное сообщение"; -App::$strings["Example: bob@example.com, mary@example.com"] = "Пример: bob@example.com, mary@example.com"; -App::$strings["Set expiration date"] = ""; -App::$strings["Encrypt text"] = ""; -App::$strings["OK"] = "OK"; +App::$strings["Page link name"] = "Название ссылки на страницу "; +App::$strings["Post as"] = "Опубликовать как"; +App::$strings["Bold"] = "Жирный"; +App::$strings["Italic"] = "Курсив"; +App::$strings["Underline"] = "Подчеркнутый"; +App::$strings["Quote"] = "Цитата"; +App::$strings["Code"] = "Код"; +App::$strings["Attach/Upload file"] = "Прикрепить/загрузить файл"; +App::$strings["Embed an image from your albums"] = "Встроить изображение из ваших альбомов"; App::$strings["Cancel"] = "Отменить"; -App::$strings["Discover"] = "Обнаруженные"; -App::$strings["Imported public streams"] = ""; +App::$strings["OK"] = ""; +App::$strings["Toggle voting"] = "Подключить голосование"; +App::$strings["Disable comments"] = "Отключить комментарии"; +App::$strings["Toggle comments"] = "Переключить комментарии"; +App::$strings["Title (optional)"] = "Заголовок (необязательно)"; +App::$strings["Categories (optional, comma-separated list)"] = "Категории (необязательно, список через запятую)"; +App::$strings["Permission settings"] = "Настройки разрешений"; +App::$strings["Other networks and post services"] = "Другие сети и службы публикаций"; +App::$strings["Set expiration date"] = "Установить срок действия"; +App::$strings["Set publish date"] = "Установить дату публикации"; +App::$strings["Encrypt text"] = "Зашифровать текст"; App::$strings["Commented Order"] = "По комментариям"; -App::$strings["Sort by Comment Date"] = "Сортировка по дате создания комментариев"; -App::$strings["Posted Order"] = "По добавлениям"; -App::$strings["Sort by Post Date"] = "Сортировка по дате создания сообщения"; -App::$strings["Personal"] = "Личные"; -App::$strings["Posts that mention or involve you"] = "Сообщения, в которых упоминули или вовлекли вас"; +App::$strings["Sort by Comment Date"] = "Сортировать по дате комментария"; +App::$strings["Posted Order"] = "По публикациям"; +App::$strings["Sort by Post Date"] = "Сортировать по дате публикации"; +App::$strings["Personal"] = "Личное"; +App::$strings["Posts that mention or involve you"] = "Публикации, где вы были упомянуты или участвовали"; App::$strings["New"] = "Новые"; -App::$strings["Activity Stream - by date"] = "Лента активности - по дате"; -App::$strings["Starred"] = "Помеченные"; -App::$strings["Favourite Posts"] = "Фаворит-сообщения"; +App::$strings["Activity Stream - by date"] = "Поток активности - по дате"; +App::$strings["Starred"] = "Отмеченые"; +App::$strings["Favourite Posts"] = "Любимые публикации"; App::$strings["Spam"] = "Спам"; -App::$strings["Posts flagged as SPAM"] = "Как СПАМ помеченные сообщения"; +App::$strings["Posts flagged as SPAM"] = "Публикация помечена как спам"; App::$strings["Channel"] = "Канал"; -App::$strings["Status Messages and Posts"] = ""; +App::$strings["Status Messages and Posts"] = "Статусы и публикации"; App::$strings["About"] = "О себе"; -App::$strings["Profile Details"] = "Сведения о профиле"; +App::$strings["Profile Details"] = "Информация о профиле"; App::$strings["Photos"] = "Фотографии"; App::$strings["Photo Albums"] = "Фотоальбомы"; App::$strings["Files"] = "Файлы"; -App::$strings["Files and Storage"] = ""; +App::$strings["Files and Storage"] = "Файлы и хранилище"; +App::$strings["Events"] = "События"; App::$strings["Chatrooms"] = "Чаты"; App::$strings["Bookmarks"] = "Закладки"; App::$strings["Saved Bookmarks"] = "Сохранённые закладки"; +App::$strings["Cards"] = "Карточки"; +App::$strings["View Cards"] = "Просмотреть карточки"; +App::$strings["articles"] = "статьи"; +App::$strings["View Articles"] = "Просмотр статей"; App::$strings["Webpages"] = "Веб-страницы"; -App::$strings["Manage Webpages"] = "Управление веб-страниц"; -App::$strings["New Page"] = "Новая страница"; -App::$strings["Edit"] = "Редактировать"; -App::$strings["View"] = "Просмотр"; -App::$strings["Actions"] = ""; -App::$strings["Page Link"] = "Ссылка страницы"; -App::$strings["Title"] = "Заголовок"; -App::$strings["Created"] = "Создано"; -App::$strings["Edited"] = "Отредактирован"; -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."] = ""; -App::$strings["Not a valid email address"] = "Не действительный адрес электронной почты"; -App::$strings["Your email domain is not among those allowed on this site"] = "Домен электронной почты не входит в число тех, которые разрешены на этом сайте"; -App::$strings["Your email address is already registered at this site."] = "Ваш адрес электронной почты уже зарегистрирован на этом сайте."; -App::$strings["An invitation is required."] = "Требуется приглашение."; -App::$strings["Invitation could not be verified."] = "Не удалось проверить приглашение."; -App::$strings["Please enter the required information."] = "Пожалуйста, введите необходимую информацию."; -App::$strings["Failed to store account information."] = "Не удалось сохранить информацию аккаунта."; -App::$strings["Registration request at %s"] = "Требуется регистрация на %s"; -App::$strings["Administrator"] = "Администратор"; -App::$strings["your registration password"] = "Ваш пароль регистрации"; -App::$strings["Registration details for %s"] = "Регистрационные данные для %s"; -App::$strings["Account approved."] = "Аккаунт утвержден."; -App::$strings["Registration revoked for %s"] = "Регистрация отозвана для %s"; -App::$strings["Permission denied."] = "Доступ запрещен."; -App::$strings["Image exceeds website size limit of %lu bytes"] = ""; -App::$strings["Image file is empty."] = "файл пуст."; -App::$strings["Unable to process image"] = "Не удается обработать изображение"; -App::$strings["Photo storage failed."] = "Ошибка в банке фотографий"; -App::$strings["Upload New Photos"] = "Загрузить новые фотографии"; -App::$strings["Visible to everybody"] = "Видно всем"; -App::$strings["Show"] = "Показывать"; -App::$strings["Don't show"] = "Не показывать"; -App::$strings["Permissions"] = "Разрешения"; -App::$strings["Close"] = "Закрыть"; -App::$strings[" and "] = "и"; -App::$strings["public profile"] = "Публичный профиль"; -App::$strings["%1\$s changed %2\$s to “%3\$s”"] = "%1\$s изменил %2\$s на “%3\$s”"; -App::$strings["Visit %1\$s's %2\$s"] = "Посетить %1\$s's %2\$s"; -App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = ""; -App::$strings["Public Timeline"] = "Публичная шкала времени"; +App::$strings["View Webpages"] = "Просмотр веб-страниц"; +App::$strings["Wikis"] = ""; +App::$strings["Wiki"] = ""; +App::$strings["__ctx:noun__ Like"] = array( + 0 => "Нравится", + 1 => "Нравится", + 2 => "Нравится", +); +App::$strings["__ctx:noun__ Dislike"] = array( + 0 => "Не нравится", + 1 => "Не нравится", + 2 => "Не нравится", +); +App::$strings["__ctx:noun__ Attending"] = array( + 0 => "Посетит", + 1 => "Посетят", + 2 => "Посетят", +); +App::$strings["__ctx:noun__ Not Attending"] = array( + 0 => "Не посетит", + 1 => "Не посетят", + 2 => "Не посетят", +); +App::$strings["__ctx:noun__ Undecided"] = array( + 0 => "Не решил", + 1 => "Не решили", + 2 => "Не решили", +); +App::$strings["__ctx:noun__ Agree"] = array( + 0 => "Согласен", + 1 => "Согласны", + 2 => "Согласны", +); +App::$strings["__ctx:noun__ Disagree"] = array( + 0 => "Не согласен", + 1 => "Не согласны", + 2 => "Не согласны", +); +App::$strings["__ctx:noun__ Abstain"] = array( + 0 => "Воздержался", + 1 => "Воздержались", + 2 => "Воздержались", +); +App::$strings["Invalid data packet"] = "Неверный пакет данных"; +App::$strings["Unable to verify channel signature"] = "Невозможно проверить подпись канала"; +App::$strings["Unable to verify site signature for %s"] = "Невозможно проверить подпись сайта %s"; +App::$strings["invalid target signature"] = "недопустимая целевая подпись"; +App::$strings["l F d, Y \\@ g:i A"] = ""; +App::$strings["Starts:"] = "Начало:"; +App::$strings["Finishes:"] = "Окончание:"; +App::$strings["Location:"] = "Местоположение:"; +App::$strings["This event has been added to your calendar."] = "Это событие было добавлено в ваш календарь."; +App::$strings["Not specified"] = "Не указано"; +App::$strings["Needs Action"] = "Требует действия"; +App::$strings["Completed"] = "Завершено"; +App::$strings["In Process"] = "В процессе"; +App::$strings["Cancelled"] = "Отменено"; +App::$strings["Mobile"] = "Мобильный"; +App::$strings["Home"] = "Домашний"; +App::$strings["Home, Voice"] = "Дом, голос"; +App::$strings["Home, Fax"] = "Дом, факс"; +App::$strings["Work"] = "Рабочий"; +App::$strings["Work, Voice"] = "Работа, голос"; +App::$strings["Work, Fax"] = "Работа, факс"; +App::$strings["Other"] = "Другой"; App::$strings["Item was not found."] = "Элемент не найден."; +App::$strings["Unknown error."] = "Неизвестная ошибка."; App::$strings["No source file."] = "Нет исходного файла."; -App::$strings["Cannot locate file to replace"] = "Не удается найти файл, чтобы заменить"; +App::$strings["Cannot locate file to replace"] = "Не удается найти файл для замены"; App::$strings["Cannot locate file to revise/update"] = "Не удается найти файл для пересмотра / обновления"; App::$strings["File exceeds size limit of %d"] = "Файл превышает предельный размер %d"; -App::$strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = ""; +App::$strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Вы достигли предела %1$.0f Мбайт для хранения вложений."; App::$strings["File upload failed. Possible system limit or action terminated."] = "Загрузка файла не удалась. Возможно система перегружена или попытка прекращена."; -App::$strings["Stored file could not be verified. Upload failed."] = "Файл для сохранения не проверен. Загрузка не удалась."; +App::$strings["Stored file could not be verified. Upload failed."] = "Файл для сохранения не может быть проверен. Загрузка не удалась."; App::$strings["Path not available."] = "Путь недоступен."; -App::$strings["Empty pathname"] = ""; -App::$strings["duplicate filename or path"] = ""; +App::$strings["Empty pathname"] = "Пустое имя пути"; +App::$strings["duplicate filename or path"] = "дублирующееся имя файла или пути"; App::$strings["Path not found."] = "Путь не найден."; -App::$strings["mkdir failed."] = "mkdir безуспешно."; -App::$strings["database storage failed."] = ""; -App::$strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A"; -App::$strings["Starts:"] = "Начало:"; -App::$strings["Finishes:"] = "\t\nКонец:"; -App::$strings["Location:"] = "Откуда:"; -App::$strings["Logout"] = "Выход"; +App::$strings["mkdir failed."] = "mkdir не удался"; +App::$strings["database storage failed."] = "ошибка при записи базы данных."; +App::$strings["Empty path"] = "Пустое имя пути"; +App::$strings["unknown"] = "неизвестный"; +App::$strings["%1\$s's bookmarks"] = "Закладки пользователя %1\$s"; +App::$strings["Directory Options"] = "Параметры каталога"; +App::$strings["Safe Mode"] = "Безопасный режим"; +App::$strings["Public Forums Only"] = "Только публичные форумы"; +App::$strings["This Website Only"] = "Только этот веб-сайт"; +App::$strings["view full size"] = "посмотреть в полный размер"; +App::$strings["Friendica"] = ""; +App::$strings["OStatus"] = ""; +App::$strings["GNU-Social"] = "GNU social"; +App::$strings["RSS/Atom"] = ""; +App::$strings["Diaspora"] = ""; +App::$strings["Facebook"] = ""; +App::$strings["Zot"] = ""; +App::$strings["LinkedIn"] = ""; +App::$strings["XMPP/IM"] = ""; +App::$strings["MySpace"] = ""; +App::$strings[" and "] = " и "; +App::$strings["public profile"] = "общедоступный профиль"; +App::$strings["%1\$s changed %2\$s to “%3\$s”"] = "%1\$s изменил %2\$s на “%3\$s”"; +App::$strings["Visit %1\$s's %2\$s"] = "Посетить %1\$s %2\$s"; +App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s обновлено %2\$s, изменено %3\$s."; +App::$strings["Remote authentication"] = "Удаленная аутентификация"; +App::$strings["Click to authenticate to your home hub"] = "Нажмите, чтобы аутентифицировать себя на домашнем узле"; +App::$strings["Channel Manager"] = "Менеджер каналов"; +App::$strings["Manage your channels"] = "Управление вашими каналами"; +App::$strings["Privacy Groups"] = "Группы безопасности"; +App::$strings["Manage your privacy groups"] = "Управление вашим группами безопасности"; +App::$strings["Settings"] = "Настройки"; +App::$strings["Account/Channel Settings"] = "Настройки аккаунта / канала"; App::$strings["End this session"] = "Закончить эту сессию"; -App::$strings["Home"] = "Мой канал"; -App::$strings["Your posts and conversations"] = "Ваши сообщения и разговоры"; App::$strings["Your profile page"] = "Страницa вашего профиля"; App::$strings["Edit Profiles"] = "Редактирование профилей"; -App::$strings["Manage/Edit profiles"] = "Управление / Редактирование профилей"; -App::$strings["Your photos"] = "Ваши фотографии"; -App::$strings["Your files"] = "Ваши файлы"; -App::$strings["Chat"] = "Чат"; -App::$strings["Your chatrooms"] = "Ваши чаты"; -App::$strings["Your bookmarks"] = "Ваши закладки"; -App::$strings["Your webpages"] = "Ваши веб-страницы"; -App::$strings["Login"] = "Войти"; +App::$strings["Manage/Edit profiles"] = "Управление / редактирование профилей"; +App::$strings["Edit your profile"] = "Редактировать профиль"; App::$strings["Sign in"] = "Войти"; -App::$strings["%s - click to logout"] = "%s - нажмите чтобы выйти"; -App::$strings["Click to authenticate to your home hub"] = ""; -App::$strings["Home Page"] = "Моя страница"; -App::$strings["Register"] = "Регистрация"; +App::$strings["Take me home"] = "Домой"; +App::$strings["Log me out of this site"] = "Выйти с этого сайта"; App::$strings["Create an account"] = "Создать аккаунт"; App::$strings["Help"] = "Помощь"; App::$strings["Help and documentation"] = "Справочная информация и документация"; -App::$strings["Apps"] = "Приложения"; -App::$strings["Applications, utilities, links, games"] = ""; App::$strings["Search"] = "Поиск"; -App::$strings["Search site content"] = "Поиск по содержанию сайту"; -App::$strings["Directory"] = "Каталог"; -App::$strings["Channel Locator"] = "Локатор каналов"; -App::$strings["Matrix"] = "Матрица"; -App::$strings["Your matrix"] = "Собственная матрица"; -App::$strings["Mark all matrix notifications seen"] = "Пометить все оповещения матрицы как прочитанное"; -App::$strings["Channel Home"] = "Главная канала"; -App::$strings["Channel home"] = "Главная канала"; -App::$strings["Mark all channel notifications seen"] = "Пометить все оповещения канала как прочитанное"; -App::$strings["Connections"] = "Контакты"; -App::$strings["Notices"] = "Оповещения"; -App::$strings["Notifications"] = "Оповещения"; -App::$strings["See all notifications"] = "Просмотреть все оповещения"; -App::$strings["Mark all system notifications seen"] = "Пометить все оповещения как прочитанное"; -App::$strings["Mail"] = "Переписка"; -App::$strings["Private mail"] = "Ваша личная переписка"; -App::$strings["See all private messages"] = "Просмотреть все личные сообщения"; -App::$strings["Mark all private messages seen"] = "Пометить все личные сообщения как прочитанное"; -App::$strings["Inbox"] = "Входящие"; -App::$strings["Outbox"] = "Исходящие"; -App::$strings["New Message"] = "Новое личное сообщение"; -App::$strings["Events"] = "Мероприятия"; -App::$strings["Event Calendar"] = "Календарь мероприятий"; -App::$strings["See all events"] = "Показать все мероприятия"; -App::$strings["Mark all events seen"] = "Пометить все мероприятия как прочитанное"; -App::$strings["Channel Select"] = "Выбор каналов"; -App::$strings["Manage Your Channels"] = "Управление каналов"; -App::$strings["Settings"] = "Настройки"; -App::$strings["Account/Channel Settings"] = "Настройки аккаунта/канала"; -App::$strings["Admin"] = "Администрация"; +App::$strings["Search site @name, !forum, #tag, ?docs, content"] = "Искать на сайте @name, !forum, #tag, ?docs, содержимое"; +App::$strings["Admin"] = "Администрирование"; App::$strings["Site Setup and Configuration"] = "Установка и конфигурация сайта"; -App::$strings["Nothing new here"] = "Ничего нового здесь"; +App::$strings["Loading"] = "Загрузка"; +App::$strings["@name, !forum, #tag, ?doc, content"] = "@name, !forum, #tag, ?docs, содержимое"; App::$strings["Please wait..."] = "Подождите пожалуйста ..."; -App::$strings["%1\$s's bookmarks"] = "Закладки пользователя %1\$s"; -App::$strings["Missing room name"] = ""; -App::$strings["Duplicate room name"] = ""; -App::$strings["Invalid room specifier."] = ""; -App::$strings["Room not found."] = ""; -App::$strings["Room is full"] = ""; -App::$strings["Tags"] = "Тэги"; +App::$strings["Add Apps"] = "Добавить приложения"; +App::$strings["Arrange Apps"] = "Управление приложениями"; +App::$strings["Toggle System Apps"] = "Переключить системные приложения"; +App::$strings["Calendar"] = "Календарь"; +App::$strings["Articles"] = "Статьи"; +App::$strings["Help:"] = "Помощь:"; +App::$strings["Not Found"] = "Не найдено"; +App::$strings["Page not found."] = "Страница не найдена."; +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."] = "Удаленная группа с этим названием была восстановлена. Существующие разрешения пункт <strong>могут</strong> применяться к этой группе и к её будущих участников. Если это не то, чего вы хотели, пожалуйста, создайте другую группу с другим именем."; +App::$strings["Add new connections to this privacy group"] = "Добавить новые контакты в группу безопасности"; +App::$strings["edit"] = "редактировать"; +App::$strings["Edit group"] = "Редактировать группу"; +App::$strings["Add privacy group"] = "Добавить группу безопасности"; +App::$strings["Channels not in any privacy group"] = "Каналы не включены ни в одну группу безопасности"; +App::$strings["add"] = "добавить"; +App::$strings["Unable to import a removed channel."] = "Невозможно импортировать удалённый канал."; +App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "Не удалось создать дублирующийся идентификатор канала. Импорт невозможен."; +App::$strings["Cloned channel not found. Import failed."] = "Клон канала не найден. Импорт невозможен."; +App::$strings["Profile Photos"] = "Фотографии профиля"; +App::$strings["Trending"] = "В тренде"; +App::$strings["Tags"] = "Теги"; +App::$strings["Categories"] = "Категории"; App::$strings["Keywords"] = "Ключевые слова"; App::$strings["have"] = "иметь"; App::$strings["has"] = "есть"; App::$strings["want"] = "хотеть"; -App::$strings["wants"] = "хочет"; +App::$strings["wants"] = "хотеть"; App::$strings["like"] = "нравится"; App::$strings["likes"] = "нравится"; -App::$strings["dislike"] = "не-нравится"; -App::$strings["dislikes"] = "не-нравится"; -App::$strings["__ctx:noun__ Like"] = array( - 0 => "нравится", - 1 => "нравится", - 2 => "нравится", -); -App::$strings["Default"] = "По умолчанию"; -App::$strings["Unknown | Not categorised"] = "Неизвестные | Без категории"; -App::$strings["Block immediately"] = "Немедленно заблокировать"; -App::$strings["Shady, spammer, self-marketer"] = ""; -App::$strings["Known to me, but no opinion"] = "Известныo мне, но нет своего мнения"; -App::$strings["OK, probably harmless"] = "OK, наверное безвредно"; -App::$strings["Reputable, has my trust"] = "Авторитетно, имеет мое доверие"; -App::$strings["Frequently"] = "Часто"; -App::$strings["Hourly"] = "Ежечасно"; -App::$strings["Twice daily"] = "Два раза в день"; -App::$strings["Daily"] = "Ежедневно"; -App::$strings["Weekly"] = "Еженедельно"; -App::$strings["Monthly"] = "Ежемесячно"; -App::$strings["Friendica"] = "Friendica"; -App::$strings["OStatus"] = "OStatus"; -App::$strings["RSS/Atom"] = "RSS/Atom"; -App::$strings["Email"] = "E-mail"; -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["%d invitation available"] = array( - 0 => "имеется %d приглашение", - 1 => "имеются %d приглашения", - 2 => "имеется %d приглашений", -); -App::$strings["Advanced"] = "Дополнительно"; -App::$strings["Find Channels"] = "Поиск контактов"; -App::$strings["Enter name or interest"] = "Впишите имя или интерес"; -App::$strings["Connect/Follow"] = "Подключить/следовать"; -App::$strings["Examples: Robert Morgenstein, Fishing"] = "Примеры: Владимир Ильич, Революционер"; -App::$strings["Find"] = "Поиск"; -App::$strings["Channel Suggestions"] = "Рекомендации каналов"; -App::$strings["Random Profile"] = "Случайные"; -App::$strings["Invite Friends"] = "Пригласить друзей"; -App::$strings["Exammple: name=fred and country=iceland"] = ""; -App::$strings["Advanced Find"] = "Расширенный поиск"; -App::$strings["Saved Folders"] = "Запомненные папки"; -App::$strings["Everything"] = "Все"; -App::$strings["Categories"] = "Категории"; -App::$strings["%d connection in common"] = array( - 0 => "%d совместный контакт", - 1 => "%d совместных контакта", - 2 => "%d совместных контактов", -); -App::$strings["show more"] = "показать все"; -App::$strings["This event has been added to your calendar."] = "Это событие было добавлено в календарь."; -App::$strings["Miscellaneous"] = "Прочее"; -App::$strings["year"] = "год"; -App::$strings["month"] = "месяц"; -App::$strings["day"] = "день"; -App::$strings["never"] = "никогда"; -App::$strings["less than a second ago"] = "менее чем одну секунду назад"; -App::$strings["years"] = "лет"; -App::$strings["months"] = "мес."; -App::$strings["week"] = "неделя"; -App::$strings["weeks"] = "недель"; -App::$strings["days"] = "дней"; -App::$strings["hour"] = "час"; -App::$strings["hours"] = "часов"; -App::$strings["minute"] = "минута"; -App::$strings["minutes"] = "мин."; -App::$strings["second"] = "секунда"; -App::$strings["seconds"] = "секунд"; -App::$strings["%1\$d %2\$s ago"] = "%1\$d %2\$s назад"; -App::$strings["%1\$s's birthday"] = "%1\$s's День Рождения"; -App::$strings["Happy Birthday %1\$s"] = "С Днем Рождения %1\$s"; -App::$strings["Sort Options"] = "Параметры сортировки"; -App::$strings["Alphabetic"] = "По алфавиту"; -App::$strings["Reverse Alphabetic"] = "По обратному алфавиту"; -App::$strings["Newest to Oldest"] = "От новых к старым"; -App::$strings["Enable Safe Search"] = ""; -App::$strings["Disable Safe Search"] = ""; -App::$strings["Safe Mode"] = "Безопасный режим"; -App::$strings["Hubzilla Notification"] = "Оповещения Red матрицы"; -App::$strings["hubzilla"] = "hubzilla"; -App::$strings["Thank You,"] = "Спасибо,"; -App::$strings["%s Administrator"] = "%s администратор"; -App::$strings["%s <!item_type!>"] = "%s <!item_type!>"; -App::$strings["[Red:Notify] New mail received at %s"] = "[Red:Уведомление] Получено новое сообщение в %s"; -App::$strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = ""; -App::$strings["%1\$s sent you %2\$s."] = "%1\$s послал вам %2\$s."; -App::$strings["a private message"] = "личное сообщение"; -App::$strings["Please visit %s to view and/or reply to your private messages."] = "Пожалуйста, посетите %s для просмотра и/или ответа на ваши личные сообщения."; -App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = ""; -App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = ""; -App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = ""; -App::$strings["[Red:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Red:Уведомление] Комментарий к разговору #%1\$d по %2\$s"; -App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = ""; -App::$strings["Please visit %s to view and/or reply to the conversation."] = "Пожалуйста, посетите %s для просмотра и/или ответа разговора."; -App::$strings["[Red:Notify] %s posted to your profile wall"] = "[Red:Уведомление] %s добавил сообщениe на стену вашего профиля"; -App::$strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = ""; -App::$strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = ""; -App::$strings["[Red:Notify] %s tagged you"] = "[Red:Уведомление] %s добавил у вас тег"; -App::$strings["%1\$s, %2\$s tagged you at %3\$s"] = ""; -App::$strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = ""; -App::$strings["[Red:Notify] %1\$s poked you"] = "[Red:Уведомление] %1\$s подпихнул вас"; -App::$strings["%1\$s, %2\$s poked you at %3\$s"] = ""; -App::$strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = ""; -App::$strings["[Red:Notify] %s tagged your post"] = "[Red:Уведомление] %s добавил у вас в сообщении тег"; -App::$strings["%1\$s, %2\$s tagged your post at %3\$s"] = ""; -App::$strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = ""; -App::$strings["[Red:Notify] Introduction received"] = "[Red:Уведомление] введение получено"; -App::$strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = ""; -App::$strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = ""; -App::$strings["You may visit their profile at %s"] = "Вы можете посетить профиль в %s"; -App::$strings["Please visit %s to approve or reject the connection request."] = ""; -App::$strings["[Red:Notify] Friend suggestion received"] = "[Red:Уведомление] Получено предложение дружить"; -App::$strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = ""; -App::$strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = ""; -App::$strings["Name:"] = "Имя:"; -App::$strings["Photo:"] = "Фото:"; -App::$strings["Please visit %s to approve or reject the suggestion."] = ""; -App::$strings["parent"] = ""; -App::$strings["Collection"] = "Коллекция"; -App::$strings["Principal"] = ""; -App::$strings["Addressbook"] = "Адресная книга"; -App::$strings["Calendar"] = "Календарь"; -App::$strings["Schedule Inbox"] = ""; -App::$strings["Schedule Outbox"] = ""; -App::$strings["%1\$s used"] = ""; -App::$strings["%1\$s used of %2\$s (%3\$s%)"] = ""; -App::$strings["Create new folder"] = "Создать новую папку"; -App::$strings["Create"] = "Создать"; -App::$strings["Upload file"] = "Загрузить файл"; -App::$strings["Upload"] = "Загрузка"; -App::$strings["General Features"] = "Главные функции"; -App::$strings["Content Expiration"] = ""; -App::$strings["Remove posts/comments and/or private messages at a future time"] = "Удалять посты/комментарии и/или личные сообщения"; -App::$strings["Multiple Profiles"] = "Несколько профилей"; -App::$strings["Ability to create multiple profiles"] = "Возможность создания нескольких профилей"; -App::$strings["Web Pages"] = "Веб-страницы"; -App::$strings["Provide managed web pages on your channel"] = ""; -App::$strings["Private Notes"] = "Личные заметки"; -App::$strings["Enables a tool to store notes and reminders"] = ""; -App::$strings["Extended Identity Sharing"] = "Расширенный обмен идентичности"; -App::$strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = ""; -App::$strings["Expert Mode"] = "Экспертный режим"; -App::$strings["Enable Expert Mode to provide advanced configuration options"] = ""; -App::$strings["Premium Channel"] = "Премиум канал"; -App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = ""; -App::$strings["Post Composition Features"] = ""; -App::$strings["Richtext Editor"] = "Редактор RichText"; -App::$strings["Enable richtext editor"] = "Включить редактор RichText"; -App::$strings["Post Preview"] = "Предварительный просмотр сообщения"; -App::$strings["Allow previewing posts and comments before publishing them"] = "Разрешить предварительный просмотр сообщений и комментариев перед их публикацией"; -App::$strings["Channel Sources"] = "Источники канала"; -App::$strings["Automatically import channel content from other channels or feeds"] = ""; -App::$strings["Even More Encryption"] = "Еще больше шифрования"; -App::$strings["Allow optional encryption of content end-to-end with a shared secret key"] = ""; -App::$strings["Network and Stream Filtering"] = "Фильтрация сети и потока"; -App::$strings["Search by Date"] = "Поиск по дате"; -App::$strings["Ability to select posts by date ranges"] = "Возможность выбора сообщений по датам"; -App::$strings["Collections Filter"] = "Фильтр коллекций"; -App::$strings["Enable widget to display Network posts only from selected collections"] = ""; -App::$strings["Saved Searches"] = "Запомненные поиски"; -App::$strings["Save search terms for re-use"] = "Сохранять результаты поиска для повторного использования"; -App::$strings["Network Personal Tab"] = "Сеть - Личная вкладка"; -App::$strings["Enable tab to display only Network posts that you've interacted on"] = ""; -App::$strings["Network New Tab"] = "Сеть - Новая вкладка"; -App::$strings["Enable tab to display all new Network activity"] = ""; -App::$strings["Affinity Tool"] = "Инструмент сходства или соответствия"; -App::$strings["Filter stream activity by depth of relationships"] = ""; -App::$strings["Suggest Channels"] = ""; -App::$strings["Show channel suggestions"] = ""; -App::$strings["Post/Comment Tools"] = "Инструменты сообщений/комментарий "; -App::$strings["Edit Sent Posts"] = "Редактировать отправленные сообщения"; -App::$strings["Edit and correct posts and comments after sending"] = "Редактировать и исправлять сообщения и комментарии после отправки"; -App::$strings["Tagging"] = "Пометка"; -App::$strings["Ability to tag existing posts"] = "Возможность использовать теги"; -App::$strings["Post Categories"] = "Категории сообщения"; -App::$strings["Add categories to your posts"] = "Добавить категории для ваших сообщений"; -App::$strings["Ability to file posts under folders"] = ""; -App::$strings["Dislike Posts"] = "Сообщение не нравится"; -App::$strings["Ability to dislike posts/comments"] = "Возможность выбора нравится/не-нравится"; -App::$strings["Star Posts"] = "Помечать сообщения"; -App::$strings["Ability to mark special posts with a star indicator"] = ""; -App::$strings["Tag Cloud"] = "Облако тегов"; -App::$strings["Provide a personal tag cloud on your channel page"] = ""; +App::$strings["dislike"] = "не нравится"; +App::$strings["dislikes"] = "не нравится"; +App::$strings["OpenWebAuth: %1\$s welcomes %2\$s"] = "OpenWebAuth: %1\$s приветствует %2\$s"; +App::$strings["default"] = "по умолчанию"; +App::$strings["Select an alternate language"] = "Выбор дополнительного языка"; App::$strings["Channel is blocked on this site."] = "Канал блокируется на этом сайте."; App::$strings["Channel location missing."] = "Местоположение канала отсутствует."; -App::$strings["Response from remote channel was incomplete."] = ""; -App::$strings["Channel was deleted and no longer exists."] = ""; +App::$strings["Response from remote channel was incomplete."] = "Ответ удаленного канала неполный."; +App::$strings["Premium channel - please visit:"] = "Премимум-канал - пожалуйста посетите:"; +App::$strings["Channel was deleted and no longer exists."] = "Канал удален и больше не существует."; +App::$strings["Remote channel or protocol unavailable."] = "Удалённый канал или протокол недоступен."; App::$strings["Channel discovery failed."] = "Не удалось обнаружить канал."; -App::$strings["local account not found."] = "локальный аккаунт не найден."; +App::$strings["Protocol disabled."] = "Протокол отключен."; App::$strings["Cannot connect to yourself."] = "Нельзя подключиться к самому себе."; -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."] = ""; -App::$strings["Default privacy group for new contacts"] = "Группа конфиденциальности по умолчанию для новых контактов"; -App::$strings["All Channels"] = "Все каналы"; -App::$strings["edit"] = "редактировать"; -App::$strings["Collections"] = "Коллекции"; -App::$strings["Edit collection"] = "Редактировать коллекцию"; -App::$strings["Create a new collection"] = "Создать новую коллекцию"; -App::$strings["Channels not in any collection"] = "Контакты не в какой коллекции"; -App::$strings["add"] = "добавить"; -App::$strings["Unable to obtain identity information from database"] = "Невозможно получить идентификационную информацию из базы данных"; -App::$strings["Empty name"] = "Пустое имя"; -App::$strings["Name too long"] = "Слишком длинное имя"; -App::$strings["No account identifier"] = "идентификатор аккаунта отсутствует"; -App::$strings["Nickname is required."] = "Требуется псевдоним."; -App::$strings["Reserved nickname. Please choose another."] = ""; -App::$strings["Nickname has unsupported characters or is already being used on this site."] = "Псевдоним имеет недопустимые символы или уже используется на этом сайте."; -App::$strings["Unable to retrieve created identity"] = ""; -App::$strings["Default Profile"] = "Профиль по умолчанию"; -App::$strings["Friends"] = "Друзья"; -App::$strings["Requested channel is not available."] = "Запрашиваемый канал не доступен."; -App::$strings["Requested profile is not available."] = "Запрашиваемый профиль не доступен."; -App::$strings["Connect"] = "Подключить"; -App::$strings["Change profile photo"] = "Изменить фотографию профиля"; -App::$strings["Profiles"] = "Профили"; -App::$strings["Manage/edit profiles"] = "Управление / Редактирование профилей"; -App::$strings["Create New Profile"] = "Создать новый профиль"; -App::$strings["Edit Profile"] = "Редактировать профиль"; -App::$strings["Profile Image"] = "Изображение профиля"; -App::$strings["visible to everybody"] = "видно всем"; -App::$strings["Edit visibility"] = "Редактировать видимость"; -App::$strings["Gender:"] = "Пол:"; -App::$strings["Status:"] = "Статус:"; -App::$strings["Homepage:"] = "Домашняя страница:"; -App::$strings["Online Now"] = "Сейчас в сети"; -App::$strings["g A l F d"] = "g A l F d"; -App::$strings["F d"] = "F d"; -App::$strings["[today]"] = "[сегодня]"; -App::$strings["Birthday Reminders"] = "Напоминания о Днях Рождения"; -App::$strings["Birthdays this week:"] = "Дни Рождения на этой неделе:"; -App::$strings["[No description]"] = "[без описания]"; -App::$strings["Event Reminders"] = "Напоминания мероприятий"; -App::$strings["Events this week:"] = "Мероприятия на этой неделе:"; -App::$strings["Profile"] = "Профиль"; -App::$strings["Full Name:"] = "Полное имя:"; -App::$strings["Like this channel"] = "нравиться этот канал"; -App::$strings["j F, Y"] = "j F, Y"; -App::$strings["j F"] = "j F"; -App::$strings["Birthday:"] = "День Рождения:"; -App::$strings["Age:"] = "Возраст:"; -App::$strings["for %1\$d %2\$s"] = "для %1\$d %2\$s"; -App::$strings["Sexual Preference:"] = "Сексуальная ориентация:"; -App::$strings["Hometown:"] = "Родной город:"; -App::$strings["Tags:"] = "Тэги:"; -App::$strings["Political Views:"] = "Политические взгляды:"; -App::$strings["Religion:"] = "Религия:"; -App::$strings["About:"] = "О себе:"; -App::$strings["Hobbies/Interests:"] = "Хобби / интересы:"; -App::$strings["Likes:"] = "Что вам нравится:"; -App::$strings["Dislikes:"] = "Что вам не нравится:"; -App::$strings["Contact information and Social Networks:"] = "Информация и социальные сети контакта:"; -App::$strings["My other channels:"] = "Мои другие каналы:"; -App::$strings["Musical interests:"] = "Музыкальные интересы:"; -App::$strings["Books, literature:"] = "Книги, литература:"; -App::$strings["Television:"] = "Телевидение:"; -App::$strings["Film/dance/culture/entertainment:"] = "Кино / танцы / культура / развлечения:"; -App::$strings["Love/Romance:"] = "Любовь / Романс:"; -App::$strings["Work/employment:"] = "Работа / Занятость:"; -App::$strings["School/education:"] = "Школа / образование:"; -App::$strings["Like this thing"] = "нравится этo"; -App::$strings["view full size"] = "посмотреть в полный размер"; +App::$strings["Visible to your default audience"] = "Видно вашей аудитории по умолчанию."; +App::$strings["__ctx:acl__ Profile"] = "Профиль"; +App::$strings["Only me"] = "Только мне"; +App::$strings["Who can see this?"] = "Кто может это видеть?"; +App::$strings["Custom selection"] = "Настраиваемый выбор"; +App::$strings["Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit the scope of \"Show\"."] = "Нажмите \"Показать\" чтобы разрешить просмотр. \"Не показывать\" позволит вам переопределить и ограничить область показа."; +App::$strings["Show"] = "Показать"; +App::$strings["Don't show"] = "Не показывать"; +App::$strings["Permissions"] = "Разрешения"; +App::$strings["Close"] = "Закрыть"; +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."] = "Разрешения публикации %s не могут быть изменены %s после того, как ею поделились. Эти разрешения устанавливают кому разрешено просматривать эту публикацию."; +App::$strings["Miscellaneous"] = "Прочее"; +App::$strings["Birthday"] = "День рождения"; +App::$strings["Age: "] = "Возраст:"; +App::$strings["YYYY-MM-DD or MM-DD"] = "YYYY-MM-DD или MM-DD"; +App::$strings["Required"] = "Требуется"; +App::$strings["less than a second ago"] = "менее чем одну секунду"; +App::$strings["__ctx:e.g. 22 hours ago, 1 minute ago__ %1\$d %2\$s ago"] = "%1\$d %2\$s назад"; +App::$strings["__ctx:relative_date__ year"] = array( + 0 => "год", + 1 => "года", + 2 => "лет", +); +App::$strings["__ctx:relative_date__ month"] = array( + 0 => "месяц", + 1 => "месяца", + 2 => "месяцев", +); +App::$strings["__ctx:relative_date__ week"] = array( + 0 => "неделю", + 1 => "недели", + 2 => "недель", +); +App::$strings["__ctx:relative_date__ day"] = array( + 0 => "день", + 1 => "дня", + 2 => "дней", +); +App::$strings["__ctx:relative_date__ hour"] = array( + 0 => "час", + 1 => "часа", + 2 => "часов", +); +App::$strings["__ctx:relative_date__ minute"] = array( + 0 => "минуту", + 1 => "минуты", + 2 => "минут", +); +App::$strings["__ctx:relative_date__ second"] = array( + 0 => "секунду", + 1 => "секунды", + 2 => "секунд", +); +App::$strings["%1\$s's birthday"] = "У %1\$s День рождения"; +App::$strings["Happy Birthday %1\$s"] = "С Днем рождения %1\$s !"; +App::$strings["Cannot locate DNS info for database server '%s'"] = "Не удается найти DNS информацию для сервера базы данных '%s'"; App::$strings["prev"] = "предыдущий"; App::$strings["first"] = "первый"; App::$strings["last"] = "последний"; App::$strings["next"] = "следующий"; -App::$strings["older"] = "старший"; +App::$strings["older"] = "старше"; App::$strings["newer"] = "новее"; App::$strings["No connections"] = "Нет контактов"; -App::$strings["%d Connection"] = array( - 0 => "%d контакт", - 1 => "%d контакта", - 2 => "%d контактов", -); -App::$strings["View Connections"] = "Просмотр контактов"; +App::$strings["Connections"] = "Контакты"; +App::$strings["View all %s connections"] = "Просмотреть все %s контактов"; +App::$strings["Network: %s"] = "Сеть: %s"; App::$strings["Save"] = "Запомнить"; -App::$strings["poke"] = "подпихнуть"; -App::$strings["ping"] = "пинг - проверка связи"; -App::$strings["pinged"] = ""; -App::$strings["prod"] = ""; -App::$strings["prodded"] = ""; -App::$strings["slap"] = ""; -App::$strings["slapped"] = ""; -App::$strings["finger"] = ""; -App::$strings["fingered"] = ""; -App::$strings["rebuff"] = ""; -App::$strings["rebuffed"] = ""; +App::$strings["poke"] = "Ткнуть"; +App::$strings["ping"] = "Пингануть"; +App::$strings["pinged"] = "Отпингован"; +App::$strings["prod"] = "Подтолкнуть"; +App::$strings["prodded"] = "Подтолкнут"; +App::$strings["slap"] = "Шлёпнуть"; +App::$strings["slapped"] = "Шлёпнут"; +App::$strings["finger"] = "Указать"; +App::$strings["fingered"] = "Указан"; +App::$strings["rebuff"] = "Дать отпор"; +App::$strings["rebuffed"] = "Дан отпор"; App::$strings["happy"] = "счастливый"; App::$strings["sad"] = "грустный"; App::$strings["mellow"] = "спокойный"; App::$strings["tired"] = "усталый"; App::$strings["perky"] = "весёлый"; App::$strings["angry"] = "сердитый"; -App::$strings["stupified"] = "отупевший"; -App::$strings["puzzled"] = "недоумённый"; +App::$strings["stupefied"] = "отупевший"; +App::$strings["puzzled"] = "недоумевающий"; App::$strings["interested"] = "заинтересованный"; -App::$strings["bitter"] = "озлобленный"; +App::$strings["bitter"] = "едкий"; App::$strings["cheerful"] = "бодрый"; App::$strings["alive"] = "энергичный"; App::$strings["annoyed"] = "раздражённый"; @@ -571,7 +1143,7 @@ App::$strings["anxious"] = "обеспокоенный"; App::$strings["cranky"] = "капризный"; App::$strings["disturbed"] = "встревоженный"; App::$strings["frustrated"] = "разочарованный"; -App::$strings["depressed"] = ""; +App::$strings["depressed"] = "подавленный"; App::$strings["motivated"] = "мотивированный"; App::$strings["relaxed"] = "расслабленный"; App::$strings["surprised"] = "удивленный"; @@ -594,1272 +1166,2216 @@ App::$strings["September"] = "Сентябрь"; App::$strings["October"] = "Октябрь"; App::$strings["November"] = "Ноябрь"; App::$strings["December"] = "Декабрь"; -App::$strings["unknown.???"] = "неизвестный.???"; -App::$strings["bytes"] = "байт"; -App::$strings["remove category"] = ""; -App::$strings["remove from file"] = ""; -App::$strings["Click to open/close"] = "Нажмите, чтобы открыть/закрыть"; +App::$strings["Unknown Attachment"] = "Неизвестное вложение"; +App::$strings["Size"] = "Размер"; +App::$strings["remove category"] = "удалить категорию"; +App::$strings["remove from file"] = "удалить из файла"; +App::$strings["Download binary/encrypted content"] = "Загрузить двоичное / зашифрованное содержимое"; App::$strings["Link to Source"] = "Ссылка на источник"; -App::$strings["Select a page layout: "] = ""; -App::$strings["default"] = "по умолчанию"; -App::$strings["Page content type: "] = ""; -App::$strings["Select an alternate language"] = "Выбор альтернативного языка"; +App::$strings["Page layout"] = "Шаблон страницы"; +App::$strings["You can create your own with the layouts tool"] = "Вы можете создать свой собственный с помощью инструмента шаблонов"; +App::$strings["BBcode"] = ""; +App::$strings["HTML"] = ""; +App::$strings["Text"] = "Текст"; +App::$strings["Comanche Layout"] = "Шаблон Comanche"; +App::$strings["PHP"] = ""; +App::$strings["Page content type"] = "Тип содержимого страницы"; App::$strings["activity"] = "активность"; -App::$strings["Design"] = "Дизайн"; -App::$strings["Blocks"] = "Блоки"; +App::$strings["a-z, 0-9, -, and _ only"] = "Только a-z, 0-9, -, и _"; +App::$strings["Design Tools"] = "Инструменты дизайна"; +App::$strings["Blocks"] = "Блокировки"; App::$strings["Menus"] = "Меню"; App::$strings["Layouts"] = "Шаблоны"; App::$strings["Pages"] = "Страницы"; -App::$strings["Site Admin"] = "Админ сайта"; -App::$strings["Address Book"] = "Адресная книга"; -App::$strings["Mood"] = "Настроение"; -App::$strings["Probe"] = ""; -App::$strings["Suggest"] = ""; -App::$strings["Update"] = "Обновление"; -App::$strings["Install"] = "Установка"; -App::$strings["Purchase"] = ""; -App::$strings["Unknown"] = "Неизвестный"; -App::$strings["Invalid data packet"] = "Неверный пакет данных"; -App::$strings["Unable to verify channel signature"] = "Невозможно проверить сигнатуру канала"; -App::$strings["Unable to verify site signature for %s"] = ""; -App::$strings["No recipient provided."] = ""; -App::$strings["[no subject]"] = "[без темы]"; -App::$strings["Unable to determine sender."] = "Невозможно определить отправителя."; -App::$strings["Stored post could not be verified."] = ""; -App::$strings["Click here to upgrade."] = "Нажмите здесь, чтобы обновить."; -App::$strings["This action exceeds the limits set by your subscription plan."] = ""; -App::$strings["This action is not available under your subscription plan."] = ""; -App::$strings["System"] = "Система"; -App::$strings["Create Personal App"] = "Создать собственное приложение"; -App::$strings["Edit Personal App"] = "Редактировать собственное приложение"; -App::$strings["Ignore/Hide"] = "Игнорировать / Скрыть"; -App::$strings["Suggestions"] = "Рекомендации"; -App::$strings["See more..."] = "Просмотреть больше..."; -App::$strings["You have %1$.0f of %2$.0f allowed connections."] = ""; -App::$strings["Add New Connection"] = "Добавить новый контакт"; -App::$strings["Enter the channel address"] = "Введите адрес канала"; -App::$strings["Example: bob@example.com, http://example.com/barbara"] = "Пример: bob@example.com, http://example.com/barbara"; -App::$strings["Notes"] = "Заметки"; -App::$strings["Remove term"] = "Удалить термин"; -App::$strings["Archives"] = "Архивы"; -App::$strings["Refresh"] = "Обновить"; -App::$strings["Me"] = "Я"; -App::$strings["Best Friends"] = "Лучшие друзья"; -App::$strings["Co-workers"] = "Сотрудники"; -App::$strings["Former Friends"] = "Приятели"; -App::$strings["Acquaintances"] = "Знакомые"; -App::$strings["Everybody"] = "Все"; -App::$strings["Account settings"] = "Настройки аккаунта"; -App::$strings["Channel settings"] = "Настройки канала"; -App::$strings["Additional features"] = "Дополнительные функции"; -App::$strings["Feature settings"] = "Настройки компонентов"; -App::$strings["Display settings"] = "Настройки отображения"; -App::$strings["Connected apps"] = "Подключенные приложения"; -App::$strings["Export channel"] = "Экспорт канала"; -App::$strings["Automatic Permissions (Advanced)"] = "Автоматические разрешения (дополнительно)"; -App::$strings["Premium Channel Settings"] = "Настройки премиум канала"; -App::$strings["Check Mail"] = "Проверить снова"; -App::$strings["Chat Rooms"] = "Чаты"; -App::$strings["Bookmarked Chatrooms"] = "Закладки чатов"; -App::$strings["Suggested Chatrooms"] = "Рекомендуемые чаты"; -App::$strings["Save to Folder"] = "Сохранить в папку"; -App::$strings["View all"] = "Просмотреть все"; -App::$strings["__ctx:noun__ Dislike"] = array( - 0 => "не-нравится", - 1 => "не-нравится", - 2 => "не-нравится", -); -App::$strings["Add Star"] = "Добавить маркировку"; -App::$strings["Remove Star"] = "Удалить маркировку"; -App::$strings["Toggle Star Status"] = "Переключить статус маркировки"; -App::$strings["starred"] = "помеченные"; -App::$strings["Add Tag"] = "Добавить тег"; -App::$strings["I like this (toggle)"] = "мне это нравится (переключение)"; -App::$strings["I don't like this (toggle)"] = "мне это не нравится (переключение)"; -App::$strings["Share This"] = "Поделиться этим"; -App::$strings["share"] = "поделиться"; -App::$strings["View %s's profile - %s"] = "Просмотр %s's профиля - %s"; -App::$strings["to"] = "к"; -App::$strings["via"] = "через"; -App::$strings["Wall-to-Wall"] = "Стена-к-Стене"; -App::$strings["via Wall-To-Wall:"] = "через Стена-к-Стене:"; -App::$strings["Save Bookmarks"] = "Сохранить закладки"; -App::$strings["Add to Calendar"] = "Добавить в календарь"; -App::$strings["__ctx:noun__ Likes"] = "нравится"; -App::$strings["__ctx:noun__ Dislikes"] = "не-нравится"; -App::$strings["%d comment"] = array( - 0 => "%d комментарий", - 1 => "%d комментария", - 2 => "%d комментариев", +App::$strings["Import"] = "Импортировать"; +App::$strings["Import website..."] = "Импорт веб-сайта..."; +App::$strings["Select folder to import"] = "Выбрать каталог для импорта"; +App::$strings["Import from a zipped folder:"] = "Импортировать из каталога в zip-архиве:"; +App::$strings["Import from cloud files:"] = "Импортировать из сетевых файлов:"; +App::$strings["/cloud/channel/path/to/folder"] = ""; +App::$strings["Enter path to website files"] = "Введите путь к файлам веб-сайта"; +App::$strings["Select folder"] = "Выбрать каталог"; +App::$strings["Export website..."] = "Экспорт веб-сайта..."; +App::$strings["Export to a zip file"] = "Экспортировать в ZIP файл."; +App::$strings["website.zip"] = ""; +App::$strings["Enter a name for the zip file."] = "Введите имя для ZIP файла."; +App::$strings["Export to cloud files"] = "Эскпортировать в сетевые файлы:"; +App::$strings["/path/to/export/folder"] = ""; +App::$strings["Enter a path to a cloud files destination."] = "Введите путь к расположению сетевых файлов."; +App::$strings["Specify folder"] = "Указать каталог"; +App::$strings["Collection"] = "Коллекция"; +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."] = "Не верный токен безопасности для формы. Вероятно, это произошло потому, что форма была открыта слишком долго (> 3-х часов) перед его отправкой."; +App::$strings["Edit"] = "Изменить"; +App::$strings["(Unknown)"] = "(Неизвестный)"; +App::$strings["Visible to anybody on the internet."] = "Виден всем в интернете."; +App::$strings["Visible to you only."] = "Видно только вам."; +App::$strings["Visible to anybody in this network."] = "Видно всем в этой сети."; +App::$strings["Visible to anybody authenticated."] = "Видно всем аутентифицированным."; +App::$strings["Visible to anybody on %s."] = "Видно всем в %s."; +App::$strings["Visible to all connections."] = "Видно всем контактам."; +App::$strings["Visible to approved connections."] = "Видно только одобренным контактам."; +App::$strings["Visible to specific connections."] = "Видно указанным контактам."; +App::$strings["Item not found."] = "Элемент не найден."; +App::$strings["Privacy group not found."] = "Группа безопасности не найдена."; +App::$strings["Privacy group is empty."] = "Группа безопасности пуста"; +App::$strings["Privacy group: %s"] = "Группа безопасности: %s"; +App::$strings["Connection: %s"] = "Контакт: %s"; +App::$strings["Connection not found."] = "Контакт не найден."; +App::$strings["female"] = "женщина"; +App::$strings["%1\$s updated her %2\$s"] = "%1\$s обновила её %2\$s"; +App::$strings["male"] = "мужчина"; +App::$strings["%1\$s updated his %2\$s"] = "%1\$s обновил его %2\$s"; +App::$strings["%1\$s updated their %2\$s"] = "%1\$s обновили их %2\$s"; +App::$strings["profile photo"] = "Фотография профиля"; +App::$strings["[Edited %s]"] = "[Отредактировано %s]"; +App::$strings["__ctx:edit_activity__ Post"] = "Публикация"; +App::$strings["__ctx:edit_activity__ Comment"] = "Комментарий"; +App::$strings["%d invitation available"] = array( + 0 => "доступно %d приглашение", + 1 => "доступны %d приглашения", + 2 => "доступны %d приглашений", ); -App::$strings["[+] show all"] = "[+] показать все"; -App::$strings["This is you"] = "Это вы"; -App::$strings["Comment"] = "Комментарий"; -App::$strings["Submit"] = "Отправить"; -App::$strings["Bold"] = "Жирный"; -App::$strings["Italic"] = "Курсив"; -App::$strings["Underline"] = "Подчеркнутый"; -App::$strings["Quote"] = "Цитата"; -App::$strings["Code"] = "Код"; -App::$strings["Image"] = "Изображение"; -App::$strings["Link"] = "Ссылка"; -App::$strings["Video"] = "Видео"; -App::$strings["Delete this item?"] = "Удалить этот элемент?"; -App::$strings["[-] show less"] = "[-] показать меньше"; -App::$strings["[+] expand"] = "[+] развернуть"; -App::$strings["[-] collapse"] = "[-] свернуть"; -App::$strings["Password too short"] = "Пароль слишком короткий"; -App::$strings["Passwords do not match"] = "Пароли не совпадают"; -App::$strings["everybody"] = "все"; -App::$strings["Secret Passphrase"] = "Тайный пароль"; -App::$strings["Passphrase hint"] = ""; -App::$strings["Notice: Permissions have changed but have not yet been submitted."] = ""; -App::$strings["close all"] = "закрыть все"; -App::$strings["timeago.prefixAgo"] = "timeago.prefixAgo"; -App::$strings["timeago.prefixFromNow"] = "timeago.prefixFromNow"; -App::$strings["ago"] = "тому назад"; -App::$strings["from now"] = "с этого времени"; -App::$strings["less than a minute"] = "менее чем одну минуту назад"; -App::$strings["about a minute"] = "около минуты"; -App::$strings["%d minutes"] = "%d мин."; -App::$strings["about an hour"] = "около часа"; -App::$strings["about %d hours"] = "около %d час."; -App::$strings["a day"] = "день"; -App::$strings["%d days"] = "%d дн."; -App::$strings["about a month"] = "около месяца"; -App::$strings["%d months"] = "%d мес."; -App::$strings["about a year"] = "около года"; -App::$strings["%d years"] = "%d лет"; -App::$strings[" "] = " "; -App::$strings["timeago.numbers"] = "timeago.numbers"; -App::$strings["New window"] = "Новое окно"; -App::$strings["Open the selected location in a different window or browser tab"] = "Откройте выбранное местоположение в другом окне или вкладке браузера"; -App::$strings["Male"] = "Мужской"; -App::$strings["Female"] = "Женский"; +App::$strings["Advanced"] = "Дополнительно"; +App::$strings["Find Channels"] = "Поиск каналов"; +App::$strings["Enter name or interest"] = "Впишите имя или интерес"; +App::$strings["Connect/Follow"] = "Подключить / отслеживать"; +App::$strings["Examples: Robert Morgenstein, Fishing"] = "Примеры: Владимир Ильич, Революционер"; +App::$strings["Find"] = "Поиск"; +App::$strings["Channel Suggestions"] = "Рекомендации каналов"; +App::$strings["Random Profile"] = "Случайный профиль"; +App::$strings["Invite Friends"] = "Пригласить друзей"; +App::$strings["Advanced example: name=fred and country=iceland"] = "Расширенный пример: name=ivan and country=russia"; +App::$strings["Saved Folders"] = "Сохранённые каталоги"; +App::$strings["Everything"] = "Всё"; +App::$strings["Common Connections"] = "Общие контакты"; +App::$strings["View all %d common connections"] = "Просмотреть все %d общих контактов"; +App::$strings["Unable to obtain identity information from database"] = "Невозможно получить идентификационную информацию из базы данных"; +App::$strings["Empty name"] = "Пустое имя"; +App::$strings["Name too long"] = "Слишком длинное имя"; +App::$strings["No account identifier"] = "Идентификатор аккаунта отсутствует"; +App::$strings["Nickname is required."] = "Требуется псевдоним."; +App::$strings["Reserved nickname. Please choose another."] = "Зарезервированый псевдоним. Пожалуйста, выберите другой."; +App::$strings["Nickname has unsupported characters or is already being used on this site."] = "Псевдоним имеет недопустимые символы или уже используется на этом сайте."; +App::$strings["Unable to retrieve created identity"] = "Не удается получить созданный идентификатор"; +App::$strings["Default Profile"] = "Профиль по умолчанию"; +App::$strings["Friends"] = "Друзья"; +App::$strings["Unable to retrieve modified identity"] = "Не удается найти изменённый идентификатор"; +App::$strings["Requested profile is not available."] = "Запрашиваемый профиль не доступен."; +App::$strings["Change profile photo"] = "Изменить фотографию профиля"; +App::$strings["Create New Profile"] = "Создать новый профиль"; +App::$strings["Profile Image"] = "Изображение профиля"; +App::$strings["Visible to everybody"] = "Видно всем"; +App::$strings["Edit visibility"] = "Редактировать видимость"; +App::$strings["Gender:"] = "Пол:"; +App::$strings["Homepage:"] = "Домашняя страница:"; +App::$strings["Online Now"] = "Сейчас в сети"; +App::$strings["Change your profile photo"] = "Изменить фотографию вашего профиля"; +App::$strings["Trans"] = "Трансексуал"; +App::$strings["Neuter"] = "Среднего рода"; +App::$strings["Non-specific"] = "Неспецифический"; +App::$strings["Full Name:"] = "Полное имя:"; +App::$strings["Like this channel"] = "нравится этот канал"; +App::$strings["j F, Y"] = ""; +App::$strings["j F"] = ""; +App::$strings["Birthday:"] = "День рождения:"; +App::$strings["Age:"] = "Возраст:"; +App::$strings["for %1\$d %2\$s"] = "для %1\$d %2\$s"; +App::$strings["Tags:"] = "Теги:"; +App::$strings["Sexual Preference:"] = "Сексуальные предпочтения:"; +App::$strings["Hometown:"] = "Родной город:"; +App::$strings["Political Views:"] = "Политические взгляды:"; +App::$strings["Religion:"] = "Религия:"; +App::$strings["About:"] = "О себе:"; +App::$strings["Hobbies/Interests:"] = "Хобби / интересы:"; +App::$strings["Likes:"] = "Что вам нравится:"; +App::$strings["Dislikes:"] = "Что вам не нравится:"; +App::$strings["Contact information and Social Networks:"] = "Контактная информация и социальные сети:"; +App::$strings["My other channels:"] = "Мои другие каналы:"; +App::$strings["Musical interests:"] = "Музыкальные интересы:"; +App::$strings["Books, literature:"] = "Книги, литература:"; +App::$strings["Television:"] = "Телевидение:"; +App::$strings["Film/dance/culture/entertainment:"] = "Кино / танцы / культура / развлечения:"; +App::$strings["Love/Romance:"] = "Любовь / романтика:"; +App::$strings["Work/employment:"] = "Работа / занятость:"; +App::$strings["School/education:"] = "Школа / образование:"; +App::$strings["Profile"] = "Профиль"; +App::$strings["Like this thing"] = "нравится этo"; +App::$strings["Export"] = "Экспорт"; +App::$strings["cover photo"] = "фотография обложки"; +App::$strings["Enter your channel address (e.g. channel@example.com)"] = "Введите адрес вашего канала (например: channel@example.com)"; +App::$strings["Authenticate"] = "Проверка подлинности"; +App::$strings["Account '%s' deleted"] = "Аккаунт '%s' удален"; +App::$strings["General Features"] = "Главные функции"; +App::$strings["New Member Links"] = "Ссылки для новичков"; +App::$strings["Display new member quick links menu"] = "Показать меню быстрых ссылок для новых участников"; +App::$strings["Advanced Profiles"] = "Расширенные профили"; +App::$strings["Additional profile sections and selections"] = "Дополнительные секции и выборы профиля"; +App::$strings["Profile Import/Export"] = "Импорт / экспорт профиля"; +App::$strings["Save and load profile details across sites/channels"] = "Сохранение и загрузка настроек профиля на всех сайтах / каналах"; +App::$strings["Web Pages"] = "Веб-страницы"; +App::$strings["Provide managed web pages on your channel"] = "Предоставлять управляемые веб-страницы на Вашем канале"; +App::$strings["Provide a wiki for your channel"] = "Предоставьте Wiki для вашего канала"; +App::$strings["Private Notes"] = "Личные заметки"; +App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Включает инструмент для хранения заметок и напоминаний (прим.: не зашифровано)"; +App::$strings["Create personal planning cards"] = "Создать личные карточки планирования"; +App::$strings["Create interactive articles"] = "Создать интерактивные статьи"; +App::$strings["Navigation Channel Select"] = "Выбор канала навигации"; +App::$strings["Change channels directly from within the navigation dropdown menu"] = "Изменить канал напрямую из выпадающего меню"; +App::$strings["Photo Location"] = "Местоположение фотографии"; +App::$strings["If location data is available on uploaded photos, link this to a map."] = "Если данные о местоположении доступны на загруженных фотографий, связать их с картой."; +App::$strings["Access Controlled Chatrooms"] = "Получить доступ к контролируемым чатам"; +App::$strings["Provide chatrooms and chat services with access control."] = "Предоставлять чаты и их службы с контролем доступа."; +App::$strings["Smart Birthdays"] = "\"Умные\" Дни рождений"; +App::$strings["Make birthday events timezone aware in case your friends are scattered across the planet."] = "Сделать уведомления о днях рождения зависимыми от часового пояса в том случае, если ваши друзья разбросаны по планете."; +App::$strings["Event Timezone Selection"] = "Выбор часового пояса события"; +App::$strings["Allow event creation in timezones other than your own."] = "Разрешить создание события в часовой зоне отличной от вашей"; +App::$strings["Premium Channel"] = "Премиум-канал"; +App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Позволяет установить ограничения и условия для подключающихся к вашему каналу"; +App::$strings["Advanced Directory Search"] = "Расширенный поиск в каталоге"; +App::$strings["Allows creation of complex directory search queries"] = "Позволяет создание сложных поисковых запросов в каталоге"; +App::$strings["Advanced Theme and Layout Settings"] = "Расширенный настройки темы и отображения"; +App::$strings["Allows fine tuning of themes and page layouts"] = "Разрешает тонкую настройку тем и шаблонов страниц"; +App::$strings["Access Control and Permissions"] = "Управление доступом и разрешениями"; +App::$strings["Enable management and selection of privacy groups"] = "Включить управление и выбор групп безопасности"; +App::$strings["Multiple Profiles"] = "Несколько профилей"; +App::$strings["Ability to create multiple profiles"] = "Возможность создания нескольких профилей"; +App::$strings["Permission Categories"] = "Категории разрешений"; +App::$strings["Create custom connection permission limits"] = "Создать пользовательские ограничения на доступ к подключению"; +App::$strings["OAuth1 Clients"] = "Клиенты OAuth1"; +App::$strings["Manage OAuth1 authenticatication tokens for mobile and remote apps."] = "Управлять токенами аутентификации OAuth1 для мобильных и удалённых приложений."; +App::$strings["OAuth2 Clients"] = "Клиенты OAuth2"; +App::$strings["Manage OAuth2 authenticatication tokens for mobile and remote apps."] = "Управлять токенами аутентификации OAuth2 для мобильных и удалённых приложений."; +App::$strings["Access Tokens"] = "Токены доступа"; +App::$strings["Create access tokens so that non-members can access private content."] = "Создать токены доступа для доступа к приватному содержимому."; +App::$strings["Post Composition Features"] = "Функции создания публикаций"; +App::$strings["Large Photos"] = "Большие фотографии"; +App::$strings["Include large (1024px) photo thumbnails in posts. If not enabled, use small (640px) photo thumbnails"] = "Включить большие (1024px) миниатюры изображений в публикациях. Если не включено, использовать маленькие (640px) миниатюры."; +App::$strings["Channel Sources"] = "Источники канала"; +App::$strings["Automatically import channel content from other channels or feeds"] = "Автоматический импорт контента из других каналов или лент"; +App::$strings["Even More Encryption"] = "Еще больше шифрования"; +App::$strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Разрешить дополнительное end-to-end шифрование содержимого с общим секретным ключом"; +App::$strings["Enable Voting Tools"] = "Включить инструменты голосования"; +App::$strings["Provide a class of post which others can vote on"] = "Предоставь класс публикаций с возможностью голосования"; +App::$strings["Disable Comments"] = "Отключить комментарии"; +App::$strings["Provide the option to disable comments for a post"] = "Предоставить возможность отключать комментарии для публикаций"; +App::$strings["Delayed Posting"] = "Задержанная публикация"; +App::$strings["Allow posts to be published at a later date"] = "Разрешить размешать публикации следующими датами"; +App::$strings["Content Expiration"] = "Истечение срока действия содержимого"; +App::$strings["Remove posts/comments and/or private messages at a future time"] = "Удалять публикации / комментарии и / или личные сообщения"; +App::$strings["Suppress Duplicate Posts/Comments"] = "Подавлять дублирующие публикации / комментарии"; +App::$strings["Prevent posts with identical content to be published with less than two minutes in between submissions."] = "Предотвращает появление публикаций с одинаковым содержимым если интервал между ними менее 2 минут"; +App::$strings["Auto-save drafts of posts and comments"] = "Автоматически сохранять черновики публикаций и комментариев"; +App::$strings["Automatically saves post and comment drafts in local browser storage to help prevent accidental loss of compositions"] = "Автоматически сохраняет черновики публикаций и комментариев в локальном хранилище браузера для предотвращения их случайной утраты"; +App::$strings["Network and Stream Filtering"] = "Фильтрация сети и потока"; +App::$strings["Search by Date"] = "Поиск по дате"; +App::$strings["Ability to select posts by date ranges"] = "Возможность выбора сообщений по диапазонам дат"; +App::$strings["Saved Searches"] = "Сохранённые поиски"; +App::$strings["Save search terms for re-use"] = "Сохранять результаты поиска для повторного использования"; +App::$strings["Alternate Stream Order"] = "Отображение потока"; +App::$strings["Ability to order the stream by last post date, last comment date or unthreaded activities"] = "Возможность показывать поток по дате последнего сообщения, последнего комментария или в порядке поступления"; +App::$strings["Contact Filter"] = "Фильтр контактов"; +App::$strings["Ability to display only posts of a selected contact"] = "Возможность показа публикаций только от выбранных контактов"; +App::$strings["Forum Filter"] = "Фильтр по форумам"; +App::$strings["Ability to display only posts of a specific forum"] = "Возможность показа публикаций только определённого форума"; +App::$strings["Personal Posts Filter"] = "Персональный фильтр публикаций"; +App::$strings["Ability to display only posts that you've interacted on"] = "Возможность показа только тех публикаций с которыми вы взаимодействовали"; +App::$strings["Affinity Tool"] = "Инструмент сходства / соответствия"; +App::$strings["Filter stream activity by depth of relationships"] = "Фильтровать потоки активности по глубине отношений"; +App::$strings["Suggest Channels"] = "Предлагаемые каналы"; +App::$strings["Show friend and connection suggestions"] = "Показать предложения в друзья"; +App::$strings["Connection Filtering"] = "Фильтрация контактов"; +App::$strings["Filter incoming posts from connections based on keywords/content"] = "Фильтр входящих сообщений от контактов на основе ключевых слов / контента"; +App::$strings["Post/Comment Tools"] = "Инструменты публикаций / комментариев"; +App::$strings["Community Tagging"] = "Отметки сообщества"; +App::$strings["Ability to tag existing posts"] = "Возможность помечать тегами существующие публикации"; +App::$strings["Post Categories"] = "Категории публикаций"; +App::$strings["Add categories to your posts"] = "Добавить категории для ваших публикаций"; +App::$strings["Emoji Reactions"] = "Реакции Emoji"; +App::$strings["Add emoji reaction ability to posts"] = "Возможность добавлять реакции Emoji к публикациям"; +App::$strings["Ability to file posts under folders"] = "Возможность размещать публикации в каталогах"; +App::$strings["Dislike Posts"] = "Не нравящиеся публикации"; +App::$strings["Ability to dislike posts/comments"] = "Возможность отмечать не нравящиеся публикации / комментарии"; +App::$strings["Star Posts"] = "Помечать сообщения"; +App::$strings["Ability to mark special posts with a star indicator"] = "Возможность отметить специальные сообщения индикатором-звёздочкой"; +App::$strings["Tag Cloud"] = "Облако тегов"; +App::$strings["Provide a personal tag cloud on your channel page"] = "Показывает личное облако тегов на странице канала"; +App::$strings["Unable to determine sender."] = "Невозможно определить отправителя."; +App::$strings["No recipient provided."] = "Получатель не предоставлен."; +App::$strings["[no subject]"] = "[без темы]"; +App::$strings["Stored post could not be verified."] = "Сохранённая публикация не может быть проверена."; +App::$strings["Frequently"] = "Часто"; +App::$strings["Hourly"] = "Ежечасно"; +App::$strings["Twice daily"] = "Дважды в день"; +App::$strings["Daily"] = "Ежедневно"; +App::$strings["Weekly"] = "Еженедельно"; +App::$strings["Monthly"] = "Ежемесячно"; App::$strings["Currently Male"] = "В настоящее время мужской"; App::$strings["Currently Female"] = "В настоящее время женский"; App::$strings["Mostly Male"] = "В основном мужской"; App::$strings["Mostly Female"] = "В основном женский"; -App::$strings["Transgender"] = "Транссексуал"; -App::$strings["Intersex"] = "Intersex"; +App::$strings["Transgender"] = "Трансгендер"; +App::$strings["Intersex"] = "Интерсексуал"; App::$strings["Transsexual"] = "Транссексуал"; App::$strings["Hermaphrodite"] = "Гермафродит"; -App::$strings["Neuter"] = "Среднего рода"; -App::$strings["Non-specific"] = "Неспецифический"; -App::$strings["Other"] = "Другой"; -App::$strings["Undecided"] = "Нерешительный"; -App::$strings["Males"] = "Самец"; -App::$strings["Females"] = "Самка"; +App::$strings["Undecided"] = "Не решил"; +App::$strings["Males"] = "Мужчины"; +App::$strings["Females"] = "Женщины"; App::$strings["Gay"] = "Гей"; App::$strings["Lesbian"] = "Лесбиянка"; App::$strings["No Preference"] = "Без предпочтений"; -App::$strings["Bisexual"] = "Двуполый"; -App::$strings["Autosexual"] = "Autosexual"; -App::$strings["Abstinent"] = "Воздержанный"; -App::$strings["Virgin"] = "Девственница"; +App::$strings["Bisexual"] = "Бисексуал"; +App::$strings["Autosexual"] = "Автосексуал"; +App::$strings["Abstinent"] = "Воздержание"; +App::$strings["Virgin"] = "Девственник"; App::$strings["Deviant"] = "Отклоняющийся от нормы"; -App::$strings["Fetish"] = "Фетиш"; +App::$strings["Fetish"] = "Фетишист"; App::$strings["Oodles"] = "Множественный"; -App::$strings["Nonsexual"] = "Несексуальный"; -App::$strings["Single"] = "Одинок"; -App::$strings["Lonely"] = "Уединенный"; -App::$strings["Available"] = "Доступный"; -App::$strings["Unavailable"] = "Недоступный"; -App::$strings["Has crush"] = "Столкновение"; -App::$strings["Infatuated"] = "Влюбленный"; -App::$strings["Dating"] = "Датировка"; +App::$strings["Nonsexual"] = "Асексуал"; +App::$strings["Single"] = "Одиночка"; +App::$strings["Lonely"] = "Одинокий"; +App::$strings["Available"] = "Свободен"; +App::$strings["Unavailable"] = "Занят"; +App::$strings["Has crush"] = "Влюблён"; +App::$strings["Infatuated"] = "без ума"; +App::$strings["Dating"] = "Встречаюсь"; App::$strings["Unfaithful"] = "Неверный"; -App::$strings["Sex Addict"] = "Секс наркоман"; -App::$strings["Friends/Benefits"] = "Друзья / Преимущества"; -App::$strings["Casual"] = "Случайный"; -App::$strings["Engaged"] = "Помолвленный"; -App::$strings["Married"] = "Женат"; -App::$strings["Imaginarily married"] = "Мысленно женат"; -App::$strings["Partners"] = "Партнеры"; +App::$strings["Sex Addict"] = "Эротоман"; +App::$strings["Friends/Benefits"] = "Друзья / Выгоды"; +App::$strings["Casual"] = "Легкомысленный"; +App::$strings["Engaged"] = "Помолвлен"; +App::$strings["Married"] = "В браке"; +App::$strings["Imaginarily married"] = "В воображаемом браке"; +App::$strings["Partners"] = "Партнёрство"; App::$strings["Cohabiting"] = "Сожительствующие"; -App::$strings["Common law"] = ""; -App::$strings["Happy"] = "Счастливый"; +App::$strings["Common law"] = "Гражданский брак"; +App::$strings["Happy"] = "Счастлив"; App::$strings["Not looking"] = "Не нуждаюсь"; -App::$strings["Swinger"] = ""; -App::$strings["Betrayed"] = ""; -App::$strings["Separated"] = ""; -App::$strings["Unstable"] = "Колеблющийся"; -App::$strings["Divorced"] = "Разведенный"; -App::$strings["Imaginarily divorced"] = "Мысленно разведенный"; -App::$strings["Widowed"] = "Овдовевший"; +App::$strings["Swinger"] = "Свингер"; +App::$strings["Betrayed"] = "Предан"; +App::$strings["Separated"] = "Разделён"; +App::$strings["Unstable"] = "Нестабильно"; +App::$strings["Divorced"] = "В разводе"; +App::$strings["Imaginarily divorced"] = "В воображаемом разводе"; +App::$strings["Widowed"] = "Вдовец / вдова"; App::$strings["Uncertain"] = "Неопределенный"; App::$strings["It's complicated"] = "Это сложно"; -App::$strings["Don't care"] = "Не заботьтесь"; +App::$strings["Don't care"] = "Всё равно"; App::$strings["Ask me"] = "Спроси меня"; -App::$strings["Logged out."] = "Вышел из системы."; -App::$strings["Failed authentication"] = "Ошибка аутентификации"; -App::$strings["Login failed."] = "Не удалось войти."; -App::$strings["Permission denied"] = "Доступ запрещен"; -App::$strings["(Unknown)"] = "(Неизвестный)"; -App::$strings["Item not found."] = "Элемент не найден."; -App::$strings["Collection not found."] = "Коллекция не найдена."; -App::$strings["Collection is empty."] = "Коллекция пуста."; -App::$strings["Collection: %s"] = "Коллекции: %s"; -App::$strings["Connection: %s"] = "Контакты: %s"; -App::$strings["Connection not found."] = "Контакт не найден."; -App::$strings["Can view my \"public\" stream and posts"] = "Может просматривать мои \"публичные\" поток и сообщения"; -App::$strings["Can view my \"public\" channel profile"] = "Может просматривать мой \"публичный\" профиль канала"; -App::$strings["Can view my \"public\" photo albums"] = "Может просматривать мои \"публичные\" фотоальбомы"; -App::$strings["Can view my \"public\" address book"] = "Может просматривать мою \"публичную\" адресную книгу"; -App::$strings["Can view my \"public\" file storage"] = "Может просматривать мои \"публичные\" файлы"; -App::$strings["Can view my \"public\" pages"] = "Может просматривать мои \"публичные\" страницы"; -App::$strings["Can send me their channel stream and posts"] = "Может прислать мне свои потоки и сообщения"; -App::$strings["Can post on my channel page (\"wall\")"] = "Может публиковать на моей странице канала (\"стена\")"; -App::$strings["Can comment on my posts"] = "Может комментировать мои сообщения"; +App::$strings["Delete this item?"] = "Удалить этот элемент?"; +App::$strings["Comment"] = "Комментарий"; +App::$strings["%s show all"] = "%s показать всё"; +App::$strings["%s show less"] = "%s показать меньше"; +App::$strings["%s expand"] = "%s развернуть"; +App::$strings["%s collapse"] = "%s свернуть"; +App::$strings["Password too short"] = "Пароль слишком короткий"; +App::$strings["Passwords do not match"] = "Пароли не совпадают"; +App::$strings["everybody"] = "все"; +App::$strings["Secret Passphrase"] = "Тайный пароль"; +App::$strings["Passphrase hint"] = "Подсказка для пароля"; +App::$strings["Notice: Permissions have changed but have not yet been submitted."] = "Уведомление: Права доступа изменились, но до сих пор не сохранены."; +App::$strings["close all"] = "закрыть все"; +App::$strings["Nothing new here"] = "Здесь нет ничего нового"; +App::$strings["Rate This Channel (this is public)"] = "Оценкa этoго канала (общедоступно)"; +App::$strings["Rating"] = "Оценка"; +App::$strings["Describe (optional)"] = "Охарактеризовать (необязательно)"; +App::$strings["Please enter a link URL"] = "Пожалуйста, введите URL ссылки"; +App::$strings["Unsaved changes. Are you sure you wish to leave this page?"] = "Есть несохраненные изменения. Вы уверены, что хотите покинуть эту страницу?"; +App::$strings["Location"] = "Место"; +App::$strings["lovely"] = "прекрасно"; +App::$strings["wonderful"] = "замечательно"; +App::$strings["fantastic"] = "фантастично"; +App::$strings["great"] = "отлично"; +App::$strings["Your chosen nickname was either already taken or not valid. Please use our suggestion ("] = "Выбранный вами псевдоним уже используется или недействителен. Попробуйте использовать наше предложение ("; +App::$strings[") or enter a new one."] = ") или введите новый."; +App::$strings["Thank you, this nickname is valid."] = "Спасибо, этот псевдоним может быть использован."; +App::$strings["A channel name is required."] = "Требуется название канала."; +App::$strings["This is a "] = "Это "; +App::$strings[" channel name"] = " название канала"; +App::$strings["timeago.prefixAgo"] = ""; +App::$strings["timeago.prefixFromNow"] = ""; +App::$strings["timeago.suffixAgo"] = "назад"; +App::$strings["timeago.suffixFromNow"] = ""; +App::$strings["less than a minute"] = "менее чем одну минуту"; +App::$strings["about a minute"] = "около минуты"; +App::$strings["%d minutes"] = "%d минут"; +App::$strings["about an hour"] = "около часа"; +App::$strings["about %d hours"] = "около %d часов"; +App::$strings["a day"] = "день"; +App::$strings["%d days"] = "%d дней"; +App::$strings["about a month"] = "около месяца"; +App::$strings["%d months"] = "%d месяцев"; +App::$strings["about a year"] = "около года"; +App::$strings["%d years"] = "%d лет"; +App::$strings[" "] = " "; +App::$strings["timeago.numbers"] = ""; +App::$strings["__ctx:long__ May"] = "Май"; +App::$strings["Jan"] = "Янв"; +App::$strings["Feb"] = "Фев"; +App::$strings["Mar"] = "Мар"; +App::$strings["Apr"] = "Апр"; +App::$strings["__ctx:short__ May"] = "Май"; +App::$strings["Jun"] = "Июн"; +App::$strings["Jul"] = "Июл"; +App::$strings["Aug"] = "Авг"; +App::$strings["Sep"] = "Сен"; +App::$strings["Oct"] = "Окт"; +App::$strings["Nov"] = "Ноя"; +App::$strings["Dec"] = "Дек"; +App::$strings["Sun"] = "Вск"; +App::$strings["Mon"] = "Пон"; +App::$strings["Tue"] = "Вт"; +App::$strings["Wed"] = "Ср"; +App::$strings["Thu"] = "Чет"; +App::$strings["Fri"] = "Пят"; +App::$strings["Sat"] = "Суб"; +App::$strings["__ctx:calendar__ today"] = "сегодня"; +App::$strings["__ctx:calendar__ month"] = "месяц"; +App::$strings["__ctx:calendar__ week"] = "неделя"; +App::$strings["__ctx:calendar__ day"] = "день"; +App::$strings["__ctx:calendar__ All day"] = "Весь день"; +App::$strings["View PDF"] = "Просмотреть PDF"; +App::$strings[" by "] = " по "; +App::$strings[" on "] = " на "; +App::$strings["Embedded content"] = "Встроенное содержимое"; +App::$strings["Embedding disabled"] = "Встраивание отключено"; +App::$strings["Image exceeds website size limit of %lu bytes"] = "Файл превышает предельный размер для сайта в %lu байт"; +App::$strings["Image file is empty."] = "Файл изображения пуст."; +App::$strings["Unable to process image"] = "Не удается обработать изображение"; +App::$strings["Photo storage failed."] = "Ошибка хранилища фотографий."; +App::$strings["a new photo"] = "новая фотография"; +App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s опубликовал %2\$s в %3\$s"; +App::$strings["Recent Photos"] = "Последние фотографии"; +App::$strings["Upload New Photos"] = "Загрузить новые фотографии"; +App::$strings["New window"] = "Новое окно"; +App::$strings["Open the selected location in a different window or browser tab"] = "Открыть выбранное местоположение в другом окне или вкладке браузера"; +App::$strings["Wiki updated successfully"] = "Wiki успешно обновлена"; +App::$strings["Wiki files deleted successfully"] = "Wiki успешно удалена"; +App::$strings["0. Beginner/Basic"] = "Начинающий / Базовый"; +App::$strings["1. Novice - not skilled but willing to learn"] = "1. Новичок - не опытный, но желающий учиться"; +App::$strings["2. Intermediate - somewhat comfortable"] = "2. Промежуточный - более удобный"; +App::$strings["3. Advanced - very comfortable"] = "3. Продвинутый - очень удобный"; +App::$strings["4. Expert - I can write computer code"] = "4. Эксперт - я умею программировать"; +App::$strings["5. Wizard - I probably know more than you do"] = "5. Волшебник - возможно я знаю больше чем ты"; +App::$strings["Public"] = "Общедоступно"; +App::$strings["Anybody in the \$Projectname network"] = "Любому в сети \$Projectname"; +App::$strings["Any account on %s"] = "Любой аккаунт в %s"; +App::$strings["Any of my connections"] = "Любой из моих контактов"; +App::$strings["Only connections I specifically allow"] = "Только те контакты, кому я дам разрешение"; +App::$strings["Anybody authenticated (could include visitors from other networks)"] = "Любой аутентифицированный (может включать посетителей их других сетей)"; +App::$strings["Any connections including those who haven't yet been approved"] = "Любые контакты включая те, которые вы ещё не одобрили"; +App::$strings["This is your default setting for the audience of your normal stream, and posts."] = "Это настройка по умолчанию для аудитории ваших обычных потоков и публикаций"; +App::$strings["This is your default setting for who can view your default channel profile"] = "Это настройка по умолчанию для тех, кто может просматривать профиль вашего основного канала"; +App::$strings["This is your default setting for who can view your connections"] = "Это настройка по умолчанию для тех, кто может просматривать ваши контакты"; +App::$strings["This is your default setting for who can view your file storage and photos"] = "Это настройка по умолчанию для тех, кто может просматривать ваше хранилище файлов и фотографий"; +App::$strings["This is your default setting for the audience of your webpages"] = "Это настройка по умолчанию для аудитории ваших веб-страниц"; +App::$strings["Admin Delete"] = "Удалено администратором"; +App::$strings["Save to Folder"] = "Сохранить в каталог"; +App::$strings["I will attend"] = "Я буду присутствовать"; +App::$strings["I will not attend"] = "Я не буду присутствовать"; +App::$strings["I might attend"] = "Я возможно буду присутствовать"; +App::$strings["I agree"] = "Я согласен"; +App::$strings["I disagree"] = "Я не согласен"; +App::$strings["I abstain"] = "Я воздержался"; +App::$strings["View all"] = "Просмотреть все"; +App::$strings["Add Tag"] = "Добавить тег"; +App::$strings["I like this (toggle)"] = "мне это нравится (переключение)"; +App::$strings["I don't like this (toggle)"] = "мне это не нравится (переключение)"; +App::$strings["Share This"] = "Поделиться этим"; +App::$strings["share"] = "поделиться"; +App::$strings["Delivery Report"] = "Отчёт о доставке"; +App::$strings["%d comment"] = array( + 0 => "%d комментарий", + 1 => "%d комментария", + 2 => "%d комментариев", +); +App::$strings["View %s's profile - %s"] = "Просмотр %s профиля - %s"; +App::$strings["to"] = "к"; +App::$strings["via"] = "через"; +App::$strings["Wall-to-Wall"] = "Стена-к-Стене"; +App::$strings["via Wall-To-Wall:"] = "через Стена-к-Стене:"; +App::$strings["Attend"] = "Посетить"; +App::$strings["Attendance Options"] = "Параметры посещаемости"; +App::$strings["Vote"] = "Голосовать"; +App::$strings["Voting Options"] = "Параметры голосования"; +App::$strings["Add to Calendar"] = "Добавить в календарь"; +App::$strings["Mark all seen"] = "Отметить как просмотренное"; +App::$strings["__ctx:noun__ Likes"] = "Нравится"; +App::$strings["__ctx:noun__ Dislikes"] = "Не нравится"; +App::$strings["This is you"] = "Это вы"; +App::$strings["Image"] = "Изображение"; +App::$strings["Insert Link"] = "Вставить ссылку"; +App::$strings["Video"] = "Видео"; +App::$strings["Your full name (required)"] = "Ваше полное имя (требуется)"; +App::$strings["Your email address (required)"] = "Ваш адрес электронной почты (требуется)"; +App::$strings["Your website URL (optional)"] = "URL вашего вебсайта (необязательно)"; +App::$strings["Apps"] = "Приложения"; +App::$strings["Site Admin"] = "Администратор сайта"; +App::$strings["View Bookmarks"] = "Просмотреть закадки"; +App::$strings["My Chatrooms"] = "Мои чаты"; +App::$strings["Remote Diagnostics"] = "Удалённая диагностика"; +App::$strings["Activity"] = "Активность"; +App::$strings["Channel Home"] = "Главная канала"; +App::$strings["Directory"] = "Каталог"; +App::$strings["Mail"] = "Переписка"; +App::$strings["Mood"] = "Настроение"; +App::$strings["Chat"] = "Чат"; +App::$strings["Probe"] = "Проба"; +App::$strings["Suggest"] = "Предложить"; +App::$strings["Random Channel"] = "Случайный канал"; +App::$strings["Invite"] = "Пригласить"; +App::$strings["Features"] = "Функции"; +App::$strings["Post"] = "Публикация"; +App::$strings["Update"] = "Обновить"; +App::$strings["Install"] = "Установить"; +App::$strings["Purchase"] = "Купить"; +App::$strings["Undelete"] = "Восстановить"; +App::$strings["Add to app-tray"] = "Добавить в app-tray"; +App::$strings["Remove from app-tray"] = "Удалить из app-tray"; +App::$strings["Pin to navbar"] = "Добавить на панель навигации"; +App::$strings["Unpin from navbar"] = "Удалить с панели навигации"; +App::$strings["\$Projectname Notification"] = "Оповещение \$Projectname "; +App::$strings["Thank You,"] = "Спасибо,"; +App::$strings["This email was sent by %1\$s at %2\$s."] = "Это письмо было отправлено %1\$s на %2\$s."; +App::$strings["To stop receiving these messages, please adjust your Notification Settings at %s"] = "Чтобы прекратить получать эти сообщения, настройте параметры уведомлений в %s"; +App::$strings["To stop receiving these messages, please adjust your %s."] = "Чтобы прекратить получать эти сообщения, пожалуйста измените %s."; +App::$strings["Notification Settings"] = "Настройки уведомлений"; +App::$strings["%s <!item_type!>"] = ""; +App::$strings["[\$Projectname:Notify] New mail received at %s"] = "[\$Projectname:Notify] Получено новое сообщение в %s"; +App::$strings["%1\$s sent you a new private message at %2\$s."] = "%1\$s отправил вам новое личное сообщение в %2\$s."; +App::$strings["%1\$s sent you %2\$s."] = "%1\$s послал вам %2\$s."; +App::$strings["a private message"] = "личное сообщение"; +App::$strings["Please visit %s to view and/or reply to your private messages."] = "Пожалуйста, посетите %s для просмотра и/или ответа на ваши личные сообщения."; +App::$strings["commented on"] = " прокомментировал в"; +App::$strings["liked"] = "понравилось"; +App::$strings["disliked"] = "не понравилось"; +App::$strings["%1\$s %2\$s [zrl=%3\$s]a %4\$s[/zrl]"] = ""; +App::$strings["%1\$s %2\$s [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = ""; +App::$strings["%1\$s %2\$s [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s%2\$s [zrl=%3\$s]ваш %4\$s[/zrl]"; +App::$strings["[\$Projectname:Notify] Moderated Comment to conversation #%1\$d by %2\$s"] = "[\$Projectname:Notify] Отмодерирован комментарий к беседе #%1\$d по %2\$s"; +App::$strings["[\$Projectname:Notify] Comment to conversation #%1\$d by %2\$s"] = "[\$Projectname:Notify] Комментарий к беседе #%1\$d по %2\$s"; +App::$strings["%1\$s commented on an item/conversation you have been following."] = "%1\$s прокомментировал тему / беседу за которым вы следите."; +App::$strings["Please visit %s to view and/or reply to the conversation."] = "Пожалуйста, посетите %s для просмотра и / или ответа в беседе."; +App::$strings["Please visit %s to approve or reject this comment."] = "Пожалуйста посетитет %s для одобрения и отклонения комментария."; +App::$strings["%1\$s liked [zrl=%2\$s]your %3\$s[/zrl]"] = "%1\$s понравился [zrl=%2\$s]ваш %3\$s[/zrl]"; +App::$strings["[\$Projectname:Notify] Like received to conversation #%1\$d by %2\$s"] = "[\$Projectname:Notify] Беседа получила отметку \"нравится\" #%1\$d от %2\$s"; +App::$strings["%1\$s liked an item/conversation you created."] = "%1\$s нравится тема / беседа которую вы создали."; +App::$strings["[\$Projectname:Notify] %s posted to your profile wall"] = "[\$Projectname:Notify] %s сделал публикацию на стене вашего профиля"; +App::$strings["%1\$s posted to your profile wall at %2\$s"] = "%1\$s сделал публикацию на стене вашего профиля в %2\$s"; +App::$strings["%1\$s posted to [zrl=%2\$s]your wall[/zrl]"] = "%1\$s опубликовал на [zrl=%2\$s]вашей стене[/zrl]"; +App::$strings["[\$Projectname:Notify] %s tagged you"] = "[\$Projectname:Notify] %s отметил вас"; +App::$strings["%1\$s tagged you at %2\$s"] = "%1\$s отметил вас в %2\$s"; +App::$strings["%1\$s [zrl=%2\$s]tagged you[/zrl]."] = "%1\$s [zrl=%2\$s]отметил вас[/zrl]."; +App::$strings["[\$Projectname:Notify] %1\$s poked you"] = "[\$Projectname:Notify] %1\$s ткнул вас"; +App::$strings["%1\$s poked you at %2\$s"] = "%1\$s ткнул вас в %2\$s"; +App::$strings["%1\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s [zrl=%2\$s]ткнул вас[/zrl]."; +App::$strings["[\$Projectname:Notify] %s tagged your post"] = "[\$Projectname:Notify] %s отметил вашу публикацию"; +App::$strings["%1\$s tagged your post at %2\$s"] = "%1\$s отметил вашу публикацию на %2\$s"; +App::$strings["%1\$s tagged [zrl=%2\$s]your post[/zrl]"] = "%1\$s отметил [zrl=%2\$s]вашу публикацию[/zrl]"; +App::$strings["[\$Projectname:Notify] Introduction received"] = "[\$Projectname:Notify] Получено приглашение"; +App::$strings["You've received an new connection request from '%1\$s' at %2\$s"] = "Вы получили новый запрос контакта от '%1\$s' в %2\$s"; +App::$strings["You've received [zrl=%1\$s]a new connection request[/zrl] from %2\$s."] = "Вы получили [zrl=%1\$s]новый запрос контакта[/zrl] от %2\$s."; +App::$strings["You may visit their profile at %s"] = "Вы можете увидеть его профиль по ссылке %s"; +App::$strings["Please visit %s to approve or reject the connection request."] = "Пожалуйста, посетите %s, чтобы одобрить или отклонить запрос контакта."; +App::$strings["[\$Projectname:Notify] Friend suggestion received"] = "[\$Projectname:Notify] Получено предложение дружить"; +App::$strings["You've received a friend suggestion from '%1\$s' at %2\$s"] = "Вы получили предложение дружить от '%1\$s' в %2\$s"; +App::$strings["You've received [zrl=%1\$s]a friend suggestion[/zrl] for %2\$s from %3\$s."] = "Вы получили [zrl=%1\$s]предложение дружить[/zrl] для %2\$s от %3\$s."; +App::$strings["Name:"] = "Имя:"; +App::$strings["Photo:"] = "Фото:"; +App::$strings["Please visit %s to approve or reject the suggestion."] = "Пожалуйста, посетите %s, чтобы одобрить или отклонить предложение."; +App::$strings["[\$Projectname:Notify]"] = "[\$Projectname:Уведомление]"; +App::$strings["created a new post"] = "создал новую публикацию"; +App::$strings["commented on %s's post"] = "прокомментировал публикацию %s"; +App::$strings["edited a post dated %s"] = "отредактировал публикацию датированную %s"; +App::$strings["edited a comment dated %s"] = "отредактировал комментарий датированный %s"; +App::$strings["(No Title)"] = "(нет заголовка)"; +App::$strings["Wiki page create failed."] = "Не удалось создать страницу Wiki."; +App::$strings["Wiki not found."] = "Wiki не найдена."; +App::$strings["Destination name already exists"] = "Имя назначения уже существует"; +App::$strings["Page not found"] = "Страница не найдена."; +App::$strings["Error reading page content"] = "Ошибка чтения содержимого страницы"; +App::$strings["Error reading wiki"] = "Ошибка чтения Wiki"; +App::$strings["Page update failed."] = "Не удалось обновить страницу."; +App::$strings["Nothing deleted"] = "Ничего не удалено"; +App::$strings["Compare: object not found."] = "Сравнение: объект не найден."; +App::$strings["Page updated"] = "Страница обновлена"; +App::$strings["Untitled"] = "Не озаглавлено"; +App::$strings["Wiki resource_id required for git commit"] = "Требуется resource_id Wiki для отправки в Git"; +App::$strings["__ctx:wiki_history__ Message"] = "Сообщение"; +App::$strings["__ctx:permcat__ default"] = "по умолчанию"; +App::$strings["__ctx:permcat__ follower"] = "поклонник"; +App::$strings["__ctx:permcat__ contributor"] = "участник"; +App::$strings["__ctx:permcat__ publisher"] = "издатель"; +App::$strings["Update Error at %s"] = "Ошибка обновления на %s"; +App::$strings["Update %s failed. See error logs."] = "Выполнение %s неудачно. Проверьте системный журнал."; +App::$strings["Missing room name"] = "Отсутствует название комнаты"; +App::$strings["Duplicate room name"] = "Название комнаты дублируется"; +App::$strings["Invalid room specifier."] = "Неверный указатель комнаты."; +App::$strings["Room not found."] = "Комната не найдена."; +App::$strings["Room is full"] = "Комната переполнена"; +App::$strings["Commented Date"] = "По комментариям"; +App::$strings["Order by last commented date"] = "Сортировка по дате последнего комментария"; +App::$strings["Posted Date"] = "По публикациям"; +App::$strings["Order by last posted date"] = "Сортировка по дате последней публикации"; +App::$strings["Date Unthreaded"] = "По порядку"; +App::$strings["Order unthreaded by date"] = "Сортировка в порядке поступления"; +App::$strings["Activity Order"] = "Сортировка активности"; +App::$strings["Site"] = "Сайт"; +App::$strings["Accounts"] = "Учётные записи"; +App::$strings["Member registrations waiting for confirmation"] = "Регистрации участников, ожидающие подверждения"; +App::$strings["Channels"] = "Каналы"; +App::$strings["Security"] = "Безопасность"; +App::$strings["Addons"] = "Расширения"; +App::$strings["Themes"] = "Темы"; +App::$strings["Inspect queue"] = "Просмотр очереди"; +App::$strings["Profile Fields"] = "Поля профиля"; +App::$strings["DB updates"] = "Обновление базы данных"; +App::$strings["Logs"] = "Журналы"; +App::$strings["Addon Features"] = "Настройки расширений"; +App::$strings["Tasks"] = "Задачи"; +App::$strings["Ignore/Hide"] = "Игнорировать / cкрыть"; +App::$strings["Suggestions"] = "Рекомендации"; +App::$strings["See more..."] = "Просмотреть больше..."; +App::$strings["Received Messages"] = "Полученные сообщения"; +App::$strings["Sent Messages"] = "Отправленные сообщения"; +App::$strings["Conversations"] = "Беседы"; +App::$strings["No messages."] = "Сообщений нет."; +App::$strings["Delete conversation"] = "Удалить беседу"; +App::$strings["Select Channel"] = "Выбрать канал"; +App::$strings["Read-write"] = "Чтение-запись"; +App::$strings["Read-only"] = "Только чтение"; +App::$strings["My Calendars"] = "Мои календари"; +App::$strings["Shared Calendars"] = "Общие календари"; +App::$strings["Share this calendar"] = "Поделиться этим календарём"; +App::$strings["Calendar name and color"] = "Имя и цвет календаря"; +App::$strings["Create new calendar"] = "Создать новый календарь"; +App::$strings["Create"] = "Создать"; +App::$strings["Calendar Name"] = "Имя календаря"; +App::$strings["Calendar Tools"] = "Инструменты календаря"; +App::$strings["Import calendar"] = "Импортировать календарь"; +App::$strings["Select a calendar to import to"] = "Выбрать календарь для импорта в"; +App::$strings["Upload"] = "Загрузка"; +App::$strings["Addressbooks"] = "Адресные книги"; +App::$strings["Addressbook name"] = "Имя адресной книги"; +App::$strings["Create new addressbook"] = "Создать новую адресную книгу"; +App::$strings["Addressbook Name"] = "Имя адресной книги"; +App::$strings["Addressbook Tools"] = "Инструменты адресной книги"; +App::$strings["Import addressbook"] = "Импортировать адресную книгу"; +App::$strings["Select an addressbook to import to"] = "Выбрать адресную книгу для импорта в"; +App::$strings["__ctx:widget__ Activity"] = "Активность"; +App::$strings["HQ Control Panel"] = "Панель управления HQ"; +App::$strings["Create a new post"] = "Создать новую публикацию"; +App::$strings["Add new page"] = "Добавить новую страницу"; +App::$strings["Options"] = "Параметры"; +App::$strings["Wiki Pages"] = "Wiki страницы"; +App::$strings["Page name"] = "Название страницы"; +App::$strings["Private Mail Menu"] = "Меню личной переписки"; +App::$strings["Combined View"] = "Комбинированный вид"; +App::$strings["Inbox"] = "Входящие"; +App::$strings["Outbox"] = "Исходящие"; +App::$strings["New Message"] = "Новое сообщение"; +App::$strings["photo/image"] = "фотография / изображение"; +App::$strings["Archives"] = "Архивы"; +App::$strings["Events Tools"] = "Инструменты для событий"; +App::$strings["Export Calendar"] = "Экспортировать календарь"; +App::$strings["Import Calendar"] = "Импортировать календарь"; +App::$strings["Wiki List"] = "Список Wiki"; +App::$strings["Account settings"] = "Настройки аккаунта"; +App::$strings["Channel settings"] = "Выбор канала"; +App::$strings["Additional features"] = "Дополнительные функции"; +App::$strings["Addon settings"] = "Настройки расширений"; +App::$strings["Display settings"] = "Настройки отображения"; +App::$strings["Manage locations"] = "Управление местоположением"; +App::$strings["Export channel"] = "Экспортировать канал"; +App::$strings["OAuth1 apps"] = "Приложения OAuth1"; +App::$strings["OAuth2 apps"] = "Приложения OAuth2"; +App::$strings["Guest Access Tokens"] = "Токен гостевого доступа"; +App::$strings["Connection Default Permissions"] = "Разрешения по умолчанию для контакта"; +App::$strings["Premium Channel Settings"] = "Настройки премиум-канала"; +App::$strings["View Photo"] = "Посмотреть фотографию"; +App::$strings["Edit Album"] = "Редактировать Фотоальбом"; +App::$strings["Public Hubs"] = "Публичные хабы"; +App::$strings["Notes"] = "Заметки"; +App::$strings["Overview"] = "Обзор"; +App::$strings["App Collections"] = "Коллекции приложений"; +App::$strings["Available Apps"] = "Доступные приложения"; +App::$strings["Installed apps"] = "Установленные приложения"; +App::$strings["Bookmarked Chatrooms"] = "Закладки чатов"; +App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "У вас есть %1$.0f из %2$.0f разрешенных контактов."; +App::$strings["Add New Connection"] = "Добавить новый контакт"; +App::$strings["Enter channel address"] = "Введите адрес канала"; +App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Пример: ivan@example.com, http://example.com/ivan"; +App::$strings["Chat Members"] = "Участники чата"; +App::$strings["Suggested Chatrooms"] = "Рекомендуемые чаты"; +App::$strings["Rating Tools"] = "Инструменты оценки"; +App::$strings["Rate Me"] = "Оценить меня"; +App::$strings["View Ratings"] = "Просмотр оценок"; +App::$strings["Remove term"] = "Удалить термин"; +App::$strings["Me"] = "Я"; +App::$strings["Family"] = "Семья"; +App::$strings["Acquaintances"] = "Знакомые"; +App::$strings["All"] = "Все"; +App::$strings["Refresh"] = "Обновить"; +App::$strings["Personal Posts"] = "Личные публикации"; +App::$strings["Show posts that mention or involve me"] = "Показывать публикации где вы были упомянуты или привлечены"; +App::$strings["Starred Posts"] = "Отмеченные публикации"; +App::$strings["Show posts that I have starred"] = "Показывать публикации которые я отметил"; +App::$strings["Show posts related to the %s privacy group"] = "Показывать публикации относящиеся к группе безопасности %s"; +App::$strings["Show my privacy groups"] = "Показывать мои группы безопасности"; +App::$strings["Show posts to this forum"] = "Показывать публикации этого форума"; +App::$strings["Forums"] = "Форумы"; +App::$strings["Show forums"] = "Показывать форумы"; +App::$strings["Show posts that I have filed to %s"] = "Показывать публикации которые я добавил в %s"; +App::$strings["Show filed post categories"] = "Показывать категории добавленных публикаций"; +App::$strings["Panel search"] = "Панель поиска"; +App::$strings["Filter by name"] = "Отфильтровать по имени"; +App::$strings["Remove active filter"] = "Удалить активный фильтр"; +App::$strings["Activity Filters"] = "Фильтры активности"; +App::$strings["Click to show more"] = "Нажмите чтобы показать больше"; +App::$strings["New Network Activity"] = "Новая сетевая активность"; +App::$strings["New Network Activity Notifications"] = "Новые уведомления о сетевой активности"; +App::$strings["View your network activity"] = "Просмотреть вашу сетевую активность"; +App::$strings["Mark all notifications read"] = "Пометить уведомления как прочитанные"; +App::$strings["Show new posts only"] = "Показывать только новые публикации"; +App::$strings["New Home Activity"] = "Новая локальная активность"; +App::$strings["New Home Activity Notifications"] = "Новые уведомления локальной активности"; +App::$strings["View your home activity"] = "Просмотреть локальную активность"; +App::$strings["Mark all notifications seen"] = "Пометить уведомления как просмотренные"; +App::$strings["New Mails"] = "Новая переписка"; +App::$strings["New Mails Notifications"] = "Уведомления о новой переписке"; +App::$strings["View your private mails"] = "Просмотреть вашу личную переписку"; +App::$strings["Mark all messages seen"] = "Пометить сообщения как просмотренные"; +App::$strings["New Events"] = "Новые события"; +App::$strings["New Events Notifications"] = "Уведомления о новых событиях"; +App::$strings["View events"] = "Просмотреть события"; +App::$strings["Mark all events seen"] = "Пометить все события как просмотренные"; +App::$strings["New Connections"] = "Новые контакты"; +App::$strings["New Connections Notifications"] = "Уведомления о новых контактах"; +App::$strings["View all connections"] = "Просмотр всех контактов"; +App::$strings["New Files"] = "Новые файлы"; +App::$strings["New Files Notifications"] = "Уведомления о новых файлах"; +App::$strings["Notices"] = "Оповещения"; +App::$strings["View all notices"] = "Просмотреть все оповещения"; +App::$strings["Mark all notices seen"] = "Пометить все оповещения как просмотренные"; +App::$strings["New Registrations"] = "Новые регистрации"; +App::$strings["New Registrations Notifications"] = "Уведомления о новых регистрациях"; +App::$strings["Public Stream"] = "Публичный поток"; +App::$strings["Public Stream Notifications"] = "Уведомления публичного потока"; +App::$strings["View the public stream"] = "Просмотреть публичный поток"; +App::$strings["Sorry, you have got no notifications at the moment"] = "Извините, но сейчас у вас нет уведомлений"; +App::$strings["Profile Creation"] = "Создание профиля"; +App::$strings["Upload profile photo"] = "Загрузить фотографию профиля"; +App::$strings["Upload cover photo"] = "Загрузить фотографию обложки"; +App::$strings["Find and Connect with others"] = "Найти и вступить в контакт"; +App::$strings["View the directory"] = "Просмотреть каталог"; +App::$strings["View friend suggestions"] = "Просмотр рекомендуемых друзей"; +App::$strings["Manage your connections"] = "Управлять вашими контактами"; +App::$strings["Communicate"] = "Связаться"; +App::$strings["View your channel homepage"] = "Домашняя страница канала"; +App::$strings["View your network stream"] = "Просмотреть ваш сетевой поток"; +App::$strings["Documentation"] = "Документация"; +App::$strings["View public stream"] = "Просмотреть публичный поток"; +App::$strings["Social Networking"] = "Социальная Сеть"; +App::$strings["Social - Federation"] = "Социальная - Федерация"; +App::$strings["Social - Mostly Public"] = "Социальная - В основном общественный"; +App::$strings["Social - Restricted"] = "Социальная - Ограниченный"; +App::$strings["Social - Private"] = "Социальная - Частный"; +App::$strings["Community Forum"] = "Форум сообщества"; +App::$strings["Forum - Mostly Public"] = "Форум - В основном общественный"; +App::$strings["Forum - Restricted"] = "Форум - Ограниченный"; +App::$strings["Forum - Private"] = "Форум - Частный"; +App::$strings["Feed Republish"] = "Публиковать ленты новостей"; +App::$strings["Feed - Mostly Public"] = "Ленты новостей - В основном общественный"; +App::$strings["Feed - Restricted"] = "Ленты новостей - Ограниченный"; +App::$strings["Special Purpose"] = "Спец. назначение"; +App::$strings["Special - Celebrity/Soapbox"] = "Спец. назначение - Знаменитость/Soapbox"; +App::$strings["Special - Group Repository"] = "Спец. назначение - Групповой репозиторий"; +App::$strings["Custom/Expert Mode"] = "Экспертный режим"; +App::$strings["Can view my channel stream and posts"] = "Может просматривать мою ленту и сообщения"; +App::$strings["Can send me their channel stream and posts"] = "Может присылать мне свои потоки и сообщения"; +App::$strings["Can view my default channel profile"] = "Может просматривать мой стандартный профиль канала"; +App::$strings["Can view my connections"] = "Может просматривать мои контакты"; +App::$strings["Can view my file storage and photos"] = "Может просматривать мое хранилище файлов"; +App::$strings["Can upload/modify my file storage and photos"] = "Может загружать/изменять мои файлы и фотографии в хранилище"; +App::$strings["Can view my channel webpages"] = "Может просматривать мои веб-страницы"; +App::$strings["Can view my wiki pages"] = "Может просматривать мои вики-страницы"; +App::$strings["Can create/edit my channel webpages"] = "Может редактировать мои веб-страницы"; +App::$strings["Can write to my wiki pages"] = "Может редактировать мои вики-страницы"; +App::$strings["Can post on my channel (wall) page"] = "Может публиковать на моей странице канала"; +App::$strings["Can comment on or like my posts"] = "Может прокомментировать или отмечать как понравившиеся мои посты"; App::$strings["Can send me private mail messages"] = "Может отправлять мне личные сообщения по эл. почте"; -App::$strings["Can post photos to my photo albums"] = "Может публиковать фотографии в мои фотоальбомы"; -App::$strings["Can forward to all my channel contacts via post @mentions"] = ""; -App::$strings["Advanced - useful for creating group forum channels"] = ""; -App::$strings["Can chat with me (when available)"] = "Можете общаться со мной в чате (при наличии)"; -App::$strings["Can write to my \"public\" file storage"] = "Может писать в моё \"публичное\" хранилище файлов"; -App::$strings["Can edit my \"public\" pages"] = "Может редактировать мои \"публичные\" страницы"; -App::$strings["Can source my \"public\" posts in derived channels"] = ""; -App::$strings["Somewhat advanced - very useful in open communities"] = ""; -App::$strings["Can administer my channel resources"] = "Может администрировать мои ресурсы канала"; -App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = ""; -App::$strings["Set your current mood and tell your friends"] = ""; -App::$strings["Menu not found."] = "Меню не найдено."; -App::$strings["Menu element updated."] = "Меню обновлено."; -App::$strings["Unable to update menu element."] = ""; -App::$strings["Menu element added."] = "Элемент меню добавлен."; -App::$strings["Unable to add menu element."] = "Невозможно добавить элемент меню."; -App::$strings["Not found."] = "Не найдено."; -App::$strings["Manage Menu Elements"] = "Управление элементов меню"; -App::$strings["Edit menu"] = "Редактировать меню"; -App::$strings["Edit element"] = "Редактировать элемент"; -App::$strings["Drop element"] = "Удалить элемент"; -App::$strings["New element"] = "Новый элемент"; -App::$strings["Edit this menu container"] = ""; -App::$strings["Add menu element"] = "Добавить элемент меню"; -App::$strings["Delete this menu item"] = "Удалить элемент меню"; -App::$strings["Edit this menu item"] = "Редактировать элемент меню"; -App::$strings["New Menu Element"] = "Новый элемент меню"; -App::$strings["Menu Item Permissions"] = ""; -App::$strings["(click to open/close)"] = "(нажмите, чтобы открыть / закрыть)"; -App::$strings["Link text"] = "Текст ссылки"; -App::$strings["URL of link"] = "URL ссылки"; -App::$strings["Use Red magic-auth if available"] = ""; -App::$strings["Open link in new window"] = "Открыть ссылку в новом окне"; -App::$strings["Order in list"] = ""; -App::$strings["Higher numbers will sink to bottom of listing"] = ""; -App::$strings["Menu item not found."] = "Элемент меню не найден."; -App::$strings["Menu item deleted."] = "Элемент меню удален."; -App::$strings["Menu item could not be deleted."] = ""; -App::$strings["Edit Menu Element"] = "Редактировать элемент меню"; -App::$strings["Modify"] = "Изменить"; -App::$strings["sent you a private message"] = "отправил вам личное сообщение"; -App::$strings["added your channel"] = "добавил ваш канал"; -App::$strings["posted an event"] = ""; +App::$strings["Can like/dislike profiles and profile things"] = "Может комментировать или отмечать как нравится/ненравится мой профиль"; +App::$strings["Can forward to all my channel connections via ! mentions in posts"] = "Может пересылать всем подписчикам моего канала используя ! в публикациях"; +App::$strings["Can chat with me"] = "Может общаться со мной в чате"; +App::$strings["Can source my public posts in derived channels"] = "Может использовать мои публичные сообщения в клонированных лентах сообщений"; +App::$strings["Can administer my channel"] = "Может администрировать мой канал"; +App::$strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Удалённая аутентификация заблокирована. Вы вошли на этот сайт локально. Пожалуйста, выйдите и попробуйте ещё раз."; +App::$strings["App installed."] = "Приложение установлено."; +App::$strings["Malformed app."] = "Неработающее приложение."; +App::$strings["Embed code"] = "Встроить код"; +App::$strings["Edit App"] = "Редактировать приложение"; +App::$strings["Create App"] = "Создать приложение"; +App::$strings["Name of app"] = "Наименование приложения"; +App::$strings["Location (URL) of app"] = "Местоположение (URL) приложения"; +App::$strings["Photo icon URL"] = "URL пиктограммы"; +App::$strings["80 x 80 pixels - optional"] = "80 x 80 пикселей - необязательно"; +App::$strings["Categories (optional, comma separated list)"] = "Категории (необязательно, список через запятую)"; +App::$strings["Version ID"] = "ID версии"; +App::$strings["Price of app"] = "Цена приложения"; +App::$strings["Location (URL) to purchase app"] = "Ссылка (URL) для покупки приложения"; App::$strings["network"] = "сеть"; -App::$strings["Name is required"] = "Необходимо имя"; -App::$strings["Key and Secret are required"] = ""; -App::$strings["Passwords do not match. Password unchanged."] = "Пароли не совпадают. Пароль не изменён."; -App::$strings["Empty passwords are not allowed. Password unchanged."] = "Пустые пароли не допускаются. Пароль не изменён."; -App::$strings["Password changed."] = "Пароль изменен."; -App::$strings["Password update failed. Please try again."] = "Изменение пароля закончилось неуспешно. Пожалуйста, попробуйте еще раз."; -App::$strings["Not valid email."] = "Не действительный адрес электронной почты."; -App::$strings["Protected email address. Cannot change to that email."] = "Защищенный адрес электронной почты. Нельзя изменить."; -App::$strings["System failure storing new email. Please try again."] = ""; -App::$strings["Settings updated."] = "Настройки обновленны."; -App::$strings["Add application"] = "Добавить приложения"; -App::$strings["Name"] = "Имя"; -App::$strings["Name of application"] = "Название приложения"; -App::$strings["Consumer Key"] = "Ключ клиента"; -App::$strings["Automatically generated - change if desired. Max length 20"] = ""; -App::$strings["Consumer Secret"] = "Секрет клиента"; -App::$strings["Redirect"] = "Перенаправление"; -App::$strings["Redirect URI - leave blank unless your application specifically requires this"] = ""; -App::$strings["Icon url"] = "URL-адрес значка"; -App::$strings["Optional"] = "Необязательно"; -App::$strings["You can't edit this application."] = "Вы не можете редактировать это приложение."; -App::$strings["Connected Apps"] = "Подключенные приложения"; -App::$strings["Client key starts with"] = ""; -App::$strings["No name"] = "Без названия"; -App::$strings["Remove authorization"] = "Удалить разрешение"; -App::$strings["No feature settings configured"] = "Параметры функций не настроены"; -App::$strings["Feature Settings"] = "Настройки функции"; -App::$strings["Account Settings"] = "Настройки аккаунта"; -App::$strings["Password Settings"] = "Настройки пароля"; -App::$strings["New Password:"] = "Новый пароль:"; -App::$strings["Confirm:"] = "Подтверждение:"; -App::$strings["Leave password fields blank unless changing"] = "Оставьте поля пустыми, если не меняется"; -App::$strings["Email Address:"] = "Адрес электронной почты:"; -App::$strings["Remove Account"] = "Удалить аккаунт"; -App::$strings["Warning: This action is permanent and cannot be reversed."] = ""; -App::$strings["Off"] = "Выкл."; -App::$strings["On"] = "Вкл."; -App::$strings["Additional Features"] = "Дополнительные функции"; -App::$strings["Connector Settings"] = "Настройки соединителя"; -App::$strings["No special theme for mobile devices"] = "Нет специальной темы для мобильных устройств"; -App::$strings["%s - (Experimental)"] = "%s - (экспериментальный)"; -App::$strings["Display Settings"] = "Настройки отображения"; -App::$strings["Display Theme:"] = "Тема отображения:"; -App::$strings["Mobile Theme:"] = "Мобильная тема отображения:"; -App::$strings["Update browser every xx seconds"] = "Обновление браузера каждые ХХ секунд"; -App::$strings["Minimum of 10 seconds, no maximum"] = "Минимум 10 секунд, без максимума"; -App::$strings["Maximum number of conversations to load at any time:"] = ""; -App::$strings["Maximum of 100 items"] = "Максимум 100 элементов"; -App::$strings["Don't show emoticons"] = "Не показывать emoticons"; -App::$strings["System Page Layout Editor - (advanced)"] = ""; -App::$strings["Nobody except yourself"] = "Никто, кроме вас"; -App::$strings["Only those you specifically allow"] = "Только комы вы разрешили"; -App::$strings["Approved connections"] = "Утвержденные контакты"; -App::$strings["Any connections"] = "Все контакты"; -App::$strings["Anybody on this website"] = "Любой на этом веб-сайте"; -App::$strings["Anybody in this network"] = "Любой в этой сети"; -App::$strings["Anybody authenticated"] = ""; -App::$strings["Anybody on the internet"] = "Любой в интернете"; -App::$strings["Publish your default profile in the network directory"] = "Публикация вашего профиля по умолчанию в каталоге сети"; -App::$strings["No"] = "Нет"; -App::$strings["Yes"] = "Да"; -App::$strings["Allow us to suggest you as a potential friend to new members?"] = ""; -App::$strings["or"] = "или"; -App::$strings["Your channel address is"] = "Адрес канала:"; -App::$strings["Channel Settings"] = "Настройки канала"; -App::$strings["Basic Settings"] = "Основные настройки"; -App::$strings["Your Timezone:"] = "Часовой пояс:"; -App::$strings["Default Post Location:"] = "Откуда по умолчанию:"; -App::$strings["Geographical location to display on your posts"] = ""; -App::$strings["Use Browser Location:"] = "Использовать указание браузерa:"; -App::$strings["Adult Content"] = "Содержимое для взрослых"; -App::$strings["This channel frequently or regularly publishes adult content. (Please tag any adult material and/or nudity with #NSFW)"] = ""; -App::$strings["Security and Privacy Settings"] = "Параметры безопасности и конфиденциальности"; -App::$strings["Hide my online presence"] = "Скрыть мое присутствие"; -App::$strings["Prevents displaying in your profile that you are online"] = "Предотвращает показ в вашем профиле, что вы онлайн"; -App::$strings["Simple Privacy Settings:"] = "Быстрые настройки:"; -App::$strings["Very Public - <em>extremely permissive (should be used with caution)</em>"] = ""; -App::$strings["Typical - <em>default public, privacy when desired (similar to social network permissions but with improved privacy)</em>"] = ""; -App::$strings["Private - <em>default private, never open or public</em>"] = ""; -App::$strings["Blocked - <em>default blocked to/from everybody</em>"] = ""; -App::$strings["Allow others to tag your posts"] = "Разрешить другим помечать сообщения"; -App::$strings["Often used by the community to retro-actively flag inappropriate content"] = ""; -App::$strings["Advanced Privacy Settings"] = "Дополнительные настройки"; -App::$strings["Expire other channel content after this many days"] = ""; -App::$strings["0 or blank prevents expiration"] = ""; -App::$strings["Maximum Friend Requests/Day:"] = ""; -App::$strings["May reduce spam activity"] = "Может уменьшить активность спам"; -App::$strings["Default Post Permissions"] = "Настройки по умолчанию"; -App::$strings["Maximum private messages per day from unknown people:"] = "Максимальное количество личных сообщений от незнакомых людей:"; -App::$strings["Useful to reduce spamming"] = "Полезно для уменьшения активности спам"; -App::$strings["Notification Settings"] = "Настройки уведомлений"; -App::$strings["By default post a status message when:"] = ""; -App::$strings["accepting a friend request"] = ""; -App::$strings["joining a forum/community"] = ""; -App::$strings["making an <em>interesting</em> profile change"] = ""; -App::$strings["Send a notification email when:"] = "Отправить уведомление по электронной почте, если:"; -App::$strings["You receive a connection request"] = ""; -App::$strings["Your connections are confirmed"] = ""; -App::$strings["Someone writes on your profile wall"] = ""; -App::$strings["Someone writes a followup comment"] = ""; -App::$strings["You receive a private message"] = "Вы получили личное сообщение"; -App::$strings["You receive a friend suggestion"] = "Вы получили предложение дружить"; -App::$strings["You are tagged in a post"] = ""; -App::$strings["You are poked/prodded/etc. in a post"] = ""; -App::$strings["Advanced Account/Page Type Settings"] = ""; -App::$strings["Change the behaviour of this account for special situations"] = ""; -App::$strings["Please enable expert mode (in <a href=\"settings/features\">Settings > Additional features</a>) to adjust!"] = ""; -App::$strings["Miscellaneous Settings"] = "Дополнительные настройки"; -App::$strings["Personal menu to display in your channel pages"] = ""; -App::$strings["Poke/Prod"] = ""; -App::$strings["poke, prod or do other things to somebody"] = ""; -App::$strings["Recipient"] = "Получатель"; -App::$strings["Choose what you wish to do to recipient"] = ""; -App::$strings["Make this post private"] = "Сделать это сообщение личным"; -App::$strings["Authorize application connection"] = ""; -App::$strings["Return to your app and insert this Securty Code:"] = ""; -App::$strings["Please login to continue."] = "Пожалуйста, войдите, чтобы продолжить."; -App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = ""; -App::$strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = ""; -App::$strings["Welcome %s. Remote authentication successful."] = "Добро пожаловать %s. Удаленная аутентификация успешно завершена."; -App::$strings["Item not available."] = "Элемент недоступен."; -App::$strings["Fetching URL returns error: %1\$s"] = ""; -App::$strings["Invalid item."] = "Недействительный элемент."; -App::$strings["Channel not found."] = "Канал не найден."; -App::$strings["Page not found."] = "Страница не найдена."; -App::$strings["Image uploaded but image cropping failed."] = ""; -App::$strings["Image resize failed."] = "Изменение размера изображения не удалось."; -App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = ""; -App::$strings["Image exceeds size limit of %d"] = ""; -App::$strings["Unable to process image."] = "Невозможно обработать изображение."; -App::$strings["Photo not available."] = "Фотография не доступна."; -App::$strings["Upload File:"] = "Загрузить файл:"; -App::$strings["Select a profile:"] = "Выберите профиль:"; -App::$strings["Upload Profile Photo"] = "Загрузить фотографию профиля"; -App::$strings["skip this step"] = "пропустить этот шаг"; -App::$strings["select a photo from your photo albums"] = ""; -App::$strings["Crop Image"] = "Обрезать изображение"; -App::$strings["Please adjust the image cropping for optimum viewing."] = ""; -App::$strings["Done Editing"] = "Закончить редактирование"; -App::$strings["Image uploaded successfully."] = "Загрузка изображениея прошла успешно."; -App::$strings["Image upload failed."] = "Загрузка изображениея прошла безуспешно."; -App::$strings["Image size reduction [%s] failed."] = ""; -App::$strings["Block Name"] = "Название блока"; -App::$strings["Profile not found."] = "Профиль не найден."; -App::$strings["Profile deleted."] = "Профиль удален."; -App::$strings["Profile-"] = "Профиль-"; -App::$strings["New profile created."] = "Новый профиль создан."; -App::$strings["Profile unavailable to clone."] = "Профиль недоступен для клонирования."; -App::$strings["Profile Name is required."] = "Имя профиля требуется."; -App::$strings["Marital Status"] = "Семейное положение"; -App::$strings["Romantic Partner"] = "Романтический партнер"; -App::$strings["Likes"] = "нравится"; -App::$strings["Dislikes"] = "не-нравится"; -App::$strings["Work/Employment"] = "Работа / Занятость"; -App::$strings["Religion"] = "Религия"; -App::$strings["Political Views"] = "Политические взгляды"; -App::$strings["Gender"] = "Пол"; -App::$strings["Sexual Preference"] = "Сексуальная ориентация"; -App::$strings["Homepage"] = "Домашняя страница"; -App::$strings["Interests"] = "Интересы"; +App::$strings["INVALID EVENT DISMISSED!"] = "НЕДЕЙСТВИТЕЛЬНОЕ СОБЫТИЕ ОТКЛОНЕНО!"; +App::$strings["Summary: "] = "Резюме:"; +App::$strings["Date: "] = "Дата:"; +App::$strings["Reason: "] = "Причина:"; +App::$strings["INVALID CARD DISMISSED!"] = "НЕДЕЙСТВИТЕЛЬНАЯ КАРТОЧКА ОТКЛОНЕНА!"; +App::$strings["Name: "] = "Имя:"; +App::$strings["Event title"] = "Наименование события"; +App::$strings["Start date and time"] = "Дата и время начала"; +App::$strings["Example: YYYY-MM-DD HH:mm"] = "Пример: YYYY-MM-DD HH:mm"; +App::$strings["End date and time"] = "Дата и время окончания"; +App::$strings["Previous"] = "Предыдущая"; +App::$strings["Next"] = "Следующая"; +App::$strings["Today"] = "Сегодня"; +App::$strings["Month"] = "Месяц"; +App::$strings["Week"] = "Неделя"; +App::$strings["Day"] = "День"; +App::$strings["List month"] = "Просмотреть месяц"; +App::$strings["List week"] = "Просмотреть неделю"; +App::$strings["List day"] = "Просмотреть день"; +App::$strings["More"] = "Больше"; +App::$strings["Less"] = "Меньше"; +App::$strings["Select calendar"] = "Выбрать календарь"; +App::$strings["Delete all"] = "Удалить всё"; +App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "Простите, но редактирование повторяющихся событий пока не реализовано."; +App::$strings["Organisation"] = "Организация"; +App::$strings["Title"] = "Наименование"; +App::$strings["Phone"] = "Телефон"; +App::$strings["Instant messenger"] = "Мессенджер"; +App::$strings["Website"] = "Веб-сайт"; App::$strings["Address"] = "Адрес"; -App::$strings["Location"] = "Место"; -App::$strings["Profile updated."] = "Профиль обновлен."; -App::$strings["Hide your contact/friend list from viewers of this profile?"] = "Скрывать от просмотра ваш список контактов/друзей в этом профиле?"; -App::$strings["Edit Profile Details"] = "Редактирование профиля"; -App::$strings["View this profile"] = "Посмотреть этот профиль"; -App::$strings["Change Profile Photo"] = "Изменить фотографию профиля"; -App::$strings["Create a new profile using these settings"] = "Создайте новый профиль со следующими настройками"; -App::$strings["Clone this profile"] = "Клонировать этот профиль"; -App::$strings["Delete this profile"] = "Удалить этот профиль"; -App::$strings["Profile Name:"] = "Имя профиля:"; -App::$strings["Your Full Name:"] = "Ваше полное имя:"; -App::$strings["Title/Description:"] = "Название / Описание:"; -App::$strings["Your Gender:"] = "Ваш пол:"; -App::$strings["Birthday (%s):"] = "Ваш День Рождения (%s):"; -App::$strings["Street Address:"] = "Улица:"; -App::$strings["Locality/City:"] = "Населенный пункт / город:"; -App::$strings["Postal/Zip Code:"] = "Почтовый индекс:"; -App::$strings["Country:"] = "Страна:"; -App::$strings["Region/State:"] = "Регион / Область:"; -App::$strings["<span class=\"heart\">♥</span> Marital Status:"] = ""; -App::$strings["Who: (if applicable)"] = "Кто: (если это применимо)"; -App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Примеры: cathy123, Cathy Williams, cathy@example.com"; -App::$strings["Since [date]:"] = "С тех пор [date]:"; -App::$strings["Homepage URL:"] = "URL-адрес домашней страницы:"; -App::$strings["Religious Views:"] = "Религиозные взгляды:"; -App::$strings["Keywords:"] = "Ключевые слова:"; -App::$strings["Example: fishing photography software"] = "Пример: fishing photography software"; -App::$strings["Used in directory listings"] = ""; -App::$strings["Tell us about yourself..."] = "Расскажите нам о себе ..."; -App::$strings["Hobbies/Interests"] = "Хобби / интересы"; -App::$strings["Contact information and Social Networks"] = "Информация и социальные сети контакта"; -App::$strings["My other channels"] = "Мои другие контакты"; -App::$strings["Musical interests"] = "Музыкальные интересы"; -App::$strings["Books, literature"] = "Книги, литература"; -App::$strings["Television"] = "Телевидение"; -App::$strings["Film/dance/culture/entertainment"] = "Кино / танцы / культура / развлечения"; -App::$strings["Love/romance"] = "Любовь / Романс"; -App::$strings["Work/employment"] = "Работа / Занятость"; -App::$strings["School/education"] = "Школа / образование"; -App::$strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = ""; -App::$strings["Age: "] = "Возраст:"; -App::$strings["Edit/Manage Profiles"] = "Редактирование / Управление профилей"; -App::$strings["Add profile things"] = ""; -App::$strings["Include desirable objects in your profile"] = ""; -App::$strings["Bookmark added"] = "Закладка добавлена"; -App::$strings["My Bookmarks"] = "Мои закладки"; -App::$strings["My Connections Bookmarks"] = "Закладки моих контактов"; -App::$strings["Invalid profile identifier."] = ""; -App::$strings["Profile Visibility Editor"] = "Редактор видимости профиля"; -App::$strings["Click on a contact to add or remove."] = "Нажмите на канал, чтобы добавить или удалить."; -App::$strings["Visible To"] = "Видно"; -App::$strings["All Connections"] = "Все контакты"; -App::$strings["Public Sites"] = "Публичные сайты"; -App::$strings["The listed sites allow public registration into the Hubzilla. All sites in the matrix are interlinked so membership on any of them conveys membership in the matrix as a whole. Some sites may require subscription or provide tiered service plans. The provider links <strong>may</strong> provide additional details."] = ""; -App::$strings["Site URL"] = "URL веб-сайта"; +App::$strings["Note"] = "Заметка"; +App::$strings["Add Field"] = "Добавить поле"; +App::$strings["P.O. Box"] = "абонентский ящик"; +App::$strings["Additional"] = "Дополнительно"; +App::$strings["Street"] = "Улица"; +App::$strings["Locality"] = "Населённый пункт"; +App::$strings["Region"] = "Регион"; +App::$strings["ZIP Code"] = "Индекс"; +App::$strings["Country"] = "Страна"; +App::$strings["Default Calendar"] = "Календарь по умолчанию"; +App::$strings["Default Addressbook"] = "Адресная книга по умолчанию"; +App::$strings["This page is available only to site members"] = "Эта страница доступна только для подписчиков сайта"; +App::$strings["Welcome"] = "Добро пожаловать"; +App::$strings["What would you like to do?"] = "Что бы вы хотели сделать?"; +App::$strings["Please bookmark this page if you would like to return to it in the future"] = "Пожалуйста, запомните эту страницу если вы хотите вернуться на неё в будущем"; +App::$strings["Upload a profile photo"] = "Загрузить фотографию профиля"; +App::$strings["Upload a cover photo"] = "Загрузить фотографию обложки"; +App::$strings["Edit your default profile"] = "Редактировать ваш профиль по умолчанию"; +App::$strings["View the channel directory"] = "Просмотр каталога каналов"; +App::$strings["View/edit your channel settings"] = "Просмотреть / редактировать настройки вашего канала"; +App::$strings["View the site or project documentation"] = "Просмотр документации сайта / проекта"; +App::$strings["Visit your channel homepage"] = "Посетить страницу вашего канала"; +App::$strings["View your connections and/or add somebody whose address you already know"] = "Просмотреть ваши контакты и / или добавить кого-то чей адрес в уже знаете"; +App::$strings["View your personal stream (this may be empty until you add some connections)"] = "Ваш персональный поток (может быть пуст пока вы не добавите контакты)"; +App::$strings["View the public stream. Warning: this content is not moderated"] = "Просмотр публичного потока. Предупреждение: этот контент не модерируется"; +App::$strings["Page owner information could not be retrieved."] = "Информация о владельце страницы не может быть получена."; +App::$strings["Album not found."] = "Альбом не найден."; +App::$strings["Delete Album"] = "Удалить альбом"; +App::$strings["Delete Photo"] = "Удалить фотографию"; +App::$strings["Public access denied."] = "Общественный доступ запрещен."; +App::$strings["No photos selected"] = "Никакие фотографии не выбраны"; +App::$strings["Access to this item is restricted."] = "Доступ к этому элементу ограничен."; +App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "Вы использовали %1$.2f мегабайт из %2$.2f для хранения фото."; +App::$strings["%1$.2f MB photo storage used."] = "Вы использовали %1$.2f мегабайт для хранения фото."; +App::$strings["Upload Photos"] = "Загрузить фотографии"; +App::$strings["Enter an album name"] = "Введите название альбома"; +App::$strings["or select an existing album (doubleclick)"] = "или выберите существующий альбом (двойной щелчок)"; +App::$strings["Create a status post for this upload"] = "Сделать публикацию о статусе для этой загрузки"; +App::$strings["Description (optional)"] = "Описание (необязательно)"; +App::$strings["Show Newest First"] = "Показать новые первыми"; +App::$strings["Show Oldest First"] = "Показать старые первыми"; +App::$strings["Add Photos"] = "Добавить фотографии"; +App::$strings["Permission denied. Access to this item may be restricted."] = "Доступ запрещен. Доступ к этому элементу может быть ограничен."; +App::$strings["Photo not available"] = "Фотография не доступна"; +App::$strings["Use as profile photo"] = "Использовать в качестве фотографии профиля"; +App::$strings["Use as cover photo"] = "Использовать в качестве фотографии обложки"; +App::$strings["Private Photo"] = "Личная фотография"; +App::$strings["View Full Size"] = "Посмотреть в полный размер"; +App::$strings["Edit photo"] = "Редактировать фотографию"; +App::$strings["Rotate CW (right)"] = "Повернуть CW (направо)"; +App::$strings["Rotate CCW (left)"] = "Повернуть CCW (налево)"; +App::$strings["Move photo to album"] = "Переместить фотографию в альбом"; +App::$strings["Enter a new album name"] = "Введите новое название альбома"; +App::$strings["or select an existing one (doubleclick)"] = "или выбрать существующую (двойной щелчок)"; +App::$strings["Add a Tag"] = "Добавить тег"; +App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Пример: @bob, @Barbara_Jensen, @jim@example.com"; +App::$strings["Flag as adult in album view"] = "Пометить как альбом \"для взрослых\""; +App::$strings["Photo Tools"] = "Фото-Инструменты"; +App::$strings["In This Photo:"] = "На этой фотографии:"; +App::$strings["Map"] = "Карта"; +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."] = "Указанные хабы разрешают публичную регистрацию для сети \$Projectname. Все хабы в сети взаимосвязаны, поэтому членство в любом из них передает членство во всю сеть. Некоторым хабам может потребоваться подписка или предоставление многоуровневых планов обслуживания. Сам хаб <strong>может</strong> предоставить дополнительные сведения."; +App::$strings["Hub URL"] = "URL сервера"; App::$strings["Access Type"] = "Тип доступа"; -App::$strings["Registration Policy"] = "Правила регистрации"; -App::$strings["You must be logged in to see this page."] = "Вы должны авторизоваться, чтобы увидеть эту страницу."; -App::$strings["Insufficient permissions. Request redirected to profile page."] = ""; -App::$strings["Select a bookmark folder"] = ""; -App::$strings["Save Bookmark"] = "Сохранить закладки"; -App::$strings["URL of bookmark"] = ""; -App::$strings["Description"] = "Описание"; -App::$strings["Or enter new bookmark folder name"] = ""; -App::$strings["Room not found"] = ""; -App::$strings["Leave Room"] = ""; -App::$strings["Delete This Room"] = ""; -App::$strings["I am away right now"] = ""; -App::$strings["I am online"] = "Я в сети"; -App::$strings["Bookmark this room"] = ""; -App::$strings["New Chatroom"] = "Новый чат"; -App::$strings["Chatroom Name"] = "Название чата"; -App::$strings["%1\$s's Chatrooms"] = "Чаты пользователя %1\$s"; -App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = ""; -App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = ""; -App::$strings["Passwords do not match."] = "Пароли не совпадают."; -App::$strings["Registration successful. Please check your email for validation instructions."] = ""; -App::$strings["Your registration is pending approval by the site owner."] = ""; -App::$strings["Your registration can not be processed."] = "Ваша регистрация не может быть обработана."; -App::$strings["Registration on this site/hub is by approval only."] = ""; -App::$strings["<a href=\"pubsites\">Register at another affiliated site/hub</a>"] = ""; -App::$strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = ""; -App::$strings["Terms of Service"] = "Условия предоставления услуг"; -App::$strings["I accept the %s for this website"] = ""; -App::$strings["I am over 13 years of age and accept the %s for this website"] = ""; -App::$strings["Registration"] = "Регистрация"; -App::$strings["Membership on this site is by invitation only."] = ""; -App::$strings["Please enter your invitation code"] = "Пожалуйста, введите Ваш код приглашения"; -App::$strings["Your email address"] = "Ваш адрес электронной почты"; -App::$strings["Choose a password"] = "Выберите пароль"; -App::$strings["Please re-enter your password"] = "Пожалуйста, введите пароль еще раз"; -App::$strings["Away"] = "Нет на месте"; -App::$strings["Online"] = "Сейчас в сети"; -App::$strings["Please login."] = "Войдите пожалуйста."; -App::$strings["Hubzilla - Guests: Username: {your email address}, Password: +++"] = ""; -App::$strings["Remove This Channel"] = "Удалить этот канал"; -App::$strings["This will completely remove this channel from the network. Once this has been done it is not recoverable."] = ""; -App::$strings["Please enter your password for verification:"] = "Пожалуйста, введите пароль для проверки:"; -App::$strings["Remove this channel and all its clones from the network"] = "Удалить этот канал и все его клоны из сети"; -App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = ""; -App::$strings["Remove Channel"] = "Удалить канал"; -App::$strings["No channel."] = "Не канал."; -App::$strings["Common connections"] = "Общие контакты"; -App::$strings["No connections in common."] = "Общих контактов нет."; -App::$strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = ""; -App::$strings["The error message was:"] = "Сообщение об ошибке было:"; -App::$strings["Authentication failed."] = "Ошибка проверки подлинности."; -App::$strings["Remote Authentication"] = "Удаленная аутентификация"; -App::$strings["Enter your channel address (e.g. channel@example.com)"] = "Введите адрес вашего канала (например: channel@example.com)"; -App::$strings["Authenticate"] = "Проверка подлинности"; +App::$strings["Registration Policy"] = "Политика регистрации"; +App::$strings["Stats"] = "Статистика"; +App::$strings["Software"] = "Программное обеспечение"; +App::$strings["Rate"] = "Оценка"; +App::$strings["View"] = "Просмотр"; App::$strings["Continue"] = "Продолжить"; App::$strings["Premium Channel Setup"] = "Установка премиум канала"; -App::$strings["Enable premium channel connection restrictions"] = ""; -App::$strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = ""; -App::$strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = ""; -App::$strings["Potential connections will then see the following text before proceeding:"] = ""; -App::$strings["By continuing, I certify that I have complied with any instructions provided on this page."] = ""; -App::$strings["(No specific instructions have been provided by the channel owner.)"] = ""; +App::$strings["Enable premium channel connection restrictions"] = "Включить ограничения для премиум канала"; +App::$strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "Пожалуйста введите ваши ограничения или условия, такие, как оплата PayPal, правила использования и т.п."; +App::$strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "Этот канал до подключения может требовать дополнительных шагов или подтверждений следующих условий:"; +App::$strings["Potential connections will then see the following text before proceeding:"] = "Потенциальные соединения будут видеть следующий предварительный текст:"; +App::$strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "Продолжая, я подтверждаю что я выполнил все условия представленные на данной странице."; +App::$strings["(No specific instructions have been provided by the channel owner.)"] = "(Владельцем канала не было представлено никаких специальных инструкций.)"; App::$strings["Restricted or Premium Channel"] = "Ограниченный или Премиум канал"; -App::$strings["No such group"] = "Нет такой группы"; -App::$strings["Search Results For:"] = "Результаты поиска для:"; -App::$strings["Collection is empty"] = "Коллекция пуста"; -App::$strings["Collection: "] = "Коллекции: "; -App::$strings["Connection: "] = "Контакты: "; -App::$strings["Invalid connection."] = ""; -App::$strings["Could not access contact record."] = ""; -App::$strings["Could not locate selected profile."] = ""; -App::$strings["Connection updated."] = "Связи обновленны."; -App::$strings["Failed to update connection record."] = ""; -App::$strings["Blocked"] = "Заблокированные"; -App::$strings["Ignored"] = "Игнорируемые"; -App::$strings["Hidden"] = "Скрытые"; -App::$strings["Archived"] = "Зархивированные"; -App::$strings["All"] = "Все"; -App::$strings["Unconnected"] = "Неприсоединенные"; -App::$strings["Suggest new connections"] = "Предлагать новые контакты"; -App::$strings["New Connections"] = "Новые контакты"; -App::$strings["Show pending (new) connections"] = "Просмотр (новых) ждущих контактов"; -App::$strings["Show all connections"] = "Просмотр всех контактов"; -App::$strings["Unblocked"] = "Разрешенные"; -App::$strings["Only show unblocked connections"] = "Показать только разрешенные контакты"; +App::$strings["Poke somebody"] = "Ткнуть кого-нибудь"; +App::$strings["Poke/Prod"] = "Толкнуть / подтолкнуть"; +App::$strings["Poke, prod or do other things to somebody"] = "Толкнуть, подтолкнуть или сделать что-то ещё с кем-то"; +App::$strings["Recipient"] = "Получатель"; +App::$strings["Choose what you wish to do to recipient"] = "Выбрать что вы хотите сделать с получателем"; +App::$strings["Make this post private"] = "Сделать эту публикацию приватной"; +App::$strings["Unable to find your hub."] = "Невозможно найти ваш сервер"; +App::$strings["Post successful."] = "Успешно опубликовано."; +App::$strings["%s element installed"] = "%s элемент установлен"; +App::$strings["%s element installation failed"] = "%sустановка элемента неудачна."; +App::$strings["sent you a private message"] = "отправил вам личное сообщение"; +App::$strings["added your channel"] = "добавил ваш канал"; +App::$strings["requires approval"] = "Требуется подтверждение"; +App::$strings["g A l F d"] = "g A l F d"; +App::$strings["[today]"] = "[сегодня]"; +App::$strings["posted an event"] = "событие опубликовано"; +App::$strings["shared a file with you"] = "с вами поделились файлом"; +App::$strings["Private forum"] = "Частный форум"; +App::$strings["Public forum"] = "Публичный форум"; +App::$strings["Some blurb about what to do when you're new here"] = "Некоторые предложения о том, что делать, если вы здесь новичок "; +App::$strings["Active"] = "Активен"; +App::$strings["Blocked"] = "Заблокирован"; +App::$strings["Ignored"] = "Игнорируется"; +App::$strings["Hidden"] = "Скрыт"; +App::$strings["Archived/Unreachable"] = "Заархивировано / недоступно"; +App::$strings["Active Connections"] = "Активные контакты"; +App::$strings["Show active connections"] = "Показать активные контакты"; +App::$strings["Show pending (new) connections"] = "Просмотр (новых) ожидающих контактов"; App::$strings["Only show blocked connections"] = "Показать только заблокированные контакты"; App::$strings["Only show ignored connections"] = "Показать только проигнорированные контакты"; -App::$strings["Only show archived connections"] = "Показать только архивированные контакты"; +App::$strings["Only show archived/unreachable connections"] = "Показать только заархивированные / недоступные контакты"; App::$strings["Only show hidden connections"] = "Показать только скрытые контакты"; -App::$strings["Only show one-way connections"] = ""; -App::$strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]"; -App::$strings["Edit contact"] = "Редактировать контакт"; -App::$strings["Search your connections"] = "Поиск ваших связей"; -App::$strings["Finding: "] = "Поиск:"; +App::$strings["All Connections"] = "Все контакты"; +App::$strings["Show all connections"] = "Просмотр всех контактов"; +App::$strings["Pending approval"] = "Ожидающие подтверждения"; +App::$strings["Archived"] = "Зархивирован"; +App::$strings["Not connected at this location"] = "Не подключено в этом месте"; +App::$strings["%1\$s [%2\$s]"] = ""; +App::$strings["Edit connection"] = "Редактировать контакт"; +App::$strings["Delete connection"] = "Удалить контакт"; +App::$strings["Channel address"] = "Адрес канала"; +App::$strings["Network"] = "Сеть"; +App::$strings["Call"] = "Вызов"; +App::$strings["Status"] = "Статус"; +App::$strings["Connected"] = "Подключено"; +App::$strings["Approve connection"] = "Утвердить контакт"; +App::$strings["Ignore connection"] = "Игнорировать контакт"; +App::$strings["Ignore"] = "Игнорировать"; +App::$strings["Recent activity"] = "Последние действия"; +App::$strings["Search your connections"] = "Поиск ваших контактов"; +App::$strings["Connections search"] = "Поиск контаков"; +App::$strings["Unable to locate original post."] = "Не удалось найти оригинальную публикацию."; +App::$strings["Empty post discarded."] = "Пустая публикация отклонена."; +App::$strings["Duplicate post suppressed."] = "Подавлена дублирующаяся публикация."; +App::$strings["System error. Post not saved."] = "Системная ошибка. Публикация не сохранена."; +App::$strings["Your comment is awaiting approval."] = "Ваш комментарий ожидает одобрения."; +App::$strings["Unable to obtain post information from database."] = "Невозможно получить информацию о публикации из базы данных"; +App::$strings["You have reached your limit of %1$.0f top level posts."] = "Вы достигли вашего ограничения в %1$.0f публикаций высокого уровня."; +App::$strings["You have reached your limit of %1$.0f webpages."] = "Вы достигли вашего ограничения в %1$.0f страниц."; +App::$strings["Calendar entries imported."] = "События календаря импортированы."; +App::$strings["No calendar entries found."] = "Не найдено событий в календаре."; +App::$strings["Event can not end before it has started."] = "Событие не может завершиться до его начала."; +App::$strings["Unable to generate preview."] = "Невозможно создать предварительный просмотр."; +App::$strings["Event title and start time are required."] = "Требуются наименование события и время начала."; +App::$strings["Event not found."] = "Событие не найдено."; +App::$strings["Edit event title"] = "Редактировать наименование события"; +App::$strings["Categories (comma-separated list)"] = "Категории (список через запятую)"; +App::$strings["Edit Category"] = "Редактировать категорию"; +App::$strings["Category"] = "Категория"; +App::$strings["Edit start date and time"] = "Редактировать дату и время начала"; +App::$strings["Finish date and time are not known or not relevant"] = "Дата и время окончания неизвестны или неприменимы"; +App::$strings["Edit finish date and time"] = "Редактировать дату и время окончания"; +App::$strings["Finish date and time"] = "Дата и время окончания"; +App::$strings["Adjust for viewer timezone"] = "Настройте просмотр часовых поясов"; +App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Важно для событий, которые происходят в определённом месте. Не подходит для всеобщих праздников."; +App::$strings["Edit Description"] = "Редактировать описание"; +App::$strings["Edit Location"] = "Редактировать местоположение"; +App::$strings["Timezone:"] = "Часовой пояс:"; +App::$strings["Advanced Options"] = "Дополнительные настройки"; +App::$strings["l, F j"] = ""; +App::$strings["Edit event"] = "Редактировать событие"; +App::$strings["Delete event"] = "Удалить событие"; +App::$strings["calendar"] = "календарь"; +App::$strings["Edit Event"] = "Редактировать событие"; +App::$strings["Create Event"] = "Создать событие"; +App::$strings["Event removed"] = "Событие удалено"; +App::$strings["Failed to remove event"] = "Не удалось удалить событие"; +App::$strings["Layout Name"] = "Название шаблона"; +App::$strings["Layout Description (Optional)"] = "Описание шаблона (необязательно)"; +App::$strings["Comanche page description language help"] = "Помощь по языку описания страниц Comanche "; +App::$strings["Layout Description"] = "Описание шаблона"; +App::$strings["Created"] = "Создано"; +App::$strings["Edited"] = "Отредактировано"; +App::$strings["Download PDL file"] = "Загрузить PDL файл"; +App::$strings["No more system notifications."] = "Нет новых оповещений системы."; +App::$strings["System Notifications"] = "Системные оповещения "; +App::$strings["Layout updated."] = "Шаблон обновлен."; +App::$strings["Feature disabled."] = "Функция отключена."; +App::$strings["Edit System Page Description"] = "Редактировать описание системной страницы"; +App::$strings["(modified)"] = "(изменено)"; +App::$strings["Reset"] = "Сбросить"; +App::$strings["Layout not found."] = "Шаблон не найден."; +App::$strings["Module Name:"] = "Имя модуля:"; +App::$strings["Layout Help"] = "Помощь к шаблону"; +App::$strings["Edit another layout"] = "Редактировать другой шаблон"; +App::$strings["System layout"] = "Системный шаблон"; +App::$strings["Unable to lookup recipient."] = "Не удалось найти получателя."; +App::$strings["Unable to communicate with requested channel."] = "Не удалось установить связь с запрашиваемым каналом."; +App::$strings["Cannot verify requested channel."] = "Не удалось установить подлинность требуемого канала."; +App::$strings["Selected channel has private message restrictions. Send failed."] = "Выбранный канал ограничивает частные сообщения. Отправка не удалась."; +App::$strings["Messages"] = "Сообщения"; +App::$strings["message"] = "сообщение"; +App::$strings["Message recalled."] = "Сообщение отозванно."; +App::$strings["Conversation removed."] = "Разговор удален."; +App::$strings["Expires YYYY-MM-DD HH:MM"] = "Истекает YYYY-MM-DD HH:MM"; +App::$strings["Requested channel is not in this network"] = "Запрашиваемый канал не доступен."; +App::$strings["Send Private Message"] = "Отправить личное сообщение"; +App::$strings["To:"] = "Кому:"; +App::$strings["Subject:"] = "Тема:"; +App::$strings["Your message:"] = "Сообщение:"; +App::$strings["Attach file"] = "Прикрепить файл"; +App::$strings["Send"] = "Отправить"; +App::$strings["Delete message"] = "Удалить сообщение"; +App::$strings["Delivery report"] = "Отчёт о доставке"; +App::$strings["Recall message"] = "Отозвать сообщение"; +App::$strings["Message has been recalled."] = "Сообщение отозванно"; +App::$strings["Delete Conversation"] = "Удалить разговор"; +App::$strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Безопасная связь недоступна. Вы <strong>можете</strong> попытаться ответить со страницы профиля отправителя."; +App::$strings["Send Reply"] = "Отправить ответ"; +App::$strings["Your message for %s (%s):"] = "Ваше сообщение для %s (%s):"; +App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "Удаление канала не разрешается в течении 48 часов после смены пароля у аккаунта."; +App::$strings["Remove This Channel"] = "Удалить этот канал"; +App::$strings["WARNING: "] = "ПРЕДУПРЕЖДЕНИЕ:"; +App::$strings["This channel will be completely removed from the network. "] = "Этот канал будет полностью удалён из сети."; +App::$strings["This action is permanent and can not be undone!"] = "Это действие необратимо и не может быть отменено!"; +App::$strings["Please enter your password for verification:"] = "Пожалуйста, введите ваш пароль для проверки:"; +App::$strings["Remove this channel and all its clones from the network"] = "Удалить этот канал и все его клоны из сети"; +App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = "По умолчанию только представление канала расположенное на данном хабе будет удалено из сети"; +App::$strings["Remove Channel"] = "Удаление канала"; +App::$strings["Reset form"] = "Очистить форму"; +App::$strings["Welcome to Hubzilla!"] = "Добро пожаловать в Hubzilla!"; +App::$strings["You have got no unseen posts..."] = "У вас нет видимых публикаций..."; +App::$strings["Item not found"] = "Элемент не найден"; +App::$strings["Channel not found."] = "Канал не найден."; +App::$strings["Edit Card"] = "Редактировать карточку"; +App::$strings["Xchan Lookup"] = "Поиск Xchan"; +App::$strings["Lookup xchan beginning with (or webbie): "] = "Запрос Xchan начинается с (или webbie):"; +App::$strings["Not found."] = "Не найдено."; +App::$strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Нет предложений. Если это новый сайт, повторите попытку через 24 часа."; +App::$strings["Posts and comments"] = "Публикации и комментарии"; +App::$strings["Only posts"] = "Только публикации"; +App::$strings["Insufficient permissions. Request redirected to profile page."] = "Недостаточно прав. Запрос перенаправлен на страницу профиля."; +App::$strings["Search Results For:"] = "Результаты поиска для:"; +App::$strings["Documentation Search"] = "Поиск документации"; +App::$strings["Members"] = "Участники"; +App::$strings["Administrators"] = "Администраторы"; +App::$strings["Developers"] = "Разработчики"; +App::$strings["Tutorials"] = "Руководства"; +App::$strings["\$Projectname Documentation"] = "\$Projectname Документация"; +App::$strings["Contents"] = "Содержимое"; +App::$strings["This site is not a directory server"] = "Этот сайт не является сервером каталога"; +App::$strings["Export Channel"] = "Экспорт канала"; +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."] = "Экспортировать основную информацию из канала в файл. Служит в качестве резервной копии ваших контактов, основных данных и профиля, однако не включает содержимое. Может быть использовано для импорта ваши данных на новый сервер."; +App::$strings["Export Content"] = "Экспортировать содержимое"; +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."] = "Экспортировать информацию из вашего канала и его содержимое в резервную копию в формате JSON которая может быть использована для восстановления или импорта на другом сервере. Сохраняет все ваши контакты, разрешения, данные профиля и публикации за несколько месяцев. Файл может иметь очень большой размер. Пожалуйста, будьте терпеливы и подождите несколько минут пока не начнётся загрузка."; +App::$strings["Export your posts from a given year."] = "Экспортировать ваши публикации за данный год."; +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."] = "Вы также можете экспортировать ваши публикации и беседы за определённый месяц или год. Выберите дату в панели местоположения в браузере. Если экспорт будет неудачным (это возможно, например, из-за исчерпания памяти на сервере), повторите попытку, выбрав меньший диапазон дат."; +App::$strings["To select all posts for a given year, such as this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Для выбора всех публикаций заданного года, например текущего, посетите <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>"] = "Для выбора всех публикаций заданного месяца, например за январь сего года, посетите <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)."] = "Данные файлы с содержимым могут быть импортированы и восстановлены на любом содержащем ваш канал сайте. Посетите <a href=\"%1\$s\">%2\$s</a>. Для лучших результатов пожалуйста производите импорт и восстановление в порядке датировки (старые сначала)."; +App::$strings["Away"] = "Нет на месте"; +App::$strings["Online"] = "В сети"; +App::$strings["Invalid item."] = "Недействительный элемент."; +App::$strings["Authorize application connection"] = "Авторизовать подключение приложения"; +App::$strings["Return to your app and insert this Security Code:"] = "Вернитесь к своему приложению и вставьте этот код безопасности:"; +App::$strings["Please login to continue."] = "Пожалуйста, войдите, чтобы продолжить."; +App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Вы хотите авторизовать это приложение для доступа к вашим публикациям и контактам и / или созданию новых публикаций?"; +App::$strings["item"] = "пункт"; +App::$strings["No ratings"] = "Оценок нет"; +App::$strings["Rating: "] = "Оценкa:"; +App::$strings["Website: "] = "Веб-сайт:"; +App::$strings["Description: "] = "Описание:"; +App::$strings["Failed to create source. No channel selected."] = "Не удалось создать источник. Канал не выбран."; +App::$strings["Source created."] = "Источник создан."; +App::$strings["Source updated."] = "Источник обновлен."; +App::$strings["*"] = ""; +App::$strings["Manage remote sources of content for your channel."] = "Управлять удалённым источниками содержимого для вашего канала"; +App::$strings["New Source"] = "Новый источник"; +App::$strings["Import all or selected content from the following channel into this channel and distribute it according to your channel settings."] = "Импортировать всё или выбранное содержимое из следующего канала в этот канал и распределить его в соответствии с вашими настройками."; +App::$strings["Only import content with these words (one per line)"] = "Импортировать содержимое только с этим текстом (построчно)"; +App::$strings["Leave blank to import all public content"] = "Оставьте пустым для импорта всего общедоступного содержимого"; +App::$strings["Channel Name"] = "Название канала"; +App::$strings["Add the following categories to posts imported from this source (comma separated)"] = "Добавить следующие категории к импортированным публикациям из этого источника (через запятые)"; +App::$strings["Optional"] = "Необязательно"; +App::$strings["Resend posts with this channel as author"] = "Отправить публикации в этот канал повторно как автор"; +App::$strings["Copyrights may apply"] = "Могут применяться авторские права"; +App::$strings["Source not found."] = "Источник не найден."; +App::$strings["Edit Source"] = "Редактировать источник"; +App::$strings["Delete Source"] = "Удалить источник"; +App::$strings["Source removed"] = "Источник удален"; +App::$strings["Unable to remove source."] = "Невозможно удалить источник."; +App::$strings["About this site"] = "Об этом сайте"; +App::$strings["Site Name"] = "Название сайта"; +App::$strings["Site Information"] = "Информация о сайте"; +App::$strings["Administrator"] = "Администратор"; +App::$strings["Terms of Service"] = "Условия предоставления услуг"; +App::$strings["Software and Project information"] = "Информация о программном обеспечении и проекте"; +App::$strings["This site is powered by \$Projectname"] = "Этот сайт работает на \$Projectname"; +App::$strings["Federated and decentralised networking and identity services provided by Zot"] = "Объединенные и децентрализованные сети и службы идентификациии обеспечиваются Zot"; +App::$strings["Additional federated transport protocols:"] = "Дополнительные федеративные транспортные протоколы:"; +App::$strings["Version %s"] = "Версия %s"; +App::$strings["Project homepage"] = "Домашняя страница проекта"; +App::$strings["Developer homepage"] = "Домашняя страница разработчика"; +App::$strings["Image uploaded but image cropping failed."] = "Изображение загружено но обрезка не удалась."; +App::$strings["Image resize failed."] = "Не удалось изменить размер изображения."; +App::$strings["Image upload failed."] = "Загрузка изображения не удалась."; +App::$strings["Unable to process image."] = "Невозможно обработать изображение."; +App::$strings["Photo not available."] = "Фотография недоступна."; +App::$strings["Your default profile photo is visible to anybody on the internet. Profile photos for alternate profiles will inherit the permissions of the profile"] = "Фотография вашего профиля по умолчанию видна всем в Интернете. Фотографияпрофиля для альтернативных профилей наследуют разрешения текущего профиля"; +App::$strings["Your profile photo is visible to anybody on the internet and may be distributed to other websites."] = "Фотография вашего профиля видна всем в Интернете и может быть отправлена на другие сайты."; +App::$strings["Upload File:"] = "Загрузить файл:"; +App::$strings["Select a profile:"] = "Выбрать профиль:"; +App::$strings["Use Photo for Profile"] = "Использовать фотографию для профиля"; +App::$strings["Change Profile Photo"] = "Изменить фотографию профиля"; +App::$strings["Use"] = "Использовать"; +App::$strings["Use a photo from your albums"] = "Использовать фотографию из ваших альбомов"; +App::$strings["Choose a different album"] = "Выбрать другой альбом"; +App::$strings["Select existing photo"] = "Выбрать существующую фотографию"; +App::$strings["Crop Image"] = "Обрезать изображение"; +App::$strings["Please adjust the image cropping for optimum viewing."] = "Пожалуйста настройте обрезку изображения для оптимального просмотра."; +App::$strings["Done Editing"] = "Закончить редактирование"; +App::$strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s отслеживает %2\$s's %3\$s"; +App::$strings["%1\$s stopped following %2\$s's %3\$s"] = "%1\$s прекратил отслеживать %2\$s's %3\$s"; +App::$strings["No channel."] = "Канала нет."; +App::$strings["No connections in common."] = "Общих контактов нет."; +App::$strings["View Common Connections"] = "Просмотр общий контактов"; +App::$strings["Permission Denied."] = "Доступ запрещен."; +App::$strings["File not found."] = "Файл не найден."; +App::$strings["Edit file permissions"] = "Редактировать разрешения файла"; +App::$strings["Set/edit permissions"] = "Редактировать разрешения"; +App::$strings["Include all files and sub folders"] = "Включить все файлы и подкаталоги"; +App::$strings["Return to file list"] = "Вернутся к списку файлов"; +App::$strings["Copy/paste this code to attach file to a post"] = "Копировать / вставить этот код для прикрепления файла к публикации"; +App::$strings["Copy/paste this URL to link file from a web page"] = "Копировать / вставить эту URL для ссылки на файл со страницы"; +App::$strings["Share this file"] = "Поделиться этим файлом"; +App::$strings["Show URL to this file"] = "Показать URL этого файла"; +App::$strings["Show in your contacts shared folder"] = "Показать общий каталог в ваших контактах"; +App::$strings["Post not found."] = "Публикация не найдена"; +App::$strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s отметил тегом %2\$s %3\$s с %4\$s"; +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["Block Name"] = "Название блока"; +App::$strings["Edit Block"] = "Редактировать блок"; +App::$strings["Item is not editable"] = "Элемент нельзя редактировать"; App::$strings["Edit post"] = "Редактировать сообщение"; -App::$strings["Could not access address book record."] = ""; -App::$strings["Refresh failed - channel is currently unavailable."] = ""; -App::$strings["Channel has been unblocked"] = "Канал разблокирован"; -App::$strings["Channel has been blocked"] = "Канал заблокирован"; -App::$strings["Unable to set address book parameters."] = ""; -App::$strings["Channel has been unignored"] = "Канал не проигнорирован"; -App::$strings["Channel has been ignored"] = "Канал проигнорирован"; -App::$strings["Channel has been unarchived"] = "Канал разархивирован"; -App::$strings["Channel has been archived"] = "Канал заархивирован"; -App::$strings["Channel has been unhidden"] = "Канал открыт"; -App::$strings["Channel has been hidden"] = "Канал скрыт"; -App::$strings["Channel has been approved"] = "Канал одобрен"; -App::$strings["Channel has been unapproved"] = "Канал не одобрен"; -App::$strings["Connection has been removed."] = "Соединение было удалено."; -App::$strings["View %s's profile"] = "Просмотр %s's профиля"; +App::$strings["Tag removed"] = "Тег удалён"; +App::$strings["Remove Item Tag"] = "Удалить тег элемента"; +App::$strings["Select a tag to remove: "] = "Выбрать тег для удаления:"; +App::$strings["Account removals are not allowed within 48 hours of changing the account password."] = "Удаление канала не разрешается в течении 48 часов после смены пароля у аккаунта."; +App::$strings["Remove This Account"] = "Удалить этот аккаунт"; +App::$strings["This account and all its channels will be completely removed from the network. "] = "Этот аккаунт и все его каналы будут полностью удалены из сети."; +App::$strings["Remove this account, all its channels and all its channel clones from the network"] = "Удалить этот аккаунт, все его каналы и их клоны из сети."; +App::$strings["By default only the instances of the channels located on this hub will be removed from the network"] = "По умолчанию только представление канала расположенное на данном хабе будет удалено из сети"; +App::$strings["Remove Account"] = "Удалить аккаунт"; +App::$strings["Blocked accounts"] = "Заблокированные аккаунты"; +App::$strings["Expired accounts"] = "Просроченные аккаунты"; +App::$strings["Expiring accounts"] = "Близкие к просрочке аккаунты"; +App::$strings["Primary"] = "Основной"; +App::$strings["Clones"] = "Клоны"; +App::$strings["Message queues"] = "Очередь сообщений"; +App::$strings["Your software should be updated"] = "Ваше программное обеспечение должно быть обновлено"; +App::$strings["Administration"] = "Администрирование"; +App::$strings["Summary"] = "Резюме"; +App::$strings["Registered accounts"] = "Зарегистрированные аккаунты"; +App::$strings["Pending registrations"] = "Ждут утверждения"; +App::$strings["Registered channels"] = "Зарегистрированные каналы"; +App::$strings["Active addons"] = "Активные расширения"; +App::$strings["Version"] = "Версия системы"; +App::$strings["Repository version (master)"] = "Версия репозитория (master)"; +App::$strings["Repository version (dev)"] = "Версия репозитория (dev)"; +App::$strings["Could not access contact record."] = "Не удалось получить доступ к записи контакта."; +App::$strings["Could not locate selected profile."] = "Не удалось обнаружить выбранный профиль."; +App::$strings["Connection updated."] = "Контакты обновлены."; +App::$strings["Failed to update connection record."] = "Не удалось обновить запись контакта."; +App::$strings["is now connected to"] = "теперь подключён к"; +App::$strings["Could not access address book record."] = "Не удалось получить доступ к записи адресной книги."; +App::$strings["Refresh failed - channel is currently unavailable."] = "Обновление невозможно - в настоящее время канал недоступен."; +App::$strings["Unable to set address book parameters."] = "Не удалось получить доступ к параметрам адресной книги."; +App::$strings["Connection has been removed."] = "Контакт был удалён."; +App::$strings["View %s's profile"] = "Просмотр %s профиля"; App::$strings["Refresh Permissions"] = "Обновить разрешения"; -App::$strings["Fetch updated permissions"] = ""; -App::$strings["Recent Activity"] = ""; -App::$strings["View recent posts and comments"] = ""; -App::$strings["Unblock"] = "Разрешить"; -App::$strings["Block"] = "Заблокировать"; -App::$strings["Block or Unblock this connection"] = "Запретить или разрешить этот канал"; +App::$strings["Fetch updated permissions"] = "Получить обновлённые разрешения"; +App::$strings["Refresh Photo"] = "Обновить фотографию"; +App::$strings["Fetch updated photo"] = "Получить обновлённую фотографию"; +App::$strings["View recent posts and comments"] = "Просмотреть последние публикации и комментарии"; +App::$strings["Unblock"] = "Разблокировать"; +App::$strings["Block"] = "Блокировать"; +App::$strings["Block (or Unblock) all communications with this connection"] = "Блокировать (или разблокировать) связи с этим контактом"; +App::$strings["This connection is blocked!"] = "Этот контакт заблокирован!"; App::$strings["Unignore"] = "Не игнорировать"; -App::$strings["Ignore"] = "Игнорировать"; -App::$strings["Ignore or Unignore this connection"] = "Игнорировать или не игнорировать этот канал"; +App::$strings["Ignore (or Unignore) all inbound communications from this connection"] = "Игнорировать (или не игнорировать) все связи для этого контакта"; +App::$strings["This connection is ignored!"] = "Этот контакт игнорируется!"; App::$strings["Unarchive"] = "Разархивировать"; App::$strings["Archive"] = "Заархивировать"; -App::$strings["Archive or Unarchive this connection"] = " Заархивировать или разархивировать этот канал"; +App::$strings["Archive (or Unarchive) this connection - mark channel dead but keep content"] = "Заархивировать (или разархивировать) этот контакт - пометить канал отключённым но сохранить содержимое"; +App::$strings["This connection is archived!"] = "Этот контакт заархивирован!"; App::$strings["Unhide"] = "Показать"; App::$strings["Hide"] = "Скрыть"; -App::$strings["Hide or Unhide this connection"] = "Скрыть или показывать этот канал"; +App::$strings["Hide or Unhide this connection from your other connections"] = "Скрыть или показать этот контакт от / для остальных"; +App::$strings["This connection is hidden!"] = "Этот контакт скрыт!"; App::$strings["Delete this connection"] = "Удалить этот контакт"; +App::$strings["Fetch Vcard"] = "Получить vCard"; +App::$strings["Fetch electronic calling card for this connection"] = "Получить электронную телефонную карточку для этого контакта"; +App::$strings["Open Individual Permissions section by default"] = "Открывать раздел \"Индивидуальные разрешения\" по умолчанию"; +App::$strings["Affinity"] = "Сходство"; +App::$strings["Open Set Affinity section by default"] = "Открыть секцию установления сходства по умолчанию"; +App::$strings["Filter"] = "Фильтр"; +App::$strings["Open Custom Filter section by default"] = "Открывать секцию \"Настраиваемый фильтр\" по умолчанию"; App::$strings["Approve this connection"] = "Утвердить этот контакт"; -App::$strings["Accept connection to allow communication"] = ""; -App::$strings["Automatic Permissions Settings"] = "Настройки автоматических разрешений"; -App::$strings["Connections: settings for %s"] = ""; -App::$strings["When receiving a channel introduction, any permissions provided here will be applied to the new connection automatically and the introduction approved. Leave this page if you do not wish to use this feature."] = ""; -App::$strings["Slide to adjust your degree of friendship"] = ""; -App::$strings["inherited"] = "унаследованный"; -App::$strings["Connection has no individual permissions!"] = ""; -App::$strings["This may be appropriate based on your <a href=\"settings\">privacy settings</a>, though you may wish to review the \"Advanced Permissions\"."] = ""; -App::$strings["Profile Visibility"] = "Видимость профиля"; -App::$strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = ""; -App::$strings["Contact Information / Notes"] = "Информация / Примечания о канале"; -App::$strings["Edit contact notes"] = "Редактировать примечания канала"; +App::$strings["Accept connection to allow communication"] = "Принять контакт чтобы разрешить связь"; +App::$strings["Set Affinity"] = "Установить сходство"; +App::$strings["Set Profile"] = "Установить профиль"; +App::$strings["Set Affinity & Profile"] = "Установить сходство и профиль"; +App::$strings["This connection is unreachable from this location."] = "Этот контакт недоступен для данного местоположения"; +App::$strings["This connection may be unreachable from other channel locations."] = "Этот контакт может быть недоступен из других мест размещения канала"; +App::$strings["Location independence is not supported by their network."] = "Независимое местоположение не поддерживается их сетью."; +App::$strings["This connection is unreachable from this location. Location independence is not supported by their network."] = "Этот контакт недоступен из данного местоположения. Независимое местоположение не поддерживается их сетью."; +App::$strings["Apply these permissions automatically"] = "Применить эти разрешения автоматически"; +App::$strings["Connection requests will be approved without your interaction"] = "Запросы контактов будут одобрены без вашего участия"; +App::$strings["Permission role"] = "Роль разрешения"; +App::$strings["Add permission role"] = "Добавить роль разрешения"; +App::$strings["This connection's primary address is"] = "Главный адрес это контакта"; +App::$strings["Available locations:"] = "Доступные расположения:"; +App::$strings["The permissions indicated on this page will be applied to all new connections."] = "Разрешения, указанные на этой странице, будут применяться ко всем новым соединениям."; +App::$strings["Connection Tools"] = "Инструменты контактов"; +App::$strings["Slide to adjust your degree of friendship"] = "Прокрутить для настройки степени дружбы"; +App::$strings["Slide to adjust your rating"] = "Прокрутить для настройки оценки"; +App::$strings["Optionally explain your rating"] = "Объясните свою оценку (не обязательно)"; +App::$strings["Custom Filter"] = "Настраиваемый фильтр"; +App::$strings["Only import posts with this text"] = "Импортировать публикации только с этим текстом"; +App::$strings["words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts"] = "слова по одному в строку, #тег, /шаблон/ или lang=xxl; оставьте пустым для импорта всех публикаций"; +App::$strings["Do not import posts with this text"] = "Не импортировать публикации с этим текстом"; +App::$strings["This information is public!"] = "Эта информация общедоступна!"; +App::$strings["Connection Pending Approval"] = "Ожидающие подтверждения контактов"; +App::$strings["inherited"] = "наследуется"; +App::$strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Пожалуйста, выберите профиль который вы хотит показывать в %s при безопасном просмотре."; App::$strings["Their Settings"] = "Их настройки"; App::$strings["My Settings"] = "Мои настройки"; -App::$strings["Clear/Disable Automatic Permissions"] = ""; -App::$strings["Forum Members"] = "Участники форума"; -App::$strings["Soapbox"] = "Soapbox"; -App::$strings["Full Sharing (typical social network permissions)"] = ""; -App::$strings["Cautious Sharing "] = ""; -App::$strings["Follow Only"] = "Только следовать"; App::$strings["Individual Permissions"] = "Индивидуальные разрешения"; -App::$strings["Some permissions may be inherited from your channel <a href=\"settings\">privacy settings</a>, which have higher priority than individual settings. Changing those inherited settings on this page will have no effect."] = ""; -App::$strings["Advanced Permissions"] = "Дополнительные разрешения"; -App::$strings["Simple Permissions (select one and submit)"] = ""; -App::$strings["Visit %s's profile - %s"] = "Посетить %s's профиль - %s"; -App::$strings["Block/Unblock contact"] = "Запретить/разрешить контакт"; -App::$strings["Ignore contact"] = "Игнорировать контакт"; -App::$strings["Repair URL settings"] = "Ремонт настройки URL"; -App::$strings["View conversations"] = "Просмотр разговоров"; -App::$strings["Delete contact"] = "Удалить контакт"; +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."] = "Некоторые разрешения могут наследовать из <a href=\"settings\"><strong>настроек приватности</strong></a> ваших каналов которые могут иметь более высокий приоритет чем индивидуальные. Вы <strong>не можете</strong> менять эти настройки здесь."; +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."] = "Некоторые разрешения могут быть унаследованы из <a href=\"settings\"><strong>настроек приватности</strong></a> вашего канала, которые могут иметь более высокий приоритет чем индивидуальные. Вы можете изменить эти настройки, однако они не будут применены до изменения переданных по наследству настроек."; App::$strings["Last update:"] = "Последнее обновление:"; -App::$strings["Update public posts"] = "Обновить публичные сообщения"; -App::$strings["Update now"] = "Обновить сейчас"; -App::$strings["Currently blocked"] = "В настоящее время заблокирован"; -App::$strings["Currently ignored"] = "В настоящее время игнорируются"; -App::$strings["Currently archived"] = "В настоящее время зархивированны"; -App::$strings["Currently pending"] = "В настоящее время в ожидании"; -App::$strings["Hide this contact from others"] = "Скрыть этот канал от других"; -App::$strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = ""; -App::$strings["No potential page delegates located."] = ""; -App::$strings["Delegate Page Management"] = ""; -App::$strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = ""; -App::$strings["Existing Page Managers"] = ""; -App::$strings["Existing Page Delegates"] = ""; -App::$strings["Potential Delegates"] = ""; -App::$strings["Remove"] = "Удалить"; -App::$strings["Add"] = "Добавить"; -App::$strings["No entries."] = "Нет записей."; -App::$strings["Public access denied."] = "Общественный доступ запрещен."; -App::$strings["Gender: "] = "Пол:"; -App::$strings["Finding:"] = "Поиск:"; -App::$strings["next page"] = "следующая страница"; -App::$strings["previous page"] = "предыдущая страница"; -App::$strings["No entries (some entries may be hidden)."] = ""; -App::$strings["Status: "] = "Статус:"; -App::$strings["Sexual Preference: "] = "Сексуальная ориентация:"; -App::$strings["Homepage: "] = "Домашняя страница:"; -App::$strings["Hometown: "] = "Город проживания:"; -App::$strings["About: "] = "О себе:"; -App::$strings["Keywords: "] = "Ключевые слова:"; -App::$strings["This site is not a directory server"] = "Этот сайт не является сервером каталога"; -App::$strings["Hubzilla - "The Network""] = ""; -App::$strings["Welcome to %s"] = "Добро пожаловать в %s"; -App::$strings["Hubzilla Server - Setup"] = "Hubzilla Сервер - Установка"; +App::$strings["Details"] = "Сведения"; +App::$strings["Import Webpage Elements"] = "Импортировать части веб-страницы"; +App::$strings["Import selected"] = "Импортировать выбранное"; +App::$strings["Export Webpage Elements"] = "Экспортировать часть веб-страницы"; +App::$strings["Export selected"] = "Экспортировать выбранное"; +App::$strings["Actions"] = "Действия"; +App::$strings["Page Link"] = "Ссылка страницы"; +App::$strings["Page Title"] = "Заголовок страницы"; +App::$strings["Invalid file type."] = "Неверный тип файла."; +App::$strings["Error opening zip file"] = "Ошибка открытия ZIP файла"; +App::$strings["Invalid folder path."] = "Неверный путь к каталогу."; +App::$strings["No webpage elements detected."] = "Не обнаружено частей веб-страницы."; +App::$strings["Import complete."] = "Импорт завершен."; +App::$strings["Page link"] = "Ссылка страницы"; +App::$strings["Edit Webpage"] = "Редактировать веб-страницу"; +App::$strings["Edit Layout"] = "Редактировать шаблон"; +App::$strings["This directory server requires an access token"] = "Для доступа к этому серверу каталогов требуется токен"; +App::$strings["Comment approved"] = "Комментарий одобрен"; +App::$strings["Comment deleted"] = "Комментарий удалён"; +App::$strings["Add Article"] = "Добавить статью"; +App::$strings["Bookmark added"] = "Закладка добавлена"; +App::$strings["My Bookmarks"] = "Мои закладки"; +App::$strings["My Connections Bookmarks"] = "Закладки моих контактов"; +App::$strings["Files: shared with me"] = "Файлы: поделились со мной"; +App::$strings["NEW"] = "НОВОЕ"; +App::$strings["Last Modified"] = "Последнее изменение"; +App::$strings["Remove all files"] = "Удалить все файлы"; +App::$strings["Remove this file"] = "Удалить этот файл"; +App::$strings["Select a bookmark folder"] = "Выбрать каталог для закладок"; +App::$strings["Save Bookmark"] = "Сохранить закладку"; +App::$strings["URL of bookmark"] = "URL закладки"; +App::$strings["Or enter new bookmark folder name"] = "или введите новое имя каталога закладок"; +App::$strings["Permissions denied."] = "Доступ запрещен."; +App::$strings["Unknown App"] = "Неизвестное приложение"; +App::$strings["Authorize"] = "Авторизовать"; +App::$strings["Do you authorize the app %s to access your channel data?"] = "Авторизуете ли вы приложение %s для доступа к данным вашего канала?"; +App::$strings["Allow"] = "Разрешить"; +App::$strings["Deny"] = "Запретить"; +App::$strings["Items tagged with: %s"] = "Объекты помечены как: %s"; +App::$strings["Search results for: %s"] = "Результаты поиска для: %s"; +App::$strings["\$Projectname Server - Setup"] = "\$Projectname сервер - Установка"; App::$strings["Could not connect to database."] = "Не удалось подключиться к серверу баз данных."; -App::$strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = ""; +App::$strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Не удалось подключиться к указанному URL. Вероятно проблема с SSL сертификатом или DNS."; App::$strings["Could not create table."] = "Не удалось создать таблицу."; App::$strings["Your site database has been installed."] = "Ваша база данных установлена."; -App::$strings["You may need to import the file \"install/database.sql\" manually using phpmyadmin or mysql."] = ""; +App::$strings["You may need to import the file \"install/schema_xxx.sql\" manually using a database client."] = "Вам может понадобится импортировать файл \"install/schema_xxx.sql\" вручную используя клиент базы данных."; App::$strings["Please see the file \"install/INSTALL.txt\"."] = "Пожалуйста, обратитесь к файлу \"install/INSTALL.txt\"."; App::$strings["System check"] = "Проверка системы"; -App::$strings["Next"] = "Следующая"; -App::$strings["Check again"] = "Проверить снова"; +App::$strings["Check again"] = "Перепроверить"; App::$strings["Database connection"] = "Подключение к базе данных"; -App::$strings["In order to install Hubzilla we need to know how to connect to your database."] = ""; -App::$strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = ""; -App::$strings["The database you specify below should already exist. If it does not, please create it before continuing."] = ""; -App::$strings["Database Server Name"] = "Имя сервера базы данных"; -App::$strings["Default is localhost"] = "По умолчанию localhost"; -App::$strings["Database Port"] = "Порт базы данных"; +App::$strings["In order to install \$Projectname we need to know how to connect to your database."] = "Для установки \$Projectname необходимо знать как подключиться к ваше базе данных."; +App::$strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Пожалуйста, свяжитесь с вашим хостинг провайдером или администрацией сайта если у вас есть вопросы об этих настройках."; +App::$strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Указанная ниже база данных должна существовать. Если это не так, пожалуйста, создайте её перед тем, как продолжить."; +App::$strings["Database Server Name"] = "Имя сервера баз данных"; +App::$strings["Default is 127.0.0.1"] = "По умолчанию 127.0.0.1"; +App::$strings["Database Port"] = "Порт сервера баз данных"; App::$strings["Communication port number - use 0 for default"] = "Порт коммуникации - используйте 0 по умолчанию"; App::$strings["Database Login Name"] = "Имя для подключения к базе данных"; App::$strings["Database Login Password"] = "Пароль для подключения к базе данных"; App::$strings["Database Name"] = "Имя базы данных"; +App::$strings["Database Type"] = "Тип базы данных"; App::$strings["Site administrator email address"] = "Адрес электронной почты администратора сайта"; -App::$strings["Your account email address must match this in order to use the web admin panel."] = ""; +App::$strings["Your account email address must match this in order to use the web admin panel."] = "Ваш адрес электронной почты должен соответствовать этому для использования веб-панели администратора."; App::$strings["Website URL"] = "URL веб-сайта"; App::$strings["Please use SSL (https) URL if available."] = "Пожалуйста, используйте SSL (https) URL если возможно."; App::$strings["Please select a default timezone for your website"] = "Пожалуйста, выберите часовой пояс по умолчанию для вашего сайта"; App::$strings["Site settings"] = "Настройки сайта"; -App::$strings["Could not find a command line version of PHP in the web server PATH."] = ""; -App::$strings["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."] = ""; -App::$strings["PHP executable path"] = "PHP executable путь"; -App::$strings["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["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."] = "Это требуется для доставки сообщений."; -App::$strings["PHP register_argc_argv"] = "PHP register_argc_argv"; -App::$strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = ""; +App::$strings["PHP version 5.5 or greater is required."] = "Требуется PHP версии 5.5 или выше"; +App::$strings["PHP version"] = "Версия PHP"; +App::$strings["Could not find a command line version of PHP in the web server PATH."] = "Не удалось найти консольную версию PHP в путях переменной PATH веб-сервера."; +App::$strings["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."] = "Если у вас на сервере не установлена консольная версия PHP вы не сможете запустить фоновый опрос через cron. "; +App::$strings["PHP executable path"] = "Пусть к исполняемому модулю PHP"; +App::$strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Введите полный путь к исполняемому модулю PHP. Вы можете оставить его пустым для продолжения установки."; +App::$strings["Command line PHP"] = "Командная строка PHP"; +App::$strings["Unable to check command line PHP, as shell_exec() is disabled. This is required."] = "Невозможно проверить командную строку PHP поскольку требуемая функция shell_exec() отключена."; +App::$strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "В консольной версии PHP в вашей системе отключена опция \"register_argc_argv\"."; +App::$strings["This is required for message delivery to work."] = "Это необходимо для функционирования доставки сообщений."; +App::$strings["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."] = "Максимально разрешённый общий размер загрузок установлен в %s. Максимальный размер одной загрузки установлен в %s. Вам разрешено загружать до %d файлов за один приём."; +App::$strings["You can adjust these settings in the server php.ini file."] = "Вы можете изменить эти настройки в файле php.ini на сервере."; +App::$strings["PHP upload limits"] = "Максимальный размер загрузки в PHP"; +App::$strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Ошибка: функция \"openssl_pkey_new\" не может сгенерировать ключи шифрования"; App::$strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Если работаете под Windows, см. \"http://www.php.net/manual/en/openssl.installation.php\"."; App::$strings["Generate encryption keys"] = "Генерация ключей шифрования"; -App::$strings["libCurl PHP module"] = "libCurl PHP модуль"; -App::$strings["GD graphics PHP module"] = "GD graphics PHP модуль"; -App::$strings["OpenSSL PHP module"] = "OpenSSL PHP модуль"; -App::$strings["mysqli PHP module"] = "mysqli PHP модуль"; -App::$strings["mb_string PHP module"] = "mb_string PHP модуль"; -App::$strings["mcrypt PHP module"] = "mcrypt PHP модуль"; -App::$strings["Apache mod_rewrite module"] = "Apache mod_rewrite модуль"; -App::$strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Ошибка: Apache веб-сервер модуль mod-rewrite требуется, но не установлен."; -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"] = "Ошибка: proc_open требуется, но не установлен или отключен в php.ini"; -App::$strings["Error: libCURL PHP module required but not installed."] = "Ошибка: Модуль libCURL PHP требуется, но не установлен."; -App::$strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Ошибка: GD graphics PHP модуль с поддержкой JPEG требуется, но не установлен."; -App::$strings["Error: openssl PHP module required but not installed."] = "Ошибка: openssl PHP модуль требуется, но не установлен."; -App::$strings["Error: mysqli PHP module required but not installed."] = "Ошибка: mysqli PHP модуль требуется, но не установлен."; -App::$strings["Error: mb_string PHP module required but not installed."] = "Ошибка: mb_string PHP модуль требуется, но не установлен."; -App::$strings["Error: mcrypt PHP module required but not installed."] = "Ошибка: mcrypt PHP модуль требуется, но не установлен."; -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."] = "Веб-установщик должен быть в состоянии создать файл с именем \".htconfig.php\" в верхней папке вашего веб-сервера, но он не в состоянии сделать это."; +App::$strings["libCurl PHP module"] = ""; +App::$strings["GD graphics PHP module"] = ""; +App::$strings["OpenSSL PHP module"] = ""; +App::$strings["PDO database PHP module"] = ""; +App::$strings["mb_string PHP module"] = ""; +App::$strings["xml PHP module"] = ""; +App::$strings["zip PHP module"] = ""; +App::$strings["Apache mod_rewrite module"] = ""; +App::$strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Ошибка: требуемый модуль mod_rewrite веб-сервера Apache не установлен."; +App::$strings["exec"] = ""; +App::$strings["Error: exec is required but is either not installed or has been disabled in php.ini"] = ""; +App::$strings["shell_exec"] = ""; +App::$strings["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."] = ""; +App::$strings["Error: GD graphics PHP module with JPEG support required but not installed."] = ""; +App::$strings["Error: openssl PHP module required but not installed."] = ""; +App::$strings["Error: PDO database PHP module required but not installed."] = ""; +App::$strings["Error: mb_string PHP module required but not installed."] = ""; +App::$strings["Error: xml PHP module required for DAV but not installed."] = ""; +App::$strings["Error: zip PHP module required but not installed."] = ""; +App::$strings[".htconfig.php is writable"] = ""; +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."] = ""; App::$strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = ""; -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."] = ""; -App::$strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "Вы можете пропустить эту процедуру и выполнить установку вручную. Обратитесь к файлу \"install/INSTALL.txt\" для получения инструкций."; -App::$strings[".htconfig.php is writable"] = ".htconfig.php доступен для записи"; -App::$strings["Red 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 view/tpl/smarty3/ under the Red top level folder."] = ""; +App::$strings["Please see install/INSTALL.txt for additional information."] = ""; +App::$strings["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."] = ""; App::$strings["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 view/tpl/smarty3/ only--not the template files (.tpl) that it contains."] = ""; -App::$strings["view/tpl/smarty3 is writable"] = "view/tpl/smarty3 доступен для записи"; -App::$strings["Red 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["store is writable"] = ""; +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."] = ""; +App::$strings["%s is writable"] = "%s доступен для записи"; +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"] = "Эта программа использует каталог хранения для загруженных файлов. Для веб-сервера требуется доступ на запись начиная с верхнего уровня каталога хранения."; +App::$strings["store is writable"] = "хранилище доступно для записи"; App::$strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = ""; 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!"] = ""; -App::$strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = ""; -App::$strings["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 restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "Эти ограничения приняты поскольку ваши общедоступные публикации могут, например, содержать ссылки на изображения на вашем собственном хабе."; +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."] = ""; App::$strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = ""; App::$strings["Providers are available that issue free certificates which are browser-valid."] = ""; -App::$strings["SSL certificate validation"] = "проверка сертификата SSL"; -App::$strings["Url rewrite in .htaccess is not working. Check your server configuration."] = ""; -App::$strings["Url rewrite is working"] = "Url rewrite работает"; +App::$strings["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."] = ""; +App::$strings["SSL certificate validation"] = ""; +App::$strings["Url rewrite in .htaccess is not working. Check your server configuration.Test: "] = ""; +App::$strings["Url rewrite is working"] = "Перезапись URL работает"; App::$strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = ""; -App::$strings["Errors encountered creating database tables."] = ""; -App::$strings["<h1>What next</h1>"] = "<h1>Что дальше</h1>"; -App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = ""; -App::$strings["Item not found"] = "Элемент не найден"; -App::$strings["Edit Block"] = "Редактировать блок"; -App::$strings["Delete block?"] = "Удалить блок?"; -App::$strings["Insert YouTube video"] = "Вставить YouTube видео"; -App::$strings["Insert Vorbis [.ogg] video"] = "Вставить Vorbis [.ogg] видео"; -App::$strings["Insert Vorbis [.ogg] audio"] = "Вставить Vorbis [.ogg] музыку"; -App::$strings["Delete Block"] = "Удалить блок"; -App::$strings["Layout updated."] = "Шаблон обновлен."; -App::$strings["Edit System Page Description"] = ""; -App::$strings["Layout not found."] = "Шаблон не найден"; -App::$strings["Module Name:"] = "Имя модуля:"; -App::$strings["Layout Help"] = "Помощь к шаблону"; -App::$strings["Edit Layout"] = "Редактировать шаблон"; -App::$strings["Delete layout?"] = "Удалить шаблон?"; -App::$strings["Delete Layout"] = "Удалить шаблон"; -App::$strings["Item is not editable"] = "Элемент нельзя редактировать"; -App::$strings["Delete item?"] = "Удалить элемент?"; -App::$strings["Edit Webpage"] = "Редактировать веб-страницу"; -App::$strings["Delete webpage?"] = "Удалить веб-страницу?"; -App::$strings["Delete Webpage"] = "Удалить веб-страницу"; -App::$strings["Version %s"] = "Версия %s"; -App::$strings["Installed plugins/addons/apps:"] = ""; -App::$strings["No installed plugins/addons/apps"] = ""; -App::$strings["Red"] = "Red"; -App::$strings["This is a hub of the Hubzilla - a global cooperative network of decentralised privacy enhanced websites."] = ""; -App::$strings["Running at web location"] = ""; -App::$strings["Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more about the Hubzilla."] = "Пожалуйста посетите <a href=\"http://getzot.com\">GetZot.com</a> чтобы узнать больше о Hubzilla."; -App::$strings["Bug reports and issues: please visit"] = ""; -App::$strings["Suggestions, praise, etc. - please email \"hubzilla\" at librelist - dot com"] = ""; -App::$strings["Site Administrators"] = "Администратор сайта"; -App::$strings["Page owner information could not be retrieved."] = ""; -App::$strings["Album not found."] = "Альбом не найден."; -App::$strings["Delete Album"] = "Удалить альбом"; -App::$strings["Delete Photo"] = "Удалить фотографию"; -App::$strings["No photos selected"] = "Никакие фотографии не выбраны"; -App::$strings["Access to this item is restricted."] = "Доступ к этому элементу ограничен."; -App::$strings["You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."] = "Вы использовали %1$.2f мегабайт из %2$.2f для хранения фото."; -App::$strings["You have used %1$.2f Mbytes of photo storage."] = "Вы использовали %1$.2f мегабайт для хранения фото."; -App::$strings["Upload Photos"] = "Загрузить фотографии"; -App::$strings["New album name: "] = "Название нового альбома:"; -App::$strings["or existing album name: "] = "или существующий альбом:"; -App::$strings["Do not show a status post for this upload"] = "Не показывать пост о состоянии этой загрузки"; -App::$strings["Contact Photos"] = "Фотографии контакта"; -App::$strings["Edit Album"] = "Редактировать Фотоальбом"; -App::$strings["Show Newest First"] = "Показать новые первыми"; -App::$strings["Show Oldest First"] = "Показать старые первыми"; -App::$strings["View Photo"] = "Посмотреть фотографию"; -App::$strings["Permission denied. Access to this item may be restricted."] = ""; -App::$strings["Photo not available"] = "Фотография не доступна"; -App::$strings["Use as profile photo"] = "Использовать в качестве фотографии профиля"; -App::$strings["View Full Size"] = "Посмотреть в полный размер"; -App::$strings["Edit photo"] = "Редактировать фотографию"; -App::$strings["Rotate CW (right)"] = "Повернуть CW (направо)"; -App::$strings["Rotate CCW (left)"] = "Повернуть CCW (налево)"; -App::$strings["New album name"] = "Новое название альбома:"; -App::$strings["Caption"] = "Подпись"; -App::$strings["Add a Tag"] = "Добавить тег"; -App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Например: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"; -App::$strings["In This Photo:"] = ""; -App::$strings["View Album"] = "Посмотреть фотоальбом"; -App::$strings["Recent Photos"] = "Последние фотографии"; -App::$strings["Failed to create source. No channel selected."] = ""; -App::$strings["Source created."] = "Источник создан"; -App::$strings["Source updated."] = "Источник обновлен."; -App::$strings["*"] = "*"; -App::$strings["Manage remote sources of content for your channel."] = ""; -App::$strings["New Source"] = "Новый источник"; -App::$strings["Import all or selected content from the following channel into this channel and distribute it according to your channel settings."] = ""; -App::$strings["Only import content with these words (one per line)"] = ""; -App::$strings["Leave blank to import all public content"] = ""; -App::$strings["Channel Name"] = "Имя канала"; -App::$strings["Source not found."] = "Источник не найден."; -App::$strings["Edit Source"] = "Редактировать источник"; -App::$strings["Delete Source"] = "Удалить источник"; -App::$strings["Source removed"] = "Источник удален"; -App::$strings["Unable to remove source."] = ""; -App::$strings["- select -"] = "- выбрать -"; -App::$strings["Event title and start time are required."] = "Название события и время начала требуется."; -App::$strings["l, F j"] = "l, F j"; -App::$strings["Edit event"] = "Редактировать мероприятие"; -App::$strings["Create New Event"] = "Создать новое мероприятие"; -App::$strings["Previous"] = "Предыдущая"; -App::$strings["hour:minute"] = "часы:минуты"; -App::$strings["Event details"] = "Детали мероприятия"; -App::$strings["Format is %s %s. Starting date and Title are required."] = "Формат: %s %s. Дата начала и название необходимы."; -App::$strings["Event Starts:"] = "Начало мероприятия:"; -App::$strings["Required"] = "Необходимо"; -App::$strings["Finish date/time is not known or not relevant"] = "Дата окончания или время окончания не известно / не релевантно."; -App::$strings["Event Finishes:"] = "\t\nКонец мероприятий:"; -App::$strings["Adjust for viewer timezone"] = "Отрегулируйте для просмотра часовых поясов"; -App::$strings["Description:"] = "Описание:"; -App::$strings["Title:"] = "Заголовок:"; -App::$strings["Share this event"] = "Поделиться этим мероприятием"; -App::$strings["Permission Denied."] = "Доступ запрещен."; -App::$strings["File not found."] = "Файл не найден."; -App::$strings["Edit file permissions"] = "Редактировать разрешения файла"; -App::$strings["Set/edit permissions"] = ""; -App::$strings["Include all files and sub folders"] = ""; -App::$strings["Return to file list"] = ""; -App::$strings["Copy/paste this code to attach file to a post"] = ""; -App::$strings["Copy/paste this URL to link file from a web page"] = ""; -App::$strings["Channel added."] = "Контакт добавлен."; -App::$strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s следит %2\$s's %3\$s"; -App::$strings["Contact not found."] = "Контакт не найден."; -App::$strings["Friend suggestion sent."] = "Предложение дружить отправлено."; -App::$strings["Suggest Friends"] = "Пригласить друзей"; -App::$strings["Suggest a friend for %s"] = ""; -App::$strings["No suggestions available. If this is a new site, please try again in 24 hours."] = ""; -App::$strings["Collection created."] = "Коллекция создана."; -App::$strings["Could not create collection."] = "Не удалось создать коллекцию."; -App::$strings["Collection updated."] = ""; -App::$strings["Create a collection of channels."] = "Создать коллекцию контактов"; -App::$strings["Collection Name: "] = "Название коллекции:"; -App::$strings["Members are visible to other channels"] = "Пользователи могут видеть другие каналы"; -App::$strings["Collection removed."] = "Коллекция удалена."; -App::$strings["Unable to remove collection."] = "Невозможно удалить коллекцию."; -App::$strings["Collection Editor"] = "Редактор коллекций"; -App::$strings["Members"] = "Участники"; -App::$strings["All Connected Channels"] = "Все подключенные контакы"; -App::$strings["Click on a channel to add or remove."] = "Нажмите на канал, чтобы добавить или удалить."; -App::$strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = ""; -App::$strings["Help:"] = "Помощь:"; -App::$strings["Not Found"] = "Не найдено"; -App::$strings["Tag removed"] = "Тег удален"; -App::$strings["Remove Item Tag"] = "Удалить Тег"; -App::$strings["Select a tag to remove: "] = "Выбрать тег для удаления: "; -App::$strings["Theme settings updated."] = "Настройки темы обновленны."; -App::$strings["Site"] = "Сайт"; -App::$strings["Accounts"] = "Пользователи"; -App::$strings["Channels"] = "Каналы"; -App::$strings["Plugins"] = "Плагины"; -App::$strings["Themes"] = "Темы"; -App::$strings["Server"] = "Серверы"; -App::$strings["DB updates"] = "Обновление базы данных"; -App::$strings["Logs"] = "Журналы"; -App::$strings["Plugin Features"] = "Функции плагинов"; -App::$strings["User registrations waiting for confirmation"] = "Регистрации пользователей, которые ждут подтверждения"; -App::$strings["Message queues"] = "Очередь недоставленных сообщений"; -App::$strings["Administration"] = "Администрация"; -App::$strings["Summary"] = "Резюме"; -App::$strings["Registered users"] = "Всего пользователeй"; -App::$strings["Pending registrations"] = "Ждут утверждения"; -App::$strings["Version"] = "Версия системы"; -App::$strings["Active plugins"] = "Активные плагины"; +App::$strings["<h1>What next?</h1>"] = "<h1>Что дальше? </h1>"; +App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "Вам понадобится [вручную] настроить запланированную задачу для опрашивателя."; +App::$strings["Remote privacy information not available."] = "Удаленная информация о конфиденциальности недоступна."; +App::$strings["Visible to:"] = "Видимо для:"; +App::$strings["Connection added."] = "Контакт добавлен."; +App::$strings["Menu not found."] = "Меню не найдено"; +App::$strings["Unable to create element."] = "Невозможно создать элемент."; +App::$strings["Unable to update menu element."] = "Невозможно обновить элемент меню."; +App::$strings["Unable to add menu element."] = "Невозможно добавить элемент меню."; +App::$strings["Menu Item Permissions"] = "Разрешения на пункт меню"; +App::$strings["(click to open/close)"] = "(нажмите чтобы открыть/закрыть)"; +App::$strings["Link Name"] = "Имя ссылки"; +App::$strings["Link or Submenu Target"] = "Ссылка или цель подменю"; +App::$strings["Enter URL of the link or select a menu name to create a submenu"] = "Введите URL ссылки или выберите имя меню для создания подменю"; +App::$strings["Use magic-auth if available"] = "Использовать magic-auth если возможно"; +App::$strings["Open link in new window"] = "Открыть ссылку в новом окне"; +App::$strings["Order in list"] = "Порядок в списке"; +App::$strings["Higher numbers will sink to bottom of listing"] = "Большие значения в конце списка"; +App::$strings["Submit and finish"] = "Отправить и завершить"; +App::$strings["Submit and continue"] = "Отправить и продолжить"; +App::$strings["Menu:"] = "Меню:"; +App::$strings["Link Target"] = "Цель ссылки"; +App::$strings["Edit menu"] = "Редактировать меню"; +App::$strings["Edit element"] = "Редактировать элемент"; +App::$strings["Drop element"] = "Удалить элемент"; +App::$strings["New element"] = "Новый элемент"; +App::$strings["Edit this menu container"] = "Редактировать контейнер меню"; +App::$strings["Add menu element"] = "Добавить элемент меню"; +App::$strings["Delete this menu item"] = "Удалить этот элемент меню"; +App::$strings["Edit this menu item"] = "Редактировать этот элемент меню"; +App::$strings["Menu item not found."] = "Элемент меню не найден."; +App::$strings["Menu item deleted."] = "Элемент меню удалён."; +App::$strings["Menu item could not be deleted."] = "Невозможно удалить элемент меню."; +App::$strings["Edit Menu Element"] = "Редактировать элемент меню"; +App::$strings["Link text"] = "Текст ссылки"; +App::$strings["Plugin %s disabled."] = "Плагин %s отключен."; +App::$strings["Plugin %s enabled."] = "Плагин %s включен."; +App::$strings["Disable"] = "Запретить"; +App::$strings["Enable"] = "Разрешить"; +App::$strings["Toggle"] = "Переключить"; +App::$strings["Author: "] = "Автор: "; +App::$strings["Maintainer: "] = "Сопровождающий:"; +App::$strings["Minimum project version: "] = "Минимальная версия проекта:"; +App::$strings["Maximum project version: "] = "Максимальная версия проекта:"; +App::$strings["Minimum PHP version: "] = "Минимальная версия PHP:"; +App::$strings["Compatible Server Roles: "] = "Совместимые роли сервера:"; +App::$strings["Requires: "] = "Необходимо:"; +App::$strings["Disabled - version incompatibility"] = "Отключено - несовместимость версий"; +App::$strings["Enter the public git repository URL of the addon repo."] = "Введите URL публичного репозитория расширений git"; +App::$strings["Addon repo git URL"] = "URL репозитория расширений git"; +App::$strings["Custom repo name"] = "Пользовательское имя репозитория"; +App::$strings["(optional)"] = "(необязательно)"; +App::$strings["Download Addon Repo"] = "Загрузить репозиторий расширений"; +App::$strings["Install new repo"] = "Установить новый репозиторий"; +App::$strings["Manage Repos"] = "Управление репозиториями"; +App::$strings["Installed Addon Repositories"] = "Установленные репозитории расширений"; +App::$strings["Install a New Addon Repository"] = "Установить новый репозиторий расширений"; +App::$strings["Switch branch"] = "Переключить ветку"; App::$strings["Site settings updated."] = "Настройки сайта обновлены."; -App::$strings["No special theme for accessibility"] = ""; -App::$strings["Yes - with approval"] = ""; -App::$strings["My site is not a public server"] = ""; -App::$strings["My site has paid access only"] = ""; -App::$strings["My site has free access only"] = ""; -App::$strings["My site offers free accounts with optional paid upgrades"] = ""; +App::$strings["%s - (Incompatible)"] = "%s - (несовместимо)"; +App::$strings["mobile"] = "мобильный"; +App::$strings["experimental"] = "экспериментальный"; +App::$strings["unsupported"] = "неподдерживаемый"; +App::$strings["Yes - with approval"] = "Да - требует подтверждения"; +App::$strings["My site is not a public server"] = "Мой сайт не является публичным сервером"; +App::$strings["My site has paid access only"] = "Мой сайт доступен только с оплатой "; +App::$strings["My site has free access only"] = "На моём сайте разрешён свободный доступ"; +App::$strings["My site offers free accounts with optional paid upgrades"] = "На моём сайте разрешены бесплатные аккаунты с дополнительными платными услугами"; +App::$strings["Beginner/Basic"] = "Начинающий/Базовый"; +App::$strings["Novice - not skilled but willing to learn"] = "Новичок - не опытный, но желающий учиться"; +App::$strings["Intermediate - somewhat comfortable"] = "Промежуточный - более удобный"; +App::$strings["Advanced - very comfortable"] = "Продвинутый - очень удобный"; +App::$strings["Expert - I can write computer code"] = "Эксперт - я умею программировать"; +App::$strings["Wizard - I probably know more than you do"] = "Волшебник - возможно я знаю больше чем ты"; +App::$strings["Default permission role for new accounts"] = "Разрешения по умолчанию для новых аккаунтов"; +App::$strings["This role will be used for the first channel created after registration."] = "Эта роль будет использоваться для первого канала, созданного после регистрации."; +App::$strings["Registration"] = "Регистрация"; App::$strings["File upload"] = "Загрузка файла"; App::$strings["Policies"] = "Правила"; -App::$strings["Site name"] = "Название сайта"; +App::$strings["Site default technical skill level"] = "Уровень технических навыков на сайте по умолчанию"; +App::$strings["Used to provide a member experience matched to technical comfort level"] = "Используется чтобы обеспечить удобство на уровне технических навыков пользователя"; +App::$strings["Lock the technical skill level setting"] = "Заблокировать уровень технических навыков"; +App::$strings["Members can set their own technical comfort level by default"] = "Участники могут выбрать уровень своих технических навыков по умолчанию"; App::$strings["Banner/Logo"] = "Баннер / логотип"; +App::$strings["Unfiltered HTML/CSS/JS is allowed"] = "Разрешён нефильтруемый HTML/CSS/JS"; App::$strings["Administrator Information"] = "Информация об администраторе"; -App::$strings["Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here"] = ""; +App::$strings["Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here"] = "Контактная информация для администраторов сайта. Показывается на информационной странице сайта. Можно использовать BBCode."; +App::$strings["Publicly visible description of this site. Displayed on siteinfo page. BBCode can be used here"] = "Публичное видимое описание сайта. Показывается на информационной странице сайта. Можно использовать BBCode."; App::$strings["System language"] = "Язык системы"; -App::$strings["System theme"] = "Тема системы"; -App::$strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = ""; -App::$strings["Mobile system theme"] = "Мобильная тема системы"; -App::$strings["Theme for mobile devices"] = "Тема для мобильных устройств"; -App::$strings["Accessibility system theme"] = ""; -App::$strings["Accessibility theme"] = ""; -App::$strings["Channel to use for this website's static pages"] = ""; -App::$strings["Site Channel"] = "Канал сайта"; -App::$strings["Maximum image size"] = "Максимальный размер"; -App::$strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = ""; -App::$strings["Does this site allow new member registration?"] = ""; -App::$strings["Which best describes the types of account offered by this hub?"] = ""; +App::$strings["System theme"] = "Системная тема"; +App::$strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Системная тема по умолчанию - может быть изменена в профиле пользователя - <a href='#' id='cnftheme'>изменить параметры темы</a>."; +App::$strings["Allow Feeds as Connections"] = "Разрешить ленты новостей как контакты"; +App::$strings["(Heavy system resource usage)"] = "(Высокое использование системных ресурсов)"; +App::$strings["Maximum image size"] = "Максимальный размер изображения"; +App::$strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "Максимальный размер загруженных изображений в байтах. По умолчанию 0 или без ограничений."; +App::$strings["Does this site allow new member registration?"] = "Разрешается ли регистрация новых пользователей на этом сайте?"; +App::$strings["Invitation only"] = "Только по приглашениям"; +App::$strings["Only allow new member registrations with an invitation code. Above register policy must be set to Yes."] = "Регистрация пользователей разрешается только по приглашениям. Вышеуказанная политика регистрация должны быть установлена в \"Да\"."; +App::$strings["Minimum age"] = "Минимальный возраст"; +App::$strings["Minimum age (in years) for who may register on this site."] = "Минимальный возраст (в годах) для регистрации на этом сайте."; +App::$strings["Which best describes the types of account offered by this hub?"] = "Как лучше описать тип учётных записей предлагаемых на этом хабе?"; App::$strings["Register text"] = "Текст регистрации"; -App::$strings["Will be displayed prominently on the registration page."] = ""; -App::$strings["Accounts abandoned after x days"] = ""; -App::$strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = ""; +App::$strings["Will be displayed prominently on the registration page."] = "Будет отображаться на странице регистрации на видном месте."; +App::$strings["Site homepage to show visitors (default: login box)"] = "Домашняя страница, которая будет показываться посетителям сайт (по умочанию - форма входа)."; +App::$strings["example: 'public' to show public stream, 'page/sys/home' to show a system webpage called 'home' or 'include:home.html' to include a file."] = "например: 'public' для показа публичного потока, 'page/sys/home' показывает системную страницу home или 'include:home.html' для подключения файла."; +App::$strings["Preserve site homepage URL"] = "Сохранить URL главной страницы сайта"; +App::$strings["Present the site homepage in a frame at the original location instead of redirecting"] = "Показывать домашнюю страницу сайта во фрейме вместо стандартной переадресации"; +App::$strings["Accounts abandoned after x days"] = "Аккаунты считаются заброшенными после N дней"; +App::$strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "Системные ресурсы не будут расходоваться для опроса внешних сайтов для заброшенных аккаунтов. Введите 0 для отсутствия ограничений."; App::$strings["Allowed friend domains"] = "Разрешенные домены друзей"; -App::$strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = ""; -App::$strings["Allowed email domains"] = "Разрешенные домены электронной почты"; -App::$strings["Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"] = ""; -App::$strings["Block public"] = "Блокировать публичный доступ"; -App::$strings["Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."] = ""; -App::$strings["Force publish"] = "Заставить публиковать"; -App::$strings["Check to force all profiles on this site to be listed in the site directory."] = ""; -App::$strings["Disable discovery tab"] = "Отключить вкладку \"обнаруженные\""; -App::$strings["Remove the tab in the network view with public content pulled from sources chosen for this site."] = ""; -App::$strings["No login on Homepage"] = ""; -App::$strings["Check to hide the login form from your sites homepage when visitors arrive who are not logged in (e.g. when you put the content of the homepage in via the site channel)."] = ""; -App::$strings["Proxy user"] = "Proxy пользователь"; -App::$strings["Proxy URL"] = "Proxy URL"; +App::$strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "Список разделённых запятыми доменов с которыми разрешено устанавливать дружеские отношения на этом сайте. Wildcards разрешены. Пусто означает разрешены любые домены."; +App::$strings["Verify Email Addresses"] = "Проверка адреса электронной почты"; +App::$strings["Check to verify email addresses used in account registration (recommended)."] = "Включите для проверки адреса электронной почты использованного при регистрации (рекомендуется)."; +App::$strings["Force publish"] = "Принудительно публиковать"; +App::$strings["Check to force all profiles on this site to be listed in the site directory."] = "Включите для принудительного включения всех учётных записей на данном сайте в каталог."; +App::$strings["Import Public Streams"] = "Импортированные публичные потоки"; +App::$strings["Import and allow access to public content pulled from other sites. Warning: this content is unmoderated."] = "Импортировать и разрешить публичный доступ к загружаемым с других сайтов потоков. Внимание - этот контент не может модерироваться."; +App::$strings["Site only Public Streams"] = "Публичные потоки только с сайта"; +App::$strings["Allow access to public content originating only from this site if Imported Public Streams are disabled."] = "Разрешить доступ к общедоступному контенту, исходящему только с этого сайта, если импортированные публичные потоки отключены."; +App::$strings["Allow anybody on the internet to access the Public streams"] = "Разрешить всем доступ к публичным потокам"; +App::$strings["Disable to require authentication before viewing. Warning: this content is unmoderated."] = "Отключите если для просмотра требуется аутентификация. Внимание - этот контент не может модерироваться."; +App::$strings["Only import Public stream posts with this text"] = "Импортировать только публичные потоки с этим текстом"; +App::$strings["Do not import Public stream posts with this text"] = "Не импортировать публичные потоки с этим текстом"; +App::$strings["Login on Homepage"] = "Вход на домашней странице"; +App::$strings["Present a login box to visitors on the home page if no other content has been configured."] = "Предоставлять форму входа для посетителей на домашней странице если другого содержимого не настроено."; +App::$strings["Enable context help"] = "Включить контекстную помощь"; +App::$strings["Display contextual help for the current page when the help button is pressed."] = "Показывать контекстную помощь для текущей странице при нажатии на кнопку \"Помощь\"."; +App::$strings["Reply-to email address for system generated email."] = "Адрес email Reply-to для генерируемых системой сообщений."; +App::$strings["Sender (From) email address for system generated email."] = "Адрес email отправителя (From) для генерируемых системой сообщений."; +App::$strings["Name of email sender for system generated email."] = "Имя отправителя для генерируемых системой сообщений."; +App::$strings["Directory Server URL"] = "URL сервера каталогов"; +App::$strings["Default directory server"] = "Сервер каталогов по умолчанию"; +App::$strings["Proxy user"] = "Имя пользователя proxy-сервера"; +App::$strings["Proxy URL"] = "URL proxy-сервера"; App::$strings["Network timeout"] = "Время ожидания сети"; -App::$strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = ""; +App::$strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "Значение в секундах. Если установлен в 0 - без ограничений (не рекомендуется)."; App::$strings["Delivery interval"] = "Интервал доставки"; -App::$strings["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."] = ""; +App::$strings["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."] = "Значение задержки фоновых процессов доставки в секундах для снижения нагрузки на систему. Рекомендуется 4-5 для серверов совместного использования, 2-3 для частных виртуальных и 0-1 для выделенных серверов."; +App::$strings["Deliveries per process"] = "Доставок на процесс"; +App::$strings["Number of deliveries to attempt in a single operating system process. Adjust if necessary to tune system performance. Recommend: 1-5."] = "Количество доставок для одного процесса. Настройте в соответствии с производительностью системы. Рекомендуется 1-5."; +App::$strings["Queue Threshold"] = "Порог очереди"; +App::$strings["Always defer immediate delivery if queue contains more than this number of entries."] = "Всегда откладывать немедленную доставку, если в очереди содержится большее количество записей, чем это."; App::$strings["Poll interval"] = "Интервал опроса"; -App::$strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = ""; -App::$strings["Maximum Load Average"] = ""; -App::$strings["Maximum system load before delivery and poll processes are deferred - default 50."] = ""; -App::$strings["No server found"] = "Сервер не найден"; -App::$strings["ID"] = "ID"; -App::$strings["for channel"] = "для канала"; -App::$strings["on server"] = "на сервере"; -App::$strings["Status"] = "Статус"; -App::$strings["Update has been marked successful"] = ""; -App::$strings["Executing %s failed. Check system logs."] = ""; -App::$strings["Update %s was successfully applied."] = ""; -App::$strings["Update %s did not return a status. Unknown if it succeeded."] = ""; -App::$strings["Update function %s could not be found."] = ""; -App::$strings["No failed updates."] = "Ошибок обновлений нет."; -App::$strings["Failed Updates"] = "Обновления с ошибками"; -App::$strings["Mark success (if update was manually applied)"] = ""; -App::$strings["Attempt to execute this update step automatically"] = ""; -App::$strings["%s user blocked/unblocked"] = array( - 0 => "", - 1 => "", - 2 => "", +App::$strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "Задержка фоновых процессов опроса на указанное количество секунд для снижения нагрузки на систему. Если 0 - использовать интервал доставки."; +App::$strings["Path to ImageMagick convert program"] = "Путь к ImageMagick"; +App::$strings["If set, use this program to generate photo thumbnails for huge images ( > 4000 pixels in either dimension), otherwise memory exhaustion may occur. Example: /usr/bin/convert"] = "При установке эта программа генерирует миниатюры изображений для больших файлов (свыше 4000 в любом измерении) для предотвращения утечки памяти. Пример: /usr/bin/convert"; +App::$strings["Allow SVG thumbnails in file browser"] = "Разрешить SVG миниатюры в просмотрщике файлов"; +App::$strings["WARNING: SVG images may contain malicious code."] = "Внимание: изображения SVG могут содержать вредоносный код."; +App::$strings["Maximum Load Average"] = "Максимальная средняя нагрузка"; +App::$strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Максимальная нагрузка системы для откладывания процессов опроса и доставки - по умолчанию 50."; +App::$strings["Expiration period in days for imported (grid/network) content"] = "Срок хранения в днях для импортированного содержимого (из матрицы / сети)."; +App::$strings["0 for no expiration of imported content"] = "0 для постоянного хранения импортированного содержимого"; +App::$strings["Do not expire any posts which have comments less than this many days ago"] = "Продлевать строк хранения для любых публикаций, которые имею комментарии возрастом менее этого значения"; +App::$strings["Public servers: Optional landing (marketing) webpage for new registrants"] = "Публичные серверы: необязательная маркетинговая лэндинг-страница для новых пользователей"; +App::$strings["Create this page first. Default is %s/register"] = "Создать эту страницу первой. По умолчанию %s/register"; +App::$strings["Page to display after creating a new channel"] = "Страница для показа после создания нового канала"; +App::$strings["Default: profiles"] = "По умолчанию: профили"; +App::$strings["Optional: site location"] = "Необязательно: место размещения сайта"; +App::$strings["Region or country"] = "Регион или страна"; +App::$strings["Log settings updated."] = "Настройки журнала обновлены."; +App::$strings["Clear"] = "Очистить"; +App::$strings["Debugging"] = "Отладка"; +App::$strings["Log file"] = "Файл журнала"; +App::$strings["Must be writable by web server. Relative to your top-level webserver directory."] = "Должен быть доступен для записи веб-сервером. Пусть относителен основного каталога веб-сайта."; +App::$strings["Log level"] = "Уровень журнала"; +App::$strings["%s account blocked/unblocked"] = array( + 0 => "%s аккаунт блокирован/разблокирован", + 1 => "%s аккаунта блокированы/разблокированы", + 2 => "%s аккаунтов блокированы/разблокированы", ); -App::$strings["%s user deleted"] = array( - 0 => "%s канал удален", - 1 => "%s канала удалены", - 2 => "%s каналов удалено", +App::$strings["%s account deleted"] = array( + 0 => "%s аккаунт удалён", + 1 => "%s аккаунта удалёны", + 2 => "%s аккаунтов удалёны", ); App::$strings["Account not found"] = "Аккаунт не найден"; -App::$strings["User '%s' deleted"] = "Пользователь '%s' удален"; -App::$strings["User '%s' unblocked"] = "Пользователь '%s' разрешен"; -App::$strings["User '%s' blocked"] = "Пользователь '%s' заблокирован"; -App::$strings["Users"] = "Пользователи"; +App::$strings["Account '%s' blocked"] = "Аккаунт '%s' заблокирован"; +App::$strings["Account '%s' unblocked"] = "Аккаунт '%s' разблокирован"; App::$strings["select all"] = "выбрать все"; -App::$strings["User registrations waiting for confirm"] = "Регистрации пользователей ждут подтверждения"; +App::$strings["Registrations waiting for confirm"] = "Регистрации ждут подтверждения"; App::$strings["Request date"] = "Дата запроса"; -App::$strings["No registrations."] = "Новых регистраций пока нет."; -App::$strings["Approve"] = "Утвердить"; -App::$strings["Deny"] = "Запретить"; +App::$strings["No registrations."] = "Нет новых регистраций."; +App::$strings["ID"] = ""; +App::$strings["All Channels"] = "Все каналы"; App::$strings["Register date"] = "Дата регистрации"; App::$strings["Last login"] = "Последний вход"; -App::$strings["Expires"] = ""; -App::$strings["Service Class"] = "Класс службы"; -App::$strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = ""; -App::$strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = ""; +App::$strings["Expires"] = "Срок действия"; +App::$strings["Service Class"] = "Класс обслуживания"; +App::$strings["Selected accounts will be deleted!\\n\\nEverything these accounts had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Выбранные учётные записи будут удалены!\n\nВсё что было ими опубликовано на этом сайте будет удалено навсегда!\n\nВы уверены?"; +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?"] = "Этот аккаунт {0} будет удалён!\n\nВсё что им было опубликовано на этом сайте будет удалено навсегда!\n\nВы уверены?"; +App::$strings["By default, unfiltered HTML is allowed in embedded media. This is inherently insecure."] = "По умолчанию, HTML без фильтрации доступен во встраиваемых медиа. Это небезопасно."; +App::$strings["The recommended setting is to only allow unfiltered HTML from the following sites:"] = "Рекомендуется настроить разрешения использовать HTML без фильтрации только для следующих сайтов:"; +App::$strings["https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />"] = ""; +App::$strings["All other embedded content will be filtered, <strong>unless</strong> embedded content from that site is explicitly blocked."] = "се остальные встроенные материалы будут отфильтрованы, <strong>если </strong> встроенное содержимое с этого сайта явно заблокировано."; +App::$strings["Block public"] = "Блокировать публичный доступ"; +App::$strings["Check to block public access to all otherwise public personal pages on this site unless you are currently authenticated."] = "Установите флажок для блокировки публичного доступа ко всем другим общедоступным страницам на этом сайте, если вы в настоящее время не аутентифицированы."; +App::$strings["Provide a cloud root directory"] = "Предоставить корневой каталог в облаке"; +App::$strings["The cloud root directory lists all channel names which provide public files"] = "В корневом каталоге облака показываются все имена каналов, которые предоставляют общедоступные файлы"; +App::$strings["Show total disk space available to cloud uploads"] = "Показывать общее доступное для загрузок место в хранилище"; +App::$strings["Set \"Transport Security\" HTTP header"] = "Установить HTTP-заголовок \"Transport Security\""; +App::$strings["Set \"Content Security Policy\" HTTP header"] = "Установить HTTP-заголовок \"Content Security Policy\""; +App::$strings["Allowed email domains"] = "Разрешённые домены email"; +App::$strings["Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"] = "Список разделённых запятыми доменов для которых разрешена регистрация на этом сайте. Wildcards разрешены. Если пусто то разрешены любые домены."; +App::$strings["Not allowed email domains"] = "Запрещённые домены email"; +App::$strings["Comma separated list of domains which are not allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains, unless allowed domains have been defined."] = "Список разделённых запятыми доменов для которых запрещена регистрация на этом сайте. Wildcards разрешены. Если пусто то разрешены любые домены до тех пор, пока разрешённые домены не будут указаны."; +App::$strings["Allow communications only from these sites"] = "Разрешить связь только с этими сайтами"; +App::$strings["One site per line. Leave empty to allow communication from anywhere by default"] = "Один сайт на строку. Оставьте пустым для разрешения взаимодействия без ограничений (по умочанию)."; +App::$strings["Block communications from these sites"] = "Блокировать связь с этими сайтами"; +App::$strings["Allow communications only from these channels"] = "Разрешить связь только для этих каналов"; +App::$strings["One channel (hash) per line. Leave empty to allow from any channel by default"] = "Один канал (или его хэш) на строку. Оставьте пустым для разрешения взаимодействия с любым каналом (по умолчанию)."; +App::$strings["Block communications from these channels"] = "Блокировать связь с этими каналами"; +App::$strings["Only allow embeds from secure (SSL) websites and links."] = "Разрешать встраивание только для безопасных (SSL/TLS) сайтов и ссылок."; +App::$strings["Allow unfiltered embedded HTML content only from these domains"] = "Разрешить встраивать нефильтруемое HTML-содержимое только для этих доменов"; +App::$strings["One site per line. By default embedded content is filtered."] = "Один сайт на строку. По умолчанию встраиваемое содержимое фильтруется."; +App::$strings["Block embedded HTML from these domains"] = "Блокировать встраивание HTML-содержимого для этих доменов"; +App::$strings["Update has been marked successful"] = "Обновление было помечено как успешное"; +App::$strings["Executing %s failed. Check system logs."] = "Выполнение %s неудачно. Проверьте системный журнал."; +App::$strings["Update %s was successfully applied."] = "Обновление %sбыло успешно применено."; +App::$strings["Update %s did not return a status. Unknown if it succeeded."] = "Обновление %s не вернуло статус. Неизвестно было ли оно успешным."; +App::$strings["Update function %s could not be found."] = "Функция обновления %sне может быть найдена."; +App::$strings["Failed Updates"] = "Обновления с ошибками"; +App::$strings["Mark success (if update was manually applied)"] = "Пометить успешным (если обновление было применено вручную)"; +App::$strings["Attempt to execute this update step automatically"] = "Попытаться применить это обновление автоматически"; +App::$strings["No failed updates."] = "Ошибок обновлений нет."; +App::$strings["New Profile Field"] = "Поле нового профиля"; +App::$strings["Field nickname"] = "Псевдоним поля"; +App::$strings["System name of field"] = "Системное имя поля"; +App::$strings["Input type"] = "Тип ввода"; +App::$strings["Field Name"] = "Имя поля"; +App::$strings["Label on profile pages"] = "Метка на странице профиля"; +App::$strings["Help text"] = "Текст подсказки"; +App::$strings["Additional info (optional)"] = "Дополнительная информация (необязательно)"; +App::$strings["Field definition not found"] = "Определения поля не найдено"; +App::$strings["Edit Profile Field"] = "Редактировать поле профиля"; +App::$strings["Basic Profile Fields"] = "Основные поля профиля"; +App::$strings["Advanced Profile Fields"] = "Дополнительные поля профиля"; +App::$strings["(In addition to basic fields)"] = "(к основым полям)"; +App::$strings["All available fields"] = "Все доступные поля"; +App::$strings["Custom Fields"] = "Настраиваемые поля"; +App::$strings["Create Custom Field"] = "Создать настраиваемое поле"; +App::$strings["Theme settings updated."] = "Настройки темы обновленны."; +App::$strings["No themes found."] = "Темы не найдены."; +App::$strings["Screenshot"] = "Снимок экрана"; +App::$strings["[Experimental]"] = "[экспериментальный]"; +App::$strings["[Unsupported]"] = "[неподдерживаемый]"; +App::$strings["Off"] = "Выкл."; +App::$strings["On"] = "Вкл."; +App::$strings["Lock feature %s"] = "Заблокировать функцию \"%s\""; +App::$strings["Manage Additional Features"] = "Управлять дополнительными функциями"; +App::$strings["Queue Statistics"] = "Статистика очереди"; +App::$strings["Total Entries"] = "Всего записей"; +App::$strings["Priority"] = "Приоритет"; +App::$strings["Destination URL"] = "Конечный URL-адрес"; +App::$strings["Mark hub permanently offline"] = "Пометить хаб как постоянно отключенный"; +App::$strings["Empty queue for this hub"] = "Освободить очередь для этого хаба"; +App::$strings["Last known contact"] = "Последний известный контакт"; +App::$strings["Password changed for account %d."] = "Пароль для аккаунта %d изменён."; +App::$strings["Account settings updated."] = "Настройки аккаунта обновлены."; +App::$strings["Account not found."] = "Учётная запись не найдена."; +App::$strings["Account Edit"] = "Редактировать аккаунт"; +App::$strings["New Password"] = "Новый пароль"; +App::$strings["New Password again"] = "Повторите новый пароль"; +App::$strings["Technical skill level"] = "Уровень технических навыков"; +App::$strings["Account language (for emails)"] = "Язык сообщения для email"; +App::$strings["Service class"] = "Класс обслуживания"; App::$strings["%s channel censored/uncensored"] = array( - 0 => "", - 1 => "", - 2 => "", + 0 => "%s канал цензурируется/нецензурируется", + 1 => "%s канала цензурируются/нецензурируются", + 2 => "%s каналов цензурируются/нецензурируются", +); +App::$strings["%s channel code allowed/disallowed"] = array( + 0 => "в %s канале код разрешён/запрещён", + 1 => "в %s каналах код разрешён/запрещён", + 2 => "в %s каналах код разрешён/запрещён", ); App::$strings["%s channel deleted"] = array( - 0 => "%s канал удален", + 0 => "%s канал удалён", 1 => "%s канала удалены", - 2 => "%s каналы удалены", + 2 => "%s каналов удалены", ); App::$strings["Channel not found"] = "Канал не найден"; -App::$strings["Channel '%s' deleted"] = "Канал '%s' удален"; -App::$strings["Channel '%s' uncensored"] = ""; -App::$strings["Channel '%s' censored"] = ""; -App::$strings["Censor"] = ""; -App::$strings["Uncensor"] = ""; -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?"] = ""; -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?"] = ""; -App::$strings["Plugin %s disabled."] = "Плагин %s отключен."; -App::$strings["Plugin %s enabled."] = "Плагин %s включен."; -App::$strings["Disable"] = "Запретить"; -App::$strings["Enable"] = "Разрешить"; -App::$strings["Toggle"] = "Переключить"; -App::$strings["Author: "] = "Автор: "; -App::$strings["Maintainer: "] = "Обслуживающий: "; -App::$strings["No themes found."] = "Темы не найдены."; -App::$strings["Screenshot"] = "Скриншот"; -App::$strings["[Experimental]"] = "[экспериментальный]"; -App::$strings["[Unsupported]"] = "[неподдерживаемый]"; -App::$strings["Log settings updated."] = "Настройки журнала обновленны."; -App::$strings["Clear"] = "Очистить"; -App::$strings["Debugging"] = "Включить/Выключить"; -App::$strings["Log file"] = "Файл журнала"; -App::$strings["Must be writable by web server. Relative to your Red top-level directory."] = "Должна быть доступна для записи веб-сервером. Относительно верхнего уровня веб-сайта."; -App::$strings["Log level"] = "Уровень журнала"; -App::$strings["Thing updated"] = ""; -App::$strings["Object store: failed"] = ""; -App::$strings["Thing added"] = ""; -App::$strings["OBJ: %1\$s %2\$s %3\$s"] = ""; -App::$strings["Show Thing"] = ""; -App::$strings["item not found."] = "Элемент не найден."; -App::$strings["Edit Thing"] = ""; -App::$strings["Select a profile"] = "Выберите профиль"; -App::$strings["Post an activity"] = ""; -App::$strings["Only sends to viewers of the applicable profile"] = ""; -App::$strings["Name of thing e.g. something"] = ""; -App::$strings["URL of thing (optional)"] = ""; -App::$strings["URL for photo of thing (optional)"] = ""; -App::$strings["Add Thing to your Profile"] = ""; +App::$strings["Channel '%s' deleted"] = "Канал '%s' удалён"; +App::$strings["Channel '%s' censored"] = "Канал '%s' цензурируется"; +App::$strings["Channel '%s' uncensored"] = "Канал '%s' нецензурируется"; +App::$strings["Channel '%s' code allowed"] = "Код в канале '%s' разрешён"; +App::$strings["Channel '%s' code disallowed"] = "Код в канале '%s' запрещён"; +App::$strings["Censor"] = "Цензурировать"; +App::$strings["Uncensor"] = "Нецензурировать"; +App::$strings["Allow Code"] = "Разрешить код"; +App::$strings["Disallow Code"] = "Запретить код"; +App::$strings["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?"] = "Выбранные каналы будут удалены!\n\nВсё что было опубликовано в этих каналах на этом сайте будет удалено навсегда!\n\nВы уверены?"; +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?"] = "Канал {0} будет удалён!\n\nВсё что было опубликовано в этом канале на этом сайте будет удалено навсегда!\n\nВы уверены?"; +App::$strings["Token verification failed."] = "Не удалось выполнить проверку токена."; +App::$strings["Email Verification Required"] = "Требуется проверка адреса email"; +App::$strings["A verification token was sent to your email address [%s]. Enter that token here to complete the account verification step. Please allow a few minutes for delivery, and check your spam folder if you do not see the message."] = "Проверочный токен был выслн на ваш адрес электронной почты {%s]. Введите этот токен здесь для завершения этапа проверки учётной записи. Пожалуйста, подождите несколько минут для завершения доставки и проверьте вашу папку \"Спам\" если вы не видите письма."; +App::$strings["Resend Email"] = "Выслать повторно"; +App::$strings["Validation token"] = "Проверочный токен"; +App::$strings["Total invitation limit exceeded."] = "Превышено общее количество приглашений."; +App::$strings["%s : Not a valid email address."] = "%s : Недействительный адрес электронной почты."; +App::$strings["Please join us on \$Projectname"] = "Присоединятесь к \$Projectname !"; +App::$strings["Invitation limit exceeded. Please contact your site administrator."] = "Превышен лимит приглашений. Пожалуйста, свяжитесь с администрацией сайта."; +App::$strings["%d message sent."] = array( + 0 => "%d сообщение отправлено.", + 1 => "%d сообщения отправлено.", + 2 => "%d сообщений отправлено.", +); +App::$strings["You have no more invitations available"] = "У вас больше нет приглашений"; +App::$strings["Send invitations"] = "Отправить приглашение"; +App::$strings["Enter email addresses, one per line:"] = "Введите адреса электронной почты, по одному в строке:"; +App::$strings["Please join my community on \$Projectname."] = "Присоединятесь к нашему сообществу \$Projectname !"; +App::$strings["You will need to supply this invitation code:"] = "Вам нужно предоставит этот код приглашения:"; +App::$strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Зарегистрируйтесь на любом из серверов \$Projectname"; +App::$strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Введите сетевой адрес \$Projectname в поисковой строке сайта"; +App::$strings["or visit"] = "или посетите"; +App::$strings["3. Click [Connect]"] = "Нажать [Подключиться]"; +App::$strings["Block Title"] = "Заблокировать заголовок"; +App::$strings["Cover Photos"] = "Фотографии обложки"; +App::$strings["Your cover photo may be visible to anybody on the internet"] = "Фотография вашей обложки может быть видна всем в Интернете"; +App::$strings["Change Cover Photo"] = "Изменить фотографию обложки"; +App::$strings["Like/Dislike"] = "Нравится / не нравится"; +App::$strings["This action is restricted to members."] = "Это действие доступно только участникам."; +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."] = "Пожалуйста, для продолжения <a href=\"rmagic\"> войдите с вашим \$Projectname ID</a> или <a href=\"register\">зарегистрируйтесь как новый участник \$Projectname</a>."; +App::$strings["Invalid request."] = "Неверный запрос."; +App::$strings["thing"] = "предмет"; +App::$strings["Channel unavailable."] = "Канал недоступен."; +App::$strings["Previous action reversed."] = "Предыдущее действие отменено."; +App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%1\$s согласен с %2\$s %3\$s"; +App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%1\$s не согласен с %2\$s %3\$s"; +App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%1\$s воздерживается от решения по %2\$s%3\$s"; +App::$strings["Action completed."] = "Действие завершено."; +App::$strings["Thank you."] = "Спасибо."; +App::$strings["If enabled, connection requests will be approved without your interaction"] = "Если включено, запросы контактов будут одобрены без вашего участия"; +App::$strings["Automatic approval settings"] = "Настройки автоматического одобрения"; +App::$strings["Some individual permissions may have been preset or locked based on your channel type and privacy settings."] = "Некоторые индивидуальные разрешения могут быть предустановлены или заблокированы на основании типа вашего канала и настроек приватности."; +App::$strings["Unable to update menu."] = "Невозможно обновить меню."; +App::$strings["Unable to create menu."] = "Невозможно создать меню."; +App::$strings["Menu Name"] = "Название меню"; +App::$strings["Unique name (not visible on webpage) - required"] = "Уникальное название (не видимо на странице) - требуется"; +App::$strings["Menu Title"] = "Заголовок меню"; +App::$strings["Visible on webpage - leave empty for no title"] = "Видимость на странице - оставьте пустым если не хотите иметь заголовок"; +App::$strings["Allow Bookmarks"] = "Разрешить закладки"; +App::$strings["Menu may be used to store saved bookmarks"] = "Меню может использоваться, чтобы сохранить закладки"; +App::$strings["Submit and proceed"] = "Отправить и обработать"; +App::$strings["Drop"] = "Удалить"; +App::$strings["Bookmarks allowed"] = "Закладки разрешены"; +App::$strings["Delete this menu"] = "Удалить это меню"; +App::$strings["Edit menu contents"] = "Редактировать содержание меню"; +App::$strings["Edit this menu"] = "Редактировать это меню"; +App::$strings["Menu could not be deleted."] = "Меню не может быть удалено."; +App::$strings["Edit Menu"] = "Редактировать меню"; +App::$strings["Add or remove entries to this menu"] = "Добавить или удалить пункты этого меню"; +App::$strings["Menu name"] = "Название меню"; +App::$strings["Must be unique, only seen by you"] = "Должно быть уникальным (видно только вам)"; +App::$strings["Menu title"] = "Заголовок меню"; +App::$strings["Menu title as seen by others"] = "Видимый другими заголовок меню"; +App::$strings["Allow bookmarks"] = "Разрешить закладки"; +App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Вы создали %1$.0f из %2$.0f возможных каналов."; +App::$strings["Create a new channel"] = "Создать новый канал"; +App::$strings["Create New"] = "Создать новый"; +App::$strings["Current Channel"] = "Текущий канал"; +App::$strings["Switch to one of your channels by selecting it."] = "Выбрать и переключиться на один из ваших каналов"; +App::$strings["Default Channel"] = "Основной канал"; +App::$strings["Make Default"] = "Сделать основным"; +App::$strings["%d new messages"] = "%d новых сообщений"; +App::$strings["%d new introductions"] = "%d новых представлений"; +App::$strings["Delegated Channel"] = "Делегированный канал"; +App::$strings["Channel name changes are not allowed within 48 hours of changing the account password."] = "Изменение названия канала не разрешается в течении 48 часов после смены пароля у аккаунта."; +App::$strings["Change channel nickname/address"] = "Изменить псевдоним / адрес канала"; +App::$strings["Any/all connections on other networks will be lost!"] = "Любые / все контакты в других сетях будут утеряны!"; +App::$strings["New channel address"] = "Новый адрес канала"; +App::$strings["Rename Channel"] = "Переименовать канал"; +App::$strings["Additional Features"] = "Дополнительные функции"; +App::$strings["Your technical skill level"] = "Ваш уровень технических навыков"; +App::$strings["Used to provide a member experience and additional features consistent with your comfort level"] = "Используется чтобы обеспечить соответствие опыта пользователя и функций на комфортном для вас уровне"; +App::$strings["Nobody except yourself"] = "Никто кроме вас"; +App::$strings["Only those you specifically allow"] = "Только персонально разрешённые"; +App::$strings["Approved connections"] = "Одобренные контакты"; +App::$strings["Any connections"] = "Любые контакты"; +App::$strings["Anybody on this website"] = "Любой на этом сайте"; +App::$strings["Anybody in this network"] = "Любой в этой сети"; +App::$strings["Anybody authenticated"] = "Любой аутентифицированный"; +App::$strings["Anybody on the internet"] = "Любой в интернете"; +App::$strings["Publish your default profile in the network directory"] = "Публиковать ваш профиль по умолчанию в сетевом каталоге"; +App::$strings["Allow us to suggest you as a potential friend to new members?"] = "Разрешить предлагать вас как потенциального друга для новых пользователей?"; +App::$strings["or"] = "или"; +App::$strings["Your channel address is"] = "Адрес вашего канала"; +App::$strings["Your files/photos are accessible via WebDAV at"] = "Ваши файы / фотографии доступны через WebDAV по"; +App::$strings["Automatic membership approval"] = "Членство одобрено автоматически"; +App::$strings["Channel Settings"] = "Выбор канала"; +App::$strings["Basic Settings"] = "Основные настройки"; +App::$strings["Email Address:"] = "Адрес email:"; +App::$strings["Your Timezone:"] = "Часовой пояс:"; +App::$strings["Default Post Location:"] = "Расположение по умолчанию:"; +App::$strings["Geographical location to display on your posts"] = "Показывать географическое положение в ваших публикациях"; +App::$strings["Use Browser Location:"] = "Определять расположение из браузера"; +App::$strings["Adult Content"] = "Содержимое для взрослых"; +App::$strings["This channel frequently or regularly publishes adult content. (Please tag any adult material and/or nudity with #NSFW)"] = "Этот канал часто или регулярно публикует содержимое для взрослых. Пожалуйста, помечайте любой такой материал тегом #NSFW"; +App::$strings["Security and Privacy Settings"] = "Безопасность и настройки приватности"; +App::$strings["Your permissions are already configured. Click to view/adjust"] = "Ваши разрешения уже настроены. Нажмите чтобы просмотреть или изменить"; +App::$strings["Hide my online presence"] = "Скрывать моё присутствие онлайн"; +App::$strings["Prevents displaying in your profile that you are online"] = "Предотвращает отображения статуса \"в сети\" в вашем профиле"; +App::$strings["Simple Privacy Settings:"] = "Простые настройки безопасности:"; +App::$strings["Very Public - <em>extremely permissive (should be used with caution)</em>"] = "Полностью открытый - <em>сверхлиберальный (должен использоваться с осторожностью)</em>"; +App::$strings["Typical - <em>default public, privacy when desired (similar to social network permissions but with improved privacy)</em>"] = "Обычный - <em>открытый по умолчанию, приватность по желанию (как в социальных сетях, но с улучшенными настройками)</em>"; +App::$strings["Private - <em>default private, never open or public</em>"] = "Частный - <em>частный по умочанию, не открытый и не публичный</em>"; +App::$strings["Blocked - <em>default blocked to/from everybody</em>"] = "Закрытый - <em>заблокированный по умолчанию от / для всех</em>"; +App::$strings["Allow others to tag your posts"] = "Разрешить другим отмечать ваши публикации"; +App::$strings["Often used by the community to retro-actively flag inappropriate content"] = "Часто используется сообществом для маркировки неподобающего содержания"; +App::$strings["Channel Permission Limits"] = "Ограничения разрешений канала"; +App::$strings["Expire other channel content after this many days"] = "Храненить содержимое других каналов, дней"; +App::$strings["0 or blank to use the website limit."] = "0 или пусто - использовать настройки сайта."; +App::$strings["This website expires after %d days."] = "Срок хранения содержимого этого сайта истекает через %d дней"; +App::$strings["This website does not expire imported content."] = "Срок хранения импортированного содержимого этого сайта не ограничен."; +App::$strings["The website limit takes precedence if lower than your limit."] = "Ограничение сайта имеет приоритет если ниже вашего значения."; +App::$strings["Maximum Friend Requests/Day:"] = "Запросов в друзья в день:"; +App::$strings["May reduce spam activity"] = "Может ограничить спам активность"; +App::$strings["Default Privacy Group"] = "Группа конфиденциальности по умолчанию"; +App::$strings["Use my default audience setting for the type of object published"] = "Использовать настройки аудитории по умолчанию для типа опубликованного объекта"; +App::$strings["Profile to assign new connections"] = "Назначить профиль для новых контактов"; +App::$strings["Channel role and privacy"] = "Роль и конфиденциальность канала"; +App::$strings["Default Permissions Group"] = "Группа разрешений по умолчанию"; +App::$strings["Maximum private messages per day from unknown people:"] = "Максимально количество сообщений от незнакомых людей, в день:"; +App::$strings["Useful to reduce spamming"] = "Полезно для сокращения количества спама"; +App::$strings["By default post a status message when:"] = "По умолчанию публиковать новый статус при:"; +App::$strings["accepting a friend request"] = "одобрении запроса в друзья"; +App::$strings["joining a forum/community"] = "вступлении в сообщество / форум"; +App::$strings["making an <em>interesting</em> profile change"] = "<em>интересном</em> изменении профиля"; +App::$strings["Send a notification email when:"] = "Отправить уведомление по email когда:"; +App::$strings["You receive a connection request"] = "вы получили новый запрос контакта"; +App::$strings["Your connections are confirmed"] = "ваш запрос контакта был одобрен"; +App::$strings["Someone writes on your profile wall"] = "кто-то написал на стене вашего профиля"; +App::$strings["Someone writes a followup comment"] = "кто-то пишет комментарий"; +App::$strings["You receive a private message"] = "вы получили личное сообщение"; +App::$strings["You receive a friend suggestion"] = "вы получили предложение друзей"; +App::$strings["You are tagged in a post"] = "вы были отмечены в публикации"; +App::$strings["You are poked/prodded/etc. in a post"] = "вас толкнули, подтолкнули и т.п. в публикации"; +App::$strings["Someone likes your post/comment"] = "кому-то нравится ваша публикация / комментарий"; +App::$strings["Show visual notifications including:"] = "Показывать визуальные оповещения включая:"; +App::$strings["Unseen grid activity"] = "невидимую сетевую активность"; +App::$strings["Unseen channel activity"] = "невидимую активность в канале"; +App::$strings["Unseen private messages"] = "невидимое личное сообщение"; +App::$strings["Upcoming events"] = "грядущие события"; +App::$strings["Events today"] = "события сегодня"; +App::$strings["Upcoming birthdays"] = "грядущие дни рождения"; +App::$strings["Not available in all themes"] = "не доступно во всех темах"; +App::$strings["System (personal) notifications"] = "системные (личные) уведомления"; +App::$strings["System info messages"] = "сообщения с системной информацией"; +App::$strings["System critical alerts"] = "критические уведомления системы"; +App::$strings["New connections"] = "новые контакты"; +App::$strings["System Registrations"] = "системные регистрации"; +App::$strings["Unseen shared files"] = "невидимые общие файлы"; +App::$strings["Unseen public activity"] = "невидимая публичная активность"; +App::$strings["Unseen likes and dislikes"] = "невидимые лайки и дислайки"; +App::$strings["Unseen forum posts"] = "Невидимые публикации на форуме"; +App::$strings["Email notification hub (hostname)"] = "Центр уведомлений по email (имя хоста)"; +App::$strings["If your channel is mirrored to multiple hubs, set this to your preferred location. This will prevent duplicate email notifications. Example: %s"] = "Если ваш канал зеркалируется в нескольких местах, это ваше предпочтительное местоположение. Это должно предотвратить дублировать уведомлений по email. Например: %s"; +App::$strings["Show new wall posts, private messages and connections under Notices"] = "Показать новые сообщения на стене, личные сообщения и контакты в \"Уведомлениях\""; +App::$strings["Notify me of events this many days in advance"] = "Уведомлять меня о событиях заранее, дней"; +App::$strings["Must be greater than 0"] = "Должно быть больше 0"; +App::$strings["Advanced Account/Page Type Settings"] = "Дополнительные настройки учётной записи / страницы"; +App::$strings["Change the behaviour of this account for special situations"] = "Изменить поведение этого аккаунта в особых ситуациях"; +App::$strings["Miscellaneous Settings"] = "Дополнительные настройки"; +App::$strings["Default photo upload folder"] = "Каталог загрузки фотографий по умолчанию"; +App::$strings["%Y - current year, %m - current month"] = "%Y - текущий год, %y - текущий месяц"; +App::$strings["Default file upload folder"] = "Каталог загрузки файлов по умолчанию"; +App::$strings["Personal menu to display in your channel pages"] = "Персональное меню для отображения на странице вашего канала"; +App::$strings["Remove this channel."] = "Удалить этот канал."; +App::$strings["Firefox Share \$Projectname provider"] = ""; +App::$strings["Start calendar week on Monday"] = "Начинать календарную неделю с понедельника"; +App::$strings["Affinity Slider settings updated."] = "Обновлены настройки слайдера cходства."; +App::$strings["No feature settings configured"] = "Параметры функций не настроены"; +App::$strings["Default maximum affinity level"] = "Максимальный уровень сходства по умолчанию."; +App::$strings["0-99 default 99"] = "0-99 (по умолчанию 99)"; +App::$strings["Default minimum affinity level"] = "Минимальный уровень сходства по умолчанию."; +App::$strings["0-99 - default 0"] = "0-99 (по умолчанию 0)"; +App::$strings["Affinity Slider Settings"] = "Настройки слайдера сходства"; +App::$strings["Addon Settings"] = "Настройки расширений"; +App::$strings["Please save/submit changes to any panel before opening another."] = "Пожалуйста сохраните / отправьте изменения на панели прежде чем открывать другую."; +App::$strings["Not valid email."] = "Не действительный адрес email."; +App::$strings["Protected email address. Cannot change to that email."] = "Защищенный адрес электронной почты. Нельзя изменить."; +App::$strings["System failure storing new email. Please try again."] = "Системная ошибка сохранения email. Пожалуйста попробуйте ещё раз."; +App::$strings["Technical skill level updated"] = "Уровень технических навыков обновлён"; +App::$strings["Password verification failed."] = "Не удалось выполнить проверку пароля."; +App::$strings["Passwords do not match. Password unchanged."] = "Пароли не совпадают. Пароль не изменён."; +App::$strings["Empty passwords are not allowed. Password unchanged."] = "Пустые пароли не допускаются. Пароль не изменён."; +App::$strings["Password changed."] = "Пароль изменен."; +App::$strings["Password update failed. Please try again."] = "Изменение пароля не удалось. Пожалуйста, попробуйте ещё раз."; +App::$strings["Account Settings"] = "Настройки аккаунта"; +App::$strings["Current Password"] = "Текущий пароль"; +App::$strings["Enter New Password"] = "Введите новый пароль:"; +App::$strings["Confirm New Password"] = "Подтвердите новый пароль:"; +App::$strings["Leave password fields blank unless changing"] = "Оставьте поля пустыми до измнения"; +App::$strings["Remove this account including all its channels"] = "Удалить этот аккаунт включая все каналы"; +App::$strings["%s - (Experimental)"] = "%s - (экспериментальный)"; +App::$strings["Display Settings"] = "Настройки отображения"; +App::$strings["Theme Settings"] = "Настройки темы"; +App::$strings["Custom Theme Settings"] = "Дополнительные настройки темы"; +App::$strings["Content Settings"] = "Настройки содержимого"; +App::$strings["Display Theme:"] = "Тема отображения:"; +App::$strings["Select scheme"] = "Выбрать схему"; +App::$strings["Preload images before rendering the page"] = "Предзагрузка изображений перед обработкой страницы"; +App::$strings["The subjective page load time will be longer but the page will be ready when displayed"] = "Субъективное время загрузки страницы будет длиннее, но страница будет готова при отображении"; +App::$strings["Enable user zoom on mobile devices"] = "Включить масштабирование на мобильных устройствах"; +App::$strings["Update browser every xx seconds"] = "Обновление браузера каждые N секунд"; +App::$strings["Minimum of 10 seconds, no maximum"] = "Минимум 10 секунд, без максимума"; +App::$strings["Maximum number of conversations to load at any time:"] = "Максимальное количество бесед для загрузки одновременно:"; +App::$strings["Maximum of 100 items"] = "Максимум 100 элементов"; +App::$strings["Show emoticons (smilies) as images"] = "Показывать эмотиконы (смайлики) как изображения"; +App::$strings["Provide channel menu in navigation bar"] = "Показывать меню канала в панели навигации"; +App::$strings["Default: channel menu located in app menu"] = "По умолчанию каналы расположены в меню приложения"; +App::$strings["Manual conversation updates"] = "Обновление бесед вручную"; +App::$strings["Default is on, turning this off may increase screen jumping"] = "Включено по умолчанию, выключение может привести к рывкам в отображении"; +App::$strings["Link post titles to source"] = "Ссылки на источник заголовков публикаций"; +App::$strings["System Page Layout Editor - (advanced)"] = "Системный редактор макета страницы - (продвинутый)"; +App::$strings["Use blog/list mode on channel page"] = "Использовать режим блога / списка на странице канала"; +App::$strings["(comments displayed separately)"] = "(комментарии отображаются отдельно)"; +App::$strings["Use blog/list mode on grid page"] = "Использовать режим блога / списка на странице матрицы"; +App::$strings["Channel page max height of content (in pixels)"] = "Максимальная высота содержания канала (в пикселях)"; +App::$strings["click to expand content exceeding this height"] = "нажмите, чтобы увеличить содержимое, превышающее эту высоту"; +App::$strings["Grid page max height of content (in pixels)"] = "Максимальная высота содержания на страницах матрицы (в пикселях)"; +App::$strings["Permission Name is required."] = "Требуется имя разрешения"; +App::$strings["Permission category saved."] = "Категория разрешения сохранена."; +App::$strings["Use this form to create permission rules for various classes of people or connections."] = "Используйте эту форму для создания правил разрешений для различных групп людей и контактов."; +App::$strings["Permission Name"] = "Имя разрешения"; +App::$strings["Name and Secret are required"] = "Требуются имя и код"; +App::$strings["Add OAuth2 application"] = "Добавить приложение OAuth2"; +App::$strings["Name of application"] = "Название приложения"; +App::$strings["Automatically generated - change if desired. Max length 20"] = "Сгенерирован автоматические - измените если требуется. Макс. длина 20"; +App::$strings["Redirect"] = "Перенаправление"; +App::$strings["Redirect URI - leave blank unless your application specifically requires this"] = "URI перенаправления - оставьте пустыми до тех пока ваше приложение не требует этого"; +App::$strings["Grant Types"] = "Разрешить типы"; +App::$strings["leave blank unless your application sepcifically requires this"] = "оставьте пустыми до тех пока ваше приложение не требует этого"; +App::$strings["Authorization scope"] = "Область полномочий"; +App::$strings["OAuth2 Application not found."] = "Приложение OAuth2 не найдено."; +App::$strings["Add application"] = "Добавить приложение"; +App::$strings["Connected OAuth2 Apps"] = "Подключённые приложения OAuth2"; +App::$strings["Client key starts with"] = "Ключ клиента начинаетя с"; +App::$strings["No name"] = "Без названия"; +App::$strings["Remove authorization"] = "Удалить разрешение"; +App::$strings["Name is required"] = "Необходимо имя"; +App::$strings["Key and Secret are required"] = "Требуются ключ и код"; +App::$strings["Icon url"] = "URL значка"; +App::$strings["Application not found."] = "Приложение не найдено."; +App::$strings["Connected Apps"] = "Подключенные приложения"; +App::$strings["This channel is limited to %d tokens"] = "Этот канал ограничен %d токенами"; +App::$strings["Name and Password are required."] = "Требуются имя и пароль."; +App::$strings["Token saved."] = "Токен сохранён."; +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."] = "Используйте эту форму для создания идентификаторов временного доступа для сторонних пользователей. Эти идентификаторы могут использоваться в списках контроля доступа, и посетители могут использовать эти учетные данные для доступа к частному контенту."; +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:"] = "Вы также можете предоставить доступ в стиле <em>dropbox</em> для друзей и коллег, добавив имя и пароль для входа на любой URL-адрес сайта. Например:"; +App::$strings["Login Name"] = "Имя"; +App::$strings["Login Password"] = "Пароль"; +App::$strings["Expires (yyyy-mm-dd)"] = "Срок действия (yyyy-mm-dd)"; +App::$strings["Room not found"] = "Комната не найдена"; +App::$strings["Leave Room"] = "Покинуть комнату"; +App::$strings["Delete Room"] = "Удалить комнату"; +App::$strings["I am away right now"] = "Я сейчас отошёл"; +App::$strings["I am online"] = "Я на связи"; +App::$strings["Bookmark this room"] = "Запомнить эту комнату"; +App::$strings["New Chatroom"] = "Новый чат"; +App::$strings["Chatroom name"] = "Название чата"; +App::$strings["Expiration of chats (minutes)"] = "Завершение чатов (минут)"; +App::$strings["%1\$s's Chatrooms"] = "Чаты пользователя %1\$s"; +App::$strings["No chatrooms available"] = "Нет доступных чатов"; +App::$strings["Expiration"] = "Срок действия"; +App::$strings["min"] = "мин."; +App::$strings["Website:"] = "Веб-сайт:"; +App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Удалённый канал [%s] (пока неизвестен на этом сайте)"; +App::$strings["Rating (this information is public)"] = "Оценка (эта информация общедоступна)"; +App::$strings["Optionally explain your rating (this information is public)"] = "Объясните свою оценку (необязательно; эта информация общедоступна)"; +App::$strings["Fetching URL returns error: %1\$s"] = "Загрузка URL возвращает ошибку: %1\$s"; +App::$strings["Location not found."] = "Местоположение не найдено"; +App::$strings["Location lookup failed."] = "Поиск местоположения не удался"; +App::$strings["Please select another location to become primary before removing the primary location."] = "Пожалуйста, выберите другое местоположение в качестве основного прежде чем удалить предыдущее"; +App::$strings["Syncing locations"] = "Синхронизировать местоположение"; +App::$strings["No locations found."] = "Местоположений не найдено"; +App::$strings["Manage Channel Locations"] = "Управление местоположением канала"; +App::$strings["Sync Now"] = "Синхронизировать"; +App::$strings["Please wait several minutes between consecutive operations."] = "Пожалуйста, подождите несколько минут между последовательными операциями."; +App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "По возможности, очистите местоположение, войдя на этот веб-сайт / хаб и удалив свой канал."; +App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Используйте эту форму, чтобы удалить местоположение, если хаб больше не функционирует."; App::$strings["Nothing to import."] = "Ничего импортировать."; -App::$strings["Unable to download data from old server"] = "Невозможно загрузить данные из старого сервера"; +App::$strings["Unable to download data from old server"] = "Невозможно загрузить данные со старого сервера"; App::$strings["Imported file is empty."] = "Импортированный файл пуст."; -App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = ""; -App::$strings["Channel clone failed. Import failed."] = ""; -App::$strings["Cloned channel not found. Import failed."] = ""; -App::$strings["Import completed."] = "Импорт завершен."; +App::$strings["Your service plan only allows %d channels."] = "Ваш класс обслуживания разрешает только %d каналов."; +App::$strings["No channel. Import failed."] = "Канала нет. Импорт невозможен."; App::$strings["You must be logged in to use this feature."] = "Вы должны войти в систему, чтобы использовать эту функцию."; -App::$strings["Import Channel"] = "Импорт канала"; -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. Only identity and connections/relationships will be imported. Importation of content is not yet available."] = ""; +App::$strings["Import Channel"] = "Импортировать канал"; +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."] = "Используйте эту форм для импорта существующего канала с другого сервера / хаба. Вы можете получить идентификационные данные канала со старого сервера / хаба через сеть или предоставить файл экспорта."; App::$strings["File to Upload"] = "Файл для загрузки"; -App::$strings["Or provide the old server/hub details"] = ""; +App::$strings["Or provide the old server/hub details"] = "или предоставьте данные старого сервера"; App::$strings["Your old identity address (xyz@example.com)"] = "Ваш старый адрес идентичности (xyz@example.com)"; App::$strings["Your old login email address"] = "Ваш старый адрес электронной почты"; App::$strings["Your old login password"] = "Ваш старый пароль"; -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."] = ""; -App::$strings["Make this hub my primary location"] = ""; -App::$strings["Total invitation limit exceeded."] = ""; -App::$strings["%s : Not a valid email address."] = "%s : Не действительный адрес электронной почты."; -App::$strings["Please join us on Red"] = "Пожалуйста, присоединяйтесь к нам в Red"; -App::$strings["Invitation limit exceeded. Please contact your site administrator."] = ""; -App::$strings["%s : Message delivery failed."] = "%s : Доставка сообщения не удалась."; -App::$strings["%d message sent."] = array( - 0 => "%d сообщение отправленно.", - 1 => "%d сообщения отправленно.", - 2 => "%d сообщений отправленно.", +App::$strings["Import a few months of posts if possible (limited by available memory"] = "Импортировать несколько месяцев публикаций если возможно (ограничено доступной памятью)"; +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."] = "Для любого варианта, пожалуйста, выберите, следует ли сделать этот хаб вашим новым основным адресом, или ваше прежнее местоположение должно продолжить выполнять эту роль. Вы сможете отправлять сообщения из любого местоположения, но только одно может быть помечено как основное место для файлов, фотографий и мультимедиа."; +App::$strings["Make this hub my primary location"] = "Сделать этот хаб главным"; +App::$strings["Move this channel (disable all previous locations)"] = "Переместить это канал (отключить все предыдущие месторасположения)"; +App::$strings["Use this channel nickname instead of the one provided"] = "Использовать псевдоним этого канала вместо предоставленного"; +App::$strings["Leave blank to keep your existing channel nickname. You will be randomly assigned a similar nickname if either name is already allocated on this site."] = "Оставьте пустым для сохранения существующего псевдонима канала. Вам будет случайным образом назначен похожий псевдоним если такое имя уже выделено на этом сайте."; +App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Процесс может занять несколько минут. Пожалуйста, отправьте форму только один раз и оставьте эту страницу открытой до завершения."; +App::$strings["No connections."] = "Контактов нет."; +App::$strings["Visit %s's profile [%s]"] = "Посетить %s профиль [%s]"; +App::$strings["View Connections"] = "Просмотр контактов"; +App::$strings["Authentication failed."] = "Ошибка аутентификации."; +App::$strings["Your real name is recommended."] = "Рекомендуется использовать ваше настоящее имя."; +App::$strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""] = "Примеры: \"Иван Иванов\", \"Оксана и Кони\", \"Футболист\", \"Тимур и его команда\""; +App::$strings["This will be used to create a unique network address (like an email address)."] = "Это будет использовано для создания уникального сетевого адреса (наподобие email)."; +App::$strings["Allowed characters are a-z 0-9, - and _"] = "Разрешённые символы a-z 0-9, - и _"; +App::$strings["Channel name"] = "Название канала"; +App::$strings["Choose a short nickname"] = "Выберите короткий псевдоним"; +App::$strings["Select a channel permission role compatible with your usage needs and privacy requirements."] = "Выберите разрешения для канала в соответствии с вашими потребностями и требованиями безопасности."; +App::$strings["Read more about channel permission roles"] = "Прочитать больше о разрешениях для каналов"; +App::$strings["Create a Channel"] = "Создать канал"; +App::$strings["A channel is a unique network identity. It can represent a person (social network profile), a forum (group), a business or celebrity page, a newsfeed, and many other things."] = "Канал это уникальная сетевая идентичность. Он может представлять человека (профиль в социальной сети), форум или группу, бизнес или страницу знаменитости, новостную ленту и многие другие вещи."; +App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "или <a href=\"import\">импортировать существующий канал</a> из другого места."; +App::$strings["Validate"] = "Проверить"; +App::$strings["Manage apps"] = "Управление приложениями"; +App::$strings["Create new app"] = "Создать новое приложение"; +App::$strings["No default suggestions were found."] = "Предложений по умолчанию не найдено."; +App::$strings["%d rating"] = array( + 0 => "%d оценка", + 1 => "%d оценки", + 2 => "%d оценок", ); -App::$strings["You have no more invitations available"] = "У вас больше нет приглашений"; -App::$strings["Send invitations"] = "Послать приглашения"; -App::$strings["Enter email addresses, one per line:"] = "Введите адреса электронной почты, по одному на строку:"; -App::$strings["Your message:"] = "Сообщение:"; -App::$strings["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["You will need to supply this invitation code: \$invite_code"] = ""; -App::$strings["Please visit my channel at"] = "Пожалуйста, посетите мой канал на"; -App::$strings["Once you have registered (on ANY Hubzilla site - they are all inter-connected), please connect with my Hubzilla channel address:"] = ""; -App::$strings["Click the [Register] link on the following page to join."] = ""; -App::$strings["For more information about the Hubzilla Project and why it has the potential to change the internet as we know it, please visit http://getzot.com"] = "Чтобы узнать больше о проекте Hubzilla, и чтобы узнать почему он имеет потенциал для изменения привычного нам Интернета, пожалуйста, посетите http://getzot.com"; -App::$strings["Unable to locate original post."] = "Не удалось найти оригинал."; -App::$strings["Empty post discarded."] = "Отказаться от пустой почты."; -App::$strings["Executable content type not permitted to this channel."] = ""; -App::$strings["System error. Post not saved."] = "Системная ошибка. Сообщение не сохранено."; -App::$strings["You have reached your limit of %1$.0f top level posts."] = ""; -App::$strings["You have reached your limit of %1$.0f webpages."] = ""; -App::$strings["[Embedded content - reload page to view]"] = ""; -App::$strings["Help with this feature"] = ""; -App::$strings["Layout Name"] = "Название шаблона"; -App::$strings["thing"] = ""; -App::$strings["Remote privacy information not available."] = ""; -App::$strings["Visible to:"] = "Кому видно:"; -App::$strings["No connections."] = "Никаких связей."; -App::$strings["Visit %s's profile [%s]"] = "Посетить %s's профиль [%s]"; -App::$strings["View Connnections"] = "Просмотр контактов"; +App::$strings["Gender: "] = "Пол:"; +App::$strings["Status: "] = "Статус:"; +App::$strings["Homepage: "] = "Домашняя страница:"; +App::$strings["Description:"] = "Описание:"; +App::$strings["Public Forum:"] = "Публичный форум:"; +App::$strings["Keywords: "] = "Ключевые слова:"; +App::$strings["Don't suggest"] = "Не предлагать"; +App::$strings["Common connections (estimated):"] = "Общие контакты (оценочно):"; +App::$strings["Global Directory"] = "Глобальный каталог"; +App::$strings["Local Directory"] = "Локальный каталог"; +App::$strings["Finding:"] = "Поиск:"; +App::$strings["next page"] = "следующая страница"; +App::$strings["previous page"] = "предыдущая страница"; +App::$strings["Sort options"] = "Параметры сортировки"; +App::$strings["Alphabetic"] = "По алфавиту"; +App::$strings["Reverse Alphabetic"] = "Против алфавита"; +App::$strings["Newest to Oldest"] = "От новых к старым"; +App::$strings["Oldest to Newest"] = "От старых к новым"; +App::$strings["No entries (some entries may be hidden)."] = "Нет записей (некоторые записи могут быть скрыты)."; +App::$strings["Enter a folder name"] = "Введите название каталога"; +App::$strings["or select an existing folder (doubleclick)"] = "или выберите существующий каталог (двойной щелчок)"; +App::$strings["Invalid message"] = "Неверное сообщение"; +App::$strings["no results"] = "Ничего не найдено."; +App::$strings["channel sync processed"] = "синхронизация канала завершена"; +App::$strings["queued"] = "в очереди"; +App::$strings["posted"] = "опубликовано"; +App::$strings["accepted for delivery"] = "принято к доставке"; +App::$strings["updated"] = "обновлено"; +App::$strings["update ignored"] = "обновление игнорируется"; +App::$strings["permission denied"] = "доступ запрещен"; +App::$strings["recipient not found"] = "получатель не найден"; +App::$strings["mail recalled"] = "почта отозвана"; +App::$strings["duplicate mail received"] = "получено дублирующее сообщение"; +App::$strings["mail delivered"] = "почта доставлен"; +App::$strings["Delivery report for %1\$s"] = "Отчёт о доставке для %1\$s"; +App::$strings["Redeliver"] = "Доставить повторно"; +App::$strings["No such group"] = "Нет такой группы"; +App::$strings["No such channel"] = "Нет такого канала"; +App::$strings["Privacy group is empty"] = "Группа безопасности пуста"; +App::$strings["Privacy group: "] = "Группа безопасности: "; +App::$strings["Please login."] = "Пожалуйста, войдите."; +App::$strings["No service class restrictions found."] = "Ограничений класса обслуживание не найдено."; +App::$strings["Add Card"] = "Добавить карточку"; +App::$strings["Change Order of Pinned Navbar Apps"] = "Изменить порядок приложений на панели навигации"; +App::$strings["Change Order of App Tray Apps"] = "Изменить порядок приложений в лотке"; +App::$strings["Use arrows to move the corresponding app left (top) or right (bottom) in the navbar"] = "Используйте стрелки для перемещения приложения влево (вверх) или вправо (вниз) в панели навигации"; +App::$strings["Use arrows to move the corresponding app up or down in the app tray"] = "Используйте стрелки для перемещения приложения вверх или вниз в лотке"; +App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Превышено максимальное количество регистраций на сегодня. Пожалуйста, попробуйте снова завтра."; +App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Пожалуйста, подтвердите согласие с \"Условиями обслуживания\". Регистрация не удалась."; +App::$strings["Passwords do not match."] = "Пароли не совпадают."; +App::$strings["Registration successful. Continue to create your first channel..."] = "Регистрация завершена успешно. Для продолжения создайте свой первый канал..."; +App::$strings["Registration successful. Please check your email for validation instructions."] = "Регистрация завершена успешно. Пожалуйста проверьте вашу электронную почту для подтверждения."; +App::$strings["Your registration is pending approval by the site owner."] = "Ваша регистрация ожидает одобрения администрации сайта."; +App::$strings["Your registration can not be processed."] = "Ваша регистрация не может быть обработана."; +App::$strings["Registration on this hub is disabled."] = "Регистрация на этом хабе отключена."; +App::$strings["Registration on this hub is by approval only."] = "Регистрация на этом хабе только по утверждению."; +App::$strings["<a href=\"pubsites\">Register at another affiliated hub.</a>"] = "<a href=\"pubsites\">Зарегистрироваться на другом хабе.</a>"; +App::$strings["Registration on this hub is by invitation only."] = "Регистрация на этом хабе доступна только по приглашениям."; +App::$strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Этот сайт превысил максимальное количество регистраций на сегодня. Пожалуйста, попробуйте снова завтра. "; +App::$strings["I accept the %s for this website"] = "Я принимаю %s для этого веб-сайта."; +App::$strings["I am over %s years of age and accept the %s for this website"] = "Мой возраст превышает %s лет и я принимаю %s для этого веб-сайта."; +App::$strings["Your email address"] = "Ваш адрес электронной почты"; +App::$strings["Choose a password"] = "Выберите пароль"; +App::$strings["Please re-enter your password"] = "Пожалуйста, введите пароль еще раз"; +App::$strings["Please enter your invitation code"] = "Пожалуйста, введите Ваш код приглашения"; +App::$strings["Your Name"] = "Ваше имя"; +App::$strings["Real names are preferred."] = "Предпочтительны реальные имена."; +App::$strings["Your nickname will be used to create an easy to remember channel address e.g. nickname%s"] = "Ваш псевдоним будет использован для создания легко запоминаемого адреса канала, напр. nickname %s"; +App::$strings["Select a channel permission role for your usage needs and privacy requirements."] = "Выберите разрешения для канала в зависимости от ваших потребностей и требований приватности."; +App::$strings["no"] = "нет"; +App::$strings["yes"] = "да"; +App::$strings["This site requires email verification. After completing this form, please check your email for further instructions."] = "Этот сайт требует проверку адреса электронной почты. После заполнения этой формы, пожалуйста, проверьте ваш почтовый ящик для дальнейших инструкций."; +App::$strings["This setting requires special processing and editing has been blocked."] = "Этот параметр требует специальной обработки и редактирования и был заблокирован."; +App::$strings["Configuration Editor"] = "Редактор конфигурации"; +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."] = "Предупреждение. Изменение некоторых настроек может привести к неработоспособности вашего канала. Пожалуйста, покиньте эту страницу, если вы точно не значете, как правильно использовать эту функцию."; +App::$strings["Edit Article"] = "Редактировать статью"; +App::$strings["Not found"] = "Не найдено."; +App::$strings["Error retrieving wiki"] = "Ошибка при получении Wiki"; +App::$strings["Error creating zip file export folder"] = "Ошибка при создании zip-файла при экспорте каталога"; +App::$strings["Error downloading wiki: "] = "Ошибка загрузки Wiki:"; +App::$strings["Download"] = "Загрузить"; +App::$strings["Wiki name"] = "Название Wiki"; +App::$strings["Content type"] = "Тип содержимого"; +App::$strings["Type"] = "Тип"; +App::$strings["Any type"] = "Любой тип"; +App::$strings["Lock content type"] = "Зафиксировать тип содержимого"; +App::$strings["Create a status post for this wiki"] = "Создать публикацию о статусе этой Wiki"; +App::$strings["Edit Wiki Name"] = "Редактировать наименование Wiki"; +App::$strings["Wiki not found"] = "Wiki не найдена"; +App::$strings["Rename page"] = "Переименовать страницу"; +App::$strings["Error retrieving page content"] = "Ошибка при получении содержимого страницы"; +App::$strings["New page"] = "Новая страница"; +App::$strings["Revision Comparison"] = "Сравнение ревизий"; +App::$strings["Revert"] = "Вернуть"; +App::$strings["Short description of your changes (optional)"] = "Краткое описание ваших изменений (необязательно)"; +App::$strings["Source"] = "Источник"; +App::$strings["New page name"] = "Новое имя страницы"; +App::$strings["Embed image from photo albums"] = "Встроить изображение из фотоальбома"; +App::$strings["Error creating wiki. Invalid name."] = "Ошибка создания Wiki. Неверное имя."; +App::$strings["A wiki with this name already exists."] = "Wiki с таким именем уже существует."; +App::$strings["Wiki created, but error creating Home page."] = "Wiki создана, но возникла ошибка при создании домашней страницы"; +App::$strings["Error creating wiki"] = "Ошибка при создании Wiki"; +App::$strings["Error updating wiki. Invalid name."] = "Ошибка при обновлении Wiki. Неверное имя."; +App::$strings["Error updating wiki"] = "Ошибка при обновлении Wiki"; +App::$strings["Wiki delete permission denied."] = "Нет прав на удаление Wiki."; +App::$strings["Error deleting wiki"] = "Ошибка удаления Wiki"; +App::$strings["New page created"] = "Создана новая страница"; +App::$strings["Cannot delete Home"] = "Невозможно удалить домашнюю страницу"; +App::$strings["Current Revision"] = "Текущая ревизия"; +App::$strings["Selected Revision"] = "Выбранная ревизия"; +App::$strings["You must be authenticated."] = "Вы должны быть аутентифицированы."; +App::$strings["Hub not found."] = "Узел не найден."; +App::$strings["Item not available."] = "Элемент недоступен."; +App::$strings["Privacy group created."] = "Группа безопасности создана."; +App::$strings["Could not create privacy group."] = "Не удалось создать группу безопасности."; +App::$strings["Privacy group updated."] = "Группа безопасности обновлена."; +App::$strings["Add Group"] = "Добавить группу"; +App::$strings["Privacy group name"] = "Имя группы безопасности"; +App::$strings["Members are visible to other channels"] = "Участники канала видимые для остальных"; +App::$strings["Privacy group removed."] = "Группа безопасности удалена."; +App::$strings["Unable to remove privacy group."] = "Ну удалось удалить группу безопасности."; +App::$strings["Privacy Group: %s"] = "Группа безопасности: %s"; +App::$strings["Privacy group name: "] = "Название группы безопасности: "; +App::$strings["Delete Group"] = "Удалить группу"; +App::$strings["Group members"] = "Члены группы"; +App::$strings["Not in this group"] = "Не в этой группе"; +App::$strings["Click a channel to toggle membership"] = "Нажмите на канал для просмотра членства"; +App::$strings["Profile not found."] = "Профиль не найден."; +App::$strings["Profile deleted."] = "Профиль удален."; +App::$strings["Profile-"] = "Профиль -"; +App::$strings["New profile created."] = "Новый профиль создан."; +App::$strings["Profile unavailable to clone."] = "Профиль недоступен для клонирования."; +App::$strings["Profile unavailable to export."] = "Профиль недоступен для экспорта."; +App::$strings["Profile Name is required."] = "Требуется имя профиля."; +App::$strings["Marital Status"] = "Семейное положение"; +App::$strings["Romantic Partner"] = "Романтический партнер"; +App::$strings["Likes"] = "Нравится"; +App::$strings["Dislikes"] = "Не нравится"; +App::$strings["Work/Employment"] = "Работа / Занятость"; +App::$strings["Religion"] = "Религия"; +App::$strings["Political Views"] = "Политические взгляды"; +App::$strings["Sexual Preference"] = "Сексуальная ориентация"; +App::$strings["Homepage"] = "Домашняя страница"; +App::$strings["Interests"] = "Интересы"; +App::$strings["Profile updated."] = "Профиль обновлен."; +App::$strings["Hide your connections list from viewers of this profile"] = "Скрывать от просмотра ваш список контактов в этом профиле"; +App::$strings["Edit Profile Details"] = "Редактирование профиля"; +App::$strings["View this profile"] = "Посмотреть этот профиль"; +App::$strings["Profile Tools"] = "Инструменты профиля"; +App::$strings["Change cover photo"] = "Изменить фотографию обложки"; +App::$strings["Create a new profile using these settings"] = "Создать новый профиль со следующими настройками"; +App::$strings["Clone this profile"] = "Клонировать этот профиль"; +App::$strings["Delete this profile"] = "Удалить этот профиль"; +App::$strings["Add profile things"] = "Добавить в профиль"; +App::$strings["Relationship"] = "Отношения"; +App::$strings["Import profile from file"] = "Импортировать профиль из файла"; +App::$strings["Export profile to file"] = "Экспортировать профиль в файл"; +App::$strings["Your gender"] = "Ваш пол"; +App::$strings["Marital status"] = "Семейное положение"; +App::$strings["Sexual preference"] = "Сексуальная ориентация"; +App::$strings["Profile name"] = "Имя профиля"; +App::$strings["This is your default profile."] = "Это ваш профиль по умолчанию."; +App::$strings["Your full name"] = "Ваше полное имя"; +App::$strings["Title/Description"] = "Заголовок / описание"; +App::$strings["Street address"] = "Улица, дом, квартира"; +App::$strings["Locality/City"] = "Населенный пункт / город"; +App::$strings["Region/State"] = "Регион / Область"; +App::$strings["Postal/Zip code"] = "Почтовый индекс"; +App::$strings["Who (if applicable)"] = "Кто (если применимо)"; +App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Примеры: ivan1990, Ivan Petrov, ivan@example.com"; +App::$strings["Since (date)"] = "С (дата)"; +App::$strings["Tell us about yourself"] = "Расскажите нам о себе"; +App::$strings["Hometown"] = "Родной город"; +App::$strings["Political views"] = "Политические взгляды"; +App::$strings["Religious views"] = "Религиозные взгляды"; +App::$strings["Keywords used in directory listings"] = "Ключевые слова для участия в каталоге"; +App::$strings["Example: fishing photography software"] = "Например: fishing photography software"; +App::$strings["Musical interests"] = "Музыкальные интересы"; +App::$strings["Books, literature"] = "Книги, литература"; +App::$strings["Television"] = "Телевидение"; +App::$strings["Film/Dance/Culture/Entertainment"] = "Кино / танцы / культура / развлечения"; +App::$strings["Hobbies/Interests"] = "Хобби / интересы"; +App::$strings["Love/Romance"] = "Любовь / романтические отношения"; +App::$strings["School/Education"] = "Школа / образование"; +App::$strings["Contact information and social networks"] = "Информация и социальные сети для связи"; +App::$strings["My other channels"] = "Мои другие контакты"; +App::$strings["Communications"] = "Связи"; +App::$strings["Email verification resent"] = "Сообщение для проверки email отправлено повторно"; +App::$strings["Unable to resend email verification message."] = "Невозможно повторно отправить сообщение для проверки email"; +App::$strings["vcard"] = "vCard"; +App::$strings["Invalid profile identifier."] = "Неверный идентификатор профиля"; +App::$strings["Profile Visibility Editor"] = "Редактор видимости профиля"; +App::$strings["Click on a contact to add or remove."] = "Нажмите на контакт, чтобы добавить или удалить."; +App::$strings["Visible To"] = "Видно"; +App::$strings["Thing updated"] = "Обновлено"; +App::$strings["Object store: failed"] = "Хранлищие объектов: неудача"; +App::$strings["Thing added"] = "Добавлено"; +App::$strings["OBJ: %1\$s %2\$s %3\$s"] = ""; +App::$strings["Show Thing"] = "Показать"; +App::$strings["item not found."] = "Элемент не найден."; +App::$strings["Edit Thing"] = "Редактировать"; +App::$strings["Select a profile"] = "Выбрать профиль"; +App::$strings["Post an activity"] = "Опубликовать мероприятие"; +App::$strings["Only sends to viewers of the applicable profile"] = "Отправлять только подходящий профиль"; +App::$strings["Name of thing e.g. something"] = "Наименование, например \"нечто\""; +App::$strings["URL of thing (optional)"] = "URL (необязательно)"; +App::$strings["URL for photo of thing (optional)"] = "URL для фотографии (необязательно)"; +App::$strings["Add Thing to your Profile"] = "Добавить к вашему профилю"; +App::$strings["Article"] = "Статья"; +App::$strings["Item has been removed."] = "Элемент был удалён."; +App::$strings["Welcome to %s"] = "Добро пожаловать в %s"; +App::$strings["Please refresh page"] = "Пожалуйста обновите страницу"; +App::$strings["Unknown error"] = "Неизвестная ошибка"; App::$strings["No valid account found."] = "Действительный аккаунт не найден."; -App::$strings["Password reset request issued. Check your email."] = ""; +App::$strings["Password reset request issued. Check your email."] = "Запрос на сброс пароля отправлен. Проверьте вашу электронную почту."; App::$strings["Site Member (%s)"] = "Участник сайта (%s)"; -App::$strings["Password reset requested at %s"] = "Требуется сброс пароля на %s"; -App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = ""; -App::$strings["Password Reset"] = "Сбросить пароль"; +App::$strings["Password reset requested at %s"] = "Запроше сброс пароля на %s"; +App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Запрос не может быть проверен. (Вы могли отправить его раньше). Сброс пароля не возможен."; App::$strings["Your password has been reset as requested."] = "Ваш пароль в соответствии с просьбой сброшен."; App::$strings["Your new password is"] = "Ваш новый пароль"; -App::$strings["Save or copy your new password - and then"] = ""; -App::$strings["click here to login"] = "нажмите здесь чтобы выйти"; -App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = ""; -App::$strings["Your password has changed at %s"] = "Пароль изменен на %s"; -App::$strings["Forgot your Password?"] = "Забыли пароль или логин?"; -App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = ""; +App::$strings["Save or copy your new password - and then"] = "Сохраните ваш новый пароль и затем"; +App::$strings["click here to login"] = "нажмите здесь чтобы войти"; +App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Ваш пароль может быть изменён на странице <em>Настройки</em>после успешного входа."; +App::$strings["Your password has changed at %s"] = "Пароль был изменен на %s"; +App::$strings["Forgot your Password?"] = "Забыли ваш пароль?"; +App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Введите ваш адрес электронной почты и нажмите отправить чтобы сбросить пароль. Затем проверьте ваш почтовый ящик для дальнейших инструкций. "; App::$strings["Email Address"] = "Адрес электронной почты"; -App::$strings["Reset"] = "Сброс"; -App::$strings["Hub not found."] = "Hub не найден."; -App::$strings["Total votes"] = ""; -App::$strings["Average Rating"] = ""; -App::$strings["Unable to lookup recipient."] = ""; -App::$strings["Unable to communicate with requested channel."] = ""; -App::$strings["Cannot verify requested channel."] = ""; -App::$strings["Selected channel has private message restrictions. Send failed."] = ""; -App::$strings["Messages"] = "Переписка"; -App::$strings["Message deleted."] = "Сообщение удалено."; -App::$strings["Message recalled."] = ""; -App::$strings["Send Private Message"] = "Отправить личное сообщение"; -App::$strings["To:"] = "Кому:"; -App::$strings["Subject:"] = "Тема:"; -App::$strings["Message not found."] = "Сообщение не найдено."; -App::$strings["Delete message"] = "Удалить сообщение"; -App::$strings["Recall message"] = ""; -App::$strings["Message has been recalled."] = ""; -App::$strings["Private Conversation"] = "Личный разговор"; -App::$strings["Delete conversation"] = "Удалить разговор"; -App::$strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = ""; -App::$strings["Send Reply"] = "Отправить снова"; -App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = ""; -App::$strings["Create a new channel"] = "Создать новый канал"; -App::$strings["Channel Manager"] = "Настройки канала"; -App::$strings["Current Channel"] = "Текущий канал"; -App::$strings["Attach to one of your channels by selecting it."] = ""; -App::$strings["Default Channel"] = "Канал по умолчанию"; -App::$strings["Make Default"] = "Сделать стандартным"; -App::$strings["Wall Photos"] = "Стена фотографий"; -App::$strings["Profile Match"] = "Профиль Совпадение"; -App::$strings["No keywords to match. Please add keywords to your default profile."] = ""; -App::$strings["is interested in:"] = "заинтересован в:"; -App::$strings["No matches"] = "Нет соответствий"; -App::$strings["Menu updated."] = "Меню обновлено."; -App::$strings["Unable to update menu."] = "Невозможно обновление меню."; -App::$strings["Menu created."] = "Меню создано."; -App::$strings["Unable to create menu."] = "Невозможно создать меню."; -App::$strings["Manage Menus"] = "Управление меню"; -App::$strings["Drop"] = "Удалить"; -App::$strings["Create a new menu"] = "Создать новое меню"; -App::$strings["Delete this menu"] = "Удалить это меню"; -App::$strings["Edit menu contents"] = "Редактировать содержание меню"; -App::$strings["Edit this menu"] = "Редактировать это меню"; -App::$strings["New Menu"] = "Новое меню"; -App::$strings["Menu name"] = "Название меню"; -App::$strings["Must be unique, only seen by you"] = ""; -App::$strings["Menu title"] = "Название меню"; -App::$strings["Menu title as seen by others"] = ""; -App::$strings["Allow bookmarks"] = "Разрешить закладки"; -App::$strings["Menu may be used to store saved bookmarks"] = "Меню может использоваться, чтобы сохранить закладки"; -App::$strings["Menu deleted."] = "Меню удалено."; -App::$strings["Menu could not be deleted."] = "Меню не может быть удален."; -App::$strings["Edit Menu"] = "Редактировать меню"; -App::$strings["Add or remove entries to this menu"] = ""; -App::$strings["Conversation removed."] = "Разговор удален."; -App::$strings["No messages."] = "Нет сообщений."; -App::$strings["D, d M Y - g:i A"] = "D, d M Y - g:i A"; -App::$strings["Add a Channel"] = "Добавить контакт"; -App::$strings["A channel is your own collection of related web pages. A channel can be used to hold social network profiles, blogs, conversation groups and forums, celebrity pages, and much more. You may create as many channels as your service provider allows."] = ""; -App::$strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "] = ""; -App::$strings["Choose a short nickname"] = "Выберите короткий псевдоним"; -App::$strings["Your nickname will be used to create an easily remembered channel address (like an email address) which you can share with others."] = ""; -App::$strings["Or <a href=\"import\">import an existing channel</a> from another location"] = ""; -App::$strings["Invalid request identifier."] = ""; -App::$strings["Discard"] = "Отменить"; -App::$strings["No more system notifications."] = "Новых оповещений системы пока нет."; -App::$strings["System Notifications"] = "Системные оповещения "; -App::$strings["Unable to find your hub."] = ""; -App::$strings["Post successful."] = "Публикация прошла успешно."; -App::$strings["invalid target signature"] = ""; -App::$strings["OpenID protocol error. No ID returned."] = ""; -App::$strings["App installed."] = "Приложение установлено ."; -App::$strings["Malformed app."] = ""; -App::$strings["Embed code"] = "Код для вставки"; -App::$strings["Edit App"] = "Редактировать приложение"; -App::$strings["Create App"] = "Создать приложение"; -App::$strings["Name of app"] = "Название приложения"; -App::$strings["Location (URL) of app"] = ""; -App::$strings["Photo icon URL"] = ""; -App::$strings["80 x 80 pixels - optional"] = "80 x 80 pixels - необязательно"; -App::$strings["Version ID"] = "Версия ID"; -App::$strings["Price of app"] = ""; -App::$strings["Location (URL) to purchase app"] = ""; -App::$strings["Schema Default"] = ""; -App::$strings["Sans-Serif"] = ""; -App::$strings["Monospace"] = ""; -App::$strings["Theme settings"] = "Настройки темы"; -App::$strings["Set scheme"] = "Установить схему"; -App::$strings["Set font-size for posts and comments"] = "Установить размер шрифта для сообщений и комментариев"; -App::$strings["Set font face"] = ""; -App::$strings["Set iconset"] = ""; -App::$strings["Set big shadow size, default 15px 15px 15px"] = ""; -App::$strings["Set small shadow size, default 5px 5px 5px"] = ""; -App::$strings["Set shadow colour, default #000"] = ""; -App::$strings["Set radius size, default 5px"] = ""; -App::$strings["Set line-height for posts and comments"] = ""; -App::$strings["Set background image"] = ""; -App::$strings["Set background attachment"] = ""; -App::$strings["Set background colour"] = ""; -App::$strings["Set section background image"] = ""; -App::$strings["Set section background colour"] = ""; -App::$strings["Set colour of items - use hex"] = ""; -App::$strings["Set colour of links - use hex"] = ""; -App::$strings["Set max-width for items. Default 400px"] = ""; -App::$strings["Set min-width for items. Default 240px"] = ""; -App::$strings["Set the generic content wrapper width. Default 48%"] = ""; -App::$strings["Set colour of fonts - use hex"] = ""; -App::$strings["Set background-size element"] = ""; -App::$strings["Item opacity"] = ""; -App::$strings["Display post previews only"] = ""; -App::$strings["Display side bar on channel page"] = ""; -App::$strings["Colour of the navigation bar"] = ""; -App::$strings["Item float"] = ""; -App::$strings["Left offset of the section element"] = ""; -App::$strings["Right offset of the section element"] = ""; -App::$strings["Section width"] = ""; -App::$strings["Left offset of the aside"] = ""; -App::$strings["Right offset of the aside element"] = ""; -App::$strings["None"] = ""; -App::$strings["Header image"] = "Графика заголовока"; -App::$strings["Header image only on profile pages"] = ""; -App::$strings["Narrow navbar"] = "Узкая панель навигации"; -App::$strings["Navigation bar background colour"] = "Панель навигации, цвет фона"; -App::$strings["Navigation bar gradient top colour"] = "Панель навигации, цвет градиента вверху"; -App::$strings["Navigation bar gradient bottom colour"] = "Панель навигации, цвет градиента внизу"; -App::$strings["Navigation active button gradient top colour"] = "Панель навигации, цвет градиента вверху активной кнопки"; -App::$strings["Navigation active button gradient bottom colour"] = "Панель навигации, цвет градиента внизу активной кнопки"; -App::$strings["Navigation bar border colour "] = "Панель навигации, цвет границы"; -App::$strings["Navigation bar icon colour "] = "Панель навигации, цвет значков"; -App::$strings["Navigation bar active icon colour "] = "Панель навигации, цвет активного значка"; -App::$strings["link colour"] = "Цвет ссылок"; -App::$strings["Set font-colour for banner"] = "Цвет текста в шапке"; -App::$strings["Set the background colour"] = "Цвет фона на странице канала"; -App::$strings["Set the background image"] = "Фоновое изображение"; -App::$strings["Set the background colour of items"] = "Цвет фона для постов и других элементов"; -App::$strings["Set the background colour of comments"] = "Цвет фона для комментариев"; -App::$strings["Set the border colour of comments"] = "Цвет границы для области комментариев"; -App::$strings["Set the indent for comments"] = ""; -App::$strings["Set the basic colour for item icons"] = "Основной цвет в иконках редактирования"; -App::$strings["Set the hover colour for item icons"] = "Цвет в иконках редактирования при наведении мыши"; -App::$strings["Set font-size for the entire application"] = "Установить размер шрифта для системы в целом"; -App::$strings["Set font-colour for posts and comments"] = "Цвет шрифта для постов и комментариев"; -App::$strings["Set radius of corners"] = "Радиус скруглений"; -App::$strings["Set shadow depth of photos"] = ""; -App::$strings["Set maximum width of conversation regions"] = ""; -App::$strings["Center conversation regions"] = ""; -App::$strings["Set minimum opacity of nav bar - to hide it"] = "Панель навигации, прозрачность"; -App::$strings["Set size of conversation author photo"] = ""; -App::$strings["Set size of followup author photos"] = ""; -App::$strings["Sloppy photo albums"] = ""; -App::$strings["Are you a clean desk or a messy desk person?"] = ""; -App::$strings["Type"] = "Тип"; -App::$strings["Size"] = "Размер"; -App::$strings["Last modified"] = "Последнее изменение"; -App::$strings["Are you sure you want to delete this item?"] = "Вы уверены, что хотите удалить этот элемент?"; +App::$strings["Set your current mood and tell your friends"] = "Установить текущее настроение и рассказать друзьям"; +App::$strings["Warning: Database versions differ by %1\$d updates."] = "Предупреждение: Версия базы данных отличается от %1\$d обновления."; +App::$strings["Import completed"] = "Импорт завершён."; +App::$strings["Import Items"] = "Импортировать объекты"; +App::$strings["Use this form to import existing posts and content from an export file."] = "Используйте эту форму для импорта существующих публикаций и содержимого из файла."; +App::$strings["toggle full screen mode"] = "переключение полноэкранного режима"; +App::$strings["parent"] = "источник"; +App::$strings["Principal"] = "Субъект"; +App::$strings["Addressbook"] = "Адресная книга"; +App::$strings["Schedule Inbox"] = "План занятий входящий"; +App::$strings["Schedule Outbox"] = "План занятий исходящий"; App::$strings["Total"] = "Всего"; -App::$strings["Update %s failed. See error logs."] = ""; -App::$strings["Update Error at %s"] = "Ошибка обновления на %s"; -App::$strings["Create an account to access services and applications within the Hubzilla"] = ""; -App::$strings["Password"] = "Пароль"; -App::$strings["Remember me"] = "Запомнить"; -App::$strings["Forgot your password?"] = "Забыли пароль или логин?"; -App::$strings["permission denied"] = "доступ запрещен"; -App::$strings["Got Zot?"] = "Got Zot?"; -App::$strings["toggle mobile"] = "мобильное подключение"; +App::$strings["Shared"] = "Общие"; +App::$strings["Add Files"] = "Добавить файлы"; +App::$strings["You are using %1\$s of your available file storage."] = "Вы используете %1\$s из доступного вам хранилища файлов."; +App::$strings["You are using %1\$s of %2\$s available file storage. (%3\$s%)"] = "Вы используете %1\$s из %2\$s доступного хранилища файлов (%3\$s%)."; +App::$strings["WARNING:"] = "Предупреждение:"; +App::$strings["Create new folder"] = "Создать новую папку"; +App::$strings["Upload file"] = "Загрузить файл"; +App::$strings["Drop files here to immediately upload"] = "Поместите файлы сюда для немедленной загрузки"; diff --git a/view/ru/hubzilla_update_fail_eml.tpl b/view/ru/hubzilla_update_fail_eml.tpl new file mode 100644 index 000000000..c2042e13c --- /dev/null +++ b/view/ru/hubzilla_update_fail_eml.tpl @@ -0,0 +1,14 @@ + +Привет, +Я веб-сервер {{$sitename}}; + +Разработчики Hubzilla только что выпустили обновление {{$update}} +но когда я попыталась/ся установить его, что-то пошло не так. +Это должно быть исправлено в ближайшее время и требует вмешательства человека. +Пожалуйста, обратитесь к разработчикам Hubzilla, если вы не можете понять, как +исправьте это по своему усмотрению. Моя база данных может быть недействительной. + +Сообщение ошибки является следующим '{{$}}'. + +Приносим извинения за неудобства, + Ваш веб-сервер {{$siteurl}} diff --git a/view/ru/lostpass_eml.tpl b/view/ru/lostpass_eml.tpl index 3b79d2791..76ccb0f01 100644 --- a/view/ru/lostpass_eml.tpl +++ b/view/ru/lostpass_eml.tpl @@ -1,32 +1,35 @@ -Dear {{$username}}, - A request was recently received at {{$sitename}} to reset your account -password. In order to confirm this request, please select the verification link -below or paste it into your web browser address bar. +Уважаемый {{$username}}, + Недавно {{$sitename}} был получен запрос на сброс пароля вашей +учётной записи. Для подтверждения этого запроса, пожалуйста перейдите по ссылке +проверки ниже или вставьте его в адресную строку вашего браузера. -If you did NOT request this change, please DO NOT follow the link -provided and ignore and/or delete this email. +Если вы НЕ запрашивали это измнение, пожалуйста НЕ используйте предоставленную +ссылку и игнорируйте и / или удалите это письмо. -Your password will not be changed unless we can verify that you -issued this request. +Ваш пароль не будет изменён до тех пор, пока мы не сможем убедиться что именно +вами создан запрос. -Follow this link to verify your identity: +Проследуйте по ссылке для подтверждения вашей личности: {{$reset_link}} -You will then receive a follow-up message containing the new password. +После этого вы получите email содержащий новый пароль. -You may change that password from your account settings page after logging in. +Вы можете изменить этот пароль в вашей учётной записи после входа. -The login details are as follows: +Подробности логина: -Site Location: {{$siteurl}} -Login Name: {{$email}} +Расположение сайта: {{$siteurl}} +Имя для входа: {{$email}} -Sincerely, - {{$sitename}} Administrator +С уважением, + администрация {{$sitename}} - +-- +Условия использования сервиса: +{{$siteurl}}/help/TermsOfService +
\ No newline at end of file diff --git a/view/ru/passchanged_eml.tpl b/view/ru/passchanged_eml.tpl index 0d94be3c2..86a0ea3f2 100644 --- a/view/ru/passchanged_eml.tpl +++ b/view/ru/passchanged_eml.tpl @@ -1,20 +1,24 @@ -Dear {{$username}}, - Your password has been changed as requested. Please retain this -information for your records (or change your password immediately to -something that you will remember). +Дорогой {{$username}}, + Ваш пароль был изменен, как вы и просили. Пожалуйста, сохраните эту +информацию в ваших записях (или смените свой пароль на такой +который вы точно не забудете). -Your login details are as follows: +Детали учетной записи: -Site Location: {{$siteurl}} -Login Name: {{$email}} -Password: {{$new_password}} +Адрес сайта: {{$siteurl}} +Имя Пользователя: {{$email}} +Пароль: {{$new_password}} -You may change that password from your account settings page after logging in. +Вы можете сменить этот пароль в настройках учетной записи после того, как войдете в систему. -Sincerely, - {{$sitename}} Administrator +С уважением, + администрация {{$sitename}} + +-- +Условия предоставления услуг: +{{$siteurl}}/help/TermsOfService diff --git a/view/ru/register_open_eml.tpl b/view/ru/register_open_eml.tpl index 4b397201c..0b148fd61 100644 --- a/view/ru/register_open_eml.tpl +++ b/view/ru/register_open_eml.tpl @@ -1,19 +1,17 @@ -An account has been created at {{$sitename}} for this email address. -The login details are as follows: +Учётная запись была создана на {{$sitename}} для этого адреса электронной почты. +Детали учётной записи: -Site Location: {{$siteurl}} -Login: {{$email}} -Password: (the password which was provided during registration) +Адрес сайта: {{$siteurl}} +Имя для входа: {{$email}} +Пароль: (указанный вами при регистрации) -If this account was created without your knowledge and is not desired, you may -visit this site and reset the password. This will allow you to remove the -account from the links on the Settings page, and we -apologise for any inconvenience. +Если эта учётная запись была создана без вашего ведома или нежелательна, вы +можете посетить сайт и сбросить пароль. Это позволит вам удалить учётную запись +по ссылке на странице "Настройки". +Приносим извинения за любые неудобства. -Thank you and welcome to {{$sitename}}. +Спасибо и добро пожаловать на {{$sitename}}! -Sincerely, - {{$sitename}} Administrator - - +С уважением, + администрация {{$sitename}} diff --git a/view/ru/register_verify_eml.tpl b/view/ru/register_verify_eml.tpl index 85d9a12d3..2b2912fd4 100644 --- a/view/ru/register_verify_eml.tpl +++ b/view/ru/register_verify_eml.tpl @@ -1,25 +1,24 @@ -A new user registration request was received at {{$sitename}} which requires -your approval. +Был получен запрос на регистрацию нового пользователя на {{$sitename}} +что требует вашего подтверждения. -The login details are as follows: +Детали учётной записи: -Site Location: {{$siteurl}} -Login Name: {{$email}} -IP Address: {{$details}} +Адрес сайта: {{$siteurl}} +Имя для входа: {{$email}} +IP-адрес: {{$details}} -To approve this request please visit the following link: +Для подтверждения этого запроса пожалуйса перейдите по ссылке: {{$siteurl}}/regmod/allow/{{$hash}} -To deny the request and remove the account, please visit: +Для отказа и удаления учётной записи перейдите по ссылке: {{$siteurl}}/regmod/deny/{{$hash}} -Thank you. - +Спасибо. diff --git a/view/ru/update_fail_eml.tpl b/view/ru/update_fail_eml.tpl index 61f44b1e6..8bcba334f 100644 --- a/view/ru/update_fail_eml.tpl +++ b/view/ru/update_fail_eml.tpl @@ -1,13 +1,14 @@ -Hey,
-I'm the web server at {{$sitename}};
-
-The Hubzilla developers released update {{$update}} recently,
-but when I tried to install it, something went terribly wrong.
-This needs to be fixed soon and it requires human intervention.
-Please contact a Red developer if you can not figure out how to
-fix it on your own. My database might be invalid.
-
-The error message is '{{$error}}'.
-
-Apologies for the inconvenience,
- your web server at {{$siteurl}}
\ No newline at end of file + +Привет, +Я веб-сервер {{$sitename}}; + +Разработчики Hubzilla только что выпустили обновление {{$update}} +но когда я попыталась/ся установить его, что-то пошло не так. +Это должно быть исправлено в ближайшее время и требует вмешательства человека. +Пожалуйста, обратитесь к разработчикам Hubzilla, если вы не можете понять, как +исправьте это по своему усмотрению. Моя база данных может быть недействительной. + +Сообщение ошибки является следующим '{{$}}. + +Приносим извинения за неудобства, + Ваш веб-сервер {{$siteurl}} diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css index 9f78f06c5..970e4bc89 100644 --- a/view/theme/redbasic/css/style.css +++ b/view/theme/redbasic/css/style.css @@ -593,7 +593,8 @@ footer { background-color: $comment_item_colour; } -#nav-notifications-template { +#nav-notifications-template, +#nav-notifications-forums-template { display: none; } @@ -692,31 +693,6 @@ nav .acpopup { margin-bottom: 15px; } -#group-members { - margin-top: 20px; - padding: 10px; - height: 250px; - overflow: auto; - border: 1px solid #ddd; -} - -#group-separator { - margin-top: 10px; - margin-bottom: 10px; -} - -#group-all-contacts { - padding: 10px; - height: 450px; - overflow: auto; - border: 1px solid #ddd; -} - -#group-edit-desc { - margin-top: 15px; -} - - #prof-members { margin-top: 20px; padding: 10px; @@ -829,7 +805,7 @@ div.jGrowl div.jGrowl-notification { .dropdown-notification, .notification, .member-item { - line-height: 1.1em; + line-height: 1.2em; font-size: 0.75rem; overflow: hidden; text-overflow: ellipsis; @@ -837,6 +813,11 @@ div.jGrowl div.jGrowl-notification { white-space: nowrap; } +.notification.notification-forum { + font-size: 0.9rem; + color: $font_colour; +} + #acl-search::-webkit-input-placeholder { /* non-fontawesome fonts set a fallback for text parts of the placeholder*/ font-family: ForkAwesome, sans-serif, arial, freesans; @@ -1271,9 +1252,8 @@ img.mail-conv-sender-photo { } .menu-img-1 { - height: 1.5em; - width: 1.5em; - margin-right: 5px; + height: 1.28571429em; + width: 1.28571429em; border-radius: $radius; } @@ -1411,6 +1391,9 @@ main.fullscreen .generic-content-wrapper { main.fullscreen .section-title-wrapper { border-radius: 0px; + position: sticky; + top: 0; + z-index: 1020; } main.fullscreen .section-content-wrapper, @@ -1424,6 +1407,7 @@ main.fullscreen .section-content-wrapper-np { .atoken-index-row:hover td, .chatroom-index-row:hover td, +.group-index-row:hover td, .wikis-index-row:hover td, .locs-index-row:hover td, [id^="cloud-index-"]:hover td, @@ -1627,7 +1611,7 @@ dl.bb-dl > dd > li { .form-group.checkbox > div label { display: block; overflow: hidden; cursor: pointer; border: 1px solid #ccc; - border-radius: $radius; + border-radius: 12px; margin:0px; -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; @@ -1799,3 +1783,11 @@ dl.bb-dl > dd > li { .cover-photo-review { margin-bottom: 10px; } + +.hover-fx-hide { + opacity: 0; +} + +.hover-fx-show:hover .hover-fx-hide { + opacity: 1; +} diff --git a/view/theme/redbasic/js/redbasic.js b/view/theme/redbasic/js/redbasic.js index 41f5eb7ce..c905c92cb 100644 --- a/view/theme/redbasic/js/redbasic.js +++ b/view/theme/redbasic/js/redbasic.js @@ -89,6 +89,11 @@ $(document).ready(function() { tagClass: 'badge badge-pill badge-warning text-dark' }); + $('a.disabled').click(function(e) { + e.preventDefault(); + e.stopPropagation(); + }); + var doctitle = document.title; function checkNotify() { var notifyUpdateElem = document.getElementById('notify-update'); diff --git a/view/tpl/activity_filter_widget.tpl b/view/tpl/activity_filter_widget.tpl new file mode 100644 index 000000000..1eb11c10f --- /dev/null +++ b/view/tpl/activity_filter_widget.tpl @@ -0,0 +1,25 @@ +<div class="widget"> + <h3 class="d-flex justify-content-between align-items-center"> + {{$title}} + {{if $reset}} + <a href="{{$reset.url}}" class="text-muted" title="{{$reset.title}}"> + <i class="fa fa-fw fa-{{$reset.icon}}"></i> + </a> + {{/if}} + </h3> + {{$content}} + {{if $name}} + <div class="notifications-textinput"> + <form method="get" action="{{$name.url}}" role="search"> + <div class="text-muted notifications-textinput-filter"><i class="fa fa-fw fa-filter"></i></div> + <input id="cid" type="hidden" value="" name="cid" /> + <input id="cid-filter" class="form-control form-control-sm{{if $name.sel}} {{$name.sel}}{{/if}}" type="text" value="" placeholder="{{$name.label}}" name="name" title="" /> + </form> + </div> + <script> + $("#cid-filter").name_autocomplete(baseurl + '/acl', 'a', true, function(data) { + $("#cid").val(data.id); + }); + </script> + {{/if}} +</div> diff --git a/view/tpl/admin_hubloc.tpl b/view/tpl/admin_hubloc.tpl deleted file mode 100755 index 1bd1f0122..000000000 --- a/view/tpl/admin_hubloc.tpl +++ /dev/null @@ -1,27 +0,0 @@ -<div class="generic-content-wrapper-styled" id='adminpage'> - <h1>{{$title}} - {{$page}}</h1> - - <table id='server'> - <thead> - <tr> - {{foreach $th_hubloc as $th}}<th>{{$th}}</th>{{/foreach}} - </tr> - </thead> - <tbody> - - {{foreach $hubloc as $hub}}<tr> - <td>{{$hub.hubloc_id}}</td><td>{{$hub.hubloc_addr}}</td><td>{{$hub.hubloc_host}}</td><td>{{$hub.hubloc_status}}</td> - <td> - <form action="{{$baseurl}}/admin/hubloc" method="post"> - <input type="hidden" name="hublocid" value="{{$hub.hubloc_id}}"> - <input type='hidden' name='form_security_token' value='{{$form_security_token}}'> - <input type='hidden' name='url' value='{{$hub.hubloc_host}}'> - <input type="submit" name="check" value="check" > - <input type="submit" name="repair" value="repair" ></td> - </form> - </tr>{{/foreach}} - </tbody> - </table> - - -</div> diff --git a/view/tpl/admin_plugins.tpl b/view/tpl/admin_plugins.tpl index adc0db434..d8e1a6711 100755 --- a/view/tpl/admin_plugins.tpl +++ b/view/tpl/admin_plugins.tpl @@ -77,7 +77,7 @@ var repoName = $('#id_repoName').val(); $('#chat-rotator').show(); $.post( - "/admin/plugins/addrepo", {repoURL: repoURL, repoName: repoName}, + "/admin/addons/addrepo", {repoURL: repoURL, repoName: repoName}, function(response) { $('#chat-rotator').hide(); if (response.success) { @@ -104,7 +104,7 @@ var repoURL = $('#id_repoURL').val(); var repoName = $('#id_repoName').val(); $.post( - "/admin/plugins/installrepo", {repoURL: repoURL, repoName: repoName}, + "/admin/addons/installrepo", {repoURL: repoURL, repoName: repoName}, function(response) { if (response.success) { $('#generic-modal-title-{{$newRepoModalID}}').html('Addon repo installed'); @@ -137,7 +137,7 @@ function updateAddonRepo(repoName) { if(confirm('Are you sure you want to update the addon repo ' + repoName + '?')) { $.post( - "/admin/plugins/updaterepo", {repoName: repoName}, + "/admin/addons/updaterepo", {repoName: repoName}, function(response) { if (response.success) { window.console.log('Addon repo '+repoName+' successfully updated :' + response['message']); @@ -170,7 +170,7 @@ // TODO: Unlink the addons if(confirm('Are you sure you want to remove the addon repo ' + repoName + '?')) { $.post( - "/admin/plugins/removerepo", {repoName: repoName}, + "/admin/addons/removerepo", {repoName: repoName}, function(response) { if (response.success) { window.console.log('Addon repo '+repoName+' successfully removed :' + response['message']); diff --git a/view/tpl/admin_security.tpl b/view/tpl/admin_security.tpl index 409e9fc7d..493707a7a 100755 --- a/view/tpl/admin_security.tpl +++ b/view/tpl/admin_security.tpl @@ -7,6 +7,8 @@ {{include file="field_checkbox.tpl" field=$block_public}} + {{include file="field_checkbox.tpl" field=$cloud_noroot}} + {{include file="field_checkbox.tpl" field=$cloud_disksize}} {{include file="field_checkbox.tpl" field=$transport_security}} {{include file="field_checkbox.tpl" field=$content_security}} {{include file="field_checkbox.tpl" field=$embed_sslonly}} diff --git a/view/tpl/admin_site.tpl b/view/tpl/admin_site.tpl index 7e99b2c86..3288c2988 100755 --- a/view/tpl/admin_site.tpl +++ b/view/tpl/admin_site.tpl @@ -68,6 +68,7 @@ <h3>{{$registration}}</h3> {{include file="field_input.tpl" field=$register_text}} + {{include file="field_select_grouped.tpl" field=$role}} {{include file="field_select.tpl" field=$register_policy}} {{include file="field_checkbox.tpl" field=$invite_only}} {{include file="field_input.tpl" field=$minimum_age}} @@ -85,6 +86,8 @@ {{include file="field_checkbox.tpl" field=$disable_discover_tab}} {{include file="field_checkbox.tpl" field=$site_firehose}} {{include file="field_checkbox.tpl" field=$open_pubstream}} + {{include file="field_textarea.tpl" field=$incl}} + {{include file="field_textarea.tpl" field=$excl}} <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div> diff --git a/view/tpl/api_config_xml.tpl b/view/tpl/api_config_xml.tpl deleted file mode 100755 index 8c0766c73..000000000 --- a/view/tpl/api_config_xml.tpl +++ /dev/null @@ -1,66 +0,0 @@ -<config> - <site> - <name>{{$config.site.name}}</name> - <server>{{$config.site.server}}</server> - <theme>default</theme> - <path></path> - <logo>{{$config.site.logo}}</logo> - - <fancy>true</fancy> - <language>en</language> - <email>{{$config.site.email}}</email> - <broughtby></broughtby> - <broughtbyurl></broughtbyurl> - <timezone>UTC</timezone> - <closed>{{$config.site.closed}}</closed> - - <inviteonly>false</inviteonly> - <private>{{$config.site.private}}</private> - <textlimit>{{$config.site.textlimit}}</textlimit> - <ssl>{{$config.site.ssl}}</ssl> - <sslserver>{{$config.site.sslserver}}</sslserver> - <shorturllength>30</shorturllength> - -</site> - <license> - <type>cc</type> - <owner></owner> - <url>http://creativecommons.org/licenses/by/3.0/</url> - <title>Creative Commons Attribution 3.0</title> - <image>http://i.creativecommons.org/l/by/3.0/80x15.png</image> - -</license> - <nickname> - <featured></featured> -</nickname> - <profile> - <biolimit></biolimit> -</profile> - <group> - <desclimit></desclimit> -</group> - <notice> - - <contentlimit></contentlimit> -</notice> - <throttle> - <enabled>false</enabled> - <count>20</count> - <timespan>600</timespan> -</throttle> - <xmpp> - - <enabled>false</enabled> - <server>INVALID SERVER</server> - <port>5222</port> - <user>update</user> -</xmpp> - <integration> - <source>StatusNet</source> - -</integration> - <attachments> - <uploads>false</uploads> - <file_quota>0</file_quota> -</attachments> -</config> diff --git a/view/tpl/api_friends_xml.tpl b/view/tpl/api_friends_xml.tpl deleted file mode 100755 index f2a7234d1..000000000 --- a/view/tpl/api_friends_xml.tpl +++ /dev/null @@ -1,5 +0,0 @@ -<users type="array"> - {{foreach $users as $user}} - {{include file="api_user_xml.tpl"}} - {{/foreach}} -</users> diff --git a/view/tpl/api_ratelimit_xml.tpl b/view/tpl/api_ratelimit_xml.tpl deleted file mode 100755 index e4b470a25..000000000 --- a/view/tpl/api_ratelimit_xml.tpl +++ /dev/null @@ -1,6 +0,0 @@ -<hash> - <remaining-hits type="integer">{{$hash.remaining_hits}}</remaining-hits> - <hourly-limit type="integer">{{$hash.hourly_limit}}</hourly-limit> - <reset-time type="datetime">{{$hash.reset_time}}</reset-time> - <reset_time_in_seconds type="integer">{{$hash.resettime_in_seconds}}</reset_time_in_seconds> -</hash> diff --git a/view/tpl/api_status_xml.tpl b/view/tpl/api_status_xml.tpl deleted file mode 100755 index cbb736e22..000000000 --- a/view/tpl/api_status_xml.tpl +++ /dev/null @@ -1,46 +0,0 @@ -<status>{{if $status}} - <created_at>{{$status.created_at}}</created_at> - <id>{{$status.id}}</id> - <text>{{$status.text}}</text> - <source>{{$status.source}}</source> - <truncated>{{$status.truncated}}</truncated> - <in_reply_to_status_id>{{$status.in_reply_to_status_id}}</in_reply_to_status_id> - <in_reply_to_user_id>{{$status.in_reply_to_user_id}}</in_reply_to_user_id> - <favorited>{{$status.favorited}}</favorited> - <in_reply_to_screen_name>{{$status.in_reply_to_screen_name}}</in_reply_to_screen_name> - <geo>{{$status.geo}}</geo> - <coordinates>{{$status.coordinates}}</coordinates> - <place>{{$status.place}}</place> - <contributors>{{$status.contributors}}</contributors> - <user> - <id>{{$status.user.id}}</id> - <name>{{$status.user.name}}</name> - <screen_name>{{$status.user.screen_name}}</screen_name> - <location>{{$status.user.location}}</location> - <description>{{$status.user.description}}</description> - <profile_image_url>{{$status.user.profile_image_url}}</profile_image_url> - <url>{{$status.user.url}}</url> - <protected>{{$status.user.protected}}</protected> - <followers_count>{{$status.user.followers}}</followers_count> - <profile_background_color>{{$status.user.profile_background_color}}</profile_background_color> - <profile_text_color>{{$status.user.profile_text_color}}</profile_text_color> - <profile_link_color>{{$status.user.profile_link_color}}</profile_link_color> - <profile_sidebar_fill_color>{{$status.user.profile_sidebar_fill_color}}</profile_sidebar_fill_color> - <profile_sidebar_border_color>{{$status.user.profile_sidebar_border_color}}</profile_sidebar_border_color> - <friends_count>{{$status.user.friends_count}}</friends_count> - <created_at>{{$status.user.created_at}}</created_at> - <favourites_count>{{$status.user.favourites_count}}</favourites_count> - <utc_offset>{{$status.user.utc_offset}}</utc_offset> - <time_zone>{{$status.user.time_zone}}</time_zone> - <profile_background_image_url>{{$status.user.profile_background_image_url}}</profile_background_image_url> - <profile_background_tile>{{$status.user.profile_background_tile}}</profile_background_tile> - <profile_use_background_image>{{$status.user.profile_use_background_image}}</profile_use_background_image> - <notifications></notifications> - <geo_enabled>{{$status.user.geo_enabled}}</geo_enabled> - <verified>{{$status.user.verified}}</verified> - <following></following> - <statuses_count>{{$status.user.statuses_count}}</statuses_count> - <lang>{{$status.user.lang}}</lang> - <contributors_enabled>{{$status.user.contributors_enabled}}</contributors_enabled> - </user> -{{/if}}</status> diff --git a/view/tpl/api_test_xml.tpl b/view/tpl/api_test_xml.tpl deleted file mode 100755 index 80a541c39..000000000 --- a/view/tpl/api_test_xml.tpl +++ /dev/null @@ -1 +0,0 @@ -<ok>{{$ok}}</ok> diff --git a/view/tpl/api_timeline_atom.tpl b/view/tpl/api_timeline_atom.tpl deleted file mode 100755 index e8bfb689e..000000000 --- a/view/tpl/api_timeline_atom.tpl +++ /dev/null @@ -1,90 +0,0 @@ -<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/"> - <generator uri="http://status.net" version="0.9.7">StatusNet</generator> - <id>{{$rss.self}}</id> - <title>Friendika</title> - <subtitle>Friendika API feed</subtitle> - <logo>{{$rss.logo}}</logo> - <updated>{{$rss.atom_updated}}</updated> - <link type="text/html" rel="alternate" href="{{$rss.alternate}}"/> - <link type="application/atom+xml" rel="self" href="{{$rss.self}}"/> - - - <author> - <activity:obj_type>http://activitystrea.ms/schema/1.0/person</activity:obj_type> - <uri>{{$user.url}}</uri> - <name>{{$user.name}}</name> - <link rel="alternate" type="text/html" href="{{$user.url}}"/> - <link rel="avatar" type="image/jpeg" media:width="106" media:height="106" href="{{$user.profile_image_url}}"/> - <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="{{$user.profile_image_url}}"/> - <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="{{$user.profile_image_url}}"/> - <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="{{$user.profile_image_url}}"/> - <georss:point></georss:point> - <poco:preferredUsername>{{$user.screen_name}}</poco:preferredUsername> - <poco:displayName>{{$user.name}}</poco:displayName> - <poco:urls> - <poco:type>homepage</poco:type> - <poco:value>{{$user.url}}</poco:value> - <poco:primary>true</poco:primary> - </poco:urls> - <statusnet:profile_info local_id="{{$user.id}}"></statusnet:profile_info> - </author> - - <!--Deprecation warning: activity:subject is present only for backward compatibility. It will be removed in the next version of StatusNet.--> - <activity:subject> - <activity:obj_type>http://activitystrea.ms/schema/1.0/person</activity:obj_type> - <id>{{$user.contact_url}}</id> - <title>{{$user.name}}</title> - <link rel="alternate" type="text/html" href="{{$user.url}}"/> - <link rel="avatar" type="image/jpeg" media:width="106" media:height="106" href="{{$user.profile_image_url}}"/> - <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="{{$user.profile_image_url}}"/> - <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="{{$user.profile_image_url}}"/> - <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="{{$user.profile_image_url}}"/> - <poco:preferredUsername>{{$user.screen_name}}</poco:preferredUsername> - <poco:displayName>{{$user.name}}</poco:displayName> - <poco:urls> - <poco:type>homepage</poco:type> - <poco:value>{{$user.url}}</poco:value> - <poco:primary>true</poco:primary> - </poco:urls> - <statusnet:profile_info local_id="{{$user.id}}"></statusnet:profile_info> - </activity:subject> - - - {{foreach $statuses as $status}} - <entry> - <activity:obj_type>{{$status.objecttype}}</activity:obj_type> - <id>{{$status.message_id}}</id> - <title>{{$status.text}}</title> - <content type="html">{{$status.statusnet_html}}</content> - <link rel="alternate" type="text/html" href="{{$status.url}}"/> - <activity:verb>{{$status.verb}}</activity:verb> - <published>{{$status.published}}</published> - <updated>{{$status.updated}}</updated> - - <link rel="self" type="application/atom+xml" href="{{$status.self}}"/> - <link rel="edit" type="application/atom+xml" href="{{$status.edit}}"/> - <statusnet:notice_info local_id="{{$status.id}}" source="{{$status.source}}" > - </statusnet:notice_info> - - <author> - <activity:obj_type>http://activitystrea.ms/schema/1.0/person</activity:obj_type> - <uri>{{$status.user.url}}</uri> - <name>{{$status.user.name}}</name> - <link rel="alternate" type="text/html" href="{{$status.user.url}}"/> - <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="{{$status.user.profile_image_url}}"/> - - <georss:point/> - <poco:preferredUsername>{{$status.user.screen_name}}</poco:preferredUsername> - <poco:displayName>{{$status.user.name}}</poco:displayName> - <poco:address/> - <poco:urls> - <poco:type>homepage</poco:type> - <poco:value>{{$status.user.url}}</poco:value> - <poco:primary>true</poco:primary> - </poco:urls> - </author> - <link rel="ostatus:conversation" type="text/html" href="{{$status.url}}"/> - - </entry> - {{/foreach}} -</feed> diff --git a/view/tpl/api_timeline_rss.tpl b/view/tpl/api_timeline_rss.tpl deleted file mode 100755 index 86c645e99..000000000 --- a/view/tpl/api_timeline_rss.tpl +++ /dev/null @@ -1,26 +0,0 @@ -<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:georss="http://www.georss.org/georss" xmlns:twitter="http://api.twitter.com"> - <channel> - <title>Friendika</title> - <link>{{$rss.alternate}}</link> - <atom:link type="application/rss+xml" rel="self" href="{{$rss.self}}"/> - <description>Friendika timeline</description> - <language>{{$rss.language}}</language> - <ttl>40</ttl> - <image> - <link>{{$user.link}}</link> - <title>{{$user.name}}'s items</title> - <url>{{$user.profile_image_url}}</url> - </image> - -{{foreach $statuses as $status}} - <item> - <title>{{$status.user.name}}: {{$status.text}}</title> - <description>{{$status.text}}</description> - <pubDate>{{$status.created_at}}</pubDate> - <guid>{{$status.url}}</guid> - <link>{{$status.url}}</link> - <twitter:source>{{$status.source}}</twitter:source> - </item> -{{/foreach}} - </channel> -</rss> diff --git a/view/tpl/api_timeline_xml.tpl b/view/tpl/api_timeline_xml.tpl deleted file mode 100755 index f14d73e9c..000000000 --- a/view/tpl/api_timeline_xml.tpl +++ /dev/null @@ -1,20 +0,0 @@ -<statuses type="array" xmlns:statusnet="http://status.net/schema/api/1/"> -{{foreach $statuses as $status}} <status> - <text>{{$status.text}}</text> - <truncated>{{$status.truncated}}</truncated> - <created_at>{{$status.created_at}}</created_at> - <in_reply_to_status_id>{{$status.in_reply_to_status_id}}</in_reply_to_status_id> - <source>{{$status.source}}</source> - <id>{{$status.id}}</id> - <in_reply_to_user_id>{{$status.in_reply_to_user_id}}</in_reply_to_user_id> - <in_reply_to_screen_name>{{$status.in_reply_to_screen_name}}</in_reply_to_screen_name> - <geo>{{$status.geo}}</geo> - <favorited>{{$status.favorited}}</favorited> -{{include file="api_user_xml.tpl" user=$status.user}} <statusnet:html>{{$status.statusnet_html}}</statusnet:html> - <statusnet:conversation_id>{{$status.statusnet_conversation_id}}</statusnet:conversation_id> - <url>{{$status.url}}</url> - <coordinates>{{$status.coordinates}}</coordinates> - <place>{{$status.place}}</place> - <contributors>{{$status.contributors}}</contributors> - </status> -{{/foreach}}</statuses> diff --git a/view/tpl/api_user_xml.tpl b/view/tpl/api_user_xml.tpl deleted file mode 100755 index 3b51992f6..000000000 --- a/view/tpl/api_user_xml.tpl +++ /dev/null @@ -1,46 +0,0 @@ - <user> - <id>{{$user.id}}</id> - <name>{{$user.name}}</name> - <screen_name>{{$user.screen_name}}</screen_name> - <location>{{$user.location}}</location> - <description>{{$user.description}}</description> - <profile_image_url>{{$user.profile_image_url}}</profile_image_url> - <url>{{$user.url}}</url> - <protected>{{$user.protected}}</protected> - <followers_count>{{$user.followers_count}}</followers_count> - <friends_count>{{$user.friends_count}}</friends_count> - <created_at>{{$user.created_at}}</created_at> - <favourites_count>{{$user.favourites_count}}</favourites_count> - <utc_offset>{{$user.utc_offset}}</utc_offset> - <time_zone>{{$user.time_zone}}</time_zone> - <statuses_count>{{$user.statuses_count}}</statuses_count> - <following>{{$user.following}}</following> - <profile_background_color>{{$user.profile_background_color}}</profile_background_color> - <profile_text_color>{{$user.profile_text_color}}</profile_text_color> - <profile_link_color>{{$user.profile_link_color}}</profile_link_color> - <profile_sidebar_fill_color>{{$user.profile_sidebar_fill_color}}</profile_sidebar_fill_color> - <profile_sidebar_border_color>{{$user.profile_sidebar_border_color}}</profile_sidebar_border_color> - <profile_background_image_url>{{$user.profile_background_image_url}}</profile_background_image_url> - <profile_background_tile>{{$user.profile_background_tile}}</profile_background_tile> - <profile_use_background_image>{{$user.profile_use_background_image}}</profile_use_background_image> - <notifications>{{$user.notifications}}</notifications> - <geo_enabled>{{$user.geo_enabled}}</geo_enabled> - <verified>{{$user.verified}}</verified> - <lang>{{$user.lang}}</lang> - <contributors_enabled>{{$user.contributors_enabled}}</contributors_enabled> - <status>{{if $user.status}} - <created_at>{{$user.status.created_at}}</created_at> - <id>{{$user.status.id}}</id> - <text>{{$user.status.text}}</text> - <source>{{$user.status.source}}</source> - <truncated>{{$user.status.truncated}}</truncated> - <in_reply_to_status_id>{{$user.status.in_reply_to_status_id}}</in_reply_to_status_id> - <in_reply_to_user_id>{{$user.status.in_reply_to_user_id}}</in_reply_to_user_id> - <favorited>{{$user.status.favorited}}</favorited> - <in_reply_to_screen_name>{{$user.status.in_reply_to_screen_name}}</in_reply_to_screen_name> - <geo>{{$user.status.geo}}</geo> - <coordinates>{{$user.status.coordinates}}</coordinates> - <place>{{$user.status.place}}</place> - <contributors>{{$user.status.contributors}}</contributors> - {{/if}}</status> - </user> diff --git a/view/tpl/appstore.tpl b/view/tpl/appstore.tpl new file mode 100644 index 000000000..47f144752 --- /dev/null +++ b/view/tpl/appstore.tpl @@ -0,0 +1,8 @@ +<div class="widget"> +<h3>{{$title}}</h3> +<ul class="nav nav-pills flex-column"> +{{foreach $options as $x}} + <li class="nav-item"><a href="{{$x.0}}" class="nav-link{{if $x.2}} active{{/if}}">{{$x.1}}</a></li> +{{/foreach}} +</ul> +</div> diff --git a/view/tpl/birthdays_reminder.tpl b/view/tpl/birthdays_reminder.tpl deleted file mode 100755 index d0500364a..000000000 --- a/view/tpl/birthdays_reminder.tpl +++ /dev/null @@ -1,10 +0,0 @@ -{{if $count}} -<div id="birthday-notice" class="birthday-notice fakelink {{$classtoday}}" onclick="openClose('birthday-wrapper');">{{$event_reminders}} ({{$count}})</div> -<div id="birthday-wrapper" style="display: none;" ><div id="birthday-title">{{$event_title}}</div> -<div id="birthday-title-end"></div> -{{foreach $events as $event}} -<div class="birthday-list" id="birthday-{{$event.id}}"></a> <a href="{{$event.link}}">{{$event.title}}</a> {{$event.date}} </div> -{{/foreach}} -</div> -{{/if}} - diff --git a/view/tpl/build_query.tpl b/view/tpl/build_query.tpl index 6ee97e171..2c55a8140 100755 --- a/view/tpl/build_query.tpl +++ b/view/tpl/build_query.tpl @@ -30,6 +30,7 @@ var bParam_mid = "{{$mid}}"; var bParam_verb = "{{$verb}}"; var bParam_net = "{{$net}}"; + var bParam_pf = "{{$pf}}"; function buildCmd() { var udargs = ((page_load) ? "/load" : ""); @@ -60,6 +61,7 @@ if(bParam_verb != "") bCmd = bCmd + "&verb=" + bParam_verb; if(bParam_net != "") bCmd = bCmd + "&net=" + bParam_net; if(bParam_page != 1) bCmd = bCmd + "&page=" + bParam_page; + if(bParam_pf != 0) bCmd = bCmd + "&pf=" + bParam_pf; return(bCmd); } diff --git a/view/tpl/channel_import.tpl b/view/tpl/channel_import.tpl index d702a2437..c7cbb1742 100755 --- a/view/tpl/channel_import.tpl +++ b/view/tpl/channel_import.tpl @@ -24,6 +24,7 @@ {{include file="field_checkbox.tpl" field=$make_primary}} {{include file="field_checkbox.tpl" field=$moving}} + {{include file="field_input.tpl" field=$newname}} <div id="import-common-desc" class="section-content-info-wrapper">{{$pleasewait}}</div> diff --git a/view/tpl/cloud_directory.tpl b/view/tpl/cloud_directory.tpl index 1f0addc95..51178a9ba 100644 --- a/view/tpl/cloud_directory.tpl +++ b/view/tpl/cloud_directory.tpl @@ -65,10 +65,10 @@ <td class="cloud-index-tool">{{$item.attachIcon}}</td> <td class="cloud-index-tool"><div id="file-edit-{{$item.attachId}}" class="spinner-wrapper"><div class="spinner s"></div></div></td> <td class="cloud-index-tool"><i class="fakelink fa fa-pencil" onclick="filestorage(event, '{{$nick}}', {{$item.attachId}});"></i></td> - <td class="cloud-index-tool"><a href="#" title="{{$delete}}" onclick="dropItem('{{$item.fileStorageUrl}}/{{$item.attachId}}/delete', '#cloud-index-{{$item.attachId}},#cloud-tools-{{$item.attachId}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a></td> + <td class="cloud-index-tool"><a href="#" title="{{$delete}}" onclick="dropItem('{{$item.fileStorageUrl}}/{{$item.attachId}}/delete/json', '#cloud-index-{{$item.attachId}},#cloud-tools-{{$item.attachId}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a></td> {{else}} - <td></td><td></td><td></td><td></td> + <td></td><td></td><td></td>{{if $is_admin}}<td class="cloud-index-tool"><a href="#" title="{{$admin_delete}}" onclick="dropItem('{{$item.fileStorageUrl}}/{{$item.attachId}}/delete/json', '#cloud-index-{{$item.attachId}},#cloud-tools-{{$item.attachId}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a>{{else}}<td>{{/if}}</td> {{/if}} <td>{{*{{$item.type}}*}}</td> <td class="d-none d-md-table-cell">{{$item.sizeFormatted}}</td> diff --git a/view/tpl/common_pills.tpl b/view/tpl/common_pills.tpl new file mode 100755 index 000000000..e2b018d26 --- /dev/null +++ b/view/tpl/common_pills.tpl @@ -0,0 +1,26 @@ +<ul class="nav nav-pills flex-column"> + {{foreach $pills as $p}} + <li class="nav-item hover-fx-show"{{if $p.id}} id="{{$p.id}}"{{/if}}> + <a class="nav-link{{if $p.sel}} {{$p.sel}}{{/if}}" href="{{$p.url}}"{{if $p.title}} title="{{$p.title}}"{{/if}}{{if $p.sub}} onclick="{{if $p.sel}}closeOpen('{{$p.id}}_sub');{{else}}openClose('{{$p.id}}_sub');{{/if}} return false;"{{/if}}> + {{if $p.icon}}<i class="fa fa-fw fa-{{$p.icon}}"></i>{{/if}} + {{if $p.img}}<img class="menu-img-1" src="{{$p.img}}">{{/if}} + {{$p.label}} + {{if $p.sub}}<i class="fa fa-fw fa-caret-down hover-fx-hide"></i>{{/if}} + </a> + {{if $p.sub}} + <ul class="nav nav-pills flex-column ml-4" id="{{$p.id}}_sub"{{if !$p.sel}} style="display: none;"{{/if}}> + {{foreach $p.sub as $ps}} + <li class="nav-item"{{if $ps.id}} id="{{$ps.id}}"{{/if}}> + <a class="nav-link{{if $ps.sel}} {{$ps.sel}}{{/if}}" href="{{$ps.url}}"{{if $ps.title}} title="{{$ps.title}}"{{/if}}> + {{if $ps.icon}}<i class="fa fa-fw fa-{{$ps.icon}}"></i>{{/if}} + {{if $ps.img}}<img class="menu-img-1" src="{{$ps.img}}">{{/if}} + {{$ps.label}} + {{if $ps.lock}}<i class="fa fa-{{$ps.lock}} text-muted"></i>{{/if}} + </a> + </li> + {{/foreach}} + </ul> + {{/if}} + </li> + {{/foreach}} +</ul> diff --git a/view/tpl/common_widget.tpl b/view/tpl/common_widget.tpl new file mode 100644 index 000000000..e542031dc --- /dev/null +++ b/view/tpl/common_widget.tpl @@ -0,0 +1,6 @@ +<div class="widget"> + <h3> + {{$title}} + </h3> + {{$content}} +</div> diff --git a/view/tpl/connections.tpl b/view/tpl/connections.tpl index 0bf88b818..021c33146 100755 --- a/view/tpl/connections.tpl +++ b/view/tpl/connections.tpl @@ -1,7 +1,7 @@ <div class="generic-content-wrapper"> <div class="section-title-wrapper clearfix"> <div class="dropdown pull-right"> - <button type="button" class="btn btn-primary btn-sm" onclick="openClose('contacts-search-form'); $('#contacts-search').focus()"> + <button type="button" class="btn btn-primary btn-sm" onclick="openClose('contacts-search-form'); $('#contacts-search').focus();"> <i class="fa fa-search"></i> {{$label}} </button> <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="{{$sort}}"> @@ -16,11 +16,11 @@ {{if $finding}}<h2>{{$finding}}</h2>{{else}}<h2>{{$header}}{{if $total}} ({{$total}}){{/if}}</h2>{{/if}} </div> <div id="contacts-search-form" class="section-content-tools-wrapper"> - <form action="{{$cmd}}" method="get" > + <form action="{{$cmd}}" method="get" id="mimimi" name="contacts-search-form"> <div class="input-group form-group"> <input type="text" name="search" id="contacts-search" class="form-control" onfocus="this.select();" value="{{$search}}" placeholder="{{$desc}}" /> <div class="input-group-append"> - <button id="contacts-search-submit" class="btn btn-outline-secondary" type="submit" name="submit" value="{{$submit}}"><i class="fa fa-fw fa-search"></i></button> + <button id="contacts-search-submit" class="btn btn-outline-secondary" type="submit"><i class="fa fa-fw fa-search"></i></button> </div> </div> </form> diff --git a/view/tpl/contact_head.tpl b/view/tpl/contact_head.tpl deleted file mode 100755 index 72e7edbfb..000000000 --- a/view/tpl/contact_head.tpl +++ /dev/null @@ -1,30 +0,0 @@ -<script language="javascript" type="text/javascript" - src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script> - <script language="javascript" type="text/javascript"> - -tinyMCE.init({ - theme : "advanced", - mode : "{{$editselect}}", - elements: "contact-edit-info", - plugins : "bbcode", - theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor", - theme_advanced_buttons2 : "", - theme_advanced_buttons3 : "", - theme_advanced_toolbar_location : "top", - theme_advanced_toolbar_align : "center", - theme_advanced_styles : "blockquote,code", - gecko_spellcheck : true, - entity_encoding : "raw", - add_unload_trigger : false, - remove_linebreaks : false, - force_p_newlines : false, - force_br_newlines : true, - forced_root_block : '', - content_css: "{{$baseurl}}/view/custom_tinymce.css" - - -}); - - -</script> - diff --git a/view/tpl/conv_item.tpl b/view/tpl/conv_item.tpl index a408a83d2..ac6af40e9 100755 --- a/view/tpl/conv_item.tpl +++ b/view/tpl/conv_item.tpl @@ -29,9 +29,9 @@ <div class="p-2 clearfix wall-item-head{{if $item.is_new && !$item.title && !$item.event && !$item.is_comment}} wall-item-head-new rounded-top{{/if}}"> <div class="wall-item-info " id="wall-item-info-{{$item.id}}" > <div class="wall-item-photo-wrapper{{if $item.owner_url}} wwfrom{{/if}} h-card p-author" id="wall-item-photo-wrapper-{{$item.id}}"> - <img src="{{$item.thumb}}" class="fakelink wall-item-photo{{$item.sparkle}} u-photo p-name" id="wall-item-photo-{{$item.id}}" alt="{{$item.name}}" data-toggle="dropdown" /> + <img src="{{$item.thumb}}" class="fakelink wall-item-photo{{$item.sparkle}} u-photo p-name" id="wall-item-photo-{{$item.id}}" alt="{{$item.name}}" data-toggle="dropdown" /> {{if $item.thread_author_menu}} - <i class="fa fa-caret-down wall-item-photo-caret"></i> + <i class="fa fa-caret-down wall-item-photo-caret cursor-pointer" data-toggle="dropdown"></i> <div class="dropdown-menu"> {{foreach $item.thread_author_menu as $mitem}} <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} >{{$mitem.title}}</a> @@ -43,7 +43,7 @@ </div> {{if $item.lock}} <div class="wall-item-lock dropdown"> - <i class="fa fa-lock lockview" data-toggle="dropdown" title="{{$item.lock}}" onclick="lockview('item',{{$item.id}});" ></i> + <i class="fa fa-lock lockview{{if $item.privacy_warning}} text-danger{{/if}}" data-toggle="dropdown" title="{{$item.lock}}" onclick="lockview('item',{{$item.id}});" ></i> <div id="panel-{{$item.id}}" class="dropdown-menu"></div> </div> {{/if}} diff --git a/view/tpl/conv_list.tpl b/view/tpl/conv_list.tpl index f94a2f24f..c6da3d8a4 100755 --- a/view/tpl/conv_list.tpl +++ b/view/tpl/conv_list.tpl @@ -31,7 +31,7 @@ <div class="wall-item-photo-wrapper{{if $item.owner_url}} wwfrom{{/if}} h-card p-author" id="wall-item-photo-wrapper-{{$item.id}}"> <img src="{{$item.thumb}}" class="fakelink wall-item-photo{{$item.sparkle}} u-photo p-name" id="wall-item-photo-{{$item.id}}" alt="{{$item.name}}" data-toggle="dropdown" /></a> {{if $item.thread_author_menu}} - <i class="fa fa-caret-down wall-item-photo-caret"></i> + <i class="fa fa-caret-down wall-item-photo-caret cursor-pointer" data-toggle="dropdown"></i> <div class="dropdown-menu"> {{foreach $item.thread_author_menu as $mitem}} <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} >{{$mitem.title}}</a> diff --git a/view/tpl/delegate.tpl b/view/tpl/delegate.tpl deleted file mode 100755 index cbaa8da86..000000000 --- a/view/tpl/delegate.tpl +++ /dev/null @@ -1,57 +0,0 @@ -<h3>{{$header}}</h3> - -<div id="delegate-desc" class="delegate-desc">{{$desc}}</div> - -{{if $managers}} -<h3>{{$head_managers}}</h3> - -{{foreach $managers as $x}} - -<div class="contact-block-div"> -<a class="contact-block-link" href="#" > -<img class="contact-block-img" src="{{$base}}/photo/thumb/{{$x.uid}}" title="{{$x.username}} ({{$x.nickname}})" /> -</a> -</div> - -{{/foreach}} -<div class="clear"></div> -<hr /> -{{/if}} - - -<h3>{{$head_delegates}}</h3> - -{{if $delegates}} -{{foreach $delegates as $x}} - -<div class="contact-block-div"> -<a class="contact-block-link" href="{{$base}}/delegate/remove/{{$x.uid}}" > -<img class="contact-block-img" src="{{$base}}/photo/thumb/{{$x.uid}}" title="{{$x.username}} ({{$x.nickname}})" /> -</a> -</div> - -{{/foreach}} -<div class="clear"></div> -{{else}} -{{$none}} -{{/if}} -<hr /> - - -<h3>{{$head_potentials}}</h3> -{{if $potentials}} -{{foreach $potentials as $x}} - -<div class="contact-block-div"> -<a class="contact-block-link" href="{{$base}}/delegate/add/{{$x.uid}}" > -<img class="contact-block-img" src="{{$base}}/photo/thumb/{{$x.uid}}" title="{{$x.username}} ({{$x.nickname}})" /> -</a> -</div> - -{{/foreach}} -<div class="clear"></div> -{{else}} -{{$none}} -{{/if}} -<hr /> - diff --git a/view/tpl/design_tools.tpl b/view/tpl/design_tools.tpl index bc7d46dc1..b4657cb7f 100644 --- a/view/tpl/design_tools.tpl +++ b/view/tpl/design_tools.tpl @@ -2,7 +2,7 @@ <h3>{{$title}}</h3> <div class="nav nav-pills flex-column"> <a class="nav-link" href="blocks/{{$who}}">{{$blocks}}</a> - <a class="nav-link" href="menu{{if $sys}}?f=&sys=1{{/if}}">{{$menus}}</a> + <a class="nav-link" href="menu/{{$who}}">{{$menus}}</a> <a class="nav-link" href="layouts/{{$who}}">{{$layout}}</a> <a class="nav-link" href="webpages/{{$who}}">{{$pages}}</a> </div> diff --git a/view/tpl/display-head.tpl b/view/tpl/display-head.tpl deleted file mode 100755 index 913784d98..000000000 --- a/view/tpl/display-head.tpl +++ /dev/null @@ -1,8 +0,0 @@ -<script> -$(document).ready(function() { - $(".comment-edit-wrapper textarea").editor_autocomplete(baseurl+"/acl?f=&n=1"); - // make auto-complete work in more places - $(".wall-item-comment-wrapper textarea").editor_autocomplete(baseurl+"/acl?f=&n=1"); -}); -</script> - diff --git a/view/tpl/edpost_head.tpl b/view/tpl/edpost_head.tpl index b2ab5db4e..4f39137ab 100755 --- a/view/tpl/edpost_head.tpl +++ b/view/tpl/edpost_head.tpl @@ -1,10 +1,13 @@ <div class="generic-content-wrapper"> <div class="section-title-wrapper"> - {{if $delete}} <div class="pull-right"> + {{if $cancel}} + <button id="dbtn-cancel" class="btn btn-warning btn-sm" onclick="itemCancel(); return false;">{{$cancel}}</button> + {{/if}} + {{if $delete}} <a href="item/drop/{{$id}}" id="delete-btn" class="btn btn-sm btn-danger" onclick="return confirmDelete();"><i class="fa fa-trash-o"></i> {{$delete}}</a> + {{/if}} </div> - {{/if}} <h2>{{$title}}</h2> <div class="clear"></div> </div> diff --git a/view/tpl/events_menu_side.tpl b/view/tpl/events_menu_side.tpl deleted file mode 100755 index b9a9062b1..000000000 --- a/view/tpl/events_menu_side.tpl +++ /dev/null @@ -1,8 +0,0 @@ -<div class="widget"> - <h3>{{$title}}</h3> - <ul class="nav nav-pills nav-stacked"> - <li><a href="#" onclick="changeView('changeView', 'month'); return false;">{{$month}}</a></li> - <li><a href="#" onclick="changeView('changeView', 'agendaWeek'); return false;">{{$week}}</a></li> - <li><a href="#" onclick="changeView('changeView', 'agendaDay'); return false;">{{$day}}</a></li> - </ul> -</div> diff --git a/view/tpl/events_reminder.tpl b/view/tpl/events_reminder.tpl deleted file mode 100755 index fd6a1a5c7..000000000 --- a/view/tpl/events_reminder.tpl +++ /dev/null @@ -1,10 +0,0 @@ -{{if $count}} -<div id="event-notice" class="birthday-notice fakelink {{$classtoday}}" onclick="openClose('event-wrapper');">{{$event_reminders}} ({{$count}})</div> -<div id="event-wrapper" style="display: none;" ><div id="event-title">{{$event_title}}</div> -<div id="event-title-end"></div> -{{foreach $events as $event}} -<div class="event-list" id="event-{{$event.id}}"></a> <a href="events/{{$event.link}}">{{$event.title}}</a> {{$event.date}} </div> -{{/foreach}} -</div> -{{/if}} - diff --git a/view/tpl/field_acheckbox.tpl b/view/tpl/field_acheckbox.tpl index c87b9ac79..1810e1ee1 100755 --- a/view/tpl/field_acheckbox.tpl +++ b/view/tpl/field_acheckbox.tpl @@ -5,11 +5,12 @@ </td> {{if $notself}} <td class="abook-them"> - {{if $field.2}}<i class="fa fa-check-square-o"></i>{{else}}<i class="fa fa-square-o"></i>{{/if}} + {{if $field.2 === 1}}<i class="fa fa-check-square-o"></i>{{/if}} + {{if $field.2 === 0}}<i class="fa fa-square-o"></i>{{/if}} </td> {{/if}} <td class="abook-me"> - {{if $self || !$field.5 || $twocol }} + {{if $self || !$field.5 }} <input type="checkbox" name='{{$field.0}}' class='abook-edit-me' id='me_id_{{$field.0}}' value="{{$field.4}}" {{if $field.3}}checked="checked"{{/if}} /> {{/if}} {{if $notself && $field.5}} diff --git a/view/tpl/group_drop.tpl b/view/tpl/group_drop.tpl deleted file mode 100755 index 627debc80..000000000 --- a/view/tpl/group_drop.tpl +++ /dev/null @@ -1,7 +0,0 @@ -<div class="group-delete-wrapper button" id="group-delete-wrapper-{{$id}}" > - <a href="group/drop/{{$id}}?t={{$form_security_token}}" - onclick="return confirmDelete();" - id="group-delete-icon-{{$id}}" - class="group-delete-icon btn btn-outline-secondary" title="{{$delete}}" ><i class="fa fa-trash-o drop-icons"></i></a> -</div> -<div class="group-delete-end"></div> diff --git a/view/tpl/group_edit.tpl b/view/tpl/group_edit.tpl index d9412a6f7..88f037abe 100755 --- a/view/tpl/group_edit.tpl +++ b/view/tpl/group_edit.tpl @@ -1,26 +1,30 @@ -<div class="generic-content-wrapper-styled"> -<h2>{{$title}}</h2> - - -<div id="group-edit-wrapper" > - <form action="group/{{$gid}}" id="group-edit-form" method="post" > - <input type='hidden' name='form_security_token' value='{{$form_security_token}}'> - - {{include file="field_input.tpl" field=$gname}} - {{include file="field_checkbox.tpl" field=$public}} - {{if $drop}}{{$drop}}{{/if}} - <div id="group-edit-submit-wrapper" > - <input type="submit" name="submit" value="{{$submit}}" > +<div class="generic-content-wrapper"> + <div class="section-title-wrapper"> + <div class="float-right"> + <button type="button" class="btn btn-sm btn-outline-secondary" onclick="openClose('group_tools')"><i class="fa fa-pencil"></i> {{$details_label}}</button> + <button id="fullscreen-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button> + <button id="inline-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button> </div> - <div id="group-edit-select-end" ></div> - </form> -</div> - + <h2>{{$title}}</h2> + </div> -{{if $groupeditor}} - <div id="group-update-wrapper"> - {{include file="groupeditor.tpl"}} + <div id="group_tools" class="clearfix section-content-tools-wrapper" style="display: none"> + <form action="group/{{$gid}}" id="group-edit-form" method="post" > + <input type='hidden' name='form_security_token' value='{{$form_security_token_edit}}'> + {{include file="field_input.tpl" field=$gname}} + {{include file="field_checkbox.tpl" field=$public}} + <a href="group/drop/{{$gid}}?t={{$form_security_token_drop}}" onclick="return confirmDelete();" class="btn btn-sm btn-danger"> + {{$delete}} + </a> + <button type="submit" name="submit" class="btn btn-sm btn-primary float-right">{{$submit}}</button> + </form> + </div> + <div class="section-content-info-wrapper"> + {{$desc}} + </div> + <div class="section-content-wrapper"> + <div id="group-update-wrapper" class="clearfix"> + {{include file="groupeditor.tpl"}} + </div> </div> -{{/if}} -{{if $desc}}<div id="group-edit-desc">{{$desc}}</div>{{/if}} </div> diff --git a/view/tpl/groupeditor.tpl b/view/tpl/groupeditor.tpl index c79bb0a2a..94c275c7e 100755 --- a/view/tpl/groupeditor.tpl +++ b/view/tpl/groupeditor.tpl @@ -1,16 +1,12 @@ -<div id="group"> -<h3>{{$groupeditor.label_members}}</h3> -<div id="group-members" class="contact_list"> -{{foreach $groupeditor.members as $c}} {{$c}} {{/foreach}} -</div> -<div id="group-members-end"></div> -<hr id="group-separator" /> -</div> - -<div id="contacts"> -<h3>{{$groupeditor.label_contacts}}</h3> -<div id="group-all-contacts" class="contact_list"> -{{foreach $groupeditor.contacts as $m}} {{$m}} {{/foreach}} -</div> -<div id="group-all-contacts-end"></div> +<div id="contacts" class="list-group float-left w-50 pr-2"> + <h3>{{$groupeditor.label_contacts}}</h3> + <div id="group-all-contacts" class="contact_list"> + {{foreach $groupeditor.contacts as $m}} {{$m}} {{/foreach}} + </div> +</div> +<div id="group" class="list-group float-right w-50"> + <h3>{{$groupeditor.label_members}}</h3> + <div id="group-members" class="contact_list"> + {{foreach $groupeditor.members as $c}} {{$c}} {{/foreach}} + </div> </div> diff --git a/view/tpl/jot-header.tpl b/view/tpl/jot-header.tpl index c84126d26..dd64c3454 100755 --- a/view/tpl/jot-header.tpl +++ b/view/tpl/jot-header.tpl @@ -5,12 +5,14 @@ var plaintext = '{{$editselect}}'; var pretext = '{{$pretext}}'; function initEditor(cb){ - if (editor==false){ + if(editor == false){ $("#profile-jot-text-loading").show(); + $("#profile-jot-reset").removeClass('d-none'); {{$geotag}} if(plaintext == 'none') { $("#profile-jot-text-loading").hide(); - $("#profile-jot-text").css({ 'height': 200 }); + $(".jothidden").show(); + $("#profile-jot-text").addClass('jot-expanded'); {{if $bbco_autocomplete}} $("#profile-jot-text").bbco_autocomplete('{{$bbco_autocomplete}}'); // autocomplete bbcode {{/if}} @@ -21,82 +23,21 @@ function initEditor(cb){ $("#profile-jot-text").editor_autocomplete(baseurl+"/acl",[channelId]); // Also gives suggestions from current channel's connections {{/if}} editor = true; - $("a#jot-perms-icon").colorbox({ - 'inline' : true, - 'transition' : 'elastic' - }); - $(".jothidden").show(); - $("#profile-jot-text").addClass('jot-expanded'); if (typeof cb!="undefined") cb(); if(pretext.length) addeditortext(pretext); return; } - tinyMCE.init({ - theme : "advanced", - mode : "specific_textareas", - editor_selector: {{$editselect}}, - auto_focus: "profile-jot-text", - plugins : "bbcode,paste,autoresize, inlinepopups", - theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code", - theme_advanced_buttons2 : "", - theme_advanced_buttons3 : "", - theme_advanced_toolbar_location : "top", - theme_advanced_toolbar_align : "center", - theme_advanced_blockformats : "blockquote,code", - gecko_spellcheck : true, - paste_text_sticky : true, - entity_encoding : "raw", - add_unload_trigger : false, - remove_linebreaks : false, - force_p_newlines : false, - force_br_newlines : true, - forced_root_block : '', - convert_urls: false, - content_css: "{{$baseurl}}/view/custom_tinymce.css", - theme_advanced_path : false, - file_browser_callback : "fcFileBrowser", - setup : function(ed) { - cPopup = null; - ed.onKeyDown.add(function(ed,e) { - if(cPopup !== null) - cPopup.onkey(e); - }); - - ed.onKeyUp.add(function(ed, e) { - var txt = tinyMCE.activeEditor.getContent(); - match = txt.match(/@([^ \n]+)$/); - if(match!==null) { - if(cPopup === null) { - cPopup = new ACPopup(this,baseurl+"/acl"); - } - if(cPopup.ready && match[1]!==cPopup.searchText) cPopup.search(match[1]); - if(! cPopup.ready) cPopup = null; - } - else { - if(cPopup !== null) { cPopup.close(); cPopup = null; } - } - }); - - ed.onInit.add(function(ed) { - ed.pasteAsPlainText = true; - $("#profile-jot-text-loading").hide(); - $(".jothidden").show(); - if (typeof cb!="undefined") cb(); - }); - - } - }); - - editor = true; + editor = true; } else { if (typeof cb!="undefined") cb(); } } function enableOnUser(){ - if (editor) return; - $(this).val(""); + if(editor) + return; + initEditor(); } </script> @@ -110,8 +51,7 @@ var activeCommentID = 0; var activeCommentText = ''; $(document).ready(function() { - - /* enable tinymce on focus and click */ + $("#profile-jot-text").focus(enableOnUser); $("#profile-jot-text").click(enableOnUser); @@ -157,6 +97,7 @@ var activeCommentText = ''; $('#invisible-comment-upload').fileupload({ url: 'wall_attach/{{$nickname}}', dataType: 'json', + dropZone: $(), maxChunkSize: 4 * 1024 * 1024, add: function(e,data) { @@ -357,6 +298,24 @@ var activeCommentText = ''; } } + function itemCancel() { + $("#jot-title").val(''); + $("#profile-jot-text").val(''); + $("#jot-category").tagsinput('removeAll'); + + postSaveChanges('clean'); + + {{if $reset}} + $(".jothidden").hide(); + $("#profile-jot-text").removeClass('jot-expanded'); + $("#profile-jot-reset").addClass('d-none'); + $("#jot-preview-content").html('').hide(); + editor = false; + {{else}} + window.history.back(); + {{/if}} + } + function itemFiler(id) { if($('#item-filer-dialog').length) $('#item-filer-dialog').remove(); @@ -524,10 +483,13 @@ var activeCommentText = ''; } - // file drag hover - function DragDropUploadFileHover(e) { - e.target.className = (e.type == "dragover" ? "hover" : ""); - } + // file drag hover + function DragDropUploadFileHover(e) { + if(e.type == 'dragover') + $(e.target).addClass('hover'); + else + $(e.target).removeClass('hover'); + } // file selection function DragDropUploadFileSelectHandler(e) { @@ -536,7 +498,7 @@ var activeCommentText = ''; DragDropUploadFileHover(e); // open editor if it isn't yet initialised if (!editor) { - initEditor(); + enableOnUser(); } linkdrop(e); @@ -565,7 +527,7 @@ $( document ).on( "click", ".wall-item-delete-link,.page-delete-link,.layout-del <script> var postSaveTimer = null; - function postSaveChanges(action, type) { + function postSaveChanges(action) { if({{$auto_save_draft}}) { var doctype = $('#jot-webpage').val(); @@ -575,7 +537,7 @@ $( document ).on( "click", ".wall-item-delete-link,.page-delete-link,.layout-del localStorage.setItem("post_title" + postid, $("#jot-title").val()); localStorage.setItem("post_body" + postid, $("#profile-jot-text").val()); if($("#jot-category").length) - localStorage.setItem("post_category + postid", $("#jot-category").val()); + localStorage.setItem("post_category" + postid, $("#jot-category").val()); } if(action == 'start') { @@ -628,7 +590,7 @@ $( document ).on( "click", ".wall-item-delete-link,.page-delete-link,.layout-del openEditor = true; } if(openEditor) { - initEditor(); + enableOnUser(); } } else { postSaveChanges('clean'); diff --git a/view/tpl/jot.tpl b/view/tpl/jot.tpl index 9aa330c40..0d1b4bd0d 100755 --- a/view/tpl/jot.tpl +++ b/view/tpl/jot.tpl @@ -9,6 +9,7 @@ </div> {{/if}} <div class="mb-4" id="profile-jot-wrapper"> + {{if $parent}} <input type="hidden" name="parent" value="{{$parent}}" /> {{/if}} @@ -41,6 +42,11 @@ </div> {{/if}} <div id="jot-text-wrap"> + {{if $reset}} + <button id="profile-jot-reset" class="btn btn-outline-secondary btn-sm d-none border-0" title="{{$reset}}" onclick="itemCancel(); return false;"> + <i class="fa fa-close"></i> + </button> + {{/if}} <textarea class="profile-jot-text" id="profile-jot-text" name="body" tabindex="2" placeholder="{{$placeholdtext}}" >{{$content}}</textarea> </div> {{if $attachment}} diff --git a/view/tpl/js_strings.tpl b/view/tpl/js_strings.tpl index 4243c2ea5..01fc3f993 100755 --- a/view/tpl/js_strings.tpl +++ b/view/tpl/js_strings.tpl @@ -23,6 +23,18 @@ 'linkurl' : "{{$linkurl}}", 'leavethispage' : "{{$leavethispage}}", 'location' : "{{$location}}", + 'lovely' : "{{$lovely}}", + 'wonderful' : "{{$wonderful}}", + 'fantastic' : "{{$fantastic}}", + 'great' : "{{$great}}", + 'nick_invld1' : "{{$nick_invld1}}", + 'nick_invld2' : "{{$nick_invld2}}", + 'nick_valid' : "{{$nick_valid}}", + 'name_empty' : "{{$name_empty}}", + 'name_ok1' : "{{$name_ok1}}", + 'name_ok2' : "{{$name_ok2}}", + + 't01' : "{{$t01}}", 't02' : "{{$t02}}", diff --git a/view/tpl/mail_conv.tpl b/view/tpl/mail_conv.tpl index 759517b7f..cd810e999 100755 --- a/view/tpl/mail_conv.tpl +++ b/view/tpl/mail_conv.tpl @@ -6,7 +6,7 @@ <div class="mail-conv-detail"> {{if $mail.is_recalled}}<strong>{{$mail.is_recalled}}</strong>{{/if}} <div class="wall-item-name"><a class="wall-item-name-link" href="{{$mail.from_url}}">{{$mail.from_name}}</a></div> - <div class="autotime wall-item-ago" title="{{$mail.date}}">{{$mail.date}}</div> + <div class="autotime wall-item-ago" title="{{$mail.date}}"></div> </div> </div> <div class="clearfix mail-conv-content"> diff --git a/view/tpl/mail_list.tpl b/view/tpl/mail_list.tpl index 65d8dcdb4..a1784e1e6 100755 --- a/view/tpl/mail_list.tpl +++ b/view/tpl/mail_list.tpl @@ -2,6 +2,6 @@ <a href="mail/{{$message.mailbox}}/{{$message.id}}" class="nav-link{{if $message.selected}} active{{/if}}"> <span class="{{if ! $message.seen || $message.selected}}font-weight-bold{{/if}}">{{$message.subject}}</span><br> <span class="conv-participants">{{$message.from_name}} > {{$message.to_name}}</span><br> - <span class="wall-item-ago autotime" title="{{$message.date}}">{{$message.date}}</span> + <span class="wall-item-ago autotime" title="{{$message.date}}"></span> </a> </li> diff --git a/view/tpl/match.tpl b/view/tpl/match.tpl deleted file mode 100755 index a5ebb043c..000000000 --- a/view/tpl/match.tpl +++ /dev/null @@ -1,16 +0,0 @@ -<div class="profile-match-wrapper"> - <div class="profile-match-photo"> - <a href="{{$url}}"> - <img src="{{$photo}}" alt="{{$name}}" title="{{$name}}[{{$tags}}]" /> - </a> - </div> - <div class="profile-match-break"></div> - <div class="profile-match-name"> - <a href="{{$url}}" title="{{$name}}[{{$tags}}]">{{$name}}</a> - </div> - <div class="profile-match-end"></div> - {{if $connlnk}} - <div class="profile-match-connect"><a href="{{$connlnk}}" title="{{$conntxt}}"><i class="fa fa-plus connect-icon"></i> {{$conntxt}}</a></div> - {{/if}} - -</div> diff --git a/view/tpl/menuedit.tpl b/view/tpl/menuedit.tpl index 84b16dc0b..3558bdbaa 100644 --- a/view/tpl/menuedit.tpl +++ b/view/tpl/menuedit.tpl @@ -11,7 +11,7 @@ </div> {{/if}} <div id="menu-creator" class="section-content-tools-wrapper" style="display: {{$display}};"> - <form id="menuedit" action="menu{{if $menu_id}}/{{$menu_id}}{{/if}}{{if $sys}}?f=&sys=1{{/if}}" method="post" > + <form id="menuedit" action="menu/{{$nick}}{{if $menu_id}}/{{$menu_id}}{{/if}}{{if $sys}}?f=&sys=1{{/if}}" method="post" > {{if $menu_id}} <input type="hidden" name="menu_id" value="{{$menu_id}}" /> {{/if}} diff --git a/view/tpl/menulist.tpl b/view/tpl/menulist.tpl index e23035062..f9c925472 100644 --- a/view/tpl/menulist.tpl +++ b/view/tpl/menulist.tpl @@ -25,11 +25,11 @@ {{foreach $menus as $m }} <tr id="menu-list-item-{{$m.menu_id}}"> <td>{{if $m.bookmark}}<i class="fa fa-bookmark menu-list-tool" title="{{$bmark}}" ></i>{{/if}}</td> - <td><a href="mitem/{{$m.menu_id}}{{if $sys}}?f=&sys=1{{/if}}" title="{{$hintcontent}}">{{$m.menu_name}}</a></td> + <td><a href="mitem/{{$nick}}/{{$m.menu_id}}{{if $sys}}?f=&sys=1{{/if}}" title="{{$hintcontent}}">{{$m.menu_name}}</a></td> <td>{{$m.menu_desc}}</td> - <td class="menu-list-tool"><a href="menu/{{$m.menu_id}}{{if $sys}}?f=&sys=1{{/if}}" title="{{$hintedit}}"><i class="fa fa-pencil"></i></a></td> + <td class="menu-list-tool"><a href="menu/{{$nick}}/{{$m.menu_id}}{{if $sys}}?f=&sys=1{{/if}}" title="{{$hintedit}}"><i class="fa fa-pencil"></i></a></td> <td class="menu-list-tool"><a href="rpost?attachment={{$m.element}}" title="{{$share}}"><i class="fa fa-share-square-o"></i></a></td> - <td class="menu-list-tool"><a href="#" title="{{$hintdrop}}" onclick="dropItem('menu/{{$m.menu_id}}/drop{{if $sys}}?f=&sys=1{{/if}}', '#menu-list-item-{{$m.menu_id}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a></td> + <td class="menu-list-tool"><a href="#" title="{{$hintdrop}}" onclick="dropItem('menu/{{$nick}}/{{$m.menu_id}}/drop{{if $sys}}?f=&sys=1{{/if}}', '#menu-list-item-{{$m.menu_id}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a></td> <td class="d-none d-md-table-cell">{{$m.menu_created}}</td> <td class="d-none d-md-table-cell">{{$m.menu_edited}}</td> </tr> diff --git a/view/tpl/micropro_card.tpl b/view/tpl/micropro_card.tpl new file mode 100644 index 000000000..a3c693dbd --- /dev/null +++ b/view/tpl/micropro_card.tpl @@ -0,0 +1,5 @@ +<a class="list-group-item{{if $class}} {{$class}}{{/if}} fakelink" href="{{if $click}}#{{else}}{{$url}}{{/if}}" {{if $click}}onclick="{{$click}}"{{/if}}> + <img class="menu-img-3" src="{{$photo}}" title="{{$title}}" alt="" />{{if $oneway}}<i class="fa fa-fw fa-minus-circle oneway-overlay text-danger"></i>{{/if}} + <span class="contactname">{{$name}}</span> + <span class="dropdown-sub-text">{{$addr}}<br>{{$network}}</span> +</a> diff --git a/view/tpl/mitemedit.tpl b/view/tpl/mitemedit.tpl index 9f696fc23..36be0b207 100644 --- a/view/tpl/mitemedit.tpl +++ b/view/tpl/mitemedit.tpl @@ -5,7 +5,7 @@ </div> {{/if}} <div id="menu-element-creator" class="section-content-tools-wrapper" style="display: {{$display}};"> - <form id="mitemedit" action="mitem/{{$menu_id}}{{if $mitem_id}}/{{$mitem_id}}{{/if}}{{if $sys}}?f=&sys=1{{/if}}" method="post" class="acl-form" data-form_id="mitemedit" data-allow_cid='{{$allow_cid}}' data-allow_gid='{{$allow_gid}}' data-deny_cid='{{$deny_cid}}' data-deny_gid='{{$deny_gid}}'> + <form id="mitemedit" action="mitem/{{$nick}}/{{$menu_id}}{{if $mitem_id}}/{{$mitem_id}}{{/if}}{{if $sys}}?f=&sys=1{{/if}}" method="post" class="acl-form" data-form_id="mitemedit" data-allow_cid='{{$allow_cid}}' data-allow_gid='{{$allow_gid}}' data-deny_cid='{{$deny_cid}}' data-deny_gid='{{$deny_gid}}'> <input type="hidden" name="menu_id" value="{{$menu_id}}" /> {{if $mitem_id}} <input type="hidden" name="mitem_id" value="{{$mitem_id}}" /> diff --git a/view/tpl/mitemlist.tpl b/view/tpl/mitemlist.tpl index b28cdfc7e..1e6302868 100644 --- a/view/tpl/mitemlist.tpl +++ b/view/tpl/mitemlist.tpl @@ -24,8 +24,8 @@ <td width="1%">{{$m.mitem_desc}}</td> <td width="96%"><a href="{{$m.mitem_link}}">{{$m.mitem_link}}</a></td> <td width="1%" class="mitem-list-tool dropdown">{{if $m.allow_cid || $m.allow_gid || $m.deny_cid || $m.deny_gid}}<i class="fa fa-lock lockview" data-toggle="dropdown" onclick="lockview('menu_item',{{$m.mitem_id}});" ></i><ul id="panel-{{$m.mitem_id}}" class="lockview-panel dropdown-menu"></ul>{{/if}}</td> - <td width="1%" class="mitem-list-tool"><a href="mitem/{{$menu_id}}/{{$m.mitem_id}}" title="{{$hintedit}}"><i class="fa fa-pencil"></i></a></td> - <td width="1%" class="mitem-list-tool"><a href="#" title="{{$hintdrop}}" onclick="dropItem('mitem/{{$menu_id}}/{{$m.mitem_id}}/drop', '#mitem-list-item-{{$m.mitem_id}}, #pmenu-item-{{$m.mitem_id}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a></td> + <td width="1%" class="mitem-list-tool"><a href="mitem/{{$nick}}/{{$menu_id}}/{{$m.mitem_id}}" title="{{$hintedit}}"><i class="fa fa-pencil"></i></a></td> + <td width="1%" class="mitem-list-tool"><a href="#" title="{{$hintdrop}}" onclick="dropItem('mitem/{{$nick}}/{{$menu_id}}/{{$m.mitem_id}}/drop', '#mitem-list-item-{{$m.mitem_id}}, #pmenu-item-{{$m.mitem_id}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a></td> </tr> {{/foreach}} </table> diff --git a/view/tpl/myapps.tpl b/view/tpl/myapps.tpl index 0ac836b38..2cc747436 100755 --- a/view/tpl/myapps.tpl +++ b/view/tpl/myapps.tpl @@ -3,7 +3,7 @@ {{if $authed}} {{if $create}} <a href="appman" class="pull-right btn btn-success btn-sm"><i class="fa fa-pencil-square-o"></i> {{$create}}</a> - {{else}} + {{elseif $manage}} <a href="apps/edit{{if $cat.0}}/?f=&cat={{$cat.0}}{{/if}}" class="pull-right btn btn-primary btn-sm">{{$manage}}</a> {{/if}} {{/if}} diff --git a/view/tpl/navbar_default.tpl b/view/tpl/navbar_default.tpl index 7bc8df8d5..0eb0a964c 100755 --- a/view/tpl/navbar_default.tpl +++ b/view/tpl/navbar_default.tpl @@ -27,6 +27,9 @@ {{foreach $nav.usermenu as $usermenu}} <a class="dropdown-item{{if $usermenu.2}} active{{/if}}" href="{{$usermenu.0}}" title="{{$usermenu.3}}" role="menuitem" id="{{$usermenu.4}}">{{$usermenu.1}}</a> {{/foreach}} + {{if $nav.group}} + <a class="dropdown-item" href="{{$nav.group.0}}" title="{{$nav.group.3}}" role="menuitem" id="{{$nav.group.4}}">{{$nav.group.1}}</a> + {{/if}} {{if $nav.manage}} <a class="dropdown-item{{if $sel.name == Manage}} active{{/if}}" href="{{$nav.manage.0}}" title="{{$nav.manage.3}}" role="menuitem" id="{{$nav.manage.4}}">{{$nav.manage.1}}</a> {{/if}} @@ -119,7 +122,7 @@ <ul id="nav-right" class="navbar-nav ml-auto"> <li class="nav-item collapse clearfix" id="nav-search"> - <form class="form-inline" method="get" action="search" role="search"> + <form class="form-inline" method="get" action="{{$nav.search.4}}" role="search"> <input class="form-control form-control-sm mt-1 mr-2" id="nav-search-text" type="text" value="" placeholder="{{$help}}" name="search" title="{{$nav.search.3}}" onclick="this.submit();" onblur="closeMenu('nav-search'); openMenu('nav-search-btn');"/> </form> <div id="nav-search-spinner" class="spinner-wrapper"> diff --git a/view/tpl/new_channel.tpl b/view/tpl/new_channel.tpl index f415e4e2c..51880e1f6 100755 --- a/view/tpl/new_channel.tpl +++ b/view/tpl/new_channel.tpl @@ -3,6 +3,7 @@ <h2>{{$title}}</h2> </div> <div class="section-content-wrapper"> + {{if ! $default_role}} <div class="section-content-info-wrapper"> {{$desc}} </div> @@ -11,6 +12,7 @@ {{$channel_usage_message}} </div> {{/if}} + {{/if}} <form action="new_channel" method="post" id="newchannel-form"> {{if $default_role}} <input type="hidden" name="permissions_role" value="{{$default_role}}" /> @@ -19,14 +21,11 @@ {{/if}} {{include file="field_input.tpl" field=$name}} - <div id="name-spinner" class="spinner-wrapper"><div class="spinner m"></div></div> {{include file="field_input.tpl" field=$nickname}} - <div id="nick-spinner" class="spinner-wrapper"><div class="spinner m"></div></div> + <button class="btn btn-primary" type="submit" id="newchannel-submit-button">{{$submit}}</button> - <button class="btn btn-secondary" name="validate" id="newchannel-validate-button" value="{{$validate}}" onclick="validate_channel(); return false;">{{$validate}}</button> - <button class="btn btn-primary" type="submit" name="submit" id="newchannel-submit-button" value="{{$submit}}" >{{$submit}}</button> <div id="newchannel-submit-end" class="clear"></div> <div id="newchannel-import-link" class="descriptive-paragraph" >{{$label_import}}</div> diff --git a/view/tpl/notifications_widget.tpl b/view/tpl/notifications_widget.tpl index 215fddd08..068441997 100644 --- a/view/tpl/notifications_widget.tpl +++ b/view/tpl/notifications_widget.tpl @@ -127,12 +127,20 @@ {{$no_notifications}}<span class="jumping-dots"><span class="dot-1">.</span><span class="dot-2">.</span><span class="dot-3">.</span></span> </div> <div id="nav-notifications-template" rel="template"> - <a class="list-group-item clearfix notification {5}" href="{0}" title="{2} {3}" data-b64mid="{6}" data-notify_id="{7}" data-thread_top="{8}" data-contact_name="{2}"> + <a class="list-group-item clearfix notification {5}" href="{0}" title="{2}" data-b64mid="{6}" data-notify_id="{7}" data-thread_top="{8}" data-contact_name="{2}"> <img class="menu-img-3" data-src="{1}"> <span class="contactname">{2}</span> <span class="dropdown-sub-text">{3}<br>{4}</span> </a> </div> + <div id="nav-notifications-forums-template" rel="template"> + <a class="list-group-item clearfix notification notification-forum" href="{0}" title="{3}" data-b64mid="{6}" data-notify_id="{7}" data-thread_top="{8}" data-contact_name="{2}"> + <span class="float-right badge badge-{{$notification.severity}}">{9}</span> + <img class="menu-img-1" src="{1}"> + <span class="">{2}</span> + <i class="fa fa-{10} text-muted"></i> + </a> + </div> <div id="notifications" class="navbar-nav"> {{foreach $notifications as $notification}} <div class="collapse {{$notification.type}}-button"> @@ -152,15 +160,19 @@ </div> {{/if}} {{if $notification.filter}} + {{if $notification.filter.posts_label}} <div class="list-group-item cursor-pointer" id="tt-{{$notification.type}}-only"> <i class="fa fa-fw fa-filter"></i> {{$notification.filter.posts_label}} </div> + {{/if}} + {{if $notification.filter.name_label}} <div class="list-group-item clearfix notifications-textinput" id="cn-{{$notification.type}}-only"> <div class="text-muted notifications-textinput-filter"><i class="fa fa-fw fa-filter"></i></div> <input id="cn-{{$notification.type}}-input" type="text" class="form-control form-control-sm" placeholder="{{$notification.filter.name_label}}"> <div id="cn-{{$notification.type}}-input-clear" class="text-muted notifications-textinput-clear d-none"><i class="fa fa-times"></i></div> </div> {{/if}} + {{/if}} <div id="nav-{{$notification.type}}-menu" class=""> {{$loading}}<span class="jumping-dots"><span class="dot-1">.</span><span class="dot-2">.</span><span class="dot-3">.</span></span> </div> diff --git a/view/tpl/privacy_groups.tpl b/view/tpl/privacy_groups.tpl new file mode 100644 index 000000000..b4e27ef2c --- /dev/null +++ b/view/tpl/privacy_groups.tpl @@ -0,0 +1,28 @@ +<div class="generic-content-wrapper"> + <div class="clearfix section-title-wrapper"> + <button type="button" class="btn btn-sm btn-success float-right" onclick="openClose('group_tools')"><i class="fa fa-plus-circle"></i> {{$add_new_label}}</button> + <h2>{{$title}}</h2> + </div> + <div id="group_tools" class="clearfix section-content-tools-wrapper"{{if ! $new}} style="display: none"{{/if}}> + <form action="group/new" id="group-edit-form" method="post" > + <input type='hidden' name='form_security_token' value='{{$form_security_token}}'> + {{include file="field_input.tpl" field=$gname}} + {{include file="field_checkbox.tpl" field=$public}} + <button type="submit" name="submit" class="btn btn-sm btn-primary float-right">{{$submit}}</button> + </form> + </div> + + <table id="groups-index"> + <tr> + <th width="99%">{{$name_label}}</th> + <th width="1%">{{$count_label}}</th> + </tr> + + {{foreach $entries as $group}} + <tr id="groups-index-{{$group.id}}" class="group-index-row"> + <td><a href="group/{{$group.id}}">{{$group.name}}</a></td> + <td>{{$group.count}}</td> + </tr> + {{/foreach}} + </table> +</div> diff --git a/view/tpl/profile_tabs.tpl b/view/tpl/profile_tabs.tpl index e77da23f3..dd9fbc52b 100644 --- a/view/tpl/profile_tabs.tpl +++ b/view/tpl/profile_tabs.tpl @@ -1,5 +1,5 @@ -<div class="dropdown-header text-white-50 d-lg-none" ><img src="{{$thumb}}" class="menu-img-1">{{$name}}</div> -<div class="dropdown-header text-black-50 d-none d-lg-block"><img src="{{$thumb}}" class="menu-img-1">{{$name}}</div> +<div class="dropdown-header text-white-50 d-lg-none" ><img src="{{$thumb}}" class="menu-img-1"> {{$name}}</div> +<div class="dropdown-header text-black-50 d-none d-lg-block"><img src="{{$thumb}}" class="menu-img-1"> {{$name}}</div> {{foreach $tabs as $tab}} <a class="dropdown-item{{if $tab.sel}} {{$tab.sel}}{{/if}}" href="{{$tab.url}}"{{if $tab.title}} title="{{$tab.title}}"{{/if}}><i class="fa fa-fw fa-{{$tab.icon}} generic-icons-nav"></i>{{$tab.label}}</a> {{/foreach}} diff --git a/view/tpl/profile_vcard.tpl b/view/tpl/profile_vcard.tpl index 07e6dcc0a..262bf257f 100755 --- a/view/tpl/profile_vcard.tpl +++ b/view/tpl/profile_vcard.tpl @@ -11,7 +11,7 @@ <a class="dropdown-toggle" data-toggle="dropdown" href="#" ><i class="fa fa-pencil" title="{{$editmenu.edit.1}}"></i></a> <div class="dropdown-menu dropdown-menu-right" role="menu"> {{foreach $editmenu.menu.entries as $e}} - <a href="profiles/{{$e.id}}" class="dropdown-item"><img class="menu-img-1" src='{{$e.photo}}'>{{$e.profile_name}}</a> + <a href="profiles/{{$e.id}}" class="dropdown-item"><img class="menu-img-1" src='{{$e.photo}}'> {{$e.profile_name}}</a> {{/foreach}} <a href="profile_photo" class="dropdown-item">{{$editmenu.menu.chg_photo}}</a> {{if $editmenu.menu.cr_new}}<a href="profiles/new" id="profile-listing-new-link" class="dropdown-item">{{$editmenu.menu.cr_new}}</a>{{/if}} diff --git a/view/tpl/register.tpl b/view/tpl/register.tpl index 335d5f979..33ca46ba1 100755 --- a/view/tpl/register.tpl +++ b/view/tpl/register.tpl @@ -18,9 +18,6 @@ {{/if}} {{if $invitations}} - <div class="section-content-info-wrapper"> - <div id="register-invite-desc" class="descriptive-paragraph">{{$invite_desc}}</div> - </div> {{include file="field_input.tpl" field=$invite_code}} {{/if}} diff --git a/view/tpl/safesearch.tpl b/view/tpl/safesearch.tpl deleted file mode 100644 index 58ce22741..000000000 --- a/view/tpl/safesearch.tpl +++ /dev/null @@ -1,6 +0,0 @@ -<div id="directory_safemode" class="widget"> -<h3>{{$safemode}}</h3> -<ul class="nav nav-pills nav-stacked"> - <li><a href="toggle_safesearch">{{$toggle}}</a></li> -</ul> -</div> diff --git a/view/tpl/search_item.tpl b/view/tpl/search_item.tpl index ebfb6a256..018e98989 100755 --- a/view/tpl/search_item.tpl +++ b/view/tpl/search_item.tpl @@ -23,7 +23,15 @@ <div class="p-2 clearfix wall-item-head{{if $item.is_new && !$item.title && !$item.event && !$item.is_comment}} wall-item-head-new rounded-top{{/if}}"> <div class="wall-item-info" id="wall-item-info-{{$item.id}}" > <div class="wall-item-photo-wrapper{{if $item.owner_url}} wwfrom{{/if}}" id="wall-item-photo-wrapper-{{$item.id}}"> - <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-photo-link" id="wall-item-photo-link-{{$item.id}}"><img src="{{$item.thumb}}" class="wall-item-photo{{$item.sparkle}}" id="wall-item-photo-{{$item.id}}" alt="{{$item.name}}" /></a> + <img src="{{$item.thumb}}" class="fakelink wall-item-photo{{$item.sparkle}} u-photo p-name" id="wall-item-photo-{{$item.id}}" alt="{{$item.name}}" data-toggle="dropdown" /> + {{if $item.thread_author_menu}} + <i class="fa fa-caret-down wall-item-photo-caret cursor-pointer" data-toggle="dropdown"></i> + <div class="dropdown-menu"> + {{foreach $item.thread_author_menu as $mitem}} + <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} >{{$mitem.title}}</a> + {{/foreach}} + </div> + {{/if}} </div> </div> {{if $item.lock}} @@ -54,69 +62,53 @@ <div class="body-tags"> <span class="tag">{{$item.mentions}} {{$item.tags}} {{$item.categories}} {{$item.folders}}</span> </div> - {{** - {{if $item.mentions}} - <div class="body-tags" id="item-mentions"> - <span class="tag">{{$item.mentions}}</span> - </div> - {{/if}} - {{if $item.tags}} - <div class="body-tags" id="item-tags"> - <span class="tag">{{$item.tags}}</span> - </div> - {{/if}} - {{if $item.categories}} - <div class="body-tags" id="item-categories"> - <span class="tag">{{$item.categories}}</span> - </div> - {{/if}} - {{if $item.folders}} - <div class="body-tags" id="item-folders"> - <span class="tag">{{$item.folders}}</span> - </div> - {{/if}} - **}} </div> {{/if}} <div class="p-2 clearfix wall-item-tools"> - <div class="wall-item-tools-right btn-group pull-right"> - <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown"> - <i class="fa fa-cog"></i> - </button> - <div class="dropdown-menu dropdown-menu-right"> - {{if $item.thread_action_menu}} - {{foreach $item.thread_action_menu as $mitem}} - <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} ><i class="fa fa-{{$mitem.icon}}"></i> {{$mitem.title}}</a></li> - {{/foreach}} - {{/if}} - {{if $item.drop.dropping}} - <a class="dropdown-item" href="item/drop/{{$item.id}}" onclick="return confirmDelete();" title="{{$item.drop.delete}}" ><i class="fa fa-trash-o"></i> {{$item.drop.delete}}</a></li> - {{/if}} - {{if $item.thread_author_menu}} - <div class="dropdown-divider"></div> - {{foreach $item.thread_author_menu as $mitem}} - <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} >{{$mitem.title}}</a></li> - {{/foreach}} - {{/if}} + <div class="float-right wall-item-tools-right"> + <div class="btn-group"> + <div id="like-rotator-{{$item.id}}" class="spinner-wrapper"> + <div class="spinner s"></div> + </div> </div> + <div class="btn-group"> + <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-cog"></i> + </button> + <div class="dropdown-menu dropdown-menu-right"> + {{if $item.star}} + <a class="dropdown-item" href="#" onclick="dostar({{$item.id}}); return false;"><i id="starred-{{$item.id}}" class="fa fa-fw{{if $item.star.isstarred}} starred fa-star{{else}} unstarred fa-star-o{{/if}} generic-icons-nav" title="{{$item.star.toggle}}"></i>{{$item.star.toggle}}</a> + {{/if}} + {{if $item.thread_action_menu}} + {{foreach $item.thread_action_menu as $mitem}} + <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} ><i class="fa fa-fw fa-{{$mitem.icon}} generic-icons-nav"></i>{{$mitem.title}}</a></li> + {{/foreach}} + {{/if}} + {{if $item.drop.dropping}} + <a class="dropdown-item" href="item/drop/{{$item.id}}" onclick="return confirmDelete();" title="{{$item.drop.delete}}" ><i class="fa fa-fw fa-trash-o generic-icons-nav"></i>{{$item.drop.delete}}</a></li> + {{/if}} + </div> + </div> + </div> + {{if $item.star && $item.star.isstarred}} + <div class="btn-group" id="star-button-{{$item.id}}"> + <button type="button" class="btn btn-outline-secondary btn-sm wall-item-like" onclick="dostar({{$item.id}});"><i class="fa fa-star"></i></button> </div> + {{/if}} {{if $item.attachments}} <div class="wall-item-tools-left btn-group"> <button type="button" class="btn btn-outline-secondary btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="attachment-menu-{{$item.id}}"><i class="fa fa-paperclip"></i></button> <div class="dropdown-menu">{{$item.attachments}}</div> </div> {{/if}} - {{if $item.mode === 'moderate'}} - <div class="wall-item-tools-left btn-group"> + <div class="wall-item-tools-left btn-group" id="wall-item-tools-left-{{$item.id}}"> + {{if $item.mode === 'moderate'}} <a href="moderate/{{$item.id}}/approve" class="btn btn-success btn-sm">{{$item.approve}}</a> <a href="moderate/{{$item.id}}/drop" class="btn btn-danger btn-sm">{{$item.delete}}</a> - + {{/if}} </div> - - - {{/if}} </div> </div> {{if $item.conv}} diff --git a/view/tpl/select_timezone.tpl b/view/tpl/select_timezone.tpl deleted file mode 100644 index 2820a54f4..000000000 --- a/view/tpl/select_timezone.tpl +++ /dev/null @@ -1,11 +0,0 @@ -{{* TODO: Make id configurabel *}} -<select id='timezone_select' name='timezone'> -{{foreach $continents as $continent => $cities}} -<optgroup label="{{$continent}}"> -{{foreach $cities as $city => $value}} -<option value='{{$value}}' {{if $value == $selected}}selected='selected'{{/if}}>{{$city}}</option> -{{/foreach}} -</optgroup> -{{/foreach}} -</select> - diff --git a/view/tpl/settings.tpl b/view/tpl/settings.tpl index d258f1992..3a05ea828 100755 --- a/view/tpl/settings.tpl +++ b/view/tpl/settings.tpl @@ -45,6 +45,7 @@ <div id="privacy-settings-collapse" class="collapse" role="tabpanel" aria-labelledby="privacy-settings" data-parent="#settings"> <div class="section-content-tools-wrapper"> {{include file="field_select_grouped.tpl" field=$role}} + {{$autoperms}} <div id="advanced-perm" style="display:{{if $permissions_set}}none{{else}}block{{/if}};"> <div class="form-group"> <button type="button" class="btn btn-outline-secondary" data-toggle="modal" data-target="#apsModal">{{$lbl_p2macro}}</button> @@ -146,6 +147,7 @@ {{include file="field_intcheckbox.tpl" field=$vnotify13}} {{/if}} {{include file="field_intcheckbox.tpl" field=$vnotify14}} + {{include file="field_intcheckbox.tpl" field=$vnotify15}} {{include file="field_intcheckbox.tpl" field=$always_show_in_notices}} {{include file="field_input.tpl" field=$evdays}} </div> diff --git a/view/tpl/settings_connectors.tpl b/view/tpl/settings_connectors.tpl deleted file mode 100755 index 8bea9ca63..000000000 --- a/view/tpl/settings_connectors.tpl +++ /dev/null @@ -1,10 +0,0 @@ -<div class="generic-content-wrapper-styled"> -<h1>{{$title}}</h1> - -<form action="settings/connectors" method="post" autocomplete="off"> -<input type='hidden' name='form_security_token' value='{{$form_security_token}}'> - -{{$settings_connectors}} - -</form> -</div> diff --git a/view/tpl/siteinfo.tpl b/view/tpl/siteinfo.tpl index a5b99fd83..4d9c53656 100755 --- a/view/tpl/siteinfo.tpl +++ b/view/tpl/siteinfo.tpl @@ -38,4 +38,8 @@ <br><br> <div>{{$prj_transport}} ({{$transport_link}})</div> +{{if $additional_fed}} +<div>{{$additional_text}} {{$additional_fed}}</div> +{{/if}} + </div> diff --git a/view/tpl/sources_edit.tpl b/view/tpl/sources_edit.tpl index 61f6e8cb0..094440ee7 100644 --- a/view/tpl/sources_edit.tpl +++ b/view/tpl/sources_edit.tpl @@ -8,6 +8,7 @@ <input type="hidden" id="id_abook" name="abook" value="{{$abook}}" /> {{include file="field_input.tpl" field=$name}} {{include file="field_input.tpl" field=$tags}} +{{include file="field_checkbox.tpl" field=$resend}} {{include file="field_textarea.tpl" field=$words}} <div class="sources-submit-wrapper" > diff --git a/view/tpl/sources_new.tpl b/view/tpl/sources_new.tpl index bbc22df84..7cda9998d 100644 --- a/view/tpl/sources_new.tpl +++ b/view/tpl/sources_new.tpl @@ -7,6 +7,7 @@ <input type="hidden" id="id_abook" name="abook" value="{{$abook}}" /> {{include file="field_input.tpl" field=$name}} {{include file="field_input.tpl" field=$tags}} +{{include file="field_checkbox.tpl" field=$resend}} {{include file="field_textarea.tpl" field=$words}} <div class="sources-submit-wrapper" > diff --git a/view/tpl/toggle_mobile_footer.tpl b/view/tpl/toggle_mobile_footer.tpl deleted file mode 100755 index 82c0197ba..000000000 --- a/view/tpl/toggle_mobile_footer.tpl +++ /dev/null @@ -1,2 +0,0 @@ -<a id="toggle_mobile_link" href="{{$toggle_link}}">{{$toggle_text}}</a> - diff --git a/view/tpl/usermenu.tpl b/view/tpl/usermenu.tpl index c51728c34..8bbfedd07 100644 --- a/view/tpl/usermenu.tpl +++ b/view/tpl/usermenu.tpl @@ -2,7 +2,7 @@ <div id="pmenu-{{$id}}" class="pmenu{{if !$class}} widget{{else}} {{$class}}{{/if}}"> {{/if}} {{if $menu.menu_desc}} - <h3 class="pmenu-title">{{$menu.menu_desc}}{{if $edit}} <a href="mitem/{{$menu.menu_id}}" title="{{$edit}}"><i class="fa fa-pencil fakelink" title="{{$edit}}"></i></a>{{/if}}</h3> + <h3 class="pmenu-title">{{$menu.menu_desc}}{{if $edit}} <a href="mitem/{{$nick}}/{{$menu.menu_id}}" title="{{$edit}}"><i class="fa fa-pencil fakelink" title="{{$edit}}"></i></a>{{/if}}</h3> {{/if}} {{if $items}} <ul class="pmenu-body{{if $wrap || !$class}} nav nav-pills flex-column{{elseif !$wrap || $class}} {{$class}}{{/if}}"> diff --git a/view/tpl/write_pages.tpl b/view/tpl/write_pages.tpl deleted file mode 100644 index 53146ee30..000000000 --- a/view/tpl/write_pages.tpl +++ /dev/null @@ -1,3 +0,0 @@ -<div id="write-pages" class="bigwidget"> -<span id="wp-new"><a href="{{$newurl}}">{{$new}}</a></span> <span id="wp-edit"><a href="{{$editurl}}">{{$edit}}</a></span> -</div> |