mirror of
https://codeberg.org/comaps/comaps
synced 2026-01-22 02:53:59 +00:00
Compare commits
7 Commits
yannikblos
...
x7z4w-map
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
79c128a006 | ||
|
|
0c1b61bc12 | ||
|
|
c2367e2da1 | ||
|
|
1e302ac804 | ||
|
|
f6d0132513 | ||
|
|
b4e9bbb8d2 | ||
|
|
046fe903d1 |
@@ -34,63 +34,19 @@ on:
|
||||
- track_generator/**
|
||||
- xcode/**
|
||||
|
||||
env:
|
||||
SUBMODULE_CACHE_PATHS: |
|
||||
.git/modules
|
||||
3party/CMake-MetalShaderSupport
|
||||
3party/Vulkan-Headers
|
||||
3party/boost
|
||||
3party/expat
|
||||
3party/fast_double_parser
|
||||
3party/fast_obj
|
||||
3party/freetype/freetype
|
||||
3party/gflags
|
||||
3party/glaze
|
||||
3party/glfw
|
||||
3party/glm
|
||||
3party/googletest
|
||||
3party/harfbuzz/harfbuzz
|
||||
3party/icu/icu
|
||||
3party/imgui/imgui
|
||||
3party/jansson/jansson
|
||||
3party/just_gtfs
|
||||
3party/protobuf/protobuf
|
||||
3party/pugixml/pugixml
|
||||
3party/utfcpp
|
||||
tools/kothic
|
||||
tools/osmctools
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
name: Android Lint
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: codeberg.org/comaps/docker-android-sdk:ubuntu-standalone-zy-docker
|
||||
options: --user root
|
||||
steps:
|
||||
- name: Checkout sources
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Cache world map
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: data/world_mwm
|
||||
key: world-mwm
|
||||
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ env.SUBMODULE_CACHE_PATHS }}
|
||||
key: submodules-${{ hashFiles('.gitmodules') }}
|
||||
restore-keys: |
|
||||
submodules-
|
||||
|
||||
- name: Sync and update submodules
|
||||
- name: Parallel submodules checkout
|
||||
shell: bash
|
||||
run: |
|
||||
git submodule sync --recursive
|
||||
git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
||||
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
||||
|
||||
- name: Lint
|
||||
shell: bash
|
||||
@@ -100,9 +56,6 @@ jobs:
|
||||
android-check:
|
||||
name: Build Android Debug
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: codeberg.org/comaps/docker-android-sdk:ubuntu-standalone-zy-docker
|
||||
options: --user root
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
@@ -118,32 +71,23 @@ jobs:
|
||||
cancel-in-progress: true
|
||||
|
||||
steps:
|
||||
- name: Install build tools and dependencies
|
||||
shell: bash
|
||||
run: |
|
||||
sudo apt-get update -y
|
||||
sudo apt-get install -y ninja-build
|
||||
|
||||
- name: Checkout sources
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 200 # enough to get all commits for the current day
|
||||
|
||||
- name: Cache world map
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: data/world_mwm
|
||||
key: world-mwm
|
||||
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ env.SUBMODULE_CACHE_PATHS }}
|
||||
key: submodules-${{ hashFiles('.gitmodules') }}
|
||||
restore-keys: |
|
||||
submodules-
|
||||
|
||||
- name: Sync and update submodules
|
||||
- name: Parallel submodules checkout
|
||||
shell: bash
|
||||
run: |
|
||||
git submodule sync --recursive
|
||||
git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
||||
run: git submodule update --depth 1 --init --recursive --jobs=$(($(nproc) * 20))
|
||||
|
||||
- name: Configure ccache
|
||||
uses: https://github.com/hendrikmuhs/ccache-action@v1.2
|
||||
uses: hendrikmuhs/ccache-action@v1.2
|
||||
with:
|
||||
key: ${{ github.workflow }}-${{ matrix.flavor }}
|
||||
|
||||
@@ -153,11 +97,14 @@ jobs:
|
||||
env:
|
||||
CMAKE_C_COMPILER_LAUNCHER: ccache
|
||||
CMAKE_CXX_COMPILER_LAUNCHER: ccache
|
||||
run: ./gradlew -P${{ matrix.arch }} assemble${{ matrix.flavor }}
|
||||
run: |
|
||||
cmake --version
|
||||
ninja --version
|
||||
./gradlew -P${{ matrix.arch }} assemble${{ matrix.flavor }}
|
||||
|
||||
- name: Upload ${{ matrix.flavor }} apk
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: android-${{ matrix.flavor }}
|
||||
path: android/app/build/outputs/apk/**/*.apk
|
||||
path: android/app/build/outputs/apk/**/OrganicMaps-*.apk
|
||||
if-no-files-found: error
|
||||
|
||||
@@ -1,23 +1,13 @@
|
||||
name: compare_subways
|
||||
name: process_subways
|
||||
on:
|
||||
workflow_dispatch: # Manual trigger
|
||||
inputs:
|
||||
subways-branch:
|
||||
description: 'Check out a different subways repo branch?'
|
||||
required: true
|
||||
type: string
|
||||
default: master
|
||||
schedule:
|
||||
# Run daily at 00:00 UTC
|
||||
- cron: '0 0 * * *'
|
||||
|
||||
env:
|
||||
#PLANET: /home/planet/planet/planet-latest.pbf
|
||||
#TMPDIR: /tmp
|
||||
PLANET: /home/planet/planet/planet.o5m
|
||||
TMPDIR: /tmp
|
||||
HTML_DIR: "/mnt/4tbexternal/osm-planet/subway/validator"
|
||||
#DUMP: "$HTML_DIR"
|
||||
#SKIP_PLANET_UPDATE: "1"
|
||||
SPREADSHEET_ID: "1SEW1-NiNOnA2qDwievcxYV1FOaQl1mb1fdeyqAxHu3k"
|
||||
DUMP: "$HTML_DIR"
|
||||
SKIP_PLANET_UPDATE: "1"
|
||||
DEBIAN_FRONTEND: nonnteractive
|
||||
TZ: Etc/UTC
|
||||
|
||||
@@ -32,69 +22,20 @@ jobs:
|
||||
volumes:
|
||||
- /mnt/4tbexternal:/mnt/4tbexternal
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-compare-subways-${{ github.event.pull_request.number || github.ref }}
|
||||
group: ${{ github.workflow }}-process-subways-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
steps:
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: "~"
|
||||
key: cache-${{ github.run_id }}-${{ github.run_attempt }}}
|
||||
- name: Checkout main repo
|
||||
shell: bash
|
||||
run: |
|
||||
echo "Cloning $FORGEJO_SERVER_URL/$FORGEJO_REPOSITORY branch $FORGEJO_REF_NAME"
|
||||
cd ~
|
||||
git clone --depth 1 -b $FORGEJO_REF_NAME --single-branch $FORGEJO_SERVER_URL/$FORGEJO_REPOSITORY.git comaps
|
||||
# --recurse-submodules --shallow-submodules
|
||||
key: cache-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
- name: Checkout subways repo
|
||||
shell: bash
|
||||
run: |
|
||||
cd ~
|
||||
git clone --depth 1 -b ${{ inputs.subways-branch }} --single-branch https://codeberg.org/comaps/subways.git
|
||||
|
||||
update-planet-pbf:
|
||||
name: Update PBF Planet
|
||||
runs-on: mapfilemaker
|
||||
container:
|
||||
image: codeberg.org/comaps/maps_generator:f6d53d54f794
|
||||
volumes:
|
||||
- /mnt/4tbexternal/:/mnt/4tbexternal/
|
||||
- /mnt/4tbexternal/osm-planet:/home/planet
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-compare-subways-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
steps:
|
||||
- name: Download Planet File if Absent
|
||||
shell: bash
|
||||
# TODO: replace wget2 with curl -Z
|
||||
run: |
|
||||
if [ ! -d /home/planet/planet/ ]; then
|
||||
mkdir -p /home/planet/planet/
|
||||
fi
|
||||
if [ ! -f /home/planet/planet/planet-latest.osm.pbf ]; then
|
||||
cd /home/planet/planet/
|
||||
wget2 --verbose --progress=bar --continue https://ftpmirror.your.org/pub/openstreetmap/pbf/planet-latest.osm.pbf
|
||||
else
|
||||
echo "planet-latest.osm.pbf was found, raw download not required."
|
||||
fi
|
||||
- name: Update PBF Planet
|
||||
shell: bash
|
||||
run: |
|
||||
cd /home/planet/planet/
|
||||
rm -f planet-latest-new.osm.pbf
|
||||
pyosmium-up-to-date planet-latest.osm.pbf -o planet-latest-new.osm.pbf -v --size 16384
|
||||
mv planet-latest-new.osm.pbf planet-latest.osm.pbf
|
||||
- name: Notify Zulip
|
||||
run: |
|
||||
curl -X POST https://comaps.zulipchat.com/api/v1/messages \
|
||||
-u $ZULIP_BOT_EMAIL:$ZULIP_API_KEY \
|
||||
--data-urlencode type=stream \
|
||||
--data-urlencode 'to="DevOps"' \
|
||||
--data-urlencode topic=codeberg-bot \
|
||||
--data-urlencode 'content=PBF planet update is done!'
|
||||
git clone --depth 1 --single-branch https://codeberg.org/comaps/subways.git
|
||||
|
||||
update-planet-o5m:
|
||||
if: false
|
||||
name: Update O5M Planet
|
||||
runs-on: mapfilemaker
|
||||
container:
|
||||
@@ -103,7 +44,7 @@ jobs:
|
||||
- /mnt/4tbexternal/:/mnt/4tbexternal/
|
||||
- /mnt/4tbexternal/osm-planet:/home/planet
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-compare-subways-${{ github.event.pull_request.number || github.ref }}
|
||||
group: ${{ github.workflow }}-process-subways-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
steps:
|
||||
- name: Check for O5M Planet File
|
||||
@@ -141,8 +82,9 @@ jobs:
|
||||
--data-urlencode topic=codeberg-bot \
|
||||
--data-urlencode 'content=O5M planet update is done!'
|
||||
|
||||
compare-subways:
|
||||
name: Compare Subways
|
||||
update-subways:
|
||||
if: inputs.run-subways
|
||||
name: Update Subways
|
||||
runs-on: mapfilemaker
|
||||
needs:
|
||||
- clone-repos
|
||||
@@ -152,19 +94,31 @@ jobs:
|
||||
- /mnt/4tbexternal/:/mnt/4tbexternal/
|
||||
- /mnt/4tbexternal/osm-planet:/home/planet
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-compare-subways-${{ github.event.pull_request.number || github.ref }}
|
||||
group: ${{ github.workflow }}-map-generator-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
steps:
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: "~"
|
||||
key: cache-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
- name: Compare Subways
|
||||
- name: Update Subways
|
||||
shell: bash
|
||||
run: |
|
||||
cd ~/comaps/
|
||||
cp tools/unix/maps/settings.sh.prod tools/unix/maps/settings.sh
|
||||
./tools/unix/maps/generate_subways.sh
|
||||
- name: Compare with VK validation
|
||||
shell: bash
|
||||
run: |
|
||||
cd ~/subways
|
||||
if [ -f "$HTML_DIR/index.html" ]; then
|
||||
echo "Comparing local validation with VK's validation..."
|
||||
python3 ./scripts/compare_html_validation.py "$HTML_DIR/index.html" \
|
||||
--vk-url "https://maps.vk.com/osm/tools/subways/latest/index.html"
|
||||
else
|
||||
echo "Local index.html not found at $HTML_DIR/index.html"
|
||||
exit 1
|
||||
fi
|
||||
- name: Notify Zulip
|
||||
run: |
|
||||
curl -X POST https://comaps.zulipchat.com/api/v1/messages \
|
||||
@@ -173,47 +127,3 @@ jobs:
|
||||
--data-urlencode 'to="DevOps"' \
|
||||
--data-urlencode topic=codeberg-bot \
|
||||
--data-urlencode 'content=Subways are done!'
|
||||
- name: Compare with VK validation
|
||||
shell: bash
|
||||
run: |
|
||||
set -e
|
||||
cd ~/subways
|
||||
if [ -f "$HTML_DIR/cities.txt" ]; then
|
||||
echo "Comparing local validation with VK's validation..."
|
||||
python3 ./scripts/compare_html_validation.py "$HTML_DIR/cities.txt" \
|
||||
--remote-url "https://maps.vk.com/osm/tools/subways/latest/cities.txt"
|
||||
else
|
||||
echo "Local cities.txt not found at $HTML_DIR/cities.txt"
|
||||
exit 1
|
||||
fi
|
||||
- name: Compare Google Sheets Data
|
||||
shell: bash
|
||||
run: |
|
||||
set -e
|
||||
|
||||
# Download the Google Sheets data
|
||||
GOOGLE_SHEETS_URL="https://docs.google.com/spreadsheets/d/${SPREADSHEET_ID}/export?format=csv"
|
||||
echo "Downloading Google Sheets data from: $GOOGLE_SHEETS_URL"
|
||||
curl -sL "$GOOGLE_SHEETS_URL" -o /tmp/google_sheets.csv
|
||||
|
||||
# Normalize line endings to avoid spurious diffs
|
||||
sed 's/\r$//' source_data/Rapid.csv > /tmp/local_normalized.csv
|
||||
sed 's/\r$//' /tmp/google_sheets.csv > /tmp/google_normalized.csv
|
||||
|
||||
# Generate unified diff
|
||||
echo ""
|
||||
echo "Differences between local Rapid.csv and Google Sheets:"
|
||||
echo ""
|
||||
|
||||
if diff -u /tmp/local_normalized.csv /tmp/google_normalized.csv > /tmp/full_diff.txt; then
|
||||
echo "No differences found! Local Rapid.csv is in sync with Google Sheets."
|
||||
exit 0
|
||||
else
|
||||
cat /tmp/full_diff.txt
|
||||
|
||||
echo ""
|
||||
echo "The above diff can be saved as a patch and applied with:"
|
||||
echo " patch source_data/Rapid.csv < patch-file"
|
||||
echo "or by manually reviewing and applying the changes."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -2,3 +2,5 @@
|
||||
480fa6c2fcf53be296504ac6ba8e6b3d70f92b42
|
||||
a6ede2b1466f0c9d8a443600ef337ba6b5832e58
|
||||
1377b81bf1cac72bb6da192da7fed6696d5d5281
|
||||
b4e9bbb8d2e24a2829defe7753590df4a937dac0
|
||||
f6d01325136c4d65e20763d0e1e9b32b94571bba
|
||||
|
||||
3
.github/workflows/android-check.yaml
vendored
3
.github/workflows/android-check.yaml
vendored
@@ -1,6 +1,9 @@
|
||||
name: Android Check
|
||||
on:
|
||||
workflow_dispatch: # Manual trigger
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
env:
|
||||
JAVA_HOME: /usr/lib/jvm/temurin-21-jdk-amd64 # Java 21 is required for Android Gradle 8 plugin
|
||||
|
||||
83
3party/ankerl/stl.h
Normal file
83
3party/ankerl/stl.h
Normal file
@@ -0,0 +1,83 @@
|
||||
///////////////////////// ankerl::unordered_dense::{map, set} /////////////////////////
|
||||
|
||||
// A fast & densely stored hashmap and hashset based on robin-hood backward shift deletion.
|
||||
// Version 4.8.1
|
||||
// https://github.com/martinus/unordered_dense
|
||||
//
|
||||
// Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright (c) 2022 Martin Leitner-Ankerl <martin.ankerl@gmail.com>
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
|
||||
#ifndef ANKERL_STL_H
|
||||
#define ANKERL_STL_H
|
||||
|
||||
#include <array> // for array
|
||||
#include <cstdint> // for uint64_t, uint32_t, std::uint8_t, UINT64_C
|
||||
#include <cstring> // for size_t, memcpy, memset
|
||||
#include <functional> // for equal_to, hash
|
||||
#include <initializer_list> // for initializer_list
|
||||
#include <iterator> // for pair, distance
|
||||
#include <limits> // for numeric_limits
|
||||
#include <memory> // for allocator, allocator_traits, shared_ptr
|
||||
#include <optional> // for optional
|
||||
#include <stdexcept> // for out_of_range
|
||||
#include <string> // for basic_string
|
||||
#include <string_view> // for basic_string_view, hash
|
||||
#include <tuple> // for forward_as_tuple
|
||||
#include <type_traits> // for enable_if_t, declval, conditional_t, ena...
|
||||
#include <utility> // for forward, exchange, pair, as_const, piece...
|
||||
#include <vector> // for vector
|
||||
|
||||
// <memory_resource> includes <mutex>, which fails to compile if
|
||||
// targeting GCC >= 13 with the (rewritten) win32 thread model, and
|
||||
// targeting Windows earlier than Vista (0x600). GCC predefines
|
||||
// _REENTRANT when using the 'posix' model, and doesn't when using the
|
||||
// 'win32' model.
|
||||
#if defined __MINGW64__ && defined __GNUC__ && __GNUC__ >= 13 && !defined _REENTRANT
|
||||
// _WIN32_WINNT is guaranteed to be defined here because of the
|
||||
// <cstdint> inclusion above.
|
||||
# ifndef _WIN32_WINNT
|
||||
# error "_WIN32_WINNT not defined"
|
||||
# endif
|
||||
# if _WIN32_WINNT < 0x600
|
||||
# define ANKERL_MEMORY_RESOURCE_IS_BAD() 1 // NOLINT(cppcoreguidelines-macro-usage)
|
||||
# endif
|
||||
#endif
|
||||
#ifndef ANKERL_MEMORY_RESOURCE_IS_BAD
|
||||
# define ANKERL_MEMORY_RESOURCE_IS_BAD() 0 // NOLINT(cppcoreguidelines-macro-usage)
|
||||
#endif
|
||||
|
||||
#if defined(__has_include) && !defined(ANKERL_UNORDERED_DENSE_DISABLE_PMR)
|
||||
# if __has_include(<memory_resource>) && !ANKERL_MEMORY_RESOURCE_IS_BAD()
|
||||
# define ANKERL_UNORDERED_DENSE_PMR std::pmr // NOLINT(cppcoreguidelines-macro-usage)
|
||||
# include <memory_resource> // for polymorphic_allocator
|
||||
# elif __has_include(<experimental/memory_resource>)
|
||||
# define ANKERL_UNORDERED_DENSE_PMR std::experimental::pmr // NOLINT(cppcoreguidelines-macro-usage)
|
||||
# include <experimental/memory_resource> // for polymorphic_allocator
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER) && defined(_M_X64)
|
||||
# include <intrin.h>
|
||||
# pragma intrinsic(_umul128)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
2239
3party/ankerl/unordered_dense.h
Normal file
2239
3party/ankerl/unordered_dense.h
Normal file
File diff suppressed because it is too large
Load Diff
@@ -22,8 +22,8 @@
|
||||
<a href="https://codeberg.org/comaps/comaps/src/branch/main/LICENSE">
|
||||
<img src="https://img.shields.io/github/license/comaps/comaps?style=for-the-badge&logo=opensourceinitiative&logoColor=white&color=588157" alt="License"/>
|
||||
</a>
|
||||
<a href="https://codeberg.org/comaps/comaps/actions?workflow=android-check.yaml">
|
||||
<img src="https://codeberg.org/comaps/comaps/badges/workflows/android-check.yaml/badge.svg?label=Android%20Build&logo=android&logoColor=white&style=for-the-badge" alt="Android Build Status"/>
|
||||
<a href="https://github.com/comaps/comaps/actions/workflows/android-check.yaml">
|
||||
<img src="https://img.shields.io/github/actions/workflow/status/comaps/comaps/.github/workflows/android-check.yaml?label=Android%20Build&logo=android&logoColor=white&style=for-the-badge" alt="Android Build Status"/>
|
||||
</a>
|
||||
<a href="https://github.com/comaps/comaps/actions/workflows/ios-check.yaml">
|
||||
<img src="https://img.shields.io/github/actions/workflow/status/comaps/comaps/.github/workflows/ios-check.yaml?label=iOS%20Build&logo=apple&logoColor=white&style=for-the-badge" alt="iOS Build Status"/>
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
تطبيق خرائط مجاني ومفتوح المصدر تقوده المجتمع، مبني على بيانات OpenStreetMap ويعززه الالتزام بالشفافية والخصوصية وعدم الربح. CoMaps هو فرع/انبثاق من Organic Maps، والذي بدوره هو فرع من Maps.ME.
|
||||
|
||||
اقرأ المزيد عن أسباب المشروع واتجاهه على <b><i>codeberg.org/comaps</i></b>.
|
||||
انضم إلى المجتمع هناك وساعد في صنع أفضل تطبيق خرائط
|
||||
• استخدم التطبيق وانشر الكلمة عنه
|
||||
• قدم الملاحظات وأبلغ عن المشكلات
|
||||
• حدِّث بيانات الخرائط في التطبيق أو على موقع OpenStreetMap
|
||||
|
||||
‣ <b>مرتكز على وضع عدم الاتصال</b>: خطط وابحث عن طريقك في رحلتك بالخارج دون الحاجة إلى خدمة الهاتف الخلوي، ابحث عن نقاط الطريق أثناء التنزه البعيد، إلخ. جميع وظائف التطبيق مصممة للعمل دون اتصال.
|
||||
‣ <b>يحترم الخصوصية</b>: التطبيق مصمم مع مراعاة الخصوصية - لا يحدد هوية الأشخاص، لا يتتبع، ولا يجمع المعلومات الشخصية. خالٍ من الإعلانات.
|
||||
‣ <b>بسيط ومصقول</b>: ميزات أساسية سهلة الاستخدام تعمل ببساطة.
|
||||
‣ <b>يوفر بطاريتك ومساحتك</b>: لا يستنزف بطاريتك مثل تطبيقات الملاحة الأخرى. الخرائط المدمجة توفر مساحة ثمينة على هاتفك.
|
||||
‣ <b>مجاني ومبني من قبل المجتمع</b>: ساعد أشخاص مثلك في بناء التطبيق بإضافة أماكن إلى OpenStreetMap، واختبار الميزات وإبداء الملاحظات، والمساهمة بمهاراتهم التطويرية وأموالهم.
|
||||
‣ <b>قرارات ومالية مفتوحة وشفافة، غير ربحية ومفتوحة المصدر بالكامل.</b>
|
||||
|
||||
<b>الميزات الرئيسية</b>:
|
||||
• خرائط تفصيلية قابلة للتحميل تحتوي على أماكن غير متوفرة في خرائط Google
|
||||
• وضع خارجي مع مسارات المشي لمسافات طويلة المميزة، مواقع التخييم، مصادر المياه، القمم، خطوط الكنتور، إلخ
|
||||
• ممرات المشي ومسارات الدراجات
|
||||
• نقاط الاهتمام مثل المطاعم، محطات الوقود، الفنادق، المتاجر، المعالم السياحية والكثير غيرها
|
||||
• البحث بالاسم أو العنوان أو فئة نقطة الاهتمام
|
||||
• ملاحة مع إعلانات صوتية للمشي أو ركوب الدراجات أو القيادة
|
||||
• وضع إشارة على أماكنك المفضلة بنقرة واحدة
|
||||
• مقالات ويكيبيديا دون اتصال
|
||||
• طبقة مترو الأنفاق والتوجيهات
|
||||
• تسجيل المسار
|
||||
• تصدير واستيراد العلامات والمسارات بصيغ KML وKMZ وGPX
|
||||
• وضع الظلام للاستخدام أثناء الليل
|
||||
• تحسين بيانات الخرائط للجميع باستخدام محرر مدمج أساسي
|
||||
|
||||
<b>الحرية هنا</b>
|
||||
اكتشف رحلتك، ابحر في العالم مع وضع الخصوصية والمجتمع في المقدمة!
|
||||
@@ -1 +0,0 @@
|
||||
تنقل سهل في الخريطة - اكتشف المزيد من رحلتك - مدعوم من المجتمع
|
||||
@@ -1 +0,0 @@
|
||||
تنزه، تنقل، قُد بدون إتصال الإنترنت مع الخصوصية
|
||||
@@ -7,7 +7,7 @@ Omjunya an kemeneth ena ha gweres gul an app mappys gwella
|
||||
• Nowedhi data mappa yn an app po war an gwasiva OpenStreetMap
|
||||
|
||||
‣ <b>Fogellys war dhywarlinen</b>: Devisya ha viajya dha viaj tramor neb res rag gonis kellgowser, hwilas leow ha war unn gwandrans pell, h.e. Oll nasyow app yw desinys dhe oberi dhywarlinen.
|
||||
‣ <b>Ow Gul Revrons dhe Privetter</b>: An app yw desinys gans privetter yn brys - na aswon tus, na helerghi, ha na kuntel kedhlow personel. Heb argemynnow.
|
||||
‣ <b>Ow Gul Revrons dhe Privetter</b>: An app yw desinys gans privetter yn brys - na aswon tus, na helerghi, ha na kuntel kudhlow personel. Heb argemynnow.
|
||||
‣ <b>Sempel ha Polsys</b>: nasyow es may oberi poran.
|
||||
‣ <b>Sawya dha Batri hag Efander</b>: Na gwakhe dha batri haval dhe appys navigacyon aral. Mappys kesstrothys sawya efander precyous war dha kellgowser.
|
||||
‣ <b>Rydh ha Byldys gans an Kemeneth</b>: Tus haval dhe ty gwerys byldya an app gans owth addya leos dhe OpenStreetMap, ow previ ha dasliva a-dro nasyow hag ow kevri aga sleynethow hag arghans i.
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
تطبيق خرائط مجاني ومفتوح المصدر تقوده المجتمع، مبني على بيانات OpenStreetMap ويعززه الالتزام بالشفافية والخصوصية وعدم الربحية.
|
||||
|
||||
انضم إلى المجتمع وساعد في صنع أفضل تطبيق خرائط
|
||||
• استخدم التطبيق وانشر الكلمة عنه
|
||||
• قدم ملاحظاتك وأبلغ عن المشاكل
|
||||
• حدِّث بيانات الخريطة في التطبيق أو على موقع OpenStreetMap
|
||||
|
||||
<i>ملاحظاتك وتقييماتك الخمس نجوم هي أفضل دعم لنا!</i>
|
||||
|
||||
‣ <b>بسيط ومصقول</b>: ميزات أساسية سهلة الاستخدام تعمل ببساطة.
|
||||
‣ <b>مركز على العمل دون اتصال</b>: خطط وابحث عن طريقك في رحلاتك بالخارج دون الحاجة لخدمة الهاتف، ابحث عن نقاط الطريق خلال رحلات المشي البعيدة، إلخ. جميع وظائف التطبيق مصممة للعمل دون اتصال.
|
||||
‣ <b>يحترم الخصوصية</b>: التطبيق مصمم مع مراعاة الخصوصية - لا يعرّف الأشخاص، لا يتتبع، ولا يجمع المعلومات الشخصية. خالٍ من الإعلانات.
|
||||
‣ <b>يوفر بطاريتك ومساحتك</b>: لا يستنزف بطاريتك مثل تطبيقات الملاحة الأخرى. الخرائط المدمجة توفر مساحة ثمينة على هاتفك.
|
||||
‣ <b>مجاني ومبني بواسطة المجتمع</b>: أشخاص مثلك ساعدوا في بناء التطبيق بإضافة أماكن إلى OpenStreetMap، واختبار الميزات وإعطاء ملاحظات، والمساهبة بمهاراتهم التطويرية وأموالهم.
|
||||
‣ <b>قرارات ومالية مفتوحة وشفافة، غير ربحية ومفتوحة المصدر بالكامل.</b>
|
||||
|
||||
<b>الميزات الرئيسية</b>:
|
||||
• خرائط مفصلة قابلة للتحميل تحتوي على أماكن غير متوفرة في خرائط جوجل
|
||||
• وضع خارجي مع مسارات المشي المميزة، مواقع التخييم، مصادر المياه، القمم، خطوط الكنتور، إلخ
|
||||
• مسارات المشي ومسارات الدراجات
|
||||
• نقاط الاهتمام مثل المطاعم، محطات الوقود، الفنادق، المتاجر، المعالم السياحية والكثير غيرها
|
||||
• البحث بالاسم أو العنوان أو فئة نقطة الاهتمام
|
||||
• ملاحة مع إعلانات صوتية للمشي، ركوب الدراجات، أو القيادة
|
||||
• وضع إشارة على أماكنك المفضلة بنقرة واحدة
|
||||
• مقالات ويكيبيديا دون اتصال
|
||||
• طبقة مترو الأنفاق وإرشادات الاتجاهات
|
||||
• تسجيل المسار
|
||||
• تصدير واستيراد العلامات والمسارات بصيغ KML، KMZ، GPX
|
||||
• وضع مظلم للاستخدام خلال الليل
|
||||
• تحسين بيانات الخريطة للجميع باستخدام محرر مدمج أساسي
|
||||
• دعم Android Auto
|
||||
|
||||
يرجى الإبلاغ عن مشاكل التطبيق، اقتراح أفكار والانضمام إلى مجتمعنا على موقع <b><i>comaps.app</i></b>.
|
||||
|
||||
<b>الحرية هنا</b>
|
||||
اكتشف رحلتك، ابحر في العالم مع وضع الخصوصية والمجتمع في المقدمة!
|
||||
@@ -1 +0,0 @@
|
||||
تنقل سهل في الخريطة - اكتشف المزيد من رحلتك - مدعوم من المجتمع
|
||||
@@ -1 +0,0 @@
|
||||
CoMaps - التنقل مع الخصوصية
|
||||
@@ -1 +0,0 @@
|
||||
Проста навігація по мапі - Дізнайтеся більше про свою подорож - Розроблено спільнотою
|
||||
@@ -1 +0,0 @@
|
||||
Приватна навігація
|
||||
@@ -400,14 +400,8 @@
|
||||
android:name="app.organicmaps.settings.SettingsActivity"
|
||||
android:configChanges="orientation|screenLayout|screenSize"
|
||||
android:screenOrientation="fullUser"
|
||||
android:exported="true"
|
||||
android:label="@string/settings"
|
||||
android:parentActivityName="app.organicmaps.MwmActivity" >
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.APPLICATION_PREFERENCES"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
android:parentActivityName="app.organicmaps.MwmActivity" />
|
||||
|
||||
<activity
|
||||
android:name="app.organicmaps.help.HelpActivity"
|
||||
|
||||
@@ -28,7 +28,6 @@ import com.github.mikephil.charting.formatter.IAxisValueFormatter;
|
||||
import com.github.mikephil.charting.highlight.Highlight;
|
||||
import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
|
||||
@@ -18,7 +18,6 @@ import android.location.Location;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.contract.ActivityResultContracts;
|
||||
import androidx.annotation.CallSuper;
|
||||
@@ -26,13 +25,6 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.core.view.ViewCompat;
|
||||
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.checkbox.MaterialCheckBox;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.progressindicator.LinearProgressIndicator;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.base.BaseMwmFragmentActivity;
|
||||
import app.organicmaps.dialog.CustomMapServerDialog;
|
||||
import app.organicmaps.downloader.MapManagerHelper;
|
||||
@@ -47,7 +39,11 @@ import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.checkbox.MaterialCheckBox;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.progressindicator.LinearProgressIndicator;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
@@ -259,7 +255,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
||||
|
||||
mProgress.setMax(bytes);
|
||||
// Start progress at 1% according to M3 guidelines
|
||||
mProgress.setProgressCompat(bytes/100, true);
|
||||
mProgress.setProgressCompat(bytes / 100, true);
|
||||
}
|
||||
else
|
||||
finishFilesDownload(bytes);
|
||||
@@ -275,11 +271,8 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
||||
mChbDownloadCountry = findViewById(R.id.chb_download_country);
|
||||
mBtnAdvanced = findViewById(R.id.btn_advanced);
|
||||
|
||||
mBtnAdvanced.setOnClickListener(v -> {
|
||||
CustomMapServerDialog.show(this, url -> {
|
||||
prepareFilesDownload(false);
|
||||
});
|
||||
});
|
||||
mBtnAdvanced.setOnClickListener(
|
||||
v -> { CustomMapServerDialog.show(this, url -> { prepareFilesDownload(false); }); });
|
||||
mBtnAdvanced.setEnabled(true);
|
||||
|
||||
mBtnListeners = new View.OnClickListener[BTN_COUNT];
|
||||
@@ -394,7 +387,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
||||
mTvMessage.setText(getString(R.string.downloading_country_can_proceed, item.name, fileSizeString));
|
||||
mProgress.setMax((int) item.totalSize);
|
||||
// Start progress at 1% according to M3 guidelines
|
||||
mProgress.setProgressCompat((int) (item.totalSize/100), true);
|
||||
mProgress.setProgressCompat((int) (item.totalSize / 100), true);
|
||||
|
||||
mCountryDownloadListenerSlot = MapManager.nativeSubscribe(mCountryDownloadListener);
|
||||
MapManagerHelper.startDownload(mCurrentCountry);
|
||||
@@ -446,21 +439,18 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity
|
||||
default -> throw new AssertionError("Unexpected result code = " + result);
|
||||
};
|
||||
|
||||
mAlertDialog = new MaterialAlertDialogBuilder(this)
|
||||
.setTitle(titleId)
|
||||
.setMessage(messageId)
|
||||
.setCancelable(true)
|
||||
.setOnCancelListener((dialog) -> setAction(RESUME))
|
||||
.setPositiveButton(R.string.try_again,
|
||||
(dialog, which) -> {
|
||||
setAction(TRY_AGAIN);
|
||||
onTryAgainClicked();
|
||||
})
|
||||
.setNegativeButton(R.string.cancel,
|
||||
(dialog, which) -> {
|
||||
setAction(RESUME);
|
||||
})
|
||||
.setOnDismissListener(dialog -> mAlertDialog = null)
|
||||
.show();
|
||||
mAlertDialog = new MaterialAlertDialogBuilder(this)
|
||||
.setTitle(titleId)
|
||||
.setMessage(messageId)
|
||||
.setCancelable(true)
|
||||
.setOnCancelListener((dialog) -> setAction(RESUME))
|
||||
.setPositiveButton(R.string.try_again,
|
||||
(dialog, which) -> {
|
||||
setAction(TRY_AGAIN);
|
||||
onTryAgainClicked();
|
||||
})
|
||||
.setNegativeButton(R.string.cancel, (dialog, which) -> { setAction(RESUME); })
|
||||
.setOnDismissListener(dialog -> mAlertDialog = null)
|
||||
.show();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,8 +38,9 @@ public class OsmUploadWork extends Worker
|
||||
{
|
||||
final Constraints c = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
|
||||
OneTimeWorkRequest.Builder builder = new OneTimeWorkRequest.Builder(OsmUploadWork.class).setConstraints(c);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||
builder.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
|
||||
{
|
||||
builder.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST);
|
||||
}
|
||||
final OneTimeWorkRequest wr = builder.build();
|
||||
WorkManager.getInstance(context).beginUniqueWork("UploadOsmChanges", ExistingWorkPolicy.KEEP, wr).enqueue();
|
||||
|
||||
@@ -17,7 +17,6 @@ import androidx.annotation.NonNull;
|
||||
import androidx.documentfile.provider.DocumentFile;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
|
||||
@@ -10,7 +10,6 @@ import androidx.fragment.app.DialogFragment;
|
||||
|
||||
public class BaseMwmDialogFragment extends DialogFragment
|
||||
{
|
||||
|
||||
protected int getStyle()
|
||||
{
|
||||
return STYLE_NORMAL;
|
||||
|
||||
@@ -282,11 +282,13 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment<ConcatAdapter
|
||||
{
|
||||
if (isEmptySearchResults())
|
||||
{
|
||||
requirePlaceholder().setContent(R.string.search_not_found, R.string.search_not_found_query, R.drawable.ic_search_fail);
|
||||
requirePlaceholder().setContent(R.string.search_not_found, R.string.search_not_found_query,
|
||||
R.drawable.ic_search_fail);
|
||||
}
|
||||
else if (isEmpty())
|
||||
{
|
||||
requirePlaceholder().setContent(R.string.bookmarks_empty_list_title, R.string.bookmarks_empty_list_message, R.drawable.ic_bookmarks);
|
||||
requirePlaceholder().setContent(R.string.bookmarks_empty_list_title, R.string.bookmarks_empty_list_message,
|
||||
R.drawable.ic_bookmarks);
|
||||
}
|
||||
|
||||
boolean isEmptyRecycler = isEmpty() || isEmptySearchResults();
|
||||
|
||||
@@ -23,7 +23,6 @@ import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.widget.recycler.RecyclerClickListener;
|
||||
import app.organicmaps.widget.recycler.RecyclerLongClickListener;
|
||||
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.checkbox.MaterialCheckBox;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
@@ -458,10 +457,12 @@ public class Holders
|
||||
|
||||
String formattedDesc = desc.replace("\n", "<br>");
|
||||
Spanned spannedDesc = Utils.fromHtml(formattedDesc);
|
||||
if (!TextUtils.isEmpty(spannedDesc)) {
|
||||
if (!TextUtils.isEmpty(spannedDesc))
|
||||
{
|
||||
mDescText.setText(spannedDesc);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
mDescText.setText(R.string.list_description_empty);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,8 +50,8 @@ public final class IntentUtils
|
||||
}
|
||||
|
||||
// https://developer.android.com/reference/androidx/car/app/CarContext#startCarApp(android.content.Intent)
|
||||
private static void processNavigationIntent(@NonNull CarContext carContext,
|
||||
@NonNull Renderer surfaceRenderer, @NonNull Intent intent)
|
||||
private static void processNavigationIntent(@NonNull CarContext carContext, @NonNull Renderer surfaceRenderer,
|
||||
@NonNull Intent intent)
|
||||
{
|
||||
// TODO (AndrewShkrob): This logic will need to be revised when we introduce support for adding stops during
|
||||
// navigation or route planning. Skip navigation intents during navigation
|
||||
|
||||
@@ -31,7 +31,7 @@ public final class RoutingHelpers
|
||||
default -> Distance.UNIT_METERS;
|
||||
};
|
||||
|
||||
return Distance.create(distance.mDistance, displayUnit);
|
||||
return Distance.create(distance.mDistance, displayUnit);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@@ -52,7 +52,7 @@ public final class RoutingHelpers
|
||||
default -> LaneDirection.SHAPE_UNKNOWN;
|
||||
};
|
||||
|
||||
return LaneDirection.create(shape, isRecommended);
|
||||
return LaneDirection.create(shape, isRecommended);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@@ -77,7 +77,7 @@ public final class RoutingHelpers
|
||||
case EXIT_HIGHWAY_TO_LEFT -> Maneuver.TYPE_OFF_RAMP_SLIGHT_LEFT;
|
||||
case EXIT_HIGHWAY_TO_RIGHT -> Maneuver.TYPE_OFF_RAMP_SLIGHT_RIGHT;
|
||||
};
|
||||
final Maneuver.Builder builder = new Maneuver.Builder(maneuverType);
|
||||
final Maneuver.Builder builder = new Maneuver.Builder(maneuverType);
|
||||
if (maneuverType == Maneuver.TYPE_ROUNDABOUT_ENTER_AND_EXIT_CCW)
|
||||
builder.setRoundaboutExitNumber(roundaboutExitNum > 0 ? roundaboutExitNum : 1);
|
||||
builder.setIcon(new CarIcon.Builder(createManeuverIcon(context, carDirection, roundaboutExitNum)).build());
|
||||
@@ -85,7 +85,8 @@ public final class RoutingHelpers
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private static IconCompat createManeuverIcon(@NonNull final CarContext context, @NonNull CarDirection carDirection, int roundaboutExitNum)
|
||||
private static IconCompat createManeuverIcon(@NonNull final CarContext context, @NonNull CarDirection carDirection,
|
||||
int roundaboutExitNum)
|
||||
{
|
||||
if (!CarDirection.isRoundAbout(carDirection) || roundaboutExitNum == 0)
|
||||
{
|
||||
|
||||
@@ -39,8 +39,7 @@ public final class UiHelpers
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ActionStrip createMapActionStrip(@NonNull CarContext context,
|
||||
@NonNull Renderer surfaceRenderer)
|
||||
public static ActionStrip createMapActionStrip(@NonNull CarContext context, @NonNull Renderer surfaceRenderer)
|
||||
{
|
||||
final CarIcon iconPlus = new CarIcon.Builder(IconCompat.createWithResource(context, R.drawable.ic_plus)).build();
|
||||
final CarIcon iconMinus = new CarIcon.Builder(IconCompat.createWithResource(context, R.drawable.ic_minus)).build();
|
||||
@@ -59,15 +58,13 @@ public final class UiHelpers
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static MapController createMapController(@NonNull CarContext context,
|
||||
@NonNull Renderer surfaceRenderer)
|
||||
public static MapController createMapController(@NonNull CarContext context, @NonNull Renderer surfaceRenderer)
|
||||
{
|
||||
return new MapController.Builder().setMapActionStrip(createMapActionStrip(context, surfaceRenderer)).build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static Action createSettingsAction(@NonNull BaseMapScreen mapScreen,
|
||||
@NonNull Renderer surfaceRenderer)
|
||||
public static Action createSettingsAction(@NonNull BaseMapScreen mapScreen, @NonNull Renderer surfaceRenderer)
|
||||
{
|
||||
return createSettingsAction(mapScreen, surfaceRenderer, null);
|
||||
}
|
||||
@@ -81,8 +78,7 @@ public final class UiHelpers
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private static Action createSettingsAction(@NonNull BaseMapScreen mapScreen,
|
||||
@NonNull Renderer surfaceRenderer,
|
||||
private static Action createSettingsAction(@NonNull BaseMapScreen mapScreen, @NonNull Renderer surfaceRenderer,
|
||||
@Nullable OnScreenResultListener onScreenResultListener)
|
||||
{
|
||||
final CarContext context = mapScreen.getCarContext();
|
||||
@@ -123,8 +119,7 @@ public final class UiHelpers
|
||||
return null;
|
||||
|
||||
final Row.Builder builder = new Row.Builder();
|
||||
builder.setImage(
|
||||
new CarIcon.Builder(IconCompat.createWithResource(context, R.drawable.ic_opening_hours)).build());
|
||||
builder.setImage(new CarIcon.Builder(IconCompat.createWithResource(context, R.drawable.ic_opening_hours)).build());
|
||||
|
||||
if (isEmptyTT)
|
||||
builder.setTitle(ohStr);
|
||||
|
||||
@@ -6,19 +6,16 @@ import android.content.SharedPreferences;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.preference.PreferenceManager;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
|
||||
public final class CustomMapServerDialog
|
||||
{
|
||||
public interface OnUrlAppliedListener
|
||||
@@ -28,26 +25,22 @@ public final class CustomMapServerDialog
|
||||
|
||||
private CustomMapServerDialog() {}
|
||||
|
||||
public static void show(@NonNull Context context,
|
||||
@Nullable OnUrlAppliedListener listener)
|
||||
public static void show(@NonNull Context context, @Nullable OnUrlAppliedListener listener)
|
||||
{
|
||||
View dialogView = LayoutInflater.from(context)
|
||||
.inflate(R.layout.dialog_custom_map_server, null);
|
||||
View dialogView = LayoutInflater.from(context).inflate(R.layout.dialog_custom_map_server, null);
|
||||
TextInputLayout til = dialogView.findViewById(R.id.til_custom_map_server);
|
||||
TextInputEditText edit = dialogView.findViewById(R.id.edit_custom_map_server);
|
||||
|
||||
SharedPreferences prefs =
|
||||
PreferenceManager.getDefaultSharedPreferences(context);
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
String current = prefs.getString(context.getString(R.string.pref_custom_map_download_url), "");
|
||||
edit.setText(current);
|
||||
|
||||
MaterialAlertDialogBuilder builder =
|
||||
new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.download_resources_custom_url_title)
|
||||
.setMessage(R.string.download_resources_custom_url_message)
|
||||
.setView(dialogView)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.setPositiveButton(R.string.save, null);
|
||||
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.download_resources_custom_url_title)
|
||||
.setMessage(R.string.download_resources_custom_url_message)
|
||||
.setView(dialogView)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.setPositiveButton(R.string.save, null);
|
||||
|
||||
AlertDialog dialog = builder.create();
|
||||
dialog.setOnShowListener(dlg -> {
|
||||
@@ -55,9 +48,7 @@ public final class CustomMapServerDialog
|
||||
ok.setOnClickListener(v -> {
|
||||
String url = edit.getText() != null ? edit.getText().toString().trim() : "";
|
||||
|
||||
if (!url.isEmpty()
|
||||
&& !url.startsWith("http://")
|
||||
&& !url.startsWith("https://"))
|
||||
if (!url.isEmpty() && !url.startsWith("http://") && !url.startsWith("https://"))
|
||||
{
|
||||
til.setError(context.getString(R.string.download_resources_custom_url_error_scheme));
|
||||
return;
|
||||
@@ -67,9 +58,7 @@ public final class CustomMapServerDialog
|
||||
|
||||
String normalizedUrl = Framework.normalizeServerUrl(url);
|
||||
|
||||
prefs.edit()
|
||||
.putString(context.getString(R.string.pref_custom_map_download_url), normalizedUrl)
|
||||
.apply();
|
||||
prefs.edit().putString(context.getString(R.string.pref_custom_map_download_url), normalizedUrl).apply();
|
||||
|
||||
// Apply to native
|
||||
Framework.applyCustomMapDownloadUrl(context, normalizedUrl);
|
||||
|
||||
@@ -125,7 +125,8 @@ public class EditTextDialogFragment extends BaseMwmDialogFragment
|
||||
|
||||
positiveButton.setOnClickListener(view -> {
|
||||
final String result = mEtInput.getText().toString();
|
||||
if (validateInput(requireActivity(), result)) {
|
||||
if (validateInput(requireActivity(), result))
|
||||
{
|
||||
processInput(result);
|
||||
editTextDialog.dismiss();
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ import android.location.Location;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import app.organicmaps.MwmActivity;
|
||||
@@ -49,7 +48,8 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
|
||||
@Override
|
||||
public void onStatusChanged(List<MapManager.StorageCallbackData> data)
|
||||
{
|
||||
if (mCurrentCountry == null) {
|
||||
if (mCurrentCountry == null)
|
||||
{
|
||||
updateOfflineExplanationVisibility();
|
||||
return;
|
||||
}
|
||||
@@ -109,10 +109,13 @@ public class OnmapDownloader implements MwmActivity.LeftAnimationTrackListener
|
||||
return enqueued || progress || applying;
|
||||
}
|
||||
|
||||
private void updateOfflineExplanationVisibility() {
|
||||
if (mOfflineExplanation == null) return;
|
||||
private void updateOfflineExplanationVisibility()
|
||||
{
|
||||
if (mOfflineExplanation == null)
|
||||
return;
|
||||
// hide once threshold reached; safe to call repeatedly.
|
||||
app.organicmaps.util.UiUtils.showIf(MapManager.nativeGetDownloadedCount() < (DEFAULT_MAP_BASELINE + HIDE_THRESHOLD), mOfflineExplanation);
|
||||
app.organicmaps.util.UiUtils.showIf(MapManager.nativeGetDownloadedCount() < (DEFAULT_MAP_BASELINE + HIDE_THRESHOLD),
|
||||
mOfflineExplanation);
|
||||
}
|
||||
|
||||
private void updateProgressState(boolean shouldAutoDownload)
|
||||
|
||||
@@ -15,7 +15,6 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AutoCompleteTextView;
|
||||
import android.widget.GridLayout;
|
||||
|
||||
import androidx.annotation.CallSuper;
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.IdRes;
|
||||
@@ -196,8 +195,9 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
{
|
||||
final Context context = mInputBuildingLevels.getContext();
|
||||
final boolean isValid = Editor.nativeIsLevelValid(s.toString());
|
||||
mInputBuildingLevels.setError(isValid ? null : context.getString(R.string.error_enter_correct_storey_number,
|
||||
Editor.nativeGetMaxEditableBuildingLevels()));
|
||||
mInputBuildingLevels.setError(isValid ? null
|
||||
: context.getString(R.string.error_enter_correct_storey_number,
|
||||
Editor.nativeGetMaxEditableBuildingLevels()));
|
||||
}
|
||||
});
|
||||
|
||||
@@ -396,7 +396,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
List<String> SOCKET_TYPES = Arrays.stream(getResources().getStringArray(R.array.charge_socket_types)).toList();
|
||||
for (String socketType : SOCKET_TYPES)
|
||||
{
|
||||
ChargeSocketDescriptor socket = new ChargeSocketDescriptor(socketType,0,0);
|
||||
ChargeSocketDescriptor socket = new ChargeSocketDescriptor(socketType, 0, 0);
|
||||
|
||||
MaterialButton btn = (MaterialButton) inflater.inflate(R.layout.button_socket_type, typeBtns, false);
|
||||
|
||||
@@ -404,16 +404,16 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
|
||||
// load SVG icon converted into VectorDrawable in res/drawable
|
||||
@SuppressLint("DiscouragedApi")
|
||||
int resIconId =
|
||||
getResources().getIdentifier("ic_charge_socket_" + socket.visualType(), "drawable", requireContext().getPackageName());
|
||||
int resIconId = getResources().getIdentifier("ic_charge_socket_" + socket.visualType(), "drawable",
|
||||
requireContext().getPackageName());
|
||||
if (resIconId != 0)
|
||||
{
|
||||
btn.setIcon(getResources().getDrawable(resIconId));
|
||||
}
|
||||
|
||||
@SuppressLint("DiscouragedApi")
|
||||
int resTypeId =
|
||||
getResources().getIdentifier("charge_socket_" + socket.visualType(), "string", requireContext().getPackageName());
|
||||
int resTypeId = getResources().getIdentifier("charge_socket_" + socket.visualType(), "string",
|
||||
requireContext().getPackageName());
|
||||
if (resTypeId != 0)
|
||||
{
|
||||
btn.setText(getResources().getString(resTypeId));
|
||||
@@ -461,13 +461,16 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
// Add a TextWatcher to validate on text change
|
||||
countView.addTextChangedListener(new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
|
||||
public void beforeTextChanged(CharSequence s, int start, int count, int after)
|
||||
{}
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence s, int start, int before, int count) {}
|
||||
public void onTextChanged(CharSequence s, int start, int before, int count)
|
||||
{}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable s) {
|
||||
public void afterTextChanged(Editable s)
|
||||
{
|
||||
validatePositiveField(s.toString(), countInputLayout);
|
||||
}
|
||||
});
|
||||
@@ -482,13 +485,16 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
// Add a TextWatcher to validate on text change
|
||||
powerView.addTextChangedListener(new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
|
||||
public void beforeTextChanged(CharSequence s, int start, int count, int after)
|
||||
{}
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence s, int start, int before, int count) {}
|
||||
public void onTextChanged(CharSequence s, int start, int before, int count)
|
||||
{}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable s) {
|
||||
public void afterTextChanged(Editable s)
|
||||
{
|
||||
validatePositiveField(s.toString(), powerInputLayout);
|
||||
}
|
||||
});
|
||||
@@ -496,74 +502,82 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
return new MaterialAlertDialogBuilder(requireActivity())
|
||||
.setTitle(R.string.editor_socket)
|
||||
.setView(dialogView)
|
||||
.setPositiveButton(R.string.save,
|
||||
(dialog, which) -> {
|
||||
String socketType = "";
|
||||
for (MaterialButton b : buttonList)
|
||||
{
|
||||
if (b.isChecked())
|
||||
{
|
||||
socketType = b.getTag(R.id.socket_type).toString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
.setPositiveButton(
|
||||
R.string.save,
|
||||
(dialog, which) -> {
|
||||
String socketType = "";
|
||||
for (MaterialButton b : buttonList)
|
||||
{
|
||||
if (b.isChecked())
|
||||
{
|
||||
socketType = b.getTag(R.id.socket_type).toString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int countValue = 0; // 0 means 'unknown count'
|
||||
try
|
||||
{
|
||||
countValue = Integer.parseInt(countView.getText().toString());
|
||||
}
|
||||
catch (NumberFormatException ignored)
|
||||
{
|
||||
Logger.w(CHARGE_SOCKETS_TAG, "Invalid count value for socket:" + countView.getText().toString());
|
||||
}
|
||||
int countValue = 0; // 0 means 'unknown count'
|
||||
try
|
||||
{
|
||||
countValue = Integer.parseInt(countView.getText().toString());
|
||||
}
|
||||
catch (NumberFormatException ignored)
|
||||
{
|
||||
Logger.w(CHARGE_SOCKETS_TAG, "Invalid count value for socket:" + countView.getText().toString());
|
||||
}
|
||||
|
||||
if (countValue < 0)
|
||||
{
|
||||
countValue = 0;
|
||||
Logger.w(CHARGE_SOCKETS_TAG, "Invalid count value for socket:" + countView.getText().toString());
|
||||
}
|
||||
if (countValue < 0)
|
||||
{
|
||||
countValue = 0;
|
||||
Logger.w(CHARGE_SOCKETS_TAG, "Invalid count value for socket:" + countView.getText().toString());
|
||||
}
|
||||
|
||||
double powerValue = 0; // 0 means 'unknown power'
|
||||
try
|
||||
{
|
||||
powerValue = Double.parseDouble(powerView.getText().toString());
|
||||
}
|
||||
catch (NumberFormatException ignored)
|
||||
{
|
||||
Logger.w(CHARGE_SOCKETS_TAG, "Invalid power value for socket:" + powerView.getText().toString());
|
||||
}
|
||||
double powerValue = 0; // 0 means 'unknown power'
|
||||
try
|
||||
{
|
||||
powerValue = Double.parseDouble(powerView.getText().toString());
|
||||
}
|
||||
catch (NumberFormatException ignored)
|
||||
{
|
||||
Logger.w(CHARGE_SOCKETS_TAG, "Invalid power value for socket:" + powerView.getText().toString());
|
||||
}
|
||||
|
||||
if (powerValue < 0)
|
||||
{
|
||||
powerValue = 0;
|
||||
Logger.w(CHARGE_SOCKETS_TAG, "Invalid power value for socket:" + powerView.getText().toString());
|
||||
}
|
||||
if (powerValue < 0)
|
||||
{
|
||||
powerValue = 0;
|
||||
Logger.w(CHARGE_SOCKETS_TAG, "Invalid power value for socket:" + powerView.getText().toString());
|
||||
}
|
||||
|
||||
ChargeSocketDescriptor socket =
|
||||
new ChargeSocketDescriptor(socketType, countValue, powerValue);
|
||||
ChargeSocketDescriptor socket = new ChargeSocketDescriptor(socketType, countValue, powerValue);
|
||||
|
||||
updateChargeSockets(socketIndex, socket);
|
||||
})
|
||||
updateChargeSockets(socketIndex, socket);
|
||||
})
|
||||
.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss());
|
||||
}
|
||||
|
||||
// Helper method for validation logic
|
||||
private boolean validatePositiveField(String text, TextInputLayout layout) {
|
||||
if (text.isEmpty()) {
|
||||
private boolean validatePositiveField(String text, TextInputLayout layout)
|
||||
{
|
||||
if (text.isEmpty())
|
||||
{
|
||||
layout.setError(null); // No error if empty (assuming 0 is the default)
|
||||
return true;
|
||||
}
|
||||
try {
|
||||
try
|
||||
{
|
||||
double value = Double.parseDouble(text);
|
||||
if (value < 0) {
|
||||
if (value < 0)
|
||||
{
|
||||
layout.setError(getString(R.string.error_value_must_be_positive));
|
||||
return false;
|
||||
} else {
|
||||
layout.setError(null);
|
||||
return true;
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
else
|
||||
{
|
||||
layout.setError(null);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch (NumberFormatException e)
|
||||
{
|
||||
layout.setError(getString(R.string.error_invalid_number));
|
||||
return false;
|
||||
}
|
||||
@@ -583,7 +597,8 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
{
|
||||
sockets[socketIndex] = socket;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
List<ChargeSocketDescriptor> list = new ArrayList<>(Arrays.asList(sockets));
|
||||
list.add(socket);
|
||||
sockets = list.toArray(new ChargeSocketDescriptor[0]);
|
||||
@@ -601,7 +616,8 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
GridLayout socketsGrid = mChargeSockets.findViewById(R.id.socket_grid_editor);
|
||||
socketsGrid.removeAllViews();
|
||||
|
||||
for (int i = 0; i < sockets.length; i++) {
|
||||
for (int i = 0; i < sockets.length; i++)
|
||||
{
|
||||
final int currentIndex = i;
|
||||
ChargeSocketDescriptor socket = sockets[i];
|
||||
|
||||
@@ -612,27 +628,30 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
MaterialTextView power = itemView.findViewById(R.id.socket_power);
|
||||
MaterialTextView count = itemView.findViewById(R.id.socket_count);
|
||||
|
||||
|
||||
// load SVG icon converted into VectorDrawable in res/drawable
|
||||
@SuppressLint("DiscouragedApi")
|
||||
int resIconId = getResources().getIdentifier("ic_charge_socket_" + socket.visualType(), "drawable",
|
||||
requireContext().getPackageName());
|
||||
if (resIconId != 0) {
|
||||
requireContext().getPackageName());
|
||||
if (resIconId != 0)
|
||||
{
|
||||
icon.setImageResource(resIconId);
|
||||
}
|
||||
|
||||
@SuppressLint("DiscouragedApi")
|
||||
int resTypeId =
|
||||
getResources().getIdentifier("charge_socket_" + socket.visualType(), "string", requireContext().getPackageName());
|
||||
if (resTypeId != 0) {
|
||||
int resTypeId = getResources().getIdentifier("charge_socket_" + socket.visualType(), "string",
|
||||
requireContext().getPackageName());
|
||||
if (resTypeId != 0)
|
||||
{
|
||||
type.setText(resTypeId);
|
||||
}
|
||||
|
||||
if (socket.power() != 0) {
|
||||
if (socket.power() != 0)
|
||||
{
|
||||
DecimalFormat df = new DecimalFormat("#.##");
|
||||
power.setText(getString(R.string.kw_label, df.format(socket.power())));
|
||||
}
|
||||
else if (socket.ignorePower()) {
|
||||
else if (socket.ignorePower())
|
||||
{
|
||||
power.setVisibility(INVISIBLE);
|
||||
}
|
||||
|
||||
@@ -641,7 +660,8 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
count.setText(getString(R.string.count_label, socket.count()));
|
||||
}
|
||||
|
||||
itemView.setOnClickListener(v -> buildChargeSocketDialog(currentIndex, socket.type(), socket.count(), socket.power()).show());
|
||||
itemView.setOnClickListener(
|
||||
v -> buildChargeSocketDialog(currentIndex, socket.type(), socket.count(), socket.power()).show());
|
||||
socketsGrid.addView(itemView);
|
||||
}
|
||||
|
||||
@@ -787,9 +807,8 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
View lineContactBlock =
|
||||
initBlock(view, Metadata.MetadataType.FMD_CONTACT_LINE, R.id.block_line, R.drawable.ic_line_white,
|
||||
R.string.editor_line_social_network, InputType.TYPE_TEXT_VARIATION_URI);
|
||||
View blueskyContactBlock =
|
||||
initBlock(view, Metadata.MetadataType.FMD_CONTACT_BLUESKY, R.id.block_bluesky, R.drawable.ic_bluesky,
|
||||
R.string.bluesky, InputType.TYPE_TEXT_VARIATION_URI);
|
||||
View blueskyContactBlock = initBlock(view, Metadata.MetadataType.FMD_CONTACT_BLUESKY, R.id.block_bluesky,
|
||||
R.drawable.ic_bluesky, R.string.bluesky, InputType.TYPE_TEXT_VARIATION_URI);
|
||||
View operatorBlock = initBlock(view, Metadata.MetadataType.FMD_OPERATOR, R.id.block_operator,
|
||||
R.drawable.ic_operator, R.string.editor_operator, 0);
|
||||
|
||||
@@ -1021,14 +1040,15 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
||||
private void placeDisused()
|
||||
{
|
||||
new MaterialAlertDialogBuilder(requireActivity())
|
||||
.setTitle(R.string.editor_mark_business_vacant_title)
|
||||
.setMessage(R.string.editor_mark_business_vacant_description)
|
||||
.setPositiveButton(R.string.editor_submit, (dlg, which) -> {
|
||||
Editor.nativeMarkPlaceAsDisused();
|
||||
mParent.processEditedFeatures();
|
||||
})
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
.show();
|
||||
.setTitle(R.string.editor_mark_business_vacant_title)
|
||||
.setMessage(R.string.editor_mark_business_vacant_description)
|
||||
.setPositiveButton(R.string.editor_submit,
|
||||
(dlg, which) -> {
|
||||
Editor.nativeMarkPlaceAsDisused();
|
||||
mParent.processEditedFeatures();
|
||||
})
|
||||
.setNegativeButton(android.R.string.cancel, null)
|
||||
.show();
|
||||
}
|
||||
|
||||
private void commitPlaceDoesntExists(@NonNull String text)
|
||||
|
||||
@@ -13,7 +13,6 @@ import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.editor.data.FeatureCategory;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.textfield.TextInputEditText;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
@@ -69,8 +68,7 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
||||
}
|
||||
case TYPE_FOOTER ->
|
||||
{
|
||||
return new FooterViewHolder(inflater.inflate(R.layout.item_feature_category_footer, parent, false),
|
||||
mFragment);
|
||||
return new FooterViewHolder(inflater.inflate(R.layout.item_feature_category_footer, parent, false), mFragment);
|
||||
}
|
||||
default -> throw new IllegalArgumentException("Unsupported viewType: " + viewType);
|
||||
}
|
||||
@@ -134,26 +132,21 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
|
||||
mSendNoteButton = itemView.findViewById(R.id.send_note_button);
|
||||
mSendNoteButton.setOnClickListener(v -> listener.onSendNoteClicked());
|
||||
final ColorStateList bgButtonColor = new ColorStateList(
|
||||
new int[][]{
|
||||
new int[]{android.R.attr.state_enabled}, // enabled
|
||||
new int[]{-android.R.attr.state_enabled} // disabled
|
||||
},
|
||||
new int[]{
|
||||
ContextCompat.getColor(
|
||||
mSendNoteButton.getContext(), R.color.base_accent),
|
||||
ContextCompat.getColor(mSendNoteButton.getContext(), R.color.button_accent_disabled)
|
||||
});
|
||||
new int[][] {
|
||||
new int[] {android.R.attr.state_enabled}, // enabled
|
||||
new int[] {-android.R.attr.state_enabled} // disabled
|
||||
},
|
||||
new int[] {ContextCompat.getColor(mSendNoteButton.getContext(), R.color.base_accent),
|
||||
ContextCompat.getColor(mSendNoteButton.getContext(), R.color.button_accent_disabled)});
|
||||
final ColorStateList textButtonColor = new ColorStateList(
|
||||
new int[][]{
|
||||
new int[]{android.R.attr.state_enabled}, // enabled
|
||||
new int[]{-android.R.attr.state_enabled} // disabled
|
||||
},
|
||||
new int[]{
|
||||
ContextCompat.getColor(
|
||||
mSendNoteButton.getContext(),
|
||||
UiUtils.getStyledResourceId(mSendNoteButton.getContext(), android.R.attr.textColorPrimaryInverse)),
|
||||
ContextCompat.getColor(mSendNoteButton.getContext(), R.color.button_accent_text_disabled)
|
||||
});
|
||||
new int[][] {
|
||||
new int[] {android.R.attr.state_enabled}, // enabled
|
||||
new int[] {-android.R.attr.state_enabled} // disabled
|
||||
},
|
||||
new int[] {ContextCompat.getColor(mSendNoteButton.getContext(),
|
||||
UiUtils.getStyledResourceId(mSendNoteButton.getContext(),
|
||||
android.R.attr.textColorPrimaryInverse)),
|
||||
ContextCompat.getColor(mSendNoteButton.getContext(), R.color.button_accent_text_disabled)});
|
||||
mSendNoteButton.setBackgroundTintList(bgButtonColor);
|
||||
mSendNoteButton.setTextColor(textButtonColor);
|
||||
mNoteEditText.addTextChangedListener(new StringUtils.SimpleTextWatcher() {
|
||||
|
||||
@@ -2,19 +2,16 @@ package app.organicmaps.editor;
|
||||
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
|
||||
import com.google.android.material.timepicker.MaterialTimePicker;
|
||||
import com.google.android.material.timepicker.TimeFormat;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.editor.data.HoursMinutes;
|
||||
import app.organicmaps.sdk.util.DateUtils;
|
||||
import com.google.android.material.timepicker.MaterialTimePicker;
|
||||
import com.google.android.material.timepicker.TimeFormat;
|
||||
|
||||
public class FromToTimePicker
|
||||
{
|
||||
@@ -32,18 +29,11 @@ public class FromToTimePicker
|
||||
private boolean mIsFromTimePicked;
|
||||
private int mInputMode;
|
||||
|
||||
public static void pickTime(@NonNull Fragment fragment,
|
||||
@NonNull FromToTimePicker.OnPickListener listener,
|
||||
@NonNull HoursMinutes fromTime,
|
||||
@NonNull HoursMinutes toTime,
|
||||
int id,
|
||||
public static void pickTime(@NonNull Fragment fragment, @NonNull FromToTimePicker.OnPickListener listener,
|
||||
@NonNull HoursMinutes fromTime, @NonNull HoursMinutes toTime, int id,
|
||||
boolean startWithToTime)
|
||||
{
|
||||
FromToTimePicker timePicker = new FromToTimePicker(fragment,
|
||||
listener,
|
||||
fromTime,
|
||||
toTime,
|
||||
id);
|
||||
FromToTimePicker timePicker = new FromToTimePicker(fragment, listener, fromTime, toTime, id);
|
||||
|
||||
if (startWithToTime)
|
||||
timePicker.showToTimePicker();
|
||||
@@ -51,11 +41,8 @@ public class FromToTimePicker
|
||||
timePicker.showFromTimePicker();
|
||||
}
|
||||
|
||||
private FromToTimePicker(@NonNull Fragment fragment,
|
||||
@NonNull FromToTimePicker.OnPickListener listener,
|
||||
@NonNull HoursMinutes fromTime,
|
||||
@NonNull HoursMinutes toTime,
|
||||
int id)
|
||||
private FromToTimePicker(@NonNull Fragment fragment, @NonNull FromToTimePicker.OnPickListener listener,
|
||||
@NonNull HoursMinutes fromTime, @NonNull HoursMinutes toTime, int id)
|
||||
{
|
||||
mActivity = fragment.requireActivity();
|
||||
mFragmentManager = fragment.getChildFragmentManager();
|
||||
@@ -100,15 +87,12 @@ public class FromToTimePicker
|
||||
|
||||
private MaterialTimePicker buildFromTimePicker()
|
||||
{
|
||||
MaterialTimePicker timePicker = buildTimePicker(mFromTime,
|
||||
mResources.getString(R.string.editor_time_from),
|
||||
mResources.getString(R.string.next_button),
|
||||
null);
|
||||
MaterialTimePicker timePicker = buildTimePicker(mFromTime, mResources.getString(R.string.editor_time_from),
|
||||
mResources.getString(R.string.next_button), null);
|
||||
|
||||
timePicker.addOnNegativeButtonClickListener(view -> finishTimePicking(false));
|
||||
|
||||
timePicker.addOnPositiveButtonClickListener(view ->
|
||||
{
|
||||
timePicker.addOnPositiveButtonClickListener(view -> {
|
||||
mIsFromTimePicked = true;
|
||||
saveState(timePicker, true);
|
||||
mFromTimePicker = null;
|
||||
@@ -122,13 +106,10 @@ public class FromToTimePicker
|
||||
|
||||
private MaterialTimePicker buildToTimePicker()
|
||||
{
|
||||
MaterialTimePicker timePicker = buildTimePicker(mToTime,
|
||||
mResources.getString(R.string.editor_time_to),
|
||||
null,
|
||||
MaterialTimePicker timePicker = buildTimePicker(mToTime, mResources.getString(R.string.editor_time_to), null,
|
||||
mResources.getString(R.string.back));
|
||||
|
||||
timePicker.addOnNegativeButtonClickListener(view ->
|
||||
{
|
||||
timePicker.addOnNegativeButtonClickListener(view -> {
|
||||
saveState(timePicker, false);
|
||||
mToTimePicker = null;
|
||||
if (mIsFromTimePicked)
|
||||
@@ -137,8 +118,7 @@ public class FromToTimePicker
|
||||
finishTimePicking(false);
|
||||
});
|
||||
|
||||
timePicker.addOnPositiveButtonClickListener(view ->
|
||||
{
|
||||
timePicker.addOnPositiveButtonClickListener(view -> {
|
||||
saveState(timePicker, false);
|
||||
finishTimePicking(true);
|
||||
});
|
||||
@@ -149,18 +129,18 @@ public class FromToTimePicker
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private MaterialTimePicker buildTimePicker(@NonNull HoursMinutes time,
|
||||
@NonNull String title,
|
||||
private MaterialTimePicker buildTimePicker(@NonNull HoursMinutes time, @NonNull String title,
|
||||
@Nullable String positiveButtonTextOverride,
|
||||
@Nullable String negativeButtonTextOverride)
|
||||
{
|
||||
MaterialTimePicker.Builder builder = new MaterialTimePicker.Builder()
|
||||
.setTitleText(title)
|
||||
.setTimeFormat(mIs24HourFormat ? TimeFormat.CLOCK_24H : TimeFormat.CLOCK_12H)
|
||||
.setInputMode(mInputMode)
|
||||
.setTheme(R.style.MwmTheme_MaterialTimePicker)
|
||||
.setHour((int) time.hours)
|
||||
.setMinute((int) time.minutes);
|
||||
MaterialTimePicker.Builder builder =
|
||||
new MaterialTimePicker.Builder()
|
||||
.setTitleText(title)
|
||||
.setTimeFormat(mIs24HourFormat ? TimeFormat.CLOCK_24H : TimeFormat.CLOCK_12H)
|
||||
.setInputMode(mInputMode)
|
||||
.setTheme(R.style.MwmTheme_MaterialTimePicker)
|
||||
.setHour((int) time.hours)
|
||||
.setMinute((int) time.minutes);
|
||||
|
||||
if (positiveButtonTextOverride != null)
|
||||
builder.setPositiveButtonText(positiveButtonTextOverride);
|
||||
|
||||
@@ -8,7 +8,6 @@ import androidx.annotation.NonNull;
|
||||
import androidx.core.os.ConfigurationCompat;
|
||||
import androidx.core.os.LocaleListCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmRecyclerFragment;
|
||||
import app.organicmaps.sdk.editor.Editor;
|
||||
@@ -39,8 +38,7 @@ public class LanguagesFragment extends BaseMwmRecyclerFragment<LanguagesAdapter>
|
||||
protected LanguagesAdapter createAdapter()
|
||||
{
|
||||
Bundle args = getArguments();
|
||||
boolean isMapLanguageSelection =
|
||||
args != null ? args.getBoolean(IS_MAP_LANGUAGE_SELECTION) : true;
|
||||
boolean isMapLanguageSelection = args != null ? args.getBoolean(IS_MAP_LANGUAGE_SELECTION) : true;
|
||||
Set<String> existingLanguages =
|
||||
args != null ? new HashSet<>(args.getStringArrayList(EXISTING_LOCALIZED_NAMES)) : new HashSet<>();
|
||||
|
||||
@@ -81,7 +79,8 @@ public class LanguagesFragment extends BaseMwmRecyclerFragment<LanguagesAdapter>
|
||||
|
||||
languages.addAll(0, systemLanguages.stream().filter(Objects::nonNull).toList());
|
||||
|
||||
if (isMapLanguageSelection) {
|
||||
if (isMapLanguageSelection)
|
||||
{
|
||||
String localLanguageLabel = getString(R.string.pref_maplanguage_local);
|
||||
Language localLanguage = new Language(DEFAULT_LANG_CODE, localLanguageLabel);
|
||||
languages.add(0, localLanguage);
|
||||
|
||||
@@ -7,7 +7,6 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import androidx.annotation.IdRes;
|
||||
import androidx.annotation.IntRange;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -122,20 +121,14 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
|
||||
notifyItemChanged(getItemCount() - 1);
|
||||
}
|
||||
|
||||
private void pickTime(int position,
|
||||
@IntRange(from = ID_OPENING_TIME, to = ID_CLOSED_SPAN) int id,
|
||||
private void pickTime(int position, @IntRange(from = ID_OPENING_TIME, to = ID_CLOSED_SPAN) int id,
|
||||
boolean startWithToTime)
|
||||
{
|
||||
final Timetable data = mItems.get(position);
|
||||
mPickingPosition = position;
|
||||
|
||||
FromToTimePicker.pickTime(mFragment,
|
||||
this,
|
||||
data.workingTimespan.start,
|
||||
data.workingTimespan.end,
|
||||
id,
|
||||
startWithToTime);
|
||||
|
||||
FromToTimePicker.pickTime(mFragment, this, data.workingTimespan.start, data.workingTimespan.end, id,
|
||||
startWithToTime);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -384,26 +377,21 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
|
||||
final String text = mFragment.getString(R.string.editor_time_add);
|
||||
mAdd.setEnabled(enable);
|
||||
final ColorStateList bgButtonColor = new ColorStateList(
|
||||
new int[][]{
|
||||
new int[]{android.R.attr.state_enabled}, // enabled
|
||||
new int[]{-android.R.attr.state_enabled} // disabled
|
||||
},
|
||||
new int[]{
|
||||
ContextCompat.getColor(
|
||||
mAdd.getContext(), R.color.base_accent),
|
||||
ContextCompat.getColor(mAdd.getContext(), R.color.button_accent_disabled)
|
||||
});
|
||||
new int[][] {
|
||||
new int[] {android.R.attr.state_enabled}, // enabled
|
||||
new int[] {-android.R.attr.state_enabled} // disabled
|
||||
},
|
||||
new int[] {ContextCompat.getColor(mAdd.getContext(), R.color.base_accent),
|
||||
ContextCompat.getColor(mAdd.getContext(), R.color.button_accent_disabled)});
|
||||
final ColorStateList textButtonColor = new ColorStateList(
|
||||
new int[][]{
|
||||
new int[]{android.R.attr.state_enabled}, // enabled
|
||||
new int[]{-android.R.attr.state_enabled} // disabled
|
||||
},
|
||||
new int[]{
|
||||
ContextCompat.getColor(
|
||||
mAdd.getContext(),
|
||||
UiUtils.getStyledResourceId(mAdd.getContext(), android.R.attr.textColorPrimaryInverse)),
|
||||
ContextCompat.getColor(mAdd.getContext(), R.color.button_accent_text_disabled)
|
||||
});
|
||||
new int[][] {
|
||||
new int[] {android.R.attr.state_enabled}, // enabled
|
||||
new int[] {-android.R.attr.state_enabled} // disabled
|
||||
},
|
||||
new int[] {
|
||||
ContextCompat.getColor(mAdd.getContext(), UiUtils.getStyledResourceId(
|
||||
mAdd.getContext(), android.R.attr.textColorPrimaryInverse)),
|
||||
ContextCompat.getColor(mAdd.getContext(), R.color.button_accent_text_disabled)});
|
||||
mAdd.setBackgroundTintList(bgButtonColor);
|
||||
mAdd.setTextColor(textButtonColor);
|
||||
mAdd.setText(enable ? text + " (" + TimeFormatUtils.formatWeekdays(mComplementItem) + ")" : text);
|
||||
|
||||
@@ -9,8 +9,8 @@ import androidx.annotation.Nullable;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmRecyclerFragment;
|
||||
|
||||
public class SimpleTimetableFragment extends BaseMwmRecyclerFragment<SimpleTimetableAdapter>
|
||||
implements TimetableProvider
|
||||
public class SimpleTimetableFragment
|
||||
extends BaseMwmRecyclerFragment<SimpleTimetableAdapter> implements TimetableProvider
|
||||
{
|
||||
private SimpleTimetableAdapter mAdapter;
|
||||
@Nullable
|
||||
|
||||
@@ -35,25 +35,30 @@ public class LayerBottomSheetItem
|
||||
@DrawableRes
|
||||
int drawableResId = 0;
|
||||
@StringRes
|
||||
int buttonTextResource = switch (mode) {
|
||||
case OUTDOORS -> {
|
||||
drawableResId = R.drawable.ic_layers_outdoors;
|
||||
yield R.string.button_layer_outdoor;
|
||||
}
|
||||
case SUBWAY -> {
|
||||
drawableResId = R.drawable.ic_layers_subway;
|
||||
yield R.string.subway;
|
||||
}
|
||||
case ISOLINES -> {
|
||||
drawableResId = R.drawable.ic_layers_isoline;
|
||||
yield R.string.button_layer_isolines;
|
||||
}
|
||||
case TRAFFIC -> {
|
||||
drawableResId = R.drawable.ic_layers_traffic;
|
||||
yield R.string.button_layer_traffic;
|
||||
}
|
||||
int buttonTextResource = switch (mode)
|
||||
{
|
||||
case OUTDOORS ->
|
||||
{
|
||||
drawableResId = R.drawable.ic_layers_outdoors;
|
||||
yield R.string.button_layer_outdoor;
|
||||
}
|
||||
case SUBWAY ->
|
||||
{
|
||||
drawableResId = R.drawable.ic_layers_subway;
|
||||
yield R.string.subway;
|
||||
}
|
||||
case ISOLINES ->
|
||||
{
|
||||
drawableResId = R.drawable.ic_layers_isoline;
|
||||
yield R.string.button_layer_isolines;
|
||||
}
|
||||
case TRAFFIC ->
|
||||
{
|
||||
drawableResId = R.drawable.ic_layers_traffic;
|
||||
yield R.string.button_layer_traffic;
|
||||
}
|
||||
};
|
||||
return new LayerBottomSheetItem(drawableResId, buttonTextResource, mode, layerItemClickListener);
|
||||
return new LayerBottomSheetItem(drawableResId, buttonTextResource, mode, layerItemClickListener);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
|
||||
@@ -5,11 +5,9 @@ import android.widget.ImageView;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.adapter.OnItemClickListener;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
class LayerHolder extends RecyclerView.ViewHolder
|
||||
{
|
||||
|
||||
@@ -395,7 +395,7 @@ public class MapButtonsController extends Fragment
|
||||
0;
|
||||
// Allow offset tolerance for zoom buttons
|
||||
};
|
||||
showButton(getViewTopOffset(translation, button) >= toleranceOffset, entry.getKey());
|
||||
showButton(getViewTopOffset(translation, button) >= toleranceOffset, entry.getKey());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,9 +99,9 @@ public class NavigationController implements TrafficManager.TrafficCallback, Nav
|
||||
mCurrentSpeed = topFrame.findViewById(R.id.nav_current_speed);
|
||||
|
||||
View mTopbar = topFrame.findViewById(R.id.statutbar);
|
||||
ViewCompat.setOnApplyWindowInsetsListener(mTopbar,(v, windowInsets) -> {
|
||||
UiUtils.setViewNavigationTopInsetsMargin(v, windowInsets);
|
||||
return windowInsets;
|
||||
ViewCompat.setOnApplyWindowInsetsListener(mTopbar, (v, windowInsets) -> {
|
||||
UiUtils.setViewNavigationTopInsetsMargin(v, windowInsets);
|
||||
return windowInsets;
|
||||
});
|
||||
// Show a blank view below the navbar to hide the menu content
|
||||
final View navigationBarBackground = mFrame.findViewById(R.id.nav_bottom_sheet_nav_bar);
|
||||
|
||||
@@ -43,7 +43,6 @@ import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import app.organicmaps.widget.recycler.DotDividerItemDecoration;
|
||||
import app.organicmaps.widget.recycler.MultilineLayoutManager;
|
||||
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
@@ -123,9 +122,9 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
||||
@NonNull View timeElevationLine, @NonNull View transitFrame,
|
||||
@NonNull MaterialTextView error, @NonNull MaterialButton start,
|
||||
@NonNull ShapeableImageView altitudeChart, @NonNull MaterialTextView time,
|
||||
@NonNull MaterialTextView altitudeDifference, @NonNull MaterialTextView timeVehicle,
|
||||
@Nullable MaterialTextView arrival, @NonNull View actionFrame,
|
||||
@Nullable RoutingBottomMenuListener listener)
|
||||
@NonNull MaterialTextView altitudeDifference,
|
||||
@NonNull MaterialTextView timeVehicle, @Nullable MaterialTextView arrival,
|
||||
@NonNull View actionFrame, @Nullable RoutingBottomMenuListener listener)
|
||||
{
|
||||
mContext = context;
|
||||
mAltitudeChartFrame = altitudeChartFrame;
|
||||
|
||||
@@ -12,9 +12,6 @@ import androidx.annotation.IdRes;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.core.view.WindowInsetsCompat;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
@@ -29,6 +26,7 @@ import app.organicmaps.util.WindowInsetUtils.PaddingInsetsListener;
|
||||
import app.organicmaps.widget.RoutingToolbarButton;
|
||||
import app.organicmaps.widget.ToolbarController;
|
||||
import app.organicmaps.widget.WheelProgressView;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
public class RoutingPlanController extends ToolbarController
|
||||
{
|
||||
@@ -264,7 +262,7 @@ public class RoutingPlanController extends ToolbarController
|
||||
default -> throw new IllegalArgumentException("unknown router: " + router);
|
||||
};
|
||||
|
||||
RoutingToolbarButton button = mRouterTypes.findViewById(mRouterTypes.getCheckedRadioButtonId());
|
||||
RoutingToolbarButton button = mRouterTypes.findViewById(mRouterTypes.getCheckedRadioButtonId());
|
||||
button.progress();
|
||||
|
||||
updateProgressLabels();
|
||||
|
||||
@@ -14,12 +14,10 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.search.DisplayedCategories;
|
||||
import app.organicmaps.sdk.util.Language;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.Locale;
|
||||
|
||||
@@ -10,14 +10,12 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.search.SearchResult;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.SearchDataViewHolder>
|
||||
{
|
||||
@@ -152,7 +150,8 @@ class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.SearchDataViewHol
|
||||
{
|
||||
final Resources resources = mSearchFragment.getResources();
|
||||
|
||||
if (result.description.openNow != SearchResult.OPEN_NOW_YES && result.description.openNow != SearchResult.OPEN_NOW_NO)
|
||||
if (result.description.openNow != SearchResult.OPEN_NOW_YES
|
||||
&& result.description.openNow != SearchResult.OPEN_NOW_NO)
|
||||
{
|
||||
// Hide if unknown opening hours state
|
||||
UiUtils.hide(mOpen);
|
||||
@@ -169,15 +168,18 @@ class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.SearchDataViewHol
|
||||
{
|
||||
final String minsToChangeStr = resources.getQuantityString(
|
||||
R.plurals.minutes_short, Math.max(minsToNextState, 1), Math.max(minsToNextState, 1));
|
||||
final String nextChangeFormatted = resources.getString(isOpen ? R.string.closes_in : R.string.opens_in, minsToChangeStr);
|
||||
final String nextChangeFormatted =
|
||||
resources.getString(isOpen ? R.string.closes_in : R.string.opens_in, minsToChangeStr);
|
||||
|
||||
UiUtils.setTextAndShow(mOpen, nextChangeFormatted);
|
||||
mOpen.setTextColor(ContextCompat.getColor(mSearchFragment.getContext(), R.color.base_yellow));
|
||||
}
|
||||
else
|
||||
{
|
||||
UiUtils.setTextAndShow(mOpen, isOpen ? resources.getString(R.string.editor_time_open) : resources.getString(R.string.closed));
|
||||
mOpen.setTextColor(ContextCompat.getColor(mSearchFragment.getContext(), isOpen ? R.color.base_green : R.color.base_red));
|
||||
UiUtils.setTextAndShow(
|
||||
mOpen, isOpen ? resources.getString(R.string.editor_time_open) : resources.getString(R.string.closed));
|
||||
mOpen.setTextColor(
|
||||
ContextCompat.getColor(mSearchFragment.getContext(), isOpen ? R.color.base_green : R.color.base_red));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -273,7 +273,8 @@ public class SearchFragment extends BaseMwmFragment implements SearchListener, C
|
||||
RecyclerView mResults = mResultsFrame.findViewById(R.id.recycler);
|
||||
setRecyclerScrollListener(mResults);
|
||||
mResultsPlaceholder = mResultsFrame.findViewById(R.id.placeholder);
|
||||
mResultsPlaceholder.setContent(R.string.search_not_found, R.string.search_not_found_query, R.drawable.ic_search_fail);
|
||||
mResultsPlaceholder.setContent(R.string.search_not_found, R.string.search_not_found_query,
|
||||
R.drawable.ic_search_fail);
|
||||
mSearchAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver()
|
||||
|
||||
{
|
||||
|
||||
@@ -5,15 +5,13 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.search.SearchRecents;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.widget.SearchToolbarController;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
class SearchHistoryAdapter extends RecyclerView.Adapter<SearchHistoryAdapter.ViewHolder>
|
||||
{
|
||||
|
||||
@@ -8,14 +8,12 @@ import android.view.ViewGroup;
|
||||
import android.widget.CompoundButton;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.google.android.material.materialswitch.MaterialSwitch;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.base.BaseMwmToolbarFragment;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.routing.RoutingOptions;
|
||||
import app.organicmaps.sdk.settings.RoadType;
|
||||
import com.google.android.material.materialswitch.MaterialSwitch;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
|
||||
@@ -8,7 +8,6 @@ import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.preference.ListPreference;
|
||||
@@ -16,9 +15,6 @@ import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceCategory;
|
||||
import androidx.preference.PreferenceManager;
|
||||
import androidx.preference.TwoStatePreference;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.dialog.CustomMapServerDialog;
|
||||
@@ -43,7 +39,7 @@ import app.organicmaps.sdk.util.SharedPropertiesUtils;
|
||||
import app.organicmaps.sdk.util.log.LogsManager;
|
||||
import app.organicmaps.util.ThemeSwitcher;
|
||||
import app.organicmaps.util.Utils;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
@@ -142,9 +138,12 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
|
||||
{
|
||||
final Preference pref = getPreference(getString(R.string.pref_map_locale));
|
||||
String mapLanguageCode = MapLanguageCode.getMapLanguageCode();
|
||||
if (mapLanguageCode.equals(DEFAULT_LANG_CODE)) {
|
||||
if (mapLanguageCode.equals(DEFAULT_LANG_CODE))
|
||||
{
|
||||
pref.setSummary(R.string.pref_maplanguage_local);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
Locale locale = new Locale(mapLanguageCode);
|
||||
pref.setSummary(locale.getDisplayLanguage());
|
||||
}
|
||||
@@ -559,9 +558,8 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
|
||||
String normalizedUrl = Framework.normalizeServerUrl(current);
|
||||
|
||||
// Initial summary
|
||||
customUrlPref.setSummary(normalizedUrl.isEmpty()
|
||||
? getString(R.string.download_resources_custom_url_summary_none)
|
||||
: normalizedUrl);
|
||||
customUrlPref.setSummary(normalizedUrl.isEmpty() ? getString(R.string.download_resources_custom_url_summary_none)
|
||||
: normalizedUrl);
|
||||
|
||||
// Sync native
|
||||
Framework.applyCustomMapDownloadUrl(requireContext(), normalizedUrl);
|
||||
@@ -569,9 +567,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
|
||||
// Show dialog
|
||||
customUrlPref.setOnPreferenceClickListener(preference -> {
|
||||
CustomMapServerDialog.show(requireContext(), url -> {
|
||||
preference.setSummary(url.isEmpty()
|
||||
? getString(R.string.download_resources_custom_url_summary_none)
|
||||
: url);
|
||||
preference.setSummary(url.isEmpty() ? getString(R.string.download_resources_custom_url_summary_none) : url);
|
||||
});
|
||||
return true;
|
||||
});
|
||||
|
||||
@@ -274,10 +274,10 @@ public final class UiUtils
|
||||
|
||||
public static void setViewNavigationTopInsetsMargin(View view, WindowInsetsCompat windowInsets)
|
||||
{
|
||||
final Insets systemInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
|
||||
lp.topMargin = systemInsets.top;
|
||||
view.setLayoutParams(lp);
|
||||
final Insets systemInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
|
||||
lp.topMargin = systemInsets.top;
|
||||
view.setLayoutParams(lp);
|
||||
}
|
||||
|
||||
public static void setupNavigationIcon(@NonNull MaterialToolbar toolbar, @NonNull View.OnClickListener listener)
|
||||
|
||||
@@ -8,165 +8,165 @@ import android.graphics.Typeface;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
public abstract class BaseSignView extends View
|
||||
{
|
||||
private float mBorderWidthRatio = 0.1f;
|
||||
protected void setBorderWidthRatio(float ratio) {
|
||||
mBorderWidthRatio = ratio;
|
||||
}
|
||||
private float mBorderWidthRatio = 0.1f;
|
||||
protected void setBorderWidthRatio(float ratio)
|
||||
{
|
||||
mBorderWidthRatio = ratio;
|
||||
}
|
||||
|
||||
private float mBorderInsetRatio = 0f;
|
||||
protected void setBorderInsetRatio(float ratio) {
|
||||
mBorderInsetRatio = ratio;
|
||||
}
|
||||
private float mBorderInsetRatio = 0f;
|
||||
protected void setBorderInsetRatio(float ratio)
|
||||
{
|
||||
mBorderInsetRatio = ratio;
|
||||
}
|
||||
|
||||
// colors
|
||||
protected int mBackgroundColor;
|
||||
protected int mBorderColor;
|
||||
protected int mAlertColor;
|
||||
protected int mTextColor;
|
||||
protected int mTextAlertColor;
|
||||
// colors
|
||||
protected int mBackgroundColor;
|
||||
protected int mBorderColor;
|
||||
protected int mAlertColor;
|
||||
protected int mTextColor;
|
||||
protected int mTextAlertColor;
|
||||
|
||||
// paints
|
||||
protected final Paint mBackgroundPaint;
|
||||
protected final Paint mBorderPaint;
|
||||
protected final Paint mTextPaint;
|
||||
// paints
|
||||
protected final Paint mBackgroundPaint;
|
||||
protected final Paint mBorderPaint;
|
||||
protected final Paint mTextPaint;
|
||||
|
||||
// geometry
|
||||
protected float mWidth;
|
||||
protected float mHeight;
|
||||
protected float mRadius;
|
||||
protected float mBorderWidth;
|
||||
protected float mBorderRadius;
|
||||
// geometry
|
||||
protected float mWidth;
|
||||
protected float mHeight;
|
||||
protected float mRadius;
|
||||
protected float mBorderWidth;
|
||||
protected float mBorderRadius;
|
||||
|
||||
public BaseSignView(Context ctx, @Nullable AttributeSet attrs)
|
||||
public BaseSignView(Context ctx, @Nullable AttributeSet attrs)
|
||||
{
|
||||
super(ctx, attrs);
|
||||
mBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||
mBorderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||
mBorderPaint.setStyle(Paint.Style.STROKE);
|
||||
mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||
mTextPaint.setTextAlign(Paint.Align.CENTER);
|
||||
mTextPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD));
|
||||
}
|
||||
|
||||
protected void setColors(int backgroundColor, int borderColor, int alertColor, int textColor, int textAlertColor)
|
||||
{
|
||||
mBackgroundColor = backgroundColor;
|
||||
mBorderColor = borderColor;
|
||||
mAlertColor = alertColor;
|
||||
mTextColor = textColor;
|
||||
mTextAlertColor = textAlertColor;
|
||||
|
||||
mBackgroundPaint.setColor(mBackgroundColor);
|
||||
mBorderPaint.setColor(mBorderColor);
|
||||
mTextPaint.setColor(mTextColor);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight)
|
||||
{
|
||||
super.onSizeChanged(width, height, oldWidth, oldHeight);
|
||||
final float paddingX = getPaddingLeft() + getPaddingRight();
|
||||
final float paddingY = getPaddingTop() + getPaddingBottom();
|
||||
mWidth = width - paddingX;
|
||||
mHeight = height - paddingY;
|
||||
mRadius = Math.min(mWidth, mHeight) / 2f;
|
||||
mBorderWidth = mRadius * mBorderWidthRatio;
|
||||
// subtract half the stroke PLUS the extra inset
|
||||
final float gap = mRadius * mBorderInsetRatio;
|
||||
mBorderRadius = mRadius - (mBorderWidth / 2f) - gap;
|
||||
configureTextSize();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDraw(@NonNull Canvas canvas)
|
||||
{
|
||||
super.onDraw(canvas);
|
||||
final String str = getValueString();
|
||||
if (str == null)
|
||||
return;
|
||||
|
||||
final float cx = mWidth / 2f;
|
||||
final float cy = mHeight / 2f;
|
||||
|
||||
// background & border
|
||||
boolean alert = isAlert();
|
||||
mBackgroundPaint.setColor(alert ? mAlertColor : mBackgroundColor);
|
||||
canvas.drawCircle(cx, cy, mRadius, mBackgroundPaint);
|
||||
if (!alert)
|
||||
{
|
||||
super(ctx, attrs);
|
||||
mBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||
mBorderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||
mBorderPaint.setStyle(Paint.Style.STROKE);
|
||||
mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||
mTextPaint.setTextAlign(Paint.Align.CENTER);
|
||||
mTextPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD));
|
||||
mBorderPaint.setStrokeWidth(mBorderWidth);
|
||||
mBorderPaint.setColor(mBorderColor);
|
||||
canvas.drawCircle(cx, cy, mBorderRadius, mBorderPaint);
|
||||
}
|
||||
|
||||
protected void setColors(int backgroundColor,
|
||||
int borderColor,
|
||||
int alertColor,
|
||||
int textColor,
|
||||
int textAlertColor)
|
||||
// text
|
||||
mTextPaint.setColor(alert ? mTextAlertColor : mTextColor);
|
||||
drawValueString(canvas, cx, cy, str);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(@NonNull MotionEvent e)
|
||||
{
|
||||
final float cx = mWidth / 2f, cy = mHeight / 2f;
|
||||
final float dx = e.getX() - cx, dy = e.getY() - cy;
|
||||
if ((dx * dx) + (dy * dy) <= (mRadius * mRadius))
|
||||
{
|
||||
mBackgroundColor = backgroundColor;
|
||||
mBorderColor = borderColor;
|
||||
mAlertColor = alertColor;
|
||||
mTextColor = textColor;
|
||||
mTextAlertColor = textAlertColor;
|
||||
|
||||
mBackgroundPaint.setColor(mBackgroundColor);
|
||||
mBorderPaint.setColor(mBorderColor);
|
||||
mTextPaint.setColor(mTextColor);
|
||||
performClick();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
|
||||
super.onSizeChanged(width, height, oldWidth, oldHeight);
|
||||
final float paddingX = getPaddingLeft() + getPaddingRight();
|
||||
final float paddingY = getPaddingTop() + getPaddingBottom();
|
||||
mWidth = width - paddingX;
|
||||
mHeight = height - paddingY;
|
||||
mRadius = Math.min(mWidth, mHeight) / 2f;
|
||||
mBorderWidth = mRadius * mBorderWidthRatio;
|
||||
// subtract half the stroke PLUS the extra inset
|
||||
final float gap = mRadius * mBorderInsetRatio;
|
||||
mBorderRadius = mRadius - (mBorderWidth / 2f) - gap;
|
||||
configureTextSize();
|
||||
}
|
||||
@Override
|
||||
public boolean performClick()
|
||||
{
|
||||
super.performClick();
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDraw(@NonNull Canvas canvas)
|
||||
private void drawValueString(Canvas c, float cx, float cy, String str)
|
||||
{
|
||||
Rect b = new Rect();
|
||||
mTextPaint.getTextBounds(str, 0, str.length(), b);
|
||||
final float y = cy - b.exactCenterY();
|
||||
c.drawText(str, cx, y, mTextPaint);
|
||||
}
|
||||
|
||||
void configureTextSize()
|
||||
{
|
||||
String text = getValueString();
|
||||
if (text == null)
|
||||
return;
|
||||
final float textRadius = mBorderRadius - mBorderWidth;
|
||||
final float maxTextSize = 2f * textRadius;
|
||||
final float maxTextSize2 = maxTextSize * maxTextSize;
|
||||
float lo = 0f, hi = maxTextSize, sz = maxTextSize;
|
||||
Rect b = new Rect();
|
||||
while (lo <= hi)
|
||||
{
|
||||
super.onDraw(canvas);
|
||||
final String str = getValueString();
|
||||
if (str == null) return;
|
||||
|
||||
final float cx = mWidth / 2f;
|
||||
final float cy = mHeight / 2f;
|
||||
|
||||
// background & border
|
||||
boolean alert = isAlert();
|
||||
mBackgroundPaint.setColor(alert ? mAlertColor : mBackgroundColor);
|
||||
canvas.drawCircle(cx, cy, mRadius, mBackgroundPaint);
|
||||
if (!alert)
|
||||
{
|
||||
mBorderPaint.setStrokeWidth(mBorderWidth);
|
||||
mBorderPaint.setColor(mBorderColor);
|
||||
canvas.drawCircle(cx, cy, mBorderRadius, mBorderPaint);
|
||||
}
|
||||
|
||||
// text
|
||||
mTextPaint.setColor(alert ? mTextAlertColor : mTextColor);
|
||||
drawValueString(canvas, cx, cy, str);
|
||||
sz = (lo + hi) / 2f;
|
||||
mTextPaint.setTextSize(sz);
|
||||
mTextPaint.getTextBounds(text, 0, text.length(), b);
|
||||
float area = b.width() * b.width() + b.height() * b.height();
|
||||
if (area <= maxTextSize2)
|
||||
lo = sz + 1f;
|
||||
else
|
||||
hi = sz - 1f;
|
||||
}
|
||||
mTextPaint.setTextSize(Math.max(1f, sz));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(@NonNull MotionEvent e)
|
||||
{
|
||||
final float cx = mWidth / 2f, cy = mHeight / 2f;
|
||||
final float dx = e.getX() - cx, dy = e.getY() - cy;
|
||||
if ((dx * dx) + (dy * dy) <= (mRadius * mRadius))
|
||||
{
|
||||
performClick();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/** child must return the string to draw, or null if nothing */
|
||||
@Nullable
|
||||
protected abstract String getValueString();
|
||||
|
||||
@Override
|
||||
public boolean performClick()
|
||||
{
|
||||
super.performClick();
|
||||
return false;
|
||||
}
|
||||
|
||||
private void drawValueString(Canvas c, float cx, float cy, String str)
|
||||
{
|
||||
Rect b = new Rect();
|
||||
mTextPaint.getTextBounds(str, 0, str.length(), b);
|
||||
final float y = cy - b.exactCenterY();
|
||||
c.drawText(str, cx, y, mTextPaint);
|
||||
}
|
||||
|
||||
void configureTextSize()
|
||||
{
|
||||
String text = getValueString();
|
||||
if (text == null) return;
|
||||
final float textRadius = mBorderRadius - mBorderWidth;
|
||||
final float maxTextSize = 2f * textRadius;
|
||||
final float maxTextSize2 = maxTextSize * maxTextSize;
|
||||
float lo = 0f, hi = maxTextSize, sz = maxTextSize;
|
||||
Rect b = new Rect();
|
||||
while (lo <= hi)
|
||||
{
|
||||
sz = (lo + hi) / 2f;
|
||||
mTextPaint.setTextSize(sz);
|
||||
mTextPaint.getTextBounds(text, 0, text.length(), b);
|
||||
float area = b.width()*b.width() + b.height()*b.height();
|
||||
if (area <= maxTextSize2)
|
||||
lo = sz + 1f;
|
||||
else
|
||||
hi = sz - 1f;
|
||||
}
|
||||
mTextPaint.setTextSize(Math.max(1f, sz));
|
||||
}
|
||||
|
||||
/** child must return the string to draw, or null if nothing */
|
||||
@Nullable
|
||||
protected abstract String getValueString();
|
||||
|
||||
/** child decides if this is in “alert” state */
|
||||
protected abstract boolean isAlert();
|
||||
/** child decides if this is in “alert” state */
|
||||
protected abstract boolean isAlert();
|
||||
}
|
||||
|
||||
@@ -4,9 +4,7 @@ import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Pair;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
|
||||
@@ -22,18 +20,18 @@ public class CurrentSpeedView extends BaseSignView
|
||||
setBorderWidthRatio(0.1f);
|
||||
setBorderInsetRatio(0.05f);
|
||||
|
||||
try (TypedArray a = ctx.getTheme()
|
||||
.obtainStyledAttributes(attrs, R.styleable.CurrentSpeedView /* reuse same attrs or define new */ , 0, 0))
|
||||
try (TypedArray a = ctx.getTheme().obtainStyledAttributes(
|
||||
attrs, R.styleable.CurrentSpeedView /* reuse same attrs or define new */, 0, 0))
|
||||
{
|
||||
int bg = a.getColor(R.styleable.CurrentSpeedView_currentSpeedBackgroundColor, DefaultValues.BACKGROUND_COLOR);
|
||||
int bd = a.getColor(R.styleable.CurrentSpeedView_currentSpeedBorderColor, DefaultValues.BORDER_COLOR);
|
||||
int tc = a.getColor(R.styleable.CurrentSpeedView_currentSpeedTextColor, DefaultValues.TEXT_COLOR);
|
||||
int bg = a.getColor(R.styleable.CurrentSpeedView_currentSpeedBackgroundColor, DefaultValues.BACKGROUND_COLOR);
|
||||
int bd = a.getColor(R.styleable.CurrentSpeedView_currentSpeedBorderColor, DefaultValues.BORDER_COLOR);
|
||||
int tc = a.getColor(R.styleable.CurrentSpeedView_currentSpeedTextColor, DefaultValues.TEXT_COLOR);
|
||||
setColors(bg, bd, 0, tc, 0);
|
||||
|
||||
if (isInEditMode())
|
||||
{
|
||||
mSpeedMps = a.getInt(R.styleable.CurrentSpeedView_currentSpeedEditModeCurrentSpeed, 50);
|
||||
mSpeedStr = Integer.toString((int)mSpeedMps);
|
||||
mSpeedMps = a.getInt(R.styleable.CurrentSpeedView_currentSpeedEditModeCurrentSpeed, 50);
|
||||
mSpeedStr = Integer.toString((int) mSpeedMps);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -47,7 +45,7 @@ public class CurrentSpeedView extends BaseSignView
|
||||
}
|
||||
else
|
||||
{
|
||||
Pair<String,String> su = StringUtils.nativeFormatSpeedAndUnits(mps);
|
||||
Pair<String, String> su = StringUtils.nativeFormatSpeedAndUnits(mps);
|
||||
mSpeedStr = su.first;
|
||||
}
|
||||
requestLayout();
|
||||
@@ -70,8 +68,8 @@ public class CurrentSpeedView extends BaseSignView
|
||||
|
||||
private interface DefaultValues
|
||||
{
|
||||
int BACKGROUND_COLOR = 0xFFFFFFFF;
|
||||
int BORDER_COLOR = 0xFF000000;
|
||||
int TEXT_COLOR = 0xFF000000;
|
||||
int BACKGROUND_COLOR = 0xFFFFFFFF;
|
||||
int BORDER_COLOR = 0xFF000000;
|
||||
int TEXT_COLOR = 0xFF000000;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,12 +12,10 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
public class PlaceholderView extends LinearLayout
|
||||
{
|
||||
|
||||
@@ -5,16 +5,14 @@ import android.content.res.TypedArray;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import app.organicmaps.R;
|
||||
|
||||
public class SpeedLimitView extends BaseSignView
|
||||
{
|
||||
private int mSpeedLimit = -1;
|
||||
private boolean mAlert = false;
|
||||
private String mSpeedStr = "-1";
|
||||
private int mSpeedLimit = -1;
|
||||
private boolean mAlert = false;
|
||||
private String mSpeedStr = "-1";
|
||||
private final int unlimitedBorderColor;
|
||||
private final int unlimitedStripeColor;
|
||||
|
||||
@@ -27,15 +25,22 @@ public class SpeedLimitView extends BaseSignView
|
||||
|
||||
try (TypedArray styleAttrs = ctx.getTheme().obtainStyledAttributes(attrs, R.styleable.SpeedLimitView, 0, 0))
|
||||
{
|
||||
final int bgColor = styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitBackgroundColor, DefaultValues.BACKGROUND_COLOR);
|
||||
final int borderColor = styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitBorderColor, DefaultValues.BORDER_COLOR);
|
||||
final int alertColor = styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitAlertColor, DefaultValues.ALERT_COLOR);
|
||||
final int textColor = styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitTextColor, DefaultValues.TEXT_COLOR);
|
||||
final int txtAlertColor = styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitTextAlertColor, DefaultValues.TEXT_ALERT_COLOR);
|
||||
final int bgColor =
|
||||
styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitBackgroundColor, DefaultValues.BACKGROUND_COLOR);
|
||||
final int borderColor =
|
||||
styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitBorderColor, DefaultValues.BORDER_COLOR);
|
||||
final int alertColor =
|
||||
styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitAlertColor, DefaultValues.ALERT_COLOR);
|
||||
final int textColor =
|
||||
styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitTextColor, DefaultValues.TEXT_COLOR);
|
||||
final int txtAlertColor =
|
||||
styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitTextAlertColor, DefaultValues.TEXT_ALERT_COLOR);
|
||||
setColors(bgColor, borderColor, alertColor, textColor, txtAlertColor);
|
||||
|
||||
unlimitedBorderColor = styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitUnlimitedBorderColor, DefaultValues.UNLIMITED_BORDER_COLOR);
|
||||
unlimitedStripeColor = styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitUnlimitedStripeColor, DefaultValues.UNLIMITED_STRIPE_COLOR);
|
||||
unlimitedBorderColor = styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitUnlimitedBorderColor,
|
||||
DefaultValues.UNLIMITED_BORDER_COLOR);
|
||||
unlimitedStripeColor = styleAttrs.getColor(R.styleable.SpeedLimitView_speedLimitUnlimitedStripeColor,
|
||||
DefaultValues.UNLIMITED_STRIPE_COLOR);
|
||||
|
||||
if (isInEditMode())
|
||||
{
|
||||
@@ -51,7 +56,7 @@ public class SpeedLimitView extends BaseSignView
|
||||
if (mSpeedLimit != limit)
|
||||
{
|
||||
mSpeedLimit = limit;
|
||||
mSpeedStr = Integer.toString(limit);
|
||||
mSpeedStr = Integer.toString(limit);
|
||||
requestLayout();
|
||||
}
|
||||
mAlert = alert;
|
||||
@@ -75,7 +80,7 @@ public class SpeedLimitView extends BaseSignView
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas)
|
||||
{
|
||||
final float cx = mWidth/2f, cy = mHeight/2f;
|
||||
final float cx = mWidth / 2f, cy = mHeight / 2f;
|
||||
|
||||
if (mSpeedLimit == 0) // 0 means unlimited speed (maxspeed=none)
|
||||
{
|
||||
@@ -105,7 +110,7 @@ public class SpeedLimitView extends BaseSignView
|
||||
stripe.setStrokeWidth(mBorderWidth * 0.4f);
|
||||
|
||||
final float radius = mRadius * 0.8f; // Shorten to 80% of full radius
|
||||
final float diag = (float) (1/Math.sqrt(2)); // 45 degrees
|
||||
final float diag = (float) (1 / Math.sqrt(2)); // 45 degrees
|
||||
final float dx = -diag, dy = +diag;
|
||||
final float px = -dy, py = +dx; // Perpendicular
|
||||
final float step = radius * 0.15f; // Spacing
|
||||
@@ -122,14 +127,13 @@ public class SpeedLimitView extends BaseSignView
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private interface DefaultValues
|
||||
{
|
||||
int BACKGROUND_COLOR = 0xFFFFFFFF;
|
||||
int BORDER_COLOR = 0xFFFF0000;
|
||||
int ALERT_COLOR = 0xFFFF0000;
|
||||
int TEXT_COLOR = 0xFF000000;
|
||||
int TEXT_ALERT_COLOR = 0xFFFFFFFF;
|
||||
int BACKGROUND_COLOR = 0xFFFFFFFF;
|
||||
int BORDER_COLOR = 0xFFFF0000;
|
||||
int ALERT_COLOR = 0xFFFF0000;
|
||||
int TEXT_COLOR = 0xFF000000;
|
||||
int TEXT_ALERT_COLOR = 0xFFFFFFFF;
|
||||
int UNLIMITED_BORDER_COLOR = 0xFF000000;
|
||||
int UNLIMITED_STRIPE_COLOR = 0xFF000000;
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ public class MyPositionButton
|
||||
case LocationState.FOLLOW_AND_ROTATE -> R.drawable.ic_follow_and_rotate;
|
||||
default -> throw new IllegalArgumentException("Invalid button mode: " + mode);
|
||||
};
|
||||
image = ResourcesCompat.getDrawable(resources, drawableRes, context.getTheme());
|
||||
image = ResourcesCompat.getDrawable(resources, drawableRes, context.getTheme());
|
||||
mIcons.put(mode, image);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package app.organicmaps.widget.placepage;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import app.organicmaps.sdk.util.StringUtils;
|
||||
import com.github.mikephil.charting.charts.BarLineChartBase;
|
||||
import androidx.annotation.Nullable;
|
||||
import com.github.mikephil.charting.components.AxisBase;
|
||||
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
|
||||
|
||||
|
||||
@@ -105,7 +105,8 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
||||
public EditBookmarkFragment() {}
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
public void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setStyle(DialogFragment.STYLE_NORMAL, R.style.MwmTheme_FullScreenDialog);
|
||||
}
|
||||
@@ -184,10 +185,9 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View.
|
||||
{
|
||||
super.onStart();
|
||||
Dialog dialog = getDialog();
|
||||
if (dialog != null) {
|
||||
dialog.getWindow().setLayout(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.MATCH_PARENT);
|
||||
if (dialog != null)
|
||||
{
|
||||
dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
|
||||
}
|
||||
|
||||
// Focus name and show keyboard for "Unknown Place" bookmarks
|
||||
|
||||
@@ -6,9 +6,6 @@ import android.widget.RelativeLayout;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.widget.NestedScrollView;
|
||||
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.ChartController;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
@@ -17,6 +14,7 @@ import app.organicmaps.sdk.bookmarks.data.Track;
|
||||
import app.organicmaps.sdk.bookmarks.data.TrackStatistics;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.Utils;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
import java.util.Objects;
|
||||
|
||||
public class ElevationProfileViewRenderer implements PlacePageStateListener
|
||||
|
||||
@@ -14,7 +14,8 @@ public class OpenStateTextFormatter
|
||||
return String.format(Locale.ROOT, "%02d:%02d", hour, minute);
|
||||
|
||||
int h = hour % 12;
|
||||
if (h == 0) h = 12;
|
||||
if (h == 0)
|
||||
h = 12;
|
||||
String ampm = (hour < 12) ? "AM" : "PM";
|
||||
return String.format(Locale.ROOT, "%d:%02d %s", h, minute, ampm);
|
||||
}
|
||||
@@ -29,21 +30,13 @@ public class OpenStateTextFormatter
|
||||
return t.getDayOfWeek().getDisplayName(TextStyle.SHORT, locale);
|
||||
}
|
||||
|
||||
static String buildAtLabel(
|
||||
boolean opens,
|
||||
boolean isToday,
|
||||
String dayShort,
|
||||
String time,
|
||||
String opensAtLocalized,
|
||||
String closesAtLocalized,
|
||||
String opensDayAtLocalized,
|
||||
String closesDayAtLocalized
|
||||
)
|
||||
static String buildAtLabel(boolean opens, boolean isToday, String dayShort, String time, String opensAtLocalized,
|
||||
String closesAtLocalized, String opensDayAtLocalized, String closesDayAtLocalized)
|
||||
{
|
||||
if (isToday)
|
||||
return opens ? String.format(Locale.ROOT, opensAtLocalized, time) // Opens at %s
|
||||
: String.format(Locale.ROOT, closesAtLocalized, time); // Closes at %s
|
||||
: String.format(Locale.ROOT, closesAtLocalized, time); // Closes at %s
|
||||
return opens ? String.format(Locale.ROOT, opensDayAtLocalized, dayShort, time) // Opens %s at %s
|
||||
: String.format(Locale.ROOT, closesDayAtLocalized, dayShort, time); // Closes %s at %s
|
||||
: String.format(Locale.ROOT, closesDayAtLocalized, dayShort, time); // Closes %s at %s
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,6 +80,6 @@ public class PlacePageButtonFactory
|
||||
yield R.drawable.ic_more;
|
||||
}
|
||||
};
|
||||
return new PlacePageButton(titleId, iconId, buttonType);
|
||||
return new PlacePageButton(titleId, iconId, buttonType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,6 @@ import androidx.fragment.app.FragmentFactory;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.lifecycle.Observer;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import app.organicmaps.MwmActivity;
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
@@ -428,7 +427,7 @@ public class PlacePageView extends Fragment
|
||||
|
||||
private void updateBookmarkView()
|
||||
{
|
||||
boolean enabled = mMapObject.isBookmark() || mMapObject.isTrack();
|
||||
boolean enabled = mMapObject.isBookmark() || mMapObject.isTrack();
|
||||
updateViewFragment(PlacePageBookmarkFragment.class, BOOKMARK_FRAGMENT_TAG, R.id.place_page_bookmark_fragment,
|
||||
enabled);
|
||||
}
|
||||
@@ -715,12 +714,10 @@ public class PlacePageView extends Fragment
|
||||
// map editing is disabled because the map is too old
|
||||
mTvEditPlace.setEnabled(true);
|
||||
mTvAddPlace.setEnabled(true);
|
||||
mTvEditPlace.setOnClickListener((v) -> {
|
||||
Utils.showSnackbar(v.getContext(), v.getRootView(), R.string.place_page_too_old_to_edit);
|
||||
});
|
||||
mTvAddPlace.setOnClickListener((v) -> {
|
||||
Utils.showSnackbar(v.getContext(), v.getRootView(), R.string.place_page_too_old_to_edit);
|
||||
});
|
||||
mTvEditPlace.setOnClickListener(
|
||||
(v) -> { Utils.showSnackbar(v.getContext(), v.getRootView(), R.string.place_page_too_old_to_edit); });
|
||||
mTvAddPlace.setOnClickListener(
|
||||
(v) -> { Utils.showSnackbar(v.getContext(), v.getRootView(), R.string.place_page_too_old_to_edit); });
|
||||
|
||||
CountryItem map = CountryItem.fill(countryId);
|
||||
|
||||
@@ -765,9 +762,7 @@ public class PlacePageView extends Fragment
|
||||
mTvAddPlace.setTextColor(editButtonColor);
|
||||
mTvEditPlace.setStrokeColor(ColorStateList.valueOf(editButtonColor));
|
||||
mTvAddPlace.setStrokeColor(ColorStateList.valueOf(editButtonColor));
|
||||
UiUtils.showIf(
|
||||
UiUtils.isVisible(mEditPlace) || UiUtils.isVisible(mAddPlace),
|
||||
mEditTopSpace);
|
||||
UiUtils.showIf(UiUtils.isVisible(mEditPlace) || UiUtils.isVisible(mAddPlace), mEditTopSpace);
|
||||
}
|
||||
updateLinksView();
|
||||
updateOpeningHoursView();
|
||||
@@ -868,10 +863,9 @@ public class PlacePageView extends Fragment
|
||||
}
|
||||
|
||||
// Get colours
|
||||
final ForegroundColorSpan colorGreen =
|
||||
new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_green));
|
||||
final ForegroundColorSpan colorGreen = new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_green));
|
||||
final ForegroundColorSpan colorYellow =
|
||||
new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_yellow));
|
||||
new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_yellow));
|
||||
final ForegroundColorSpan colorRed = new ForegroundColorSpan(ContextCompat.getColor(context, R.color.base_red));
|
||||
|
||||
// Get next state info
|
||||
@@ -897,13 +891,12 @@ public class PlacePageView extends Fragment
|
||||
if (nextStateTime > 0 && nextStateTime < Long.MAX_VALUE / 2)
|
||||
{
|
||||
// NOTE: Timezone is currently device timezone. TODO: use feature-specific timezone.
|
||||
nextChangeLocal = ZonedDateTime.ofInstant(
|
||||
Instant.ofEpochSecond(nextStateTime), ZoneId.systemDefault()
|
||||
);
|
||||
nextChangeLocal = ZonedDateTime.ofInstant(Instant.ofEpochSecond(nextStateTime), ZoneId.systemDefault());
|
||||
hasFiniteNextChange = true;
|
||||
}
|
||||
}
|
||||
catch (Throwable ignored) {}
|
||||
catch (Throwable ignored)
|
||||
{}
|
||||
}
|
||||
|
||||
if (!hasFiniteNextChange) // No valid next change
|
||||
@@ -918,7 +911,7 @@ public class PlacePageView extends Fragment
|
||||
}
|
||||
|
||||
String localizedTimeString = OpenStateTextFormatter.formatHoursMinutes(
|
||||
nextChangeLocal.getHour(), nextChangeLocal.getMinute(), DateUtils.is24HourFormat(context));
|
||||
nextChangeLocal.getHour(), nextChangeLocal.getMinute(), DateUtils.is24HourFormat(context));
|
||||
|
||||
final boolean shortHorizonClosing = isOpen && minsToNextState >= 0 && minsToNextState <= SHORT_HORIZON_CLOSE_MIN;
|
||||
final boolean shortHorizonOpening = !isOpen && minsToNextState >= 0 && minsToNextState <= SHORT_HORIZON_OPEN_MIN;
|
||||
@@ -926,12 +919,12 @@ public class PlacePageView extends Fragment
|
||||
if (shortHorizonClosing || shortHorizonOpening) // POI Opens/Closes in 60 mins • at 18:00
|
||||
{
|
||||
final String minsToChangeStr = getResources().getQuantityString(
|
||||
R.plurals.minutes_short, Math.max(minsToNextState, 1), Math.max(minsToNextState, 1));
|
||||
R.plurals.minutes_short, Math.max(minsToNextState, 1), Math.max(minsToNextState, 1));
|
||||
final String nextChangeFormatted = getString(isOpen ? R.string.closes_in : R.string.opens_in, minsToChangeStr);
|
||||
|
||||
openStateString.append(nextChangeFormatted, colorYellow, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||
.append(" • ") // Add spacer
|
||||
.append(getString(R.string.at, localizedTimeString));
|
||||
.append(" • ") // Add spacer
|
||||
.append(getString(R.string.at, localizedTimeString));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -941,18 +934,16 @@ public class PlacePageView extends Fragment
|
||||
final String closesDayAtStr = getString(R.string.closes_day_at); // "Closes %1$s at %2$s"
|
||||
|
||||
final boolean isToday =
|
||||
OpenStateTextFormatter.isSameLocalDate(nextChangeLocal, ZonedDateTime.now(nextChangeLocal.getZone()));
|
||||
OpenStateTextFormatter.isSameLocalDate(nextChangeLocal, ZonedDateTime.now(nextChangeLocal.getZone()));
|
||||
// Full weekday name per design feedback.
|
||||
final String dayName =
|
||||
nextChangeLocal.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.getDefault());
|
||||
final String dayName = nextChangeLocal.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.getDefault());
|
||||
|
||||
if (isOpen) // > 60 minutes OR negative (safety). Show “Open now • Closes at 18:00”
|
||||
{
|
||||
openStateString.append(getString(R.string.open_now), colorGreen, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
|
||||
final String atLabel =
|
||||
OpenStateTextFormatter.buildAtLabel(false, isToday, dayName, localizedTimeString,
|
||||
opensAtStr, closesAtStr, opensDayAtStr, closesDayAtStr);
|
||||
final String atLabel = OpenStateTextFormatter.buildAtLabel(
|
||||
false, isToday, dayName, localizedTimeString, opensAtStr, closesAtStr, opensDayAtStr, closesDayAtStr);
|
||||
|
||||
if (!TextUtils.isEmpty(atLabel))
|
||||
openStateString.append(" • ").append(atLabel);
|
||||
@@ -961,9 +952,8 @@ public class PlacePageView extends Fragment
|
||||
{
|
||||
openStateString.append(getString(R.string.closed_now), colorRed, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
|
||||
final String atLabel =
|
||||
OpenStateTextFormatter.buildAtLabel(true, isToday, dayName, localizedTimeString,
|
||||
opensAtStr, closesAtStr, opensDayAtStr, closesDayAtStr);
|
||||
final String atLabel = OpenStateTextFormatter.buildAtLabel(
|
||||
true, isToday, dayName, localizedTimeString, opensAtStr, closesAtStr, opensDayAtStr, closesDayAtStr);
|
||||
|
||||
if (!TextUtils.isEmpty(atLabel))
|
||||
openStateString.append(" • ").append(atLabel);
|
||||
|
||||
@@ -3,9 +3,7 @@ package app.organicmaps.widget.placepage;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
import androidx.lifecycle.ViewModel;
|
||||
|
||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PlacePageViewModel extends ViewModel
|
||||
|
||||
@@ -32,7 +32,8 @@ import app.organicmaps.widget.placepage.PlacePageViewModel;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
public class PlacePageBookmarkFragment extends Fragment implements View.OnClickListener, View.OnLongClickListener,
|
||||
Observer<MapObject>, EditBookmarkFragment.EditBookmarkListener
|
||||
Observer<MapObject>,
|
||||
EditBookmarkFragment.EditBookmarkListener
|
||||
{
|
||||
private View mFrame;
|
||||
private MaterialTextView mTvBookmarkNote;
|
||||
@@ -90,15 +91,15 @@ public class PlacePageBookmarkFragment extends Fragment implements View.OnClickL
|
||||
|
||||
private void updateBookmarkDetails()
|
||||
{
|
||||
String notes = null;
|
||||
if (currentBookmark != null)
|
||||
{
|
||||
notes = currentBookmark.getBookmarkDescription();
|
||||
}
|
||||
if (currentTrack != null)
|
||||
{
|
||||
notes = currentTrack.getTrackDescription();
|
||||
}
|
||||
String notes = null;
|
||||
if (currentBookmark != null)
|
||||
{
|
||||
notes = currentBookmark.getBookmarkDescription();
|
||||
}
|
||||
if (currentTrack != null)
|
||||
{
|
||||
notes = currentTrack.getTrackDescription();
|
||||
}
|
||||
if (TextUtils.isEmpty(notes))
|
||||
{
|
||||
UiUtils.hide(mTvBookmarkNote);
|
||||
@@ -132,13 +133,13 @@ public class PlacePageBookmarkFragment extends Fragment implements View.OnClickL
|
||||
final FragmentActivity activity = requireActivity();
|
||||
if (currentBookmark != null)
|
||||
{
|
||||
EditBookmarkFragment.editBookmark(currentBookmark.getCategoryId(), currentBookmark.getBookmarkId(), activity,
|
||||
getChildFragmentManager(), PlacePageBookmarkFragment.this);
|
||||
EditBookmarkFragment.editBookmark(currentBookmark.getCategoryId(), currentBookmark.getBookmarkId(), activity,
|
||||
getChildFragmentManager(), PlacePageBookmarkFragment.this);
|
||||
}
|
||||
else if (currentTrack != null)
|
||||
{
|
||||
EditBookmarkFragment.editBookmark(currentTrack.getCategoryId(), currentTrack.getTrackId(), activity,
|
||||
getChildFragmentManager(), PlacePageBookmarkFragment.this);
|
||||
EditBookmarkFragment.editBookmark(currentTrack.getCategoryId(), currentTrack.getTrackId(), activity,
|
||||
getChildFragmentManager(), PlacePageBookmarkFragment.this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -13,15 +13,13 @@ import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.Observer;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.bookmarks.data.ChargeSocketDescriptor;
|
||||
import app.organicmaps.sdk.bookmarks.data.MapObject;
|
||||
import app.organicmaps.widget.placepage.PlacePageViewModel;
|
||||
import com.google.android.material.imageview.ShapeableImageView;
|
||||
import com.google.android.material.textview.MaterialTextView;
|
||||
import java.text.DecimalFormat;
|
||||
|
||||
public class PlacePageChargeSocketsFragment extends Fragment implements Observer<MapObject>
|
||||
@@ -96,8 +94,8 @@ public class PlacePageChargeSocketsFragment extends Fragment implements Observer
|
||||
}
|
||||
|
||||
@SuppressLint("DiscouragedApi")
|
||||
int resTypeId =
|
||||
getResources().getIdentifier("charge_socket_" + socket.visualType(), "string", requireContext().getPackageName());
|
||||
int resTypeId = getResources().getIdentifier("charge_socket_" + socket.visualType(), "string",
|
||||
requireContext().getPackageName());
|
||||
if (resTypeId != 0)
|
||||
{
|
||||
type.setText(resTypeId);
|
||||
@@ -108,7 +106,8 @@ public class PlacePageChargeSocketsFragment extends Fragment implements Observer
|
||||
DecimalFormat df = new DecimalFormat("#.##");
|
||||
power.setText(getString(R.string.kw_label, df.format(socket.power())));
|
||||
}
|
||||
else if (socket.ignorePower()) {
|
||||
else if (socket.ignorePower())
|
||||
{
|
||||
power.setVisibility(INVISIBLE);
|
||||
}
|
||||
|
||||
|
||||
@@ -191,8 +191,9 @@ public class PlacePageLinksFragment extends Fragment implements Observer<MapObje
|
||||
case FMD_PANORAMAX -> null; // Don't add raw ID to list, as it's useless for users.
|
||||
default -> mMapObject.getMetadata(type);
|
||||
};
|
||||
// Add user names for social media if available
|
||||
if (!TextUtils.isEmpty(title) && !title.equals(url) && !title.contains("/")) items.add(title);
|
||||
// Add user names for social media if available
|
||||
if (!TextUtils.isEmpty(title) && !title.equals(url) && !title.contains("/"))
|
||||
items.add(title);
|
||||
|
||||
if (items.size() == 1)
|
||||
PlacePageUtils.copyToClipboard(requireContext(), mFrame, items.get(0));
|
||||
|
||||
@@ -3,9 +3,47 @@
|
||||
android:width="74dp"
|
||||
android:height="57dp"
|
||||
android:viewportWidth="74"
|
||||
android:viewportHeight="57"
|
||||
android:tint="?iconTint">
|
||||
android:viewportHeight="57">
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="m26.278,8.137c3.695,-3.729 9.719,-3.761 13.453,-0.073 3.736,3.687 3.769,9.699 0.074,13.425L25.208,36.215c-2.353,2.373 -2.331,6.197 0.046,8.544 2.379,2.345 6.209,2.326 8.562,-0.048L48.119,30.283c-0.155,-0.32 -0.286,-0.647 -0.394,-0.978l-4.006,0.001c-2.787,0 -3.659,-3.825 -1.045,-5.042L65.323,13.832c2.091,-0.869 4.357,1.392 3.486,3.478L58.355,39.913c-1.219,2.607 -5.053,1.736 -5.053,-1.044V34.451c-0.506,-0.122 -1.006,-0.296 -1.494,-0.525L37.505,48.354C33.137,52.76 26.02,52.798 21.604,48.44 17.191,44.082 17.152,36.979 21.52,32.573L36.117,17.847c1.68,-1.693 1.665,-4.426 -0.033,-6.102 -1.7,-1.677 -4.437,-1.662 -6.117,0.033l-9.43,9.516c0.436,0.994 0.679,2.091 0.679,3.244 0,4.464 -3.634,8.091 -8.108,8.091C8.633,32.629 5,29.002 5,24.538c0,-4.466 3.633,-8.091 8.108,-8.091 1.424,0 2.764,0.367 3.928,1.012z" />
|
||||
android:pathData="m67.3,21.772 l-28.103,11.757 11.772,5.095 5.463,11.606z"
|
||||
android:strokeLineJoin="round"
|
||||
android:strokeWidth="2"
|
||||
android:fillColor="#757575"
|
||||
android:strokeColor="#757575" />
|
||||
<path
|
||||
android:pathData="M45.042,44.7m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M37.942,51.6m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M27.842,52m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="m26.942,43.5c0,2.485 -2.015,4.5 -4.5,4.5 -2.485,0 -4.5,-2.015 -4.5,-4.5 0,-2.485 2.015,-4.5 4.5,-4.5 2.485,0 4.5,2.015 4.5,4.5z"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M26.642,34.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M34.042,27.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M40.842,20.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M41.842,10.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M32.842,4.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M23.842,9.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M16.842,16.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
<path
|
||||
android:pathData="M9.842,23.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0"
|
||||
android:fillColor="#757575" />
|
||||
</vector>
|
||||
|
||||
@@ -6,9 +6,48 @@
|
||||
android:viewportHeight="80">
|
||||
<path
|
||||
android:pathData="m4.858,10.076c0,-5.523 4.477,-10 10,-10h60c5.523,0 10,4.477 10,10v60c0,5.523 -4.477,10 -10,10h-60c-5.523,0 -10,-4.477 -10,-10z"
|
||||
android:fillColor="@color/base_red"
|
||||
android:fillColor="@color/active_track_recording"
|
||||
android:fillAlpha="0.78" />
|
||||
<path
|
||||
android:pathData="m33.024,19.508c3.955,-3.981 10.402,-4.015 14.399,-0.078 3.999,3.937 4.034,10.355 0.079,14.333L31.879,49.485c-2.518,2.534 -2.495,6.616 0.049,9.122 2.546,2.504 6.646,2.483 9.164,-0.051L56.401,43.152c-0.166,-0.342 -0.306,-0.691 -0.422,-1.044l-4.288,0.001c-2.983,0 -3.916,-4.084 -1.118,-5.383L74.814,25.588c2.238,-0.928 4.663,1.486 3.731,3.713L67.356,53.433c-1.305,2.783 -5.408,1.854 -5.408,-1.115V47.601c-0.542,-0.13 -1.077,-0.316 -1.599,-0.561L45.04,62.444C40.365,67.148 32.747,67.189 28.021,62.536 23.298,57.883 23.256,50.299 27.931,45.595L43.554,29.873c1.798,-1.808 1.782,-4.725 -0.035,-6.515 -1.819,-1.79 -4.749,-1.774 -6.547,0.035l-10.093,10.16c0.467,1.061 0.727,2.232 0.727,3.464 0,4.766 -3.89,8.638 -8.678,8.638 -4.79,0 -8.678,-3.872 -8.678,-8.638 0,-4.768 3.888,-8.638 8.678,-8.638 1.524,0 2.958,0.392 4.204,1.081z"
|
||||
android:fillColor="#ffffff"/>
|
||||
android:pathData="m78.907,32.87 l-31.833,13.318 13.335,5.772 6.188,13.147z"
|
||||
android:strokeLineJoin="round"
|
||||
android:strokeWidth="2"
|
||||
android:fillColor="#ffffff"
|
||||
android:strokeColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M49.731,57.709a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M41.688,65.525a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M30.247,65.978a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="m34.324,56.35c0,2.815 -2.282,5.097 -5.097,5.097 -2.815,0 -5.097,-2.282 -5.097,-5.097 0,-2.815 2.282,-5.097 5.097,-5.097 2.815,0 5.097,2.282 5.097,5.097z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M28.888,46.155a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M37.27,38.226a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M44.974,30.297a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M46.106,18.969a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M35.911,12.173a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M25.718,17.837a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M17.788,25.766a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
<path
|
||||
android:pathData="M9.858,33.695a5.097,5.097 0,1 0,10.195 0a5.097,5.097 0,1 0,-10.195 0z"
|
||||
android:fillColor="#ffffff" />
|
||||
</vector>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:clipToPadding="false"
|
||||
android:background="?colorSurfaceContainerLow"
|
||||
android:background="@color/bg_editor"
|
||||
tools:context=".editor.EditorActivity">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:id="@+id/frameLayout"
|
||||
android:background="?colorSurfaceContainerLow"
|
||||
android:background="@color/bg_editor"
|
||||
android:layout_marginBottom="@dimen/margin_quarter">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
style="@style/MwmWidget.FrameLayout.Elevation"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?colorSurfaceContainerLow"
|
||||
android:background="@color/bg_editor"
|
||||
android:layout_above="@+id/tv__mode_switch"
|
||||
android:layout_below="@id/toolbar"/>
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignTop="@+id/tv__mode_switch"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:background="?colorSurfaceContainerLow"/>
|
||||
android:background="@color/bg_editor"/>
|
||||
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/tv__mode_switch"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?colorSurfaceContainerLow">
|
||||
android:background="@color/bg_editor">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
android:id="@+id/recycler"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?colorSurfaceContainerLow"
|
||||
android:background="@color/bg_editor"
|
||||
android:paddingStart="@dimen/margin_half"
|
||||
android:paddingEnd="@dimen/margin_half"
|
||||
android:scrollbars="vertical"/>
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
android:orientation="vertical"
|
||||
android:paddingEnd="@dimen/margin_base"
|
||||
android:paddingStart="@dimen/margin_base"
|
||||
android:background="@color/fg_editor"
|
||||
android:animateLayoutChanges="true">
|
||||
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
@@ -24,6 +25,7 @@
|
||||
android:id="@+id/recycler"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@color/fg_editor"
|
||||
android:scrollbars="vertical"/>
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
android:tint="?iconTint"
|
||||
app:srcCompat="@drawable/ic_plus"
|
||||
app:shapeAppearanceOverlay="@style/ShapeAppearance.MapButton.Zoom.Minus"
|
||||
android:layout_marginBottom="@dimen/margin_eighth_plus"
|
||||
android:layout_marginBottom="@dimen/margin_eighth"
|
||||
android:contentDescription="@string/zoom_in"/>
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/nav_zoom_out"
|
||||
|
||||
@@ -2,22 +2,22 @@
|
||||
<resources>
|
||||
<!-- SECTION: Strings -->
|
||||
<!-- Button text (should be short) -->
|
||||
<string name="back">ارجع</string>
|
||||
<string name="back">رجوع</string>
|
||||
<!-- Button text (should be short) -->
|
||||
<string name="cancel">ألغِ</string>
|
||||
<string name="cancel">إلغاء</string>
|
||||
<!-- Button which deletes downloaded country -->
|
||||
<string name="delete">احذف</string>
|
||||
<string name="download_maps">نزّل الخرائط</string>
|
||||
<string name="delete">حذف</string>
|
||||
<string name="download_maps">تنزيل الخرائط</string>
|
||||
<!-- Settings/Downloader - info for country when download fails -->
|
||||
<string name="download_has_failed">فشلت عملية التنزيل، انقر لإعادة المحاولة</string>
|
||||
<!-- Settings/Downloader - info for country which started downloading -->
|
||||
<string name="downloading">جارِ التنزيل…</string>
|
||||
<string name="downloading">جاري التنزيل…</string>
|
||||
<!-- Choose measurement on first launch alert - choose metric system button -->
|
||||
<string name="kilometres">الكيلومترات</string>
|
||||
<!-- Choose measurement on first launch alert - choose imperial system button -->
|
||||
<string name="miles">الأميال</string>
|
||||
<!-- Update maps later button text -->
|
||||
<string name="later">لاحقًا</string>
|
||||
<string name="later">ًلاحقا</string>
|
||||
<!-- View and button titles for accessibility, please also edit it in iphone/plist.txt -->
|
||||
<string name="search">البحث</string>
|
||||
<!-- Search box placeholder text; Used when searching on the map itself, not when searching for a map -->
|
||||
|
||||
@@ -148,7 +148,7 @@
|
||||
<!-- message title of loading file -->
|
||||
<string name="load_kmz_title">Načítání oblíbených</string>
|
||||
<!-- Kmz file successful loading -->
|
||||
<string name="load_kmz_successful">Oblíbené byly úspěšně nahrány! Naleznete je na mapě nebo ve správci oblíbených.</string>
|
||||
<string name="load_kmz_successful">Oblíbená místa byla úspěšně nahrána! Naleznete je na mapě nebo ve správci oblíbených.</string>
|
||||
<!-- Kml file loading failed -->
|
||||
<string name="load_kmz_failed">Nepodařilo se načíst oblíbená místa. Soubor může být poškozený nebo vadný.</string>
|
||||
<!-- Failed to recognize the format of a bookmarks or tracks file. -->
|
||||
@@ -804,7 +804,7 @@
|
||||
<string name="error_enter_correct_instagram_page">Zadejte platné uživatelské jméno nebo webovou adresu Instagramu</string>
|
||||
<string name="error_enter_correct_twitter_page">Zadejte platné uživatelské jméno nebo webovou adresu Twitteru</string>
|
||||
<string name="maps_storage_free_size">%1$s z %2$s volných</string>
|
||||
<string name="share_bookmarks_email_body">Ahoj! \n \nV příloze najdeš má oblíbená místa; otevři je v aplikaci CoMaps. Pokud ji nemáš nainstalovanou, můžeš si ji stáhnout zde: https://www.comaps.app/cs/download/\n \nUžij si cestování s CoMaps!</string>
|
||||
<string name="share_bookmarks_email_body">Ahoj! \n \nV příloze najdeš má oblíbená místa; otevři je v aplikaci CoMaps. Pokud ji nemáš nainstalovanou, můžeš si ji stáhnout zde: https://www.comaps.app/download/ \n \nUžij si cestování s CoMaps!</string>
|
||||
<string name="disk_error">Nepodařilo se vytvořit složku a přesunout soubory v interní paměti zařízení nebo na SD kartě</string>
|
||||
<string name="comma_separated_pair">%1$s, %2$s</string>
|
||||
<string name="error_enter_correct_vk_page">Zadejte platné uživatelské jméno nebo webovou adresu VK</string>
|
||||
|
||||
@@ -68,11 +68,11 @@
|
||||
<!-- "Add new bookmark list" dialog title -->
|
||||
<string name="add_new_set">Tilføj en ny liste</string>
|
||||
<!-- Add Bookmark list dialog - hint when the list name is empty -->
|
||||
<string name="bookmark_set_name">Listenavn</string>
|
||||
<string name="bookmark_set_name">Indstil navn for bogmærkeliste</string>
|
||||
<!-- Should be used in the bookmarks-only context, see bookmarks_and_tracks if tracks are also implied. -->
|
||||
<string name="bookmarks">Steder</string>
|
||||
<string name="bookmarks">Bogmærker</string>
|
||||
<!-- "Bookmarks and Tracks" dialog title, also sync it with iphone/plist.txt -->
|
||||
<string name="bookmarks_and_tracks">Favoritter</string>
|
||||
<string name="bookmarks_and_tracks">Bogmærker og spor</string>
|
||||
<!-- Add bookmark dialog - bookmark name -->
|
||||
<string name="name">Navn</string>
|
||||
<!-- Editor title above street and house number, duplicates [type.building.address] in types_strings.txt -->
|
||||
@@ -144,13 +144,13 @@
|
||||
<!-- Notes field in Bookmarks view -->
|
||||
<string name="description">Noter</string>
|
||||
<!-- Email Subject when sharing bookmark list -->
|
||||
<string name="share_bookmarks_email_subject">Mine CoMaps-favoritter</string>
|
||||
<string name="share_bookmarks_email_subject">CoMaps bogmærker er blevet delt med dig</string>
|
||||
<!-- message title of loading file -->
|
||||
<string name="load_kmz_title">Indlæser favoritter</string>
|
||||
<string name="load_kmz_title">Indlæser bogmærker</string>
|
||||
<!-- Kmz file successful loading -->
|
||||
<string name="load_kmz_successful">Favoritter er indlæst! Du kan finde dem på kortet eller på skærmen for favorithåndtering.</string>
|
||||
<string name="load_kmz_successful">Bogmærker er indlæst! Du kan finde dem på kortet eller på skærmen for bogmærkehåndtering.</string>
|
||||
<!-- Kml file loading failed -->
|
||||
<string name="load_kmz_failed">Favoritter kunne ikke indlæses. Filen kan være skadet eller defekt.</string>
|
||||
<string name="load_kmz_failed">Bogmærkerne kunne ikke indlæses. Filen kan være skadet eller defekt.</string>
|
||||
<!-- Failed to recognize the format of a bookmarks or tracks file. -->
|
||||
<string name="unknown_file_type">Filtypen genkendes ikke af appen: \n%1$s</string>
|
||||
<!-- Failed to open a bookmarks or tracks file in CoMaps. -->
|
||||
@@ -486,7 +486,7 @@
|
||||
<string name="minute">min</string>
|
||||
<string name="day">d</string>
|
||||
<string name="placepage_more_button">Mere</string>
|
||||
<string name="placepage_edit_bookmark_button">Rediger gemt sted</string>
|
||||
<string name="placepage_edit_bookmark_button">Rediger bogmærke</string>
|
||||
<string name="placepage_personal_notes_hint">Personlige notater (tekst eller html)</string>
|
||||
<string name="editor_reset_edits_message">Kassér alle lokale ændringer?</string>
|
||||
<string name="editor_reset_edits_button">Kassér ændringer</string>
|
||||
@@ -543,17 +543,17 @@
|
||||
<string name="dialog_error_storage_message">Eksternt lager er ikke tilgængeligt. SD-kortet kan være blevet fjernet eller beskadiget, eller filsystemet er skrivebeskyttet. Kontroller dit SD-kort eller kontakt os på support@comaps.app</string>
|
||||
<string name="setting_emulate_bad_storage">Emulér beskadiget lager</string>
|
||||
<string name="error_enter_correct_name">Angiv et korrekt navn</string>
|
||||
<string name="bookmark_lists">Favoritlister</string>
|
||||
<string name="bookmark_lists">Lister</string>
|
||||
<!-- Do not display all bookmark lists on the map -->
|
||||
<string name="bookmark_lists_hide_all">Skjul alle</string>
|
||||
<string name="bookmark_lists_show_all">Vis alle</string>
|
||||
<plurals name="bookmarks_places">
|
||||
<item quantity="one">%d gemt sted</item>
|
||||
<item quantity="other">%d gemte steder</item>
|
||||
<item quantity="one">%d bogmærke</item>
|
||||
<item quantity="other">%d bogmærker</item>
|
||||
</plurals>
|
||||
<string name="bookmarks_create_new_group">Opret ny liste</string>
|
||||
<!-- Bookmark categories screen, button that opens folder selection dialog to import KML/KMZ/GPX/KMB files -->
|
||||
<string name="bookmarks_import">Importer favoritter</string>
|
||||
<string name="bookmarks_import">Importer bogmærker og spor</string>
|
||||
<string name="bookmarks_error_message_share_general">Ikke i stand til at dele på grund af en applikationsfejl</string>
|
||||
<string name="bookmarks_error_title_share_empty">Delingsfejl</string>
|
||||
<string name="bookmarks_error_message_share_empty">Kan ikke dele en tom liste</string>
|
||||
@@ -582,7 +582,7 @@
|
||||
<string name="subway">Undergrundsbane</string>
|
||||
<string name="layers_title">Kortstile og -lag</string>
|
||||
<string name="bookmarks_empty_list_title">Listen er tom</string>
|
||||
<string name="bookmarks_empty_list_message">For at gemme et sted, så tryk et sted på kortet og dernæst på stjerneikonet</string>
|
||||
<string name="bookmarks_empty_list_message">For at tilføje et bogmærke, så tryk et sted på kort og så på stjerneikonet</string>
|
||||
<string name="category_desc_more">…mere</string>
|
||||
<string name="export_file">Eksporter KMZ</string>
|
||||
<string name="export_file_gpx">Eksporter GPX</string>
|
||||
@@ -635,7 +635,7 @@
|
||||
<!-- max. 10 symbols, both iOS and Android -->
|
||||
<string name="sort">Sorter…</string>
|
||||
<!-- Android, title, max 20-22 symbols -->
|
||||
<string name="sort_bookmarks">Sorter favoritter</string>
|
||||
<string name="sort_bookmarks">Sorter bogmærker</string>
|
||||
<!-- Android -->
|
||||
<string name="by_default">Som standard</string>
|
||||
<!-- Android -->
|
||||
@@ -736,7 +736,7 @@
|
||||
<string name="browser_not_available">Webbrowser er ikke tilgængelig</string>
|
||||
<string name="volume">Lydstyrke</string>
|
||||
<!-- Bookmark categories screen, button that opens share dialog to export all bookmarks and tracks -->
|
||||
<string name="bookmarks_export">Eksporter alle steder og spor</string>
|
||||
<string name="bookmarks_export">Eksporter alle bogmærker og spor</string>
|
||||
<!-- button in (app) TTS settings, to open the system TTS settings. -->
|
||||
<string name="pref_tts_open_system_settings">Indstillinger for talesyntese-system</string>
|
||||
<!-- toast displayed when pressing the "Speech synthesis system settings" button, and the system settings aren't found. -->
|
||||
@@ -768,7 +768,7 @@
|
||||
<!-- Title for the "Stop Without Saving" action for the alert when saving a track recording. -->
|
||||
<string name="continue_recording">Fortsæt optagelse</string>
|
||||
<!-- Title for the alert when saving a track recording. -->
|
||||
<string name="track_recording_alert_title">Gem i favoritter?</string>
|
||||
<string name="track_recording_alert_title">Gem i bogmærker og spor?</string>
|
||||
<!-- Message for the toast when saving the track recording is finished but nothing to save. -->
|
||||
<string name="track_recording_toast_nothing_to_save">Sporet er tomt - der er ikke noget at gemme</string>
|
||||
<!-- Error message when there are no File Manager apps installed to select a folder when importing Bookmarks and Tracks -->
|
||||
@@ -787,7 +787,7 @@
|
||||
<string name="error_enter_correct_facebook_page">Indtast en gyldig Facebook-webadresse, -konto eller -sidenavn</string>
|
||||
<string name="connection_failure">Forbindelsesfejl</string>
|
||||
<string name="error_enter_correct_twitter_page">Indtast et gyldigt Twitter-brugernavn eller en webadresse</string>
|
||||
<string name="share_bookmarks_email_body">Hej! \n \nVedhæftet er mine favoritter; åbn dem i CoMaps. Hvis du ikke har den installeret, kan du downloade den her: https://www.comaps.app/download/\n \nGod rejse med CoMaps!</string>
|
||||
<string name="share_bookmarks_email_body">Hej! \n \nVedhæftet er mine bogmærker; åbn dem venligst i CoMaps. Hvis du ikke har den installeret, kan du downloade den her: https://www.comaps.app/download/\n \nGod rejse med CoMaps!</string>
|
||||
<string name="delete_place_empty_comment_error">Angiv begrundelsen for at slette stedet</string>
|
||||
<string name="disk_error_title">Diskfejl</string>
|
||||
<string name="error_enter_correct_instagram_page">Indtast et gyldigt Instagram-brugernavn eller en webadresse</string>
|
||||
@@ -817,7 +817,7 @@
|
||||
<string name="error_enter_correct_bluesky_page">Indtast et gyldigt Bluesky-brugernavn eller en webadresse</string>
|
||||
<string name="editor_level">Etage (0 er stueetage)</string>
|
||||
<string name="pref_backup_now_summary_ok">Sikkerhedskopiering fuldført</string>
|
||||
<string name="pref_backup_now_summary_empty_lists">Ingen steder og spor at lave sikkerhedskopi af</string>
|
||||
<string name="pref_backup_now_summary_empty_lists">Ingen bogmærker og spor at lave sikkerhedskopi af</string>
|
||||
<string name="pref_backup_now_summary_failed">Sikkerhedskopiering mislykkedes</string>
|
||||
<string name="pref_backup_now_summary_folder_unavailable">Mappen til sikkerhedskopiering er ikke tilgængelig</string>
|
||||
<string name="pref_backup_status_summary_success">Sidste vellykkede sikkerhedskopiering</string>
|
||||
@@ -832,7 +832,7 @@
|
||||
<string name="editor_building_levels">Etager (inkl. stueetage, ekskl. tag)</string>
|
||||
<string name="error_enter_correct_level">Indtast et gyldigt etagenummer</string>
|
||||
<string name="pref_left_button_title">Indstilling af venstre knap</string>
|
||||
<string name="pref_backup_title">Sikkerhedskopi af favoritter</string>
|
||||
<string name="pref_backup_title">Sikkerhedskopi af bogmærker og spor</string>
|
||||
<string name="pref_backup_now_title">Sikkerhedskopiér nu</string>
|
||||
<string name="pref_backup_now_summary">Opret en sikkerhedskopi straks</string>
|
||||
<string name="clear">Ryd</string>
|
||||
@@ -841,7 +841,7 @@
|
||||
<string name="pedestrian">Fodgænger</string>
|
||||
<string name="bicycle">Cykel</string>
|
||||
<string name="ruler">Lineal</string>
|
||||
<string name="bookmark_color">Favoritfarve</string>
|
||||
<string name="bookmark_color">Bogmærkefarve</string>
|
||||
<string name="pref_backup_summary">Automatisk sikkerhedskopiering til en mappe på din enhed</string>
|
||||
<string name="pref_backup_now_summary_progress">Sikkerhedskopiering i gang…</string>
|
||||
<string name="pref_backup_location_title">Placering af sikkerhedskopi</string>
|
||||
@@ -907,5 +907,4 @@
|
||||
<string name="download_resources_custom_url_message">Tilsidesæt den som standard anvendte server til download af kort. Lad feltet være tomt for at bruge CoMaps\' standardserver.</string>
|
||||
<string name="download_resources_custom_url_summary_none">Ikke indstillet</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Indtast en URL, der starter med http:// eller https://</string>
|
||||
<string name="pref_maplanguage_local">Lokalt sprog</string>
|
||||
</resources>
|
||||
|
||||
@@ -281,7 +281,7 @@
|
||||
<!-- Item in context menu. -->
|
||||
<string name="downloader_update_map">Karte aktualisieren</string>
|
||||
<!-- Preference title -->
|
||||
<string name="google_play_services">Google’s verknüpfter Ortungsdienst</string>
|
||||
<string name="google_play_services">Google-Standortverknüpfungsdienst</string>
|
||||
<!-- Preference text -->
|
||||
<string name="pref_use_google_play">Ein proprietärer Dienst, der GPS, Wi-Fi, Mobilfunknetzwerke etc. kombiniert, um den Standort genauer zu bestimmen. Er kann sich mit Google-Servern verbinden.</string>
|
||||
<!-- Preference title -->
|
||||
|
||||
@@ -68,9 +68,9 @@
|
||||
<!-- Add Bookmark list dialog - hint when the list name is empty -->
|
||||
<string name="bookmark_set_name">Όνομα λίστας αγαπημένων</string>
|
||||
<!-- Should be used in the bookmarks-only context, see bookmarks_and_tracks if tracks are also implied. -->
|
||||
<string name="bookmarks">Μέρη</string>
|
||||
<string name="bookmarks">Αγαπημένα</string>
|
||||
<!-- "Bookmarks and Tracks" dialog title, also sync it with iphone/plist.txt -->
|
||||
<string name="bookmarks_and_tracks">Αγαπημένα</string>
|
||||
<string name="bookmarks_and_tracks">Αγαπημένα και διαδρομές</string>
|
||||
<!-- Add bookmark dialog - bookmark name -->
|
||||
<string name="name">Όνομα</string>
|
||||
<!-- Editor title above street and house number, duplicates [type.building.address] in types_strings.txt -->
|
||||
@@ -146,10 +146,10 @@
|
||||
<!-- Notes field in Bookmarks view -->
|
||||
<string name="description">Σημειώσεις</string>
|
||||
<!-- Email Subject when sharing bookmark list -->
|
||||
<string name="share_bookmarks_email_subject">Τα Αγαπημένα μου στο CoMaps</string>
|
||||
<string name="share_bookmarks_email_body">Γειά σου! \n \nΣου επισυνάπτω τα αγαπημένα μου. Παρακαλώ άνοιξε τα με το CoMaps. Αν δεν το έχεις εγκατεστημένο, μπορείς να το κατεβάσεις από εδώ: https://www.comaps.app/download/ \n \nΚαλή διασκέδαση ταξιδεύοντας με το CoMaps!</string>
|
||||
<string name="share_bookmarks_email_subject">Κοινοποιήθηκαν τα αγαπημένα από το CoMaps σε εσάς</string>
|
||||
<string name="share_bookmarks_email_body">Γειa! \n \nΣου επισυνάπτω τα αγαπημένα μου. Παρακαλώ άνοιξέ τα με το CoMaps. Αν δεν το έχεις εγκαταστήσει, μπορείς να το κατεβάσεις από εδώ: https://www.comaps.app/download/ \n \nΚαλή διασκέδαση ταξιδεύοντας με το CoMaps!</string>
|
||||
<!-- message title of loading file -->
|
||||
<string name="load_kmz_title">Φορτώνονται τα Αγαπημένα</string>
|
||||
<string name="load_kmz_title">Φορτώνονται τα αγαπημένα</string>
|
||||
<!-- Kmz file successful loading -->
|
||||
<string name="load_kmz_successful">Τα αγαπημένα φορτώθηκαν με επιτυχία! Μπορείτε να τα βρείτε στο χάρτη ή στην οθόνη Διαχείρισης αγαπημένων.</string>
|
||||
<!-- Kml file loading failed -->
|
||||
@@ -163,9 +163,9 @@
|
||||
<!-- Warning message when doing search around current position -->
|
||||
<string name="unknown_current_position">Η τοποθεσία σας δεν έχει προσδιοριστεί ακόμη</string>
|
||||
<!-- Alert message that we can't run Map Storage settings due to some reasons. -->
|
||||
<string name="cant_change_this_setting">Λυπούμαστε, οι ρυθμίσεις αποθήκευσης χαρτών είναι προς το παρόν απενεργοποιημένες</string>
|
||||
<string name="cant_change_this_setting">Λυπούμαστε, οι ρυθμίσεις αποθήκευσης χαρτών είναι προς το παρόν απενεργοποιημένες.</string>
|
||||
<!-- Alert message that downloading is in progress. -->
|
||||
<string name="downloading_is_active">Η λήψη χάρτη βρίσκεται σε εξέλιξη</string>
|
||||
<string name="downloading_is_active">Λήψη χάρτη βρίσκεται σε εξέλιξη.</string>
|
||||
<!-- Share my position using SMS, %1$@ contains om:// and %2$@ https://comaps.app link WITHOUT NAME. @NOTE non-ascii symbols in the link will result in max 70 characters SMS instead of 140. -->
|
||||
<string name="my_position_share_sms">Δες την τρέχουσα τοποθεσία μου στο CoMaps! %1$s ή %2$s Αν δεν έχεις τους χάρτες εκτός σύνδεσης, μπορείς να τους κατεβάσεις εδώ: https://www.comaps.app/download/</string>
|
||||
<!-- Subject for emailed bookmark -->
|
||||
@@ -185,7 +185,7 @@
|
||||
<!-- Data version in «About» screen, %@ is replaced by a local, human readable date. -->
|
||||
<string name="data_version">Δεδομένα OpenStreetMap: %s</string>
|
||||
<!-- Title for tracks category in bookmarks manager -->
|
||||
<string name="tracks_title">Ίχνη</string>
|
||||
<string name="tracks_title">Διαδρομές</string>
|
||||
<!-- Length of track in cell that describes route -->
|
||||
<string name="length">Μήκος</string>
|
||||
<string name="share_my_location">Κοινοποίηση της τοποθεσίας μου</string>
|
||||
@@ -269,7 +269,7 @@
|
||||
<string name="downloader_download_all_button">Λήψη όλων</string>
|
||||
<string name="downloader_downloading">Γίνεται λήψη:</string>
|
||||
<!-- Displayed in a dialog that appears when a user tries to delete a map while the app is in the follow route mode -->
|
||||
<string name="downloader_delete_map_while_routing_dialog">Για να διαγράψετε το χάρτη, σταματήστε την πλοήγηση</string>
|
||||
<string name="downloader_delete_map_while_routing_dialog">Για να διαγράψετε το χάρτη, σταματήστε την πλοήγηση.</string>
|
||||
<!-- PointsInDifferentMWM -->
|
||||
<string name="routing_failed_cross_mwm_building">Μπορούν να δημιουργηθούν μόνο διαδρομές που περιέχονται πλήρως μέσα σε ένα χάρτη σε μια ενιαία περιοχή.</string>
|
||||
<!-- Context menu item for downloader. -->
|
||||
@@ -295,7 +295,7 @@
|
||||
<!-- location service disabled -->
|
||||
<string name="enable_location_services">Ενεργοποιήστε τις υπηρεσίες εντοπισμού τοποθεσίας</string>
|
||||
<string name="save">Αποθήκευση</string>
|
||||
<string name="create">Δημιουργία</string>
|
||||
<string name="create">δημιουργήστε</string>
|
||||
<!-- red color -->
|
||||
<string name="red">Κόκκινο</string>
|
||||
<!-- yellow color -->
|
||||
@@ -341,18 +341,18 @@
|
||||
<string name="dialog_routing_location_turn_on">Ενεργοποιήστε τις υπηρεσίες εντοπισμού τοποθεσίας</string>
|
||||
<string name="dialog_routing_location_unknown_turn_on">Δεν είναι δυνατός ο εντοπισμός των τρεχουσών συντεταγμένων GPS. Ενεργοποιήστε τις υπηρεσίες εντοπισμού τοποθεσίας για τον υπολογισμό της διαδρομής.</string>
|
||||
<string name="dialog_routing_unable_locate_route">Δε μπορεί να εντοπιστεί η διαδρομή</string>
|
||||
<string name="dialog_routing_cant_build_route">Δε μπορεί να δημιουργηθεί η διαδρομή</string>
|
||||
<string name="dialog_routing_cant_build_route">Δε μπορεί να δημιουργηθεί η διαδρομή.</string>
|
||||
<string name="dialog_routing_change_start_or_end">Ρυθμίστε το σημείο εκκίνησης ή τον προορισμό σας.</string>
|
||||
<string name="dialog_routing_change_start">Ρυθμίστε το σημείο εκκίνησης</string>
|
||||
<string name="dialog_routing_start_not_determined">Η διαδρομή δεν δημιουργήθηκε. Δεν είναι δυνατός ο εντοπισμός του σημείου εκκίνησης.</string>
|
||||
<string name="dialog_routing_select_closer_start">Επιλέξτε σημείο εκκίνησης πιο κοντά σε κάποιο δρόμο.</string>
|
||||
<string name="dialog_routing_change_end">Ρύθμιση προορισμού</string>
|
||||
<string name="dialog_routing_end_not_determined">Η διαδρομή δεν δημιουργήθηκε. Δεν είναι δυνατός ο εντοπισμός του προορισμού.</string>
|
||||
<string name="dialog_routing_select_closer_end">Επιλέξτε ένα σημείο προορισμού πιο κοντά σε κάποιο δρόμο</string>
|
||||
<string name="dialog_routing_change_intermediate">Δεν είναι δυνατός ο εντοπισμός ενδιάμεσου σημείου</string>
|
||||
<string name="dialog_routing_intermediate_not_determined">Προσαρμόστε το ενδιάμεσο σημείο</string>
|
||||
<string name="dialog_routing_select_closer_end">Επιλέξτε ένα σημείο προορισμού πιο κοντά σε κάποιο δρόμο.</string>
|
||||
<string name="dialog_routing_change_intermediate">Δεν είναι δυνατός ο εντοπισμός ενδιάμεσου σημείου.</string>
|
||||
<string name="dialog_routing_intermediate_not_determined">Ρυθμίστε το ενδιάμεσο σημείο.</string>
|
||||
<string name="dialog_routing_system_error">Σφάλμα συστήματος</string>
|
||||
<string name="dialog_routing_application_error">Δεν είναι δυνατή η δημιουργία διαδρομής λόγω σφάλματος της εφαρμογής</string>
|
||||
<string name="dialog_routing_application_error">Δεν είναι δυνατή η δημιουργία διαδρομής λόγω σφάλματος της εφαρμογής.</string>
|
||||
<string name="dialog_routing_try_again">Προσπαθήστε ξανά</string>
|
||||
<string name="not_now">Όχι τώρα</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Θέλετε να κατεβάσετε το χάρτη και να δημιουργήσετε μια πιο βέλτιστη διαδρομή που εκτείνεται σε περισσότερους από έναν χάρτες;</string>
|
||||
@@ -366,11 +366,11 @@
|
||||
<string name="hide">Απόκρυψη</string>
|
||||
<string name="categories">Κατηγορίες</string>
|
||||
<string name="history">Ιστορικό</string>
|
||||
<string name="search_not_found">Ωχ, δε βρέθηκαν αποτελέσματα</string>
|
||||
<string name="search_not_found">Ωχ, δε βρέθηκαν αποτελέσματα.</string>
|
||||
<!-- The message when user did not find anything in the search. -->
|
||||
<string name="search_not_found_query">Κατεβάστε την περιοχή στην οποία ψάχνετε ή δοκιμάστε να προσθέσετε το όνομα μιας κοντινής πόλης/χωριού.</string>
|
||||
<string name="search_history_title">Ιστορικό αναζητήσεων</string>
|
||||
<string name="search_history_text">Προβολή πρόσφατων αναζητήσεων</string>
|
||||
<string name="search_history_text">Προβολή πρόσφατων αναζητήσεων.</string>
|
||||
<string name="clear_search">Εκκαθάριση ιστορικού αναζητήσεων</string>
|
||||
<!-- Place Page link to Wikipedia article (if map object has it). -->
|
||||
<string name="read_in_wikipedia">Βικιπέδια</string>
|
||||
@@ -378,7 +378,7 @@
|
||||
<string name="p2p_start">Έναρξη</string>
|
||||
<string name="p2p_from_here">Διαδρομή από</string>
|
||||
<string name="p2p_to_here">Διαδρομή προς</string>
|
||||
<string name="p2p_only_from_current">Η πλοήγηση είναι διαθέσιμη μόνο από την τρέχουσα τοποθεσία σας</string>
|
||||
<string name="p2p_only_from_current">Η πλοήγηση είναι διαθέσιμη μόνο από την τρέχουσα τοποθεσία σας.</string>
|
||||
<string name="p2p_reroute_from_current">Θέλετε να σχεδιαστεί μια διαδρομή από την τρέχουσα τοποθεσία σας;</string>
|
||||
<!-- Edit open hours/set time and minutes dialog -->
|
||||
<string name="next_button">Επόμενο</string>
|
||||
@@ -443,11 +443,11 @@
|
||||
<!-- login text field -->
|
||||
<string name="editor_add_phone">Προσθήκη Τηλεφώνου</string>
|
||||
<string name="level">Όροφος</string>
|
||||
<string name="downloader_delete_map_dialog">Όλες οι αλλαγές που έχετε κάνει στο χάρτη θα διαγραφούν μαζί με το χάρτη</string>
|
||||
<string name="downloader_delete_map_dialog">Όλες οι αλλαγές που έχετε κάνει στο χάρτη θα διαγραφούν μαζί με το χάρτη.</string>
|
||||
<string name="downloader_update_maps">Ενημέρωση χαρτών</string>
|
||||
<string name="downloader_mwm_migration_dialog">Για να δημιουργήσετε μια διαδρομή, πρέπει να ενημερώσετε όλους τους χάρτες και στη συνέχεια να σχεδιάσετε τη διαδρομή ξανά.</string>
|
||||
<string name="downloader_search_field_hint">Εύρεση χάρτη</string>
|
||||
<string name="common_check_internet_connection_dialog">Βεβαιωθείτε ότι η συσκευή σας είναι συνδεδεμένη στο Διαδίκτυο</string>
|
||||
<string name="common_check_internet_connection_dialog">Βεβαιωθείτε ότι η συσκευή σας είναι συνδεδεμένη στο Internet.</string>
|
||||
<string name="downloader_no_space_title">Δεν υπάρχει αρκετός χώρος</string>
|
||||
<string name="downloader_no_space_message">Διαγράψτε μη απαραίτητα δεδομένα</string>
|
||||
<string name="editor_login_error_dialog">Σφάλμα σύνδεσης</string>
|
||||
@@ -492,11 +492,11 @@
|
||||
<string name="editor_category_unsuitable_text">Οι CoMaps επιτρέπουν την προσθήκη απλών κατηγοριών σημείων μόνο, δηλαδή όχι πόλεων, δρόμων, λιμνών, περιγραμμάτων κτιρίων κ.λπ. Παρακαλούμε προσθέστε τέτοιες κατηγορίες απευθείας στο <a href="https://www.openstreetmap.org">OpenStreetMap.org</a>. Ελέγξτε τον <a href="https://www.comaps.app/support/advanced-map-editing/">οδηγό μας</a> για λεπτομερείς οδηγίες βήμα προς βήμα.</string>
|
||||
<string name="downloader_no_downloaded_maps_title">Δεν έχετε κατεβάσει χάρτες</string>
|
||||
<string name="downloader_no_downloaded_maps_message">Κατεβάστε χάρτες για να κάνετε αναζήτηση και να πλοηγηθείτε χωρίς σύνδεση</string>
|
||||
<string name="current_location_unknown_error_title">Η τρέχουσα τοποθεσία είναι άγνωστη</string>
|
||||
<string name="current_location_unknown_error_title">Η τρέχουσα τοποθεσία είναι άγνωστη.</string>
|
||||
<!-- abbreviation for kilometers per hour -->
|
||||
<string name="kilometers_per_hour">χμ/ω</string>
|
||||
<string name="placepage_more_button">Περισσότερα</string>
|
||||
<string name="placepage_edit_bookmark_button">Επεξεργασία αγαπημένων μερών</string>
|
||||
<string name="placepage_edit_bookmark_button">Επεξεργασία αγαπημένου</string>
|
||||
<string name="placepage_personal_notes_hint">Προσωπικές σημειώσεις (κείμενο ή html)</string>
|
||||
<string name="editor_reset_edits_message">Απόρριψη όλων των τοπικών αλλαγών;</string>
|
||||
<string name="editor_reset_edits_button">Απόρριψη αλλαγών</string>
|
||||
@@ -520,9 +520,9 @@
|
||||
<!-- Dialog before publishing the modifications to the public map. -->
|
||||
<string name="editor_share_to_all_dialog_message_1">Βεβαιωθείτε ότι δεν έχετε εισάγει προσωπικά δεδομένα.</string>
|
||||
<string name="editor_share_to_all_dialog_message_2">Οι συντάκτες του OpenStreetMap θα ελέγξουν τις αλλαγές και θα επικοινωνήσουν μαζί σας εάν έχουν απορίες.</string>
|
||||
<string name="navigation_stop_button">Τέλος</string>
|
||||
<string name="navigation_stop_button">τέλος</string>
|
||||
<!-- Shown as toast when starting the recent track recording -->
|
||||
<string name="track_recording">Καταγραφή του ίχνους</string>
|
||||
<string name="track_recording">Καταγραφή της διαδρομής</string>
|
||||
<!-- For the first routing -->
|
||||
<string name="accept">Συμφωνώ</string>
|
||||
<!-- For the first routing -->
|
||||
@@ -530,13 +530,13 @@
|
||||
<string name="mobile_data_dialog">Θέλετε να χρησιμοποιήσετε το δίκτυο κινητής τηλεφωνίας για να εμφανίσετε αναλυτικές πληροφορίες;</string>
|
||||
<string name="mobile_data_option_always">Να χρησιμοποιείται πάντα</string>
|
||||
<string name="mobile_data_option_today">Μόνο σήμερα</string>
|
||||
<string name="mobile_data_option_not_today">Να μην χρησιμοποιηθεί σήμερα</string>
|
||||
<string name="mobile_data_option_not_today">Να Μην χρησιμοποιηθεί σήμερα</string>
|
||||
<string name="mobile_data">Ίντερνετ μέσω δικτύου κινητής</string>
|
||||
<!-- NOTE to translators: please synchronize your translation with the English one. -->
|
||||
<string name="mobile_data_description">Απαιτείται πρόσβαση στο ίντερνετ μέσω δικτύου κινητής για την εμφάνιση αναλυτικών πληροφοριών για τις τοποθεσίες, όπως φωτογραφίες, τιμές και κριτικές.</string>
|
||||
<string name="mobile_data_option_never">Να μην χρησιμοποιείται ποτέ</string>
|
||||
<string name="mobile_data_option_ask">Να γίνεται πάντα ερώτηση</string>
|
||||
<string name="traffic_update_maps_text">Για να εμφανιστούν πληροφορίες για την κίνηση, πρέπει να ενημερωθούν οι χάρτες</string>
|
||||
<string name="traffic_update_maps_text">Για να εμφανιστούν πληροφορίες για την κίνηση, πρέπει να ενημερωθούν οι χάρτες.</string>
|
||||
<string name="big_font">Αύξηση μεγέθους γραμματοσειράς στο χάρτη</string>
|
||||
<string name="traffic_update_app">Κάντε ενημέρωση του CoMaps</string>
|
||||
<!-- "traffic" as in "road congestion" -->
|
||||
@@ -546,7 +546,7 @@
|
||||
<string name="feedback_general">Αποστολή γνώμης</string>
|
||||
<string name="prefs_languages_information">Χρησιμοποιούμε το σύστημα TTS για τις φωνητικές οδηγίες. Αρκετές συσκευές Android χρησιμοποιούν το Google TTS, μπορείτε να το κατεβάσετε ή να το ενημερώσετε από το Google Play (https://play.google.com/store/apps/details?id=com.google.android.tts)</string>
|
||||
<string name="prefs_languages_information_off">Για μερικές γλώσσες θα χρειαστεί να εγκαταστήσετε συνθεσάιζερ ομιλίας ή κάποιο συμπληρωματικό πακέτο γλώσσας από το app store (Google Play, Galaxy Store, App Gallery, FDroid). \nΑνοίξτε τις Ρυθμίσεις της συσκευής σας → Γλώσσα και εισαγωγή → Ομιλία → Μετατροπή κειμένου σε ομιλία. \nΕδώ μπορείτε να διαχειριστείτε τις ρυθμίσεις της σύνθεσης ομιλίας (για παράδειγμα, μπορείτε να κατεβάσετε πακέτο γλώσσας για χρήση εκτός σύνδεσης) και να επιλέξετε άλλη μηχανή μετατροπής κειμένου σε ομιλία.</string>
|
||||
<string name="prefs_languages_information_off_link">Για περισσότερες πληροφορίες δείτε αυτό τον οδηγό</string>
|
||||
<string name="prefs_languages_information_off_link">Για περισσότερες πληροφορίες δείτε αυτό τον οδηγό.</string>
|
||||
<string name="transliteration_title">Μεταγραφή στο λατινικό αλφάβητο</string>
|
||||
<string name="learn_more">Μάθετε περισσότερα</string>
|
||||
<!-- User selected the destination by pressing Route To, but the current position is unknown. User needs to select a starting point of a route using search or by tapping on the map and then pressing "Route From". -->
|
||||
@@ -561,17 +561,17 @@
|
||||
<string name="dialog_error_storage_message">Ο εξωτερικός απθηκευτικός χώρος δεν είναι διαθέσιμος, πιθανότατα έχει αφαιρεθεί η κάρτα SD, είναι κατεστραμμένη ή το σύστημα αρχείων είναι μόνο για ανάγνωση. Ελέγξτε το και επικοινωνήστε μαζί μας στη διεύθυνση support@comaps.app</string>
|
||||
<string name="setting_emulate_bad_storage">Εξομείωση κακού αποθηκευτικού χώρου</string>
|
||||
<string name="error_enter_correct_name">Εισάγετε ένα σωστό όνομα</string>
|
||||
<string name="bookmark_lists">Λίστες αγαπημένων</string>
|
||||
<string name="bookmark_lists">Λίστες</string>
|
||||
<!-- Do not display all bookmark lists on the map -->
|
||||
<string name="bookmark_lists_hide_all">Απόκρυψη όλων</string>
|
||||
<string name="bookmark_lists_show_all">Εμφάνιση όλων</string>
|
||||
<plurals name="bookmarks_places">
|
||||
<item quantity="one">%d αγαπημένο μέρος</item>
|
||||
<item quantity="other">%d αγαπημένα μέρη</item>
|
||||
<item quantity="one">%d αγαπημένο</item>
|
||||
<item quantity="other">%d αγαπημένα</item>
|
||||
</plurals>
|
||||
<string name="bookmarks_create_new_group">Δημιουργία νέας λίστας</string>
|
||||
<!-- Bookmark categories screen, button that opens folder selection dialog to import KML/KMZ/GPX/KMB files -->
|
||||
<string name="bookmarks_import">Εισαγωγή Αγαπημένων</string>
|
||||
<string name="bookmarks_import">Εισαγωγή σελιδοδεικτών και διαδρομών</string>
|
||||
<string name="bookmarks_error_message_share_general">Αδυναμία κοινοποίησης λόγω σφάλματος εφαρμογής</string>
|
||||
<string name="bookmarks_error_title_share_empty">Σφάλμα κατά την κοινοποίηση</string>
|
||||
<string name="bookmarks_error_message_share_empty">Δεν είναι δυνατή η κοινή χρήση μιας κενής λίστας</string>
|
||||
@@ -589,8 +589,8 @@
|
||||
</plurals>
|
||||
<string name="restore">Επαναφορά</string>
|
||||
<plurals name="tracks">
|
||||
<item quantity="one">%d ίχνος</item>
|
||||
<item quantity="other">%d ίχνη</item>
|
||||
<item quantity="one">%d διαδρομή</item>
|
||||
<item quantity="other">%d διαδρομές</item>
|
||||
</plurals>
|
||||
<!-- Settings privacy group in settings screen -->
|
||||
<string name="privacy">Απόρρητο</string>
|
||||
@@ -600,12 +600,12 @@
|
||||
<string name="subway">Μετρό</string>
|
||||
<string name="layers_title">Στυλ χάρτη και επίπεδα</string>
|
||||
<string name="bookmarks_empty_list_title">Η λίστα είναι άδεια</string>
|
||||
<string name="bookmarks_empty_list_message">Για να αποθηκεύσετε ένα μέρος, πατήστε μια τοποθεσία στο χάρτη και μετά πατήστε το αστεράκι</string>
|
||||
<string name="bookmarks_empty_list_message">Για να προσθέσετε σελιδοδείκτη, πατήστε ένα μέρος στο χάρτη και μετά πατήστε το αστεράκι</string>
|
||||
<string name="category_desc_more">…περισσότερα</string>
|
||||
<string name="export_file">Εξαγωγή KMZ</string>
|
||||
<string name="export_file_gpx">Εξαγωγή GPX</string>
|
||||
<string name="delete_list">Διαγραφή λίστας</string>
|
||||
<string name="speedcams_alert_title">Κάμερες ταχύτητας</string>
|
||||
<string name="speedcams_alert_title">Κάμερες Ταχύτητας</string>
|
||||
<string name="place_description_title">Περιγραφή μέρους</string>
|
||||
<!-- this text will be shown in application notification preferences opposite checkbox which enable/disable downloader notifications. Devices on Android 8+ are affected. -->
|
||||
<string name="notification_channel_downloader">Κατέβασμα χαρτών</string>
|
||||
@@ -616,9 +616,9 @@
|
||||
<!-- Speed camera settings menu option - Never warn (about speedcams) -->
|
||||
<string name="pref_tts_speedcams_never">Να μην ειδοποιούμαι ποτέ</string>
|
||||
<string name="power_managment_title">Λειτουργία εξοικονόμησης ενέργειας</string>
|
||||
<string name="power_managment_description">Θα γίνεται προσπάθεια εξοικονόμησης ενέργειας εις βάρος κάποιων λειτουργιών</string>
|
||||
<string name="power_managment_description">Θα γίνεται προσπάθεια εξοικονόμησης ενέργειας εις βάρος κάποιον λειτουργιών.</string>
|
||||
<string name="power_managment_setting_never">Ποτέ</string>
|
||||
<string name="power_managment_setting_auto">Όταν η μπαταρία είναι χαμηλή</string>
|
||||
<string name="power_managment_setting_auto">Αυτόματα</string>
|
||||
<string name="power_managment_setting_manual_max">Πάντα</string>
|
||||
<string name="enable_logging_warning_message">Αυτή η λειτουργία είναι ενεργοποιημένη για την καταγραφή ενεργειών για διαγνωστικούς σκοπούς. Αυτό βοηθά την ομάδα να εντοπίζει προβλήματα με την εφαρμογή. Να ενεργοποιείτε τη λειτουργία μόνο κατόπιν αιτήματος της υποστήριξης του CoMaps.</string>
|
||||
<string name="driving_options_title">Ρυθμίσεις δρομολόγησης</string>
|
||||
@@ -641,9 +641,9 @@
|
||||
<!-- A generic "No" button in dialogs -->
|
||||
<string name="no">Όχι</string>
|
||||
<!-- E.g. "WiFi:Yes" -->
|
||||
<string name="yes_available">Ναι</string>
|
||||
<string name="yes_available">Ενεργ.</string>
|
||||
<!-- E.g. "WiFi:No" -->
|
||||
<string name="no_available">Όχι</string>
|
||||
<string name="no_available">Απενεργ.</string>
|
||||
<!-- To indicate the capacity of car parkings, bicycle parkings, electric vehicle charging stations... -->
|
||||
<string name="capacity">Χωρητικότητα: %s</string>
|
||||
<!-- To indicate the network of ATMs, bicycle rentals, electric vehicle charging stations... -->
|
||||
@@ -653,7 +653,7 @@
|
||||
<!-- max. 10 symbols, both iOS and Android -->
|
||||
<string name="sort">Ταξινόμηση…</string>
|
||||
<!-- Android, title, max 20-22 symbols -->
|
||||
<string name="sort_bookmarks">Ταξινόμηση αγαπημένων</string>
|
||||
<string name="sort_bookmarks">Ταξινόμηση σελιδ/κτών</string>
|
||||
<!-- Android -->
|
||||
<string name="by_default">Προεπιλογή</string>
|
||||
<!-- Android -->
|
||||
@@ -769,7 +769,7 @@
|
||||
<string name="browser_not_available">Δεν είναι διαθέσιμος ο περιηγητής</string>
|
||||
<string name="volume">Ένταση ήχου</string>
|
||||
<!-- Bookmark categories screen, button that opens share dialog to export all bookmarks and tracks -->
|
||||
<string name="bookmarks_export">Εξαγωγή όλων των Μερών και Ιχνών</string>
|
||||
<string name="bookmarks_export">Εξαγωγή όλων των σελιδοδεικτών και των διαδρομών</string>
|
||||
<!-- button in (app) TTS settings, to open the system TTS settings. -->
|
||||
<string name="pref_tts_open_system_settings">Ρυθμίσεις συστήματος σύνθεσης ομιλίας</string>
|
||||
<!-- toast displayed when pressing the "Speech synthesis system settings" button, and the system settings aren't found. -->
|
||||
@@ -793,21 +793,21 @@
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">Για την πιο ακριβή πλοήγηση, συνιστούμε να απενεργοποιήσετε τη λειτουργία εξοικονόμησης ενέργειας στις ρυθμίσεις μπαταρίας του τηλεφώνου.</string>
|
||||
<!-- Prompt to start recording a track. -->
|
||||
<string name="start_track_recording">Εγγραφή ίχνους</string>
|
||||
<string name="start_track_recording">Εγγραφή διαδρομής</string>
|
||||
<!-- Prompt for stopping a track recording. -->
|
||||
<string name="stop_track_recording">Σταματήστε την εγγραφή ίχνους</string>
|
||||
<string name="stop_track_recording">Σταματήστε την εγγραφή διαδρομής</string>
|
||||
<!-- Title for the "Stop Without Saving" action for the alert when saving a track recording. -->
|
||||
<string name="stop_without_saving">Σταματήστε χωρίς αποθήκευση</string>
|
||||
<!-- Title for the "Stop Without Saving" action for the alert when saving a track recording. -->
|
||||
<string name="continue_recording">Συνέχεια εγγραφής</string>
|
||||
<!-- Title for the alert when saving a track recording. -->
|
||||
<string name="track_recording_alert_title">Αποθήκευση στα Αγαπημένα;</string>
|
||||
<string name="track_recording_alert_title">Αποθήκευση στα Αγαπημένα και Διαδρομές;</string>
|
||||
<!-- Message for the toast when saving the track recording is finished but nothing to save. -->
|
||||
<string name="track_recording_toast_nothing_to_save">Το ίχνος είναι άδειο - δεν υπάρχει τίποτα να αποθηκεύσετε</string>
|
||||
<string name="track_recording_toast_nothing_to_save">Η διαδρομή είναι άδεια - δεν υπάρχει τίποτα να αποθηκεύσετε</string>
|
||||
<!-- Error message when there are no File Manager apps installed to select a folder when importing Bookmarks and Tracks -->
|
||||
<string name="error_no_file_manager_app">Δεν είναι δυνατή η εμφάνιση του διαλόγου επιλογής φακέλου επειδή δεν είναι εγκατεστημένη η κατάλληλη εφαρμογή στη συσκευή σας. Εγκαταστήστε μια εφαρμογή διαχείρισης αρχείων και δοκιμάστε ξανά.</string>
|
||||
<string name="choose_color">Επιλέξτε χρώμα</string>
|
||||
<string name="edit_track">Επεξεργασία ίχνους</string>
|
||||
<string name="edit_track">Επεξεργασία διαδρομής</string>
|
||||
<string name="uri_open_location_failed">Δεν υπάρχει εγκατεστημένη εφαρμογή που να μπορεί να ανοίξει την τοποθεσία</string>
|
||||
<!-- preference string for using auto theme only in navigation mode -->
|
||||
<string name="nav_auto">Αυτόματη πλοήγηση</string>
|
||||
@@ -816,10 +816,10 @@
|
||||
<string name="translated_om_site_url">https://comaps.app/</string>
|
||||
<string name="tts_info_link">https://www.comaps.app/support/tts-configuration-guide-for-android/</string>
|
||||
<string name="level_value_generic">Όροφος: %s</string>
|
||||
<string name="miles_per_hour">μλ/ώ</string>
|
||||
<string name="minute">λεπ</string>
|
||||
<string name="day">μέρ</string>
|
||||
<string name="hour">ώ</string>
|
||||
<string name="miles_per_hour">mph</string>
|
||||
<string name="minute">λπτ</string>
|
||||
<string name="day">Μέρα</string>
|
||||
<string name="hour">Ωρα</string>
|
||||
<string name="telegram_url">https://t.me/CoMapsApp/</string>
|
||||
<string name="instagram_url">https://www.instagram.com/comaps.app/</string>
|
||||
<string name="panoramax">εικόνα Panoramax</string>
|
||||
@@ -836,46 +836,4 @@
|
||||
<string name="hours_confirmed_time_ago">Επιβεβαιώθηκε %s</string>
|
||||
<string name="existence_confirmed_time_ago">Ύπαρξη επιβεβαιώθηκε %s</string>
|
||||
<string name="editor_building_levels">Όροφοι (με το ισόγειο, χωρίς την ταράτσα)</string>
|
||||
<string name="about_headline">Ανοιχτό έργο με την υποστήριξη της κοινότητας</string>
|
||||
<string name="offline_explanation_text">Χρειάζεται να ληφθεί ένας χάρτης για να δείτε και να πλοηγηθείτε την περιοχή.\nΚατεβάστε χάρτες για τις περιοχές που θέλετε να ταξιδέψετε.</string>
|
||||
<string name="pref_left_button_disable">Απενεργοποίηση</string>
|
||||
<string name="avoid_steps">Αποφυγή σκαλοπατιών</string>
|
||||
<string name="avoid_paved">Αποφυγή στρωμένων δρόμων</string>
|
||||
<string name="unknown_power_output">άγνωστο</string>
|
||||
<string name="unknown_count">άγνωστο</string>
|
||||
<string name="advanced">Προχωρημένες</string>
|
||||
<string name="charge_socket_count">Πλήθος</string>
|
||||
<string name="ruler">Χάρακας</string>
|
||||
<string name="clear">Εκκαθάριση</string>
|
||||
<string name="route_type">Είδος διαδρομής</string>
|
||||
<string name="vehicle">Όχημα</string>
|
||||
<string name="pedestrian">Πεζός</string>
|
||||
<string name="bicycle">Ποδήλατο</string>
|
||||
<string name="bookmark_color">Χρώμα για Αγαπημένο</string>
|
||||
<string name="about_help">Σχετικά & Βοήθεια</string>
|
||||
<string name="open_now">Ανοιχτό τώρα</string>
|
||||
<string name="closed_now">Κλειστό τώρα</string>
|
||||
<string name="at">στις %s</string>
|
||||
<string name="share_track">Κοινοποίηση Ίχνους</string>
|
||||
<string name="delete_track_dialog_title">Διαγραφή %s;</string>
|
||||
<string name="place_page_app_too_old_description">Τα τρέχοντα δεδομένα χάρτη σας είναι πολύ παλιά, παρακαλούμε ενημερώστε την εφαρμογή CoMaps.</string>
|
||||
<string name="editor_level">Όροφος (το 0 είναι το ισόγειο)</string>
|
||||
<string name="error_enter_correct_level">Εισάγετε έναν έγκυρο αριθμό ορόφου</string>
|
||||
<string name="editor_business_vacant_button">Η επιχείρηση είναι κενή</string>
|
||||
<string name="editor_mark_business_vacant_title">Σήμανση επιχείρησης ως κενή</string>
|
||||
<string name="place_page_update_too_old_map">Ενημέρωση χάρτη περιοχής</string>
|
||||
<string name="place_page_too_old_to_edit">Η επεξεργασία του OpenStreetMap είναι απενεργοποιημένη επειδή τα δεδομένα χάρτη είναι πολύ παλιά.</string>
|
||||
<string name="osm_note_hint">Ή, εναλλακτικά, αφήστε μια σημείωση στην κοινότητα του OpenStreetMap ώστε κάποιος άλλος να προσθέσει ή να διορθώσει την τοποθεσία εδώ.</string>
|
||||
<string name="osm_note_toast">Η σημείωση θα αποσταλεί στο OpenStreetMap</string>
|
||||
<string name="error_enter_correct_fediverse_page">Εισάγετε ένα έγκυρο όνομα χρήστη ή διεύθυνση Mastodon</string>
|
||||
<string name="error_enter_correct_bluesky_page">Εισάγετε ένα έγκυρο όνομα χρήστη ή διεύθυνση Bluesky</string>
|
||||
<string name="power_management">Διαχείριση ενέργειας</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Παρακαλούμε είσαγετε ένα URL που να ξεκινά με http:// ή https://</string>
|
||||
<string name="error_value_must_be_positive">Η τιμή πρέπει να είναι θετική</string>
|
||||
<string name="error_invalid_number">Άκυρος αριθμός</string>
|
||||
<string name="offline_explanation_title">Χάρτες εκτός σύνδεσης</string>
|
||||
<string name="list_description_empty">Επεξεργαστείτε τη λίστα για να προσθέσετε περιγραφή</string>
|
||||
<string name="download_resources_custom_url_summary_none">Δεν έχει οριστεί</string>
|
||||
<string name="download_resources_custom_url_title">Προσαρμοσμένος διακομιστής χάρτη</string>
|
||||
<string name="download_resources_custom_url_message">Παρακάμπτει τον προεπιλεγμένο διακομιστή λήψης χάρτη για τις λήψεις χαρτών. Αφήστε το κενό για να χρησιμοποιήσετε τον προεπιλεγμένο διακομιστή του CoMaps.</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="search">Search</string>
|
||||
<string name="bookmarks_and_tracks">Favourites</string>
|
||||
</resources>
|
||||
</resources>
|
||||
@@ -2,7 +2,7 @@
|
||||
<resources>
|
||||
<string name="search">Serĉu</string>
|
||||
<string name="cancel">Nuligi</string>
|
||||
<string name="bookmarks_and_tracks">Favorataj</string>
|
||||
<string name="bookmarks_and_tracks">Legosignoj kaj Trakoj</string>
|
||||
<string name="back">Reen</string>
|
||||
<string name="app_site_url">https://comaps.app/eo</string>
|
||||
<string name="delete">Forigi</string>
|
||||
|
||||
@@ -215,23 +215,4 @@
|
||||
<string name="about_headline">Proyecto abierto impulsado por la comunidad</string>
|
||||
<string name="saved">Guardado</string>
|
||||
<string name="about_proposition_3">• No necesita conexión a internet, rápido y compacto</string>
|
||||
<string name="downloading">Descargando…</string>
|
||||
<string name="download_maps">Descargar Mapas</string>
|
||||
<string name="kilometres">Kilómetros</string>
|
||||
<string name="miles">Millas</string>
|
||||
<string name="search">Buscar</string>
|
||||
<string name="delete">Borrar</string>
|
||||
<string name="download_has_failed">La descarga ha fallado, presiona para volver a intentarlo</string>
|
||||
<string name="later">Más tarde</string>
|
||||
<string name="search_map">Buscar en el mapa</string>
|
||||
<string name="location_is_disabled_long_text">Actualmente tienes todos los Servicios de Localización desactivados para este dispositivo o aplicación. Por favor, actívalos en Ajustes.</string>
|
||||
<string name="limited_accuracy">Precisión Limitada</string>
|
||||
<string name="zoom_to_country">Mostrar en el mapa</string>
|
||||
<string name="country_status_download_failed">La descarga ha fallado</string>
|
||||
<string name="try_again">Inténtalo de nuevo</string>
|
||||
<string name="about_menu_title">Acerca de CoMaps</string>
|
||||
<string name="about_proposition_2">• Centrado en la privacidad y sin anuncios</string>
|
||||
<string name="about_developed_by_enthusiasts">Totalmente de código abierto, sin fines de lucro, toma de decisiones y finanzas transparentes.</string>
|
||||
<string name="close">Cerrar</string>
|
||||
<string name="download">Descargar</string>
|
||||
</resources>
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
<!-- Search category for cafes, bars, restaurants; any changes should be duplicated in categories.txt @category_eat! -->
|
||||
<string name="category_eat">Dónde comer</string>
|
||||
<!-- Search category for grocery stores; any changes should be duplicated in categories.txt @category_food! -->
|
||||
<string name="category_food">Provisiones</string>
|
||||
<string name="category_food">Tienda de comestibles</string>
|
||||
<!-- Search category for public transport; any changes should be duplicated in categories.txt @category_transport! -->
|
||||
<string name="category_transport">Transporte</string>
|
||||
<!-- Search category for fuel stations; any changes should be duplicated in categories.txt @category_fuel! -->
|
||||
@@ -149,7 +149,7 @@
|
||||
<string name="description">Notas</string>
|
||||
<!-- Email Subject when sharing bookmark list -->
|
||||
<string name="share_bookmarks_email_subject">Mis favoritos de CoMaps</string>
|
||||
<string name="share_bookmarks_email_body">¡Hola! \n\nAdjunto mis favoritos. Por favor, ábrelos si tienes instalado CoMaps. O, si no lo tienes, descarga la aplicación para tu dispositivo iOS o Android siguiendo este enlace: https://www.comaps.app/es/download/ \n\n¡Disfruta viajando con CoMaps!</string>
|
||||
<string name="share_bookmarks_email_body">¡Hola! \n\nAdjunto mis favoritos de la aplicación CoMaps. Por favor, ábralos si tiene instalado CoMaps. O, si no lo tiene, descargue la aplicación para su dispositivo iOS o Android siguiendo este enlace: https://www.comaps.app/es/download/ \n\n¡Disfrute viajando con CoMaps!</string>
|
||||
<!-- message title of loading file -->
|
||||
<string name="load_kmz_title">Cargando favoritos</string>
|
||||
<!-- Kmz file successful loading -->
|
||||
@@ -609,7 +609,7 @@
|
||||
<string name="subway">Metro</string>
|
||||
<string name="layers_title">Estilos y capas del mapa</string>
|
||||
<string name="bookmarks_empty_list_title">Esta lista está vacía</string>
|
||||
<string name="bookmarks_empty_list_message">Para guardar un lugar, toca un lugar en el mapa y después toca el icono de la estrella</string>
|
||||
<string name="bookmarks_empty_list_message">Para agregar un marcador, toca un lugar en el mapa y después toca el icono de la estrella</string>
|
||||
<string name="category_desc_more">…más</string>
|
||||
<string name="export_file">Exportar KMZ</string>
|
||||
<string name="export_file_gpx">Exportar GPX</string>
|
||||
@@ -848,7 +848,7 @@
|
||||
<string name="bookmark_color">Color del favorito</string>
|
||||
<string name="pref_backup_title">Respaldar favoritos</string>
|
||||
<string name="pref_backup_summary">Copia de seguridad automática a una carpeta de tu dispositivo</string>
|
||||
<string name="pref_backup_now_title">Crear respaldo ahora</string>
|
||||
<string name="pref_backup_now_title">Realizar copia de seguridad ahora</string>
|
||||
<string name="pref_backup_now_summary">Crear copia de seguridad inmediatamente</string>
|
||||
<string name="pref_backup_now_summary_progress">Copia de seguridad en progreso…</string>
|
||||
<string name="pref_backup_now_summary_ok">Copia de seguridad completada con éxito</string>
|
||||
|
||||
@@ -797,7 +797,7 @@
|
||||
<!-- Title for the "Stop Without Saving" action for the alert when saving a track recording. -->
|
||||
<string name="continue_recording">Jätka salvestamist</string>
|
||||
<!-- Title for the alert when saving a track recording. -->
|
||||
<string name="track_recording_alert_title">Kas salvestame lemmikute loendisse?</string>
|
||||
<string name="track_recording_alert_title">Kas salvestame lemmikute alla?</string>
|
||||
<!-- Message for the toast when saving the track recording is finished but nothing to save. -->
|
||||
<string name="track_recording_toast_nothing_to_save">Rada on tühi - ei ole midagi salvestada</string>
|
||||
<!-- Error message when there are no File Manager apps installed to select a folder when importing Bookmarks and Tracks -->
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
<!-- Should be used in the bookmarks-only context, see bookmarks_and_tracks if tracks are also implied. -->
|
||||
<string name="bookmarks">Markagailuak</string>
|
||||
<!-- "Bookmarks and Tracks" dialog title, also sync it with iphone/plist.txt -->
|
||||
<string name="bookmarks_and_tracks">Gogokoak</string>
|
||||
<string name="bookmarks_and_tracks">Markagailuak eta arrastoak</string>
|
||||
<!-- Add bookmark dialog - bookmark name -->
|
||||
<string name="name">Izena</string>
|
||||
<!-- Editor title above street and house number, duplicates [type.building.address] in types_strings.txt -->
|
||||
|
||||
@@ -68,11 +68,11 @@
|
||||
<!-- "Add new bookmark list" dialog title -->
|
||||
<string name="add_new_set">Créer une nouvelle liste</string>
|
||||
<!-- Add Bookmark list dialog - hint when the list name is empty -->
|
||||
<string name="bookmark_set_name">Nom de la liste</string>
|
||||
<string name="bookmark_set_name">Nom du groupe de signets</string>
|
||||
<!-- Should be used in the bookmarks-only context, see bookmarks_and_tracks if tracks are also implied. -->
|
||||
<string name="bookmarks">Lieux</string>
|
||||
<!-- "Bookmarks and Tracks" dialog title, also sync it with iphone/plist.txt -->
|
||||
<string name="bookmarks_and_tracks">Favoris</string>
|
||||
<string name="bookmarks_and_tracks">Signets et traces</string>
|
||||
<!-- Add bookmark dialog - bookmark name -->
|
||||
<string name="name">Nom</string>
|
||||
<!-- Editor title above street and house number, duplicates [type.building.address] in types_strings.txt -->
|
||||
@@ -151,11 +151,11 @@
|
||||
<string name="share_bookmarks_email_subject">Mes favoris CoMaps.</string>
|
||||
<string name="share_bookmarks_email_body">Bonjour,\n \nVous trouverez ci-joint mes favoris, veuillez les ouvrir dans l’application CoMaps. Si vous ne l’avez pas encore installée, téléchargez l\'application depuis : https://www.comaps.app/download/ \n \nBon voyage avec CoMaps !</string>
|
||||
<!-- message title of loading file -->
|
||||
<string name="load_kmz_title">Chargement des favoris</string>
|
||||
<string name="load_kmz_title">Chargement des Favoris</string>
|
||||
<!-- Kmz file successful loading -->
|
||||
<string name="load_kmz_successful">Vos favoris ont été chargés avec succès ! Vous pouvez les trouver sur la carte ou sur l\'écran Gestionnaire de favoris.</string>
|
||||
<string name="load_kmz_successful">Les favoris ont été chargés avec succès ! Vous pouvez les trouver sur la carte ou sur l’écran du Gestionnaire des Favoris.</string>
|
||||
<!-- Kml file loading failed -->
|
||||
<string name="load_kmz_failed">Échec du chargement des favoris. Le fichier est peut-être corrompu ou défectueux.</string>
|
||||
<string name="load_kmz_failed">Erreur lors du chargement des Favoris. Le fichier pourrait être corrompu ou défectueux.</string>
|
||||
<!-- Failed to recognize the format of a bookmarks or tracks file. -->
|
||||
<string name="unknown_file_type">Le type de fichier n’est pas reconnu par l’appli :\n%1$s</string>
|
||||
<!-- Failed to open a bookmarks or tracks file in CoMaps. -->
|
||||
@@ -503,7 +503,7 @@
|
||||
<string name="minute">min</string>
|
||||
<string name="day">j</string>
|
||||
<string name="placepage_more_button">Plus</string>
|
||||
<string name="placepage_edit_bookmark_button">Modifier le lieu enregistré</string>
|
||||
<string name="placepage_edit_bookmark_button">Modifier le signet</string>
|
||||
<string name="placepage_personal_notes_hint">Notes personnelles (texte ou html)</string>
|
||||
<string name="editor_reset_edits_message">Abandonner toutes les modifications locales ?</string>
|
||||
<string name="editor_reset_edits_button">Annuler les modifications</string>
|
||||
@@ -572,13 +572,13 @@
|
||||
<string name="bookmark_lists_hide_all">Tout masquer</string>
|
||||
<string name="bookmark_lists_show_all">Tout afficher</string>
|
||||
<plurals name="bookmarks_places">
|
||||
<item quantity="one">%d emplacement enregistré</item>
|
||||
<item quantity="many">%d emplacements enregistrés</item>
|
||||
<item quantity="other">%d emplacements enregistrés</item>
|
||||
<item quantity="one">%d signet</item>
|
||||
<item quantity="many">%d signets</item>
|
||||
<item quantity="other">%d signets</item>
|
||||
</plurals>
|
||||
<string name="bookmarks_create_new_group">Créer une nouvelle liste</string>
|
||||
<!-- Bookmark categories screen, button that opens folder selection dialog to import KML/KMZ/GPX/KMB files -->
|
||||
<string name="bookmarks_import">Importer les favoris</string>
|
||||
<string name="bookmarks_import">Importer des signets et des parcours</string>
|
||||
<string name="bookmarks_error_message_share_general">Impossible de partager en raison d’une erreur d’application</string>
|
||||
<string name="bookmarks_error_title_share_empty">Erreur de partage</string>
|
||||
<string name="bookmarks_error_message_share_empty">Impossible de partager une liste vide</string>
|
||||
@@ -609,7 +609,7 @@
|
||||
<string name="subway">Métro</string>
|
||||
<string name="layers_title">Styles et couches de cartes</string>
|
||||
<string name="bookmarks_empty_list_title">Cette liste est vide</string>
|
||||
<string name="bookmarks_empty_list_message">Pour enregistrer un lieu, appuyez sur un lieu sur la carte, puis sur l\'icône en forme d\'étoile</string>
|
||||
<string name="bookmarks_empty_list_message">Pour ajouter un signet, appuyez sur un lieu sur la carte, puis appuyez sur l’icône étoile</string>
|
||||
<string name="category_desc_more">…plus</string>
|
||||
<string name="export_file">Exporter en KMZ</string>
|
||||
<string name="export_file_gpx">Exporter en GPX</string>
|
||||
@@ -662,7 +662,7 @@
|
||||
<!-- max. 10 symbols, both iOS and Android -->
|
||||
<string name="sort">Trier…</string>
|
||||
<!-- Android, title, max 20-22 symbols -->
|
||||
<string name="sort_bookmarks">Trier les favoris</string>
|
||||
<string name="sort_bookmarks">Trier les signets</string>
|
||||
<!-- Android -->
|
||||
<string name="by_default">Par défaut</string>
|
||||
<!-- Android -->
|
||||
@@ -780,7 +780,7 @@
|
||||
<string name="browser_not_available">Le navigateur Web n’est pas disponible</string>
|
||||
<string name="volume">Volume</string>
|
||||
<!-- Bookmark categories screen, button that opens share dialog to export all bookmarks and tracks -->
|
||||
<string name="bookmarks_export">Exporter tous les lieux et toutes les traces</string>
|
||||
<string name="bookmarks_export">Exporter tous les signets et toutes les traces</string>
|
||||
<!-- button in (app) TTS settings, to open the system TTS settings. -->
|
||||
<string name="pref_tts_open_system_settings">Paramètres du système de synthèse vocale</string>
|
||||
<!-- toast displayed when pressing the "Speech synthesis system settings" button, and the system settings aren't found. -->
|
||||
@@ -812,7 +812,7 @@
|
||||
<!-- Title for the "Stop Without Saving" action for the alert when saving a track recording. -->
|
||||
<string name="continue_recording">Continuer l’enregistrement</string>
|
||||
<!-- Title for the alert when saving a track recording. -->
|
||||
<string name="track_recording_alert_title">Enregistrer dans les favoris ?</string>
|
||||
<string name="track_recording_alert_title">Enregistrer dans les signets et traces ?</string>
|
||||
<!-- Message for the toast when saving the track recording is finished but nothing to save. -->
|
||||
<string name="track_recording_toast_nothing_to_save">L’itinéraire est vide - il n’y a rien à enregistrer</string>
|
||||
<!-- Error message when there are no File Manager apps installed to select a folder when importing Bookmarks and Tracks -->
|
||||
@@ -854,13 +854,13 @@
|
||||
<string name="backup_interval_every_week">Hebdomadaire</string>
|
||||
<string name="pref_backup_location_title">Emplacement des enregistrements</string>
|
||||
<string name="pref_backup_location_summary_initial">Veuillez d’abord sélectionner un dossier puis accorder l’autorisation</string>
|
||||
<string name="pref_backup_now_summary_empty_lists">Aucun lieu ni piste à sauvegarder</string>
|
||||
<string name="pref_backup_now_summary_empty_lists">Ni signet ni trace à enregistrer</string>
|
||||
<string name="pref_backup_interval_title">Enregistrement automatique</string>
|
||||
<string name="pref_backup_status_summary_success">Dernier enregistrement réussi</string>
|
||||
<string name="pref_backup_now_summary_ok">L’enregistrement s’est déroulé avec succès</string>
|
||||
<string name="pref_backup_history_title">Nombre d’enregistrements à conserver</string>
|
||||
<string name="pref_backup_now_summary_folder_unavailable">L’emplacement pour enregistrer n’est pas disponible</string>
|
||||
<string name="pref_backup_title">Sauvegarder les favoris</string>
|
||||
<string name="pref_backup_title">Enregistrement des signets et des traces</string>
|
||||
<string name="backup_interval_manual_only">Désactivé (manuel uniquement)</string>
|
||||
<string name="pref_backup_summary">Enregistrement automatique dans un dossier de votre appareil</string>
|
||||
<string name="about_help">À propos & aide</string>
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="kilometres">Ciliméadar</string>
|
||||
</resources>
|
||||
@@ -144,7 +144,7 @@
|
||||
<!-- Email Subject when sharing bookmark list -->
|
||||
<string name="share_bookmarks_email_subject">Bagikan penanda CoMaps</string>
|
||||
<!-- message title of loading file -->
|
||||
<string name="load_kmz_title">Memuat Tempat Favorit</string>
|
||||
<string name="load_kmz_title">Memuat Penanda</string>
|
||||
<!-- Kmz file successful loading -->
|
||||
<string name="load_kmz_successful">Penanda berhasil dimuat! Anda dapat menemukannya pada peta atau pada layar Pengelola Penanda Lokasi.</string>
|
||||
<!-- Kml file loading failed -->
|
||||
@@ -525,7 +525,7 @@
|
||||
<string name="feedback_general">Umpan Balik Umum</string>
|
||||
<string name="prefs_languages_information">Kami menggunakan TTS sistem untuk petunjuk suara. Banyak perangkat Android menggunakan Google TTS, Anda dapat mengunduhnya dari Google Play (https://play.google.com/store/apps/details?id=com.google.android.tts)</string>
|
||||
<string name="prefs_languages_information_off">Untuk beberapa bahasa, Anda perlu menginstal synthesizer suara atau paket bahasa tambahan dari toko aplikasi (Google Play, Galaxy Store, App Gallery, FDroid). \nBuka pengaturan perangkat Anda → Language and input (Bahasa dan input) → Speech (Suara) → Text to speech (Teks ke suara). \nDi sini, Anda dapat mengelola pengaturan untuk sintesis suara (contohnya, mengunduh paket bahasa untuk penggunaan tanpa internet) dan memilih mesin tekske suara lain.</string>
|
||||
<string name="prefs_languages_information_off_link">Untuk informasi selengkapnya, bacalah panduan ini</string>
|
||||
<string name="prefs_languages_information_off_link">Untuk informasi selengkapnya, bacalah panduan ini.</string>
|
||||
<string name="transliteration_title">Transliterasi ke dalam bahasa Latin</string>
|
||||
<string name="learn_more">Pelajari selengkapnya</string>
|
||||
<!-- User selected the destination by pressing Route To, but the current position is unknown. User needs to select a starting point of a route using search or by tapping on the map and then pressing "Route From". -->
|
||||
|
||||
@@ -70,9 +70,9 @@
|
||||
<!-- Add Bookmark list dialog - hint when the list name is empty -->
|
||||
<string name="bookmark_set_name">Nome dell\'elenco</string>
|
||||
<!-- Should be used in the bookmarks-only context, see bookmarks_and_tracks if tracks are also implied. -->
|
||||
<string name="bookmarks">Luoghi</string>
|
||||
<string name="bookmarks">Luoghi preferiti</string>
|
||||
<!-- "Bookmarks and Tracks" dialog title, also sync it with iphone/plist.txt -->
|
||||
<string name="bookmarks_and_tracks">Luoghi preferiti</string>
|
||||
<string name="bookmarks_and_tracks">Preferiti</string>
|
||||
<!-- Add bookmark dialog - bookmark name -->
|
||||
<string name="name">Nome</string>
|
||||
<!-- Editor title above street and house number, duplicates [type.building.address] in types_strings.txt -->
|
||||
@@ -145,11 +145,11 @@
|
||||
<string name="description">Informazioni</string>
|
||||
<!-- Email Subject when sharing bookmark list -->
|
||||
<string name="share_bookmarks_email_subject">I miei luoghi preferiti su CoMaps</string>
|
||||
<string name="share_bookmarks_email_body">Ciao!\n\nIn allegato ci sono i miei luoghi preferiti; aprili con CoMaps. Se non hai installato l\'applicazione puoi farlo da qui: https://www.comaps.app/download/\n\nDivertiti a viaggiare con CoMaps!</string>
|
||||
<string name="share_bookmarks_email_body">Ciao!\n\nIn allegato ci sono i miei luoghi preferiti. Aprili se hai installato CoMaps. Oppure, se non ce l\'hai, scarica l\'app per iOS o Android seguendo questo link: https://www.comaps.app/\n\nDivertiti a viaggiare con CoMaps!</string>
|
||||
<!-- message title of loading file -->
|
||||
<string name="load_kmz_title">Caricamento luoghi preferiti</string>
|
||||
<!-- Kmz file successful loading -->
|
||||
<string name="load_kmz_successful">Luoghi preferiti caricati con successo! Puoi trovarli sulla mappa o nella schermata di gestione dei luoghi preferiti.</string>
|
||||
<string name="load_kmz_successful">Luoghi preferiti caricati con successo! Puoi trovarli sulla mappa o nella schermata Gestione Luoghi preferiti.</string>
|
||||
<!-- Kml file loading failed -->
|
||||
<string name="load_kmz_failed">Caricamento dei luoghi preferiti fallito. Il file potrebbe essere corrotto o difettoso.</string>
|
||||
<!-- Failed to recognize the format of a bookmarks or tracks file. -->
|
||||
@@ -560,7 +560,7 @@
|
||||
<string name="dialog_error_storage_message">Memoria esterna non disponibile. Probabilmente la scheda SD è stata rimossa, danneggiata o il file system è di sola lettura. Controlla la tua scheda SD o contattaci a support@comaps.app</string>
|
||||
<string name="setting_emulate_bad_storage">Simula memoria danneggiata</string>
|
||||
<string name="error_enter_correct_name">Inserire un nome corretto</string>
|
||||
<string name="bookmark_lists">Elenco dei preferiti</string>
|
||||
<string name="bookmark_lists">Elenchi</string>
|
||||
<!-- Do not display all bookmark lists on the map -->
|
||||
<string name="bookmark_lists_hide_all">Nascondi tutto</string>
|
||||
<string name="bookmark_lists_show_all">Mostra tutto</string>
|
||||
@@ -602,7 +602,7 @@
|
||||
<string name="subway">Metropolitana</string>
|
||||
<string name="layers_title">Stili e livelli della mappa</string>
|
||||
<string name="bookmarks_empty_list_title">Questo elenco è vuoto</string>
|
||||
<string name="bookmarks_empty_list_message">Per salvare un luogo preferito, tocca un punto sulla mappa e poi l\'icona a forma di stella</string>
|
||||
<string name="bookmarks_empty_list_message">Per aggiungere un luogo preferito, tocca un punto sulla mappa e poi tocca l\'icona a forma di stella</string>
|
||||
<string name="category_desc_more">…altro</string>
|
||||
<string name="export_file">Esporta KMZ</string>
|
||||
<string name="export_file_gpx">Esporta GPX</string>
|
||||
@@ -803,7 +803,7 @@
|
||||
<!-- Title for the "Stop Without Saving" action for the alert when saving a track recording. -->
|
||||
<string name="continue_recording">Continua a registrare</string>
|
||||
<!-- Title for the alert when saving a track recording. -->
|
||||
<string name="track_recording_alert_title">Salvare in Luoghi preferiti e tracce?</string>
|
||||
<string name="track_recording_alert_title">Salvare in Preferiti?</string>
|
||||
<!-- Message for the toast when saving the track recording is finished but nothing to save. -->
|
||||
<string name="track_recording_toast_nothing_to_save">La traccia è vuota - non c\'è nulla da salvare</string>
|
||||
<!-- Error message when there are no File Manager apps installed to select a folder when importing Bookmarks and Tracks -->
|
||||
@@ -906,12 +906,9 @@
|
||||
<string name="navigation_start_tts_disabled_message">Istruzioni vocali disabilitate: TTS non disponibile</string>
|
||||
<string name="prefs_speed_cameras_information">Gli avvisi di Autovelox sono disabilitati dove proibito dalla legge locale.</string>
|
||||
<string name="navigation_start_tts_message">"Inizio Navigazione, lingua per istruzioni vocali: "</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Inserisci un URL che inizia con http:// o https://</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Aggiungere un URL che inizia con https:// e finisce con /</string>
|
||||
<string name="download_resources_custom_url_summary_none">Non impostato</string>
|
||||
<string name="download_resources_custom_url_message">Sovrascrivi il server da cui scaricare le mappe. Lascia vuoto per usare i server default di CoMaps.</string>
|
||||
<string name="download_resources_custom_url_title">Server mappe personalizzato</string>
|
||||
<string name="advanced">Avanzate</string>
|
||||
<string name="opens_at">Apre alle %s</string>
|
||||
<string name="closes_at">Chiude alle %s</string>
|
||||
<string name="pref_maplanguage_local">Lingua locale</string>
|
||||
</resources>
|
||||
|
||||
@@ -129,7 +129,7 @@
|
||||
<string name="clear_search">Dilea Istori Hwilas</string>
|
||||
<string name="read_in_wikipedia">Wikipedya</string>
|
||||
<string name="wikimedia_commons">Wikimedia Commons</string>
|
||||
<string name="p2p_your_location">Dha Tyller</string>
|
||||
<string name="p2p_your_location">Agas Tyller</string>
|
||||
<string name="p2p_start">Dalleth</string>
|
||||
<string name="next_button">Nessa</string>
|
||||
<string name="editor_time_add">Addya Rol Vetyansow</string>
|
||||
@@ -186,8 +186,8 @@
|
||||
<string name="error_enter_correct_zip_code">Ynworra unn kod post ewn</string>
|
||||
<string name="editor_other_info">Noten dhe bodhogyon OpenStreetMap (dre dhewis)</string>
|
||||
<string name="editor_more_about_osm">Moy a-dro OpenStreetMap</string>
|
||||
<string name="editor_osm_history">Dha istori golegyans</string>
|
||||
<string name="editor_osm_notes">Dha notennow mappow</string>
|
||||
<string name="editor_osm_history">Agas istori golegyans</string>
|
||||
<string name="editor_osm_notes">Agas notennow mappow</string>
|
||||
<string name="editor_operator">Oberador</string>
|
||||
<string name="operator">Oberador: %s</string>
|
||||
<string name="kilometers_per_hour">kdo</string>
|
||||
@@ -266,9 +266,9 @@
|
||||
<string name="toll_road">Tollfordh</string>
|
||||
<string name="unpaved_road">Fordh dor</string>
|
||||
<string name="ferry_crossing">Kowbalhyns</string>
|
||||
<string name="yes">Ea</string>
|
||||
<string name="yes">Ya</string>
|
||||
<string name="no">Na</string>
|
||||
<string name="yes_available">Ea</string>
|
||||
<string name="yes_available">Ya</string>
|
||||
<string name="no_available">Na</string>
|
||||
<string name="capacity">Dalghuster: %s</string>
|
||||
<string name="network">Rosweyth: %s</string>
|
||||
@@ -332,7 +332,7 @@
|
||||
<string name="zoom_in">Moghhe</string>
|
||||
<string name="zoom_out">Lehe</string>
|
||||
<string name="website_menu">Kevren Rol Voos</string>
|
||||
<string name="view_menu">Gweles Rol Voos</string>
|
||||
<string name="view_menu">Vu Rol Voos</string>
|
||||
<string name="open_in_app">Ygeri yn Aral App</string>
|
||||
<string name="select_option">Dewis dewis</string>
|
||||
<string name="outdoor_seating">Esedhow yn-mes</string>
|
||||
@@ -509,7 +509,7 @@
|
||||
<string name="download_over_mobile_message">Y re bos kostek meur lowr war nebes towlow po a tramor</string>
|
||||
<string name="error_enter_correct_storey_number">An niver a leuryow res na eksedya %d</string>
|
||||
<string name="editor_note_hint">Deskrifa errors war an mappa po pyth may na golegys yn CoMaps</string>
|
||||
<string name="editor_about_osm">Gas chanjyow yw ughkargys dhe an sel dherivadow <a href="https://wiki.openstreetmap.org/wiki/About_OpenStreetMap">OpenStreetMap</a> poblek. Mar pleg, addya kedhlow privedh po gwirbryntys vyth.</string>
|
||||
<string name="editor_about_osm">Gas chanjyow yw ughkargys dhe an sel dherivadow <a href="https://wiki.openstreetmap.org/wiki/About_OpenStreetMap">OpenStreetMap</a> poblek. Mar pleg, addya kudhlow privedh po gwirbryntys vyth.</string>
|
||||
<string name="editor_category_unsuitable_title">Na gallos kavos unn klass fytti?</string>
|
||||
<string name="editor_category_unsuitable_text">CoMaps alowa hwi addya klassys sempel hepken, rag henna trevow, fordhow, lynnyn, drehevyansow, h.e. vyth. Mar pleg, addya a\'n par na klassys dhe <a href="https://www.openstreetmap.org">OpenStreetMap</a>. Checkya agan <a href="https://www.openstreetmap.org">kowethlyver</a> rag danvonadow kamm ha kamm manylys.</string>
|
||||
<string name="downloader_no_downloaded_maps_title">Hwi na iskargys neb mappys</string>
|
||||
@@ -523,9 +523,9 @@
|
||||
<string name="place_page_app_too_old_description">Gas data mappa a\'n jydh yw pur koth, nowedhi an app CoMaps.</string>
|
||||
<string name="place_page_update_too_old_map">Nowedhi pow mappa</string>
|
||||
<string name="place_page_too_old_to_edit">Ow golegi OpenStreetMap yw ungallosegi dre reson an data mappa yw re koth.</string>
|
||||
<string name="editor_share_to_all_dialog_message_1">Surhe hwi na ynworra neb kedhlow privedh po personel.</string>
|
||||
<string name="editor_share_to_all_dialog_message_1">Surhe hwi na ynworra neb kudhlow privedh po personel.</string>
|
||||
<string name="editor_share_to_all_dialog_message_2">Pennskriforyon OpenStreetMap a wra checkya an chanjyow ha kestava hwi a i kavos neb kwestyons.</string>
|
||||
<string name="mobile_data_dialog">Devnydhya junyans kellgowser dhe diskwedhes kedhlow manylys?</string>
|
||||
<string name="mobile_data_dialog">Devnydhya junyans kellgowser dhe diskwedhes kudhlow manylys?</string>
|
||||
<string name="mobile_data_option_always">Devnydhya Pub Prys</string>
|
||||
<string name="mobile_data_option_not_today">Na Devnydhya Hedhyw</string>
|
||||
<string name="mobile_data">Junyans Kellgowser</string>
|
||||
@@ -538,7 +538,7 @@
|
||||
<string name="enable_logging">Gallosegi kovadhow</string>
|
||||
<string name="prefs_languages_information">Ni devnydhya lev system rag danvonadow a dros. Lies devisyow Android devnydhya TTS Google, hwi gallos iskarga po nowedhi y yn Google Play (https://play.google.com/store/apps/details?id=com.google.android.tts)</string>
|
||||
<string name="prefs_languages_information_off">Rag nebes yethow, hwi res lea unn synthesyer kows po unn fardel yeth keworransel yn an gwerthji appys (Google Play, Galaxy Store, App Gallery, FDroid). \nYgeri gas settyansyow devis → Yeth ha ynworrans → Areth → Eskorrans tekst dhe areth. \nHwi gallos dyghtya omma settyansow rag synthesyans kows (rag ensampel, iskarga fardel yeth dhe devnydh dhywarlinen) ha dewis jynn tekst-dhe-areth aral.</string>
|
||||
<string name="prefs_languages_information_off_link">Rag moy kedhlow checkya an kowethlyver ma</string>
|
||||
<string name="prefs_languages_information_off_link">Rag moy kudhlow checkya an kowethlyver ma</string>
|
||||
<string name="prefs_speed_cameras_information">Gwarnyans kamera tooth yw marow yn broyow le may gwarnyansow yw difennys erbynn lagha leel.</string>
|
||||
<string name="transliteration_title">Treylya yn lytherennans Latin</string>
|
||||
<string name="routing_add_start_point">Devnydhya hwithrans po tava war an mappa rag addya unn tyller dalleth</string>
|
||||
@@ -585,7 +585,7 @@
|
||||
<string name="power_managment_setting_never">Bynner</string>
|
||||
<string name="power_managment_setting_auto">Pan batri yw isel</string>
|
||||
<string name="power_managment_setting_manual_max">Pub prys</string>
|
||||
<string name="enable_logging_warning_message">Gallosegi yn servadow an dewis ma rag rekordya ha danvon dre dhorn kovadhow manylys a-dro gas kudyn dhe ni gans \"Derivas unn kudyn\" yn an folen Gweres. Kovadhow re komprehendya kedhlow GPS.</string>
|
||||
<string name="enable_logging_warning_message">Gallosegi yn servadow an dewis ma rag rekordya ha danvon dre dhorn kovadhow manylys a-dro gas kudyn dhe ni gans \"Derivas unn kudyn\" yn an folen Gweres. Kovadhow re komprehendya kudhlow GPS.</string>
|
||||
<string name="driving_options_title">Dewisyow kerdh</string>
|
||||
<string name="avoid_tolls">Goheles tollow</string>
|
||||
<string name="avoid_unpaved">Goheles fordh ankonsys</string>
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
<color name="bg_panel">@color/bg_window</color>
|
||||
<color name="bg_primary_dark">#FF588157</color>
|
||||
<color name="bg_app">#10140F</color>
|
||||
<color name="bg_editor">#161b14</color>
|
||||
<color name="fg_editor">#282e25</color>
|
||||
|
||||
<color name="bg_menu">#CC2D3237</color>
|
||||
|
||||
|
||||
@@ -898,5 +898,4 @@
|
||||
<string name="download_resources_custom_url_message">Substitua o servidor padrão usado para baixar mapas. Deixe em branco para usar o servidor padrão do CoMaps.</string>
|
||||
<string name="download_resources_custom_url_summary_none">Não definido</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Insira uma URL começando com http:// ou https://</string>
|
||||
<string name="pref_maplanguage_local">Linguagem Local</string>
|
||||
</resources>
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
<!-- "Add new bookmark list" dialog title -->
|
||||
<string name="add_new_set">Adicionar conjunto novo</string>
|
||||
<!-- Add Bookmark list dialog - hint when the list name is empty -->
|
||||
<string name="bookmark_set_name">Nome do Conjunto</string>
|
||||
<string name="bookmark_set_name">Nome da Lista</string>
|
||||
<!-- Should be used in the bookmarks-only context, see bookmarks_and_tracks if tracks are also implied. -->
|
||||
<string name="bookmarks">Lugares</string>
|
||||
<!-- "Bookmarks and Tracks" dialog title, also sync it with iphone/plist.txt -->
|
||||
@@ -147,7 +147,7 @@
|
||||
<string name="share_bookmarks_email_subject">Os meus Favoritos do CoMaps</string>
|
||||
<string name="share_bookmarks_email_body">Olá! \n \nSegue em anexo os meus favoritos; por favor abra-os com o CoMaps. Caso não tenha, descarregue a aplicação aqui: https://www.comaps.app/download/ \n \nDivirta-se a viajar com o CoMaps!</string>
|
||||
<!-- message title of loading file -->
|
||||
<string name="load_kmz_title">A Carregar Favoritos</string>
|
||||
<string name="load_kmz_title">Carregando Favoritos</string>
|
||||
<!-- Kmz file successful loading -->
|
||||
<string name="load_kmz_successful">Os favoritos foram carregados com sucesso! Pode encontrá-los no mapa ou no ecrã de gestão dos favoritos.</string>
|
||||
<!-- Kml file loading failed -->
|
||||
@@ -491,7 +491,7 @@
|
||||
<string name="minute">min</string>
|
||||
<string name="day">dia</string>
|
||||
<string name="placepage_more_button">Mais</string>
|
||||
<string name="placepage_edit_bookmark_button">Editar Lugar Guardado</string>
|
||||
<string name="placepage_edit_bookmark_button">Editar favorito</string>
|
||||
<string name="placepage_personal_notes_hint">Notas pessoais (texto ou html)</string>
|
||||
<string name="editor_reset_edits_message">Eliminar todas as alterações locais?</string>
|
||||
<string name="editor_reset_edits_button">Descartar alterações</string>
|
||||
@@ -549,7 +549,7 @@
|
||||
<string name="dialog_error_storage_message">O armazenamento externo não está disponível. Provavelmente porque o cartão SD foi removido, danificado ou o sistema de ficheiros é apenas para leitura. Verifique e contacte-nos através do email support@comaps.app</string>
|
||||
<string name="setting_emulate_bad_storage">Emular o armazenamento defeituoso</string>
|
||||
<string name="error_enter_correct_name">Introduza um nome correto</string>
|
||||
<string name="bookmark_lists">Listas de Favoritos</string>
|
||||
<string name="bookmark_lists">Listas</string>
|
||||
<!-- Do not display all bookmark lists on the map -->
|
||||
<string name="bookmark_lists_hide_all">Ocultar tudo</string>
|
||||
<string name="bookmark_lists_show_all">Mostrar tudo</string>
|
||||
@@ -560,7 +560,7 @@
|
||||
</plurals>
|
||||
<string name="bookmarks_create_new_group">Criar nova lista</string>
|
||||
<!-- Bookmark categories screen, button that opens folder selection dialog to import KML/KMZ/GPX/KMB files -->
|
||||
<string name="bookmarks_import">Importar Favoritos</string>
|
||||
<string name="bookmarks_import">Importar favoritos e trajetos</string>
|
||||
<string name="bookmarks_error_message_share_general">Não foi possível partilhar devido a um erro da aplicação</string>
|
||||
<string name="bookmarks_error_title_share_empty">Erro ao partilhar</string>
|
||||
<string name="bookmarks_error_message_share_empty">Não é possível partilhar uma lista vazia</string>
|
||||
@@ -748,7 +748,7 @@
|
||||
<string name="browser_not_available">O navegador de Internet não está disponível</string>
|
||||
<string name="volume">Volume</string>
|
||||
<!-- Bookmark categories screen, button that opens share dialog to export all bookmarks and tracks -->
|
||||
<string name="bookmarks_export">Exportar todos os Favoritos e Trajetos</string>
|
||||
<string name="bookmarks_export">Exportar todos os favoritos e trajetos</string>
|
||||
<!-- button in (app) TTS settings, to open the system TTS settings. -->
|
||||
<string name="pref_tts_open_system_settings">Definições do sistema de síntese de voz</string>
|
||||
<!-- toast displayed when pressing the "Speech synthesis system settings" button, and the system settings aren't found. -->
|
||||
@@ -780,7 +780,7 @@
|
||||
<!-- Title for the "Stop Without Saving" action for the alert when saving a track recording. -->
|
||||
<string name="continue_recording">Continuar gravação</string>
|
||||
<!-- Title for the alert when saving a track recording. -->
|
||||
<string name="track_recording_alert_title">Guardar nos Favoritos?</string>
|
||||
<string name="track_recording_alert_title">Guardar em Favoritos e Trajetos?</string>
|
||||
<!-- Message for the toast when saving the track recording is finished but nothing to save. -->
|
||||
<string name="track_recording_toast_nothing_to_save">O trajeto está vazio - não há nada para guardar</string>
|
||||
<!-- Error message when there are no File Manager apps installed to select a folder when importing Bookmarks and Tracks -->
|
||||
@@ -847,10 +847,10 @@
|
||||
<string name="backup_interval_every_day">Diariamente</string>
|
||||
<string name="backup_interval_every_week">Semanalmente</string>
|
||||
<string name="backup_interval_manual_only">Off (apenas manual)</string>
|
||||
<string name="bookmark_color">Cor do Favorito</string>
|
||||
<string name="bookmark_color">Cor do marcador</string>
|
||||
<string name="pref_backup_now_summary_ok">Backup completado com sucesso</string>
|
||||
<string name="pref_backup_location_summary_initial">Por favor selecione uma pasta primeiro e garanta permissão</string>
|
||||
<string name="pref_backup_title">Backup dos Favoritos</string>
|
||||
<string name="pref_backup_title">Backup dos marcadores e trajetos</string>
|
||||
<string name="dialog_report_error_missing_folder">A localização de backup selecionada não está disponível ou não permite escrita. Selecione outra localização, por favor.</string>
|
||||
<string name="dialog_report_error_with_logs">Por favor, envie-nos um reporte de erro:\n - \"Ativar o histórico\" nas definições\n - reproduza o problema\n - no ecrã de \"Acerca & Ajuda\" pressione o botão para \"Reportar um problema\" e envie via email ou chat\n - desative o histórico</string>
|
||||
<string name="open_now">Aberto agora</string>
|
||||
@@ -914,5 +914,4 @@
|
||||
<string name="download_resources_custom_url_message">Substitui o servidor de download de mapas normal. Deixe em branco para usar o servidor do CoMaps padrão.</string>
|
||||
<string name="download_resources_custom_url_summary_none">Indefinido</string>
|
||||
<string name="download_resources_custom_url_error_scheme">Por favor, insira um URL começando com http:// ou https://</string>
|
||||
<string name="pref_maplanguage_local">Idioma Local</string>
|
||||
</resources>
|
||||
|
||||
@@ -878,7 +878,7 @@
|
||||
<string name="editor_submit">Trimite</string>
|
||||
<string name="avoid_paved">Evitați drumurile asfaltate sau pavate</string>
|
||||
<string name="avoid_steps">Evitați treptele</string>
|
||||
<string name="offline_explanation_text">O hartă trebuie descărcată ca să vezi și si să navighezi prin zonă.\nDescarcă hărți pentru zonele în care vrei să mergi.</string>
|
||||
<string name="offline_explanation_text">O hartă trebuie descărcată ca să vezi și si să nevighezi prin zonă.\nDescarcă hărți pentru zonele în care vrei să mergi.</string>
|
||||
<string name="offline_explanation_title">Hărti Offline</string>
|
||||
<string name="unknown_power_output">necunoscut</string>
|
||||
<string name="power_management">Economisire energie</string>
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
<!-- Should be used in the bookmarks-only context, see bookmarks_and_tracks if tracks are also implied. -->
|
||||
<string name="bookmarks">Метки</string>
|
||||
<!-- "Bookmarks and Tracks" dialog title, also sync it with iphone/plist.txt -->
|
||||
<string name="bookmarks_and_tracks">Избранное</string>
|
||||
<string name="bookmarks_and_tracks">Метки и треки</string>
|
||||
<!-- Add bookmark dialog - bookmark name -->
|
||||
<string name="name">Название</string>
|
||||
<!-- Editor title above street and house number, duplicates [type.building.address] in types_strings.txt -->
|
||||
|
||||
@@ -412,7 +412,7 @@
|
||||
<item quantity="few">%d datoteke najdene. Po pretvorbi si jih lahko ogledate.</item>
|
||||
<item quantity="other">%d datotek najdenih. Po pretvorbi si jih lahko ogledate.</item>
|
||||
</plurals>
|
||||
<string name="restore">Povrni</string>
|
||||
<string name="restore">Obnovi</string>
|
||||
<plurals name="tracks">
|
||||
<item quantity="one">%d pot</item>
|
||||
<item quantity="two">%d poti</item>
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
<!-- Should be used in the bookmarks-only context, see bookmarks_and_tracks if tracks are also implied. -->
|
||||
<string name="bookmarks">Места</string>
|
||||
<!-- "Bookmarks and Tracks" dialog title, also sync it with iphone/plist.txt -->
|
||||
<string name="bookmarks_and_tracks">Маркери</string>
|
||||
<string name="bookmarks_and_tracks">Фаворити</string>
|
||||
<!-- Add bookmark dialog - bookmark name -->
|
||||
<string name="name">Назив</string>
|
||||
<!-- Editor title above street and house number, duplicates [type.building.address] in types_strings.txt -->
|
||||
@@ -145,11 +145,11 @@
|
||||
<string name="share_bookmarks_email_subject">CoMaps фаворити</string>
|
||||
<string name="share_bookmarks_email_body">Здраво! \n \nУ прилогу су моји фаворити; молим те да их отвориш у CoMaps-у. Ако га немаш већ инсталираног, можеш да га преузмеш одавде: https://www.comaps.app/download/ \n \nУживај у путовању са CoMaps-ом!</string>
|
||||
<!-- message title of loading file -->
|
||||
<string name="load_kmz_title">Учитавање маркера</string>
|
||||
<string name="load_kmz_title">Учитавање фаворита</string>
|
||||
<!-- Kmz file successful loading -->
|
||||
<string name="load_kmz_successful">Маркери су успешно учитани! Можете их проначи на мапи помоћу Менаџера маркера.</string>
|
||||
<string name="load_kmz_successful">Фаворити су успешно учитани! Можете их проначи на мапи помоћу Менаџера фаворита.</string>
|
||||
<!-- Kml file loading failed -->
|
||||
<string name="load_kmz_failed">Неуспешно учитавање маркера. Могуће да је фајл оштећен или неисправан.</string>
|
||||
<string name="load_kmz_failed">Неуспешно учитавање фаворита. Могуће да је фајл оштећен или неисправан.</string>
|
||||
<!-- Failed to recognize the format of a bookmarks or tracks file. -->
|
||||
<string name="unknown_file_type">Апликација не препознаје ову врсту фајла: \n%1$s</string>
|
||||
<!-- Failed to open a bookmarks or tracks file in CoMaps. -->
|
||||
@@ -492,7 +492,7 @@
|
||||
<string name="minute">мин</string>
|
||||
<string name="day">д</string>
|
||||
<string name="placepage_more_button">Више</string>
|
||||
<string name="placepage_edit_bookmark_button">Измени место</string>
|
||||
<string name="placepage_edit_bookmark_button">Измени снимљено место</string>
|
||||
<string name="editor_reset_edits_message">Брисање свих измена које нису послате?</string>
|
||||
<string name="editor_reset_edits_button">Одбаци промене</string>
|
||||
<string name="editor_remove_place_message">Брисање додатог места?</string>
|
||||
@@ -567,7 +567,7 @@
|
||||
</plurals>
|
||||
<string name="bookmarks_create_new_group">Креирај нову листу</string>
|
||||
<!-- Bookmark categories screen, button that opens folder selection dialog to import KML/KMZ/GPX/KMB files -->
|
||||
<string name="bookmarks_import">Увези маркере</string>
|
||||
<string name="bookmarks_import">Увези фаворите</string>
|
||||
<string name="bookmarks_error_message_share_general">Дељење није могуће због грешке у апликацији</string>
|
||||
<string name="bookmarks_error_title_share_empty">Грешка приликом дељења</string>
|
||||
<string name="bookmarks_error_message_share_empty">Не може се поделити празна листа</string>
|
||||
@@ -789,7 +789,7 @@
|
||||
<!-- Title for the "Stop Without Saving" action for the alert when saving a track recording. -->
|
||||
<string name="continue_recording">Настави снимање</string>
|
||||
<!-- Title for the alert when saving a track recording. -->
|
||||
<string name="track_recording_alert_title">Сачувати у маркерима?</string>
|
||||
<string name="track_recording_alert_title">Сачувати у фаворитима?</string>
|
||||
<!-- Message for the toast when saving the track recording is finished but nothing to save. -->
|
||||
<string name="track_recording_toast_nothing_to_save">Путања је празна, нема шта да се сачува</string>
|
||||
<!-- Error message when there are no File Manager apps installed to select a folder when importing Bookmarks and Tracks -->
|
||||
|
||||
@@ -851,12 +851,4 @@
|
||||
<string name="pedestrian">Gående</string>
|
||||
<string name="error_enter_correct_line_page">Ange en giltig webbadress</string>
|
||||
<string name="move_maps_error">Kunde inte flytta kartfiler</string>
|
||||
<string name="opens_at">Öppnar kl. %s</string>
|
||||
<string name="closes_at">Stänger kl. %s</string>
|
||||
<string name="opens_day_at">Öppnar på %1$s kl. %2$s</string>
|
||||
<string name="closes_day_at">Stänger på %1$s kl. %2$s</string>
|
||||
<plurals name="minutes_short">
|
||||
<item quantity="one">%d min</item>
|
||||
<item quantity="other">%d min</item>
|
||||
</plurals>
|
||||
</resources>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<string name="kilometres">கிலோமீட்டர்கள்</string>
|
||||
<string name="miles">மைல்கள்</string>
|
||||
<string name="search">தேடல்</string>
|
||||
<string name="bookmarks_and_tracks">பிடித்தவை</string>
|
||||
<string name="bookmarks_and_tracks">புக்மார்க்குகள் மற்றும் தடங்கள்</string>
|
||||
<string name="later">பிறகு</string>
|
||||
<string name="zoom_to_country">வரைபடத்தில் காட்டு</string>
|
||||
<string name="country_status_download_failed">பதிவிறக்கம் தோல்வியடைந்தது</string>
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
<!-- Should be used in the bookmarks-only context, see bookmarks_and_tracks if tracks are also implied. -->
|
||||
<string name="bookmarks">Мітки</string>
|
||||
<!-- "Bookmarks and Tracks" dialog title, also sync it with iphone/plist.txt -->
|
||||
<string name="bookmarks_and_tracks">Обране</string>
|
||||
<string name="bookmarks_and_tracks">Мітки та маршрути</string>
|
||||
<!-- Add bookmark dialog - bookmark name -->
|
||||
<string name="name">Iм\'я</string>
|
||||
<!-- Editor title above street and house number, duplicates [type.building.address] in types_strings.txt -->
|
||||
@@ -834,14 +834,4 @@
|
||||
<string name="panoramax">Фото Panoramax</string>
|
||||
<string name="app_site_url">https://comaps.app/uk/</string>
|
||||
<string name="saved">Збережено</string>
|
||||
<string name="opens_at">Відкриття о %@</string>
|
||||
<string name="unknown_power_output">невідомо</string>
|
||||
<string name="charge_socket_count">Кількість</string>
|
||||
<string name="unknown_count">невідомо</string>
|
||||
<string name="editor_submit">Надіслати</string>
|
||||
<string name="pref_left_button_disable">Вимкнути</string>
|
||||
<string name="clear">Очистити</string>
|
||||
<string name="vehicle">Транспортний засіб</string>
|
||||
<string name="bicycle">Велосипед</string>
|
||||
<string name="backup_interval_every_day">Щоденно</string>
|
||||
</resources>
|
||||
|
||||
@@ -493,9 +493,9 @@
|
||||
<string name="editor_more_about_osm">关于 OpenStreetMap 的更多信息</string>
|
||||
<string name="editor_osm_history">您的编辑历史</string>
|
||||
<string name="editor_osm_notes">您的地图数据注记</string>
|
||||
<string name="editor_operator">运营方</string>
|
||||
<string name="editor_operator">操作员</string>
|
||||
<!-- To indicate the operator of ATMs, bicycle rentals, electric vehicle charging stations... -->
|
||||
<string name="operator">运营方:%s</string>
|
||||
<string name="operator">操作员: %s</string>
|
||||
<string name="editor_category_unsuitable_title">找不到合适的类别?</string>
|
||||
<string name="editor_category_unsuitable_text">CoMaps 只允许添加简单的点类别,即无法添加城镇、道路、湖泊、建筑轮廓等类别。请直接向 <a href="https://www.openstreetmap.org">OpenStreetMap.org</a> 添加此类类别。请查看我们的<a href="https://www.comaps.app/support/advanced-map-editing/">指南</a>,了解详细的步骤说明。</string>
|
||||
<string name="downloader_no_downloaded_maps_title">您尚未下载任何地图</string>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user