From 439c7924acea1e1f626f9428bb1b07e38989028a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Sun, 22 Mar 2020 22:01:12 +0200 Subject: [PATCH 1/2] Update and extend documentation for new participants - Use "Fevermap" in a unified way everywhere. This was voted as the best variant of the name on hackathon Slack today. - Explain front-end and back-end, their difference and what skills are needed to contribute to them. - Extend the main README with easy steps how to participate. --- README.md | 50 ++++++++++++++++++++--- api/README.md | 18 ++++---- app/README.md | 31 +++++++------- app/src/assets/images/manifest.json | 6 +-- app/src/assets/language/translations.json | 26 ++++++------ app/src/index.html | 2 +- app/src/manifest.json | 4 +- index.html | 6 +-- 8 files changed, 92 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index 4c72cf0..dce452e 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,55 @@ -# The Fever Map +![Fevermap.net](https://gitlab.com/fevermap/fevermap/-/raw/master/app/src/assets/images/logo-slogan-large.png) -There is widespread distrust and confusion about the true number of COVID-19 patients out there. Most patients do not contact hospitals or clinics and never receive a diagnosis. Their number remains unknown to this day. It is important that these patients groups continue to leave health services alone so that they remain available for the patients that really need it. But this leaves us guessing the statistics, wondering at how many uncharted patients there really are. +# Fevermap -FeverMap is the answer to this need for clarity. An app that gathers anonymous data about its users’ fever and respiratory symptoms over the duration of their illness. The goal is to build a real-time map that displays the nations’ infection levels accurately and easily. -With FeverMap’s data, authorities can create appropriate plans of action and make information-based decisions that keep us one step ahead of the problem. Users can feel safer knowing what areas to avoid and know to exercise heightened caution in risk areas. +There is widespread distrust and confusion about the true number of COVID-19 patients out there. Most patients do not contact hospitals or clinics and never receive a diagnosis. Their number remains unknown to this day. It is important that these patients groups continue to leave health services alone so that they remain available for the patients that really need it. But this leaves us guessing the statistics, wondering at how many uncharted patients there really are. -We are proud to give you FeverMap, the future of tracking epidemic and pandemic diseases. +Fevermap is the answer to this need for clarity. An app that gathers anonymous data about its users’ fever and respiratory symptoms over the duration of their illness. The goal is to build a real-time map that displays the nations’ infection levels accurately and easily. +With Fevermap’s data, authorities can create appropriate plans of action and make information-based decisions that keep us one step ahead of the problem. Users can feel safer knowing what areas to avoid and know to exercise heightened caution in risk areas. ## How to participate? -Sign up at https://fevermap.net/ +To participate, just sign up at https://fevermap.net/ and use 1 minute once a day on the app. + +## How to collaborate? + +If you represent a health authority and would like to have this app deployed in your region, please send us email at [contact@fevermap.net](mailto:contact@fevermap.net). + +If you represent some other organization that could benefit of this, work on similar technology or for whatever reason want to collaborate, contact us by email on the address above. We are open to collaboration! ## How to contribute? +If you are an individual open source or open data minded person, we welcome you to contribute to this project! + +Ways to contribute from the easiest to harder: + +### 1. Help us gain more visibility + +Following our social media accounts and share our announcements: + +* Twitter: https://twitter.com/fevermap +* Instagram: https://www.instagram.com/fevermap/ +* Facebook: https://www.facebook.com/Fevermap-106608140981693/ + +### 2. Translate the app into your own language + +Check out the source code folder https://gitlab.com/fevermap/fevermap/-/blob/master/app/src/assets/language/ to see if your language is already there. If your language is missing, copy the `en.json` and replace the English strings with your local language, and submit it to us by email or as a Gitlab merge request. + +### 3. Get us in contact with your local national health authority + +Please research some good contacts to your own national health authority and make an introduction by sending an email to both them and us (contact@fevermap.net). From there we can easily pick up the discussion if they are interested. + +### 4. Help us with design and research + Browse issues at https://gitlab.com/groups/fevermap/-/issues and chip in the discussion! + +If you come across similar apps or initiatives, add them to the list in issue #1. If you want to help with the analysis and science, see issue #14. Discussion on what questions to ask is in #15, and UI design in #19 and marketing in #16. + +### 5. Help us with coding and implementation + +If you have HTML/CSS/JS skills, you can participate in front-end development. See `app/README.md` for details. + +If you have Python/Flask skills, you can participate in back-end development. See `api/README.md` for details. + +This is an open source project, so feel free to review the code, fix things you think are important and open a merge request for others to review. diff --git a/api/README.md b/api/README.md index e96205c..69cb2c0 100644 --- a/api/README.md +++ b/api/README.md @@ -1,14 +1,18 @@ -# Fever Map API +# Fevermap back-end (API) + +The back-end server is a simple Python Flask app with MariaDB database for storage. The back-end exposes an API at `https://fevermap.net/api/` which the front-end communicates with JSON calls. ## Development -The API is a simple Python Flask server with MariaDB backend. To spin up a local -development environment, simply run `docker-compose up --build`. The window will -keep displaying the logs from the environments. To abort, press Ctrl+C. If you -want to clear away the whole database volume before a fresh start, run -`docker-compose down --remove-orphans --volumes`. +To participate in the back-end development, you need Python skills and basic understanding of HTTP and JSON. + +To spin up a local development environment, simply run `docker-compose up +--build`. The window will keep displaying the logs from the environments. + +To abort, press Ctrl+C. If you want to clear away the whole database volume +before a fresh start, run `docker-compose down --remove-orphans --volumes`. -Then the development server is running, you can browse it at +When the development server is running, you can browse it at http://localhost:9000 or more importantly, run `curl` or other requests against the API. diff --git a/app/README.md b/app/README.md index 174ed06..979b2b1 100644 --- a/app/README.md +++ b/app/README.md @@ -1,50 +1,50 @@ -# Fever Map Frontend +# Fevermap front-end -Fever Map frontend folder. +The front-end is a [progressive web application](https://en.wikipedia.org/wiki/Progressive_web_application). While developing it you need to have NodeJS installed to generate the files, but the end result is a fully static package of HTML, CSS and JavaScript files. PWAs use modern web technologies to create a app like experience, so there is no need to do separate Android/IOS applications, as this one PWA application will serve all platforms. -Frontend is written with +In addition to the front-end, there is also a back-end server that receives and stores the data submitted (see folder `api`). The front-end and back-end communicate via a JSON API and there is no other coupling between them. + +This front-end is is written with - Lit Element - Webpack - Sass - ### Development To start the development environment, run `./run-server.sh` in the app directory. This will start a ES dev server and Webpack watcher for easy development. -The software will run on port 6006. - +The software will run on http://localhost:6006/. #### Creating a new Component -To create a new component, create a new javascript file to the `src/app/components` -folder. You need to import components so that the customElement gets defined, so make sure to import the component to at least the view it's used in. +To create a new component, create a new Java Script file in the folder `src/app/components`. You need to import components so that the `customElement` gets defined, so make sure to import the component to at least the view it's used in. #### Styling new components -To style a component, create a sass file named after the component to `src/assets/styles/components` and import it in the `imports.scss` -file. +To style a component, create a sass file named after the component to `src/assets/styles/components` and import it in the file `imports.scss`. The project uses SASS so any rules of SASS apply here. #### Using Material Components -The project has Material Components Web imported, meaning you can use components found [here](https://material-components.github.io/material-components-web-catalog/#/) +The project used [Material Components Web](https://material-components.github.io/material-components-web-catalog/#/) for some of the UI elements. #### Adding translations To add a translation in a new language, open the translation file in `src/assets/language` and add a new JSON object after the latest language object. -A easy work process is to copy the english translation object, paste it at the end of the array, and rename the `"en"` object to the wanted language. +A easy work process is to copy the English translation object, paste it at the end of the array, and rename the `"en"` object to the wanted language. -The language selector on the page takes care of adding the choice to change to given language so all you need to do is rewrite the translation values in the `translations.json` -file. +The language selector on the page takes care of adding the choice to change to given language so all you need to do is rewrite the translation values in the file `translations.json`. #### Contacting external API's -To keep logic seperated, API calls should be done in the Service -layer. +To keep logic separated, API calls should be done in the Service layer. -Create a service in the `src/app/services` -folder and do the API calls there. +Create a service in the folder `src/app/services` and do the API calls there. ### Building @@ -53,6 +53,5 @@ To build the project, run `npm run build` ### Writing Web Components / Lit HTML -[Polymer Project](https://lit-element.polymer-project.org/guide) has great resources about Lit Elements. - -[Open WC](https://open-wc.org/) has great info about Web Components \ No newline at end of file +- [Polymer Project](https://lit-element.polymer-project.org/guide) has great resources about Lit Elements. +- [Open WC](https://open-wc.org/) has great info about Web Components diff --git a/app/src/assets/images/manifest.json b/app/src/assets/images/manifest.json index e0a637f..5e18148 100644 --- a/app/src/assets/images/manifest.json +++ b/app/src/assets/images/manifest.json @@ -1,6 +1,6 @@ { - "name": "Fever Map", - "short_name": "Fever Map", + "name": "Fevermap", + "short_name": "Fevermap", "theme_color": "#2196f3", "background_color": "#2196f3", "display": "standalone", @@ -50,4 +50,4 @@ } ], "splash_pages": null -} \ No newline at end of file +} diff --git a/app/src/assets/language/translations.json b/app/src/assets/language/translations.json index a61d70f..711a191 100644 --- a/app/src/assets/language/translations.json +++ b/app/src/assets/language/translations.json @@ -2,7 +2,7 @@ "fi": { "lang_name": "Suomi", "language": "Kieli", - "fevermap_title": "Fever Map", + "fevermap_title": "Fevermap", "landing": { "about": "Tietoa", @@ -74,8 +74,8 @@ "dialog": { "pwa_installer": { - "title": "Asenna Fever Map", - "content": "Fever Map on mahdollista asentaa progressiivisen verkkosovelluksena. Asennettuna sovellus tarjoaa lisätoimintoja kuten parempaa suorituskykyä ja push notifikaatioita (tulossa pian).", + "title": "Asenna Fevermap", + "content": "Fevermap on mahdollista asentaa progressiivisen verkkosovelluksena. Asennettuna sovellus tarjoaa lisätoimintoja kuten parempaa suorituskykyä ja push notifikaatioita (tulossa pian).", "approve_text": "Asenna", "decline_text": "Ehkä myöhemmin" } @@ -85,7 +85,7 @@ "lang_name": "English", "language": "Language", - "fevermap_title": "Fever Map", + "fevermap_title": "Fevermap", "landing": { "about": "About", @@ -156,8 +156,8 @@ }, "dialog": { "pwa_installer": { - "title": "Install Fever Map", - "content": "Fever Map can be installed as a Progressive Web Application. If installed, we can provide you with great extra features like faster runtime and push notifications (coming soon).", + "title": "Install Fevermap", + "content": "Fevermap can be installed as a Progressive Web Application. If installed, we can provide you with great extra features like faster runtime and push notifications (coming soon).", "approve_text": "Install", "decline_text": "Maybe later" } @@ -168,16 +168,16 @@ "lang_name": "Svenska", "language": "Språk", - "fevermap_title": "Fever Map", + "fevermap_title": "Fevermap", "landing": { - "about": "Om Fever Map", - "about_title": "Vad är Fever Map?", + "about": "Om Fevermap", + "about_title": "Vad är Fevermap?", "about_content_explanation": "är en webbapplikation skapad för att samla in data om Covid-19 epidemin.", "about_current_methods": "Nuvarande metoder för att följa med Coronavirusets spridning ger inte en fullständig bild. Det tar för länge att testa alla, och det finns hur som helst inte testutrustning för det.", "about_solution": "Fevermap is the solution for this problem. With Fevermap, ordinary people around the world can anonymously self-report their fever and other symptoms. This means that we can estimate the true prevalence of COVID-19 infections in real-time and provide authorities with data that helps them make data-based, correct and timely decisions about protective measures.", - "about_data_collection": "Data som insamlas av Fever Map är anonyma och kommer att användas för att öka medvetenheten om den globala situationen.", - "about_current_participant_count": "Hittills har Fever Map samlat in rapporter från %{participantCount} personer.", + "about_data_collection": "Data som insamlas av Fevermap är anonyma och kommer att användas för att öka medvetenheten om den globala situationen.", + "about_current_participant_count": "Hittills har Fevermap samlat in rapporter från %{participantCount} personer.", "how_to_participate": "Hur kan jag delta?", "participation_info": "För att delta behöver du mäta din egen kroppstemperatur, och skicka in den tillsammans med annan information i datavyn.", @@ -239,8 +239,8 @@ }, "dialog": { "pwa_installer": { - "title": "Installera Fever Map", - "content": "Fever Map kan installeras som en Progressive Web App. Om du gör det fungerar appen smidigare, och vi kan ge tilläggstjänster som push-notifikationer (på kommande).", + "title": "Installera Fevermap", + "content": "Fevermap kan installeras som en Progressive Web App. Om du gör det fungerar appen smidigare, och vi kan ge tilläggstjänster som push-notifikationer (på kommande).", "approve_text": "Installera", "decline_text": "Kanske senare" } diff --git a/app/src/index.html b/app/src/index.html index 1be4dd9..74cba7f 100644 --- a/app/src/index.html +++ b/app/src/index.html @@ -26,7 +26,7 @@ - Fever Map + Fevermap diff --git a/app/src/manifest.json b/app/src/manifest.json index 6447467..91c3113 100644 --- a/app/src/manifest.json +++ b/app/src/manifest.json @@ -1,6 +1,6 @@ { - "name": "Fever Map", - "short_name": "Fever Map", + "name": "Fevermap", + "short_name": "Fevermap", "theme_color": "#2196f3", "background_color": "#2196f3", "display": "standalone", diff --git a/index.html b/index.html index 06fcdc7..50f1947 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ - Fever Map + Fevermap @@ -121,11 +121,11 @@
-

