diff --git a/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java b/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java index a041d6f694..38854cb33b 100644 --- a/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java +++ b/OsmAnd-java/src/main/java/net/osmand/data/Amenity.java @@ -38,6 +38,7 @@ public class Amenity extends MapObject { public static final String COLLECTION_TIMES = "collection_times"; public static final String CONTENT = "content"; public static final String CUISINE = "cuisine"; + public static final String WIKIDATA = "wikidata"; public static final String DISH = "dish"; public static final String REF = "ref"; public static final String OSM_DELETE_VALUE = "delete"; diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 93c9629d1c..2cf4d277fa 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -3170,7 +3170,7 @@ خريطة أثناء التنقل أخرى الوزن ، الارتفاع ، السرعة - معلمات السيارة + معلمات المركبات الإعلامات الصوتية تحدث فقط أثناء التنقل. إرشادات التنقل والإعلامات المطالبات الصوتية @@ -3212,7 +3212,7 @@ السرعة الافتراضية تغيير إعدادات السرعة الافتراضية تعيين حد السرعة الأدنى/الأعلى - وضع جديد + ملف تعريف جديد خروج مفاجئ فشل العملية الأخيرة لأوسماند. الرجاء مساعدتنا في التحسين من خلال مشاركة رسالة الخطأ. • أوضاع التطبيق: قم بإنشاء وضع مخصص لاحتياجاتك الخاصة ، باستخدام رمز ولون مخصصين @@ -3398,7 +3398,7 @@ حدد أيقونه الخريطة بعد النقر فوق \"تطبيق\" ، سيتم فقد الأوضاع المحذوفة بالكامل. الوضع الرئيسي - اختر اللون + لا يمكنك حذف أوضاع أوسماند الافتراضية ، ولكن يمكنك تعطيلها في الشاشة السابقة ، أو نقلها إلى الأسفل. تحرير الأوضاع يؤثر نوع التنقل على قواعد حسابات المسار. @@ -3805,4 +3805,6 @@ سيتم حذف نقطة الوجهة الحالية على المسار. إذا كانت هي الوجهة، سوف تتوقف الملاحة. تنزيل بيانات ويكيبيديا الحصول على معلومات حول النقاط المثيرة للاهتمام من ويكيبيديا. إنه دليلك غير المتصل بجيبك - ما عليك سوى تمكين المكون الإضافي ويكبيديا والاستمتاع بمقالات حول الكائنات من حولك. + دراجة نارية + سكوتر موتور \ No newline at end of file diff --git a/OsmAnd/res/values-de/phrases.xml b/OsmAnd/res/values-de/phrases.xml index 16dc17d12e..65018d07c7 100644 --- a/OsmAnd/res/values-de/phrases.xml +++ b/OsmAnd/res/values-de/phrases.xml @@ -2766,7 +2766,7 @@ Toilettenspülung: Plumpsklo Wikipedia Gewürzgeschäft - Kraftstoffart + Kraftstoffsorte Zahlungsart Zusätzlich Ladestation: ja diff --git a/OsmAnd/res/values-de/strings.xml b/OsmAnd/res/values-de/strings.xml index 752c1b528a..acb3358a91 100644 --- a/OsmAnd/res/values-de/strings.xml +++ b/OsmAnd/res/values-de/strings.xml @@ -3822,4 +3822,6 @@ Der aktuelle Punkt auf der Route wird gelöscht. Wenn es das Ziel ist, wird die Navigation gestoppt. Wikipedia-Karten herunterladen Informationen über Sehenswürdigkeiten erhalten Sie bei Wikipedia. Es ist Ihr Offline-Wegweiser für die Hosentasche - aktivieren Sie einfach das Wikipedia-Modul und genießen Sie Artikel über Objekte in Ihrer Umgebung. + Enduro + Motorroller \ No newline at end of file diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index ca570fd8e3..f264af132d 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -3797,4 +3797,6 @@ Merci de renseigner un nom pour le point Utilisez un guide de poche hors ligne grâce à Wikipédia. Activez le plugin Wikipédia : des points d\'intérêt seront affichés, ils vous permettrons d\'obtenir des informations sur les lieux qui vous entourent. Télécharger les cartes Wikipédia + Scooter + Moto enduro \ No newline at end of file diff --git a/OsmAnd/res/values-iw/strings.xml b/OsmAnd/res/values-iw/strings.xml index 6a93ee035a..d8b81e15d3 100644 --- a/OsmAnd/res/values-iw/strings.xml +++ b/OsmAnd/res/values-iw/strings.xml @@ -3823,4 +3823,6 @@ נקודת היעד הנוכחית במסלול תימחק. אם זה יהיה היעד, הניווט ייעצר. הורדת מפות ויקיפדיה קבלת מידע על נקודות עניין מוויקיפדיה. מדריך הכיס הפרטי שלך - עליך פשוט להפעיל את התוסף של ויקיפדיה וליהנות מערכים על מה שסביבך. + אופנוע שטח + טוסטוס \ No newline at end of file diff --git a/OsmAnd/res/values-pl/strings.xml b/OsmAnd/res/values-pl/strings.xml index c5167021fe..21e9dc02f5 100644 --- a/OsmAnd/res/values-pl/strings.xml +++ b/OsmAnd/res/values-pl/strings.xml @@ -3251,7 +3251,7 @@ Wybiera styl aplikacji, jednostki, region Ustawienia OsmAnd Skopiuj z innego profilu - Ciężar, wysokość, prędkość + Waga, wysokość, długość, prędkość Parametry pojazdu Komunikaty głosowe są odtwarzane tylko podczas nawigacji. Komunikaty głosowe @@ -3463,12 +3463,12 @@ Efekt uboczny: trasa nie będzie zawierała sekcji, w których nie zostało spełnione kryterium minimalnej prędkości (np. podczas pchania roweru pod strome wzgórze). Nie będzie również zawierała informacji o czasach odpoczynku, np. przerwach. Ma to wpływ na analizę i przetwarzanie końcowe, np. przy próbie określenia całkowitej długości trasy, czasu w ruchu lub średniej prędkości. Zmień układ kategorii Zmień kolejność sortowania listy, ukryj niepotrzebne kategorie. Wszystkie zmiany można importować lub eksportować za pomocą profili. - Można dodać nową, niestandardową kategorię wybierając jedną lub kilka potrzebnych kategorii. + Można dodać nową, niestandardową kategorię wybierając jedną lub kilka kategorii. Dostępne Dodaj niestandardową kategorię Wyświetlaj tylko w nocy - Ustawienia wtyczek przywrócone do stanu domyślnego. - Ustawienia profili przywrócone do stanu domyślnego. + Ustawienia wtyczek przywrócone do domyślnych. + Ustawienia profili przywrócone do domyślnych. %1$s/%2$s Zachód słońca o %1$s Wschód słońca o %1$s @@ -3480,7 +3480,7 @@ Użyj aplikacji systemowej Dźwięk migawki aparatu Przywrócenie domyślnej kolejności sortowania spowoduje przywrócenie porządku sortowania do stanu domyślnego po instalacji. - Tryb ułatwień dostępu wyłączony w twoim systemie. + Tryb ułatwień jest dostępu wyłączony w twoim systemie. Wygaś ekran zgodnie z ustawieniami systemu Wyczyść zarejestrowane dane - Profile: teraz można zmienić kolejność, ustawić ikonę dla mapy, zmienić wszystkie ustawienia dla profili bazowych i przywrócić je do domyślnych ustawień. @@ -3523,7 +3523,7 @@ Pokaż powiadomienia systemowe podczas nawigacji z instrukcjami nawigacji. Powiadomienie nawigacyjne Domyślnie (%s) - Wyłączenie ponownego obliczania + Bez ponownego obliczania Minimalna odległość do ponownego wyznaczenia trasy Wyznacza ponownie trasę, jeśli odległość do trasy jest dłuższa niż określony parametr Twoje nagrane ślady są w %1$s lub w folderze OsmAnd. @@ -3588,7 +3588,7 @@ Przycisk do wyświetlania lub ukrywania warstwy terenu na mapie. Pokaż teren Ukryj teren - Pokaż/ukryj teren + Pokaż / ukryj teren Nachylenie Włącz, aby wyświetlić cieniowanie wzniesień lub stoków. Możesz przeczytać więcej o tego rodzaju mapach na naszej stronie. Legenda @@ -3630,7 +3630,7 @@ Ukryte Te elementy są ukryte w menu, jednak reprezentowane opcje i wtyczki będą wciąż działać. Ukrycie ustawień resetuje je do pierwotnego stanu. - \"Główne czynności\" zawierają tylko 4 przyciski. + Mieści tylko 4 przyciski. Główne działania Możesz przemieszczać elementy tylko wewnątrz tej kategorii. Wtyczka deweloperska @@ -3719,7 +3719,7 @@ Ukryj transport publiczny Pokaż transport publiczny Pokaż/ukryj transport publiczny - Utwórz / Edytuj POI + Utwórz / Edytuj użyteczne miejsce Dodaj / Edytuj Ulubione Naciśnięcie przycisku akcji powoduje przełączanie między wybranymi profilami. Dodaj profil diff --git a/OsmAnd/res/values-ru/strings.xml b/OsmAnd/res/values-ru/strings.xml index c7ff9b3162..7c0a021979 100644 --- a/OsmAnd/res/values-ru/strings.xml +++ b/OsmAnd/res/values-ru/strings.xml @@ -1120,7 +1120,7 @@ Стиль карты Эл. почта Восход/закат - Мобильный просмотр и навигация по онлайн и локальным картам OSM всего мира + Мобильные карты и навигация по всему миру для локальных и онлайн-карт OSM OsmAnd (Open Street Maps Automated Navigation Directions) \n \n OsmAnd — это навигационное приложение с открытым исходным кодом и доступом к картам и данным на основе OSM. Все данные карт (векторные или растровые) могут быть сохранены на карту памяти устройства для использования без подключения к интернету. OsmAnd также предоставляет локальные и онлайн-средства построения маршрута, включая голосовые инструкции по маршруту. @@ -2414,7 +2414,7 @@ Маркер перемещён в действующие Указатель расстояния Показать карту - Для использования этой функции вы должны добавить хотя бы один маркер. + Для использования этой функции нужно добавить хотя бы один маркер. Не удалось изменить заметку. Дорога Показывать направляющие линии diff --git a/OsmAnd/res/values-sr/strings.xml b/OsmAnd/res/values-sr/strings.xml index 5b6be8d957..5d5e145f14 100644 --- a/OsmAnd/res/values-sr/strings.xml +++ b/OsmAnd/res/values-sr/strings.xml @@ -3812,4 +3812,6 @@ Тренутна одредишна тачка биће уклоњена. Ако је она одредишна, стопираће се навигација. Преузмите мапе Википедије Информације о тачкама од интереса потражите од Википедије. То је ваш џепни ванмрежни водич - само омогућите додатак Википедиа и уживајте у чланцима о објектима око вас. + Ендуро скутер + Скутер \ No newline at end of file diff --git a/OsmAnd/res/values-tr/phrases.xml b/OsmAnd/res/values-tr/phrases.xml index 5b939eb519..5d6ab323b0 100644 --- a/OsmAnd/res/values-tr/phrases.xml +++ b/OsmAnd/res/values-tr/phrases.xml @@ -1476,7 +1476,7 @@ Serbest sürüş Klasik Klasik+paten - Scooter + Mobilet Paten Hayır Tümsek @@ -2394,4 +2394,7 @@ URL Ok Titreşim + Mobilet: hayır + Mobilet: evet + Mobilet \ No newline at end of file diff --git a/OsmAnd/res/values-tr/strings.xml b/OsmAnd/res/values-tr/strings.xml index 61d155b793..6ae6c3f291 100644 --- a/OsmAnd/res/values-tr/strings.xml +++ b/OsmAnd/res/values-tr/strings.xml @@ -2582,7 +2582,7 @@ Yeni profil Çökme Kişisel taşıyıcı - Scooter + Mobilet Gün Günler Günler @@ -3770,4 +3770,6 @@ Yakınlaştırma için ses seviyesi düğmeleri Wikipedia haritalarını indir Wikipedia\'dan ilgi çekici yerler hakkında bilgi alın. Bu sizin çevrim dışı cep rehberinizdir - sadece Wikipedia eklentisini etkinleştirin ve etrafınızdaki nesneler hakkında makalelerin tadını çıkarın. + Enduro motosiklet + Küçük motosiklet \ No newline at end of file diff --git a/OsmAnd/res/values-zh-rTW/strings.xml b/OsmAnd/res/values-zh-rTW/strings.xml index bd7b2cf482..f8e2063502 100644 --- a/OsmAnd/res/values-zh-rTW/strings.xml +++ b/OsmAnd/res/values-zh-rTW/strings.xml @@ -3810,4 +3810,6 @@ 目前路徑上的目的地點將會被刪除。如果其將為目的地,導航就會停止。 下載維基百科地圖 從維基百科取得關於興趣點的資訊。這是您的離線口袋指南 ── 只要啟用維基百科外掛程式並享受有關於您周圍景點的文章。 + 耐力賽摩托車 + 小型摩托車 \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java index 66567bc76c..d627b4e6e6 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/AmenityMenuBuilder.java @@ -471,7 +471,7 @@ public class AmenityMenuBuilder extends MenuBuilder { } textPrefix = app.getString(R.string.poi_cuisine); vl = sb.toString(); - } else if (key.contains(Amenity.ROUTE)) { + } else if (key.contains(Amenity.ROUTE) || key.equals(Amenity.WIKIDATA)) { continue; } else { if (key.contains(Amenity.DESCRIPTION)) { @@ -784,12 +784,16 @@ public class AmenityMenuBuilder extends MenuBuilder { Map additionalInfo = amenity.getAdditionalInfo(); String imageValue = additionalInfo.get("image"); String mapillaryValue = additionalInfo.get("mapillary"); + String wikidataValue = additionalInfo.get("wikidata"); if (!Algorithms.isEmpty(imageValue)) { params.put("osm_image", imageValue); } if (!Algorithms.isEmpty(mapillaryValue)) { params.put("osm_mapillary_key", mapillaryValue); } + if (!Algorithms.isEmpty(wikidataValue)) { + params.put("wikidata_id", wikidataValue); + } return params; } diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java index a821d8b3cf..94c045fa4d 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/cards/ImageCard.java @@ -25,6 +25,7 @@ import net.osmand.plus.activities.MapActivity; import net.osmand.plus.mapcontextmenu.MenuBuilder; import net.osmand.plus.mapillary.MapillaryContributeCard; import net.osmand.plus.mapillary.MapillaryImageCard; +import net.osmand.plus.wikimedia.WikiImageHelper; import net.osmand.util.Algorithms; import org.json.JSONArray; @@ -437,6 +438,11 @@ public abstract class ImageCard extends AbstractCard { pms.put("lang", preferredLang); } if (this.params != null) { + String wikidataId = this.params.get("wikidata_id"); + if (wikidataId != null) { + this.params.remove("wikidata_id"); + WikiImageHelper.fillWikiMediaCards(mapActivity, wikidataId, result); + } pms.putAll(this.params); } String response = AndroidNetworkUtils.sendRequest(app, "https://osmand.net/api/cm_place", pms, diff --git a/OsmAnd/src/net/osmand/plus/wikimedia/WikiImage.java b/OsmAnd/src/net/osmand/plus/wikimedia/WikiImage.java new file mode 100644 index 0000000000..d545b024e6 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/wikimedia/WikiImage.java @@ -0,0 +1,28 @@ +package net.osmand.plus.wikimedia; + +public class WikiImage { + + private String imageName; + private String imageStubUrl; + private String imageHiResUrl; + + public WikiImage(String imageName, String imageStubUrl, + String imageHiResUrl) { + this.imageName = imageName; + this.imageStubUrl = imageStubUrl; + this.imageHiResUrl = imageHiResUrl; + } + + public String getImageName() { + return imageName; + } + + public String getImageStubUrl() { + return imageStubUrl; + } + + public String getImageHiResUrl() { + return imageHiResUrl; + } + +} diff --git a/OsmAnd/src/net/osmand/plus/wikimedia/WikiImageCard.java b/OsmAnd/src/net/osmand/plus/wikimedia/WikiImageCard.java new file mode 100644 index 0000000000..e423e3daa5 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/wikimedia/WikiImageCard.java @@ -0,0 +1,40 @@ +package net.osmand.plus.wikimedia; + +import android.view.View; + +import net.osmand.plus.R; +import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard; +import net.osmand.util.Algorithms; + +public class WikiImageCard extends ImageCard { + + public WikiImageCard(final MapActivity mapActivity, + final WikiImage wikiImage) { + super(mapActivity, null); + + if (topIconId == 0) { + topIconId = R.drawable.ic_logo_wikimedia; + } + + this.imageUrl = wikiImage.getImageStubUrl(); + this.title = wikiImage.getImageName(); + this.url = this.imageUrl; + + View.OnClickListener onClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + openUrl(getMapActivity(), getMyApplication(), getTitle(), wikiImage.getImageHiResUrl(), + isExternalLink() || Algorithms.isEmpty(getImageHiresUrl()), + !Algorithms.isEmpty(getImageHiresUrl())); + } + }; + + if (!Algorithms.isEmpty(buttonText)) { + this.onButtonClickListener = onClickListener; + } else { + this.onClickListener = onClickListener; + } + } + +} diff --git a/OsmAnd/src/net/osmand/plus/wikimedia/WikiImageHelper.java b/OsmAnd/src/net/osmand/plus/wikimedia/WikiImageHelper.java new file mode 100644 index 0000000000..eded246941 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/wikimedia/WikiImageHelper.java @@ -0,0 +1,126 @@ +package net.osmand.plus.wikimedia; + +import androidx.annotation.NonNull; + +import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import net.osmand.PlatformUtil; +import net.osmand.osm.io.NetworkUtils; +import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.mapcontextmenu.builders.cards.ImageCard; + +import org.apache.commons.codec.binary.Hex; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.logging.Log; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.ArrayList; +import java.util.List; + +public class WikiImageHelper { + private static final String WIKIDATA_API_ENDPOINT = "https://www.wikidata.org/w/api.php"; + private static final String ACTION = "?action=wbgetclaims&property=P18&entity="; + private static final String FORMAT_JSON = "&format=json"; + private static final String IMAGE_BASE_URL = "https://upload.wikimedia.org/wikipedia/commons/"; + private static final String WIKIDATA_PREFIX = "Q"; + private static final int THUMB_SIZE = 500; + private static final Log LOG = PlatformUtil.getLog(WikiImageHelper.class); + + public static void fillWikiMediaCards(@NonNull MapActivity mapActivity, @NonNull String wikidata, + List images) { + if (wikidata.startsWith(WIKIDATA_PREFIX)) { + StringBuilder rawResponse = new StringBuilder(); + String url = WIKIDATA_API_ENDPOINT + ACTION + wikidata + FORMAT_JSON; + String error = NetworkUtils.sendGetRequest(url, null, rawResponse); + if (error == null) { + try { + Gson gson = new Gson(); + WikipediaResponse response = gson.fromJson(rawResponse.toString(), WikipediaResponse.class); + for (WikiImage img : getImageData(response)) { + images.add(new WikiImageCard(mapActivity, img)); + } + return; + } catch (JsonSyntaxException e) { + error = e.getLocalizedMessage(); + } + } + LOG.error(error); + } else { + LOG.error("Wrong WikiMedia ID"); + } + } + + private static List getImageData(WikipediaResponse response) { + List images = new ArrayList<>(); + for (P18 p18 : response.claims.p18) { + String imageFileName = p18.mainsnak.datavalue.value; + if (imageFileName != null) { + try { + String imageName = URLDecoder.decode(imageFileName, "UTF-8"); + imageFileName = imageName.replace(" ", "_"); + imageName = imageName.substring(0, imageName.lastIndexOf(".")); + String[] urlHashParts = getHash(imageFileName); + + String imageHiResUrl = IMAGE_BASE_URL + + urlHashParts[0] + "/" + urlHashParts[1] + "/" + + imageFileName; + String imageStubUrl = IMAGE_BASE_URL + "thumb/" + + urlHashParts[0] + "/" + urlHashParts[1] + "/" + + imageFileName + "/" + THUMB_SIZE + "px-" + + imageFileName; + images.add(new WikiImage(imageName, imageStubUrl, imageHiResUrl)); + + } catch (UnsupportedEncodingException e) { + LOG.error(e.getLocalizedMessage()); + } + } + } + return images; + } + + @NonNull + private static String[] getHash(@NonNull String s) { + String md5 = new String(Hex.encodeHex(DigestUtils.md5(s))); + return new String[]{md5.substring(0, 1), md5.substring(0, 2)}; + } + + private static class Claims { + @SerializedName("P18") + @Expose + private List p18 = null; + } + + private static class Datavalue { + @SerializedName("value") + @Expose + private String value; + @SerializedName("type") + @Expose + private String type; + } + + private static class Mainsnak { + @SerializedName("datavalue") + @Expose + private Datavalue datavalue; + @SerializedName("datatype") + @Expose + private String datatype; + } + + private static class P18 { + @SerializedName("mainsnak") + @Expose + private Mainsnak mainsnak; + } + + private static class WikipediaResponse { + @SerializedName("claims") + @Expose + private Claims claims; + } +}