diff --git a/scripts/google/Code.gs b/scripts/google/Code.gs new file mode 100644 index 0000000000000000000000000000000000000000..5233f8dd244f22d628e8568aaf0c12fa5f56faae --- /dev/null +++ b/scripts/google/Code.gs @@ -0,0 +1,60 @@ +// original from: http://mashe.hawksey.info/2014/07/google-sheets-as-a-database-insert-with-apps-script-using-postget-methods-with-ajax-example/ +// original gist: https://gist.github.com/willpatera/ee41ae374d3c9839c2d6 +// +// NOTE: this file is copied from above, with no functional changes, retained here for safe keeping as links tend to die sometimes +// Original Author: Hawksey M, 2014 + +function doGet(e){ + return handleResponse(e); +} + +// Enter sheet name where data is to be written below +var SHEET_NAME = "Sheet1"; +var SCRIPT_PROP = PropertiesService.getScriptProperties(); // new property service + +function handleResponse(e) { + // shortly after my original solution Google announced the LockService[1] + // this prevents concurrent access overwritting data + // [1] http://googleappsdeveloper.blogspot.co.uk/2011/10/concurrency-and-google-apps-script.html + // we want a public lock, one that locks for all invocations + var lock = LockService.getPublicLock(); + lock.waitLock(30000); // wait 30 seconds before conceding defeat. + + try { + // next set where we write the data - you could write to multiple/alternate destinations + var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty("key")); + var sheet = doc.getSheetByName(SHEET_NAME); + + // we'll assume header is in row 1 but you can override with header_row in GET/POST data + var headRow = e.parameter.header_row || 1; + var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]; + var nextRow = sheet.getLastRow()+1; // get next row + var row = []; + // loop through the header columns + for (i in headers){ + if (headers[i] == "Timestamp"){ // special case if you include a 'Timestamp' column + row.push(new Date()); + } else { // else use header name to get data + row.push(e.parameter[headers[i]]); + } + } + // more efficient to set values as [][] array than individually + sheet.getRange(nextRow, 1, 1, row.length).setValues([row]); + // return json success results + return ContentService + .createTextOutput(JSON.stringify({"result":"success", "row": nextRow})) + .setMimeType(ContentService.MimeType.JSON); + } catch(e){ + // if error return this + return ContentService + .createTextOutput(JSON.stringify({"result":"error", "error": e})) + .setMimeType(ContentService.MimeType.JSON); + } finally { //release lock + lock.releaseLock(); + } +} + +function setup() { + var doc = SpreadsheetApp.getActiveSpreadsheet(); + SCRIPT_PROP.setProperty("key", doc.getId()); +} diff --git a/static/css/stylesheet.css b/static/css/stylesheet.css index 8a6aa4312304efd60ea17ca03402d0b725bfa283..aa29b5814cb2baab037f312f52a3a3eb3f50eb2f 100644 --- a/static/css/stylesheet.css +++ b/static/css/stylesheet.css @@ -146,6 +146,15 @@ body { font-size: 1.1rem; } +/* make sure the about and qr code modal play nice */ +#aboutInfoModal { + z-index: 2000; +} + +#externalLinkModal { + z-index: 2001; +} + .lang-en { background-image: url("../img/gb.svg"); } diff --git a/static/img/feedback_placeholder.png b/static/img/feedback_placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..39a96bb94b041a98f3568d9c088759485aab8e7a Binary files /dev/null and b/static/img/feedback_placeholder.png differ diff --git a/static/img/teleste_logo.png b/static/img/teleste_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..21e659abc47eb9ff584ae07e2a38270ceb175fa0 Binary files /dev/null and b/static/img/teleste_logo.png differ diff --git a/static/img/utu_logo.png b/static/img/utu_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..221a30fe5c67f221a07353f18f83ec6305e3f5e8 Binary files /dev/null and b/static/img/utu_logo.png differ diff --git a/templates/feedback/index.html b/templates/feedback/index.html new file mode 100644 index 0000000000000000000000000000000000000000..8faf347052e3064bab8dd3cfc52045e47c515ad9 --- /dev/null +++ b/templates/feedback/index.html @@ -0,0 +1,228 @@ +{% extends 'internal/base.html' %} + +{% set title = _('Feedback') %} +{% set sticky_banners = g.is_kiosk %} +{% set localized = true %} + +{# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + # I take no credit whatsoever for the scripting that powers the # + # result collection behind this. Doing it this way was the best # + # option for a temporary feature on relatively short notice. # + # # + # Reference: https://gist.github.com/willpatera/ee41ae374d3c9839c2d6 # + # Our copy of the script can also be found under: /scripts/google # + # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #} + +{% block head %} + {{- super() }} + + <style> + /* Modified from: https://codepen.io/manabox/pen/raQmpL (License: MIT) */ + [type="radio"]:checked, + [type="radio"]:not(:checked) { + position: absolute; + left: -9999px; + } + [type="radio"]:checked + label, + [type="radio"]:not(:checked) + label { + position: relative; + padding-left: 28px; + cursor: pointer; + line-height: 20px; + display: inline-block; + color: #666; + } + [type="radio"]:checked + label:before, + [type="radio"]:not(:checked) + label:before { + content: ''; + position: absolute; + left: 0; + top: 0; + width: 18px; + height: 18px; + border: 1px solid #F7AC00; + border-radius: 100%; + background: #fff; + } + [type="radio"]:checked + label:after, + [type="radio"]:not(:checked) + label:after { + content: ''; + width: 12px; + height: 12px; + background: #F7AC00; + position: absolute; + top: 3px; + left: 3px; + border-radius: 100%; + -webkit-transition: all 0.2s ease; + transition: all 0.2s ease; + } + [type="radio"]:not(:checked) + label:after { + opacity: 0; + -webkit-transform: scale(0); + transform: scale(0); + } + [type="radio"]:checked + label:after { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } + </style> +{% endblock head %} + +{% block content %} + + <form id="google_sheets_form"> + <fieldset class="content-spaced"> + <h2 class="text-foli text-shadow">Smart Bus Stop <small class="text-dark pull-right">ICT Showroom {{ _("Feedback") }} - 8.3.2018</small></h2> + </fieldset> + + <div class="card border-foli box-shadow"> + <div class="card-body"> + <fieldset> + <legend class="text-foli" for="most_useful">{{ _("Which view of the application you find most useful?") }}</legend> + <div class="form-group" id="most_useful"> + <div class="form-check py-1"> + <input class="form-check-input" type="radio" name="most_useful" id="mu_opt1" value="Live Map" required> + <label class="form-check-label h5" for="mu_opt1">{{ _("Live Map") }}</label> + </div> + <div class="form-check py-1"> + <input class="form-check-input" type="radio" name="most_useful" id="mu_opt2" value="Timetables" required> + <label class="form-check-label h5" for="mu_opt2">{{ _("Timetables") }}</label> + </div> + <div class="form-check py-1"> + <input class="form-check-input" type="radio" name="most_useful" id="mu_opt3" value="Media feed" required> + <label class="form-check-label h5" for="mu_opt3">{{ _("Media Feed") }}</label> + </div> + <div class="form-check py-1"> + <input class="form-check-input" type="radio" name="most_useful" id="mu_opt4" value="Ticket prices" required> + <label class="form-check-label h5" for="mu_opt4">{{ _("Ticket Prices") }}</label> + </div> + <div class="form-check py-1"> + <input class="form-check-input" type="radio" name="most_useful" id="mu_opt5" value="Föli App" required> + <label class="form-check-label h5" for="mu_opt5">{{ _("Föli App") }}</label> + </div> + </div> + </fieldset> + + <fieldset> + <legend class="text-foli" for="least_useful">{{ _("Which view of the application you find least useful?") }}</legend> + <div class="form-group" id="least_useful"> + <div class="form-check py-1"> + <input class="form-check-input" type="radio" name="least_useful" id="lu_opt1" value="Live Map" required> + <label class="form-check-label h5" for="lu_opt1">{{ _("Live Map") }}</label> + </div> + <div class="form-check py-1"> + <input class="form-check-input" type="radio" name="least_useful" id="lu_opt2" value="Timetables" required> + <label class="form-check-label h5" for="lu_opt2">{{ _("Timetables") }}</label> + </div> + <div class="form-check py-1"> + <input class="form-check-input" type="radio" name="least_useful" id="lu_opt3" value="Media feed" required> + <label class="form-check-label h5" for="lu_opt3">{{ _("Media Feed") }}</label> + </div> + <div class="form-check py-1"> + <input class="form-check-input" type="radio" name="least_useful" id="lu_opt4" value="Ticket prices" required> + <label class="form-check-label h5" for="lu_opt4">{{ _("Ticket Prices") }}</label> + </div> + <div class="form-check py-1"> + <input class="form-check-input" type="radio" name="least_useful" id="lu_opt5" value="Föli App" required> + <label class="form-check-label h5" for="lu_opt5">{{ _("Föli App") }}</label> + </div> + </div> + </fieldset> + + <fieldset> + <legend class="text-foli" for="user_experience">{{ _("How do you rate the overall user experience?") }}</legend> + <div class="form-group" id="user_experience"> + <div class="form-check form-check-inline px-1"> + <input class="form-check-input" type="radio" name="user_experience" id="ux_opt1" value="1" required> + <label class="form-check-label h5" for="ux_opt1">1</label> + </div> + <div class="form-check form-check-inline px-1"> + <input class="form-check-input" type="radio" name="user_experience" id="ux_opt2" value="2" required> + <label class="form-check-label h5" for="ux_opt2">2</label> + </div> + <div class="form-check form-check-inline px-1"> + <input class="form-check-input" type="radio" name="user_experience" id="ux_opt3" value="3" required> + <label class="form-check-label h5" for="ux_opt3">3</label> + </div> + <div class="form-check form-check-inline px-1"> + <input class="form-check-input" type="radio" name="user_experience" id="ux_opt4" value="4" required> + <label class="form-check-label h5" for="ux_opt4">4</label> + </div> + <div class="form-check form-check-inline px-1"> + <input class="form-check-input" type="radio" name="user_experience" id="ux_opt5" value="5" required> + <label class="form-check-label h5" for="ux_opt5">5</label> + </div> + <div class="py-2"> + <div>1: {{ _("Very unpleasant") }}</div> + <div>5: {{ _("Very pleasant") }}</div> + </div> + </div> + </fieldset> + + <fieldset> + <legend class="text-foli" for="portability_value">{{ _("How important do you consider the ability to view the display contents on your personal device?") }}</legend> + <div class="form-group" id="portability_value"> + <div class="form-check form-check-inline px-1"> + <input class="form-check-input" type="radio" name="portability_value" id="pv_opt1" value="1" required> + <label class="form-check-label h5" for="pv_opt1">1</label> + </div> + <div class="form-check form-check-inline px-1"> + <input class="form-check-input" type="radio" name="portability_value" id="pv_opt2" value="2" required> + <label class="form-check-label h5" for="pv_opt2">2</label> + </div> + <div class="form-check form-check-inline px-1"> + <input class="form-check-input" type="radio" name="portability_value" id="pv_opt3" value="3" required> + <label class="form-check-label h5" for="pv_opt3">3</label> + </div> + <div class="form-check form-check-inline px-1"> + <input class="form-check-input" type="radio" name="portability_value" id="pv_opt4" value="4" required> + <label class="form-check-label h5" for="pv_opt4">4</label> + </div> + <div class="form-check form-check-inline px-1"> + <input class="form-check-input" type="radio" name="portability_value" id="pv_opt5" value="5" required> + <label class="form-check-label h5" for="pv_opt5">5</label> + </div> + <div class="py-2"> + <div>1: {{ _("Not important at all") }}</div> + <div>5: {{ _("Very important") }}</div> + </div> + </div> + </fieldset> + + <fieldset class="text-center"> + <button class="btn btn-lg btn-primary" type="submit" id="submit_form">{{ _("Submit") }}</button> + <div><small class="text-muted">{{ _("No personally identifiable data is collected through this form and the data can not be combined with other data sets.") }}</small></div> + </fieldset> + </div> + </div> + </form> + +{% endblock content %} + +{% block scripts %} + {{- super() }} + + <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-serialize-object/2.5.0/jquery.serialize-object.min.js" + integrity="sha256-E8KRdFk/LTaaCBoQIV/rFNc0s3ICQQiOHFT4Cioifa8=" crossorigin="anonymous"></script> + + <script> + $(document).ready(function () { + // this may require a GET request, because of browser security rules... + // POST would be ideal, however, since we are only sending numeric values it doesn't really matter + $('#google_sheets_form').submit(function(e) { + e.preventDefault(); + + $.ajax({ + url: 'https://script.google.com/macros/s/AKfycbwommSqVadXILec43hIyCbSgSyYY4T9a_h3qkt2RQ9xvn_ykEo/exec', + method: 'GET', + dataType: 'json', + data: $(this).serializeObject() + }).done(function() { + window.location.replace("{{ util.view_url('feedback/thanks') }}"); + }); + }); + }); + </script> +{% endblock scripts %} diff --git a/templates/feedback/thanks.html b/templates/feedback/thanks.html new file mode 100644 index 0000000000000000000000000000000000000000..7826d2a526d48c7e8020fd3b88b951eabeaf1032 --- /dev/null +++ b/templates/feedback/thanks.html @@ -0,0 +1,24 @@ +{% extends 'internal/base.html' %} + +{% set title = _('Feedback') %} +{% set sticky_banners = g.is_kiosk %} +{% set localized = true %} + +{% block head %} + {{- super() }} + + <meta http-equiv="refresh" content="3;url={{ util.home_url() }}" /> +{% endblock head %} + +{% block content %} + + <div class="card border-foli box-shadow"> + <div class="card-body"> + <h1 class="text-center">{{ _("Thank you for your feeback!") }}</h1> + <p class="text-center"> + <small class="text-muted">{{ _("You will be returned to the home screen automatically in a moment.") }}</small> + </p> + </div> + </div> + +{% endblock content %} \ No newline at end of file diff --git a/templates/index.html b/templates/index.html index 3f46acad1f67526a786dca2462c02c037a1d45f0..fbbf25f4758ab70172f608fb7b3ea2a04a1c3c8b 100644 --- a/templates/index.html +++ b/templates/index.html @@ -19,7 +19,7 @@ <div class="row mb-4"> <div class="col-md-5 offset-md-1 mb-4 mb-md-0"> <div class="card menu-card bg-foli text-center box-shadow"> - <img class="card-img-top" src="{{ util.static_url('img/map_placeholder.png') }}" alt="{{ _("Card Image") }}"> + <img class="card-img-top" src="{{ util.static_url('img/map_placeholder.png') }}" alt="{{ _('Card Image') }}"> <div class="card-body"> <a role="button" href="{{ util.view_url('map') }}" class="btn btn-lg btn-primary">{{ _("Live Map") }}</a> </div> @@ -27,7 +27,7 @@ </div> <div class="col-md-5"> <div class="card menu-card bg-foli text-center box-shadow"> - <img class="card-img-top" src="{{ util.static_url('img/timetables_placeholder.png') }}" alt="{{ _("Card Image") }}"> + <img class="card-img-top" src="{{ util.static_url('img/timetables_placeholder.png') }}" alt="{{ _('Card Image') }}"> <div class="card-body"> <a role="button" href="{{ util.view_url('timetables') }}" class="btn btn-lg btn-primary">{{ _("Timetables") }}</a> </div> @@ -37,17 +37,17 @@ <div class="row mb-4"> <div class="col-md-5 offset-md-1 mb-4 mb-md-0"> <div class="card menu-card bg-foli text-center box-shadow"> - <img class="card-img-top" src="{{ util.static_url('img/news_placeholder.png') }}" alt="{{ _("Card Image") }}"> + <img class="card-img-top" src="{{ util.static_url('img/news_placeholder.png') }}" alt="{{ _('Card Image') }}"> <div class="card-body"> - <a role="button" href="{{ util.view_url('info') }}" class="btn btn-lg btn-primary">{{ _("Media feed") }}</a> + <a role="button" href="{{ util.view_url('info') }}" class="btn btn-lg btn-primary">{{ _("Media Feed") }}</a> </div> </div> </div> <div class="col-md-5"> <div class="card menu-card bg-foli text-center box-shadow"> - <img class="card-img-top" src="{{ util.static_url('img/foli_placeholder.png') }}" alt="{{ _("Card Image") }}"> + <img class="card-img-top" src="{{ util.static_url('img/foli_placeholder.png') }}" alt="{{ _('Card Image') }}"> <div class="card-body"> - <a role="button" href="{{ util.view_url('foli') }}" class="btn btn-lg btn-primary">{{ _("Ticket prices") }}</a> + <a role="button" href="{{ util.view_url('foli') }}" class="btn btn-lg btn-primary">{{ _("Ticket Prices") }}</a> </div> </div> </div> @@ -55,14 +55,23 @@ <div class="row mb-4"> <div class="col-md-5 offset-md-1 mb-4 mb-md-0"> <div class="card menu-card bg-foli text-center box-shadow"> - <img class="card-img-top" src="{{ util.static_url('img/application_placeholder.png') }}" alt="{{ _("Card Image") }}"> + <img class="card-img-top" src="{{ util.static_url('img/application_placeholder.png') }}" alt="{{ _('Card Image') }}"> <div class="card-body"> <a role="button" href="{{ util.view_url('foli/app') }}" class="btn btn-lg btn-primary">{{ _("Föli App") }}</a> </div> </div> </div> <div class="col-md-5"> - <!--Empty spot for next menu card--> + {% if g.is_kiosk %} + <div class="card menu-card bg-foli text-center box-shadow"> + <img class="card-img-top" src="{{ util.static_url('img/feedback_placeholder.png') }}" alt="{{ _('Card Image') }}"> + <div class="card-body"> + <a role="button" href="{{ util.view_url('feedback') }}" class="btn btn-lg btn-primary">{{ _("Give Feedback") }}</a> + </div> + </div> + {% else %} + <!-- Feedback providing is only for kiosk mode --> + {% endif %} </div> </div> {% endblock content %} diff --git a/templates/internal/base.html b/templates/internal/base.html index c5393eb1c641d92d525fb203078e6be07f7d3b99..fdebc8cc49aabc9fa44a214a92f5af83fe2e1263 100644 --- a/templates/internal/base.html +++ b/templates/internal/base.html @@ -90,7 +90,7 @@ <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title text-foli" id="externalLinkModalLabel">{{ _("Opening external content") }}</h5> - <button type="button" class="close" data-dismiss="modal" aria-label="Close"> + <button type="button" class="close" data-dismiss="modal" aria-label="{{ _('Close') }}"> <span aria-hidden="true">×</span> </button> </div> @@ -108,13 +108,56 @@ </div> </div> + <div class="modal hide" id="aboutInfoModal" tabindex="-1" role="dialog" aria-labelledby="aboutInfoModalLabel" aria-hidden="true"> + <div class="vertical-align-wrapper"> + <div class="modal-dialog modal-lg vertical-align-center" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h5 class="modal-title text-foli" id="aboutInfoModalLabel">{{ _("Application Information") }}</h5> + <button type="button" class="close" data-dismiss="modal" aria-label="{{ _('Close') }}"> + <span aria-hidden="true">×</span> + </button> + </div> + <div class="modal-body p-3 px-5"> + <p>{{ _("This application has been developed as a part of a Capstone project at University of Turku. The Föli logo and color scheme used in this prototype are used with their permission. The GTFS and geolocation data used by this application is provided by Turun seudun joukkoliikenne / Turun kaupungin joukkoliikennetoimisto through an open API under the Creative Commons CC-BY 4.0 license.") }}</p> + + <!-- Links are in a list, because while pybabel has decent support for parameterized strings, when that is combined with jinja autoescaping it gets hairy fast --> + <ul class="list-unstyled" id="aboutLinks"> + <!-- TODO: add final privacy policy link --> + <li><a href="https://creativecommons.org/licenses/by/4.0/deed.{% if localized %}{{ g.lang_code }}{% else %}{{ content_lang }}{% endif %}">CC-BY 4.0</a></li> + <li><a href="http://data.foli.fi/doc/index">TSJL - Datarajapinta</a></li> + </ul> + + <h4>{{ _("Stakeholders") }}</h4> + + <div class="row my-3"> + <div class="col"> + <img src="{{ util.static_url('img/utu_logo.png') }}" class="img-fluid" alt="University of Turku"> + </div> + <div class="col"> + <img src="{{ util.static_url('img/teleste_logo.png') }}" class="img-fluid" alt="Teleste"> + </div> + </div> + + <small class="text-muted">{{ _("This application aggregates information from several sources, using open data or third party services, we take no responsibility on the accuracy of any such information authored by those third parties.") }}<small> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-primary" data-dismiss="modal">{{ _("Close") }}</button> + </div> + </div> + </div> + </div> + </div> + <footer class="d-flex flex-column footer {% if sticky_banners %}footer-sticky{% endif %} border border-foli"> {% block footer %} <!-- the actual home button is only kind of centered, try to "fix" it with padding (this is because the two side navs are different widths) --> <nav class="navbar navbar-expand-lg navbar-dark bg-dark justify-content-between flex-grow pr-5 pr-lg-3"> <ul class="navbar-nav mr-auto pr-lg-5"> <li class="nav-item"> - <a class="nav-link" href="#">{{ _("Terms") }}</a> + <a class="nav-link btn btn-lg btn-info font-weight-bold" href="#" data-toggle="modal" data-target="#aboutInfoModal" role="button"> + <i class="fa fa-info-circle" aria-hidden="true"></i> {{ _("About") }} + </a> </li> </ul> <ul class="navbar-nav mr-auto"> @@ -229,6 +272,8 @@ // start the clock timerHandler(); + + $('#aboutLinks').disableExternalLinks(); }); </script> {% endblock scripts %} diff --git a/templates/map.html b/templates/map.html index 39db1c248f23aa10ce8b41f3c27e70999593a4e0..e4084d995a26bb19a1807e738487389b97d962f4 100644 --- a/templates/map.html +++ b/templates/map.html @@ -20,8 +20,8 @@ </div> --> - <!-- Show next buses?? --> - <div class="card box-shadow border-foli content-spaced-lg"> + <!-- Show next buses --> + <div class="card box-shadow border-foli"> <div class="list-group list-group-flush"> <div class="list-group-item list-group-item-foli"> <div class="row"> @@ -43,6 +43,12 @@ </div> </div> + <div class="row content-spaced-lg"> + <div class="col text-center"> + <small class="text-shadow">{{ _("Information last updated: ") }} {{ util.time_short(server_time(isoDate = False, tz = stop_info.stop_timezone)) }}</small> + </div> + </div> + <!-- draw the map --> <div class="card border-foli box-shadow"> <div class="card-body p-0"> diff --git a/translations/en/LC_MESSAGES/messages.po b/translations/en/LC_MESSAGES/messages.po index 0cf6a7999029a670b2bf03470b64fc45d7d0f95e..7f7d832ab77b64b23f158e1f1fb46beac1630161 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-03-07 20:32+0200\n" +"POT-Creation-Date: 2018-03-08 06:11+0200\n" "PO-Revision-Date: 2018-02-10 01:33+0200\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: en\n" @@ -18,35 +18,44 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.5.3\n" -#: templates/index.html:3 templates/internal/base.html:122 +#: templates/index.html:3 templates/internal/base.html:165 msgid "Home" msgstr "" #: templates/index.html:22 templates/index.html:30 templates/index.html:40 -#: templates/index.html:48 templates/index.html:58 +#: templates/index.html:48 templates/index.html:58 templates/index.html:67 msgid "Card Image" msgstr "" +#: templates/feedback/index.html:87 templates/feedback/index.html:113 #: templates/index.html:24 templates/map.html:3 msgid "Live Map" msgstr "" +#: templates/feedback/index.html:91 templates/feedback/index.html:117 #: templates/index.html:32 templates/timetables.html:3 msgid "Timetables" msgstr "" +#: templates/feedback/index.html:95 templates/feedback/index.html:121 #: templates/index.html:42 -msgid "Media feed" +msgid "Media Feed" msgstr "" +#: templates/feedback/index.html:99 templates/feedback/index.html:125 #: templates/index.html:50 -msgid "Ticket prices" +msgid "Ticket Prices" msgstr "" +#: templates/feedback/index.html:103 templates/feedback/index.html:129 #: templates/index.html:60 msgid "Föli App" msgstr "" +#: templates/index.html:69 +msgid "Give Feedback" +msgstr "" + #: templates/map.html:18 msgid "Live Bus Traffic Nearby" msgstr "" @@ -112,8 +121,9 @@ msgstr "" msgid "(partial)" msgstr "" -#: templates/internal/base.html:104 templates/timetables.html:85 -#: templates/timetables.html:127 +#: templates/internal/base.html:93 templates/internal/base.html:104 +#: templates/internal/base.html:117 templates/internal/base.html:145 +#: templates/timetables.html:85 templates/timetables.html:127 msgid "Close" msgstr "" @@ -121,6 +131,63 @@ msgstr "" msgid "Stop" msgstr "" +#: templates/feedback/index.html:3 templates/feedback/index.html:77 +#: templates/feedback/thanks.html:3 +msgid "Feedback" +msgstr "" + +#: templates/feedback/index.html:83 +msgid "Which view of the application you find most useful?" +msgstr "" + +#: templates/feedback/index.html:109 +msgid "Which view of the application you find least useful?" +msgstr "" + +#: templates/feedback/index.html:135 +msgid "How do you rate the overall user experience?" +msgstr "" + +#: templates/feedback/index.html:158 +msgid "Very unpleasant" +msgstr "" + +#: templates/feedback/index.html:159 +msgid "Very pleasant" +msgstr "" + +#: templates/feedback/index.html:165 +msgid "" +"How important do you consider the ability to view the display contents on" +" your personal device?" +msgstr "" + +#: templates/feedback/index.html:188 +msgid "Not important at all" +msgstr "" + +#: templates/feedback/index.html:189 +msgid "Very important" +msgstr "" + +#: templates/feedback/index.html:195 +msgid "Submit" +msgstr "" + +#: templates/feedback/index.html:196 +msgid "" +"No personally identifiable data is collected through this form and the " +"data can not be combined with other data sets." +msgstr "" + +#: templates/feedback/thanks.html:17 +msgid "Thank you for your feeback!" +msgstr "" + +#: templates/feedback/thanks.html:19 +msgid "You will be returned to the home screen automatically in a moment." +msgstr "" + #: templates/internal/base.html:58 msgid "Logo" msgstr "" @@ -143,19 +210,44 @@ msgstr "" msgid "Please scan the below code to access it on your personal device:" msgstr "" -#: templates/internal/base.html:117 -msgid "Terms" +#: templates/internal/base.html:116 +msgid "Application Information" msgstr "" -#: templates/internal/base.html:127 +#: templates/internal/base.html:122 +msgid "" +"This application has been developed as a part of a Capstone project at " +"University of Turku. The Föli logo and color scheme used in this " +"prototype are used with their permission. The GTFS and geolocation data " +"used by this application is provided by Turun seudun joukkoliikenne / " +"Turun kaupungin joukkoliikennetoimisto through an open API under the " +"Creative Commons CC-BY 4.0 license." +msgstr "" + +#: templates/internal/base.html:131 +msgid "Stakeholders" +msgstr "" + +#: templates/internal/base.html:142 +msgid "" +"This application aggregates information from several sources, using open " +"data or third party services, we take no responsibility on the accuracy " +"of any such information authored by those third parties." +msgstr "" + +#: templates/internal/base.html:159 +msgid "About" +msgstr "" + +#: templates/internal/base.html:170 msgid "English" msgstr "" -#: templates/internal/base.html:128 +#: templates/internal/base.html:171 msgid "Finnish" msgstr "" -#: templates/internal/base.html:129 +#: templates/internal/base.html:172 msgid "Swedish" msgstr "" @@ -188,3 +280,6 @@ msgstr "" #~ msgid "Information last updated a minute ago" #~ msgstr "" +#~ msgid "Terms" +#~ msgstr "" + diff --git a/translations/fi/LC_MESSAGES/messages.po b/translations/fi/LC_MESSAGES/messages.po index 663ccee03bc3b0db17dc7bf5935cb64f378d7456..69cf7cd5e92b9d6410e2f1a77fb1a59d063ff296 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-03-07 20:32+0200\n" +"POT-Creation-Date: 2018-03-08 06:11+0200\n" "PO-Revision-Date: 2018-02-10 01:35+0200\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: fi\n" @@ -18,35 +18,44 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.5.3\n" -#: templates/index.html:3 templates/internal/base.html:122 +#: templates/index.html:3 templates/internal/base.html:165 msgid "Home" msgstr "Alku" #: templates/index.html:22 templates/index.html:30 templates/index.html:40 -#: templates/index.html:48 templates/index.html:58 +#: templates/index.html:48 templates/index.html:58 templates/index.html:67 msgid "Card Image" msgstr "Kortin kuva" +#: templates/feedback/index.html:87 templates/feedback/index.html:113 #: templates/index.html:24 templates/map.html:3 msgid "Live Map" msgstr "Reaaliaikanen kartta" +#: templates/feedback/index.html:91 templates/feedback/index.html:117 #: templates/index.html:32 templates/timetables.html:3 msgid "Timetables" msgstr "Aikataulut" +#: templates/feedback/index.html:95 templates/feedback/index.html:121 #: templates/index.html:42 -msgid "Media feed" -msgstr "Media virta" +msgid "Media Feed" +msgstr "Mediavirta" +#: templates/feedback/index.html:99 templates/feedback/index.html:125 #: templates/index.html:50 -msgid "Ticket prices" +msgid "Ticket Prices" msgstr "Lippuhinnat" +#: templates/feedback/index.html:103 templates/feedback/index.html:129 #: templates/index.html:60 msgid "Föli App" msgstr "Föli Äppi" +#: templates/index.html:69 +msgid "Give Feedback" +msgstr "Anna palautetta" + #: templates/map.html:18 msgid "Live Bus Traffic Nearby" msgstr "Lähistön reaaliaikainen bussiliikenne" @@ -115,8 +124,9 @@ msgstr "Linjan aikataulu" msgid "(partial)" msgstr "(osittainen)" -#: templates/internal/base.html:104 templates/timetables.html:85 -#: templates/timetables.html:127 +#: templates/internal/base.html:93 templates/internal/base.html:104 +#: templates/internal/base.html:117 templates/internal/base.html:145 +#: templates/timetables.html:85 templates/timetables.html:127 msgid "Close" msgstr "Sulje" @@ -124,6 +134,67 @@ msgstr "Sulje" msgid "Stop" msgstr "Pysäkki" +#: templates/feedback/index.html:3 templates/feedback/index.html:77 +#: templates/feedback/thanks.html:3 +msgid "Feedback" +msgstr "Palaute" + +#: templates/feedback/index.html:83 +msgid "Which view of the application you find most useful?" +msgstr "Mikä sovelluksen näkymistä on mielestäsi hyödyllisin?" + +#: templates/feedback/index.html:109 +msgid "Which view of the application you find least useful?" +msgstr "Mikä sovelluksen näkymistä on mielestäsi vähiten hyödyllinen?" + +#: templates/feedback/index.html:135 +msgid "How do you rate the overall user experience?" +msgstr "Miten arvioisit käyttökokemuksen kokonaisuutena?" + +#: templates/feedback/index.html:158 +msgid "Very unpleasant" +msgstr "Todella epämukava" + +#: templates/feedback/index.html:159 +msgid "Very pleasant" +msgstr "Todella mukava" + +#: templates/feedback/index.html:165 +msgid "" +"How important do you consider the ability to view the display contents on" +" your personal device?" +msgstr "" +"Kuinka tärkeäksi koet mahdollisuuden avata näytön sisältö omalla " +"laitteellasi?" + +#: templates/feedback/index.html:188 +msgid "Not important at all" +msgstr "En ollenkaan tärkeäksi" + +#: templates/feedback/index.html:189 +msgid "Very important" +msgstr "Hyvin tärkeäksi" + +#: templates/feedback/index.html:195 +msgid "Submit" +msgstr "Lähetä" + +#: templates/feedback/index.html:196 +msgid "" +"No personally identifiable data is collected through this form and the " +"data can not be combined with other data sets." +msgstr "" +"Tämä lomake ie kerää tietoja joiden avulla sinut voitaisiin tunnistaa ja " +"lomakkeen tietoja ei voida yhdistää suoraan muihin aineistoihin." + +#: templates/feedback/thanks.html:17 +msgid "Thank you for your feeback!" +msgstr "Kiitos palautteestasi!" + +#: templates/feedback/thanks.html:19 +msgid "You will be returned to the home screen automatically in a moment." +msgstr "Palaat aloitusnäkymään automaattisesti hetken kuluttua." + #: templates/internal/base.html:58 msgid "Logo" msgstr "Logo" @@ -150,19 +221,52 @@ msgstr "" "Ole hyvä ja skannaa alla oleva koodi henkilökohtaisella laitteellasi, " "avataksesi tämän sisällön:" -#: templates/internal/base.html:117 -msgid "Terms" -msgstr "Termit" +#: templates/internal/base.html:116 +msgid "Application Information" +msgstr "Tietoa sovelluksesta" + +#: templates/internal/base.html:122 +msgid "" +"This application has been developed as a part of a Capstone project at " +"University of Turku. The Föli logo and color scheme used in this " +"prototype are used with their permission. The GTFS and geolocation data " +"used by this application is provided by Turun seudun joukkoliikenne / " +"Turun kaupungin joukkoliikennetoimisto through an open API under the " +"Creative Commons CC-BY 4.0 license." +msgstr "" +"Tämä sovellus on kehitetty osana Capstone projektia Turun Yliopistossa. " +"Fölin logoa ja väripaletteja käytetään tässä prototyypissä heidän " +"luvallaan. Sovelluksen käyttämä GTFS ja geopaikannus aineistoa ylläpitää " +"Turun seudun joukkoliikenne / Turun kaupungin joukkoliikenne toimisto, " +"avoimen rajapinnan kautta Creative Commons CC-BY 4.0 lisenssin alla." + +#: templates/internal/base.html:131 +msgid "Stakeholders" +msgstr "Sidosryhmät" + +#: templates/internal/base.html:142 +msgid "" +"This application aggregates information from several sources, using open " +"data or third party services, we take no responsibility on the accuracy " +"of any such information authored by those third parties." +msgstr "" +"Tämä sovellus kokoaa informaatiota useasta lähteestä käyttäen avointa " +"dataa tai kolmannen osapuolen palveluita. Emme ota vastuuta näiden " +"osapuolien julkaisemien tietojen oikeellisuudesta." -#: templates/internal/base.html:127 +#: templates/internal/base.html:159 +msgid "About" +msgstr "" + +#: templates/internal/base.html:170 msgid "English" msgstr "Englanti" -#: templates/internal/base.html:128 +#: templates/internal/base.html:171 msgid "Finnish" msgstr "Suomi" -#: templates/internal/base.html:129 +#: templates/internal/base.html:172 msgid "Swedish" msgstr "Ruotsi" @@ -195,3 +299,6 @@ msgstr "Seuraava" #~ msgid "Information last updated a minute ago" #~ msgstr "Tiedot päivitetty viimeksi minuutti sitten" +#~ msgid "Terms" +#~ msgstr "Termit" +