The Fever Map

+

The Fevermap

Current methods of tracking the spread of the Corona virus do not yield a complete picture. It is far too slow and cumbersome to test everybody, and there isn't enough tests anyway.

-

The Fever Map is an effort to fix this by having ordinary people around the world self-report their fever. Using biological population methods we can estimate the prevalence of COVID-19 infections in real-time and provide authorities with data that helps them fight the pandemic.

+

The Fevermap is an effort to fix this by having ordinary people around the world self-report their fever. Using biological population methods we can estimate the prevalence of COVID-19 infections in real-time and provide authorities with data that helps them fight the pandemic.

To participate, just sign up and use 1 minute once a day on the app.

-- GitLab From 2fd8708c1bc6766a4948be3dfb4612d8fc82b37b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Sun, 22 Mar 2020 23:33:26 +0200 Subject: [PATCH 2/2] Split translations.json into separate files for easier management If there is just one big translations.json, then every merge request from each translation contributor will always create a merge conflict. Having each file separate, makes management of the translations much more clean. It is also easier for translators to work with individual smaller files than one huge file. --- app/src/app/services/data-entry-service.js | 7 +- app/src/app/util/translator.js | 18 +- app/src/assets/language/en.json | 81 +++++++ app/src/assets/language/fi.json | 82 +++++++ app/src/assets/language/sv.json | 81 +++++++ app/src/assets/language/translations.json | 249 --------------------- 6 files changed, 263 insertions(+), 255 deletions(-) create mode 100644 app/src/assets/language/en.json create mode 100644 app/src/assets/language/fi.json create mode 100644 app/src/assets/language/sv.json delete mode 100644 app/src/assets/language/translations.json diff --git a/app/src/app/services/data-entry-service.js b/app/src/app/services/data-entry-service.js index c3a1e33..1033f05 100644 --- a/app/src/app/services/data-entry-service.js +++ b/app/src/app/services/data-entry-service.js @@ -1,7 +1,10 @@ import DBUtil, { QUEUED_ENTRIES } from '../util/db-util'; -const apiSubmitUrl = 'https://dev.fevermap.net/api/v0/submit'; -const apiDataUrl = 'https://dev.fevermap.net//api/v0/stats'; +/* @TODO: The apiBaseUrl should be derived from environment variable $URL */ +const apiBaseUrl = 'https://dev.fevermap.net'; + +const apiSubmitUrl = apiBaseUrl + '/api/v0/submit'; +const apiDataUrl = apiBaseUrl + '/api/v0/stats'; export default class DataEntryService { static async handleDataEntrySubmission(feverData, addToDbOnFail = true) { diff --git a/app/src/app/util/translator.js b/app/src/app/util/translator.js index f6f89cc..80810ac 100644 --- a/app/src/app/util/translator.js +++ b/app/src/app/util/translator.js @@ -1,5 +1,15 @@ import polyglot from 'node-polyglot'; -import translations from 'assets/language/translations'; + +/* Split each translation into a separate file for easier source code management */ +import translation_en from 'assets/language/en'; +import translation_fi from 'assets/language/fi'; +import translation_sv from 'assets/language/sv'; + +const translations = { + en: translation_en, + fi: translation_fi, + sv: translation_sv, +} export default class Translator { static getLang() { @@ -11,9 +21,9 @@ export default class Translator { } static setLang(lang) { - Translator.lang = lang ? lang.toLowerCase() : 'fi'; + Translator.lang = lang ? lang.toLowerCase() : 'en'; Translator._loadPhrases(); - document.querySelector('html').setAttribute('lang', lang ? lang.toLowerCase() : 'fi'); + document.querySelector('html').setAttribute('lang', lang ? lang.toLowerCase() : 'en'); } static _loadPhrases() { @@ -22,7 +32,7 @@ export default class Translator { static get(word, params) { if (!Translator.polyglot) { - Translator.setLang('fi'); + Translator.setLang('en'); } return Translator.polyglot.t(`${this.lang}.${word}`, params); } diff --git a/app/src/assets/language/en.json b/app/src/assets/language/en.json new file mode 100644 index 0000000..43df85c --- /dev/null +++ b/app/src/assets/language/en.json @@ -0,0 +1,81 @@ +{ + "lang_name": "English", + "language": "Language", + "fevermap_title": "Fevermap", + + "landing": { + "about": "About", + "about_title": "What is Fevermap?", + "about_content_explanation": " is a web and mobile application created for simple and real-time data collection of the prevalence of the Coronavirus COVID-19 pandemic.", + "about_current_methods": "Current methods of tracking the prevalence of the Corona virus do not yield a complete picture. Large masses remain untested to keep time and resources available for those in need.", + "about_solution": "Fevermap is the solution for this problem. With Fevermap, ordinary people around the world can anonymously self-report their fever and other symptoms. This means that we can estimate the true prevalence of COVID-19 infections in real-time and provide authorities with data that helps them make data-based, correct and timely decisions about protective measures.", + "about_data_collection": "The data collected by Fevermap is anonymized and will be used to help with raising awareness of the current global situation.", + "about_current_participant_count": "To this day, %{participantCount} users have used Fevermap to report their symptoms. ", + + "how_to_participate": "How do I participate?", + "participation_info": "It’s easy. You just take your temperature and feed the result – as well as a little statistical information, such as your birth year and area code – into the feed.", + "info_disclaimer": "We do not ask questions that could lead to you being recognized. We value your privacy and anonymity.", + + "how_will_my_data_be_used": "How will my data be used?", + "data_use_explanation": "The data will be anonymized, after which it will be shared as open data through API interface.." + }, + "entry": { + "data_entry": "Data entry", + "first_entry_disclaimer": "Entries are submitted into the database based on your device. We would appreciate that you submitted your information from the same device every time. This will allow us to monitor your fever status better.", + "last_submission": "Last submission", + "submission_period_disclaimer": "To prevent unnecessary data, submissions are restricted to once every 12 hours.", + "queued_entries": "You have %{queuedEntries} entries that haven't been yet synced with the server.", + "sync_now": "Sync now", + "questions": { + "do_you_have_fever": "Do you have fever at the moment?", + "yes": "Yes", + "no": "No", + "how_much": "How much?", + "degrees_of_fever": "%{degrees} of fever", + "not_measured": "Don't know exactly, not measured.", + "birth_year": "Birth year", + "birth_year_placeholder": "Year of birth (years 1900 - 2020)", + "gender_in_passport": "Gender as stated in your passport or other government records", + "male": "Male", + "female": "Female", + "location_information": "Location information", + "city": "City", + "country": "Country", + "postal_code": "Postal code", + "location_determination_subtitle": "Location is determined using location API. Make sure to allow location sensors.", + "location_change_subtitle": "To update location information, update the value in the country and postal code field or press the button below.", + "update_location": "Update location", + "use_gps": "Get location from GPS" + }, + "previous_submissions": "Previous submissions", + "submit": "Submit" + }, + + "stats": { + "stats": "Stats" + }, + + "system_messages": { + "success": { + "location_update": "Location updated successfully", + "data_entry": "Successfully submitted data entry", + "offline_entry_queued": "Seems like you are offline. Entry has been queued.", + "sync_finished": "Successfully synced entries." + }, + "error": { + "age_not_in_range": "Given birth year is not in the allowed range (1900 - 2020).", + "fever_temp_value_invalid": "The fever temperature value is not valid.", + "location_data_invalid": "The given location data is invalid.", + "api_data_invalid": "Data sent to the API was invalid.", + "gender_not_set": "Gender is not set." + } + }, + "dialog": { + "pwa_installer": { + "title": "Install Fevermap", + "content": "Fevermap can be installed as a Progressive Web Application. If installed, we can provide you with great extra features like faster runtime and push notifications (coming soon).", + "approve_text": "Install", + "decline_text": "Maybe later" + } + } +} diff --git a/app/src/assets/language/fi.json b/app/src/assets/language/fi.json new file mode 100644 index 0000000..54dac77 --- /dev/null +++ b/app/src/assets/language/fi.json @@ -0,0 +1,82 @@ +{ + "lang_name": "Suomi", + "language": "Kieli", + "fevermap_title": "Fevermap", + + "landing": { + "about": "Tietoa", + "about_title": "Mikä on Fevermap?", + "about_content_explanation": " on verkko- ja mobiiliapplikaatio, joka on luotu helppoa ja reaaliaikaista datakeruuta varten koskien koronavirus COVID-19-pandemian levinneisyyttä.", + "about_current_methods": "Nykyiset seurantamenetelmät koronaviruksen levinneisyydestä eivät tarjoa kokonaiskuvaa. Laajat ihmisjoukot jäävät testauksen ulkopuolelle, jotta ajan ja resurssien saatavuus pystytään takaamaan niitä tarvitseville.", + "about_solution": "Fevermap on ratkaisu ongelmaan. Fevermapin avulla, tavalliset ihmiset ympäri maailmaa voivat anonyymisti raportoida itse kuumeesta ja muista oireista. Tämä tarkoittaa sitä, että voimme arvioida COVID-19 -infektioiden todellisen laajuuden reaaliaikaisesti ja tarjota auktoriteeteille dataa, joka auttaa heitä tekemään tietoon perustuvia, oikeellisia ja hyvin ajoitettuja päätöksiä suojautumiseen liittyvistä asioista.", + "about_data_collection": "Fevermapin keräämä data on anonymisoity ja sitä käytetään tietoisuuden lisäämiseen globaalista tilanteesta.", + "about_current_participant_count": "Tähän päivään mennessä, %{participantCount} käyttäjää ovat käyttäneet Fevermapia raportoidakseen oireistaan", + + "how_to_participate": "Miten osallistun?", + "participation_info": "Se on helppoa. Mittaat vain lämpösi ja syötät mittarin antaman vastauksen – sekä joitain statistisia tietoja, kuten syntymävuotesi ja aluekoodisi – datan syöttönäkymään.", + "info_disclaimer": "Emme kysy kysymyksiä jotka johtaisivat siihen, että sinut tunnistettaisiin. Arvostamme yksityisyyttäsi ja anonymiteettiäsi.", + + "how_will_my_data_be_used": "Miten dataani tullaan käyttämään?", + "data_use_explanation": "Data anonymisoidaan, jonka jälkeen se jaetaan avoimena datana API-rajapinnan kautta." + }, + "entry": { + "data_entry": "Datan syöttö", + "first_entry_disclaimer": "Kirjaukset merkitään tietokantaan laitteen mukaan, jonka vuoksi toivomme, että syötät tietosi aina samalta laitteelta. Tällöin voimme seurata kuumetilasi kehittymistä paremmin.", + "last_submission": "Viimeisin kirjaus", + "submission_period_disclaimer": "Välttyäksemme turhalta datalta, kirjaukset on rajoitettu tehtäväksi kerran joka 12. tunti.", + "queued_entries": "Sinulla on %{queuedEntries} kirjausta, joita ei ole vielä synkronoitu serverin kanssa.", + "sync_now": "Synkronoi nyt", + "questions": { + "do_you_have_fever": "Onko sinulla kuumetta tällä hetkellä?", + "yes": "Kyllä", + "no": "Ei", + "how_much": "Paljonko?", + "degrees_of_fever": "%{degrees} astetta kuumetta", + "not_measured": "En tiedä tarkalleen, en ole mitannut.", + "birth_year": "Syntymävuosi", + "birth_year_placeholder": "Syntymävuosi (vuodet 1900 - 2020)", + "gender_in_passport": "Passissa tai muussa virallisessa dokumentissa merkitty sukupuoli.", + "male": "Mies", + "female": "Nainen", + "location_information": "Sijaintitiedot", + "city": "Kaupunki", + "country": "Maa", + "postal_code": "Postinumero", + "location_determination_subtitle": "Sijainti määritellään sijaintirajapintaa käyttäen. Sallithan sijaintitunnistimien käytön.", + "location_change_subtitle": "Päivittääksesi sijaintitiedot, päivitä tiedot maa- ja postinumerokentissä ja paina alla olevaa painiketta.", + "update_location": "Päivitä sijainti", + "use_gps": "Hae sijainti GPS avulla" + }, + "previous_submissions": "Viimeisimmät kirjaukset", + "submit": "Lähetä" + }, + + "stats": { + "stats": "Tilastot" + }, + + "system_messages": { + "success": { + "location_update": "Sijainti päivitetty onnistuneesti", + "data_entry": "Kirjaus lisätty onnistuneesti", + "offline_entry_queued": "Olet offline tilassa. Kirjaus lisätään jonoon.", + "sync_finished": "Onnistuneesti synkronoitu kirjaukset." + }, + "error": { + "age_not_in_range": "Syntymävuosi ei ole sallitussa haarukassa (1900 - 2020).", + "fever_temp_value_invalid": "Kuumeen määrä ei ole sallittu luku.", + "location_data_invalid": "Syötetty sijaintidata ei ole sallittu.", + "api_data_invalid": "Rajanpintaan lähetetty data ei ollut kelpaavaa.", + "gender_not_set": "Sukupuolta ei ole valittu." + } + }, + + "dialog": { + "pwa_installer": { + "title": "Asenna Fevermap", + "content": "Fevermap on mahdollista asentaa progressiivisen verkkosovelluksena. Asennettuna sovellus tarjoaa lisätoimintoja kuten parempaa suorituskykyä ja push notifikaatioita (tulossa pian).", + "approve_text": "Asenna", + "decline_text": "Ehkä myöhemmin" + } + } +} diff --git a/app/src/assets/language/sv.json b/app/src/assets/language/sv.json new file mode 100644 index 0000000..915e71b --- /dev/null +++ b/app/src/assets/language/sv.json @@ -0,0 +1,81 @@ +{ + "lang_name": "Svenska", + "language": "Språk", + "fevermap_title": "Fevermap", + + "landing": { + "about": "Om Fevermap", + "about_title": "Vad är Fevermap?", + "about_content_explanation": "är en webbapplikation skapad för att samla in data om Covid-19 epidemin.", + "about_current_methods": "Nuvarande metoder för att följa med Coronavirusets spridning ger inte en fullständig bild. Det tar för länge att testa alla, och det finns hur som helst inte testutrustning för det.", + "about_solution": "Fevermap is the solution for this problem. With Fevermap, ordinary people around the world can anonymously self-report their fever and other symptoms. This means that we can estimate the true prevalence of COVID-19 infections in real-time and provide authorities with data that helps them make data-based, correct and timely decisions about protective measures.", + "about_data_collection": "Data som insamlas av Fevermap är anonyma och kommer att användas för att öka medvetenheten om den globala situationen.", + "about_current_participant_count": "Hittills har Fevermap samlat in rapporter från %{participantCount} personer.", + + "how_to_participate": "Hur kan jag delta?", + "participation_info": "För att delta behöver du mäta din egen kroppstemperatur, och skicka in den tillsammans med annan information i datavyn.", + "info_disclaimer": "Vi ber inte om någon information som kan identifiera dig. Vi värnar om din integritet.", + + "how_will_my_data_be_used": "Hur kommer min data att användas?", + "data_use_explanation": "All data anonymiseras och delas som öppen data genom vår API." + }, + "entry": { + "data_entry": "Datainmatning", + "first_entry_disclaimer": "Dataposterna skickas in på basen av den dator eller telefon du använder. Vi skulle uppskatta om du kan använda samma apparat varje gång. Detta hjälper oss att följa sin febernivå bättre.", + "last_submission": "Senaste registrering", + "submission_period_disclaimer": "För att undvika onödiga data, så begränsas registreringar till var 12:e timme.", + "queued_entries": "Du has %{queuedEntries} registreringar som ännu inte har skickats in till servern.", + "sync_now": "Synkronisera nu", + "questions": { + "do_you_have_fever": "Har du feber just nu?", + "yes": "Ja", + "no": "Nej", + "how_much": "Hur hög?", + "degrees_of_fever": "%{degrees} grader feber", + "not_measured": "Vet inte, har inte mätt.", + "birth_year": "Födelseår", + "birth_year_placeholder": "Födelseår (från 1900 - 2020)", + "gender_in_passport": "Kön, som angivet i ditt pass eller annat officiellt dokument", + "male": "Man", + "female": "Kvinna", + "location_information": "Plats", + "city": "Stad", + "country": "Land", + "postal_code": "Postnummer", + "location_determination_subtitle": "Din plats hämtas genom plats-APIn, vänligen tillåt platsbestämning.", + "location_change_subtitle": "För att uppdatera platsinformation, välj land och skriv in ditt postnummer, eller tryck på knappen undertill.", + "update_location": "Uppdatera plats", + "use_gps": "Uppdatera plats genom GPS" + }, + "previous_submissions": "Tidigare registreringar", + "submit": "Skicka in" + }, + + "stats": { + "stats": "Statistik" + }, + + "system_messages": { + "success": { + "location_update": "Platsen uppdaterades", + "data_entry": "Registreringen lyckades", + "offline_entry_queued": "Det verkar som du är offline, registreringen är satt i kö.", + "sync_finished": "Synkroniseringen lyckades." + }, + "error": { + "age_not_in_range": "Ditt födelseår är inte i det tillåtna intervallet (1900 - 2020).", + "fever_temp_value_invalid": "Din febertemperatur är inte giltig.", + "location_data_invalid": "Den givna platset är inte giltig.", + "api_data_invalid": "Data som skickades var inte giltiga.", + "gender_not_set": "Du har inte valt kön." + } + }, + "dialog": { + "pwa_installer": { + "title": "Installera Fevermap", + "content": "Fevermap kan installeras som en Progressive Web App. Om du gör det fungerar appen smidigare, och vi kan ge tilläggstjänster som push-notifikationer (på kommande).", + "approve_text": "Installera", + "decline_text": "Kanske senare" + } + } +} diff --git a/app/src/assets/language/translations.json b/app/src/assets/language/translations.json deleted file mode 100644 index 711a191..0000000 --- a/app/src/assets/language/translations.json +++ /dev/null @@ -1,249 +0,0 @@ -{ - "fi": { - "lang_name": "Suomi", - "language": "Kieli", - "fevermap_title": "Fevermap", - - "landing": { - "about": "Tietoa", - "about_title": "Mikä on Fevermap?", - "about_content_explanation": " on verkko- ja mobiiliapplikaatio, joka on luotu helppoa ja reaaliaikaista datakeruuta varten koskien koronavirus COVID-19-pandemian levinneisyyttä.", - "about_current_methods": "Nykyiset seurantamenetelmät koronaviruksen levinneisyydestä eivät tarjoa kokonaiskuvaa. Laajat ihmisjoukot jäävät testauksen ulkopuolelle, jotta ajan ja resurssien saatavuus pystytään takaamaan niitä tarvitseville.", - "about_solution": "Fevermap on ratkaisu ongelmaan. Fevermapin avulla, tavalliset ihmiset ympäri maailmaa voivat anonyymisti raportoida itse kuumeesta ja muista oireista. Tämä tarkoittaa sitä, että voimme arvioida COVID-19 -infektioiden todellisen laajuuden reaaliaikaisesti ja tarjota auktoriteeteille dataa, joka auttaa heitä tekemään tietoon perustuvia, oikeellisia ja hyvin ajoitettuja päätöksiä suojautumiseen liittyvistä asioista.", - "about_data_collection": "Fevermapin keräämä data on anonymisoity ja sitä käytetään tietoisuuden lisäämiseen globaalista tilanteesta.", - "about_current_participant_count": "Tähän päivään mennessä, %{participantCount} käyttäjää ovat käyttäneet Fevermapia raportoidakseen oireistaan", - - "how_to_participate": "Miten osallistun?", - "participation_info": "Se on helppoa. Mittaat vain lämpösi ja syötät mittarin antaman vastauksen – sekä joitain statistisia tietoja, kuten syntymävuotesi ja aluekoodisi – datan syöttönäkymään.", - "info_disclaimer": "Emme kysy kysymyksiä jotka johtaisivat siihen, että sinut tunnistettaisiin. Arvostamme yksityisyyttäsi ja anonymiteettiäsi.", - - "how_will_my_data_be_used": "Miten dataani tullaan käyttämään?", - "data_use_explanation": "Data anonymisoidaan, jonka jälkeen se jaetaan avoimena datana API-rajapinnan kautta." - }, - "entry": { - "data_entry": "Datan syöttö", - "first_entry_disclaimer": "Kirjaukset merkitään tietokantaan laitteen mukaan, jonka vuoksi toivomme, että syötät tietosi aina samalta laitteelta. Tällöin voimme seurata kuumetilasi kehittymistä paremmin.", - "last_submission": "Viimeisin kirjaus", - "submission_period_disclaimer": "Välttyäksemme turhalta datalta, kirjaukset on rajoitettu tehtäväksi kerran joka 12. tunti.", - "queued_entries": "Sinulla on %{queuedEntries} kirjausta, joita ei ole vielä synkronoitu serverin kanssa.", - "sync_now": "Synkronoi nyt", - "questions": { - "do_you_have_fever": "Onko sinulla kuumetta tällä hetkellä?", - "yes": "Kyllä", - "no": "Ei", - "how_much": "Paljonko?", - "degrees_of_fever": "%{degrees} astetta kuumetta", - "not_measured": "En tiedä tarkalleen, en ole mitannut.", - "birth_year": "Syntymävuosi", - "birth_year_placeholder": "Syntymävuosi (vuodet 1900 - 2020)", - "gender_in_passport": "Passissa tai muussa virallisessa dokumentissa merkitty sukupuoli.", - "male": "Mies", - "female": "Nainen", - "location_information": "Sijaintitiedot", - "city": "Kaupunki", - "country": "Maa", - "postal_code": "Postinumero", - "location_determination_subtitle": "Sijainti määritellään sijaintirajapintaa käyttäen. Sallithan sijaintitunnistimien käytön.", - "location_change_subtitle": "Päivittääksesi sijaintitiedot, päivitä tiedot maa- ja postinumerokentissä ja paina alla olevaa painiketta.", - "update_location": "Päivitä sijainti", - "use_gps": "Hae sijainti GPS avulla" - }, - "previous_submissions": "Viimeisimmät kirjaukset", - "submit": "Lähetä" - }, - - "stats": { - "stats": "Tilastot" - }, - - "system_messages": { - "success": { - "location_update": "Sijainti päivitetty onnistuneesti", - "data_entry": "Kirjaus lisätty onnistuneesti", - "offline_entry_queued": "Olet offline tilassa. Kirjaus lisätään jonoon.", - "sync_finished": "Onnistuneesti synkronoitu kirjaukset." - }, - "error": { - "age_not_in_range": "Syntymävuosi ei ole sallitussa haarukassa (1900 - 2020).", - "fever_temp_value_invalid": "Kuumeen määrä ei ole sallittu luku.", - "location_data_invalid": "Syötetty sijaintidata ei ole sallittu.", - "api_data_invalid": "Rajanpintaan lähetetty data ei ollut kelpaavaa.", - "gender_not_set": "Sukupuolta ei ole valittu." - } - }, - - "dialog": { - "pwa_installer": { - "title": "Asenna Fevermap", - "content": "Fevermap on mahdollista asentaa progressiivisen verkkosovelluksena. Asennettuna sovellus tarjoaa lisätoimintoja kuten parempaa suorituskykyä ja push notifikaatioita (tulossa pian).", - "approve_text": "Asenna", - "decline_text": "Ehkä myöhemmin" - } - } - }, - "en": { - - "lang_name": "English", - "language": "Language", - "fevermap_title": "Fevermap", - - "landing": { - "about": "About", - "about_title": "What is Fevermap?", - "about_content_explanation": " is a web and mobile application created for simple and real-time data collection of the prevalence of the Coronavirus COVID-19 pandemic.", - "about_current_methods": "Current methods of tracking the prevalence of the Corona virus do not yield a complete picture. Large masses remain untested to keep time and resources available for those in need.", - "about_solution": "Fevermap is the solution for this problem. With Fevermap, ordinary people around the world can anonymously self-report their fever and other symptoms. This means that we can estimate the true prevalence of COVID-19 infections in real-time and provide authorities with data that helps them make data-based, correct and timely decisions about protective measures.", - "about_data_collection": "The data collected by Fevermap is anonymized and will be used to help with raising awareness of the current global situation.", - "about_current_participant_count": "To this day, %{participantCount} users have used Fevermap to report their symptoms. ", - - "how_to_participate": "How do I participate?", - "participation_info": "It’s easy. You just take your temperature and feed the result – as well as a little statistical information, such as your birth year and area code – into the feed.", - "info_disclaimer": "We do not ask questions that could lead to you being recognized. We value your privacy and anonymity.", - - "how_will_my_data_be_used": "How will my data be used?", - "data_use_explanation": "The data will be anonymized, after which it will be shared as open data through API interface.." - }, - "entry": { - "data_entry": "Data entry", - "first_entry_disclaimer": "Entries are submitted into the database based on your device. We would appreciate that you submitted your information from the same device every time. This will allow us to monitor your fever status better.", - "last_submission": "Last submission", - "submission_period_disclaimer": "To prevent unnecessary data, submissions are restricted to once every 12 hours.", - "queued_entries": "You have %{queuedEntries} entries that haven't been yet synced with the server.", - "sync_now": "Sync now", - "questions": { - "do_you_have_fever": "Do you have fever at the moment?", - "yes": "Yes", - "no": "No", - "how_much": "How much?", - "degrees_of_fever": "%{degrees} of fever", - "not_measured": "Don't know exactly, not measured.", - "birth_year": "Birth year", - "birth_year_placeholder": "Year of birth (years 1900 - 2020)", - "gender_in_passport": "Gender as stated in your passport or other government records", - "male": "Male", - "female": "Female", - "location_information": "Location information", - "city": "City", - "country": "Country", - "postal_code": "Postal code", - "location_determination_subtitle": "Location is determined using location API. Make sure to allow location sensors.", - "location_change_subtitle": "To update location information, update the value in the country and postal code field or press the button below.", - "update_location": "Update location", - "use_gps": "Get location from GPS" - }, - "previous_submissions": "Previous submissions", - "submit": "Submit" - }, - - "stats": { - "stats": "Stats" - }, - - "system_messages": { - "success": { - "location_update": "Location updated successfully", - "data_entry": "Successfully submitted data entry", - "offline_entry_queued": "Seems like you are offline. Entry has been queued.", - "sync_finished": "Successfully synced entries." - }, - "error": { - "age_not_in_range": "Given birth year is not in the allowed range (1900 - 2020).", - "fever_temp_value_invalid": "The fever temperature value is not valid.", - "location_data_invalid": "The given location data is invalid.", - "api_data_invalid": "Data sent to the API was invalid.", - "gender_not_set": "Gender is not set." - } - }, - "dialog": { - "pwa_installer": { - "title": "Install Fevermap", - "content": "Fevermap can be installed as a Progressive Web Application. If installed, we can provide you with great extra features like faster runtime and push notifications (coming soon).", - "approve_text": "Install", - "decline_text": "Maybe later" - } - } - }, - - "sv": { - - "lang_name": "Svenska", - "language": "Språk", - "fevermap_title": "Fevermap", - - "landing": { - "about": "Om Fevermap", - "about_title": "Vad är Fevermap?", - "about_content_explanation": "är en webbapplikation skapad för att samla in data om Covid-19 epidemin.", - "about_current_methods": "Nuvarande metoder för att följa med Coronavirusets spridning ger inte en fullständig bild. Det tar för länge att testa alla, och det finns hur som helst inte testutrustning för det.", - "about_solution": "Fevermap is the solution for this problem. With Fevermap, ordinary people around the world can anonymously self-report their fever and other symptoms. This means that we can estimate the true prevalence of COVID-19 infections in real-time and provide authorities with data that helps them make data-based, correct and timely decisions about protective measures.", - "about_data_collection": "Data som insamlas av Fevermap är anonyma och kommer att användas för att öka medvetenheten om den globala situationen.", - "about_current_participant_count": "Hittills har Fevermap samlat in rapporter från %{participantCount} personer.", - - "how_to_participate": "Hur kan jag delta?", - "participation_info": "För att delta behöver du mäta din egen kroppstemperatur, och skicka in den tillsammans med annan information i datavyn.", - "info_disclaimer": "Vi ber inte om någon information som kan identifiera dig. Vi värnar om din integritet.", - - "how_will_my_data_be_used": "Hur kommer min data att användas?", - "data_use_explanation": "All data anonymiseras och delas som öppen data genom vår API." - }, - "entry": { - "data_entry": "Datainmatning", - "first_entry_disclaimer": "Dataposterna skickas in på basen av den dator eller telefon du använder. Vi skulle uppskatta om du kan använda samma apparat varje gång. Detta hjälper oss att följa sin febernivå bättre.", - "last_submission": "Senaste registrering", - "submission_period_disclaimer": "För att undvika onödiga data, så begränsas registreringar till var 12:e timme.", - "queued_entries": "Du has %{queuedEntries} registreringar som ännu inte har skickats in till servern.", - "sync_now": "Synkronisera nu", - "questions": { - "do_you_have_fever": "Har du feber just nu?", - "yes": "Ja", - "no": "Nej", - "how_much": "Hur hög?", - "degrees_of_fever": "%{degrees} grader feber", - "not_measured": "Vet inte, har inte mätt.", - "birth_year": "Födelseår", - "birth_year_placeholder": "Födelseår (från 1900 - 2020)", - "gender_in_passport": "Kön, som angivet i ditt pass eller annat officiellt dokument", - "male": "Man", - "female": "Kvinna", - "location_information": "Plats", - "city": "Stad", - "country": "Land", - "postal_code": "Postnummer", - "location_determination_subtitle": "Din plats hämtas genom plats-APIn, vänligen tillåt platsbestämning.", - "location_change_subtitle": "För att uppdatera platsinformation, välj land och skriv in ditt postnummer, eller tryck på knappen undertill.", - "update_location": "Uppdatera plats", - "use_gps": "Uppdatera plats genom GPS" - }, - "previous_submissions": "Tidigare registreringar", - "submit": "Skicka in" - }, - - "stats": { - "stats": "Statistik" - }, - - "system_messages": { - "success": { - "location_update": "Platsen uppdaterades", - "data_entry": "Registreringen lyckades", - "offline_entry_queued": "Det verkar som du är offline, registreringen är satt i kö.", - "sync_finished": "Synkroniseringen lyckades." - }, - "error": { - "age_not_in_range": "Ditt födelseår är inte i det tillåtna intervallet (1900 - 2020).", - "fever_temp_value_invalid": "Din febertemperatur är inte giltig.", - "location_data_invalid": "Den givna platset är inte giltig.", - "api_data_invalid": "Data som skickades var inte giltiga.", - "gender_not_set": "Du har inte valt kön." - } - }, - "dialog": { - "pwa_installer": { - "title": "Installera Fevermap", - "content": "Fevermap kan installeras som en Progressive Web App. Om du gör det fungerar appen smidigare, och vi kan ge tilläggstjänster som push-notifikationer (på kommande).", - "approve_text": "Installera", - "decline_text": "Kanske senare" - } - } - } -} -- GitLab