Merge pull request #4703 from igrechuhin/release-65-to-master
Release 65 to master
|
@ -19,7 +19,7 @@ jclass g_bookmarkClazz;
|
|||
jclass g_myTrackerClazz;
|
||||
jclass g_httpClientClazz;
|
||||
jclass g_httpParamsClazz;
|
||||
jclass g_socketWrapperClazz;
|
||||
jclass g_platformSocketClazz;
|
||||
jclass g_utilsClazz;
|
||||
|
||||
extern "C"
|
||||
|
@ -37,7 +37,7 @@ JNI_OnLoad(JavaVM * jvm, void *)
|
|||
g_myTrackerClazz = jni::GetGlobalClassRef(env, "com/my/tracker/MyTracker");
|
||||
g_httpClientClazz = jni::GetGlobalClassRef(env, "com/mapswithme/util/HttpClient");
|
||||
g_httpParamsClazz = jni::GetGlobalClassRef(env, "com/mapswithme/util/HttpClient$Params");
|
||||
g_socketWrapperClazz = jni::GetGlobalClassRef(env, "com/mapswithme/maps/location/SocketWrapper");
|
||||
g_platformSocketClazz = jni::GetGlobalClassRef(env, "com/mapswithme/maps/location/PlatformSocket");
|
||||
g_utilsClazz = jni::GetGlobalClassRef(env, "com/mapswithme/util/Utils");
|
||||
|
||||
return JNI_VERSION_1_6;
|
||||
|
@ -53,7 +53,7 @@ JNI_OnUnload(JavaVM *, void *)
|
|||
env->DeleteGlobalRef(g_myTrackerClazz);
|
||||
env->DeleteGlobalRef(g_httpClientClazz);
|
||||
env->DeleteGlobalRef(g_httpParamsClazz);
|
||||
env->DeleteGlobalRef(g_socketWrapperClazz);
|
||||
env->DeleteGlobalRef(g_platformSocketClazz);
|
||||
env->DeleteGlobalRef(g_utilsClazz);
|
||||
}
|
||||
} // extern "C"
|
||||
|
|
|
@ -14,7 +14,7 @@ extern jclass g_bookmarkClazz;
|
|||
extern jclass g_myTrackerClazz;
|
||||
extern jclass g_httpClientClazz;
|
||||
extern jclass g_httpParamsClazz;
|
||||
extern jclass g_socketWrapperClazz;
|
||||
extern jclass g_platformSocketClazz;
|
||||
extern jclass g_utilsClazz;
|
||||
|
||||
namespace jni
|
||||
|
|
|
@ -670,8 +670,9 @@ Java_com_mapswithme_maps_Framework_nativeGetDistanceAndAzimuthFromLatLon(
|
|||
JNIEXPORT jobject JNICALL
|
||||
Java_com_mapswithme_maps_Framework_nativeFormatLatLon(JNIEnv * env, jclass, jdouble lat, jdouble lon, jboolean useDMSFormat)
|
||||
{
|
||||
return jni::ToJavaString(env, (useDMSFormat ? measurement_utils::FormatLatLonAsDMS(lat, lon, 2)
|
||||
: measurement_utils::FormatLatLon(lat, lon, 6)));
|
||||
return jni::ToJavaString(
|
||||
env, (useDMSFormat ? measurement_utils::FormatLatLonAsDMS(lat, lon, 2)
|
||||
: measurement_utils::FormatLatLon(lat, lon, true /* withSemicolon */, 6)));
|
||||
}
|
||||
|
||||
JNIEXPORT jobjectArray JNICALL
|
||||
|
|
|
@ -36,7 +36,7 @@ JNIEXPORT void JNICALL
|
|||
Java_com_mapswithme_maps_bookmarks_data_BookmarkManager_nativeShowBookmarkOnMap(
|
||||
JNIEnv * env, jobject thiz, jint c, jint b)
|
||||
{
|
||||
BookmarkAndCategory bnc = BookmarkAndCategory(b,c);
|
||||
BookmarkAndCategory bnc = BookmarkAndCategory(b, c);
|
||||
frm()->ShowBookmark(bnc);
|
||||
}
|
||||
|
||||
|
@ -109,7 +109,7 @@ Java_com_mapswithme_maps_bookmarks_data_BookmarkManager_nativeAddBookmarkToLastE
|
|||
size_t const lastEditedCategory = f->LastEditedBMCategory();
|
||||
size_t const createdBookmarkIndex = f->AddBookmark(lastEditedCategory, glbPoint, bmkData);
|
||||
place_page::Info & info = g_framework->GetPlacePageInfo();
|
||||
info.m_bac = {lastEditedCategory, createdBookmarkIndex};
|
||||
info.m_bac = {createdBookmarkIndex, lastEditedCategory};
|
||||
return usermark_helper::CreateMapObject(env, info);
|
||||
}
|
||||
|
||||
|
|
|
@ -10,8 +10,8 @@ public:
|
|||
SocketImpl()
|
||||
{
|
||||
JNIEnv * env = jni::GetEnv();
|
||||
static jmethodID const socketConstructor = jni::GetConstructorID(env, g_socketWrapperClazz, "()V");
|
||||
jni::TScopedLocalRef localSelf(env, env->NewObject(g_socketWrapperClazz, socketConstructor));
|
||||
static jmethodID const socketConstructor = jni::GetConstructorID(env, g_platformSocketClazz, "()V");
|
||||
jni::TScopedLocalRef localSelf(env, env->NewObject(g_platformSocketClazz, socketConstructor));
|
||||
m_self = env->NewGlobalRef(localSelf.get());
|
||||
ASSERT(m_self, ());
|
||||
}
|
||||
|
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 557 B |
BIN
android/res/drawable-hdpi/img_whatsnew_uber.png
Normal file
After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 995 B After Width: | Height: | Size: 392 B |
BIN
android/res/drawable-mdpi/img_whatsnew_uber.png
Normal file
After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 708 B |
BIN
android/res/drawable-xhdpi/img_whatsnew_uber.png
Normal file
After Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 1.1 KiB |
BIN
android/res/drawable-xxhdpi/img_whatsnew_uber.png
Normal file
After Width: | Height: | Size: 90 KiB |
BIN
android/res/drawable-xxxhdpi/img_whatsnew_uber.png
Normal file
After Width: | Height: | Size: 58 KiB |
|
@ -9,6 +9,11 @@
|
|||
android:visibility="invisible"
|
||||
tools:visibility="visible">
|
||||
|
||||
<WebView
|
||||
android:id="@+id/wv__bookmark_notes"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv__bookmark_notes"
|
||||
android:layout_width="match_parent"
|
||||
|
|
|
@ -1,11 +1,14 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Button xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/start"
|
||||
android:layout_width="@dimen/start_button_width"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:text="@string/p2p_start"
|
||||
style="@style/MwmWidget.Button.Start"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body1"
|
||||
tools:showIn="@layout/menu_route_plan_line"/>
|
||||
<Button
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/start"
|
||||
android:layout_width="wrap_content"
|
||||
android:minWidth="@dimen/start_button_width"
|
||||
android:padding="@dimen/margin_half"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:text="@string/p2p_start"
|
||||
style="@style/MwmWidget.Button.Start"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body1"
|
||||
tools:showIn="@layout/menu_route_plan_line"/>
|
||||
|
|
|
@ -721,7 +721,7 @@
|
|||
<!-- title above languages list cells in the editor, below editable name text field. -->
|
||||
<string name="other_languages">لغات أخرى</string>
|
||||
<!-- small button to open list with names in different languages -->
|
||||
<string name="show_more">إظهار المزيد</string>
|
||||
<string name="show_more">إظهار أكثر</string>
|
||||
<!-- small button to close list with names in different languages -->
|
||||
<string name="show_less">إظهار أقل</string>
|
||||
<string name="add_language">إضافة لغة</string>
|
||||
|
@ -953,4 +953,44 @@
|
|||
<string name="whats_new_route_profile_message">بالنسبة لمسارات المشاة والدراجات نحن الآن نعرض تشكيل الارتفاع.</string>
|
||||
<string name="whats_new_booking_improve_title">توفير عند حجز الفنادق</string>
|
||||
<string name="whats_new_booking_improve_message">تحتوي نتائج البحث عن الفنادق الآن على فئة السعر.\nوأضفنا أيضًا أكثر من 110000 فندق.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">مرافق</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">قريبة</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">ترتيب</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">متوقع في %s</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">لا يمكن العثور على تاكسي قريب</string>
|
||||
<string name="install_app">تثبيت</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">عامل التصفية</string>
|
||||
<string name="booking_filters_reset">إعادة تعيين</string>
|
||||
<string name="booking_filters_rating">تصنيف</string>
|
||||
<string name="booking_filters_rating_any">أي</string>
|
||||
<string name="booking_filters_ragting_good">جيد</string>
|
||||
<string name="booking_filters_rating_very_good">جيد جداً</string>
|
||||
<string name="booking_filters_rating_excellent">ممتاز</string>
|
||||
<string name="booking_filters_price_category">فئة الأسعار</string>
|
||||
<string name="booking_filters_no_results">لم يتم العثور على نتائج</string>
|
||||
<string name="booking_filters_nores_message">جرب مصطلح بحث أكثر عمومية أو التصغير أو إعادة تعيين عامل التصفية.</string>
|
||||
<string name="booking_filters_expand_area_button">تصغير</string>
|
||||
<string name="booking_filters_reset_button">إعادة تعيين عامل التصفية</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">قائمة</string>
|
||||
<string name="booking_based_on_reviews">استناداً إلى %d من مراجعات الفنادق</string>
|
||||
<string name="booking_show_more">إظهار المزيد</string>
|
||||
<string name="booking_reviews">المراجعات</string>
|
||||
<string name="booking_hotel">الفندق</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">الغرفة</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">فتح</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME وUber</string>
|
||||
<string name="whatsnew_uber_message">اطلب تاكسي Uber مباشرة من التطبيق!</string>
|
||||
<string name="dialog_taxi_offline">طلب تاكسي غير متاح في وضع الطيران.</string>
|
||||
<string name="dialog_taxi_error">طلب تاكسي غير متاح مؤقتا.</string>
|
||||
</resources>
|
||||
|
|
|
@ -722,9 +722,9 @@
|
|||
<!-- title above languages list cells in the editor, below editable name text field. -->
|
||||
<string name="other_languages">Další jazyky</string>
|
||||
<!-- small button to open list with names in different languages -->
|
||||
<string name="show_more">Zobrazit více</string>
|
||||
<string name="show_more">Zobrazit méně</string>
|
||||
<!-- small button to close list with names in different languages -->
|
||||
<string name="show_less">Zobrazit méně</string>
|
||||
<string name="show_less">Zobrazit více</string>
|
||||
<string name="add_language">Přidat jazyk</string>
|
||||
<string name="street">Ulice</string>
|
||||
<!-- Editable House Number text field (in address block). -->
|
||||
|
@ -954,4 +954,44 @@
|
|||
<string name="whats_new_route_profile_message">U pěších a cyklistických tras nyní zobrazujeme výškový profil.</string>
|
||||
<string name="whats_new_booking_improve_title">Ušetřete při rezervaci hotelů</string>
|
||||
<string name="whats_new_booking_improve_message">Výsledky hledání hotelů nyní obsahují cenové kategorie. \nTaké jsme přidali více než 110 000 hotelů.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">Vybavení</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">Nedaleké</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">Objednat</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">Očekávaný příjezd za %s</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">Nelze najít taxi v okolí</string>
|
||||
<string name="install_app">Instalovat</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">Filtr</string>
|
||||
<string name="booking_filters_reset">Reset</string>
|
||||
<string name="booking_filters_rating">Hodnocení</string>
|
||||
<string name="booking_filters_rating_any">Jakékoli</string>
|
||||
<string name="booking_filters_ragting_good">Dobré</string>
|
||||
<string name="booking_filters_rating_very_good">Velmi dobré</string>
|
||||
<string name="booking_filters_rating_excellent">Vynikající</string>
|
||||
<string name="booking_filters_price_category">Cenová kategorie</string>
|
||||
<string name="booking_filters_no_results">Nebyly nalezeny žádné výsledky</string>
|
||||
<string name="booking_filters_nores_message">Zkuste obecnější hledaný výraz, oddálit nebo obnovit filtr.</string>
|
||||
<string name="booking_filters_expand_area_button">Oddálit</string>
|
||||
<string name="booking_filters_reset_button">Resetovat filtr</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Seznam</string>
|
||||
<string name="booking_based_on_reviews">Podle %d hodnocení hotelů</string>
|
||||
<string name="booking_show_more">Zobrazit více</string>
|
||||
<string name="booking_reviews">Hodnocení</string>
|
||||
<string name="booking_hotel">Hotel</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Pokoj</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Otevřít</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME a Uber</string>
|
||||
<string name="whatsnew_uber_message">Objednejte si taxi Uber přímo z aplikace!</string>
|
||||
<string name="dialog_taxi_offline">Objednání taxi není v režimu offline k dispozici.</string>
|
||||
<string name="dialog_taxi_error">Objednání taxi není dočasně k dispozici.</string>
|
||||
</resources>
|
||||
|
|
|
@ -951,4 +951,44 @@
|
|||
<string name="whats_new_route_profile_message">Vi viser nu højdeprofilen for fodgænger- og cykelruter.</string>
|
||||
<string name="whats_new_booking_improve_title">Spar penge når du bestiller hotelværelser</string>
|
||||
<string name="whats_new_booking_improve_message">Søgeresultater for hoteller viser nu også priskategorien.\nVi har desuden tilføjet mere end 110.000 hoteller.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">Faciliteter</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">I nærheden</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">Bestil</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">Forventes om %s</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">Kunne ikke finde en taxi i nærheden</string>
|
||||
<string name="install_app">Installer</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">Filter</string>
|
||||
<string name="booking_filters_reset">Nulstil</string>
|
||||
<string name="booking_filters_rating">Vurdering</string>
|
||||
<string name="booking_filters_rating_any">Hvilken som helst</string>
|
||||
<string name="booking_filters_ragting_good">God</string>
|
||||
<string name="booking_filters_rating_very_good">Meget god</string>
|
||||
<string name="booking_filters_rating_excellent">Fremragende</string>
|
||||
<string name="booking_filters_price_category">Prisklasse</string>
|
||||
<string name="booking_filters_no_results">Ingen resultater fundet</string>
|
||||
<string name="booking_filters_nores_message">Prøv et mere generelt søgeudtryk, zoom ud eller nulstil filteret.</string>
|
||||
<string name="booking_filters_expand_area_button">Zoom ud</string>
|
||||
<string name="booking_filters_reset_button">Nulstil Filter</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Liste</string>
|
||||
<string name="booking_based_on_reviews">Baseret på %d hotelanmeldelser</string>
|
||||
<string name="booking_show_more">Vis mere</string>
|
||||
<string name="booking_reviews">Anmeldelser</string>
|
||||
<string name="booking_hotel">Hotel</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Værelse</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Åbn</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME & Uber</string>
|
||||
<string name="whatsnew_uber_message">Bestil Uber taxi direkte fra app\'en!</string>
|
||||
<string name="dialog_taxi_offline">Det er ikke muligt at bestille en taxi i offlinetilstand.</string>
|
||||
<string name="dialog_taxi_error">Bestilling af en taxi er ikke muligt lige nu.</string>
|
||||
</resources>
|
||||
|
|
|
@ -965,4 +965,44 @@
|
|||
<string name="whats_new_route_profile_message">Für Fußgänger- und Fahrradrouten zeigen wir nun das Höhenprofil an.</string>
|
||||
<string name="whats_new_booking_improve_title">Beim Buchen von Hotels sparen</string>
|
||||
<string name="whats_new_booking_improve_message">Suchergebnisse für Hotels enthalten jetzt die Kategorie Preis.\nAußerdem haben wir über 110.000 Hotels hinzugefügt.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">Ausstattung</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">In der Nähe</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">Bestellen</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">Erwartet in %s</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">Es konnte kein Taxi in der Nähe gefunden werden</string>
|
||||
<string name="install_app">Installieren</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">Filter</string>
|
||||
<string name="booking_filters_reset">Zurücksetzen</string>
|
||||
<string name="booking_filters_rating">Bewertung</string>
|
||||
<string name="booking_filters_rating_any">Alle</string>
|
||||
<string name="booking_filters_ragting_good">Gut</string>
|
||||
<string name="booking_filters_rating_very_good">Sehr gut</string>
|
||||
<string name="booking_filters_rating_excellent">Ausgezeichnet</string>
|
||||
<string name="booking_filters_price_category">Preiskategorie</string>
|
||||
<string name="booking_filters_no_results">Keine Ergebnisse gefunden</string>
|
||||
<string name="booking_filters_nores_message">Versuchen Sie es mit einem allgemeineren Suchbegriff, zoomen Sie heraus oder setzen Sie den Filter zurück.</string>
|
||||
<string name="booking_filters_expand_area_button">Herauszoomen</string>
|
||||
<string name="booking_filters_reset_button">Filter zurücksetzen</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Liste</string>
|
||||
<string name="booking_based_on_reviews">Basierend auf %d Hotelbewertungen</string>
|
||||
<string name="booking_show_more">Mehr anzeigen</string>
|
||||
<string name="booking_reviews">Bewertungen</string>
|
||||
<string name="booking_hotel">Hotel</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Zimmer</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Öffnen</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME und Uber</string>
|
||||
<string name="whatsnew_uber_message">Uber-Taxi direkt über die App bestellen!</string>
|
||||
<string name="dialog_taxi_offline">Das Bestellen eines Taxis ist im Offline-Modus nicht verfügbar.</string>
|
||||
<string name="dialog_taxi_error">Das Bestellen eines Taxis ist vorübergehend nicht verfügbar.</string>
|
||||
</resources>
|
||||
|
|
|
@ -759,7 +759,7 @@
|
|||
<string name="placepage_report_problem_button">Informar de un problema</string>
|
||||
<string name="placepage_add_business_button">Añadir organización</string>
|
||||
<string name="whatsnew_smallmwm_header">Llevas tiempo pidiéndolo y lo hemos hecho</string>
|
||||
<string name="whatsnew_smallmwm_message">Hemos dividido el mapa por partes. Ahora, puedes descargar regiones individuales, en vez de el país entero.</string>
|
||||
<string name="whatsnew_smallmwm_message">Hemos dividido el mapa por partes. Ahora, puedes descargar regiones individuales, en vez del país entero.</string>
|
||||
<string name="whatsnew_search_header">Nueva búsqueda</string>
|
||||
<string name="whatsnew_search_message">Hemos mejorado notablemente la búsqueda por dirección. Compruébalo.</string>
|
||||
<string name="whatsnew_editor_title">Editar el mapa*</string>
|
||||
|
@ -940,4 +940,44 @@
|
|||
<string name="whats_new_route_profile_message">Ahora se muestra el perfil de elevación en los itinerarios pedestres y en bicicleta.</string>
|
||||
<string name="whats_new_booking_improve_title">Ahorrar al reservar hoteles</string>
|
||||
<string name="whats_new_booking_improve_message">La búsqueda de resultados de hoteles ahora contiene la categoría de precios.\nHemos añadido más de 110 000 hoteles.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">Instalaciones</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">Cercano</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">Pedir</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">Se espera en %s</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">No se puede encontrar un taxi cerca</string>
|
||||
<string name="install_app">Instalar</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">Filtrar</string>
|
||||
<string name="booking_filters_reset">Restablecer</string>
|
||||
<string name="booking_filters_rating">Clasificación</string>
|
||||
<string name="booking_filters_rating_any">Cualquier</string>
|
||||
<string name="booking_filters_ragting_good">Bueno</string>
|
||||
<string name="booking_filters_rating_very_good">Muy bueno</string>
|
||||
<string name="booking_filters_rating_excellent">Excelente</string>
|
||||
<string name="booking_filters_price_category">Categoría de precios</string>
|
||||
<string name="booking_filters_no_results">No se han encontrado resultados</string>
|
||||
<string name="booking_filters_nores_message">Pruebe un término de búsqueda general, aléjese o restablezca el filtro.</string>
|
||||
<string name="booking_filters_expand_area_button">Alejarse</string>
|
||||
<string name="booking_filters_reset_button">Restablecer filtro</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Lista</string>
|
||||
<string name="booking_based_on_reviews">Basado en %d reseñas de hoteles</string>
|
||||
<string name="booking_show_more">Mostrar más</string>
|
||||
<string name="booking_reviews">Reseñas</string>
|
||||
<string name="booking_hotel">Hotel</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Habitación</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Abrir</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME & Uber</string>
|
||||
<string name="whatsnew_uber_message">¡Pide un taxi Uber directamente desde la aplicación!</string>
|
||||
<string name="dialog_taxi_offline">La opción para solicitar un taxi no se encuentra disponible en el modo sin conexión.</string>
|
||||
<string name="dialog_taxi_error">La opción para solicitar un taxi se encuentra temporalmente no disponible.</string>
|
||||
</resources>
|
||||
|
|
|
@ -715,7 +715,7 @@
|
|||
<!-- title above languages list cells in the editor, below editable name text field. -->
|
||||
<string name="other_languages">Muut Kielet</string>
|
||||
<!-- small button to open list with names in different languages -->
|
||||
<string name="show_more">Näytä lisää</string>
|
||||
<string name="show_more">Näytä enemmän</string>
|
||||
<!-- small button to close list with names in different languages -->
|
||||
<string name="show_less">Näytä vähemmän</string>
|
||||
<string name="add_language">Lisää kieli</string>
|
||||
|
@ -947,4 +947,44 @@
|
|||
<string name="whats_new_route_profile_message">Näytämme nyt maaston korkeuden kävely- ja pyöräilyreittejä varten.</string>
|
||||
<string name="whats_new_booking_improve_title">Säästä hotellivarauksissa</string>
|
||||
<string name="whats_new_booking_improve_message">Hotellien hakutuloksissa näkyy nyt hintakategoria.\nLisäsimme myös yli 110 000 hotellia.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">Palvelut</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">Lähellä</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">Tilaa</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">Saapumiseen arviolta %s</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">Läheltä ei löytynyt taksia</string>
|
||||
<string name="install_app">Asenna</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">Suodatin</string>
|
||||
<string name="booking_filters_reset">Palauta</string>
|
||||
<string name="booking_filters_rating">Arvio</string>
|
||||
<string name="booking_filters_rating_any">Kaikki</string>
|
||||
<string name="booking_filters_ragting_good">Hyvä</string>
|
||||
<string name="booking_filters_rating_very_good">Todella hyvä</string>
|
||||
<string name="booking_filters_rating_excellent">Erinomainen</string>
|
||||
<string name="booking_filters_price_category">Hintaluokka</string>
|
||||
<string name="booking_filters_no_results">Ei hakutuloksia</string>
|
||||
<string name="booking_filters_nores_message">Kokeile yleisempää hakusanaa, loitonna tai palauta suodatin.</string>
|
||||
<string name="booking_filters_expand_area_button">Loitonna</string>
|
||||
<string name="booking_filters_reset_button">Palauta suodatin</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Luettelo</string>
|
||||
<string name="booking_based_on_reviews">Perustuu %d hotelliarvioon</string>
|
||||
<string name="booking_show_more">Näytä lisää</string>
|
||||
<string name="booking_reviews">Arviot</string>
|
||||
<string name="booking_hotel">Hotelli</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Huone</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Avaa</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME & Uber</string>
|
||||
<string name="whatsnew_uber_message">Tilaa Uber -taksi suoraan sovelluksesta!</string>
|
||||
<string name="dialog_taxi_offline">Taksin tilaaminen ei ole mahdollista ilman verkkoyhteyttä.</string>
|
||||
<string name="dialog_taxi_error">Taksin tilaaminen ei ole tällä hetkellä mahdollista.</string>
|
||||
</resources>
|
||||
|
|
|
@ -732,9 +732,9 @@
|
|||
<!-- title above languages list cells in the editor, below editable name text field. -->
|
||||
<string name="other_languages">Autres langues</string>
|
||||
<!-- small button to open list with names in different languages -->
|
||||
<string name="show_more">Afficher plus</string>
|
||||
<string name="show_more">Montrer plus</string>
|
||||
<!-- small button to close list with names in different languages -->
|
||||
<string name="show_less">Afficher moins</string>
|
||||
<string name="show_less">Montrer moins</string>
|
||||
<string name="add_language">Ajouter une langue</string>
|
||||
<string name="street">Rue</string>
|
||||
<!-- Editable House Number text field (in address block). -->
|
||||
|
@ -964,4 +964,44 @@
|
|||
<string name="whats_new_route_profile_message">Pour les routes pédestres et cyclables nous affichons maintenant le profil d\'élévation.</string>
|
||||
<string name="whats_new_booking_improve_title">Économisez de l\'argent en réservant des hôtels</string>
|
||||
<string name="whats_new_booking_improve_message">Les résultats des recherches d\'hôtels comprennent maintenant la catégorie de prix.\nNous avons aussi ajouté plus de 110.000 hôtels.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">Installations</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">À proximité</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">Commander</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">Attendu dans %s</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">Impossible de trouver un taxi à proximité</string>
|
||||
<string name="install_app">Installer</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">Filtrer</string>
|
||||
<string name="booking_filters_reset">Réinitialiser</string>
|
||||
<string name="booking_filters_rating">Note</string>
|
||||
<string name="booking_filters_rating_any">N’importe quel</string>
|
||||
<string name="booking_filters_ragting_good">Bon</string>
|
||||
<string name="booking_filters_rating_very_good">Très bon</string>
|
||||
<string name="booking_filters_rating_excellent">Excellent</string>
|
||||
<string name="booking_filters_price_category">Catégorie de prix</string>
|
||||
<string name="booking_filters_no_results">Aucun résultat trouvé</string>
|
||||
<string name="booking_filters_nores_message">Essayez un terme de recherche plus général , effectuez un zoom arrière ou réinitialisez le filtre.</string>
|
||||
<string name="booking_filters_expand_area_button">Zoom arrière</string>
|
||||
<string name="booking_filters_reset_button">Réinitialiser le filtre</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Liste</string>
|
||||
<string name="booking_based_on_reviews">Basé sur %d revues d\'hôtels</string>
|
||||
<string name="booking_show_more">Afficher plus</string>
|
||||
<string name="booking_reviews">Revues</string>
|
||||
<string name="booking_hotel">Hôtel</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Chambre</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Ouvrir</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME & Uber</string>
|
||||
<string name="whatsnew_uber_message">Commandez un taxi directement depuis l\'appli !</string>
|
||||
<string name="dialog_taxi_offline">La commande d\'un taxi n\'est pas disponible en mode hors ligne.</string>
|
||||
<string name="dialog_taxi_error">La commande d\'un taxi est temporairement indisponible.</string>
|
||||
</resources>
|
||||
|
|
|
@ -716,9 +716,9 @@
|
|||
<!-- title above languages list cells in the editor, below editable name text field. -->
|
||||
<string name="other_languages">Más nyelv</string>
|
||||
<!-- small button to open list with names in different languages -->
|
||||
<string name="show_more">Továbbiak megjelenítése</string>
|
||||
<string name="show_more">Több mutatása</string>
|
||||
<!-- small button to close list with names in different languages -->
|
||||
<string name="show_less">Kevesebb megjelenítése</string>
|
||||
<string name="show_less">Kevesebb mutatása</string>
|
||||
<string name="add_language">Nyelv hozzáadása</string>
|
||||
<string name="street">Utca</string>
|
||||
<!-- Editable House Number text field (in address block). -->
|
||||
|
@ -947,4 +947,44 @@
|
|||
<string name="whats_new_route_profile_message">A gyalogos és kerékpáros utakat most már emelkedési profillal jelenítjük meg.</string>
|
||||
<string name="whats_new_booking_improve_title">Takarékoskodjon szálláshely foglalásakor</string>
|
||||
<string name="whats_new_booking_improve_message">A szálláshely keresési eredménye már tartalmazza az árkategóriát. \nEmellett kiegészítettük több mint 110.000 szálláshellyel.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">Létesítmények</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">Közeli</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">Rendelés</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">Várható %s</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">Nem talált taxit a közelben</string>
|
||||
<string name="install_app">Telepítés</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">Szűrő</string>
|
||||
<string name="booking_filters_reset">Alaphelyzetbe állítás</string>
|
||||
<string name="booking_filters_rating">Minősítés</string>
|
||||
<string name="booking_filters_rating_any">Bármelyik</string>
|
||||
<string name="booking_filters_ragting_good">Jó</string>
|
||||
<string name="booking_filters_rating_very_good">Nagyon jó</string>
|
||||
<string name="booking_filters_rating_excellent">Kiváló</string>
|
||||
<string name="booking_filters_price_category">Árkategória</string>
|
||||
<string name="booking_filters_no_results">Nincs találat</string>
|
||||
<string name="booking_filters_nores_message">Próbálkozzon általánosabb kereső kifejezéssel, tágítsa vagy törölje a szűrőt.</string>
|
||||
<string name="booking_filters_expand_area_button">Kicsinyítés</string>
|
||||
<string name="booking_filters_reset_button">Szűrő nullázása</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Lista</string>
|
||||
<string name="booking_based_on_reviews">%d hotel-értékelés alapján</string>
|
||||
<string name="booking_show_more">Több megjelenítése</string>
|
||||
<string name="booking_reviews">Bírálatok</string>
|
||||
<string name="booking_hotel">Szálloda</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Szoba</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Megnyitás</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME és Uber</string>
|
||||
<string name="whatsnew_uber_message">Hívj Uber-taxit közvetlenül az alkalmazásból!</string>
|
||||
<string name="dialog_taxi_offline">Taxirendelés offline módban nem lehetséges.</string>
|
||||
<string name="dialog_taxi_error">A taxirendelés átmenetileg nem elérhető.</string>
|
||||
</resources>
|
||||
|
|
|
@ -714,9 +714,9 @@
|
|||
<!-- title above languages list cells in the editor, below editable name text field. -->
|
||||
<string name="other_languages">Bahasa lainnya</string>
|
||||
<!-- small button to open list with names in different languages -->
|
||||
<string name="show_more">Selengkapnya</string>
|
||||
<string name="show_more">Tampilkan lebih banyak</string>
|
||||
<!-- small button to close list with names in different languages -->
|
||||
<string name="show_less">Kurangi</string>
|
||||
<string name="show_less">Tampilkan lebih sedikit</string>
|
||||
<string name="add_language">Tambahkan bahasa</string>
|
||||
<string name="street">Jalan</string>
|
||||
<!-- Editable House Number text field (in address block). -->
|
||||
|
@ -946,4 +946,44 @@
|
|||
<string name="whats_new_route_profile_message">Untuk rute pejalan kaki dan sepeda, kami kini menampilkan profil elevasi.</string>
|
||||
<string name="whats_new_booking_improve_title">Berhemat saat memesan hotel</string>
|
||||
<string name="whats_new_booking_improve_message">Hasil pencarian untuk hotel kini disertai kategori harga.\nKami juga menambahkan lebih dari 110.000 hotel.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">Fasilitas</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">Dekat</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">Pesan</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">Diharapkan dalam %s</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">Tidak dapat menemukan taksi di dekat lokasi</string>
|
||||
<string name="install_app">Pasang</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">Filter</string>
|
||||
<string name="booking_filters_reset">Atur ulang</string>
|
||||
<string name="booking_filters_rating">Peringkat</string>
|
||||
<string name="booking_filters_rating_any">Apa saja</string>
|
||||
<string name="booking_filters_ragting_good">Bagus</string>
|
||||
<string name="booking_filters_rating_very_good">Sangat Bagus</string>
|
||||
<string name="booking_filters_rating_excellent">Luar Biasa</string>
|
||||
<string name="booking_filters_price_category">Kategori Harga</string>
|
||||
<string name="booking_filters_no_results">Tidak Ada Hasil</string>
|
||||
<string name="booking_filters_nores_message">Cobalah dengan istilah pencarian yang lebih umum, perkecil atau atur ulang filter.</string>
|
||||
<string name="booking_filters_expand_area_button">Perkecil</string>
|
||||
<string name="booking_filters_reset_button">Atur Ulang Filter</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Daftar</string>
|
||||
<string name="booking_based_on_reviews">Berdasarkan %d ulasan hotel</string>
|
||||
<string name="booking_show_more">Selengkapnya</string>
|
||||
<string name="booking_reviews">Ulasan</string>
|
||||
<string name="booking_hotel">Hotel</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Kamar</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Buka</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME & Uber</string>
|
||||
<string name="whatsnew_uber_message">Pesan taksi Uber langsung dari aplikasi!</string>
|
||||
<string name="dialog_taxi_offline">Memesan taksi tidak tersedia dalam modus offline.</string>
|
||||
<string name="dialog_taxi_error">Memesan taksi untuk sementara tidak tersedia.</string>
|
||||
</resources>
|
||||
|
|
|
@ -714,7 +714,7 @@
|
|||
<!-- title above languages list cells in the editor, below editable name text field. -->
|
||||
<string name="other_languages">Altre lingue</string>
|
||||
<!-- small button to open list with names in different languages -->
|
||||
<string name="show_more">Mostra altro</string>
|
||||
<string name="show_more">Mostra più</string>
|
||||
<!-- small button to close list with names in different languages -->
|
||||
<string name="show_less">Mostra meno</string>
|
||||
<string name="add_language">Aggiungi una lingua</string>
|
||||
|
@ -946,4 +946,44 @@
|
|||
<string name="whats_new_route_profile_message">Per gli itinerari pedonali e ciclabili, è ora visualizzato il profilo altimetrico.</string>
|
||||
<string name="whats_new_booking_improve_title">Risparmia alla prenotazione degli hotel</string>
|
||||
<string name="whats_new_booking_improve_message">I risultati della ricerca per gli hotel contengono ora la categoria di prezzo.\nInoltre, abbiamo aggiunto più di 110.000 hotel.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">Servizi</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">Nelle vicinanze</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">Prenota</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">Atteso in %s</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">Impossibile trovare un taxi nelle vicinanze</string>
|
||||
<string name="install_app">Installa</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">Filtro</string>
|
||||
<string name="booking_filters_reset">Reimposta</string>
|
||||
<string name="booking_filters_rating">Voto</string>
|
||||
<string name="booking_filters_rating_any">Qualsiasi</string>
|
||||
<string name="booking_filters_ragting_good">Buono</string>
|
||||
<string name="booking_filters_rating_very_good">Molto buono</string>
|
||||
<string name="booking_filters_rating_excellent">Eccellente</string>
|
||||
<string name="booking_filters_price_category">Categoria di prezzo</string>
|
||||
<string name="booking_filters_no_results">Nessun risultato trovato</string>
|
||||
<string name="booking_filters_nores_message">Prova con un termine di ricerca più generale, fai lo zoom indietro o reimposta il filtro.</string>
|
||||
<string name="booking_filters_expand_area_button">Zoom indietro</string>
|
||||
<string name="booking_filters_reset_button">Reimposta filtro</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Elenco</string>
|
||||
<string name="booking_based_on_reviews">Basato su %d recensioni d\'hotel</string>
|
||||
<string name="booking_show_more">Mostra altro</string>
|
||||
<string name="booking_reviews">Recensioni</string>
|
||||
<string name="booking_hotel">Hotel</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Camera</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">GeoChat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Apri</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME e Uber</string>
|
||||
<string name="whatsnew_uber_message">Prenota un taxi Uber direttamente dalla app!</string>
|
||||
<string name="dialog_taxi_offline">La chiamata taxi non è disponibile in modalità offline.</string>
|
||||
<string name="dialog_taxi_error">La chiamata taxi è temporaneamente non disponibile.</string>
|
||||
</resources>
|
||||
|
|
|
@ -714,9 +714,9 @@
|
|||
<!-- title above languages list cells in the editor, below editable name text field. -->
|
||||
<string name="other_languages">その他の言語</string>
|
||||
<!-- small button to open list with names in different languages -->
|
||||
<string name="show_more">表示を増やす</string>
|
||||
<string name="show_more">もっと表示</string>
|
||||
<!-- small button to close list with names in different languages -->
|
||||
<string name="show_less">表示を減らす</string>
|
||||
<string name="show_less">少なく表示</string>
|
||||
<string name="add_language">言語を追加</string>
|
||||
<string name="street">通り</string>
|
||||
<!-- Editable House Number text field (in address block). -->
|
||||
|
@ -946,4 +946,44 @@
|
|||
<string name="whats_new_route_profile_message">歩行者とバイク用のルートに高度プロファイルが表示されるようになりました。</string>
|
||||
<string name="whats_new_booking_improve_title">ホテル予約時に節約しましょう</string>
|
||||
<string name="whats_new_booking_improve_message">ホテルの検索結果に価格のカテゴリーが表示されるようになりました。\nさらに、 110,000 軒を超えるホテルを追加しました。</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">施設</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">近隣</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">予約</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">%s 後に到着予定</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">近隣にタクシーは見つかりませんでした</string>
|
||||
<string name="install_app">インストール</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">フィルター</string>
|
||||
<string name="booking_filters_reset">リセット</string>
|
||||
<string name="booking_filters_rating">評価</string>
|
||||
<string name="booking_filters_rating_any">すべて</string>
|
||||
<string name="booking_filters_ragting_good">良い</string>
|
||||
<string name="booking_filters_rating_very_good">非常に良い</string>
|
||||
<string name="booking_filters_rating_excellent">最高</string>
|
||||
<string name="booking_filters_price_category">価格帯</string>
|
||||
<string name="booking_filters_no_results">結果が見つかりません</string>
|
||||
<string name="booking_filters_nores_message">一般的な検索語句や、フィルター範囲を広げたりリセットしたりしてください。</string>
|
||||
<string name="booking_filters_expand_area_button">広げる</string>
|
||||
<string name="booking_filters_reset_button">フィルターをリセット</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">一覧</string>
|
||||
<string name="booking_based_on_reviews">%d 件のホテルのレビューに基づいています</string>
|
||||
<string name="booking_show_more">さらに表示</string>
|
||||
<string name="booking_reviews">レビュー</string>
|
||||
<string name="booking_hotel">ホテル</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">部屋</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">ジオチャット</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">開始</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME & Uber</string>
|
||||
<string name="whatsnew_uber_message">アプリから直接Uberの配車リクエストができます!</string>
|
||||
<string name="dialog_taxi_offline">タクシーの予約がオフラインモードでは使用できません。</string>
|
||||
<string name="dialog_taxi_error">タクシーの予約が一時的に使用できません。</string>
|
||||
</resources>
|
||||
|
|
|
@ -711,9 +711,9 @@
|
|||
<!-- title above languages list cells in the editor, below editable name text field. -->
|
||||
<string name="other_languages">다른 언어</string>
|
||||
<!-- small button to open list with names in different languages -->
|
||||
<string name="show_more">자세히 표시</string>
|
||||
<string name="show_more">더 많이 표시</string>
|
||||
<!-- small button to close list with names in different languages -->
|
||||
<string name="show_less">간단히 표시</string>
|
||||
<string name="show_less">더 적게 표시</string>
|
||||
<string name="add_language">언어 추가</string>
|
||||
<string name="street">거리</string>
|
||||
<!-- Editable House Number text field (in address block). -->
|
||||
|
@ -943,4 +943,44 @@
|
|||
<string name="whats_new_route_profile_message">보행자 및 자전거 도로를 위해 이제 고도 단면을 표시합니다.</string>
|
||||
<string name="whats_new_booking_improve_title">호텔 예약 시 절약</string>
|
||||
<string name="whats_new_booking_improve_message">이제 가격 범주를 포함하는 호텔에 대한 결과를 검색하세요.\n또한 110,000곳 이상의 호텔이 추가되었습니다.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">시설</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">근처</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">주문</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">%s 예상</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">근처에서 택시를 찾을 수 없음</string>
|
||||
<string name="install_app">설치</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">필터</string>
|
||||
<string name="booking_filters_reset">재설정</string>
|
||||
<string name="booking_filters_rating">평가</string>
|
||||
<string name="booking_filters_rating_any">모두</string>
|
||||
<string name="booking_filters_ragting_good">양호</string>
|
||||
<string name="booking_filters_rating_very_good">매우 양호</string>
|
||||
<string name="booking_filters_rating_excellent">탁월</string>
|
||||
<string name="booking_filters_price_category">가격 범주</string>
|
||||
<string name="booking_filters_no_results">결과 찾지 못함</string>
|
||||
<string name="booking_filters_nores_message">보다 일반적인 검색어로 시도하거나, 축소하거나, 필터를 재설정하세요.</string>
|
||||
<string name="booking_filters_expand_area_button">축소</string>
|
||||
<string name="booking_filters_reset_button">필터 재설정</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">목록</string>
|
||||
<string name="booking_based_on_reviews">%d개 호텔 리뷰 기반</string>
|
||||
<string name="booking_show_more">자세히 표시</string>
|
||||
<string name="booking_reviews">리뷰</string>
|
||||
<string name="booking_hotel">호텔</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">객실</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">열기</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME & Uber</string>
|
||||
<string name="whatsnew_uber_message">Uber 택시를 직접 앱에서 예약하세요.</string>
|
||||
<string name="dialog_taxi_offline">오프라인 모드에서는 택시를 예약할 수 없습니다.</string>
|
||||
<string name="dialog_taxi_error">일시적으로 택시를 예약할 수 없습니다.</string>
|
||||
</resources>
|
||||
|
|
|
@ -945,4 +945,42 @@
|
|||
<string name="whats_new_route_profile_message">Vi viser nå høydeprofilen med tanke på gå- og sykkelruter.</string>
|
||||
<string name="whats_new_booking_improve_title">Spar penger når du bestiller hotell</string>
|
||||
<string name="whats_new_booking_improve_message">Søkeresultatene for hoteller inneholder nå priskategori.\nVi har også lagt til flere enn 110.000 hoteller.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">Fasiliteter</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">I nærheten</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">Bestille</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">Kunne ikke finne drosje i nærheten</string>
|
||||
<string name="install_app">Installer</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">Filter</string>
|
||||
<string name="booking_filters_reset">Tilbakestille</string>
|
||||
<string name="booking_filters_rating">Vurdering</string>
|
||||
<string name="booking_filters_rating_any">Hvilken som helst</string>
|
||||
<string name="booking_filters_ragting_good">Bra</string>
|
||||
<string name="booking_filters_rating_very_good">Veldig bra</string>
|
||||
<string name="booking_filters_rating_excellent">Utmerket</string>
|
||||
<string name="booking_filters_price_category">Prisklasse</string>
|
||||
<string name="booking_filters_no_results">Fant ingen resultater</string>
|
||||
<string name="booking_filters_nores_message">Prøv et mer generelt søkeord, zoom ut eller tilbakestill filteret.</string>
|
||||
<string name="booking_filters_expand_area_button">Zoom ut</string>
|
||||
<string name="booking_filters_reset_button">Tilbakestill filter</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Liste</string>
|
||||
<string name="booking_based_on_reviews">Basert på %d hotellvurderinger</string>
|
||||
<string name="booking_show_more">Vis mer</string>
|
||||
<string name="booking_reviews">Vurderinger</string>
|
||||
<string name="booking_hotel">Hotell</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Rom</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Åpne</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME og Uber</string>
|
||||
<string name="whatsnew_uber_message">Bestill en Uber-drosje direkte fra appen!</string>
|
||||
<string name="dialog_taxi_offline">Bestilling av taxi er ikke mulig i offlinemodus.</string>
|
||||
<string name="dialog_taxi_error">Bestilling av taxi er ikke tilgjengelig for øyeblikket.</string>
|
||||
</resources>
|
||||
|
|
|
@ -715,9 +715,9 @@
|
|||
<!-- title above languages list cells in the editor, below editable name text field. -->
|
||||
<string name="other_languages">Overige talen</string>
|
||||
<!-- small button to open list with names in different languages -->
|
||||
<string name="show_more">Meer Tonen</string>
|
||||
<string name="show_more">Laat meer zien</string>
|
||||
<!-- small button to close list with names in different languages -->
|
||||
<string name="show_less">Minder Tonen</string>
|
||||
<string name="show_less">Laat minder zien</string>
|
||||
<string name="add_language">Een taal toevoegen</string>
|
||||
<string name="street">Straat</string>
|
||||
<!-- Editable House Number text field (in address block). -->
|
||||
|
@ -947,4 +947,44 @@
|
|||
<string name="whats_new_route_profile_message">Voor wandel- en fietsroutes geven we nu het hoogteprofiel weer.</string>
|
||||
<string name="whats_new_booking_improve_title">Bespaar op het boeken van hotels</string>
|
||||
<string name="whats_new_booking_improve_message">Zoekresultaten voor hotels bevatten nu de prijscategorie.\nWe hebben ook meer dan 110.000 hotels toegevoegd.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">Faciliteiten</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">In de buurt</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">Bestellen</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">Verwacht binnen %s</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">Kon geen taxi vinden in de buurt</string>
|
||||
<string name="install_app">Installeer</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">Filter</string>
|
||||
<string name="booking_filters_reset">Resetten</string>
|
||||
<string name="booking_filters_rating">Beoordeling</string>
|
||||
<string name="booking_filters_rating_any">Alle</string>
|
||||
<string name="booking_filters_ragting_good">Goed</string>
|
||||
<string name="booking_filters_rating_very_good">Heel Goed</string>
|
||||
<string name="booking_filters_rating_excellent">Uitstekend</string>
|
||||
<string name="booking_filters_price_category">Prijscategorie</string>
|
||||
<string name="booking_filters_no_results">Geen Resultaten Gevonden</string>
|
||||
<string name="booking_filters_nores_message">Probeer een meer algemene zoekterm, zoom uit of reset de filter.</string>
|
||||
<string name="booking_filters_expand_area_button">Uitzoomen</string>
|
||||
<string name="booking_filters_reset_button">Filter Resetten</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Lijst</string>
|
||||
<string name="booking_based_on_reviews">Gebaseerd op %d hotelbeoordelingen</string>
|
||||
<string name="booking_show_more">Meer weergeven</string>
|
||||
<string name="booking_reviews">Beoordelingen</string>
|
||||
<string name="booking_hotel">Hotel</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Kamer</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Openen</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME en Uber</string>
|
||||
<string name="whatsnew_uber_message">Bestel een Uber-taxi rechtstreeks vanuit de app!</string>
|
||||
<string name="dialog_taxi_offline">Het bestellen van een taxi is niet beschikbaar in de offline modus.</string>
|
||||
<string name="dialog_taxi_error">Het bestellen van een taxi is tijdelijk niet beschikbaar.</string>
|
||||
</resources>
|
||||
|
|
|
@ -954,4 +954,44 @@
|
|||
<string name="whats_new_route_profile_message">Dla tras pieszych i rowerowych pokazujemy teraz też profil wysokościowy.</string>
|
||||
<string name="whats_new_booking_improve_title">Oszczędzaj przy rezerwacji hotelów</string>
|
||||
<string name="whats_new_booking_improve_message">Wyniki wyszukiwania hoteli zawierają teraz kategorię cenową. \nDodaliśmy też ponad 110 000 hoteli.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">Obiekty hotelowe</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">W pobliżu</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">Zamów</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">Szacunkowo przybędzie za %s</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">Nie można znaleźć taksówki w pobliżu</string>
|
||||
<string name="install_app">Zainstaluj</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">Filtr</string>
|
||||
<string name="booking_filters_reset">Resetuj</string>
|
||||
<string name="booking_filters_rating">Ocena</string>
|
||||
<string name="booking_filters_rating_any">Wszelkie</string>
|
||||
<string name="booking_filters_ragting_good">Dobrze</string>
|
||||
<string name="booking_filters_rating_very_good">Bardzo dobrze</string>
|
||||
<string name="booking_filters_rating_excellent">Doskonale</string>
|
||||
<string name="booking_filters_price_category">Kategoria cenowa</string>
|
||||
<string name="booking_filters_no_results">Nie znaleziono wyników</string>
|
||||
<string name="booking_filters_nores_message">Spróbuj szerszego terminu wyszukiwania, zawęzić lub resetować filtr.</string>
|
||||
<string name="booking_filters_expand_area_button">Zawęź</string>
|
||||
<string name="booking_filters_reset_button">Resetuj filtr</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Lista</string>
|
||||
<string name="booking_based_on_reviews">Na podstawie %d opinii o hotelach</string>
|
||||
<string name="booking_show_more">Pokaż więcej</string>
|
||||
<string name="booking_reviews">Opinie</string>
|
||||
<string name="booking_hotel">Hotel</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Pokój</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Otwórz</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME i Uber</string>
|
||||
<string name="whatsnew_uber_message">Zamów taksówkę Uber bezpośrednio z aplikacji!</string>
|
||||
<string name="dialog_taxi_offline">Zamawianie taksówek nie jest dostępne w trybie offline.</string>
|
||||
<string name="dialog_taxi_error">Zamawianie taksówek jest tymczasowo niedostępne.</string>
|
||||
</resources>
|
||||
|
|
|
@ -716,7 +716,7 @@
|
|||
<!-- small button to open list with names in different languages -->
|
||||
<string name="show_more">Mostrar mais</string>
|
||||
<!-- small button to close list with names in different languages -->
|
||||
<string name="show_less">Mostrar Menos</string>
|
||||
<string name="show_less">Mostrar menos</string>
|
||||
<string name="add_language">Adicionar um idioma</string>
|
||||
<string name="street">Rua</string>
|
||||
<!-- Editable House Number text field (in address block). -->
|
||||
|
@ -946,4 +946,44 @@
|
|||
<string name="whats_new_route_profile_message">Nas rotas para peões e ciclovias apresentamos agora o perfil de elevação.</string>
|
||||
<string name="whats_new_booking_improve_title">Poupe nas reservas de hotéis</string>
|
||||
<string name="whats_new_booking_improve_message">Agora, os resultados da pesquisa de hotéis contêm a categoria de preços.\nAdicinámos mais de 110.000 hotéis.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">Instalações</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">Nas proximidades</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">Encomendar</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">Esperado em %s</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">Não consegui encontrar um táxi nas proximidades</string>
|
||||
<string name="install_app">Instalar</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">Filtrar</string>
|
||||
<string name="booking_filters_reset">Redefinir</string>
|
||||
<string name="booking_filters_rating">Classificação</string>
|
||||
<string name="booking_filters_rating_any">Qualquer</string>
|
||||
<string name="booking_filters_ragting_good">Bom</string>
|
||||
<string name="booking_filters_rating_very_good">Muito bom</string>
|
||||
<string name="booking_filters_rating_excellent">Excelente</string>
|
||||
<string name="booking_filters_price_category">Categoria de preços</string>
|
||||
<string name="booking_filters_no_results">Nenhum resultado encontrado</string>
|
||||
<string name="booking_filters_nores_message">Tente um termo de pesquisa mais geral, diminuir o zoom ou redefinir o filtro.</string>
|
||||
<string name="booking_filters_expand_area_button">Diminuir o zoom</string>
|
||||
<string name="booking_filters_reset_button">Redefinir o filtro</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Lista</string>
|
||||
<string name="booking_based_on_reviews">Com base em %d análises de hotel</string>
|
||||
<string name="booking_show_more">Mostrar mais</string>
|
||||
<string name="booking_reviews">Comentários</string>
|
||||
<string name="booking_hotel">Hotel</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Quarto</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Abrir</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME & Uber</string>
|
||||
<string name="whatsnew_uber_message">Chame um táxi Uber diretamente do aplicativo!</string>
|
||||
<string name="dialog_taxi_offline">O serviço de táxi não está disponível no modo off-line.</string>
|
||||
<string name="dialog_taxi_error">O serviço de táxi está temporariamente indisponível.</string>
|
||||
</resources>
|
||||
|
|
|
@ -712,9 +712,9 @@
|
|||
<!-- title above languages list cells in the editor, below editable name text field. -->
|
||||
<string name="other_languages">Alte limbi</string>
|
||||
<!-- small button to open list with names in different languages -->
|
||||
<string name="show_more">Arată mai multe</string>
|
||||
<string name="show_more">Afișează mai mult</string>
|
||||
<!-- small button to close list with names in different languages -->
|
||||
<string name="show_less">Arată mai puține</string>
|
||||
<string name="show_less">Afișează mai puțin</string>
|
||||
<string name="add_language">Adăugare limbă</string>
|
||||
<string name="street">Stradă</string>
|
||||
<!-- Editable House Number text field (in address block). -->
|
||||
|
@ -943,4 +943,44 @@
|
|||
<string name="whats_new_route_profile_message">Pentru rutele pentru pietoni și bicicliști, afișam acum profilul de elevație.</string>
|
||||
<string name="whats_new_booking_improve_title">Economisiți bani când rezervați hoteluri</string>
|
||||
<string name="whats_new_booking_improve_message">Rezultatele de căutare pentru hoteluri conțin acum categoria de preț. \nAm mai adăugat și peste 110.000 de hoteluri.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">Facilităţi</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">În apropiere</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">Comandă</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">Așteptat în %s</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">Nu am găsit niciun taxi în apropiere\u0020</string>
|
||||
<string name="install_app">Instalați</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">Filtrare</string>
|
||||
<string name="booking_filters_reset">Resetare</string>
|
||||
<string name="booking_filters_rating">Clasificare</string>
|
||||
<string name="booking_filters_rating_any">Oricare</string>
|
||||
<string name="booking_filters_ragting_good">Bine</string>
|
||||
<string name="booking_filters_rating_very_good">Foarte bine</string>
|
||||
<string name="booking_filters_rating_excellent">Excelent</string>
|
||||
<string name="booking_filters_price_category">Categorie de preț</string>
|
||||
<string name="booking_filters_no_results">Nu au fost găsite rezultate</string>
|
||||
<string name="booking_filters_nores_message">Încercați un termen mai general, micșorați sau resetați filtrul.</string>
|
||||
<string name="booking_filters_expand_area_button">Micșorare</string>
|
||||
<string name="booking_filters_reset_button">Resetare filtru</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Listă</string>
|
||||
<string name="booking_based_on_reviews">Bazat pe comentariile privind hotelul %d</string>
|
||||
<string name="booking_show_more">Arată mai multe</string>
|
||||
<string name="booking_reviews">Comentarii</string>
|
||||
<string name="booking_hotel">Hotel</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Cameră</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Deschideți</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME și Uber</string>
|
||||
<string name="whatsnew_uber_message">Comandați un taxi Uber direct din aplicație!</string>
|
||||
<string name="dialog_taxi_offline">Comandarea unui taxi nu se poate face în modul offline.</string>
|
||||
<string name="dialog_taxi_error">Comandarea unui taxi este momentan indisponibilă.</string>
|
||||
</resources>
|
||||
|
|
|
@ -990,12 +990,20 @@
|
|||
<string name="booking_filters_nores_message">Попробуйте задать более общий запрос, уменьшить масштаб карты или сбросить фильтр.</string>
|
||||
<string name="booking_filters_expand_area_button">Уменьшить масштаб карты</string>
|
||||
<string name="booking_filters_reset_button">Сбросить фильтр</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Список</string>
|
||||
<string name="booking_based_on_reviews">По %d отзывам об отеле</string>
|
||||
<string name="booking_show_more">Показать еще</string>
|
||||
<string name="booking_reviews">Отзывы</string>
|
||||
<string name="booking_hotel">Отель</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Номер</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Геочат</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Открыть</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME и Uber</string>
|
||||
<string name="whatsnew_uber_message">Закажите такси прямо из приложения!</string>
|
||||
<string name="dialog_taxi_offline">Заказ такси недоступен офлайн.</string>
|
||||
<string name="dialog_taxi_error">Заказ такси временно недоступен.</string>
|
||||
</resources>
|
||||
|
|
|
@ -718,9 +718,9 @@
|
|||
<!-- title above languages list cells in the editor, below editable name text field. -->
|
||||
<string name="other_languages">Iné jazyky</string>
|
||||
<!-- small button to open list with names in different languages -->
|
||||
<string name="show_more">Ukázať viac</string>
|
||||
<string name="show_more">Zobraziť viac</string>
|
||||
<!-- small button to close list with names in different languages -->
|
||||
<string name="show_less">Ukázať menej</string>
|
||||
<string name="show_less">Zobraziť menej</string>
|
||||
<string name="add_language">Pridať jazyk</string>
|
||||
<string name="street">Ulica</string>
|
||||
<!-- Editable House Number text field (in address block). -->
|
||||
|
@ -950,4 +950,44 @@
|
|||
<string name="whats_new_route_profile_message">Pre pešie trasy a cyklotrasy sa odteraz zobrazuje aj výškový profil.</string>
|
||||
<string name="whats_new_booking_improve_title">Ušetriť pri rezervácii hotelov</string>
|
||||
<string name="whats_new_booking_improve_message">Výsledky vyhľadávania hotelov odteraz obsahujú aj cenové kategórie. \nTiež sme pridali viac ako 110 000 hotelov.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">Zariadenia</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">V blízkosti</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">Objednať</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">Očakávaný príjazd o %s</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">V okolí sa nepodarilo nájsť žiaden taxík</string>
|
||||
<string name="install_app">Nainštalovať</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">Filter</string>
|
||||
<string name="booking_filters_reset">Obnoviť</string>
|
||||
<string name="booking_filters_rating">Hodnotenie</string>
|
||||
<string name="booking_filters_rating_any">Akékoľvek</string>
|
||||
<string name="booking_filters_ragting_good">Dobré</string>
|
||||
<string name="booking_filters_rating_very_good">Veľmi dobré</string>
|
||||
<string name="booking_filters_rating_excellent">Výborné</string>
|
||||
<string name="booking_filters_price_category">Cenová kategória</string>
|
||||
<string name="booking_filters_no_results">Nenašli sa žiadne výsledky</string>
|
||||
<string name="booking_filters_nores_message">Skúste vyhľadávať všeobecnejší výraz, vzdialiť alebo obnoviť nastavenie filtra.</string>
|
||||
<string name="booking_filters_expand_area_button">Vzdialiť</string>
|
||||
<string name="booking_filters_reset_button">Obnoviť filter</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Zoznam</string>
|
||||
<string name="booking_based_on_reviews">Na základe %d recenzií</string>
|
||||
<string name="booking_show_more">Zobraziť viac</string>
|
||||
<string name="booking_reviews">Recenzie</string>
|
||||
<string name="booking_hotel">Hotel</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Izba</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">GeoChat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Otvoriť</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME & Uber</string>
|
||||
<string name="whatsnew_uber_message">Objednajte si Uber priamo z aplikácie!</string>
|
||||
<string name="dialog_taxi_offline">Objednanie taxíka nie je k dispozícii v režime offline.</string>
|
||||
<string name="dialog_taxi_error">Objednanie taxíka je dočasne nedostupné.</string>
|
||||
</resources>
|
||||
|
|
|
@ -951,4 +951,44 @@
|
|||
<string name="whats_new_route_profile_message">För gångvägar och cykelturer visar vi nu höjdprofilen.</string>
|
||||
<string name="whats_new_booking_improve_title">Spara pengar när du bokar hotell</string>
|
||||
<string name="whats_new_booking_improve_message">Sökresultat för hotell innehåller nu priskategorin.\nVi har även lagt till över 110 000 hotell.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">Faciliteter</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">I närheten</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">Boka</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">Förväntas om %s</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">Hittade ingen taxi i närheten</string>
|
||||
<string name="install_app">Installera</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">Filter</string>
|
||||
<string name="booking_filters_reset">Återställ</string>
|
||||
<string name="booking_filters_rating">Betyg</string>
|
||||
<string name="booking_filters_rating_any">Vilket som helst</string>
|
||||
<string name="booking_filters_ragting_good">Bra</string>
|
||||
<string name="booking_filters_rating_very_good">Väldigt bra</string>
|
||||
<string name="booking_filters_rating_excellent">Utmärkt</string>
|
||||
<string name="booking_filters_price_category">Priskategori</string>
|
||||
<string name="booking_filters_no_results">Inga resultat hittades</string>
|
||||
<string name="booking_filters_nores_message">Försök med en mer allmän sökterm, zooma ut eller återställ filtret.</string>
|
||||
<string name="booking_filters_expand_area_button">Zooma ut</string>
|
||||
<string name="booking_filters_reset_button">Återställ filtret</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Lista</string>
|
||||
<string name="booking_based_on_reviews">Baserat på %d hotellomdömen</string>
|
||||
<string name="booking_show_more">Visa fler</string>
|
||||
<string name="booking_reviews">Omdömen</string>
|
||||
<string name="booking_hotel">Hotell</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Rum</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Öppna</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME och Uber</string>
|
||||
<string name="whatsnew_uber_message">Beställ en Uber direkt från appen!</string>
|
||||
<string name="dialog_taxi_offline">Du kan inte beställa en taxi i offlineläge.</string>
|
||||
<string name="dialog_taxi_error">Du kan inte beställa en taxi just nu.</string>
|
||||
</resources>
|
||||
|
|
|
@ -721,7 +721,7 @@
|
|||
<!-- title above languages list cells in the editor, below editable name text field. -->
|
||||
<string name="other_languages">ภาษาอื่น ๆ</string>
|
||||
<!-- small button to open list with names in different languages -->
|
||||
<string name="show_more">แสดงเพิ่มเติม</string>
|
||||
<string name="show_more">แสดงมากขึ้น</string>
|
||||
<!-- small button to close list with names in different languages -->
|
||||
<string name="show_less">แสดงน้อยลง</string>
|
||||
<string name="add_language">เพิ่มภาษา</string>
|
||||
|
@ -953,4 +953,44 @@
|
|||
<string name="whats_new_route_profile_message">สำหรับเส้นทางคนเดินเท้าและจักรยาน ตอนนี้เราแสดงโปรไฟล์ระดับความสูงแล้ว</string>
|
||||
<string name="whats_new_booking_improve_title">ประหยัดเมื่อจองโรงแรม</string>
|
||||
<string name="whats_new_booking_improve_message">การค้นหาโรงแรมตอนนี้มีหมวดหมู่ราคาแล้ว\nเรายังได้เพิ่มโรงแรมเข้ามากว่า 110,000 โรงแรมอีกด้วย</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">สิ่งอำนวยความสะดวก</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">บริเวณใกล้เคียง</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">สั่ง</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">คาดว่าภายใน %s</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">ไม่พบแท็กซี่ในบริเวณใกล้เคียง</string>
|
||||
<string name="install_app">ติดตั้ง</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">ตัวกรอง</string>
|
||||
<string name="booking_filters_reset">รีเซ็ต</string>
|
||||
<string name="booking_filters_rating">อันดับ</string>
|
||||
<string name="booking_filters_rating_any">อะไรก็ได้</string>
|
||||
<string name="booking_filters_ragting_good">ดี</string>
|
||||
<string name="booking_filters_rating_very_good">ดีมาก</string>
|
||||
<string name="booking_filters_rating_excellent">ยอดเยี่ยม</string>
|
||||
<string name="booking_filters_price_category">หมวดหมู่ราคา</string>
|
||||
<string name="booking_filters_no_results">ไม่พบผลลัพธ์</string>
|
||||
<string name="booking_filters_nores_message">ลองค้นหาด้วยคำทั่ว ๆ ไปดู ซูมออกหรือรีเซ็ตตัวกรอง</string>
|
||||
<string name="booking_filters_expand_area_button">ซูมออก</string>
|
||||
<string name="booking_filters_reset_button">รีเซ็ตตัวกรอง</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">รายการ</string>
|
||||
<string name="booking_based_on_reviews">ตาม %d รีวิวโรงแรม</string>
|
||||
<string name="booking_show_more">แสดงเพิ่มเติม</string>
|
||||
<string name="booking_reviews">รีวิว</string>
|
||||
<string name="booking_hotel">โรงแรม</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">ห้องพัก</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">เปิด</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME & Uber</string>
|
||||
<string name="whatsnew_uber_message">เรียกแท็กซี่ Uber โดยตรงจากแอป!</string>
|
||||
<string name="dialog_taxi_offline">ไม่สามารถทำการจองแท็กซี่ได้ในโหมดออฟไลน์</string>
|
||||
<string name="dialog_taxi_error">ไม่สามารถทำการจองแท็กซี่ได้ชั่วคราว</string>
|
||||
</resources>
|
||||
|
|
|
@ -721,9 +721,9 @@
|
|||
<!-- title above languages list cells in the editor, below editable name text field. -->
|
||||
<string name="other_languages">Diğer Diller</string>
|
||||
<!-- small button to open list with names in different languages -->
|
||||
<string name="show_more">Daha fazla göster</string>
|
||||
<string name="show_more">Daha fazlasını göster</string>
|
||||
<!-- small button to close list with names in different languages -->
|
||||
<string name="show_less">Daha az göster</string>
|
||||
<string name="show_less">Daha azını göster</string>
|
||||
<string name="add_language">Bir dil ekle</string>
|
||||
<string name="street">Sokak</string>
|
||||
<!-- Editable House Number text field (in address block). -->
|
||||
|
@ -953,4 +953,44 @@
|
|||
<string name="whats_new_route_profile_message">Yürüyüş ve bisiklet yolları şimdi yükseklik profilli olarak görüntüleniyor.</string>
|
||||
<string name="whats_new_booking_improve_title">Otel rezervasyonlarınızdan tasarruf edin</string>
|
||||
<string name="whats_new_booking_improve_message">Artık otel arama sonuçlarında fiyat kategorisi de gösteriliyor.\nVe 110,000\'den fazla oteli sistemimize ekledik.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">Tesisler</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">Yakınlarda</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">Çağır</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">%s içinde bekleniyor</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">Yakın hiç taksi bulunamadı</string>
|
||||
<string name="install_app">Kur</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">Filtre</string>
|
||||
<string name="booking_filters_reset">Sıfırla</string>
|
||||
<string name="booking_filters_rating">Oy Verin</string>
|
||||
<string name="booking_filters_rating_any">Herhangi biri</string>
|
||||
<string name="booking_filters_ragting_good">İyi</string>
|
||||
<string name="booking_filters_rating_very_good">Çok iyi</string>
|
||||
<string name="booking_filters_rating_excellent">Mükemmel</string>
|
||||
<string name="booking_filters_price_category">Fiyat Kategorisi</string>
|
||||
<string name="booking_filters_no_results">Hiçbir Sonuç Bulunamadı</string>
|
||||
<string name="booking_filters_nores_message">Daha genel bir terimi aramayı deneyin, uzaklaşın veya filtreyi Sıfırlayın.</string>
|
||||
<string name="booking_filters_expand_area_button">Uzaklaş</string>
|
||||
<string name="booking_filters_reset_button">Filtreyi Sıfırla</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Liste</string>
|
||||
<string name="booking_based_on_reviews">%d otel değerlendirmesine göre</string>
|
||||
<string name="booking_show_more">Daha fazla göster</string>
|
||||
<string name="booking_reviews">Değerlendirmeler</string>
|
||||
<string name="booking_hotel">Otel</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Oda</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">GeoChat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Aç</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME ve Uber</string>
|
||||
<string name="whatsnew_uber_message">Doğrudan uygulamadan Uber taksi isteyin!</string>
|
||||
<string name="dialog_taxi_offline">Taksi çağırma çevrimdışı modda kullanılamıyor.</string>
|
||||
<string name="dialog_taxi_error">Taksi çağırma geçici olarak kullanılamıyor.</string>
|
||||
</resources>
|
||||
|
|
|
@ -951,4 +951,44 @@
|
|||
<string name="whats_new_route_profile_message">Для пішохідних і велосипедних маршрутів тепер відображається профіль рельєфу.</string>
|
||||
<string name="whats_new_booking_improve_title">Заощаджуйте на бронюванні готелів</string>
|
||||
<string name="whats_new_booking_improve_message">В результатах пошуку готелів на карті відображається цінова категорія.\nКрім того, тепер у нашій базі даних з\'явилося 110 000 нових готелів.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">Зручності</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">Поблизу</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">Замовити</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">Очікується через %s</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">Не вдалося знайти таксі поблизу</string>
|
||||
<string name="install_app">Встановити</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">Фільтр</string>
|
||||
<string name="booking_filters_reset">Скинути</string>
|
||||
<string name="booking_filters_rating">Рейтинг</string>
|
||||
<string name="booking_filters_rating_any">Будь-який</string>
|
||||
<string name="booking_filters_ragting_good">Добре</string>
|
||||
<string name="booking_filters_rating_very_good">Дуже добре</string>
|
||||
<string name="booking_filters_rating_excellent">Чудово</string>
|
||||
<string name="booking_filters_price_category">Цінова категорія</string>
|
||||
<string name="booking_filters_no_results">Не знайдено жодного результату</string>
|
||||
<string name="booking_filters_nores_message">Спробуйте пошук за більш узагальненим пошуковим виразом, зменшіть масштаб або скиньте фільтри.</string>
|
||||
<string name="booking_filters_expand_area_button">Зменшити масштаб</string>
|
||||
<string name="booking_filters_reset_button">Скинути фільтри</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Список</string>
|
||||
<string name="booking_based_on_reviews">На основі %d відгуків(-у) про готель</string>
|
||||
<string name="booking_show_more">Показати більше</string>
|
||||
<string name="booking_reviews">Відгуки</string>
|
||||
<string name="booking_hotel">Готель</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Номер</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Геочат</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Відкрити</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME і Uber</string>
|
||||
<string name="whatsnew_uber_message">Замовляйте таксі прямо з додатку!</string>
|
||||
<string name="dialog_taxi_offline">Замовлення таксі неможливе в автономному режимі.</string>
|
||||
<string name="dialog_taxi_error">Замовлення таксі тимчасово недоступне.</string>
|
||||
</resources>
|
||||
|
|
|
@ -947,4 +947,44 @@
|
|||
<string name="whats_new_route_profile_message">Đối với các đường đi bộ và đi xe đạp, chúng tôi hiện đã hiển thị mặt cắt tầng.</string>
|
||||
<string name="whats_new_booking_improve_title">Tiết kiệm khi đặt khách sạn</string>
|
||||
<string name="whats_new_booking_improve_message">Kết quả tìm kiếm cho khách sạn giờ đã có bậc giá cả.\nChúng tôi cũng đã bổ sung hơn 110.000 khách sạn.</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">Cơ sở</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">Gần đây</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">Đặt xe</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">Sẽ đến trong %s</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">Không thể tìm thấy một taxi ở gần đây</string>
|
||||
<string name="install_app">Cài đặt</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">Bộ lọc</string>
|
||||
<string name="booking_filters_reset">Đặt lại</string>
|
||||
<string name="booking_filters_rating">Cho điểm</string>
|
||||
<string name="booking_filters_rating_any">Bất kỳ</string>
|
||||
<string name="booking_filters_ragting_good">Tốt</string>
|
||||
<string name="booking_filters_rating_very_good">Rất tốt</string>
|
||||
<string name="booking_filters_rating_excellent">Xuất sắc</string>
|
||||
<string name="booking_filters_price_category">Hạng mục Giá</string>
|
||||
<string name="booking_filters_no_results">Không tìm thấy kết quả nào</string>
|
||||
<string name="booking_filters_nores_message">Hãy thử một từ khóa tìm kiếm chung hơn, thu nhỏ hoặc đặt lại bộ lọc.</string>
|
||||
<string name="booking_filters_expand_area_button">Thu nhỏ</string>
|
||||
<string name="booking_filters_reset_button">Đặt lại Bộ lọc</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">Danh sách</string>
|
||||
<string name="booking_based_on_reviews">Dựa trên %d đánh giá khách sạn</string>
|
||||
<string name="booking_show_more">Hiển thị thêm</string>
|
||||
<string name="booking_reviews">Đánh giá</string>
|
||||
<string name="booking_hotel">Khách sạn</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Phòng</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Mở</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME & Uber</string>
|
||||
<string name="whatsnew_uber_message">Đặt taxi Uber trực tiếp từ ứng dụng!</string>
|
||||
<string name="dialog_taxi_offline">Gọi taxi không khả dụng trong chế độ ngoại tuyến.</string>
|
||||
<string name="dialog_taxi_error">Gọi taxi tạm thời không khả dụng.</string>
|
||||
</resources>
|
||||
|
|
|
@ -729,7 +729,7 @@
|
|||
<!-- small button to open list with names in different languages -->
|
||||
<string name="show_more">顯示更多</string>
|
||||
<!-- small button to close list with names in different languages -->
|
||||
<string name="show_less">顯示更少</string>
|
||||
<string name="show_less">顯示較少</string>
|
||||
<string name="add_language">新增語言</string>
|
||||
<string name="street">街道</string>
|
||||
<!-- Editable House Number text field (in address block). -->
|
||||
|
@ -959,4 +959,44 @@
|
|||
<string name="whats_new_route_profile_message">對於行人和自行車路線,我們現在顯示海拔剖面圖。</string>
|
||||
<string name="whats_new_booking_improve_title">優惠預訂飯店</string>
|
||||
<string name="whats_new_booking_improve_message">飯店搜尋結果現在還包含價格類別。\n我們還加入了超過 110,000 間飯店。</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">設施</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">附近</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">預約</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">預計 %s 內到達</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">無法在附近找到計程車</string>
|
||||
<string name="install_app">安裝</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">篩選條件</string>
|
||||
<string name="booking_filters_reset">重設</string>
|
||||
<string name="booking_filters_rating">評分</string>
|
||||
<string name="booking_filters_rating_any">任意</string>
|
||||
<string name="booking_filters_ragting_good">好</string>
|
||||
<string name="booking_filters_rating_very_good">很好</string>
|
||||
<string name="booking_filters_rating_excellent">極好</string>
|
||||
<string name="booking_filters_price_category">價格類別</string>
|
||||
<string name="booking_filters_no_results">找不到任何結果</string>
|
||||
<string name="booking_filters_nores_message">嘗試一個更普通的搜尋字詞、縮小顯示或重設篩選條件。</string>
|
||||
<string name="booking_filters_expand_area_button">縮小</string>
|
||||
<string name="booking_filters_reset_button">重設篩選條件</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">清單</string>
|
||||
<string name="booking_based_on_reviews">根據 %d 則飯店評論</string>
|
||||
<string name="booking_show_more">顯示更多</string>
|
||||
<string name="booking_reviews">評論</string>
|
||||
<string name="booking_hotel">飯店</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">客房</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">開放</string>
|
||||
<string name="whatsnew_uber_header">優步 & MAPS.ME離綫地圖</string>
|
||||
<string name="whatsnew_uber_message">直接從應用程序預訂計程車!</string>
|
||||
<string name="dialog_taxi_offline">叫計程車服務在離線模式下無法使用。</string>
|
||||
<string name="dialog_taxi_error">叫計程車服務暫時無法使用。</string>
|
||||
</resources>
|
||||
|
|
|
@ -953,4 +953,44 @@
|
|||
<string name="whats_new_route_profile_message">对于行人和自行车路线,我们现在显示纵剖面。</string>
|
||||
<string name="whats_new_booking_improve_title">优惠预订酒店</string>
|
||||
<string name="whats_new_booking_improve_message">酒店的搜索结果现在包含价格类别。\n我们还添加了超过 110,000 家酒店。</string>
|
||||
<!-- For place page hotel facilities block -->
|
||||
<string name="placepage_hotel_facilities">设施</string>
|
||||
<!-- For place page hotel nearby block -->
|
||||
<string name="placepage_hotel_nearby">附近</string>
|
||||
<!-- For ordering a taxi (as opposed to hotels or other things) -->
|
||||
<string name="taxi_order">预订</string>
|
||||
<!-- How long it is until the taxi arrives -->
|
||||
<string name="taxi_wait">预计 %s后到达</string>
|
||||
<!-- When there are no available taxis nearby -->
|
||||
<string name="taxi_not_found">无法在附近找到出租车</string>
|
||||
<string name="install_app">安装</string>
|
||||
<!-- `Filter` is a noun here -->
|
||||
<string name="booking_filters">筛选器</string>
|
||||
<string name="booking_filters_reset">重置</string>
|
||||
<string name="booking_filters_rating">评分</string>
|
||||
<string name="booking_filters_rating_any">任意</string>
|
||||
<string name="booking_filters_ragting_good">好</string>
|
||||
<string name="booking_filters_rating_very_good">很好</string>
|
||||
<string name="booking_filters_rating_excellent">极好</string>
|
||||
<string name="booking_filters_price_category">价格类别</string>
|
||||
<string name="booking_filters_no_results">未找到任何结果</string>
|
||||
<string name="booking_filters_nores_message">尝试一个更普通的搜索词、缩小显示或重置筛选器。</string>
|
||||
<string name="booking_filters_expand_area_button">缩小</string>
|
||||
<string name="booking_filters_reset_button">重置筛选器</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">列表</string>
|
||||
<string name="booking_based_on_reviews">根据 %d 条酒店点评</string>
|
||||
<string name="booking_show_more">显示更多</string>
|
||||
<string name="booking_reviews">点评</string>
|
||||
<string name="booking_hotel">酒店</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">客房</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">开放</string>
|
||||
<string name="whatsnew_uber_header">优步和MAPS.ME</string>
|
||||
<string name="whatsnew_uber_message">从应用直接叫优步出租车!</string>
|
||||
<string name="dialog_taxi_offline">叫出租车服务在离线模式下无法使用。</string>
|
||||
<string name="dialog_taxi_error">叫出租车服务暂时无法使用。</string>
|
||||
</resources>
|
||||
|
|
|
@ -29,18 +29,15 @@
|
|||
|
||||
<!-- What's new -->
|
||||
<integer-array name="news_images">
|
||||
<item>@drawable/ic_img_whatsnew_route_profile</item>
|
||||
<item>@drawable/ic_img_whatsnew_booking_improve</item>
|
||||
<item>@drawable/img_whatsnew_uber</item>
|
||||
</integer-array>
|
||||
|
||||
<string-array name="news_titles">
|
||||
<item>@string/whats_new_route_profile_title</item>
|
||||
<item>@string/whats_new_booking_improve_title</item>
|
||||
<item>@string/whatsnew_uber_header</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="news_messages_1">
|
||||
<item>@string/whats_new_route_profile_message</item>
|
||||
<item>@string/whats_new_booking_improve_message</item>
|
||||
<item>@string/whatsnew_uber_message</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="news_messages_2">
|
||||
|
|
|
@ -994,15 +994,20 @@
|
|||
<string name="booking_filters_nores_message">Try a more general search term, zoom out or reset the filter.</string>
|
||||
<string name="booking_filters_expand_area_button">Zoom out</string>
|
||||
<string name="booking_filters_reset_button">Reset Filter</string>
|
||||
<!-- noun -->
|
||||
<string name="booking_list">List</string>
|
||||
<string name="booking_based_on_reviews">Based on %d hotel reviews</string>
|
||||
<string name="booking_show_more">Show more</string>
|
||||
<string name="booking_reviews">Reviews</string>
|
||||
<string name="booking_hotel">Hotel</string>
|
||||
<!-- hotel room -->
|
||||
<string name="booking_hotel_room">Room</string>
|
||||
<!-- A neologism for a chat based on geographical proximity -->
|
||||
<string name="chat">Geochat</string>
|
||||
<!-- Verb. Text on a button that opens the chat. -->
|
||||
<string name="chat_open">Open</string>
|
||||
<!-- TODO: it's temporary -->
|
||||
<string name="uber_no_internet">Internet connection is required to order taxi</string>
|
||||
<string name="uber_remote_error">Uber is unavailable</string>
|
||||
<string name="whatsnew_uber_header">MAPS.ME & Uber</string>
|
||||
<string name="whatsnew_uber_message">Order a taxi directly from the app!</string>
|
||||
<string name="dialog_taxi_offline">Taxi ordering is unavailable in offline mode.</string>
|
||||
<string name="dialog_taxi_error">Taxi ordering is temporarily unavailable.</string>
|
||||
</resources>
|
||||
|
|
|
@ -10,11 +10,11 @@
|
|||
<item name="android:textColorSecondary">@color/text_dark_subtitle</item>
|
||||
<item name="android:windowBackground">?windowBackgroundForced</item>
|
||||
<item name="android:colorPrimaryDark" tools:targetApi="lollipop">@color/bg_statusbar</item>
|
||||
<item name="android:windowDrawsSystemBarBackgrounds" tools:targetApi="lollipop">true</item>
|
||||
<item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
|
||||
<item name="android:fontFamily" tools:targetApi="jelly_bean">@string/robotoRegular</item>
|
||||
<item name="android:colorBackgroundCacheHint">@null</item>
|
||||
<item name="clickableBackground">?selectableItemBackground</item>
|
||||
<item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
|
||||
|
||||
<item name="alertDialogTheme">@style/MwmTheme.DialogFragment</item>
|
||||
<item name="windowBackgroundForced">@color/bg_window</item>
|
||||
|
@ -22,7 +22,6 @@
|
|||
<item name="cardBackground">@color/bg_cards</item>
|
||||
<item name="fullscreenDialogTheme">@style/MwmTheme.DialogFragment.Fullscreen</item>
|
||||
|
||||
<item name="statusBar">@color/bg_statusbar</item>
|
||||
<item name="colorPrimary">@color/bg_primary</item>
|
||||
<item name="colorControlNormal">?secondary</item>
|
||||
<item name="colorAccent">@color/base_accent</item>
|
||||
|
@ -95,11 +94,11 @@
|
|||
<item name="android:textColorSecondary">@color/text_light_subtitle</item>
|
||||
<item name="android:windowBackground">?windowBackgroundForced</item>
|
||||
<item name="android:colorPrimaryDark" tools:targetApi="lollipop">?statusBar</item>
|
||||
<item name="android:windowDrawsSystemBarBackgrounds" tools:targetApi="lollipop">true</item>
|
||||
<item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
|
||||
<item name="android:fontFamily" tools:targetApi="jelly_bean">@string/robotoRegular</item>
|
||||
<item name="android:colorBackgroundCacheHint">@null</item>
|
||||
<item name="clickableBackground">?selectableItemBackground</item>
|
||||
<item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
|
||||
|
||||
<item name="alertDialogTheme">@style/MwmTheme.Night.DialogFragment</item>
|
||||
<item name="windowBackgroundForced">@color/bg_window_night</item>
|
||||
|
@ -107,7 +106,6 @@
|
|||
<item name="cardBackground">@color/bg_cards_night</item>
|
||||
<item name="fullscreenDialogTheme">@style/MwmTheme.DialogFragment.Fullscreen.Night</item>
|
||||
|
||||
<item name="statusBar">@color/bg_statusbar_night</item>
|
||||
<item name="colorPrimary">@color/bg_primary_night</item>
|
||||
<item name="colorControlNormal">?secondary</item>
|
||||
<item name="colorAccent">@color/base_accent_night</item>
|
||||
|
|
|
@ -78,6 +78,8 @@
|
|||
<item name="android:textViewStyle">@style/MwmWidget.TextView</item>
|
||||
<item name="android:colorBackgroundCacheHint">@null</item>
|
||||
<item name="android:fontFamily" tools:targetApi="jelly_bean">@string/robotoRegular</item>
|
||||
<item name="android:windowTranslucentStatus" tools:targetApi="kitkat">true</item>
|
||||
<item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
|
||||
</style>
|
||||
|
||||
<style name="MwmTheme.DialogFragment.Fullscreen.Night" parent="Theme.AppCompat">
|
||||
|
@ -91,6 +93,8 @@
|
|||
<item name="android:textViewStyle">@style/MwmWidget.TextView</item>
|
||||
<item name="android:colorBackgroundCacheHint">@null</item>
|
||||
<item name="android:fontFamily" tools:targetApi="jelly_bean">@string/robotoRegular</item>
|
||||
<item name="android:windowTranslucentStatus" tools:targetApi="kitkat">true</item>
|
||||
<item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
|
||||
</style>
|
||||
|
||||
<style name="MwmTheme.DialogFragment.Fullscreen.Translucent">
|
||||
|
@ -169,9 +173,6 @@
|
|||
<item name="android:colorPrimaryDark" tools:targetApi="lollipop">@android:color/black</item>
|
||||
<item name="android:timePickerStyle" tools:targetApi="lollipop">@style/MwmWidget.Editor.TimePicker</item>
|
||||
<item name="android:windowBackground">@null</item>
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowActionBarOverlay">true</item>
|
||||
<item name="android:windowActionBarOverlay">true</item>
|
||||
</style>
|
||||
|
||||
<style name="MwmTheme.Night.FullScreenGalleryActivity">
|
||||
|
|
|
@ -140,6 +140,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
private boolean mIsFragmentContainer;
|
||||
private boolean mIsFullscreen;
|
||||
private boolean mIsFullscreenAnimating;
|
||||
private boolean mIsAppearMenuLater;
|
||||
|
||||
private FloatingSearchToolbarController mSearchController;
|
||||
|
||||
|
@ -450,6 +451,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
{
|
||||
mPositionChooser = findViewById(R.id.position_chooser);
|
||||
final Toolbar toolbar = (Toolbar) mPositionChooser.findViewById(R.id.toolbar_position_chooser);
|
||||
UiUtils.extendViewWithStatusBar(toolbar);
|
||||
UiUtils.showHomeUpButton(toolbar);
|
||||
toolbar.setNavigationOnClickListener(new OnClickListener()
|
||||
{
|
||||
|
@ -892,7 +894,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
|
||||
private void adjustZoomButtons()
|
||||
{
|
||||
UiUtils.showIf(showZoomButtons(), mNavZoomIn, mNavZoomOut);
|
||||
UiUtils.showIf(showZoomButtons() && !mIsFullscreen, mNavZoomIn, mNavZoomOut);
|
||||
// TODO animate zoom buttons & myposition
|
||||
}
|
||||
|
||||
|
@ -944,7 +946,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
}
|
||||
|
||||
if (!closePlacePage() && !closeSidePanel() &&
|
||||
!RoutingController.get().cancel() && !closePositionChooser())
|
||||
(mNavigationController != null && !mNavigationController.cancel()) && !closePositionChooser())
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -1026,11 +1028,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
request.setPointData(object.getLat(), object.getLon(), object.getTitle(), object.getApiId());
|
||||
object.setSubtitle(request.getCallerName(MwmApplication.get()).toString());
|
||||
}
|
||||
else if (MapObject.isOfType(MapObject.MY_POSITION, object) &&
|
||||
RoutingController.get().isNavigating())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
setFullscreen(false);
|
||||
|
||||
|
@ -1091,6 +1088,11 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
adjustRuler(0, menuHeight);
|
||||
|
||||
mIsFullscreenAnimating = false;
|
||||
if (mIsAppearMenuLater)
|
||||
{
|
||||
appearMenu(menu);
|
||||
mIsAppearMenuLater = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
if (showZoomButtons())
|
||||
|
@ -1101,20 +1103,28 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
}
|
||||
else
|
||||
{
|
||||
Animations.appearSliding(menu.getFrame(), Animations.BOTTOM, new Runnable()
|
||||
if (!mIsFullscreenAnimating)
|
||||
appearMenu(menu);
|
||||
else
|
||||
mIsAppearMenuLater = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void appearMenu(BaseMenu menu)
|
||||
{
|
||||
Animations.appearSliding(menu.getFrame(), Animations.BOTTOM, new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
adjustCompass(0, 0);
|
||||
adjustRuler(0, 0);
|
||||
}
|
||||
});
|
||||
if (showZoomButtons())
|
||||
{
|
||||
Animations.appearSliding(mNavZoomOut, Animations.RIGHT, null);
|
||||
Animations.appearSliding(mNavZoomIn, Animations.RIGHT, null);
|
||||
adjustCompass(0, 0);
|
||||
adjustRuler(0, 0);
|
||||
}
|
||||
});
|
||||
if (showZoomButtons())
|
||||
{
|
||||
Animations.appearSliding(mNavZoomOut, Animations.RIGHT, null);
|
||||
Animations.appearSliding(mNavZoomIn, Animations.RIGHT, null);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1324,7 +1334,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
{
|
||||
mNavigationController.show(true);
|
||||
mSearchController.hide();
|
||||
mMainMenu.setState(MainMenu.State.NAVIGATION, false);
|
||||
mMainMenu.setState(MainMenu.State.NAVIGATION, false, mIsFullscreen);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1335,11 +1345,11 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
}
|
||||
else if (RoutingController.get().isPlanning())
|
||||
{
|
||||
mMainMenu.setState(MainMenu.State.ROUTE_PREPARE, false);
|
||||
mMainMenu.setState(MainMenu.State.ROUTE_PREPARE, false, mIsFullscreen);
|
||||
return;
|
||||
}
|
||||
|
||||
mMainMenu.setState(MainMenu.State.MENU, false);
|
||||
mMainMenu.setState(MainMenu.State.MENU, false, mIsFullscreen);
|
||||
}
|
||||
|
||||
private void adjustMenuLineFrameVisibility()
|
||||
|
|
|
@ -24,6 +24,7 @@ public class BaseMwmExtraTitleActivity extends BaseMwmFragmentActivity
|
|||
title = bundle.getString(EXTRA_TITLE);
|
||||
}
|
||||
Toolbar toolbar = getToolbar();
|
||||
UiUtils.extendViewWithStatusBar(toolbar);
|
||||
toolbar.setTitle(title);
|
||||
UiUtils.showHomeUpButton(toolbar);
|
||||
displayToolbarAsActionBar();
|
||||
|
|
|
@ -3,6 +3,7 @@ package com.mapswithme.maps.base;
|
|||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.media.AudioManager;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
|
@ -11,10 +12,12 @@ import android.support.v4.app.Fragment;
|
|||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.view.MenuItem;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import com.mapswithme.maps.MwmApplication;
|
||||
import com.mapswithme.maps.R;
|
||||
import com.mapswithme.util.ThemeUtils;
|
||||
import com.mapswithme.util.UiUtils;
|
||||
import com.mapswithme.util.Utils;
|
||||
|
||||
public class BaseMwmFragmentActivity extends AppCompatActivity
|
||||
|
@ -50,6 +53,7 @@ public class BaseMwmFragmentActivity extends AppCompatActivity
|
|||
mBaseDelegate.onCreate();
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
UiUtils.setupStatusBar(this);
|
||||
setVolumeControlStream(AudioManager.STREAM_MUSIC);
|
||||
final int layoutId = getContentLayoutResId();
|
||||
if (layoutId != 0)
|
||||
|
|
|
@ -4,6 +4,7 @@ import android.os.Bundle;
|
|||
import android.support.annotation.StringRes;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
|
||||
import com.mapswithme.maps.R;
|
||||
import com.mapswithme.util.UiUtils;
|
||||
|
||||
|
@ -15,6 +16,7 @@ public abstract class BaseToolbarActivity extends BaseMwmFragmentActivity
|
|||
super.onCreate(state);
|
||||
|
||||
Toolbar toolbar = getToolbar();
|
||||
UiUtils.extendViewWithStatusBar(toolbar);
|
||||
int title = getToolbarTitle();
|
||||
if (title == 0)
|
||||
toolbar.setTitle(getTitle());
|
||||
|
|
|
@ -3,7 +3,6 @@ package com.mapswithme.maps.gallery;
|
|||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.Bitmap;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.StyleRes;
|
||||
|
@ -66,8 +65,6 @@ public class FullScreenGalleryActivity extends BaseMwmFragmentActivity
|
|||
toolbar.setTitle("");
|
||||
UiUtils.showHomeUpButton(toolbar);
|
||||
displayToolbarAsActionBar();
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
|
||||
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
|
||||
|
||||
mUserBlock = findViewById(R.id.rl__user_block);
|
||||
mDescription = (TextView) findViewById(R.id.tv__description);
|
||||
|
|
|
@ -20,6 +20,7 @@ public class GPSCheck extends BroadcastReceiver
|
|||
&& MwmApplication.get().isFrameworkInitialized() && MwmApplication.backgroundTracker().isForeground())
|
||||
{
|
||||
LocationHelper.INSTANCE.addLocationListener();
|
||||
LocationHelper.INSTANCE.forceRestart();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -606,6 +606,17 @@ public enum LocationHelper
|
|||
}
|
||||
}
|
||||
|
||||
public void forceRestart()
|
||||
{
|
||||
mActive = !mListeners.isEmpty();
|
||||
if (mActive)
|
||||
{
|
||||
calcParams();
|
||||
stopInternal();
|
||||
startInternal();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Actually starts location polling.
|
||||
*/
|
||||
|
|
|
@ -1,16 +1,262 @@
|
|||
package com.mapswithme.maps.location;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.net.SSLCertificateSocketFactory;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
interface PlatformSocket
|
||||
import com.mapswithme.maps.BuildConfig;
|
||||
import com.mapswithme.util.log.DebugLogger;
|
||||
import com.mapswithme.util.log.Logger;
|
||||
|
||||
import javax.net.SocketFactory;
|
||||
import javax.net.ssl.SSLSocketFactory;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.Socket;
|
||||
import java.net.SocketException;
|
||||
import java.net.SocketTimeoutException;
|
||||
|
||||
/**
|
||||
* Implements interface that will be used by the core for
|
||||
* sending/receiving the raw data trough platform socket interface.
|
||||
* <p>
|
||||
* The instance of this class is supposed to be created in JNI layer
|
||||
* and supposed to be used in the thread safe environment, i.e. thread safety
|
||||
* should be provided externally (by the client of this class).
|
||||
* <p>
|
||||
* <b>All public methods are blocking and shouldn't be called from the main thread.</b>
|
||||
*/
|
||||
class PlatformSocket
|
||||
{
|
||||
boolean open(@NonNull String host, int port);
|
||||
private final static Logger sLogger = new DebugLogger(PlatformSocket.class.getSimpleName());
|
||||
private final static int DEFAULT_TIMEOUT = 30 * 1000;
|
||||
@Nullable
|
||||
private Socket mSocket;
|
||||
@Nullable
|
||||
private String mHost;
|
||||
private int mPort;
|
||||
private int mTimeout = DEFAULT_TIMEOUT;
|
||||
|
||||
void close();
|
||||
public boolean open(@NonNull String host, int port)
|
||||
{
|
||||
if (mSocket != null)
|
||||
{
|
||||
sLogger.e("Socket is already opened. Seems that it wasn't closed.");
|
||||
return false;
|
||||
}
|
||||
|
||||
void setTimeout(int millis);
|
||||
if (!isPortAllowed(port))
|
||||
{
|
||||
sLogger.e("A wrong port number, it must be within (0-65535) range", port);
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean read(@NonNull byte[] data, int count);
|
||||
mHost = host;
|
||||
mPort = port;
|
||||
|
||||
boolean write(@NonNull byte[] data, int count);
|
||||
Socket socket = createSocket(host, port, true);
|
||||
if (socket != null && socket.isConnected())
|
||||
{
|
||||
setReadSocketTimeout(socket, mTimeout);
|
||||
mSocket = socket;
|
||||
}
|
||||
|
||||
return mSocket != null;
|
||||
}
|
||||
|
||||
private static boolean isPortAllowed(int port)
|
||||
{
|
||||
return port >= 0 && port <= 65535;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static Socket createSocket(@NonNull String host, int port, boolean ssl)
|
||||
{
|
||||
if (ssl)
|
||||
{
|
||||
try
|
||||
{
|
||||
SocketFactory sf = getSocketFactory();
|
||||
return sf.createSocket(host, port);
|
||||
} catch (IOException e)
|
||||
{
|
||||
sLogger.e("Failed to create the ssl socket, mHost = ", host, " mPort = ", port, e);
|
||||
}
|
||||
} else
|
||||
{
|
||||
try
|
||||
{
|
||||
return new Socket(host, port);
|
||||
} catch (IOException e)
|
||||
{
|
||||
sLogger.e("Failed to create the socket, mHost = ", host, " mPort = ", port, e);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@SuppressLint("SSLCertificateSocketFactoryGetInsecure")
|
||||
@NonNull
|
||||
private static SocketFactory getSocketFactory()
|
||||
{
|
||||
// Trusting to any ssl certificate factory that will be used in
|
||||
// debug mode, for testing purposes only.
|
||||
if (BuildConfig.DEBUG)
|
||||
//TODO: implement the custom KeyStore to make the self-signed certificates work
|
||||
return SSLCertificateSocketFactory.getInsecure(0, null);
|
||||
|
||||
return SSLSocketFactory.getDefault();
|
||||
}
|
||||
|
||||
public void close()
|
||||
{
|
||||
if (mSocket == null)
|
||||
{
|
||||
sLogger.d("Socket is already closed or it wasn't opened yet");
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
mSocket.close();
|
||||
sLogger.d("Socket has been closed: ", this);
|
||||
} catch (IOException e)
|
||||
{
|
||||
sLogger.e("Failed to close socket: ", this, e);
|
||||
} finally
|
||||
{
|
||||
mSocket = null;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean read(@NonNull byte[] data, int count)
|
||||
{
|
||||
if (!checkSocketAndArguments(data, count))
|
||||
return false;
|
||||
|
||||
sLogger.d("Reading has started, data.length = " + data.length, ", count = " + count);
|
||||
long startTime = System.nanoTime();
|
||||
int readBytes = 0;
|
||||
try
|
||||
{
|
||||
if (mSocket == null)
|
||||
throw new AssertionError("mSocket cannot be null");
|
||||
|
||||
InputStream in = mSocket.getInputStream();
|
||||
while (readBytes != count && (System.nanoTime() - startTime) < mTimeout)
|
||||
{
|
||||
try
|
||||
{
|
||||
sLogger.d("Attempting to read ", count, " bytes from offset = ", readBytes);
|
||||
int read = in.read(data, readBytes, count - readBytes);
|
||||
|
||||
if (read == -1)
|
||||
{
|
||||
sLogger.d("All data have been read from the stream, read bytes count = ", readBytes);
|
||||
break;
|
||||
}
|
||||
|
||||
if (read == 0)
|
||||
{
|
||||
sLogger.e("0 bytes have been obtained. It's considered as error");
|
||||
break;
|
||||
}
|
||||
|
||||
sLogger.d("Read bytes count = ", read);
|
||||
readBytes += read;
|
||||
} catch (SocketTimeoutException e)
|
||||
{
|
||||
long readingTime = System.nanoTime() - startTime;
|
||||
sLogger.e(e, "Socked timeout has occurred after ", readingTime, " (ms) ");
|
||||
if (readingTime > mTimeout)
|
||||
{
|
||||
sLogger.e("Socket wrapper timeout has occurred, requested count = ",
|
||||
count - readBytes, ", " + "readBytes = ", readBytes);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (IOException e)
|
||||
{
|
||||
sLogger.e(e, "Failed to read data from socket: ", this);
|
||||
}
|
||||
|
||||
return count == readBytes;
|
||||
}
|
||||
|
||||
public boolean write(@NonNull byte[] data, int count)
|
||||
{
|
||||
if (!checkSocketAndArguments(data, count))
|
||||
return false;
|
||||
|
||||
sLogger.d("Writing method has started, data.length = " + data.length, ", count = " + count);
|
||||
long startTime = System.nanoTime();
|
||||
try
|
||||
{
|
||||
if (mSocket == null)
|
||||
throw new AssertionError("mSocket cannot be null");
|
||||
|
||||
OutputStream out = mSocket.getOutputStream();
|
||||
out.write(data, 0, count);
|
||||
sLogger.d(count + " bytes have been written");
|
||||
return true;
|
||||
} catch (SocketTimeoutException e)
|
||||
{
|
||||
long writingTime = System.nanoTime() - startTime;
|
||||
sLogger.e(e, "Socked timeout has occurred after ", writingTime, " (ms) ");
|
||||
} catch (IOException e)
|
||||
{
|
||||
sLogger.e(e, "Failed to write data to socket: ", this);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean checkSocketAndArguments(@NonNull byte[] data, int count)
|
||||
{
|
||||
if (mSocket == null)
|
||||
{
|
||||
sLogger.e("Socket must be opened before reading/writing");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (data.length < 0 || count < 0 || count > data.length)
|
||||
{
|
||||
sLogger.e("Illegal arguments, data.length = ", data.length, ", count = " + count);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void setTimeout(int millis)
|
||||
{
|
||||
mTimeout = millis;
|
||||
sLogger.d("Setting the socket wrapper timeout = ", millis, " ms");
|
||||
}
|
||||
|
||||
private void setReadSocketTimeout(@NonNull Socket socket, int millis)
|
||||
{
|
||||
try
|
||||
{
|
||||
socket.setSoTimeout(millis);
|
||||
} catch (SocketException e)
|
||||
{
|
||||
sLogger.e("Failed to set system socket timeout: ", millis, "ms, ", this, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "PlatformSocket{" +
|
||||
"mSocket=" + mSocket +
|
||||
", mHost='" + mHost + '\'' +
|
||||
", mPort=" + mPort +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,265 +0,0 @@
|
|||
package com.mapswithme.maps.location;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.net.SSLCertificateSocketFactory;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import com.mapswithme.maps.BuildConfig;
|
||||
import com.mapswithme.util.log.DebugLogger;
|
||||
import com.mapswithme.util.log.Logger;
|
||||
|
||||
import javax.net.SocketFactory;
|
||||
import javax.net.ssl.SSLSocketFactory;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.Socket;
|
||||
import java.net.SocketException;
|
||||
import java.net.SocketTimeoutException;
|
||||
|
||||
/**
|
||||
* Implements {@link PlatformSocket} interface that will be used by the core for
|
||||
* sending/receiving the raw data trough platform socket interface.
|
||||
* <p>
|
||||
* The instance of this class is supposed to be created in JNI layer
|
||||
* and supposed to be used in the thread safe environment, i.e. thread safety
|
||||
* should be provided externally (by the client of this class).
|
||||
* <p>
|
||||
* <b>All public methods are blocking and shouldn't be called from the main thread.</b>
|
||||
*/
|
||||
class SocketWrapper implements PlatformSocket
|
||||
{
|
||||
private final static Logger sLogger = new DebugLogger(SocketWrapper.class.getSimpleName());
|
||||
private final static int DEFAULT_TIMEOUT = 30 * 1000;
|
||||
@Nullable
|
||||
private Socket mSocket;
|
||||
@Nullable
|
||||
private String mHost;
|
||||
private int mPort;
|
||||
private int mTimeout = DEFAULT_TIMEOUT;
|
||||
|
||||
@Override
|
||||
public boolean open(@NonNull String host, int port)
|
||||
{
|
||||
if (mSocket != null)
|
||||
{
|
||||
sLogger.e("Socket is already opened. Seems that it wasn't closed.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!isPortAllowed(port))
|
||||
{
|
||||
sLogger.e("A wrong port number, it must be within (0-65535) range", port);
|
||||
return false;
|
||||
}
|
||||
|
||||
mHost = host;
|
||||
mPort = port;
|
||||
|
||||
Socket socket = createSocket(host, port, true);
|
||||
if (socket != null && socket.isConnected())
|
||||
{
|
||||
setReadSocketTimeout(socket, mTimeout);
|
||||
mSocket = socket;
|
||||
}
|
||||
|
||||
return mSocket != null;
|
||||
}
|
||||
|
||||
private static boolean isPortAllowed(int port)
|
||||
{
|
||||
return port >= 0 && port <= 65535;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static Socket createSocket(@NonNull String host, int port, boolean ssl)
|
||||
{
|
||||
if (ssl)
|
||||
{
|
||||
try
|
||||
{
|
||||
SocketFactory sf = getSocketFactory();
|
||||
return sf.createSocket(host, port);
|
||||
} catch (IOException e)
|
||||
{
|
||||
sLogger.e("Failed to create the ssl socket, mHost = ", host, " mPort = ", port, e);
|
||||
}
|
||||
} else
|
||||
{
|
||||
try
|
||||
{
|
||||
return new Socket(host, port);
|
||||
} catch (IOException e)
|
||||
{
|
||||
sLogger.e("Failed to create the socket, mHost = ", host, " mPort = ", port, e);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@SuppressLint("SSLCertificateSocketFactoryGetInsecure")
|
||||
@NonNull
|
||||
private static SocketFactory getSocketFactory()
|
||||
{
|
||||
// Trusting to any ssl certificate factory that will be used in
|
||||
// debug mode, for testing purposes only.
|
||||
if (BuildConfig.DEBUG)
|
||||
//TODO: implement the custom KeyStore to make the self-signed certificates work
|
||||
return SSLCertificateSocketFactory.getInsecure(0, null);
|
||||
|
||||
return SSLSocketFactory.getDefault();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close()
|
||||
{
|
||||
if (mSocket == null)
|
||||
{
|
||||
sLogger.d("Socket is already closed or it wasn't opened yet");
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
mSocket.close();
|
||||
} catch (IOException e)
|
||||
{
|
||||
sLogger.e("Failed to close socket: ", this, e);
|
||||
} finally
|
||||
{
|
||||
mSocket = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean read(@NonNull byte[] data, int count)
|
||||
{
|
||||
if (!checkSocketAndArguments(data, count))
|
||||
return false;
|
||||
|
||||
sLogger.d("Reading has started, data.length = " + data.length, ", count = " + count);
|
||||
long startTime = System.nanoTime();
|
||||
int readBytes = 0;
|
||||
try
|
||||
{
|
||||
if (mSocket == null)
|
||||
throw new AssertionError("mSocket cannot be null");
|
||||
|
||||
InputStream in = mSocket.getInputStream();
|
||||
while (readBytes != count && (System.nanoTime() - startTime) < mTimeout)
|
||||
{
|
||||
try
|
||||
{
|
||||
sLogger.d("Attempting to read ", count, " bytes from offset = ", readBytes);
|
||||
int read = in.read(data, readBytes, count - readBytes);
|
||||
|
||||
if (read == -1)
|
||||
{
|
||||
sLogger.d("All data have been read from the stream, read bytes count = ", readBytes);
|
||||
break;
|
||||
}
|
||||
|
||||
if (read == 0)
|
||||
{
|
||||
sLogger.e("0 bytes have been obtained. It's considered as error");
|
||||
break;
|
||||
}
|
||||
|
||||
sLogger.d("Read bytes count = ", read);
|
||||
readBytes += read;
|
||||
} catch (SocketTimeoutException e)
|
||||
{
|
||||
long readingTime = System.nanoTime() - startTime;
|
||||
sLogger.e(e, "Socked timeout has occurred after ", readingTime, " (ms) ");
|
||||
if (readingTime > mTimeout)
|
||||
{
|
||||
sLogger.e("Socket wrapper timeout has occurred, requested count = ",
|
||||
count - readBytes, ", " + "readBytes = ", readBytes);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (IOException e)
|
||||
{
|
||||
sLogger.e(e, "Failed to read data from socket: ", this);
|
||||
}
|
||||
|
||||
return count == readBytes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean write(@NonNull byte[] data, int count)
|
||||
{
|
||||
if (!checkSocketAndArguments(data, count))
|
||||
return false;
|
||||
|
||||
sLogger.d("Writing method has started, data.length = " + data.length, ", count = " + count);
|
||||
long startTime = System.nanoTime();
|
||||
try
|
||||
{
|
||||
if (mSocket == null)
|
||||
throw new AssertionError("mSocket cannot be null");
|
||||
|
||||
OutputStream out = mSocket.getOutputStream();
|
||||
out.write(data, 0, count);
|
||||
return true;
|
||||
} catch (SocketTimeoutException e)
|
||||
{
|
||||
long writingTime = System.nanoTime() - startTime;
|
||||
sLogger.e(e, "Socked timeout has occurred after ", writingTime, " (ms) ");
|
||||
} catch (IOException e)
|
||||
{
|
||||
sLogger.e(e, "Failed to write data to socket: ", this);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean checkSocketAndArguments(@NonNull byte[] data, int count)
|
||||
{
|
||||
if (mSocket == null)
|
||||
{
|
||||
sLogger.e("Socket must be opened before reading/writing");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (data.length < 0 || count < 0 || count > data.length)
|
||||
{
|
||||
sLogger.e("Illegal arguments, data.length = ", data.length, ", count = " + count);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTimeout(int millis)
|
||||
{
|
||||
mTimeout = millis;
|
||||
sLogger.d("Setting the socket wrapper timeout = ", millis, " ms");
|
||||
}
|
||||
|
||||
private void setReadSocketTimeout(@NonNull Socket socket, int millis)
|
||||
{
|
||||
try
|
||||
{
|
||||
socket.setSoTimeout(millis);
|
||||
} catch (SocketException e)
|
||||
{
|
||||
sLogger.e("Failed to set system socket timeout: ", millis, "ms, ", this, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "SocketWrapper{" +
|
||||
"mSocket=" + mSocket +
|
||||
", mHost='" + mHost + '\'' +
|
||||
", mPort=" + mPort +
|
||||
'}';
|
||||
}
|
||||
}
|
|
@ -98,6 +98,9 @@ public class NavigationController
|
|||
View shadow = topFrame.findViewById(R.id.shadow_top);
|
||||
UiUtils.showIf(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP, shadow);
|
||||
|
||||
UiUtils.extendViewWithStatusBar(mStreetFrame);
|
||||
UiUtils.extendViewMarginWithStatusBar(turnFrame);
|
||||
|
||||
// Bottom frame
|
||||
mSpeedValue = (TextView) mBottomFrame.findViewById(R.id.speed_value);
|
||||
mSpeedUnits = (TextView) mBottomFrame.findViewById(R.id.speed_dimen);
|
||||
|
@ -133,10 +136,7 @@ public class NavigationController
|
|||
{
|
||||
case STOP:
|
||||
RoutingController.get().cancel();
|
||||
Statistics.INSTANCE.trackEvent(Statistics.EventName.ROUTING_CLOSE);
|
||||
AlohaHelper.logClick(AlohaHelper.ROUTING_CLOSE);
|
||||
parent.refreshFade();
|
||||
mSearchWheel.reset();
|
||||
stop(parent);
|
||||
break;
|
||||
case SETTINGS:
|
||||
parent.closeMenu(Statistics.EventName.ROUTING_SETTINGS, AlohaHelper.MENU_SETTINGS, new Runnable()
|
||||
|
@ -162,6 +162,14 @@ public class NavigationController
|
|||
});
|
||||
}
|
||||
|
||||
private void stop(MwmActivity parent)
|
||||
{
|
||||
Statistics.INSTANCE.trackEvent(Statistics.EventName.ROUTING_CLOSE);
|
||||
AlohaHelper.logClick(AlohaHelper.ROUTING_CLOSE);
|
||||
parent.refreshFade();
|
||||
mSearchWheel.reset();
|
||||
}
|
||||
|
||||
private void updateVehicle(RoutingInfo info)
|
||||
{
|
||||
mNextTurnDistance.setText(Utils.formatUnitsText(mFrame.getContext(),
|
||||
|
@ -282,8 +290,6 @@ public class NavigationController
|
|||
UiUtils.showIf(show, mFrame);
|
||||
UiUtils.showIf(show, mSearchButtonFrame);
|
||||
mNavMenu.show(show);
|
||||
if (!show)
|
||||
mSearchWheel.reset();
|
||||
}
|
||||
|
||||
public NavMenu getNavMenu()
|
||||
|
@ -301,4 +307,14 @@ public class NavigationController
|
|||
mShowTimeLeft = savedInstanceState.getBoolean(STATE_SHOW_TIME_LEFT);
|
||||
}
|
||||
|
||||
public boolean cancel()
|
||||
{
|
||||
if (RoutingController.get().cancel())
|
||||
{
|
||||
final MwmActivity parent = ((MwmActivity) mFrame.getContext());
|
||||
stop(parent);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,12 +18,12 @@ import android.widget.TextView;
|
|||
import com.mapswithme.maps.Framework;
|
||||
import com.mapswithme.maps.MwmApplication;
|
||||
import com.mapswithme.maps.R;
|
||||
import com.mapswithme.maps.uber.Uber;
|
||||
import com.mapswithme.maps.uber.UberInfo;
|
||||
import com.mapswithme.maps.uber.UberLinks;
|
||||
import com.mapswithme.maps.bookmarks.data.MapObject;
|
||||
import com.mapswithme.maps.downloader.MapManager;
|
||||
import com.mapswithme.maps.location.LocationHelper;
|
||||
import com.mapswithme.maps.uber.Uber;
|
||||
import com.mapswithme.maps.uber.UberInfo;
|
||||
import com.mapswithme.maps.uber.UberLinks;
|
||||
import com.mapswithme.util.Config;
|
||||
import com.mapswithme.util.ConnectionState;
|
||||
import com.mapswithme.util.StringUtils;
|
||||
|
@ -270,7 +270,7 @@ public class RoutingController
|
|||
mLastBuildProgress = 0;
|
||||
mInternetConnected = ConnectionState.isConnected();
|
||||
|
||||
if (mLastRouterType == Framework.ROUTER_TYPE_TAXI)
|
||||
if (isTaxiRouterType())
|
||||
{
|
||||
if (!mInternetConnected)
|
||||
{
|
||||
|
@ -509,7 +509,17 @@ public class RoutingController
|
|||
|
||||
boolean isUberPlanning()
|
||||
{
|
||||
return mLastRouterType == Framework.ROUTER_TYPE_TAXI && mUberPlanning;
|
||||
return isTaxiRouterType() && mUberPlanning;
|
||||
}
|
||||
|
||||
boolean isTaxiRouterType()
|
||||
{
|
||||
return mLastRouterType == Framework.ROUTER_TYPE_TAXI;
|
||||
}
|
||||
|
||||
boolean isVehicleRouterType()
|
||||
{
|
||||
return mLastRouterType == Framework.ROUTER_TYPE_VEHICLE;
|
||||
}
|
||||
|
||||
public boolean isNavigating()
|
||||
|
@ -724,7 +734,7 @@ public class RoutingController
|
|||
|
||||
// Repeating tap on Uber icon should trigger the route building always,
|
||||
// because it may be "No internet connection, try later" case
|
||||
if (router == mLastRouterType && router != Framework.ROUTER_TYPE_TAXI)
|
||||
if (router == mLastRouterType && !isTaxiRouterType())
|
||||
return;
|
||||
|
||||
mLastRouterType = router;
|
||||
|
@ -814,7 +824,8 @@ public class RoutingController
|
|||
private void requestUberInfo()
|
||||
{
|
||||
mUberPlanning = true;
|
||||
Uber.nativeRequestUberProducts(mStartPoint.getLat(), mStartPoint.getLon(), mEndPoint.getLat(), mEndPoint.getLon());
|
||||
Uber.nativeRequestUberProducts(mStartPoint.getLat(), mStartPoint.getLon(),
|
||||
mEndPoint.getLat(), mEndPoint.getLon());
|
||||
if (mContainer != null)
|
||||
mContainer.updateBuildProgress(0, mLastRouterType);
|
||||
}
|
||||
|
@ -822,7 +833,8 @@ public class RoutingController
|
|||
@NonNull
|
||||
UberLinks getUberLink(@NonNull String productId)
|
||||
{
|
||||
return Uber.nativeGetUberLinks(productId, mStartPoint.getLat(), mStartPoint.getLon(), mEndPoint.getLat(), mEndPoint.getLon());
|
||||
return Uber.nativeGetUberLinks(productId, mStartPoint.getLat(), mStartPoint.getLon(),
|
||||
mEndPoint.getLat(), mEndPoint.getLon());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -834,7 +846,7 @@ public class RoutingController
|
|||
{
|
||||
mUberPlanning = false;
|
||||
mLogger.d("onUberInfoReceived uberInfo = " + info);
|
||||
if (mLastRouterType == Framework.ROUTER_TYPE_TAXI && mContainer != null)
|
||||
if (isTaxiRouterType() && mContainer != null)
|
||||
{
|
||||
mContainer.onUberInfoReceived(info);
|
||||
completeUberRequest();
|
||||
|
@ -851,7 +863,7 @@ public class RoutingController
|
|||
mUberPlanning = false;
|
||||
Uber.ErrorCode code = Uber.ErrorCode.valueOf(errorCode);
|
||||
mLogger.e("onUberError error = " + code);
|
||||
if (mLastRouterType == Framework.ROUTER_TYPE_TAXI && mContainer != null)
|
||||
if (isTaxiRouterType() && mContainer != null)
|
||||
{
|
||||
mContainer.onUberError(code);
|
||||
completeUberRequest();
|
||||
|
|
|
@ -211,14 +211,14 @@ public class RoutingPlanController extends ToolbarController
|
|||
return;
|
||||
}
|
||||
|
||||
if (!isTaxiRouteChecked())
|
||||
if (!isTaxiRouterType())
|
||||
setStartButton();
|
||||
showAltitudeChartAndRoutingDetails();
|
||||
}
|
||||
|
||||
private void showAltitudeChartAndRoutingDetails()
|
||||
{
|
||||
if (isTaxiRouteChecked())
|
||||
if (isTaxiRouterType())
|
||||
return;
|
||||
|
||||
UiUtils.hide(getViewById(R.id.error));
|
||||
|
@ -365,14 +365,14 @@ public class RoutingPlanController extends ToolbarController
|
|||
}
|
||||
}
|
||||
|
||||
private boolean isVehicleRouteChecked()
|
||||
private boolean isVehicleRouterType()
|
||||
{
|
||||
return mRouterTypes.getCheckedRadioButtonId() == R.id.vehicle;
|
||||
return RoutingController.get().isVehicleRouterType();
|
||||
}
|
||||
|
||||
private boolean isTaxiRouteChecked()
|
||||
private boolean isTaxiRouterType()
|
||||
{
|
||||
return mRouterTypes.getCheckedRadioButtonId() == R.id.taxi;
|
||||
return RoutingController.get().isTaxiRouterType();
|
||||
}
|
||||
|
||||
void disableToggle()
|
||||
|
@ -394,7 +394,7 @@ public class RoutingPlanController extends ToolbarController
|
|||
|
||||
void showRouteAltitudeChartInternal(@NonNull ImageView altitudeChart)
|
||||
{
|
||||
if (isVehicleRouteChecked())
|
||||
if (isVehicleRouterType())
|
||||
{
|
||||
UiUtils.hide(altitudeChart);
|
||||
return;
|
||||
|
@ -442,7 +442,7 @@ public class RoutingPlanController extends ToolbarController
|
|||
showError(R.string.taxi_not_found);
|
||||
break;
|
||||
case RemoteError:
|
||||
showError(R.string.uber_remote_error);
|
||||
showError(R.string.dialog_taxi_error);
|
||||
break;
|
||||
default:
|
||||
throw new AssertionError("Unsupported uber error: " + code);
|
||||
|
@ -455,7 +455,7 @@ public class RoutingPlanController extends ToolbarController
|
|||
int checkedId = mRouterTypes.getCheckedRadioButtonId();
|
||||
RoutingToolbarButton rb = (RoutingToolbarButton) mRouterTypes.findViewById(checkedId);
|
||||
rb.error();
|
||||
showError(R.string.uber_no_internet);
|
||||
showError(R.string.dialog_taxi_offline);
|
||||
}
|
||||
|
||||
private void showError(@StringRes int message)
|
||||
|
@ -496,7 +496,7 @@ public class RoutingPlanController extends ToolbarController
|
|||
{
|
||||
Button start = (Button) getViewById(R.id.start);
|
||||
|
||||
if (isTaxiRouteChecked())
|
||||
if (isTaxiRouterType())
|
||||
{
|
||||
final boolean isUberInstalled = Utils.isUberInstalled(mActivity);
|
||||
start.setText(isUberInstalled ? R.string.taxi_order : R.string.install_app);
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package com.mapswithme.maps.routing;
|
||||
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.widget.ImageView;
|
||||
|
@ -8,7 +7,6 @@ import android.widget.ImageView;
|
|||
import com.mapswithme.maps.MwmActivity;
|
||||
import com.mapswithme.maps.R;
|
||||
import com.mapswithme.maps.bookmarks.data.MapObject;
|
||||
import com.mapswithme.util.ThemeUtils;
|
||||
import com.mapswithme.util.UiUtils;
|
||||
|
||||
public class RoutingPlanInplaceController extends RoutingPlanController
|
||||
|
@ -17,17 +15,9 @@ public class RoutingPlanInplaceController extends RoutingPlanController
|
|||
|
||||
private Boolean mSlotsRestoredState;
|
||||
|
||||
private void updateStatusBarColor()
|
||||
{
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
|
||||
mActivity.getWindow().setStatusBarColor(ThemeUtils.getColor(mActivity, UiUtils.isVisible(mFrame) ? R.attr.statusBar
|
||||
: android.R.attr.colorPrimaryDark));
|
||||
}
|
||||
|
||||
public RoutingPlanInplaceController(MwmActivity activity)
|
||||
{
|
||||
super(activity.findViewById(R.id.routing_plan_frame), activity);
|
||||
updateStatusBarColor();
|
||||
}
|
||||
|
||||
public void show(boolean show)
|
||||
|
@ -47,7 +37,6 @@ public class RoutingPlanInplaceController extends RoutingPlanController
|
|||
}
|
||||
|
||||
UiUtils.showIf(show, mFrame);
|
||||
updateStatusBarColor();
|
||||
if (show)
|
||||
updatePoints();
|
||||
}
|
||||
|
|
|
@ -36,6 +36,10 @@ class SearchWheel implements View.OnClickListener
|
|||
@Override
|
||||
public void run()
|
||||
{
|
||||
// if the search bar is already closed, i.e. nothing should be done here.
|
||||
if (!mIsExpanded)
|
||||
return;
|
||||
|
||||
toggleSearchLayout();
|
||||
}
|
||||
};
|
||||
|
@ -237,7 +241,6 @@ class SearchWheel implements View.OnClickListener
|
|||
parent.showSearch();
|
||||
mIsExpanded = false;
|
||||
refreshSearchVisibility();
|
||||
UiThread.cancelDelayedTasks(mCloseRunnable);
|
||||
}
|
||||
|
||||
private void startSearch(SearchOption searchOption)
|
||||
|
|
|
@ -130,12 +130,14 @@ public class SettingsActivity extends PreferenceActivity
|
|||
getAppDelegate().onCreate(savedInstanceState);
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
UiUtils.setupStatusBar(this);
|
||||
setVolumeControlStream(AudioManager.STREAM_MUSIC);
|
||||
|
||||
// Hack to attach Toolbar and make it work on native PreferenceActivity
|
||||
ViewGroup root = (ViewGroup)findViewById(android.R.id.list).getParent().getParent().getParent();
|
||||
View toolbarHolder = LayoutInflater.from(this).inflate(R.layout.toolbar_default, root, false);
|
||||
Toolbar toolbar = (Toolbar) toolbarHolder.findViewById(R.id.toolbar);
|
||||
UiUtils.extendViewWithStatusBar(toolbar);
|
||||
UiUtils.showHomeUpButton(toolbar);
|
||||
|
||||
// First, add toolbar view to UI.
|
||||
|
|
|
@ -27,6 +27,8 @@ public class ToolbarController
|
|||
{
|
||||
mActivity = activity;
|
||||
mToolbar = (Toolbar) root.findViewById(getToolbarId());
|
||||
|
||||
UiUtils.extendViewWithStatusBar(mToolbar);
|
||||
setupNavigationListener();
|
||||
}
|
||||
|
||||
|
|
|
@ -222,7 +222,7 @@ public class MainMenu extends BaseMenu
|
|||
mapItem(Item.SETTINGS);
|
||||
|
||||
adjustCollapsedItems();
|
||||
setState(State.MENU, false);
|
||||
setState(State.MENU, false, false);
|
||||
}
|
||||
|
||||
public MainMenu(View frame, ItemClickListener<Item> itemClickListener)
|
||||
|
@ -250,7 +250,7 @@ public class MainMenu extends BaseMenu
|
|||
return R.dimen.menu_line_height;
|
||||
}
|
||||
|
||||
public void setState(State state, boolean animateToggle)
|
||||
public void setState(State state, boolean animateToggle, boolean isFullScreen)
|
||||
{
|
||||
if (state != State.NAVIGATION)
|
||||
{
|
||||
|
@ -281,7 +281,7 @@ public class MainMenu extends BaseMenu
|
|||
|
||||
if (mLayoutMeasured)
|
||||
{
|
||||
show(state != State.NAVIGATION);
|
||||
show(state != State.NAVIGATION && !isFullScreen);
|
||||
mContentFrame.measure(ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||
mContentHeight = mContentFrame.getMeasuredHeight();
|
||||
|
|
|
@ -40,6 +40,7 @@ class BottomPlacePageAnimationController extends BasePlacePageAnimationControlle
|
|||
BottomPlacePageAnimationController(@NonNull PlacePageView placePage)
|
||||
{
|
||||
super(placePage);
|
||||
UiUtils.extendViewMarginWithStatusBar(mDetailsScroll);
|
||||
mLayoutToolbar = (LinearLayout) mPlacePage.findViewById(R.id.toolbar_layout);
|
||||
if (mLayoutToolbar == null)
|
||||
return;
|
||||
|
@ -47,6 +48,7 @@ class BottomPlacePageAnimationController extends BasePlacePageAnimationControlle
|
|||
final Toolbar toolbar = (Toolbar) mLayoutToolbar.findViewById(R.id.toolbar);
|
||||
if (toolbar != null)
|
||||
{
|
||||
UiUtils.extendViewWithStatusBar(toolbar);
|
||||
UiUtils.showHomeUpButton(toolbar);
|
||||
toolbar.setNavigationOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
|
@ -90,6 +92,10 @@ class BottomPlacePageAnimationController extends BasePlacePageAnimationControlle
|
|||
return true;
|
||||
|
||||
break;
|
||||
case MotionEvent.ACTION_UP:
|
||||
if (mIsGestureStartedInsideView)
|
||||
mGestureDetector.onTouchEvent(event);
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -168,15 +174,14 @@ class BottomPlacePageAnimationController extends BasePlacePageAnimationControlle
|
|||
mIsDragging = true;
|
||||
if (!translateBy(-distanceY))
|
||||
{
|
||||
if (mDetailsScroll.getTranslationY() == 0)
|
||||
boolean scrollable = isDetailContentScrollable();
|
||||
int maxTranslationY = mDetailsScroll.getHeight() - mDetailsContent.getHeight();
|
||||
if ((scrollable && mDetailsScroll.getTranslationY() == 0)
|
||||
|| (!scrollable && mDetailsScroll.getTranslationY() <= maxTranslationY))
|
||||
{
|
||||
mDetailsScroll.scrollBy((int) distanceX, (int) distanceY);
|
||||
mState = State.FULLSCREEN;
|
||||
}
|
||||
else
|
||||
{
|
||||
mPlacePage.setState(State.HIDDEN);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -328,7 +333,17 @@ class BottomPlacePageAnimationController extends BasePlacePageAnimationControlle
|
|||
hidePlacePage();
|
||||
break;
|
||||
case PREVIEW:
|
||||
showPreview(currentState);
|
||||
mPreview.addOnLayoutChangeListener(new View.OnLayoutChangeListener()
|
||||
{
|
||||
@Override
|
||||
public void onLayoutChange(View v, int left, int top, int right, int bottom,
|
||||
int oldLeft, int oldTop, int oldRight, int oldBottom)
|
||||
{
|
||||
mPreview.removeOnLayoutChangeListener(this);
|
||||
showPreview(currentState);
|
||||
}
|
||||
});
|
||||
mPreview.requestLayout();
|
||||
break;
|
||||
case DETAILS:
|
||||
showDetails();
|
||||
|
|
|
@ -85,6 +85,7 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
|||
private void initToolbar(View view)
|
||||
{
|
||||
Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
|
||||
UiUtils.extendViewWithStatusBar(toolbar);
|
||||
final TextView textView = (TextView) toolbar.findViewById(R.id.tv__save);
|
||||
textView.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
|
|
|
@ -79,6 +79,7 @@ public class EditDescriptionFragment extends BaseMwmDialogFragment
|
|||
private void initToolbar(View view)
|
||||
{
|
||||
Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
|
||||
UiUtils.extendViewWithStatusBar(toolbar);
|
||||
final TextView textView = (TextView) toolbar.findViewById(R.id.tv__save);
|
||||
textView.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
|
|
|
@ -16,6 +16,7 @@ class LeftPlacePageAnimationController extends BasePlacePageAnimationController
|
|||
LeftPlacePageAnimationController(@NonNull PlacePageView placePage)
|
||||
{
|
||||
super(placePage);
|
||||
UiUtils.extendViewPaddingWithStatusBar(mPreview);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -28,6 +28,7 @@ import android.view.MenuItem;
|
|||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.webkit.WebView;
|
||||
import android.widget.GridView;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
|
@ -138,7 +139,8 @@ public class PlacePageView extends RelativeLayout
|
|||
private View mAddPlace;
|
||||
// Bookmark
|
||||
private View mBookmarkFrame;
|
||||
private TextView mBookmarkNote;
|
||||
private WebView mWvBookmarkNote;
|
||||
private TextView mTvBookmarkNote;
|
||||
private boolean mBookmarkSet;
|
||||
// Place page buttons
|
||||
private PlacePageButtons mButtons;
|
||||
|
@ -312,7 +314,9 @@ public class PlacePageView extends RelativeLayout
|
|||
mWiki.setOnLongClickListener(this);
|
||||
|
||||
mBookmarkFrame = mDetails.findViewById(R.id.bookmark_frame);
|
||||
mBookmarkNote = (TextView) mBookmarkFrame.findViewById(R.id.tv__bookmark_notes);
|
||||
mWvBookmarkNote = (WebView) mBookmarkFrame.findViewById(R.id.wv__bookmark_notes);
|
||||
mWvBookmarkNote.getSettings().setJavaScriptEnabled(false);
|
||||
mTvBookmarkNote = (TextView) mBookmarkFrame.findViewById(R.id.tv__bookmark_notes);
|
||||
mBookmarkFrame.findViewById(R.id.tv__bookmark_edit).setOnClickListener(this);
|
||||
|
||||
ViewGroup ppButtons = (ViewGroup) findViewById(R.id.pp__buttons);
|
||||
|
@ -348,7 +352,7 @@ public class PlacePageView extends RelativeLayout
|
|||
|
||||
case BOOKMARK:
|
||||
mBookmarkButtonIcon = icon;
|
||||
updateButtons();
|
||||
updateBookmarkButton();
|
||||
color = ThemeUtils.getColor(getContext(), R.attr.iconTint);
|
||||
break;
|
||||
|
||||
|
@ -755,6 +759,12 @@ public class PlacePageView extends RelativeLayout
|
|||
{
|
||||
mDetails.scrollTo(0, 0);
|
||||
|
||||
// If place page is closed the state of webview should be cleared,
|
||||
// otherwise the animation controller will work with stale webview height,
|
||||
// since the webview caches its state completely, and animation will work wrong.
|
||||
if (state == State.HIDDEN)
|
||||
clearBookmarkWebView();
|
||||
|
||||
if (mMapObject != null)
|
||||
mAnimationController.setState(state, mMapObject.getMapObjectType());
|
||||
|
||||
|
@ -771,6 +781,11 @@ public class PlacePageView extends RelativeLayout
|
|||
}
|
||||
}
|
||||
|
||||
private void clearBookmarkWebView()
|
||||
{
|
||||
mWvBookmarkNote.loadUrl("about:blank");
|
||||
}
|
||||
|
||||
public MapObject getMapObject()
|
||||
{
|
||||
return mMapObject;
|
||||
|
@ -827,6 +842,7 @@ public class PlacePageView extends RelativeLayout
|
|||
case MapObject.BOOKMARK:
|
||||
refreshDistanceToObject(loc);
|
||||
showBookmarkDetails();
|
||||
updateBookmarkButton();
|
||||
setButtons(false, true);
|
||||
break;
|
||||
case MapObject.POI:
|
||||
|
@ -918,8 +934,7 @@ public class PlacePageView extends RelativeLayout
|
|||
{
|
||||
UiUtils.hide(mWebsite);
|
||||
// TODO: remove this after booking_api.cpp will be done
|
||||
if (!USE_OLD_BOOKING)
|
||||
UiUtils.hide(mHotelMore);
|
||||
UiUtils.showIf(USE_OLD_BOOKING, mHotelMore);
|
||||
|
||||
if (mSponsored.getType() != Sponsored.TYPE_BOOKING)
|
||||
UiUtils.hide(mHotelMore);
|
||||
|
@ -993,7 +1008,7 @@ public class PlacePageView extends RelativeLayout
|
|||
mTodayOpeningHours.setTextColor(color);
|
||||
}
|
||||
|
||||
private void updateButtons()
|
||||
private void updateBookmarkButton()
|
||||
{
|
||||
if (mBookmarkButtonIcon == null)
|
||||
return;
|
||||
|
@ -1008,16 +1023,35 @@ public class PlacePageView extends RelativeLayout
|
|||
{
|
||||
mBookmarkSet = false;
|
||||
UiUtils.hide(mBookmarkFrame);
|
||||
updateButtons();
|
||||
updateBookmarkButton();
|
||||
}
|
||||
|
||||
private void showBookmarkDetails()
|
||||
{
|
||||
mBookmarkSet = true;
|
||||
UiUtils.show(mBookmarkFrame);
|
||||
UiUtils.setTextAndHideIfEmpty(mBookmarkNote, ((Bookmark) mMapObject).getBookmarkDescription());
|
||||
Linkify.addLinks(mBookmarkNote, Linkify.ALL);
|
||||
updateButtons();
|
||||
|
||||
final String notes = ((Bookmark) mMapObject).getBookmarkDescription();
|
||||
|
||||
if (TextUtils.isEmpty(notes))
|
||||
{
|
||||
UiUtils.hide(mTvBookmarkNote, mWvBookmarkNote);
|
||||
return;
|
||||
}
|
||||
|
||||
if (StringUtils.nativeIsHtml(notes))
|
||||
{
|
||||
mWvBookmarkNote.loadData(notes, "text/html; charset=utf-8", null);
|
||||
UiUtils.show(mWvBookmarkNote);
|
||||
UiUtils.hide(mTvBookmarkNote);
|
||||
}
|
||||
else
|
||||
{
|
||||
mTvBookmarkNote.setText(notes);
|
||||
Linkify.addLinks(mTvBookmarkNote, Linkify.ALL);
|
||||
UiUtils.show(mTvBookmarkNote);
|
||||
UiUtils.hide(mWvBookmarkNote);
|
||||
}
|
||||
}
|
||||
|
||||
private void setButtons(boolean showBackButton, boolean showRoutingButton)
|
||||
|
@ -1082,11 +1116,15 @@ public class PlacePageView extends RelativeLayout
|
|||
|
||||
final StringBuilder builder = new StringBuilder();
|
||||
if (l.hasAltitude())
|
||||
builder.append(Framework.nativeFormatAltitude(l.getAltitude()));
|
||||
{
|
||||
double altitude = l.getAltitude();
|
||||
builder.append(altitude >= 0 ? "▲" : "▼");
|
||||
builder.append(Framework.nativeFormatAltitude(altitude));
|
||||
}
|
||||
if (l.hasSpeed())
|
||||
builder.append(" ")
|
||||
.append(Framework.nativeFormatSpeed(l.getSpeed()));
|
||||
mTvSubtitle.setText(builder.toString());
|
||||
UiUtils.setTextAndHideIfEmpty(mTvSubtitle, builder.toString());
|
||||
|
||||
mMapObject.setLat(l.getLatitude());
|
||||
mMapObject.setLon(l.getLongitude());
|
||||
|
|
|
@ -7,6 +7,7 @@ import android.content.Context;
|
|||
import android.content.DialogInterface;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Rect;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
|
@ -20,13 +21,17 @@ import android.support.design.widget.TextInputLayout;
|
|||
import android.support.v7.app.AlertDialog;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.text.TextUtils;
|
||||
import android.view.Gravity;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.Surface;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.view.WindowManager;
|
||||
import android.view.animation.Animation;
|
||||
import android.view.animation.Animation.AnimationListener;
|
||||
import android.widget.Button;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
|
@ -35,6 +40,7 @@ import com.mapswithme.maps.R;
|
|||
|
||||
public final class UiUtils
|
||||
{
|
||||
private static final int DEFAULT_TINT_COLOR = Color.parseColor("#20000000");
|
||||
private static float sScreenDensity;
|
||||
|
||||
public static class SimpleAnimationListener implements AnimationListener
|
||||
|
@ -359,6 +365,81 @@ public final class UiUtils
|
|||
return viewRect.contains(x, y);
|
||||
}
|
||||
|
||||
private static int getStatusBarHeight(@NonNull Context context)
|
||||
{
|
||||
int result = 0;
|
||||
Resources res = context.getResources();
|
||||
int resourceId = res.getIdentifier("status_bar_height", "dimen", "android");
|
||||
if (resourceId > 0)
|
||||
result = res.getDimensionPixelSize(resourceId);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void extendViewWithStatusBar(@NonNull View view)
|
||||
{
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
|
||||
return;
|
||||
|
||||
int statusBarHeight = getStatusBarHeight(view.getContext());
|
||||
ViewGroup.LayoutParams lp = view.getLayoutParams();
|
||||
lp.height += statusBarHeight;
|
||||
view.setLayoutParams(lp);
|
||||
extendViewPaddingTop(view, statusBarHeight);
|
||||
}
|
||||
|
||||
public static void extendViewPaddingWithStatusBar(@NonNull View view)
|
||||
{
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
|
||||
return;
|
||||
|
||||
int statusBarHeight = getStatusBarHeight(view.getContext());
|
||||
extendViewPaddingTop(view, statusBarHeight);
|
||||
}
|
||||
|
||||
private static void extendViewPaddingTop(@NonNull View view, int statusBarHeight)
|
||||
{
|
||||
view.setPadding(view.getPaddingLeft(), view.getPaddingTop() + statusBarHeight,
|
||||
view.getPaddingRight(), view.getPaddingBottom());
|
||||
}
|
||||
|
||||
public static void extendViewMarginWithStatusBar(@NonNull View view)
|
||||
{
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
|
||||
return;
|
||||
|
||||
int statusBarHeight = getStatusBarHeight(view.getContext());
|
||||
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
|
||||
int margin = lp.getMarginStart();
|
||||
lp.setMargins(margin, margin + statusBarHeight, margin, margin);
|
||||
view.setLayoutParams(lp);
|
||||
}
|
||||
|
||||
public static void setupStatusBar(@NonNull Activity activity)
|
||||
{
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
|
||||
return;
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
|
||||
{
|
||||
activity.getWindow().getDecorView().setSystemUiVisibility(
|
||||
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
|
||||
}
|
||||
else
|
||||
{
|
||||
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
|
||||
}
|
||||
|
||||
View statusBarTintView = new View(activity);
|
||||
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
|
||||
params.gravity = Gravity.TOP;
|
||||
statusBarTintView.setLayoutParams(params);
|
||||
statusBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);
|
||||
statusBarTintView.setVisibility(View.VISIBLE);
|
||||
ViewGroup decorViewGroup = (ViewGroup) activity.getWindow().getDecorView();
|
||||
decorViewGroup.addView(statusBarTintView);
|
||||
}
|
||||
|
||||
// utility class
|
||||
private UiUtils() {}
|
||||
}
|
||||
|
|
|
@ -18,8 +18,10 @@ class MapObjectShareable extends BaseShareable
|
|||
super(context);
|
||||
|
||||
final Activity activity = getActivity();
|
||||
final String ge0Url = Framework.nativeGetGe0Url(mapObject.getLat(), mapObject.getLon(), mapObject.getScale(), mapObject.getTitle());
|
||||
|
||||
final String ge0Url = Framework.nativeGetGe0Url(mapObject.getLat(), mapObject.getLon(),
|
||||
mapObject.getScale(), mapObject.getTitle());
|
||||
final String httpUrl = Framework.getHttpGe0Url(mapObject.getLat(), mapObject.getLon(),
|
||||
mapObject.getScale(), mapObject.getTitle());
|
||||
final String subject;
|
||||
String text;
|
||||
if (MapObject.isOfType(MapObject.MY_POSITION, mapObject))
|
||||
|
@ -27,8 +29,7 @@ class MapObjectShareable extends BaseShareable
|
|||
subject = activity.getString(R.string.my_position_share_email_subject);
|
||||
text = activity.getString(R.string.my_position_share_email,
|
||||
Framework.nativeGetNameAndAddress(mapObject.getLat(), mapObject.getLon()),
|
||||
ge0Url,
|
||||
Framework.getHttpGe0Url(mapObject.getLat(), mapObject.getLon(), mapObject.getScale(), mapObject.getTitle()));
|
||||
ge0Url, httpUrl);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -38,7 +39,8 @@ class MapObjectShareable extends BaseShareable
|
|||
lineWithBreak(mapObject.getTitle()) +
|
||||
lineWithBreak(mapObject.getSubtitle()) +
|
||||
lineWithBreak(mapObject.getAddress()) +
|
||||
lineWithBreak(ge0Url);
|
||||
lineWithBreak(ge0Url) +
|
||||
lineWithBreak(httpUrl);
|
||||
|
||||
if (sponsored != null)
|
||||
{
|
||||
|
|
|
@ -230,6 +230,7 @@ public enum Statistics
|
|||
Statistics()
|
||||
{
|
||||
mEnabled = Config.isStatisticsEnabled();
|
||||
Config.setStatisticsEnabled(mEnabled);
|
||||
final Context context = MwmApplication.get();
|
||||
// At the moment we need special handling for Alohalytics to enable/disable logging of events in core C++ code.
|
||||
if (mEnabled)
|
||||
|
|
BIN
data/World.mwm
2272
data/countries.txt
|
@ -1,6 +1,6 @@
|
|||
WorldCoasts.mwm 4638135
|
||||
WorldCoasts.mwm 4638210
|
||||
WorldCoasts_obsolete.mwm 4513802
|
||||
World.mwm 35397811
|
||||
World.mwm 35428985
|
||||
01_dejavusans.ttf 633604
|
||||
02_droidsans-fallback.ttf 4033420
|
||||
03_jomolhari-id-a3d.ttf 1817160
|
||||
|
|
|
@ -8,10 +8,16 @@ uniform mat4 pivotTransform;
|
|||
|
||||
varying vec2 v_colorTexCoords;
|
||||
|
||||
const float kShapeCoordScalar = 1000.0;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
vec4 pos = vec4(a_position.xyz, 1) * modelView;
|
||||
vec4 norm = vec4(a_normal, 0, 0) * modelView;
|
||||
|
||||
float normalLen = length(a_normal);
|
||||
vec4 n = normalize(vec4(a_position.xy + a_normal * kShapeCoordScalar, 0, 0) * modelView);
|
||||
vec4 norm = n * normalLen;
|
||||
|
||||
vec4 shiftedPos = norm + pos;
|
||||
shiftedPos = shiftedPos * projection;
|
||||
float w = shiftedPos.w;
|
||||
|
|
|
@ -43,10 +43,6 @@ void PathSymbolShape::Draw(ref_ptr<dp::Batcher> batcher, ref_ptr<dp::TextureMana
|
|||
glsl::vec2 const pivot = glsl::ToVec2(ConvertToLocal(splineIter.m_pos, m_params.m_tileCenter, kShapeCoordScalar));
|
||||
glsl::vec2 n = halfH * glsl::normalize(glsl::vec2(-splineIter.m_dir.y, splineIter.m_dir.x));
|
||||
glsl::vec2 d = halfW * glsl::normalize(glsl::vec2(splineIter.m_dir.x, splineIter.m_dir.y));
|
||||
float nLength = glsl::length(n) * pToGScale;
|
||||
float dLength = glsl::length(d) * pToGScale;
|
||||
n = nLength * glsl::normalize(n);
|
||||
d = dLength * glsl::normalize(d);
|
||||
|
||||
buffer.emplace_back(gpu::SolidTexturingVertex(glsl::vec4(pivot, m_params.m_depth, 0.0f), - d - n, glsl::ToVec2(rect.LeftTop())));
|
||||
buffer.emplace_back(gpu::SolidTexturingVertex(glsl::vec4(pivot, m_params.m_depth, 0.0f), - d + n, glsl::ToVec2(rect.LeftBottom())));
|
||||
|
|
|
@ -79,30 +79,48 @@ void FilterRulesByRuntimeSelector(FeatureType const & f, int zoomLevel, drule::K
|
|||
});
|
||||
}
|
||||
|
||||
class KeyFunctor
|
||||
class Aggregator
|
||||
{
|
||||
public:
|
||||
KeyFunctor(FeatureType const & f,
|
||||
feature::EGeomType type,
|
||||
Aggregator(FeatureType const & f,
|
||||
feature::EGeomType const type,
|
||||
int const zoomLevel,
|
||||
int const keyCount,
|
||||
CaptionDescription & descr)
|
||||
int const keyCount)
|
||||
: m_pointStyleFound(false)
|
||||
, m_lineStyleFound(false)
|
||||
, m_iconFound(false)
|
||||
, m_captionWithoutOffsetFound(false)
|
||||
, m_auxCaptionFound(false)
|
||||
, m_mainTextType(drule::text_type_name)
|
||||
, m_descrInit(false)
|
||||
, m_f(f)
|
||||
, m_geomType(type)
|
||||
, m_zoomLevel(zoomLevel)
|
||||
, m_descr(descr)
|
||||
{
|
||||
m_rules.reserve(keyCount);
|
||||
Init();
|
||||
}
|
||||
|
||||
void AggregateKeys(drule::KeysT const & keys)
|
||||
{
|
||||
for (auto const & key : keys)
|
||||
ProcessKey(key);
|
||||
}
|
||||
|
||||
void AggregateStyleFlags(drule::KeysT const & keys, bool const nameExists)
|
||||
{
|
||||
for (auto const & key : keys)
|
||||
{
|
||||
bool const isNonEmptyCaption = IsTypeOf(key, Caption) && nameExists;
|
||||
m_pointStyleFound |= (IsTypeOf(key, Symbol | Circle) || isNonEmptyCaption);
|
||||
m_lineStyleFound |= IsTypeOf(key, Line);
|
||||
}
|
||||
}
|
||||
|
||||
bool m_pointStyleFound;
|
||||
bool m_lineStyleFound;
|
||||
bool m_auxCaptionFound;
|
||||
drule::text_type_t m_mainTextType;
|
||||
buffer_vector<Stylist::TRuleWrapper, 8> m_rules;
|
||||
|
||||
private:
|
||||
void ProcessKey(drule::Key const & key)
|
||||
{
|
||||
double depth = key.m_priority;
|
||||
|
@ -117,36 +135,23 @@ public:
|
|||
if (IsTypeOf(key, Caption | Symbol | Circle | PathText))
|
||||
{
|
||||
depth += m_priorityModifier;
|
||||
if (m_geomType == feature::GEOM_POINT) ++depth;
|
||||
if (m_geomType == feature::GEOM_POINT)
|
||||
++depth;
|
||||
}
|
||||
else if (IsTypeOf(key, Area))
|
||||
depth -= m_priorityModifier;
|
||||
|
||||
drule::BaseRule const * const dRule = drule::rules().Find(key);
|
||||
m_rules.push_back(make_pair(dRule, depth));
|
||||
|
||||
if (dRule->GetCaption(0) != nullptr)
|
||||
{
|
||||
InitCaptionDescription();
|
||||
m_mainTextType = dRule->GetCaptionTextType(0);
|
||||
depth -= m_priorityModifier;
|
||||
}
|
||||
|
||||
bool const isNonEmptyCaption = IsTypeOf(key, Caption) && IsNameExists();
|
||||
m_pointStyleFound |= (IsTypeOf(key, Symbol | Circle) || isNonEmptyCaption);
|
||||
m_lineStyleFound |= IsTypeOf(key, Line);
|
||||
drule::BaseRule const * const dRule = drule::rules().Find(key);
|
||||
m_rules.emplace_back(make_pair(dRule, depth));
|
||||
|
||||
if (dRule->GetCaption(0) != nullptr)
|
||||
m_mainTextType = dRule->GetCaptionTextType(0);
|
||||
|
||||
m_auxCaptionFound |= (dRule->GetCaption(1) != nullptr);
|
||||
}
|
||||
|
||||
bool m_pointStyleFound;
|
||||
bool m_lineStyleFound;
|
||||
bool m_iconFound;
|
||||
bool m_captionWithoutOffsetFound;
|
||||
bool m_auxCaptionFound;
|
||||
buffer_vector<Stylist::TRuleWrapper, 8> m_rules;
|
||||
drule::text_type_t m_mainTextType;
|
||||
bool m_descrInit;
|
||||
|
||||
private:
|
||||
void Init()
|
||||
{
|
||||
m_depthLayer = m_f.GetLayer();
|
||||
|
@ -162,28 +167,11 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
void InitCaptionDescription()
|
||||
{
|
||||
if (!m_descrInit)
|
||||
{
|
||||
m_descr.Init(m_f, m_zoomLevel);
|
||||
m_descrInit = true;
|
||||
}
|
||||
}
|
||||
|
||||
inline bool IsNameExists() const
|
||||
{
|
||||
ASSERT(m_descrInit, ());
|
||||
return m_descr.IsNameExists();
|
||||
}
|
||||
|
||||
private:
|
||||
FeatureType const & m_f;
|
||||
feature::EGeomType m_geomType;
|
||||
int const m_zoomLevel;
|
||||
double m_priorityModifier;
|
||||
int m_depthLayer;
|
||||
CaptionDescription & m_descr;
|
||||
};
|
||||
|
||||
const uint8_t CoastlineFlag = 1;
|
||||
|
@ -196,41 +184,21 @@ const uint8_t PointStyleFlag = 1 << 3;
|
|||
// ==================================== //
|
||||
|
||||
void CaptionDescription::Init(FeatureType const & f,
|
||||
int const zoomLevel)
|
||||
int const zoomLevel,
|
||||
feature::EGeomType const type,
|
||||
drule::text_type_t const mainTextType,
|
||||
bool const auxCaptionExists)
|
||||
{
|
||||
f.GetPreferredNames(m_mainText, m_auxText);
|
||||
if (auxCaptionExists || type == feature::GEOM_LINE)
|
||||
f.GetPreferredNames(m_mainText, m_auxText);
|
||||
else
|
||||
f.GetReadableName(m_mainText);
|
||||
|
||||
m_roadNumber = f.GetRoadNumber();
|
||||
m_houseNumber = f.GetHouseNumber();
|
||||
|
||||
SwapCaptions(zoomLevel);
|
||||
DiscardLongCaption(zoomLevel);
|
||||
}
|
||||
|
||||
void CaptionDescription::FormatCaptions(FeatureType const & f,
|
||||
feature::EGeomType type,
|
||||
drule::text_type_t mainTextType,
|
||||
bool auxCaptionExists)
|
||||
{
|
||||
if (!auxCaptionExists && !m_auxText.empty() && type != feature::GEOM_LINE)
|
||||
{
|
||||
m_mainText.swap(m_auxText);
|
||||
m_auxText.clear();
|
||||
}
|
||||
|
||||
if (mainTextType == drule::text_type_housenumber)
|
||||
{
|
||||
m_mainText.swap(m_houseNumber);
|
||||
m_houseNumber.clear();
|
||||
}
|
||||
else if (mainTextType == drule::text_type_name)
|
||||
{
|
||||
if (!m_houseNumber.empty())
|
||||
{
|
||||
if (m_mainText.empty() || m_houseNumber.find(m_mainText) != string::npos)
|
||||
m_houseNumber.swap(m_mainText);
|
||||
}
|
||||
}
|
||||
ProcessZoomLevel(zoomLevel);
|
||||
ProcessMainTextType(mainTextType);
|
||||
}
|
||||
|
||||
string const & CaptionDescription::GetMainText() const
|
||||
|
@ -262,21 +230,34 @@ bool CaptionDescription::IsNameExists() const
|
|||
return !m_mainText.empty() || !m_houseNumber.empty();
|
||||
}
|
||||
|
||||
void CaptionDescription::SwapCaptions(int const zoomLevel)
|
||||
void CaptionDescription::ProcessZoomLevel(int const zoomLevel)
|
||||
{
|
||||
if (zoomLevel <= scales::GetUpperWorldScale() && !m_auxText.empty())
|
||||
{
|
||||
m_mainText.swap(m_auxText);
|
||||
m_auxText.clear();
|
||||
}
|
||||
}
|
||||
|
||||
void CaptionDescription::DiscardLongCaption(int const zoomLevel)
|
||||
{
|
||||
if (zoomLevel < 5 && m_mainText.size() > 50)
|
||||
m_mainText.clear();
|
||||
}
|
||||
|
||||
void CaptionDescription::ProcessMainTextType(drule::text_type_t const & mainTextType)
|
||||
{
|
||||
if (mainTextType == drule::text_type_housenumber)
|
||||
{
|
||||
m_mainText.swap(m_houseNumber);
|
||||
m_houseNumber.clear();
|
||||
}
|
||||
else if (mainTextType == drule::text_type_name)
|
||||
{
|
||||
if (!m_houseNumber.empty())
|
||||
{
|
||||
if (m_mainText.empty() || m_houseNumber.find(m_mainText) != string::npos)
|
||||
m_houseNumber.swap(m_mainText);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ==================================== //
|
||||
|
||||
Stylist::Stylist()
|
||||
|
@ -385,21 +366,20 @@ bool InitStylist(FeatureType const & f, int const zoomLevel, bool buildings3d, S
|
|||
return false;
|
||||
}
|
||||
|
||||
Aggregator aggregator(f, mainGeomType, zoomLevel, keys.size());
|
||||
aggregator.AggregateKeys(keys);
|
||||
|
||||
CaptionDescription & descr = s.GetCaptionDescriptionImpl();
|
||||
descr.Init(f, zoomLevel, mainGeomType, aggregator.m_mainTextType, aggregator.m_auxCaptionFound);
|
||||
|
||||
KeyFunctor keyFunctor(f, mainGeomType, zoomLevel, keys.size(), descr);
|
||||
for (auto const & key : keys)
|
||||
keyFunctor.ProcessKey(key);
|
||||
aggregator.AggregateStyleFlags(keys, descr.IsNameExists());
|
||||
|
||||
if (keyFunctor.m_pointStyleFound)
|
||||
if (aggregator.m_pointStyleFound)
|
||||
s.RaisePointStyleFlag();
|
||||
if (keyFunctor.m_lineStyleFound)
|
||||
if (aggregator.m_lineStyleFound)
|
||||
s.RaiseLineStyleFlag();
|
||||
|
||||
s.m_rules.swap(keyFunctor.m_rules);
|
||||
|
||||
if (keyFunctor.m_descrInit)
|
||||
descr.FormatCaptions(f, mainGeomType, keyFunctor.m_mainTextType, keyFunctor.m_auxCaptionFound);
|
||||
s.m_rules.swap(aggregator.m_rules);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -413,14 +393,11 @@ double GetFeaturePriority(FeatureType const & f, int const zoomLevel)
|
|||
|
||||
feature::EGeomType const mainGeomType = feature::EGeomType(geomType.first);
|
||||
|
||||
CaptionDescription descr;
|
||||
|
||||
KeyFunctor keyFunctor(f, mainGeomType, zoomLevel, keys.size(), descr);
|
||||
for (auto const & key : keys)
|
||||
keyFunctor.ProcessKey(key);
|
||||
Aggregator aggregator(f, mainGeomType, zoomLevel, keys.size());
|
||||
aggregator.AggregateKeys(keys);
|
||||
|
||||
double maxPriority = kMinPriority;
|
||||
for (auto const & rule : keyFunctor.m_rules)
|
||||
for (auto const & rule : aggregator.m_rules)
|
||||
{
|
||||
if (rule.second > maxPriority)
|
||||
maxPriority = rule.second;
|
||||
|
|
|
@ -18,12 +18,10 @@ namespace df
|
|||
struct CaptionDescription
|
||||
{
|
||||
void Init(FeatureType const & f,
|
||||
int const zoomLevel);
|
||||
|
||||
void FormatCaptions(FeatureType const & f,
|
||||
feature::EGeomType type,
|
||||
drule::text_type_t mainTextType,
|
||||
bool auxCaptionExists);
|
||||
int const zoomLevel,
|
||||
feature::EGeomType const type,
|
||||
drule::text_type_t const mainTextType,
|
||||
bool const auxCaptionExists);
|
||||
|
||||
string const & GetMainText() const;
|
||||
string const & GetAuxText() const;
|
||||
|
@ -32,10 +30,11 @@ struct CaptionDescription
|
|||
bool IsNameExists() const;
|
||||
|
||||
private:
|
||||
void SwapCaptions(int const zoomLevel);
|
||||
void DiscardLongCaption(int const zoomLevel);
|
||||
/// Clear aux name on high zoom and clear long main name on low zoom.
|
||||
void ProcessZoomLevel(int const zoomLevel);
|
||||
/// Try to use house number as name of the object.
|
||||
void ProcessMainTextType(drule::text_type_t const & mainTextType);
|
||||
|
||||
private:
|
||||
string m_mainText;
|
||||
string m_auxText;
|
||||
string m_roadNumber;
|
||||
|
|
|
@ -106,8 +106,7 @@ bool GetPopulation(FeatureType const & ft, uint32_t & population)
|
|||
// Feature tag value evaluator for tag 'name'
|
||||
bool GetName(FeatureType const & ft, string & name)
|
||||
{
|
||||
string intName;
|
||||
ft.GetPreferredNames(name, intName);
|
||||
ft.GetReadableName(name);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
#include "indexer/feature_visibility.hpp"
|
||||
#include "indexer/osm_editor.hpp"
|
||||
|
||||
#include "platform/preferred_languages.hpp"
|
||||
|
||||
#include "geometry/distance.hpp"
|
||||
#include "geometry/robust_orientation.hpp"
|
||||
|
||||
|
@ -487,13 +489,19 @@ FeatureType::geom_stat_t FeatureType::GetTrianglesSize(int scale) const
|
|||
return geom_stat_t(sz, m_triangles.size());
|
||||
}
|
||||
|
||||
void FeatureType::GetPreferredNames(string & defaultName, string & intName) const
|
||||
void FeatureType::GetPreferredNames(string & primary, string & secondary) const
|
||||
{
|
||||
if (!HasName())
|
||||
return;
|
||||
|
||||
auto const mwmInfo = GetID().m_mwmId.GetInfo();
|
||||
|
||||
if (!mwmInfo)
|
||||
return;
|
||||
|
||||
ParseCommon();
|
||||
::GetPreferredNames(GetID(), GetNames(), defaultName, intName);
|
||||
auto const deviceLang = StringUtf8Multilang::GetLangIndex(languages::GetCurrentNorm());
|
||||
::GetPreferredNames(mwmInfo->GetRegionData(), GetNames(), deviceLang, primary, secondary);
|
||||
}
|
||||
|
||||
void FeatureType::GetReadableName(string & name) const
|
||||
|
@ -501,8 +509,14 @@ void FeatureType::GetReadableName(string & name) const
|
|||
if (!HasName())
|
||||
return;
|
||||
|
||||
auto const mwmInfo = GetID().m_mwmId.GetInfo();
|
||||
|
||||
if (!mwmInfo)
|
||||
return;
|
||||
|
||||
ParseCommon();
|
||||
::GetReadableName(GetID(), GetNames(), name);
|
||||
auto const deviceLang = StringUtf8Multilang::GetLangIndex(languages::GetCurrentNorm());
|
||||
::GetReadableName(mwmInfo->GetRegionData(), GetNames(), deviceLang, name);
|
||||
}
|
||||
|
||||
string FeatureType::GetHouseNumber() const
|
||||
|
|
|
@ -7,8 +7,6 @@
|
|||
|
||||
#include "geometry/point2d.hpp"
|
||||
|
||||
#include "platform/preferred_languages.hpp"
|
||||
|
||||
#include "coding/multilang_utf8_string.hpp"
|
||||
|
||||
#include "base/base.hpp"
|
||||
|
@ -17,15 +15,12 @@
|
|||
|
||||
namespace
|
||||
{
|
||||
void GetMwmLangName(FeatureID const & id, StringUtf8Multilang const & src, string & out)
|
||||
using StrUtf8 = StringUtf8Multilang;
|
||||
|
||||
void GetMwmLangName(feature::RegionData const & regionData, StringUtf8Multilang const & src, string & out)
|
||||
{
|
||||
auto const mwmInfo = id.m_mwmId.GetInfo();
|
||||
|
||||
if (!mwmInfo)
|
||||
return;
|
||||
|
||||
vector<int8_t> mwmLangCodes;
|
||||
mwmInfo->GetRegionData().GetLanguages(mwmLangCodes);
|
||||
regionData.GetLanguages(mwmLangCodes);
|
||||
|
||||
for (auto const code : mwmLangCodes)
|
||||
{
|
||||
|
@ -34,22 +29,9 @@ void GetMwmLangName(FeatureID const & id, StringUtf8Multilang const & src, strin
|
|||
}
|
||||
}
|
||||
|
||||
void GetNames(FeatureID const & id, StringUtf8Multilang const & src, string & primary,
|
||||
string & secondary)
|
||||
void GetBestName(StringUtf8Multilang const & src, vector<int8_t> const & priorityList, string & out)
|
||||
{
|
||||
primary.clear();
|
||||
secondary.clear();
|
||||
|
||||
if (src.IsEmpty())
|
||||
return;
|
||||
|
||||
vector<int8_t> primaryCodes = {StringUtf8Multilang::kDefaultCode};
|
||||
vector<int8_t> secondaryCodes = {StringUtf8Multilang::GetLangIndex(languages::GetCurrentNorm()),
|
||||
StringUtf8Multilang::kInternationalCode,
|
||||
StringUtf8Multilang::kEnglishCode};
|
||||
|
||||
auto primaryIndex = primaryCodes.size();
|
||||
auto secondaryIndex = secondaryCodes.size();
|
||||
auto bestIndex = priorityList.size();
|
||||
|
||||
auto const findAndSet = [](vector<int8_t> const & langs, int8_t const code, string const & name,
|
||||
size_t & bestIndex, string & outName)
|
||||
|
@ -64,23 +46,19 @@ void GetNames(FeatureID const & id, StringUtf8Multilang const & src, string & pr
|
|||
|
||||
src.ForEach([&](int8_t code, string const & name)
|
||||
{
|
||||
if (primaryIndex != 0)
|
||||
findAndSet(primaryCodes, code, name, primaryIndex, primary);
|
||||
if (bestIndex == 0)
|
||||
return false;
|
||||
|
||||
if (secondaryIndex != 0)
|
||||
findAndSet(secondaryCodes, code, name, secondaryIndex, secondary);
|
||||
findAndSet(priorityList, code, name, bestIndex, out);
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
if (primary.empty())
|
||||
GetMwmLangName(id, src, primary);
|
||||
|
||||
if (secondaryIndex < secondaryCodes.size() &&
|
||||
secondaryCodes[secondaryIndex] == StringUtf8Multilang::kInternationalCode)
|
||||
// There are many "junk" names in Arabian island.
|
||||
if (bestIndex < priorityList.size() &&
|
||||
priorityList[bestIndex] == StrUtf8::kInternationalCode)
|
||||
{
|
||||
// There are many "junk" names in Arabian island.
|
||||
secondary = secondary.substr(0, secondary.find_first_of(','));
|
||||
out = out.substr(0, out.find_first_of(','));
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
|
@ -225,41 +203,54 @@ int GetFeatureViewportScale(TypesHolder const & types)
|
|||
return impl::GetFeatureEstimator().GetViewportScale(types);
|
||||
}
|
||||
|
||||
void GetPreferredNames(FeatureID const & id, StringUtf8Multilang const & src, string & primary,
|
||||
string & secondary)
|
||||
void GetPreferredNames(RegionData const & regionData, StringUtf8Multilang const & src,
|
||||
int8_t const deviceLang, string & primary, string & secondary)
|
||||
{
|
||||
// Primary name using priority:
|
||||
// - default name;
|
||||
// - country language name.
|
||||
// Secondary name using priority:
|
||||
// - device language name;
|
||||
// - international name;
|
||||
// - english name.
|
||||
GetNames(id, src, primary, secondary);
|
||||
primary.clear();
|
||||
secondary.clear();
|
||||
|
||||
if (src.IsEmpty())
|
||||
return;
|
||||
|
||||
vector<int8_t> const primaryCodes = {deviceLang,
|
||||
StrUtf8::kInternationalCode,
|
||||
StrUtf8::kEnglishCode};
|
||||
vector<int8_t> secondaryCodes = {StrUtf8::kDefaultCode,
|
||||
StrUtf8::kInternationalCode};
|
||||
|
||||
vector<int8_t> mwmLangCodes;
|
||||
regionData.GetLanguages(mwmLangCodes);
|
||||
|
||||
secondaryCodes.insert(secondaryCodes.end(), mwmLangCodes.begin(), mwmLangCodes.end());
|
||||
secondaryCodes.push_back(StrUtf8::kEnglishCode);
|
||||
|
||||
GetBestName(src, primaryCodes, primary);
|
||||
GetBestName(src, secondaryCodes, secondary);
|
||||
|
||||
if (primary.empty())
|
||||
{
|
||||
primary.swap(secondary);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Filter out similar intName.
|
||||
if (!secondary.empty() && primary.find(secondary) != string::npos)
|
||||
secondary.clear();
|
||||
}
|
||||
primary.swap(secondary);
|
||||
else if (!secondary.empty() && primary.find(secondary) != string::npos)
|
||||
secondary.clear();
|
||||
}
|
||||
|
||||
void GetReadableName(FeatureID const & id, StringUtf8Multilang const & src, string & out)
|
||||
void GetReadableName(RegionData const & regionData, StringUtf8Multilang const & src,
|
||||
int8_t const deviceLang, string & out)
|
||||
{
|
||||
// Names using priority:
|
||||
// - device language name;
|
||||
// - international name;
|
||||
// - english name;
|
||||
// - default name;
|
||||
// - country language name.
|
||||
// Secondary name is preffered to display on the map and place page.
|
||||
string primary, secondary;
|
||||
GetNames(id, src, primary, secondary);
|
||||
out = secondary.empty() ? primary : secondary;
|
||||
out.clear();
|
||||
|
||||
if (src.IsEmpty())
|
||||
return;
|
||||
|
||||
vector<int8_t> codes;
|
||||
// If MWM contains user's language.
|
||||
if (regionData.HasLanguage(deviceLang))
|
||||
codes = {deviceLang, StrUtf8::kDefaultCode, StrUtf8::kInternationalCode, StrUtf8::kEnglishCode};
|
||||
else
|
||||
codes = {deviceLang, StrUtf8::kInternationalCode, StrUtf8::kEnglishCode, StrUtf8::kDefaultCode};
|
||||
|
||||
GetBestName(src, codes, out);
|
||||
|
||||
if (out.empty())
|
||||
GetMwmLangName(regionData, src, out);
|
||||
}
|
||||
} // namespace feature
|
||||
|
|
|
@ -10,11 +10,37 @@ class StringUtf8Multilang;
|
|||
namespace feature
|
||||
{
|
||||
class TypesHolder;
|
||||
class RegionData;
|
||||
|
||||
/// Get viewport scale to show given feature. Used in search.
|
||||
int GetFeatureViewportScale(TypesHolder const & types);
|
||||
|
||||
void GetPreferredNames(FeatureID const & id, StringUtf8Multilang const & src, string & primary,
|
||||
string & secondary);
|
||||
void GetReadableName(FeatureID const & id, StringUtf8Multilang const & src, string & out);
|
||||
/// Primary name using priority:
|
||||
/// - device language name;
|
||||
/// - international name;
|
||||
/// - english name.
|
||||
/// Secondary name using priority:
|
||||
/// - default name;
|
||||
/// - international name;
|
||||
/// - country language name;
|
||||
/// - english name.
|
||||
/// In case when primary name is empty it will be propagated from secondary and secondary will be
|
||||
/// cleared. In case when primary name contains secondary name then secondary will be cleared.
|
||||
void GetPreferredNames(RegionData const & regionData, StringUtf8Multilang const & src,
|
||||
int8_t const deviceLang, string & primary, string & secondary);
|
||||
|
||||
/// When MWM contains user's language, the priority is the following:
|
||||
/// - device language name;
|
||||
/// - default name;
|
||||
/// - international name;
|
||||
/// - english name;
|
||||
/// - country language name.
|
||||
/// When MWM does not contain user's language, the priority is the following:
|
||||
/// - device language name;
|
||||
/// - international name;
|
||||
/// - english name;
|
||||
/// - default name;
|
||||
/// - country language name.
|
||||
void GetReadableName(RegionData const & regionData, StringUtf8Multilang const & src,
|
||||
int8_t const deviceLang, string & out);
|
||||
} // namespace feature
|
||||
|
|
|
@ -1,39 +1,314 @@
|
|||
#include "testing/testing.hpp"
|
||||
|
||||
#include "indexer/feature_utils.hpp"
|
||||
#include "indexer/features_vector.hpp"
|
||||
#include "indexer/index.hpp"
|
||||
#include "indexer/mwm_set.hpp"
|
||||
|
||||
#include "platform/local_country_file.hpp"
|
||||
#include "platform/preferred_languages.hpp"
|
||||
|
||||
using namespace platform;
|
||||
|
||||
namespace
|
||||
{
|
||||
UNIT_TEST(GetFeatureNames)
|
||||
using StrUtf8 = StringUtf8Multilang;
|
||||
|
||||
UNIT_TEST(GetPrefferedNames)
|
||||
{
|
||||
LocalCountryFile localFile = LocalCountryFile::MakeForTesting("minsk-pass");
|
||||
feature::RegionData regionData;
|
||||
regionData.SetLanguages({"de", "ko"});
|
||||
|
||||
Index index;
|
||||
auto result = index.RegisterMap(localFile);
|
||||
TEST_EQUAL(result.second, MwmSet::RegResult::Success, ());
|
||||
int8_t deviceLang = StrUtf8::GetLangIndex("ru");
|
||||
string primary, secondary;
|
||||
|
||||
auto const & id = result.first;
|
||||
MwmSet::MwmHandle handle = index.GetMwmHandleById(id);
|
||||
TEST(handle.IsAlive(), ());
|
||||
|
||||
auto const * value = handle.GetValue<MwmValue>();
|
||||
FeaturesVector fv(value->m_cont, value->GetHeader(), value->m_table.get());
|
||||
string primary, secondary, readable;
|
||||
|
||||
fv.ForEach([&](FeatureType & ft, uint32_t /* index */)
|
||||
{
|
||||
ft.GetPreferredNames(primary, secondary);
|
||||
if (!secondary.empty())
|
||||
{
|
||||
ft.GetReadableName(readable);
|
||||
TEST_EQUAL(secondary, readable, ());
|
||||
}
|
||||
});
|
||||
StrUtf8 src;
|
||||
src.AddString("fr", "fr name");
|
||||
|
||||
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
|
||||
|
||||
TEST_EQUAL(primary, "", ());
|
||||
TEST_EQUAL(secondary, "", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("default", "default name");
|
||||
|
||||
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
|
||||
|
||||
TEST_EQUAL(primary, "default name", ());
|
||||
TEST_EQUAL(secondary, "", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("default", "default name");
|
||||
src.AddString("en", "en name");
|
||||
|
||||
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
|
||||
|
||||
TEST_EQUAL(primary, "en name", ());
|
||||
TEST_EQUAL(secondary, "default name", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("default", "default name");
|
||||
src.AddString("en", "en name");
|
||||
src.AddString("ru", "ru name");
|
||||
|
||||
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
|
||||
|
||||
TEST_EQUAL(primary, "ru name", ());
|
||||
TEST_EQUAL(secondary, "default name", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("default", "same name");
|
||||
src.AddString("en", "en name");
|
||||
src.AddString("ru", "same name");
|
||||
src.AddString("int_name", "int name");
|
||||
|
||||
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
|
||||
|
||||
TEST_EQUAL(primary, "same name", ());
|
||||
TEST_EQUAL(secondary, "", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("default", "default name");
|
||||
src.AddString("en", "en name");
|
||||
src.AddString("ru", "ru name");
|
||||
src.AddString("int_name", "int name");
|
||||
src.AddString("de", "de name");
|
||||
|
||||
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
|
||||
|
||||
TEST_EQUAL(primary, "ru name", ());
|
||||
TEST_EQUAL(secondary, "default name", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("default", "default name");
|
||||
src.AddString("en", "en name");
|
||||
src.AddString("ru", "ru name");
|
||||
src.AddString("int_name", "int name");
|
||||
src.AddString("de", "de name");
|
||||
src.AddString("ko", "ko name");
|
||||
|
||||
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
|
||||
|
||||
TEST_EQUAL(primary, "ru name", ());
|
||||
TEST_EQUAL(secondary, "default name", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("default", "default name");
|
||||
src.AddString("en", "en name");
|
||||
src.AddString("int_name", "int name");
|
||||
src.AddString("de", "de name");
|
||||
src.AddString("ko", "ko name");
|
||||
|
||||
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
|
||||
|
||||
TEST_EQUAL(primary, "int name", ());
|
||||
TEST_EQUAL(secondary, "default name", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("en", "en name");
|
||||
src.AddString("int_name", "int name");
|
||||
src.AddString("de", "de name");
|
||||
src.AddString("ko", "ko name");
|
||||
|
||||
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
|
||||
|
||||
TEST_EQUAL(primary, "int name", ());
|
||||
TEST_EQUAL(secondary, "", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("en", "en name");
|
||||
src.AddString("de", "de name");
|
||||
src.AddString("ko", "ko name");
|
||||
|
||||
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
|
||||
|
||||
TEST_EQUAL(primary, "en name", ());
|
||||
TEST_EQUAL(secondary, "de name", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("en", "en name");
|
||||
src.AddString("ko", "ko name");
|
||||
|
||||
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
|
||||
|
||||
TEST_EQUAL(primary, "en name", ());
|
||||
TEST_EQUAL(secondary, "ko name", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("en", "en name");
|
||||
|
||||
feature::GetPreferredNames(regionData, src, deviceLang, primary, secondary);
|
||||
|
||||
TEST_EQUAL(primary, "en name", ());
|
||||
TEST_EQUAL(secondary, "", ());
|
||||
}
|
||||
}
|
||||
|
||||
UNIT_TEST(GetReadableName)
|
||||
{
|
||||
feature::RegionData regionData;
|
||||
regionData.SetLanguages({"de", "ko"});
|
||||
|
||||
int8_t deviceLang = StrUtf8::GetLangIndex("ru");
|
||||
string name;
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("fr", "fr name");
|
||||
|
||||
feature::GetReadableName(regionData, src, deviceLang, name);
|
||||
|
||||
TEST_EQUAL(name, "", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("ko", "ko name");
|
||||
|
||||
feature::GetReadableName(regionData, src, deviceLang, name);
|
||||
|
||||
TEST_EQUAL(name, "ko name", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("ko", "ko name");
|
||||
src.AddString("de", "de name");
|
||||
|
||||
feature::GetReadableName(regionData, src, deviceLang, name);
|
||||
|
||||
TEST_EQUAL(name, "de name", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("ko", "ko name");
|
||||
src.AddString("de", "de name");
|
||||
src.AddString("default", "default name");
|
||||
|
||||
feature::GetReadableName(regionData, src, deviceLang, name);
|
||||
|
||||
TEST_EQUAL(name, "default name", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("ko", "ko name");
|
||||
src.AddString("de", "de name");
|
||||
src.AddString("default", "default name");
|
||||
src.AddString("en", "en name");
|
||||
|
||||
feature::GetReadableName(regionData, src, deviceLang, name);
|
||||
|
||||
TEST_EQUAL(name, "en name", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("ko", "ko name");
|
||||
src.AddString("de", "de name");
|
||||
src.AddString("default", "default name");
|
||||
src.AddString("en", "en name");
|
||||
src.AddString("int_name", "int name");
|
||||
|
||||
feature::GetReadableName(regionData, src, deviceLang, name);
|
||||
|
||||
TEST_EQUAL(name, "int name", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("ko", "ko name");
|
||||
src.AddString("de", "de name");
|
||||
src.AddString("default", "default name");
|
||||
src.AddString("en", "en name");
|
||||
src.AddString("int_name", "int name");
|
||||
src.AddString("ru", "ru name");
|
||||
|
||||
feature::GetReadableName(regionData, src, deviceLang, name);
|
||||
|
||||
TEST_EQUAL(name, "ru name", ());
|
||||
}
|
||||
|
||||
deviceLang = StrUtf8::GetLangIndex("de");
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("ko", "ko name");
|
||||
src.AddString("de", "de name");
|
||||
src.AddString("default", "default name");
|
||||
src.AddString("en", "en name");
|
||||
src.AddString("int_name", "int name");
|
||||
|
||||
feature::GetReadableName(regionData, src, deviceLang, name);
|
||||
|
||||
TEST_EQUAL(name, "de name", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("ko", "ko name");
|
||||
src.AddString("default", "default name");
|
||||
src.AddString("en", "en name");
|
||||
src.AddString("int_name", "int name");
|
||||
|
||||
feature::GetReadableName(regionData, src, deviceLang, name);
|
||||
|
||||
TEST_EQUAL(name, "default name", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("ko", "ko name");
|
||||
src.AddString("en", "en name");
|
||||
src.AddString("int_name", "int name");
|
||||
|
||||
feature::GetReadableName(regionData, src, deviceLang, name);
|
||||
|
||||
TEST_EQUAL(name, "int name", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("ko", "ko name");
|
||||
src.AddString("en", "en name");
|
||||
|
||||
feature::GetReadableName(regionData, src, deviceLang, name);
|
||||
|
||||
TEST_EQUAL(name, "en name", ());
|
||||
}
|
||||
|
||||
{
|
||||
StrUtf8 src;
|
||||
src.AddString("ko", "ko name");
|
||||
|
||||
feature::GetReadableName(regionData, src, deviceLang, name);
|
||||
|
||||
TEST_EQUAL(name, "ko name", ());
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
|
|
|
@ -197,14 +197,10 @@ static NSString * const kAlertControllerNibIdentifier = @"MWMAlertViewController
|
|||
}
|
||||
[UIView animateWithDuration:kDefaultAnimationDuration
|
||||
animations:^{
|
||||
for (MWMAlert * view in self.view.subviews)
|
||||
view.alpha = 0.0;
|
||||
}
|
||||
completion:^(BOOL finished) {
|
||||
for (MWMAlert * view in self.view.subviews)
|
||||
{
|
||||
if (view != alert)
|
||||
view.hidden = YES;
|
||||
view.alpha = 0.0;
|
||||
}
|
||||
}];
|
||||
|
||||
|
@ -229,8 +225,6 @@ static NSString * const kAlertControllerNibIdentifier = @"MWMAlertViewController
|
|||
NSArray * subviews = self.view.subviews;
|
||||
MWMAlert * closeAlert = subviews.lastObject;
|
||||
MWMAlert * showAlert = (subviews.count >= 2 ? subviews[subviews.count - 2] : nil);
|
||||
if (showAlert)
|
||||
showAlert.hidden = NO;
|
||||
[UIView animateWithDuration:kDefaultAnimationDuration
|
||||
animations:^{
|
||||
closeAlert.alpha = 0.;
|
||||
|
|
|
@ -96,21 +96,10 @@ CGFloat const kAnimationDuration = .05;
|
|||
NSAssert(!countries.empty(), @"countries can not be empty.");
|
||||
MWMDownloadTransitMapAlert * alert = [[[NSBundle mainBundle] loadNibNamed:kDownloadTransitMapAlertNibName owner:nil options:nil] firstObject];
|
||||
|
||||
NSMutableArray<NSString *> * titles = [@[] mutableCopy];
|
||||
TMwmSize totalSize = 0;
|
||||
auto const & s = GetFramework().GetStorage();
|
||||
for (auto const & countryId : countries)
|
||||
{
|
||||
storage::NodeAttrs attrs;
|
||||
s.GetNodeAttrs(countryId, attrs);
|
||||
[titles addObject:@(attrs.m_nodeLocalName.c_str())];
|
||||
totalSize += attrs.m_mwmSize;
|
||||
}
|
||||
|
||||
alert->m_countries = countries;
|
||||
alert.countriesNames = titles;
|
||||
alert.countriesSize = formattedSize(totalSize);
|
||||
[alert configure];
|
||||
[alert updateCountriesList];
|
||||
[MWMFrameworkListener addObserver:alert];
|
||||
return alert;
|
||||
}
|
||||
|
||||
|
@ -121,6 +110,26 @@ CGFloat const kAnimationDuration = .05;
|
|||
[self.dialogsTableView reloadData];
|
||||
}
|
||||
|
||||
- (void)updateCountriesList
|
||||
{
|
||||
auto const & s = GetFramework().GetStorage();
|
||||
m_countries.erase(
|
||||
remove_if(m_countries.begin(), m_countries.end(),
|
||||
[&s](TCountryId const & countryId) { return s.IsNodeDownloaded(countryId); }),
|
||||
m_countries.end());
|
||||
NSMutableArray<NSString *> * titles = [@[] mutableCopy];
|
||||
TMwmSize totalSize = 0;
|
||||
for (auto const & countryId : m_countries)
|
||||
{
|
||||
storage::NodeAttrs attrs;
|
||||
s.GetNodeAttrs(countryId, attrs);
|
||||
[titles addObject:@(attrs.m_nodeLocalName.c_str())];
|
||||
totalSize += attrs.m_mwmSize;
|
||||
}
|
||||
self.countriesNames = titles;
|
||||
self.countriesSize = formattedSize(totalSize);
|
||||
}
|
||||
|
||||
#pragma mark - MWMCircularProgressProtocol
|
||||
|
||||
- (void)progressButtonPressed:(nonnull MWMCircularProgress *)progress
|
||||
|
@ -134,22 +143,38 @@ CGFloat const kAnimationDuration = .05;
|
|||
|
||||
- (void)processCountryEvent:(TCountryId const &)countryId
|
||||
{
|
||||
auto const & s = GetFramework().GetStorage();
|
||||
auto const & p = GetFramework().GetDownloadingPolicy();
|
||||
if (s.CheckFailedCountries(m_countries))
|
||||
{
|
||||
if (p.IsAutoRetryDownloadFailed())
|
||||
[self close:nil];
|
||||
if (find(m_countries.begin(), m_countries.end(), countryId) == m_countries.end())
|
||||
return;
|
||||
if (self.rightButton.hidden)
|
||||
{
|
||||
auto const & s = GetFramework().GetStorage();
|
||||
auto const & p = GetFramework().GetDownloadingPolicy();
|
||||
if (s.CheckFailedCountries(m_countries))
|
||||
{
|
||||
if (p.IsAutoRetryDownloadFailed())
|
||||
[self close:nil];
|
||||
return;
|
||||
}
|
||||
auto const overallProgress = s.GetOverallProgress(m_countries);
|
||||
// Test if downloading has finished by comparing downloaded and total sizes.
|
||||
if (overallProgress.first == overallProgress.second)
|
||||
[self close:self.downloadCompleteBlock];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self updateCountriesList];
|
||||
[self.dialogsTableView reloadSections:[NSIndexSet indexSetWithIndex:0]
|
||||
withRowAnimation:UITableViewRowAnimationAutomatic];
|
||||
if (m_countries.empty())
|
||||
[self close:self.downloadCompleteBlock];
|
||||
}
|
||||
auto const overallProgress = s.GetOverallProgress(m_countries);
|
||||
// Test if downloading has finished by comparing downloaded and total sizes.
|
||||
if (overallProgress.first == overallProgress.second)
|
||||
[self close:self.downloadCompleteBlock];
|
||||
}
|
||||
|
||||
- (void)processCountry:(TCountryId const &)countryId progress:(MapFilesDownloader::TProgress const &)progress
|
||||
{
|
||||
if (!self.rightButton.hidden ||
|
||||
find(m_countries.begin(), m_countries.end(), countryId) == m_countries.end())
|
||||
return;
|
||||
auto const overallProgress = GetFramework().GetStorage().GetOverallProgress(m_countries);
|
||||
CGFloat const progressValue = static_cast<CGFloat>(overallProgress.first) / overallProgress.second;
|
||||
self.progress.progress = progressValue;
|
||||
|
@ -167,9 +192,13 @@ CGFloat const kAnimationDuration = .05;
|
|||
- (IBAction)downloadButtonTap
|
||||
{
|
||||
[Statistics logEvent:kStatisticsEvent withParameters:@{kStatAction : kStatApply}];
|
||||
self.downloadBlock(m_countries, ^
|
||||
[self updateCountriesList];
|
||||
if (m_countries.empty())
|
||||
{
|
||||
[MWMFrameworkListener addObserver:self];
|
||||
[self close:self.downloadCompleteBlock];
|
||||
return;
|
||||
}
|
||||
self.downloadBlock(m_countries, ^{
|
||||
self.titleLabel.text = L(@"downloading");
|
||||
self.messageLabel.hidden = YES;
|
||||
self.progressWrapper.hidden = NO;
|
||||
|
@ -180,7 +209,10 @@ CGFloat const kAnimationDuration = .05;
|
|||
self.rightButton.hidden = YES;
|
||||
self.dialogsBottomOffset.priority = UILayoutPriorityDefaultHigh;
|
||||
self.progressWrapperBottomOffset.priority = UILayoutPriorityDefaultHigh;
|
||||
[UIView animateWithDuration:kAnimationDuration animations:^{ [self layoutSubviews]; }];
|
||||
[UIView animateWithDuration:kAnimationDuration
|
||||
animations:^{
|
||||
[self layoutSubviews];
|
||||
}];
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -251,6 +283,12 @@ CGFloat const kAnimationDuration = .05;
|
|||
[self invalidateTableConstraintWithHeight:height];
|
||||
}
|
||||
|
||||
- (void)close:(TMWMVoidBlock)completion
|
||||
{
|
||||
[MWMFrameworkListener removeObserver:self];
|
||||
[super close:completion];
|
||||
}
|
||||
|
||||
#pragma mark - UITableViewDelegate
|
||||
|
||||
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
|
||||
|
@ -292,11 +330,10 @@ CGFloat const kAnimationDuration = .05;
|
|||
- (MWMDownloaderDialogHeader *)listHeader
|
||||
{
|
||||
if (!_listHeader)
|
||||
{
|
||||
NSString * title = [NSString stringWithFormat:@"%@ (%@)", L(@"maps"), @(m_countries.size())];
|
||||
NSString * size = self.countriesSize;
|
||||
_listHeader = [MWMDownloaderDialogHeader headerForOwnerAlert:self title:title size:size];
|
||||
}
|
||||
_listHeader = [MWMDownloaderDialogHeader headerForOwnerAlert:self];
|
||||
|
||||
[_listHeader setTitle:[NSString stringWithFormat:@"%@ (%@)", L(@"maps"), @(m_countries.size())]
|
||||
size:self.countriesSize];
|
||||
return _listHeader;
|
||||
}
|
||||
|
||||
|
|
|
@ -6,7 +6,9 @@
|
|||
@property (weak, nonatomic) IBOutlet UIButton * headerButton;
|
||||
@property (weak, nonatomic) IBOutlet UIImageView * expandImage;
|
||||
|
||||
+ (instancetype)headerForOwnerAlert:(MWMDownloadTransitMapAlert *)alert title:(NSString *)title size:(NSString *)size;
|
||||
+ (instancetype)headerForOwnerAlert:(MWMDownloadTransitMapAlert *)alert;
|
||||
- (void)layoutSizeLabel;
|
||||
|
||||
- (void)setTitle:(NSString *)title size:(NSString *)size;
|
||||
|
||||
@end
|
||||
|
|
|
@ -18,11 +18,9 @@ static NSString * const kDownloaderDialogHeaderNibName = @"MWMDownloaderDialogHe
|
|||
|
||||
@implementation MWMDownloaderDialogHeader
|
||||
|
||||
+ (instancetype)headerForOwnerAlert:(MWMDownloadTransitMapAlert *)alert title:(NSString *)title size:(NSString *)size;
|
||||
+ (instancetype)headerForOwnerAlert:(MWMDownloadTransitMapAlert *)alert
|
||||
{
|
||||
MWMDownloaderDialogHeader * header = [[[NSBundle mainBundle] loadNibNamed:kDownloaderDialogHeaderNibName owner:nil options:nil] firstObject];
|
||||
header.title.text = title;
|
||||
header.size.text = size;
|
||||
header.ownerAlert = alert;
|
||||
return header;
|
||||
}
|
||||
|
@ -48,4 +46,10 @@ static NSString * const kDownloaderDialogHeaderNibName = @"MWMDownloaderDialogHe
|
|||
[self layoutIfNeeded];
|
||||
}
|
||||
|
||||
- (void)setTitle:(NSString *)title size:(NSString *)size
|
||||
{
|
||||
self.title.text = title;
|
||||
self.size.text = size;
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -122,10 +122,10 @@
|
|||
<constraint firstItem="dVz-cc-LUM" firstAttribute="centerY" secondItem="FpX-u9-FuR" secondAttribute="centerY" id="yEP-oH-4ti"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<button hidden="YES" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="pLD-sZ-ejH" userLabel="Go" customClass="MWMStartButton">
|
||||
<button hidden="YES" clipsSubviews="YES" contentMode="scaleToFill" horizontalHuggingPriority="501" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="pLD-sZ-ejH" userLabel="Go" customClass="MWMStartButton">
|
||||
<accessibility key="accessibilityConfiguration" identifier="goButton"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="96" id="ZHw-Ha-INX"/>
|
||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="96" id="ZHw-Ha-INX"/>
|
||||
</constraints>
|
||||
<inset key="contentEdgeInsets" minX="8" minY="0.0" maxX="8" maxY="0.0"/>
|
||||
<state key="normal" title="Start"/>
|
||||
|
@ -275,6 +275,9 @@
|
|||
<size key="footerReferenceSize" width="0.0" height="0.0"/>
|
||||
<inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
|
||||
</collectionViewFlowLayout>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="white"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</collectionView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
|
@ -284,6 +287,9 @@
|
|||
<constraint firstAttribute="trailing" secondItem="pUj-hX-AzZ" secondAttribute="trailing" id="pgB-jZ-CDF"/>
|
||||
<constraint firstAttribute="bottom" secondItem="pUj-hX-AzZ" secondAttribute="bottom" id="pt8-Js-FpC"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="white"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
|
@ -324,6 +330,9 @@
|
|||
<constraint firstAttribute="trailing" secondItem="mab-rl-ueg" secondAttribute="trailing" id="w4c-fR-znA"/>
|
||||
<constraint firstItem="nD5-wx-7Ui" firstAttribute="bottom" secondItem="4Xc-Kl-hAm" secondAttribute="bottom" priority="500" id="wq2-oV-MOH"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="white"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<button opaque="NO" contentMode="center" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="YLY-C4-SBu" userLabel="Menu" customClass="MWMButton">
|
||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
|
|
|
@ -110,6 +110,7 @@ using TInfoDisplays = NSHashTable<__kindof TInfoDisplay>;
|
|||
if (IPAD && self.state != MWMNavigationDashboardStateNavigation)
|
||||
[self.delegate routePreviewDidChangeFrame:{}];
|
||||
[[MWMRouter router] stop];
|
||||
self.taxiDataSource = nil;
|
||||
}
|
||||
|
||||
#pragma mark - MWMTaxiDataSource
|
||||
|
|
|
@ -73,6 +73,9 @@
|
|||
<constraint firstItem="TWl-RV-DGe" firstAttribute="top" secondItem="til-vK-WGY" secondAttribute="bottom" constant="4" id="nPU-Y1-NJP"/>
|
||||
</constraints>
|
||||
<size key="customSize" width="251" height="44"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="white"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<outlet property="icon" destination="fMe-7t-K8o" id="Q6r-Xu-ubl"/>
|
||||
<outlet property="price" destination="eYn-L4-OCN" id="fbl-b4-YcH"/>
|
||||
|
|
|
@ -259,7 +259,7 @@
|
|||
</userDefinedRuntimeAttributes>
|
||||
</collectionView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstItem="t6d-gI-JcN" firstAttribute="top" secondItem="xAP-RW-zvp" secondAttribute="top" id="Q7e-1w-LMz"/>
|
||||
<constraint firstItem="t6d-gI-JcN" firstAttribute="leading" secondItem="xAP-RW-zvp" secondAttribute="leading" id="TYJ-1W-jS1"/>
|
||||
|
|
|
@ -11,7 +11,7 @@ NSString * titleForButton(EButton type, BOOL isSelected)
|
|||
return L(@"back");
|
||||
case EButton::Booking:
|
||||
case EButton::Opentable:
|
||||
return L(@"bookingcom_book_button");
|
||||
return L(@"book_button");
|
||||
case EButton::Call:
|
||||
return L(@"placepage_call_button");
|
||||
case EButton::Bookmark:
|
||||
|
|
|
@ -123,15 +123,14 @@ enum RowInMetaInfo
|
|||
else
|
||||
{
|
||||
Framework & f = GetFramework();
|
||||
auto const & bac = self.data.bac;
|
||||
BookmarkCategory * category = f.GetBmCategory(bac.m_categoryIndex);
|
||||
BookmarkCategory * category = f.GetBmCategory(m_cachedBac.m_categoryIndex);
|
||||
if (!category)
|
||||
return;
|
||||
|
||||
{
|
||||
BookmarkCategory::Guard guard(*category);
|
||||
Bookmark * bookmark =
|
||||
static_cast<Bookmark *>(guard.m_controller.GetUserMarkForEdit(bac.m_bookmarkIndex));
|
||||
static_cast<Bookmark *>(guard.m_controller.GetUserMarkForEdit(m_cachedBac.m_bookmarkIndex));
|
||||
if (!bookmark)
|
||||
return;
|
||||
|
||||
|
|
|
@ -24,7 +24,8 @@ NSString * breaksFromClosedTime(TTimespans const & closedTimes)
|
|||
{
|
||||
if (i)
|
||||
[breaks appendString:@"\n"];
|
||||
[breaks appendString:stringFromTimeSpan(closedTimes[i])];
|
||||
[breaks appendString:[NSString stringWithFormat:@"%@ %@", L(@"editor_hours_closed"),
|
||||
stringFromTimeSpan(closedTimes[i])]];
|
||||
}
|
||||
return breaks.copy;
|
||||
}
|
||||
|
|
|
@ -289,6 +289,7 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
|||
auto const & sections = self.data.sections;
|
||||
switch (status)
|
||||
{
|
||||
case NodeStatus::OnDiskOutOfDate:
|
||||
case NodeStatus::Undefined:
|
||||
{
|
||||
self.isPlacePageButtonsEnabled = NO;
|
||||
|
@ -323,7 +324,6 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
|||
break;
|
||||
}
|
||||
case NodeStatus::Partly: break;
|
||||
case NodeStatus::OnDiskOutOfDate:
|
||||
case NodeStatus::OnDisk:
|
||||
{
|
||||
self.isPlacePageButtonsEnabled = YES;
|
||||
|
@ -556,8 +556,11 @@ void animate(TMWMVoidBlock animate, TMWMVoidBlock completion = nil)
|
|||
MWMPlacePageButtonCell * c = [tableView dequeueReusableCellWithIdentifier:kButtonsCells[0]];
|
||||
auto const row = data.buttonsRows[indexPath.row];
|
||||
[c configForRow:row withDelegate:delegate];
|
||||
|
||||
if (row != ButtonsRows::HotelDescription)
|
||||
[c setEnabled:self.isPlacePageButtonsEnabled];
|
||||
else
|
||||
[c setEnabled:YES];
|
||||
|
||||
return c;
|
||||
}
|
||||
|
|
|
@ -466,6 +466,10 @@ using namespace osm_auth_ios;
|
|||
}
|
||||
else
|
||||
{
|
||||
if ([MWMSettings statisticsEnabled])
|
||||
[Alohalytics enable];
|
||||
else
|
||||
[Alohalytics disable];
|
||||
[self incrementSessionsCountAndCheckForAlert];
|
||||
[MapsAppDelegate initPushNotificationsWithLaunchOptions:launchOptions];
|
||||
}
|
||||
|
@ -936,6 +940,7 @@ using namespace osm_auth_ios;
|
|||
|
||||
- (void)firstLaunchSetup
|
||||
{
|
||||
[MWMSettings setStatisticsEnabled:YES];
|
||||
NSString * currentVersion =
|
||||
[[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey];
|
||||
NSUserDefaults * standartDefaults = [NSUserDefaults standardUserDefaults];
|
||||
|
|
|
@ -108,6 +108,8 @@
|
|||
switch (state)
|
||||
{
|
||||
case MWMMigrationViewState::Default:
|
||||
self.primaryButton.hidden = NO;
|
||||
self.secondaryButton.hidden = NO;
|
||||
break;
|
||||
case MWMMigrationViewState::Processing:
|
||||
self.info.hidden = NO;
|
||||
|
@ -121,15 +123,15 @@
|
|||
self.info.hidden = NO;
|
||||
self.info.textColor = [UIColor red];
|
||||
self.info.text = L(@"common_check_internet_connection_dialog");
|
||||
self.primaryButton.enabled = NO;
|
||||
self.secondaryButton.enabled = NO;
|
||||
self.primaryButton.hidden = YES;
|
||||
self.secondaryButton.hidden = YES;
|
||||
break;
|
||||
case MWMMigrationViewState::ErrorNoSpace:
|
||||
self.info.hidden = NO;
|
||||
self.info.textColor = [UIColor red];
|
||||
self.info.text = L(@"migration_no_space_message");
|
||||
self.primaryButton.enabled = NO;
|
||||
self.secondaryButton.enabled = NO;
|
||||
self.primaryButton.hidden = YES;
|
||||
self.secondaryButton.hidden = YES;
|
||||
break;
|
||||
}
|
||||
_state = state;
|
||||
|
|
|
@ -3505,7 +3505,7 @@
|
|||
ORGANIZATIONNAME = MapsWithMe;
|
||||
TargetAttributes = {
|
||||
1D6058900D05DD3D006BFB54 = {
|
||||
DevelopmentTeam = 3T6FSDE8C7;
|
||||
DevelopmentTeam = L2QFT5NA2Q;
|
||||
ProvisioningStyle = Automatic;
|
||||
SystemCapabilities = {
|
||||
com.apple.ApplicationGroups.iOS = {
|
||||
|
@ -4786,7 +4786,7 @@
|
|||
BUNDLE_IDENTIFIER = "com.my.maps-beta-enterprise";
|
||||
CURRENT_PROJECT_VERSION = 6.5.0;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_TEAM = 3T6FSDE8C7;
|
||||
DEVELOPMENT_TEAM = L2QFT5NA2Q;
|
||||
ENABLE_BITCODE = NO;
|
||||
GCC_ENABLE_PASCAL_STRINGS = NO;
|
||||
GCC_INLINES_ARE_PRIVATE_EXTERN = YES;
|
||||
|
|
|
@ -53,7 +53,7 @@
|
|||
<objects>
|
||||
<navigationController automaticallyAdjustsScrollViewInsets="NO" navigationBarHidden="YES" id="Wns-nH-AQU" customClass="MWMNavigationController" sceneMemberID="viewController">
|
||||
<toolbarItems/>
|
||||
<navigationBar key="navigationBar" contentMode="scaleToFill" id="OK2-RC-YDq">
|
||||
<navigationBar key="navigationBar" contentMode="scaleToFill" misplaced="YES" id="OK2-RC-YDq">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</navigationBar>
|
||||
|
@ -1214,7 +1214,7 @@
|
|||
<objects>
|
||||
<navigationController id="Psz-BY-Fy4" customClass="MWMNavigationController" sceneMemberID="viewController">
|
||||
<value key="contentSizeForViewInPopover" type="size" width="600" height="600"/>
|
||||
<navigationBar key="navigationBar" contentMode="scaleToFill" id="SUN-3A-xgM">
|
||||
<navigationBar key="navigationBar" contentMode="scaleToFill" misplaced="YES" id="SUN-3A-xgM">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</navigationBar>
|
||||
|
@ -3032,7 +3032,7 @@
|
|||
</constraints>
|
||||
</view>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Для обновления требуется больше свободного места. Пожалуйста, удалите ненужный контент." textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="400" translatesAutoresizingMaskIntoConstraints="NO" id="9dB-cn-qbb" userLabel="State">
|
||||
<rect key="frame" x="-21.5" y="401" width="363" height="33"/>
|
||||
<rect key="frame" x="12" y="401" width="296" height="33"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" priority="750" constant="400" id="gnK-Ra-PzL"/>
|
||||
</constraints>
|
||||
|
@ -3102,7 +3102,7 @@
|
|||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<accessibility key="accessibilityConfiguration" identifier="ContainerView"/>
|
||||
<constraints>
|
||||
<constraint firstItem="9dB-cn-qbb" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Toe-vk-Vmp" secondAttribute="leading" priority="750" constant="12" id="4Wc-7I-5xu"/>
|
||||
<constraint firstItem="9dB-cn-qbb" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Toe-vk-Vmp" secondAttribute="leading" priority="900" constant="12" id="4Wc-7I-5xu"/>
|
||||
<constraint firstItem="3d5-wL-CHn" firstAttribute="centerX" secondItem="Toe-vk-Vmp" secondAttribute="centerX" id="8Mi-Ib-PsJ"/>
|
||||
<constraint firstItem="OC0-ml-Jn7" firstAttribute="top" secondItem="Toe-vk-Vmp" secondAttribute="top" constant="36" id="G6M-AB-Kp0"/>
|
||||
<constraint firstItem="7bw-ZT-3ea" firstAttribute="top" secondItem="4zz-rI-p8s" secondAttribute="bottom" priority="500" constant="10" id="JGY-SO-Jd5"/>
|
||||
|
@ -3113,7 +3113,7 @@
|
|||
<constraint firstItem="4zz-rI-p8s" firstAttribute="top" secondItem="OC0-ml-Jn7" secondAttribute="bottom" priority="250" constant="80" id="eff-ZO-eVk"/>
|
||||
<constraint firstItem="7bw-ZT-3ea" firstAttribute="centerX" secondItem="Toe-vk-Vmp" secondAttribute="centerX" id="hLc-KL-B8u"/>
|
||||
<constraint firstAttribute="bottom" secondItem="3d5-wL-CHn" secondAttribute="bottom" constant="36" id="jIy-bI-IQK"/>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="9dB-cn-qbb" secondAttribute="trailing" priority="750" constant="12" id="mib-fn-M58"/>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="9dB-cn-qbb" secondAttribute="trailing" priority="900" constant="12" id="mib-fn-M58"/>
|
||||
<constraint firstAttribute="trailing" secondItem="OC0-ml-Jn7" secondAttribute="trailing" constant="16" id="oQ5-fG-W4E"/>
|
||||
<constraint firstItem="4zz-rI-p8s" firstAttribute="top" secondItem="9dB-cn-qbb" secondAttribute="bottom" priority="250" constant="16" id="rHI-IH-sDQ"/>
|
||||
<constraint firstItem="4zz-rI-p8s" firstAttribute="centerX" secondItem="Toe-vk-Vmp" secondAttribute="centerX" id="xcS-f1-5Fn"/>
|
||||
|
|