diff options
| -rwxr-xr-x | lib/Travelynx.pm | 58 | ||||
| -rwxr-xr-x | lib/Travelynx/Model/Journeys.pm | 108 | ||||
| -rw-r--r-- | share/locales/de_DE.po | 37 | ||||
| -rw-r--r-- | share/locales/en_GB.po | 37 | ||||
| -rw-r--r-- | templates/_checked_in.html.ep | 6 | ||||
| -rw-r--r-- | templates/_public_status_card.html.ep | 4 | ||||
| -rw-r--r-- | templates/year_in_review.html.ep | 24 |
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> |
