Index: openacs-4/packages/xowiki/catalog/xowiki.de_DE.ISO-8859-1.xml
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/catalog/xowiki.de_DE.ISO-8859-1.xml,v
diff -u -r1.33 -r1.34
--- openacs-4/packages/xowiki/catalog/xowiki.de_DE.ISO-8859-1.xml 13 Nov 2008 14:48:32 -0000 1.33
+++ openacs-4/packages/xowiki/catalog/xowiki.de_DE.ISO-8859-1.xml 6 Jan 2009 01:10:58 -0000 1.34
@@ -4,11 +4,15 @@
Zusammenfassung
Verwalten
Verwaltungsoptionen f�r dieses Paket ...
+ vor %time%
Zur�ck
Kategorien
Inhalt
+ Kopiere Eintrag
Neuen Eintrag vom Typ %type% erstellen
Erzeuge diese Seite in der folgenden Sprache:
+ Tag
+ Tage
L�schen
L�sche diese Seite ...
N�here Information
@@ -18,20 +22,28 @@
Eintr�ge f�r das Formular %form%:
Dieses Formular wird noch von %count% Eintr�gen verwendet. Bitte verwenden Sie diese, bevor Sie das Formular l�schen.
Termin
+ Endzeit
Vortragsende
um
Ort
+ Beginnzeit
Vortragsbeginn
Vortragstitel
Formular
Einschr�nkungen
Eintr�ge f�r dieses Formular
Formular ausf�llen
+ Stunde
+ Stunden
Besucher
Besuche
Index
Zur Startseite
Zuletzt besuchte Seiten
+ Minute
+ Minuten
+ Monat
+ Monate
H�ufigsten Besucher
H�ufigst besuchten Seiten
Neuer Eintrag
@@ -70,11 +82,15 @@
RSS-Klient
Suche
Suche in diesem Wiki...
+ Sekunde
+ Sekunden
Titel
Titel
Ungelesene Seiten
Ansehen
mehr...
+ Woche
+ Wochen
Pers�nliche Schlagworte
Index: openacs-4/packages/xowiki/catalog/xowiki.en_US.ISO-8859-1.xml
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/catalog/xowiki.en_US.ISO-8859-1.xml,v
diff -u -r1.51 -r1.52
--- openacs-4/packages/xowiki/catalog/xowiki.en_US.ISO-8859-1.xml 30 Dec 2008 16:24:12 -0000 1.51
+++ openacs-4/packages/xowiki/catalog/xowiki.en_US.ISO-8859-1.xml 6 Jan 2009 01:10:58 -0000 1.52
@@ -4,13 +4,16 @@
Abstract
Admin
Administer this package ...
+ %time% ago
Back
Categories
%errorMsg%
Content
Copy Entry
Create new entry of type %type%
Create this page in a different language
+ day
+ days
Delete
Delete this page ...
Details
@@ -62,11 +65,17 @@
Cut&Paste URL of YouTube video (http://www.youtube.com/....)
Assignee
State
+ hour
+ hours
Visitors
Visits
Index
Go to the start page of this package ...
Last Visited Pages
+ minute
+ minutes
+ month
+ months
Most Frequent Visitors
Most Popular Pages
New Page
@@ -119,6 +128,8 @@
RSS Client
Search
Search pages of this package ...
+ second
+ seconds
To create a click, click on a page name
Title
Title
@@ -128,6 +139,8 @@
View page in original context %context%
View this page ...
more...
+ week
+ weeks
%errorMsg%
Your Tags
Index: openacs-4/packages/xowiki/catalog/xowiki.es_ES.ISO-8859-1.xml
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/catalog/xowiki.es_ES.ISO-8859-1.xml,v
diff -u -r1.11 -r1.12
--- openacs-4/packages/xowiki/catalog/xowiki.es_ES.ISO-8859-1.xml 13 Nov 2008 14:48:32 -0000 1.11
+++ openacs-4/packages/xowiki/catalog/xowiki.es_ES.ISO-8859-1.xml 6 Jan 2009 01:10:59 -0000 1.12
@@ -4,8 +4,8 @@
Administrar
Volver
Categor�as
- Crear esta p�gina en un lenguaje diferente
Contenido
+ Crear esta p�gina en un lenguaje diferente
Borrar
Editar
editar tags
Index: openacs-4/packages/xowiki/tcl/includelet-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/includelet-procs.tcl,v
diff -u -r1.89 -r1.90
--- openacs-4/packages/xowiki/tcl/includelet-procs.tcl 29 Dec 2008 02:24:17 -0000 1.89
+++ openacs-4/packages/xowiki/tcl/includelet-procs.tcl 6 Jan 2009 01:10:59 -0000 1.90
@@ -852,6 +852,7 @@
{-max_entries:integer 10}
{-allow_edit:boolean false}
{-allow_delete:boolean false}
+ {-pretty_age off}
}}
}
@@ -889,10 +890,16 @@
set entry_package_id [$entry set package_id]
set page_link [[my package_id] pretty_link -parent_id $parent_id $name]
+ switch -- $pretty_age {
+ 1 {set age [::xowiki::utility pretty_age -timestamp [clock scan $formatted_date] -locale [my locale]]}
+ 2 {set age [::xowiki::utility pretty_age -timestamp [clock scan $formatted_date] -locale [my locale] -levels 2]}
+ default {set age $formatted_date}
+ }
+
t1 add \
-title $title \
-title.href $page_link \
- -date $formatted_date
+ -date $age
if {$allow_edit} {
set p [::xo::db::CrClass get_instance_from_db -item_id 0 -revision_id $page_id]
Index: openacs-4/packages/xowiki/tcl/xowiki-callback-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/xowiki-callback-procs.tcl,v
diff -u -r1.52 -r1.53
--- openacs-4/packages/xowiki/tcl/xowiki-callback-procs.tcl 17 Nov 2008 17:58:54 -0000 1.52
+++ openacs-4/packages/xowiki/tcl/xowiki-callback-procs.tcl 6 Jan 2009 01:10:59 -0000 1.53
@@ -497,222 +497,4 @@
}
}
}
-
- Object create tidy
- tidy proc clean {text} {
- if {[[::xo::cc package_id] get_parameter tidy 0]
- && [info command ::util::which] ne ""} {
- set tidycmd [::util::which tidy]
- if {$tidycmd ne ""} {
- set in_file [ns_tmpnam]
- ::xowiki::write_file $in_file $text
- catch {exec $tidycmd -q -w 0 -ashtml < $in_file 2> /dev/null} output
- file delete $in_file
- #my msg o=$output
- regexp \n(.*)\n $output _ text
- #my msg o=$text
- return $text
- }
- }
- return $text
- }
-
- proc copy_parameter {from to} {
- set parameter_obj [::xo::parameter get_parameter_object \
- -parameter_name $from -package_key xowiki]
- if {$parameter_obj eq ""} {error "no such parameter $from"}
- foreach package_id [::xowiki::Package instances] {
- set value [$parameter_obj get -package_id $package_id]
- parameter::set_value -package_id $package_id -parameter $to -value $value
- }
- }
-
- ad_proc fix_all_package_ids {} {
- earlier versions of openacs did not have the package_id set correctly
- in acs_objects; this proc updates the package_ids of all items
- and revisions in acs_objects
- } {
- set folder_ids [list]
- set package_ids [list]
- foreach package_id [::xowiki::Package instances] {
- ns_log notice "checking package_id $package_id"
- set folder_id [db_list get_folder_id "select f.folder_id from cr_items c, cr_folders f \
- where c.name = 'xowiki: $package_id' and c.item_id = f.folder_id"]
- if {$folder_id ne ""} {
- db_dml update_package_id {update acs_objects set package_id = :package_id
- where object_id in
- (select item_id as object_id from cr_items where parent_id = :folder_id)
- and package_id is NULL}
- db_dml update_package_id {update acs_objects set package_id = :package_id
- where object_id in
- (select r.revision_id as object_id from cr_revisions r, cr_items i where
- i.item_id = r.item_id and i.parent_id = :folder_id)
- and package_id is NULL}
- }
- }
- }
-
- ad_proc update_views {} {
- update all automatic views of xowiki
- } {
- foreach object_type [::xowiki::Page object_types] {
- ::xo::db::sql::content_type refresh_view -content_type $object_type
- }
-
- catch {db_dml drop_live_revision_view "drop view xowiki_page_live_revision"}
- if {[db_driverkey ""] eq "postgresql"} {
- set sortkeys ", ci.tree_sortkey, ci.max_child_sortkey "
- } else {
- set sortkeys ""
- }
- ::xo::db::require view xowiki_page_live_revision \
- "select p.*, cr.*,ci.parent_id, ci.name, ci.locale, ci.live_revision, \
- ci.latest_revision, ci.publish_status, ci.content_type, ci.storage_type, \
- ci.storage_area_key $sortkeys \
- from xowiki_page p, cr_items ci, cr_revisions cr \
- where p.page_id = ci.live_revision \
- and p.page_id = cr.revision_id \
- and ci.publish_status <> 'production'"
- }
-
- ad_proc add_ltree_order_column {} {
- add page_order of type ltree, when ltree is configured (otherwise string)
- } {
- # catch sql statement to allow multiple runs
- catch {::xo::db::sql::content_type create_attribute \
- -content_type ::xowiki::Page \
- -attribute_name page_order \
- -datatype text \
- -pretty_name Order \
- -column_spec [::xo::db::sql map_datatype ltree]}
-
- ::xo::db::require index -table xowiki_page -col page_order \
- -using [expr {[::xo::db::has_ltree] ? "gist" : ""}]
- ::xowiki::update_views
- return 1
- }
-
- ad_proc cr_thin_out {{-doit 0} -package_id -item_id} {
- delete unneded items
- } {
- set extra_cause ""
- if {[info exists package_id]} {
- append extra_clause " and o.package_id = $package_id"
- }
- if {[info exists item_id]} {
- append extra_clause " and i.item_id = $item_id"
- }
-
- # only delete revisions older than this date
- set older_than [clock scan "1 month ago"]
- # delete revisions which are less than 5 minutes apart
- set delete_interval [expr {60*5}]
-
- #
- # The first query removes widow entries, where a user pressed new, but
- # never saved it. We could check as well, if the item has exactly one revision.
- #
- set sql "
- select i.name, o.package_id, i.item_id, r.revision_id, o.last_modified
- from acs_objects o, xowiki_page p, cr_revisions r, cr_items i
- where p.page_id = r.revision_id and r.item_id = i.item_id and o.object_id = r.revision_id
- and i.publish_status = 'production' and i.name = r.revision_id::varchar
- "
- foreach tuple [db_list_of_lists get_revisions $sql] {
- #::xotcl::Object msg "tuple = $tuple"
- foreach {name package_id item_id revision_id last_modified} $tuple break
- set time [clock scan [::xo::db::tcl_date $last_modified tz_var]]
- if {$time > $older_than} continue
- ::xotcl::Object msg "...will delete $name doit=$doit $last_modified"
- if {$doit} {
- ::xowiki::Package require $package_id
- $package_id delete -item_id $item_id -name $name
- }
- }
-
- #
- # The first query removes quick edits, where from a sequence of edits of the same user,
- # only the last edit is kept
- #
- set sql "
- select i.name, i.item_id, r.revision_id, o.last_modified, o.creation_user, o.package_id
- from acs_objects o, xowiki_page p, cr_revisions r, cr_items i
- where p.page_id = r.revision_id and r.item_id = i.item_id
- and o.object_id = r.revision_id
- $extra_clause
- order by item_id, revision_id asc
- "
- set last_item ""
- set last_time 0
- set last_user ""
- set last_revision ""
-
- foreach tuple [db_list_of_lists get_revisions $sql] {
- #::xotcl::Object msg "tuple = $tuple"
- foreach {name item_id revision_id last_modified user package_id} $tuple break
- set time [clock scan [::xo::db::tcl_date $last_modified tz_var]]
- if {$time > $older_than} continue
- #::xotcl::Object msg "compare time $time with $older_than => [expr {$time < $older_than}]"
- if {$last_user eq $user && $last_item == $item_id} {
- set timediff [expr {$time-$last_time}]
- #::xotcl::Object msg " timediff=[expr {$time-$last_time}]"
- if {$timediff < $delete_interval && $timediff >= 0} {
- ::xotcl::Object msg "...will delete $name revision=$last_revision, doit=$doit $last_modified"
- if {$doit} {
- ::xowiki::Package require $package_id
- $package_id delete_revision -revision_id $last_revision -item_id $item_id
- }
- }
- }
- set last_user $user
- set last_time $time
- set last_item $item_id
- set last_revision $revision_id
- }
- }
-
- proc unmounted_instances {} {
- return [db_list unmounted_instances {
- select package_id from apm_packages p where not exists
- (select 1 from site_nodes where object_id = p.package_id)
- and p.package_key = 'xowiki'
- }]
- }
-
- proc form_upgrade {} {
- db_dml from_upgrade {
- update xowiki_form f set form = xowiki_formi.data from xowiki_formi
- where f.xowiki_form_id = xowiki_formi.revision_id
- }
- }
-
- proc read_file {fn} {
- set F [open $fn]
- fconfigure $F -translation binary
- set content [read $F]
- close $F
- return $content
- }
- proc write_file {fn content} {
- set F [open $fn w]
- fconfigure $F -translation binary
- puts -nonewline $F $content
- close $F
- }
-
- ad_proc -public -callback subsite::url -impl apm_package {
- {-package_id:required}
- {-object_id:required}
- {-type ""}
- } {
- return the page_url for an object of type tasks_task
- } {
- ns_log notice "got package_id=$package_id, object_id=$object_id, type=$type"
- ::xowiki::Package initialize -package_id $package_id
- if {[::xotcl::Object isobject ::$package_id]} {
- return [$package_id package_url]
- } else {
- return ""
- }
- }
-}
\ No newline at end of file
+}
Index: openacs-4/packages/xowiki/tcl/xowiki-utility-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/xowiki-utility-procs.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/xowiki/tcl/xowiki-utility-procs.tcl 6 Jan 2009 01:10:59 -0000 1.1
@@ -0,0 +1,311 @@
+ad_library {
+ XoWiki - Utility procs
+
+ @creation-date 2006-08-08
+ @author Gustaf Neumann
+ @cvs-id $Id: xowiki-utility-procs.tcl,v 1.1 2009/01/06 01:10:59 gustafn Exp $
+}
+
+namespace eval ::xowiki {
+
+ Object create tidy
+ tidy proc clean {text} {
+ if {[[::xo::cc package_id] get_parameter tidy 0]
+ && [info command ::util::which] ne ""} {
+ set tidycmd [::util::which tidy]
+ if {$tidycmd ne ""} {
+ set in_file [ns_tmpnam]
+ ::xowiki::write_file $in_file $text
+ catch {exec $tidycmd -q -w 0 -ashtml < $in_file 2> /dev/null} output
+ file delete $in_file
+ #my msg o=$output
+ regexp \n(.*)\n $output _ text
+ #my msg o=$text
+ return $text
+ }
+ }
+ return $text
+ }
+
+ proc copy_parameter {from to} {
+ set parameter_obj [::xo::parameter get_parameter_object \
+ -parameter_name $from -package_key xowiki]
+ if {$parameter_obj eq ""} {error "no such parameter $from"}
+ foreach package_id [::xowiki::Package instances] {
+ set value [$parameter_obj get -package_id $package_id]
+ parameter::set_value -package_id $package_id -parameter $to -value $value
+ }
+ }
+
+ ad_proc fix_all_package_ids {} {
+ earlier versions of openacs did not have the package_id set correctly
+ in acs_objects; this proc updates the package_ids of all items
+ and revisions in acs_objects
+ } {
+ set folder_ids [list]
+ set package_ids [list]
+ foreach package_id [::xowiki::Package instances] {
+ ns_log notice "checking package_id $package_id"
+ set folder_id [db_list get_folder_id "select f.folder_id from cr_items c, cr_folders f \
+ where c.name = 'xowiki: $package_id' and c.item_id = f.folder_id"]
+ if {$folder_id ne ""} {
+ db_dml update_package_id {update acs_objects set package_id = :package_id
+ where object_id in
+ (select item_id as object_id from cr_items where parent_id = :folder_id)
+ and package_id is NULL}
+ db_dml update_package_id {update acs_objects set package_id = :package_id
+ where object_id in
+ (select r.revision_id as object_id from cr_revisions r, cr_items i where
+ i.item_id = r.item_id and i.parent_id = :folder_id)
+ and package_id is NULL}
+ }
+ }
+ }
+
+ ad_proc update_views {} {
+ update all automatic views of xowiki
+ } {
+ foreach object_type [::xowiki::Page object_types] {
+ ::xo::db::sql::content_type refresh_view -content_type $object_type
+ }
+
+ catch {db_dml drop_live_revision_view "drop view xowiki_page_live_revision"}
+ if {[db_driverkey ""] eq "postgresql"} {
+ set sortkeys ", ci.tree_sortkey, ci.max_child_sortkey "
+ } else {
+ set sortkeys ""
+ }
+ ::xo::db::require view xowiki_page_live_revision \
+ "select p.*, cr.*,ci.parent_id, ci.name, ci.locale, ci.live_revision, \
+ ci.latest_revision, ci.publish_status, ci.content_type, ci.storage_type, \
+ ci.storage_area_key $sortkeys \
+ from xowiki_page p, cr_items ci, cr_revisions cr \
+ where p.page_id = ci.live_revision \
+ and p.page_id = cr.revision_id \
+ and ci.publish_status <> 'production'"
+ }
+
+ ad_proc add_ltree_order_column {} {
+ add page_order of type ltree, when ltree is configured (otherwise string)
+ } {
+ # catch sql statement to allow multiple runs
+ catch {::xo::db::sql::content_type create_attribute \
+ -content_type ::xowiki::Page \
+ -attribute_name page_order \
+ -datatype text \
+ -pretty_name Order \
+ -column_spec [::xo::db::sql map_datatype ltree]}
+
+ ::xo::db::require index -table xowiki_page -col page_order \
+ -using [expr {[::xo::db::has_ltree] ? "gist" : ""}]
+ ::xowiki::update_views
+ return 1
+ }
+
+ ad_proc cr_thin_out {{-doit 0} {-edit_interval 300} {-older_than "1 month ago"} -package_id -item_id} {
+ Delete supposedly uninportant revision from the content repository.
+
+ @param edit_interval delete entries, which never become older than this interval (in seconds, default 300)
+ @param older_than delete only entries, which were modified longer than the provided time ago
+ } {
+ set extra_cause ""
+ if {[info exists package_id]} {
+ append extra_clause " and o.package_id = $package_id"
+ }
+ if {[info exists item_id]} {
+ append extra_clause " and i.item_id = $item_id"
+ }
+
+ # only delete revisions older than this date
+ set older_than [clock scan $older_than]
+
+ #
+ # The first query removes widow entries, where a user pressed new, but
+ # never saved it. We could check as well, if the item has exactly one revision.
+ #
+ set sql "
+ select i.name, o.package_id, i.item_id, r.revision_id, o.last_modified
+ from acs_objects o, xowiki_page p, cr_revisions r, cr_items i
+ where p.page_id = r.revision_id and r.item_id = i.item_id and o.object_id = r.revision_id
+ and i.publish_status = 'production' and i.name = r.revision_id::varchar
+ "
+ foreach tuple [db_list_of_lists get_revisions $sql] {
+ #::xotcl::Object msg "tuple = $tuple"
+ foreach {name package_id item_id revision_id last_modified} $tuple break
+ set time [clock scan [::xo::db::tcl_date $last_modified tz_var]]
+ if {$time > $older_than} continue
+ ::xotcl::Object msg "...will delete $name doit=$doit $last_modified"
+ if {$doit} {
+ ::xowiki::Package require $package_id
+ $package_id delete -item_id $item_id -name $name
+ }
+ }
+
+ #
+ # The first query removes quick edits, where from a sequence of edits of the same user,
+ # only the last edit is kept
+ #
+ set sql "
+ select i.name, i.item_id, r.revision_id, o.last_modified, o.creation_user, o.package_id
+ from acs_objects o, xowiki_page p, cr_revisions r, cr_items i
+ where p.page_id = r.revision_id and r.item_id = i.item_id
+ and o.object_id = r.revision_id
+ $extra_clause
+ order by item_id, revision_id asc
+ "
+ set last_item ""
+ set last_time 0
+ set last_user ""
+ set last_revision ""
+
+ foreach tuple [db_list_of_lists get_revisions $sql] {
+ #::xotcl::Object msg "tuple = $tuple"
+ foreach {name item_id revision_id last_modified user package_id} $tuple break
+ set time [clock scan [::xo::db::tcl_date $last_modified tz_var]]
+ if {$time > $older_than} continue
+ #::xotcl::Object msg "compare time $time with $older_than => [expr {$time < $older_than}]"
+ if {$last_user eq $user && $last_item == $item_id} {
+ set timediff [expr {$time-$last_time}]
+ #::xotcl::Object msg " timediff=[expr {$time-$last_time}]"
+ if {$timediff < $edit_interval && $timediff >= 0} {
+ ::xotcl::Object msg "...will delete $name revision=$last_revision, doit=$doit $last_modified"
+ if {$doit} {
+ ::xowiki::Package require $package_id
+ $package_id delete_revision -revision_id $last_revision -item_id $item_id
+ }
+ }
+ }
+ set last_user $user
+ set last_time $time
+ set last_item $item_id
+ set last_revision $revision_id
+ }
+ }
+
+ proc unmounted_instances {} {
+ return [db_list unmounted_instances {
+ select package_id from apm_packages p where not exists
+ (select 1 from site_nodes where object_id = p.package_id)
+ and p.package_key = 'xowiki'
+ }]
+ }
+
+ proc form_upgrade {} {
+ db_dml from_upgrade {
+ update xowiki_form f set form = xowiki_formi.data from xowiki_formi
+ where f.xowiki_form_id = xowiki_formi.revision_id
+ }
+ }
+
+ proc read_file {fn} {
+ set F [open $fn]
+ fconfigure $F -translation binary
+ set content [read $F]
+ close $F
+ return $content
+ }
+ proc write_file {fn content} {
+ set F [open $fn w]
+ fconfigure $F -translation binary
+ puts -nonewline $F $content
+ close $F
+ }
+
+ ad_proc -public -callback subsite::url -impl apm_package {
+ {-package_id:required}
+ {-object_id:required}
+ {-type ""}
+ } {
+ return the page_url for an object of type tasks_task
+ } {
+ ns_log notice "got package_id=$package_id, object_id=$object_id, type=$type"
+ ::xowiki::Package initialize -package_id $package_id
+ if {[::xotcl::Object isobject ::$package_id]} {
+ return [$package_id package_url]
+ } else {
+ return ""
+ }
+ }
+
+ Object create ::xowiki::utility
+ ::xowiki::utility set age \
+ [list \
+ [expr {3600*24*365}] year years \
+ [expr {3600*24*30}] month months \
+ [expr {3600*24*7}] week weeks \
+ [expr {3600*24}] day days \
+ [expr {3600}] hour hours \
+ [expr {60}] minute minutes \
+ [expr {1}] second seconds \
+ ]
+ ::xowiki::utility proc pretty_age {
+ -timestamp:required
+ -timestamp_base
+ {-locale ""}
+ {-levels 1}
+ } {
+ #
+ # This is an internationalized pretty age functions, which prints
+ # the rough date in a user friendly fashion.
+ #
+ #todo: caching?
+
+# outlook categories:
+# Unknown
+# Older
+# Last Month
+# Earlier This Month
+# Three Weeks Ago
+# Two Weeks Ago
+# Last Week
+# Yesterday
+# Today
+# This Week
+# Tomorrow
+# Next Week
+# Two Weeks Away
+# Three Weeks Away
+# Later This Month
+# Next Month
+# Beyond Next Month
+
+# Another possibilty: no ago, but "Today 10:00", "Yesterday 10:00", within a
+# week: "Thursday 10:00", older than about 30 days "13 May 2005" and
+# if anything else (ie. > 7 and < 30 days) it shows date and time "13-Oct 2005 10:00".
+
+ if {![info exists timestamp_base]} {set timestamp_base [clock seconds]}
+ set age_seconds [expr {$timestamp_base - $timestamp}]
+
+ set pos 0
+ set msg ""
+ my instvar age
+ foreach {interval unit unit_plural} $age {
+ set base [expr {int($age_seconds / $interval)}]
+ if {$base > 0} {
+ set label [expr {$base == 1 ? $unit : $unit_plural}]
+ set localized_label [::lang::message::lookup $locale xowiki.$label]
+ set msg "$base $localized_label"
+ # $pos < 5: do not report details under a minute
+ if {$pos < 5 && $levels > 1} {
+ set remaining_age [expr {$age_seconds-$base*$interval}]
+ set interval [lindex $age [expr {($pos+1)*3}]]
+ set unit [lindex $age [expr {($pos+1)*3+1}]]
+ set unit_plural [lindex $age [expr {($pos+1)*3+2}]]
+ set base [expr {int($remaining_age / $interval)}]
+ if {$base > 0} {
+ set label [expr {$base == 1 ? $unit : $unit_plural}]
+ set localized_label [::lang::message::lookup $locale xowiki.$label]
+ append msg " $base $localized_label"
+ }
+ }
+ set time $msg
+ set msg [::lang::message::lookup $locale xowiki.ago [list [list time $msg]]]
+ #append msg " ago"
+ break
+ }
+ incr pos
+ }
+ return $msg
+ }
+
+}