summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xlib/Travelynx.pm58
-rwxr-xr-xlib/Travelynx/Model/Journeys.pm108
-rw-r--r--share/locales/de_DE.po37
-rw-r--r--share/locales/en_GB.po37
-rw-r--r--templates/_checked_in.html.ep6
-rw-r--r--templates/_public_status_card.html.ep4
-rw-r--r--templates/year_in_review.html.ep24
7 files changed, 170 insertions, 104 deletions
diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm
index 7b5cf99..a83af39 100755
--- a/lib/Travelynx.pm
+++ b/lib/Travelynx.pm
@@ -466,6 +466,64 @@ sub startup {
);
$self->helper(
+ 'LT' => sub {
+ my ( $self, $minutes ) = @_;
+
+ my @ret;
+
+ if ( $minutes >= 14 * 24 * 60 ) {
+ push( @ret,
+ int( $minutes / ( 7 * 24 * 60 ) ) . q{ }
+ . $self->L('LT.weeks') );
+ }
+ elsif ( $minutes >= 7 * 24 * 60 ) {
+ push( @ret, '1 ' . $self->L('LT.week') );
+ }
+ $minutes %= 7 * 24 * 60;
+
+ if ( $minutes >= 2 * 24 * 60 ) {
+ push( @ret,
+ int( $minutes / ( 24 * 60 ) ) . q{ }
+ . $self->L('LT.days') );
+ }
+ elsif ( $minutes >= 24 * 60 ) {
+ push( @ret, '1 ' . $self->L('LT.day') );
+ }
+ $minutes %= 24 * 60;
+
+ if ( $minutes >= 2 * 60 ) {
+ push( @ret,
+ int( $minutes / 60 ) . q{ } . $self->L('LT.hours') );
+ }
+ elsif ( $minutes >= 60 ) {
+ push( @ret, '1 ' . $self->L('LT.hour') );
+ }
+ $minutes %= 60;
+
+ if ( $minutes >= 2 ) {
+ push( @ret, "$minutes " . $self->L('LT.minutes') );
+ }
+ elsif ($minutes) {
+ push( @ret, '1 ' . $self->L('LT.minute') );
+ }
+
+ if ( @ret == 0 ) {
+ return $self->L('LT.zero-minutes');
+ }
+
+ if ( @ret == 1 ) {
+ return $ret[0];
+ }
+
+ my $last = pop(@ret);
+ return
+ join( ', ', @ret )
+ . $self->L( @ret > 1 ? 'LT.final-and' : 'LT.and' )
+ . " $last";
+ }
+ );
+
+ $self->helper(
'now' => sub {
return DateTime->now( time_zone => 'Europe/Berlin' );
}
diff --git a/lib/Travelynx/Model/Journeys.pm b/lib/Travelynx/Model/Journeys.pm
index b6c9793..ea3461c 100755
--- a/lib/Travelynx/Model/Journeys.pm
+++ b/lib/Travelynx/Model/Journeys.pm
@@ -50,56 +50,6 @@ sub epoch_to_dt {
);
}
-# TODO turn into a travelynx helper called from templates so that
-# loc_handle is available for localization
-sub min_to_human {
- my ( $self, $minutes ) = @_;
-
- my @ret;
-
- if ( $minutes >= 14 * 24 * 60 ) {
- push( @ret, int( $minutes / ( 7 * 24 * 60 ) ) . ' Wochen' );
- }
- elsif ( $minutes >= 7 * 24 * 60 ) {
- push( @ret, '1 Woche' );
- }
- $minutes %= 7 * 24 * 60;
-
- if ( $minutes >= 2 * 24 * 60 ) {
- push( @ret, int( $minutes / ( 24 * 60 ) ) . ' Tage' );
- }
- elsif ( $minutes >= 24 * 60 ) {
- push( @ret, '1 Tag' );
- }
- $minutes %= 24 * 60;
-
- if ( $minutes >= 2 * 60 ) {
- push( @ret, int( $minutes / 60 ) . ' Stunden' );
- }
- elsif ( $minutes >= 60 ) {
- push( @ret, '1 Stunde' );
- }
- $minutes %= 60;
-
- if ( $minutes >= 2 ) {
- push( @ret, "$minutes Minuten" );
- }
- elsif ($minutes) {
- push( @ret, '1 Minute' );
- }
-
- if ( @ret == 0 ) {
- return '0 Minuten';
- }
-
- if ( @ret == 1 ) {
- return $ret[0];
- }
-
- my $last = pop(@ret);
- return join( ', ', @ret ) . " und $last";
-}
-
sub new {
my ( $class, %opt ) = @_;
@@ -1674,7 +1624,7 @@ sub compute_review {
$review{traveling_percentage_year}
= sprintf( "%.1f%%", $min_total * 100 / 525948.77 );
$review{traveling_percentage_year} =~ tr{.}{,};
- $review{traveling_time_year} = $self->min_to_human($min_total);
+ $review{traveling_time_year} = $min_total;
if (@linetypes) {
$review{typical_type_1} = $linetypes[0][0];
@@ -1689,24 +1639,18 @@ sub compute_review {
elsif ( @stops == 2 ) {
$review{typical_stops_2} = [ $stops[0][0], $stops[1][0] ];
}
- $review{typical_time}
- = $self->min_to_human( $stats->{min_travel_real} / $stats->{num_trains} );
+ $review{typical_time} = $stats->{min_travel_real} / $stats->{num_trains};
$review{typical_km}
= sprintf( '%.0f', $stats->{km_route} / $stats->{num_trains} );
$review{typical_kmh} = sprintf( '%.0f',
$stats->{km_route} / ( $stats->{min_travel_real} / 60 ) );
$review{typical_delay_dep}
= sprintf( '%.0f', $stats->{delay_dep} / $stats->{num_trains} );
- $review{typical_delay_dep_h}
- = $self->min_to_human( $review{typical_delay_dep} );
$review{typical_delay_arr}
= sprintf( '%.0f', $stats->{delay_arr} / $stats->{num_trains} );
- $review{typical_delay_arr_h}
- = $self->min_to_human( $review{typical_delay_arr} );
if ($longest_t) {
- $review{longest_t_time}
- = $self->min_to_human( $longest_t->{rt_duration} / 60 );
+ $review{longest_t_min} = $longest_t->{rt_duration} / 60;
$review{longest_t_type} = $longest_t->{type};
$review{longest_t_lineno} = $longest_t->{line} // $longest_t->{no};
$review{longest_t_from} = $longest_t->{from_name};
@@ -1724,8 +1668,7 @@ sub compute_review {
}
if ($shortest_t) {
- $review{shortest_t_time}
- = $self->min_to_human( $shortest_t->{rt_duration} / 60 );
+ $review{shortest_t_min} = $shortest_t->{rt_duration} / 60;
$review{shortest_t_type} = $shortest_t->{type};
$review{shortest_t_lineno} = $shortest_t->{line} // $shortest_t->{no};
$review{shortest_t_from} = $shortest_t->{from_name};
@@ -1745,12 +1688,10 @@ sub compute_review {
}
if ($most_delayed) {
- $review{most_delayed_type} = $most_delayed->{type};
- $review{most_delayed_delay_dep}
- = $self->min_to_human( $most_delayed->{delay_dep} );
- $review{most_delayed_delay_arr}
- = $self->min_to_human( $most_delayed->{delay_arr} );
- $review{most_delayed_lineno} = $most_delayed->{line}
+ $review{most_delayed_type} = $most_delayed->{type};
+ $review{most_delayed_delay_dep} = $most_delayed->{delay_dep};
+ $review{most_delayed_delay_arr} = $most_delayed->{delay_arr};
+ $review{most_delayed_lineno} = $most_delayed->{line}
// $most_delayed->{no};
$review{most_delayed_from} = $most_delayed->{from_name};
$review{most_delayed_to} = $most_delayed->{to_name};
@@ -1758,17 +1699,13 @@ sub compute_review {
}
if ($most_delay) {
- $review{most_delay_type} = $most_delay->{type};
- $review{most_delay_delay_dep} = $most_delay->{delay_dep};
- $review{most_delay_delay_arr} = $most_delay->{delay_arr};
- $review{most_delay_sched_time}
- = $self->min_to_human( $most_delay->{sched_duration} / 60 );
- $review{most_delay_real_time}
- = $self->min_to_human( $most_delay->{rt_duration} / 60 );
+ $review{most_delay_type} = $most_delay->{type};
+ $review{most_delay_delay_dep} = $most_delay->{delay_dep};
+ $review{most_delay_delay_arr} = $most_delay->{delay_arr};
+ $review{most_delay_sched_time} = $most_delay->{sched_duration} / 60;
+ $review{most_delay_real_time} = $most_delay->{rt_duration} / 60;
$review{most_delay_delta}
- = $self->min_to_human(
- ( $most_delay->{rt_duration} - $most_delay->{sched_duration} )
- / 60 );
+ = ( $most_delay->{rt_duration} - $most_delay->{sched_duration} ) / 60;
$review{most_delay_lineno} = $most_delay->{line} // $most_delay->{no};
$review{most_delay_from} = $most_delay->{from_name};
$review{most_delay_to} = $most_delay->{to_name};
@@ -1776,17 +1713,14 @@ sub compute_review {
}
if ($most_undelay) {
- $review{most_undelay_type} = $most_undelay->{type};
- $review{most_undelay_delay_dep} = $most_undelay->{delay_dep};
- $review{most_undelay_delay_arr} = $most_undelay->{delay_arr};
- $review{most_undelay_sched_time}
- = $self->min_to_human( $most_undelay->{sched_duration} / 60 );
- $review{most_undelay_real_time}
- = $self->min_to_human( $most_undelay->{rt_duration} / 60 );
+ $review{most_undelay_type} = $most_undelay->{type};
+ $review{most_undelay_delay_dep} = $most_undelay->{delay_dep};
+ $review{most_undelay_delay_arr} = $most_undelay->{delay_arr};
+ $review{most_undelay_sched_time} = $most_undelay->{sched_duration} / 60;
+ $review{most_undelay_real_time} = $most_undelay->{rt_duration} / 60;
$review{most_undelay_delta}
- = $self->min_to_human(
- ( $most_undelay->{sched_duration} - $most_undelay->{rt_duration} )
- / 60 );
+ = ( $most_undelay->{sched_duration} - $most_undelay->{rt_duration} )
+ / 60;
$review{most_undelay_lineno} = $most_undelay->{line}
// $most_undelay->{no};
$review{most_undelay_from} = $most_undelay->{from_name};
diff --git a/share/locales/de_DE.po b/share/locales/de_DE.po
index 8867f27..dbe6248 100644
--- a/share/locales/de_DE.po
+++ b/share/locales/de_DE.po
@@ -46,6 +46,43 @@ msgid "header.error"
msgstr "Fehler"
#
+# LT (localized duration)
+#
+
+msgid "LT.weeks"
+msgstr "Wochen"
+
+msgid "LT.week"
+msgstr "Woche"
+
+msgid "LT.days"
+msgstr "Tage"
+
+msgid "LT.day"
+msgstr "Tag"
+
+msgid "LT.hours"
+msgstr "Stunden"
+
+msgid "LT.hour"
+msgstr "Stunde"
+
+msgid "LT.minutes"
+msgstr "Minuten"
+
+msgid "LT.minute"
+msgstr "Minute"
+
+msgid "LT.zero-minutes"
+msgstr "0 Minuten"
+
+msgid "LT.final-and"
+msgstr " und"
+
+msgid "LT.and"
+msgstr " und"
+
+#
# Templates
#
diff --git a/share/locales/en_GB.po b/share/locales/en_GB.po
index 7e47acb..5299e68 100644
--- a/share/locales/en_GB.po
+++ b/share/locales/en_GB.po
@@ -46,6 +46,43 @@ msgid "header.error"
msgstr "Error"
#
+# LT (localized duration)
+#
+
+msgid "LT.weeks"
+msgstr "weeks"
+
+msgid "LT.week"
+msgstr "week"
+
+msgid "LT.days"
+msgstr "days"
+
+msgid "LT.day"
+msgstr "day"
+
+msgid "LT.hours"
+msgstr "hours"
+
+msgid "LT.hour"
+msgstr "hour"
+
+msgid "LT.minutes"
+msgstr "minutes"
+
+msgid "LT.minute"
+msgstr "minute"
+
+msgid "LT.zero-minutes"
+msgstr "0 minutes"
+
+msgid "LT.final-and"
+msgstr ", and"
+
+msgid "LT.and"
+msgstr " and"
+
+#
# Templates
#
diff --git a/templates/_checked_in.html.ep b/templates/_checked_in.html.ep
index 659abff..e509549 100644
--- a/templates/_checked_in.html.ep
+++ b/templates/_checked_in.html.ep
@@ -19,20 +19,20 @@
data-dest="<%= $journey->{arr_name} %>"
>
% if ($journey->{boarding_countdown} > 60) {
- <%= L('status.boarding-in.pre') %> <%= journeys->min_to_human(int($journey->{boarding_countdown} / 60)) %> <%= L('status.boarding-in.post') %><br/>
+ <%= L('status.boarding-in.pre') %> <%= LT(int($journey->{boarding_countdown} / 60)) %> <%= L('status.boarding-in.post') %><br/>
% }
% elsif ($journey->{boarding_countdown} > 0) {
<%= L('status.boarding-soon') %><br/>
% }
% if ($journey->{departure_countdown} > 60) {
- <%= L('status.departure-in.pre') %> <%= journeys->min_to_human(int($journey->{departure_countdown} / 60)) %> <%= L('status.departure-in.post') %>
+ <%= L('status.departure-in.pre') %> <%= LT(int($journey->{departure_countdown} / 60)) %> <%= L('status.departure-in.post') %>
% }
% elsif ($journey->{departure_countdown} > 0) {
%= L('status.departure-soon')
% }
% elsif (defined $journey->{arrival_countdown}) {
% if ($journey->{arrival_countdown} > 60) {
- <%= L('status.arrival-in.pre') %> <%= journeys->min_to_human(int($journey->{arrival_countdown} / 60)) %> <%= L('status.arrival-in.post') %>
+ <%= L('status.arrival-in.pre') %> <%= LT(int($journey->{arrival_countdown} / 60)) %> <%= L('status.arrival-in.post') %>
% }
% elsif ($journey->{arrival_countdown} > 0) {
%= L('status.arrival-soon')
diff --git a/templates/_public_status_card.html.ep b/templates/_public_status_card.html.ep
index ca5ddf8..834f9a8 100644
--- a/templates/_public_status_card.html.ep
+++ b/templates/_public_status_card.html.ep
@@ -34,14 +34,14 @@
% }
data-arrival="<%= $journey->{real_arrival}->epoch %>">
% if ($journey->{departure_countdown} > 60) {
- Abfahrt in <%= journeys->min_to_human(int($journey->{departure_countdown} / 60)) %>
+ Abfahrt in <%= LT(int($journey->{departure_countdown} / 60)) %>
% }
% elsif ($journey->{departure_countdown} > 0) {
Abfahrt in weniger als einer Minute
% }
% elsif (defined $journey->{arrival_countdown}) {
% if ($journey->{arrival_countdown} > 60) {
- <%= L('status.arrival-in.pre') %> <%= journeys->min_to_human(int($journey->{arrival_countdown} / 60)) %> <%= L('status.arrival-in.post') %>
+ <%= L('status.arrival-in.pre') %> <%= LT(int($journey->{arrival_countdown} / 60)) %> <%= L('status.arrival-in.post') %>
% }
% elsif ($journey->{arrival_countdown} > 0) {
%= L('status.arrival-soon')
diff --git a/templates/year_in_review.html.ep b/templates/year_in_review.html.ep
index de10950..db8aca3 100644
--- a/templates/year_in_review.html.ep
+++ b/templates/year_in_review.html.ep
@@ -17,12 +17,12 @@
% if ($review->{traveling_min_total} > 525) {
%= L('review.travel-time.pre')
<strong><%= $review->{traveling_percentage_year} %> <%= L('review.travel-time.of-year') %></strong>
- (<%= $review->{traveling_time_year} %>)
+ (<%= LT($review->{traveling_time_year}) %>)
%= L('review.travel-time.post')
% }
% else {
%= L('review.travel-time.pre')
- <strong><%= $review->{traveling_time_year} %></strong>
+ <strong><%= LT($review->{traveling_time_year}) %></strong>
%= L('review.travel-time.post')
% }
</p>
@@ -67,7 +67,7 @@
</p>
<p>
%= L('review.time-distance.pre')
- <strong><%= $review->{typical_time} %></strong>
+ <strong><%= LT($review->{typical_time}) %></strong>
%= L('review.time-distance.mid')
<strong><%= $review->{typical_km} %> km</strong> (<%= $review->{typical_kmh} %> km/h)<%= L('review.time-distance.post') %>
</p>
@@ -80,17 +80,17 @@
<p>
% if ($review->{typical_delay_arr} < $review->{typical_delay_dep}) {
%= L('review.delay-decreasing.pre')
- <strong><%= $review->{typical_delay_dep_h} %></strong>
+ <strong><%= LT($review->{typical_delay_dep}) %></strong>
%= L('review.delay-decreasing.mid')
- <strong><%= $review->{typical_delay_arr_h} %></strong><%= L('review.delay-decreasing.post') %>
+ <strong><%= LT($review->{typical_delay_arr}) %></strong><%= L('review.delay-decreasing.post') %>
% }
% elsif ($review->{typical_delay_arr} == $review->{typical_delay_dep}) {
%= L('review.delay-constant.pre')
- <strong><%= $review->{typical_delay_dep_h} %></strong><%= L('review.delay-constant.post') %>
+ <strong><%= LT($review->{typical_delay_dep}) %></strong><%= L('review.delay-constant.post') %>
% }
% else {
%= L('review.delay-increasing.pre')
- <strong><%= $review->{typical_delay_dep_h} %></strong>
+ <strong><%= LT($review->{typical_delay_dep}) %></strong>
%= L('review.delay-increasing.mid')
<strong>+<%= $review->{typical_delay_arr} %></strong><%= L('review.delay-increasing.post') %>
% }
@@ -103,7 +103,7 @@
<p>
<a href="/journey/<%= $review->{longest_t_id} %>"><%= L('review.high-scores.longest-trip.link') %></a>:
%= L('review.high-scores.longest-trip.pre')
- <strong><%= $review->{longest_t_time} %></strong>
+ <strong><%= LT($review->{longest_t_min}) %></strong>
%= L('review.high-scores.with')
<strong><%= $review->{longest_t_type} %> <%= $review->{longest_t_lineno} %></strong>
%= L('review.high-scores.from')
@@ -135,7 +135,7 @@
<p>
<a href="/journey/<%= $review->{shortest_t_id} %>"><%= L('review.high-scores.shortest-trip.link') %></a>:
%= L('review.high-scores.shortest-trip.pre')
- <strong><%= $review->{shortest_t_time} %></strong>
+ <strong><%= LT($review->{shortest_t_min}) %></strong>
%= L('review.high-scores.with')
<strong><%= $review->{shortest_t_type} %> <%= $review->{shortest_t_lineno} %></strong>
%= L('review.high-scores.from')
@@ -204,7 +204,7 @@
% if ($review->{most_delayed_id}) {
<p>
%= L('review.most-delayed.pre')
- <strong><%= $review->{most_delayed_delay_arr} %></strong><%= L('review.most-delayed.mid') %>
+ <strong><%= LT($review->{most_delayed_delay_arr}) %></strong><%= L('review.most-delayed.mid') %>
<a href="/journey/<%= $review->{most_delayed_id} %>"><%= $review->{most_delayed_type} %> <%= $review->{most_delayed_lineno} %></a> <%= $review->{most_delayed_from} %> → <%= $review->{most_delayed_to} %><%= L('review.most-delayed.post') %>
</p>
% }
@@ -217,7 +217,7 @@
%= L('review.most-delay.to')
%= $review->{most_delay_to}
%= L('review.most-delay.mid')
- <strong><%= $review->{most_delay_delta} %></strong><%= L('review.most-delay.post') %>
+ <strong><%= LT($review->{most_delay_delta}) %></strong><%= L('review.most-delay.post') %>
</p>
% }
% if ($review->{most_undelay_id}) {
@@ -228,7 +228,7 @@
%= $review->{most_undelay_from}
%= L('review.most-undelay.to')
%= $review->{most_undelay_to}
- <strong><%= $review->{most_undelay_delta} %></strong><%= L('review.most-undelay.post') %>
+ <strong><%= LT($review->{most_undelay_delta}) %></strong><%= L('review.most-undelay.post') %>
</p>
% }
</div>