From 937e7619a338f0fcf92f86512e48d84a12aa02c5 Mon Sep 17 00:00:00 2001 From: Alexander Ebert Date: Sun, 24 Jan 2016 13:26:25 +0100 Subject: [PATCH] `time`-modifier now behaves as its JS counterpart --- .../templates/headIncludeJavaScript.tpl | 8 +-- .../install/files/acp/templates/header.tpl | 8 +-- .../TimeModifierTemplatePlugin.class.php | 62 ++++++++++++++++++- wcfsetup/install/lang/de.xml | 15 +++-- wcfsetup/install/lang/en.xml | 9 ++- 5 files changed, 87 insertions(+), 15 deletions(-) diff --git a/com.woltlab.wcf/templates/headIncludeJavaScript.tpl b/com.woltlab.wcf/templates/headIncludeJavaScript.tpl index 082ef72e7f..e414fd2b45 100644 --- a/com.woltlab.wcf/templates/headIncludeJavaScript.tpl +++ b/com.woltlab.wcf/templates/headIncludeJavaScript.tpl @@ -28,10 +28,10 @@ requirejs.config({ '__months': [ '{lang}wcf.date.month.january{/lang}', '{lang}wcf.date.month.february{/lang}', '{lang}wcf.date.month.march{/lang}', '{lang}wcf.date.month.april{/lang}', '{lang}wcf.date.month.may{/lang}', '{lang}wcf.date.month.june{/lang}', '{lang}wcf.date.month.july{/lang}', '{lang}wcf.date.month.august{/lang}', '{lang}wcf.date.month.september{/lang}', '{lang}wcf.date.month.october{/lang}', '{lang}wcf.date.month.november{/lang}', '{lang}wcf.date.month.december{/lang}' ], '__monthsShort': [ '{lang}wcf.date.month.short.jan{/lang}', '{lang}wcf.date.month.short.feb{/lang}', '{lang}wcf.date.month.short.mar{/lang}', '{lang}wcf.date.month.short.apr{/lang}', '{lang}wcf.date.month.short.may{/lang}', '{lang}wcf.date.month.short.jun{/lang}', '{lang}wcf.date.month.short.jul{/lang}', '{lang}wcf.date.month.short.aug{/lang}', '{lang}wcf.date.month.short.sep{/lang}', '{lang}wcf.date.month.short.oct{/lang}', '{lang}wcf.date.month.short.nov{/lang}', '{lang}wcf.date.month.short.dec{/lang}' ], 'wcf.clipboard.item.unmarkAll': '{lang}wcf.clipboard.item.unmarkAll{/lang}', - 'wcf.date.relative.now': '{lang}wcf.date.relative.now{/lang}', - 'wcf.date.relative.minutes': '{capture assign=relativeMinutes}{lang}wcf.date.relative.minutes{/lang}{/capture}{@$relativeMinutes|encodeJS}', - 'wcf.date.relative.hours': '{capture assign=relativeHours}{lang}wcf.date.relative.hours{/lang}{/capture}{@$relativeHours|encodeJS}', - 'wcf.date.relative.pastDays': '{capture assign=relativePastDays}{lang}wcf.date.relative.pastDays{/lang}{/capture}{@$relativePastDays|encodeJS}', + 'wcf.date.relative.now': '{lang}wcf.date.relative.nowJS{/lang}', + 'wcf.date.relative.minutes': '{capture assign=relativeMinutes}{lang}wcf.date.relative.minutesJS{/lang}{/capture}{@$relativeMinutes|encodeJS}', + 'wcf.date.relative.hours': '{capture assign=relativeHours}{lang}wcf.date.relative.hoursJS{/lang}{/capture}{@$relativeHours|encodeJS}', + 'wcf.date.relative.pastDays': '{capture assign=relativePastDays}{lang}wcf.date.relative.pastDaysJS{/lang}{/capture}{@$relativePastDays|encodeJS}', 'wcf.date.dateFormat': '{lang}wcf.date.dateFormat{/lang}', 'wcf.date.dateTimeFormat': '{lang}wcf.date.dateTimeFormat{/lang}', 'wcf.date.shortDateTimeFormat': '{lang}wcf.date.shortDateTimeFormat{/lang}', diff --git a/wcfsetup/install/files/acp/templates/header.tpl b/wcfsetup/install/files/acp/templates/header.tpl index d130cd8a42..e64c7f108e 100644 --- a/wcfsetup/install/files/acp/templates/header.tpl +++ b/wcfsetup/install/files/acp/templates/header.tpl @@ -43,10 +43,10 @@ '__monthsShort': [ '{lang}wcf.date.month.short.jan{/lang}', '{lang}wcf.date.month.short.feb{/lang}', '{lang}wcf.date.month.short.mar{/lang}', '{lang}wcf.date.month.short.apr{/lang}', '{lang}wcf.date.month.short.may{/lang}', '{lang}wcf.date.month.short.jun{/lang}', '{lang}wcf.date.month.short.jul{/lang}', '{lang}wcf.date.month.short.aug{/lang}', '{lang}wcf.date.month.short.sep{/lang}', '{lang}wcf.date.month.short.oct{/lang}', '{lang}wcf.date.month.short.nov{/lang}', '{lang}wcf.date.month.short.dec{/lang}' ], 'wcf.acp.search.noResults': '{lang}wcf.acp.search.noResults{/lang}', 'wcf.clipboard.item.unmarkAll': '{lang}wcf.clipboard.item.unmarkAll{/lang}', - 'wcf.date.relative.now': '{lang}wcf.date.relative.now{/lang}', - 'wcf.date.relative.minutes': '{capture assign=relativeMinutes}{lang}wcf.date.relative.minutes{/lang}{/capture}{@$relativeMinutes|encodeJS}', - 'wcf.date.relative.hours': '{capture assign=relativeHours}{lang}wcf.date.relative.hours{/lang}{/capture}{@$relativeHours|encodeJS}', - 'wcf.date.relative.pastDays': '{capture assign=relativePastDays}{lang}wcf.date.relative.pastDays{/lang}{/capture}{@$relativePastDays|encodeJS}', + 'wcf.date.relative.now': '{lang}wcf.date.relative.nowJS{/lang}', + 'wcf.date.relative.minutes': '{capture assign=relativeMinutes}{lang}wcf.date.relative.minutesJS{/lang}{/capture}{@$relativeMinutes|encodeJS}', + 'wcf.date.relative.hours': '{capture assign=relativeHours}{lang}wcf.date.relative.hoursJS{/lang}{/capture}{@$relativeHours|encodeJS}', + 'wcf.date.relative.pastDays': '{capture assign=relativePastDays}{lang}wcf.date.relative.pastDaysJS{/lang}{/capture}{@$relativePastDays|encodeJS}', 'wcf.date.dateFormat': '{lang}wcf.date.dateFormat{/lang}', 'wcf.date.dateTimeFormat': '{lang}wcf.date.dateTimeFormat{/lang}', 'wcf.date.shortDateTimeFormat': '{lang}wcf.date.shortDateTimeFormat{/lang}', diff --git a/wcfsetup/install/files/lib/system/template/plugin/TimeModifierTemplatePlugin.class.php b/wcfsetup/install/files/lib/system/template/plugin/TimeModifierTemplatePlugin.class.php index 8bbaf4c61f..1c7c478ee2 100644 --- a/wcfsetup/install/files/lib/system/template/plugin/TimeModifierTemplatePlugin.class.php +++ b/wcfsetup/install/files/lib/system/template/plugin/TimeModifierTemplatePlugin.class.php @@ -28,8 +28,66 @@ class TimeModifierTemplatePlugin implements IModifierTemplatePlugin { $dateTimeObject = DateUtil::getDateTimeByTimestamp($timestamp); $date = DateUtil::format($dateTimeObject, DateUtil::DATE_FORMAT); $time = DateUtil::format($dateTimeObject, DateUtil::TIME_FORMAT); - $dateTime = str_replace('%time%', $time, str_replace('%date%', $date, WCF::getLanguage()->get('wcf.date.dateTimeFormat'))); + $isFutureDate = ($timestamp > TIME_NOW); + $dateTime = $this->getRelativeTime($dateTimeObject, $timestamp, $date, $time, $isFutureDate); - return ''; + return ''; + } + + /** + * Returns the relative date time identical to the relative time generated + * through JavaScript. + * + * @param \DateTime $dateTimeObject target date object + * @param integer $timestamp target timestamp + * @param string $date localized date + * @param string $time localized time + * @param boolean $isFutureDate true if timestamp is in the future + * @return string relative time + */ + protected function getRelativeTime(\DateTime $dateTimeObject, $timestamp, $date, $time, $isFutureDate) { + if ($isFutureDate) { + return str_replace('%time%', $time, str_replace('%date%', $date, WCF::getLanguage()->get('wcf.date.dateTimeFormat'))); + } + + // timestamp is less than 60 seconds ago + if ($timestamp >= TIME_NOW || TIME_NOW < ($timestamp + 60)) { + return WCF::getLanguage()->get('wcf.date.relative.now'); + } + // timestamp is less than 60 minutes ago (display 1 hour ago rather than 60 minutes ago) + else if (TIME_NOW < ($timestamp + 3540)) { + $minutes = max(round((TIME_NOW - $timestamp) / 60), 1); + + return WCF::getLanguage()->getDynamicVariable('wcf.date.relative.minutes', ['minutes' => $minutes]); + } + // timestamp is less than 24 hours ago + else if (TIME_NOW < ($timestamp + 86400)) { + $hours = round((TIME_NOW - $timestamp) / 3600); + + return WCF::getLanguage()->getDynamicVariable('wcf.date.relative.hours', ['hours' => $hours]); + } + // timestamp is less than 6 days ago + else if (TIME_NOW < ($timestamp + 518400)) { + $dtoNoTime = clone $dateTimeObject; + $dtoNoTime->setTime(0, 0, 0); + $currentDateTimeObject = DateUtil::getDateTimeByTimestamp(TIME_NOW); + $currentDateTimeObject->setTime(0, 0, 0); + + $days = $dtoNoTime->diff($currentDateTimeObject)->days; + $day = DateUtil::format($dateTimeObject, 'l'); + + return WCF::getLanguage()->getDynamicVariable('wcf.date.relative.pastDays', [ + 'days' => $days, + 'day' => $day, + 'time' => $time + ]); + } + + // timestamp is between ~700 million years BC and last week + $datetime = WCF::getLanguage()->get('wcf.date.shortDateTimeFormat'); + $datetime = str_replace('%date%', $date, $datetime); + $datetime = str_replace('%time%', $time, $datetime); + + return $datetime; } } diff --git a/wcfsetup/install/lang/de.xml b/wcfsetup/install/lang/de.xml index cf98c85612..0da212645d 100644 --- a/wcfsetup/install/lang/de.xml +++ b/wcfsetup/install/lang/de.xml @@ -2017,11 +2017,18 @@ Fehler sind beispielsweise: - + - 1}{#$minutes} Minuten{else}einer Minute{/if}{/literal}]]> - 1}{#$hours} Stunden{else}einer Stunde{/if}{/literal}]]> - 1}{$day}{else}Gestern{/if}, {$time}{/literal}]]> + 1}{#$minutes} Minuten{else}einer Minute{/if}]]> + 1}{#$hours} Stunden{else}einer Stunde{/if}]]> + 1}{$day}{else}Gestern{/if}, {$time}]]> + + + + + 1}{#$minutes} Minuten{else}einer Minute{/if}{/literal}]]> + 1}{#$hours} Stunden{else}einer Stunde{/if}{/literal}]]> + 1}{$day}{else}Gestern{/if}, {$time}{/literal}]]> diff --git a/wcfsetup/install/lang/en.xml b/wcfsetup/install/lang/en.xml index cdb32b1bae..b55633f52c 100644 --- a/wcfsetup/install/lang/en.xml +++ b/wcfsetup/install/lang/en.xml @@ -2020,7 +2020,14 @@ Errors are: - + + + 1}{#$minutes} minutes{else}A minute{/if} ago]]> + 1}{#$hours} hours{else}An hour{/if} ago]]> + 1}{$day}{else}Yesterday{/if}, {$time}]]> + + + 1}{#$minutes} minutes{else}A minute{/if} ago{/literal}]]> 1}{#$hours} hours{else}An hour{/if} ago{/literal}]]> -- 2.20.1