diff --git a/phpBB/docs/CHANGELOG.html b/phpBB/docs/CHANGELOG.html
index 618dd9d883..dcdebe91ef 100644
--- a/phpBB/docs/CHANGELOG.html
+++ b/phpBB/docs/CHANGELOG.html
@@ -98,9 +98,13 @@
[Fix] Tell users to recreate the search index after changing the common word threshold for fulltext_native (Bug #36345)
[Fix] Adjusted phpbb_chmod() to always set permissions for group bit.
[Fix] Do not increment users post count after post approval if post had been posted in a forum with no post count increasing set (Bug #37865)
+ [Fix] Extend vertical line for last post column if no posts in forum (Bug #37125)
[Change] Alllow applications to set custom module inclusion path (idea by HoL)
[Change] Handle checking for duplicate usernames in chunks (Bug #17285 - Patch by A_Jelly_Doughnut)
[Change] Better handling and finer control for custom profile fields visibility options. (Patch by Highway of Life)
+ [Change] Performance increase for format_date() (Bug #37575 - Patch by BartVB)
+ [Change] Changed prosilver date separator from 'on' to '»'
+ [Feature] Added 'AGO' setting to relative date strings. For example: posted 14 minutes ago. (Patch by BartVB)
1.ii. Changes since 3.0.2
diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php
index 2e697f6359..c1741de0fd 100644
--- a/phpBB/includes/session.php
+++ b/phpBB/includes/session.php
@@ -1851,22 +1851,36 @@ class user extends session
$args = func_get_args();
$key = $args[0];
+ if (is_array($key))
+ {
+ $lang = &$this->lang[array_shift($key)];
+
+ foreach ($key as $_key)
+ {
+ $lang = &$lang[$_key];
+ }
+ }
+ else
+ {
+ $lang = &$this->lang[$key];
+ }
+
// Return if language string does not exist
- if (!isset($this->lang[$key]) || (!is_string($this->lang[$key]) && !is_array($this->lang[$key])))
+ if (!isset($lang) || (!is_string($lang) && !is_array($lang)))
{
return $key;
}
// If the language entry is a string, we simply mimic sprintf() behaviour
- if (is_string($this->lang[$key]))
+ if (is_string($lang))
{
if (sizeof($args) == 1)
{
- return $this->lang[$key];
+ return $lang;
}
// Replace key with language entry and simply pass along...
- $args[0] = $this->lang[$key];
+ $args[0] = $lang;
return call_user_func_array('sprintf', $args);
}
@@ -1878,7 +1892,7 @@ class user extends session
{
if (is_int($args[$i]))
{
- $numbers = array_keys($this->lang[$key]);
+ $numbers = array_keys($lang);
foreach ($numbers as $num)
{
@@ -1895,12 +1909,12 @@ class user extends session
// Ok, let's check if the key was found, else use the last entry (because it is mostly the plural form)
if ($key_found === false)
{
- $numbers = array_keys($this->lang[$key]);
+ $numbers = array_keys($lang);
$key_found = end($numbers);
}
// Use the language string we determined and pass it to sprintf()
- $args[0] = $this->lang[$key][$key_found];
+ $args[0] = $lang[$key_found];
return call_user_func_array('sprintf', $args);
}
@@ -2001,50 +2015,75 @@ class user extends session
/**
* Format user date
+ *
+ * @param int $gmepoch unix timestamp
+ * @param string $format date format in date() notation. | used to indicate relative dates, for example |d m Y|, h:i is translated to Today, h:i.
+ * @param bool $forcedate force non-relative date format.
+ *
+ * @return mixed translated date
*/
function format_date($gmepoch, $format = false, $forcedate = false)
{
static $midnight;
+ static $date_cache;
- $lang_dates = $this->lang['datetime'];
$format = (!$format) ? $this->date_format : $format;
+ $delta = time() - $gmepoch;
- // Short representation of month in format
- if ((strpos($format, '\M') === false && strpos($format, 'M') !== false) || (strpos($format, '\r') === false && strpos($format, 'r') !== false))
+ if (!isset($date_cache[$format]))
{
- $lang_dates['May'] = $lang_dates['May_short'];
+ // Is the user requesting a friendly date format (i.e. 'Today 12:42')?
+ $date_cache[$format] = array(
+ 'is_short' => strpos($format, '|'),
+ 'zone_offset' => $this->timezone + $this->dst,
+ 'format_short' => substr($format, 0, strpos($format, '|')) . '||' . substr(strrchr($format, '|'), 1),
+ 'format_long' => str_replace('|', '', $format),
+ 'lang' => $this->lang['datetime'],
+ );
+
+ // Short representation of month in format? Some languages use different terms for the long and short format of May
+ if ((strpos($format, '\M') === false && strpos($format, 'M') !== false) || (strpos($format, '\r') === false && strpos($format, 'r') !== false))
+ {
+ $date_cache[$format]['lang']['May'] = $this->lang['datetime']['May_short'];
+ }
}
- unset($lang_dates['May_short']);
+ // Show date < 1 hour ago as 'xx min ago'
+ if ($delta <= 3600 && $delta && $date_cache[$format]['is_short'] !== false && !$forcedate && isset($this->lang['datetime']['AGO']))
+ {
+ return $this->lang(array('datetime', 'AGO'), (int) floor($delta / 60));
+ }
if (!$midnight)
{
- list($d, $m, $y) = explode(' ', gmdate('j n Y', time() + $this->timezone + $this->dst));
- $midnight = gmmktime(0, 0, 0, $m, $d, $y) - $this->timezone - $this->dst;
+ list($d, $m, $y) = explode(' ', gmdate('j n Y', time() + $date_cache[$format]['zone_offset']));
+ $midnight = gmmktime(0, 0, 0, $m, $d, $y) - $date_cache[$format]['zone_offset'];
}
- if (strpos($format, '|') === false || ($gmepoch < $midnight - 86400 && !$forcedate) || ($gmepoch > $midnight + 172800 && !$forcedate))
+ if ($date_cache[$format]['is_short'] !== false && !$forcedate)
{
- return strtr(@gmdate(str_replace('|', '', $format), $gmepoch + $this->timezone + $this->dst), $lang_dates);
+ $day = false;
+
+ if ($gmepoch > $midnight + 86400)
+ {
+ $day = 'TOMORROW';
+ }
+ else if ($gmepoch > $midnight)
+ {
+ $day = 'TODAY';
+ }
+ else if ($gmepoch > $midnight - 86400)
+ {
+ $day = 'YESTERDAY';
+ }
+
+ if ($day !== false)
+ {
+ return str_replace('||', $this->lang['datetime'][$day], strtr(@gmdate($date_cache[$format]['format_short'], $gmepoch + $date_cache[$format]['zone_offset']), $date_cache[$format]['lang']));
+ }
}
- if ($gmepoch > $midnight + 86400 && !$forcedate)
- {
- $format = substr($format, 0, strpos($format, '|')) . '||' . substr(strrchr($format, '|'), 1);
- return str_replace('||', $this->lang['datetime']['TOMORROW'], strtr(@gmdate($format, $gmepoch + $this->timezone + $this->dst), $lang_dates));
- }
- else if ($gmepoch > $midnight && !$forcedate)
- {
- $format = substr($format, 0, strpos($format, '|')) . '||' . substr(strrchr($format, '|'), 1);
- return str_replace('||', $this->lang['datetime']['TODAY'], strtr(@gmdate($format, $gmepoch + $this->timezone + $this->dst), $lang_dates));
- }
- else if ($gmepoch > $midnight - 86400 && !$forcedate)
- {
- $format = substr($format, 0, strpos($format, '|')) . '||' . substr(strrchr($format, '|'), 1);
- return str_replace('||', $this->lang['datetime']['YESTERDAY'], strtr(@gmdate($format, $gmepoch + $this->timezone + $this->dst), $lang_dates));
- }
-
- return strtr(@gmdate(str_replace('|', '', $format), $gmepoch + $this->timezone + $this->dst), $lang_dates);
+ return strtr(@gmdate($date_cache[$format]['format_long'], $gmepoch + $date_cache[$format]['zone_offset']), $date_cache[$format]['lang']);
}
/**
diff --git a/phpBB/includes/ucp/ucp_main.php b/phpBB/includes/ucp/ucp_main.php
index 73e4af8b04..6f4e525b2f 100644
--- a/phpBB/includes/ucp/ucp_main.php
+++ b/phpBB/includes/ucp/ucp_main.php
@@ -25,7 +25,7 @@ class ucp_main
{
var $p_master;
var $u_action;
-
+
function ucp_main(&$p_master)
{
$this->p_master = &$p_master;
@@ -70,7 +70,7 @@ class ucp_main
$sql = 'SELECT forum_id
FROM ' . FORUMS_TABLE . '
WHERE forum_type = ' . FORUM_POST;
-
+
if (sizeof($forum_ary))
{
$sql .= ' AND ' . $db->sql_in_set('forum_id', $forum_ary, true);
@@ -258,7 +258,7 @@ class ucp_main
{
$forbidden_forums = $auth->acl_getf('!f_read', true);
$forbidden_forums = array_unique(array_keys($forbidden_forums));
-
+
$sql_array = array(
'SELECT' => 'f.*',
@@ -339,6 +339,7 @@ class ucp_main
'FORUM_IMAGE' => ($row['forum_image']) ? '
' : '',
'FORUM_IMAGE_SRC' => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '',
'FORUM_NAME' => $row['forum_name'],
+ 'FORUM_DESC' => generate_text_for_display($row['forum_desc'], $row['forum_desc_uid'], $row['forum_desc_bitfield'], $row['forum_desc_options']),
'LAST_POST_SUBJECT' => $row['forum_last_post_subject'],
'LAST_POST_TIME' => $last_post_time,
@@ -420,7 +421,7 @@ class ucp_main
}
$forbidden_forums = $auth->acl_getf('!f_read', true);
$forbidden_forums = array_unique(array_keys($forbidden_forums));
-
+
$this->assign_topiclist('bookmarks', $forbidden_forums);
break;
@@ -676,7 +677,7 @@ class ucp_main
'WHERE' => 'tw.user_id = ' . $user->data['user_id'] . '
AND t.topic_id = tw.topic_id
AND ' . $db->sql_in_set('t.forum_id', $forbidden_forum_ary, true, true),
-
+
'ORDER_BY' => 't.topic_last_post_time DESC'
);
diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php
index 93ad31e127..fab72b1780 100644
--- a/phpBB/language/en/common.php
+++ b/phpBB/language/en/common.php
@@ -697,6 +697,12 @@ $lang = array_merge($lang, array(
'TODAY' => 'Today',
'TOMORROW' => 'Tomorrow',
'YESTERDAY' => 'Yesterday',
+ 'AGO' => array(
+ 0 => '%d minutes ago',
+ 1 => '%d minute ago',
+ 2 => '%d minutes ago',
+ 60 => '1 hour ago',
+ ),
'Sunday' => 'Sunday',
'Monday' => 'Monday',
diff --git a/phpBB/styles/prosilver/template/forumlist_body.html b/phpBB/styles/prosilver/template/forumlist_body.html
index 8ed80883e9..f19f3c3075 100644
--- a/phpBB/styles/prosilver/template/forumlist_body.html
+++ b/phpBB/styles/prosilver/template/forumlist_body.html
@@ -42,7 +42,7 @@
{forumrow.POSTS} {L_POSTS}
{L_LAST_POST} {L_POST_BY_AUTHOR} {forumrow.LAST_POSTER_FULL}
- {LAST_POST_IMG}
{L_POSTED_ON_DATE} {forumrow.LAST_POST_TIME}{L_NO_POSTS}
+ {LAST_POST_IMG}
{forumrow.LAST_POST_TIME}{L_NO_POSTS}
diff --git a/phpBB/styles/prosilver/template/mcp_forum.html b/phpBB/styles/prosilver/template/mcp_forum.html
index abca202c73..05e4e2c8a2 100644
--- a/phpBB/styles/prosilver/template/mcp_forum.html
+++ b/phpBB/styles/prosilver/template/mcp_forum.html
@@ -36,16 +36,16 @@
- style="background-image: url({T_ICONS_PATH}{topicrow.TOPIC_ICON_IMG}); background-repeat: no-repeat;">
- [ {L_SELECT_MERGE} ]
+ [ {L_SELECT_MERGE} ]
{topicrow.TOPIC_TITLE}
{topicrow.UNAPPROVED_IMG}
{REPORTED_IMG}
[ {L_DELETE_SHADOW_TOPIC} ]
- {topicrow.ATTACH_ICON_IMG} {L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} {L_POSTED_ON_DATE} {topicrow.FIRST_POST_TIME}
+ {topicrow.ATTACH_ICON_IMG} {L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} » {topicrow.FIRST_POST_TIME}
- {topicrow.REPLIES} {L_REPLIES}
- - {L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} {L_POSTED_ON_DATE}
{topicrow.LAST_POST_TIME}
+ - {L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL}
{topicrow.LAST_POST_TIME}
-
@@ -64,9 +64,9 @@
diff --git a/phpBB/styles/prosilver/template/mcp_front.html b/phpBB/styles/prosilver/template/mcp_front.html
index 484179e2ac..5dd1d9a823 100644
--- a/phpBB/styles/prosilver/template/mcp_front.html
+++ b/phpBB/styles/prosilver/template/mcp_front.html
@@ -29,7 +29,7 @@
-
{unapproved.SUBJECT} {unapproved.ATTACH_ICON_IMG}
- {L_POSTED} {L_POST_BY_AUTHOR} {unapproved.AUTHOR_FULL} {L_POSTED_ON_DATE} {unapproved.POST_TIME}
+ {L_POSTED} {L_POST_BY_AUTHOR} {unapproved.AUTHOR_FULL} » {unapproved.POST_TIME}
-
{L_TOPIC}: {unapproved.TOPIC_TITLE} [{L_MODERATE}]
@@ -82,7 +82,7 @@
-
{report.SUBJECT} {report.ATTACH_ICON_IMG}
- {L_POSTED} {L_POST_BY_AUTHOR} {report.AUTHOR_FULL} {L_POSTED_ON_DATE} {report.POST_TIME}
+ {L_POSTED} {L_POST_BY_AUTHOR} {report.AUTHOR_FULL} » {report.POST_TIME}
-
{L_REPORTED} {L_POST_BY_AUTHOR} {report.REPORTER_FULL} {L_REPORTED_ON_DATE} {report.REPORT_TIME}
@@ -103,7 +103,7 @@
-
+
{L_LATEST_LOGS}
diff --git a/phpBB/styles/prosilver/template/mcp_post.html b/phpBB/styles/prosilver/template/mcp_post.html
index c8b2ffc56d..0e23148175 100644
--- a/phpBB/styles/prosilver/template/mcp_post.html
+++ b/phpBB/styles/prosilver/template/mcp_post.html
@@ -51,13 +51,13 @@
- {MINI_POST_IMG} {L_POSTED} {L_POST_BY_AUTHOR} {POST_AUTHOR_FULL} {L_POSTED_ON_DATE} {POST_DATE}
+ {MINI_POST_IMG} {L_POSTED} {L_POST_BY_AUTHOR} {POST_AUTHOR_FULL} » {POST_DATE}
-
+