diff --git a/.env b/.env new file mode 100644 index 0000000000..cc76126da4 --- /dev/null +++ b/.env @@ -0,0 +1,10 @@ +# This is the debug/dev .env file. Any debug or non-release-signed build will +# use these flags. + +# About flags: +# ------------ +# Any variables that start with flag_ will be available to the component +# For now, only true/1 is parsed, everything else will be interpretted as false +# flags must begin with flag_ and are case sensitive + +flag_google_import=true diff --git a/.env.beta b/.env.beta new file mode 100644 index 0000000000..74bf8bb522 --- /dev/null +++ b/.env.beta @@ -0,0 +1,11 @@ +# This is the BETA .env file, it is built for TestFlight and Google Play beta +# channels. Flags that are ready for testing/beta should be enabled here. + +# When making any BETA channel build on both iOS or Android, prepend the build +# command with ENVFILE=.env.beta +# +# e.g. +# +# ENVFILE=.env.beta ./gradlew assembleRelease + +# flag_google_import=true diff --git a/.env.release b/.env.release new file mode 100644 index 0000000000..241d3b1859 --- /dev/null +++ b/.env.release @@ -0,0 +1,5 @@ +# This is the release .env file, it is built for App store final releases +# only prod ready feature flags should be enabled here. +# +# For Android, this file is automatically used for any release build. iOS should +# prepend ENVFILE=.env.release before any build commands. diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 3e0d552210..25b99fe495 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -8,6 +8,8 @@ on: jobs: deploy: runs-on: ubuntu-latest + env: + ENVFILE: .env.release steps: - name: Checkout code uses: actions/checkout@v2 @@ -76,7 +78,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: ${{ steps.create_release.outputs.upload_url }} + upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: android/app/build/outputs/apk/release/app-release-unsigned-signed.apk asset_name: app-release-${{ github.ref }}.apk asset_content_type: application/zip diff --git a/App.js b/App.js index b8085e2af1..a142329fd5 100644 --- a/App.js +++ b/App.js @@ -1,17 +1,10 @@ -/** - * Sample React Native App - * https://github.com/facebook/react-native - * - * @format - * @flow - */ - import React, { useEffect } from 'react'; import { MenuProvider } from 'react-native-popup-menu'; import SplashScreen from 'react-native-splash-screen'; import { Theme } from './app/constants/themes'; import Entry from './app/Entry'; +import { FlagsProvider, buildTimeFlags } from './app/helpers/flags'; import VersionCheckService from './app/services/VersionCheckService'; const App = () => { @@ -21,11 +14,13 @@ const App = () => { }, []); return ( - - - - - + + + + + + + ); }; diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1e288b5ce7..5a58d8e3e3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,6 +3,7 @@ We welcome participation in an open project. We want to make it as easy as possible for people to work together, so please follow these guidelines to prepare and submit a pull request. - Filtering by [good first issues](https://github.com/tripleblindmarket/covid-safe-paths/labels/good%20first%20issue) is the recommended way to begin contributing to the project +- Localization/Language updates are handled in [Lokalise](https://lokalise.com/). More info on how to contribute [here](https://github.com/tripleblindmarket/covid-safe-paths/wiki/Localization-Contributing-Guidelines) ## Create A New Issue diff --git a/README.md b/README.md index 924892a307..16ecb0ea84 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ safe paths logo @@ -45,7 +45,7 @@ Safe Paths logs your device’s location once every five minutes and stores 28 d ### Downloads for COVID Safe Paths -_coming soon!_ +[Google Play](https://play.google.com/store/apps/details?id=org.pathcheck.covidsafepaths) | [Apple Store](https://apps.apple.com/us/app/covid-safe-paths/id1508266966) ### Downloads for Private Kit (technology beta) diff --git a/__mocks__/react-native-config.js b/__mocks__/react-native-config.js new file mode 100644 index 0000000000..fc22a2f5dc --- /dev/null +++ b/__mocks__/react-native-config.js @@ -0,0 +1,3 @@ +export default { + FLAG_FOO_BAR: 'true', +}; diff --git a/android/app/build.gradle b/android/app/build.gradle index 3d35299108..49679020ca 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,5 +1,12 @@ apply plugin: "com.android.application" +project.ext.envConfigFiles = [ + debug: ".env", + release: ".env.release", +] + +apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle" + import com.android.build.OutputFile /** diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro index 11b025724a..c1a7718b43 100644 --- a/android/app/proguard-rules.pro +++ b/android/app/proguard-rules.pro @@ -8,3 +8,6 @@ # http://developer.android.com/guide/developing/tools/proguard.html # Add any project specific keep options here: + +# react-native-config, prevents obfuscating of .env flags +-keep class org.pathcheck.covidsafepaths.BuildConfig { *; } diff --git a/android/app/src/main/res/values-ar/strings.xml b/android/app/src/main/res/values-ar/strings.xml new file mode 100644 index 0000000000..ef4d236250 --- /dev/null +++ b/android/app/src/main/res/values-ar/strings.xml @@ -0,0 +1,5 @@ + + + + إشعارات Safe Paths + diff --git a/android/app/src/main/res/values-da/strings.xml b/android/app/src/main/res/values-da/strings.xml new file mode 100644 index 0000000000..ac9eaed73d --- /dev/null +++ b/android/app/src/main/res/values-da/strings.xml @@ -0,0 +1,5 @@ + + + + Safe Paths notifikationer + diff --git a/android/app/src/main/res/values-it/strings.xml b/android/app/src/main/res/values-it/strings.xml index 634d728a24..9859979813 100644 --- a/android/app/src/main/res/values-it/strings.xml +++ b/android/app/src/main/res/values-it/strings.xml @@ -1,5 +1,5 @@ - Gestisci tutte le notifiche locali + Notifiche Safe Paths diff --git a/android/app/src/main/res/values-pt-rBR/strings.xml b/android/app/src/main/res/values-pt-rBR/strings.xml new file mode 100644 index 0000000000..9bc15459be --- /dev/null +++ b/android/app/src/main/res/values-pt-rBR/strings.xml @@ -0,0 +1,5 @@ + + + + Notícias Safe Paths + diff --git a/app/assets/svgs/close.js b/app/assets/svgs/close.js index f5308fc9cc..afebc1bc51 100644 --- a/app/assets/svgs/close.js +++ b/app/assets/svgs/close.js @@ -1,4 +1,6 @@ -export default ` - - -`; +export default ` + + + + +`; diff --git a/app/components/EulaModal.js b/app/components/EulaModal.js index 00fb87e67d..ba21a0e845 100644 --- a/app/components/EulaModal.js +++ b/app/components/EulaModal.js @@ -1,16 +1,17 @@ import React, { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { Image, Modal, StyleSheet, TouchableOpacity, View } from 'react-native'; +import { Modal, StyleSheet, View } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import WebView from 'react-native-webview'; -import closeIcon from '../assets/images/closeIcon.png'; +import close from '../assets/svgs/close'; import Colors from '../constants/colors'; import { Theme } from '../constants/themes'; import en_html from '../locales/eula/en_html'; import ht_html from '../locales/eula/ht_html'; import { Button } from './Button'; import { Checkbox } from './Checkbox'; +import { IconButton } from './IconButton'; import { Typography } from './Typography'; const EULA_FILES = { @@ -87,10 +88,14 @@ export const EulaModal = ({ selectedLocale, continueFunction }) => { - - setModalVisibility(false)}> - - + + setModalVisibility(false)} + /> ` which makes the default case easier: + * + * Usage: + * + * ``` + *
}> + * + *
+ * ``` + * + * @param {{ + * name: string; + * fallback?: () => import('react').ReactNode; + * children: import('react').ReactNode; + * }} param0 + */ +export const Feature = ({ name, fallback, children }) => { + const keyPath = name.split('.'); + + return ( + children} fallbackRender={fallback} /> + ); +}; diff --git a/app/components/IconButton.js b/app/components/IconButton.js new file mode 100644 index 0000000000..032c12ad33 --- /dev/null +++ b/app/components/IconButton.js @@ -0,0 +1,43 @@ +import styled from '@emotion/native'; +import React from 'react'; +import { SvgXml } from 'react-native-svg'; + +import { themeTextColor } from '../constants/themes'; + +/** + * A theme aware icon button + * + * @param {{ + * icon: SvgXml; + * accessibilityLabel: string; + * secondary?: boolean; + * size?: number; + * }} param0 + */ +export const IconButton = ({ + icon, + accessibilityLabel, + secondary, + size, + ...otherProps +}) => { + return ( + + + + ); +}; + +const Container = styled.TouchableOpacity` + align-items: center; + align-content: center; +`; + +const Icon = styled(SvgXml)` + color: ${themeTextColor}; +`; diff --git a/app/components/Typography.js b/app/components/Typography.js index 343318e5b6..66394c296a 100644 --- a/app/components/Typography.js +++ b/app/components/Typography.js @@ -2,6 +2,7 @@ import styled from '@emotion/native'; import { css } from '@emotion/native/dist/native.cjs.prod'; import * as React from 'react'; +import { themeTextColor } from '../constants/themes'; import { useLanguageDirection } from '../locales/languages'; export const Type = { @@ -89,9 +90,6 @@ const LINE_HEIGHT_MAP = { const getLineHeight = ({ use = Type.Body1 }) => LINE_HEIGHT_MAP[use]; -const getTextColor = ({ theme, secondary }) => - secondary ? theme.textSecondaryOnBackground : theme.textPrimaryOnBackground; - const getTextOpacity = ({ disabled }) => (disabled ? '0.25' : '1'); const getFontWeight = ({ use = Type.Body1, bold }) => @@ -104,7 +102,7 @@ const getFontFamily = ({ use, monospace, bold }) => { }; const ThemedText = styled.Text` - color: ${getTextColor}; + color: ${themeTextColor}; opacity: ${getTextOpacity}; font-family: ${getFontFamily}; font-size: ${getFontSize}; diff --git a/app/components/__tests__/Feature.spec.js b/app/components/__tests__/Feature.spec.js new file mode 100644 index 0000000000..4a37c8a842 --- /dev/null +++ b/app/components/__tests__/Feature.spec.js @@ -0,0 +1,78 @@ +import { render } from '@testing-library/react-native'; +import React from 'react'; +import { Text } from 'react-native'; + +import { FlagsProvider } from '../../helpers/flags'; +import { Feature } from '../Feature'; + +it('renders feature if the flag is enabled', () => { + const { asJSON } = render( + + + feature1 + + , + ); + + expect(asJSON()).toMatchSnapshot(); +}); + +it('allows dotted notation in the feature name', () => { + const { asJSON } = render( + + + feature1.child + + , + ); + + expect(asJSON()).toMatchSnapshot(); +}); + +it('does not render if dotted notation key path is falsy', () => { + const { asJSON } = render( + + + feature1.child + + , + ); + + expect(asJSON()).toMatchSnapshot(); +}); + +it('omits feature if the flag is disabled', () => { + const { asJSON } = render( + + + feature1 + + , + ); + + expect(asJSON()).toMatchSnapshot(); +}); + +it('omits feature if the flag is missing', () => { + const { asJSON } = render( + + + feature1 + + , + ); + + expect(asJSON()).toMatchSnapshot(); +}); + +it('renders the fallback instead, if the flag is disabled/omitted', () => { + const { asJSON } = render( + + Old UI}> + feature1 + + , + ); + + expect(asJSON()).toMatchSnapshot(); +}); diff --git a/app/components/__tests__/IconButton.spec.js b/app/components/__tests__/IconButton.spec.js new file mode 100644 index 0000000000..69fc77c9e1 --- /dev/null +++ b/app/components/__tests__/IconButton.spec.js @@ -0,0 +1,52 @@ +import { render } from '@testing-library/react-native'; +import React from 'react'; + +import { Theme } from '../../constants/themes'; +import { IconButton } from '../IconButton'; + +const svg = ``; + +it('renders the icon in a touchable opacity', () => { + const { asJSON } = render( + + + , + ); + + expect(asJSON()).toMatchSnapshot(); +}); + +it('allows size override', () => { + const { asJSON } = render( + + + , + ); + + expect(asJSON()).toMatchSnapshot(); +}); + +it('renders different color for secondary', () => { + const { asJSON } = render( + + + , + ); + + expect(asJSON()).toMatchSnapshot(); +}); + +it('changes color based on theme', () => { + const { asJSON } = render( + <> + + + + + + + , + ); + + expect(asJSON()).toMatchSnapshot(); +}); diff --git a/app/components/__tests__/__snapshots__/Feature.spec.js.snap b/app/components/__tests__/__snapshots__/Feature.spec.js.snap new file mode 100644 index 0000000000..497645a7d2 --- /dev/null +++ b/app/components/__tests__/__snapshots__/Feature.spec.js.snap @@ -0,0 +1,85 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`allows dotted notation in the feature name 1`] = ` + + + feature1.child + + +`; + +exports[`does not render if dotted notation key path is falsy 1`] = ` + +`; + +exports[`omits feature if the flag is disabled 1`] = ` + +`; + +exports[`omits feature if the flag is missing 1`] = ` + +`; + +exports[`renders feature if the flag is enabled 1`] = ` + + + feature1 + + +`; + +exports[`renders the fallback instead, if the flag is disabled/omitted 1`] = ` + + + Old UI + + +`; diff --git a/app/components/__tests__/__snapshots__/IconButton.spec.js.snap b/app/components/__tests__/__snapshots__/IconButton.spec.js.snap new file mode 100644 index 0000000000..9b339b05e8 --- /dev/null +++ b/app/components/__tests__/__snapshots__/IconButton.spec.js.snap @@ -0,0 +1,170 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`allows size override 1`] = ` + + + + + +`; + +exports[`changes color based on theme 1`] = ` + + + + + + + + +`; + +exports[`renders different color for secondary 1`] = ` + + + + + +`; + +exports[`renders the icon in a touchable opacity 1`] = ` + + + + + +`; diff --git a/app/constants/themes.js b/app/constants/themes.js index 9b11bf4360..d38226d56c 100644 --- a/app/constants/themes.js +++ b/app/constants/themes.js @@ -121,3 +121,9 @@ export const Theme = ({ use = 'default', setBackground = false, children }) => { ); }; + +/** + * @param {{theme: defaultTheme, secondary?: boolean}} param0 + */ +export const themeTextColor = ({ theme, secondary }) => + secondary ? theme.textSecondaryOnBackground : theme.textPrimaryOnBackground; diff --git a/app/helpers/flags.js b/app/helpers/flags.js new file mode 100644 index 0000000000..57b005a158 --- /dev/null +++ b/app/helpers/flags.js @@ -0,0 +1,28 @@ +import createFlags from 'flag'; +import env from 'react-native-config'; + +const { FlagsProvider, Flag, useFlag, useFlags } = createFlags(); + +/** + * Normalizes flags: + * + * Example: + * + * `{ flag_a: 'true' }` becomes `{ a: true }` + * + * @param {{[key: string]: string}} envConfig + */ +export function parseFlags(envConfig) { + return Object.entries(envConfig) + .filter(([key]) => key.toLowerCase().startsWith('flag')) + .reduce((flags, [key, value]) => { + const flag = key.replace(/^flag_/i, ''); + + flags[flag] = value === 'true' || value === '1'; + return flags; + }, {}); +} + +export const buildTimeFlags = parseFlags(env); + +export { FlagsProvider, Flag, useFlag, useFlags }; diff --git a/app/locales/ar.json b/app/locales/ar.json index 39b630b544..bc3cf7b82a 100644 --- a/app/locales/ar.json +++ b/app/locales/ar.json @@ -1,5 +1,13 @@ { "_display_name": "العربية", + "about": { + "dimensions": "الأبعاد:", + "operating_system_abbr": "نظام التشغيل:", + "version": "الإصدار:" + }, + "common": { + "done": "تم" + }, "history": { "no_exposure": "لم يتم التعرض", "possible_exposure": "التعرض محتمل", @@ -9,6 +17,19 @@ "what_if_no_symptoms": "ماذا لو لم تظهر الأعراض؟", "what_if_no_symptoms_para": "إذا لم يكن لديك أعراض ولكنك لا تزال ترغب في الاختبار ، يمكنك الذهاب إلى أقرب موقع اختبار. \n \n يمكن للأفراد الذين لا تظهر عليهم الأعراض أحيانًا حمل العدوى وإصابة الآخرين. إن توخي الحذر بشأن التباعد الاجتماعي والتواصل مع مجموعات كبيرة أو الأفراد المعرضين للخطر (كبار السن ، والذين يعانون من مشاكل طبية أخرى مهمة) مهم لإدارة كل من المخاطر الخاصة بك والمخاطر التي يتعرض لها الآخرون." }, + "import": { + "button_text": "تنزيل بيانات الموقع السابقة", + "google": { + "disclaimer": "لا يرتبط تطبيق Safe Paths بـ Google ولا تشارك بياناتك مطلقًا.", + "instructions_detailed": "قم بزيارة Google Takeout واحصل على سجل المواقع الخاص بك باستخدام الإعدادات التالية:\n1. طريقة التسليم: \"add to drive\"\n2. التكرار: \"export once\"\n3. نوع الملف وحجمه: \".zip\" و \"1 غيغابايت\"\n4. ترسل Google بريدًا إلكترونيًا عندما يكون البيانات جاهزه\n5. ارجع هنا لتنزيل بيانات المواقع. خيارات الاستيراد:\n- التنزيل من جوجل درايف\n- التنزيل من المتصفح ، ثم الاستيراد من ملفات الهاتف المحلية. تأكد من أن تكون على شبكة WiFi لأن الملفات يمكن أن تكون كبيرة.", + "instructions_first": "ستمنحك إضافة بيانات الموقع من Google السبق في معرفة مواقعك الأخيرة.", + "instructions_second": "قبل أن تتمكن من التنزيل ، يجب عليك أولاً \"إخراج\" بيانات موقعك من Google.", + "title": "خرائط جوجل", + "visit_button_text": "قم بزيارة Google Takeout" + }, + "subtitle": "لمعرفة ما إذا واجهت شخصًا لديه COVID-19 قبل تنزيل هذا التطبيق ، يمكنك تنزيل بيانات الموقع الشخصية.", + "title": "تنزيل بيانات الموقع" + }, "label": { "about_title": "نبذة عنا", "authorities_add_button_label": "إضافة هيئة صحية موثوقة", @@ -21,19 +42,22 @@ "authorities_removal_alert_proceed": "تقدم", "authorities_removal_alert_title": "إزالة الهيئة الموثوقة", "authorities_title": "هيئة موثوقة", + "auto_subscribe_checkbox": "تفعيل الاشتراك التلقائي", "choose_provider_subtitle": "لتكون على علم بالتعرض والانتشار ، ستحتاج إلى الاشتراك في هيئة صحية", "choose_provider_title": "اختر الهيئة الصحية", "commitment": "التزام", "commitment_para": "تسجل المسارات الآمنة بشكل آمن وتتحقق من تفاعلك مع الأشخاص الذين يستخدمون موقعك. لن تترك بياناتك هاتفك أبدًا بدون موافقتك", "default_news_site_name": "أخبار المسارات الآمنة", + "enter_authority_url": "أدخل أو الصق عنوان ال URL", "event_history_subtitle": "افهم تعرضك الشخصي بناءً على المعلومات التي تشاركها السلطات الصحية", "event_history_title": "سجلات التعرض", + "filter_authorities_by_gps_history": "اختار حسب مواقعك", "home_at_risk_header": "ربما تكون قد تعرضت", "home_at_risk_subsubtext": "هذا لا يعني أنك مصاب", "home_at_risk_subtext": "استنادًا إلى سجل GPS الخاص بك ، من المحتمل أنك كنت على اتصال أو قريبًا من شخص تم تشخيصه بـ COVID-19", "home_enable_location": "تفعيل خدمة الموقع", "home_mayo_link_heading": "مزيد من المعلومات عن COVID-19", - "home_mayo_link_label": " من (مايو كلينك) Mayo Clinic ", + "home_mayo_link_label": "من Mayo Clinic \"مايو كلينك\"", "home_no_contact_header": "لم يتم التعرض", "home_no_contact_subtext": "استنادًا إلى البيانات المتاحة ، لم تكن بالقرب من أي شخص تم الإبلاغ عنه إيجابيًا بـ COVID-19", "home_setting_off_header": "غير معروف", @@ -41,8 +65,12 @@ "home_unknown_header": "غير معروف", "home_unknown_subtext": "لا يمكننا معرفة ما إذا كنت معرضًا للخطر ما لم يكن للتطبيق حق الوصول إلى بيانات موقعك", "latest_news": "أحدث الأخبار", + "launch_authority_access": "اشترك في الهيئات الصحية القريبة", + "launch_authority_header": "ستقوم جهات الرعاية الصحية بتزويد جهازك بالبيانات المحلية لمعرفة ما إذا كنت قد تقاطعت مع شخص مصاب", + "launch_authority_subheader": "اشترك تلقائيًا لتلقي آخر التحديثات من جهات الرعاية الصحية في منطقتك.", "launch_done_header": "انتهينا", "launch_done_subheader": "أنت على استعداد لبدء التنفيذ.\n تذكر ، يمكنك دائمًا تحديث تفضيلاتك لاحقًا", + "launch_enable_auto_subscription": "تفعيل الاشتراك التلقائي", "launch_enable_location": "فعل تحديد الموقع", "launch_enable_notif": "فعل الإشعارات", "launch_finish_set_up": "إنهاء الإعداد", @@ -77,8 +105,29 @@ "push_at_risk_title": "قد تكون في خطر", "see_exposure_history": "إظهار بيانات التعرض", "settings_title": "لوحة القيادة", + "skip_this_step": "تخطي هذه الخطوة", "team": "الفريق", "team_para": "يتكون فريقنا من مجموعة من علماء الأوبئة والمهندسين وعلماء البيانات وأخصائيين الخصوصية الرقمية والأساتذة والباحثين من المؤسسات المرموقة ، بما في ذلك: MIT و Harvard و The Mayo Clinic و TripleBlind و EyeNetra و Ernst & Young و Link Ventures", "terms_of_use": "تعليمات الاستخدام" + }, + "onboarding": { + "eula_checkbox": "أوافق على اتفاقية الترخيص", + "eula_continue": "استمر", + "eula_message": "*يجب أن تقبل لاستخدام تطبيق Safe Paths " + }, + "share": { + "button_text": "مشاركة بيانات الموقع", + "paragraph_first": "إذا كانت نتيجة اختبار COVID-19 إيجابية ، فالرجاء القيام بدورك من خلال مشاركة سجل المواقع مع السلطات المحلية.", + "paragraph_second": "تتم مشاركة الموقع كقائمة بسيطة للأوقات والأماكن ، ولا توجد معلومات إضافية.", + "subtitle": "يمكن نقل بياناتك الخاصة إلى الهيئات الصحية أو نسخها احتياطيًا أو مشاركتها بأي طريقة أخرى.", + "title": "تفعيل خدمة الموقع" + }, + "version_update": { + "alert_label": "إصدار COVID Safe Paths قديم", + "alert_sublabel": "هل تريد التحديث إلى إصدار جديد؟", + "later": "في وقت لاحق", + "push_notification_message": "يرجى تحديث إصدار التطبيق الخاص بك", + "push_notification_title": "إصدار التطبيق قديم", + "update": "تحديث" } } diff --git a/app/locales/da.json b/app/locales/da.json new file mode 100644 index 0000000000..31c9386281 --- /dev/null +++ b/app/locales/da.json @@ -0,0 +1,147 @@ +{ + "_display_name": "Dansk", + "about": { + "dimensions": "Skærmopløsning:", + "operating_system_abbr": "OS:", + "version": "Version:" + }, + "common": { + "done": "Udført" + }, + "history": { + "no_exposure": "Ingen kendte", + "possible_exposure": "Mulig", + "possible_exposure_para": "Det er muligt, at du har været i kontakt med eller tæt på nogen, som er testet positiv for COVID-19.", + "what_does_this_mean": "Hvad betyder det?", + "what_does_this_mean_para": "Baseret på din placeringshistorik er det muligt, at du har været i kontakt med eller tæt på nogen, som er diagnosticeret med COVID-19. Det behøver ikke at betyde, at du selv er smittet, men at du kan være det.\n\nFor yderligere information om hvad du skal gøre, så kig på myndighedernes webside om Coronavirus/COVID-19 i Danmark: https://coronasmitte.dk", + "what_if_no_symptoms": "Hvad hvis jeg ikke har nogen symptomer?", + "what_if_no_symptoms_para": "Hvis du ikke har nogen symptomer, men alligevel gerne vil testes, så ring til din læge.\n\nPersoner, som ikke har nogen symptomer, kan alligevel godt være smittede og smitte andre. Det er vigtigt, at du er forsigtig med at holde afstand til andre og lader være med at komme i kontakt med større grupper og personer i risikogrupperne (fx ældre og personer med kroniske lidelser) for at beskytte dig selv og andre." + }, + "import": { + "button_text": "Importér tidligere placeringer", + "error": "Der gik noget galt med at importere dine data.", + "google": { + "already_imported": "Den valgte Takeout-fil er allerede importeret.", + "disclaimer": "Safe Paths har ingen tilknytning til Google og deler aldrig dine data.", + "file_open_error": "Filen kunne ikke åbnes. \nSørg for, at filen åbnes fra Google Drev.", + "instructions_detailed": "Besøg Google Takeout og eksportér din placeringshistorik med følgende indstillinger:\n1. Leveringsmetode: \"Tilføj til Drev\"\n2. Hyppighed: \"Eksporter én gang\"\n3. Filtype & -størrelse: \".zip\" og \"1GB\"\n4. Google sender en email til dig, når eksporten er klar\n5. Kom tilbage hertil for at importere placeringer fra Google Drev", + "instructions_first": "Ved at tilføje placeringsdata fra Google får du et forspring med at opbygge data, om hvor du har været for nyligt.", + "instructions_second": "Før du kan importere, skal du først hente dine placeringsdata fra Google Takeout.", + "invalid_file_format": "Det valgte filformat er ikke understøttet.\nUnderstøttede filformater: \".zip\".", + "no_recent_locations": "Takeout har ikke nogen nylige placeringsdata.", + "title": "Google Maps", + "visit_button_text": "Besøg Google Takeout" + }, + "subtitle": "For at se om du har været i nærheden af nogen med COVID-19, før du hentede denne app, kan du importere din personlige placeringshistorik.", + "success": "Det lykkedes at importere dine nylige placeringer!", + "title": "Importér placeringshistorik" + }, + "label": { + "about_title": "Om", + "authorities_add_button_label": "Tilføj betroet kilde", + "authorities_add_url": "Tilføj myndighed via URL", + "authorities_desc": "Vælg en eller flere sundhedsmyndigheder, du stoler på, i dit område for at få data om mulig udsættelse for COVID-19. Vælg enten et navn fra den globale oversigt eller angiv webadressen, som er stillet til rådighed af en myndighed, der har implementeret Safe Paths.", + "authorities_input_placeholder": "Indsæt din URL her", + "authorities_new_in_area_msg": "Tilmeld dig til {{count}} ny betroet sundhedsmyndighed i dit område", + "authorities_new_in_area_msg_plural": "Tilmeld dig til {{count}} nye betroede sundhedsmyndigheder i dit område", + "authorities_new_in_area_title": "Ny sundhedsmyndighed", + "authorities_new_in_area_title_plural": "Nye sundhedsmyndigheder", + "authorities_new_subcription_msg": "Du er tilmeldt til {{count}} ny myndighed i dit område", + "authorities_new_subcription_msg_plural": "Du er tilmeldt til {{count}} nye myndigheder i dit område", + "authorities_new_subcription_title": "{{count}} ny tilmelding", + "authorities_new_subcription_title_plural": "{{count}} nye tilmeldinger", + "authorities_no_sources": "Ingen datakilde valgt endnu", + "authorities_removal_alert_cancel": "Annullér", + "authorities_removal_alert_desc": "Er du sikker på, at du vil fjerne denne myndighedsdatakilde?", + "authorities_removal_alert_proceed": "Fortsæt", + "authorities_removal_alert_title": "Fjern myndighed", + "authorities_title": "Betroede kilder", + "auto_subscribe_checkbox": "Aktivér automatisk tilmelding", + "choose_provider_subtitle": "For at blive informeret om udsættelse for smitte er du nødt til at tilmelde dig en sundhedsmyndighed.", + "choose_provider_title": "Vælg sundhedsmyndighed", + "commitment": "Vi lover", + "commitment_para": "Safe Paths optager og undersøger din kontakt med andre mennesker ved brug af din placering på en sikker måde. Dine data forlader ALDRIG din telefon uden dit samtykke.", + "default_news_site_name": "Nyheder om Safe Paths", + "enter_authority_url": "Indtast eller indsæt URL", + "event_history_subtitle": "Forstå din egen eksponering for smitte ud fra data, som bliver delt med dig af sundhedsmyndigheder.", + "event_history_title": "Eksponeringshistorik", + "filter_authorities_by_gps_history": "Filtrér efter placering", + "home_at_risk_header": "Du har måske været udsat for smitte", + "home_at_risk_subsubtext": "Det betyder ikke nødvendigvis, at du selv er smittet.", + "home_at_risk_subtext": "Baseret på din placeringshistorik er det muligt, at du har været i kontakt med eller tæt på nogen, som er diagnosticeret med COVID-19.", + "home_enable_location": "Aktivér placeringsdata", + "home_mayo_link_heading": "Mere information om COVID-19", + "home_mayo_link_label": "fra Mayo Clinic", + "home_no_contact_header": "Ingen kendt kontakt", + "home_no_contact_subtext": "Baseret på tilgængelige data har du ikke være i nærheden af nogen, som er testet positive med COVID-19.", + "home_setting_off_header": "Ukendt", + "home_setting_off_subtext": "Vi kan ikke fortælle dig, om du har været i nærheden af smittede personer, medmindre du aktiverer placeringshistorik i indstillingerne.", + "home_unknown_header": "Ukendt", + "home_unknown_subtext": "Vi kan ikke fortælle dig, om du har været i nærheden af smittede personer, medmindre du giver applikationen adgang til din placering.", + "latest_news": "Seneste nyheder", + "launch_authority_access": "Tilmeld dig sundhedsmyndigheder i dit område", + "launch_authority_header": "Sundhedsmyndigheder vil levere lokale data til din enhed, så du kan få at vide, om du har været i nærheden af en person, som er smittet.", + "launch_authority_subheader": "Meld dig automatisk til at modtage de seneste opdateringer fra sundhedsmyndigheder i dit område.", + "launch_done_header": "Alt udført", + "launch_done_subheader": "Nu er du klar. Husk, at du altid kan ændre dine indstillinger senere.", + "launch_enable_auto_subscription": "Aktivér automatisk tilmelding", + "launch_enable_location": "Aktivér placering", + "launch_enable_notif": "Aktivér notifikationer", + "launch_finish_set_up": "Afslut opsætning", + "launch_get_started": "Lad os komme i gang", + "launch_location_access": "Adgang til placering", + "launch_location_header": "For at huske, hvor du har været, har din telefon brug for at gemme din placering.", + "launch_location_subheader": "Bare rolig. Informationerne forlader aldrig din enhed, medmindre du selv vælger at dele dem.", + "launch_next": "Næste", + "launch_notif_header": "Notifikationer fortæller dig, om du har været i nærheden af en smittet person.", + "launch_notif_subheader": "Vi vil ikke genere dig med notifikationer, medmindre det er for at fortælle dig om mulig udsættelser for smitte.", + "launch_notification_access": "Tillad notifikationer", + "launch_screen1_header": "Vejen tilbage til en normal tilværelse begynder her.", + "launch_screen2_header": "Få besked, hvis du har været i nærheden af nogen, som senere bliver diagnosticeret med COVID-19.", + "launch_screen2_subheader": "Viden er vores styrke.", + "launch_screen3_header": "Hvis du selv bliver testet positiv, kan du vælge at donere dine data anonymt", + "launch_screen3_subheader": "Det hjælper med til at holde vores samfund sikkert.", + "launch_screen4_header": "Du har fuld kontrol. Data bliver udelukkende gemt på din telefon.", + "launch_screen4_subheader": "Hvis du bliver testet positiv, så er det kun dig der kan beslutte om du vil dele den viden.", + "launch_set_up_phone": "Gør min telefon klar", + "legal_page_title": "Juridisk", + "loading_public_data": "henter data…", + "location_disabled_message": "COVID Safe Paths kræver placeringstjenester.", + "location_disabled_title": "Placeringssporing blev slået fra", + "location_enabled_message": "COVID Safe Paths gemmer på sikker vis dine GPS koordinater på din enhed hvert femte minut.", + "location_enabled_title": "COVID Safe Paths er slået til", + "logging_active": "Placering aktiv", + "logging_inactive": "Placering inaktiv", + "news_subtitle": "Læs de seneste opdateringer om COVID-19 fra dine sundhedsmyndigheder og fra andre kilder.", + "news_title": "Seneste nyheder", + "no_data": "Ingen data", + "push_at_risk_message": "Du har været i nærheden af en COVID-19-patient", + "push_at_risk_title": "Du er muligvis i risiko", + "see_exposure_history": "Se eksponeringshistorik", + "settings_title": "Overblik", + "skip_this_step": "Spring dette trin over", + "team": "Holdet", + "team_para": "Holdet bag denne applikation består af et konsortium af epidemiologer, ingeniører, dataloger, privatlivseksperter, professorer og forskere fra velrenommerede institutioner herunder: MIT, Harvard, The Mayo Clinic, TripleBlind, EyeNetra, Ernst & Young og Link Ventures.", + "terms_of_use": "Vilkår for brug" + }, + "onboarding": { + "eula_checkbox": "Jeg accepterer licensaftalen", + "eula_continue": "Fortsæt", + "eula_message": "*Du skal acceptere for at kunne bruge Safe Paths" + }, + "share": { + "button_text": "Del placeringsdata", + "paragraph_first": "Hvis du bliver testet positiv for COVID-19, så vær venlig at hjælpe dine lokale sundhedsmyndigheder ved at dele din placeringshistorik.", + "paragraph_second": "Dine placeringer vil blive delt som en simpel liste bestående af tidspunkter og steder og intet andet.", + "subtitle": "Dine private data kan overføres til sundhedsmyndigheder, sikkerhedskopieres eller på anden vis deles.", + "title": "Del placeringshistorik" + }, + "version_update": { + "alert_label": "COVID Safe Paths er for gammel", + "alert_sublabel": "Opdatér til en ny version?", + "later": "Senere", + "push_notification_message": "Opdatér venligst din applikation", + "push_notification_title": "Applikationen er for gammel", + "update": "Opdatér" + } +} diff --git a/app/locales/en.json b/app/locales/en.json index 223f814119..dc4e8a3882 100644 --- a/app/locales/en.json +++ b/app/locales/en.json @@ -19,21 +19,21 @@ }, "import": { "button_text": "Import past locations", + "error": "Something went wrong while importing your data.", "google": { + "already_imported": "Provided Takeout file has already been imported.", "disclaimer": "Safe Paths has no affiliation with Google and never shares your data.", + "file_open_error": "Could not open the file. \nPlease, make sure the file is opened from Google Drive", "instructions_detailed": "Visit Google Takeout and export your Location History using the following settings: \n1. Delivery method: \"Add to Drive\" \n2. Frequency: \"Export once\" \n3. File type & size: \".zip\" and \"1GB\"\n4. Google sends an email when the export is ready \n5. Return here to import locations from Google Drive", "instructions_first": "Adding location data from Google will give you a head start on building your recent locations.", "instructions_second": "Before you can import, you must first \"Take out\" your location data from Google.", - "title": "Google Maps", - "visit_button_text": "Visit Google Takeout", - "already_imported":"Provided Takeout file has already been imported.", - "no_recent_locations": "Takeout doesn't have any recent locations.", "invalid_file_format": "Provided file format is not supported. \nSupported formats: \".zip\".", - "file_open_error": "Could not open the file. \nPlease, make sure the file is opened from Google Drive" + "no_recent_locations": "Takeout doesn't have any recent locations.", + "title": "Google Maps", + "visit_button_text": "Visit Google Takeout" }, - "success":"Recent locations has been successfully imported!", - "error":"Something went wrong while importing your data.", "subtitle": "To see if you encountered someone with COVID-19 prior to downloading this app, you can import your personal location history.", + "success": "Recent locations has been successfully imported!", "title": "Import Locations" }, "label": { diff --git a/app/locales/fr.json b/app/locales/fr.json index a55d4457a7..8dab6e7715 100644 --- a/app/locales/fr.json +++ b/app/locales/fr.json @@ -2,12 +2,17 @@ "_display_name": "Français", "import": { "button_text": "Importer les positions passées", + "error": "Un erreur s'est produite lors de l'importation de vos données.", "google": { + "already_imported": "Le fichier Takeout fourni a déjà été importé.", "disclaimer": "L’application Safe Paths n’est pas affiliée à Google et ne partage jamais vos données.", + "invalid_file_format": "Le format de fichier fourni n'est pas supporté. \n Formats supportés: \".zip\".", + "no_recent_locations": "Takeout n'a pas de positions récentes.", "title": "Google Maps", "visit_button_text": "Accédez à Google Takeout" }, "subtitle": "Vous pouvez importer votre historique personnel de position pour voir si vous avez croisé une personne infectée avant d’avoir téléchargé cette application.", + "success": "Les positions récentes ont été importées!", "title": "Importer les positions" }, "label": { diff --git a/app/locales/it.json b/app/locales/it.json index 69fa44e69d..7665393698 100644 --- a/app/locales/it.json +++ b/app/locales/it.json @@ -19,15 +19,21 @@ }, "import": { "button_text": "Importa lo storico delle posizioni", + "error": "Si è verificato un errore durante l'importazione dei dati.", "google": { + "already_imported": "Il file Takeout fornito è già stato importato.", "disclaimer": "Safe Paths non ha alcuna affiliazione a Google e non condivide mai i tuoi dati.", - "instructions_detailed": "Visita Google Takeout ed esporta la tua Cronologia delle posizioni utilizzando le seguenti impostazioni: \n1. Metodo di consegna: \"Aggiungi a Drive\" \n2. Frequenza: \"Esporta una volta\" \n3. Tipo e dimensione del file: \".zip\" e \"1 GB\" \n4. Google ti invierà un'email quando l'esportazione è pronta \n5. Ritorna qui per importare le posizioni. Opzioni d'importazione: \n- Importa da Google Drive \n- Scarica dal browser, quindi importa il file dal tuo telefono. Assicurati di avere una connessione Wi-Fi attiva, poiché i file possono essere di grandi dimensioni.", + "file_open_error": "Impossibile aprire il file. \nAssicurati che il file sia aperto da Google Drive", + "instructions_detailed": "Visita Google Takeout ed esporta la tua Cronologia delle posizioni utilizzando le seguenti impostazioni: \n1. Metodo di consegna: \"Aggiungi a Drive\" \n2. Frequenza: \"Esporta una volta\" \n3. Tipo e dimensione del file: \".zip\" e \"1 GB\" \n4. Google ti invierà un'email quando l'esportazione è pronta \n5. Ritorna qui per importare le posizioni", "instructions_first": "L'aggiunta dei dati di localizzazione di Google ti aiuterà a costruzione un primo storico delle tue posizioni recenti.", "instructions_second": "Prima di poter importare i dati, devi effettuare il \"Take out\" dello storico delle tue geolocalizzazioni da Google.", + "invalid_file_format": "Il formato del file fornito non è supportato. \nFormati supportati: \".zip\".", + "no_recent_locations": "Takeout non ha posizioni recenti.", "title": "Google Maps", "visit_button_text": "Visita Google Takeout" }, "subtitle": "Per capire se hai incontrato una persona positiva al COVID-19 prima di scaricare questa applicazione, puoi importare lo storico delle tue posizioni.", + "success": "Le posizioni recenti sono state importate con successo!", "title": "Importa posizioni" }, "label": { diff --git a/app/locales/languages.js b/app/locales/languages.js index d98a1b6805..427d7ebc31 100644 --- a/app/locales/languages.js +++ b/app/locales/languages.js @@ -9,6 +9,7 @@ import { NativeModules, Platform } from 'react-native'; import { LANG_OVERRIDE } from '../constants/storage'; import { GetStoreData, SetStoreData } from '../helpers/General'; import ar from './ar.json'; +import da from './da.json'; import en from './en.json'; import es from './es.json'; import fil from './fil.json'; @@ -73,6 +74,7 @@ export async function setUserLocaleOverride(locale) { const DEV_LANGUAGES = __DEV__ ? { ar: { label: ar._display_name, translation: ar }, + da: { label: da._display_name, translation: da }, es: { label: es._display_name, translation: es }, fil: { label: fil._display_name, translation: fil }, fr: { label: fr._display_name, translation: fr }, diff --git a/app/locales/ml.json b/app/locales/ml.json index 78ed5e24d5..a12f5f633c 100644 --- a/app/locales/ml.json +++ b/app/locales/ml.json @@ -37,7 +37,6 @@ "authorities_desc": "എക്‌സ്‌പോഷർ ഡാറ്റ നേടുന്നതിന് നിങ്ങളുടെ പ്രദേശത്തെ വിശ്വസനീയ ആരോഗ്യ സംരക്ഷണ അധികാരികളെ തിരഞ്ഞെടുക്കുക. ഒന്നുകിൽ ആഗോള രജിസ്ട്രിയിൽ നിന്ന് ഒരു പേര് തിരഞ്ഞെടുക്കുക, അല്ലെങ്കിൽ സെയ്ഫ് പാത്ത് നടപ്പിലാക്കിയ ഒരു അതോറിറ്റി നൽകിയ വെബ് വിലാസം നൽകുക.", "authorities_input_placeholder": "നിങ്ങളുടെ URL ഇവിടെ ചേർക്കുക", "authorities_new_in_area_msg": "നിങ്ങളുടെ സ്ഥാനത്ത് {{count}} പുതിയ വിശ്വസനീയ ആരോഗ്യ സംരക്ഷണ അതോറിറ്റി സബ്‌സ്‌ക്രൈബുചെയ്യുക", - "authorities_new_in_area_msg_plural": "നിങ്ങളുടെ സ്ഥലത്തെ {{count}} പുതിയ വിശ്വസനീയ ആരോഗ്യ സംരക്ഷണ അതോറിറ്റികളിലേക്ക് സബ്‌സ്‌ക്രൈബുചെയ്യുക", "authorities_new_in_area_title": "പുതിയ ആരോഗ്യ അതോറിറ്റി", "authorities_new_in_area_title_plural": "പുതിയ ആരോഗ്യ സംരക്ഷണ അധികാരികൾ", "authorities_new_subcription_msg": "\nനിങ്ങളുടെ സ്ഥാനത്തെ {{count}} പുതിയ അതോറിറ്റിയിലേക്ക് നിങ്ങൾ സബ്‌സ്‌ക്രൈബുചെയ്‌തു", @@ -47,6 +46,7 @@ "authorities_no_sources": "ഇതുവരെ ഡാറ്റ ഉറവിടങ്ങളൊന്നുമില്ല", "authorities_removal_alert_cancel": "റദ്ദാക്കുക", "authorities_removal_alert_desc": "ഈ അതോറിറ്റി ഡാറ്റ ഉറവിടം നീക്കംചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?", + "authorities_new_in_area_msg_plural": "നിങ്ങളുടെ സ്ഥലത്തെ {{count}} പുതിയ വിശ്വസനീയ ആരോഗ്യ സംരക്ഷണ അതോറിറ്റികളിലേക്ക് സബ്‌സ്‌ക്രൈബുചെയ്യുക", "authorities_removal_alert_proceed": "തുടരുക", "authorities_removal_alert_title": "അധികാരനീക്കം", "authorities_title": "വിശ്വസനീയമായ ഉറവിടങ്ങൾ", diff --git a/app/locales/pl.json b/app/locales/pl.json index 1dbf2a104e..cac9505968 100644 --- a/app/locales/pl.json +++ b/app/locales/pl.json @@ -36,17 +36,17 @@ "authorities_add_url": "Dodaj instytucję poprzez adres URL", "authorities_desc": "Wybierz zaufaną instytucję opieki zdrowotnej w Twojej okolicy, aby uzyskać dane dotyczące ryzyka narażenia na zakażenie. Wybierz nazwę z rejestru globalnego lub wprowadź adres internetowy podany przez organ, który wdrożył Safe Paths.", "authorities_input_placeholder": "Wklej swój adres URL", - "authorities_new_in_area_msg_0": "Subskrybuj {{count}} nową zaufaną instytucję opieki zdrowotnej w swojej lokalizacji", - "authorities_new_in_area_msg_3": "Subskrybuj {{count}} nowe zaufane instytucje opieki zdrowotnej w swojej lokalizacji", - "authorities_new_subcription_msg_0": "Subskrybujesz {{count}} nową instytucję opieki zdrowotnej w swojej loklizacji", - "authorities_new_subcription_msg_3": "Subskrybujesz {{count}} nowe instytucje opieki zdrowotnej w swojej loklizacji", "authorities_new_in_area_title_0": "Nowa instytucja opieki zdrowotnej", + "authorities_new_in_area_title_3": "Nowe instytucje opieki zdrowotnej", "authorities_new_subcription_title_0": "{{count}} Nowa Subskrypcja", "authorities_new_subcription_title_3": "{{count}} Nowe Subskrybcje", - "authorities_new_in_area_title_3": "Nowe instytucje opieki zdrowotnej", "authorities_no_sources": "Brak danych dotyczących instytucji", + "authorities_new_subcription_msg_0": "Subskrybujesz {{count}} nową instytucję opieki zdrowotnej w swojej loklizacji", + "authorities_new_subcription_msg_3": "Subskrybujesz {{count}} nowe instytucje opieki zdrowotnej w swojej loklizacji", "authorities_removal_alert_cancel": "Anuluj", "authorities_removal_alert_desc": "Czy jesteś pewien, że chcesz usunąć dane dotyczące instytucji?", + "authorities_new_in_area_msg_0": "Subskrybuj {{count}} nową zaufaną instytucję opieki zdrowotnej w swojej lokalizacji", + "authorities_new_in_area_msg_3": "Subskrybuj {{count}} nowe zaufane instytucje opieki zdrowotnej w swojej lokalizacji", "authorities_removal_alert_proceed": "Ok", "authorities_removal_alert_title": "Usuń instytucję", "authorities_title": "Zaufane źródło", diff --git a/app/locales/pt_BR.json b/app/locales/pt_BR.json index d16021298b..eaa0db3517 100644 --- a/app/locales/pt_BR.json +++ b/app/locales/pt_BR.json @@ -1,5 +1,13 @@ { - "_display_name": "Portugues do Brasil", + "_display_name": "Português do Brasil", + "about": { + "dimensions": "Dimensões:", + "operating_system_abbr": "SO:", + "version": "Versão:" + }, + "common": { + "done": "Feito" + }, "history": { "no_exposure": "Sem exposição conhecida", "possible_exposure": "Exposição possível", @@ -11,12 +19,21 @@ }, "import": { "button_text": "Importar localizações anteriores", + "error": "Algo deu errado ao importar seus dados.", "google": { + "already_imported": "O arquivo Takeout fornecido já foi importado.", "disclaimer": "Safe Paths não tem ligação com Google e nunca compartilha os seus dados.", + "file_open_error": "Não consegui abrir o arquivo. \nPor favor, certifique-se de que o arquivo está aberto a partir do Google Drive", + "instructions_detailed": "Visite o Google Takeout e exporte seu Histórico de Localização usando as seguintes configurações: \n 1. Método de entrega: \"Adicionar ao Drive\" \n 2. Frequência: \"Exportar uma vez\" \n 3. Tipo e tamanho do arquivo: \".zip\" e \"1GB\" \n 4. O Google envia um e-mail quando a exportação estiver pronta \n 5. Volte aqui para importar localizações do Google Drive", + "instructions_first": "A adição de dados de localização do Google irá te colocar um passo a frente na criação dos seus locais recentes.", + "instructions_second": "Antes de poder importar, você deve primeiro \"retirar\" seus dados de localização do Google.", + "invalid_file_format": "O formato de arquivo fornecido não é suportado. \n Formatos suportados: \".zip\".", + "no_recent_locations": "Takeout não tem nenhuma localização recente.", "title": "Google Maps", "visit_button_text": "Visite Google Takeout" }, "subtitle": "Para saber se você encontrou com alguém com COVID-19 antes de instalar esse aplicativo, você pode importar seu histórico de localizações pessoais.", + "success": "Locais recentes foram importados com sucesso!", "title": "Importar Localizações" }, "label": { @@ -25,19 +42,30 @@ "authorities_add_url": "Adicionar autoridade por URL", "authorities_desc": "Escolha autoridades de saúde de sua região para obter dados de exposição. Selecione o nome a partir do registro mundial, ou entre o endereço da web fornecido pela autoridade que implementou Safe Paths.", "authorities_input_placeholder": "Cole o endereço URL aqui", + "authorities_new_in_area_msg": "Se inscreva em {{count}} nova autoridade de saúde de confiança em sua área.", + "authorities_new_in_area_msg_plural": "Se inscreva em {{count}} novas autoridades de saúde de confiança em sua área.", + "authorities_new_in_area_title": "Nova Autoridade de Saúde", + "authorities_new_in_area_title_plural": "Novas Autoridades de Saúde", + "authorities_new_subcription_msg": "Você se inscreveu em {{count}} nova autoridade em sua área.", + "authorities_new_subcription_msg_plural": "Você se inscreveu em {{count}} novas autoridades em sua área.", + "authorities_new_subcription_title": "{{count}} Novo Resgistro", + "authorities_new_subcription_title_plural": "{{count}} Novos Resgistros", "authorities_no_sources": "Sem dados até o momento", "authorities_removal_alert_cancel": "Cancelar", "authorities_removal_alert_desc": "Confirma a exclusão da autoridade de saúde como fonte de dados?", "authorities_removal_alert_proceed": "Confirmar", "authorities_removal_alert_title": "Excluir autoridade", "authorities_title": "Fontes confiáveis", + "auto_subscribe_checkbox": "Permitir inscrição automática", "choose_provider_subtitle": "Para ser informado sobre exposições, você precisará selecionar uma autoridade de saúde.", "choose_provider_title": "Escolha uma autoridade de saúde", "commitment": "Compromisso", "commitment_para": "Safe Paths registra e verifica de maneira segura a sua interação com outras pessoas, através da sua localização. Seus dados NÃO saírão do seu celular sem a sua autorização.", "default_news_site_name": "Notícias Safe Paths", + "enter_authority_url": "Digite ou cole o URL", "event_history_subtitle": "Entenda a sua exposição pessoal a partir de informações compartilhadas com as autoridades de saúde.", "event_history_title": "Histórico de exposição", + "filter_authorities_by_gps_history": "Filtrar por suas localizações", "home_at_risk_header": "Você pode estar exposto.", "home_at_risk_subsubtext": "Isso não quer dizer que você está infectado.", "home_at_risk_subtext": "Baseado no seu histórico de localização por GPS, é possível que você tenha estado próximo ou em contato com alguém com COVID-19.", @@ -51,8 +79,12 @@ "home_unknown_header": "Desconhecido", "home_unknown_subtext": "Não é possível verificar se você está em risco se não permitir que o aplicativo acesse a sua localização.", "latest_news": "Últimas Notícias", + "launch_authority_access": "Inscrever-se nas Autoridades de Saúde próximas.", + "launch_authority_header": "As autoridades de saúde fornecerão ao seu dispositivo os dados locais para saber se você cruzou o caminho com uma pessoa infectada", + "launch_authority_subheader": "Inscreva-se automaticamente para receber as atualizações mais recentes das autoridades de saúde em sua área.", "launch_done_header": "Tudo pronto", "launch_done_subheader": "Você está pronto para começar. Lembre-se, você sempre poderá alterar suas preferências, quando quiser.", + "launch_enable_auto_subscription": "Permitir inscrição automática", "launch_enable_location": "Permitir Localização", "launch_enable_notif": "Permitir Notificações", "launch_finish_set_up": "Concluir definições", @@ -87,13 +119,29 @@ "push_at_risk_title": "Você pode estar em risco", "see_exposure_history": "Veja seu histórico de exposição", "settings_title": "Painel de controle", + "skip_this_step": "Pule este passo", "team": "Equipe", "team_para": "Nossa equipe é formada por epidemiologistas, engenheiros, cientistas de dados, especialistas em privacidade digital, professores e pesquisadores de instituições renomadas, como: MIT, Harvard, The Mayo Clinic, TripleBlind, EyeNetra, Ernst & Young, e Link Ventures.", "terms_of_use": "Termos de uso" }, + "onboarding": { + "eula_checkbox": "Eu aceito o acordo de licenciamento", + "eula_continue": "Continuar", + "eula_message": "* Você deve aceitar para usar Safe Paths" + }, "share": { "button_text": "Compartilhar dados de localização", + "paragraph_first": "Se você testar positivo para COVID-19, por favor, faça sua parte compartilhando seu histórico de localização com as autoridades locais.", + "paragraph_second": "A localização é compartilhada como uma lista simples de horários e lugares, sem informações adicionais.", "subtitle": "Seus dados privados podem ser transferidos para autoridades de saúde, salvos em backup, ou compartilhados.", "title": "Compartilhar histórico de localização" + }, + "version_update": { + "alert_label": "COVID Safe Paths está desatualizado", + "alert_sublabel": "Atualizar para uma nova versão?", + "later": "Mais tarde", + "push_notification_message": "Por favor atualize seu aplicativo", + "push_notification_title": "Aplicativo desatualizado", + "update": "Atualizar" } } diff --git a/app/locales/ru.json b/app/locales/ru.json index ad7c5cbc09..4ca91dfde9 100644 --- a/app/locales/ru.json +++ b/app/locales/ru.json @@ -36,17 +36,17 @@ "authorities_add_url": "Добавить организацию по ссылке", "authorities_desc": "Выберите надёжные органы здравоохранения в вашем регионе, чтобы получать данные о зонах риска. Выберите название организации из международного реестра или введите ссылку организации, которая использует Safe Paths.", "authorities_input_placeholder": "Вставьте ссылку сюда", - "authorities_new_in_area_msg_0": "Подписаться на {{count}} новый надежный орган здравоохранения в вашем регионе", - "authorities_new_in_area_msg_3": "Подписаться на {{count}} новых надежных органов здравоохранения в вашем регионе", - "authorities_new_subcription_msg_0": "Вы подписались на {{count}} новую местную организацию", - "authorities_new_subcription_msg_3": "Вы подписались на {{count}} новых местных организаций", "authorities_new_in_area_title_0": "Новая организация здравоохранения", + "authorities_new_in_area_title_3": "Новые организации здравоохранения", "authorities_new_subcription_title_0": "Новая подписка", "authorities_new_subcription_title_3": "Новые подписки", - "authorities_new_in_area_title_3": "Новые организации здравоохранения", "authorities_no_sources": "Нет источника данных", + "authorities_new_subcription_msg_0": "Вы подписались на {{count}} новую местную организацию", + "authorities_new_subcription_msg_3": "Вы подписались на {{count}} новых местных организаций", "authorities_removal_alert_cancel": "Отмена", "authorities_removal_alert_desc": "Вы уверены, что хотите удалить этот источник данных?", + "authorities_new_in_area_msg_0": "Подписаться на {{count}} новый надежный орган здравоохранения в вашем регионе", + "authorities_new_in_area_msg_3": "Подписаться на {{count}} новых надежных органов здравоохранения в вашем регионе", "authorities_removal_alert_proceed": "Продолжить", "authorities_removal_alert_title": "Удалить организацию", "authorities_title": "Надёжные источники", diff --git a/app/locales/sk.json b/app/locales/sk.json index 296ad0d15a..e32427c006 100644 --- a/app/locales/sk.json +++ b/app/locales/sk.json @@ -36,17 +36,17 @@ "authorities_add_url": "Pridať úrad prostredníctvom URL", "authorities_desc": "Ak chceš získať údaje o tvojom vystavení sa riziku, vyber dôveryhodné zdravotné úrady v tvojej oblasti. Vyber meno z globálneho registra alebo zadaj webovú adresu poskytnutú orgánom, ktorú implementoval Safe Paths.", "authorities_input_placeholder": "Sem vlož tvoje URL", - "authorities_new_in_area_msg_0": "Prihlásiť sa na odber informácií od nového dôveryhodného zdravotného úradu v tvojej lokalite", - "authorities_new_in_area_msg_3": "Prihlásiť sa na odber informácií od nových dôveryhodných zdravotných úradov v tvojej lokalite", - "authorities_new_subcription_msg_0": "Prihlásil/a si sa na odber informácií od nového zdravotného úradu v tvojej lokalite", - "authorities_new_subcription_msg_3": "Prihlásil/a si sa na odber informácií od nových zdravotných úradov v tvojej lokalite", "authorities_new_in_area_title_0": "Nový zdravotný úrad", + "authorities_new_in_area_title_3": "Nové zdravotné úrady", "authorities_new_subcription_title_0": "Nový odber", "authorities_new_subcription_title_3": "Nové odbery", - "authorities_new_in_area_title_3": "Nové zdravotné úrady", "authorities_no_sources": "Zatiaľ žiadny zdroj údajov", + "authorities_new_subcription_msg_0": "Prihlásil/a si sa na odber informácií od nového zdravotného úradu v tvojej lokalite", + "authorities_new_subcription_msg_3": "Prihlásil/a si sa na odber informácií od nových zdravotných úradov v tvojej lokalite", "authorities_removal_alert_cancel": "Ukončiť", "authorities_removal_alert_desc": "Si si istý/á, že chceš odstrániť zdroj údajov tohto úradu?", + "authorities_new_in_area_msg_0": "Prihlásiť sa na odber informácií od nového dôveryhodného zdravotného úradu v tvojej lokalite", + "authorities_new_in_area_msg_3": "Prihlásiť sa na odber informácií od nových dôveryhodných zdravotných úradov v tvojej lokalite", "authorities_removal_alert_proceed": "Pokračovať", "authorities_removal_alert_title": "Odstrániť úrad", "authorities_title": "Dôveryhodné zdroje", diff --git a/app/views/Export.js b/app/views/Export.js index ed1f008571..9d986c077d 100644 --- a/app/views/Export.js +++ b/app/views/Export.js @@ -7,19 +7,18 @@ import { ScrollView, StatusBar, StyleSheet, - TouchableOpacity, View, } from 'react-native'; import RNFS from 'react-native-fs'; import LinearGradient from 'react-native-linear-gradient'; import Share from 'react-native-share'; -import { SvgXml } from 'react-native-svg'; import RNFetchBlob from 'rn-fetch-blob'; import close from './../assets/svgs/close'; import exportIcon from './../assets/svgs/export'; import { isPlatformiOS } from './../Util'; import { Button } from '../components/Button'; +import { IconButton } from '../components/IconButton'; import { Typography } from '../components/Typography'; import Colors from '../constants/colors'; import fontFamily from '../constants/fonts'; @@ -122,11 +121,12 @@ export const ExportScreen = ({ navigation }) => { colors={[Colors.VIOLET_BUTTON, Colors.VIOLET_BUTTON_DARK]} style={{ flex: 1, height: '100%' }}> - backToMain()}> - - + backToMain()} + accessibilityLabel='Close' + /> @@ -166,19 +166,11 @@ const styles = StyleSheet.create({ backgroundColor: Colors.VIOLET_BUTTON_DARK, }, headerContainer: { + alignItems: 'center', flexDirection: 'row', - justifyContent: 'flex-end', - }, - backArrowTouchable: { - width: 60, height: 55, - justifyContent: 'center', - alignItems: 'center', - zIndex: 1, - }, - backArrow: { - height: 18, - width: 18, + justifyContent: 'flex-end', + paddingHorizontal: 26, }, contentContainer: { flexDirection: 'column', diff --git a/app/views/Settings.js b/app/views/Settings.js index ed04d1dc33..9d22d11dcf 100644 --- a/app/views/Settings.js +++ b/app/views/Settings.js @@ -7,6 +7,7 @@ import checkmarkIcon from '../assets/svgs/checkmarkIcon'; import languagesIcon from '../assets/svgs/languagesIcon'; import xmarkIcon from '../assets/svgs/xmarkIcon'; import { Divider } from '../components/Divider'; +import { Feature } from '../components/Feature'; import NativePicker from '../components/NativePicker'; import NavigationBarWrapper from '../components/NavigationBarWrapper'; import Colors from '../constants/colors'; @@ -102,7 +103,6 @@ export const SettingsScreen = ({ navigation }) => { )} -
{ />
- {__DEV__ && ( +
- )} +
{ }); it('renders correctly', async () => { - const { asJSON } = render(); + const { asJSON } = render( + + + , + ); + + await act(async () => { + jest.runAllTimers(); + }); + + await expect(asJSON()).toMatchSnapshot(); +}); + +it('renders correctly (without google import flag)', async () => { + const { asJSON } = render( + + + , + ); await act(async () => { jest.runAllTimers(); diff --git a/app/views/__tests__/__snapshots__/Export.spec.js.snap b/app/views/__tests__/__snapshots__/Export.spec.js.snap index 86d70023fc..9640b684a4 100644 --- a/app/views/__tests__/__snapshots__/Export.spec.js.snap +++ b/app/views/__tests__/__snapshots__/Export.spec.js.snap @@ -58,37 +58,41 @@ exports[` renders correctly 1`] = ` - - -" + width={18} + xml=" + + + + +" /> diff --git a/app/views/__tests__/__snapshots__/Settings.spec.js.snap b/app/views/__tests__/__snapshots__/Settings.spec.js.snap index 3ce9872ce0..e6e3d4a3c8 100644 --- a/app/views/__tests__/__snapshots__/Settings.spec.js.snap +++ b/app/views/__tests__/__snapshots__/Settings.spec.js.snap @@ -1,5 +1,757 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`renders correctly (without google import flag) 1`] = ` + + + + + + + + +" + /> + + + Dashboard + + + + + + + + " + /> + + + Location Active + + + + + + + " + /> + + + English + + + + + + + + + + + + Done + + + + + + + + + + + + + + + + + + + Choose Health Authority + + + To be informed of exposures you will need to subscribe to a Health Authority. + + + + + + + + Latest news + + + Read about the latest COVID updates from your health authority and in general. + + + + + + + + Exposure history + + + Understand your personal exposure based on information shared by health authorities. + + + + + + + + Share location history + + + Your private data can be transferred to health authorities, backed up, or otherwise shared. + + + + + + + + + + + + About + + + + + + + + Legal + + + + + + + + + +`; + exports[`renders correctly 1`] = `