diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 8262e318de..1b0e3972c0 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -36,7 +36,6 @@ - + + + + + + + + diff --git a/android/res/drawable/ic_storage_permission.xml b/android/res/drawable/ic_storage_permission.xml new file mode 100644 index 0000000000..89b8b60d32 --- /dev/null +++ b/android/res/drawable/ic_storage_permission.xml @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/android/res/layout-land/info_page.xml b/android/res/layout-land/info_page.xml new file mode 100644 index 0000000000..01bc9edafd --- /dev/null +++ b/android/res/layout-land/info_page.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + diff --git a/android/res/layout-sw600dp-land/info_page.xml b/android/res/layout-sw600dp-land/info_page.xml new file mode 100644 index 0000000000..01bc9edafd --- /dev/null +++ b/android/res/layout-sw600dp-land/info_page.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + diff --git a/android/res/layout-sw600dp/info_page.xml b/android/res/layout-sw600dp/info_page.xml new file mode 100644 index 0000000000..60ccda04a6 --- /dev/null +++ b/android/res/layout-sw600dp/info_page.xml @@ -0,0 +1,54 @@ + + + + + + + + + diff --git a/android/res/layout/activity_splash.xml b/android/res/layout/activity_splash.xml index 076596ab23..e40493d687 100644 --- a/android/res/layout/activity_splash.xml +++ b/android/res/layout/activity_splash.xml @@ -1,14 +1,32 @@ - + android:layout_height="match_parent"> + + - + android:src="@drawable/img_logo" + android:layout_above="@id/anchor_center" + android:layout_centerHorizontal="true"/> + + + diff --git a/android/res/layout/fragment_detail_permissions.xml b/android/res/layout/fragment_detail_permissions.xml new file mode 100644 index 0000000000..eef07f8754 --- /dev/null +++ b/android/res/layout/fragment_detail_permissions.xml @@ -0,0 +1,54 @@ + + + + + + + + diff --git a/android/res/layout/fragment_permissions.xml b/android/res/layout/fragment_permissions.xml new file mode 100644 index 0000000000..300ee0ed24 --- /dev/null +++ b/android/res/layout/fragment_permissions.xml @@ -0,0 +1,53 @@ + + + + + + + + diff --git a/android/res/layout/fragment_storage_permissions.xml b/android/res/layout/fragment_storage_permissions.xml new file mode 100644 index 0000000000..77143b7775 --- /dev/null +++ b/android/res/layout/fragment_storage_permissions.xml @@ -0,0 +1,53 @@ + + + + + + + + diff --git a/android/res/layout/fragment_welcome.xml b/android/res/layout/fragment_welcome.xml new file mode 100644 index 0000000000..d50f9c01c5 --- /dev/null +++ b/android/res/layout/fragment_welcome.xml @@ -0,0 +1,40 @@ + + + + + + + diff --git a/android/res/layout/info_page.xml b/android/res/layout/info_page.xml new file mode 100644 index 0000000000..8ca2138dac --- /dev/null +++ b/android/res/layout/info_page.xml @@ -0,0 +1,60 @@ + + + + + + + + + diff --git a/android/res/layout/item_permission.xml b/android/res/layout/item_permission.xml new file mode 100644 index 0000000000..21428487f8 --- /dev/null +++ b/android/res/layout/item_permission.xml @@ -0,0 +1,37 @@ + + + + + + diff --git a/android/res/layout/item_permissions_note.xml b/android/res/layout/item_permissions_note.xml new file mode 100644 index 0000000000..c86857c7b6 --- /dev/null +++ b/android/res/layout/item_permissions_note.xml @@ -0,0 +1,17 @@ + + + + diff --git a/android/res/layout/item_permissions_title.xml b/android/res/layout/item_permissions_title.xml new file mode 100644 index 0000000000..6265a2c3a8 --- /dev/null +++ b/android/res/layout/item_permissions_title.xml @@ -0,0 +1,21 @@ + + + + diff --git a/android/res/values-fr/strings.xml b/android/res/values-fr/strings.xml index f7203d00a8..592d4bcaab 100644 --- a/android/res/values-fr/strings.xml +++ b/android/res/values-fr/strings.xml @@ -248,7 +248,7 @@ Nous espérons que vous appréciez l\'utilisation de MAPS.ME ! Si oui, veuillez évaluer l\'appli ou laisser une critique sur l\'App Store. Cela prend moins d\'une minute, mais peut vraiment nous aider. Merci pour votre soutien ! - Non, merci + Hé, regarde mon épingle sur MAPS.ME ! %1$s ou %2$s. Les cartes hors ligne ne sont pas installées ? Les télécharger ici : http://maps.me/get Hé, regarde mon épingle sur MAPS.ME ! %1$s ou %2$s. Les cartes hors ligne ne sont pas installées ? Les télécharger ici : http://maps.me/get diff --git a/android/res/values-land/dimens.xml b/android/res/values-land/dimens.xml index 709766d3ef..cc97cfdd29 100644 --- a/android/res/values-land/dimens.xml +++ b/android/res/values-land/dimens.xml @@ -18,4 +18,10 @@ 334dp 128dp - \ No newline at end of file + + 52dp + @dimen/margin_half + @dimen/margin_half + @dimen/margin_half + 200dp + diff --git a/android/res/values-pt/strings.xml b/android/res/values-pt/strings.xml index 02debf709e..5dce2125e7 100644 --- a/android/res/values-pt/strings.xml +++ b/android/res/values-pt/strings.xml @@ -133,6 +133,8 @@ %s descarga falhou Adicionar novo conjunto + + Adicionar aos Favoritos Cor de favoritos diff --git a/android/res/values-ru/strings.xml b/android/res/values-ru/strings.xml index e45b7e3504..8fb28b8f42 100644 --- a/android/res/values-ru/strings.xml +++ b/android/res/values-ru/strings.xml @@ -911,7 +911,7 @@ Последнее обновление: %s заезд: %s выезд: %s - Добавить на карту + Добавить место на карту Отправить всем пользователям? @@ -962,6 +962,7 @@ Что-то не работает Принять + Принять и продолжить Отклонить Умный в гору не пойдет @@ -1110,4 +1111,6 @@ Более подробная информация — в этом руководстве. Латинская транслитерация Если у улицы или объекта нет названия на вашем языке, то мы покажем его латиницей. + Узнать больше + Выход diff --git a/android/res/values-sw600dp-land/dimens.xml b/android/res/values-sw600dp-land/dimens.xml new file mode 100644 index 0000000000..da53b2d1d0 --- /dev/null +++ b/android/res/values-sw600dp-land/dimens.xml @@ -0,0 +1,4 @@ + + + 360dp + diff --git a/android/res/values-sw600dp/dimens.xml b/android/res/values-sw600dp/dimens.xml index b32a2a74bb..e12c25c085 100644 --- a/android/res/values-sw600dp/dimens.xml +++ b/android/res/values-sw600dp/dimens.xml @@ -7,4 +7,7 @@ 40dp 36dp 80dp + + 480dp + 360dp diff --git a/android/res/values-w1020dp-land/strings.xml b/android/res/values-w1020dp-land/strings.xml new file mode 100644 index 0000000000..75eb6cbcc6 --- /dev/null +++ b/android/res/values-w1020dp-land/strings.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/android/res/values/colors.xml b/android/res/values/colors.xml index 44afeee8d2..c9b72d0a7e 100644 --- a/android/res/values/colors.xml +++ b/android/res/values/colors.xml @@ -20,6 +20,7 @@ #DE000000 #8A000000 #61000000 + #0A000000 #14000000 #1E000000 #3D000000 diff --git a/android/res/values/dimens.xml b/android/res/values/dimens.xml index 47dbcd4d5a..ba530841e0 100644 --- a/android/res/values/dimens.xml +++ b/android/res/values/dimens.xml @@ -1,5 +1,6 @@ + -1 40dp @@ -188,4 +189,12 @@ 20dp 72dp + + 80dp + @dimen/margin_base + @dimen/margin_base + @dimen/margin_base + @dimen/match_parent + 40dp + 240dp diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml index 746bce1972..2c1c66d2dc 100644 --- a/android/res/values/strings.xml +++ b/android/res/values/strings.xml @@ -806,6 +806,19 @@ Enable updates notifications Help us find you In order for you to use navigation and the other app functions, MAPS.ME needs access to your geoposition. + Allow MAPS.ME access to storage and location + So you can download maps, see places and traffic near you and use navigation. + Grant access + Change permissions settings in your device. Needs a storage access to use MAPS.ME. + MAPS.ME needs access to + Storage + To save and use downloaded maps offline and save bookmarks. + Location + To see places and traffic near you and use navigation. + You can also change a destination to save downloaded maps. + Welcome to MAPS.ME + Free, fast, detailed and entirely offline maps with turn-by-turn navigation. + By launching the application, you agree to <a href=\"http://legal.my.com/us/maps/tou/\">Terms</a> of Use and <a href=\"https://legal.my.com/us/maps/privacy/\">Privacy Policy</a>. Change location No object can be located here Log in so other users can see the changes that you have made @@ -966,6 +979,7 @@ Something is not working Accept + Accept and continue Decline Better go about than fall into the ditch @@ -1122,4 +1136,6 @@ For more information please check this guide. Transliteration into Latin If a street or an object doesn\'t have a name in your language, it will be spelt using the Latin alphabet. + Learn more + Exit diff --git a/android/src/com/mapswithme/maps/MapFragment.java b/android/src/com/mapswithme/maps/MapFragment.java index 5222840e11..9450701c0a 100644 --- a/android/src/com/mapswithme/maps/MapFragment.java +++ b/android/src/com/mapswithme/maps/MapFragment.java @@ -16,8 +16,9 @@ import android.view.View; import android.view.ViewGroup; import com.mapswithme.maps.base.BaseMwmFragment; +import com.mapswithme.maps.location.LocationHelper; import com.mapswithme.util.UiUtils; -import com.mapswithme.util.statistics.PushwooshHelper; +import com.mapswithme.util.concurrency.UiThread; public class MapFragment extends BaseMwmFragment implements View.OnTouchListener, @@ -166,12 +167,25 @@ public class MapFragment extends BaseMwmFragment getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); final float exactDensityDpi = metrics.densityDpi; - if (!nativeCreateEngine(surface, (int) exactDensityDpi, SplashActivity.isFirstStart())) + final boolean firstStart = SplashActivity.isFirstStart(); + if (!nativeCreateEngine(surface, (int) exactDensityDpi, firstStart)) { reportUnsupported(); return; } + if (firstStart) + { + UiThread.runLater(new Runnable() + { + @Override + public void run() + { + LocationHelper.INSTANCE.onExitFromFirstRun(); + } + }); + } + mContextCreated = true; onRenderingInitialized(); } diff --git a/android/src/com/mapswithme/maps/MwmActivity.java b/android/src/com/mapswithme/maps/MwmActivity.java index 6b1fab373f..3689fedc74 100644 --- a/android/src/com/mapswithme/maps/MwmActivity.java +++ b/android/src/com/mapswithme/maps/MwmActivity.java @@ -27,6 +27,7 @@ import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.ImageButton; +import android.widget.Toast; import com.mapswithme.maps.Framework.MapObjectListener; import com.mapswithme.maps.activity.CustomNavigateUpListener; @@ -88,11 +89,13 @@ import com.mapswithme.util.Animations; import com.mapswithme.util.BottomSheetHelper; import com.mapswithme.util.Counters; import com.mapswithme.util.InputUtils; +import com.mapswithme.util.PermissionsUtils; import com.mapswithme.util.ThemeSwitcher; import com.mapswithme.util.ThemeUtils; import com.mapswithme.util.UiUtils; import com.mapswithme.util.Utils; import com.mapswithme.util.concurrency.UiThread; +import com.mapswithme.util.permissions.PermissionsResult; import com.mapswithme.util.sharing.ShareOption; import com.mapswithme.util.sharing.SharingHelper; import com.mapswithme.util.statistics.AlohaHelper; @@ -131,6 +134,8 @@ public class MwmActivity extends BaseMwmFragmentActivity private static final String STATE_MAP_OBJECT = "MapObject"; private static final String EXTRA_LOCATION_DIALOG_IS_ANNOYING = "LOCATION_DIALOG_IS_ANNOYING"; + private static final int LOCATION_REQUEST = 1; + // Map tasks that we run AFTER rendering initialized private final Stack mTasks = new Stack<>(); private final StoragePathManager mPathManager = new StoragePathManager(); @@ -186,11 +191,20 @@ public class MwmActivity extends BaseMwmFragmentActivity @Override public void onClick(View v) { - mLocationErrorDialogAnnoying = false; - LocationHelper.INSTANCE.switchToNextMode(); - LocationHelper.INSTANCE.restart(); Statistics.INSTANCE.trackEvent(Statistics.EventName.TOOLBAR_MY_POSITION); AlohaHelper.logClick(AlohaHelper.TOOLBAR_MY_POSITION); + + if (!PermissionsUtils.isLocationGranted()) + { + if (PermissionsUtils.isLocationExplanationNeeded(MwmActivity.this)) + PermissionsUtils.requestLocationPermission(MwmActivity.this, LOCATION_REQUEST); + else + Toast.makeText(MwmActivity.this, R.string.enable_location_services, Toast.LENGTH_SHORT) + .show(); + return; + } + + myPositionClick(); } }; @@ -309,6 +323,13 @@ public class MwmActivity extends BaseMwmFragmentActivity runTasks(); } + private void myPositionClick() + { + mLocationErrorDialogAnnoying = false; + LocationHelper.INSTANCE.switchToNextMode(); + LocationHelper.INSTANCE.restart(); + } + private void runTasks() { while (!mTasks.isEmpty()) @@ -961,6 +982,19 @@ public class MwmActivity extends BaseMwmFragmentActivity mFilterController.onRestoreState(savedInstanceState); } + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, + @NonNull int[] grantResults) + { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode != LOCATION_REQUEST || grantResults.length == 0) + return; + + PermissionsResult result = PermissionsUtils.computePermissionsResult(permissions, grantResults); + if (result.isLocationGranted()) + myPositionClick(); + } + @Override protected void onNewIntent(Intent intent) { diff --git a/android/src/com/mapswithme/maps/SplashActivity.java b/android/src/com/mapswithme/maps/SplashActivity.java index bb3024bb32..d1fe3946a3 100644 --- a/android/src/com/mapswithme/maps/SplashActivity.java +++ b/android/src/com/mapswithme/maps/SplashActivity.java @@ -7,13 +7,16 @@ import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.app.DialogFragment; import android.support.v7.app.AppCompatActivity; import android.view.View; import com.mapswithme.maps.editor.ViralFragment; import com.mapswithme.maps.news.BaseNewsFragment; -import com.mapswithme.maps.news.FirstStartFragment; import com.mapswithme.maps.news.NewsFragment; +import com.mapswithme.maps.news.WelcomeDialogFragment; +import com.mapswithme.maps.permissions.PermissionsDialogFragment; +import com.mapswithme.maps.permissions.StoragePermissionsDialogFragment; import com.mapswithme.util.Config; import com.mapswithme.util.Counters; import com.mapswithme.util.PermissionsUtils; @@ -27,18 +30,31 @@ public class SplashActivity extends AppCompatActivity public static final String EXTRA_INTENT = "extra_intent"; private static final String EXTRA_ACTIVITY_TO_START = "extra_activity_to_start"; private static final int REQUEST_PERMISSIONS = 1; + private static final long FIRST_START_DELAY = 1000; private static final long DELAY = 100; // The first launch of application ever - onboarding screen will be shown. private static boolean sFirstStart; private View mIvLogo; + private View mAppName; private boolean mPermissionsGranted; + private boolean mNeedStoragePermission; private boolean mCanceled; @NonNull - private final Runnable mDelayedTask = new Runnable() + private final Runnable mPermissionsDelayedTask = new Runnable() + { + @Override + public void run() + { + PermissionsDialogFragment.show(SplashActivity.this, REQUEST_PERMISSIONS); + } + }; + + @NonNull + private final Runnable mInitCoreDelayedTask = new Runnable() { @Override public void run() @@ -47,11 +63,11 @@ public class SplashActivity extends AppCompatActivity // Run delayed task because resumeDialogs() must see the actual value of mCanceled flag, // since onPause() callback can be blocked because of UI thread is busy with framework // initialization. - UiThread.runLater(mFinalTask); + UiThread.runLater(mFinalDelayedTask); } }; @NonNull - private final Runnable mFinalTask = new Runnable() + private final Runnable mFinalDelayedTask = new Runnable() { @Override public void run() @@ -79,8 +95,9 @@ public class SplashActivity extends AppCompatActivity protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - UiThread.cancelDelayedTasks(mDelayedTask); - UiThread.cancelDelayedTasks(mFinalTask); + UiThread.cancelDelayedTasks(mPermissionsDelayedTask); + UiThread.cancelDelayedTasks(mInitCoreDelayedTask); + UiThread.cancelDelayedTasks(mFinalDelayedTask); Counters.initCounters(this); initView(); } @@ -91,43 +108,60 @@ public class SplashActivity extends AppCompatActivity super.onResume(); mCanceled = false; mPermissionsGranted = PermissionsUtils.isExternalStorageGranted(); + DialogFragment storagePermissionsDialog = StoragePermissionsDialogFragment.find(this); + DialogFragment permissionsDialog = PermissionsDialogFragment.find(this); if (!mPermissionsGranted) { -// TODO requestPermissions after Permissions dialog - PermissionsUtils.requestPermissions(this, REQUEST_PERMISSIONS); + if (mNeedStoragePermission || storagePermissionsDialog != null) + { + if (permissionsDialog != null) + permissionsDialog.dismiss(); + if (storagePermissionsDialog == null) + StoragePermissionsDialogFragment.show(this); + return; + } + permissionsDialog = PermissionsDialogFragment.find(this); + if (permissionsDialog == null) + UiThread.runLater(mPermissionsDelayedTask, FIRST_START_DELAY); + return; } - UiThread.runLater(mDelayedTask, DELAY); + if (permissionsDialog != null) + permissionsDialog.dismiss(); + + if (storagePermissionsDialog != null) + storagePermissionsDialog.dismiss(); + + UiThread.runLater(mInitCoreDelayedTask, DELAY); } @Override protected void onPause() { mCanceled = true; - UiThread.cancelDelayedTasks(mDelayedTask); - UiThread.cancelDelayedTasks(mFinalTask); + UiThread.cancelDelayedTasks(mPermissionsDelayedTask); + UiThread.cancelDelayedTasks(mInitCoreDelayedTask); + UiThread.cancelDelayedTasks(mFinalDelayedTask); super.onPause(); } private void resumeDialogs() { - // TODO show permissions dialog if Permissions is not granted - if (!mPermissionsGranted || mCanceled) + if (mCanceled) return; if (Counters.isMigrationNeeded()) { Config.migrateCountersToSharedPrefs(); Counters.setMigrationExecuted(); - Counters.initCounters(this); } - sFirstStart = FirstStartFragment.showOn(this, this); + sFirstStart = WelcomeDialogFragment.showOn(this); if (sFirstStart) { PushwooshHelper.nativeProcessFirstLaunch(); - UiUtils.hide(mIvLogo); + UiUtils.hide(mIvLogo, mAppName); return; } @@ -136,7 +170,7 @@ public class SplashActivity extends AppCompatActivity { if (ViralFragment.shouldDisplay()) { - UiUtils.hide(mIvLogo); + UiUtils.hide(mIvLogo, mAppName); ViralFragment dialog = new ViralFragment(); dialog.onDismiss(new DialogInterface() { @@ -161,7 +195,7 @@ public class SplashActivity extends AppCompatActivity } else { - UiUtils.hide(mIvLogo); + UiUtils.hide(mIvLogo, mAppName); } } @@ -175,16 +209,7 @@ public class SplashActivity extends AppCompatActivity mPermissionsGranted = PermissionsUtils.computePermissionsResult(permissions, grantResults) .isExternalStorageGranted(); - - if (mPermissionsGranted) - { - init(); - resumeDialogs(); - } - else - { - finish(); - } + mNeedStoragePermission = !mPermissionsGranted; } @Override @@ -198,6 +223,7 @@ public class SplashActivity extends AppCompatActivity UiUtils.setupStatusBar(this); setContentView(R.layout.activity_splash); mIvLogo = findViewById(R.id.iv__logo); + mAppName = findViewById(R.id.tv__app_name); } private void init() diff --git a/android/src/com/mapswithme/maps/base/BaseMwmDialogFragment.java b/android/src/com/mapswithme/maps/base/BaseMwmDialogFragment.java index d8833f9694..95ffff2549 100644 --- a/android/src/com/mapswithme/maps/base/BaseMwmDialogFragment.java +++ b/android/src/com/mapswithme/maps/base/BaseMwmDialogFragment.java @@ -5,6 +5,7 @@ import android.support.annotation.Nullable; import android.support.annotation.StyleRes; import android.support.v4.app.DialogFragment; +import com.mapswithme.maps.MwmApplication; import com.mapswithme.maps.R; import com.mapswithme.util.ThemeUtils; diff --git a/android/src/com/mapswithme/maps/news/FirstStartFragment.java b/android/src/com/mapswithme/maps/news/FirstStartFragment.java deleted file mode 100644 index 26c29cc8a4..0000000000 --- a/android/src/com/mapswithme/maps/news/FirstStartFragment.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.mapswithme.maps.news; - -import android.app.Dialog; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.FragmentActivity; -import android.support.v4.app.FragmentManager; - -import com.mapswithme.maps.BuildConfig; -import com.mapswithme.maps.R; -import com.mapswithme.maps.location.LocationHelper; -import com.mapswithme.util.Counters; - -public class FirstStartFragment extends BaseNewsFragment -{ - private class Adapter extends BaseNewsFragment.Adapter - { - @Override - int getTitles() - { - return R.array.first_start_titles; - } - - @Override - int getSubtitles1() - { - return R.array.first_start_subtitles; - } - - @Override - int getSubtitles2() - { - return 0; - } - - @Override - int getSwitchTitles() - { - return R.array.first_start_switch_titles; - } - - @Override - int getSwitchSubtitles() - { - return R.array.first_start_switch_subtitles; - } - - @Override - int getImages() - { - return R.array.first_start_images; - } - } - - @Override - BaseNewsFragment.Adapter createAdapter() - { - return new Adapter(); - } - - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) - { - LocationHelper.INSTANCE.onEnteredIntoFirstRun(); - return super.onCreateDialog(savedInstanceState); - } - - @Override - protected void onDoneClick() - { - super.onDoneClick(); - LocationHelper.INSTANCE.onExitFromFirstRun(); - } - - public static boolean showOn(@NonNull FragmentActivity activity, - @Nullable NewsDialogListener listener) - { - if (Counters.getFirstInstallVersion() < BuildConfig.VERSION_CODE) - return false; - - FragmentManager fm = activity.getSupportFragmentManager(); - if (fm.isDestroyed()) - return false; - - if (Counters.isFirstStartDialogSeen() && - !recreate(activity, FirstStartFragment.class)) - return false; - - create(activity, FirstStartFragment.class, listener); - - Counters.setFirstStartDialogSeen(); - return true; - } -} diff --git a/android/src/com/mapswithme/maps/news/WelcomeDialogFragment.java b/android/src/com/mapswithme/maps/news/WelcomeDialogFragment.java new file mode 100644 index 0000000000..8eb73fced7 --- /dev/null +++ b/android/src/com/mapswithme/maps/news/WelcomeDialogFragment.java @@ -0,0 +1,135 @@ +package com.mapswithme.maps.news; + +import android.app.Activity; +import android.app.Dialog; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentManager; +import android.text.Html; +import android.text.method.LinkMovementMethod; +import android.view.View; +import android.view.Window; +import android.widget.ImageView; +import android.widget.TextView; + +import com.mapswithme.maps.BuildConfig; +import com.mapswithme.maps.R; +import com.mapswithme.maps.base.BaseMwmDialogFragment; +import com.mapswithme.maps.location.LocationHelper; +import com.mapswithme.util.Counters; +import com.mapswithme.util.UiUtils; + +public class WelcomeDialogFragment extends BaseMwmDialogFragment implements View.OnClickListener +{ + @Nullable + private BaseNewsFragment.NewsDialogListener mListener; + + public static boolean showOn(@NonNull FragmentActivity activity) + { + if (Counters.getFirstInstallVersion() < BuildConfig.VERSION_CODE) + return false; + + FragmentManager fm = activity.getSupportFragmentManager(); + if (fm.isDestroyed()) + return false; + + if (Counters.isFirstStartDialogSeen() && + !recreate(activity)) + return false; + + create(activity); + + Counters.setFirstStartDialogSeen(); + return true; + } + + private static void create(@NonNull FragmentActivity activity) + { + final WelcomeDialogFragment fragment = new WelcomeDialogFragment(); + activity.getSupportFragmentManager() + .beginTransaction() + .add(fragment, WelcomeDialogFragment.class.getName()) + .commitAllowingStateLoss(); + } + + private static boolean recreate(@NonNull FragmentActivity activity) + { + FragmentManager fm = activity.getSupportFragmentManager(); + Fragment f = fm.findFragmentByTag(WelcomeDialogFragment.class.getName()); + if (f == null) + return false; + + // If we're here, it means that the user has rotated the screen. + // We use different dialog themes for landscape and portrait modes on tablets, + // so the fragment should be recreated to be displayed correctly. + fm.beginTransaction() + .remove(f) + .commitAllowingStateLoss(); + fm.executePendingTransactions(); + return true; + } + + @Override + public void onAttach(Activity activity) + { + super.onAttach(activity); + if (activity instanceof BaseNewsFragment.NewsDialogListener) + mListener = (BaseNewsFragment.NewsDialogListener) activity; + } + + @Override + public void onDetach() + { + mListener = null; + super.onDetach(); + } + + @Override + protected int getCustomTheme() + { + return getFullscreenTheme(); + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) + { + LocationHelper.INSTANCE.onEnteredIntoFirstRun(); + if (!LocationHelper.INSTANCE.isActive()) + LocationHelper.INSTANCE.start(); + + Dialog res = super.onCreateDialog(savedInstanceState); + res.requestWindowFeature(Window.FEATURE_NO_TITLE); + res.setCancelable(false); + + View content = View.inflate(getActivity(), R.layout.fragment_welcome, null); + res.setContentView(content); + content.findViewById(R.id.btn__continue).setOnClickListener(this); + ImageView image = (ImageView) content.findViewById(R.id.iv__image); + image.setImageResource(R.drawable.img_welcome); + TextView title = (TextView) content.findViewById(R.id.tv__title); + title.setText(R.string.onboarding_welcome_title); + TextView subtitle = (TextView) content.findViewById(R.id.tv__subtitle1); + subtitle.setText(R.string.onboarding_welcome_first_subtitle); + TextView terms = (TextView) content.findViewById(R.id.tv__subtitle2); + UiUtils.show(terms); + terms.setText(Html.fromHtml(getString(R.string.onboarding_welcome_second_subtitle))); + terms.setMovementMethod(LinkMovementMethod.getInstance()); + + return res; + } + + @Override + public void onClick(View v) + { + if (v.getId() != R.id.btn__continue) + return; + + if (mListener != null) + mListener.onDialogDone(); + dismiss(); + } +} diff --git a/android/src/com/mapswithme/maps/permissions/BasePermissionsDialogFragment.java b/android/src/com/mapswithme/maps/permissions/BasePermissionsDialogFragment.java new file mode 100644 index 0000000000..7e2958a1f1 --- /dev/null +++ b/android/src/com/mapswithme/maps/permissions/BasePermissionsDialogFragment.java @@ -0,0 +1,160 @@ +package com.mapswithme.maps.permissions; + +import android.app.Dialog; +import android.os.Bundle; +import android.support.annotation.DrawableRes; +import android.support.annotation.IdRes; +import android.support.annotation.LayoutRes; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.annotation.StringRes; +import android.support.v4.app.DialogFragment; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentManager; +import android.view.View; +import android.view.Window; +import android.widget.ImageView; +import android.widget.TextView; + +import com.mapswithme.maps.R; +import com.mapswithme.maps.base.BaseMwmDialogFragment; +import com.mapswithme.util.PermissionsUtils; +import com.mapswithme.util.log.Logger; +import com.mapswithme.util.log.LoggerFactory; + +abstract class BasePermissionsDialogFragment extends BaseMwmDialogFragment + implements View.OnClickListener +{ + private static final String TAG = BasePermissionsDialogFragment.class.getName(); + private static final Logger LOGGER = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.MISC); + private static final String ARG_REQUEST_CODE = "arg_request_code"; + + private int mRequestCode; + + @SuppressWarnings("TryWithIdenticalCatches") + @Nullable + public static DialogFragment show(@NonNull FragmentActivity activity, int requestCode, + @NonNull Class dialogClass) + { + final FragmentManager fm = activity.getSupportFragmentManager(); + if (fm.isDestroyed()) + return null; + + Fragment f = fm.findFragmentByTag(dialogClass.getName()); + if (f != null) + return (DialogFragment) f; + + BaseMwmDialogFragment dialog = null; + try + { + dialog = dialogClass.newInstance(); + final Bundle args = new Bundle(); + args.putInt(ARG_REQUEST_CODE, requestCode); + dialog.setArguments(args); + dialog.show(fm, dialogClass.getName()); + } + catch (java.lang.InstantiationException e) + { + LOGGER.e(TAG, "Can't instantiate " + dialogClass.getName() + " fragment", e); + } + catch (IllegalAccessException e) + { + LOGGER.e(TAG, "Can't instantiate " + dialogClass.getName() + " fragment", e); + } + + return dialog; + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + Bundle args = getArguments(); + if (args != null) + mRequestCode = args.getInt(ARG_REQUEST_CODE); + } + + @Override + protected int getCustomTheme() + { + // We can't read actual theme, because permissions are not granted yet. + return R.style.MwmTheme_DialogFragment_Fullscreen; + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) + { + Dialog res = super.onCreateDialog(savedInstanceState); + res.requestWindowFeature(Window.FEATURE_NO_TITLE); + + View content = View.inflate(getActivity(), getLayoutRes(), null); + res.setContentView(content); + View button = content.findViewById(getFirstActionButton()); + if (button != null) + button.setOnClickListener(this); + button = content.findViewById(getContinueActionButton()); + if (button != null) + button.setOnClickListener(this); + + ImageView image = (ImageView) content.findViewById(R.id.iv__image); + if (image != null) + image.setImageResource(getImageRes()); + TextView title = (TextView) content.findViewById(R.id.tv__title); + if (title != null) + title.setText(getTitleRes()); + TextView subtitle = (TextView) content.findViewById(R.id.tv__subtitle1); + if (subtitle != null) + subtitle.setText(getSubtitleRes()); + + return res; + } + + @DrawableRes + protected int getImageRes() + { + return 0; + } + + @StringRes + protected int getTitleRes() + { + return 0; + } + + @StringRes + protected int getSubtitleRes() + { + return 0; + } + + @LayoutRes + abstract protected int getLayoutRes(); + + @IdRes + protected abstract int getFirstActionButton(); + + protected abstract void onFirstActionClick(); + + @IdRes + protected abstract int getContinueActionButton(); + + @Override + public void onClick(@NonNull View v) + { + if (v.getId() == getFirstActionButton()) + { + onFirstActionClick(); + return; + } + + if (v.getId() == getContinueActionButton()) + PermissionsUtils.requestPermissions(getActivity(), mRequestCode); + } + + protected int getRequestCode() + { + return mRequestCode; + } +} diff --git a/android/src/com/mapswithme/maps/permissions/PermissionsAdapter.java b/android/src/com/mapswithme/maps/permissions/PermissionsAdapter.java new file mode 100644 index 0000000000..5106f9ac3e --- /dev/null +++ b/android/src/com/mapswithme/maps/permissions/PermissionsAdapter.java @@ -0,0 +1,176 @@ +package com.mapswithme.maps.permissions; + +import android.support.annotation.DrawableRes; +import android.support.annotation.IntDef; +import android.support.annotation.NonNull; +import android.support.annotation.StringRes; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.mapswithme.maps.R; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +class PermissionsAdapter extends RecyclerView.Adapter +{ + static final int TYPE_TITLE = 0; + static final int TYPE_PERMISSION = 1; + static final int TYPE_NOTE = 2; + + @Retention(RetentionPolicy.SOURCE) + @IntDef({ TYPE_TITLE, TYPE_PERMISSION, TYPE_NOTE}) + @interface ViewHolderType {} + + private static final List ITEMS; + static { + ArrayList items = new ArrayList<>(); + items.add(new PermissionItem(TYPE_TITLE, R.string.onboarding_detail_permissions_title, 0, 0)); + items.add(new PermissionItem(TYPE_PERMISSION, + R.string.onboarding_detail_permissions_storage_title, + R.string.onboarding_detail_permissions_storage_message, + R.drawable.ic_storage_permission)); + items.add(new PermissionItem(TYPE_PERMISSION, + R.string.onboarding_detail_permissions_location_title, + R.string.onboarding_detail_permissions_location_message, + R.drawable.ic_navigation_permission)); + items.add(new PermissionItem(TYPE_NOTE, 0, + R.string.onboarding_detail_permissions_storage_path_message, 0)); + ITEMS = Collections.unmodifiableList(items); + } + + @ViewHolderType + @Override + public int getItemViewType(int position) + { + return ITEMS.get(position).mType; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, @ViewHolderType int viewType) + { + switch (viewType) + { + case TYPE_NOTE: + return new NoteViewHolder(LayoutInflater.from(parent.getContext()) + .inflate(R.layout.item_permissions_note, parent, false)); + case TYPE_PERMISSION: + return new PermissionViewHolder(LayoutInflater.from(parent.getContext()) + .inflate(R.layout.item_permission, parent, + false)); + case TYPE_TITLE: + return new TitleViewHolder(LayoutInflater.from(parent.getContext()) + .inflate(R.layout.item_permissions_title, parent, + false)); + default: + return null; + } + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) + { + holder.bind(ITEMS.get(position)); + } + + @Override + public int getItemCount() + { + return ITEMS.size(); + } + + private static final class PermissionItem + { + @ViewHolderType + private final int mType; + @StringRes + private final int mTitle; + @StringRes + private final int mMessage; + @DrawableRes + private final int mIcon; + + PermissionItem(@ViewHolderType int type, @StringRes int title, @StringRes int message, int icon) + { + mType = type; + mTitle = title; + mMessage = message; + mIcon = icon; + } + } + + static abstract class ViewHolder extends RecyclerView.ViewHolder + { + public ViewHolder(@NonNull View itemView) + { + super(itemView); + } + + abstract void bind(@NonNull PermissionItem item); + } + + private static class TitleViewHolder extends ViewHolder + { + private final TextView mTitle; + + TitleViewHolder(@NonNull View itemView) + { + super(itemView); + + mTitle = (TextView) itemView.findViewById(R.id.tv__title); + } + + @Override + void bind(@NonNull PermissionItem item) + { + mTitle.setText(item.mTitle); + } + } + + private static class PermissionViewHolder extends ViewHolder + { + private final ImageView mIcon; + private final TextView mTitle; + private final TextView mMessage; + + PermissionViewHolder(@NonNull View itemView) + { + super(itemView); + mIcon = (ImageView) itemView.findViewById(R.id.iv__permission_icon); + mTitle = (TextView) itemView.findViewById(R.id.tv__permission_title); + mMessage = (TextView) itemView.findViewById(R.id.tv__permission_message); + } + + @Override + void bind(@NonNull PermissionItem item) + { + mIcon.setImageResource(item.mIcon); + mTitle.setText(item.mTitle); + mMessage.setText(item.mMessage); + } + } + + private static class NoteViewHolder extends ViewHolder + { + private final TextView mMessage; + + NoteViewHolder(@NonNull View itemView) + { + super(itemView); + mMessage = (TextView) itemView.findViewById(R.id.tv__note); + } + + @Override + void bind(@NonNull PermissionItem item) + { + mMessage.setText(item.mMessage); + } + } +} diff --git a/android/src/com/mapswithme/maps/permissions/PermissionsDetailDialogFragment.java b/android/src/com/mapswithme/maps/permissions/PermissionsDetailDialogFragment.java new file mode 100644 index 0000000000..ab7e5136b0 --- /dev/null +++ b/android/src/com/mapswithme/maps/permissions/PermissionsDetailDialogFragment.java @@ -0,0 +1,80 @@ +package com.mapswithme.maps.permissions; + +import android.app.Dialog; +import android.os.Bundle; +import android.support.annotation.IdRes; +import android.support.annotation.LayoutRes; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.DialogFragment; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentManager; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; + +import com.mapswithme.maps.R; + +public class PermissionsDetailDialogFragment extends BasePermissionsDialogFragment +{ + @Nullable + public static DialogFragment show(@NonNull FragmentActivity activity, int requestCode) + { + DialogFragment dialog = BasePermissionsDialogFragment.show(activity, requestCode, + PermissionsDetailDialogFragment.class); + if (dialog != null) + dialog.setCancelable(true); + return dialog; + } + + @Nullable + public static DialogFragment find(@NonNull FragmentActivity activity) + { + final FragmentManager fm = activity.getSupportFragmentManager(); + if (fm.isDestroyed()) + return null; + + Fragment f = fm.findFragmentByTag(PermissionsDetailDialogFragment.class.getName()); + return (DialogFragment) f; + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) + { + Dialog res = super.onCreateDialog(savedInstanceState); + RecyclerView permissions = (RecyclerView) res.findViewById(R.id.rv__permissions); + permissions.setLayoutManager(new LinearLayoutManager(getContext(), + LinearLayoutManager.VERTICAL, false)); + permissions.setAdapter(new PermissionsAdapter()); + + return res; + } + + @LayoutRes + @Override + protected int getLayoutRes() + { + return R.layout.fragment_detail_permissions; + } + + @IdRes + @Override + protected int getFirstActionButton() + { + return R.id.btn__back; + } + + @Override + protected void onFirstActionClick() + { + dismiss(); + } + + @IdRes + @Override + protected int getContinueActionButton() + { + return R.id.btn__continue; + } +} diff --git a/android/src/com/mapswithme/maps/permissions/PermissionsDialogFragment.java b/android/src/com/mapswithme/maps/permissions/PermissionsDialogFragment.java new file mode 100644 index 0000000000..1ad2ff2ae8 --- /dev/null +++ b/android/src/com/mapswithme/maps/permissions/PermissionsDialogFragment.java @@ -0,0 +1,98 @@ +package com.mapswithme.maps.permissions; + +import android.content.DialogInterface; +import android.support.annotation.DrawableRes; +import android.support.annotation.IdRes; +import android.support.annotation.LayoutRes; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.annotation.StringRes; +import android.support.v4.app.DialogFragment; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentManager; + +import com.mapswithme.maps.R; + +public class PermissionsDialogFragment extends BasePermissionsDialogFragment +{ + @Nullable + public static DialogFragment show(@NonNull FragmentActivity activity, int requestCode) + { + return BasePermissionsDialogFragment.show(activity, requestCode, PermissionsDialogFragment.class); + } + + public static DialogFragment find(@NonNull FragmentActivity activity) + { + final FragmentManager fm = activity.getSupportFragmentManager(); + if (fm.isDestroyed()) + return null; + + Fragment f = fm.findFragmentByTag(PermissionsDialogFragment.class.getName()); + return (DialogFragment) f; + } + + @DrawableRes + @Override + protected int getImageRes() + { + return R.drawable.img_permissions; + } + + @StringRes + @Override + protected int getTitleRes() + { + return R.string.onboarding_permissions_title; + } + + @StringRes + @Override + protected int getSubtitleRes() + { + return R.string.onboarding_permissions_message; + } + + @LayoutRes + @Override + protected int getLayoutRes() + { + return R.layout.fragment_permissions; + } + + @IdRes + @Override + protected int getFirstActionButton() + { + return R.id.btn__learn_more; + } + + @Override + protected void onFirstActionClick() + { + PermissionsDetailDialogFragment.show(getActivity(), getRequestCode()); + } + + @IdRes + @Override + protected int getContinueActionButton() + { + return R.id.btn__continue; + } + + @Override + public void dismiss() + { + DialogFragment dialog = PermissionsDetailDialogFragment.find(getActivity()); + if (dialog != null) + dialog.dismiss(); + super.dismiss(); + } + + @Override + public void onCancel(DialogInterface dialog) + { + super.onCancel(dialog); + getActivity().finish(); + } +} diff --git a/android/src/com/mapswithme/maps/permissions/StoragePermissionsDialogFragment.java b/android/src/com/mapswithme/maps/permissions/StoragePermissionsDialogFragment.java new file mode 100644 index 0000000000..f6e4f1c9f9 --- /dev/null +++ b/android/src/com/mapswithme/maps/permissions/StoragePermissionsDialogFragment.java @@ -0,0 +1,106 @@ +package com.mapswithme.maps.permissions; + +import android.app.Dialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.provider.Settings; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.DialogFragment; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentManager; +import android.view.View; +import android.view.Window; +import android.widget.ImageView; +import android.widget.TextView; + +import com.mapswithme.maps.R; +import com.mapswithme.maps.SplashActivity; +import com.mapswithme.maps.base.BaseMwmDialogFragment; + +public class StoragePermissionsDialogFragment extends BaseMwmDialogFragment implements View.OnClickListener +{ + @Nullable + public static DialogFragment show(@NonNull FragmentActivity activity) + { + final FragmentManager fm = activity.getSupportFragmentManager(); + if (fm.isDestroyed()) + return null; + + Fragment f = fm.findFragmentByTag(StoragePermissionsDialogFragment.class.getName()); + if (f != null) + return (DialogFragment) f; + + StoragePermissionsDialogFragment dialog = new StoragePermissionsDialogFragment(); + dialog.show(fm, StoragePermissionsDialogFragment.class.getName()); + + return dialog; + } + + public static DialogFragment find(SplashActivity activity) + { + final FragmentManager fm = activity.getSupportFragmentManager(); + if (fm.isDestroyed()) + return null; + + Fragment f = fm.findFragmentByTag(StoragePermissionsDialogFragment.class.getName()); + return (DialogFragment) f; + } + + @Override + protected int getCustomTheme() + { + // We can't read actual theme, because permissions are not granted yet. + return R.style.MwmTheme_DialogFragment_Fullscreen; + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) + { + Dialog res = super.onCreateDialog(savedInstanceState); + res.requestWindowFeature(Window.FEATURE_NO_TITLE); + + View content = View.inflate(getActivity(), R.layout.fragment_storage_permissions, null); + res.setContentView(content); + content.findViewById(R.id.btn__exit).setOnClickListener(this); + content.findViewById(R.id.btn__settings).setOnClickListener(this); + ImageView image = (ImageView) content.findViewById(R.id.iv__image); + image.setImageResource(R.drawable.img_no_storage_permission); + TextView title = (TextView) content.findViewById(R.id.tv__title); + title.setText(R.string.onboarding_storage_permissions_title); + TextView subtitle = (TextView) content.findViewById(R.id.tv__subtitle1); + subtitle.setText(R.string.onboarding_storage_permissions_message); + + return res; + } + + @Override + public void onClick(@NonNull View v) + { + switch (v.getId()) + { + case R.id.btn__exit: + getActivity().finish(); + break; + + case R.id.btn__settings: + Intent intent = new Intent(); + intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + Uri uri = Uri.fromParts("package", getContext().getPackageName(), null); + intent.setData(uri); + startActivity(intent); + break; + } + } + + @Override + public void onCancel(DialogInterface dialog) + { + super.onCancel(dialog); + getActivity().finish(); + } +} diff --git a/android/src/com/mapswithme/util/Config.java b/android/src/com/mapswithme/util/Config.java index 77f9bebdce..007643f131 100644 --- a/android/src/com/mapswithme/util/Config.java +++ b/android/src/com/mapswithme/util/Config.java @@ -2,6 +2,7 @@ package com.mapswithme.util; import android.support.annotation.NonNull; +import com.mapswithme.maps.BuildConfig; import com.mapswithme.maps.MwmApplication; import static com.mapswithme.util.Counters.KEY_APP_FIRST_INSTALL_FLAVOR; @@ -104,14 +105,16 @@ public final class Config public static void migrateCountersToSharedPrefs() { + int version = getInt(KEY_APP_FIRST_INSTALL_VERSION, BuildConfig.VERSION_CODE); MwmApplication.prefs() .edit() .putInt(KEY_APP_LAUNCH_NUMBER, getInt(KEY_APP_LAUNCH_NUMBER)) - .putInt(KEY_APP_FIRST_INSTALL_VERSION, getInt(KEY_APP_FIRST_INSTALL_VERSION)) + .putInt(KEY_APP_FIRST_INSTALL_VERSION, version) .putString(KEY_APP_FIRST_INSTALL_FLAVOR, getString(KEY_APP_FIRST_INSTALL_FLAVOR)) .putLong(KEY_APP_LAST_SESSION_TIMESTAMP, getLong(KEY_APP_LAST_SESSION_TIMESTAMP)) .putInt(KEY_APP_SESSION_NUMBER, getInt(KEY_APP_SESSION_NUMBER)) - .putBoolean(KEY_MISC_FIRST_START_DIALOG_SEEN, getBool(KEY_MISC_FIRST_START_DIALOG_SEEN)) + .putBoolean(KEY_MISC_FIRST_START_DIALOG_SEEN, + getBool(KEY_MISC_FIRST_START_DIALOG_SEEN)) .putInt(KEY_MISC_NEWS_LAST_VERSION, getInt(KEY_MISC_NEWS_LAST_VERSION)) .putInt(KEY_LIKES_LAST_RATED_SESSION, getInt(KEY_LIKES_LAST_RATED_SESSION)) .apply(); diff --git a/android/src/com/mapswithme/util/PermissionsUtils.java b/android/src/com/mapswithme/util/PermissionsUtils.java index 220da3cee7..18b1ea444b 100644 --- a/android/src/com/mapswithme/util/PermissionsUtils.java +++ b/android/src/com/mapswithme/util/PermissionsUtils.java @@ -15,8 +15,8 @@ import java.util.Map; import static android.Manifest.permission.ACCESS_COARSE_LOCATION; import static android.Manifest.permission.ACCESS_FINE_LOCATION; -import static android.Manifest.permission.GET_ACCOUNTS; import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; +import static android.support.v4.app.ActivityCompat.shouldShowRequestPermissionRationale; public final class PermissionsUtils { @@ -24,8 +24,13 @@ public final class PermissionsUtils { WRITE_EXTERNAL_STORAGE, ACCESS_COARSE_LOCATION, - ACCESS_FINE_LOCATION, - GET_ACCOUNTS + ACCESS_FINE_LOCATION + }; + + private static final String[] LOCATION_PERMISSIONS = new String[] + { + ACCESS_COARSE_LOCATION, + ACCESS_FINE_LOCATION }; private PermissionsUtils() {} @@ -48,16 +53,17 @@ public final class PermissionsUtils return checkPermissions().isLocationGranted(); } + public static boolean isLocationExplanationNeeded(@NonNull Activity activity) + { + return shouldShowRequestPermissionRationale(activity, ACCESS_COARSE_LOCATION) + || shouldShowRequestPermissionRationale(activity, ACCESS_FINE_LOCATION); + } + public static boolean isExternalStorageGranted() { return checkPermissions().isExternalStorageGranted(); } - public static boolean isGetAccountsGranted() - { - return checkPermissions().isGetAccountsGranted(); - } - @NonNull private static PermissionsResult checkPermissions() { @@ -82,13 +88,16 @@ public final class PermissionsUtils ? result.get(ACCESS_COARSE_LOCATION) : false) || (result.containsKey(ACCESS_FINE_LOCATION) ? result.get(ACCESS_FINE_LOCATION) : false); - boolean getAccountsGranted = result.containsKey(GET_ACCOUNTS) - ? result.get(GET_ACCOUNTS) : false; - return new PermissionsResult(externalStorageGranted, locationGranted, getAccountsGranted); + return new PermissionsResult(externalStorageGranted, locationGranted); } public static void requestPermissions(@NonNull Activity activity, int code) { ActivityCompat.requestPermissions(activity, PERMISSIONS, code); } + + public static void requestLocationPermission(@NonNull Activity activity, int code) + { + ActivityCompat.requestPermissions(activity, LOCATION_PERMISSIONS, code); + } } diff --git a/android/src/com/mapswithme/util/permissions/PermissionsResult.java b/android/src/com/mapswithme/util/permissions/PermissionsResult.java index 8f214405b6..9708bbe15c 100644 --- a/android/src/com/mapswithme/util/permissions/PermissionsResult.java +++ b/android/src/com/mapswithme/util/permissions/PermissionsResult.java @@ -4,14 +4,11 @@ public final class PermissionsResult { private final boolean mExternalStorageGranted; private final boolean mLocationGranted; - private final boolean mGetAccountsGranted; - public PermissionsResult(boolean externalStorageGranted, boolean locationGranted, - boolean getAccountsGranted) + public PermissionsResult(boolean externalStorageGranted, boolean locationGranted) { mExternalStorageGranted = externalStorageGranted; mLocationGranted = locationGranted; - mGetAccountsGranted = getAccountsGranted; } public boolean isExternalStorageGranted() @@ -23,9 +20,4 @@ public final class PermissionsResult { return mLocationGranted; } - - public boolean isGetAccountsGranted() - { - return mGetAccountsGranted; - } } diff --git a/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings index 3bab91a1ed..be7d98a4bc 100644 --- a/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/ar.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "لاستخدام الملاحة والميزات الأخرى، فنحن بحاجة إلى تحديد موقعك الجغرافي."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "تغيير الموقع"; "message_invalid_feature_position" = "لا يمكن تحديد موقع الكائن هنا"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "قبول"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "رفض"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "كتابة بالحروف اللاتينية"; "whatsnew_transliteration_message" = "إذا كان الشارع أو الهدف ليس له اسم بلغتك. فسيتم هجاؤه بالحروف اللاتينية."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings index db3cad4635..262855d0d1 100644 --- a/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/cs.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "Chcete-li používat navigaci a další funkce, pak potřebujeme přístup k vaší zeměpisné poloze."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Změnit umístění"; "message_invalid_feature_position" = "Objekt zde nemůže být umístěn"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Přijmout"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Odmítnout"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Transliterace do latinky"; "whatsnew_transliteration_message" = "Pokud ulice nebo objekt nemá název ve vašem jazyce, bude zobrazeno latinkou."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings index 9d10ea3f63..6951f3f3a4 100644 --- a/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/da.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "For at bruge navigering og andre funktioner skal vi have adgang til din geolokation."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Skift lokation"; "message_invalid_feature_position" = "Et objekt kan ikke placeres her"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Accepter"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Afvis"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Translitteration til latinsk"; "whatsnew_transliteration_message" = "Hvis en gade eller et objekt ikke har et navn på dit sprog, vil det blive stavet ved hjælp af det latinske alfabet."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings index 0a3348ea44..609712ffca 100644 --- a/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/de.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "Um Navigation und andere Funktionen zu verwenden, brauchen wir Zugriff auf Ihren Geo-Standort."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Standort wechseln"; "message_invalid_feature_position" = "Ein Objekt kann hier nicht positioniert werden"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Annehmen"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Ablehnen"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Transliteration ins Lateinische"; "whatsnew_transliteration_message" = "Wenn eine Straße oder ein Objekt in Ihrer Sprache keinen Namen hat, wird er mit lateinischen Buchstaben geschrieben."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings index 5944859ecf..47f8bdd21e 100644 --- a/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/el.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "Προκειμένου να χρησιμοποιήσετε την πλοήγηση και τις άλλες λειτουργίες του MAPS.ME χρειάζεται πρόσβαση στη γεωγραφική σας θέση."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Αλλαγή τοποθεσίας"; "message_invalid_feature_position" = "Δε μπορεί να εντοπιστεί αντικείμενο εδώ"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Συμφωνώ"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Διαφωνώ"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Μεταγραφή στα Λατινικά"; "whatsnew_transliteration_message" = "Εάν ένας δρόμος ή ένα αντικείμενο δεν έχει όνομα στη γλώσσα σας, θα διατυπωθεί χρησιμοποιώντας το λατινικό αλφάβητο."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings index a2ea012ff0..73c2995663 100644 --- a/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/en-GB.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "In order for you to use navigation and the other app functions, MAPS.ME needs access to your geoposition."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Change location"; "message_invalid_feature_position" = "No object can be located here"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Accept"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Decline"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Transliteration into Latin"; "whatsnew_transliteration_message" = "If a street or an object doesn't have a name in your language, it will be spelt using the Latin alphabet."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings index 409b05ea83..4eb296e4f7 100644 --- a/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/en.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "In order for you to use navigation and the other app functions, MAPS.ME needs access to your geoposition."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Change location"; "message_invalid_feature_position" = "No object can be located here"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Accept"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Decline"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Transliteration into Latin"; "whatsnew_transliteration_message" = "If a street or an object doesn't have a name in your language, it will be spelt using the Latin alphabet."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings index 3abe9fd47a..92c05c09b2 100644 --- a/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/es.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "Para utilizar la navegación y otras funciones, necesitamos acceso a tu geolocalización."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Cambiar ubicación"; "message_invalid_feature_position" = "No se puede ubicar ningún objeto aquí"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Aceptar"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Declinar"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Transliteración al alfabeto latino"; "whatsnew_transliteration_message" = "Si una calle o un objeto no tiene nombre en su idioma, se escribirá con el alfabeto latino."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings index 17251e876f..5e5bfc37ac 100644 --- a/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/fi.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "Tarvitsemme sijaintisi käyttääksemme navigointia ja muita ominaisuuksia."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Vaihda sijaintia"; "message_invalid_feature_position" = "Kohdetta ei voida asettaa tänne"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Hyväksy"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Hylkää"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Translitterointi latinaksi"; "whatsnew_transliteration_message" = "Jos kadulla tai kohteella ei ole nimeä kielelläsi, se kirjoitetetaan latinalaisilla kirjaimilla."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings index a50dc14260..eedd689b8e 100644 --- a/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/fr.lproj/Localizable.strings @@ -389,7 +389,7 @@ "appStore_message" = "Nous espérons que vous appréciez l'utilisation de MAPS.ME ! Si oui, veuillez évaluer l'appli ou laisser une critique sur l'App Store. Cela prend moins d'une minute, mais peut vraiment nous aider. Merci pour votre soutien !"; /* No, thanks */ -"no_thanks" = "Non, merci"; +"no_thanks" = "Hé, regarde mon épingle sur MAPS.ME ! %1$@ ou %2$@. Les cartes hors ligne ne sont pas installées ? Les télécharger ici : http://maps.me/get"; /* Share one specific bookmark using SMS, %1$@ contains ge0:// and %2$@ http://ge0.me link. @NOTE non-ascii symbols in the link will make 70 bytes sms instead of 140 */ "bookmark_share_sms" = "Hé, regarde mon épingle sur MAPS.ME ! %1$@ ou %2$@. Les cartes hors ligne ne sont pas installées ? Les télécharger ici : http://maps.me/get"; @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "Pour utiliser la navigation et d'autres fonctionnalités, nous devons pouvoir accéder à votre position géographique."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Modifier l'emplacement"; "message_invalid_feature_position" = "Aucun objet ne peut être localisé ici"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Accepter"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Refuser"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Translittération en latin"; "whatsnew_transliteration_message" = "Si une rue ou un objet n’a pas de nom dans votre langue, l’alphabet latin sera utilisé pour l'écrire."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings index 12fd9ed0bb..c31dee67d9 100644 --- a/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/hu.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "A navigáció és egyéb funkciók használatához hozzá kell férnünk a geolokációdhoz."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Helyszín megváltoztatása"; "message_invalid_feature_position" = "Célpont áthelyezése ide nem lehetséges"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Elfogadja"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Elutasítja"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Átírás latin nyelvre"; "whatsnew_transliteration_message" = "Ha egy utcának vagy egy objektumnak nincs neve az Ön nyelvén, latin ábécével kerül átírásra."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings index 721586b67c..aa49e225e1 100644 --- a/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/id.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "Untuk menggunakan navigasi dan fitur-fitur lainnya, kami perlu mengakses geolokasi Anda."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Ubah lokasi"; "message_invalid_feature_position" = "Objek tidak dapat diletakkan di sini"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Terima"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Tolak"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Transliterasi ke dalam bahasa Latin"; "whatsnew_transliteration_message" = "Jika jalan atau objek tidak memiliki nama dalam bahasa Anda, namanya akan dieja menggunakan alfabet Latin."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings index 9c873ee70e..5dcd23a896 100644 --- a/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/it.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "Per usare la navigazione e altri strumenti, dobbiamo accedere alla tua geolocalizzazione."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Cambia posizione"; "message_invalid_feature_position" = "Un oggetto non può essere posizionato qui"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Accetta"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Rifiuta"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Traslitterazione in latino"; "whatsnew_transliteration_message" = "Se una strada o un oggetto non ha un nome nella tua lingua, tale nome sarà scritto utilizzando l'alfabeto latino."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings index 3636e24011..54e4f19cd1 100644 --- a/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/ja.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "ナビゲーションやその他の機能の使用のために、アプリがGeolocationにアクセスする必要があります"; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "位置を変更してください"; "message_invalid_feature_position" = "ここにはオブジェクトを配置できません"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "了解"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "拒否"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "ラテン文字への字訳"; "whatsnew_transliteration_message" = "通り名や物件名をあなたの言語で表示できない場合、ラテン文字のアルファベットで綴られます。"; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings index 0ed8e4ff77..657bb5ba6c 100644 --- a/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/ko.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "탐색 및 기타 기능을 사용하려면, 위치 정보에 액세스해야 합니다."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "위치 변경"; "message_invalid_feature_position" = "목적지를 이곳에서 찾을 수 없습니다"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "동의"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "거부"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "라틴어로 음역"; "whatsnew_transliteration_message" = "거리 또는 개체에 사용자 언어로 된 이름이 없는 경우, 라틴 알파벳을 사용하여 나옵니다."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings index 6c4aa7c5a2..9b45fb71fe 100644 --- a/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/nb.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "For å bruke navigering og andre funksjoner må vi ha tilgang til posisjonen din."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Endre plassering"; "message_invalid_feature_position" = "Et objekt kan ikke plasseres her"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Godta"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Avvis"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Omskrivning til latin"; "whatsnew_transliteration_message" = "Hvis en gate eller et element ikke har et navn på ditt språk, vil det bli skrevet med det latinske alfabetet."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings index f12f0a8eb1..2d32072503 100644 --- a/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/nl.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "Om de navigatie en andere functies te kunnen gebruiken, hebben we toegang tot je geolocatie nodig."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Locatie wijzigen"; "message_invalid_feature_position" = "Hier kan geen object worden geplaatst"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Aanvaarden"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Weigeren"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Transliteratie in het Latijn"; "whatsnew_transliteration_message" = "Indien een straat of object geen naam heeft in uw taal, wordt deze gespeld door gebruik van het Latijns alfabet."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings index 694006b8dc..a68789cf6b 100644 --- a/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/pl.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "Abyś mógł korzystać z nawigacji i innych funkcji, musimy uzyskać dostęp do twojej geolokalizacji."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Zmień lokalizację"; "message_invalid_feature_position" = "Obiekt nie może znajdować się tutaj"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Zaakceptuj"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Odrzuć"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Transkrypcja na alfabet łaciński"; "whatsnew_transliteration_message" = "Jeśli dana ulica lub obiekt nie posiada nazwy w twoim języku, ich nazwa zapisana zostanie w alfabecie łacińskim."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings index a7f072022a..a7902c828c 100644 --- a/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/pt.lproj/Localizable.strings @@ -224,7 +224,7 @@ "add_new_set" = "Adicionar novo conjunto"; /* Place Page - Add To Bookmarks button */ -"add_to_bookmarks" = "Add to Bookmarks"; +"add_to_bookmarks" = "Adicionar aos Favoritos"; /* Bookmark Color dialog title */ "bookmark_color" = "Cor de favoritos"; @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "Para utilizar a navegação e outros recursos, precisamos de aceder à sua localização geográfica."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Mudar o local"; "message_invalid_feature_position" = "Um objeto não pode ser localizado aqui"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Aceitar"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Declinar"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Transliteração para o latim"; "whatsnew_transliteration_message" = "Se uma rua ou um objeto não tiver nome na sua língua, será utilizado o alfabeto latino."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings index 26e5b49b2a..5a1af98080 100644 --- a/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/ro.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "Ca să puteți naviga și folosi alte funcții, trebuie să accesăm poziționarea dvs. geografică."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Schimbare locație"; "message_invalid_feature_position" = "În acest loc nu poate fi localizat un obiect"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Acceptați"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Refuzați"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Transcriere în alfabet latin"; "whatsnew_transliteration_message" = "Dacă o stradă sau un obiect nu are un nume în limba dvs., va fi exprimat utilizând alfabetul latin."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings index edd8beaa2d..70173f5ac8 100644 --- a/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/ru.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "Чтобы пользоваться навигацией и другими функциями приложения, нам необходим доступ к вашей геопозиции."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Измените местоположение"; "message_invalid_feature_position" = "Объект не может находиться в этом месте"; @@ -1535,7 +1561,7 @@ "booking_checkout" = "выезд: %s"; -"placepage_add_place_button" = "Добавить на карту"; +"placepage_add_place_button" = "Добавить место на карту"; /* Displayed when saving some edits to the map to warn against publishing personal data */ "editor_share_to_all_dialog_title" = "Отправить всем пользователям?"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Принять"; +"accept_and_continue" = "Принять и продолжить"; + /* For the first routing */ "decline" = "Отклонить"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Латинская транслитерация"; "whatsnew_transliteration_message" = "Если у улицы или объекта нет названия на вашем языке, то мы покажем его латиницей."; + +"learn_more" = "Узнать больше"; + +"exit" = "Выход"; diff --git a/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings index 987f8fc9cf..5a27e6480b 100644 --- a/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/sk.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "Ak chcete používať navigáciu a ostatné funkcie, potrebujeme prístup k vašej aktuálnej polohe."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Zmeniť polohu"; "message_invalid_feature_position" = "Objekt sa tu nedá umiestniť"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Prijať"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Odmietnuť"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Prepis do latinčiny"; "whatsnew_transliteration_message" = "Ak ulica alebo objekt nemá názov vo vašom jazyku, prepíše sa tento názov latinkou."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings index 55155ea565..d8ecda3546 100644 --- a/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/sv.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "För att använda navigering och andra funktioner behöver vi tillgång till din geografiska plats."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Ändra placering"; "message_invalid_feature_position" = "Ett objekt kan inte placeras här"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Acceptera"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Neka"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Transkribering till latin"; "whatsnew_transliteration_message" = "Om en gata eller ett objekt saknar ett namn på ditt språk kommer det att stavas med det latinska alfabetet."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings index f3d6e358dc..199acefd4b 100644 --- a/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/th.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "เพื่อใช้การนำทางและฟีเจอร์อื่น ๆ เราต้องการเข้าถึงตำแหน่งทางภูมิศาสตร์ของคุณ"; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "เปลี่ยนสถานที่ตั้ง"; "message_invalid_feature_position" = "ไม่สามารถตั้งวัตถุได้ที่นี่"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "ยอมรับ"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "ปฏิเสธ"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "การทับศัพท์เป็นภาษาละติน"; "whatsnew_transliteration_message" = "หากถนนหรือเป้าหมายไม่มีชื่อในภาษาของคุณก็จะสะกดโดยใช้ตัวอักษรละติน"; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings index 6fbc79b15b..c7924e5680 100644 --- a/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/tr.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "Navigasyon ve diğer özellikleri kullanmak için konum belirlemenize erişmeye ihtiyacımız var."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Konumu değiştir"; "message_invalid_feature_position" = "Buraya bir nesne konumlandırılamıyor"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Kabul"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Ret"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Latince alfabesine çevirme"; "whatsnew_transliteration_message" = "Bir caddenin veya bir nesnenin adının kendi dilinizde mevcut olmaması durumunda, Latin alfabesi kullanılarak yazılır."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings index 8418981b06..53d53bfc64 100644 --- a/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/uk.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "Щоб користуватися навігацією та іншими функціями додатку, нам необхідний доступ до вашого місцезнаходження."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Змініть розташування"; "message_invalid_feature_position" = "Об'єкт не може перебувати в цьому місцезнаходженні"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Прийняти"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Відхилити"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Транслітерація латинськими літерами"; "whatsnew_transliteration_message" = "Якщо для вулиці чи об\\'єкта відсутня назва українською мовою, використовуватиметься назва, транслітерована латинськими літерами."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings index f802f4bba7..77e146bb34 100644 --- a/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/vi.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "Để sử dụng tính năng dẫn đường và các tính năng khác, chúng tôi cần truy cập vị trí địa lý của bạn."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "Thay đổi địa điểm"; "message_invalid_feature_position" = "Một đối tượng không thể đặt được ở đây"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "Chấp nhận"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "Từ chối"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "Chuyển ngữ sang chữ Latinh"; "whatsnew_transliteration_message" = "Nếu một đường phố hoặc đối tượng không có tên trong ngôn ngữ của bạn, nó sẽ được đánh vần sử dụng bảng chữ cái alphabet."; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings index 4a325cadea..dc6eb2d527 100644 --- a/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/zh-Hans.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "为了使用导航和其他功能,我们需要访问您的地理位置信息."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "改变位置"; "message_invalid_feature_position" = "对象无法设置在这里"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "接受"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "拒绝"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "直译成拉丁文"; "whatsnew_transliteration_message" = "如果某条街道或者某个对象在您的语言中没有对应的名称,它将使用拉丁字母拼写。"; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings index 61e267fd7d..9435f7c43a 100644 --- a/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/zh-Hant.lproj/Localizable.strings @@ -1326,6 +1326,32 @@ "onboarding_location_message" = "如要使用導航和其他功能,我們需要能獲取您的地理位置."; +"onboarding_permissions_title" = "Allow MAPS.ME access to storage and location"; + +"onboarding_permissions_message" = "So you can download maps, see places and traffic near you and use navigation."; + +"onboarding_storage_permissions_title" = "Grant access"; + +"onboarding_storage_permissions_message" = "Change permissions settings in your device. Needs a storage access to use MAPS.ME."; + +"onboarding_detail_permissions_title" = "MAPS.ME needs access to"; + +"onboarding_detail_permissions_storage_title" = "Storage"; + +"onboarding_detail_permissions_storage_message" = "To save and use downloaded maps offline and save bookmarks."; + +"onboarding_detail_permissions_location_title" = "Location"; + +"onboarding_detail_permissions_location_message" = "To see places and traffic near you and use navigation."; + +"onboarding_detail_permissions_storage_path_message" = "You can also change a destination to save downloaded maps."; + +"onboarding_welcome_title" = "Welcome to MAPS.ME"; + +"onboarding_welcome_first_subtitle" = "Free, fast, detailed and entirely offline maps with turn-by-turn navigation."; + +"onboarding_welcome_second_subtitle" = "By launching the application, you agree to Terms of Use and Privacy Policy."; + "dialog_incorrect_feature_position" = "改變位置"; "message_invalid_feature_position" = "物件無法設置在這裡"; @@ -1622,6 +1648,8 @@ /* For the first routing */ "accept" = "接受"; +"accept_and_continue" = "Accept and continue"; + /* For the first routing */ "decline" = "拒絕"; @@ -1900,3 +1928,7 @@ "whatsnew_transliteration_title" = "音譯為拉丁文"; "whatsnew_transliteration_message" = "若街道或物件沒有您語言的名稱,會使用拉丁字母拼出。"; + +"learn_more" = "Learn more"; + +"exit" = "Exit"; diff --git a/strings.txt b/strings.txt index 2230a4b972..97b9227273 100644 --- a/strings.txt +++ b/strings.txt @@ -16657,6 +16657,45 @@ el = Προκειμένου να χρησιμοποιήσετε την πλοήγηση και τις άλλες λειτουργίες του MAPS.ME χρειάζεται πρόσβαση στη γεωγραφική σας θέση. sk = Ak chcete používať navigáciu a ostatné funkcie, potrebujeme prístup k vašej aktuálnej polohe. + [onboarding_permissions_title] + en = Allow MAPS.ME access to storage and location + + [onboarding_permissions_message] + en = So you can download maps, see places and traffic near you and use navigation. + + [onboarding_storage_permissions_title] + en = Grant access + + [onboarding_storage_permissions_message] + en = Change permissions settings in your device. Needs a storage access to use MAPS.ME. + + [onboarding_detail_permissions_title] + en = MAPS.ME needs access to + + [onboarding_detail_permissions_storage_title] + en = Storage + + [onboarding_detail_permissions_storage_message] + en = To save and use downloaded maps offline and save bookmarks. + + [onboarding_detail_permissions_location_title] + en = Location + + [onboarding_detail_permissions_location_message] + en = To see places and traffic near you and use navigation. + + [onboarding_detail_permissions_storage_path_message] + en = You can also change a destination to save downloaded maps. + + [onboarding_welcome_title] + en = Welcome to MAPS.ME + + [onboarding_welcome_first_subtitle] + en = Free, fast, detailed and entirely offline maps with turn-by-turn navigation. + + [onboarding_welcome_second_subtitle] + en = By launching the application, you agree to Terms of Use and Privacy Policy. + [dialog_incorrect_feature_position] en = Change location ru = Измените местоположение @@ -20787,6 +20826,10 @@ el = Συμφωνώ sk = Prijať + [accept_and_continue] + en = Accept and continue + ru = Принять и продолжить + [decline] comment = For the first routing en = Decline @@ -24510,3 +24553,11 @@ pt_BR = Se uma rua ou um objeto não possui um nome em seu idioma, ele será soletrado usando o alfabeto latino. sk = Ak ulica alebo objekt nemá názov vo vašom jazyku, prepíše sa tento názov latinkou. sw = Ikiwa mtaa au kipengee hakina jina kwa lugha yako, kitaandikwa kwa herufi za alfabeti ya Kilatini. + + [learn_more] + en = Learn more + ru = Узнать больше + + [exit] + en = Exit + ru = Выход