Merge remote-tracking branch 'origin/master'

This commit is contained in:
Weblate 2018-05-01 16:12:25 +02:00
commit bd3600044e
38 changed files with 435 additions and 209 deletions

View file

@ -200,41 +200,30 @@ td {
overflow: hidden;
}
.nightmode > h1 {
.nightmode > h1, .nightmode > div > h1 {
color: #a3a3a3;
}
.nightmode > h2 {
.nightmode > h2, .nightmode > div > h2 {
color: #cccccc;
border-bottom: 1px solid #2d3133;
font-weight:100;
}
.nightmode > h2 {
color: #cccccc;
border-bottom: 1px solid #2d3133;
}
.nightmode > h3 {
.nightmode > h3, .nightmode > div > h3 {
color: #727272;
}
.nightmode > p {
.nightmode > div > p, .nightmode > p {
color: #cccccc;
}
.nightmode > ul {
.nightmode > ul, .nightmode > div > ul {
color: #cccccc;
}
.nightmode > a {
color: #d28521;
}
.nightmode > a {
color: #d28521;
}
.nightmode > .geo {
.nightmode > .geo, .nightmode > div > .geo, .nightmode > div > ul > .geo, .nightmode > a > .geo {
color: #d28521;
background-color: #222526;
border: 1px solid #2d3133;
@ -248,7 +237,7 @@ td {
display: inline-block;
}
.nightmode > a {
.nightmode > a, .nightmode > div > a, .nightmode > div > ul > a {
color: #d28521;
text-decoration-color: #854f08;
word-wrap: break-word;
@ -278,7 +267,21 @@ td {
}
.nightmode > .nav-bar {
.nightmode > .nav, .bar {
background-color: #222526;
font-size: 1.1em;
font-family: sans-serif;
color: #222526;
word-wrap: break-word;
padding-left: 16px;
padding-right: 16px;
padding-top: 8px;
padding-bottom: 8px;
font-weight: normal;
line-height: 1.6em;
}
.nightmode > .nav-bar, .nightmode > div > .nav-bar, {
background-color: #222526;
font-size: 1.1em;
font-family: sans-serif;

View file

@ -5,8 +5,8 @@
</item>
<item>
<shape>
<stroke android:color="?attr/wikivoyage_active_color" android:width="1dp"/>
<solid android:color="?attr/wikivoyage_card_bg_color"/>
<stroke android:color="@color/wikivoyage_active_dark" android:width="1dp"/>
<solid android:color="@color/wikivoyage_card_bg_dark"/>
<corners android:radius="3dp"/>
</shape>
</item>

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<nine-patch android:src="@drawable/bg_card_shadow_cr3dp"/>
</item>
<item>
<shape>
<stroke android:color="@color/wikivoyage_active_light" android:width="1dp"/>
<solid android:color="@color/wikivoyage_card_bg_light"/>
<corners android:radius="3dp"/>
</shape>
</item>
</layer-list>

View file

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<nine-patch android:src="@drawable/bg_card_shadow_cr3dp"/>
</item>
<item>
<shape>
<solid android:color="?attr/wikivoyage_card_bg_color"/>
<corners android:radius="3dp"/>
</shape>
</item>
</layer-list>

View file

@ -5,7 +5,7 @@
</item>
<item>
<shape>
<solid android:color="?attr/wikivoyage_card_bg_color"/>
<solid android:color="@color/wikivoyage_card_bg_dark"/>
<corners android:radius="3dp"/>
</shape>
</item>

View file

@ -5,7 +5,7 @@
</item>
<item>
<shape>
<solid android:color="?attr/wikivoyage_card_bg_color"/>
<solid android:color="@color/wikivoyage_card_bg_light"/>
<corners android:radius="3dp"/>
</shape>
</item>

View file

@ -5,7 +5,7 @@
<stroke
android:width="1dp"
android:color="?attr/wikivoyage_card_divider_color"/>
android:color="@color/wikivoyage_card_divider_dark"/>
<corners android:radius="3dp"/>

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="1dp"
android:color="@color/wikivoyage_card_divider_light"/>
<corners android:radius="3dp"/>
</shape>

View file

@ -2,7 +2,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="?attr/wikivoyage_active_color"/>
<solid android:color="@color/wikivoyage_active_dark"/>
<corners android:radius="3dp"/>

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/wikivoyage_active_light"/>
<corners android:radius="3dp"/>
</shape>

View file

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
android:shape="rectangle">
<solid android:color="?attr/wikivoyage_secondary_btn_bg_color"/>
<solid android:color="@color/wikivoyage_secondary_btn_bg_dark"/>
<corners android:radius="3dp"/>

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/wikivoyage_secondary_btn_bg_light"/>
<corners android:radius="3dp"/>
</shape>

View file

@ -75,7 +75,7 @@
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/text_margin_small"
android:layout_marginRight="@dimen/text_margin_small"
android:background="@drawable/wikivoyage_search_card_bg">
android:background="?attr/wikivoyage_travel_card_bg">
<LinearLayout
android:id="@+id/search_button"

View file

@ -62,7 +62,7 @@
android:layout_marginEnd="@dimen/bottom_sheet_content_margin_small"
android:layout_marginRight="@dimen/bottom_sheet_content_margin_small"
android:layout_weight="1"
android:background="@drawable/wikivoyage_secondary_btn_bg">
android:background="?attr/wikivoyage_secondary_btn_bg">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/button_no"
@ -88,7 +88,7 @@
android:layout_marginEnd="@dimen/bottom_sheet_content_margin_small"
android:layout_marginRight="@dimen/bottom_sheet_content_margin_small"
android:layout_weight="1"
android:background="@drawable/wikivoyage_secondary_btn_bg">
android:background="?attr/wikivoyage_secondary_btn_bg">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/button_wifi"
@ -112,7 +112,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/wikivoyage_primary_btn_bg">
android:background="?attr/wikivoyage_primary_btn_bg">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/button_yes"

View file

@ -8,7 +8,7 @@
android:layout_marginBottom="@dimen/list_header_padding"
android:layout_marginLeft="@dimen/card_padding"
android:layout_marginRight="@dimen/card_padding"
android:background="@drawable/dialog_active_card_bg"
android:background="?attr/purchase_dialog_active_card_bg"
android:orientation="vertical">
<include layout="@layout/purchase_dialog_card_header"/>

View file

@ -7,7 +7,7 @@
android:layout_marginBottom="@dimen/list_header_padding"
android:layout_marginLeft="@dimen/card_padding"
android:layout_marginRight="@dimen/card_padding"
android:background="@drawable/dialog_card_bg"
android:background="?attr/wikivoyage_travel_card_bg"
android:orientation="vertical">
<include layout="@layout/purchase_dialog_card_header"/>

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/wikivoyage_active_card_bg">
android:background="?attr/wikivoyage_primary_btn_bg">
<LinearLayout
android:id="@+id/card_button"

View file

@ -87,7 +87,7 @@
android:layout_marginLeft="@dimen/card_padding"
android:layout_marginRight="@dimen/card_padding"
android:layout_marginTop="4dp"
android:background="@drawable/wikivoyage_search_card_bg">
android:background="?attr/wikivoyage_travel_card_bg">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/button_later"

View file

@ -7,7 +7,7 @@
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/text_margin_small"
android:layout_marginRight="@dimen/text_margin_small"
android:background="@drawable/travel_card_bg"
android:background="?attr/wikivoyage_travel_card_bg"
android:orientation="vertical">
<LinearLayout
@ -64,7 +64,7 @@
android:layout_marginBottom="@dimen/content_padding"
android:layout_marginLeft="@dimen/bottom_sheet_content_margin_small"
android:layout_marginRight="@dimen/bottom_sheet_content_margin_small"
android:background="@drawable/travel_card_stroke_bg"
android:background="?attr/wikivoyage_travel_card_stroke_bg"
android:minHeight="@dimen/bottom_sheet_selected_item_title_height"
android:paddingLeft="@dimen/content_padding"
android:paddingRight="@dimen/content_padding">
@ -135,7 +135,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/wikivoyage_secondary_btn_bg">
android:background="?attr/wikivoyage_secondary_btn_bg">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/secondary_button"
@ -165,7 +165,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/wikivoyage_primary_btn_bg">
android:background="?attr/wikivoyage_primary_btn_bg">
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/primary_button"

View file

@ -8,7 +8,7 @@
android:layout_marginTop="@dimen/content_padding_small"
android:layout_marginLeft="@dimen/text_margin_small"
android:layout_marginRight="@dimen/text_margin_small"
android:background="@drawable/travel_card_bg"
android:background="?attr/wikivoyage_travel_card_bg"
android:orientation="vertical">
<LinearLayout

View file

@ -8,7 +8,7 @@
android:layout_marginTop="@dimen/content_padding_small"
android:layout_marginLeft="@dimen/text_margin_small"
android:layout_marginRight="@dimen/text_margin_small"
android:background="@drawable/travel_card_bg">
android:background="?attr/wikivoyage_travel_card_bg">
<LinearLayout
android:layout_width="match_parent"

View file

@ -1916,7 +1916,7 @@
<string name="mark_to_delete">Отметить для удаления</string>
<string name="welcome_text">OsmAnd обеспечивает глобальный автономный просмотр карт и автономную навигацию.</string>
<string name="osm_changes_added_to_local_edits">OSM изменения добавлены в локальную базу данных</string>
<string name="confirm_usage_speed_cameras">Во многих странах (Германия, Франция, Италия и другие) использование предупреждения о камерах контроля скорости не допускается законом. Osmand не несет никакой ответственности, если Вы нарушите закон. Пожалуйста, нажмите \" Да \" только если вы имеете право использовать эту функцию.</string>
<string name="confirm_usage_speed_cameras">Во многих странах (Германия, Франция, Италия и другие) использование предупреждения о камерах контроля скорости не допускается законом. OsmAnd не несет никакой ответственности, если Вы нарушите закон. Пожалуйста, нажмите \" Да \" только если вы имеете право использовать эту функцию.</string>
<string name="agps_info">Информация A-GPS</string>
<string name="agps_data_last_downloaded">Последние загруженные данные A-GPS от: %1$s</string>
<string name="shared_string_message">Сообщение</string>
@ -2567,7 +2567,7 @@
<string name="of">%1$d из %2$d</string>
<string name="shared_string_list">Список</string>
<string name="shared_string_groups">Группы</string>
<string name="passed">Последнее использование: %1$s</string>
<string name="passed">Использовано: %1$s</string>
<string name="make_active">Сделать активным</string>
<string name="today">Сегодня</string>
<string name="yesterday">Вчера</string>
@ -2641,7 +2641,7 @@
<string name="shared_string_road">Дорога</string>
<string name="show_guide_line">Показывать направляющие линии</string>
<string name="rendering_value_darkyellow_name">Темно-желтый</string>
<string name="osmand_extended_description_part8">Osmand это активно развивающийся проект с открытым исходным кодом. Благодаря открытости каждый может внести свой вклад в приложение сообщая об ошибках, улучшая перевод или кодируя новые функции. Проект находится в оживленном состоянии непрерывного совершенствования всеми этими формами взаимодействия разработчиков и пользователей. Прогресс проекта также зависит от денежных взносов для финансирования написания и тестирования новых функций.
<string name="osmand_extended_description_part8">OsmAnd это активно развивающийся проект с открытым исходным кодом. Благодаря открытости каждый может внести свой вклад в приложение сообщая об ошибках, улучшая перевод или кодируя новые функции. Проект находится в оживленном состоянии непрерывного совершенствования всеми этими формами взаимодействия разработчиков и пользователей. Прогресс проекта также зависит от денежных взносов для финансирования написания и тестирования новых функций.
\n Примерная карта покрытия и качество:
\n • Западная Европа: ****
\n • Восточная Европа: ***
@ -2950,15 +2950,15 @@
<string name="download_maps_travel">Карты путешествий</string>
<string name="shared_string_wikivoyage">Викигид</string>
<string name="article_removed">Статья удалена</string>
<string name="shared_string_explore">Обозреватель</string>
<string name="shared_string_explore">Исследовать</string>
<string name="index_item_world_wikivoyage">Статьи путеводителя Викигида</string>
<string name="images_cache">"Кэш изображений "</string>
<string name="delete_search_history">"Удалить историю поиска "</string>
<string name="show_images">Показать изображения</string>
<string name="shared_string_only_with_wifi">Только по WiFi</string>
<string name="wikivoyage_download_pics">Скачать изображения</string>
<string name="wikivoyage_download_pics">Показывать изображения</string>
<string name="wikivoyage_download_pics_descr">Изображения из статей можно загрузить для использования в автономном режиме.
\nВы всегда можете изменить настройку в \"Обозреватель\" → \"Параметры\".</string>
\nВы всегда можете изменить настройку в \"Исследовать\" → \"Параметры\".</string>
<string name="shared_string_wifi_only">Только WiFi</string>
<string name="select_travel_book">Выберите дневник путешествий</string>
<string name="shared_string_travel_book">Дневник путешествий</string>
@ -2985,7 +2985,7 @@
<string name="daily_map_updates">Обновления карт: <b>ежечасные</b></string>
<string name="in_app_purchase_desc_ex">После покупки этот план станет доступен для вас навсегда.</string>
<string name="travel_guide">"Путеводитель "</string>
<string name="travel_guide_description">Просматривайте путеводители Викигида по самым интересным местам на планете внутри Osmand без подключения к интернету.</string>
<string name="travel_guide_description">Просматривайте путеводители Викигида по самым интересным местам на планете внутри OsmAnd без подключения к интернету.</string>
<string name="travel_card_update_descr">Мы подготовили обновления и исправления в данных Викигида, обновите файл, чтобы увидеть их.</string>
<string name="travel_card_download_descr">Скачайте этот файл путеводителей Викигида для просмотра статей о местах по всему миру без подключения к Интернету.</string>
<string name="update_is_available">Доступно обновление</string>

View file

@ -81,6 +81,13 @@
<attr name="wikivoyage_primary_btn_text_color" format="reference"/>
<attr name="wikivoyage_welcome_bg_color" format="reference"/>
<attr name="wikivoyage_primary_text_color" format="reference"/>
<attr name="wikivoyage_travel_card_bg" format="reference"/>
<attr name="wikivoyage_travel_card_stroke_bg" format="reference"/>
<attr name="wikivoyage_secondary_btn_bg" format="reference"/>
<attr name="wikivoyage_primary_btn_bg" format="reference"/>
<attr name="purchase_dialog_active_card_bg" format="reference"/>
</declare-styleable>
<declare-styleable name="PagerSlidingTabStrip">

View file

@ -13,18 +13,18 @@
<string name="popular_destinations">Popular destinations</string>
<string name="paid_app">Paid app</string>
<string name="paid_plugin">Paid plugin</string>
<string name="travel_card_update_descr">We prepared updates and fixes in the Wikivoyage data, update the file to see them.</string>
<string name="travel_card_download_descr">Download this Wikivoyage travel guides file to view articles about places around the world without an internet connection.</string>
<string name="update_is_available">Update is available</string>
<string name="travel_card_update_descr">New Wikivoyage data available, update it to enjoy.</string>
<string name="travel_card_download_descr">Download these Wikivoyage travel guides to view articles about places around the world without a connection to the Internet.</string>
<string name="update_is_available">Update available</string>
<string name="download_file">Download file</string>
<string name="start_editing_card_image_text">The free worldwide travel guide that anyone can edit.</string>
<string name="welcome_to_open_beta_description">Travel is based on Wikivoyage. During open beta testing you have the opportunity to evaluate all the features for free. After the end of the beta period, Travel will be available to subscribers of OsmAnd Unlimited and the owners of OsmAnd+</string>
<string name="start_editing_card_description">You can edit any article on Wikivoyage, and we hope that you do. We need your knowledge, your experience, your talent, and your attention</string>
<string name="start_editing_card_image_text">The free worldwide travel guide anyone can edit.</string>
<string name="welcome_to_open_beta_description">Travel is based on Wikivoyage. Test all features during open beta testing, for free. Afterwards, Travel will be available to subscribers of OsmAnd Unlimited and owners of OsmAnd+</string>
<string name="start_editing_card_description">You can and should edit any article on Wikivoyage. Share knowledge, experience, talent, and your attention</string>
<string name="start_editing">Start editing</string>
<string name="get_unlimited_access">Get unlimited access</string>
<string name="welcome_to_open_beta">Welcome, to the open beta!</string>
<string name="travel_guide">Travel Guide</string>
<string name="travel_guide_description">Browse the Wikivoyage guides to the most interesting places on the planet inside OsmAnd without an internet connection.</string>
<string name="welcome_to_open_beta">Welcome to the open beta</string>
<string name="travel_guide">Wikivoyage Travel Guide</string>
<string name="travel_guide_description">Guides to the most interesting places on the planet, inside OsmAnd, without a connection to the Internet.</string>
<string name="monthly_map_updates">Map updates: <b>Every month</b></string>
<string name="daily_map_updates">Map updates: <b>Every hour</b></string>
<string name="in_app_purchase">In-app purchase</string>
@ -69,7 +69,7 @@
<string name="shared_string_travel">Travel</string>
<string name="waypoints_removed_from_map_markers">Waypoints removed from map markers</string>
<string name="nothing_found_in_radius">Could not find anything:</string>
<string name="select_waypoints_category_description">You can add all of the track\'s waypoints, or select separate categories.</string>
<string name="select_waypoints_category_description">Add all of the track\'s waypoints, or select separate categories.</string>
<string name="shared_string_total">Total</string>
<string name="clear_all_intermediates">Clear all intermediate points</string>
<string name="group_deleted">Group deleted</string>
@ -154,11 +154,11 @@
<string name="track_waypoints">Track waypoints</string>
<string name="favourites_group">Favorites category</string>
<string name="add_group">Add a group</string>
<string name="add_group_descr">You can import groups from favorites or track waypoints.</string>
<string name="add_group_descr">Import groups from favorites or track waypoints.</string>
<string name="empty_state_markers_active">Create map markers!</string>
<string name="empty_state_markers_active_desc">Long or short tap \'Places\', then tap the marker flag button.</string>
<string name="empty_state_markers_groups">Import groups</string>
<string name="empty_state_markers_groups_desc">You can import favorite groups or track waypoints as markers.</string>
<string name="empty_state_markers_groups_desc">Import favorite groups or track waypoints as markers.</string>
<string name="empty_state_markers_history">@string/shared_string_history</string>
<string name="empty_state_markers_history_desc">Markers marked as passed will appear on this screen.</string>
<string name="shared_string_two">Two</string>
@ -194,7 +194,7 @@
<string name="route_is_calculated">Route calculated</string>
<string name="round_trip">Round trip</string>
<string name="plan_route_no_markers_toast">You must add at least one marker to use this function.</string>
<string name="osn_modify_dialog_error">Exception occurred: The note was not modified</string>
<string name="osn_modify_dialog_error">Could not modify note</string>
<string name="osn_modify_dialog_title">Modify note</string>
<string name="context_menu_item_modify_note">Modify OSM note</string>
<string name="make_round_trip_descr">Add copy of starting point as destination.</string>
@ -260,7 +260,7 @@
<string name="add_point_after">Add point after</string>
<string name="shared_string_options">Options</string>
<string name="measurement_tool_snap_to_road_descr">OsmAnd will connect the points with routes for the selected profile.</string>
<string name="measurement_tool_save_as_new_track_descr">You can save the points either as route points or as a line.</string>
<string name="measurement_tool_save_as_new_track_descr">Save the points either as route points or as a line.</string>
<string name="choose_navigation_type">Select navigation profile</string>
<string name="none_point_error">Please add at least one point.</string>
<string name="enter_gpx_name">GPX file name:</string>
@ -286,7 +286,7 @@
<string name="mapillary_menu_edit_text_hint">Type username</string>
<string name="mapillary_menu_descr_username">View only images added by</string>
<string name="mapillary_menu_title_username">Username</string>
<string name="mapillary_menu_filter_description">You can filter images by submitter or by date. Filters only apply for closeup zoom.</string>
<string name="mapillary_menu_filter_description">Filter images by submitter or by date. Only active in closeup zoom.</string>
<string name="map_widget_ruler_control">Radius ruler</string>
<string name="shared_string_permissions">Permissions</string>
<string name="import_gpx_failed_descr">OsmAnd cannot import the file. Please check if OsmAnd has permission to read file from its location.</string>
@ -372,7 +372,7 @@
<string name="driving_region_automatic">Automatic</string>
<string name="do_not_send_anonymous_app_usage">Don\'t send anonymous app usage statistics</string>
<string name="do_not_send_anonymous_app_usage_desc">OsmAnd collects info about which parts of the app you open. Your location is never sent, nor is anything you enter into the app or details of areas you view, search, or download.</string>
<string name="do_not_show_startup_messages">Don\'t show messages at startup</string>
<string name="do_not_show_startup_messages">Don\'t show startup messages</string>
<string name="do_not_show_startup_messages_desc">Don\'t show app discounts &amp; special local event messages.</string>
<string name="parking_options">Parking options</string>
<string name="full_version_thanks">Thank you for purchasing the paid version of OsmAnd.</string>
@ -390,7 +390,7 @@
<string name="route_points_category_name">Turns to pass on this route</string>
<string name="track_points_category_name">Prominent points on this route</string>
<string name="gpx_track">Track</string>
<string name="max_speed">Max speed</string>
<string name="max_speed">Maximum speed</string>
<string name="average_speed">Average speed</string>
<string name="shared_string_time_moving">Time moving</string>
<string name="shared_string_time_span">Time span</string>
@ -467,7 +467,7 @@
<string name="show_legacy_search_desc">Add the legacy search to the drawer list.</string>
<string name="routing_attr_allow_motorway_name">Allow motorways</string>
<string name="routing_attr_allow_motorway_description">Allow motorways.</string>
<string name="upload_osm_note_description">You can upload your OSM Note anonymously or by using your OpenStreetMap.org profile.</string>
<string name="upload_osm_note_description">Upload your OSM Note anonymously or by using your OpenStreetMap.org profile.</string>
<string name="wiki_around">Nearby Wikipedia articles</string>
<string name="search_map_hint">Search city or region</string>
<string name="route_roundabout_short">Take %1$d exit and go</string>
@ -500,7 +500,7 @@
<string name="save_track_min_speed">Logging minimum speed</string>
<string name="save_track_min_speed_descr">Filter: No logging of points below this speed.</string>
<string name="save_track_min_distance">Logging minimum displacement</string>
<string name="save_track_min_distance_descr">Filter: Set minimum distance a point to log a new one.</string>
<string name="save_track_min_distance_descr">Filter: Set minimum distance from a point to log a new one.</string>
<string name="save_track_precision">Logging minimum accuracy</string>
<string name="save_track_precision_descr">Filter: No logging unless this accuracy is reached.</string>
<string name="christmas_poi">Christmas POI</string>
@ -719,7 +719,7 @@
<string name="data_is_not_available">Data not available</string>
<string name="shared_string_remove">Remove</string>
<string name="shared_string_read_more">Read more</string>
<string name="clear_updates_proposition_message">"You can remove downloaded updates and get back to the original map edition"</string>
<string name="clear_updates_proposition_message">"Remove downloaded updates and get back to the original map edition"</string>
<string name="add_time_span">Add time span</string>
<string name="road_blocked">Road blocked</string>
<string name="shared_string_select">Select</string>
@ -792,13 +792,13 @@
<string name="osn_reopen_dialog_title">Reopen note</string>
<string name="osn_close_dialog_title">Close note</string>
<string name="osn_add_dialog_success">Note created</string>
<string name="osn_add_dialog_error">Exception occurred: Note was not created</string>
<string name="osn_add_dialog_error">Could not create note</string>
<string name="osn_close_dialog_success">Note closed</string>
<string name="osn_close_dialog_error">Exception occurred: Note not closed</string>
<string name="osn_close_dialog_error">Could not close note</string>
<string name="osb_author_dialog_password">OSM password (optional)</string>
<string name="osb_comment_dialog_message">Message</string>
<string name="osb_comment_dialog_author">Author name</string>
<string name="osb_comment_dialog_error">Exception occurred: Comment not added</string>
<string name="osb_comment_dialog_error">Could not add comment</string>
<string name="osb_comment_dialog_success">Comment added</string>
<string name="shared_string_commit">Commit</string>
<string name="context_menu_item_delete_waypoint">Delete GPX waypoint?</string>
@ -818,7 +818,7 @@
<string name="world_map_download_descr">World basemap (covering the whole world at low zoom level) missing or outdated. Please consider downloading it for a global overview.</string>
<string name="shared_string_qr_code">QR code</string>
<string name="map_downloaded">Map downloaded</string>
<string name="map_downloaded_descr">You can now use the downloaded %1$s map.</string>
<string name="map_downloaded_descr">The %1$s map is ready for use.</string>
<string name="go_to_map">Show map</string>
<string name="simulate_initial_startup_descr">"Sets the flag indicating first app startup, keeps all other settings unchanged."</string>
<string name="simulate_initial_startup">Simulate first app start</string>
@ -1049,7 +1049,7 @@
<string name="shared_string_more">More…</string>
<string name="shared_string_more_actions">More actions</string>
<string name="shared_string_do_not_show_again">Do not show again</string>
<string name="shared_string_remember_my_choice">Remember my choice</string>
<string name="shared_string_remember_my_choice">Remember choice</string>
<string name="shared_string_refresh">Refresh</string>
<string name="shared_string_download">Download</string>
<string name="shared_string_downloading">Downloading</string>
@ -1072,7 +1072,7 @@
<string name="shared_string_my_location">My Position</string>
<string name="shared_string_my_places">My Places</string>
<string name="shared_string_my_favorites">Favorites</string>
<string name="shared_string_my_tracks">My Tracks</string>
<string name="shared_string_my_tracks">Tracks</string>
<string name="shared_string_currently_recording_track">Currently recording track</string>
<string name="shared_string_audio">Audio</string>
<string name="shared_string_video">Video</string>
@ -1155,7 +1155,7 @@
<string name="settings_privacy">Privacy</string>
<string name="points">Points</string>
<string name="navigation_over_track">Start navigation along track?</string>
<string name="avoid_roads_msg">You can trigger an alternative route by selecting roads to avoid</string>
<string name="avoid_roads_msg">Trigger an alternative route by selecting roads to avoid</string>
<string name="speak_pedestrian">Pedestrian crosswalks</string>
<string name="rendering_attr_roadStyle_name">Road style</string>
<string name="rendering_attr_roadStyle_description">Road style</string>
@ -1236,7 +1236,7 @@
<string name="traffic_warning_calming">Traffic calming</string>
<string name="traffic_warning_speed_camera">Speed camera</string>
<string name="traffic_warning">Traffic warning</string>
<string name="speak_favorites">Nearby Favorites</string>
<string name="speak_favorites">Nearby favorites</string>
<string name="speak_poi">Nearby POI</string>
<string name="way_alarms">Traffic warnings</string>
<string name="background_service_is_enabled_question">OsmAnd background service still running. Stop it, too?</string>
@ -1407,7 +1407,7 @@
<string name="lang_lv">Latvian</string>
<string name="lang_lt">Lithuanian</string>
<string name="lang_mr">Marathi</string>
<string name="lang_no">Norwegian</string>
<string name="lang_no">Norwegian Bokmål</string>
<string name="lang_fa">Persian</string>
<string name="lang_pl">Polish</string>
<string name="lang_pt">Portuguese</string>
@ -1439,21 +1439,21 @@
<string name="route_preferences">Route preferences</string>
<string name="route_info">Route info</string>
<string name="routing_attr_prefer_motorway_name">Prefer motorways</string>
<string name="routing_attr_prefer_motorway_description">Prefer motorways.</string>
<string name="routing_attr_prefer_motorway_description">Prefer motorways</string>
<string name="routing_attr_avoid_toll_name">Avoid toll roads</string>
<string name="routing_attr_avoid_toll_description">Avoid toll roads.</string>
<string name="routing_attr_avoid_toll_description">Avoid toll roads</string>
<string name="routing_attr_avoid_unpaved_name">Avoid unpaved roads</string>
<string name="routing_attr_avoid_unpaved_description">Avoid unpaved roads.</string>
<string name="routing_attr_avoid_ferries_name">Avoid ferries</string>
<string name="routing_attr_avoid_ferries_description">Avoid ferries.</string>
<string name="routing_attr_avoid_ferries_description">Avoid ferries</string>
<string name="routing_attr_avoid_motorway_name">Avoid motorways</string>
<string name="routing_attr_avoid_motorway_description">Avoid motorways.</string>
<string name="routing_attr_avoid_motorway_description">Avoid motorways</string>
<string name="routing_attr_avoid_stairs_name">Avoid stairs</string>
<string name="routing_attr_avoid_stairs_description">Avoid stairs.</string>
<string name="routing_attr_avoid_stairs_description">Avoid stairs</string>
<string name="routing_attr_avoid_borders_name">Avoid border crossing</string>
<string name="routing_attr_avoid_borders_description">Avoid crossing a border into another country.</string>
<string name="routing_attr_avoid_borders_description">Avoid crossing national borders</string>
<string name="routing_attr_weight_name">Weight limit</string>
<string name="routing_attr_weight_description">Specify vehicle weight to be permitted on routes.</string>
<string name="routing_attr_weight_description">Specify permitted vehicle weight limit on routes.</string>
<string name="routing_attr_height_name">Height limit</string>
<string name="routing_attr_height_description">Specify vehicle height to be permitted on routes.</string>
<string name="android_19_location_disabled">Since Android version 4.4 (KitKat) you cannot download and update maps to the old storage folder (%s). Copy all OsmAnd files to new storage location?
@ -1481,7 +1481,7 @@
<string name="app_mode_aircraft">Aircraft</string>
<string name="local_osm_changes_delete_all_confirm">You are going to delete %1$d OSM changes. Are you sure?</string>
<string name="animate_routing_route_not_calculated">Please calculate the route first</string>
<string name="animate_routing_route">Simulate using calculated route </string>
<string name="animate_routing_route">Simulate using calculated route</string>
<string name="animate_routing_gpx">Simulate using GPX track</string>
<string name="route_is_too_long_v2">Please add intermediate destinations if no path is found for this long route within 10 mins.</string>
<string name="auto_zoom_none">No auto zoom</string>
@ -1501,9 +1501,9 @@
<string name="local_index_tile_data_name">Tile data: %1$s</string>
<string name="edit_tilesource_successfully">Tilesource %1$s was saved</string>
<string name="edit_tilesource_elliptic_tile">Elliptic mercator</string>
<string name="edit_tilesource_maxzoom">Max zoom</string>
<string name="edit_tilesource_maxzoom">Maximum zoom</string>
<string name="edit_tilesource_expiration_time">Expire (minutes)</string>
<string name="edit_tilesource_minzoom">Min zoom</string>
<string name="edit_tilesource_minzoom">Minimum zoom</string>
<string name="edit_tilesource_url_to_load">URL</string>
<string name="edit_tilesource_choose_existing">Choose existing…</string>
<string name="maps_define_edit">Define/Edit…</string>
@ -1545,8 +1545,8 @@
<string name="intermediate_items_sort_return">Optimized order of intermediate destinations en-route to the destination.</string>
<string name="intermediate_items_sort_by_distance">Sort door-to-door</string>
<string name="local_osm_changes_backup_successful">OSM change file was generated %1$s</string>
<string name="local_osm_changes_backup_failed">Backup OSM changes failed</string>
<string name="local_osm_changes_backup">Backup as OSM change</string>
<string name="local_osm_changes_backup_failed">Could not back up OSM changes</string>
<string name="local_osm_changes_backup">Back up as OSM change</string>
<string name="delete_point">Delete Point</string>
<string name="plugin_distance_point_time">time</string>
<string name="plugin_distance_point_hdop">accuracy</string>
@ -1563,7 +1563,7 @@
<string name="distance_measurement_finish_editing">Finish editing</string>
<string name="distance_measurement_finish_subtrack">Begin a new subtrack</string>
<string name="distance_measurement_clear_route">Clear all points</string>
<string name="distance_measurement_load_gpx">Open existing GPX</string>
<string name="distance_measurement_load_gpx">Open existing GPX track</string>
<string name="wait_current_task_finished">Please wait until current task is finished</string>
<string name="use_kalman_filter_compass_descr">Reduces noise in compass readings but adds inertia.</string>
<string name="use_kalman_filter_compass">Use Kalman filter</string>
@ -1579,9 +1579,9 @@
<string name="download_using_mobile_internet">Not connected to Wi-Fi. Use current connection to the Internet to download?</string>
<string name="street_name">Street name</string>
<string name="hno">House number</string>
<string name="website">Web site</string>
<string name="website">Website</string>
<string name="phone">Phone</string>
<string name="osmand_background_plugin_description">Shows settings for turning on tracking and navigation in background mode by periodically waking up the GPS device (with the screen off).</string>
<string name="osmand_background_plugin_description">Shows settings for turning on background tracking and navigation by periodically waking up the GPS device (with the screen off).</string>
<string name="contribution_activity">Install version</string>
<string name="choose_osmand_theme_descr">Choose how the app looks.</string>
<string name="choose_osmand_theme">App theme</string>
@ -1622,15 +1622,15 @@
<string name="av_widget_action">Default widget action</string>
<string name="av_video_format_descr">Select the video output format.</string>
<string name="av_video_format">Video output format</string>
<string name="av_use_external_recorder_descr">Use the system recorder for video.</string>
<string name="av_use_external_recorder_descr">Use system recorder for video.</string>
<string name="av_use_external_recorder">Use system recorder</string>
<string name="av_use_external_camera_descr">Use the system app for photos.</string>
<string name="av_use_external_camera">Use camera app</string>
<string name="av_settings_descr">Configure audio and video settings.</string>
<string name="av_settings">Audio/video settings </string>
<string name="recording_error">Error occurred while recording </string>
<string name="recording_camera_not_available">Camera is not available</string>
<string name="recording_is_recorded">Audio/video is being recorded. To stop it tap the AV widget.</string>
<string name="av_settings">Audio/video settings</string>
<string name="recording_error">Recording failed</string>
<string name="recording_camera_not_available">Camera not available</string>
<string name="recording_is_recorded">Recording Audio/video. Stop by tapping the AV widget.</string>
<string name="recording_playing">An audio from the specified recording is being played.\n%1$s</string>
<string name="recording_open_external_player">Open external player</string>
<string name="recording_delete_confirm">Delete this recording?</string>
@ -1752,22 +1752,22 @@
</string>
<string name="osmand_extended_description_part2">
GPS navigation\n
You can choose between offline (no roaming charges when you are abroad) or online (faster) mode\n
Choose between offline (no roaming charges when you are abroad) or online (faster) mode\n
• Turn-by-turn voice guidance leads you along the way (recorded and synthesized voices)\n
• The route gets rebuilt whenever you deviate from it\n
• Lane guidance, street names, and estimated time of arrival will help along the way\n
• To make your trip safer, day/night mode switches automatically\n
You can choose to show speed limits, and get reminders if you exceed it\n
Show speed limits, and get reminders if you exceed it\n
• Map zoom adjusts to your speed\n
You can search for destinations by address, type (e.g: parking, restaurant, hotel, gas station, museum), or geographical coordinates\n
Search for destinations by address, type (e.g: Parking, restaurant, hotel, gas station, museum), or geographical coordinates\n
• Supports intermediate points on your itinerary\n
You can record your own or upload a GPX track and follow it\n
Record your own or upload a GPX track and follow it\n
</string>
<string name="osmand_extended_description_part3">
Map\n
• Displays POIs (point of interests) around you\n
• Adjusts the map to your direction of motion (or compass)\n
• Shows where you are and where you are looking at\n
• Shows your location and the direction you are looking in\n
• Share your location so that your friends can find you\n
• Keeps your most important places in \'Favorites\'\n
• Allows you to choose how to display names on the map: In English, local, or phonetic spelling\n
@ -1779,9 +1779,9 @@
</string>
<string name="osmand_extended_description_part5">
Cycling\n
You can find cycling paths on the map\n
Find cycling paths on the map\n
• GPS navigation in cycling mode builds your route using cycling paths\n
You can see your speed and altitude\n
See your speed and altitude\n
• GPX recording option enables you to record your trip and share it\n
• Via an additional plugin you can enable contour lines and hillshading
</string>
@ -1791,7 +1791,7 @@
• Wikipedia in your preferred language can tell you a lot during a city tour\n
• Public transport stops (bus, tram, train), including line names, help to navigate in a new city\n
• GPS navigation in pedestrian mode builds your route using walking paths\n
You can upload and follow a GPX route or record and share your own\n
Upload and follow a GPX route or record and share your own\n
</string>
<string name="osmand_extended_description_part7">
Contribute to OSM\n
@ -1800,7 +1800,7 @@
• Add POIs and directly upload them to OSM (or later if offline)\n
</string>
<string name="osmand_extended_description_part8">
OsmAnd is open-source and actively being developed. Everyone can contribute to the app by reporting bugs, improving translations or coding new features. The project is in a lively state of continuous improvement by all these forms of developer and user interaction. The project progress also relies on financial contributions to fund coding and testing of new functionalities.\n
OsmAnd is actively developed open source software. Everyone can contribute to the app by reporting bugs, improving translations or coding new features. Additionally the project relies on financial contributions to fund coding and testing of new functionalities.\n
Approximate map coverage and quality:\n
• Western Europe: ****\n
• Eastern Europe: ***\n
@ -1853,7 +1853,7 @@
• Optional lane guidance, street name display, and estimated time of arrival\n
• Supports intermediate points on your itinerary\n
• Automatic re-routing whenever you deviate from the route\n
• Search for places by address, by type (e.g: restaurant, hotel, gas station, museum), or by geographical coordinates\n
• Search for places by address, by type (e.g: Restaurant, hotel, gas station, museum), or by geographical coordinates\n
</string>
<string name="osmand_plus_extended_description_part3">
Map Viewing\n
@ -1891,12 +1891,12 @@
• Display of contour lines and hillshading (via additional plugin)
</string>
<string name="osmand_plus_extended_description_part7">
Directly Contribute to OSM\n
Contribute directly to OSM\n
• Report data bugs\n
• Upload GPX tracks to OSM directly from the app\n
• Add POIs and directly upload them to OSM (or later if offline)\n
• Optional trip recording also in background mode (while device is in sleep mode)\n
OsmAnd is open-source software in active development. Everyone can contribute to the app by reporting bugs, improving translations or coding new features or user interaction. The project progress also relies on financial contributions for coding and testing new functionality.
OsmAnd is actively developed open source software. Everyone can contribute to the app by reporting bugs, improving translations or coding new features. Additionally the project relies on financial contributions to fund coding and testing of new functionalities.\n
</string>
<string name="osmand_plus_extended_description_part8">
Approximate map coverage and quality:\n
@ -2016,10 +2016,10 @@
<string name="transport_search_desc">Public transport search</string>
<string name="favourites_search_desc">A way to search for favorites</string>
<string name="offline_navigation_not_available">OsmAnd offline navigation is temporarily not available.</string>
<string name="left_side_navigation">Left-hand driving</string>
<string name="left_side_navigation_descr">Select for countries with left-hand traffic.</string>
<string name="left_side_navigation">Left-hand traffic</string>
<string name="left_side_navigation_descr">For countries where people drive on the left side of the road.</string>
<string name="local_index_description">Tap any existing item to see more details, long-tap to deactivate or delete. Current data on device (%1$s free):</string>
<string name="unknown_from_location">Starting point is not yet determined</string>
<string name="unknown_from_location">Starting point not yet determined</string>
<string name="unknown_location">Position not yet known</string>
<string name="modify_transparency">Modify transparency (0 - transparent, 255 - opaque)</string>
<string name="confirm_interrupt_download">Cancel file download?</string>
@ -2039,7 +2039,7 @@
<string name="play_commands_of_currently_selected_voice">Select a voice and test by playing prompts</string>
<string name="native_rendering">Native rendering</string>
<string name="test_voice_prompts">Test voice prompts</string>
<string name="switch_to_raster_map_to_see">No offline vector map present for this location. You can download one in \'Settings\' (\'Manage map files\'), or switch to the \'Online maps\' plugin.</string>
<string name="switch_to_raster_map_to_see">No offline vector map present for this location. Download one in \'Settings\' (\'Manage map files\'), or switch to the \'Online maps\' plugin.</string>
<string name="send_files_to_osm">Send GPX files to OSM?</string>
<string name="gpx_visibility_txt">Visibility</string>
<string name="gpx_tags_txt">Tags</string>
@ -2159,7 +2159,7 @@
<string name="open_street_map_login_descr">Needed for openstreetmap.org submissions.</string>
<string name="user_password">Your OSM password</string>
<string name="osmand_service">Background mode</string>
<string name="osmand_service_descr">OsmAnd keeps running in the background while the screen is off.</string>
<string name="osmand_service_descr">OsmAnd runs in the background with the screen off.</string>
<string name="download_files_not_enough_space">There is not enough free space to download %1$s MB (free: %2$s).</string>
<string name="use_transparent_map_theme">Transparent theme</string>
<string name="native_library_not_supported">Native library not supported on this device.</string>
@ -2265,7 +2265,7 @@
<string name="voice_stream_voice_call">Phone call audio (also to interrupt car BT stereos)</string>
<string name="voice_stream_notification">Notification audio</string>
<string name="voice_stream_music">Media/music audio</string>
<string name="warning_tile_layer_not_downloadable">The app cannot download map layer %1$s, please try to reinstall it.</string>
<string name="warning_tile_layer_not_downloadable">The app cannot download the map layer %1$s, reinstalling it might help.</string>
<string name="overlay_transparency_descr">Modify the overlay transparency.</string>
<string name="overlay_transparency">Overlay transparency</string>
<string name="map_transparency_descr">Modify the base map transparency.</string>
@ -2281,16 +2281,16 @@
<string name="internet_not_available">Unable to perform operation without a connection to the Internet.</string>
<string name="install_more">Install more…</string>
<string name="level_to_switch_vector_raster_descr">Use raster maps for anything beyond this level.</string>
<string name="level_to_switch_vector_raster">Min. vector zoom level</string>
<string name="level_to_switch_vector_raster">Minimum vector zoom level</string>
<string name="create_poi_link_to_osm_doc"><u>Online OSM</u> map classification with images.</string>
<string name="error_doing_search">Error in offline search.</string>
<string name="error_doing_search">Could not perform offline search.</string>
<string name="search_offline_geo_error">Could not parse geo intent \'%s\'.</string>
<string name="search_osm_offline">Search geo location</string>
<string name="search_osm_offline">Search by geo location</string>
<string name="system_locale">System</string>
<string name="preferred_locale_descr">Select display language (please restart OsmAnd after changing).</string>
<string name="preferred_locale_descr">Select display language (takes effect when OsmAnd is restarted).</string>
<string name="preferred_locale">Display language</string>
<string name="incomplete_locale">incomplete</string>
<string name="unit_of_length_descr">Change units of length.</string>
<string name="unit_of_length_descr">Change what distance is measured in.</string>
<string name="unit_of_length">Units of length</string>
<string name="si_mi_feet">Miles/feet</string>
<string name="si_mi_yard">Miles/yards</string>
@ -2371,10 +2371,10 @@
<string name="maps_could_not_be_downloaded">This map could not be downloaded</string>
<string name="continuous_rendering">Continuous rendering</string>
<string name="continuous_rendering_descr">Display continuous rendering instead of image-at-once.</string>
<string name="rendering_exception">Error occurred while rendering selected area</string>
<string name="rendering_exception">Could not draw selected area</string>
<string name="show_point_options">Use location…</string>
<string name="renderer_load_sucess">Renderer loaded</string>
<string name="renderer_load_exception">Exception occurred: Renderer not loaded</string>
<string name="renderer_load_exception">Could not load renderer</string>
<string name="renderers">Vector renderer</string>
<string name="renderers_descr">Choose the rendering appearance.</string>
<string name="poi_context_menu_website">Show POI website</string>
@ -2392,15 +2392,15 @@
<!-- string name="map_route_by_gpx">Navigate using GPX</string-->
<string name="gpx_files_not_found">No GPX files found in the tracks folder</string>
<string name="layer_gpx_layer">GPX track…</string>
<string name="error_reading_gpx">Error reading GPX data</string>
<string name="error_reading_gpx">Could not read GPX data</string>
<string name="vector_data">Offline vector maps</string>
<string name="transport_context_menu">Search transport at stop</string>
<string name="poi_context_menu_modify">Modify POI</string>
<string name="poi_context_menu_delete">Delete POI</string>
<string name="rotate_map_compass_opt">Compass direction</string>
<string name="rotate_map_bearing_opt">Movement direction</string>
<string name="rotate_map_none_opt">Do not rotate (north always upwards)</string>
<string name="rotate_map_to_bearing_descr">Select the map screen alignment.</string>
<string name="rotate_map_none_opt">No rotation (north always upwards)</string>
<string name="rotate_map_to_bearing_descr">Select map screen alignment.</string>
<string name="rotate_map_to_bearing">Map orientation</string>
<string name="show_route">Route details</string>
<string name="fav_imported_sucessfully">Favorites imported</string>
@ -2409,9 +2409,9 @@
<string name="fav_saved_sucessfully">Favorites saved to {0}</string>
<string name="no_fav_to_save">No favorite points to save</string>
<string name="share_fav_subject">Favorites shared via OsmAnd</string>
<string name="error_occurred_loading_gpx">Error occurred while loading GPX</string>
<string name="error_occurred_loading_gpx">Could not load GPX</string>
<string name="send_report">Send report</string>
<string name="none_region_found">No offline data for regions found on memory card. Download regions from the Internet.</string>
<string name="none_region_found">Could not find any downloaded maps on memory card.</string>
<string name="poi_namefinder_query_empty">Type to find a POI</string>
<string name="any_poi">Any</string>
<string name="thanks_yandex_traffic">Thanks to Yandex for traffic info.</string>
@ -2422,9 +2422,9 @@
<string name="layer_map">Map source…</string>
<string name="menu_layers">Map layers</string>
<string name="context_menu_item_search_poi">Search POI</string>
<string name="use_trackball_descr">Use trackball to move the map.</string>
<string name="use_trackball_descr">Use a trackball device to move the map.</string>
<string name="use_trackball">Use trackball</string>
<string name="background_service_wait_int_descr">Set the maximum waiting time for each background position fix.</string>
<string name="background_service_wait_int_descr">Sets highest waiting time allowed for each background position fix.</string>
<string name="background_service_wait_int">Maximum wait for fix</string>
<string name="where_am_i">Where am I?</string>
<string name="process_navigation_service">OsmAnd navigation service</string>
@ -2433,9 +2433,9 @@
<string name="int_seconds">seconds</string>
<string name="int_min">min.</string>
<string name="background_service_int_descr">Set wake-up interval used by the background service.</string>
<string name="background_service_provider_descr">Select the location provider used by the background service.</string>
<string name="background_service_provider_descr">Select location method used by the background service.</string>
<string name="background_service_provider">Location provider</string>
<string name="background_router_service_descr">Runs OsmAnd in the background to track your position while screen is off.</string>
<string name="background_router_service_descr">Tracks your position while the screen is off.</string>
<string name="background_router_service">Run OsmAnd in background</string>
<string name="off_router_service_no_gps_available">The background navigation service requires a location provider to be turned on.</string>
<string name="hide_poi_filter">Hide filter</string>
@ -2448,7 +2448,7 @@
<string name="voice_data_corrupted">Specified voice data is corrupted</string>
<string name="voice_data_unavailable">Selected voice data is not available</string>
<string name="sd_unmounted">Memory card not accessible.\nYou won\'t be able to see maps or find things.</string>
<string name="sd_mounted_ro">Memory card read-only.\nYou can only see the preloaded map and can\'t download from the Internet.</string>
<string name="sd_mounted_ro">Memory card read-only.\nIt is now only possible to see the preloaded map, not download new areas.</string>
<string name="unzipping_file">Unzipping file…</string>
<string name="route_tr">Turn right and go</string>
<string name="route_tshr">Turn sharply right and go</string>
@ -2460,7 +2460,7 @@
<string name="route_head">Head</string>
<string name="first_time_continue">Later</string>
<string name="first_time_download">Download regions</string>
<string name="search_poi_location">Searching for signal…</string>
<string name="search_poi_location">Awaiting signal…</string>
<string name="search_near_map">Search near current map center</string>
<string name="search_nearby">Search nearby</string>
<string name="map_orientation_default">Same as device</string>
@ -2468,7 +2468,7 @@
<string name="map_orientation_landscape">Landscape</string>
<string name="map_screen_orientation">Screen orientation</string>
<string name="map_screen_orientation_descr">Portrait, landscape, or device.</string>
<string name="opening_hours_not_supported">Opening hours format is not supported for editing</string>
<string name="opening_hours_not_supported">Opening hours format can not be changed</string>
<string name="add_new_rule">Add new rule</string>
<string name="transport_Routes">Routes</string>
<string name="transport_Stop">Stop</string>
@ -2486,10 +2486,10 @@
<string name="show_transport_over_map">Show transport stops</string>
<string name="hello">OsmAnd navigation app</string>
<string name="update_poi_success">POI data was updated ({0} were loaded)</string>
<string name="update_poi_error_local">Error updating local POI list</string>
<string name="update_poi_error_loading">Error while loading data from server</string>
<string name="update_poi_error_local">Could not update local POI list</string>
<string name="update_poi_error_loading">Could not load data from server</string>
<string name="update_poi_no_offline_poi_index">No offline POI data available for this area</string>
<string name="update_poi_is_not_available_for_zoom">Updating POIs is not available for small zoom levels</string>
<string name="update_poi_is_not_available_for_zoom">Zooming in lets you update POIs</string>
<string name="context_menu_item_update_poi">Update POI</string>
<string name="context_menu_item_update_map_confirm">Update local data from the Internet?</string>
<string name="search_history_city">City: {0}</string>
@ -2516,7 +2516,7 @@
<string name="download_question_exist">Offline data for {0} already exists ({1}). Update it ({2})?</string>
<string name="address">Address</string>
<string name="downloading_list_indexes">Downloading list of available regions…</string>
<string name="list_index_files_was_not_loaded">The list of regions was not retrieved from https://osmand.net.</string>
<string name="list_index_files_was_not_loaded">Could not fetch list of regions from https://osmand.net.</string>
<string name="fav_points_edited">Favorite point was edited</string>
<string name="fav_points_not_exist">No favorite points exist</string>
<string name="update_existing">Replace</string>
@ -2531,16 +2531,16 @@
<string name="loading_poi_obj">Loading POI…</string>
<string name="auth_failed">Authorization failed</string>
<string name="failed_op">failed</string>
<string name="converting_names">Converting native/English names…</string>
<string name="converting_names">Converting local/English names…</string>
<string name="loading_streets_buildings">Loading streets/buildings…</string>
<string name="loading_postcodes">Loading postcodes…</string>
<string name="loading_streets">Loading streets…</string>
<string name="loading_cities">Loading cities…</string>
<string name="poi">POI</string>
<string name="error_occurred_saving_gpx">Error while saving GPX</string>
<string name="error_calculating_route">Error calculating route</string>
<string name="error_calculating_route_occured">Error occurred while calculating route</string>
<string name="empty_route_calculated">Error: Calculated route is empty</string>
<string name="error_occurred_saving_gpx">Could not save GPX track</string>
<string name="error_calculating_route">Could not calculate route</string>
<string name="error_calculating_route_occured">Could not calculate route</string>
<string name="empty_route_calculated">Calculated route is empty</string>
<string name="new_route_calculated_dist">New route calculated, distance</string>
<string name="arrived_at_destination">You have arrived at your destination</string>
<string name="invalid_locations">Invalid coordinates</string>
@ -2628,7 +2628,7 @@
<string name="poi_action_change">change</string>
<string name="poi_action_delete">delete</string>
<string name="poi_action_succeded_template">Action {0} completed.</string>
<string name="poi_error_unexpected_template">Unexpected error while performing action {0}.</string>
<string name="poi_error_unexpected_template">Could not perform action {0}.</string>
<string name="poi_error_io_error_template">I/O error while performing action {0}.</string>
<string name="poi_error_info_not_loaded">Info about node was not loaded</string>
<string name="poi_dialog_opening_hours">Open</string>
@ -2727,7 +2727,7 @@
<string name="plugins_menu_group">Plugins</string>
<string name="first_usage_item">First use</string>
<string name="first_usage_item_description">How to download maps, set basic settings.</string>
<string name="navigation_item_description">Setup navigation.</string>
<string name="navigation_item_description">Set up navigation.</string>
<string name="planning_trip_item">Planning a trip</string>
<string name="faq_item">FAQ</string>
<string name="faq_item_description">Frequently asked questions</string>
@ -2806,8 +2806,8 @@
<string name="quick_action_showhide_favorites_descr">Tapping this action button shows or hides the favorite points on the map.</string>
<string name="quick_action_showhide_poi_descr">Tapping this action button shows or hides POIs on the map.</string>
<string name="quick_action_showhide_favorites_title">Show/hide favorites</string>
<string name="quick_action_favorites_show">Show Favorites</string>
<string name="quick_action_favorites_hide">Hide Favorites</string>
<string name="quick_action_favorites_show">Show favorites</string>
<string name="quick_action_favorites_hide">Hide favorites</string>
<string name="quick_action_showhide_poi_title">Show/hide POI</string>
<string name="quick_action_poi_show">Show %1$s</string>
<string name="quick_action_poi_hide">Hide %1$s</string>
@ -2815,16 +2815,16 @@
<string name="quick_action_add_create_items">Create items</string>
<string name="quick_action_add_configure_map">Configure map</string>
<string name="quick_action_add_navigation">Navigation</string>
<string name="quick_action_fav_name_descr">Leave blank to use the address or place name automatically.</string>
<string name="quick_action_fav_name_descr">Leave blank to use the address or place name.</string>
<string name="quick_action_bug_descr">This message is included in the comment field.</string>
<string name="quick_action_bug_message">Message</string>
<string name="quick_action_category_descr">Select the category to save the favorite in.</string>
<string name="quick_action_gpx_category_descr">Select an optional category.</string>
<string name="quick_action_poi_list">POI list</string>
<string name="quick_action_sh_poi_descr">You can add one or more POI categories to display on the map.</string>
<string name="quick_action_sh_poi_descr">Add one or more POI categories to display on the map.</string>
<string name="quick_action_page_list_descr">Tapping this action button pages through the list below.</string>
<string name="quick_action_map_style_action">Add a map style</string>
<string name="quick_action_empty_param_error">Parameters should not be empty</string>
<string name="quick_action_empty_param_error">Fill out all parameters</string>
<string name="quick_action_map_styles">Map styles</string>
<string name="quick_action_map_overlay">Change map overlay</string>
<string name="quick_action_map_overlay_title">Map overlays</string>
@ -2839,7 +2839,7 @@
<string name="quick_action_map_source_action">Add map source</string>
<string name="quick_action_map_source_switch">The map source has been changed to \"%s\".</string>
<string name="quick_action_btn_tutorial_title">Change button position</string>
<string name="quick_action_btn_tutorial_descr">Long-taping and dragggin the button changes its position on the screen.</string>
<string name="quick_action_btn_tutorial_descr">Long-tapping and dragging the button changes its position on the screen.</string>
<string name="shared_string_action_name">Action name</string>
<string name="mappilary_no_internet_desc">You need to be connected to the Internet to view photos from Mapillary.</string>
<string name="retry">Retry</string>
@ -2853,7 +2853,7 @@
<string name="empty_state_my_tracks">Add and Record Tracks</string>
<string name="empty_state_my_tracks_desc">Record or import tracks to view.</string>
<string name="empty_state_favourites">Add Favorites</string>
<string name="empty_state_favourites_desc">Add favorites on the map or import them from a file.</string>
<string name="empty_state_favourites_desc">Import or mark favorites on the map.</string>
<string name="import_track">Import track</string>
<string name="import_track_desc">File %1$s does not contain waypoints, import it as a track?</string>
<string name="move_point">Move Point</string>
@ -2865,13 +2865,13 @@
<string name="touring_view_renderer">Touring view (contrast and details)</string>
<string name="nautical_renderer">Nautical</string>
<string name="copy_location_name">Copy Point/POI name</string>
<string name="toast_empty_name_error">Location has no name</string>
<string name="toast_empty_name_error">Unnamed location</string>
<string name="tunnel_warning">Tunnel ahead</string>
<string name="show_tunnels">Tunnels</string>
<string name="download_wikipedia_description">Download the Wikipedia articles for %1$s to read them offline.</string>
<string name="download_wikipedia_label">Download Wikipedia data</string>
<string name="open_in_browser_wiki">Open article online</string>
<string name="open_in_browser_wiki_description">View this article in a browser.</string>
<string name="open_in_browser_wiki_description">View article in a web browser.</string>
<string name="download_wiki_region_placeholder">this region</string>
<string name="wiki_article_search_text">Searching for the necessary wiki article</string>
<string name="wiki_article_not_found">Article not found</string>

View file

@ -213,6 +213,13 @@
<item name="wikivoyage_primary_btn_text_color">@color/wikivoyage_primary_btn_text_light</item>
<item name="wikivoyage_welcome_bg_color">@color/wikivoyage_welcome_bg_light</item>
<item name="wikivoyage_primary_text_color">@color/wikivoyage_primary_text_light</item>
<item name="wikivoyage_travel_card_bg">@drawable/travel_card_bg_light</item>
<item name="wikivoyage_travel_card_stroke_bg">@drawable/travel_card_stroke_bg_light</item>
<item name="wikivoyage_secondary_btn_bg">@drawable/wikivoyage_secondary_btn_bg_light</item>
<item name="wikivoyage_primary_btn_bg">@drawable/wikivoyage_primary_btn_bg_light</item>
<item name="purchase_dialog_active_card_bg">@drawable/dialog_active_card_bg_light</item>
</style>
<style name="OverflowMenuButton" parent="@style/Widget.AppCompat.ActionButton.Overflow">
@ -414,6 +421,13 @@
<item name="wikivoyage_primary_btn_text_color">@color/wikivoyage_primary_btn_text_dark</item>
<item name="wikivoyage_welcome_bg_color">@color/wikivoyage_welcome_bg_dark</item>
<item name="wikivoyage_primary_text_color">@color/wikivoyage_primary_text_dark</item>
<item name="wikivoyage_travel_card_bg">@drawable/travel_card_bg_dark</item>
<item name="wikivoyage_travel_card_stroke_bg">@drawable/travel_card_stroke_bg_dark</item>
<item name="wikivoyage_secondary_btn_bg">@drawable/wikivoyage_secondary_btn_bg_dark</item>
<item name="wikivoyage_primary_btn_bg">@drawable/wikivoyage_primary_btn_bg_dark</item>
<item name="purchase_dialog_active_card_bg">@drawable/dialog_active_card_bg_dark</item>
</style>
<style name="FreeVersionBanner" parent="OsmandDarkTheme">

View file

@ -10,6 +10,8 @@ import com.squareup.picasso.Picasso;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import okhttp3.Cache;
import okhttp3.OkHttpClient;
@ -28,6 +30,8 @@ public class PicassoUtils {
private static boolean initialized;
private static Map<String, Boolean> cached = new HashMap<>();
public static void setupPicasso(@NonNull Context context) {
if (!initialized) {
File cacheDir = createDefaultCacheDir(context);
@ -57,6 +61,19 @@ public class PicassoUtils {
e.printStackTrace();
}
}
cached.clear();
}
public static Boolean isCached(@NonNull String key) {
return cached.get(key);
}
public static void setCached(@NonNull String key, boolean val) {
cached.put(key, val);
}
public static void clearCachedMap() {
cached.clear();
}
public static long getDiskCacheSizeBytes() throws IOException {

View file

@ -49,6 +49,8 @@ public interface SQLiteAPI {
byte[] getBlob(int ind);
boolean isNull(int ind);
void close();

View file

@ -75,11 +75,17 @@ public class SQLiteAPIImpl implements SQLiteAPI {
public void close() {
c.close();
}
public boolean isNull(int ind) {
return c.isNull(ind);
}
@Override
public double getDouble(int ind) {
return c.getDouble(ind);
}
@Override
public long getLong(int ind) {

View file

@ -56,6 +56,7 @@ import net.osmand.plus.download.DownloadIndexesThread.DownloadEvents;
import net.osmand.plus.download.ui.ActiveDownloadsDialogFragment;
import net.osmand.plus.download.ui.DownloadResourceGroupFragment;
import net.osmand.plus.download.ui.LocalIndexesFragment;
import net.osmand.plus.download.ui.SearchDialogFragment;
import net.osmand.plus.download.ui.UpdatesIndexFragment;
import net.osmand.plus.helpers.FileNameTranslationHelper;
import net.osmand.plus.inapp.InAppPurchaseHelper;
@ -79,6 +80,8 @@ import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import static net.osmand.plus.download.ui.SearchDialogFragment.SHOW_WIKI_KEY;
public class DownloadActivity extends AbstractDownloadActivity implements DownloadEvents,
OnRequestPermissionsResultCallback {
private static final Log LOG = PlatformUtil.getLog(DownloadActivity.class);
@ -100,6 +103,7 @@ public class DownloadActivity extends AbstractDownloadActivity implements Downlo
public static final String LOCAL_TAB = "local";
public static final String DOWNLOAD_TAB = "download";
public static final String UPDATES_TAB = "updates";
public static final String REGION_TO_SEARCH = "search_region";
public static final MessageFormat formatGb = new MessageFormat("{0, number,#.##} GB", Locale.US);
public static final MessageFormat formatMb = new MessageFormat("{0, number,##.#} MB", Locale.US);
public static final MessageFormat formatKb = new MessageFormat("{0, number,##.#} kB", Locale.US);
@ -193,6 +197,11 @@ public class DownloadActivity extends AbstractDownloadActivity implements Downlo
final Intent intent = getIntent();
if (intent != null && intent.getExtras() != null) {
String region = getIntent().getStringExtra(REGION_TO_SEARCH);
if (region != null && !region.isEmpty()) {
showDialog(this, SearchDialogFragment.createInstance(region,
getIntent().getBooleanExtra(SHOW_WIKI_KEY, false)));
}
filter = intent.getExtras().getString(FILTER_KEY);
filterCat = intent.getExtras().getString(FILTER_CAT);
filterGroup = intent.getExtras().getString(FILTER_GROUP);

View file

@ -65,6 +65,8 @@ public class SearchDialogFragment extends DialogFragment implements DownloadEven
public static final String TAG = "SearchDialogFragment";
private static final String SEARCH_TEXT_DLG_KEY = "search_text_dlg_key";
public static final String SHOW_WIKI_KEY = "show_wiki_key";
private boolean showWiki;
private ListView listView;
private SearchListAdapter listAdapter;
private BannerAndDownloadFreeVersion banner;
@ -89,12 +91,16 @@ public class SearchDialogFragment extends DialogFragment implements DownloadEven
if (savedInstanceState != null) {
searchText = savedInstanceState.getString(SEARCH_TEXT_DLG_KEY);
showWiki = savedInstanceState.getBoolean(SHOW_WIKI_KEY);
}
if (searchText == null) {
searchText = getArguments().getString(SEARCH_TEXT_DLG_KEY);
showWiki = getArguments().getBoolean(SHOW_WIKI_KEY);
}
if (searchText == null)
if (searchText == null) {
searchText = "";
showWiki = false;
}
Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
toolbar.setNavigationIcon(R.drawable.ic_arrow_back);
@ -208,6 +214,7 @@ public class SearchDialogFragment extends DialogFragment implements DownloadEven
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString(SEARCH_TEXT_DLG_KEY, searchText);
outState.putBoolean(SHOW_WIKI_KEY, showWiki);
super.onSaveInstanceState(outState);
}
@ -234,14 +241,19 @@ public class SearchDialogFragment extends DialogFragment implements DownloadEven
return (DownloadActivity) getActivity();
}
public static SearchDialogFragment createInstance(String searchText) {
public static SearchDialogFragment createInstance(String searchText, boolean showWiki) {
Bundle bundle = new Bundle();
bundle.putString(SEARCH_TEXT_DLG_KEY, searchText);
bundle.putBoolean(SHOW_WIKI_KEY, showWiki);
SearchDialogFragment fragment = new SearchDialogFragment();
fragment.setArguments(bundle);
return fragment;
}
public static SearchDialogFragment createInstance(String searchText) {
return createInstance(searchText, false);
}
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Object obj = listAdapter.getItem(position);
@ -464,9 +476,10 @@ public class SearchDialogFragment extends DialogFragment implements DownloadEven
if (g.getType() == DownloadResourceGroupType.REGION_MAPS) {
if (g.getIndividualResources() != null) {
for (IndexItem item : g.getIndividualResources()) {
if (item.getType() == DownloadActivityType.NORMAL_FILE) {
if (item.getType() == DownloadActivityType.NORMAL_FILE
|| (item.getType() == DownloadActivityType.WIKIPEDIA_FILE
&& showWiki)) {
filter.add(item);
break;
}
}
}

View file

@ -14,6 +14,7 @@ import android.support.v4.app.FragmentManager.BackStackEntry;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MenuItem;
@ -26,10 +27,12 @@ import android.widget.TextView;
import net.osmand.AndroidUtils;
import net.osmand.IndexConstants;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.OsmandSettings.WikivoyageShowImages;
import net.osmand.plus.R;
import net.osmand.plus.activities.TrackActivity;
import net.osmand.plus.development.OsmandDevelopmentPlugin;
import net.osmand.plus.helpers.FileNameTranslationHelper;
import net.osmand.plus.wikivoyage.WikivoyageBaseDialogFragment;
import net.osmand.plus.wikivoyage.WikivoyageShowPicturesDialogFragment;
@ -37,13 +40,22 @@ import net.osmand.plus.wikivoyage.WikivoyageWebViewClient;
import net.osmand.plus.wikivoyage.data.TravelArticle;
import net.osmand.plus.wikivoyage.data.TravelDbHelper;
import net.osmand.plus.wikivoyage.data.TravelLocalDataHelper;
import net.osmand.plus.wikivoyage.explore.WikivoyageExploreDialogFragment;
import net.osmand.util.Algorithms;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static net.osmand.plus.OsmandSettings.WikivoyageShowImages.OFF;
public class WikivoyageArticleDialogFragment extends WikivoyageBaseDialogFragment {
@ -64,7 +76,7 @@ public class WikivoyageArticleDialogFragment extends WikivoyageBaseDialogFragmen
" Android.showNavigation();" +
"}" +
"</script>" +
"</head><body>\n";
"</head>";
private static final String FOOTER_INNER = "<script>var coll = document.getElementsByTagName(\"H2\");" +
"var i;" +
"for (i = 0; i < coll.length; i++) {" +
@ -115,6 +127,8 @@ public class WikivoyageArticleDialogFragment extends WikivoyageBaseDialogFragmen
"}</script>"
+ "</body></html>";
private static final String EMPTY_URL = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d4//";
private long cityId = NO_VALUE;
private ArrayList<String> langs;
private String selectedLang;
@ -388,6 +402,10 @@ public class WikivoyageArticleDialogFragment extends WikivoyageBaseDialogFragmen
@NonNull
private String createHtmlContent(@NonNull TravelArticle article) {
StringBuilder sb = new StringBuilder(HEADER_INNER);
String[] rtlLanguages = new String[]{"ar","dv","he","iw","fa","nqo","ps","sd","ug","ur","yi"};
Set<String> rtls = new HashSet<>(Arrays.asList(rtlLanguages));
String bodyTag = rtls.contains(article.getLang()) ? "<body dir=\"rtl\">\n" : "<body>\n";
sb.append(bodyTag);
String imageTitle = article.getImageTitle();
if (!TextUtils.isEmpty(article.getAggregatedPartOf())) {
@ -412,8 +430,9 @@ public class WikivoyageArticleDialogFragment extends WikivoyageBaseDialogFragmen
sb.append("</div>");
}
}
if (!TextUtils.isEmpty(imageTitle)) {
String url = TravelArticle.getImageUrl(imageTitle, false);
String url = TravelArticle.getImageUrl(imageTitle, false);
if (!TextUtils.isEmpty(imageTitle) && getSettings().WIKIVOYAGE_SHOW_IMAGES.get() != OFF &&
!url.startsWith(EMPTY_URL)) {
sb.append("<div class=\"title-image\" style=\"background-image: url(").append(url).append(")\"></div>");
}
@ -423,10 +442,24 @@ public class WikivoyageArticleDialogFragment extends WikivoyageBaseDialogFragmen
sb.append("<h1>").append(article.getTitle()).append("</h1>");
sb.append(article.getContent());
sb.append(FOOTER_INNER);
if (OsmandPlugin.getEnabledPlugin(OsmandDevelopmentPlugin.class) != null) {
writeOutHTML(sb);
}
return sb.toString();
}
private void writeOutHTML(StringBuilder sb) {
File file = new File(getMyApplication().getAppPath(IndexConstants.WIKIVOYAGE_INDEX_DIR), "page.html");
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter(file));
writer.write(sb.toString());
writer.close();
} catch (IOException e) {
Log.w("ArticleDialog", e.getMessage(), e);
}
}
@NonNull
private String getBaseUrl() {
File wikivoyageDir = getMyApplication().getAppPath(IndexConstants.WIKIVOYAGE_INDEX_DIR);

View file

@ -17,8 +17,11 @@ import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithDescription;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerHalfItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleDividerItem;
import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem;
import net.osmand.plus.download.DownloadActivity;
import net.osmand.plus.mapcontextmenu.WikipediaDialogFragment;
import static net.osmand.plus.download.ui.SearchDialogFragment.SHOW_WIKI_KEY;
public class WikivoyageArticleWikiLinkFragment extends MenuBottomSheetDialogFragment {
public static final String TAG = WikivoyageArticleWikiLinkFragment.class.getSimpleName();
@ -74,6 +77,8 @@ public class WikivoyageArticleWikiLinkFragment extends MenuBottomSheetDialogFrag
Intent newIntent = new Intent(mapActivity, mapActivity.getMyApplication().getAppCustomization()
.getDownloadActivity());
newIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
newIntent.putExtra(DownloadActivity.REGION_TO_SEARCH, wikiRegion);
newIntent.putExtra(SHOW_WIKI_KEY, true);
mapActivity.startActivity(newIntent);
dismiss();
}

View file

@ -3,7 +3,6 @@ package net.osmand.plus.wikivoyage.data;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import net.osmand.Collator;
import net.osmand.CollatorStringMatcher;
import net.osmand.CollatorStringMatcher.StringMatcherMode;
@ -45,7 +44,9 @@ public class TravelDbHelper {
private static final Log LOG = PlatformUtil.getLog(TravelDbHelper.class);
private static final String ARTICLES_TABLE_NAME = "wikivoyage_articles";
private static final String POPULAR_TABLE_NAME = "popular_articles";
private static final String ARTICLES_COL_ID = "article_id";
private static final String ARTICLES_POP_INDEX = "popularity_index";
private static final String ARTICLES_COL_TITLE = "title";
private static final String ARTICLES_COL_CONTENT = "content_gz";
private static final String ARTICLES_COL_IS_PART_OF = "is_part_of";
@ -74,6 +75,15 @@ public class TravelDbHelper {
ARTICLES_COL_CONTENTS_JSON + ", " +
ARTICLES_COL_AGGREGATED_PART_OF +
" FROM " + ARTICLES_TABLE_NAME;
private static final String POP_ARTICLES_TABLE_SELECT = "SELECT " +
ARTICLES_COL_TITLE + ", " +
ARTICLES_COL_LAT + ", " +
ARTICLES_COL_LON + ", " +
ARTICLES_COL_CITY_ID + ", " +
ARTICLES_COL_LANG + ", " +
ARTICLES_POP_INDEX +
" FROM " + POPULAR_TABLE_NAME;
private static final String SEARCH_TABLE_NAME = "wikivoyage_search";
private static final String SEARCH_COL_SEARCH_TERM = "search_term";
@ -81,6 +91,8 @@ public class TravelDbHelper {
private static final String SEARCH_COL_ARTICLE_TITLE = "article_title";
private static final String SEARCH_COL_LANG = "lang";
private static final int POPULAR_LIMIT = 25;
private final OsmandApplication application;
private TravelLocalDataHelper localDataHelper;
@ -91,7 +103,8 @@ public class TravelDbHelper {
private File selectedTravelBook = null;
private List<File> existingTravelBooks = new ArrayList<>();
private List<TravelArticle> popularArticles = new ArrayList<TravelArticle>();
public TravelDbHelper(OsmandApplication application) {
this.application = application;
collator = OsmAndCollator.primaryCollator();
@ -216,22 +229,42 @@ public class TravelDbHelper {
@NonNull
public List<TravelArticle> loadPopularArticles() {
List<TravelArticle> res = new ArrayList<>();
String language = application.getLanguage();
List<PopularArticle> popReadArticles = new ArrayList<>();
SQLiteConnection conn = openConnection();
if (conn != null) {
TravelArticle travelArticle;
SQLiteCursor cursor = conn.rawQuery("SELECT * FROM "
+ ARTICLES_TABLE_NAME
+ " WHERE article_id IN (SELECT article_id FROM "
+ ARTICLES_TABLE_NAME
+ " ORDER BY RANDOM() LIMIT 20) LIMIT 20", null);
if (cursor.moveToFirst()) {
do {
travelArticle = readArticle(cursor);
res.add(travelArticle);
} while (cursor.moveToNext());
}
cursor.close();
if (conn == null) {
return res;
}
String LANG_WHERE = " WHERE " + ARTICLES_COL_LANG + " = '" + language + "'";
SQLiteCursor cursor = conn.rawQuery(POP_ARTICLES_TABLE_SELECT + LANG_WHERE, null);
if (cursor.moveToFirst()) {
do {
PopularArticle travelArticle = PopularArticle.readArticle(cursor);
if (language.equals(travelArticle.lang)) {
popReadArticles.add(travelArticle);
}
} while (cursor.moveToNext());
}
cursor.close();
sortPopArticlesByDistance(popReadArticles);
StringBuilder bld = new StringBuilder();
bld.append(ARTICLES_TABLE_SELECT).append(LANG_WHERE)
.append(" and ").append(ARTICLES_COL_CITY_ID).append(" IN (");
for (int i = 0; i < popReadArticles.size() && i < POPULAR_LIMIT; i++) {
if (i > 0) {
bld.append(", ");
}
bld.append(popReadArticles.get(i).cityId);
}
bld.append(")");
cursor = conn.rawQuery(bld.toString(), null);
if (cursor.moveToFirst()) {
do {
TravelArticle travelArticle = readArticle(cursor);
res.add(travelArticle);
} while (cursor.moveToNext());
}
cursor.close();
sortArticlesByDistance(res);
popularArticles = res;
return res;
@ -264,15 +297,21 @@ public class TravelDbHelper {
Collections.sort(list, new Comparator<TravelArticle>() {
@Override
public int compare(TravelArticle article1, TravelArticle article2) {
int d1 = (int) MapUtils.getDistance(loc, article1.getLat(), article1.getLon());
int d2 = (int) MapUtils.getDistance(loc, article2.getLat(), article2.getLon());
if (d1 > d2) {
return 1;
} else if (d1 == d2) {
return 0;
} else {
return -1;
}
return Double.compare(MapUtils.getDistance(loc, article1.getLat(), article1.getLon()), MapUtils.getDistance(loc, article2.getLat(), article2.getLon()));
}
});
}
}
private void sortPopArticlesByDistance(List<PopularArticle> list) {
Location location = application.getLocationProvider().getLastKnownLocation();
if (location != null) {
final LatLon loc = new LatLon(location.getLatitude(), location.getLongitude());
Collections.sort(list, new Comparator<PopularArticle>() {
@Override
public int compare(PopularArticle article1, PopularArticle article2) {
return Double.compare(MapUtils.getDistance(loc, article1.lat, article1.lon),
MapUtils.getDistance(loc, article2.lat, article2.lon));
}
});
}
@ -463,11 +502,11 @@ public class TravelDbHelper {
LOG.error(e.getMessage(), e);
}
res.isPartOf = cursor.getString(3);
res.lat = cursor.getDouble(4);
res.lon = cursor.getDouble(5);
res.lat = cursor.isNull(4) ? Double.NaN : cursor.getDouble(4);
res.lon = cursor.isNull(5) ? Double.NaN : cursor.getDouble(5);
res.imageTitle = cursor.getString(6);
res.cityId = cursor.getLong(8);
res.originalId = cursor.getLong(9);
res.originalId = cursor.isNull(9) ? 0 : cursor.getLong(9);
res.lang = cursor.getString(10);
res.contentsJson = cursor.getString(11);
res.aggregatedPartOf = cursor.getString(12);
@ -501,4 +540,28 @@ public class TravelDbHelper {
}
return file;
}
private static class PopularArticle {
long cityId;
String title;
String lang;
int popIndex;
double lat;
double lon;
public boolean isLocationSpecified() {
return !Double.isNaN(lat) && !Double.isNaN(lon);
}
public static PopularArticle readArticle(SQLiteCursor cursor) {
PopularArticle res = new PopularArticle();
res.title = cursor.getString(0);
res.lat = cursor.isNull(1) ? Double.NaN : cursor.getDouble(1);
res.lon = cursor.isNull(2) ? Double.NaN : cursor.getDouble(2);
res.cityId = cursor.getLong(3);
res.lang = cursor.getString(4);
res.popIndex = cursor.isNull(5) ? 0 : cursor.getInt(5);
return res;
}
}
}

View file

@ -116,6 +116,7 @@ public class ExploreRvAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
public void setItems(List<BaseTravelCard> items) {
this.items.clear();
this.items.addAll(items);
notifyDataSetChanged();
}
private void removeItem(int position) {

View file

@ -16,6 +16,7 @@ import com.squareup.picasso.Picasso;
import com.squareup.picasso.RequestCreator;
import net.osmand.AndroidUtils;
import net.osmand.PicassoUtils;
import net.osmand.plus.IconsCache;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandSettings;
@ -76,22 +77,29 @@ public class SavedArticlesRvAdapter extends RecyclerView.Adapter<RecyclerView.Vi
} else {
final ItemVH holder = (ItemVH) viewHolder;
TravelArticle article = (TravelArticle) getItem(position);
final String url = TravelArticle.getImageUrl(article.getImageTitle(), false);
Boolean cached = PicassoUtils.isCached(url);
boolean lastItem = position == getItemCount() - 1;
RequestCreator rc = Picasso.get()
.load(TravelArticle.getImageUrl(article.getImageTitle(), false));
.load(url);
WikivoyageUtils.setupNetworkPolicy(settings, rc);
rc.transform(new CropCircleTransformation())
.into(holder.icon, new Callback() {
@Override
public void onSuccess() {
holder.icon.setVisibility(View.VISIBLE);
PicassoUtils.setCached(url, true);
}
@Override
public void onError(Exception e) {
holder.icon.setVisibility(View.GONE);
PicassoUtils.setCached(url, false);
}
});
holder.icon.setVisibility(cached != null && cached ? View.VISIBLE : View.GONE);
holder.title.setText(article.getTitle());
holder.content.setText(article.getContent());
holder.partOf.setText(article.getGeoDescription());

View file

@ -143,6 +143,12 @@ public class WikivoyageExploreDialogFragment extends WikivoyageBaseDialogFragmen
return mainView;
}
@Override
public void onDestroy() {
super.onDestroy();
PicassoUtils.clearCachedMap();
}
protected void onDataLoaded() {
mainView.findViewById(R.id.progress_bar).setVisibility(View.GONE);
updateSearchVisibility();

View file

@ -12,6 +12,7 @@ import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.RequestCreator;
import net.osmand.PicassoUtils;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.widgets.tools.CropCircleTransformation;
@ -40,21 +41,28 @@ public class ArticleTravelCard extends BaseTravelCard {
public void bindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder) {
if (viewHolder instanceof ArticleTravelVH) {
final ArticleTravelVH holder = (ArticleTravelVH) viewHolder;
final String url = TravelArticle.getImageUrl(article.getImageTitle(), false);
Boolean cached = PicassoUtils.isCached(url);
RequestCreator rc = Picasso.get()
.load(TravelArticle.getImageUrl(article.getImageTitle(), false));
.load(url);
WikivoyageUtils.setupNetworkPolicy(app.getSettings(), rc);
rc.transform(new CropCircleTransformation())
.into(holder.icon, new Callback() {
@Override
public void onSuccess() {
holder.icon.setVisibility(View.VISIBLE);
PicassoUtils.setCached(url, true);
}
@Override
public void onError(Exception e) {
holder.icon.setVisibility(View.GONE);
PicassoUtils.setCached(url, false);
}
});
holder.icon.setVisibility(cached != null && cached ? View.VISIBLE : View.GONE);
holder.title.setText(article.getTitle());
holder.content.setText(article.getPartialContent());
holder.partOf.setText(article.getGeoDescription());

View file

@ -206,9 +206,9 @@ public class TravelDownloadUpdateCard extends BaseTravelCard {
@DrawableRes
private int getPrimaryBtnBgRes(boolean enabled) {
if (enabled) {
return R.drawable.wikivoyage_primary_btn_bg;
return nightMode ? R.drawable.wikivoyage_primary_btn_bg_dark : R.drawable.wikivoyage_primary_btn_bg_light;
}
return R.drawable.wikivoyage_secondary_btn_bg;
return nightMode ? R.drawable.wikivoyage_secondary_btn_bg_dark : R.drawable.wikivoyage_secondary_btn_bg_light;
}
@ColorRes