diff --git a/OsmAnd/AndroidManifest-gplayFree.xml b/OsmAnd/AndroidManifest-gplayFree.xml index 873848e1e9..eb06260f4e 100644 --- a/OsmAnd/AndroidManifest-gplayFree.xml +++ b/OsmAnd/AndroidManifest-gplayFree.xml @@ -4,7 +4,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/OsmAnd/res/layout/travel_needed_maps_card.xml b/OsmAnd/res/layout/travel_needed_maps_card.xml index c562b1fdd3..1a5aedcb7d 100644 --- a/OsmAnd/res/layout/travel_needed_maps_card.xml +++ b/OsmAnd/res/layout/travel_needed_maps_card.xml @@ -18,16 +18,34 @@ android:layout_margin="@dimen/content_padding" android:orientation="vertical"> - + android:layout_marginBottom="@dimen/bottom_sheet_content_padding_small"> + + + + + + + + + + + + + + + + diff --git a/OsmAnd/res/layout/wpt_list_item.xml b/OsmAnd/res/layout/wpt_list_item.xml index db24c056ac..1c018bd5d7 100644 --- a/OsmAnd/res/layout/wpt_list_item.xml +++ b/OsmAnd/res/layout/wpt_list_item.xml @@ -103,6 +103,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLines="2" + android:scrollbars="none" android:textColor="@color/wikivoyage_secondary_text" android:textSize="@dimen/default_sub_text_size" osmand:typeface="@string/font_roboto_regular" diff --git a/OsmAnd/res/values-ar/strings.xml b/OsmAnd/res/values-ar/strings.xml index 06d4d70284..b0ea31530a 100644 --- a/OsmAnd/res/values-ar/strings.xml +++ b/OsmAnd/res/values-ar/strings.xml @@ -329,7 +329,7 @@ نسخ الاحتياطي كتعديل OSM %1$d ملف بقى يظهر الإعدادات لتمكين التتبع والملاحة في وضعية السكون ( الشاشة مغلقة ) عبر إيقاظ دوري لجهاز GPS. - حساب الطرق بدقة دون أخطاء. لا يزال محدود المسافة وبطيء. + تمكين لحساب المسارات بدقة دون أخطاء. لا يزال محدود المسافة وبطيء. صورة %1$s %2$s مزامنة المسارات والملاحظات الصوتية / الفيديو مع حساب Dropbox الخاص بك. تنسيق الفيديو الناتج: @@ -359,7 +359,7 @@ برنامج عرض الخرائط العالمية والملاحة باستخدام خرائط الشوارع المفتوحة OSM أثناء الاتصال بالإنترنت أو من دونه أوسماند+ للخرائط و الملاحة برنامج عرض الخرائط العالمية والملاحة باستخدام خرائط الشوارع المفتوحة OSM أثناء الاتصال بالإنترنت أو من دونه - أنشئ مُرشِّح نقاط مهمة + إنشاء فلتر نقاط الاهتمام نمط المواصلات: وسائل النقل: الشروق: %1$s @@ -372,9 +372,9 @@ مسطرة عرض الاتجاه عدادات شفافة - تشغيل + تشغيل \n التطبيق في الخلفية - إيقاف + إيقاف \n التشغيل في الخلفية الاختصارات أين أنا @@ -417,7 +417,7 @@ مساء صباحاً مكان للوقوف - يساعد هذا الملحق بحفظ الأماكن التي ركنت بها سيارتك والوقت المتبقي للركن (في حالة وجود وقت محدد). + يساعد هذا الملحق بحفظ الأماكن التي ركنت بها سيارتك والوقت المتبقي للركن (في حالة وجود وقت محدد). \nكل من المكان والزمن متواجدان على لوحة التحكم وكذلك في المؤشرات على شاشة الخريطة. يمكن إضافة منبه إلى التقويم للتذكير. مكان الموقف موقف السيارة @@ -471,7 +471,7 @@ إفريقيا آسيا أستراليا و أوقيانوسيا - التوجيه + التوجيه مع الطرق ضبط خاص لكل وضع من أوضاع الملاحة. إدارة بيانات الخرائط إعدادات عامة @@ -497,9 +497,9 @@ تركيز تلقائي التركيز البؤري نوع الكاميرا - * انقر لتحديد نقطة. -\n  * اضغط لفترة طويلة على الخريطة لحذف النقطة السابقة. -\n  * اضغط لفترة طويلة على نقطة لعرض وإرفاق الوصف. + * انقر لتحديد نقطة. +\n  * اضغط لفترة طويلة على الخريطة لحذف النقطة السابقة. +\n  * اضغط لفترة طويلة على نقطة لعرض وإرفاق الوصف. \n  * اضغط على أداة القياس لمعرفة المزيد من الإجراءات. طبقة التضاريس طبقة التضاريس @@ -546,7 +546,7 @@ اختيار المسار النشط الحالي اختيار مسار محفوظ تذكر اختياري - إجمالي الذاكرة الأصلية المخصصة من قبل التطبيق %1$s م.ب (دلفيك %2$s م.ب, أخرى %3$s م.ب). + إجمالي الذاكرة الأصلية المخصصة من قبل التطبيق %1$s م.ب (دلفيك %2$s م.ب, أخرى %3$s م.ب). \nالذاكرة النسبية %4$s م.ب (حد الأندرويد %5$s م.ب, دلفيك %6$s م.ب). مشي دراجة نارية @@ -557,11 +557,11 @@ تقديم الخريطة هل تريد حذف %1$d من التعديلات؟ احذف الكل - يوفر هذا الملحق طبقة خط كنتوري وطبقة للتضاريس ظاهرة على الخريطة الأساسية للتطبيق. هذه الوظيفة ستكون محل تقدير من طرف الرياضيين، المتنزهين، الرحالة، وكل من هو مهتم بجمال ورخاء الطبيعة. -\n + يوفر هذا الملحق طبقة خط كنتوري وطبقة للتضاريس ظاهرة على الخريطة الأساسية للتطبيق. هذه الوظيفة ستكون محل تقدير من طرف الرياضيين، المتنزهين، الرحالة، وكل من هو مهتم بجمال ورخاء الطبيعة. +\n \nالبيانات العالمية (بين 70 درجة شمالا و70 جنوبا) مبنية حسب قياسات SRTM (مكوك رادار البعثة الطبوغرافية) وASTER (المكوك المتقدم الخاص بالانبعاث الحراري والانعكاس الإشعاعي)، أداة تصوير على متن Terra، القمر الصناعي الرئيسي لنظام رصد الأرض التابع لناسا. ASTER هو جهد تعاوني فيما بين وكالة ناسا، وزارة الاقتصاد اليابانية، التجارة والصناعة (METI)، و أنظمة الفضاء اليابانية (J-spacesystems). - يوفر هذا الملحق خطوط كنتورية وطبقة تضاريس (طبيعية) تظهر على خرائط أوسماند. هذه الوظيفة ستعجب كثيرا الرياضيين، المتجولين، الرحالة، و كل من تهمه بنية التضاريس الطبيعية (يرجى ملاحظة أن بيانات الخطوط الكنتورية/أو المساعدة منفصلة ، وتتوفر تنزيلات إضافية بعد تنشيط الملحق.) -\nالبيانات العالمية (ما بين 70 درجة شمالاً و70 جنوباً) مبنية على مقاييس SRTM (مكوك رادار البعثة الطبوغرافية) و ASTER (الانبعاث الحراري الفضائي المتقدم والإنعكاس الإشعاعي)، أداة التصوير على متن Terra، القمر الصناعي الرئيسي لنظام رصد الأرض التابع لناسا. + يوفر هذا الملحق خطوط كنتورية وطبقة تضاريس (طبيعية) تظهر على خرائط أوسماند. هذه الوظيفة ستعجب كثيرا الرياضيين، المتجولين، الرحالة، و كل من تهمه بنية التضاريس الطبيعية (يرجى ملاحظة أن بيانات الخطوط الكنتورية/أو المساعدة منفصلة ، وتتوفر تنزيلات إضافية بعد تنشيط الملحق.) +\nالبيانات العالمية (ما بين 70 درجة شمالاً و70 جنوباً) مبنية على مقاييس SRTM (مكوك رادار البعثة الطبوغرافية) و ASTER (الانبعاث الحراري الفضائي المتقدم والإنعكاس الإشعاعي)، أداة التصوير على متن Terra، القمر الصناعي الرئيسي لنظام رصد الأرض التابع لناسا. \n ASTER هو جهد تعاوني بين كل من وكالة ناسا، وزارة الاقتصاد اليابانية، التجارة والصناعة (METI)، ونظم الفضاء اليابانية (J-spacesystems). أوسماند (اتجاهات التنقل الآلية OSM) \n @@ -585,28 +585,28 @@ \n - لا توجد إمكانية الوصول دون اتصال إلى النقاط المهمة في ويكيبيديا \n \n يجري تطوير أوسماند بنشاط ويعتمد مشروعنا والتقدم المستمر على المساهمات المالية لتطوير واختبار وظائف جديدة. يرجى النظر في شراء أوسماند+ ، أو تمويل ميزات جديدة محددة أو تقديم تبرع عام على https://osmand.net. - هذا الملحق يمكنك من الوصول إلى أنواع عديدة من خرائط النت (تدعى بالقطع أو النقطية)، من قطع OSM مسبقة ( مثل Mapnik) إلى صور أقمار وطبقات مخصصة كخرائط الطقس، الخرائط الجيولوجية، طبقات التضاريس...إلخ. -\n -\nكل من هذه الخرائط يمكن أن تستخدم إما كخرائط رئيسية (قاعدية) تظهر على واجهة التطبيق، أو كطبقة فوقية أو تحتية لخريطة قاعدية آخرى( كخرائط التطبيق المحلية). لجعل أي طبقة تحتية خريطة أكثر وضوحا، بعض عناصر خرائط التطبيق التوجيهيه يمكن إخفاءها في قائمة \'ضبط الخريطة\' حسب الرغبة. -\n + هذا الملحق يمكنك من الوصول إلى أنواع عديدة من خرائط النت (تدعى بالقطع أو النقطية)، من قطع OSM مسبقة ( مثل Mapnik) إلى صور أقمار وطبقات مخصصة كخرائط الطقس، الخرائط الجيولوجية، طبقات التضاريس...إلخ. +\n +\nكل من هذه الخرائط يمكن أن تستخدم إما كخرائط رئيسية (قاعدية) تظهر على واجهة التطبيق، أو كطبقة فوقية أو تحتية لخريطة قاعدية آخرى( كخرائط التطبيق المحلية). لجعل أي طبقة تحتية خريطة أكثر وضوحا، بعض عناصر خرائط التطبيق التوجيهيه يمكن إخفاءها في قائمة \'ضبط الخريطة\' حسب الرغبة. +\n \nأجزاء الخرائط يمكن الحصول عليها من مصادر إنترنت، أو تحضيرها للإستخدام دون إنترنت ( ونسخها يدويا إلى مجلد بيانات التطبيق) كقاعدة بيانات SQLite والتي يمكن إنتاجها عن طريق مجموعة متنوعة من أدوات تحضير الخرائط المستقلة. التغييرات POI داخل التطبيق لا تؤثرعلى ملفات الخرائط المحملة، يتم حفظ التغييرات إلى ملف محلي بدلا من ذلك. وضع تركيز الكاميرا: - أوسماند+ (OSM اتجاهات التنقل التلقائية) -\n عبارة عن تطبيق ملاحة مفتوح المصدر مع إمكانية الوصول إلى العديد من بيانات عالمية للموقع. كل بيانات الخرائط (خرائط التوجيه أو الخرائط الجزئية) يمكن تخزينها في ذاكرة الجهاز للإستخدام دون إنترنت. يوفر التطبيق كذلك وظائف توجيه بما في ذلك التوجيه الصوتي. -\n -\nبعض الميزات الأساسية: -\n - تشغيل كامل دون إنترنت( خزن خرائط التوجيه أو الخرائط الجزئية المنزلة في ذاكرة الجهاز) -\n - خرائط التوجيه المدمجة للعالم ككل متاحة لتعمل دون إنترنت -\n - تحميل غير محدود لخرائط البلدان أو المناطق مباشرة من التطبيق -\n - ميزة ويكيبيديا المحلية ( قم بتحميل نقاط الاهتمام لويكيبيديا)، الأمثل لمشاهدة المعالم الأثرية -\n - يمكن تراكب عدة طبقات للخرائط، ك GPX أو مسارات الملاحة، مواقع ذات الاهتمام ، الأماكن المفضلة، الحدود الكنتورية، أماكن توقف النقل العمومي، خرائط إضافية بشفافية قابلة للتعديل -\n - البحث عن العناوين وأماكن الاهتمام دون إنترنت -\n - تحديد الطريق لمسافات متوسطة المدى -\n - وضع السيارة، الدراجة والمشاة متوفر مع: -\n - تبديل اختياري آلي لوضع الرؤية في الليل/النهار -\n - تكبير اختياري حسب السرعة -\n - محاذاة اختيارية للخريطة حسب البوصلة أو اتجاه الحركة + أوسماند+ (OSM اتجاهات التنقل التلقائية) +\n عبارة عن تطبيق ملاحة مفتوح المصدر مع إمكانية الوصول إلى العديد من بيانات عالمية للموقع. كل بيانات الخرائط (خرائط التوجيه أو الخرائط الجزئية) يمكن تخزينها في ذاكرة الجهاز للإستخدام دون إنترنت. يوفر التطبيق كذلك وظائف توجيه بما في ذلك التوجيه الصوتي. +\n +\nبعض الميزات الأساسية: +\n - تشغيل كامل دون إنترنت( خزن خرائط التوجيه أو الخرائط الجزئية المنزلة في ذاكرة الجهاز) +\n - خرائط التوجيه المدمجة للعالم ككل متاحة لتعمل دون إنترنت +\n - تحميل غير محدود لخرائط البلدان أو المناطق مباشرة من التطبيق +\n - ميزة ويكيبيديا المحلية ( قم بتحميل نقاط الاهتمام لويكيبيديا)، الأمثل لمشاهدة المعالم الأثرية +\n - يمكن تراكب عدة طبقات للخرائط، ك GPX أو مسارات الملاحة، مواقع ذات الاهتمام ، الأماكن المفضلة، الحدود الكنتورية، أماكن توقف النقل العمومي، خرائط إضافية بشفافية قابلة للتعديل +\n - البحث عن العناوين وأماكن الاهتمام دون إنترنت +\n - تحديد الطريق لمسافات متوسطة المدى +\n - وضع السيارة، الدراجة والمشاة متوفر مع: +\n - تبديل اختياري آلي لوضع الرؤية في الليل/النهار +\n - تكبير اختياري حسب السرعة +\n - محاذاة اختيارية للخريطة حسب البوصلة أو اتجاه الحركة \n - توجيه اختياري للممر، عرض الحد الأقصى للسرعة، أصوات TTS (نص إلى كلام) أو أخرى مسجلة \n {0} POI/الملاحظات تم رفعها @@ -626,7 +626,7 @@ حالة وضع السكون استخدمها لتشغيل أوسماند عندما تكون الشاشة مُطفأة. لا يوجد مساحة كافية لتحميل %1$s م.ب المساحة الخالية: %2$s. - تحميل {0} ملف(ات) ؟ + تحميل {0} ملف(ات) ؟ \n مساحة التخزين المستخدمة هي {1} مب (المساحة المتوفرة هي {2} مب). السمة الشفافة المكتبات الأصيلة غير مدعومة على هذا الجهاز. @@ -721,8 +721,8 @@ عكس اتجاه المسار استخدم الوجهة الحالية يمر على طول المسار باكمله - خريطة التنقل متوفرة لهذا الموقع فعلها عبر -\n + خريطة التنقل متوفرة لهذا الموقع فعلها عبر +\n \n\'القائمة\' ← \'ضبط الخريطة\' ← \'مصدر الخريطة\' ← \'الخريطة المحملة\'. مصدر التوجيه الصوتي اختيار قناة لتشغيل التوجيه الصوتي. @@ -770,7 +770,7 @@ ميل ساعة ميل شارك المكان باستخدام - الموقع: %1$s + الموقع: %1$s \n%2$s إتبع رابط متصفح الويب لمشاهدة المكان %1$s أو استعمل رابط أندرويد الخاص %2$s إرسال الموقع @@ -878,7 +878,7 @@ تجنب العبارات وزن المركبة منذ نسخة أندرويد كتكات 4.4، لا يمكنك تحميل أو تحديث الخرائط في مكان التخزين السابق (%s). هل تريد التغيير إلى مكان مسموح ونسخ كل الملفات إليه ؟ ملاحظات: 1-الملفات القديمة ستبقى كما هي (يمكن حذفها يدويا). -\n +\n \n2-لايمكن مشاركة الملفات بين أوسماند و +أوسماند في مكان التخزين الجديد. ينسخ الملف (%s) إلى مساره الجديد… تنبيه الوصول @@ -931,7 +931,7 @@ زيارة بعد زيارة قبل محاكاة تخيلية - خط العرض %1$s + خط العرض %1$s \nخط الطول %2$s الأسئلة الشائعة، التغييرات الحديثة، وأخرى. إعدادات الملاحة @@ -977,7 +977,7 @@ مصدر الخريطة عرض أسماء المفضلة لغة الخريطة - التفاصيل + تفاصيل إضافية الوقت الحالي اتجاه الخريطة اتجاه الحركة في الأعلى @@ -992,7 +992,7 @@ تسجيل المسار اختر الفاصل الزمني لتسجيل المسار أثناء الملاحة صوت مسج - الاتجاهات + التوجيه مع الطرق استخدام الموقع… مفضلة نقاط مفضلة مجاورة @@ -1023,8 +1023,8 @@ فشل في إعادة التسمية. عودة إلى الخريطة شارك ملاحظة - الموقع: -\n Lat %1$s + الموقع: +\n Lat %1$s \n Lon %2$s ملاحظات خريطة إنترنت @@ -1071,7 +1071,7 @@ تجنب الطرق… طرق السكك الحديدية خطوط الترام - الطرق + المسارات الرياضية وسائل المواصلات سمات أخرى للخريطة العناصر الأخرى @@ -1170,7 +1170,7 @@ طرق الحافلات الكهربائية طرق الحافلات سكك قطار الأنفاق - تاكسي مشاركة الطرق + شارك طرق التاكسي حدد حد السرعة المسموح به لتلقي تنبيه صوتي إذا ما تجاوزته. مراقبة الحدود كشك الرسوم @@ -1184,7 +1184,7 @@ قيود الدخول عرض قيود الدخول عرض سطح الطريق - إظهار طرق الدراجات + إظهار مسارات الدراجات بدء التوجيه المفصل تلقائياً مسارات فرعية: %1$s نقاط الطريق: %1$s @@ -1376,7 +1376,7 @@ خامل الرجاء إدخال عنوان بريد إلكتروني صالح أدخل اسم عمومي - شكرا لدعمكم أوسماند! + شكرا لدعمكم أوسماند! \nلتنشيط جميع الميزات الجديدة ، تحتاج إلى إعادة تشغيل أوسماند. إعدادات الاشتراك شريط جانبي @@ -1390,7 +1390,7 @@ قطار المسار الحالي مستوى البطارية - تغيير موقع العلامة + تغيير موقع التوجيه المباشر تابعنا اتجاه صدى الصوت الملاحة عبر أوسماند لايف @@ -1411,7 +1411,7 @@ مظهرالخريطة رقيقة متوسط - أضف علامات عبر الخريطة + لم تضف توجيه مباشر على الخريطة لم يتم العثور على نقاط الطريق التقرير سمح الآن للتطبيق بالكتابة على وحدة التخزين الخارجية. الرجاء إعادة تشغيله يدويا. @@ -1430,13 +1430,13 @@ سيتم إرسال جزء من التبرع إلى مستخدمي OSM الذين يقومون بإرسال التغييرات إلى الخريطة في تلك المنطقة. يرجى شراء اشتراك أوسماند لايف أولا يُتيحُ لك هذا الاشتراك الحصول على التحديثات كُل ساعة لجميع الخرائط حول العالم. -\nجزء من الدخل سيعود إلى مجتمع OSM ويُدفَع لكل مساهمة. +\nجزء من الدخل سيعود إلى مجتمع OSM ويُدفَع لكل مساهمة. \nإن كنت تحب أوسماند وOSM وترغب في الدّعم، هذه هي الطريقة المُثلى للقيام بذلك. وجهات أخرى رفع كمستخدم مجهول رفع ملاحظة OSM شريط الأدوات - حدد علامات الخريطة + حدد توجيه مباشرعلى الخريطة ترتيب عكسي تفعيل ميزة العلامات. الأسترية @@ -1472,7 +1472,7 @@ حرف غير قانوني في اسم الملف تقرير عن خرائط العالم - حرك الخريطة لتغيير مكان العلامة + حرك الخريطة لتغيير مكان التوجيه المباشر إشارة صوتية عند اتجاه نقطة الوصول. حدد اتجاه النقطة المستهدفة بالاهتزاز. @@ -1488,7 +1488,7 @@ عريض المستخدم المجهول لا يمكنه : \n- إنشاء مجموعة; -\n- مزامنة المجموعات والأجهزة مع السيرفر; +\n- مزامنة المجموعات والأجهزة مع السيرفر; \n- إدارة المجموعات والأجهزة من خلال لوحة تحكم خاصة على الموقع. تطبيق الملاحة أوسماند خطأ أثناء تحميل البيانات من الخادم. @@ -1590,10 +1590,10 @@ حرك للاسفل اسم مستخدم و كلمة سر OSM نحن بحاجة اليه لكي نوفر لك معلومات حول المساهمات. - اختر علامة + حدد توجيه مباشر عرض شريط الشفافية - لا توجد مساحة كافية! -\n {3} MB مطلوب مؤقتا ، {1} ميجا بايت بشكل دائم. + لا توجد مساحة كافية! +\n {3} MB مطلوب مؤقتا ، {1} ميجا بايت بشكل دائم. \n (فقط {2} ميغابايت المتاحة.) نقطة الانطلاق الصوت @@ -1604,14 +1604,14 @@ الزمن : انعطف يميناً انعطف يسارا واذهب - هذا الملحق يوفير خرائط بحرية للزوارق والمراكب الشراعية وأنواع أخرى من الرياضات المائية. -\n -\nخريطة خاصة إضافية للتطبيق ستقدم كل علامات الملاحة البحرية سواء داخلية أو شاطئية وكذلك جدول للرموز. وصف كل وجهة ملاحة يوفر التفاصيل اللازمة للتعرف عليها ومعانيها (الفئة، الشكل، اللون، التسلسل، المرجع...إلخ.). -\n + هذا الملحق يوفير خرائط بحرية للزوارق والمراكب الشراعية وأنواع أخرى من الرياضات المائية. +\n +\nخريطة خاصة إضافية للتطبيق ستقدم كل علامات الملاحة البحرية سواء داخلية أو شاطئية وكذلك جدول للرموز. وصف كل وجهة ملاحة يوفر التفاصيل اللازمة للتعرف عليها ومعانيها (الفئة، الشكل، اللون، التسلسل، المرجع...إلخ.). +\n \nللعودة إلى واحدة من أنماط الخريطة التقليدية، ببساطة إما عطل هذا الملحق مرة أخرى أو غير \'نمط الخريطة\' في \'ضبط الخريطة\' حسب الرغبة. البحث قرب مركز الخريطة الحالية عدد خطوط التوجيه - علامات الخريطة + التوجيه المباشر تخطي الحدود حدد الطرق التي تريد تجنبها أثناء التنقل. الفئات @@ -1629,11 +1629,11 @@ الخرائط الموجودة انتقال للأعلى التعديلات %1$s ، الرتبة %2$s ، مجموع التعديلات %3$s - أول علامة - ثاني علامة - إضافة إلى علامات الخريطة - حذف كافة العلامات النشطة على الخريطة؟ - علامة خريطة + التوجيه المباشرالأول للخريطة + التوجيه المباشرالثاني للخريطة + إضافة إلى التوجيه المباشر + حذف كافة التوجيه المباشرالنشط على الخريطة؟ + توجيه مباشر على الخريطة عرض المضلعات الحالة حفظ التعديلات @@ -1655,7 +1655,7 @@ اختر التوجيه الصوتي اختر أو قم بتحميل التوجيه الصوتي الخاص بلغتك. منح الوصول إلى بيانات الموقع. - طرق الخيول + مسارات الخيول إخفاء جودة أقل أعلى جودة @@ -1743,13 +1743,13 @@ الدخول عبر الخريطة عرض عند البدء التأثير النسبي - تحميل {0} ملف؟ + تحميل {0} ملف؟ \nمساحة التخزين المستخدمة هي {3} مب مؤقتة، {1} مب دائمة. (المساحة المتوفرة هي {2} مب.) مسافة المسلك خطأ تحيين القائمة المحلية لPOI. تحيين الPOI قم بتحميل مذكرة OSM الخاصة بك دون الكشف عن هويتك أو باستخدام ملف تعريف OpenStreetMap.org . - إضافة جميع النقاط إلى علامات الخريطة؟ + إضافة جميع النقاط إلى التوجيه المباشر؟ مسح السجلات ؟ إظهار مسارات الدراجة الجبلية يمكنك إزالة التحديثات المحملة والرجوع إلى الإصدار الأصلي للخريطة @@ -1868,7 +1868,7 @@ تلوين وفق الانتماء للشبكة تلوين وفق رمز تنزه OSMC خروج - حذف الملاحظات %1$d؟ + هل أنت متأكد من أنك تريد حذف الملاحظات %1$d؟ لعرض الخرائط البحرية، يجب تحميل خريطة خاصة محلياً. تسجيل الموقع العام إلى ملف GPX يمكن تشغيله أو إيقافه باستخدام نافذة تسجيل GPX على الشاشة خريطة. ضبط اسم مضيف البروكسي (مثال 127.0.0.1). @@ -1889,14 +1889,14 @@ أخرى %1$s %2$s عنصر ؟ البيانات الجغرافية المؤقتة - هذا الملحق يفعل وظيفة تسجيل وحفظ المسارات الخاصة بك عبر الضغط على نافذة GPX على شاشة الخريطة، أو كذلك تسجيل كافة طرق الملاحة الخاص بك تلقائيا إلى ملف GPX. -\n + هذا الملحق يفعل وظيفة تسجيل وحفظ المسارات الخاصة بك عبر الضغط على نافذة GPX على شاشة الخريطة، أو كذلك تسجيل كافة طرق الملاحة الخاص بك تلقائيا إلى ملف GPX. +\n \nالمسارات المسجلة يمكن مشاركتها مع أصدقائك أو استخدامها كمساهمات ل OSM . الرياضيون يمكنهم استخدام المسارات المسجلة لمتابعة تدريباتهم. بعض تحليل المسار الابتدائية يمكن القيام بها مباشرة في التطبيق، مثل توقيت الدورات، ومتوسط السرعة...الخ، و يمكن أيضا تحليل المسارات باستعمال أدوات تحليل جانبية لاحقا. أوسماند ليس لديه إذن لاستخدام ذاكرة البطاقة هل تريد حقا حفظ POI بدون تحديد نوعه؟ هناك خيار جديد لتحكم بشكل مرن بالتطبيق عبر لوحة القياس أو القائمة الثابتة. اختيارك يمكن تغييره دائما في إعدادات لوحة القياس. - ملاحة أوسماند دون نت ميزة تجريبية وهي لا تعمل لمسافات تزيد عن 20 كم. -\n + ملاحة أوسماند دون نت ميزة تجريبية وهي لا تعمل لمسافات تزيد عن 20 كم. +\n \n خدمة الملاحة حولت مؤقتا إلى CloudMade على الإنترنت. إصدار {0} تثبيت بنجاح ({1}). جار تحميل الإصدار… @@ -1962,15 +1962,14 @@ \nليست هناك حاجة لتحميل خريطة خاصة،الرؤية يتم إنشاؤها من خلال خرائطنا المحلية. \n \nهذه الرؤية يمكن التراجع عنها إما عن طريق تعطيلها هنا، أو تغيير \'نمط الخريطة\' في \'ضبط الخريطة\' حسب الرغبة. - - Online OSM تصنيف الخريطة مع الصور. + Online OSM تصنيف الخريطة مع الصور. تعيين الحد الأقصى لوقت الانتظار لكل إصلاح موقع في الخلفية. الانتظار الأقصى للإصلاح إصدار غير معتمد من البيانات الصوتية البيانات الصوتية المحددة تالفة بطاقة الذاكرة غير متاحة. \nلن تكون قادرا على رؤية الخرائط أو العثور على أماكن. - بطاقة الذاكرة في وضع القراءة فقط. + بطاقة الذاكرة في وضع القراءة فقط. \n يمكنك فقط مشاهدة الخريطة المحملة مسبقاً ولا يمكنك التحميل من الإنترنت. انعطف يميناً بشكل حاد انعطف يساراً بشكل حاد @@ -1980,7 +1979,7 @@ المسار اللاحق للرحلة حساب الجزء الأول فقط من الطريق للرحلات الطويلة. إلغاء - خرائط محلية + خرائط محلية \nوملاحة إنشاء إحداثية POI عدد الصفوف في الدفعة %1$s @@ -1989,8 +1988,8 @@ يرجى تفعيل ملحق المعالم البحرية %1$.1f من %2$.1f مب %.1f مب - يضع هذا الملحق بين يديك تفاصيل منحدرات تزلج عالمية، مسارات تزلج عبر كامل البلاد، التلفريك ومصاعد التزلج. الطرقات والمعابر مبينة بألوان حسب الصعوبة، -\n + يضع هذا الملحق بين يديك تفاصيل منحدرات تزلج عالمية، مسارات تزلج عبر كامل البلاد، التلفريك ومصاعد التزلج. الطرقات والمعابر مبينة بألوان حسب الصعوبة، +\n \nومصورة بنمط خريطة مميز \'شتوي\' تمثل مناظر الطبيعة بلون مثلج شتوي. أشياء فوق سطح الأرض تغيير @@ -2072,7 +2071,7 @@ اللون والسمك خذ المخرج %1$d ثم واصل المدينة أو المنطقة - مقالات ويكيبيديا قريبة + مقالات ويكيبيديا القريبة استخدام الطرق السريعة السماح للطرق السريعة. الصربية (اللاتينية) @@ -2089,7 +2088,7 @@ إجراءات سريعة إجراء %d شاشة %d - إضافة علامة خريطة + إضافة توجيه مباشر للخريطة إضافة POI نمط الخريطة نمط الخرائط تغير ل \"%s\". @@ -2162,7 +2161,7 @@ قم بالضغط على الزر لفترة أطوَل ثم اسحبه لتغيير مكانه على الشاشة. معالم العمق البحري تقسيم المسارات آلياً إلى أجزاء بعد كل فراغ - تقصير رمز التموضع المفتوح + تقصير رمز التموضع المفتوح \n يُرجى تقديم رمزٍ كامل اسم الاختصار السريع مكرر سوف تكون تتمة هذه الرسالة تلقائية في المجال المخصص للتعليق. @@ -2219,18 +2218,19 @@ حدد مجلد المسار المسارات الوقت - التغطية التقريبية للخريطة و جودتها : -\n• أوروبا الغربية : **** -\n• أوروبا الشرقية : *** -\n• روسيا : *** -\n• أمريكا الشمالية : *** -\n• امريكا الجنوبية : ** -\n• آسيا : ** -\n• اليابان وكوريا : *** -\n• الشرق الأوسط : ** -\n• إفريقيا : ** -\n• أنتاركتيكا : * -\n معظم البلدان في جميع أنحاء العالم متاحة للتنزيل ! من أفغانستان إلى زيمبابوي، من أستراليا إلى الولايات المتحدة الأمريكية. الأرجنتين، البرازيل، كندا، فرنسا، ألمانيا، المكسيك، المملكة المتحدة، إسبانيا + التغطية التقريبية للخريطة و جودتها: +\n • أوروبا الغربية: **** +\n • أوروبا الشرقية: *** +\n • روسيا: *** +\n • أمريكا الشمالية: *** +\n • امريكا الجنوبية: ** +\n • آسيا: ** +\n • اليابان وكوريا: *** +\n • الشرق الأوسط : ** +\n • إفريقيا: ** +\n • أنتاركتيكا: * +\n معظم البلدان في جميع أنحاء العالم متاحة للتنزيل +\n من أفغانستان إلى زيمبابوي، من أستراليا إلى الولايات المتحدة الأمريكية. الأرجنتين، البرازيل، كندا، فرنسا، ألمانيا، المكسيك، المملكة المتحدة، أسبانيا , … \n إعادة البحث المساهمة في OSM @@ -2312,8 +2312,8 @@ بدء مقطع جديدة بعد فارق 6 دقائق، مسار جديد بعد فارق 2 ساعة، أو ملف جديد بعد فارق أطول إذا تغير التاريخ. متوقف مؤقتاً قد يكون المسار طويلا جدا للحساب. يرجى إضافة وجهات وسطى إذا لم يتم العثور على نتيجة خلال 10 دقائق. - أوسماند(توجيهات OSM للتنقل الآلية) تطبيق خريطة وتنقل مع إمكانية الوصول إلى بيانات (OSM) مجاناً وفي جميع أنحاء العالم، وبجودة عالية -\n + أوسماند(توجيهات OSM للتنقل الآلية) تطبيق خريطة وتنقل مع إمكانية الوصول إلى بيانات (OSM) مجاناً وفي جميع أنحاء العالم، وبجودة عالية +\n \n. استمتع بمستكشف بالصوت والصورة، وعرض (نقاط الاهتمام)، إنشاء وإدارة مسارات GPX، استخدام عرض ارتفاع بيانات الخطوط الكنتورية(عن طريق الملحق)، اختيار بين نمط القيادة، ركوب الدراجات والمشاة، التعديل على الموقع وغيرها. التنقل عبر GPS \n• يمكنك أن تختار بين وضع دون اتصال (لا رسوم تجوال عندما تكون في الخارج) أو بالإنترنت (أسرع) @@ -2329,20 +2329,20 @@ \n خريطة \n• \"عرض النقاط POI\" (نقطة اهتمام) من حولك -\n• ضبط الخريطة اتجاه الحركة أو (البوصلة) +\n• ضبط الخريطة اتجاه الحركة أو (البوصلة) \n• إظهار مكانك الحالي وما يقابلك \n• مشاركة موقعك حتى يتسنى لأصدقاء إيجادك \n• الاحتفاظ بأهم الأماكن في المفضلة \n• يسمح لك باختيار كيفية عرض الأسماء على الخريطة: باللغة الإنجليزية، اللغة المحلية أو حسب الإملاء الصوتي \n• إظهار نمط خريطة إنترنت متخصص ، صورة قمر صناعي (بينج)، إظهار طبقات خريطة متراكبة مختلفة كالسياحة/مسارات GPX للملاحة وطبقات إضافية مع شفافية قابلة للتعديل \n - التزلج + التزلج \nملحق خرائط أوسماند للتزلج يمكنك من مشاهدة مسارات التزلج مع مستوى من التعقيد وبعض المعلومات الإضافية، كمواقع المصاعد والمرافق الأخرى. - ركوب الدراجات الهوائية -\n• العثورعلى مسار دراجات على الخريطة -\n• التنقل في وضع ركوب الدراجات تقترح لك مسار دراجات -\n• يمكنك مشاهدة سرعتك وارتفاعك -\n• خيار تسجيل GPX يتيح لك تسجيل رحلتك ومشاركتها + ركوب الدراجات الهوائية +\n• العثورعلى مسار دراجات على الخريطة +\n• التنقل في وضع ركوب الدراجات تقترح لك مسار دراجات +\n• يمكنك مشاهدة سرعتك وارتفاعك +\n• خيار تسجيل GPX يتيح لك تسجيل رحلتك ومشاركتها \n• عبر ملحق إضافي يمكنك عرض الخطوط الكنتورية والتضاريس المشي، التنزه، جولة في المدينة \n• الخريطة تظهر لك ممرات المشي والتنزه @@ -2365,34 +2365,35 @@ \n• أنتاركتيكا: * \nمعظم البلدان في جميع أنحاء العالم متاحة للتحميل! \nاحصل على برنامج تنقل موثوق به في بلدك - سواءاً في فرنسا، ألمانيا، المكسيك، المملكة المتحدة، إسبانيا، هولندا، الولايات المتحدة الأمريكية، روسيا، البرازيل أو أي دولة أخرى. - أوسماند بلس (توجيهات OSM للملاحة الآلية) تطبيق خريطة وملاحة مع إمكانية الوصول إلى بيانات الموقع مجاناً وفي جميع أنحاء العالم، وبجودة عالية. -\nاستمتع بالملاحة بصوت والصورة، عرض النقاط المهمة حولك (POI)، وإنشاء وإدارة مسارات GPX باستخدام معلومات عن تصور وعلو الخطوط الكنتورية، خياراً بين القيادة، ركوب الدراجات، وضع المشاة، التعديل على OSM وأكثر من ذلك بكثير. -\n -\nأوسماند بلس هو إصدار للتطبيق مدفوع الأجر. قبل شرائه، ادعم المشروع، بتمويل لتطوير الميزات الجديدة والحصول على آخر التحديثات. -\n + أوسماند بلس (توجيهات OSM للملاحة الآلية) تطبيق خريطة وملاحة مع إمكانية الوصول إلى بيانات الموقع مجاناً وفي جميع أنحاء العالم، وبجودة عالية. +\nاستمتع بالملاحة بصوت والصورة، عرض النقاط المهمة حولك (POI)، وإنشاء وإدارة مسارات GPX باستخدام معلومات عن تصور وعلو الخطوط الكنتورية، خياراً بين القيادة، ركوب الدراجات، وضع المشاة، التعديل على OSM وأكثر من ذلك بكثير. +\n +\nأوسماند بلس هو إصدار للتطبيق مدفوع الأجر. قبل شرائه، ادعم المشروع، بتمويل لتطوير الميزات الجديدة والحصول على آخر التحديثات. +\n \n بعض الميزات الرئيسية: الملاحة -\n• يعمل على الإنترنت (سريع) أو في وضع غير متصل (لا رسوم تجوال خارج الوطن) -\n• توجيه صوتي بالتفصيل (الأصوات المسجلة أو مدرجة) -\n• موجه مسار اختياري، عرض اسم الشارع، والوقت المقدر للوصول -\n• يدعم نقاط وسيطة خلال مسارك -\n• إعادة تلقائية للتوجيه كلما انحرفت عن الطريق -\n• البحث عن الأماكن حسب العنوان، النوع (مثل: مطعم، فندق، محطة وقود، متحف)،أو حسب الإحداثيات الجغرافية - عرض الخريطة -\n• عرض موقعك والتوجيه -\n• محاذاة اختيارية للصورة وفق البوصلة أو توجيه الحركة -\n• حفظ أهم أماكنك المفضلة -\n• عرض نقاط الاهتمام من حولك -\n• عرض متخصص لبيانات خرائط على الإنترنت، الرؤية من الأقمار الصناعية (من بينج) وتراكب طبقات خرائط مختلفة كالسياحة ومسارات GPX للملاحة وطبقات إضافية مع شفافية قابلة للتعديل +\n • يعمل على الإنترنت (سريع) أو في وضع غير متصل (لا رسوم تجوال خارج الوطن) +\n • توجيه صوتي بالتفصيل (الأصوات المسجلة أو مدرجة) +\n • موجه مسار اختياري، عرض اسم الشارع، والوقت المقدر للوصول +\n • يدعم نقاط وسيطة خلال مسارك +\n • إعادة تلقائية للتوجيه كلما انحرفت عن الطريق +\n • البحث عن الأماكن حسب العنوان، النوع (مثل: مطعم، فندق، محطة وقود، متحف)،أو حسب الإحداثيات الجغرافية +\n + عرض الخريطة +\n• عرض موقعك والتوجيه +\n• محاذاة اختيارية للصورة وفق البوصلة أو توجيه الحركة +\n• حفظ أهم أماكنك المفضلة +\n• عرض نقاط الاهتمام من حولك +\n• عرض متخصص لبيانات خرائط على الإنترنت، الرؤية من الأقمار الصناعية (من بينج) وتراكب طبقات خرائط مختلفة كالسياحة ومسارات GPX للملاحة وطبقات إضافية مع شفافية قابلة للتعديل \n• عرض اختياري لأسماء الأماكن باللغة الإنكليزية، اللغة المحلية، أو عبر الإملاء الصوتي \n - استخدام OSM وبيانات ويكيبيديا -\n• جودة معلومات من أفضل المشاريع التعاونية العالمية -\n• بيانات OSM متاحة لكل بلد أو منطقة -\n• POI ويكيبيديا، الأفضل لمشاهدة المعالم السياحية -\n• التنزيلات مجانية غير محدودة، مباشرة من التطبيق -\n• خرائط فيكتور مدمجة تحدث مرة واحدة في شهر على الأقل -\n + استخدام OSM وبيانات ويكيبيديا +\n• جودة معلومات من أفضل المشاريع التعاونية العالمية +\n• بيانات OSM متاحة لكل بلد أو منطقة +\n• POI ويكيبيديا، الأفضل لمشاهدة المعالم السياحية +\n• التنزيلات مجانية غير محدودة، مباشرة من التطبيق +\n• خرائط فيكتور مدمجة تحدث مرة واحدة في شهر على الأقل +\n \n• اختر بين بيانات منطقة كاملة أو شبكة الطرق فقط (مثال: سعة اليابان 700 MB في حين 200 MB لشبكة الطرق فقط) ميزات الأمان \n• عرض اختياري لوضع النهار/اليل @@ -2400,12 +2401,12 @@ \n• تكبير/تصغيير اختياري حسب السرعة \n• مشاركة موقعك حتى يتمكن لأصدقاءك ايجادك \n - ميزات الدراجة والمشاة -\n • عرض ممرات المشاة، التنزه، وأنشطة الهواء الطلق -\n • توجيه متخصص وعرض طرق خاصة باللدراجات الهوائية والمشاة -\n • محطات نقل عام اختيارية (حافلات، الترامواي، القطار) بما في ذلك أسماء خطوط النقل -\n • تسجيل رحلة اختياري إلى ملف GPX محلي أو لخدمة على الإنترنت -\n • عرض اختياري للسرعة والارتفاع + ميزات الدراجة والمشاة +\n • عرض ممرات المشاة، التنزه، وأنشطة الهواء الطلق +\n • توجيه متخصص وعرض طرق خاصة باللدراجات الهوائية والمشاة +\n • محطات نقل عام اختيارية (حافلات، الترامواي، القطار) بما في ذلك أسماء خطوط النقل +\n • تسجيل رحلة اختياري إلى ملف GPX محلي أو لخدمة على الإنترنت +\n • عرض اختياري للسرعة والارتفاع \n • عرض الخطوط الكنتورية والتضاريس (عن طريق برامج ملحق إضافي) المساهمة مباشرة في OSM \n• الابلاغ عن الأخطاء في البرنامج @@ -2418,7 +2419,8 @@ اسم الاختصار السريع المحدد قيد الاستخدام، لقد تم تغييره إلى %1$s لتجنب التكرار. الضغط على زر الإجراء سيطبق أحد الأنماط من القائمة أدناه. تنقلاتك على هذا الطريق - OLC الصالحة بالكامل\nتمثل المنطقة: %1$s x %2$s + الصالحة بالكامل OLC +\nيمثل المنطقة: %1$s x %2$s اسم المستخدم خاطئ إلى مِن @@ -2468,7 +2470,7 @@ إضافة نقطة قبل إضافة نقطة بعد خيارات - سيتم توصيل النقاط بطرق الوضع المحدد. + سيتم توصيل النقاط بمسارات الوضع المحدد. يمكنك حفظ النقاط إما كنقاط طريق أو كخط. اختر وضع الملاحة إضافة نقاط مسار @@ -2481,12 +2483,12 @@ عتبة توجيه الخريطة حدد أدناه على أي سرعة يتغير توجيه الخريطة من \'اتجاه الحركة\' إلى \'البوصلة\'. تم نقل جميع العلامات إلى السجل - تم نقل العلامة إلى السجل - العلامة أصبحت نشطة + تم نقل التوجيه المباشر إلى السجل + التوجيه المباشر انتقل كنشط قائمة مجموعات آخر استخدام : %1$s - تنشيط العلامة + تنشيط التوجيه المباشر اليوم أمس آخر ٧ أيام @@ -2502,12 +2504,12 @@ سهم متجه للهدف عرض المتجاوز إخفاء المتجاوز - إزالة من \"علامات الخريطة\" + إزالة من \"التوجيه المباشر\" تنازلي تصاعدي تاريخ الإضافة ترتيب حسب: - حدد كيفية الإشارة إلى مسافة واتجاه العلامة على شاشة الخريطة: + حدد كيفية الإشارة إلى المسافة والاتجاه للتوجيه المباشر على شاشة الخريطة: استخدم الموقع أضف موقعك كنقطة أولى لتخطيط طريق مثالي. موقعي @@ -2518,7 +2520,7 @@ تصدير علاماتك إلى ملف يمكنك تحديده هنا: نقل إلى السجل سيتم إزالة المجموعة بعد إعادة تشغيل التطبيق. - العلامات + التوجيه المباشر نمط الإحداثيات لوحة مفاتيح النظام اختر نسق إدخال الأحداثيات. يمكنك دائماً تغييره بالنقر على خيارات. @@ -2535,12 +2537,12 @@ أظهر الخريطة تم حساب المسار رحلة ذهاب وإياب - يجب عليك إضافة علامة واحدة على الأقل لاستخدام هذه الوظيفة. + يجب عليك إضافة توجيه مباشر واحد على الأقل لاستخدام هذه الوظيفة. تنسيق خاطئ أدخل اسم جديد عودة عرض - تمت إضافة نقاط الطريق إلى علامات الخريطة + تمت إضافة نقاط الطريق إلى التوجيه المباشر للخريطة إدخال خاطئ يمكن استيرادها كنقاط مفضلة، أو كملف GPX. استيراد كملف GPX @@ -2548,15 +2550,15 @@ استيراد ملف نقرة على الخريطة ستفعل أزرار التحكم والويدجت. شاشة كاملة - علامة مُجتازة + توجيه مباشر مجتاز إنشاء أو تعديل عناصر OSM قم بإنشاء أو تعديل نقاط الاهتمام OSM ، وفتح ملاحظات OSM أو التعليق عليها ، والمساهمة في ملفات GPX المسجلة. حذف مُعدلة تمت الإضافة تعديل طلب البحث. - تم تنشيط العلامة %s. - انقر على العلامة في الخريطة لجعلها بالاعلى بدون فتح القائمة. + تم تنشيط التوجيه المباشر %s. + انقر على التوجيه المباشر في الخريطة لجعله الاعلى بدون فتح القائمة. تدوين ملاحظات! بدون حد زمني اقرأ المقال كاملا @@ -2564,27 +2566,27 @@ جميع نقاط هذه المجموعة افتح من مفتوح حتى - يغلق عند - يفتح عند - يفتح عند + يغلق أبوابه على + سيفتح الأبواب على + يفتح أبوابه على إجراءات إضافية إجراءات - العلامات + توجيه مباشر الملاحظات حسب التاريخ حسب التاريخ حسب النوع المزيد - المظهر على الخريطة + التوجيه المباشر نقاط المسار إضافة مجموعة - قم بإنشاء علامات على الخريطة ! + قم بإنشاء التوجيه المباشر على الخريطة ! استيراد مجموعات عدد الأرقام اليمين اليسار لصق الانتقال إلى الحقل التالي - إعادة تسمية العلامة + إعادة تسمية التوجيه المباشر مجموع التبرعات تسميات POI بدون اسم @@ -2616,7 +2618,7 @@ ج ش اسم النقطة - الطرق القريبة في الداخل + الطرق الداخلية المجاورة أدخل اسم الملف. خطأ أثناء استرجاع الخريطة تمت عملية استيراد الخريطة @@ -2628,7 +2630,7 @@ قم باختيار نسق الملف جميع البيانات ملاحظات OSM - سيفتح غداً عند + سيفتح أبوابه غداً على ماذا هنا: اللاوسية عرض خريطة السياحة @@ -2692,7 +2694,7 @@ تنزيل الكل إعادة تشغيل التطبيق إشارة مرجعية - نقاط بالطريق تم إزالتها من علامات الخريطة + نقاط بالطريق تم إزالتها من التوجيه المباشر للخريطة بواسطة أوسماند الأسعار والاشتراك شهري @@ -2707,19 +2709,19 @@ يجدد سنويا حدد فترة الدفع المناسبة لك: تبرعات مساعدة صندوق رسم الخرائط OSM. - حذف العلامة \'%s\'؟ - تعديل العلامة + حذف التوجيه المباشر \'%s\'؟ + تعديل التوجيه المباشر بحث عن شارع اختر المدينة أولاً استعادة تطبيق من طرف ثالث - ستبقى العلامات المضافة من مجموعة إحداثيات أو من نقاط طريق على الخريطة عند اختيار \"تجاوز العلامة\". إذا كانت المجموعة غير نشطة ستختفي العلامات من الخريطة. - إبقاء العلامة المتجاوز + عند التفعيل سيبقى التوجيه المباشر المضاف من مجموعة إحداثيات أو من نقاط طريق على الخريطة عند اختيار \"تجاوز التوجيه المباشر\". إذا كانت المجموعة غير نشطة ستختفي الوجهات المباشرة من الخريطة. + إبقاء التوجيه المباشر المتجاوز هناك المزيد من وسائل النقل في هذا الموقف. يرجى إعطاء إذن تحديد الموقع للتطبيق لكي يواصل. شكرا على الرد النقطة أو الطريق غير موجود. - لايوجد نتائج للبحث؟ + لايوجد نتائج للبحث؟ \nأخبرنا برأيك زيادة نصف قطر البحث إلى %1$s إرسال استفسار البحث؟ @@ -2752,7 +2754,7 @@ اختر العنصر المناسب لا تفعل افعل - صور المقالة يمكن تحملها للاستخدام بدون اتصال. + صور المقالة يمكن تحملها للاستخدام بدون اتصال. \nدائماً متوفرة في \'اكتشف\'←\'خيارات\'. الصفحة متاحة على الإنترنت فقط. فتح في متصفح الويب؟ الصور المؤقتة @@ -2842,7 +2844,7 @@ إضافة ملاحظة صوتية أو فيديو أو صورة لكل نقطة على الخريطة، باستخدام قائمة السياق أو القطعة. ابحث عن المسارات مع نقاط الطريق حدد مسار لإضافة نقاط الطريق إلى العلامات(يتم سرد المسارات فقط مع نقاط الطريق). - نقرة طويلة أو قصيرة على الأماكن ثم اضغط على زر علامة. + نقرة طويلة أو قصيرة على الأماكن ثم اضغط على زر التوجيه المباشر. يمكنك استيراد المجموعات المفضلة أو نقاط المسار كتوجيه. ستظهر العلامات التي تم تجاوزها على هذه الشاشة. خط مباشر من موقعك إلى الهدف. @@ -2992,7 +2994,7 @@ سنوات ثلاثة أشهر مجاناً - إظهار شبكة طرق الدارجات الهوائية + إظهار شبكة مسارات الدارجات الهوائية نافذة تحميل الخريطة النوافذ والإشعارات التحكم في النوافذ المنبثقة ، ومربعات الحوار والإشعارات. @@ -3017,7 +3019,7 @@ لصق مسار مجلد بيانات أوسماند تغيير مجلد التخزين ؟ نقل للموقع الجديد - تجنب بعض أنواع الطرق + تجنب بعض الطرق جنبًا إلى جنب طريق تلفريك اتصال @@ -3042,21 +3044,21 @@ تفضيل الطرق الغير معبدة تفضيل الطرق الغير معبدة. تحديث كل الخرائط - تحديث (%1$d) خريطة؟ - • تحديث التطبيق وإعدادات الأوضاع: يتم ترتيب الإعدادات الآن حسب النوع. يمكن تخصيص كل وضع بشكل منفصل. -\n -\n • نافذة جديدة لتنزيل الخريطة المقترحة أثناء تصفح الخرائط -\n -\n • إصلاحات للنمط الليلي -\n -\n • إصلاح العديد من مشاكل التوجيه في جميع أنحاء العالم -\n -\n • خريطة الأساس المحدثة مع شبكة طرق أكثر تفصيلا -\n -\n • تحديث المناطق التي غمرتها الفيضانات في جميع أنحاء العالم -\n -\n • توجيه التزلج: إضافة وضع الارتفاع وتعقيد المسار إلى تفاصيل المسار -\n + هل أنت متأكد من رغبتك بتحديث (%1$d) خريطة؟ + • تحديث التطبيق وإعدادات الأوضاع: يتم ترتيب الإعدادات الآن حسب النوع. يمكن تخصيص كل وضع بشكل منفصل. +\n +\n • نافذة جديدة لتنزيل الخريطة المقترحة أثناء تصفح الخرائط +\n +\n • إصلاحات للنمط الليلي +\n +\n • إصلاح العديد من مشاكل التوجيه في جميع أنحاء العالم +\n +\n • خريطة الأساس المحدثة مع شبكة طرق أكثر تفصيلا +\n +\n • تحديث المناطق التي غمرتها الفيضانات في جميع أنحاء العالم +\n +\n • توجيه التزلج: إضافة وضع الارتفاع وتعقيد المسار إلى تفاصيل المسار +\n \n • إصلاحات أخرى \n \n @@ -3233,7 +3235,7 @@ تحديثات الخريطة الشهرية تحديثات الخريطة كل ساعة سيتم إرسال استعلام البحث إلى: \"%1$s\" ، بالإضافة إلى موقعك. -\n +\n \nلا يتم جمع المعلومات الشخصية ، فقط بيانات البحث اللازمة لتحسين البحث. لامركبة ترام تجنب مركبة الترام @@ -3258,8 +3260,8 @@ عرض الإحداثيات سياسة الخصوصية ساعدنا في جعل أوسماند أفضل - السماح ل OsmAnd بجمع ومعالجة بيانات استخدام التطبيق المجهول. لا يتم جمع بيانات حول موقعك أو المواقع التي تعرضها على الخريطة. -\n + السماح ل OsmAnd بجمع ومعالجة بيانات استخدام التطبيق المجهول. لا يتم جمع بيانات حول موقعك أو المواقع التي تعرضها على الخريطة. +\n \nقم بإعدادها في أي وقت لاحق في \'الإعدادات\' ← \'الخصوصية والأمان\'. اختر نوع البيانات التي تريد مشاركتها: الخرائط التي تم تنزيلها @@ -3328,8 +3330,8 @@ طرق لجولات التزلج. تزلج منحدرات لاستخدام الزلاجات. - السماح بالطرق المتوسطة - طرق أكثر صعوبة مع أقسام أكثر حدة. بعض العقبات ينبغي تجنبها. + السماح بالمسارات المتوسطة + طرق أكثر صعوبة مع أقسام أكثر حدة. بعض العقبات التي ينبغي تجنبها. السماح للطرق المتقدمة طرق صعبة ، مع عقبات خطيرة وأقسام شديدة الانحدار. السماح بطرق المتخصصين @@ -3355,8 +3357,8 @@ لوحة المفاتيح وندرلينك ببغاء - المسار: المسافة%1$s، الوقت %2$s. -\nالحساب: %3$.1f ث، %4$d طريق، %5$d تجانب + المسار: المسافة%2$s، وقت التوجيه %1$s. +\nالحساب: %3$.1f ث، %4$d طريق، %5$d تجانب) الأوكيتانية ثم %1$s تطبيق فقط على \"%1$s\" @@ -3378,7 +3380,7 @@ اختر اللون لا يمكنك حذف أوضاع أوسماند الافتراضية ، ولكن يمكنك تعطيلها في الشاشة السابقة ، أو نقلها إلى الأسفل. تحرير الأوضاع - يؤثر نوع التنقل على قواعد حساب الطرق. + يؤثر نوع التنقل على قواعد حسابات المسار. مظهر الوضع اختر الايقونة واللون والاسم تحرير قائمة الأوضاع @@ -3495,8 +3497,8 @@ تضمين بيانات إضافية يمكنك تحديد بيانات إضافية للتصدير مع الوضع. القارة القطبية الجنوبية - هذا الملحق هو تطبيق منفصل ، بإمكانك إزالته بشكل منفصل إذا لم تعد تخطط لاستخدامه. -\n + هذا الملحق هو تطبيق منفصل ، بإمكانك إزالته بشكل منفصل إذا لم تعد تخطط لاستخدامه. +\n \nسيبقى الملحق الإضافي على الجهاز بعد إزالة أوسماند. %1$s — %2$s — %3$s يحتوي الوضع المستوردة على بيانات إضافية. انقر فوق \"استيراد\" لاستيراد بيانات الوضع فقط أو حدد بيانات إضافية لاستيرادها. @@ -3523,8 +3525,8 @@ المدرج %1$s, موجودة بالفعل في أوسماند. احتفظ بكليهما سيتم إضافة العناصر المستوردة مع زيادة قبل اسمها - OsmAnd يحتوي بالفعل على عناصر بنفس الأسماء مثل التي استوردتها. -\n + OsmAnd يحتوي بالفعل على عناصر بنفس الأسماء مثل التي استوردتها. +\n \nحدد إجراء. بعض العناصر موجودة بالفعل حدد البيانات التي سيتم استيرادها. @@ -3534,11 +3536,11 @@ استعادة جميع إعدادات الوضع؟ حفظ الوضع الجديد لا يمكن عمل نسخة احتياطية لهذا الوضع. - مسح البيانات المسجلة؟ + هل أنت متأكد من أنك تريد مسح البيانات المسجلة؟ استيراد البيانات من %1$s استيراد - OsmAnd تحقق %1$s للتكرارات مع العناصر الموجودة في التطبيق. -\n + OsmAnd تحقق %1$s للتكرارات مع العناصر الموجودة في التطبيق. +\n \nقد يستغرق الأمر بعض الوقت. العناصر المضافة تم الاستيراد @@ -3585,8 +3587,8 @@ اللغة جميع اللغات هناك حاجة إلى خرائط إضافية لعرض النقاط المهمة من ويكيبيديا على الخريطة. - تخصيص كمية العناصر في درج تكوين خريطة قائمة السياق. -\n + تخصيص كمية العناصر في درج تكوين خريطة قائمة السياق. +\n \nيمكنك تعطيل الإضافات غير المستخدمة لإخفاء جميع الضوابط من الطلب %1$s. عناصر الدرج، قائمة السياق تخصيص واجهة المستخدم @@ -3636,10 +3638,10 @@ خرائط إضافية %1$s إجراء غير معتمد %1$s / %2$s - سيتم احتساب الدفع لحساب Google Play الخاص بك في تأكيد الشراء. -\n -\nيتم تجديد الاشتراك تلقائيًا ما لم يتم إلغاؤه قبل تاريخ التجديد. سيتم تحميل حسابك لفترة التجديد (شهر / ثلاثة أشهر / سنة) فقط في تاريخ التجديد. -\n + سيتم احتساب الدفع لحساب Google Play الخاص بك في تأكيد الشراء. +\n +\nيتم تجديد الاشتراك تلقائيًا ما لم يتم إلغاؤه قبل تاريخ التجديد. سيتم تحميل حسابك لفترة التجديد (شهر / ثلاثة أشهر / سنة) فقط في تاريخ التجديد. +\n \nيمكنك إدارة وإلغاء الاشتراكات الخاصة بك عن طريق الذهاب إلى إعدادات Google Play الخاصة بك. البحث عن أنواع poi اجمع أنواع النقاط المهمة من فئات مختلفة. اضغط على مفتاح التبديل لتحديد الكل ، ثم انقر على الجانب الأيسر لاختيار الفئة. @@ -3655,22 +3657,22 @@ مشتريات أوسماند دليل رموز الخريطة. أوضاع الملاحة - • خرائط جديدة للتضاريس توضح المنحدرات من دون الحاجة للاتصال بالإنترنت -\n -\n • التخصيص الكامل للمفضلات ونقاط الطرق GPX - الألوان المخصصة والأيقونات والأشكال -\n -\n • تخصيص ترتيب العناصر في قائمة السياق ، تكوين الخريطة ، درج -\n -\n • عرض ويكيبيديا كطبقة منفصلة في تكوين الخريطة ، حدد اللغات المطلوبة فقط -\n -\n • إنشاء مرشح / خرائط للمعالم الخاصة بك مع مرونة تامة -\n -\n • تمت إضافة خيارات لاستعادة إعدادات الأوضاع المخصصة -\n -\n • مسارات GPX كاملة من الممرات دعم حركة المرور وتعليمات كاملة -\n -\n • إصلاح أحجام واجهة المستخدم على الأجهزة اللوحية -\n + • خرائط جديدة للتضاريس توضح المنحدرات من دون الحاجة للاتصال بالإنترنت +\n +\n • التخصيص الكامل للمفضلات ونقاط الطرق GPX - الألوان المخصصة والأيقونات والأشكال +\n +\n • تخصيص ترتيب العناصر في قائمة السياق ، تكوين الخريطة ، درج +\n +\n • عرض ويكيبيديا كطبقة منفصلة في تكوين الخريطة ، حدد اللغات المطلوبة فقط +\n +\n • إنشاء مرشح / خرائط للمعالم الخاصة بك مع مرونة تامة +\n +\n • تمت إضافة خيارات لاستعادة إعدادات الأوضاع المخصصة +\n +\n • مسارات GPX كاملة من الممرات دعم حركة المرور وتعليمات كاملة +\n +\n • إصلاح أحجام واجهة المستخدم على الأجهزة اللوحية +\n \n • إصلاح الخلل مع اللغات التي تكتب من اليمين \n \n @@ -3722,15 +3724,15 @@ \n \n%2$s هي مستويات التكبير التي ستكون فيها الإطارات المتجانبة الأصلية مرئية. سوف يحدث التحجيم للأكبر أو الأصغر خارج هذه القيم. وقت انتهاء الصلاحية بالدقائق. سيتم إعادة تحميل الإطارات المتجانبة المخزنة مؤقتًا بعد الوقت المحدد. اترك هذا الحقل فارغًا لعدم تحديث الإطارات المتجانبة لهذا المصدر. -\n -\nيوم واحد هو 1440 دقيقة. -\nأسبوع واحد هو 10080 دقيقة. +\n +\nيوم واحد هو 1440 دقيقة. +\nأسبوع واحد هو 10080 دقيقة. \nشهر واحد هو 43 829 دقيقة. اختر كيفية تخزين الطبقات المنزلة. مهلة الشاشة الافتراضية يمكنك تصدير أو استيراد إجراءات سريعة باستخدام أوضاع التطبيق . حذف الكل؟ - حذف الاختصارات السريعة %d نهائيًا؟ + هل أنت متأكد من رغبتك في حذف الاختصارات السريعة %d نهائيًا؟ مهلة الشاشة نغمات أدل بعرض مركبتك، قد يتم تطبيق بعض القيود على المركبات العريضة. @@ -3760,12 +3762,12 @@ %1$s محذوفة إعادة التشغيل مطلوبة لحذف بيانات كاميرا السرعة بالكامل. إلغاء التثبيت وإعادة التشغيل - في بعض البلدان أو المناطق، يحظر القانون استخدام تطبيقات التحذير من كاميرا السرعة. -\n -\nعليك أن تختار اعتمادا على قانون بلدك. -\n -\nحدد %1$s وستتلقى تنبيهات وتحذيرات حول كاميرات السرعة. -\n + في بعض البلدان أو المناطق، يحظر القانون استخدام تطبيقات التحذير من كاميرا السرعة. +\n +\nعليك أن تختار اعتمادا على قانون بلدك. +\n +\nحدد %1$s وستتلقى تنبيهات وتحذيرات حول كاميرات السرعة. +\n \nحدد %2$s. جميع البيانات المتعلقة كاميرات السرعة: التنبيهات، والإشعارات، سيتم حذف نقاط الاهتمام حتى يتم إعادة تثبيت أوسماند تماما. تحديد الارتفاع الأعلى المسموح به على الطرق. حد الطول @@ -3787,7 +3789,7 @@ أغلق ملاحظة OSM تحتاج إلى تعيين أيام العمل للمتابعة المسار بين النقاط - تخطيط طريق + قياس المسافة إضافة إلى مسار لن تكون النقطة المضافة مرئية على الخريطة، نظرًا لأن المجموعة المحددة مخفية، يمكنك العثور عليها في \"%s\". إظهار رموز البدء والانتهاء @@ -3800,7 +3802,7 @@ التعديل الأخير استيراد المسار فتح مسار موجود - إنشاء طريق جديد + إنشاء مسار جديد حدد المسار للفتح. تم الكتابة فوق المسار @@ -3816,7 +3818,7 @@ بعد ذلك ، ألقط مسارك بأقرب طريق مسموح به باستخدام أحد أوضاع التنقل الخاصة بك لاستخدام هذا الخيار. بداية المسافة صور للشارع - إغلاق مسار الرحلة دون حفظ؟ ستفقد كل التغييرات؟ + هل أنت متأكد أنك تريد إغلاق مسار الرحلة دون حفظ؟ سوف تفقد كل التغييرات؟ في حالة الاتجاه المعاكس تسجيل المسار أثناء الملاحة حفظ كملف مسار جديد @@ -3833,10 +3835,10 @@ أضف إحداثية مسار تسجيل الرحلة حفظ كمسار - اتبع المسار + تتبع المسار اختر مسار للمتابعة اختر ملف المسار للمتابعة أو قم باستيراده من الجهاز. - حدد مساراً آخر + حدد مسارا آخر انتقل من موقعي إلى المسار نقطة المسار للتنقل بداية المسار @@ -3868,18 +3870,18 @@ اسم الملف الرجاء إضافة نقطتين على الأقل. إعادة - • ميزة تخطيط المسار المحدثة: تسمح باستخدام أنواع الملاحة المختلفة لكل جزء وكذا اظافة طرق -\n -\n• قائمة مظهر جديدة للمسارات: تحديد اللون، السماكة، اظهار أسهم التوجيه، أيقونات الانطلاق والنهاية -\n -\n• تحسين رؤية عقد الدراجات -\n -\n• المسارات قابلة للنقر عليها الان وقائمة سياق بمعلومات أساسية -\n -\n• خوارزميات بحث محسنة -\n -\n• تم تحسين خيارات متابعة المسار خلال الملاحة -\n + • ميزة تخطيط المسار المحدثة: تسمح باستخدام أنواع الملاحة المختلفة لكل جزء وكذا اظافة طرق +\n +\n• قائمة مظهر جديدة للمسارات: تحديد اللون، السماكة، اظهار أسهم التوجيه، أيقونات الانطلاق والنهاية +\n +\n• تحسين رؤية عقد الدراجات +\n +\n• المسارات قابلة للنقر عليها الان وقائمة سياق بمعلومات أساسية +\n +\n• خوارزميات بحث محسنة +\n +\n• تم تحسين خيارات متابعة المسار خلال الملاحة +\n \n• تم إصلاح المشكلات المتعلقة باستيراد/تصدير الأوضاع الشخصية \n \n @@ -3889,10 +3891,10 @@ أيقونات البدء والانتهاء شكرا لشرائك \"خطوط الكنتور\" يتم احتساب الاشتراك للفترة المحددة. قم بإلغائه في AppGallery في أي وقت تريد. - يتم الخصم من حساب AppGallery الخاص بك عند تأكيد الشراء. -\n -\nيتم تمديد الاشتراك تلقائيًا ما لم يتم إلغاؤه قبل تاريخ التجديد. سيتم الخصم من الحساب على فترة التجديد (شهر/ ثلاثة أشهر/ سنة) فقط عند تاريخ التجديد. -\n + يتم الخصم من حساب AppGallery الخاص بك عند تأكيد الشراء. +\n +\nيتم تمديد الاشتراك تلقائيًا ما لم يتم إلغاؤه قبل تاريخ التجديد. سيتم الخصم من الحساب على فترة التجديد (شهر/ ثلاثة أشهر/ سنة) فقط عند تاريخ التجديد. +\n \nيمكنك إدارة وإلغاء الاشتراكات الخاصة بك في إعدادات AppGallery. تجنب الممرات تجنب الممرات @@ -3910,7 +3912,7 @@ تم استيراد الملف بالفعل في أوسماند استخدام خوارزمية توجيه من مرحلتين A* %1$s البيانات المتوفرة فقط على الطرق ، تحتاج إلى حساب طريق باستخدام \"الطريق بين النقاط\" للحصول عليها. - في انتظار إعادة حساب الطريق + في انتظار إعادة حساب الطريق \nسيتوفر الرسم البياني بعد إعادة الحساب. للقيادة على الجليد مع طرق ومسارات مخصصة. رسم بياني @@ -3936,8 +3938,8 @@ اشتراك OsmAnd Live معلق تسجيل الدخول لخريطة الشارع المفتوح تسجيل الدخول إلى خريطة الشارع المفتوح - قم بتسجيل الدخول لرفع التغييرات الجديدة أو المعدلة. -\n + قم بتسجيل الدخول لرفع التغييرات الجديدة أو المعدلة. +\n \nإما باستخدام المصادقة أو باستخدام اسم المستخدم وكلمة المرور. سجل الدخول باسم المستخدم وكلمة المرور الحساب @@ -3954,7 +3956,7 @@ تعليق ملاحظة OSM قم بتسجيل الدخول باستخدام طريقة المصادقة الآمنة أو استخدم اسم المستخدم وكلمة المرور. إضافة صورة - سجل في + سجل في \nOpenPlaceReviews.org قم بتسجيل الدخول إلى موقع مشروع البيانات المفتوحة OpenPlaceReviews.org لرفع المزيد من الصور. إنشاء حساب جديد @@ -3970,9 +3972,9 @@ لا يوجد مساحة كافية أضف إلى مابيلاي إضافة إلى OpenPlaceReviews - يعرض صورا من عدة مصادر: -\nOpenPlaceReviews - صور POI ؛ -\nMapillary - صور على مستوى الشارع ؛ + يعرض صورا من عدة مصادر: +\nOpenPlaceReviews - صور POI ؛ +\nMapillary - صور على مستوى الشارع ؛ \nالويب / ويكيميديا - صور POI المحددة في بيانات OpenStreetMap. حدد المجموعات التي سيتم استيرادها. حدد العناصر التي سيتم استيرادها. @@ -3988,17 +3990,17 @@ تقسيم قبل تقسيم بعد إضافة شريحة جديدة - • خيار مضاف لتصدير واستيراد جميع البيانات بما في ذلك الإعدادات والموارد والأماكن الخاصة بي -\n -\n • مخطط الطريق: الرسوم البيانية لأجزاء المسار مع الطريق ، إضافة القدرة على إنشاء وتحرير مقاطع مسارات متعددة -\n -\n • تمت إضافة طريقة مصادقة آلية OAuth ل OpenStreetMap ، وواجهة مستخدم محسنة لمربعات حوار OSM -\n + • خيار مضاف لتصدير واستيراد جميع البيانات بما في ذلك الإعدادات والموارد والأماكن الخاصة بي +\n +\n • مخطط الطريق: الرسوم البيانية لأجزاء المسار مع الطريق ، إضافة القدرة على إنشاء وتحرير مقاطع مسارات متعددة +\n +\n • تمت إضافة طريقة مصادقة آلية OAuth ل OpenStreetMap ، وواجهة مستخدم محسنة لمربعات حوار OSM +\n \n • دعم ألوان مخصصة للمفضلة ونقاط لمسار الطريق \n \n - وضع التطبيق - حساب المستخدم + وضع الاستعراض + ملف تعريف المستخدم عكس جميع النقاط حدد الوضع الذي سيتم استخدامه في بدء التطبيق. آخر استخدام @@ -4030,7 +4032,7 @@ تحديد مجلد تحديد مجلد أو إضافة واحد جديد فارغ - تحليل حسب الفاصل الزمني + التحليل حسب الفواصل الزمنية (الفاصل الزمني) رفع إلى خريطة الشارع المفتوح تحرير المسار تسمية المسار @@ -4080,7 +4082,20 @@ \nجميع بيانات OpenPlaceReview مفتوحة ومتاحة للجميع: http://openplacereviews.org/data. \n \nيمكنك قراءة المزيد على: http://openplacereviews.org - مراجعات الأمكنة + OpenPlaceReviews استخدام test.openplacereviews.org الدخول إلى OpenPlaceReviews + ماء + شتاء + الثلج + ركوب + سباق + دراجة جبلية + دراجة + مشي + الجري + مشي + الطرق الوعرة + دراجة نارية + سيارة \ No newline at end of file diff --git a/OsmAnd/res/values-eo/phrases.xml b/OsmAnd/res/values-eo/phrases.xml index fd389f4538..a6ca5bed0f 100644 --- a/OsmAnd/res/values-eo/phrases.xml +++ b/OsmAnd/res/values-eo/phrases.xml @@ -3881,4 +3881,14 @@ Ponto por vespertoj Trairejo por sovaĝaj bestoj Naĝejo natura + Stato de skivojo: fermita + Stato de skivojo: malfermita + Kontrolata: ne + Kontrolata: jes + Senarbigita: jes + Nomo de skivojo + Skisaltejo + Movebla biblioteko (haltloko) + Pint‑taglibro: ne + Pint‑taglibro: jes \ No newline at end of file diff --git a/OsmAnd/res/values-eo/strings.xml b/OsmAnd/res/values-eo/strings.xml index da7a929cf2..def12120ad 100644 --- a/OsmAnd/res/values-eo/strings.xml +++ b/OsmAnd/res/values-eo/strings.xml @@ -4020,4 +4020,17 @@ OpenPlaceReviews Uzi test.openplacereviews.org Ensaluti al OpenPlaceReviews + Akvo + Vintro + Motorsledo + Rajdado + Kurkonkurso + Montbiciklo + Biciklado + Marŝado + Kurado + Piedirado + Ekstervoje + Motorciklo + Aŭto \ No newline at end of file diff --git a/OsmAnd/res/values-fr/strings.xml b/OsmAnd/res/values-fr/strings.xml index 1f8808c5dc..33f448572b 100644 --- a/OsmAnd/res/values-fr/strings.xml +++ b/OsmAnd/res/values-fr/strings.xml @@ -4005,4 +4005,13 @@ OpenPlaceReviews Utilisez test.openplacereviews.org Se connecter à OpenPlaceReviews + Eau + Hiver + Motoneige + Vélo + VTT + Randonnée + Course à pied + Marche + Voiture \ No newline at end of file diff --git a/OsmAnd/res/values-hu/phrases.xml b/OsmAnd/res/values-hu/phrases.xml index b4ca7f9b08..b8a0cd6817 100644 --- a/OsmAnd/res/values-hu/phrases.xml +++ b/OsmAnd/res/values-hu/phrases.xml @@ -54,7 +54,7 @@ Autógumi-szerelő Autómosó Benzinkút;Töltőállomás;Gázolajtöltő-állomás - Elektromos töltőállomás + Elektromos töltőállomás;Elektromos autó töltése;Villanyautó töltése;Elektromos töltőpont Sűrített levegő Parkoló Motorkerékpár-parkoló @@ -3879,4 +3879,14 @@ Denevéralagút Denevérhíd Vadátjáró + Csúcsnapló nincs + Csúcsnapló van + Hegyi mentő nincs + Hegyi mentő van + Erdei pálya + Mozgó könyvtár tartózkodási helye + Pálya állapota: zárva + Pálya állapota: nyitva + Pálya neve + Síugrósánc \ No newline at end of file diff --git a/OsmAnd/res/values-is/phrases.xml b/OsmAnd/res/values-is/phrases.xml index e2ee6f1cb3..459a777d6c 100644 --- a/OsmAnd/res/values-is/phrases.xml +++ b/OsmAnd/res/values-is/phrases.xml @@ -3881,4 +3881,14 @@ Brú fyrir leðurblökur Þverun villtra dýra Sundsvæði + Stæði fyrir bókabíl + Skráning á tind: nei + Skráning á tind: já + Staða brautar: lokuð + Staða brautar: opin + Eftirlit: nei + Eftirlit: já + Skafið: já + Heiti brautar + Skíðastökk \ No newline at end of file diff --git a/OsmAnd/res/values-is/strings.xml b/OsmAnd/res/values-is/strings.xml index ebb0385e37..4b92baf978 100644 --- a/OsmAnd/res/values-is/strings.xml +++ b/OsmAnd/res/values-is/strings.xml @@ -3972,7 +3972,7 @@ Veldu möppu Veldu möppu eða bættu við nýrri Tómt - Greina eftir millibilum (uppskipting millibila) + Greina eftir uppskiptingu millibila Senda inn í OpenStreetMap Breyta ferli Endurnefna feril @@ -4005,4 +4005,32 @@ Fjallahjól Villa í netþjóni: %1$s Nafnið er þegar til staðar + Eyða þessari leiðagerð á netinu\? + Lesa óstytt + Breyta lýsingu + Eyða ferilpunktum + Afrita í kortamerki + Afrita í eftirlæti + Sendi inn + Innsendingu er lokið + Sendi inn %1$d af %2$d + Sent inn %1$d af %2$d + Veldu breytingar til að senda inn + Hæðaskygging / Halli / Hæðarlínur + OpenPlaceReviews + Nota test.openplacereviews.org + Skrá inn á OpenPlaceReviews + Vatn + Vetur + Vélsleðar + Útreiðar + Kappakstur + Fjallahjól + Hjólreiðar + Gönguferðir + Hlaup + Gangandi + Utanvegaakstur + Vélhjól + Akandi \ No newline at end of file diff --git a/OsmAnd/res/values-iw/strings.xml b/OsmAnd/res/values-iw/strings.xml index d91880e6d1..02eb125d47 100644 --- a/OsmAnd/res/values-iw/strings.xml +++ b/OsmAnd/res/values-iw/strings.xml @@ -3970,7 +3970,7 @@ בחירת תקינה נא לבחור תיקייה או להוסיף אחת חדשה ריק - ניתוח לפי מרווחים (פיצול מרווחים) + ניתוח מרווחי פיצול העלאה ל־OpenStreetMap עריכת מסלול שינוי שם מסלול @@ -4016,4 +4016,11 @@ OpenPlaceReviews להשתמש ב־test.openplacereviews.org כניסה ל־OpenPlaceReviews + זמן ההכרזה של ההנחיות הקוליות השונות תלוי בסוג ההכרזה, במהירות הניווט הנוכחית ובמהירות הניווט כבררת מחדל. + הצללה / מדרון / קווי מתאר + OpenPlaceReviews הוא מיזם בהובלת הקהילה בנוגע למקומות ציבוריים כגון מסעדות, מלונות, מוזיאונים ונקודות דרך. הוא אוסף מידע ציבורי עליהם כגון תמונות, סקירות, קישורים למערכות אחרות שמקושרות ל־OpenStreetMap, ויקיפדיה. +\n +\nכל הנתונים של OpenPlaceReview הם פתוחים וזמינים לציבור הרחב: http://openplacereviews.org/data. +\n +\nניתן לקרוא עוד באתר: http://openplacereviews.org \ No newline at end of file diff --git a/OsmAnd/res/values-tr/phrases.xml b/OsmAnd/res/values-tr/phrases.xml index b76cd1cada..5c3b4f7a6c 100644 --- a/OsmAnd/res/values-tr/phrases.xml +++ b/OsmAnd/res/values-tr/phrases.xml @@ -502,7 +502,7 @@ Tırmanma Kriket Kroket - Bisiklete binme + Bisiklet sürme Dalış Tüplü dalış Köpek yarışı diff --git a/OsmAnd/res/values-tr/strings.xml b/OsmAnd/res/values-tr/strings.xml index 1f9d208ac4..cdb2e6571f 100644 --- a/OsmAnd/res/values-tr/strings.xml +++ b/OsmAnd/res/values-tr/strings.xml @@ -2227,7 +2227,7 @@ İşaretleyicilerinizi şu GPX dosyasına aktarın: Haritada yön gösterici okları göster OsmAnd seçilmiş profil için rotalı noktalara bağlanacak. - Lütfen en az bir nokta ekleyiniz. + Lütfen en az bir nokta ekleyin. Haritayı görüntüle ve nokta ekle Kaydedilmiş izlenen yolları aylık klasörlerde depola Resimleri göndericiye, tarihe ya da türüne göre filtreleyin. Sadece yakın mesafe yakınlaştırmasında etkin. @@ -3738,7 +3738,7 @@ Koyu Son düzenleme Yolu içe aktar - Mevcut yolu aç + Var olan yolu aç Yeni güzergah oluştur Açmak için bir yol dosyası seçin. Bitti @@ -3968,7 +3968,7 @@ Klasör seç Klasör seçin veya yeni bir tane ekleyin Boş - Aralıklara göre analiz et (bölme aralığı) + Bölünmüş aralıkları analiz et OpenStreetMap\'e yükle Yolu düzenle Yolu yeniden adlandır @@ -4012,4 +4012,26 @@ %1$d / %2$d karşıya yükleniyor %1$d / %2$d karşıya yüklendi Karşıya yüklenecek düzenlemeleri seçin + tepe gölgesi / yamaç / eş yükselti eğrileri + OpenPlaceReviews, restoranlar, oteller, müzeler, ara noktalar gibi halka açık yerler hakkında topluluk tarafından yürütülen bir projedir. Fotoğraflar, yorumlar, OpenStreetMap, Wikipedia gibi diğer sistemlere bağlantılar gibi onlar hakkındaki tüm halka açık bilgileri toplar. +\n +\nTüm OpenPlaceReview verileri açık ve herkes tarafından kullanılabilir: http://openplacereviews.org/data +\n +\nDaha fazlasını şu adresten okuyabilirsiniz: http://openplacereviews.org + OpenPlaceReviews + test.openplacereviews.org adresini kullan + OpenPlaceReviews\'te oturum aç + Su + Kış + Kar arabası + Binme + Yarış + Dağ bisikleti + Bisiklet sürme + Yürüyüş + Koşma + Yürüme + Arazi + Motosiklet + Araba \ No newline at end of file diff --git a/OsmAnd/res/values-zh-rCN/strings.xml b/OsmAnd/res/values-zh-rCN/strings.xml index 9550f1fb9c..97e514b125 100644 --- a/OsmAnd/res/values-zh-rCN/strings.xml +++ b/OsmAnd/res/values-zh-rCN/strings.xml @@ -2663,7 +2663,7 @@ 旅游书 下载图片 黑色 - + 木头 地铁 骑马 品红色 @@ -2674,7 +2674,7 @@ 兴趣点(POI) 容量 金属 - 路径 + 走道 直升机 滑雪 滑雪 @@ -2839,7 +2839,7 @@ 显示关闭的注记 关闭的OSM注记 添加在线资源 - + 驮道 砾石 比利时石砌路 允许专家路线 @@ -3124,4 +3124,79 @@ 添加轨迹航点 将轨迹记录到GPX文件 当应用程序被杀死时,跟踪日志将被暂停(通过最近的应用程序)。(OsmAnd背景指示会从Android通知栏中消失)。 + 添加在线路线引擎 + 编辑在线路线引擎 + 子类型 + 车辆 + API 密钥 + 服务器 URL + 输入参数 + 否则请保持空白 + 测试路线计算 + 驾驶 + 汽车 + 复制地址 + 在线路线引擎 + 在线路线引擎 + 文件夹 + 选择文件夹 + 选择文件夹或添加新文件夹 + 上传到 OpenStreetMap + 编辑轨迹 + 重命名轨迹 + 更改文件夹 + + 通过 + 长时间准备 + 准备 + 偏离路线 + 到达目的地 + 转弯 + 时间和距离间隔 + 不同语音提示的公告时间取决于提示类型、当前导航速度和默认导航速度。 + 公告时间 + 开始录制 + 在地图上显示轨迹 + 轮椅 + 徒步 + 步行 + 电动自行车 + 山地自行车 + 公路自行车 + 重型货车 + 小型卡车 + 卡车 + 踏板车 + 竞速自行车 + 山地车 + 服务器错误:%1$s + 删除这个在线路线引擎? + 名字已经存在 + 阅读全文 + 编辑描述 + 删除航点 + 复制到地图标记 + 复制到收藏 + 上传中 + 上传完成 + 正在上传 %1$d,共 %2$d + 选择要上传的编辑 + 已上传 %1$d,共 %2$d + 山体阴影/斜坡/等高线 + OpenPlaceReviews 是一个社区驱动的项目,关于公共场所,如餐馆,酒店,博物馆,航点。它收集了所有关于它们的公共信息,如照片、评论、链接到其他系统的 OpenStreetMap、维基百科。 +\n +\n所有 OpenPlaceReview 的数据都是开放的,所有人都可以使用:http://openplacereviews.org/data。 +\n +\n你可以在以下网站阅读更多信息:http://openplacereviews.org + OpenPlaceReviews + 使用 test.openplacereviews.org + 登录 OpenPlaceReviews + 冬季 + 雪地摩托 + 骑行 + 骑车 + 健行 + 跑步 + 步行 + 摩托车 \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java index edec4eeb2f..e0efd25a7e 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenu.java @@ -36,6 +36,7 @@ import net.osmand.data.LatLon; import net.osmand.data.QuadRect; import net.osmand.data.RotatedTileBox; import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem; +import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.UiUtilities; @@ -66,6 +67,8 @@ public class TrackDetailsMenu { @Nullable private GpxDisplayItem gpxItem; @Nullable + private SelectedGpxFile selectedGpxFile; + @Nullable private TrackDetailsBarController toolbarController; @Nullable private TrkSegment segment; @@ -101,6 +104,15 @@ public class TrackDetailsMenu { this.gpxItem = gpxItem; } + @Nullable + public SelectedGpxFile getSelectedGpxFile() { + return selectedGpxFile; + } + + public void setSelectedGpxFile(@NonNull SelectedGpxFile selectedGpxFile) { + this.selectedGpxFile = selectedGpxFile; + } + public boolean isVisible() { return visible; } @@ -539,7 +551,7 @@ public class TrackDetailsMenu { } } - public boolean shouldShowXAxisPoints () { + public boolean shouldShowXAxisPoints() { return true; } @@ -707,18 +719,19 @@ public class TrackDetailsMenu { if (gpxItem.chartTypes != null && gpxItem.chartTypes.length > 0) { for (int i = 0; i < gpxItem.chartTypes.length; i++) { OrderedLineDataSet dataSet = null; + boolean withoutGaps = selectedGpxFile != null && (!selectedGpxFile.isJoinSegments() && gpxItem.isGeneralTrack()); switch (gpxItem.chartTypes[i]) { case ALTITUDE: dataSet = GpxUiHelper.createGPXElevationDataSet(app, chart, analysis, - gpxItem.chartAxisType, false, true, false); + gpxItem.chartAxisType, false, true, withoutGaps); break; case SPEED: dataSet = GpxUiHelper.createGPXSpeedDataSet(app, chart, analysis, - gpxItem.chartAxisType, gpxItem.chartTypes.length > 1, true, false); + gpxItem.chartAxisType, gpxItem.chartTypes.length > 1, true, withoutGaps); break; case SLOPE: dataSet = GpxUiHelper.createGPXSlopeDataSet(app, chart, analysis, - gpxItem.chartAxisType, null, gpxItem.chartTypes.length > 1, true, false); + gpxItem.chartAxisType, null, gpxItem.chartTypes.length > 1, true, withoutGaps); break; } if (dataSet != null) { diff --git a/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java b/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java index 59cd460bcc..0e005b0d8c 100644 --- a/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java +++ b/OsmAnd/src/net/osmand/plus/track/GpxBlockStatisticsBuilder.java @@ -1,10 +1,10 @@ package net.osmand.plus.track; import android.graphics.drawable.Drawable; +import android.os.Handler; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.ColorInt; @@ -12,21 +12,19 @@ import androidx.annotation.ColorRes; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.appcompat.widget.AppCompatImageView; -import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import net.osmand.AndroidUtils; +import net.osmand.GPXUtilities.GPXFile; import net.osmand.GPXUtilities.GPXTrackAnalysis; -import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup; import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem; -import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType; import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile; import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; -import net.osmand.plus.UiUtilities; import net.osmand.plus.helpers.AndroidUiHelper; +import net.osmand.plus.helpers.GpxUiHelper; import net.osmand.plus.helpers.GpxUiHelper.GPXDataSetType; import net.osmand.plus.myplaces.SegmentActionsListener; import net.osmand.plus.widgets.TextViewEx; @@ -40,101 +38,134 @@ public class GpxBlockStatisticsBuilder { private final OsmandApplication app; private RecyclerView blocksView; private final SelectedGpxFile selectedGpxFile; - private final TrackDisplayHelper displayHelper; - private final GpxDisplayItemType[] filterTypes = {GpxDisplayItemType.TRACK_SEGMENT}; - public GpxBlockStatisticsBuilder(OsmandApplication app, SelectedGpxFile selectedGpxFile, TrackDisplayHelper displayHelper) { + private BlockStatisticsAdapter adapter; + private final List items = new ArrayList<>(); + + private final Handler handler = new Handler(); + private Runnable updatingItems; + private boolean updateRunning = false; + + public GpxBlockStatisticsBuilder(OsmandApplication app, SelectedGpxFile selectedGpxFile) { this.app = app; this.selectedGpxFile = selectedGpxFile; - this.displayHelper = displayHelper; } public void setBlocksView(RecyclerView blocksView) { this.blocksView = blocksView; } - private GPXTrackAnalysis getAnalysis() { - return selectedGpxFile.getTrackAnalysis(app); + private GpxDisplayItem getDisplayItem(GPXFile gpxFile) { + return GpxUiHelper.makeGpxDisplayItem(app, gpxFile); + } + + private GPXFile getGPXFile() { + return selectedGpxFile.getGpxFile(); } public void initStatBlocks(SegmentActionsListener actionsListener, @ColorInt int activeColor, boolean nightMode) { - GPXTrackAnalysis analysis = getAnalysis(); - float totalDistance = analysis.totalDistance; - float timeSpan = analysis.timeSpan; - String asc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationUp, app); - String desc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationDown, app); - String avg = OsmAndFormatter.getFormattedSpeed(analysis.avgSpeed, app); - String max = OsmAndFormatter.getFormattedSpeed(analysis.maxSpeed, app); - List items = new ArrayList<>(); - - prepareData(analysis, items, app.getString(R.string.distance), OsmAndFormatter.getFormattedDistance(totalDistance, app), - R.drawable.ic_action_track_16, R.color.icon_color_default_light, GPXDataSetType.ALTITUDE, GPXDataSetType.SPEED, ItemType.ITEM_DISTANCE); - prepareData(analysis, items, app.getString(R.string.altitude_ascent), asc, - R.drawable.ic_action_arrow_up_16, R.color.gpx_chart_red, GPXDataSetType.SLOPE, null, ItemType.ITEM_ALTITUDE); - prepareData(analysis, items, app.getString(R.string.altitude_descent), desc, - R.drawable.ic_action_arrow_down_16, R.color.gpx_pale_green, GPXDataSetType.ALTITUDE, GPXDataSetType.SLOPE, ItemType.ITEM_ALTITUDE); - prepareData(analysis, items, app.getString(R.string.average_speed), avg, - R.drawable.ic_action_speed_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_SPEED); - prepareData(analysis, items, app.getString(R.string.max_speed), max, - R.drawable.ic_action_max_speed_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_SPEED); - prepareData(analysis, items, app.getString(R.string.shared_string_time_span), - Algorithms.formatDuration((int) (timeSpan / 1000), app.accessibilityEnabled()), - R.drawable.ic_action_time_span_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_TIME); - - if (Algorithms.isEmpty(items)) { - AndroidUiHelper.updateVisibility(blocksView, false); - } else { - final BlockStatisticsAdapter sbAdapter = new BlockStatisticsAdapter(items, actionsListener, activeColor, nightMode); + initItems(); + boolean isNotEmpty = !Algorithms.isEmpty(items); + AndroidUiHelper.updateVisibility(blocksView, isNotEmpty); + if (isNotEmpty) { + adapter = new BlockStatisticsAdapter(getDisplayItem(getGPXFile()), actionsListener, activeColor, nightMode); + adapter.setItems(items); blocksView.setLayoutManager(new LinearLayoutManager(app, LinearLayoutManager.HORIZONTAL, false)); - blocksView.setAdapter(sbAdapter); + blocksView.setAdapter(adapter); } } - public void prepareData(GPXTrackAnalysis analysis, List listItems, String title, - String value, @DrawableRes int imageResId, @ColorRes int imageColorId, + public void stopUpdatingStatBlocks() { + handler.removeCallbacks(updatingItems); + updateRunning = false; + } + + public void runUpdatingStatBlocks() { + updatingItems = new Runnable() { + @Override + public void run() { + if (adapter != null) { + initItems(); + adapter.setItems(items); + AndroidUiHelper.updateVisibility(blocksView, !Algorithms.isEmpty(items)); + } + int interval = app.getSettings().SAVE_GLOBAL_TRACK_INTERVAL.get(); + handler.postDelayed(this, Math.max(1000, interval)); + } + }; + updateRunning = handler.post(updatingItems); + } + + public void initItems() { + GPXFile gpxFile = getGPXFile(); + GpxDisplayItem gpxDisplayItem = null; + GPXTrackAnalysis analysis = null; + boolean withoutGaps = true; + if (gpxFile.tracks.size() > 0) { + gpxDisplayItem = getDisplayItem(gpxFile); + } + if (gpxDisplayItem != null) { + analysis = gpxDisplayItem.analysis; + withoutGaps = !selectedGpxFile.isJoinSegments() && gpxDisplayItem.isGeneralTrack(); + } + if (analysis != null) { + float totalDistance = withoutGaps ? analysis.totalDistanceWithoutGaps : analysis.totalDistance; + float timeSpan = withoutGaps ? analysis.timeSpanWithoutGaps : analysis.timeSpan; + String asc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationUp, app); + String desc = OsmAndFormatter.getFormattedAlt(analysis.diffElevationDown, app); + String avg = OsmAndFormatter.getFormattedSpeed(analysis.avgSpeed, app); + String max = OsmAndFormatter.getFormattedSpeed(analysis.maxSpeed, app); + + items.clear(); + prepareData(analysis, app.getString(R.string.distance), OsmAndFormatter.getFormattedDistance(totalDistance, app), + R.drawable.ic_action_track_16, R.color.icon_color_default_light, GPXDataSetType.ALTITUDE, GPXDataSetType.SPEED, ItemType.ITEM_DISTANCE); + prepareData(analysis, app.getString(R.string.altitude_ascent), asc, + R.drawable.ic_action_arrow_up_16, R.color.gpx_chart_red, GPXDataSetType.SLOPE, null, ItemType.ITEM_ALTITUDE); + prepareData(analysis, app.getString(R.string.altitude_descent), desc, + R.drawable.ic_action_arrow_down_16, R.color.gpx_pale_green, GPXDataSetType.ALTITUDE, GPXDataSetType.SLOPE, ItemType.ITEM_ALTITUDE); + prepareData(analysis, app.getString(R.string.average_speed), avg, + R.drawable.ic_action_speed_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_SPEED); + prepareData(analysis, app.getString(R.string.max_speed), max, + R.drawable.ic_action_max_speed_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_SPEED); + prepareData(analysis, app.getString(R.string.shared_string_time_span), + Algorithms.formatDuration((int) (timeSpan / 1000), app.accessibilityEnabled()), + R.drawable.ic_action_time_span_16, R.color.icon_color_default_light, GPXDataSetType.SPEED, null, ItemType.ITEM_TIME); + } + } + + public void prepareData(GPXTrackAnalysis analysis, String title, String value, + @DrawableRes int imageResId, @ColorRes int imageColorId, GPXDataSetType firstType, GPXDataSetType secondType, ItemType itemType) { StatBlock statBlock = new StatBlock(title, value, imageResId, imageColorId, firstType, secondType, itemType); switch (statBlock.itemType) { case ITEM_DISTANCE: { if (analysis.totalDistance != 0f) { - listItems.add(statBlock); + items.add(statBlock); } break; } case ITEM_ALTITUDE: { if (analysis.hasElevationData) { - listItems.add(statBlock); + items.add(statBlock); } break; } case ITEM_SPEED: { if (analysis.isSpeedSpecified()) { - listItems.add(statBlock); + items.add(statBlock); } break; } case ITEM_TIME: { if (analysis.hasSpeedData) { - listItems.add(statBlock); + items.add(statBlock); } break; } } } - private void setImageDrawable(ImageView iv, @DrawableRes Integer resId, @ColorRes int color) { - Drawable icon = resId != null ? app.getUIUtilities().getIcon(resId, color) - : UiUtilities.tintDrawable(iv.getDrawable(), getResolvedColor(color)); - iv.setImageDrawable(icon); - } - - @ColorInt - protected int getResolvedColor(@ColorRes int colorId) { - return ContextCompat.getColor(app, colorId); - } - public class StatBlock { - private final String title; private final String value; private final int imageResId; @@ -164,14 +195,16 @@ public class GpxBlockStatisticsBuilder { private class BlockStatisticsAdapter extends RecyclerView.Adapter { + private final List items = new ArrayList<>(); + private final GpxDisplayItem displayItem; + private final SegmentActionsListener actionsListener; @ColorInt private final int activeColor; - private final List statBlocks; private final boolean nightMode; - private final SegmentActionsListener actionsListener; - public BlockStatisticsAdapter(List statBlocks, SegmentActionsListener actionsListener, @ColorInt int activeColor, boolean nightMode) { - this.statBlocks = statBlocks; + public BlockStatisticsAdapter(GpxDisplayItem displayItem, SegmentActionsListener actionsListener, + @ColorInt int activeColor, boolean nightMode) { + this.displayItem = displayItem; this.actionsListener = actionsListener; this.activeColor = activeColor; this.nightMode = nightMode; @@ -179,7 +212,7 @@ public class GpxBlockStatisticsBuilder { @Override public int getItemCount() { - return statBlocks.size(); + return items.size(); } @NonNull @@ -192,46 +225,44 @@ public class GpxBlockStatisticsBuilder { @Override public void onBindViewHolder(BlockStatisticsViewHolder holder, int position) { - final StatBlock item = statBlocks.get(position); + final StatBlock item = items.get(position); holder.valueText.setText(item.value); holder.titleText.setText(item.title); + if (updateRunning) { + holder.titleText.setWidth(app.getResources().getDimensionPixelSize(R.dimen.map_route_buttons_width)); + } holder.valueText.setTextColor(activeColor); holder.titleText.setTextColor(app.getResources().getColor(R.color.text_color_secondary_light)); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - List groups = displayHelper.getDisplayGroups(filterTypes); - GpxDisplayGroup group = null; - for (GpxDisplayGroup g : groups) { - if (g.isGeneralTrack()) { - group = g; - } - } - if (group == null && !groups.isEmpty()) { - group = groups.get(0); - } - if (group != null) { - GpxDisplayItem displayItem = group.getModifiableList().get(0); - if (displayItem != null && displayItem.analysis != null) { - ArrayList list = new ArrayList<>(); - if (displayItem.analysis.hasElevationData || displayItem.analysis.isSpeedSpecified() || displayItem.analysis.hasSpeedData) { - if (item.firstType != null) { - list.add(item.firstType); - } - if (item.secondType != null) { - list.add(item.secondType); - } + GPXTrackAnalysis analysis = displayItem != null ? displayItem.analysis : null; + if (analysis != null) { + ArrayList list = new ArrayList<>(); + if (analysis.hasElevationData || analysis.isSpeedSpecified() || analysis.hasSpeedData) { + if (item.firstType != null) { + list.add(item.firstType); + } + if (item.secondType != null) { + list.add(item.secondType); } - displayItem.chartTypes = list.size() > 0 ? list.toArray(new GPXDataSetType[0]) : null; - displayItem.locationOnMap = displayItem.locationStart; - actionsListener.openAnalyzeOnMap(displayItem); } + displayItem.chartTypes = list.size() > 0 ? list.toArray(new GPXDataSetType[0]) : null; + displayItem.locationOnMap = displayItem.locationStart; + actionsListener.openAnalyzeOnMap(displayItem); } } }); - setImageDrawable(holder.imageView, item.imageResId, item.imageColorId); + Drawable icon = app.getUIUtilities().getIcon(item.imageResId, item.imageColorId); + holder.imageView.setImageDrawable(icon); AndroidUtils.setBackgroundColor(app, holder.divider, nightMode, R.color.divider_color_light, R.color.divider_color_dark); - AndroidUiHelper.updateVisibility(holder.divider, position != statBlocks.size() - 1); + AndroidUiHelper.updateVisibility(holder.divider, position != items.size() - 1); + } + + public void setItems(List items) { + this.items.clear(); + this.items.addAll(items); + notifyDataSetChanged(); } } diff --git a/OsmAnd/src/net/osmand/plus/track/OverviewCard.java b/OsmAnd/src/net/osmand/plus/track/OverviewCard.java index d0a396499d..bb56b43f89 100644 --- a/OsmAnd/src/net/osmand/plus/track/OverviewCard.java +++ b/OsmAnd/src/net/osmand/plus/track/OverviewCard.java @@ -43,12 +43,11 @@ public class OverviewCard extends BaseCard { private final SelectedGpxFile selectedGpxFile; private final GpxBlockStatisticsBuilder blockStatisticsBuilder; - public OverviewCard(@NonNull MapActivity mapActivity, @NonNull TrackDisplayHelper displayHelper, - @NonNull SegmentActionsListener actionsListener, SelectedGpxFile selectedGpxFile) { + public OverviewCard(@NonNull MapActivity mapActivity, @NonNull SegmentActionsListener actionsListener, SelectedGpxFile selectedGpxFile) { super(mapActivity); this.actionsListener = actionsListener; this.selectedGpxFile = selectedGpxFile; - blockStatisticsBuilder = new GpxBlockStatisticsBuilder(app, selectedGpxFile, displayHelper); + blockStatisticsBuilder = new GpxBlockStatisticsBuilder(app, selectedGpxFile); } @Override diff --git a/OsmAnd/src/net/osmand/plus/track/TrackMenuFragment.java b/OsmAnd/src/net/osmand/plus/track/TrackMenuFragment.java index e0e196a712..ff2ec67140 100644 --- a/OsmAnd/src/net/osmand/plus/track/TrackMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/track/TrackMenuFragment.java @@ -326,7 +326,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card } headerContainer.addView(overviewCard.getView()); } else { - overviewCard = new OverviewCard(getMapActivity(), displayHelper, this, selectedGpxFile); + overviewCard = new OverviewCard(getMapActivity(), this, selectedGpxFile); overviewCard.setListener(this); headerContainer.addView(overviewCard.build(getMapActivity())); } @@ -760,7 +760,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card segment = segments.get(0); } } - GpxDisplayItemType[] filterTypes = new GpxDisplayItemType[] {GpxDisplayItemType.TRACK_SEGMENT}; + GpxDisplayItemType[] filterTypes = new GpxDisplayItemType[]{GpxDisplayItemType.TRACK_SEGMENT}; List items = TrackDisplayHelper.flatten(displayHelper.getOriginalGroups(filterTypes)); if (segment != null && !Algorithms.isEmpty(items)) { SplitSegmentDialogFragment.showInstance(fragmentManager, displayHelper, items.get(0), segment); @@ -1013,6 +1013,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card public void openAnalyzeOnMap(GpxDisplayItem gpxItem) { TrackDetailsMenu trackDetailsMenu = getMapActivity().getTrackDetailsMenu(); trackDetailsMenu.setGpxItem(gpxItem); + trackDetailsMenu.setSelectedGpxFile(selectedGpxFile); trackDetailsMenu.show(); hide(); } @@ -1110,7 +1111,7 @@ public class TrackMenuFragment extends ContextMenuScrollFragment implements Card @Override public void gpxSavingFinished(Exception errorMessage) { if (selectedGpxFile != null) { - List groups = displayHelper.getDisplayGroups(new GpxDisplayItemType[] {GpxDisplayItemType.TRACK_SEGMENT}); + List groups = displayHelper.getDisplayGroups(new GpxDisplayItemType[]{GpxDisplayItemType.TRACK_SEGMENT}); selectedGpxFile.setDisplayGroups(groups, app); selectedGpxFile.processPoints(app); } diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelArticle.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelArticle.java index 952b85be4d..a346f496eb 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelArticle.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelArticle.java @@ -169,6 +169,26 @@ public class TravelArticle { return new String[]{md5.substring(0, 1), md5.substring(0, 2)}; } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + TravelArticle that = (TravelArticle) o; + return TravelArticleIdentifier.areLatLonEqual(that.lat, that.lon, lat, lon) && + Algorithms.objectEquals(file, that.file) && + Algorithms.stringsEqual(routeId, that.routeId) && + Algorithms.stringsEqual(routeSource, that.routeSource); + } + + @Override + public int hashCode() { + return Algorithms.hash(file, lat, lon, routeId, routeSource); + } + public static class TravelArticleIdentifier implements Parcelable { @Nullable File file; double lat; @@ -249,7 +269,7 @@ public class TravelArticle { return Algorithms.hash(file, lat, lon, routeId, routeSource); } - private static boolean areLatLonEqual(double lat1, double lon1, double lat2, double lon2) { + public static boolean areLatLonEqual(double lat1, double lon1, double lat2, double lon2) { boolean latEqual = (Double.isNaN(lat1) && Double.isNaN(lat2)) || Math.abs(lat1 - lat2) < 0.00001; boolean lonEqual = (Double.isNaN(lon1) && Double.isNaN(lon2)) || Math.abs(lon1 - lon2) < 0.00001; return latEqual && lonEqual; diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java index b53605a0bb..0fc6c232f9 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelDbHelper.java @@ -174,7 +174,7 @@ public class TravelDbHelper implements TravelHelper { } @Override - public void initializeDataToDisplay() { + public void initializeDataToDisplay(boolean resetData) { localDataHelper.refreshCachedData(); loadPopularArticles(); } @@ -292,7 +292,7 @@ public class TravelDbHelper implements TravelHelper { } String LANG_WHERE = " WHERE " + ARTICLES_COL_LANG + " = '" + language + "'"; SQLiteCursor cursor = conn.rawQuery(POP_ARTICLES_TABLE_SELECT + LANG_WHERE, null); - if(cursor == null) { + if (cursor == null) { return popularArticles; } // read popular articles @@ -549,13 +549,13 @@ public class TravelDbHelper implements TravelHelper { @Override @Nullable - public TravelArticle getArticleById(@NonNull TravelArticleIdentifier articleId, @NonNull String lang, boolean readGpx, @Nullable GpxReadCallback callback) { + public TravelArticle getArticleById(@NonNull TravelArticleIdentifier articleId, @Nullable String lang, boolean readGpx, @Nullable GpxReadCallback callback) { TravelArticle res = null; SQLiteConnection conn = openConnection(); String routeId = articleId.routeId; - if (conn != null && !Algorithms.isEmpty(routeId)) { + if (conn != null && !Algorithms.isEmpty(routeId) && lang != null) { SQLiteCursor cursor = conn.rawQuery(ARTICLES_TABLE_SELECT + " WHERE " + ARTICLES_COL_TRIP_ID + " = ? AND " - + ARTICLES_COL_LANG + " = ?", new String[] { routeId, lang }); + + ARTICLES_COL_LANG + " = ?", new String[]{routeId, lang}); if (cursor != null) { if (cursor.moveToFirst()) { res = readArticle(cursor); diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java index 967138b0bd..7e89431690 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelHelper.java @@ -3,7 +3,6 @@ package net.osmand.plus.wikivoyage.data; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import net.osmand.GPXUtilities; import net.osmand.GPXUtilities.GPXFile; import net.osmand.data.LatLon; import net.osmand.data.QuadRect; @@ -18,6 +17,7 @@ public interface TravelHelper { interface GpxReadCallback { void onGpxFileReading(); + void onGpxFileRead(@Nullable GPXFile gpxFile); } @@ -25,7 +25,7 @@ public interface TravelHelper { void initializeDataOnAppStartup(); - void initializeDataToDisplay(); + void initializeDataToDisplay(boolean resetData); boolean isAnyTravelBookPresent(); @@ -39,7 +39,7 @@ public interface TravelHelper { Map> getNavigationMap(@NonNull TravelArticle article); @Nullable - TravelArticle getArticleById(@NonNull TravelArticleIdentifier articleId, @NonNull String lang, boolean readGpx, @Nullable GpxReadCallback callback); + TravelArticle getArticleById(@NonNull TravelArticleIdentifier articleId, @Nullable String lang, boolean readGpx, @Nullable GpxReadCallback callback); @Nullable TravelArticle getArticleByTitle(@NonNull String title, @NonNull String lang, boolean readGpx, @Nullable GpxReadCallback callback); diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java index 0ca0ed8f03..2d76743c65 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/data/TravelObfHelper.java @@ -69,9 +69,7 @@ public class TravelObfHelper implements TravelHelper { public static final String ROUTE_ARTICLE = "route_article"; public static final String ROUTE_ARTICLE_POINT = "route_article_point"; public static final String ROUTE_TRACK = "route_track"; - public static final int POPULAR_ARTICLES_SEARCH_RADIUS = 100000; public static final int ARTICLE_SEARCH_RADIUS = 50000; - public static final int GPX_TRACKS_SEARCH_RADIUS = 10000; public static final int MAX_POPULAR_ARTICLES_COUNT = 30; public static final String REF_TAG = "ref"; public static final String NAME_TAG = "name"; @@ -82,6 +80,9 @@ public class TravelObfHelper implements TravelHelper { private List popularArticles = new ArrayList<>(); private final Map> cachedArticles = new ConcurrentHashMap<>(); private final TravelLocalDataHelper localDataHelper; + private int searchRadius = ARTICLE_SEARCH_RADIUS; + private int foundAmenitiesIndex = 0; + private final List> foundAmenities = new ArrayList<>(); public TravelObfHelper(OsmandApplication app) { this.app = app; @@ -99,7 +100,13 @@ public class TravelObfHelper implements TravelHelper { } @Override - public void initializeDataToDisplay() { + public void initializeDataToDisplay(boolean resetData) { + if (resetData) { + foundAmenities.clear(); + foundAmenitiesIndex = 0; + popularArticles.clear(); + searchRadius = ARTICLE_SEARCH_RADIUS; + } localDataHelper.refreshCachedData(); loadPopularArticles(); } @@ -107,38 +114,47 @@ public class TravelObfHelper implements TravelHelper { @NonNull public synchronized List loadPopularArticles() { String lang = app.getLanguage(); - List popularArticles = new ArrayList<>(); - final List> amenities = new ArrayList<>(); - final LatLon location = app.getMapViewTrackingUtilities().getMapLocation(); - for (final BinaryMapIndexReader reader : getReaders()) { - try { - searchAmenity(amenities, location, reader, POPULAR_ARTICLES_SEARCH_RADIUS, -1, ROUTE_ARTICLE); - searchAmenity(amenities, location, reader, GPX_TRACKS_SEARCH_RADIUS, 15, ROUTE_TRACK); - } catch (Exception e) { - LOG.error(e.getMessage(), e); + List popularArticles = new ArrayList<>(this.popularArticles); + if (foundAmenities.size() - foundAmenitiesIndex < MAX_POPULAR_ARTICLES_COUNT) { + final LatLon location = app.getMapViewTrackingUtilities().getMapLocation(); + for (final BinaryMapIndexReader reader : getReaders()) { + try { + searchAmenity(foundAmenities, location, reader, searchRadius, -1, ROUTE_ARTICLE); + searchAmenity(foundAmenities, location, reader, searchRadius / 5, 15, ROUTE_TRACK); + } catch (Exception e) { + LOG.error(e.getMessage(), e); + } } + if (foundAmenities.size() > 0) { + Collections.sort(foundAmenities, new Comparator>() { + @Override + public int compare(Pair article1, Pair article2) { + Amenity amenity1 = (Amenity) article1.second; + double d1 = MapUtils.getDistance(amenity1.getLocation(), location) + / (ROUTE_ARTICLE.equals(amenity1.getSubType()) ? 5 : 1); + Amenity amenity2 = (Amenity) article2.second; + double d2 = MapUtils.getDistance(amenity2.getLocation(), location) + / (ROUTE_ARTICLE.equals(amenity2.getSubType()) ? 5 : 1); + return Double.compare(d1, d2); + } + }); + } + searchRadius *= 2; } - if (amenities.size() > 0) { - Collections.sort(amenities, new Comparator>() { - @Override - public int compare(Pair article1, Pair article2) { - int d1 = (int) (MapUtils.getDistance(((Amenity) article1.second).getLocation(), location)); - int d2 = (int) (MapUtils.getDistance(((Amenity) article2.second).getLocation(), location)); - return d1 < d2 ? -1 : (d1 == d2 ? 0 : 1); - } - }); - for (Pair amenity : amenities) { - if (!Algorithms.isEmpty(amenity.second.getName(lang))) { - TravelArticle article = cacheTravelArticles(amenity.first, amenity.second, lang, false, null); - if (article != null) { - popularArticles.add(article); - if (popularArticles.size() >= MAX_POPULAR_ARTICLES_COUNT) { - break; - } + int pagesCount = popularArticles.size() / MAX_POPULAR_ARTICLES_COUNT; + while (foundAmenitiesIndex < foundAmenities.size() - 1) { + Pair amenity = foundAmenities.get(foundAmenitiesIndex); + if (!Algorithms.isEmpty(amenity.second.getName(lang))) { + TravelArticle article = cacheTravelArticles(amenity.first, amenity.second, lang, false, null); + if (article != null && !popularArticles.contains(article)) { + popularArticles.add(article); + if (popularArticles.size() >= (pagesCount + 1) * MAX_POPULAR_ARTICLES_COUNT) { + break; } } } + foundAmenitiesIndex++; } this.popularArticles = popularArticles; return popularArticles; @@ -616,8 +632,8 @@ public class TravelObfHelper implements TravelHelper { } @Override - public TravelArticle getArticleById(@NonNull TravelArticleIdentifier articleId, @NonNull String lang, - boolean readGpx, @Nullable GpxReadCallback callback) { + public TravelArticle getArticleById(@NonNull TravelArticleIdentifier articleId, @Nullable String lang, + boolean readGpx, @Nullable GpxReadCallback callback) { TravelArticle article = getCachedArticle(articleId, lang, readGpx, callback); if (article == null) { article = localDataHelper.getSavedArticle(articleId.file, articleId.routeId, lang); @@ -629,8 +645,8 @@ public class TravelObfHelper implements TravelHelper { } @Nullable - private TravelArticle getCachedArticle(@NonNull TravelArticleIdentifier articleId, @NonNull String lang, - boolean readGpx, @Nullable GpxReadCallback callback) { + private TravelArticle getCachedArticle(@NonNull TravelArticleIdentifier articleId, @Nullable String lang, + boolean readGpx, @Nullable GpxReadCallback callback) { TravelArticle article = null; Map articles = cachedArticles.get(articleId); if (articles != null) { diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreRvAdapter.java b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreRvAdapter.java index 5341edcb9d..923645b775 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreRvAdapter.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/ExploreRvAdapter.java @@ -18,8 +18,9 @@ import net.osmand.plus.wikivoyage.explore.travelcards.OpenBetaTravelCard; import net.osmand.plus.wikivoyage.explore.travelcards.OpenBetaTravelCard.OpenBetaTravelVH; import net.osmand.plus.wikivoyage.explore.travelcards.StartEditingTravelCard; import net.osmand.plus.wikivoyage.explore.travelcards.StartEditingTravelCard.StartEditingTravelVH; +import net.osmand.plus.wikivoyage.explore.travelcards.TravelButtonCard; +import net.osmand.plus.wikivoyage.explore.travelcards.TravelButtonCard.TravelButtonVH; import net.osmand.plus.wikivoyage.explore.travelcards.TravelDownloadUpdateCard; -import net.osmand.plus.wikivoyage.explore.travelcards.TravelDownloadUpdateCard.DownloadUpdateVH; import net.osmand.plus.wikivoyage.explore.travelcards.TravelGpxCard; import net.osmand.plus.wikivoyage.explore.travelcards.TravelGpxCard.TravelGpxVH; import net.osmand.plus.wikivoyage.explore.travelcards.TravelNeededMapsCard; @@ -53,12 +54,13 @@ public class ExploreRvAdapter extends RecyclerView.Adapter 0; i--) { BaseTravelCard o = items.get(i); + if (o instanceof TravelButtonCard) { + return 0; + } if (o instanceof ArticleTravelCard || o instanceof TravelGpxCard) { return i; } @@ -205,7 +210,7 @@ public class ExploreRvAdapter extends RecyclerView.Adapter mainIndexItems = new ArrayList<>(); private final List neededIndexItems = new ArrayList<>(); private boolean waitForIndexes; @@ -175,17 +175,39 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv if (!Version.isPaidVersion(app) && !OpenBetaTravelCard.isClosed()) { items.add(new OpenBetaTravelCard(activity, nightMode)); } - List popularArticles = app.getTravelHelper().getPopularArticles(); + final List popularArticles = app.getTravelHelper().getPopularArticles(); if (!popularArticles.isEmpty()) { items.add(new HeaderTravelCard(app, nightMode, getString(R.string.popular_destinations))); for (TravelArticle article : popularArticles) { if (article instanceof TravelGpx) { - items.add(new TravelGpxCard(app, nightMode, (TravelGpx) article, getActivity())); + items.add(new TravelGpxCard(app, nightMode, (TravelGpx) article, activity)); } else { items.add(new ArticleTravelCard(app, nightMode, article, activity.getSupportFragmentManager())); } } } + + TravelButtonCard travelButtonCard = new TravelButtonCard(app, nightMode); + travelButtonCard.setListener(new TravelNeededMapsCard.CardListener() { + @Override + public void onPrimaryButtonClick() { + if (activity instanceof WikivoyageExploreActivity) { + new LoadWikivoyageData((WikivoyageExploreActivity) activity,false).execute(); + } + } + + @Override + public void onSecondaryButtonClick() { + + } + + @Override + public void onIndexItemClick(IndexItem item) { + + } + }); + items.add(travelButtonCard); + items.add(new StartEditingTravelCard(activity, nightMode)); adapter.setItems(items); final DownloadIndexesThread downloadThread = app.getDownloadThread(); @@ -199,17 +221,24 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv } private void removeRedundantCards() { - if (mainIndexItem != null && mainIndexItem.isDownloaded() && !mainIndexItem.isOutdated()) { - removeDownloadUpdateCard(); - } - boolean allMapsDownloaded = true; - for (IndexItem item : neededIndexItems) { + boolean allTravelGuideDownloaded = true; + for (IndexItem item : mainIndexItems) { if (!item.isDownloaded()) { - allMapsDownloaded = false; + allTravelGuideDownloaded = false; break; } } - if (allMapsDownloaded) { + if (allTravelGuideDownloaded) { + removeDownloadUpdateCard(); + } + boolean neededMapsDownloaded = true; + for (IndexItem item : neededIndexItems) { + if (!item.isDownloaded()) { + neededMapsDownloaded = false; + break; + } + } + if (neededMapsDownloaded) { removeNeededMapsCard(); } } @@ -218,8 +247,9 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv new ProcessIndexItemsTask(this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } - private void addIndexItemCards(IndexItem mainIndexItem, List neededIndexItems) { - this.mainIndexItem = mainIndexItem; + private void addIndexItemCards(List mainIndexItem, List neededIndexItems) { + this.mainIndexItems.clear(); + this.mainIndexItems.addAll(mainIndexItem); this.neededIndexItems.clear(); this.neededIndexItems.addAll(neededIndexItems); addDownloadUpdateCard(); @@ -228,53 +258,58 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv private void addDownloadUpdateCard() { final OsmandApplication app = getMyApplication(); - if (app != null) { - final DownloadIndexesThread downloadThread = app.getDownloadThread(); - - boolean outdated = mainIndexItem != null && mainIndexItem.isOutdated(); - boolean needsDownloading = mainIndexItem != null && !mainIndexItem.isDownloaded(); - - if (!app.getTravelHelper().isAnyTravelBookPresent() || needsDownloading || (outdated && SHOW_TRAVEL_UPDATE_CARD)) { - boolean showOtherMaps = false; - if (needsDownloading) { - List items = downloadThread.getIndexes().getWikivoyageItems(); - showOtherMaps = items != null && items.size() > 1; + if (app != null && !mainIndexItems.isEmpty() && SHOW_TRAVEL_UPDATE_CARD) { + boolean outdated = isMapsOutdated(); + downloadUpdateCard = new TravelDownloadUpdateCard(app, nightMode, mainIndexItems, !outdated); + downloadUpdateCard.setListener(new TravelDownloadUpdateCard.CardListener() { + @Override + public void onPrimaryButtonClick() { + if (downloadManager != null) { + downloadManager.startDownload(getMyActivity(), getAllItemsForDownload(mainIndexItems)); + adapter.updateDownloadUpdateCard(false); + } } - downloadUpdateCard = new TravelDownloadUpdateCard(app, nightMode, !outdated); - downloadUpdateCard.setShowOtherMapsBtn(showOtherMaps); - downloadUpdateCard.setListener(new TravelDownloadUpdateCard.ClickListener() { - @Override - public void onPrimaryButtonClick() { - if (mainIndexItem != null && downloadManager != null) { - downloadManager.startDownload(getMyActivity(), mainIndexItem); - adapter.updateDownloadUpdateCard(false); - } + @Override + public void onSecondaryButtonClick() { + if (downloadUpdateCard.isDownloading()) { + app.getDownloadThread().cancelDownload(mainIndexItems); + adapter.updateDownloadUpdateCard(false); + } else { + SHOW_TRAVEL_UPDATE_CARD = false; + removeDownloadUpdateCard(); } + } - @Override - public void onSecondaryButtonClick() { - if (downloadUpdateCard.isLoading()) { - downloadThread.cancelDownload(mainIndexItem); - adapter.updateDownloadUpdateCard(false); - } else if (!downloadUpdateCard.isDownload()) { - SHOW_TRAVEL_UPDATE_CARD = false; - removeDownloadUpdateCard(); - } else if (downloadUpdateCard.isShowOtherMapsBtn()) { - Activity activity = getActivity(); - if (activity != null) { - Intent newIntent = new Intent(activity, - ((OsmandApplication) activity.getApplication()).getAppCustomization().getDownloadActivity()); - newIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); - activity.startActivity(newIntent); - } + @Override + public void onIndexItemClick(IndexItem item) { + if (item.getType() == DownloadActivityType.WIKIPEDIA_FILE && !Version.isPaidVersion(app)) { + FragmentManager fm = getFragmentManager(); + if (fm != null) { + ChoosePlanDialogFragment.showWikipediaInstance(fm); } + } else { + DownloadIndexesThread downloadThread = app.getDownloadThread(); + if (downloadThread.isDownloading(item)) { + downloadThread.cancelDownload(item); + } else if (!item.isDownloaded() && downloadManager != null) { + downloadManager.startDownload(getMyActivity(), item); + } + adapter.updateDownloadUpdateCard(false); } - }); - downloadUpdateCard.setIndexItem(mainIndexItem); - adapter.addDownloadUpdateCard(downloadUpdateCard); + } + }); + adapter.addDownloadUpdateCard(downloadUpdateCard); + } + } + + private boolean isMapsOutdated() { + for (IndexItem indexItem : mainIndexItems) { + if (indexItem.isOutdated()) { + return true; } } + return false; } private void addNeededMapsCard() { @@ -285,7 +320,7 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv @Override public void onPrimaryButtonClick() { if (downloadManager != null) { - downloadManager.startDownload(getMyActivity(), getAllItemsForDownload()); + downloadManager.startDownload(getMyActivity(), getAllItemsForDownload(neededIndexItems)); adapter.updateNeededMapsCard(false); } } @@ -323,10 +358,10 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv } } - private IndexItem[] getAllItemsForDownload() { + private IndexItem[] getAllItemsForDownload(List indexItems) { boolean paidVersion = Version.isPaidVersion(getMyApplication()); ArrayList res = new ArrayList<>(); - for (IndexItem item : neededIndexItems) { + for (IndexItem item : indexItems) { if (!item.isDownloaded() && (paidVersion || item.getType() != DownloadActivityType.WIKIPEDIA_FILE)) { res.add(item); } @@ -344,7 +379,7 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv neededMapsCard = null; } - private static class ProcessIndexItemsTask extends AsyncTask>> { + private static class ProcessIndexItemsTask extends AsyncTask, List>> { private static final DownloadActivityType[] types = new DownloadActivityType[]{ DownloadActivityType.NORMAL_FILE, @@ -354,40 +389,41 @@ public class ExploreTabFragment extends BaseOsmAndFragment implements DownloadEv private final OsmandApplication app; private final WeakReference weakFragment; - private final String fileName; - ProcessIndexItemsTask(ExploreTabFragment fragment) { app = fragment.getMyApplication(); weakFragment = new WeakReference<>(fragment); - fileName = app != null ? app.getTravelHelper().getWikivoyageFileName() : null; } @Override - protected Pair> doInBackground(Void... voids) { - if (fileName != null) { - IndexItem mainItem = app.getDownloadThread().getIndexes().getWikivoyageItem(fileName); - - List neededItems = new ArrayList<>(); - for (TravelArticle article : app.getTravelHelper().getBookmarksHelper().getSavedArticles()) { - LatLon latLon = new LatLon(article.getLat(), article.getLon()); - try { - for (DownloadActivityType type : types) { - IndexItem item = DownloadResources.findSmallestIndexItemAt(app, latLon, type); - if (item != null && !item.isDownloaded() && !neededItems.contains(item)) { - neededItems.add(item); - } - } - } catch (IOException e) { - // ignore + protected Pair, List> doInBackground(Void... voids) { + List mainItems = new ArrayList<>(); + List allWikivoyageItems = app.getDownloadThread().getIndexes().getWikivoyageItems(); + if (allWikivoyageItems != null) { + for (IndexItem item : allWikivoyageItems) { + if (!item.isDownloaded() && !mainItems.contains(item)) { + mainItems.add(item); } } - return new Pair<>(mainItem, neededItems); } - return null; + List neededItems = new ArrayList<>(); + for (TravelArticle article : app.getTravelHelper().getBookmarksHelper().getSavedArticles()) { + LatLon latLon = new LatLon(article.getLat(), article.getLon()); + try { + for (DownloadActivityType type : types) { + IndexItem item = DownloadResources.findSmallestIndexItemAt(app, latLon, type); + if (item != null && !item.isDownloaded() && !neededItems.contains(item)) { + neededItems.add(item); + } + } + } catch (IOException e) { + // ignore + } + } + return new Pair<>(mainItems, neededItems); } @Override - protected void onPostExecute(Pair> res) { + protected void onPostExecute(Pair, List> res) { ExploreTabFragment fragment = weakFragment.get(); if (res != null && fragment != null && fragment.isResumed()) { fragment.addIndexItemCards(res.first, res.second); diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/WikivoyageExploreActivity.java b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/WikivoyageExploreActivity.java index dae47525aa..bc4de7d575 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/WikivoyageExploreActivity.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/WikivoyageExploreActivity.java @@ -326,12 +326,12 @@ public class WikivoyageExploreActivity extends TabActivity implements DownloadEv public void onFinish(AppInitializer init) { WikivoyageExploreActivity activity = activityRef.get(); if (AndroidUtils.isActivityNotDestroyed(activity)) { - new LoadWikivoyageData(activity).execute(); + new LoadWikivoyageData(activity,true).execute(); } } }); } else { - new LoadWikivoyageData(this).execute(); + new LoadWikivoyageData(this,true).execute(); } } @@ -380,19 +380,21 @@ public class WikivoyageExploreActivity extends TabActivity implements DownloadEv updateFragments(); } - private static class LoadWikivoyageData extends AsyncTask { + public static class LoadWikivoyageData extends AsyncTask { private final WeakReference activityRef; private final TravelHelper travelHelper; + private final boolean resetData; - LoadWikivoyageData(WikivoyageExploreActivity activity) { + LoadWikivoyageData(WikivoyageExploreActivity activity, boolean resetData) { travelHelper = activity.getMyApplication().getTravelHelper(); activityRef = new WeakReference<>(activity); + this.resetData = resetData; } @Override protected Void doInBackground(Void... params) { - travelHelper.initializeDataToDisplay(); + travelHelper.initializeDataToDisplay(resetData); return null; } diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelButtonCard.java b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelButtonCard.java new file mode 100644 index 0000000000..fd0a48718d --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelButtonCard.java @@ -0,0 +1,56 @@ +package net.osmand.plus.wikivoyage.explore.travelcards; + +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.R; +import net.osmand.plus.UiUtilities; +import net.osmand.plus.wikivoyage.explore.travelcards.TravelNeededMapsCard.CardListener; + +public class TravelButtonCard extends BaseTravelCard { + + public static final int TYPE = 5; + private CardListener listener; + + public TravelButtonCard(OsmandApplication app, boolean nightMode) { + super(app, nightMode); + } + + public void setListener(CardListener listener) { + this.listener = listener; + } + + @Override + public void bindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder) { + if (viewHolder instanceof TravelButtonVH) { + final TravelButtonVH holder = (TravelButtonVH) viewHolder; + UiUtilities.setupDialogButton(nightMode, holder.button, UiUtilities.DialogButtonType.SECONDARY, R.string.show_more); + holder.button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (listener != null) { + listener.onPrimaryButtonClick(); + } + } + }); + } + } + + public static class TravelButtonVH extends RecyclerView.ViewHolder { + + final View button; + + public TravelButtonVH(View itemView) { + super(itemView); + button = itemView.findViewById(R.id.button); + } + } + + @Override + public int getCardType() { + return TYPE; + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelDownloadUpdateCard.java b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelDownloadUpdateCard.java index d7aaa23bb7..f4a20a83f7 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelDownloadUpdateCard.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelDownloadUpdateCard.java @@ -1,257 +1,47 @@ package net.osmand.plus.wikivoyage.explore.travelcards; -import android.graphics.drawable.Drawable; -import android.view.View; -import android.widget.ImageView; -import android.widget.ProgressBar; -import android.widget.TextView; - import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.annotation.StringRes; -import androidx.recyclerview.widget.RecyclerView; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.download.IndexItem; -import java.lang.ref.WeakReference; -import java.text.DateFormat; +import java.util.List; -public class TravelDownloadUpdateCard extends BaseTravelCard { +public class TravelDownloadUpdateCard extends TravelNeededMapsCard { public static final int TYPE = 50; - private boolean download; - private boolean showOtherMapsBtn; - private WeakReference ref; + private final boolean download; - private ClickListener listener; - - @Nullable - private IndexItem indexItem; - - private DateFormat dateFormat; - - public boolean isDownload() { - return download; - } - - public boolean isShowOtherMapsBtn() { - return showOtherMapsBtn; - } - - public void setShowOtherMapsBtn(boolean showOtherMapsBtn) { - this.showOtherMapsBtn = showOtherMapsBtn; - } - - public void setListener(ClickListener listener) { - this.listener = listener; - } - - public void setIndexItem(@Nullable IndexItem indexItem) { - this.indexItem = indexItem; - } - - public TravelDownloadUpdateCard(OsmandApplication app, boolean nightMode, boolean download) { - super(app, nightMode); + public TravelDownloadUpdateCard(@NonNull OsmandApplication app, boolean nightMode, @NonNull List items, + boolean download) { + super(app, nightMode, items); this.download = download; - dateFormat = android.text.format.DateFormat.getMediumDateFormat(app); + } + + public int getTitle() { + if (isDownloading()) { + return R.string.shared_string_downloading; + } + return download ? R.string.download_file : R.string.update_is_available; } @Override - public void bindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder) { - if (viewHolder instanceof DownloadUpdateVH) { - boolean loading = isLoading(); - DownloadUpdateVH holder = (DownloadUpdateVH) viewHolder; - this.ref = new WeakReference(holder); - holder.title.setText(getTitle(loading)); - holder.icon.setImageResource(getIconRes()); - holder.description.setText(getDescription()); - if (indexItem == null) { - holder.fileDataContainer.setVisibility(View.GONE); - } else { - holder.fileDataContainer.setVisibility(View.VISIBLE); - holder.fileIcon.setImageDrawable(getFileIcon()); - holder.fileTitle.setText(getFileTitle()); - holder.fileDescription.setText(getFileDescription()); - holder.progressBar.setVisibility(loading ? View.VISIBLE : View.GONE); - updateProgressBar(holder); - } - boolean primaryBtnVisible = updatePrimaryButton(holder, loading); - boolean secondaryBtnVisible = updateSecondaryButton(holder, loading); - holder.buttonsDivider.setVisibility(primaryBtnVisible && secondaryBtnVisible ? View.VISIBLE : View.GONE); - } - } - - public void updateProgresBar() { - if(ref != null) { - DownloadUpdateVH holder = ref.get(); - if (holder != null && holder.itemView.isShown()) { - updateProgressBar(holder); - } + public int getDescription() { + if (!isInternetAvailable()) { + return R.string.no_index_file_to_download; } + return download ? R.string.travel_card_download_descr : R.string.travel_card_update_descr; } - private void updateProgressBar(DownloadUpdateVH holder) { - if (isLoadingInProgress()) { - int progress = app.getDownloadThread().getCurrentDownloadingItemProgress(); - holder.progressBar.setProgress(progress < 0 ? 0 : progress); - } else { - holder.progressBar.setProgress(0); - } + @Override + public int getIconRes() { + return download ? R.drawable.travel_card_download_icon : R.drawable.travel_card_update_icon; } @Override public int getCardType() { return TYPE; } - - @NonNull - private String getTitle(boolean loading) { - if (loading) { - return app.getString(R.string.shared_string_downloading); - } - return app.getString(download ? R.string.download_file : R.string.update_is_available); - } - - private int getIconRes() { - return download ? R.drawable.travel_card_download_icon : R.drawable.travel_card_update_icon; - } - - @NonNull - private String getDescription() { - if (!isInternetAvailable()) { - return app.getString(R.string.no_index_file_to_download); - } - return app.getString(download ? R.string.travel_card_download_descr : R.string.travel_card_update_descr); - } - - @NonNull - private String getFileTitle() { - return indexItem == null ? "" : indexItem.getVisibleName(app, app.getRegions(), false); - } - - @NonNull - private String getFileDescription() { - StringBuilder sb = new StringBuilder(); - if (indexItem != null) { - sb.append(app.getString(R.string.file_size_in_mb, indexItem.getArchiveSizeMB())); - sb.append(" • "); - sb.append(indexItem.getRemoteDate(dateFormat)); - } - return sb.toString(); - } - - private Drawable getFileIcon() { - return getActiveIcon(R.drawable.ic_action_read_article); - } - - /** - * @return true if button is visible, false otherwise. - */ - private boolean updateSecondaryButton(DownloadUpdateVH vh, boolean loading) { - if (loading || !download || showOtherMapsBtn) { - vh.secondaryBtnContainer.setVisibility(View.VISIBLE); - vh.secondaryBtn.setText(getSecondaryBtnTextId(loading)); - vh.secondaryBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (listener != null) { - listener.onSecondaryButtonClick(); - } - } - }); - return true; - } - vh.secondaryBtnContainer.setVisibility(View.GONE); - return false; - } - - @StringRes - private int getSecondaryBtnTextId(boolean loading) { - if (loading) { - return R.string.shared_string_cancel; - } - if (!download) { - return R.string.later; - } - return R.string.download_select_map_types; - } - - /** - * @return true if button is visible, false otherwise. - */ - private boolean updatePrimaryButton(DownloadUpdateVH vh, boolean loading) { - if (!loading) { - boolean enabled = isInternetAvailable(); - vh.primaryBtnContainer.setVisibility(View.VISIBLE); - vh.primaryBtnContainer.setBackgroundResource(getPrimaryBtnBgRes(enabled)); - vh.primaryButton.setTextColor(getResolvedColor(getPrimaryBtnTextColorRes(enabled))); - vh.primaryButton.setEnabled(enabled); - vh.primaryButton.setText(download ? R.string.shared_string_download : R.string.shared_string_update); - vh.primaryButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (listener != null) { - listener.onPrimaryButtonClick(); - } - } - }); - return true; - } - vh.primaryBtnContainer.setVisibility(View.GONE); - return false; - } - - public boolean isLoading() { - return indexItem != null && app.getDownloadThread().isDownloading(indexItem); - } - - private boolean isLoadingInProgress() { - IndexItem current = app.getDownloadThread().getCurrentDownloadingItem(); - return indexItem != null && current != null && indexItem == current; - } - - public interface ClickListener { - - void onPrimaryButtonClick(); - - void onSecondaryButtonClick(); - } - - public static class DownloadUpdateVH extends RecyclerView.ViewHolder { - - final TextView title; - final ImageView icon; - final TextView description; - final View fileDataContainer; - final ImageView fileIcon; - final TextView fileTitle; - final TextView fileDescription; - final ProgressBar progressBar; - final View secondaryBtnContainer; - final TextView secondaryBtn; - final View buttonsDivider; - final View primaryBtnContainer; - final TextView primaryButton; - - @SuppressWarnings("RedundantCast") - public DownloadUpdateVH(View itemView) { - super(itemView); - title = (TextView) itemView.findViewById(R.id.title); - icon = (ImageView) itemView.findViewById(R.id.icon); - description = (TextView) itemView.findViewById(R.id.description); - fileDataContainer = itemView.findViewById(R.id.file_data_container); - fileIcon = (ImageView) itemView.findViewById(R.id.file_icon); - fileTitle = (TextView) itemView.findViewById(R.id.file_title); - fileDescription = (TextView) itemView.findViewById(R.id.file_description); - progressBar = (ProgressBar) itemView.findViewById(R.id.progress_bar); - secondaryBtnContainer = itemView.findViewById(R.id.secondary_btn_container); - secondaryBtn = (TextView) itemView.findViewById(R.id.secondary_button); - buttonsDivider = itemView.findViewById(R.id.buttons_divider); - primaryBtnContainer = itemView.findViewById(R.id.primary_btn_container); - primaryButton = (TextView) itemView.findViewById(R.id.primary_button); - } - } } diff --git a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelNeededMapsCard.java b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelNeededMapsCard.java index 505a2095f6..900c80f1a2 100644 --- a/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelNeededMapsCard.java +++ b/OsmAnd/src/net/osmand/plus/wikivoyage/explore/travelcards/TravelNeededMapsCard.java @@ -9,7 +9,9 @@ import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; +import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; +import androidx.annotation.StringRes; import androidx.recyclerview.widget.RecyclerView; import net.osmand.plus.OsmandApplication; @@ -60,8 +62,12 @@ public class TravelNeededMapsCard extends BaseTravelCard { if (viewHolder instanceof NeededMapsVH) { NeededMapsVH holder = (NeededMapsVH) viewHolder; ref = new WeakReference(holder); - holder.description.setText(isInternetAvailable() - ? R.string.maps_you_need_descr : R.string.no_index_file_to_download); + holder.title.setText(getTitle()); + holder.description.setText(getDescription()); + int iconRes = getIconRes(); + if (iconRes > 0) { + holder.icon.setImageResource(iconRes); + } adjustChildCount(holder.itemsContainer); updateView(holder); @@ -71,7 +77,23 @@ public class TravelNeededMapsCard extends BaseTravelCard { holder.buttonsDivider.setVisibility(primaryBtnVisible && secondaryBtnVisible ? View.VISIBLE : View.GONE); } } - + + @StringRes + public int getTitle() { + return R.string.maps_you_need; + } + + @StringRes + public int getDescription() { + return isInternetAvailable() + ? R.string.maps_you_need_descr : R.string.no_index_file_to_download; + } + + @DrawableRes + public int getIconRes() { + return 0; + } + public void updateView() { if (ref != null) { NeededMapsVH holder = ref.get(); @@ -227,7 +249,9 @@ public class TravelNeededMapsCard extends BaseTravelCard { public static class NeededMapsVH extends RecyclerView.ViewHolder { + final TextView title; final TextView description; + final ImageView icon; final LinearLayout itemsContainer; final View secondaryBtnContainer; final TextView secondaryBtn; @@ -238,7 +262,9 @@ public class TravelNeededMapsCard extends BaseTravelCard { @SuppressWarnings("RedundantCast") public NeededMapsVH(View itemView) { super(itemView); + title = (TextView) itemView.findViewById(R.id.title); description = (TextView) itemView.findViewById(R.id.description); + icon = (ImageView) itemView.findViewById(R.id.icon); itemsContainer = (LinearLayout) itemView.findViewById(R.id.items_container); secondaryBtnContainer = itemView.findViewById(R.id.secondary_btn_container); secondaryBtn = (TextView) itemView.findViewById(R.id.secondary_button);