diff --git a/server/__main__.py b/server/__main__.py index 3900c84c4a46a2e66a442e11903bd303ff3d8f10..5cef8dc8ad6207ac2cd9b447fdec1c290c9bf59d 100644 --- a/server/__main__.py +++ b/server/__main__.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python # coding=utf-8 import sys diff --git a/server/app.py b/server/app.py index 77f80920f80636f3511d5f24e8b78f72800daee7..53ec4e7e4481c1035103d405d2f7ecdc870382c5 100644 --- a/server/app.py +++ b/server/app.py @@ -203,20 +203,21 @@ def apiStopInfo(version): # Get info on a specific bus: used in the map view when a bus is focused # URI: /api/v1/bus/<busId>/ +@app.route('/api/v<int:version>/bus/') +@app.route('/api/v<int:version>/bus/<busId>/') @app.route('/api/v<int:version>/bus/<busId>/<getShape>/') -def apiBusInfo(version, busId, getShape): - if int(version) == 1: +def apiBusInfo(version, busId = None, getShape = "false"): + # busId is falsely optional here so that we can easily use url_for() for this endpoint in js + if int(version) == 1 and busId != None: lastModified, dynamicData = locator.getLastResponse() - # for now return a static json data = dynamicData["result"]["vehicles"][busId] # add shape to the data # route_short_name = lineref from data if (getShape == "true"): data["shape"] = gtfs.getShape(data["lineref"]) - if data: return jsonify(data) diff --git a/static/css/stylesheet.css b/static/css/stylesheet.css index 24fd81ebdbd03843b8275076b845289dd61ee045..93f0686c52c567e9efc4c4e89420483919bf76a5 100644 --- a/static/css/stylesheet.css +++ b/static/css/stylesheet.css @@ -29,6 +29,11 @@ body { height: 100%; overflow-y: scroll; } @media only screen and (max-width: 768px) { .flex-grow { width: 100%; } + + /* Column count for the F�li info page */ + .card-columns { + column-count: 1; + } } /* sticky footer and header: fixed position (for display units, doesn't scroll) */ @@ -244,6 +249,27 @@ body { right: 0; } +/* F�li info page cards */ +.foli-card { + border: 1px solid #FF9900; +} +.foli-card .card-header { + background-color: #FF9900; +} +th .text-muted { + font-size: 14px; + font-style: normal; + margin: 0; +} + +/* Info page cards */ +.info-card { + height: 600px; + background-color: #FF9900; + border: 1px solid #FF9900; + margin-bottom: 30px; +} + /* larger screen layout */ @media (min-width: 768px) { .header { min-height: 33.63rem; /* 33.63rem = 538.5px, font-size 16 (half of the current image height) */ } @@ -268,4 +294,9 @@ body { width: 80px; height: 55px; } + + /* Column count for the F�li info page */ + .card-columns { + column-count: 2; + } } diff --git a/templates/foli.html b/templates/foli.html index 88c97b768341583a687215d7c540286c4376351d..ee26e4910b4813ac51a9aa9fd9760f1cc40e82d7 100644 --- a/templates/foli.html +++ b/templates/foli.html @@ -6,16 +6,15 @@ {% set content_lang = 'fi' %} {% block content %} -<!-- the use of the grid here has some scaling issues on mobile device --> <div class="container"> <h1>Föli - Turun seudun joukkoliikenne</h1> <h2>Hinnat</h2> <p>Bussissa voit ostaa kertalipun tai ladata matkakortin käteisellä. Samalla lipulla tai matkakortilla on vaihtoaikaa 2 tuntia.</p> - <div class="card-columns" style="column-count: 2;"> + <div class="card-columns"> <!-- Single ticket prices --> - <div class="card"> + <div class="card foli-card"> <div class="card-header"> <h3 class="card-title">Kertaliput</h3> </div> @@ -51,14 +50,14 @@ </table> </div> <!-- Foli card prices --> - <div class="card"> + <div class="card foli-card"> <div class="card-header"> <h3 class="card-title">Arvokortit</h3> </div> <div class="card-body"> <h4 class="card-title">Haltijakohtainen</h4> </div> - <table class="table"> + <table class="table table-striped"> <thead> <tr> <th colspan="3">Aikuiset (≥ 20 v)</th> @@ -80,7 +79,7 @@ <div class="card-body"> <h4 class="card-title">Henkilökohtaiset</h4> </div> - <table class="table"> + <table class="table table-striped"> <thead> <tr> <th colspan="3">Lapset (alle 15 v)</th> @@ -99,10 +98,10 @@ </tr> </tbody> </table> - <table class="table"> + <table class="table table-striped"> <thead> <tr> - <th colspan="3">Nuoret (15-19 v) ja opiskelijat</th> + <th colspan="3">Nuoret (15-19 v) ja opiskelijat<br /><p class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</p></th> </tr> </thead> <tbody> @@ -118,13 +117,10 @@ </tr> </tbody> </table> - <div class="card-body"> - <p class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</p> - </div> - <table class="table"> + <table class="table table-striped"> <thead> <tr> - <th colspan="3">Seniorit (≥ 65 v) ja vammaiset</th> + <th colspan="3">Seniorit (≥ 65 v) ja vammaiset<br /><p class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</p></th> </tr> </thead> <tbody> @@ -140,22 +136,19 @@ </tr> </tbody> </table> - <div class="card-body"> - <p class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</p> - </div> <div class="card-footer"> <p>*ma-pe klo 9:00-12:59, **klo 23:00-04:00</p> </div> </div> <!-- Foli season pass prices --> - <div class="card"> + <div class="card foli-card"> <div class="card-header"> <h3 class="card-title">Kausikortit</h3> </div> <div class="card-body"> <h4 class="card-title">Haltijakohtaiset</h4> </div> - <table class="table"> + <table class="table table-striped"> <thead> <tr> <th colspan="4">Aikuiset (≥ 20 v)</th> @@ -188,7 +181,7 @@ </tr> </tbody> </table> - <table class="table"> + <table class="table table-striped"> <thead> <tr> <th colspan="3">Haltijakohtainen erikoiskortti</th> @@ -205,7 +198,7 @@ <div class="card-body"> <h4 class="card-title">Henkilökohtaiset</h4> </div> - <table class="table"> + <table class="table table-striped"> <thead> <tr> <th colspan="4">Lapset (alle 15 v)</th> @@ -226,10 +219,10 @@ </tr> </tbody> </table> - <table class="table"> + <table class="table table-striped"> <thead> <tr> - <th colspan="4">Nuoret (15-19 v) ja opiskelijat</th> + <th colspan="4">Nuoret (15-19 v) ja opiskelijat<br /><p class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</p></th> </tr> </thead> <tbody> @@ -245,15 +238,12 @@ <td>33 €</td> <td>8</td> </tr> - <tr> - <td colspan="4" class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</td> - </tr> </tbody> </table> - <table class="table"> + <table class="table table-striped"> <thead> <tr> - <th colspan="4">Seniorit (≥ 65 v) ja vammaiset</th> + <th colspan="4">Seniorit (≥ 65 v) ja vammaiset<br /><p class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</p></th> </tr> </thead> <tbody> @@ -269,21 +259,18 @@ <td>33 €</td> <td>8</td> </tr> - <tr> - <td colspan="4" class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</td> - </tr> </tbody> </table> </div> <!-- Foli double card prices --> - <div class="card"> + <div class="card foli-card"> <div class="card-header"> <h3 class="card-title">Tuplakortit</h3> </div> <div class="card-body"> <h4 class="card-title">Haltijakohtainen</h4> </div> - <table class="table"> + <table class="table table-striped"> <thead> <tr> <th colspan="2">Aikuiset (≥ 20 v)</th> @@ -299,10 +286,10 @@ <div class="card-body"> <h4 class="card-title">Henkilökohtaiset</h4> </div> - <table class="table"> + <table class="table table-striped"> <thead> <tr> - <th colspan="2">Nuoret (15-19 v) ja opiskelijat</th> + <th colspan="2">Nuoret (15-19 v) ja opiskelijat<br /><p class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</p></th> </tr> </thead> <tbody> @@ -310,21 +297,18 @@ <td>30 pv</td> <td>36 €</td> </tr> - <tr> - <td colspan="2" class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</td> - </tr> </tbody> </table> </div> <!-- Tourist cards --> - <div class="card"> + <div class="card foli-card"> <div class="card-header"> <h3 class="card-title">Matkailijakortit</h3> </div> <div class="card-body"> - <p>Myydään myös Turku Touringin matkailuneuvonnassa, Aurakatu 4. Ei myydä busseissa.</p> + <p>Myydään myös Turku Touringin matkailuneuvonnassa osoitteessa Aurakatu 4. Ei myydä busseissa.</p> </div> - <table class="table"> + <table class="table table-striped"> <tbody> <tr> <td>1 vrk</td> @@ -354,7 +338,7 @@ </table> </div> <!-- Mobile tickets --> - <div class="card"> + <div class="card foli-card"> <div class="card-header"> <h3 class="card-title">Mobiililippu</h3> </div> @@ -362,13 +346,15 @@ <p> Mobiilisovelluksessa myydään aikuisten ja lasten kertalippuja sekä erimittaisia matkailijatuotteita. Maksutapoina ovat IQ-maksu, pankki- tai luottokortti sekä matkapuhelinmaksu. Hintaan lisätään - maksutapalisä. Ohjeet sovelluksen lataamiseen löydät sivun ylälaidan linkistä "Mobiilisovellus". + maksutapalisä. Ohjeet sovelluksen lataamiseen löydät etusivun linkistä "Mobiilisovellus". </p> </div> </div> <!-- Sale and service locations --> - <div class="card"> - <div class="card-header">Myynti- ja palvelupisteet</div> + <div class="card foli-card"> + <div class="card-header"> + <h3 class="card-title">Myynti- ja palvelupisteet</h3> + </div> <div class="card-body"> <div class="row"> <div class="col-4">Turku:</div> @@ -397,8 +383,10 @@ </div> </div> <!-- Foli card top-up locations --> - <div class="card"> - <div class="card-header">Latauspisteet</div> + <div class="card foli-card"> + <div class="card-header"> + <h3 class="card-title">Latauspisteet</h3> + </div> <div class="card-body"> <div class="col">Turun kaupunginkirjasto</div> <div class="col">Sokos Wiklund</div> diff --git a/templates/info.html b/templates/info.html index 8f5a6b186998f353060ecac8ea34dd0a3c65d100..b72f55cc27d7e94172245774eb45ceae1ec91e21 100644 --- a/templates/info.html +++ b/templates/info.html @@ -1,10 +1,45 @@ {% extends 'internal/base.html' %} {% set title = 'Info' %} -{% set sticky_banners = g.is_kiosk %} +{% set sticky_banners = true %} {% set localized = false %} {% set content_lang = 'fi' %} {% block content %} - <!-- TODO: created to prevent accidental 404 during presentations --> + +<div class="container"> + <div class="row"> + <div class="col-md-6"> + <div class="card info-card"> + <a class="twitter-timeline" data-height="600" data-dnt="true" data-theme="light" href="https://twitter.com/Turkukaupunki?ref_src=twsrc%5Etfw">Tweets by Turkukaupunki</a> + <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> + </div> + </div> + <div class="col-md-6"> + <div class="card info-card"> + <div class="card-header"> + <h3 class="card-title">Visit Turku -uutiset</h3> + </div> + <script type="text/javascript" src="http://output92.rssinclude.com/output?type=js&id=1172169&hash=c1c032487ad85904644bb22308686454"></script> + </div> + </div> + </div> + + <div class="row"> + <div class="col-md-6"> + <div class="card info-card" style="overflow: auto;"> + <div class="card-header"> + <h3 class="card-title">AccuWeather</h3> + </div> + <a href="https://www.accuweather.com/en/fi/turku/134768/weather-forecast/134768" class="aw-widget-legal"> + </a><div id="awtd1519238716374" class="aw-widget-36hour" data-locationkey="134768" data-unit="c" data-language="fi" data-useip="false" data-uid="awtd1519238716374" data-editlocation="false"></div> + <script type="text/javascript" src="https://oap.accuweather.com/launch.js"></script> + </div> + </div> + <div class="col-md-6"> + <!-- Empty spot for another card. --> + </div> + </div> +</div> + {% endblock content %} diff --git a/templates/map.html b/templates/map.html index ae49fcf80b0cbe39a9f0a3f633dd05f47d24a3c8..1fec184b7346fb65f1e3091bcfa280f6461ecaf8 100644 --- a/templates/map.html +++ b/templates/map.html @@ -21,24 +21,26 @@ --> <!-- Show next buses?? --> - <div class="list-group box-shadow"> - <div class="list-group-item list-group-item-foli border-foli"> - <div class="row"> - <span class="col-8"><strong>{{ _("Line") }} / {{ _("Destination") }}</strong></span> - <span class="col-2 text-center"><strong>{{ _("Time") }}</strong></span> - <span class="col-2 text-center"><strong>{{ _("ETA") }}</strong></span> + <div class="card box-shadow border-foli content-spaced-lg"> + <div class="list-group list-group-flush"> + <div class="list-group-item list-group-item-foli"> + <div class="row"> + <span class="col-8"><strong>{{ _("Line") }} / {{ _("Destination") }}</strong></span> + <span class="col-2 text-center"><strong>{{ _("Time") }}</strong></span> + <span class="col-2 text-center"><strong>{{ _("ETA") }}</strong></span> + </div> </div> - </div> - {% for bus in arrivals %} - <div class="list-group-item list-group-item-action border-foli {% if not loop.first %}border-top-0{% endif %}"> - <a class="row link-unstyled" href="#"> - <span class="col-8 text-foli">{{ util.line_name(bus) }}</span> - <span class="col-2 text-center">{{ util.time_short(bus.time) }}</span> - <span class="col-2 text-center text-success">{{ bus.time_relative | formatseconds }}</span> - </a> + {% for bus in arrivals %} + <div class="list-group-item list-group-item-action"> + <a class="row link-unstyled" href="#"> + <span class="col-8 text-foli">{{ util.line_name(bus) }}</span> + <span class="col-2 text-center">{{ util.time_short(bus.time) }}</span> + <span class="col-2 text-center text-success">{{ bus.time_relative | formatseconds }}</span> + </a> + </div> + {% endfor %} </div> - {% endfor %} </div> <!-- draw the map --> @@ -270,14 +272,15 @@ }); // get information about the focused bus + var requestFocus = focusedMarker; $.getJSON( - // cheat way? need the dynamic busId to the api, don't know how to do it any other way - '../api/v1/bus/' + focusedMarker + '/true', + "{{ url_for('apiBusInfo', version = 1, _external = True) }}" + focusedMarker + '/true', function (data) { + // poor man's locking (the A in Ajax is for Asynchronous :)) + if (requestFocus !== focusedMarker) + return; + focusedBus = data; - //$.each( data, function( key, value ) { - //focusedBus[key] = value; - //}); console.log("found this bus info: ", focusedBus); @@ -309,7 +312,8 @@ }; var drawOneBus = function() { - $.getJSON('../api/v1/bus/' + focusedMarker + '/false', + $.getJSON( + "{{ url_for('apiBusInfo', version = 1, _external = True) }}" + focusedMarker + '/false', function (resultData) { // poor man's locking if (trackingLoop === null) diff --git a/translations/en/LC_MESSAGES/messages.po b/translations/en/LC_MESSAGES/messages.po index eac047e50445de255ea9f0e0eeee28e0ce54c02d..2820545e4fd6c83bc73d9da463712b6d77138b08 100644 --- a/translations/en/LC_MESSAGES/messages.po +++ b/translations/en/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2018-02-11 10:30+0200\n" +"POT-Creation-Date: 2018-02-22 17:25+0200\n" "PO-Revision-Date: 2018-02-10 01:33+0200\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: en\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.5.3\n" -#: templates/index.html:3 templates/internal/base.html:104 +#: templates/index.html:3 templates/internal/base.html:109 msgid "Home" msgstr "" @@ -59,82 +59,84 @@ msgstr "" msgid "Live Bus Traffic Nearby" msgstr "" -#: templates/timetables.html:10 -msgid "Busses Arriving Soon" -msgstr "" - -#: templates/timetables.html:18 templates/timetables.html:53 +#: templates/map.html:28 templates/timetables.html:19 +#: templates/timetables.html:54 msgid "Line" msgstr "" -#: templates/timetables.html:18 templates/timetables.html:54 +#: templates/map.html:28 templates/timetables.html:19 +#: templates/timetables.html:55 msgid "Destination" msgstr "" -#: templates/timetables.html:19 +#: templates/map.html:29 templates/timetables.html:20 msgid "Time" msgstr "" -#: templates/timetables.html:20 +#: templates/map.html:30 templates/timetables.html:21 msgid "ETA" msgstr "" -#: templates/timetables.html:38 +#: templates/timetables.html:10 +msgid "Busses Arriving Soon" +msgstr "" + +#: templates/timetables.html:39 msgid "Information last updated a minute ago" msgstr "" -#: templates/timetables.html:45 +#: templates/timetables.html:46 msgid "Today's Schedule" msgstr "" -#: templates/timetables.html:55 templates/timetables.html:92 +#: templates/timetables.html:56 templates/timetables.html:93 msgid "Departure Time" msgstr "" -#: templates/internal/base.html:86 templates/timetables.html:82 -#: templates/timetables.html:108 +#: templates/internal/base.html:91 templates/timetables.html:83 +#: templates/timetables.html:109 msgid "Close" msgstr "" -#: templates/timetables.html:91 +#: templates/timetables.html:92 msgid "Stop" msgstr "" -#: templates/internal/base.html:43 +#: templates/internal/base.html:45 msgid "Logo" msgstr "" -#: templates/internal/base.html:56 +#: templates/internal/base.html:61 msgid "" "The content for this view is not available for your selected language, " "the contents are displayed below in their original language." msgstr "" -#: templates/internal/base.html:74 +#: templates/internal/base.html:79 msgid "Opening external content" msgstr "" -#: templates/internal/base.html:80 +#: templates/internal/base.html:85 msgid "This content is available on an external site in the following address:" msgstr "" -#: templates/internal/base.html:82 +#: templates/internal/base.html:87 msgid "Please scan the below code to access it on your personal device:" msgstr "" -#: templates/internal/base.html:99 +#: templates/internal/base.html:104 msgid "Terms" msgstr "" -#: templates/internal/base.html:109 +#: templates/internal/base.html:114 msgid "English" msgstr "" -#: templates/internal/base.html:110 +#: templates/internal/base.html:115 msgid "Finnish" msgstr "" -#: templates/internal/base.html:111 +#: templates/internal/base.html:116 msgid "Swedish" msgstr "" diff --git a/translations/fi/LC_MESSAGES/messages.po b/translations/fi/LC_MESSAGES/messages.po index eb29bc5b14d862e6d146fb8f2f1531faa1b4728a..dff74dcb9f753084d5294d0a14e98a1858f2b859 100644 --- a/translations/fi/LC_MESSAGES/messages.po +++ b/translations/fi/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2018-02-11 10:30+0200\n" +"POT-Creation-Date: 2018-02-22 17:25+0200\n" "PO-Revision-Date: 2018-02-10 01:35+0200\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: fi\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.5.3\n" -#: templates/index.html:3 templates/internal/base.html:104 +#: templates/index.html:3 templates/internal/base.html:109 msgid "Home" msgstr "Alku" @@ -59,52 +59,54 @@ msgstr "Tietoa Fölin palveluista" msgid "Live Bus Traffic Nearby" msgstr "Lähistön reaaliaikainen bussiliikenne" -#: templates/timetables.html:10 -msgid "Busses Arriving Soon" -msgstr "Pian saapuvat bussit" - -#: templates/timetables.html:18 templates/timetables.html:53 +#: templates/map.html:28 templates/timetables.html:19 +#: templates/timetables.html:54 msgid "Line" msgstr "Linja" -#: templates/timetables.html:18 templates/timetables.html:54 +#: templates/map.html:28 templates/timetables.html:19 +#: templates/timetables.html:55 msgid "Destination" msgstr "Määränpää" -#: templates/timetables.html:19 +#: templates/map.html:29 templates/timetables.html:20 msgid "Time" msgstr "Aika" -#: templates/timetables.html:20 +#: templates/map.html:30 templates/timetables.html:21 msgid "ETA" msgstr "ETA" -#: templates/timetables.html:38 +#: templates/timetables.html:10 +msgid "Busses Arriving Soon" +msgstr "Pian saapuvat bussit" + +#: templates/timetables.html:39 msgid "Information last updated a minute ago" msgstr "Tiedot päivitetty viimeksi minuutti sitten" -#: templates/timetables.html:45 +#: templates/timetables.html:46 msgid "Today's Schedule" msgstr "Päivän aikataulu" -#: templates/timetables.html:55 templates/timetables.html:92 +#: templates/timetables.html:56 templates/timetables.html:93 msgid "Departure Time" msgstr "Lähtöaika" -#: templates/internal/base.html:86 templates/timetables.html:82 -#: templates/timetables.html:108 +#: templates/internal/base.html:91 templates/timetables.html:83 +#: templates/timetables.html:109 msgid "Close" msgstr "Sulje" -#: templates/timetables.html:91 +#: templates/timetables.html:92 msgid "Stop" msgstr "Pysäkki" -#: templates/internal/base.html:43 +#: templates/internal/base.html:45 msgid "Logo" msgstr "Logo" -#: templates/internal/base.html:56 +#: templates/internal/base.html:61 msgid "" "The content for this view is not available for your selected language, " "the contents are displayed below in their original language." @@ -112,33 +114,33 @@ msgstr "" "Tämän näkymän sisältöä ei ole saatavilla valitsemallasi kielellä, " "sisältö on alla alkuperäisellä kielellään." -#: templates/internal/base.html:74 +#: templates/internal/base.html:79 msgid "Opening external content" msgstr "Avataan ulkoista sisältöä" -#: templates/internal/base.html:80 +#: templates/internal/base.html:85 msgid "This content is available on an external site in the following address:" msgstr "Tämä sisältö on saatavilla ulkoisella sivustolla seuraavassa osoitteessa:" -#: templates/internal/base.html:82 +#: templates/internal/base.html:87 msgid "Please scan the below code to access it on your personal device:" msgstr "" "Ole hyvä ja skannaa alla oleva koodi henkilökohtaisella laitteellasi, " "avataksesi tämän sisällön:" -#: templates/internal/base.html:99 +#: templates/internal/base.html:104 msgid "Terms" msgstr "Termit" -#: templates/internal/base.html:109 +#: templates/internal/base.html:114 msgid "English" msgstr "Englanti" -#: templates/internal/base.html:110 +#: templates/internal/base.html:115 msgid "Finnish" msgstr "Suomi" -#: templates/internal/base.html:111 +#: templates/internal/base.html:116 msgid "Swedish" msgstr "Ruotsi"