mirror of
https://codeberg.org/comaps/comaps
synced 2026-01-08 21:37:58 +00:00
Compare commits
5 Commits
x7z4w-cuis
...
zy-live-lo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a1b3fc939a | ||
|
|
d234930464 | ||
|
|
7e75aac135 | ||
|
|
6c3710859b | ||
|
|
d430a2202e |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -38,9 +38,6 @@ data/patterns.txt*
|
||||
# Auto-generated from data/categories-strings/* by tools/unix/generate_categories.sh
|
||||
data/categories.txt
|
||||
|
||||
# Auto-generated from data/cuisines-strings/* by tools/unix/generate_cuisines.sh
|
||||
data/categories_cuisines.txt
|
||||
|
||||
# Compiled Python
|
||||
*.pyc
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
Лесна навигация - Открийте повече от вашето пътуване - Подкрепен от общността
|
||||
@@ -1 +0,0 @@
|
||||
CoMaps - Хайкинг, Велосипед, Пътуване без Интернет
|
||||
@@ -1,4 +1,4 @@
|
||||
这是一个由社区主导、以 OpenStreetMap 数据为基础的自由开源地图应用,建立在我们对运营透明、隐私安全和非营利性的承诺之上。CoMaps 是 Organic Maps 的分叉/衍生产品,而 Organic Maps 则是 Maps.ME 的分叉。
|
||||
这是一个由社区主导、以 OpenStreetMap 数据为基础的免费开源地图应用,建立在我们对运营透明、隐私安全和非营利性的承诺之上。CoMaps 是 Organic Maps 的分叉/衍生产品,而 Organic Maps 则是 Maps.ME 的分叉。
|
||||
|
||||
如需了解此项目诞生的原因及未来方向,请访问 <b><i>codeberg.org/comaps</i></b>。
|
||||
加入以上社区,和大家一起打造最优质的地图应用
|
||||
@@ -10,7 +10,7 @@
|
||||
‣ <b>尊重隐私</b>:开发者们在设计 CoMaps 时,优先考虑的是保护用户隐私。CoMaps 无法识别用户身份、无法跟踪用户活动,也无法收集个人信息。此外,CoMaps 不会也不能显示任何广告。
|
||||
‣ <b>简洁精致</b>:轻便易用、不出差错的基本功能。
|
||||
‣ <b>节省电池电量和空间</b>:不会像其他导航应用那样耗电。精简的地图可以节省宝贵的手机空间。
|
||||
‣ <b>自由且社区共建</b>:如同您一样的用户通过向 OpenStreetMap 添加地点、测试功能并提供反馈、无私地贡献自己的编程技能和资金,协力开发了 CoMaps。
|
||||
‣ <b>由社区合作创建的免费应用</b>:如同您一样的用户通过向 OpenStreetMap 添加地点、测试功能并提供反馈、无私地贡献自己的编程技能和资金,协力开发了 CoMaps。
|
||||
‣ <b>决策问责、财务透明、非营利性、完全开源。</b>
|
||||
|
||||
<b>主要功能</b>:
|
||||
@@ -25,7 +25,7 @@
|
||||
• 地铁交通图层和路线指示
|
||||
• 轨迹记录
|
||||
• 以 KML、KMZ 和 GPX 格式导出和导入书签和轨迹
|
||||
• 深色模式,适配夜间使用场景
|
||||
• 选择天暗后自动开启的黑暗模式
|
||||
• 使用基本的内置编辑器来编辑 OpenStreetMap 地点,帮助大家改进地图数据
|
||||
|
||||
<b>自由在此</b>
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
Лесна навигация - Открийте повече от вашето пътуване - Подкрепен от общността
|
||||
@@ -1 +0,0 @@
|
||||
CoMaps - Пътуване с Приватност
|
||||
@@ -1,36 +0,0 @@
|
||||
Skupnostno vodena brezplačna in odprtokodna aplikacija za zemljevide, ki temelji na podatkih OpenStreetMap, ter je okrepljena z zavezanostjo k transparentnosti, zasebnosti, in ostajanju neprofitne organizacije.
|
||||
|
||||
Pridružite se skupnosti in pomagajte ustvariti najboljšo aplikacijo za zemljevide.
|
||||
• Uporabljajte aplikacijo in jo priporočajte drugim.
|
||||
• Podajte povratne informacije in poročajte o težavah.
|
||||
• Posodobite podatke zemljevida v aplikaciji ali na spletni strani OpenStreetMap.
|
||||
|
||||
<i>Vaše povratne informacije in 5-zvezdične ocene so najboljša podpora za nas!</i>
|
||||
|
||||
‣ <b>Preprostost in izpopolnjenost</b>: bistvene, enostavne za uporabo funkcije, ki preprosto delujejo.
|
||||
‣ <b>Osredotočena na delovanje brez internetne povezave</b>: načrtujte in navigirajte svoje potovanje v tujini brez potrebe po mobilni povezavi, iščite točke na poti med daljšo pohodniško turo, itd. Vse funkcije aplikacije so zasnovane za delovanje brez internetne povezave.
|
||||
‣ <b>Spoštovanje zasebnosti</b>: aplikacija je zasnovana z mislijo na zasebnost – ne identificira ljudi, ne sledi in ne zbira osebnih podatkov. Brez oglasov.
|
||||
‣ <b>Varčuje z baterijo in prostorom</b>: ne izčrpava baterije kot druge navigacijske aplikacije. Kompaktni zemljevidi varčujejo dragoceni prostor na vašem telefonu.
|
||||
‣ <b>Brezplačna in ustvarjena s pomočjo skupnosti</b>: ljudje, kot ste vi, so pomagali ustvariti aplikacijo z dodajanjem krajev v OpenStreetMap, testiranjem in dajanjem povratnih informacij o funkcijah ter prispevanjem svojih razvojnih veščin in denarja.
|
||||
‣ <b>Odprto in pregledno odločanje in finance, neprofitna in popolnoma odprtokodna aplikacija.
|
||||
|
||||
<b>Glavne značilnosti</b>:
|
||||
• Podrobni zemljevidi z mesti, ki niso na voljo v Google Maps, ki jih lahko prenesete
|
||||
• Način za uporabo na prostem z označenimi pohodniškimi potmi, kampi, vodnimi viri, vrhovi, višinskimi krivuljami itd.
|
||||
• Pešpoti in kolesarske poti
|
||||
• Zanimivosti, kot so restavracije, bencinske črpalke, hoteli, trgovine, znamenitosti in še veliko več
|
||||
• Iskanje po imenu, naslovu ali kategoriji zanimivih točk
|
||||
• Navigacija z glasovnimi napovedmi za hojo, kolesarjenje ali vožnjo
|
||||
• Z enim dotikom dodajte svoje priljubljene kraje v zaznamke
|
||||
• Članki iz Wikipedije za uporabo brez internetne povezave
|
||||
• Plast podzemne železnice in navodila za pot
|
||||
• Sledenje poti
|
||||
• Izvoz in uvoz zaznamkov in poti v formatih KML, KMZ, GPX
|
||||
• Temni način za uporabo ponoči
|
||||
• Izboljšajte zemljevidne podatke za vse z uporabo vgrajenega osnovnega urejevalnika.
|
||||
• Podpora za Android Auto.
|
||||
|
||||
Prijavite težave z aplikacijo, predlagajte ideje in se pridružite naši skupnosti na spletni strani <b><i>comaps.app</i></b>.
|
||||
|
||||
<b>Svoboda je tu</b>
|
||||
Odkrijte svojo pot, raziskujte svet z zasebnostjo in skupnostjo v ospredju!
|
||||
@@ -1 +0,0 @@
|
||||
CoMaps - Navigacija z zasebnostjo
|
||||
@@ -1,4 +1,4 @@
|
||||
这是一个由社区主导、以 OpenStreetMap 数据为基础的自由开源地图应用,建立在我们对运营透明、隐私安全和非营利性的承诺之上。
|
||||
这是一个由社区主导、以 OpenStreetMap 数据为基础的免费开源地图应用,建立在我们对运营透明、隐私安全和非营利性的承诺之上。
|
||||
|
||||
加入社区,和大家一起打造最优质的地图应用
|
||||
• 使用 CoMaps 的同时也分享推荐给周围的人
|
||||
@@ -11,7 +11,7 @@
|
||||
‣ <b>以提供离线服务为核心</b>:无需移动网络即可规划和导航您的海外旅行,郊外远足时仍可搜索航点等等。所有功能均可离线使用。
|
||||
‣ <b>尊重隐私</b>:开发者们在设计 CoMaps 时,优先考虑的是保护用户隐私。CoMaps 无法识别用户身份、无法跟踪用户活动,也无法收集个人信息。此外,CoMaps 不会也不能显示任何广告。
|
||||
‣ <b>节省电池电量和空间</b>:不会像其他导航应用那样耗电。精简的地图可以节省宝贵的手机空间。
|
||||
‣ <b>自由且社区共建</b>:如同您一样的用户通过向 OpenStreetMap 添加地点、测试功能并提供反馈、无私地贡献自己的编程技能和资金,协力开发了 CoMaps。
|
||||
‣ <b>由社区合作创建的免费应用</b>:如同您一样的用户通过向 OpenStreetMap 添加地点、测试功能并提供反馈、无私地贡献自己的编程技能和资金,协力开发了 CoMaps。
|
||||
‣ <b>决策问责、财务透明、非营利性、完全开源。</b>
|
||||
|
||||
<b>主要功能</b>:
|
||||
@@ -26,7 +26,7 @@
|
||||
• 地铁交通图层和路线指示
|
||||
• 轨迹记录
|
||||
• 以 KML、KMZ 和 GPX 格式导出和导入书签和轨迹
|
||||
• 深色模式,适配夜间使用场景
|
||||
• 选择天暗后自动开启的黑暗模式
|
||||
• 使用基本的内置编辑器来编辑 OpenStreetMap 地点,帮助大家改进地图数据
|
||||
• 支持 Android Auto
|
||||
|
||||
|
||||
@@ -500,6 +500,13 @@
|
||||
android:stopWithTask="false"
|
||||
/>
|
||||
|
||||
<service android:name=".location.LocationSharingService"
|
||||
android:foregroundServiceType="location"
|
||||
android:exported="false"
|
||||
android:enabled="true"
|
||||
android:stopWithTask="false"
|
||||
/>
|
||||
|
||||
<service
|
||||
android:name=".downloader.DownloaderService"
|
||||
android:foregroundServiceType="dataSync"
|
||||
|
||||
@@ -426,19 +426,32 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
private void shareMyLocation()
|
||||
{
|
||||
final Location loc = MwmApplication.from(this).getLocationHelper().getSavedLocation();
|
||||
if (loc != null)
|
||||
if (loc == null)
|
||||
{
|
||||
SharingUtils.shareLocation(this, loc);
|
||||
dismissLocationErrorDialog();
|
||||
mLocationErrorDialog = new MaterialAlertDialogBuilder(MwmActivity.this, R.style.MwmTheme_AlertDialog)
|
||||
.setMessage(R.string.unknown_current_position)
|
||||
.setCancelable(true)
|
||||
.setPositiveButton(R.string.ok, null)
|
||||
.setOnDismissListener(dialog -> mLocationErrorDialog = null)
|
||||
.show();
|
||||
return;
|
||||
}
|
||||
|
||||
dismissLocationErrorDialog();
|
||||
mLocationErrorDialog = new MaterialAlertDialogBuilder(MwmActivity.this, R.style.MwmTheme_AlertDialog)
|
||||
.setMessage(R.string.unknown_current_position)
|
||||
.setCancelable(true)
|
||||
.setPositiveButton(R.string.ok, null)
|
||||
.setOnDismissListener(dialog -> mLocationErrorDialog = null)
|
||||
.show();
|
||||
SharingUtils.shareLocation(this, loc);
|
||||
}
|
||||
|
||||
public void onLocationSharingStateChanged(boolean isSharing)
|
||||
{
|
||||
mMapButtonsViewModel.setLocationSharingState(isSharing);
|
||||
MapButtonsController mapButtonsController =
|
||||
(MapButtonsController) getSupportFragmentManager().findFragmentById(R.id.map_buttons);
|
||||
if (mapButtonsController != null)
|
||||
mapButtonsController.updateMenuBadge();
|
||||
|
||||
// Update share location button color in navigation menu
|
||||
if (mNavigationController != null)
|
||||
mNavigationController.refreshShareLocationColor();
|
||||
}
|
||||
|
||||
private void showDownloader(boolean openDownloaded)
|
||||
@@ -1683,6 +1696,13 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
mMapButtonsViewModel.setLayoutMode(MapButtonsController.LayoutMode.regular);
|
||||
refreshLightStatusBar();
|
||||
Utils.keepScreenOn(Config.isKeepScreenOnEnabled(), getWindow());
|
||||
|
||||
// Stop location sharing when navigation ends
|
||||
if (app.organicmaps.location.LocationSharingManager.getInstance().isSharing())
|
||||
{
|
||||
app.organicmaps.location.LocationSharingManager.getInstance().stopSharing();
|
||||
onLocationSharingStateChanged(false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,200 @@
|
||||
package app.organicmaps.api;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
/**
|
||||
* HTTP API client for location sharing server.
|
||||
* Sends encrypted location updates to the server.
|
||||
*/
|
||||
public class LocationSharingApiClient
|
||||
{
|
||||
private static final String TAG = LocationSharingApiClient.class.getSimpleName();
|
||||
|
||||
private static final int CONNECT_TIMEOUT_MS = 10000;
|
||||
private static final int READ_TIMEOUT_MS = 10000;
|
||||
|
||||
private final String mServerBaseUrl;
|
||||
private final String mSessionId;
|
||||
private final Executor mExecutor;
|
||||
|
||||
public interface Callback
|
||||
{
|
||||
void onSuccess();
|
||||
void onFailure(@NonNull String error);
|
||||
}
|
||||
|
||||
public LocationSharingApiClient(@NonNull String serverBaseUrl, @NonNull String sessionId)
|
||||
{
|
||||
mServerBaseUrl = serverBaseUrl.endsWith("/") ? serverBaseUrl : serverBaseUrl + "/";
|
||||
mSessionId = sessionId;
|
||||
mExecutor = Executors.newSingleThreadExecutor();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new session on the server.
|
||||
* @param callback Result callback
|
||||
*/
|
||||
public void createSession(@Nullable Callback callback)
|
||||
{
|
||||
mExecutor.execute(() -> {
|
||||
try
|
||||
{
|
||||
String url = mServerBaseUrl + "api/v1/session";
|
||||
String requestBody = "{\"sessionId\":\"" + mSessionId + "\"}";
|
||||
|
||||
int responseCode = postJson(url, requestBody);
|
||||
|
||||
if (responseCode >= 200 && responseCode < 300)
|
||||
{
|
||||
Logger.d(TAG, "Session created successfully: " + mSessionId);
|
||||
if (callback != null)
|
||||
callback.onSuccess();
|
||||
}
|
||||
else
|
||||
{
|
||||
String error = "Server returned error: " + responseCode;
|
||||
Logger.w(TAG, error);
|
||||
if (callback != null)
|
||||
callback.onFailure(error);
|
||||
}
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
Logger.e(TAG, "Failed to create session", e);
|
||||
if (callback != null)
|
||||
callback.onFailure(e.getMessage());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Update location on the server with encrypted payload.
|
||||
* @param encryptedPayloadJson Encrypted payload JSON (from native code)
|
||||
* @param callback Result callback
|
||||
*/
|
||||
public void updateLocation(@NonNull String encryptedPayloadJson, @Nullable Callback callback)
|
||||
{
|
||||
mExecutor.execute(() -> {
|
||||
try
|
||||
{
|
||||
String url = mServerBaseUrl + "api/v1/location/" + mSessionId;
|
||||
|
||||
int responseCode = postJson(url, encryptedPayloadJson);
|
||||
|
||||
if (responseCode >= 200 && responseCode < 300)
|
||||
{
|
||||
Logger.d(TAG, "Location updated successfully");
|
||||
if (callback != null)
|
||||
callback.onSuccess();
|
||||
}
|
||||
else
|
||||
{
|
||||
String error = "Server returned error: " + responseCode;
|
||||
Logger.w(TAG, error);
|
||||
if (callback != null)
|
||||
callback.onFailure(error);
|
||||
}
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
Logger.e(TAG, "Failed to update location", e);
|
||||
if (callback != null)
|
||||
callback.onFailure(e.getMessage());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* End the session on the server.
|
||||
*/
|
||||
public void endSession()
|
||||
{
|
||||
mExecutor.execute(() -> {
|
||||
try
|
||||
{
|
||||
String url = mServerBaseUrl + "api/v1/session/" + mSessionId;
|
||||
deleteRequest(url);
|
||||
Logger.d(TAG, "Session ended: " + mSessionId);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
Logger.e(TAG, "Failed to end session", e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a POST request with JSON body.
|
||||
* @param urlString URL to send request to
|
||||
* @param jsonBody JSON request body
|
||||
* @return HTTP response code
|
||||
* @throws IOException on network error
|
||||
*/
|
||||
private int postJson(@NonNull String urlString, @NonNull String jsonBody) throws IOException
|
||||
{
|
||||
URL url = new URL(urlString);
|
||||
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||
|
||||
try
|
||||
{
|
||||
connection.setRequestMethod("POST");
|
||||
connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
|
||||
connection.setRequestProperty("Accept", "application/json");
|
||||
connection.setConnectTimeout(CONNECT_TIMEOUT_MS);
|
||||
connection.setReadTimeout(READ_TIMEOUT_MS);
|
||||
connection.setDoOutput(true);
|
||||
|
||||
// Write body
|
||||
byte[] bodyBytes = jsonBody.getBytes(StandardCharsets.UTF_8);
|
||||
connection.setFixedLengthStreamingMode(bodyBytes.length);
|
||||
|
||||
try (OutputStream os = connection.getOutputStream())
|
||||
{
|
||||
os.write(bodyBytes);
|
||||
os.flush();
|
||||
}
|
||||
|
||||
return connection.getResponseCode();
|
||||
}
|
||||
finally
|
||||
{
|
||||
connection.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a DELETE request.
|
||||
* @param urlString URL to send request to
|
||||
* @return HTTP response code
|
||||
* @throws IOException on network error
|
||||
*/
|
||||
private int deleteRequest(@NonNull String urlString) throws IOException
|
||||
{
|
||||
URL url = new URL(urlString);
|
||||
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||
|
||||
try
|
||||
{
|
||||
connection.setRequestMethod("DELETE");
|
||||
connection.setConnectTimeout(CONNECT_TIMEOUT_MS);
|
||||
connection.setReadTimeout(READ_TIMEOUT_MS);
|
||||
|
||||
return connection.getResponseCode();
|
||||
}
|
||||
finally
|
||||
{
|
||||
connection.disconnect();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -113,6 +113,9 @@ public class PhoneListAdapter extends RecyclerView.Adapter<PhoneListAdapter.View
|
||||
|
||||
deleteButton = itemView.findViewById(R.id.delete_icon);
|
||||
deleteButton.setOnClickListener(this);
|
||||
// TODO: setting icons from code because icons defined in layout XML are white.
|
||||
deleteButton.setImageResource(R.drawable.ic_delete);
|
||||
((ShapeableImageView) itemView.findViewById(R.id.phone_icon)).setImageResource(R.drawable.ic_phone);
|
||||
}
|
||||
|
||||
public void setPosition(int position)
|
||||
|
||||
@@ -0,0 +1,131 @@
|
||||
package app.organicmaps.location;
|
||||
|
||||
import android.util.Base64;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.SecureRandom;
|
||||
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.spec.GCMParameterSpec;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
|
||||
/**
|
||||
* AES-256-GCM encryption/decryption for location data.
|
||||
*/
|
||||
public class LocationCrypto
|
||||
{
|
||||
private static final String ALGORITHM = "AES/GCM/NoPadding";
|
||||
private static final int GCM_IV_LENGTH = 12; // 96 bits
|
||||
private static final int GCM_TAG_LENGTH = 128; // 128 bits
|
||||
|
||||
/**
|
||||
* Encrypt plaintext JSON using AES-256-GCM.
|
||||
* @param base64Key Base64-encoded 256-bit key
|
||||
* @param plaintextJson JSON string to encrypt
|
||||
* @return JSON string with encrypted payload: {"iv":"...","ciphertext":"...","authTag":"..."}
|
||||
*/
|
||||
@Nullable
|
||||
public static String encrypt(@NonNull String base64Key, @NonNull String plaintextJson)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Decode the base64 key
|
||||
byte[] key = Base64.decode(base64Key, Base64.NO_WRAP);
|
||||
if (key.length != 32) // 256 bits
|
||||
{
|
||||
android.util.Log.e("LocationCrypto", "Invalid key size: " + key.length);
|
||||
return null;
|
||||
}
|
||||
|
||||
// Generate random IV
|
||||
byte[] iv = new byte[GCM_IV_LENGTH];
|
||||
new SecureRandom().nextBytes(iv);
|
||||
|
||||
// Create cipher
|
||||
Cipher cipher = Cipher.getInstance(ALGORITHM);
|
||||
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
|
||||
GCMParameterSpec gcmSpec = new GCMParameterSpec(GCM_TAG_LENGTH, iv);
|
||||
cipher.init(Cipher.ENCRYPT_MODE, keySpec, gcmSpec);
|
||||
|
||||
// Encrypt
|
||||
byte[] plaintext = plaintextJson.getBytes(StandardCharsets.UTF_8);
|
||||
byte[] ciphertextWithTag = cipher.doFinal(plaintext);
|
||||
|
||||
// Split ciphertext and auth tag
|
||||
// In GCM mode, doFinal() returns ciphertext + tag
|
||||
int ciphertextLength = ciphertextWithTag.length - (GCM_TAG_LENGTH / 8);
|
||||
byte[] ciphertext = new byte[ciphertextLength];
|
||||
byte[] authTag = new byte[GCM_TAG_LENGTH / 8];
|
||||
|
||||
System.arraycopy(ciphertextWithTag, 0, ciphertext, 0, ciphertextLength);
|
||||
System.arraycopy(ciphertextWithTag, ciphertextLength, authTag, 0, authTag.length);
|
||||
|
||||
// Build JSON response
|
||||
JSONObject result = new JSONObject();
|
||||
result.put("iv", Base64.encodeToString(iv, Base64.NO_WRAP));
|
||||
result.put("ciphertext", Base64.encodeToString(ciphertext, Base64.NO_WRAP));
|
||||
result.put("authTag", Base64.encodeToString(authTag, Base64.NO_WRAP));
|
||||
|
||||
return result.toString();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
android.util.Log.e("LocationCrypto", "Encryption failed", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Decrypt encrypted payload using AES-256-GCM.
|
||||
* @param base64Key Base64-encoded 256-bit key
|
||||
* @param encryptedPayloadJson JSON string with format: {"iv":"...","ciphertext":"...","authTag":"..."}
|
||||
* @return Decrypted plaintext JSON string
|
||||
*/
|
||||
@Nullable
|
||||
public static String decrypt(@NonNull String base64Key, @NonNull String encryptedPayloadJson)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Parse encrypted payload
|
||||
JSONObject payload = new JSONObject(encryptedPayloadJson);
|
||||
byte[] iv = Base64.decode(payload.getString("iv"), Base64.NO_WRAP);
|
||||
byte[] ciphertext = Base64.decode(payload.getString("ciphertext"), Base64.NO_WRAP);
|
||||
byte[] authTag = Base64.decode(payload.getString("authTag"), Base64.NO_WRAP);
|
||||
|
||||
// Decode the base64 key
|
||||
byte[] key = Base64.decode(base64Key, Base64.NO_WRAP);
|
||||
if (key.length != 32) // 256 bits
|
||||
{
|
||||
android.util.Log.e("LocationCrypto", "Invalid key size: " + key.length);
|
||||
return null;
|
||||
}
|
||||
|
||||
// Combine ciphertext and auth tag for GCM decryption
|
||||
byte[] ciphertextWithTag = new byte[ciphertext.length + authTag.length];
|
||||
System.arraycopy(ciphertext, 0, ciphertextWithTag, 0, ciphertext.length);
|
||||
System.arraycopy(authTag, 0, ciphertextWithTag, ciphertext.length, authTag.length);
|
||||
|
||||
// Create cipher
|
||||
Cipher cipher = Cipher.getInstance(ALGORITHM);
|
||||
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
|
||||
GCMParameterSpec gcmSpec = new GCMParameterSpec(GCM_TAG_LENGTH, iv);
|
||||
cipher.init(Cipher.DECRYPT_MODE, keySpec, gcmSpec);
|
||||
|
||||
// Decrypt
|
||||
byte[] plaintext = cipher.doFinal(ciphertextWithTag);
|
||||
|
||||
return new String(plaintext, StandardCharsets.UTF_8);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
android.util.Log.e("LocationCrypto", "Decryption failed", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,220 @@
|
||||
package app.organicmaps.location;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.content.ClipData;
|
||||
import android.content.ClipboardManager;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.util.SharingUtils;
|
||||
|
||||
/**
|
||||
* Dialog for starting/stopping live location sharing and managing the share URL.
|
||||
*/
|
||||
public class LocationSharingDialog extends DialogFragment
|
||||
{
|
||||
private static final String TAG = LocationSharingDialog.class.getSimpleName();
|
||||
|
||||
@Nullable
|
||||
private TextView mStatusText;
|
||||
@Nullable
|
||||
private TextView mShareUrlText;
|
||||
@Nullable
|
||||
private Button mStartStopButton;
|
||||
@Nullable
|
||||
private Button mCopyButton;
|
||||
@Nullable
|
||||
private Button mShareButton;
|
||||
|
||||
private LocationSharingManager mManager;
|
||||
|
||||
public static void show(@NonNull FragmentManager fragmentManager)
|
||||
{
|
||||
LocationSharingDialog dialog = new LocationSharingDialog();
|
||||
dialog.show(fragmentManager, TAG);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
mManager = LocationSharingManager.getInstance();
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(requireContext());
|
||||
View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_location_sharing, null);
|
||||
|
||||
initViews(view);
|
||||
updateUI();
|
||||
|
||||
builder.setView(view);
|
||||
builder.setTitle(R.string.location_sharing_title);
|
||||
builder.setNegativeButton(R.string.close, (dialog, which) -> dismiss());
|
||||
|
||||
return builder.create();
|
||||
}
|
||||
|
||||
private void initViews(@NonNull View root)
|
||||
{
|
||||
mStatusText = root.findViewById(R.id.status_text);
|
||||
mShareUrlText = root.findViewById(R.id.share_url_text);
|
||||
mStartStopButton = root.findViewById(R.id.start_stop_button);
|
||||
mCopyButton = root.findViewById(R.id.copy_button);
|
||||
mShareButton = root.findViewById(R.id.share_button);
|
||||
|
||||
if (mStartStopButton != null)
|
||||
{
|
||||
mStartStopButton.setOnClickListener(v -> {
|
||||
if (mManager.isSharing())
|
||||
stopSharing();
|
||||
else
|
||||
startSharing();
|
||||
});
|
||||
}
|
||||
|
||||
if (mCopyButton != null)
|
||||
{
|
||||
mCopyButton.setOnClickListener(v -> copyUrl());
|
||||
}
|
||||
|
||||
if (mShareButton != null)
|
||||
{
|
||||
mShareButton.setOnClickListener(v -> shareUrl());
|
||||
}
|
||||
}
|
||||
|
||||
private void updateUI()
|
||||
{
|
||||
boolean isSharing = mManager.isSharing();
|
||||
|
||||
if (mStatusText != null)
|
||||
{
|
||||
mStatusText.setText(isSharing
|
||||
? R.string.location_sharing_status_active
|
||||
: R.string.location_sharing_status_inactive);
|
||||
}
|
||||
|
||||
if (mShareUrlText != null)
|
||||
{
|
||||
String url = mManager.getShareUrl();
|
||||
if (url != null && isSharing)
|
||||
{
|
||||
mShareUrlText.setText(url);
|
||||
mShareUrlText.setVisibility(View.VISIBLE);
|
||||
}
|
||||
else
|
||||
{
|
||||
mShareUrlText.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
if (mStartStopButton != null)
|
||||
{
|
||||
mStartStopButton.setText(isSharing
|
||||
? R.string.location_sharing_stop
|
||||
: R.string.location_sharing_start);
|
||||
}
|
||||
|
||||
// Show/hide copy and share buttons
|
||||
int visibility = isSharing ? View.VISIBLE : View.GONE;
|
||||
if (mCopyButton != null)
|
||||
mCopyButton.setVisibility(visibility);
|
||||
if (mShareButton != null)
|
||||
mShareButton.setVisibility(visibility);
|
||||
}
|
||||
|
||||
private void startSharing()
|
||||
{
|
||||
String shareUrl = mManager.startSharing();
|
||||
|
||||
if (shareUrl != null)
|
||||
{
|
||||
Toast.makeText(requireContext(),
|
||||
R.string.location_sharing_started,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
|
||||
updateUI();
|
||||
|
||||
// Notify the activity
|
||||
if (getActivity() instanceof app.organicmaps.MwmActivity)
|
||||
{
|
||||
((app.organicmaps.MwmActivity) getActivity()).onLocationSharingStateChanged(true);
|
||||
}
|
||||
|
||||
// Auto-copy URL to clipboard
|
||||
copyUrlToClipboard(shareUrl);
|
||||
}
|
||||
else
|
||||
{
|
||||
Toast.makeText(requireContext(),
|
||||
R.string.location_sharing_failed_to_start,
|
||||
Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
private void stopSharing()
|
||||
{
|
||||
mManager.stopSharing();
|
||||
|
||||
Toast.makeText(requireContext(),
|
||||
R.string.location_sharing_stopped,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
|
||||
updateUI();
|
||||
|
||||
// Notify the activity
|
||||
if (getActivity() instanceof app.organicmaps.MwmActivity)
|
||||
{
|
||||
((app.organicmaps.MwmActivity) getActivity()).onLocationSharingStateChanged(false);
|
||||
}
|
||||
}
|
||||
|
||||
private void copyUrl()
|
||||
{
|
||||
String url = mManager.getShareUrl();
|
||||
if (url != null)
|
||||
{
|
||||
copyUrlToClipboard(url);
|
||||
}
|
||||
}
|
||||
|
||||
private void copyUrlToClipboard(@NonNull String url)
|
||||
{
|
||||
ClipboardManager clipboard = (ClipboardManager)
|
||||
requireContext().getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
|
||||
if (clipboard != null)
|
||||
{
|
||||
ClipData clip = ClipData.newPlainText("Location Share URL", url);
|
||||
clipboard.setPrimaryClip(clip);
|
||||
|
||||
Toast.makeText(requireContext(),
|
||||
R.string.location_sharing_url_copied,
|
||||
Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
|
||||
private void shareUrl()
|
||||
{
|
||||
String url = mManager.getShareUrl();
|
||||
if (url == null)
|
||||
return;
|
||||
|
||||
Intent shareIntent = new Intent(Intent.ACTION_SEND);
|
||||
shareIntent.setType("text/plain");
|
||||
shareIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.location_sharing_share_message, url));
|
||||
startActivity(Intent.createChooser(shareIntent, getString(R.string.location_sharing_share_url)));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,205 @@
|
||||
package app.organicmaps.location;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.BatteryManager;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.util.Config;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
|
||||
/**
|
||||
* Singleton manager for live location sharing functionality.
|
||||
* Coordinates between LocationHelper, RoutingController, and LocationSharingService.
|
||||
*/
|
||||
public class LocationSharingManager
|
||||
{
|
||||
private static final String TAG = LocationSharingManager.class.getSimpleName();
|
||||
|
||||
private static LocationSharingManager sInstance;
|
||||
|
||||
@Nullable
|
||||
private String mSessionId;
|
||||
@Nullable
|
||||
private String mEncryptionKey;
|
||||
@Nullable
|
||||
private String mShareUrl;
|
||||
private boolean mIsSharing = false;
|
||||
|
||||
private final Context mContext;
|
||||
|
||||
private LocationSharingManager()
|
||||
{
|
||||
mContext = MwmApplication.sInstance;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static synchronized LocationSharingManager getInstance()
|
||||
{
|
||||
if (sInstance == null)
|
||||
sInstance = new LocationSharingManager();
|
||||
return sInstance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Start live location sharing.
|
||||
* @return Share URL that can be sent to others
|
||||
*/
|
||||
@Nullable
|
||||
public String startSharing()
|
||||
{
|
||||
if (mIsSharing)
|
||||
{
|
||||
Logger.w(TAG, "Location sharing already active");
|
||||
return mShareUrl;
|
||||
}
|
||||
|
||||
// Generate session credentials via native code
|
||||
String[] credentials = nativeGenerateSessionCredentials();
|
||||
if (credentials == null || credentials.length != 2)
|
||||
{
|
||||
Logger.e(TAG, "Failed to generate session credentials");
|
||||
return null;
|
||||
}
|
||||
|
||||
mSessionId = credentials[0];
|
||||
mEncryptionKey = credentials[1];
|
||||
|
||||
// Generate share URL using configured server
|
||||
String serverUrl = Config.LocationSharing.getServerUrl();
|
||||
mShareUrl = nativeGenerateShareUrl(mSessionId, mEncryptionKey, serverUrl);
|
||||
if (mShareUrl == null)
|
||||
{
|
||||
Logger.e(TAG, "Failed to generate share URL");
|
||||
return null;
|
||||
}
|
||||
|
||||
mIsSharing = true;
|
||||
|
||||
// Start foreground service
|
||||
Intent intent = new Intent(mContext, LocationSharingService.class);
|
||||
intent.putExtra(LocationSharingService.EXTRA_SESSION_ID, mSessionId);
|
||||
intent.putExtra(LocationSharingService.EXTRA_ENCRYPTION_KEY, mEncryptionKey);
|
||||
intent.putExtra(LocationSharingService.EXTRA_SERVER_URL, serverUrl);
|
||||
intent.putExtra(LocationSharingService.EXTRA_UPDATE_INTERVAL, Config.LocationSharing.getUpdateInterval());
|
||||
|
||||
mContext.startForegroundService(intent);
|
||||
|
||||
Logger.i(TAG, "Location sharing started, session ID: " + mSessionId);
|
||||
|
||||
return mShareUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop live location sharing.
|
||||
*/
|
||||
public void stopSharing()
|
||||
{
|
||||
if (!mIsSharing)
|
||||
{
|
||||
Logger.w(TAG, "Location sharing not active");
|
||||
return;
|
||||
}
|
||||
|
||||
// Stop foreground service
|
||||
Intent intent = new Intent(mContext, LocationSharingService.class);
|
||||
mContext.stopService(intent);
|
||||
|
||||
mIsSharing = false;
|
||||
mSessionId = null;
|
||||
mEncryptionKey = null;
|
||||
mShareUrl = null;
|
||||
|
||||
Logger.i(TAG, "Location sharing stopped");
|
||||
}
|
||||
|
||||
public boolean isSharing()
|
||||
{
|
||||
return mIsSharing;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public String getShareUrl()
|
||||
{
|
||||
return mShareUrl;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public String getSessionId()
|
||||
{
|
||||
return mSessionId;
|
||||
}
|
||||
|
||||
public void setUpdateIntervalSeconds(int seconds)
|
||||
{
|
||||
Config.LocationSharing.setUpdateInterval(seconds);
|
||||
}
|
||||
|
||||
public int getUpdateIntervalSeconds()
|
||||
{
|
||||
return Config.LocationSharing.getUpdateInterval();
|
||||
}
|
||||
|
||||
public void setServerBaseUrl(@NonNull String url)
|
||||
{
|
||||
Config.LocationSharing.setServerUrl(url);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public String getServerBaseUrl()
|
||||
{
|
||||
return Config.LocationSharing.getServerUrl();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get current battery level (0-100).
|
||||
*/
|
||||
public int getBatteryLevel()
|
||||
{
|
||||
BatteryManager bm = (BatteryManager) mContext.getSystemService(Context.BATTERY_SERVICE);
|
||||
if (bm == null)
|
||||
return 100;
|
||||
|
||||
return bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if currently navigating with an active route.
|
||||
*/
|
||||
public boolean isNavigating()
|
||||
{
|
||||
return RoutingController.get().isNavigating();
|
||||
}
|
||||
|
||||
// Native methods (implemented in JNI)
|
||||
|
||||
/**
|
||||
* Generate new session credentials (ID and encryption key).
|
||||
* @return Array of [sessionId, encryptionKey]
|
||||
*/
|
||||
@Nullable
|
||||
private static native String[] nativeGenerateSessionCredentials();
|
||||
|
||||
/**
|
||||
* Generate shareable URL from credentials.
|
||||
* @param sessionId Session ID (UUID)
|
||||
* @param encryptionKey Base64-encoded encryption key
|
||||
* @param serverBaseUrl Server base URL
|
||||
* @return Share URL
|
||||
*/
|
||||
@Nullable
|
||||
private static native String nativeGenerateShareUrl(String sessionId, String encryptionKey, String serverBaseUrl);
|
||||
|
||||
/**
|
||||
* Encrypt location payload.
|
||||
* @param encryptionKey Base64-encoded encryption key
|
||||
* @param payloadJson JSON payload to encrypt
|
||||
* @return Encrypted payload JSON (with iv, ciphertext, authTag) or null on failure
|
||||
*/
|
||||
@Nullable
|
||||
public static native String nativeEncryptPayload(String encryptionKey, String payloadJson);
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
package app.organicmaps.location;
|
||||
|
||||
import android.app.Notification;
|
||||
import android.app.NotificationChannel;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.location.Location;
|
||||
import android.os.Build;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.app.NotificationCompat;
|
||||
import androidx.core.app.NotificationManagerCompat;
|
||||
|
||||
import app.organicmaps.MwmActivity;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Helper for creating and updating location sharing notifications.
|
||||
*/
|
||||
public class LocationSharingNotification
|
||||
{
|
||||
public static final String CHANNEL_ID = "LOCATION_SHARING";
|
||||
private static final String CHANNEL_NAME = "Live Location Sharing";
|
||||
|
||||
private final Context mContext;
|
||||
private final NotificationManagerCompat mNotificationManager;
|
||||
|
||||
public LocationSharingNotification(@NonNull Context context)
|
||||
{
|
||||
mContext = context;
|
||||
mNotificationManager = NotificationManagerCompat.from(context);
|
||||
createNotificationChannel();
|
||||
}
|
||||
|
||||
private void createNotificationChannel()
|
||||
{
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O)
|
||||
return;
|
||||
|
||||
NotificationChannel channel = new NotificationChannel(
|
||||
CHANNEL_ID,
|
||||
CHANNEL_NAME,
|
||||
NotificationManager.IMPORTANCE_LOW); // Low importance = no sound/vibration
|
||||
|
||||
channel.setDescription("Notifications for active live location sharing");
|
||||
channel.setShowBadge(false);
|
||||
channel.enableLights(false);
|
||||
channel.enableVibration(false);
|
||||
|
||||
NotificationManager nm = mContext.getSystemService(NotificationManager.class);
|
||||
if (nm != null)
|
||||
nm.createNotificationChannel(channel);
|
||||
}
|
||||
|
||||
/**
|
||||
* Build notification for location sharing service.
|
||||
* @param stopIntent PendingIntent to stop sharing
|
||||
* @return Notification object
|
||||
*/
|
||||
@NonNull
|
||||
public Notification buildNotification(@NonNull PendingIntent stopIntent)
|
||||
{
|
||||
return buildNotification(stopIntent, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Build notification with copy URL action.
|
||||
* @param stopIntent PendingIntent to stop sharing
|
||||
* @param copyUrlIntent PendingIntent to copy URL (optional)
|
||||
* @return Notification object
|
||||
*/
|
||||
@NonNull
|
||||
public Notification buildNotification(
|
||||
@NonNull PendingIntent stopIntent,
|
||||
@Nullable PendingIntent copyUrlIntent)
|
||||
{
|
||||
Intent notificationIntent = new Intent(mContext, MwmActivity.class);
|
||||
PendingIntent pendingIntent = PendingIntent.getActivity(
|
||||
mContext,
|
||||
0,
|
||||
notificationIntent,
|
||||
PendingIntent.FLAG_IMMUTABLE);
|
||||
|
||||
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext, CHANNEL_ID)
|
||||
.setSmallIcon(R.drawable.ic_share)
|
||||
.setContentIntent(pendingIntent)
|
||||
.setOngoing(true)
|
||||
.setPriority(NotificationCompat.PRIORITY_LOW)
|
||||
.setCategory(NotificationCompat.CATEGORY_SERVICE)
|
||||
.setShowWhen(false)
|
||||
.setAutoCancel(false);
|
||||
|
||||
// Title
|
||||
builder.setContentTitle(mContext.getString(R.string.location_sharing_active));
|
||||
|
||||
// No subtitle - keep it simple
|
||||
|
||||
// Copy URL action button (if provided)
|
||||
if (copyUrlIntent != null)
|
||||
{
|
||||
builder.addAction(
|
||||
R.drawable.ic_share,
|
||||
mContext.getString(R.string.location_sharing_copy_url),
|
||||
copyUrlIntent);
|
||||
}
|
||||
|
||||
// Stop action button
|
||||
builder.addAction(
|
||||
R.drawable.ic_close,
|
||||
mContext.getString(R.string.location_sharing_stop),
|
||||
stopIntent);
|
||||
|
||||
// Set foreground service type for Android 10+
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
|
||||
{
|
||||
builder.setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE);
|
||||
}
|
||||
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* Update existing notification.
|
||||
* @param notificationId Notification ID
|
||||
* @param notification Updated notification
|
||||
*/
|
||||
public void updateNotification(int notificationId, @NonNull Notification notification)
|
||||
{
|
||||
mNotificationManager.notify(notificationId, notification);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancel notification.
|
||||
* @param notificationId Notification ID
|
||||
*/
|
||||
public void cancelNotification(int notificationId)
|
||||
{
|
||||
mNotificationManager.cancel(notificationId);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,366 @@
|
||||
package app.organicmaps.location;
|
||||
|
||||
import android.app.Notification;
|
||||
import android.app.PendingIntent;
|
||||
import android.app.Service;
|
||||
import android.content.Intent;
|
||||
import android.location.Location;
|
||||
import android.os.BatteryManager;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
import android.os.Looper;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.app.NotificationCompat;
|
||||
|
||||
import app.organicmaps.MwmActivity;
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.api.LocationSharingApiClient;
|
||||
import app.organicmaps.sdk.location.LocationHelper;
|
||||
import app.organicmaps.sdk.location.LocationListener;
|
||||
import app.organicmaps.sdk.routing.RoutingController;
|
||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||
import app.organicmaps.sdk.util.log.Logger;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Foreground service for live GPS location sharing.
|
||||
* Monitors location updates and posts encrypted data to server at regular intervals.
|
||||
*/
|
||||
public class LocationSharingService extends Service implements LocationListener
|
||||
{
|
||||
private static final String TAG = LocationSharingService.class.getSimpleName();
|
||||
private static final int NOTIFICATION_ID = 0x1002; // Unique ID for location sharing
|
||||
|
||||
// Intent extras
|
||||
public static final String EXTRA_SESSION_ID = "session_id";
|
||||
public static final String EXTRA_ENCRYPTION_KEY = "encryption_key";
|
||||
public static final String EXTRA_SERVER_URL = "server_url";
|
||||
public static final String EXTRA_UPDATE_INTERVAL = "update_interval";
|
||||
|
||||
// Actions for notification buttons
|
||||
private static final String ACTION_STOP = "app.organicmaps.ACTION_STOP_LOCATION_SHARING";
|
||||
private static final String ACTION_COPY_URL = "app.organicmaps.ACTION_COPY_LOCATION_URL";
|
||||
|
||||
@Nullable
|
||||
private String mSessionId;
|
||||
@Nullable
|
||||
private String mEncryptionKey;
|
||||
@Nullable
|
||||
private String mServerUrl;
|
||||
private int mUpdateIntervalSeconds = 20;
|
||||
|
||||
@Nullable
|
||||
private Location mLastLocation;
|
||||
private long mLastUpdateTimestamp = 0;
|
||||
|
||||
private final Handler mHandler = new Handler(Looper.getMainLooper());
|
||||
private final Runnable mUpdateTask = this::processLocationUpdate;
|
||||
|
||||
@Nullable
|
||||
private LocationSharingApiClient mApiClient;
|
||||
@Nullable
|
||||
private LocationSharingNotification mNotificationHelper;
|
||||
|
||||
@Override
|
||||
public void onCreate()
|
||||
{
|
||||
super.onCreate();
|
||||
Logger.i(TAG, "Service created");
|
||||
|
||||
mNotificationHelper = new LocationSharingNotification(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int onStartCommand(@Nullable Intent intent, int flags, int startId)
|
||||
{
|
||||
if (intent == null)
|
||||
{
|
||||
Logger.w(TAG, "Null intent, stopping service");
|
||||
stopSelf();
|
||||
return START_NOT_STICKY;
|
||||
}
|
||||
|
||||
// Handle stop action from notification
|
||||
if (ACTION_STOP.equals(intent.getAction()))
|
||||
{
|
||||
Logger.i(TAG, "Stop action received from notification");
|
||||
LocationSharingManager.getInstance().stopSharing();
|
||||
stopSelf();
|
||||
return START_NOT_STICKY;
|
||||
}
|
||||
|
||||
// Handle copy URL action from notification
|
||||
if (ACTION_COPY_URL.equals(intent.getAction()))
|
||||
{
|
||||
Logger.i(TAG, "Copy URL action received from notification");
|
||||
String shareUrl = LocationSharingManager.getInstance().getShareUrl();
|
||||
if (shareUrl != null)
|
||||
{
|
||||
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
|
||||
android.content.ClipData clip = android.content.ClipData.newPlainText("Location Share URL", shareUrl);
|
||||
clipboard.setPrimaryClip(clip);
|
||||
android.widget.Toast.makeText(this, R.string.location_sharing_url_copied, android.widget.Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
return START_STICKY;
|
||||
}
|
||||
|
||||
// Extract session info
|
||||
mSessionId = intent.getStringExtra(EXTRA_SESSION_ID);
|
||||
mEncryptionKey = intent.getStringExtra(EXTRA_ENCRYPTION_KEY);
|
||||
mServerUrl = intent.getStringExtra(EXTRA_SERVER_URL);
|
||||
mUpdateIntervalSeconds = intent.getIntExtra(EXTRA_UPDATE_INTERVAL, 20);
|
||||
|
||||
if (mSessionId == null || mEncryptionKey == null || mServerUrl == null)
|
||||
{
|
||||
Logger.e(TAG, "Missing session info, stopping service");
|
||||
stopSelf();
|
||||
return START_NOT_STICKY;
|
||||
}
|
||||
|
||||
// Initialize API client
|
||||
mApiClient = new LocationSharingApiClient(mServerUrl, mSessionId);
|
||||
|
||||
// Create session on server
|
||||
mApiClient.createSession(new LocationSharingApiClient.Callback()
|
||||
{
|
||||
@Override
|
||||
public void onSuccess()
|
||||
{
|
||||
Logger.i(TAG, "Session created on server");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(@NonNull String error)
|
||||
{
|
||||
Logger.w(TAG, "Failed to create session on server: " + error);
|
||||
}
|
||||
});
|
||||
|
||||
// Start foreground with notification
|
||||
Notification notification = mNotificationHelper != null
|
||||
? mNotificationHelper.buildNotification(getStopIntent(), getCopyUrlIntent())
|
||||
: buildFallbackNotification();
|
||||
|
||||
startForeground(NOTIFICATION_ID, notification);
|
||||
|
||||
// Register for location updates
|
||||
LocationHelper locationHelper = MwmApplication.sInstance.getLocationHelper();
|
||||
locationHelper.addListener(this);
|
||||
|
||||
Logger.i(TAG, "Service started for session: " + mSessionId);
|
||||
|
||||
return START_STICKY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy()
|
||||
{
|
||||
Logger.i(TAG, "Service destroyed");
|
||||
|
||||
// Unregister location listener
|
||||
LocationHelper locationHelper = MwmApplication.sInstance.getLocationHelper();
|
||||
locationHelper.removeListener(this);
|
||||
|
||||
// Cancel pending updates
|
||||
mHandler.removeCallbacks(mUpdateTask);
|
||||
|
||||
// Send session end to server (optional)
|
||||
if (mApiClient != null && mSessionId != null)
|
||||
mApiClient.endSession();
|
||||
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public IBinder onBind(Intent intent)
|
||||
{
|
||||
return null; // Not a bound service
|
||||
}
|
||||
|
||||
// LocationHelper.LocationListener implementation
|
||||
|
||||
@Override
|
||||
public void onLocationUpdated(@NonNull Location location)
|
||||
{
|
||||
mLastLocation = location;
|
||||
|
||||
// No need to update notification - it's simple and static now
|
||||
|
||||
// Schedule update if needed
|
||||
scheduleUpdate();
|
||||
}
|
||||
|
||||
|
||||
// Private methods
|
||||
|
||||
private void scheduleUpdate()
|
||||
{
|
||||
long now = System.currentTimeMillis();
|
||||
long timeSinceLastUpdate = (now - mLastUpdateTimestamp) / 1000; // Convert to seconds
|
||||
|
||||
if (timeSinceLastUpdate >= mUpdateIntervalSeconds)
|
||||
{
|
||||
// Remove any pending updates
|
||||
mHandler.removeCallbacks(mUpdateTask);
|
||||
// Execute immediately
|
||||
mHandler.post(mUpdateTask);
|
||||
}
|
||||
}
|
||||
|
||||
private void processLocationUpdate()
|
||||
{
|
||||
if (mLastLocation == null || mEncryptionKey == null || mApiClient == null)
|
||||
return;
|
||||
|
||||
// Check battery level
|
||||
int batteryLevel = getBatteryLevel();
|
||||
if (batteryLevel < 10)
|
||||
{
|
||||
Logger.w(TAG, "Battery level too low (" + batteryLevel + "%), stopping sharing");
|
||||
LocationSharingManager.getInstance().stopSharing();
|
||||
stopSelf();
|
||||
return;
|
||||
}
|
||||
|
||||
// Build payload JSON
|
||||
JSONObject payload = buildPayloadJson(mLastLocation, batteryLevel);
|
||||
if (payload == null)
|
||||
return;
|
||||
|
||||
// Encrypt payload
|
||||
String encryptedJson = LocationCrypto.encrypt(mEncryptionKey, payload.toString());
|
||||
if (encryptedJson == null)
|
||||
{
|
||||
Logger.e(TAG, "Failed to encrypt payload");
|
||||
return;
|
||||
}
|
||||
|
||||
// Send to server
|
||||
mApiClient.updateLocation(encryptedJson, new LocationSharingApiClient.Callback()
|
||||
{
|
||||
@Override
|
||||
public void onSuccess()
|
||||
{
|
||||
Logger.d(TAG, "Location update sent successfully");
|
||||
mLastUpdateTimestamp = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(@NonNull String error)
|
||||
{
|
||||
Logger.w(TAG, "Failed to send location update: " + error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private JSONObject buildPayloadJson(@NonNull Location location, int batteryLevel)
|
||||
{
|
||||
try
|
||||
{
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("timestamp", System.currentTimeMillis() / 1000); // Unix timestamp
|
||||
json.put("lat", location.getLatitude());
|
||||
json.put("lon", location.getLongitude());
|
||||
json.put("accuracy", location.getAccuracy());
|
||||
|
||||
if (location.hasSpeed())
|
||||
json.put("speed", location.getSpeed());
|
||||
|
||||
if (location.hasBearing())
|
||||
json.put("bearing", location.getBearing());
|
||||
|
||||
// Check if navigating
|
||||
RoutingInfo routingInfo = getNavigationInfo();
|
||||
if (routingInfo != null && routingInfo.distToTarget != null)
|
||||
{
|
||||
json.put("mode", "navigation");
|
||||
|
||||
// Calculate ETA (current time + time remaining)
|
||||
if (routingInfo.totalTimeInSeconds > 0)
|
||||
{
|
||||
long etaTimestamp = (System.currentTimeMillis() / 1000) + routingInfo.totalTimeInSeconds;
|
||||
json.put("eta", etaTimestamp);
|
||||
}
|
||||
|
||||
// Distance remaining in meters
|
||||
if (routingInfo.distToTarget != null)
|
||||
{
|
||||
json.put("distanceRemaining", routingInfo.distToTarget.mDistance);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
json.put("mode", "standalone");
|
||||
}
|
||||
|
||||
json.put("batteryLevel", batteryLevel);
|
||||
|
||||
return json;
|
||||
}
|
||||
catch (JSONException e)
|
||||
{
|
||||
Logger.e(TAG, "Failed to build payload JSON", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private RoutingInfo getNavigationInfo()
|
||||
{
|
||||
if (!RoutingController.get().isNavigating())
|
||||
return null;
|
||||
|
||||
return RoutingController.get().getCachedRoutingInfo();
|
||||
}
|
||||
|
||||
private int getBatteryLevel()
|
||||
{
|
||||
BatteryManager bm = (BatteryManager) getSystemService(BATTERY_SERVICE);
|
||||
if (bm == null)
|
||||
return 100;
|
||||
|
||||
return bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private PendingIntent getStopIntent()
|
||||
{
|
||||
Intent stopIntent = new Intent(this, LocationSharingService.class);
|
||||
stopIntent.setAction(ACTION_STOP);
|
||||
return PendingIntent.getService(this, 0, stopIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private PendingIntent getCopyUrlIntent()
|
||||
{
|
||||
Intent copyIntent = new Intent(this, LocationSharingService.class);
|
||||
copyIntent.setAction(ACTION_COPY_URL);
|
||||
return PendingIntent.getService(this, 1, copyIntent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Notification buildFallbackNotification()
|
||||
{
|
||||
Intent notificationIntent = new Intent(this, MwmActivity.class);
|
||||
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent,
|
||||
PendingIntent.FLAG_IMMUTABLE);
|
||||
|
||||
return new NotificationCompat.Builder(this, LocationSharingNotification.CHANNEL_ID)
|
||||
.setContentTitle(getString(R.string.location_sharing_active))
|
||||
.setSmallIcon(R.drawable.ic_share)
|
||||
.setContentIntent(pendingIntent)
|
||||
.setOngoing(true)
|
||||
.build();
|
||||
}
|
||||
}
|
||||
@@ -322,7 +322,8 @@ public class MapButtonsController extends Fragment
|
||||
mBadgeDrawable.setVisible(count > 0);
|
||||
BadgeUtils.attachBadgeDrawable(mBadgeDrawable, menuButton);
|
||||
|
||||
updateMenuBadge(TrackRecorder.nativeIsTrackRecordingEnabled());
|
||||
final boolean isTrackRecording = TrackRecorder.nativeIsTrackRecordingEnabled();
|
||||
updateMenuBadge(isTrackRecording);
|
||||
}
|
||||
|
||||
public void updateLayerButton()
|
||||
|
||||
@@ -16,6 +16,7 @@ public class MapButtonsViewModel extends ViewModel
|
||||
private final MutableLiveData<SearchWheel.SearchOption> mSearchOption = new MutableLiveData<>();
|
||||
private final MutableLiveData<Boolean> mTrackRecorderState =
|
||||
new MutableLiveData<>(TrackRecorder.nativeIsTrackRecordingEnabled());
|
||||
private final MutableLiveData<Boolean> mLocationSharingState = new MutableLiveData<>(false);
|
||||
|
||||
public MutableLiveData<Boolean> getButtonsHidden()
|
||||
{
|
||||
@@ -86,4 +87,14 @@ public class MapButtonsViewModel extends ViewModel
|
||||
{
|
||||
return mTrackRecorderState;
|
||||
}
|
||||
|
||||
public void setLocationSharingState(boolean state)
|
||||
{
|
||||
mLocationSharingState.setValue(state);
|
||||
}
|
||||
|
||||
public MutableLiveData<Boolean> getLocationSharingState()
|
||||
{
|
||||
return mLocationSharingState;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -205,6 +205,11 @@ public class NavigationController implements TrafficManager.TrafficCallback, Nav
|
||||
mNavMenu.refreshTts();
|
||||
}
|
||||
|
||||
public void refreshShareLocationColor()
|
||||
{
|
||||
mNavMenu.updateShareLocationColor();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnabled()
|
||||
{
|
||||
|
||||
@@ -26,8 +26,10 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import app.organicmaps.MwmActivity;
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.location.LocationSharingDialog;
|
||||
import app.organicmaps.sdk.Framework;
|
||||
import app.organicmaps.sdk.bookmarks.data.DistanceAndAzimut;
|
||||
import app.organicmaps.sdk.routing.RouteMarkData;
|
||||
@@ -144,6 +146,9 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
||||
mActionButton.setOnClickListener(this);
|
||||
View actionSearchButton = actionFrame.findViewById(R.id.btn__search_point);
|
||||
actionSearchButton.setOnClickListener(this);
|
||||
View shareLocationButton = actionFrame.findViewById(R.id.btn__share_location);
|
||||
if (shareLocationButton != null)
|
||||
shareLocationButton.setOnClickListener(this);
|
||||
mActionIcon = mActionButton.findViewById(R.id.iv__icon);
|
||||
UiUtils.hide(mAltitudeChartFrame, mActionFrame);
|
||||
mListener = listener;
|
||||
@@ -472,6 +477,11 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
||||
final RouteMarkType pointType = (RouteMarkType) mActionMessage.getTag();
|
||||
mListener.onSearchRoutePoint(pointType);
|
||||
}
|
||||
else if (id == R.id.btn__share_location)
|
||||
{
|
||||
if (mContext instanceof MwmActivity)
|
||||
LocationSharingDialog.show(((MwmActivity) mContext).getSupportFragmentManager());
|
||||
}
|
||||
else if (id == R.id.btn__manage_route)
|
||||
mListener.onManageRouteOpen();
|
||||
else if (id == R.id.btn__save)
|
||||
|
||||
@@ -8,6 +8,7 @@ import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.preference.EditTextPreference;
|
||||
import androidx.preference.ListPreference;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceCategory;
|
||||
@@ -73,6 +74,7 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
|
||||
initScreenSleepEnabledPrefsCallbacks();
|
||||
initShowOnLockScreenPrefsCallbacks();
|
||||
initLeftButtonPrefs();
|
||||
initLocationSharingPrefsCallbacks();
|
||||
}
|
||||
|
||||
private void initLeftButtonPrefs()
|
||||
@@ -542,6 +544,29 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
|
||||
category.removePreference(preference);
|
||||
}
|
||||
|
||||
private void initLocationSharingPrefsCallbacks()
|
||||
{
|
||||
// Server URL preference
|
||||
final EditTextPreference serverUrlPref = getPreference(getString(R.string.pref_location_sharing_server_url));
|
||||
serverUrlPref.setText(Config.LocationSharing.getServerUrl());
|
||||
serverUrlPref.setSummary(Config.LocationSharing.getServerUrl());
|
||||
serverUrlPref.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
String url = (String) newValue;
|
||||
Config.LocationSharing.setServerUrl(url);
|
||||
serverUrlPref.setSummary(url);
|
||||
return true;
|
||||
});
|
||||
|
||||
// Update interval preference
|
||||
final ListPreference intervalPref = getPreference(getString(R.string.pref_location_sharing_update_interval));
|
||||
intervalPref.setValue(String.valueOf(Config.LocationSharing.getUpdateInterval()));
|
||||
intervalPref.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
int seconds = Integer.parseInt((String) newValue);
|
||||
Config.LocationSharing.setUpdateInterval(seconds);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLanguageSelected(Language language)
|
||||
{
|
||||
|
||||
@@ -5,6 +5,7 @@ import android.widget.Toast;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.location.LocationSharingDialog;
|
||||
import app.organicmaps.sdk.routing.RoutingInfo;
|
||||
import app.organicmaps.sdk.sound.TtsPlayer;
|
||||
import app.organicmaps.sdk.util.DateUtils;
|
||||
@@ -26,6 +27,7 @@ public class NavMenu
|
||||
private final View mHeaderFrame;
|
||||
|
||||
private final ShapeableImageView mTts;
|
||||
private final ShapeableImageView mShareLocation;
|
||||
private final MaterialTextView mEtaValue;
|
||||
private final MaterialTextView mEtaAmPm;
|
||||
private final MaterialTextView mTimeHourValue;
|
||||
@@ -97,12 +99,16 @@ public class NavMenu
|
||||
mRouteProgress = bottomFrame.findViewById(R.id.navigation_progress);
|
||||
|
||||
// Bottom frame buttons
|
||||
mShareLocation = bottomFrame.findViewById(R.id.share_location);
|
||||
mShareLocation.setOnClickListener(v -> onShareLocationClicked());
|
||||
ShapeableImageView mSettings = bottomFrame.findViewById(R.id.settings);
|
||||
mSettings.setOnClickListener(v -> onSettingsClicked());
|
||||
mTts = bottomFrame.findViewById(R.id.tts_volume);
|
||||
mTts.setOnClickListener(v -> onTtsClicked());
|
||||
MaterialButton stop = bottomFrame.findViewById(R.id.stop);
|
||||
stop.setOnClickListener(v -> onStopClicked());
|
||||
|
||||
updateShareLocationColor();
|
||||
}
|
||||
|
||||
private void onStopClicked()
|
||||
@@ -110,6 +116,22 @@ public class NavMenu
|
||||
mNavMenuListener.onStopClicked();
|
||||
}
|
||||
|
||||
private void onShareLocationClicked()
|
||||
{
|
||||
LocationSharingDialog.show(mActivity.getSupportFragmentManager());
|
||||
// Update color after dialog is shown (in case state changes)
|
||||
mShareLocation.postDelayed(this::updateShareLocationColor, 500);
|
||||
}
|
||||
|
||||
public void updateShareLocationColor()
|
||||
{
|
||||
final boolean isLocationSharing = app.organicmaps.location.LocationSharingManager.getInstance().isSharing();
|
||||
final int color = isLocationSharing
|
||||
? androidx.core.content.ContextCompat.getColor(mActivity, R.color.active_location_sharing)
|
||||
: app.organicmaps.util.ThemeUtils.getColor(mActivity, R.attr.iconTint);
|
||||
mShareLocation.setImageTintList(android.content.res.ColorStateList.valueOf(color));
|
||||
}
|
||||
|
||||
private void onSettingsClicked()
|
||||
{
|
||||
mNavMenuListener.onSettingsClicked();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<solid android:color="@color/bg_primary"/>
|
||||
<solid android:color="@color/base_accent"/>
|
||||
<corners android:radius="4dp"/>
|
||||
</shape>
|
||||
16
android/app/src/main/res/drawable/ic_location_sharing.xml
Normal file
16
android/app/src/main/res/drawable/ic_location_sharing.xml
Normal file
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<!-- Location pin with share icon -->
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M12,2C8.13,2 5,5.13 5,9c0,5.25 7,13 7,13s7,-7.75 7,-13c0,-3.87 -3.13,-7 -7,-7zM12,11.5c-1.38,0 -2.5,-1.12 -2.5,-2.5s1.12,-2.5 2.5,-2.5 2.5,1.12 2.5,2.5 -1.12,2.5 -2.5,2.5z"/>
|
||||
<!-- Share arrows (smaller, overlaid) -->
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M18,16l-3,3v-2H9v-2h6v-2z"
|
||||
android:fillAlpha="0.8"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<corners android:radius="12dp" />
|
||||
<solid android:color="@color/active_location_sharing" />
|
||||
</shape>
|
||||
@@ -24,7 +24,7 @@
|
||||
app:layout_constraintTop_toBottomOf="@+id/statutbar"
|
||||
app:layout_constraintStart_toEndOf="@+id/nav_next_turn_container"
|
||||
android:clickable="true"
|
||||
app:cardBackgroundColor="?colorPrimary">
|
||||
app:cardBackgroundColor="?colorSecondary">
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/nav_street_height"
|
||||
@@ -37,7 +37,7 @@
|
||||
android:maxLines="2"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:gravity="center"
|
||||
android:textColor="@android:color/white"
|
||||
android:textColor="?android:textColorPrimaryInverse"
|
||||
tools:text="Sample street name.\nLong looooooooong!!!!"/>
|
||||
</RelativeLayout>
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
@@ -73,13 +73,12 @@
|
||||
android:theme="?navigationTheme"
|
||||
android:layout_width="@dimen/nav_next_turn_sign"
|
||||
android:layout_height="@dimen/nav_next_turn_sign"
|
||||
app:tint="@android:color/white"
|
||||
app:tint="?iconTint"
|
||||
tools:background="#400000FF"/>
|
||||
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/circle_exit"
|
||||
style="@style/MwmWidget.TextView.NavNextTurn.Exit"
|
||||
android:textColor="@android:color/white"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
@@ -94,7 +93,6 @@
|
||||
android:layout_marginBottom="@dimen/nav_next_turn_bottom"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:gravity="center_horizontal"
|
||||
android:textColor="@android:color/white"
|
||||
tools:text="9999 ft"/>
|
||||
</LinearLayout>
|
||||
|
||||
@@ -132,7 +130,7 @@
|
||||
app:layout_constraintTop_toBottomOf="@id/street_frame"
|
||||
app:lanesActiveLaneTintColor="?navLaneArrowActiveColor"
|
||||
app:lanesInactiveLaneTintColor="?navLaneArrowInactiveColor"
|
||||
app:lanesBackgroundColor="?colorPrimary"
|
||||
app:lanesBackgroundColor="?colorSecondary"
|
||||
app:lanesCornerRadius="@dimen/margin_quarter"
|
||||
app:lanesEditModeLanesCount="10"
|
||||
tools:visibility="visible" />
|
||||
|
||||
@@ -25,7 +25,8 @@
|
||||
android:paddingStart="4dp"
|
||||
android:paddingEnd="4dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
app:endIconMode="clear_text">
|
||||
|
||||
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
||||
android:id="@+id/edit_socket_power"
|
||||
@@ -45,7 +46,9 @@
|
||||
android:paddingStart="4dp"
|
||||
android:paddingEnd="4dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content">
|
||||
android:layout_height="wrap_content"
|
||||
app:endIconMode="clear_text"
|
||||
>
|
||||
|
||||
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
||||
android:id="@+id/edit_socket_count"
|
||||
|
||||
83
android/app/src/main/res/layout/dialog_location_sharing.xml
Normal file
83
android/app/src/main/res/layout/dialog_location_sharing.xml
Normal file
@@ -0,0 +1,83 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:padding="16dp">
|
||||
|
||||
<!-- Status Text -->
|
||||
<TextView
|
||||
android:id="@+id/status_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="16sp"
|
||||
android:textColor="?android:textColorPrimary"
|
||||
android:paddingBottom="8dp"
|
||||
tools:text="Location sharing is not active" />
|
||||
|
||||
<!-- Description -->
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/location_sharing_description"
|
||||
android:textSize="14sp"
|
||||
android:textColor="?android:textColorSecondary"
|
||||
android:paddingBottom="16dp" />
|
||||
|
||||
<!-- Share URL (visible only when sharing) -->
|
||||
<TextView
|
||||
android:id="@+id/share_url_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="12sp"
|
||||
android:textColor="?android:textColorPrimary"
|
||||
android:fontFamily="monospace"
|
||||
android:background="?android:selectableItemBackground"
|
||||
android:padding="12dp"
|
||||
android:textIsSelectable="true"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible"
|
||||
tools:text="https://live.organicmaps.app/live/abc123def456" />
|
||||
|
||||
<!-- Button Row -->
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="end"
|
||||
android:paddingTop="16dp">
|
||||
|
||||
<!-- Copy Button -->
|
||||
<Button
|
||||
android:id="@+id/copy_button"
|
||||
style="?android:attr/buttonBarButtonStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/location_sharing_copy_url"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<!-- Share Button -->
|
||||
<Button
|
||||
android:id="@+id/share_button"
|
||||
style="?android:attr/buttonBarButtonStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/location_sharing_share_url"
|
||||
android:visibility="gone"
|
||||
android:layout_marginStart="8dp"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<!-- Start/Stop Button -->
|
||||
<Button
|
||||
android:id="@+id/start_stop_button"
|
||||
style="?android:attr/buttonBarButtonStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
tools:text="Start Sharing" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
@@ -64,7 +64,8 @@
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/cv__charging_station"
|
||||
style="@style/MwmWidget.Editor.CardView">
|
||||
style="@style/MwmWidget.Editor.CardView"
|
||||
android:visibility="gone">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -194,7 +195,7 @@
|
||||
android:layout_marginTop="@dimen/margin_quarter"
|
||||
android:gravity="center_vertical"
|
||||
android:textAppearance="@style/MwmTextAppearance.Body1"
|
||||
tools:text="italian, russian, coffee_shop, sandwich, dessert, cake, regional, sausage, sandwich, breakfast, pizza"
|
||||
tools:text="Italian, russian, russian, russian, russian, russian, russian, russian, russian"
|
||||
app:drawableEndCompat="@drawable/ic_arrow_down" />
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
android:layout_height="@dimen/height_item_oneline"
|
||||
android:background="?clickableBackground"
|
||||
android:paddingStart="@dimen/margin_half_plus"
|
||||
android:paddingEnd="@dimen/margin_half_plus">
|
||||
android:paddingEnd="@dimen/margin_half">
|
||||
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
android:id="@+id/phone_icon"
|
||||
@@ -15,15 +15,14 @@
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/phone_input"
|
||||
app:srcCompat="@drawable/ic_phone"
|
||||
tools:ignore="ContentDescription" />
|
||||
tools:ignore="ContentDescription"
|
||||
tools:src="@drawable/ic_phone"/>
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:id="@+id/phone_input"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/margin_half"
|
||||
android:layout_marginEnd="@dimen/margin_half"
|
||||
android:layout_toStartOf="@id/delete_icon"
|
||||
android:textColorHint="?android:textColorSecondary"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
@@ -42,11 +41,13 @@
|
||||
android:id="@+id/delete_icon"
|
||||
style="@style/MwmWidget.Editor.MetadataIcon"
|
||||
android:layout_marginStart="@dimen/margin_half"
|
||||
android:layout_marginTop="@dimen/margin_half"
|
||||
android:layout_marginEnd="@dimen/margin_half"
|
||||
android:layout_marginBottom="@dimen/margin_half"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@+id/phone_input"
|
||||
app:srcCompat="@drawable/ic_delete"
|
||||
tools:ignore="ContentDescription" />
|
||||
tools:ignore="ContentDescription"
|
||||
tools:src="@drawable/ic_delete" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
android:textStyle="italic"
|
||||
android:maxLines="2"
|
||||
android:ellipsize="end"
|
||||
tools:text="1, Rue des Carrières, Québec, G1R 4P5"/>
|
||||
tools:text="Russia, Moscow & Central, Moscow"/>
|
||||
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/distance"
|
||||
|
||||
@@ -43,6 +43,17 @@
|
||||
android:paddingEnd="@dimen/nav_bottom_gap"
|
||||
tools:background="#300000FF">
|
||||
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
android:id="@+id/share_location"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="@dimen/nav_icon_size"
|
||||
android:layout_weight="0.2"
|
||||
android:background="?selectableItemBackgroundBorderless"
|
||||
android:scaleType="center"
|
||||
android:contentDescription="@string/location_sharing_title"
|
||||
app:srcCompat="@drawable/ic_share"
|
||||
app:tint="?iconTint" />
|
||||
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
android:id="@+id/tts_volume"
|
||||
android:layout_width="0dp"
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
android:elevation="@dimen/nav_elevation"
|
||||
app:layout_constraintTop_toBottomOf="@+id/statutbar"
|
||||
android:clickable="true"
|
||||
app:cardBackgroundColor="?colorPrimary">
|
||||
app:cardBackgroundColor="?colorSecondary">
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
@@ -39,7 +39,7 @@
|
||||
android:minHeight="60dp"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:gravity="center"
|
||||
android:textColor="@android:color/white"
|
||||
android:textColor="?android:textColorPrimaryInverse"
|
||||
tools:text="Sample street name.\nLong looooooooong!!!!"/>
|
||||
</RelativeLayout>
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
@@ -75,7 +75,7 @@
|
||||
android:theme="?navigationTheme"
|
||||
android:layout_width="@dimen/nav_next_turn_sign"
|
||||
android:layout_height="@dimen/nav_next_turn_sign"
|
||||
app:tint="@android:color/white"
|
||||
app:tint="?iconTint"
|
||||
tools:background="#400000FF"/>
|
||||
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
@@ -84,7 +84,6 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:textColor="@android:color/white"
|
||||
tools:text="9"/>
|
||||
</FrameLayout>
|
||||
|
||||
@@ -96,7 +95,6 @@
|
||||
android:layout_marginBottom="@dimen/nav_next_turn_bottom"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:gravity="center_horizontal"
|
||||
android:textColor="@android:color/white"
|
||||
tools:text="9999 ft"/>
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
@@ -57,4 +57,27 @@
|
||||
app:srcCompat="@drawable/ic_location_crosshair"
|
||||
tools:tint="?colorSecondary"/>
|
||||
</LinearLayout>
|
||||
<LinearLayout
|
||||
android:id="@+id/btn__share_location"
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center_vertical"
|
||||
android:background="?clickableBackground"
|
||||
tools:visibility="visible">
|
||||
<View
|
||||
android:layout_width="1dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginBottom="@dimen/margin_half"
|
||||
android:layout_marginTop="@dimen/margin_half"
|
||||
android:background="?dividerHorizontal"/>
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
android:id="@+id/iv__share_location_icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/margin_base"
|
||||
app:srcCompat="@drawable/ic_share"
|
||||
app:tint="?colorSecondary"
|
||||
android:contentDescription="@string/location_sharing_title"/>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
@@ -349,7 +349,7 @@
|
||||
<string name="search_history_text">Преглед на последните търсения.</string>
|
||||
<string name="clear_search">Изчистване на историята на търсенията</string>
|
||||
<string name="p2p_your_location">Вашето местоположение</string>
|
||||
<string name="p2p_start">Почна</string>
|
||||
<string name="p2p_start">Начало</string>
|
||||
<string name="p2p_from_here">Маршрут от</string>
|
||||
<string name="p2p_to_here">Маршрут към</string>
|
||||
<string name="p2p_only_from_current">Навигацията е възможна само от текущото ви местоположение.</string>
|
||||
|
||||
@@ -871,25 +871,4 @@
|
||||
<string name="hours_confirmed_time_ago">Bestätigt %s</string>
|
||||
<string name="pref_tts_no_system_tts_short">Kein Text-zu-Sprache-Modul gefunden, überprüfe die App-Einstellungen</string>
|
||||
<string name="avoid_steps">Treppen vermeiden</string>
|
||||
<string name="editor_place_doesnt_exist_description">Beschreibe wie der Ort jetzt aussieht um eine Fehlermeldung an die OpenStreetMap Community zu senden</string>
|
||||
<string name="offline_explanation_title">Offline Karten</string>
|
||||
<string name="offline_explanation_text">Um die Gegend anzusehen, muss eine Karte heruntergeladen werden.\nLaden Sie Karten für die Gebiete herunter, die Sie bereisen möchten.</string>
|
||||
<string name="charge_socket_type2">Typ 2 (ohne Kabel)</string>
|
||||
<string name="charge_socket_type2_cable">Typ 2 (mit Kabel)</string>
|
||||
<string name="charge_socket_type2_combo">Typ 2 Combo</string>
|
||||
<string name="charge_socket_type1">Typ 1</string>
|
||||
<string name="charge_socket_nacs">NACS</string>
|
||||
<string name="unknown_socket_type">Unbekannter Anschluss</string>
|
||||
<string name="unknow_socket_type">Unbekannter Anschluss</string>
|
||||
<string name="edit_socket_info_tooltip">Neue Anschlüsse erstellen oder Existierende bearbeiten.</string>
|
||||
<string name="charging_station_available_sockets">Verfügbare Anschlüsse</string>
|
||||
<string name="charge_socket_unknown_other">Andere oder unbekannt</string>
|
||||
<string name="charge_socket_power">Leistung (kW)</string>
|
||||
<string name="editor_socket">Anschluss bearbeiten</string>
|
||||
<string name="error_value_must_be_positive">Wert muss positiv sein</string>
|
||||
<string name="unknown_power_output">unbekannt</string>
|
||||
<string name="charge_socket_chademo">CHAdeMO</string>
|
||||
<string name="charge_socket_count">Anzahl</string>
|
||||
<string name="unknown_count">unbekannt</string>
|
||||
<string name="error_invalid_number">ungültige Zahl</string>
|
||||
</resources>
|
||||
|
||||
@@ -884,8 +884,4 @@
|
||||
<string name="error_value_must_be_positive">Sisestuse väärtus peab olema positiitve</string>
|
||||
<string name="unknown_count">tundmatu</string>
|
||||
<string name="error_invalid_number">Vigane number</string>
|
||||
<string name="editor_place_doesnt_exist_description">Kirjelda selle koha praegust välimust ja lisa veamärge OpenStreetMapi kogukonnale</string>
|
||||
<string name="avoid_steps">Väldi treppe</string>
|
||||
<string name="offline_explanation_title">Ilma võrguühenduseta toimivad kaardid</string>
|
||||
<string name="offline_explanation_text">Selles piirkonnas liikumiseks ja teekonna juhatamiseks pead vajaliku kaardi alla laadima.\nVali allalaaditav kaart selle piirkonna kohta.</string>
|
||||
</resources>
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
<!-- A dialog title, that warns a user that Precise Location is disabled and suggests to turn it on -->
|
||||
<string name="limited_accuracy">Rajoitettu tarkkuus</string>
|
||||
<!-- A dialog text, that warns a user that Precise Location is disabled and suggests to turn it on -->
|
||||
<string name="precise_location_is_disabled_long_text">Tarkan navigoinnin varmistamiseksi ota Tarkka sijainti käyttöön asetuksissa</string>
|
||||
<string name="precise_location_is_disabled_long_text">Tarkan navigoinnin varmistamiseksi ota käyttöön tarkka sijainti asetuksista</string>
|
||||
<!-- View and button titles for accessibility -->
|
||||
<string name="zoom_to_country">Näytä kartalla</string>
|
||||
<!-- Message to display at the center of the screen when the country download has failed -->
|
||||
@@ -164,9 +164,9 @@
|
||||
<!-- Warning message when doing search around current position -->
|
||||
<string name="unknown_current_position">Sijaintiasi ei ole vielä määritetty</string>
|
||||
<!-- Alert message that we can't run Map Storage settings due to some reasons. -->
|
||||
<string name="cant_change_this_setting">Valitettavasti karttatallennustilaasetukset ovat tällä hetkellä poissa käytöstä</string>
|
||||
<string name="cant_change_this_setting">Kartan tallennusasetukset ovat poissa käytöstä</string>
|
||||
<!-- Alert message that downloading is in progress. -->
|
||||
<string name="downloading_is_active">Kartan lataus on parhaillaan käynnissä</string>
|
||||
<string name="downloading_is_active">Kartan lataus käynnissä</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">Hei, katso sijaintini CoMaps-sovelluksessa! %1$s tai %2$s Eikö sinulla ole vielä offline-karttoja? Lataa ne täältä: https://www.comaps.app/download/</string>
|
||||
<!-- Subject for emailed bookmark -->
|
||||
@@ -342,16 +342,16 @@
|
||||
<string name="dialog_routing_location_turn_on">Ota sijaintipalvelut käyttöön</string>
|
||||
<string name="dialog_routing_location_unknown_turn_on">Tämänhetkisiä GPS-koordinaatteja ei löydy. Ota sijaintipalvelut käyttöön reitin laskemista varten.</string>
|
||||
<string name="dialog_routing_unable_locate_route">Reitin paikannus ei onnistu</string>
|
||||
<string name="dialog_routing_cant_build_route">Reittiä ei voi luoda</string>
|
||||
<string name="dialog_routing_cant_build_route">Reitin luonti ei onnistu</string>
|
||||
<string name="dialog_routing_change_start_or_end">Muuta aloituskohtaa tai määränpäätä.</string>
|
||||
<string name="dialog_routing_change_start">Muuta aloituskohtaa</string>
|
||||
<string name="dialog_routing_start_not_determined">Reittiä ei luotu. Aloituskohdan paikannus ei onnistu.</string>
|
||||
<string name="dialog_routing_select_closer_start">Valitse lähempänä tietä oleva aloituskohta.</string>
|
||||
<string name="dialog_routing_change_end">Muuta määränpäätä</string>
|
||||
<string name="dialog_routing_end_not_determined">Reittiä ei luotu. Määränpään paikannus ei onnistu.</string>
|
||||
<string name="dialog_routing_select_closer_end">Valitse lähempänä tietä sijaitseva määränpää</string>
|
||||
<string name="dialog_routing_change_intermediate">Välikohtaa ei voi paikantaa</string>
|
||||
<string name="dialog_routing_intermediate_not_determined">Säädä välikohtaasi</string>
|
||||
<string name="dialog_routing_select_closer_end">Valitse lähempänä tietä oleva määränpää</string>
|
||||
<string name="dialog_routing_change_intermediate">Välipisteen paikallistaminen ei onnistunut</string>
|
||||
<string name="dialog_routing_intermediate_not_determined">Siirrä välipistettä</string>
|
||||
<string name="dialog_routing_system_error">Järjestelmävirhe</string>
|
||||
<string name="dialog_routing_application_error">Reittiä ei voi luoda sovellusvirheen vuoksi</string>
|
||||
<string name="dialog_routing_try_again">Yritä uudelleen</string>
|
||||
@@ -367,7 +367,7 @@
|
||||
<string name="hide">Piilota</string>
|
||||
<string name="categories">Luokat</string>
|
||||
<string name="history">Historia</string>
|
||||
<string name="search_not_found">Hups, tuloksia ei löytynyt</string>
|
||||
<string name="search_not_found">Pahoittelut, hakutuloksia ei ole</string>
|
||||
<!-- The message when user did not find anything in the search. -->
|
||||
<string name="search_not_found_query">Lataa alue, jolta etsit, tai yritä lisätä läheisen kaupungin tai kylän nimi.</string>
|
||||
<string name="search_history_title">Hakuhistoria</string>
|
||||
@@ -379,7 +379,7 @@
|
||||
<string name="p2p_start">Aloita</string>
|
||||
<string name="p2p_from_here">Lähtöpaikka</string>
|
||||
<string name="p2p_to_here">Reitin loppupiste</string>
|
||||
<string name="p2p_only_from_current">Navigointi on käytettävissä vain nykyisestä sijainnistasi</string>
|
||||
<string name="p2p_only_from_current">Navigointi onnistuu vain nykyisestä sijainnistasi</string>
|
||||
<string name="p2p_reroute_from_current">Haluatko valita vaihtoehtoisen reitin?</string>
|
||||
<!-- Edit open hours/set time and minutes dialog -->
|
||||
<string name="next_button">Seuraava</string>
|
||||
@@ -451,7 +451,7 @@
|
||||
<string name="common_check_internet_connection_dialog">Varmista, että laitteesi on yhteydessä Internetiin</string>
|
||||
<string name="downloader_no_space_title">Ei tarpeeksi tilaa</string>
|
||||
<string name="downloader_no_space_message">Poista tarpeeton data</string>
|
||||
<string name="editor_login_error_dialog">Sisäänkirjautumisvirhe</string>
|
||||
<string name="editor_login_error_dialog">Kirjautumisvirhe</string>
|
||||
<string name="editor_profile_changes">Vahvistetut karttamuutokset</string>
|
||||
<string name="editor_focus_map_on_location">Aseta risti paikan tai yrityksen sijaintiin vetämällä karttaa.</string>
|
||||
<string name="editor_edit_place_title">Muokkaus</string>
|
||||
@@ -471,7 +471,7 @@
|
||||
<!-- Downloaded 10 **of** 20 <- it is that "of" -->
|
||||
<string name="downloader_of">%1$d/%2$d</string>
|
||||
<string name="download_over_mobile_header">Lataa käyttämällä puhelinverkkoyhteyttä?</string>
|
||||
<string name="download_over_mobile_message">Tämä vaihtoehto saattaa olla huomattavasti kalliimpi tietyillä sopimuksilla tai verkkovierailunyhteydellä</string>
|
||||
<string name="download_over_mobile_message">Tämä vaihtoehto saattaa olla huomattavasti kalliimpi tietyillä sopimuksilla tai roaming-yhteydellä</string>
|
||||
<string name="error_enter_correct_house_number">Syötä oikea talon numero</string>
|
||||
<!-- Error message in Editor when a user tries to set the number of floors for a building higher than %d floors -->
|
||||
<string name="error_enter_correct_storey_number">Kerrosten määrä saa olla korkeintaan %d</string>
|
||||
@@ -492,7 +492,7 @@
|
||||
<string name="editor_category_unsuitable_title">Etkö löydä sopivaa luokkaa?</string>
|
||||
<string name="editor_category_unsuitable_text">CoMaps mahdollistaa vain yksinkertaisten pisteluokkien lisäämisen, eli ei kaupunkeja, teitä, järviä, rakennusten ääriviivoja jne. Lisää tällaiset luokat suoraan <a href="https://www.openstreetmap.org">OpenStreetMap.org</a>. Tarkista <a href="https://www.comaps.app/support/advanced-map-editing/">oppaastamme</a> yksityiskohtaiset ohjeet vaihe vaiheelta.</string>
|
||||
<string name="downloader_no_downloaded_maps_title">Et ole ladannut yhtään karttaa</string>
|
||||
<string name="downloader_no_downloaded_maps_message">Lataa karttoja ei-verkkotilassa etsimistä ja navigoimista varten</string>
|
||||
<string name="downloader_no_downloaded_maps_message">Lataa karttoja löytääksesi paikkoja ja navigoidaksesi offline-tilassa</string>
|
||||
<string name="current_location_unknown_error_title">Nykyinen sijainti on tuntematon</string>
|
||||
<!-- abbreviation for kilometers per hour -->
|
||||
<string name="kilometers_per_hour">km/h</string>
|
||||
@@ -523,8 +523,8 @@
|
||||
<!-- Displayed when saving some edits to the map to warn against publishing personal data -->
|
||||
<string name="editor_share_to_all_dialog_title">Haluatko lähettää sen kaikille käyttäjille?</string>
|
||||
<!-- Dialog before publishing the modifications to the public map. -->
|
||||
<string name="editor_share_to_all_dialog_message_1">Varmista, ettet ole syöttänyt yksityisiä tai henkilökohtaisia tietoja</string>
|
||||
<string name="editor_share_to_all_dialog_message_2">OpenStreetMap-muokkaimet tarkistavat muutokset ja ottavat sinuun yhteyttä, jos niillä on kysyttävää</string>
|
||||
<string name="editor_share_to_all_dialog_message_1">Varmista, ettet syöttänyt henkilökohtaisia tietojasi</string>
|
||||
<string name="editor_share_to_all_dialog_message_2">OpenStreetMap-editorit tarkistavat muutokset ja ottavat sinuun yhteyttä, jos heillä on kysyttävää</string>
|
||||
<string name="navigation_stop_button">Lopeta</string>
|
||||
<!-- Shown as toast when starting the recent track recording -->
|
||||
<string name="track_recording">Reitin kirjaaminen</string>
|
||||
@@ -538,7 +538,7 @@
|
||||
<string name="mobile_data_option_not_today">Älä käytä tänään</string>
|
||||
<string name="mobile_data">Mobiili-internet</string>
|
||||
<!-- NOTE to translators: please synchronize your translation with the English one. -->
|
||||
<string name="mobile_data_description">Mobiili-internet vaaditaan karttapäivitysilmoituksiin ja muokkausten lataamiseen ulospäin</string>
|
||||
<string name="mobile_data_description">Mobiili-internet vaaditaan paikkojen lisätietojen, kuten valokuvien, hintojen ja arvioiden näyttämiseen</string>
|
||||
<string name="mobile_data_option_never">Älä käytä koskaan</string>
|
||||
<string name="mobile_data_option_ask">Kysy aina</string>
|
||||
<string name="traffic_update_maps_text">Liikennetietojen näyttämiseksi kartat on päivitettävä</string>
|
||||
@@ -621,7 +621,7 @@
|
||||
<!-- Speed camera settings menu option - Never warn (about speedcams) -->
|
||||
<string name="pref_tts_speedcams_never">Älä koskaan varoita</string>
|
||||
<string name="power_managment_title">Virransäästötila</string>
|
||||
<string name="power_managment_description">Yritä vähentää virrankulutusta joidenkin toimintojen kustannuksella</string>
|
||||
<string name="power_managment_description">Yritä vähentää virrankulutusta toiminnallisuuden kustannuksella</string>
|
||||
<string name="power_managment_setting_never">Ei koskaan</string>
|
||||
<string name="power_managment_setting_auto">Automaattinen</string>
|
||||
<string name="power_managment_setting_manual_max">Täysi virransäästö</string>
|
||||
@@ -635,7 +635,7 @@
|
||||
<string name="avoid_ferry">Vältä lautan käyttöä</string>
|
||||
<string name="avoid_motorways">Vältä moottoritietä</string>
|
||||
<string name="unable_to_calc_alert_title">Reittiä ei voi luoda</string>
|
||||
<string name="unable_to_calc_alert_subtitle">Reittiä ei löytynyt. Tämä voi johtua reititysasetuksistasi tai puutteellisista OpenStreetMap-tiedoista. Muuta reititysvaihtoehtoja ja yritä uudelleen.</string>
|
||||
<string name="unable_to_calc_alert_subtitle">Valitettavasti emme voineet luoda reittiä valituilla vaihtoehdoilla. Tämä voi johtua reittiasetuksista tai OpenStreetMap:n puuttuvista tiedoista. Vaihda reititysasetuksia ja yritä uudelleen.</string>
|
||||
<string name="define_to_avoid_btn">Määritä vältettävät tiet</string>
|
||||
<string name="change_driving_options_btn">Reititysvalinnat ovat päällä</string>
|
||||
<string name="toll_road">Maksullinen tie</string>
|
||||
@@ -870,24 +870,4 @@
|
||||
<string name="hours_confirmed_time_ago">Vahvistettu %s</string>
|
||||
<string name="existence_confirmed_time_ago">Olemassaolo vahvistettu %s</string>
|
||||
<string name="pref_tts_no_system_tts_short">Tekstistä puheeksi -moottoria ei löytynyt, tarkista sovelluksen asetukset</string>
|
||||
<string name="unknown_power_output">tuntematon</string>
|
||||
<string name="charge_socket_count">Lukumäärä</string>
|
||||
<string name="unknown_count">tuntematon</string>
|
||||
<string name="error_invalid_number">Ei kelvollinen numero</string>
|
||||
<string name="offline_explanation_title">Ei-verkkotilassa olevat kartat</string>
|
||||
<string name="editor_place_doesnt_exist_description">Kuvaile, miltä paikka näyttää nyt, lähettääksesi virheilmoituksen OpenStreetMap-yhteisölle</string>
|
||||
<string name="avoid_steps">Vältä portaita</string>
|
||||
<string name="charge_socket_type2">Tyyppi 2 (ei kaapelia)</string>
|
||||
<string name="charge_socket_type2_cable">Tyyppi 2 (w/ -kaapeli)</string>
|
||||
<string name="charge_socket_type2_combo">Tyyppi 2 combo</string>
|
||||
<string name="charge_socket_type1">Tyyppi 1</string>
|
||||
<string name="unknown_socket_type">tuntematon pistoke</string>
|
||||
<string name="unknow_socket_type">tuntematon pistoke</string>
|
||||
<string name="edit_socket_info_tooltip">Luo uusia pistokkeita tai muokkaa olemassa olevia.</string>
|
||||
<string name="charging_station_available_sockets">Saatavilla olevat pistokkeet</string>
|
||||
<string name="charge_socket_unknown_other">Muu tai tuntematon</string>
|
||||
<string name="charge_socket_power">Teho (kW)</string>
|
||||
<string name="editor_socket">Muokkaa pistoketta</string>
|
||||
<string name="error_value_must_be_positive">Arvon on oltava positiivinen</string>
|
||||
<string name="offline_explanation_text">Alueen katseluun ja navigointiin tarvitaan kartta.\nLataa karttoja alueille, joille haluat matkustaa.</string>
|
||||
</resources>
|
||||
|
||||
@@ -622,8 +622,4 @@
|
||||
<string name="charging_station_available_sockets">Enganches dispoñibles</string>
|
||||
<string name="charge_socket_unknown_other">Outro ou descoñecido</string>
|
||||
<string name="unknow_socket_type">engache descoñecido</string>
|
||||
<string name="editor_place_doesnt_exist_description">Describe a aparencia do lugar para enviar unha nota co erro á comunidade OpenStreetMap</string>
|
||||
<string name="avoid_steps">Evitar pasos</string>
|
||||
<string name="offline_explanation_title">Mapas sen conexión</string>
|
||||
<string name="offline_explanation_text">Hai que descargar un mapa para ver e navegar polo área.\nDescarga os mapas para as zonas polas que vas viaxar.</string>
|
||||
</resources>
|
||||
|
||||
@@ -52,11 +52,11 @@
|
||||
<string name="disconnect_usb_cable">A CoMaps használatához válassza le az USB-kábelt vagy helyezze be a memóriakártyát</string>
|
||||
<!-- Used in DownloadResources startup screen -->
|
||||
<string name="not_enough_free_space_on_sdcard">Az alkalmazás használatához először szabadítson fel némi helyet az SD-kártyán/USB-tárolón</string>
|
||||
<string name="download_resources">Mielőtt elkezdené használni az alkalmazást, töltse le az áttekintő világtérképet az eszközére.\nEz %s tárhelyet fog igénybe venni.</string>
|
||||
<string name="download_resources">Mielőtt elkezdené használni az alkalmazást, töltse le az áttekintő világtérképet az eszközre. \nEz %s tárhelyet fog igénybe venni.</string>
|
||||
<string name="download_resources_continue">Ugrás a térképre</string>
|
||||
<string name="downloading_country_can_proceed">%1$s (%2$s) letöltése. Most már\ntovábbléphet a térképre.</string>
|
||||
<string name="download_country_ask">Biztosan letölti a következőt: %1$s? (%2$s)</string>
|
||||
<string name="update_country_ask">Biztosan frissíti a következőt: %1$s? (%2$s)</string>
|
||||
<string name="download_country_ask">Letölti a következőt: %1$s? (%2$s)</string>
|
||||
<string name="update_country_ask">Frissíti a következőt: %1$s? (%2$s)</string>
|
||||
<!-- REMOVE THIS STRING AFTER REFACTORING -->
|
||||
<string name="pause">Szüneteltetés</string>
|
||||
<!-- REMOVE THIS STRING AFTER REFACTORING -->
|
||||
@@ -88,7 +88,7 @@
|
||||
<!-- Free space out of total storage size in Maps Storage settings, e.g. "300 MB free of 2 GB" -->
|
||||
<string name="maps_storage_free_size">%1$s szabad terület ennyiből: %2$s</string>
|
||||
<!-- Question dialog for transferring maps from one storage to another -->
|
||||
<string name="move_maps">Biztosan áthelyezi a térképeket?</string>
|
||||
<string name="move_maps">Áthelyezi a térképeket?</string>
|
||||
<!-- Error moving map files from one storage to another -->
|
||||
<string name="move_maps_error">Hiba történt a térképfájlok áthelyezésekor</string>
|
||||
<!-- Ask user to wait several minutes (some long process in modal dialog). -->
|
||||
@@ -225,7 +225,7 @@
|
||||
<string name="placepage_distance">Távolság</string>
|
||||
<string name="search_show_on_map">Megtekintés a térképen</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">Webhely</string>
|
||||
<string name="website">Honlap</string>
|
||||
<!-- Text in About menu, opens CoMaps news website -->
|
||||
<string name="news">Hírek</string>
|
||||
<!-- Settings: Send feedback button and dialog title -->
|
||||
@@ -245,9 +245,9 @@
|
||||
<!-- Text in menu + Button in the main Help dialog -->
|
||||
<string name="report_a_bug">Hibajelentés</string>
|
||||
<!-- Toast text when compass calibration may improve the correctness of the current position arrow -->
|
||||
<string name="compass_calibration_recommended">Javítsa a nyíl irányát az eszköz nyolcas mozgatásával az iránytű kalibrálásához.</string>
|
||||
<string name="compass_calibration_recommended">Javítsa a nyíl irányát a telefon nyolcas mozgatásával az iránytű kalibrálásához.</string>
|
||||
<!-- Toast text when compass calibration may improve the correctness of the current position arrow -->
|
||||
<string name="compass_calibration_required">Mozgassa az eszközt egy nyolcas mozdulattal az iránytű kalibrálásához és a nyíl irányának rögzítéséhez a térképen.</string>
|
||||
<string name="compass_calibration_required">Mozgassa a telefont egy nyolcas mozdulattal az iránytű kalibrálásához és a nyíl irányának rögzítéséhez a térképen.</string>
|
||||
<!-- Toast text when user hides UI with a long tap anywhere on the map -->
|
||||
<string name="long_tap_toast">Érintse meg újra hosszan a térképet a kezelőfelület megjelenítéséhez</string>
|
||||
<!-- Update all button text -->
|
||||
@@ -266,7 +266,7 @@
|
||||
<!-- 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">A térkép törléséhez állítsa le a navigációt</string>
|
||||
<!-- PointsInDifferentMWM -->
|
||||
<string name="routing_failed_cross_mwm_building">Csak olyan útvonalakat lehet létrehozni, amelyek teljes egészében egy régió térképén belül helyezkednek el.</string>
|
||||
<string name="routing_failed_cross_mwm_building">Útvonalakat csak akkor lehet készíteni, ha teljesen rajta vannak egy térképen.</string>
|
||||
<!-- Context menu item for downloader. -->
|
||||
<string name="downloader_download_map">Térkép letöltése</string>
|
||||
<!-- Item status in downloader. -->
|
||||
@@ -284,7 +284,7 @@
|
||||
<!-- Text for routing error dialog -->
|
||||
<string name="routing_download_maps_along">Összes térkép letöltése az útvonal mentén</string>
|
||||
<!-- Text for routing error dialog -->
|
||||
<string name="routing_requires_all_map">Az útvonal létrehozásához le kell töltenie és frissítenie kell az összes térképet a saját tartózkodási helyétől a célig.</string>
|
||||
<string name="routing_requires_all_map">Az útvonal létrehozásához le kell töltenie és frissítenie kell az összes térképet az Ön tartózkodási helyétől a célig.</string>
|
||||
<!-- Text for routing error dialog -->
|
||||
<string name="routing_not_enough_space">Nincs elegendő tárhely</string>
|
||||
<!-- location service disabled -->
|
||||
@@ -325,10 +325,10 @@
|
||||
<string name="blue_gray">Kékes szürke</string>
|
||||
<!-- SECTION: Routing dialogs strings -->
|
||||
<string name="dialog_routing_disclaimer_title">Az útvonal követésekor vegye figyelembe az alábbiakat:</string>
|
||||
<string name="dialog_routing_disclaimer_priority">- Az útviszonyok, a közlekedési szabályok és a jelzőtáblák mindig elsőbbséget élveznek a navigációs útmutatással szemben;</string>
|
||||
<string name="dialog_routing_disclaimer_precision">- A térkép pontatlan lehet és a javasolt útvonal lehetséges, hogy nem mindig a legoptimálisabb módja a célállomás elérésének;</string>
|
||||
<string name="dialog_routing_disclaimer_recommendations">- A javasolt útvonalakat csak ajánlásként kell értelmezni;</string>
|
||||
<string name="dialog_routing_disclaimer_borders">- Legyen óvatos az útvonalakkal a határzónákban: az alkalmazásunk által létrehozott útvonalak néha nem engedélyezett helyeken léphetik át az országhatárokat.</string>
|
||||
<string name="dialog_routing_disclaimer_priority">– Az útviszonyok, a közlekedési szabályok és a jelzőtáblák mindig elsőbbséget élveznek a navigációs útmutatással szemben;</string>
|
||||
<string name="dialog_routing_disclaimer_precision">– A térkép pontatlan lehet és a javasolt útvonal lehetséges, hogy nem mindig a legoptimálisabb módja a célállomás elérésének;</string>
|
||||
<string name="dialog_routing_disclaimer_recommendations">– A javasolt útvonalakat csupán ajánlottként kell tekinteni;</string>
|
||||
<string name="dialog_routing_disclaimer_borders">– Legyen óvatos az útvonalakkal a határzónákban: az alkalmazásunk által létrehozott útvonalak néha nem engedélyezett helyeken léphetik át az országhatárokat.</string>
|
||||
<string name="dialog_routing_disclaimer_beware">Mindig maradjon éber és vezessen biztonságosan az utakon!</string>
|
||||
<string name="dialog_routing_check_gps">Ellenőrizze a GPS-jelet</string>
|
||||
<string name="dialog_routing_error_location_not_found">Nem sikerült létrehozni az útvonalat. A jelenlegi GPS-koordináták nem azonosíthatók.</string>
|
||||
@@ -347,13 +347,13 @@
|
||||
<string name="dialog_routing_change_intermediate">Nem sikerült meghatározni a köztes helyet</string>
|
||||
<string name="dialog_routing_intermediate_not_determined">Pontosítsa a köztes helyet</string>
|
||||
<string name="dialog_routing_system_error">Rendszerhiba</string>
|
||||
<string name="dialog_routing_application_error">Egy alkalmazáshiba miatt nem lehet létrehozni az útvonalat</string>
|
||||
<string name="dialog_routing_application_error">Az alkalmazás hibája miatt nem lehet létrehozni az útvonalat</string>
|
||||
<string name="dialog_routing_try_again">Próbálja meg újra</string>
|
||||
<string name="not_now">Most nem</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Szeretné letölteni a térképet és létrehozni egy optimálisabb útvonalat, amely több térképet is igényel?</string>
|
||||
<string name="dialog_routing_download_cross_route">Töltsön le további térképeket, hogy jobb útvonalat állíthasson össze, amely átlép a ennek a térképnek a határain.</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Szeretné letölteni a térképet, és egynél több térképen átívelő, optimálisabb útvonalat létrehozni?</string>
|
||||
<string name="dialog_routing_download_cross_route">Töltsön le további térképeket, hogy egy jobb útvonalat hozzon létre, amely keresztezi ennek a térképnek a határait.</string>
|
||||
<!-- SECTION: Strings for downloading map from search -->
|
||||
<string name="search_without_internet_advertisement">Az útvonalak keresésének és létrehozásának megkezdéséhez, töltse le a térképet. Ezután már nem lesz szüksége internetkapcsolatra.</string>
|
||||
<string name="search_without_internet_advertisement">Az útvonalak kereséséhez és létrehozásához, töltse le a térképet és többé nem lesz szüksége internetkapcsolatra.</string>
|
||||
<string name="search_select_map">Térkép kiválasztása</string>
|
||||
<!-- «Show» context menu -->
|
||||
<string name="show">Megjelenítés</string>
|
||||
@@ -393,7 +393,7 @@
|
||||
<string name="editor_example_values">Példaértékek</string>
|
||||
<string name="editor_correct_mistake">Hiba javítása</string>
|
||||
<string name="editor_add_select_location">Hely kiválasztása</string>
|
||||
<string name="editor_report_problem_desription_1">Írja le részletesen a problémát, hogy az OpenStreetMap közössége kijavíthassa.</string>
|
||||
<string name="editor_report_problem_desription_1">Írja le részletesen a problémát, hogy az OpenStreetMap csapata kijavíthassa.</string>
|
||||
<string name="editor_report_problem_desription_2">Vagy javítsa ki Ön itt: https://www.openstreetmap.org/</string>
|
||||
<string name="editor_report_problem_send_button">Küldés</string>
|
||||
<string name="editor_report_problem_title">Hibajegy</string>
|
||||
@@ -409,11 +409,11 @@
|
||||
<string name="closed">Zárva</string>
|
||||
<string name="edit_opening_hours">Nyitvatartás szerkesztése</string>
|
||||
<string name="no_osm_account">Nem rendelkezik még felhasználói fiókkal az OpenStreetMapen?</string>
|
||||
<string name="register_at_openstreetmap">Regisztráció az OpenStreetMapen</string>
|
||||
<string name="register_at_openstreetmap">Regisztráció az OpenStreetMap oldalon</string>
|
||||
<string name="login">Bejelentkezés</string>
|
||||
<!-- Status message indicating that user did not login to OSM profile yet. -->
|
||||
<string name="not_signed_in">Nincs bejelentkezve</string>
|
||||
<string name="login_osm">Jelentkezzen be az OpenStreetMapbe</string>
|
||||
<string name="login_osm">Jelentkezzen be az OpenStreetMap fiókjába</string>
|
||||
<string name="logout">Kijelentkezés</string>
|
||||
<string name="edit_place">Hely szerkesztése</string>
|
||||
<string name="add_language">Nyelv hozzáadása</string>
|
||||
@@ -453,7 +453,7 @@
|
||||
<!-- Text in About and OSM Login screens. First %@ is replaced by a local, human readable date. -->
|
||||
<string name="osm_presentation">A közösségi OpenStreetMap adatok frissítésének időpontja: %s. Tudjon meg többet a térkép szerkesztéséről és frissítéséről az OpenStreetMap.org oldalon</string>
|
||||
<!-- OSM explanation on Android login screen -->
|
||||
<string name="login_osm_presentation">Az OpenStreetMap.org (OSM) egy közösségi projekt, amelynek célja egy ingyenes és szabad térkép létrehozása. Ez a CoMaps alkalmazás térképadatainak fő forrása, és a Wikipédiához hasonlóan működik. Helyeket adhat hozzá vagy szerkeszthet, és azok világszerte felhasználók milliói számára válnak elérhetővé.\nCsatlakozzon a közösséghez, és segítsen jobb térképet készíteni mindenki számára!</string>
|
||||
<string name="login_osm_presentation">Az OpenStreetMap.org (OSM) egy közösségi projekt, amelynek célja egy ingyenes és nyílt térkép létrehozása. Ez a CoMaps alkalmazás térképadatainak fő forrása, és a Wikipédiához hasonlóan működik. Helyeket adhat hozzá vagy szerkeszthet, és azok világszerte felhasználók milliói számára válnak elérhetővé. \nCsatlakozzon a közösséghez, és segítsen jobb térképet készíteni mindenki számára!</string>
|
||||
<string name="login_to_make_edits_visible">Hozzon létre egy OpenStreetMap-fiókot vagy jelentkezzen be, hogy közzétehesse a térképszerkesztéseit a világ számára</string>
|
||||
<!-- Downloaded 10 **of** 20 <- it is that "of" -->
|
||||
<string name="downloader_of">%1$d / %2$d</string>
|
||||
@@ -496,7 +496,7 @@
|
||||
<string name="editor_place_doesnt_exist">A hely nem létezik</string>
|
||||
<!-- Phone number error message -->
|
||||
<string name="error_enter_correct_phone">Adjon megy egy érvényes telefonszámot</string>
|
||||
<string name="error_enter_correct_web">Adjon meg egy érvényes webcímet</string>
|
||||
<string name="error_enter_correct_web">Adjon meg egy érvényes weboldalcímet</string>
|
||||
<string name="error_enter_correct_email">Adjon meg egy érvényes e-mail-címet</string>
|
||||
<string name="placepage_add_place_button">Hely hozzáadása az OpenStreetMap adatbázisához</string>
|
||||
<!-- Displayed when saving some edits to the map to warn against publishing personal data -->
|
||||
@@ -524,12 +524,12 @@
|
||||
<string name="big_font">Betűméret növelése a térképen</string>
|
||||
<string name="traffic_update_app">Frissítse a CoMaps alkalmazást</string>
|
||||
<!-- "traffic" as in "road congestion" -->
|
||||
<string name="traffic_data_unavailable">Nem állnak rendelkezésre forgalmi adatok</string>
|
||||
<string name="traffic_data_unavailable">Forgalmi adatok nem állnak rendelkezésre</string>
|
||||
<string name="enable_logging">Naplózás engedélyezése</string>
|
||||
<!-- Settings: "Send general feedback" button -->
|
||||
<string name="feedback_general">Általános visszajelzés</string>
|
||||
<string name="prefs_languages_information">Az CoMaps TTS-rendszert használ a hangnavigációhoz. Sok androidos eszköz használja a Google TTS-t; töltse le vagy frissítse a Google Play áruházból (https://play.google.com/store/apps/details?id=com.google.android.tts)</string>
|
||||
<string name="prefs_languages_information_off">Egyes nyelveknél másik beszédszintetizátort vagy további nyelvi csomagot kell telepítenie az alkalmazás-áruházból (Google Play, Galaxy Store, App Gallery, FDroid).\nNyissa meg az eszköz beállításait → Nyelv és bevitel → Beszéd → Szöveg-beszéd átalakító kimenet.\nItt kezelheti a beszédszintézis beállításokat (például: nyelvi csomag letöltése a kapcsolat nélküli használathoz) és másik szövegfelolvasót jelölhet ki.</string>
|
||||
<string name="prefs_languages_information_off">Egyes nyelveknél másik beszédszintetizátort vagy további nyelvi csomagot kell telepítenie az alkalmazás-áruházból (Google Play, Galaxy Store, App Gallery, FDroid). \nNyissa meg az eszköz beállításait → Nyelv és bevitel → Beszéd → Szöveg-beszéd átalakító kimenet. \nItt kezelheti a beszédszintézis beállításokat (például: nyelvi csomag letöltése a kapcsolat nélküli használathoz) és másik szövegfelolvasót jelölhet ki.</string>
|
||||
<string name="prefs_languages_information_off_link">Ebben az útmutatóban további tájékoztatást talál</string>
|
||||
<string name="transliteration_title">Átírás latin betűkre</string>
|
||||
<string name="learn_more">Tudjon meg többet</string>
|
||||
@@ -556,7 +556,7 @@
|
||||
<string name="bookmarks_create_new_group">Új lista létrehozása</string>
|
||||
<!-- Bookmark categories screen, button that opens folder selection dialog to import KML/KMZ/GPX/KMB files -->
|
||||
<string name="bookmarks_import">Könyvjelzők és nyomvonalak importálása</string>
|
||||
<string name="bookmarks_error_message_share_general">Egy alkalmazáshiba miatt nem lehet megosztani</string>
|
||||
<string name="bookmarks_error_message_share_general">Nem lehet megosztani egy alkalmazáshiba miatt</string>
|
||||
<string name="bookmarks_error_title_share_empty">Megosztási hiba</string>
|
||||
<string name="bookmarks_error_message_share_empty">Üres lista nem osztható meg</string>
|
||||
<string name="bookmarks_error_title_empty_list_name">A név nem lehet üres</string>
|
||||
@@ -594,7 +594,7 @@
|
||||
<!-- 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">Térképletöltő</string>
|
||||
<!-- "Speed cameras" settings menu option (should be short! no more than 47-50 chars) to warn a driver if there is a risk of exceeding the speed limit -->
|
||||
<string name="pref_tts_speedcams_auto">Figyelmeztetés gyorshajtáskor</string>
|
||||
<string name="pref_tts_speedcams_auto">Gyorshajtáskor figyelmeztessen</string>
|
||||
<!-- Speed camera settings menu option - Always warn (about speedcams) -->
|
||||
<string name="pref_tts_speedcams_always">Mindig figyelmeztessen</string>
|
||||
<!-- Speed camera settings menu option - Never warn (about speedcams) -->
|
||||
@@ -602,7 +602,7 @@
|
||||
<string name="power_managment_title">Energiatakarékos mód</string>
|
||||
<string name="power_managment_description">Megpróbálja csökkenteni az energiafelhasználást bizonyos funkciók rovására</string>
|
||||
<string name="power_managment_setting_never">Soha</string>
|
||||
<string name="power_managment_setting_auto">Alacsony akkumulátorszinten</string>
|
||||
<string name="power_managment_setting_auto">Amikor az akkumulátor lemerül</string>
|
||||
<string name="power_managment_setting_manual_max">Mindig</string>
|
||||
<string name="enable_logging_warning_message">Engedélyezze ideiglenesen ezt a beállítást, hogy rögzíthesse és elküldhesse nekünk a problémájával kapcsolatos részletes diagnosztikai naplókat a „Névjegy és súgó” képernyő „Hibajelentés” funkciójával. A naplók tartalmazhatnak helyadatokat.</string>
|
||||
<string name="driving_options_title">Útvonaltervezési beállítások</string>
|
||||
@@ -707,15 +707,15 @@
|
||||
<!-- App tip #01 -->
|
||||
<string name="app_tip_01">Adományaival és támogatásával létrehozhatjuk a világ legjobb térképes alkalmazását!</string>
|
||||
<!-- App tip #02 -->
|
||||
<string name="app_tip_02">Tetszik az alkalmazásunk? Adományozzon, hogy támogassa a fejlesztést! - Mégsem tetszik? Jelezze felénk, hogy miért nem, és mi kijavítjuk!</string>
|
||||
<string name="app_tip_02">Tetszik az alkalmazásunk? Adományozzon, hogy támogassa a fejlesztést! – Mégsem tetszik? Jelezze felénk, hogy miért nem, és mi kijavítjuk!</string>
|
||||
<!-- App tip #03 -->
|
||||
<string name="app_tip_03">Ha ismer egy szoftverfejlesztőt, megkérheti őt egy olyan funkció megvalósítására, amelyre szüksége van.</string>
|
||||
<!-- App tip #04 -->
|
||||
<string name="app_tip_04">Koppintson a térképen bárhová, hogy bármit kiválaszthasson. Hosszú koppintással elrejtheti és visszahozhatja a felületet.</string>
|
||||
<!-- App tip #05 -->
|
||||
<string name="app_tip_05">Tudta, hogy a térképen kiválaszthatja a jelenlegi tartózkodási helyét?</string>
|
||||
<string name="app_tip_05">Tudja, hogy kijelölheti pozícióját a térképen?</string>
|
||||
<!-- App tip #06 -->
|
||||
<string name="app_tip_06">Segítsen lefordítani az alkalmazást a saját nyelvére.</string>
|
||||
<string name="app_tip_06">Segítsen lefordítani az alkalmazást az Ön nyelvére.</string>
|
||||
<!-- App tip #07 -->
|
||||
<string name="app_tip_07">Ezt az alkalmazást néhány lelkes közreműködő és a közösség fejleszteti.</string>
|
||||
<!-- App tip #08 -->
|
||||
@@ -723,17 +723,17 @@
|
||||
<!-- App tip #09 -->
|
||||
<string name="app_tip_09">A fő célunk az, hogy gyors, az adatvédelemre fókuszáló, könnyen használható térképeket készítsünk, amelyeket szeretni fog.</string>
|
||||
<!-- Text on the Android Auto or CarPlay placeholder screen that maps are displayed on the phone screen -->
|
||||
<string name="car_used_on_the_phone_screen">Ön most a CoMaps alkalmazást használja az eszköz képernyőjén</string>
|
||||
<string name="car_used_on_the_phone_screen">Ön most a CoMaps alkalmazást használja a telefon képernyőjén</string>
|
||||
<!-- Text on the phone placeholder screen that maps are displayed on the car screen -->
|
||||
<string name="car_used_on_the_car_screen">Ön most a CoMaps alkalmazást használja az autó képernyőjén</string>
|
||||
<!-- Displayed on the phone screen. Android Auto connected -->
|
||||
<string name="aa_connected_title">Ön már kapcsolódva van az Android Auto rendszerhez</string>
|
||||
<!-- Displayed on the phone screen. Button to display maps on the phone screen instead of a car -->
|
||||
<string name="car_continue_on_the_phone">Folytatás az eszközön</string>
|
||||
<string name="car_continue_on_the_phone">Folytatás telefonon</string>
|
||||
<!-- Displayed on the Android Auto or CarPlay screen. Button to display maps on the car screen instead of a phone. Must be no more than 18 symbols! -->
|
||||
<string name="car_continue_in_the_car">Az autó képernyőjére</string>
|
||||
<!-- Ask user to grant location permissions -->
|
||||
<string name="aa_location_permissions_request">A CoMaps alkalmazásnak szüksége van a helymeghatározáshoz való hozzáférésre. Ha biztonságos, ellenőrizze az értesítést az eszközén.</string>
|
||||
<string name="aa_location_permissions_request">A CoMaps alkalmazásnak szüksége van a helymeghatározáshoz való hozzáférésre. Ha biztonságos, ellenőrizze az értesítést a telefonján.</string>
|
||||
<!-- Notification title for permission request from AA. -->
|
||||
<string name="aa_request_permission_notification">Ennek az alkalmazásnak szüksége van az Ön engedélyére</string>
|
||||
<!-- The text in the activity for location permission request. -->
|
||||
@@ -768,7 +768,7 @@
|
||||
<!-- To indicate if restaurant or other place has outdoor seating -->
|
||||
<string name="outdoor_seating">Kiülős helyek</string>
|
||||
<!-- Disclaimer summary shown when Power Saving Mode is enabled -->
|
||||
<string name="power_save_dialog_summary">A legpontosabb navigáció érdekében javasoljuk az energiatakarékos üzemmód kikapcsolását az eszköz akkumulátor-beállításaiban.</string>
|
||||
<string name="power_save_dialog_summary">A legpontosabb navigáció érdekében javasoljuk az energiatakarékos üzemmód kikapcsolását a telefon akkumulátor-beállításaiban.</string>
|
||||
<!-- Prompt to start recording a track. -->
|
||||
<string name="start_track_recording">Nyomvonal rögzítése</string>
|
||||
<!-- Prompt for stopping a track recording. -->
|
||||
@@ -780,7 +780,7 @@
|
||||
<!-- Title for the alert when saving a track recording. -->
|
||||
<string name="track_recording_alert_title">Menti a könyvjelzők és nyomvonalak közé?</string>
|
||||
<!-- Message for the toast when saving the track recording is finished but nothing to save. -->
|
||||
<string name="track_recording_toast_nothing_to_save">A nyomvonal üres - nincs mit menteni</string>
|
||||
<string name="track_recording_toast_nothing_to_save">A nyomvonal üres – nincs mit menteni</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">Nem lehet megjeleníteni a mappaválasztó párbeszédpanelt, mert nincs megfelelő alkalmazás telepítve az eszközén. Telepítsen egy fájlkezelő alkalmazást, és próbálja meg újra.</string>
|
||||
<string name="choose_color">Válasszon színt</string>
|
||||
@@ -817,7 +817,7 @@
|
||||
<string name="panoramax">Panoramax kép</string>
|
||||
<string name="app_site_url">https://comaps.app/hu/</string>
|
||||
<string name="saved">Mentett</string>
|
||||
<string name="about_headline">Közösség által működtetett szabad projekt</string>
|
||||
<string name="about_headline">Közösség által működtetett nyílt projekt</string>
|
||||
<string name="closed_now">Jelenleg zárva</string>
|
||||
<string name="existence_confirmed_time_ago">A létezése ellenőrizve és megerősítve: %s</string>
|
||||
<string name="hours_confirmed_time_ago">Megerősítve: %s</string>
|
||||
@@ -869,19 +869,5 @@
|
||||
<string name="charge_socket_nacs">NACS (Észak-Amerikai töltőszabvány)</string>
|
||||
<string name="charge_socket_chademo">Gyors töltési szabvány Japán autókhoz</string>
|
||||
<string name="unknown_socket_type">ismeretlen aljzat</string>
|
||||
<string name="unknown_power_output">ismeretlen</string>
|
||||
<string name="editor_place_doesnt_exist_description">Írja le, hogy jelenleg hogyan néz ki a hely, a hibaüzenet elküldéséhez az OpenStreetMap közösségnek</string>
|
||||
<string name="avoid_steps">Lépcsők elkerülése</string>
|
||||
<string name="unknow_socket_type">ismeretlen aljzat</string>
|
||||
<string name="edit_socket_info_tooltip">Új aljzatok létrehozása vagy a meglévők szerkesztése.</string>
|
||||
<string name="charging_station_available_sockets">Elérhető aljzatok</string>
|
||||
<string name="charge_socket_unknown_other">Egyéb vagy ismeretlen aljzat</string>
|
||||
<string name="charge_socket_count">Darabszám</string>
|
||||
<string name="charge_socket_power">Teljesítmény (kW)</string>
|
||||
<string name="editor_socket">Aljzat szerkesztése</string>
|
||||
<string name="unknown_count">ismeretlen</string>
|
||||
<string name="error_value_must_be_positive">Az érték csak pozitív egész szám lehet</string>
|
||||
<string name="error_invalid_number">Érvénytelen szám</string>
|
||||
<string name="offline_explanation_title">Offline térképek</string>
|
||||
<string name="offline_explanation_text">A terület megtekintéséhez és az azon való navigálásához egy térképet kell letölteni.\nTöltsön le térképeket azokra a területekre, ahová utazni szeretne.</string>
|
||||
<string name="unknown_power_output">ismeretlen áramkimenet</string>
|
||||
</resources>
|
||||
|
||||
@@ -824,9 +824,4 @@
|
||||
<string name="edit_socket_info_tooltip">Pievienot jaunas ligzdas vai labot esošās.</string>
|
||||
<string name="unknow_socket_type">nezināma ligzda</string>
|
||||
<string name="unknown_count">nezināms</string>
|
||||
<string name="offline_explanation_title">Bezsaistes kartes</string>
|
||||
<string name="offline_explanation_text">Ir nepieciešams lejupielādēt karti, lai apskatītu un pārvietotos apgabalā.\nJālejupielādē apgabalu, kuros vēlies ceļot, kartes.</string>
|
||||
<string name="avoid_steps">Izvairīties no pakāpieniem</string>
|
||||
<string name="editor_place_doesnt_exist_description">Jāapraksta, kā vieta tagad izskatās, lai nosūtītu kļūdas piezīmi OpenStreetMap kopienai</string>
|
||||
<string name="unknown_socket_type">nezināma ligzda</string>
|
||||
</resources>
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
<!-- View and button titles for accessibility, please also edit it in iphone/plist.txt -->
|
||||
<string name="search">Søk</string>
|
||||
<!-- Search box placeholder text; Used when searching on the map itself, not when searching for a map -->
|
||||
<string name="search_map">Søk på kartet</string>
|
||||
<string name="search_map">Søk kart</string>
|
||||
<!-- Location services are disabled by user alert - message -->
|
||||
<string name="location_is_disabled_long_text">Du har for øyeblikket deaktivert alle posisjonstjenester for denne enheten eller applikasjonen. Slå dem på i «Innstillinger».</string>
|
||||
<!-- A dialog title, that warns a user that Precise Location is disabled and suggests to turn it on -->
|
||||
@@ -31,7 +31,7 @@
|
||||
<!-- View and button titles for accessibility -->
|
||||
<string name="zoom_to_country">Vis på kartet</string>
|
||||
<!-- Message to display at the center of the screen when the country download has failed -->
|
||||
<string name="country_status_download_failed">Nedlasting mislyktes</string>
|
||||
<string name="country_status_download_failed">Laster ned mislyktes</string>
|
||||
<!-- Button text for the button under the country_status_download_failed message -->
|
||||
<string name="try_again">Prøv på nytt</string>
|
||||
<string name="about_menu_title">Om CoMaps</string>
|
||||
@@ -46,12 +46,12 @@
|
||||
<!-- Text in About screen -->
|
||||
<string name="about_developed_by_enthusiasts">Fullstendig åpen kildekode, ikke for profitt, gjennomsiktige beslutningsprosesser og finanser.</string>
|
||||
<!-- The button that opens system location settings -->
|
||||
<string name="location_settings">Posisjonsinnstillinger</string>
|
||||
<string name="location_settings">Innstillinger for plassering</string>
|
||||
<string name="close">Lukk</string>
|
||||
<string name="unsupported_phone">En maskinvareakselerert OpenGL kreves. Dessverre støttes ikke enheten din.</string>
|
||||
<string name="download">Last ned</string>
|
||||
<!-- Used in DownloadResources startup screen -->
|
||||
<string name="disconnect_usb_cable">Koble fra USB-kabelen eller sett inn minnekort for å bruke CoMaps</string>
|
||||
<string name="disconnect_usb_cable">Koble fra USB-kabelen eller sett inn minnekortet for å bruke CoMaps</string>
|
||||
<!-- Used in DownloadResources startup screen -->
|
||||
<string name="not_enough_free_space_on_sdcard">Frigjør plass på SD-kortet/USB-enheten først for å bruke appen</string>
|
||||
<string name="download_resources">Før du begynner å bruke appen, last ned oversiktskartet over verden til enheten din.\nDet vil bruke %s lagringsplass.</string>
|
||||
@@ -66,9 +66,9 @@
|
||||
<!-- Show popup notification on top of the map when country download has failed. -->
|
||||
<string name="download_country_failed">Nedlasting av %s mislyktes</string>
|
||||
<!-- "Add new bookmark list" dialog title -->
|
||||
<string name="add_new_set">Legg til en ny liste</string>
|
||||
<string name="add_new_set">Legg til nytt sett</string>
|
||||
<!-- Add Bookmark list dialog - hint when the list name is empty -->
|
||||
<string name="bookmark_set_name">Bokmerkelistenavn</string>
|
||||
<string name="bookmark_set_name">Bokmerk settnavn</string>
|
||||
<!-- Should be used in the bookmarks-only context, see bookmarks_and_tracks if tracks are also implied. -->
|
||||
<string name="bookmarks">Bokmerker</string>
|
||||
<!-- "Bookmarks and Tracks" dialog title, also sync it with iphone/plist.txt -->
|
||||
@@ -86,11 +86,11 @@
|
||||
<!-- Detailed description of Maps Storage settings button -->
|
||||
<string name="maps_storage_summary">Velg lagringsmappe for de nedlastede kartene</string>
|
||||
<!-- E.g. "Downloaded maps: 500Mb" in Maps Storage settings -->
|
||||
<string name="maps_storage_downloaded">Nedlastede kart</string>
|
||||
<string name="maps_storage_downloaded">Kart</string>
|
||||
<!-- Free space out of total storage size in Maps Storage settings, e.g. "300 MB free of 2 GB" -->
|
||||
<string name="maps_storage_free_size">%1$s ledig av %2$s</string>
|
||||
<!-- Question dialog for transferring maps from one storage to another -->
|
||||
<string name="move_maps">Flytte kart?</string>
|
||||
<string name="move_maps">Flytt kart?</string>
|
||||
<!-- Error moving map files from one storage to another -->
|
||||
<string name="move_maps_error">Kunne ikke flytte kart</string>
|
||||
<!-- Ask user to wait several minutes (some long process in modal dialog). -->
|
||||
@@ -149,13 +149,13 @@
|
||||
<string name="description">Merknader</string>
|
||||
<!-- Email Subject when sharing bookmark list -->
|
||||
<string name="share_bookmarks_email_subject">Delte CoMaps-bokmerker</string>
|
||||
<string name="share_bookmarks_email_body">Hei! \n \nVedlagt er mine bokmerker; åpne dem i CoMaps. Har du ikke installert appen kan du laste ned her: https://www.comaps.app/download/ \n \nGod reise med CoMaps!</string>
|
||||
<string name="share_bookmarks_email_body">Hei! \n \nVedlagt er mine bokmerker fra CoMaps-appen. Åpne de dersom du har CoMaps installert. Har du ikke har det, last ned appen til iOS eller Android ved å trykke på denne linken: https://www.comaps.app/download/ \n \nNyt reisen med CoMaps!</string>
|
||||
<!-- message title of loading file -->
|
||||
<string name="load_kmz_title">Laster inn bokmerker</string>
|
||||
<!-- Kmz file successful loading -->
|
||||
<string name="load_kmz_successful">Bokmerkene ble lastet inn! Du finner dem på kartet eller på skjermen Bokmerkehåndtering.</string>
|
||||
<string name="load_kmz_successful">Bokmerkene ble lastet inn! Du finner dem på kartet eller på skjermen «Bokmerkeadministrasjon».</string>
|
||||
<!-- Kml file loading failed -->
|
||||
<string name="load_kmz_failed">Mislyktes i å laste inn bokmerker. Filen kan være skadet eller defekt.</string>
|
||||
<string name="load_kmz_failed">Opplasting av bokmerker mislyktes. 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 gjenkjennes ikke av appen: \n%1$s</string>
|
||||
<!-- Failed to open a bookmarks or tracks file in CoMaps. -->
|
||||
@@ -277,7 +277,7 @@
|
||||
<!-- Context menu item for downloader. -->
|
||||
<string name="downloader_download_map">Last ned kartet</string>
|
||||
<!-- Item status in downloader. -->
|
||||
<string name="downloader_retry">Prøv igjen</string>
|
||||
<string name="downloader_retry">Gjenta</string>
|
||||
<!-- Item in context menu. -->
|
||||
<string name="downloader_delete_map">Slett kart</string>
|
||||
<!-- Item in context menu. -->
|
||||
@@ -289,11 +289,11 @@
|
||||
<!-- Preference title -->
|
||||
<!-- Preference description -->
|
||||
<!-- Text for routing error dialog -->
|
||||
<string name="routing_download_maps_along">Last ned alle kartene langs ruten din</string>
|
||||
<string name="routing_download_maps_along">Last ned kart langs ruten</string>
|
||||
<!-- Text for routing error dialog -->
|
||||
<string name="routing_requires_all_map">For å opprette en rute må alle kartene fra posisjonen din til målet ditt lastes ned og oppdateres.</string>
|
||||
<string name="routing_requires_all_map">Når du skal opprette en rute må du ha oppdatert alle kartene fra ditt ståsted til din destinasjon.</string>
|
||||
<!-- Text for routing error dialog -->
|
||||
<string name="routing_not_enough_space">Ikke nok plass</string>
|
||||
<string name="routing_not_enough_space">Ikke nok ledig minne</string>
|
||||
<!-- location service disabled -->
|
||||
<string name="enable_location_services">Aktiver posisjonstjenester</string>
|
||||
<string name="save">Lagre</string>
|
||||
@@ -339,15 +339,15 @@
|
||||
<string name="dialog_routing_disclaimer_beware">Kjør trygt!</string>
|
||||
<string name="dialog_routing_check_gps">Sjekk GPS-signal</string>
|
||||
<string name="dialog_routing_error_location_not_found">Ingen rute ble opprettet. Nåværende GPS-koordinater ble ikke funnet.</string>
|
||||
<string name="dialog_routing_location_turn_wifi">Sjekk GPS-signalet. Bruk av Wi-Fi vil forbedre posisjonsnøyaktigheten.</string>
|
||||
<string name="dialog_routing_location_turn_on">Aktiver posisjonstjenester</string>
|
||||
<string name="dialog_routing_location_unknown_turn_on">Nåværende GPS-koordinater ble ikke funnet. Aktiver posisjonstjenester for å beregne en rute.</string>
|
||||
<string name="dialog_routing_location_turn_wifi">Sjekk GPS-signalet. Resultatet blir mer nøyaktig når du bruker wi-fi.</string>
|
||||
<string name="dialog_routing_location_turn_on">Aktiver stedstjenester</string>
|
||||
<string name="dialog_routing_location_unknown_turn_on">Nåværende GPS-koordinater ble ikke funnet. Aktiver stedstjenester for å beregne en rute.</string>
|
||||
<string name="dialog_routing_unable_locate_route">Kunne ikke finne rute</string>
|
||||
<string name="dialog_routing_cant_build_route">Kan ikke opprette rute</string>
|
||||
<string name="dialog_routing_change_start_or_end">Endre startpunkt eller bestemmelsessted.</string>
|
||||
<string name="dialog_routing_change_start">Endre startpunkt</string>
|
||||
<string name="dialog_routing_start_not_determined">Ingen rute ble opprettet. Startpunktet ble ikke funnet.</string>
|
||||
<string name="dialog_routing_select_closer_start">Velg et startpunkt nærmere en vei.</string>
|
||||
<string name="dialog_routing_select_closer_start">Velg et startpunkt som er i nærheten av en vei.</string>
|
||||
<string name="dialog_routing_change_end">Endre bestemmelsessted</string>
|
||||
<string name="dialog_routing_end_not_determined">Ingen rute ble opprettet. Bestemmelsesstedet ble ikke funnet.</string>
|
||||
<string name="dialog_routing_select_closer_end">Velg et bestemmelsessted som er nærmere en vei</string>
|
||||
@@ -358,9 +358,9 @@
|
||||
<string name="dialog_routing_try_again">Vennligst prøv igjen</string>
|
||||
<string name="not_now">Ikke nå</string>
|
||||
<string name="dialog_routing_download_and_build_cross_route">Vil du laste ned kartet og lage en mer optimal rute som går over flere kart?</string>
|
||||
<string name="dialog_routing_download_cross_route">Last ned ytterligere kart for å opprette en bedre rute som krysser grensene til dette kartet.</string>
|
||||
<string name="dialog_routing_download_cross_route">Last ned kartet for å opprette en mer optimal rute som går utenfor dette kartet.</string>
|
||||
<!-- SECTION: Strings for downloading map from search -->
|
||||
<string name="search_without_internet_advertisement">Last ned kartet for å begynne å søke og opprette ruter. Etter det trenger du ikke lenger en internettforbindelse.</string>
|
||||
<string name="search_without_internet_advertisement">Last vennligst ned kartet for å begynne å søke og opprette ruter - så slipper du i fremtiden å være avhengig av å ha internettforbindelse.</string>
|
||||
<string name="search_select_map">Velg kartet</string>
|
||||
<!-- «Show» context menu -->
|
||||
<string name="show">Vis</string>
|
||||
@@ -374,20 +374,20 @@
|
||||
<string name="search_history_title">Søkehistorikk</string>
|
||||
<string name="search_history_text">Vis de siste søkene dine</string>
|
||||
<string name="clear_search">Tøm søkehistorikk</string>
|
||||
<string name="p2p_your_location">Din posisjon</string>
|
||||
<string name="p2p_your_location">Din beliggenhet</string>
|
||||
<string name="p2p_start">Start</string>
|
||||
<string name="p2p_from_here">Rute fra</string>
|
||||
<string name="p2p_from_here">Fra</string>
|
||||
<string name="p2p_to_here">Rute til</string>
|
||||
<string name="p2p_only_from_current">Navigering er kun tilgjengelig fra din gjeldende posisjon</string>
|
||||
<string name="p2p_reroute_from_current">Vil du planlegge en rute fra din nåværende posisjon?</string>
|
||||
<string name="p2p_reroute_from_current">Vil du vi skal planlegge en rute fra din nåværende posisjon?</string>
|
||||
<!-- Edit open hours/set time and minutes dialog -->
|
||||
<string name="next_button">Neste</string>
|
||||
<!-- Tab title in the Edit Opening Hours time picker -->
|
||||
<string name="editor_time_from">Fra</string>
|
||||
<!-- Tab title in the Edit Opening Hours time picker -->
|
||||
<string name="editor_time_to">Til</string>
|
||||
<string name="editor_time_add">Legg til tidsplan</string>
|
||||
<string name="editor_time_delete">Slett tidsplan</string>
|
||||
<string name="editor_time_add">Legg til tidsrom</string>
|
||||
<string name="editor_time_delete">Slett tidsrom</string>
|
||||
<!-- Text for allday switch. -->
|
||||
<string name="editor_time_allday">Hele dagen (24 timer)</string>
|
||||
<string name="editor_time_open">Åpen</string>
|
||||
@@ -407,12 +407,12 @@
|
||||
<string name="editor_report_problem_no_place_title">Stedet finnes ikke</string>
|
||||
<string name="editor_report_problem_under_construction_title">Stengt pga. vedlikehold</string>
|
||||
<string name="editor_report_problem_duplicate_place_title">Duplisert sted</string>
|
||||
<string name="autodownload">Last ned kart automatisk</string>
|
||||
<string name="autodownload">Automatisk nedlasting</string>
|
||||
<!-- Place Page opening hours text -->
|
||||
<string name="daily">Daglig</string>
|
||||
<string name="twentyfour_seven">Dag og natt</string>
|
||||
<string name="day_off_today">Stengt i dag</string>
|
||||
<string name="day_off">Stengt</string>
|
||||
<string name="day_off_today">Fridag i dag</string>
|
||||
<string name="day_off">Fridag</string>
|
||||
<string name="opens_in">Åpner om %s</string>
|
||||
<string name="closes_in">Stenger om %s</string>
|
||||
<string name="closed">Stengt</string>
|
||||
@@ -442,10 +442,10 @@
|
||||
<string name="select_cuisine">Velg kjøkken</string>
|
||||
<!-- login text field -->
|
||||
<string name="editor_add_phone">Legg til telefon</string>
|
||||
<string name="level">Etasje</string>
|
||||
<string name="level">Gulv</string>
|
||||
<string name="downloader_delete_map_dialog">Alle dine kartredigeringer vil slettes sammen med kartet</string>
|
||||
<string name="downloader_update_maps">Oppdater kart</string>
|
||||
<string name="downloader_mwm_migration_dialog">For å opprette en rute må du oppdatere alle kartene og deretter planlegge ruten på nytt.</string>
|
||||
<string name="downloader_mwm_migration_dialog">For å opprette en reiserute må du oppdatere alle kartene og deretter planlegge reiseruten på nytt.</string>
|
||||
<string name="downloader_search_field_hint">Finn kartet</string>
|
||||
<string name="common_check_internet_connection_dialog">Sørg for at enheten din er koblet til Internett</string>
|
||||
<string name="downloader_no_space_title">Ikke nok plass</string>
|
||||
@@ -473,9 +473,9 @@
|
||||
<string name="download_over_mobile_message">Dette kan være veldig dyrt med enkelte abonnementer eller ved roaming</string>
|
||||
<string name="error_enter_correct_house_number">Skriv riktig husnummer</string>
|
||||
<!-- Error message in Editor when a user tries to set the number of floors for a building higher than %d floors -->
|
||||
<string name="error_enter_correct_storey_number">Antallet etasjer må ikke overstige %d</string>
|
||||
<string name="error_enter_correct_storey_number">Rediger bygningen med maks. %d etasjer</string>
|
||||
<string name="editor_zip_code">Postnummer</string>
|
||||
<string name="error_enter_correct_zip_code">Angi et gyldig postnummer</string>
|
||||
<string name="error_enter_correct_zip_code">Angi riktig postnummer</string>
|
||||
<!-- Title for OSM note section in the editor -->
|
||||
<string name="editor_other_info">Merknad til OpenStreetMap-frivillige (valgfritt)</string>
|
||||
<!-- Hint of the input field in the OSM note section of the editor -->
|
||||
@@ -501,23 +501,23 @@
|
||||
<string name="day">d</string>
|
||||
<string name="placepage_more_button">Mer</string>
|
||||
<string name="placepage_edit_bookmark_button">Rediger bokmerke</string>
|
||||
<string name="placepage_personal_notes_hint">Personlige notater (tekst eller html)</string>
|
||||
<string name="editor_reset_edits_message">Forkaste alle lokale endringer?</string>
|
||||
<string name="editor_reset_edits_button">Forkast</string>
|
||||
<string name="editor_remove_place_message">Slette tillagt sted?</string>
|
||||
<string name="editor_remove_place_button">Slett</string>
|
||||
<string name="placepage_personal_notes_hint">Personlige notater (text or html)</string>
|
||||
<string name="editor_reset_edits_message">Nullstille alle lokale endringer?</string>
|
||||
<string name="editor_reset_edits_button">Nullstill</string>
|
||||
<string name="editor_remove_place_message">Fjerne et tilføyd sted?</string>
|
||||
<string name="editor_remove_place_button">Fjern</string>
|
||||
<string name="editor_place_doesnt_exist">Sted finnes ikke</string>
|
||||
<!-- Error message for "Place doesn't exist" dialog when comment is empty -->
|
||||
<string name="delete_place_empty_comment_error">Forklar hvorfor stedet skal slettes</string>
|
||||
<!-- Phone number error message -->
|
||||
<string name="error_enter_correct_phone">Angi et gyldig telefonnummer</string>
|
||||
<string name="error_enter_correct_phone">Skriv riktig telefonnummer</string>
|
||||
<string name="error_enter_correct_web">Oppgi en gyldig nettadresse</string>
|
||||
<string name="error_enter_correct_email">Oppgi en gyldig epostadresse</string>
|
||||
<string name="error_enter_correct_facebook_page">Angi en gyldig Facebook-adresse, konto eller sidenavn</string>
|
||||
<string name="error_enter_correct_instagram_page">Angi et gyldig Instagram-brukernavn eller nettadresse</string>
|
||||
<string name="error_enter_correct_twitter_page">Angi et gyldig Twitter-brukernavn eller nettadresse</string>
|
||||
<string name="error_enter_correct_vk_page">Angi et gyldig VK-brukernavn eller nettadresse</string>
|
||||
<string name="error_enter_correct_line_page">Angi en gyldig LINE-ID eller nettadresse</string>
|
||||
<string name="error_enter_correct_facebook_page">Skriv inn en gyldig Facebook-adresse, -konto eller -side</string>
|
||||
<string name="error_enter_correct_instagram_page">Skriv inn en gyldig Instagram-adresse eller -kontonavn</string>
|
||||
<string name="error_enter_correct_twitter_page">Skriv inn en gyldig Twitter-adresse eller -brukernavn</string>
|
||||
<string name="error_enter_correct_vk_page">Skriv inn en gyldig VK-adresse eller -kontonavn</string>
|
||||
<string name="error_enter_correct_line_page">Skriv inn en gyldig LINE-adresse eller -ID</string>
|
||||
<string name="placepage_add_place_button">Legg til sted i OpenStreetMap</string>
|
||||
<!-- Displayed when saving some edits to the map to warn against publishing personal data -->
|
||||
<string name="editor_share_to_all_dialog_title">Vil du sende det til alle brukere?</string>
|
||||
@@ -526,7 +526,7 @@
|
||||
<string name="editor_share_to_all_dialog_message_2">OpenStreetMap-redaktører vil sjekke endringene og kontakte deg hvis de har spørsmål</string>
|
||||
<string name="navigation_stop_button">Stopp</string>
|
||||
<!-- Shown as toast when starting the recent track recording -->
|
||||
<string name="track_recording">Tar opp sporet</string>
|
||||
<string name="track_recording">Registrere sporet</string>
|
||||
<!-- For the first routing -->
|
||||
<string name="accept">Godta</string>
|
||||
<!-- For the first routing -->
|
||||
@@ -541,14 +541,14 @@
|
||||
<string name="mobile_data_option_never">Aldri bruk</string>
|
||||
<string name="mobile_data_option_ask">Alltid spør</string>
|
||||
<string name="traffic_update_maps_text">For å vise trafikkdata må kartene være oppdaterte</string>
|
||||
<string name="big_font">Øk størrelsen på kartpåskrifter</string>
|
||||
<string name="big_font">Forstørr skriften på kartet</string>
|
||||
<string name="traffic_update_app">Vennligst oppdater CoMaps</string>
|
||||
<!-- "traffic" as in "road congestion" -->
|
||||
<string name="traffic_data_unavailable">Trafikkdata er ikke tilgjengelig</string>
|
||||
<string name="enable_logging">Aktiver loggføring</string>
|
||||
<!-- Settings: "Send general feedback" button -->
|
||||
<string name="feedback_general">Generell tilbakemelding</string>
|
||||
<string name="prefs_languages_information">Vi bruker system-TTS for taleveiledning. Mange Android-enheter bruker Google TTS, du kan laste ned eller oppdatere via Google Play (https://play.google.com/store/apps/details?id=com.google.android.tts)</string>
|
||||
<string name="prefs_languages_information">Vi bruker system TTS for stemmeveiledning. Mange Android-enheter bruker Google TTS, Du kan laste ned eller oppdatere via Google Play (https://play.google.com/store/apps/details?id=com.google.android.tts)</string>
|
||||
<string name="prefs_languages_information_off">For enkelte språk er det nødvendig å installere en annen talesyntese eller en ekstra språkpakke fra appbutikken (Google Play, Galaxy Store, App Gallery, FDroid). \nGå til enhetens innstillinger → Språk og input → Tale → Tekst til tale output. \nHer kan du administrere innstillingene for talesyntese (for eksempel laste ned språkpakke for offline bruk) og velge en annen tekst-til-tale-motor.</string>
|
||||
<string name="prefs_languages_information_off_link">Les denne veiledningen for mer informasjon</string>
|
||||
<string name="transliteration_title">Omskrivning til latin</string>
|
||||
@@ -557,10 +557,10 @@
|
||||
<string name="routing_add_start_point">Bruk søk eller trykk på kartet for å legge til et startpunkt for ruten</string>
|
||||
<!-- User selected the start of a route by pressing Route From. Now the destination of a route should be selected using search or by tapping on the map and then pressing "Route To". -->
|
||||
<string name="routing_add_finish_point">Bruk søk eller trykk på kartet for å legge til et destinasjonspunkt</string>
|
||||
<string name="planning_route_manage_route">Håndter rute</string>
|
||||
<string name="button_plan">Planlegg</string>
|
||||
<string name="planning_route_manage_route">Administrere rute</string>
|
||||
<string name="button_plan">Planlegge</string>
|
||||
<string name="placepage_remove_stop">Fjern stopp</string>
|
||||
<string name="placepage_add_stop">Legg til stopp</string>
|
||||
<string name="placepage_add_stop">Angi stopp</string>
|
||||
<string name="dialog_error_storage_title">Problemer med tilgang til lagring</string>
|
||||
<string name="dialog_error_storage_message">Ekstern lagring er ikke tilgjengelig. Sannsynligvis er SD-kortet fjernet eller skadet eller så er filsystemet skrivebeskyttet. Undersøk og kontakt oss på support@comaps.app</string>
|
||||
<string name="setting_emulate_bad_storage">Emulere skadet lagring</string>
|
||||
@@ -586,19 +586,19 @@
|
||||
<string name="bookmarks_error_message_list_name_already_taken">Vennligst velg et annet navn</string>
|
||||
<string name="please_wait">Vennligst vent…</string>
|
||||
<string name="phone_number">Telefonnummer</string>
|
||||
<string name="profile">OpenStreetMap-profil</string>
|
||||
<string name="profile">OpenStreetMap profil</string>
|
||||
<plurals name="bookmarks_detect_message">
|
||||
<item quantity="one">%d fil funnet. Du vil se den etter konverteringen.</item>
|
||||
<item quantity="other">%d filer funnet. Du vil se dem etter konverteringen.</item>
|
||||
</plurals>
|
||||
<string name="restore">Gjenopprett</string>
|
||||
<string name="restore">Restaurere</string>
|
||||
<plurals name="tracks">
|
||||
<item quantity="one">%d spor</item>
|
||||
<item quantity="other">%d spor</item>
|
||||
<item quantity="one">%d sti</item>
|
||||
<item quantity="other">%d stier</item>
|
||||
</plurals>
|
||||
<!-- Settings privacy group in settings screen -->
|
||||
<string name="privacy">Personvern</string>
|
||||
<string name="privacy_policy">Personvernpraksis</string>
|
||||
<string name="privacy_policy">Personvernpolitikk</string>
|
||||
<string name="terms_of_use">Bruksbetingelser</string>
|
||||
<string name="button_layer_traffic">Trafikk</string>
|
||||
<string name="subway">T-bane</string>
|
||||
@@ -610,9 +610,9 @@
|
||||
<string name="export_file_gpx">Eksporter GPX</string>
|
||||
<string name="delete_list">Slett liste</string>
|
||||
<string name="speedcams_alert_title">Fartskamera</string>
|
||||
<string name="place_description_title">Stedsbeskrivelse</string>
|
||||
<string name="place_description_title">Plasser beskrivelse</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">Kartnedlasting</string>
|
||||
<string name="notification_channel_downloader">Nedlast kart</string>
|
||||
<!-- "Speed cameras" settings menu option (should be short! no more than 47-50 chars) to warn a driver if there is a risk of exceeding the speed limit -->
|
||||
<string name="pref_tts_speedcams_auto">For å advare deg mot fartsovertredelser</string>
|
||||
<!-- Speed camera settings menu option - Always warn (about speedcams) -->
|
||||
@@ -622,21 +622,21 @@
|
||||
<string name="power_managment_title">Strømsparemodus</string>
|
||||
<string name="power_managment_description">Prøv å redusere strømforbruket på bekostning av noen funksjoner</string>
|
||||
<string name="power_managment_setting_never">Aldri</string>
|
||||
<string name="power_managment_setting_auto">Ved lavt batterinivå</string>
|
||||
<string name="power_managment_setting_manual_max">Alltid</string>
|
||||
<string name="enable_logging_warning_message">Aktiver dette alternativet midlertidig for å registrere og manuelt sende detaljerte diagnostiske loggfiler om problemet ditt til oss ved bruk av \"Rapporter en feil\" i Hjelp-dialogen. Loggfiler kan inkludere posisjonsinfo.</string>
|
||||
<string name="driving_options_title">Rutingalternativer</string>
|
||||
<string name="power_managment_setting_auto">Automatisk</string>
|
||||
<string name="power_managment_setting_manual_max">Maksimum strømsparing</string>
|
||||
<string name="enable_logging_warning_message">Alternativet slår på logging for diagnostiske formål. Det kan være nyttig for våre supportpersonale som feilsøker problemer med appen. Aktiver dette alternativet bare på forespørsel fra CoMaps-brukerstøtte.</string>
|
||||
<string name="driving_options_title">Kjørealternativer</string>
|
||||
<!-- Recommended length for CarPlay and Android Auto is around 25-27 characters -->
|
||||
<string name="avoid_tolls">Unngå bompenger</string>
|
||||
<!-- Recommended length for CarPlay and Android Auto is around 25-27 characters -->
|
||||
<string name="avoid_unpaved">Unngå uasfalterte veier</string>
|
||||
<!-- Recommended length for CarPlay and Android Auto is around 25-27 characters -->
|
||||
<string name="avoid_ferry">Unngå ferger</string>
|
||||
<string name="avoid_motorways">Unngå motorveier</string>
|
||||
<string name="avoid_ferry">Unngå fergeoverganger</string>
|
||||
<string name="avoid_motorways">Unngå motorveien</string>
|
||||
<string name="unable_to_calc_alert_title">Kan ikke beregne rute</string>
|
||||
<string name="unable_to_calc_alert_subtitle">Kan ikke finne en rute. Dette kan skyldes dine rutealternativer eller ufullstendige OpenStreetMap-data. Endre dine rutealternativer og prøv igjen.</string>
|
||||
<string name="define_to_avoid_btn">Definer veier som skal unngås</string>
|
||||
<string name="change_driving_options_btn">Rutingalternativer aktivert</string>
|
||||
<string name="change_driving_options_btn">Kjørealternativer aktivert</string>
|
||||
<string name="toll_road">Bompengevei</string>
|
||||
<string name="unpaved_road">Uasfaltert vei</string>
|
||||
<string name="ferry_crossing">Fergeovergang</string>
|
||||
@@ -655,9 +655,9 @@
|
||||
<string name="trip_finished">Du har ankommet!</string>
|
||||
<string name="ok">Ok</string>
|
||||
<!-- max. 10 symbols, both iOS and Android -->
|
||||
<string name="sort">Sorter…</string>
|
||||
<string name="sort">Sortere…</string>
|
||||
<!-- Android, title, max 20-22 symbols -->
|
||||
<string name="sort_bookmarks">Sorter bokmerker</string>
|
||||
<string name="sort_bookmarks">Sortere merker</string>
|
||||
<!-- Android -->
|
||||
<string name="by_default">Som standard</string>
|
||||
<!-- Android -->
|
||||
@@ -668,8 +668,8 @@
|
||||
<string name="by_date">Etter dato</string>
|
||||
<!-- Android -->
|
||||
<string name="by_name">Etter navn</string>
|
||||
<string name="week_ago_sorttype">En uke siden</string>
|
||||
<string name="month_ago_sorttype">En måned siden</string>
|
||||
<string name="week_ago_sorttype">For en uke siden</string>
|
||||
<string name="month_ago_sorttype">For en måned siden</string>
|
||||
<string name="moremonth_ago_sorttype">Mer enn en måned siden</string>
|
||||
<string name="moreyear_ago_sorttype">Mer enn ett år siden</string>
|
||||
<string name="near_me_sorttype">Nær meg</string>
|
||||
@@ -686,15 +686,15 @@
|
||||
<string name="buildings">Bygninger</string>
|
||||
<string name="money">Penger</string>
|
||||
<string name="shops">Butikker</string>
|
||||
<string name="parkings">Parkering</string>
|
||||
<string name="parkings">Parkeringer</string>
|
||||
<string name="fuel_places">Bensinstasjoner</string>
|
||||
<string name="medicine">Medisin</string>
|
||||
<string name="search_in_the_list">Søk på lista</string>
|
||||
<string name="religious_places">Hellige steder</string>
|
||||
<string name="select_list">Velg liste</string>
|
||||
<string name="transit_not_found">T-bane-navigasjon er ikke tilgjengelig i denne regionen ennå</string>
|
||||
<string name="dialog_pedestrian_route_is_long_header">T-banerute ikke funnet</string>
|
||||
<string name="dialog_pedestrian_route_is_long_message">Velg startpunkt eller endepunkt nærmere en T-banestasjon</string>
|
||||
<string name="select_list">Velge liste</string>
|
||||
<string name="transit_not_found">T-bane navigasjon er ikke tilgjengelig i denne regionen ennå</string>
|
||||
<string name="dialog_pedestrian_route_is_long_header">T-bane rute ikke funnet</string>
|
||||
<string name="dialog_pedestrian_route_is_long_message">Velg utgangspunkt eller destinasjon som befinner seg nærmere en T-bane stasjon</string>
|
||||
<string name="button_layer_isolines">Høydekurver</string>
|
||||
<string name="isolines_activation_error_dialog">Aktivering av høydekurver krever nedlasting av kartdata for dette området</string>
|
||||
<string name="isolines_location_error_dialog">Høydekurver er ikke tilgjengelige i dette området ennå</string>
|
||||
@@ -715,14 +715,14 @@
|
||||
<!-- Used in DownloadResources startup screen -->
|
||||
<string name="connection_failure">Tilkoblingsfeil</string>
|
||||
<!-- Used in DownloadResources startup screen -->
|
||||
<string name="disconnect_usb_cable_title">Frakoble USB-kabel</string>
|
||||
<string name="disconnect_usb_cable_title">Fjern USB-kabelen</string>
|
||||
<string name="enable_keep_screen_on">Behold skjermen på</string>
|
||||
<!-- Description in preferences -->
|
||||
<string name="enable_keep_screen_on_description">Når dette er aktivert, vil skjermen alltid være på når kartet vises.</string>
|
||||
<!-- A preference title; keep short! -->
|
||||
<string name="enable_show_on_lock_screen">Vis på låseskjerm</string>
|
||||
<!-- Description in preferences -->
|
||||
<string name="enable_show_on_lock_screen_description">Når dette er aktivert, fungerer appen på låseskjermen selv når enheten er låst.</string>
|
||||
<string name="enable_show_on_lock_screen_description">Når dette er aktivert trenger du ikke låse opp enheten hver gang når appen kjører.</string>
|
||||
<!-- Current language of the map! -->
|
||||
<string name="change_map_locale">Kart-språk</string>
|
||||
<!-- OpenStreetMap text on splash screen -->
|
||||
@@ -807,7 +807,7 @@
|
||||
<!-- Message for the toast when saving the track recording is finished but nothing to save. -->
|
||||
<string name="track_recording_toast_nothing_to_save">Ruten er tom - ingenting å lagre</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">Kan ikke vise dialogboksen for mappevalg fordi ingen egnet app er installert på enheten din. Installer en filbehandler-app og prøv på nytt.</string>
|
||||
<string name="error_no_file_manager_app">Kan ikke vise dialogboksen for mappevalg fordi ingen passende app er installert på enheten din. Installer en filbehandler-app og prøv på nytt</string>
|
||||
<string name="choose_color">Velg farge</string>
|
||||
<string name="edit_track">Rediger ruten</string>
|
||||
<string name="uri_open_location_failed">Ingen app installert som kan åpne stedet</string>
|
||||
@@ -862,15 +862,4 @@
|
||||
<string name="pref_backup_history_title">Antall sikkerhetskopier som skal beholdes</string>
|
||||
<string name="dialog_report_error_missing_folder">Den valgte sikkerhetskopiplasseringen er ikke tilgjengelig eller skrivbar. Velg en annen plassering.</string>
|
||||
<string name="share_track">Del spor</string>
|
||||
<string name="editor_place_doesnt_exist_description">Beskriv hvordan stedet ser ut nå for å sende en feilmelding til OpenStreetMap-fellesskapet</string>
|
||||
<string name="avoid_steps">Unngå trapper</string>
|
||||
<string name="offline_explanation_title">Offline-kart</string>
|
||||
<string name="offline_explanation_text">Et kart må lastes ned for å vise og navigere i området.\nLast ned kart for områdene du vil reise til.</string>
|
||||
<string name="error_invalid_number">Ugyldig tall</string>
|
||||
<string name="error_value_must_be_positive">Verdien må være positiv</string>
|
||||
<string name="unknown_power_output">ukjent</string>
|
||||
<string name="charge_socket_count">Antall</string>
|
||||
<string name="unknown_count">ukjent</string>
|
||||
<string name="error_enter_correct_fediverse_page">Angi et gyldig Mastodon-brukernavn eller nettadresse</string>
|
||||
<string name="error_enter_correct_bluesky_page">Angi et gyldig Bluesky-brukernavn eller nettadresse</string>
|
||||
</resources>
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<color name="button_accent_text_disabled">#4CFFFFFF</color>
|
||||
|
||||
<!-- LanesView -->
|
||||
<color name="nav_lane_arrow_active">@color/white_primary</color>
|
||||
<color name="nav_lane_arrow_active">@color/black_primary</color>
|
||||
|
||||
<color name="elevation_profile_dot_enabled">#FF9600</color>
|
||||
<color name="elevation_profile">@color/base_accent</color>
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
|
||||
<item name="navNextTurnFrame">@drawable/bg_nav_next_turn</item>
|
||||
<item name="navNextNextTurnFrame">@drawable/bg_nav_next_next_turn</item>
|
||||
<item name="navLanesBackgroundColor">@color/bg_primary</item>
|
||||
<item name="navLanesBackgroundColor">@color/base_accent</item>
|
||||
<item name="navLaneArrowActiveColor">@color/nav_lane_arrow_active</item>
|
||||
<item name="navLaneArrowInactiveColor">@color/nav_lane_arrow_inactive</item>
|
||||
|
||||
|
||||
@@ -538,7 +538,7 @@
|
||||
<string name="mobile_data_option_not_today">Nie stosuj dzisiaj</string>
|
||||
<string name="mobile_data">Dane mobilne</string>
|
||||
<!-- NOTE to translators: please synchronize your translation with the English one. -->
|
||||
<string name="mobile_data_description">Dane mobilne są wymagane do powiadomień o aktualizacji map i wysyłania edycji</string>
|
||||
<string name="mobile_data_description">Dane mobilne są wymagane do powiadomień o aktualizacji map i wyświetlania dokładniejszych informacji o miejscach i zakładkach.</string>
|
||||
<string name="mobile_data_option_never">Nigdy nie stosuj</string>
|
||||
<string name="mobile_data_option_ask">Zawsze pytaj</string>
|
||||
<string name="traffic_update_maps_text">Aby wyświetlić dane o ruchu, muszą zostać zaktualizowane mapy.</string>
|
||||
@@ -642,7 +642,7 @@
|
||||
<string name="avoid_motorways">Unikaj autostrad</string>
|
||||
<string name="unable_to_calc_alert_title">Brak możliwości zbudowania trasy</string>
|
||||
<string name="unable_to_calc_alert_subtitle">Nie udało się znaleźć trasy. Może to być spowodowane ustawieniami nawigacji lub niekompletnymi danymi OpenStreetMap. Zmień opcje nawigacji i spróbuj ponownie.</string>
|
||||
<string name="define_to_avoid_btn">Dostosuj omijane typy dróg</string>
|
||||
<string name="define_to_avoid_btn">Dostosuj ścieżkę objazdu</string>
|
||||
<string name="change_driving_options_btn">Ustawienia objazdu są włączone</string>
|
||||
<string name="toll_road">Droga płatna</string>
|
||||
<string name="unpaved_road">Droga gruntowa</string>
|
||||
@@ -877,26 +877,4 @@
|
||||
<string name="existence_confirmed_time_ago">Istnienie potwierdzone %s</string>
|
||||
<string name="osm_note_hint">Ewentualnie zostaw notatkę dla społeczności OpenStreetMap, żeby ktoś inny mógł dodać lub poprawić to miejsce.</string>
|
||||
<string name="osm_note_toast">Notatka zostanie wysłana do OpenStreetMap</string>
|
||||
<string name="offline_explanation_title">Mapy Offline</string>
|
||||
<string name="offline_explanation_text">Aby przeglądać i nawigować po okolicy potrzebujesz pobrać mapę.\nPobierz mapy obszarów, po których chcesz podróżować.</string>
|
||||
<string name="editor_place_doesnt_exist_description">Opisz jak to miejsce wygląda teraz, aby wysłać zgłoszenie do społeczności OpenStreetMap</string>
|
||||
<string name="avoid_steps">Unikaj schodów</string>
|
||||
<string name="unknown_power_output">nieznana</string>
|
||||
<string name="charge_socket_type2">Typ 2 (bez kabla)</string>
|
||||
<string name="charge_socket_type2_cable">Typ 2 (z kablem)</string>
|
||||
<string name="charge_socket_type2_combo">Typ 2 combo</string>
|
||||
<string name="charge_socket_type1">Typ 1</string>
|
||||
<string name="charge_socket_nacs">NACS</string>
|
||||
<string name="charge_socket_chademo">CHAdeMO</string>
|
||||
<string name="unknown_socket_type">nieznane gniazdo</string>
|
||||
<string name="unknow_socket_type">nieznane gniazdo</string>
|
||||
<string name="edit_socket_info_tooltip">Stwórz nowe gniazda lub edytuj już istniejące.</string>
|
||||
<string name="charging_station_available_sockets">Dostępne gniazda</string>
|
||||
<string name="charge_socket_unknown_other">Inne lub nieznane</string>
|
||||
<string name="charge_socket_count">Liczba</string>
|
||||
<string name="charge_socket_power">Moc (kW)</string>
|
||||
<string name="editor_socket">Edytuj gniazdo</string>
|
||||
<string name="unknown_count">nieznana</string>
|
||||
<string name="error_value_must_be_positive">Wartość musi być dodatnia</string>
|
||||
<string name="error_invalid_number">Nieprawidłowa liczba</string>
|
||||
</resources>
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
<!-- "Bookmarks and Tracks" dialog title, also sync it with iphone/plist.txt -->
|
||||
<string name="bookmarks_and_tracks">Locuri preferate și trasee</string>
|
||||
<!-- Add bookmark dialog - bookmark name -->
|
||||
<string name="name">Nume</string>
|
||||
<string name="name">Denumire</string>
|
||||
<!-- Editor title above street and house number, duplicates [type.building.address] in types_strings.txt -->
|
||||
<string name="address">Adresă</string>
|
||||
<!-- Add Bookmark dialog/Bookmark list; Bookmarks dialog/Bookmark list cell. -->
|
||||
|
||||
@@ -533,103 +533,4 @@
|
||||
<string name="app_tip_08">Enostavno lahko popravite in izboljšate kartografske podatke.</string>
|
||||
<string name="app_tip_09">Naš cilj je ustvariti učinkovite in enostavne zemljevide, ki spoštujejo zasebnost in vam koristijo.</string>
|
||||
<string name="car_used_on_the_phone_screen">CoMaps zdaj uporabljate na zaslonu telefona</string>
|
||||
<string name="error_invalid_number">Neveljavno število</string>
|
||||
<string name="offline_explanation_title">Zemljevidi brez povezave</string>
|
||||
<string name="offline_explanation_text">Zemljevid morate prenesti, da ga lahko ogledujete in se po njem usmerjate.\nPrenesite zemljevide za območja, kjer želite potovati.</string>
|
||||
<string name="google_play_services">Googleova združena lokacijska storitev</string>
|
||||
<string name="create">ustvari</string>
|
||||
<string name="editor_place_doesnt_exist_description">Opišite, kako to mesto izgleda sedaj, da pošljete obvestilo skupnosti OpenStreetMap</string>
|
||||
<string name="prefs_languages_information_off">Za nekatere jezike boste morali namestiti sintetizator govora ali dodatni jezikovni paket iz trgovine z aplikacijami (Google Play, Galaxy Store, App Gallery, FDroid). \nOdprite nastavitve naprave → Jezik in vnos → Govor → Izhod besedila v govor. \nTukaj lahko upravljate nastavitve za sintezo govora (na primer prenesete jezikovni paket za uporabo brez povezave) in izberete drug gonilnik za pretvorbo besedila v govor.</string>
|
||||
<string name="category_desc_more">… več</string>
|
||||
<string name="avoid_steps">Izogni se stopnicam</string>
|
||||
<string name="translated_om_site_url">https://comaps.app/</string>
|
||||
<string name="osm_wiki_about_url">https://wiki.openstreetmap.org/wiki/About_OpenStreetMap</string>
|
||||
<string name="car_used_on_the_car_screen">Trenutno uporabljate CoMaps na zaslonu vozila</string>
|
||||
<string name="aa_connected_title">Trenutno ste povezani z Android Auto</string>
|
||||
<string name="car_continue_on_the_phone">Nadaljuj na telefonu</string>
|
||||
<string name="car_continue_in_the_car">Na zaslon vozila</string>
|
||||
<string name="aa_location_permissions_request">CoMaps potrebuje dostop do lokacije. Ko bo varno, preverite obvestila na vašem telefonu.</string>
|
||||
<string name="aa_request_permission_notification">To orodje potrebuje vaše dovoljenje</string>
|
||||
<string name="aa_request_permission_activity_text">CoMaps v Android Auto za učinkovito delovanje potrebuje lokacijska dovoljenja</string>
|
||||
<string name="aa_grant_permissions">Podeli dovoljenja</string>
|
||||
<string name="button_layer_outdoor">Na prostem</string>
|
||||
<string name="browser_not_available">Spletni brskalnik ni na voljo</string>
|
||||
<string name="volume">Glasnost</string>
|
||||
<string name="bookmarks_export">Izvozi vse zaznamke in sledi</string>
|
||||
<string name="pref_tts_open_system_settings">Sistemske nastavitve sintetizatorja govora</string>
|
||||
<string name="pref_tts_no_system_tts">Nastavitve za sintezo govora niso bile najdene. Ali ste prepričani, da vaša naprava to podpira?</string>
|
||||
<string name="drive_through">Vožnja skozi</string>
|
||||
<string name="clear_the_search">Počisti iskanje</string>
|
||||
<string name="website_menu">Povezava do menija</string>
|
||||
<string name="view_menu">Oglej si meni</string>
|
||||
<string name="open_in_app">Odpri v drugem orodju</string>
|
||||
<string name="self_service">Samopostrežno</string>
|
||||
<string name="select_option">Izberi možnost</string>
|
||||
<string name="outdoor_seating">Sedišča na prostem</string>
|
||||
<string name="power_save_dialog_summary">Za kar najbolj natančno navigacijo priporočamo, da v nastavitvah baterije telefona onemogočite varčevanje z energijo.</string>
|
||||
<string name="start_track_recording">Snemaj sled</string>
|
||||
<string name="stop_track_recording">Ustavi snemanje sledi</string>
|
||||
<string name="stop_without_saving">Ustavi brez shranjevanja</string>
|
||||
<string name="continue_recording">Nadaljuj snemanje</string>
|
||||
<string name="track_recording_alert_title">Shrani med Zaznamke in sledi?</string>
|
||||
<string name="track_recording_toast_nothing_to_save">Sled je prazna – ničesar ni za shraniti</string>
|
||||
<string name="error_no_file_manager_app">Pogovornega okna za izbiro mape ni mogoče prikazati, ker na vaši napravi ni nameščenega ustreznega orodja. Namestite upravitelja datotek in poskusite znova.</string>
|
||||
<string name="choose_color">Izberi barvo</string>
|
||||
<string name="edit_track">Uredi sled</string>
|
||||
<string name="uri_open_location_failed">Ni nameščenega orodja, ki bi lahko odprlo zemljepisni položaj</string>
|
||||
<string name="nav_auto">Samodejno v potnem usmerjanju</string>
|
||||
<string name="zoom_in">Približaj</string>
|
||||
<string name="zoom_out">Oddalji</string>
|
||||
<string name="pref_left_button_title">Nastavitev levega gumba</string>
|
||||
<string name="pref_backup_title">Varnostno kopiranje zaznamkov in sledi</string>
|
||||
<string name="pref_backup_summary">Samodejno varnostno kopiraj v mapo na vaši napravi</string>
|
||||
<string name="pref_backup_now_title">Ustvari varnostno kopijo zdaj</string>
|
||||
<string name="pref_left_button_disable">Onemogoči</string>
|
||||
<string name="pref_backup_now_summary_progress">Varnostno kopiranje se izvaja …</string>
|
||||
<string name="pref_backup_now_summary">Nemudoma ustvari varnostno kopijo</string>
|
||||
<string name="pref_backup_now_summary_ok">Varnostno kopiranje uspešno izvedeno</string>
|
||||
<string name="pref_backup_now_summary_empty_lists">Ni zaznamkov in sledi za varnostno kopiranje</string>
|
||||
<string name="pref_backup_now_summary_failed">Varnostno kopiranje je spodletelo</string>
|
||||
<string name="pref_backup_now_summary_folder_unavailable">Mapa za varnostno kopijo ni na voljo</string>
|
||||
<string name="pref_backup_status_summary_success">Zadnje uspešno kopiranje</string>
|
||||
<string name="pref_backup_location_title">Mesto varnostne kopije</string>
|
||||
<string name="pref_backup_location_summary_initial">Prosimo, najprej izberite mapo in podelite dovoljenja</string>
|
||||
<string name="pref_backup_history_title">Število varnostnih kopij, ki jih je treba hraniti</string>
|
||||
<string name="pref_backup_interval_title">Samodejno varnostno kopiranje</string>
|
||||
<string name="backup_interval_manual_only">Izklopljeno (samo ročno)</string>
|
||||
<string name="dialog_report_error_missing_folder">Izbrano mesto za varnostno kopijo ni na voljo ali vanjo ni mogoče pisati. Izberite drugo mesto.</string>
|
||||
<string name="backup_interval_every_day">Dnevno</string>
|
||||
<string name="backup_interval_every_week">Tedensko</string>
|
||||
<string name="dialog_report_error_with_logs">Prosimo, pošljite nam poročilo o napaki:\n - \"Omogoči beleženje\" v nastavitvah\n - poustvarite težavo\n - na zaslonu »O programu in Pomoč« pritisnite gumb »Prijavi napako« in jo pošljite po e-pošti ali klepetu\n - onemogoči beleženje</string>
|
||||
<string name="route_type">Vrsta poti</string>
|
||||
<string name="vehicle">Vozilo</string>
|
||||
<string name="pedestrian">Za pešce</string>
|
||||
<string name="bookmark_color">Barva zaznamka</string>
|
||||
<string name="about_help">O programu in Pomoč</string>
|
||||
<string name="open_now">Trenutno odprto</string>
|
||||
<string name="closed_now">Trenutno zaprto</string>
|
||||
<string name="at">ob %s</string>
|
||||
<string name="share_track">Deli sled</string>
|
||||
<string name="delete_track_dialog_title">Izbriši %s?</string>
|
||||
<string name="pref_tts_no_system_tts_short">Nobeno orodje za pretvorbo besedila v govor ni bilo najdeno, preverite nastavitve aplikacije</string>
|
||||
<string name="charge_socket_type2">Vrsta 2 (brezžično)</string>
|
||||
<string name="charge_socket_type2_combo">Vrsta 2 kombinirano</string>
|
||||
<string name="charge_socket_type1">Vrsta 1</string>
|
||||
<string name="charge_socket_nacs">NACS (severnoameriško polnilno omrežje)</string>
|
||||
<string name="charge_socket_chademo">CHAdeMO (japonski standard za polnjenje vozil)</string>
|
||||
<string name="unknown_socket_type">neznana vtičnica</string>
|
||||
<string name="unknow_socket_type">neznana vtičnica</string>
|
||||
<string name="edit_socket_info_tooltip">Ustvari nove vtičnice ali uredi obstoječe.</string>
|
||||
<string name="charging_station_available_sockets">Razpoložljive vtičnice</string>
|
||||
<string name="charge_socket_unknown_other">Druge ali neznane</string>
|
||||
<string name="charge_socket_count">Število</string>
|
||||
<string name="charge_socket_power">Moč (kW)</string>
|
||||
<string name="editor_socket">Uredi vtičnico</string>
|
||||
<string name="unknown_count">neznano</string>
|
||||
<string name="error_value_must_be_positive">Vrednosti mora biti pozitivna</string>
|
||||
<string name="charge_socket_type2_cable">Vrsta 2 (s kablom)</string>
|
||||
<string name="clear">Počisti</string>
|
||||
<string name="bicycle">Kolo</string>
|
||||
<string name="unknown_power_output">neznano</string>
|
||||
<string name="ruler">Ravnilo</string>
|
||||
</resources>
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
<!-- A dialog title, that warns a user that Precise Location is disabled and suggests to turn it on -->
|
||||
<string name="limited_accuracy">Begränsad noggrannhet</string>
|
||||
<!-- A dialog text, that warns a user that Precise Location is disabled and suggests to turn it on -->
|
||||
<string name="precise_location_is_disabled_long_text">Aktivera Exakt Plats i inställningarna för att säkerställa korrekt navigering</string>
|
||||
<string name="precise_location_is_disabled_long_text">För att säkerställa korrekt navigering aktiverar du Precise Location i inställningarna.</string>
|
||||
<!-- View and button titles for accessibility -->
|
||||
<string name="zoom_to_country">Visa på kartan</string>
|
||||
<!-- Message to display at the center of the screen when the country download has failed -->
|
||||
@@ -36,13 +36,13 @@
|
||||
<string name="try_again">Försök igen</string>
|
||||
<string name="about_menu_title">Om CoMaps</string>
|
||||
<!-- Text in About screen -->
|
||||
<string name="about_proposition_1">• Lättanvändlig och finslipad</string>
|
||||
<string name="about_proposition_1">• Inga annonser, ingen spårning, ingen datainsamling</string>
|
||||
<!-- Text in About screen -->
|
||||
<string name="about_proposition_2">• Integritetsfokuserad och fri från annonser</string>
|
||||
<string name="about_proposition_2">• Låg batteriförbrukning, fungerar utan uppkoppling</string>
|
||||
<!-- Text in About screen -->
|
||||
<string name="about_proposition_3">• Offline, snabb och kompakt</string>
|
||||
<!-- Text in About screen -->
|
||||
<string name="about_developed_by_enthusiasts">Fullständigt öppen källkod, icke-vinstdrivande, transparent beslutsfattande och ekonomi.</string>
|
||||
<string name="about_developed_by_enthusiasts">Öppen källkod-app skapad av entusiaster och frivilliga.</string>
|
||||
<!-- The button that opens system location settings -->
|
||||
<string name="location_settings">Platsinställningar</string>
|
||||
<string name="close">Stäng</string>
|
||||
|
||||
@@ -146,7 +146,7 @@
|
||||
<string name="category_rv">房车设施</string>
|
||||
<!-- SECTION: Other translations -->
|
||||
<!-- Notes field in Bookmarks view -->
|
||||
<string name="description">注记</string>
|
||||
<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 中打开。如果您没有安装 CoMaps,可以在这里下载: https://www.comaps.app/download/ \n \n祝您使用 CoMaps 旅行愉快!</string>
|
||||
@@ -473,7 +473,7 @@
|
||||
<!-- Text in About and OSM Login screens. First %@ is replaced by a local, human readable date. -->
|
||||
<string name="osm_presentation">截至 %s 的社区创建的 OpenStreetMap 数据。请访问 OpenStreetMap.org 以了解有关如何编辑和更新地图的信息</string>
|
||||
<!-- OSM explanation on Android login screen -->
|
||||
<string name="login_osm_presentation">OpenStreetMap.org(OSM)是一个构建自由开放地图的社区项目。它是 CoMaps 中地图数据的主要来源,其工作原理类似于维基百科。您可以添加或编辑地点,可供全世界数以百万计的用户使用并受益。\n加入社区,让我们共绘更优质的地图吧!</string>
|
||||
<string name="login_osm_presentation">OpenStreetMap.org(OSM)是一个构建免费开放地图的社区项目。它是 CoMaps 中地图数据的主要来源,其工作原理类似于维基百科。您可以添加或编辑地点,可供全世界数以百万计的用户使用并受益。\n加入OSM,让我们共绘更优质的地图吧!</string>
|
||||
<string name="login_to_make_edits_visible">创建 OpenStreetMap 账号或登录,向全世界发布您编辑的地图</string>
|
||||
<!-- Downloaded 10 **of** 20 <- it is that "of" -->
|
||||
<string name="downloader_of">%1$d / %2$d</string>
|
||||
@@ -485,14 +485,14 @@
|
||||
<string name="editor_zip_code">邮政编码</string>
|
||||
<string name="error_enter_correct_zip_code">输入有效的邮政编码</string>
|
||||
<!-- Title for OSM note section in the editor -->
|
||||
<string name="editor_other_info">OpenStreetMap 志愿者注记(选填)</string>
|
||||
<string name="editor_other_info">OpenStreetMap 志愿者须知(可选)</string>
|
||||
<!-- Hint of the input field in the OSM note section of the editor -->
|
||||
<string name="editor_note_hint">描述地图上的错误或无法使用 CoMaps 编辑的内容</string>
|
||||
<!-- Information about OSM at the top of the editing page -->
|
||||
<string name="editor_about_osm">您的编辑内容将上传到公共<a href="https://wiki.openstreetmap.org/wiki/Zh-hans:关于">OpenStreetMap</a>数据库。请勿添加个人或受版权保护的信息。</string>
|
||||
<string name="editor_more_about_osm">关于 OpenStreetMap 的更多信息</string>
|
||||
<string name="editor_osm_history">您的编辑历史</string>
|
||||
<string name="editor_osm_notes">您的地图数据注记</string>
|
||||
<string name="editor_osm_notes">您的地图数据说明</string>
|
||||
<string name="editor_operator">操作员</string>
|
||||
<!-- To indicate the operator of ATMs, bicycle rentals, electric vehicle charging stations... -->
|
||||
<string name="operator">操作员: %s</string>
|
||||
@@ -509,7 +509,7 @@
|
||||
<string name="day">天</string>
|
||||
<string name="placepage_more_button">更多</string>
|
||||
<string name="placepage_edit_bookmark_button">编辑书签</string>
|
||||
<string name="placepage_personal_notes_hint">个人注记(文字或 html)</string>
|
||||
<string name="placepage_personal_notes_hint">个人备注(文字或 html)</string>
|
||||
<string name="editor_reset_edits_message">重置所有本地更改?</string>
|
||||
<string name="editor_reset_edits_button">重置</string>
|
||||
<string name="editor_remove_place_message">删除已添加的地点?</string>
|
||||
@@ -866,8 +866,8 @@
|
||||
<string name="closed_now">已歇业</string>
|
||||
<string name="open_now">营业中</string>
|
||||
<string name="at">%s</string>
|
||||
<string name="osm_note_hint">或者,也可以给 OpenStreetMap 社区留下注记,以便其他人可以在此添加或修复地点。</string>
|
||||
<string name="osm_note_toast">注记将发送至 OpenStreetMap</string>
|
||||
<string name="osm_note_hint">或者,也可以给 OpenStreetMap 社区留言,以便其他人可以在此添加或修复地点。</string>
|
||||
<string name="osm_note_toast">注释将发送至 OpenStreetMap</string>
|
||||
<string name="existence_confirmed_time_ago">已于%s确认地点存在</string>
|
||||
<string name="delete_track_dialog_title">是否删除%s?</string>
|
||||
<string name="hours_confirmed_time_ago">已于%s确认</string>
|
||||
@@ -891,8 +891,4 @@
|
||||
<string name="unknown_count">未知</string>
|
||||
<string name="error_value_must_be_positive">值必须为正数</string>
|
||||
<string name="error_invalid_number">无效的数字</string>
|
||||
<string name="editor_place_doesnt_exist_description">描述该地点的现状,以便向 OpenStreetMap 社区发送错误注记</string>
|
||||
<string name="avoid_steps">避开台阶</string>
|
||||
<string name="offline_explanation_title">离线地图</string>
|
||||
<string name="offline_explanation_text">需要下载地图才能查看并在该区域内导航。\n请为您计划前往的区域下载地图。</string>
|
||||
</resources>
|
||||
|
||||
@@ -50,4 +50,21 @@
|
||||
<item>8</item>
|
||||
<item>10</item>
|
||||
</string-array>
|
||||
|
||||
<!-- Location Sharing Update Intervals -->
|
||||
<string-array name="location_sharing_intervals">
|
||||
<item>5 seconds</item>
|
||||
<item>10 seconds</item>
|
||||
<item>20 seconds</item>
|
||||
<item>30 seconds</item>
|
||||
<item>60 seconds</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="location_sharing_interval_values">
|
||||
<item>5</item>
|
||||
<item>10</item>
|
||||
<item>20</item>
|
||||
<item>30</item>
|
||||
<item>60</item>
|
||||
</string-array>
|
||||
</resources>
|
||||
|
||||
@@ -124,6 +124,7 @@
|
||||
<color name="elevation_profile">@color/base_accent</color>
|
||||
|
||||
<color name="active_track_recording">#0057ff</color>
|
||||
<color name="active_location_sharing">#FF9500</color>
|
||||
|
||||
<color name="material_calendar_surface_dark">#929292</color>
|
||||
<color name="notification_warning">#FFC22219</color>
|
||||
|
||||
@@ -210,6 +210,9 @@
|
||||
<!-- Length of track in cell that describes route -->
|
||||
<string name="length">Length</string>
|
||||
<string name="share_my_location">Share My Location</string>
|
||||
<string name="stop_sharing_my_location">Stop Sharing My Location</string>
|
||||
<string name="share_location_coordinates">Share Current Coordinates</string>
|
||||
<string name="share_location_live">Start Live Location Sharing</string>
|
||||
<!-- Settings general group in settings screen -->
|
||||
<string name="prefs_group_general">General settings</string>
|
||||
<!-- Settings information group in settings screen -->
|
||||
@@ -676,7 +679,7 @@
|
||||
<!-- Recommended length for CarPlay and Android Auto is around 25-27 characters -->
|
||||
<string name="avoid_ferry">Avoid ferries</string>
|
||||
<string name="avoid_motorways">Avoid freeways</string>
|
||||
<string name="avoid_steps">Avoid stairs</string>
|
||||
<string name="avoid_steps">Avoid steps</string>
|
||||
<string name="unable_to_calc_alert_title">Unable to calculate route</string>
|
||||
<string name="unable_to_calc_alert_subtitle">A route could not be found. This may be caused by your routing options or incomplete OpenStreetMap data. Please change your routing options and retry.</string>
|
||||
<string name="define_to_avoid_btn">Define roads to avoid</string>
|
||||
|
||||
41
android/app/src/main/res/values/strings_location_sharing.xml
Normal file
41
android/app/src/main/res/values/strings_location_sharing.xml
Normal file
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- Location Sharing -->
|
||||
<string name="location_sharing_title">Live Location Sharing</string>
|
||||
<string name="location_sharing_start">Start Sharing</string>
|
||||
<string name="location_sharing_stop">Stop Sharing</string>
|
||||
<string name="location_sharing_active">Sharing live location</string>
|
||||
<string name="location_sharing_status_active">Your location is being shared</string>
|
||||
<string name="location_sharing_status_inactive">Location sharing is not active</string>
|
||||
|
||||
<!-- Notification -->
|
||||
<string name="location_sharing_notification_text">Your live location is being shared</string>
|
||||
<string name="location_sharing_tap_to_view">Tap to view in app</string>
|
||||
<string name="location_sharing_eta">ETA: %s</string>
|
||||
<string name="location_sharing_remaining">remaining</string>
|
||||
<string name="location_sharing_accuracy">Accuracy: %s</string>
|
||||
<string name="location_sharing_accuracy_high">high</string>
|
||||
<string name="location_sharing_accuracy_medium">medium</string>
|
||||
<string name="location_sharing_accuracy_low">low</string>
|
||||
<string name="location_sharing_waiting_for_location">Waiting for location…</string>
|
||||
|
||||
<!-- Messages -->
|
||||
<string name="location_sharing_started">Location sharing started</string>
|
||||
<string name="location_sharing_stopped">Location sharing stopped</string>
|
||||
<string name="location_sharing_failed_to_start">Failed to start location sharing</string>
|
||||
<string name="location_sharing_url_copied">Share URL copied to clipboard</string>
|
||||
<string name="location_sharing_share_message">Follow my live location: %s</string>
|
||||
|
||||
<!-- Dialog -->
|
||||
<string name="location_sharing_description">Share your real-time location with end-to-end encryption. Only people with the link can view your location.</string>
|
||||
<string name="location_sharing_copy_url">Copy Link</string>
|
||||
<string name="location_sharing_share_url">Share Link</string>
|
||||
<!-- Using existing close string from main strings.xml -->
|
||||
|
||||
<!-- Settings -->
|
||||
<string name="pref_location_sharing_category">Live Location Sharing</string>
|
||||
<string name="pref_location_sharing_update_interval">Update interval</string>
|
||||
<string name="pref_location_sharing_update_interval_summary">How often to send location updates</string>
|
||||
<string name="pref_location_sharing_server_url">Server URL</string>
|
||||
<string name="pref_location_sharing_server_url_summary">Location sharing server endpoint</string>
|
||||
</resources>
|
||||
@@ -47,7 +47,7 @@
|
||||
|
||||
<item name="navNextTurnFrame">@drawable/bg_nav_next_turn</item>
|
||||
<item name="navNextNextTurnFrame">@drawable/bg_nav_next_next_turn</item>
|
||||
<item name="navLanesBackgroundColor">@color/bg_primary</item>
|
||||
<item name="navLanesBackgroundColor">@color/base_accent</item>
|
||||
<item name="navLaneArrowActiveColor">@color/nav_lane_arrow_active</item>
|
||||
<item name="navLaneArrowInactiveColor">@color/nav_lane_arrow_inactive</item>
|
||||
|
||||
|
||||
@@ -159,6 +159,27 @@
|
||||
</intent>
|
||||
</PreferenceScreen>
|
||||
</androidx.preference.PreferenceCategory>
|
||||
<androidx.preference.PreferenceCategory
|
||||
android:key="@string/pref_location_sharing_category"
|
||||
android:title="@string/location_sharing_title"
|
||||
android:order="5">
|
||||
<EditTextPreference
|
||||
android:key="@string/pref_location_sharing_server_url"
|
||||
android:title="@string/pref_location_sharing_server_url"
|
||||
app:singleLineTitle="false"
|
||||
android:summary="@string/pref_location_sharing_server_url_summary"
|
||||
android:defaultValue="https://live.organicmaps.app"
|
||||
android:order="1"/>
|
||||
<ListPreference
|
||||
android:key="@string/pref_location_sharing_update_interval"
|
||||
android:title="@string/pref_location_sharing_update_interval"
|
||||
app:singleLineTitle="false"
|
||||
android:summary="@string/pref_location_sharing_update_interval_summary"
|
||||
android:entries="@array/location_sharing_intervals"
|
||||
android:entryValues="@array/location_sharing_interval_values"
|
||||
android:defaultValue="20"
|
||||
android:order="2"/>
|
||||
</androidx.preference.PreferenceCategory>
|
||||
<androidx.preference.PreferenceCategory
|
||||
android:key="@string/pref_privacy"
|
||||
android:title="@string/privacy"
|
||||
|
||||
@@ -53,6 +53,7 @@ set(SRC
|
||||
app/organicmaps/sdk/editor/OpeningHours.cpp
|
||||
app/organicmaps/sdk/editor/OsmOAuth.cpp
|
||||
app/organicmaps/sdk/Framework.cpp
|
||||
app/organicmaps/location/LocationSharingJni.cpp
|
||||
app/organicmaps/sdk/isolines/IsolinesManager.cpp
|
||||
app/organicmaps/sdk/LocationState.cpp
|
||||
app/organicmaps/sdk/Map.cpp
|
||||
@@ -94,6 +95,7 @@ target_include_directories(${PROJECT_NAME} PRIVATE .)
|
||||
target_link_libraries(${PROJECT_NAME}
|
||||
# CoMaps libs
|
||||
map
|
||||
location_sharing
|
||||
# ge0
|
||||
# tracking
|
||||
# routing
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
#include "app/organicmaps/sdk/core/jni_helper.hpp"
|
||||
|
||||
#include "location_sharing/location_sharing_types.hpp"
|
||||
#include "location_sharing/crypto_util.hpp"
|
||||
|
||||
#include "base/logging.hpp"
|
||||
|
||||
#include <jni.h>
|
||||
|
||||
using namespace location_sharing;
|
||||
|
||||
extern "C"
|
||||
{
|
||||
|
||||
// Generate session credentials
|
||||
JNIEXPORT jobjectArray JNICALL
|
||||
Java_app_organicmaps_location_LocationSharingManager_nativeGenerateSessionCredentials(
|
||||
JNIEnv * env, jclass)
|
||||
{
|
||||
SessionCredentials creds = SessionCredentials::Generate();
|
||||
|
||||
// Create String array [sessionId, encryptionKey]
|
||||
jobjectArray result = env->NewObjectArray(2, env->FindClass("java/lang/String"), nullptr);
|
||||
if (!result)
|
||||
{
|
||||
LOG(LERROR, ("Failed to create result array"));
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
jstring sessionId = jni::ToJavaString(env, creds.sessionId);
|
||||
jstring encryptionKey = jni::ToJavaString(env, creds.encryptionKey);
|
||||
|
||||
env->SetObjectArrayElement(result, 0, sessionId);
|
||||
env->SetObjectArrayElement(result, 1, encryptionKey);
|
||||
|
||||
env->DeleteLocalRef(sessionId);
|
||||
env->DeleteLocalRef(encryptionKey);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// Generate share URL
|
||||
JNIEXPORT jstring JNICALL
|
||||
Java_app_organicmaps_location_LocationSharingManager_nativeGenerateShareUrl(
|
||||
JNIEnv * env, jclass, jstring jSessionId, jstring jEncryptionKey, jstring jServerBaseUrl)
|
||||
{
|
||||
std::string sessionId = jni::ToNativeString(env, jSessionId);
|
||||
std::string encryptionKey = jni::ToNativeString(env, jEncryptionKey);
|
||||
std::string serverBaseUrl = jni::ToNativeString(env, jServerBaseUrl);
|
||||
|
||||
SessionCredentials creds(sessionId, encryptionKey);
|
||||
std::string shareUrl = creds.GenerateShareUrl(serverBaseUrl);
|
||||
|
||||
return jni::ToJavaString(env, shareUrl);
|
||||
}
|
||||
|
||||
// Encrypt payload
|
||||
JNIEXPORT jstring JNICALL
|
||||
Java_app_organicmaps_location_LocationSharingManager_nativeEncryptPayload(
|
||||
JNIEnv * env, jclass, jstring jEncryptionKey, jstring jPayloadJson)
|
||||
{
|
||||
std::string encryptionKey = jni::ToNativeString(env, jEncryptionKey);
|
||||
std::string payloadJson = jni::ToNativeString(env, jPayloadJson);
|
||||
|
||||
auto encryptedOpt = crypto::EncryptAes256Gcm(encryptionKey, payloadJson);
|
||||
if (!encryptedOpt.has_value())
|
||||
{
|
||||
LOG(LERROR, ("Encryption failed"));
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::string resultJson = encryptedOpt->ToJson();
|
||||
return jni::ToJavaString(env, resultJson);
|
||||
}
|
||||
|
||||
} // extern "C"
|
||||
@@ -515,6 +515,46 @@ public final class Config
|
||||
}
|
||||
}
|
||||
|
||||
public static class LocationSharing
|
||||
{
|
||||
interface Keys
|
||||
{
|
||||
String SERVER_URL = "LocationSharingServerUrl";
|
||||
String UPDATE_INTERVAL = "LocationSharingUpdateInterval";
|
||||
}
|
||||
|
||||
public interface Defaults
|
||||
{
|
||||
String SERVER_URL = "https://live.organicmaps.app";
|
||||
int UPDATE_INTERVAL = 20; // seconds
|
||||
int UPDATE_INTERVAL_MIN = 5;
|
||||
int UPDATE_INTERVAL_MAX = 60;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static String getServerUrl()
|
||||
{
|
||||
return getString(Keys.SERVER_URL, Defaults.SERVER_URL);
|
||||
}
|
||||
|
||||
public static void setServerUrl(@NonNull String url)
|
||||
{
|
||||
setString(Keys.SERVER_URL, url);
|
||||
}
|
||||
|
||||
public static int getUpdateInterval()
|
||||
{
|
||||
return getInt(Keys.UPDATE_INTERVAL, Defaults.UPDATE_INTERVAL);
|
||||
}
|
||||
|
||||
public static void setUpdateInterval(int seconds)
|
||||
{
|
||||
if (seconds < Defaults.UPDATE_INTERVAL_MIN || seconds > Defaults.UPDATE_INTERVAL_MAX)
|
||||
seconds = Defaults.UPDATE_INTERVAL;
|
||||
setInt(Keys.UPDATE_INTERVAL, seconds);
|
||||
}
|
||||
}
|
||||
|
||||
private static native boolean nativeHasConfigValue(String name);
|
||||
private static native boolean nativeDeleteConfigValue(String name);
|
||||
private static native boolean nativeGetBoolean(String name, boolean defaultValue);
|
||||
|
||||
@@ -1259,19 +1259,4 @@
|
||||
<string name="type.barrier.cycle_barrier">Sykkelbarriere</string>
|
||||
<string name="type.highway.ladder">Stige</string>
|
||||
<string name="type.barrier.guard_rail">Autovern</string>
|
||||
<string name="type.piste_type.sled">Akebakke</string>
|
||||
<string name="type.piste_type.sled.area">Akebakke</string>
|
||||
<string name="type.man_made.pipeline">Rørledning</string>
|
||||
<string name="type.man_made.survey_point">Landmålingspunkt</string>
|
||||
<string name="type.man_made.cairn">Varde</string>
|
||||
<string name="type.man_made">Menneskeskapt</string>
|
||||
<string name="type.landuse.retail">Butikkområde</string>
|
||||
<string name="type.landuse.quarry">Steinbrudd</string>
|
||||
<string name="type.landuse.military">Militært område</string>
|
||||
<string name="type.landuse.industrial">Industriområde</string>
|
||||
<string name="type.barrier.retaining_wall">Støttemur</string>
|
||||
<string name="type.recycling.cartons">Kartonger</string>
|
||||
<string name="type.recycling.green_waste">Organisk avfall</string>
|
||||
<string name="type.recycling.cans">Bokser</string>
|
||||
<string name="type.recycling.cardboard">Papp</string>
|
||||
</resources>
|
||||
|
||||
@@ -431,6 +431,7 @@
|
||||
<string name="type.highway.pedestrian.area">Obszar deptaka</string>
|
||||
<!-- These translations are used for all type.highway.*.bridge. -->
|
||||
<string name="type.highway.pedestrian.bridge">Most dla pieszych</string>
|
||||
|
||||
<string name="type.highway.pedestrian.square">Plac</string>
|
||||
<!-- These translations are used for all type.highway.*.tunnel. -->
|
||||
<string name="type.highway.pedestrian.tunnel">Tunel dla pieszych</string>
|
||||
@@ -1394,7 +1395,4 @@
|
||||
<string name="type.amenity.ranger_station">Budynek obsługi parku</string>
|
||||
<string name="type.power.portal">Portal elektroenergetyczny</string>
|
||||
<string name="type.office.security">Biuro ochrony</string>
|
||||
<string name="type.shop.lighting">Sklep oświetleniowy</string>
|
||||
<string name="type.barrier.wicket_gate">Furtka</string>
|
||||
<string name="type.leisure.escape_game">Escape Room</string>
|
||||
</resources>
|
||||
|
||||
@@ -15,23 +15,23 @@
|
||||
<string name="type.amenity.bbq">Grătar</string>
|
||||
<string name="type.amenity.bench">Banchetă</string>
|
||||
<string name="type.amenity.bicycle_parking">Parcare biciclete</string>
|
||||
<string name="type.amenity.bicycle_rental">Închiriere biciclete</string>
|
||||
<string name="type.amenity.bicycle_rental">Închiriere de biciclete</string>
|
||||
<string name="type.amenity.biergarten">Berărie</string>
|
||||
<string name="type.amenity.brothel">Bordel</string>
|
||||
<string name="type.amenity.bureau_de_change">Schimb valutar</string>
|
||||
<string name="type.amenity.bus_station">Autogară</string>
|
||||
<string name="type.amenity.bus_station">Gara de autobuz</string>
|
||||
<string name="type.amenity.cafe">Cafenea</string>
|
||||
<string name="type.amenity.car_rental">Închiriere mașini</string>
|
||||
<string name="type.amenity.motorcycle_rental">Închiriere motociclete</string>
|
||||
<string name="type.amenity.car_wash">Spălătorie Auto</string>
|
||||
<string name="type.amenity.casino">Cazinou</string>
|
||||
<string name="type.amenity.casino">Casinou</string>
|
||||
<string name="type.amenity.gambling">Jocuri de noroc</string>
|
||||
<string name="type.leisure.adult_gaming_centre">Centru de jocuri pentru adulți</string>
|
||||
<string name="type.leisure.amusement_arcade">Arcadă</string>
|
||||
<string name="type.amenity.charging_station">Stație încărcare</string>
|
||||
<string name="type.amenity.charging_station.bicycle">Stație de încărcare pentru biciclete</string>
|
||||
<string name="type.amenity.charging_station.motorcar">Stație de încărcare autoturisme</string>
|
||||
<string name="type.amenity.childcare">Creșă</string>
|
||||
<string name="type.amenity.childcare">De îngrijire a copilului</string>
|
||||
<string name="type.leisure.bowling_alley">Popicărie</string>
|
||||
<string name="type.amenity.clinic">Clinică</string>
|
||||
<string name="type.amenity.college">Colegiu</string>
|
||||
@@ -1177,7 +1177,7 @@
|
||||
<string name="type.aeroway.runway">Pistă</string>
|
||||
<string name="type.aeroway.taxiway">Cale de rulare</string>
|
||||
<string name="type.aeroway.terminal">Terminal</string>
|
||||
<string name="type.amenity.bar">Bar</string>
|
||||
<string name="type.amenity.bar">Bară</string>
|
||||
<string name="type.amenity.bicycle_parking.covered">Parcare acoperită pentru biciclete</string>
|
||||
<string name="type.amenity.love_hotel">Hotel cu ora</string>
|
||||
<string name="type.amenity.studio">Garsonieră</string>
|
||||
|
||||
@@ -2,5 +2,4 @@
|
||||
<resources>
|
||||
<string name="core_my_position">Moj položaj</string>
|
||||
<string name="core_my_places">Moji kraji</string>
|
||||
<string name="gb">GB</string>
|
||||
</resources>
|
||||
|
||||
@@ -5,5 +5,4 @@
|
||||
<string name="type.addr_interpolation">Naslov/blok</string>
|
||||
<string name="type.aerialway.cable_car">Žičnica</string>
|
||||
<string name="type.cuisine.noodles">Nudli</string>
|
||||
<string name="type.addr_interpolation.even">Naslov/Blok</string>
|
||||
</resources>
|
||||
|
||||
@@ -101,13 +101,6 @@ if [ -z "$SKIP_MAP_DOWNLOAD" ]; then
|
||||
rm -f WorldCoasts.mwm; ln -s "$WORLD_PATH2" WorldCoasts.mwm
|
||||
fi
|
||||
|
||||
if [ ! -f "World.mwm" ]; then
|
||||
ln -s "$WORLD_PATH" World.mwm
|
||||
fi
|
||||
if [ ! -f "WorldCoasts.mwm" ]; then
|
||||
ln -s "$WORLD_PATH2" WorldCoasts.mwm
|
||||
fi
|
||||
|
||||
popd
|
||||
else
|
||||
echo "Skipping world map download..."
|
||||
@@ -115,7 +108,6 @@ fi
|
||||
|
||||
echo "Generating search categories / synonyms..."
|
||||
./tools/unix/generate_categories.sh
|
||||
./tools/unix/generate_cuisines.sh
|
||||
|
||||
if [ -z "$SKIP_GENERATE_SYMBOLS" ]; then
|
||||
if Diff data/symbols_hash data/styles/*/*/symbols/* || [ ! -z "$SYMBOLS_NOT_GENERATED" ]; then
|
||||
|
||||
@@ -463,6 +463,5 @@
|
||||
"shop-alcohol|@category_food|@shop": "Магазин за алкохол|4алкохол|5спиртни напитки|U+1F377",
|
||||
"shop-caravan|@category_rv|@shop": "Автокъща за кемпери|кемпери|каравани|къщи на колела",
|
||||
"leisure-dance|@category_entertainment": "Зала за танци|Танцово училище|Танцова школа|танци",
|
||||
"leisure-firepit": "4Огнище",
|
||||
"amenity-arts_centre|@category_tourism": "3Арт център|Център за изкуства"
|
||||
"leisure-firepit": "4Огнище"
|
||||
}
|
||||
|
||||
2933
data/categories_cuisines.txt
Normal file
2933
data/categories_cuisines.txt
Normal file
File diff suppressed because it is too large
Load Diff
@@ -146,11 +146,11 @@
|
||||
<p lang="uk"><strong>CoMaps</strong> був би неможливим без щедрої участі таких проектів:</p>
|
||||
|
||||
<ul class="license-list">
|
||||
<li><a href="https://agg.sourceforge.net/antigrain.com/index.html">Anti-Grain Geometry</a><br>© 2002–2005 Maxim Shemanarev; <a href="#agg-license" class="license">License</a></li>
|
||||
<li><a href="http://antigrain.com/">Anti-Grain Geometry</a><br>© 2002–2005 Maxim Shemanarev; <a href="#agg-license" class="license">License</a></li>
|
||||
|
||||
<li><a href="https://www.boost.org/">Boost</a>; <a href="#boost-license" class="license">Boost License</a></li>
|
||||
<li><a href="http://www.boost.org/">Boost</a>; <a href="#boost-license" class="license">Boost License</a></li>
|
||||
|
||||
<li><a href="https://www.daemonology.net/bsdiff/">bsdiff</a>; <a href="#bsd3-license" class="license">BSD License</a></li>
|
||||
<li><a href="http://www.daemonology.net/bsdiff/">bsdiff</a>; <a href="#bsd3-license" class="license">BSD License</a></li>
|
||||
|
||||
<li><a href="https://chromium.googlesource.com/chromium/src/courgette/">Chromium's Courgette</a>;
|
||||
<a href="#bsd3-license" class="license">BSD License</a></li>
|
||||
@@ -167,7 +167,7 @@
|
||||
<li><a href="https://github.com/thisistherk/fast_obj">fast_obj</a><br>
|
||||
© 2013 thisistherk; <a href="#mit-license" class="license">MIT License</a></li>
|
||||
|
||||
<li><a href="https://www.freetype.org">FreeType</a><br>
|
||||
<li><a href="http://www.freetype.org">FreeType</a><br>
|
||||
© 2013 The FreeType Project; <a href="#freetype-license" class="license">FTL</a></li>
|
||||
|
||||
<li><a href="https://stephenberry.github.io/glaze/">glaze</a><br>
|
||||
@@ -176,16 +176,16 @@
|
||||
<li><a href="https://www.glfw.org/">GLFW</a><br>
|
||||
© 2002-2006 Marcus Geelnard;2006-2019 Camilla Löwy; <a href="#zlib-license" class="license">Zlib License</a></li>
|
||||
|
||||
<li><a href="https://www.g-truc.net/project-0016.html">GLM</a><br>
|
||||
<li><a href="http://www.g-truc.net/project-0016.html">GLM</a><br>
|
||||
© 2005–2014 G-Truc Creation; <a href="#mit-license" class="license">MIT License</a></li>
|
||||
|
||||
<li><a href="https://site.icu-project.org/">ICU</a><br>
|
||||
<li><a href="http://site.icu-project.org/">ICU</a><br>
|
||||
© 1995–2016 IBM Corporation and others; <a href="#icu-license" class="license">ICU License</a></li>
|
||||
|
||||
<li><a href="https://www.digip.org/jansson/">Jansson</a><br>
|
||||
<li><a href="http://www.digip.org/jansson/">Jansson</a><br>
|
||||
© 2009-2013 Petri Lehtinen; <a href="#mit-license" class="license">MIT License</a></li>
|
||||
|
||||
<li><a href="https://libkdtree.alioth.debian.org/">libkdtree++</a><br>
|
||||
<li><a href="http://libkdtree.alioth.debian.org/">libkdtree++</a><br>
|
||||
© 2004-2007 Martin F. Krafft, parts are © 2004-2008 Paul Harris and © 2007-2008 Sylvain Bougerel; <a href="#artistic-license" class="license">Artistic License</a></li>
|
||||
|
||||
<li><a href="https://github.com/mapsme/omim">MAPS.ME</a><br>
|
||||
@@ -197,7 +197,7 @@
|
||||
<li><a href="https://github.com/google/protobuf">Protobuf</a><br>
|
||||
© 2014 Google Inc.; <a href="#bsd3-license" class="license">BSD License</a></li>
|
||||
|
||||
<li><a href="https://pugixml.org/">Pugixml</a><br>
|
||||
<li><a href="http://pugixml.org/">Pugixml</a><br>
|
||||
© 2006-2015 Arseny Kapoulkine; <a href="#mit-license" class="license">MIT License</a></li>
|
||||
|
||||
<li><a href="https://github.com/ot/succinct">succinct library</a><br>
|
||||
@@ -212,7 +212,7 @@
|
||||
<li><a href="https://github.com/googlesamples/android-vulkan-tutorials">Vulkan Wrapper</a><br>
|
||||
© 2016 Google Inc.; <a href="#apache2-license" class="license">Apache License</a></li>
|
||||
|
||||
<li class="android"><a href="https://cocosw.com/BottomSheet/">BottomSheet</a><br>
|
||||
<li class="android"><a href="http://cocosw.com/BottomSheet/">BottomSheet</a><br>
|
||||
© 2011, 2015 Kai Liao; <a href="#apache2-license" class="license">Apache License</a></li>
|
||||
|
||||
<li><a href="https://github.com/google/open-location-code">Open Location Code</a><br>
|
||||
@@ -282,22 +282,22 @@
|
||||
<p lang="uk">Ми також користувалися такими чудовими шрифтами для написів на карті:</p>
|
||||
|
||||
<ul class="license-list">
|
||||
<li><a href="https://fonts.google.com/specimen/Roboto">Roboto</a><br>
|
||||
<li><a href="https://www.google.com/fonts/specimen/Roboto">Roboto</a><br>
|
||||
© 2015 Christian Robertson; <a href="#apache2-license" class="license">Apache License</a></li>
|
||||
|
||||
<li><a href="https://www.droidfonts.com/droidfonts/">Droid Sans Fallback</a><br>
|
||||
<li><a href="http://www.droidfonts.com/droidfonts/">Droid Sans Fallback</a><br>
|
||||
© Ascender Corporation; <a href="#apache2-license" class="license">Apache License</a></li>
|
||||
|
||||
<li><a href="https://dejavu-fonts.org/">DejaVu Sans</a><br>
|
||||
<li><a href="http://dejavu-fonts.org/">DejaVu Sans</a><br>
|
||||
© 2003 Bitstream Inc., © 2006 Tavmjong Bah; <a href="#dejavufonts-license" class="license">License</a></li>
|
||||
|
||||
<li><a href="https://fonts.google.com/specimen/Jomolhari">Jomolhari</a><br>
|
||||
<li><a href="https://sites.google.com/site/chrisfynn2/home/fonts/jomolhari">Jomolhari</a><br>
|
||||
© Christopher Fynn; <a href="#sil-license" class="license">OFL</a></li>
|
||||
|
||||
<li><a href="https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=padauk">Padauk</a><br>
|
||||
<li><a href="http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=padauk">Padauk</a><br>
|
||||
© 2011 SIL International; <a href="#sil-license" class="license">OFL</a></li>
|
||||
|
||||
<li><a href="https://www.khmeros.info/en/fonts">Khmer OS</a><br>
|
||||
<li><a href="http://www.khmeros.info/en/fonts">Khmer OS</a><br>
|
||||
© 2005 Danh Hong, © 2005 Open Forum of Cambodia; <a href="#lgpl21-license" class="license">LGPL</a></li>
|
||||
|
||||
<li>Code2000 Font<br>
|
||||
@@ -312,7 +312,7 @@
|
||||
<li><a href="https://github.com/FortAwesome/Font-Awesome">Font Awesome Free</a><br>
|
||||
© 2021 Fonticons, Inc.; <a href="#cc-by-4" class="license">CC BY 4.0 License</a></li>
|
||||
|
||||
<li><a href="https://www.evericons.com/">Evericon</a><br>
|
||||
<li><a href="http://www.evericons.com/">Evericon</a><br>
|
||||
© 2018 Aleksey Popov; <a href="#cc0-1" class="license">CC0 1.0 Universal</a>.</li>
|
||||
|
||||
<li><a href="https://github.com/Remix-Design/remixicon">Remixicon</a><br>
|
||||
|
||||
@@ -1937,7 +1937,7 @@
|
||||
"Latvia Description":"Riia, Daugavpils, Liepāja",
|
||||
"Lebanon Description":"Beirut, Zaḩlah, Siidon",
|
||||
"Liberia Description":"Monrovia, Sanniquellie, Fish Town City",
|
||||
"Libya Description":"Tripoli, Benghazi, Mişrātah",
|
||||
"Libya Description":"Tripoli, Benghazi, Misrata",
|
||||
"Liechtenstein Description":"Vaduz, Schaan, Triesen",
|
||||
"Lithuania_East Description":"Vilnius, Kaunas, Alytus",
|
||||
"Lithuania_West Description":"Klaipėda, Šiauliai, Panevėžys",
|
||||
@@ -1946,7 +1946,7 @@
|
||||
"Madagascar Description":"Antananarivo, Toamasina, Fianarantsoa",
|
||||
"Malawi Description":"Lilongwe, Blantyre, Mzuzu",
|
||||
"Malaysia Description":"Kuala Lumpur, Petaling Jaya, Kota Kinabalu",
|
||||
"Maldives Description":"Malé, Feridhoo, Dhiggiri",
|
||||
"Maldives Description":"Feridhoo, Malé, Dhiggiri",
|
||||
"Mali Description":"Bamako, Koulikoro, Ségou",
|
||||
"Malta Description":"Valletta, Victoria, Zebbug",
|
||||
"Marshall Islands Description":"Majuro, Jelter, Ebeye",
|
||||
@@ -1958,27 +1958,27 @@
|
||||
"Mexico_Central_West Description":"Guadalajara, Aguascalientes, Zapopan",
|
||||
"Mexico_Chihuahua Description":"Ciudad Juárez, Chihuahua, Ciudad Acuña",
|
||||
"Mexico_East Description":"Mérida, Villahermosa, Cancún",
|
||||
"Mexico_Mexico Description":"México, Puebla, Cuautitlán Izcalli",
|
||||
"Mexico_Sonora Description":"Hermosillo, Ciudad Obregón, Nogales",
|
||||
"Mexico_Mexico Description":"Mexico City, Puebla, Cuautitlán Izcalli",
|
||||
"Mexico_Sonora Description":"Hermosillo, Ciudad Obregon, Heroica Nogales",
|
||||
"Mexico_South Description":"León, Querétaro, Acapulco",
|
||||
"Moldova Description":"Chișinău, Tiraspol, Bălți",
|
||||
"Monaco Description":"Monaco, Monaco",
|
||||
"Mongolia Description":"Ulaanbaatar, Hovd, Erdenet",
|
||||
"Montenegro Description":"Podgorica, Nikšić, Tuzi",
|
||||
"Mongolia Description":"Ulaanbaatar, Khovd, Erdenet",
|
||||
"Montenegro Description":"Podgorica, Niksic, Tuzi",
|
||||
"Montserrat Description":"Brades, Salem",
|
||||
"Morocco_Doukkala-Abda Description":"Casablanca, Marrakech, Safi",
|
||||
"Morocco_Rabat-Sale-Zemmour-Zaer Description":"Fès, Rabat, Salé",
|
||||
"Morocco_Southern Description":"Meknes, Agadir, Oujda",
|
||||
"Morocco_Western Sahara Description":"El Aaiún, Guelmim, Assa",
|
||||
"Morocco_Doukkala-Abda Description":"Casablanca, Marrakesh, Safi",
|
||||
"Morocco_Rabat-Sale-Zemmour-Zaer Description":"Fez, Rabat, Salé",
|
||||
"Morocco_Southern Description":"Meknès, Agadir, Oujda",
|
||||
"Morocco_Western Sahara Description":"Laayoune, Guelmim, Assa",
|
||||
"Mozambique Description":"Maputo, Matola, Praia de Bilene",
|
||||
"Myanmar Description":"Yangon, Naypyidaw, Mandalay",
|
||||
"Nagorno-Karabakh Description":"Xankəndi, Şuşa, Laçın",
|
||||
"Nagorno-Karabakh Description":"Khankendi, Shusha, Lachin",
|
||||
"Namibia Description":"Windhoek, Opuwo, Eenhana",
|
||||
"Nauru Description":"Yaren, Buada, Orro",
|
||||
"Nepal_Kathmandu Description":"Katmandu, Patan",
|
||||
"Nepal_Madhyamanchal Description":"Bharatpur, Birganj",
|
||||
"Nepal_Purwanchal Description":"Sarang Pada, Campa Bazzar, Kerkha Bazar",
|
||||
"Nepal_West Description":"Butwal, Pokhara, Nepalgunj",
|
||||
"Nepal_West Description":"Butwal, Pokhara, Nepalgunj Sub Metropolitan City",
|
||||
"Netherlands_Drenthe Description":"Assen, Emmen, Hoogeveen",
|
||||
"Netherlands_Flevoland Description":"Almere, Lelystad, Dronten",
|
||||
"Netherlands_Friesland Description":"Leeuwarden, Drachten, Sneek",
|
||||
@@ -2012,7 +2012,7 @@
|
||||
"Nigeria_North Description":"Kano, Maiduguri, Sokoto",
|
||||
"Nigeria_South Description":"Lagos, Ibadan, Abuja",
|
||||
"Niue Description":"Alofi, Liku, Lakepa",
|
||||
"North Korea Description":"Pyongyang, Hamhŭng, Namp'o",
|
||||
"North Korea Description":"Pyongyang, Hamhung, Nampo",
|
||||
"Norway_Central Description":"Oslo, Sandvika, Drammen",
|
||||
"Norway_Hedmark Description":"Brumunddal, Hamar, Elverum",
|
||||
"Norway_Hordaland Description":"Bergen, Leirvik, Vossevangen",
|
||||
@@ -2029,7 +2029,7 @@
|
||||
"Oman Description":"Muscat, Al Khasal, As Suwaiq",
|
||||
"Pakistan Description":"Karachi, Lahore, Faisalabad",
|
||||
"Palau Description":"Melekeok, Palau, Koror",
|
||||
"Palestine Description":"Gaza, Petlemm, Nablus",
|
||||
"Palestine Description":"Gaza, Modi'in Illit, Nablus",
|
||||
"Panama Description":"Panama, Santiago de Veraguas, Colón",
|
||||
"Papua New Guinea Description":"Port Moresby, Lae, Vanimo",
|
||||
"Paraguay Description":"Asuncion, San Lorenzo, Ciudad del Este",
|
||||
|
||||
@@ -646,7 +646,7 @@
|
||||
"Kingdom of Lesotho":"Лесото",
|
||||
"Kiribati":"Кирибати",
|
||||
"Kuwait":"Кувейт",
|
||||
"Kyrgyzstan":"Кыргызстан",
|
||||
"Kyrgyzstan":"Киргизия",
|
||||
"Laos":"Лаос",
|
||||
"Latvia":"Латвия",
|
||||
"Lebanon":"Ливан",
|
||||
@@ -1817,7 +1817,7 @@
|
||||
"Isle of Man Description":"Дуглас",
|
||||
"Israel Description":"Тель-Авив-Яффа, Герцлия, Модиин-Маккабим-Реут",
|
||||
"Italy_Abruzzo Description":"Пескара",
|
||||
"Italy_Aosta Valley Description":"Куарт, Аоста",
|
||||
"Italy_Aosta Valley Description":"Аоста, Аоста",
|
||||
"Italy_Apulia Description":"Бари, Таранто, Фоджа",
|
||||
"Italy_Basilicata Description":"Потенца, Матера",
|
||||
"Italy_Calabria Description":"Реджо-ди-Калабрия, Катандзаро, Козенца",
|
||||
@@ -1839,21 +1839,21 @@
|
||||
"Italy_Liguria Description":"Генуя, Специя, Специя",
|
||||
"Italy_Lombardy_Bergamo Description":"Бергамо",
|
||||
"Italy_Lombardy_Brescia Description":"Бреша",
|
||||
"Italy_Lombardy_Como Description":"Комо, Канту",
|
||||
"Italy_Lombardy_Cremona Description":"Кремона, Трескоре-Кремаско",
|
||||
"Italy_Lombardy_Como Description":"Комо, Комо",
|
||||
"Italy_Lombardy_Cremona Description":"Кремона, Кремона",
|
||||
"Italy_Lombardy_Lecco Description":"Лекко",
|
||||
"Italy_Lombardy_Lodi Description":"Лоди",
|
||||
"Italy_Lombardy_Mantua Description":"Мантуя, Судзара",
|
||||
"Italy_Lombardy_Mantua Description":"Мантуя, Мантуя",
|
||||
"Italy_Lombardy_Milan Description":"Милан",
|
||||
"Italy_Lombardy_Monza and Brianza Description":"Монца",
|
||||
"Italy_Lombardy_Pavia Description":"Павия",
|
||||
"Italy_Lombardy_Sondrio Description":"Сондрио, Морбеньо",
|
||||
"Italy_Lombardy_Sondrio Description":"Сондрио, Сондрио",
|
||||
"Italy_Lombardy_Varese Description":"Бусто-Арсицио, Варезе",
|
||||
"Italy_Marche Description":"Анкона, Пезаро",
|
||||
"Italy_Molise Description":"Кампобассо",
|
||||
"Italy_Piemont_Alessandria Description":"Алессандрия, Нови-Лигуре",
|
||||
"Italy_Piemont_Asti Description":"Асти",
|
||||
"Italy_Piemont_Biella Description":"Бьелла, Коссато",
|
||||
"Italy_Piemont_Biella Description":"Бьелла",
|
||||
"Italy_Piemont_Cuneo Description":"Кунео",
|
||||
"Italy_Piemont_Novara Description":"Новара",
|
||||
"Italy_Piemont_Torino Description":"Турин, Риволи",
|
||||
@@ -1975,7 +1975,7 @@
|
||||
"Nagorno-Karabakh Description":"Ханкенди, Шуша, Лачин",
|
||||
"Namibia Description":"Виндхук, Опуво, Ээнхана",
|
||||
"Nauru Description":"Yaren, Buada, Orro",
|
||||
"Nepal_Kathmandu Description":"Катманду, Патан",
|
||||
"Nepal_Kathmandu Description":"Катманду, Катманду",
|
||||
"Nepal_Madhyamanchal Description":"Бхаратпур, Биргандж",
|
||||
"Nepal_Purwanchal Description":"Sarang pada, Campa bazzar, Kerkha bajar",
|
||||
"Nepal_West Description":"Покхара",
|
||||
@@ -2330,7 +2330,7 @@
|
||||
"US_Georgia_Macon Description":"Grovetown, Perry, Byron",
|
||||
"US_Georgia_North Description":"Emerson, Jefferson, Cartersville",
|
||||
"US_Georgia_South Description":"De Soto, Santa Claus, Pearson",
|
||||
"US_Guam Description":"Dededo Flea Market, Tumon Golf Driving Range, San José",
|
||||
"US_Guam Description":"Dededo Flea (Market), Tumon Golf Driving Range, San José",
|
||||
"US_Hawaii Description":"Хило",
|
||||
"US_Idaho_North Description":"Huetter, Peck, Hayden",
|
||||
"US_Idaho_South Description":"Arco, Middleton, Greenleaf",
|
||||
@@ -2470,7 +2470,7 @@
|
||||
"Ukraine_Rivne Oblast Description":"Ровно, Вараш (Кузнецовск), Дубно",
|
||||
"Ukraine_Sumy Oblast Description":"Сумы, Конотоп, Шостка",
|
||||
"Ukraine_Ternopil Oblast Description":"Тернополь, Чортков, Кременец",
|
||||
"Ukraine_Vinnytsia Oblast Description":"Винница, Ворошиловка, Жмеринка",
|
||||
"Ukraine_Vinnytsia Oblast Description":"Винница, Жмеринка",
|
||||
"Ukraine_Volyn Oblast Description":"Луцк, Ковель, Нововолынск",
|
||||
"Ukraine_Zakarpattia Oblast Description":"Ужгород, Мукачево, Хуст",
|
||||
"Ukraine_Zaporizhia Oblast Description":"Запорожье, Мелитополь, Бердянск",
|
||||
|
||||
@@ -568,8 +568,8 @@
|
||||
"Italy_Sardinia":"Sardinien",
|
||||
"Italy_Sicily":"Sicilien",
|
||||
"Italy_Trentino-Alto Adige Sudtirol":"Trentino-Alto Adige",
|
||||
"Italy_Tuscany_Grosseto":"Toscana — Sydost",
|
||||
"Italy_Tuscany_Massa e Carrara":"Toscana — Nordost",
|
||||
"Italy_Tuscany_Grosseto":"Toscana — Grosseto",
|
||||
"Italy_Tuscany_Massa e Carrara":"Toscana — Massa-Carrara",
|
||||
"Italy_Umbria":"Umbrien",
|
||||
"Italy_Veneto":"Veneto",
|
||||
"Italy_Veneto_Belluno":"Belluno",
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"@fastfood": "وجبا",
|
||||
"cuisine-bagel": "كعك بولندي",
|
||||
"cuisine-breakfast": "فطور",
|
||||
"cuisine-burger|@fastfood": "برغر",
|
||||
"cuisine-cake": "كيك",
|
||||
"cuisine-coffee_shop": "ﺓﻮﻬﻗ",
|
||||
"cuisine-curry": "كاري",
|
||||
"cuisine-diner": "العشاء",
|
||||
"cuisine-donut": "الكعك المحلاة",
|
||||
"cuisine-fish_and_chips": "سمك و رقائق البطاطس",
|
||||
"cuisine-friture|@fastfood": "وجبات سريعة",
|
||||
"cuisine-grill": "شواء",
|
||||
"cuisine-hotdog|@fastfood": "هوت دوغ",
|
||||
"cuisine-ice_cream": "مُثَلّجات",
|
||||
"cuisine-kebab|@fastfood": "كباب",
|
||||
"cuisine-noodles": "الشعرية",
|
||||
"cuisine-pancake|cuisine-crepe": "بان كيك|كريب",
|
||||
"cuisine-pasta": "مَعْكَرُونَة",
|
||||
"cuisine-pizza|@fastfood": "بيتزا",
|
||||
"cuisine-ramen": "حساء رامن",
|
||||
"cuisine-sandwich|@fastfood": "ساندوتش",
|
||||
"cuisine-sausage|@fastfood": "سجق",
|
||||
"cuisine-seafood|cuisine-fish": "مأكولات بحرية|سمك",
|
||||
"cuisine-soba": "سوبا",
|
||||
"cuisine-steak_house": "شرائح اللحم",
|
||||
"cuisine-sushi": "سوشي",
|
||||
"cuisine-tapas": "تاباس",
|
||||
"cuisine-tea": "شاي",
|
||||
"cuisine-vegetarian": "مطبخ نباتي",
|
||||
"cuisine-vegan": "مطبخ نباتي"
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"cuisine-bubble_tea": "Чай з бурбалкамі",
|
||||
"cuisine-hotdog|@fastfood": "Хот-доги|хотдог",
|
||||
"cuisine-ice_cream": "Кафе-марозіва",
|
||||
"cuisine-kebab|@fastfood": "Кебабы|кебаб|шаурма",
|
||||
"cuisine-pancake|cuisine-crepe": "Бліны|панкейкі",
|
||||
"cuisine-seafood|cuisine-fish": "Морапрадукты|рыба|рыбны",
|
||||
"cuisine-vegetarian": "Вегетарыянская кухня",
|
||||
"cuisine-vegan": "Веганская кухня|Вегетарыянская кухня"
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Бързо хранене",
|
||||
"cuisine-bagel": "Бейгъл|бейгъли",
|
||||
"cuisine-breakfast": "Закуска",
|
||||
"cuisine-burger|@fastfood": "Бургер",
|
||||
"cuisine-cake": "Торта|пекарна",
|
||||
"cuisine-coffee_shop": "Кафе|кафене",
|
||||
"cuisine-curry": "Къри",
|
||||
"cuisine-diner": "Крайпътен ресторант",
|
||||
"cuisine-donut": "Понички",
|
||||
"cuisine-fish_and_chips": "Фиш енд чипс",
|
||||
"cuisine-friture|@fastfood": "Пържено",
|
||||
"cuisine-grill": "Грил",
|
||||
"cuisine-hotdog|@fastfood": "Хотдог",
|
||||
"cuisine-ice_cream": "Сладолед",
|
||||
"cuisine-kebab|@fastfood": "Кебап",
|
||||
"cuisine-noodles": "Нудъли|Юфка",
|
||||
"cuisine-pancake|cuisine-crepe": "Палачинка",
|
||||
"cuisine-pasta": "Паста",
|
||||
"cuisine-pizza|@fastfood": "Пица|пицария",
|
||||
"cuisine-ramen": "Рамен",
|
||||
"cuisine-sandwich|@fastfood": "Сандвич",
|
||||
"cuisine-sausage|@fastfood": "Наденица",
|
||||
"cuisine-seafood|cuisine-fish": "Морска храна|морски дарове|риба",
|
||||
"cuisine-soba": "Соба",
|
||||
"cuisine-steak_house": "Пържоли",
|
||||
"cuisine-sushi": "Суши",
|
||||
"cuisine-tapas": "Тапас",
|
||||
"cuisine-tea": "Чай",
|
||||
"cuisine-vegetarian": "Вегетарианско",
|
||||
"cuisine-vegan": "Веганско|Вегетарианско"
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Rychlé občerstvení",
|
||||
"cuisine-bagel": "Bagel",
|
||||
"cuisine-breakfast": "Snídaně",
|
||||
"cuisine-burger|@fastfood": "Burger",
|
||||
"cuisine-cake": "Dort",
|
||||
"cuisine-coffee_shop": "Káva",
|
||||
"cuisine-curry": "Kari",
|
||||
"cuisine-diner": "Večeře",
|
||||
"cuisine-donut": "Kobliha",
|
||||
"cuisine-fish_and_chips": "Ryba a hranolky",
|
||||
"cuisine-friture|@fastfood": "Smažené pokrmy",
|
||||
"cuisine-grill": "Gril",
|
||||
"cuisine-hotdog|@fastfood": "Hot dog",
|
||||
"cuisine-ice_cream": "Zmrzlina",
|
||||
"cuisine-kebab|@fastfood": "Kebab",
|
||||
"cuisine-noodles": "Nudle",
|
||||
"cuisine-pancake|cuisine-crepe": "Palačinka|Crêpe",
|
||||
"cuisine-pasta": "Těstoviny",
|
||||
"cuisine-pizza|@fastfood": "Pizza",
|
||||
"cuisine-ramen": "Ramen",
|
||||
"cuisine-sandwich|@fastfood": "Sendvič",
|
||||
"cuisine-sausage|@fastfood": "Klobása",
|
||||
"cuisine-seafood|cuisine-fish": "Mořské plody|Ryba",
|
||||
"cuisine-soba": "Soba",
|
||||
"cuisine-steak_house": "Steaková restaurace",
|
||||
"cuisine-sushi": "Suši",
|
||||
"cuisine-tapas": "Tapas",
|
||||
"cuisine-tea": "Čaj",
|
||||
"cuisine-vegetarian": "Vegetariánská kuchyně",
|
||||
"cuisine-vegan": "Veganská kuchyně|Vegetariánská kuchyně"
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Fastfood",
|
||||
"cuisine-bagel": "Bagels",
|
||||
"cuisine-breakfast": "Morgenmad",
|
||||
"cuisine-burger|@fastfood": "Burger",
|
||||
"cuisine-cake": "Kager",
|
||||
"cuisine-coffee_shop": "Kaffe",
|
||||
"cuisine-curry": "Karryretter",
|
||||
"cuisine-diner": "Diner",
|
||||
"cuisine-donut": "Donuts",
|
||||
"cuisine-fish_and_chips": "Fish and chips",
|
||||
"cuisine-friture|@fastfood": "Friture",
|
||||
"cuisine-grill": "Grill",
|
||||
"cuisine-hotdog|@fastfood": "Hotdogs",
|
||||
"cuisine-ice_cream": "Is",
|
||||
"cuisine-kebab|@fastfood": "Kebab",
|
||||
"cuisine-noodles": "Nudler",
|
||||
"cuisine-pancake|cuisine-crepe": "Pandekager|Crepes",
|
||||
"cuisine-pasta": "Pasta",
|
||||
"cuisine-pizza|@fastfood": "Pizza",
|
||||
"cuisine-ramen": "Ramen",
|
||||
"cuisine-sandwich|@fastfood": "Sandwich",
|
||||
"cuisine-sausage|@fastfood": "Pølser",
|
||||
"cuisine-seafood|cuisine-fish": "Fisk og skaldyr|Fisk",
|
||||
"cuisine-soba": "Soba",
|
||||
"cuisine-steak_house": "Steakhouse",
|
||||
"cuisine-sushi": "Sushi",
|
||||
"cuisine-tapas": "Tapas",
|
||||
"cuisine-tea": "Te",
|
||||
"cuisine-vegetarian": "Vegetarretter",
|
||||
"cuisine-vegan": "Vegansk|Vegetarretter"
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Fast-Food",
|
||||
"cuisine-bagel": "Bagel",
|
||||
"cuisine-breakfast": "Frühstück",
|
||||
"cuisine-burger|@fastfood": "Burger|Hamburger",
|
||||
"cuisine-cake": "Kuchen|Bäckerei",
|
||||
"cuisine-coffee_shop": "Kaffee",
|
||||
"cuisine-curry": "Curry",
|
||||
"cuisine-diner": "Diner",
|
||||
"cuisine-donut": "Donuts",
|
||||
"cuisine-fish_and_chips": "Fish and Chips",
|
||||
"cuisine-friture|@fastfood": "Friterie",
|
||||
"cuisine-grill": "Grill",
|
||||
"cuisine-hotdog|@fastfood": "Hotdog",
|
||||
"cuisine-ice_cream": "Eis",
|
||||
"cuisine-kebab|@fastfood": "Kebab",
|
||||
"cuisine-noodles": "Nudeln",
|
||||
"cuisine-pancake|cuisine-crepe": "Pfannkuchen|Crêpe",
|
||||
"cuisine-pasta": "Pasta",
|
||||
"cuisine-pizza|@fastfood": "Pizza",
|
||||
"cuisine-ramen": "Ramen",
|
||||
"cuisine-sandwich|@fastfood": "Sandwich",
|
||||
"cuisine-sausage|@fastfood": "Wurst",
|
||||
"cuisine-seafood|cuisine-fish": "Meeresfrüchte|Fisch",
|
||||
"cuisine-soba": "Soba",
|
||||
"cuisine-steak_house": "Steakhaus",
|
||||
"cuisine-sushi": "Sushi",
|
||||
"cuisine-tapas": "Tapas",
|
||||
"cuisine-tea": "Tee",
|
||||
"cuisine-vegetarian": "Vegetarische Küche",
|
||||
"cuisine-vegan": "Vegane Küche|Vegetarische Küche"
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Ταχυφαγίο",
|
||||
"cuisine-bagel": "Κουλούρι|Μπάγκελ",
|
||||
"cuisine-breakfast": "Πρωινό",
|
||||
"cuisine-burger|@fastfood": "Μπιφτέκι|Χάμπουργκερ",
|
||||
"cuisine-cake": "Κέικ|αρτοποιείο",
|
||||
"cuisine-coffee_shop": "Καφές|καφενείο",
|
||||
"cuisine-curry": "Κάρι",
|
||||
"cuisine-diner": "Μικροεστιατόριο",
|
||||
"cuisine-donut": "Ντόνατ",
|
||||
"cuisine-fish_and_chips": "Ψάρια και πατάτες",
|
||||
"cuisine-friture|@fastfood": "Τηγανητά",
|
||||
"cuisine-grill": "Ψησταριά",
|
||||
"cuisine-hotdog|@fastfood": "Χοτ Ντογκ",
|
||||
"cuisine-ice_cream": "Παγωτό",
|
||||
"cuisine-kebab|@fastfood": "Κεμπάπ",
|
||||
"cuisine-noodles": "Μακαρόνια|Ζυμαρικά",
|
||||
"cuisine-pancake|cuisine-crepe": "Τηγανίτα|Κρέπα",
|
||||
"cuisine-pasta": "Ζυμαρικά|Πάστα",
|
||||
"cuisine-pizza|@fastfood": "Πίτσα",
|
||||
"cuisine-ramen": "Ράμεν",
|
||||
"cuisine-sandwich|@fastfood": "Σάντουιτς",
|
||||
"cuisine-sausage|@fastfood": "Λουκάνικο",
|
||||
"cuisine-seafood|cuisine-fish": "Θαλασσινά|Ψάρια",
|
||||
"cuisine-soba": "Σόμπα (λεπτά μακαρόνια)",
|
||||
"cuisine-steak_house": "Μπριζολάδικο",
|
||||
"cuisine-sushi": "Σούσι",
|
||||
"cuisine-tapas": "Τάπας",
|
||||
"cuisine-tea": "Τσάι",
|
||||
"cuisine-vegetarian": "Χορτοφαγική",
|
||||
"cuisine-vegan": "Για χορτοφάγους|Χορτοφαγική"
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Fast Food",
|
||||
"cuisine-bagel": "Bagel|bagels",
|
||||
"cuisine-breakfast": "Breakfast",
|
||||
"cuisine-burger|@fastfood": "Burger",
|
||||
"cuisine-bubble_tea": "Bubble Tea|boba tea",
|
||||
"cuisine-cake": "Cake|bakery",
|
||||
"cuisine-coffee_shop": "Coffee|coffee shop",
|
||||
"cuisine-curry": "Curry",
|
||||
"cuisine-diner": "Diner",
|
||||
"cuisine-donut": "Donuts",
|
||||
"cuisine-fish_and_chips": "Fish and Chips",
|
||||
"cuisine-friture|@fastfood": "Friture",
|
||||
"cuisine-grill": "Grill",
|
||||
"cuisine-hotdog|@fastfood": "Hotdog|hot dog",
|
||||
"cuisine-ice_cream": "Ice Cream|gelato",
|
||||
"cuisine-kebab|@fastfood": "Kebab",
|
||||
"cuisine-noodles": "Noodles",
|
||||
"cuisine-pancake|cuisine-crepe": "Pancake|pancakes|crepes|crepe",
|
||||
"cuisine-pasta": "Pasta",
|
||||
"cuisine-pizza|@fastfood": "Pizza|pizzeria",
|
||||
"cuisine-ramen": "Ramen",
|
||||
"cuisine-sandwich|@fastfood": "Sandwich",
|
||||
"cuisine-sausage|@fastfood": "Sausage",
|
||||
"cuisine-seafood|cuisine-fish": "Seafood|fish",
|
||||
"cuisine-soba": "Soba",
|
||||
"cuisine-steak_house": "Steak House",
|
||||
"cuisine-sushi": "Sushi",
|
||||
"cuisine-tapas": "Tapas",
|
||||
"cuisine-tea": "Tea",
|
||||
"cuisine-vegetarian": "Vegetarian",
|
||||
"cuisine-vegan": "Vegan|Vegetarian|veg cafe"
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Comida rápida",
|
||||
"cuisine-bagel": "Bágel",
|
||||
"cuisine-breakfast": "Desayunos",
|
||||
"cuisine-burger|@fastfood": "Hamburguesas",
|
||||
"cuisine-bubble_tea": "Té de burbujas",
|
||||
"cuisine-cake": "Tartas",
|
||||
"cuisine-coffee_shop": "Café",
|
||||
"cuisine-curry": "Curri",
|
||||
"cuisine-diner": "Cena",
|
||||
"cuisine-donut": "Rosquillas",
|
||||
"cuisine-fish_and_chips": "Pescado rebozado con patatas",
|
||||
"cuisine-friture|@fastfood": "Frituras",
|
||||
"cuisine-grill": "Parrilla",
|
||||
"cuisine-hotdog|@fastfood": "Perritos calientes",
|
||||
"cuisine-ice_cream": "Helados",
|
||||
"cuisine-kebab|@fastfood": "Kebabs",
|
||||
"cuisine-noodles": "Tallarines",
|
||||
"cuisine-pancake|cuisine-crepe": "Tortitas|Crepes",
|
||||
"cuisine-pasta": "Pastas",
|
||||
"cuisine-pizza|@fastfood": "Pizzas",
|
||||
"cuisine-ramen": "Ramen",
|
||||
"cuisine-sandwich|@fastfood": "Sándwiches",
|
||||
"cuisine-sausage|@fastfood": "Salchichas",
|
||||
"cuisine-seafood|cuisine-fish": "Mariscos|Pescados",
|
||||
"cuisine-soba": "Soba",
|
||||
"cuisine-steak_house": "Asador",
|
||||
"cuisine-sushi": "Sushi",
|
||||
"cuisine-tapas": "Tapas",
|
||||
"cuisine-tea": "Té",
|
||||
"cuisine-vegetarian": "Cocina vegetariana",
|
||||
"cuisine-vegan": "Cocina vegana|Cocina vegetariana"
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Janari azkarra",
|
||||
"cuisine-bagel": "Bagel",
|
||||
"cuisine-breakfast": "Gosariak",
|
||||
"cuisine-burger|@fastfood": "Hanburgesak",
|
||||
"cuisine-bubble_tea": "Burbuila tea",
|
||||
"cuisine-cake": "Pastelak",
|
||||
"cuisine-coffee_shop": "Kafea",
|
||||
"cuisine-curry": "Curry",
|
||||
"cuisine-diner": "Afaria",
|
||||
"cuisine-donut": "Donutsak",
|
||||
"cuisine-fish_and_chips": "Arrain arrautza patatekin",
|
||||
"cuisine-friture|@fastfood": "Frijituak",
|
||||
"cuisine-grill": "Erretegia",
|
||||
"cuisine-hotdog|@fastfood": "Txakur beroak",
|
||||
"cuisine-ice_cream": "Izozkiak",
|
||||
"cuisine-kebab|@fastfood": "Kebabak",
|
||||
"cuisine-noodles": "Fideoak",
|
||||
"cuisine-pancake|cuisine-crepe": "Krepeak",
|
||||
"cuisine-pasta": "Pasta",
|
||||
"cuisine-pizza|@fastfood": "Pizza",
|
||||
"cuisine-ramen": "Ramen",
|
||||
"cuisine-sandwich|@fastfood": "Ogitartekoak",
|
||||
"cuisine-sausage|@fastfood": "Saltxitxak",
|
||||
"cuisine-seafood|cuisine-fish": "Itsaskia|Arraina",
|
||||
"cuisine-soba": "Soba",
|
||||
"cuisine-steak_house": "Txu",
|
||||
"cuisine-sushi": "Sushia",
|
||||
"cuisine-tapas": "Txapelak",
|
||||
"cuisine-tea": "Tea",
|
||||
"cuisine-vegetarian": "Sukaldaritza begetarianoa",
|
||||
"cuisine-vegan": "Sukaldaritza beganoa|Sukaldaritza begetarianoa"
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"@fastfood": "غذای حاضری"
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Pikaruokala",
|
||||
"cuisine-bagel": "Bagel",
|
||||
"cuisine-breakfast": "Aamiainen",
|
||||
"cuisine-burger|@fastfood": "Hampurilainen",
|
||||
"cuisine-cake": "Kakku",
|
||||
"cuisine-coffee_shop": "Kahvi",
|
||||
"cuisine-curry": "Curry",
|
||||
"cuisine-diner": "Lounaskahvila",
|
||||
"cuisine-donut": "Donitsi",
|
||||
"cuisine-fish_and_chips": "Fish & chips",
|
||||
"cuisine-friture|@fastfood": "Uppopaistettu",
|
||||
"cuisine-grill": "Grilli",
|
||||
"cuisine-hotdog|@fastfood": "Hotdog",
|
||||
"cuisine-ice_cream": "Jäätelö",
|
||||
"cuisine-kebab|@fastfood": "Kebab",
|
||||
"cuisine-noodles": "Nuudeli",
|
||||
"cuisine-pancake|cuisine-crepe": "Lettu|Kreppi",
|
||||
"cuisine-pasta": "Pasta",
|
||||
"cuisine-pizza|@fastfood": "Pitsa",
|
||||
"cuisine-ramen": "Ramen",
|
||||
"cuisine-sandwich|@fastfood": "Voileipä",
|
||||
"cuisine-sausage|@fastfood": "Makkara",
|
||||
"cuisine-seafood|cuisine-fish": "Meren elävät|Kala",
|
||||
"cuisine-soba": "Sobanuudeli",
|
||||
"cuisine-steak_house": "Pihviravintola",
|
||||
"cuisine-sushi": "Sushi",
|
||||
"cuisine-tapas": "Tapas",
|
||||
"cuisine-tea": "Tee",
|
||||
"cuisine-vegetarian": "Kasvis keittiö",
|
||||
"cuisine-vegan": "Vegaani keittiö|Kasvis keittiö"
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Restauration rapide",
|
||||
"cuisine-bagel": "Bagel",
|
||||
"cuisine-breakfast": "Petit déjeuner",
|
||||
"cuisine-burger|@fastfood": "Hamburger",
|
||||
"cuisine-bubble_tea": "Thé aux perles",
|
||||
"cuisine-cake": "Gâteau",
|
||||
"cuisine-coffee_shop": "Café",
|
||||
"cuisine-curry": "Curry",
|
||||
"cuisine-diner": "Diner américain",
|
||||
"cuisine-donut": "Donuts",
|
||||
"cuisine-fish_and_chips": "Fish and chips",
|
||||
"cuisine-friture|@fastfood": "Friterie",
|
||||
"cuisine-grill": "Grill",
|
||||
"cuisine-hotdog|@fastfood": "Hot-dog",
|
||||
"cuisine-ice_cream": "Crème glacée",
|
||||
"cuisine-kebab|@fastfood": "Kebab",
|
||||
"cuisine-noodles": "Nouilles",
|
||||
"cuisine-pancake|cuisine-crepe": "Crêpe",
|
||||
"cuisine-pasta": "Pâtes",
|
||||
"cuisine-pizza|@fastfood": "Pizza",
|
||||
"cuisine-ramen": "Râmen",
|
||||
"cuisine-sandwich|@fastfood": "Sandwich",
|
||||
"cuisine-sausage|@fastfood": "Saucisse",
|
||||
"cuisine-seafood|cuisine-fish": "Fruits de mer|Poisson",
|
||||
"cuisine-soba": "Soba",
|
||||
"cuisine-steak_house": "Grillades",
|
||||
"cuisine-sushi": "Sushi",
|
||||
"cuisine-tapas": "Tapas",
|
||||
"cuisine-tea": "Thé",
|
||||
"cuisine-vegetarian": "Cuisine végétarienne",
|
||||
"cuisine-vegan": "Cuisine végétalienne|Cuisine végétarienne"
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
{
|
||||
"cuisine-bagel": "בייגל",
|
||||
"cuisine-breakfast": "ארוחת בוקר",
|
||||
"cuisine-burger|@fastfood": "המבורגר",
|
||||
"cuisine-cake": "עוגה",
|
||||
"cuisine-coffee_shop": "הֶפָק",
|
||||
"cuisine-curry": "קארי",
|
||||
"cuisine-diner": "דיינר",
|
||||
"cuisine-donut": "דונאט",
|
||||
"cuisine-fish_and_chips": "פיש אנד צ'יפס",
|
||||
"cuisine-friture|@fastfood": "פריטורה",
|
||||
"cuisine-grill": "גריל",
|
||||
"cuisine-hotdog|@fastfood": "נקניקיה",
|
||||
"cuisine-ice_cream": "גלידה",
|
||||
"cuisine-kebab|@fastfood": "קבב",
|
||||
"cuisine-noodles": "אטריות",
|
||||
"cuisine-pancake|cuisine-crepe": "פנקייק|קרפ",
|
||||
"cuisine-pasta": "פסטה",
|
||||
"cuisine-pizza|@fastfood": "פיצה",
|
||||
"cuisine-ramen": "ראמן",
|
||||
"cuisine-sandwich|@fastfood": "סנדוויץ'",
|
||||
"cuisine-sausage|@fastfood": "נקניק",
|
||||
"cuisine-seafood|cuisine-fish": "מאכלי ים|דגים",
|
||||
"cuisine-soba": "אטריות סובה",
|
||||
"cuisine-steak_house": "סטייקיה",
|
||||
"cuisine-sushi": "סושי",
|
||||
"cuisine-tapas": "טאפאס",
|
||||
"cuisine-tea": "תה",
|
||||
"cuisine-vegetarian": "מטבח טבעוני",
|
||||
"cuisine-vegan": "מטבח טבעוני|מטבח צמחוני"
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
{
|
||||
"@fastfood": "फास्ट फूड",
|
||||
"cuisine-bagel": "बैगल",
|
||||
"cuisine-breakfast": "नाश्ता",
|
||||
"cuisine-burger|@fastfood": "बर्गर",
|
||||
"cuisine-bubble_tea": "बुलबुले वाली चाय",
|
||||
"cuisine-cake": "केक",
|
||||
"cuisine-coffee_shop": "कॉफ़ी",
|
||||
"cuisine-curry": "करी",
|
||||
"cuisine-diner": "भोजन",
|
||||
"cuisine-donut": "डोनट",
|
||||
"cuisine-fish_and_chips": "मछली और चिप्स",
|
||||
"cuisine-friture|@fastfood": "पकोड़े",
|
||||
"cuisine-grill": "ग्रिल",
|
||||
"cuisine-hotdog|@fastfood": "हॉट-डॉग",
|
||||
"cuisine-ice_cream": "आइसक्रीम",
|
||||
"cuisine-kebab|@fastfood": "कबाब",
|
||||
"cuisine-noodles": "नूडल्स",
|
||||
"cuisine-pancake|cuisine-crepe": "पैनकेक",
|
||||
"cuisine-pasta": "पास्ता",
|
||||
"cuisine-pizza|@fastfood": "पिज़्ज़ा",
|
||||
"cuisine-sandwich|@fastfood": "सैंडविच",
|
||||
"cuisine-sausage|@fastfood": "सॉसेज",
|
||||
"cuisine-seafood|cuisine-fish": "समुद्री भोजन|मछली",
|
||||
"cuisine-soba": "सोबा",
|
||||
"cuisine-steak_house": "स्टेक (माँस का कबाब)",
|
||||
"cuisine-sushi": "सुशी",
|
||||
"cuisine-tapas": "तापा",
|
||||
"cuisine-tea": "चाय",
|
||||
"cuisine-vegan": "शाकाहारी"
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Gyorsétterem",
|
||||
"cuisine-bagel": "Bagel",
|
||||
"cuisine-breakfast": "Reggeli",
|
||||
"cuisine-burger|@fastfood": "Hamburger",
|
||||
"cuisine-cake": "Torta",
|
||||
"cuisine-coffee_shop": "Kávé",
|
||||
"cuisine-curry": "Curry",
|
||||
"cuisine-diner": "Étkező",
|
||||
"cuisine-donut": "Fánk",
|
||||
"cuisine-fish_and_chips": "Hal és sültkrumpli",
|
||||
"cuisine-friture|@fastfood": "Olajban sütött ételek",
|
||||
"cuisine-grill": "Grill",
|
||||
"cuisine-hotdog|@fastfood": "Hotdog",
|
||||
"cuisine-ice_cream": "Jégkrém",
|
||||
"cuisine-kebab|@fastfood": "Kebab",
|
||||
"cuisine-noodles": "Tészta",
|
||||
"cuisine-pancake|cuisine-crepe": "Palacsinta|Francia palacsinta",
|
||||
"cuisine-pasta": "Tészta",
|
||||
"cuisine-pizza|@fastfood": "Pizza",
|
||||
"cuisine-ramen": "Rámen",
|
||||
"cuisine-sandwich|@fastfood": "Szendvics",
|
||||
"cuisine-sausage|@fastfood": "Kolbász",
|
||||
"cuisine-seafood|cuisine-fish": "Tenger gyümölcsei|Hal",
|
||||
"cuisine-soba": "Soba",
|
||||
"cuisine-steak_house": "Steak ház",
|
||||
"cuisine-sushi": "Szusi",
|
||||
"cuisine-tapas": "Tapas",
|
||||
"cuisine-tea": "Tea",
|
||||
"cuisine-vegetarian": "Vegetáriánus konyha",
|
||||
"cuisine-vegan": "Vegán konyha|Vegetáriánus konyha"
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Cepat saji",
|
||||
"cuisine-bagel": "Roti bagel",
|
||||
"cuisine-breakfast": "Sarapan",
|
||||
"cuisine-burger|@fastfood": "Burger",
|
||||
"cuisine-cake": "Kue",
|
||||
"cuisine-coffee_shop": "Kopi",
|
||||
"cuisine-curry": "Kari",
|
||||
"cuisine-diner": "Makan malam",
|
||||
"cuisine-donut": "Donat",
|
||||
"cuisine-fish_and_chips": "Ikan dan kentang goreng",
|
||||
"cuisine-friture|@fastfood": "Gorengan",
|
||||
"cuisine-grill": "Panggangan",
|
||||
"cuisine-hotdog|@fastfood": "Hotdog",
|
||||
"cuisine-ice_cream": "Es_krim",
|
||||
"cuisine-kebab|@fastfood": "Kebab",
|
||||
"cuisine-noodles": "Bakmi",
|
||||
"cuisine-pancake|cuisine-crepe": "Panekuk|Kue dadar",
|
||||
"cuisine-pasta": "Pasta",
|
||||
"cuisine-pizza|@fastfood": "Pizza",
|
||||
"cuisine-ramen": "Ramen",
|
||||
"cuisine-sandwich|@fastfood": "Roti isi",
|
||||
"cuisine-sausage|@fastfood": "Sosis",
|
||||
"cuisine-seafood|cuisine-fish": "Hidangan laut|Ikan",
|
||||
"cuisine-soba": "Soba",
|
||||
"cuisine-steak_house": "Restoran steik",
|
||||
"cuisine-sushi": "Sushi",
|
||||
"cuisine-tapas": "Kudapan spanyol",
|
||||
"cuisine-tea": "Teh",
|
||||
"cuisine-vegetarian": "Masakan vegetarian",
|
||||
"cuisine-vegan": "Masakan vegan|Masakan vegetarian"
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Fast food",
|
||||
"cuisine-bagel": "Bagel",
|
||||
"cuisine-breakfast": "Colazione",
|
||||
"cuisine-burger|@fastfood": "Hamburger",
|
||||
"cuisine-cake": "Torte",
|
||||
"cuisine-coffee_shop": "Caffè",
|
||||
"cuisine-curry": "Curry",
|
||||
"cuisine-diner": "Ristorantino",
|
||||
"cuisine-donut": "Ciambelle",
|
||||
"cuisine-fish_and_chips": "Fish and chips",
|
||||
"cuisine-friture|@fastfood": "Fritture",
|
||||
"cuisine-grill": "Cucina alla griglia",
|
||||
"cuisine-hotdog|@fastfood": "Hot dog",
|
||||
"cuisine-ice_cream": "Gelateria|gelato",
|
||||
"cuisine-kebab|@fastfood": "Kebab",
|
||||
"cuisine-noodles": "Noodles",
|
||||
"cuisine-pancake|cuisine-crepe": "Pancake|Crêpes",
|
||||
"cuisine-pasta": "Pasta",
|
||||
"cuisine-pizza|@fastfood": "Pizza",
|
||||
"cuisine-ramen": "Ramen",
|
||||
"cuisine-sandwich|@fastfood": "Panini",
|
||||
"cuisine-sausage|@fastfood": "Salsicce",
|
||||
"cuisine-seafood|cuisine-fish": "Frutti di mare|Pesce",
|
||||
"cuisine-soba": "Soba",
|
||||
"cuisine-steak_house": "Bisteccheria",
|
||||
"cuisine-sushi": "Sushi",
|
||||
"cuisine-tapas": "Tapas",
|
||||
"cuisine-tea": "Tè",
|
||||
"cuisine-vegetarian": "Cucina vegetariana",
|
||||
"cuisine-vegan": "Cucina vegana|Cucina vegetariana"
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"@fastfood": "ファストフード",
|
||||
"cuisine-bagel": "ベーグル",
|
||||
"cuisine-breakfast": "朝食",
|
||||
"cuisine-burger|@fastfood": "ハンバーガー",
|
||||
"cuisine-cake": "ケーキ",
|
||||
"cuisine-coffee_shop": "コーヒー",
|
||||
"cuisine-curry": "カレー",
|
||||
"cuisine-diner": "ダイナー",
|
||||
"cuisine-donut": "ドーナッツ",
|
||||
"cuisine-fish_and_chips": "フィッシュ・アンド・チップス",
|
||||
"cuisine-friture|@fastfood": "揚げ物",
|
||||
"cuisine-grill": "グリル",
|
||||
"cuisine-hotdog|@fastfood": "ホットドッグ",
|
||||
"cuisine-ice_cream": "アイスクリーム",
|
||||
"cuisine-kebab|@fastfood": "カバブ",
|
||||
"cuisine-noodles": "麺類",
|
||||
"cuisine-pancake|cuisine-crepe": "ホットケーキ|クレープ",
|
||||
"cuisine-pasta": "パスタ",
|
||||
"cuisine-pizza|@fastfood": "ピザ",
|
||||
"cuisine-ramen": "ラーメン",
|
||||
"cuisine-sandwich|@fastfood": "サンドイッチ",
|
||||
"cuisine-sausage|@fastfood": "ソーセージ",
|
||||
"cuisine-seafood|cuisine-fish": "シーフード|魚料理",
|
||||
"cuisine-soba": "そば",
|
||||
"cuisine-steak_house": "ステーキハウス",
|
||||
"cuisine-sushi": "寿司",
|
||||
"cuisine-tapas": "タパス",
|
||||
"cuisine-tea": "紅茶",
|
||||
"cuisine-vegetarian": "ベジタリアン料理",
|
||||
"cuisine-vegan": "ビーガン料理|ベジタリアン料理"
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"@fastfood": "패스트 푸드",
|
||||
"cuisine-bagel": "베이글",
|
||||
"cuisine-breakfast": "아침 식사",
|
||||
"cuisine-burger|@fastfood": "햄버거",
|
||||
"cuisine-cake": "케이크",
|
||||
"cuisine-coffee_shop": "커피",
|
||||
"cuisine-curry": "카레",
|
||||
"cuisine-diner": "식당",
|
||||
"cuisine-donut": "도너츠",
|
||||
"cuisine-fish_and_chips": "피쉬 앤 칩스",
|
||||
"cuisine-friture|@fastfood": "튀김 요리",
|
||||
"cuisine-grill": "그릴",
|
||||
"cuisine-hotdog|@fastfood": "핫도그",
|
||||
"cuisine-ice_cream": "아이스크림",
|
||||
"cuisine-kebab|@fastfood": "케밥",
|
||||
"cuisine-noodles": "국수",
|
||||
"cuisine-pancake|cuisine-crepe": "팬케이크|크레이프",
|
||||
"cuisine-pasta": "파스타",
|
||||
"cuisine-pizza|@fastfood": "피자",
|
||||
"cuisine-ramen": "라면",
|
||||
"cuisine-sandwich|@fastfood": "샌드위치",
|
||||
"cuisine-sausage|@fastfood": "소시지",
|
||||
"cuisine-seafood|cuisine-fish": "해산물|생선",
|
||||
"cuisine-soba": "메밀 국수",
|
||||
"cuisine-steak_house": "스테이크 하우스",
|
||||
"cuisine-sushi": "초밥",
|
||||
"cuisine-tapas": "타파스",
|
||||
"cuisine-tea": "차",
|
||||
"cuisine-vegetarian": "채식주의자 음식",
|
||||
"cuisine-vegan": "비건 음식|채식주의자 음식"
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Hurtigmat",
|
||||
"cuisine-bagel": "Bagel",
|
||||
"cuisine-breakfast": "Frokost",
|
||||
"cuisine-burger|@fastfood": "Burger",
|
||||
"cuisine-cake": "Kake",
|
||||
"cuisine-coffee_shop": "Kaffe",
|
||||
"cuisine-curry": "Karri",
|
||||
"cuisine-diner": "Middag",
|
||||
"cuisine-donut": "Smultring",
|
||||
"cuisine-fish_and_chips": "Fisk og pommes frites",
|
||||
"cuisine-friture|@fastfood": "Frityrt",
|
||||
"cuisine-grill": "Grill",
|
||||
"cuisine-hotdog|@fastfood": "Hotdog",
|
||||
"cuisine-ice_cream": "Iskrem",
|
||||
"cuisine-kebab|@fastfood": "Kebab",
|
||||
"cuisine-noodles": "Nudler",
|
||||
"cuisine-pancake|cuisine-crepe": "Pannekake|Crepe",
|
||||
"cuisine-pasta": "Pasta",
|
||||
"cuisine-pizza|@fastfood": "Pizza",
|
||||
"cuisine-ramen": "Ramen",
|
||||
"cuisine-sandwich|@fastfood": "Smørbrød",
|
||||
"cuisine-sausage|@fastfood": "Pølse",
|
||||
"cuisine-seafood|cuisine-fish": "Sjømat|Fisk",
|
||||
"cuisine-soba": "Soba",
|
||||
"cuisine-steak_house": "Biffrestaurant",
|
||||
"cuisine-sushi": "Sushi",
|
||||
"cuisine-tapas": "Tapas",
|
||||
"cuisine-tea": "Te",
|
||||
"cuisine-vegetarian": "Vegetarisk|Vegetarretter",
|
||||
"cuisine-vegan": "Vegansk|Vegetarisk|Vegetarretter"
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Fast food",
|
||||
"cuisine-bagel": "Bagels",
|
||||
"cuisine-breakfast": "Ontbijt",
|
||||
"cuisine-burger|@fastfood": "Hamburgers",
|
||||
"cuisine-cake": "Taart",
|
||||
"cuisine-coffee_shop": "Koffie",
|
||||
"cuisine-curry": "Curry's",
|
||||
"cuisine-diner": "Diner",
|
||||
"cuisine-donut": "Donuts",
|
||||
"cuisine-fish_and_chips": "Fish and chips",
|
||||
"cuisine-friture|@fastfood": "Frituur",
|
||||
"cuisine-grill": "Gegrilde gerechten",
|
||||
"cuisine-hotdog|@fastfood": "Hotdogs",
|
||||
"cuisine-ice_cream": "Ijs",
|
||||
"cuisine-kebab|@fastfood": "Kebab",
|
||||
"cuisine-noodles": "Noedels",
|
||||
"cuisine-pancake|cuisine-crepe": "Pannenkoek",
|
||||
"cuisine-pasta": "Pasta",
|
||||
"cuisine-pizza|@fastfood": "Pizza's",
|
||||
"cuisine-ramen": "Ramennoedels",
|
||||
"cuisine-sandwich|@fastfood": "Broodjes",
|
||||
"cuisine-sausage|@fastfood": "Worst",
|
||||
"cuisine-seafood|cuisine-fish": "Vis en zeevruchten|Vis",
|
||||
"cuisine-soba": "Soba",
|
||||
"cuisine-steak_house": "Steakhouse",
|
||||
"cuisine-sushi": "Sushi",
|
||||
"cuisine-tapas": "Tapas",
|
||||
"cuisine-tea": "Thee",
|
||||
"cuisine-vegetarian": "Vegetarisch",
|
||||
"cuisine-vegan": "Veganistisch|Vegetarisch"
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Fast food",
|
||||
"cuisine-bagel": "Bajgle",
|
||||
"cuisine-breakfast": "Śniadaniarnia",
|
||||
"cuisine-burger|@fastfood": "Burgery",
|
||||
"cuisine-cake": "Ciasta",
|
||||
"cuisine-coffee_shop": "Kawa",
|
||||
"cuisine-curry": "Curry",
|
||||
"cuisine-diner": "Bar szybkiej obsługi",
|
||||
"cuisine-donut": "Pączki",
|
||||
"cuisine-fish_and_chips": "Ryba i frytki",
|
||||
"cuisine-friture|@fastfood": "Smażalnia",
|
||||
"cuisine-grill": "Dania z grilla",
|
||||
"cuisine-hotdog|@fastfood": "Hot-dogi",
|
||||
"cuisine-ice_cream": "Lody",
|
||||
"cuisine-kebab|@fastfood": "Kebab",
|
||||
"cuisine-noodles": "Noodle",
|
||||
"cuisine-pancake|cuisine-crepe": "Naleśniki|Naleśnikarnia",
|
||||
"cuisine-pasta": "Makarony",
|
||||
"cuisine-pizza|@fastfood": "Pizza|pizzeria",
|
||||
"cuisine-ramen": "Ramen",
|
||||
"cuisine-sandwich|@fastfood": "Kanapki",
|
||||
"cuisine-sausage|@fastfood": "Kiełbasa|Kiełbasiarnia",
|
||||
"cuisine-seafood|cuisine-fish": "Owoce morza|Ryby",
|
||||
"cuisine-soba": "Soba",
|
||||
"cuisine-steak_house": "Steki",
|
||||
"cuisine-sushi": "Sushi",
|
||||
"cuisine-tapas": "Tapas",
|
||||
"cuisine-tea": "Herbata|Herbaciarnia",
|
||||
"cuisine-vegetarian": "Kuchnia wegetariańska",
|
||||
"cuisine-vegan": "Kuchnia wegańska|Kuchnia wegetariańska"
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Fast food",
|
||||
"cuisine-bagel": "Bagel",
|
||||
"cuisine-breakfast": "Café da manhã",
|
||||
"cuisine-burger|@fastfood": "Hambúrguer",
|
||||
"cuisine-cake": "Bolo|padaria",
|
||||
"cuisine-coffee_shop": "Café|cafeteria",
|
||||
"cuisine-curry": "Curry",
|
||||
"cuisine-diner": "Lanchonete",
|
||||
"cuisine-donut": "Rosquinha",
|
||||
"cuisine-fish_and_chips": "Peixe e batatas fritas",
|
||||
"cuisine-friture|@fastfood": "Fritura",
|
||||
"cuisine-grill": "Grelhada",
|
||||
"cuisine-hotdog|@fastfood": "Cachorro-quente",
|
||||
"cuisine-ice_cream": "Sorvete",
|
||||
"cuisine-kebab|@fastfood": "Espetinho",
|
||||
"cuisine-noodles": "Macarrão",
|
||||
"cuisine-pancake|cuisine-crepe": "Panqueca|panquecas|crepes|crepe",
|
||||
"cuisine-pasta": "Massa",
|
||||
"cuisine-pizza|@fastfood": "Pizza|pizzaria|pizaria",
|
||||
"cuisine-ramen": "Lámen|rāmen",
|
||||
"cuisine-sandwich|@fastfood": "Sanduíche",
|
||||
"cuisine-sausage|@fastfood": "Linguiça",
|
||||
"cuisine-seafood|cuisine-fish": "Frutos do mar|peixe|marisco|marisqueira",
|
||||
"cuisine-soba": "Soba|sobá",
|
||||
"cuisine-steak_house": "Churrascaria",
|
||||
"cuisine-sushi": "Sushi",
|
||||
"cuisine-tapas": "Tapas",
|
||||
"cuisine-tea": "Chá",
|
||||
"cuisine-vegetarian": "Vegetariana",
|
||||
"cuisine-vegan": "Vegana|vegetariana"
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Comida rápida",
|
||||
"cuisine-bagel": "Bagel",
|
||||
"cuisine-breakfast": "Pequeno-almoço",
|
||||
"cuisine-burger|@fastfood": "Hambúrguer",
|
||||
"cuisine-cake": "Bolo|padaria",
|
||||
"cuisine-coffee_shop": "Café|cafetaria",
|
||||
"cuisine-curry": "Caril",
|
||||
"cuisine-diner": "Diner",
|
||||
"cuisine-donut": "Donuts",
|
||||
"cuisine-fish_and_chips": "Peixe e batatas fritas",
|
||||
"cuisine-friture|@fastfood": "Fritos",
|
||||
"cuisine-grill": "Grelhados",
|
||||
"cuisine-hotdog|@fastfood": "Cachorro-quente",
|
||||
"cuisine-ice_cream": "Gelados",
|
||||
"cuisine-kebab|@fastfood": "Kebab",
|
||||
"cuisine-noodles": "Massa asiática",
|
||||
"cuisine-pancake|cuisine-crepe": "Panqueca|panquecas|crepes|crepe",
|
||||
"cuisine-pasta": "Massa",
|
||||
"cuisine-pizza|@fastfood": "Pizza|piza|pizaria",
|
||||
"cuisine-ramen": "Lámen|rāmen",
|
||||
"cuisine-sandwich|@fastfood": "Sanduíche|sande",
|
||||
"cuisine-sausage|@fastfood": "Salsicha|salsichas",
|
||||
"cuisine-seafood|cuisine-fish": "Frutos do mar|peixe|marisco|marisqueira",
|
||||
"cuisine-soba": "Soba|sobá",
|
||||
"cuisine-steak_house": "Churrasqueira|churrascaria",
|
||||
"cuisine-sushi": "Sushi",
|
||||
"cuisine-tapas": "Tapas",
|
||||
"cuisine-tea": "Chá",
|
||||
"cuisine-vegetarian": "Vegetariana",
|
||||
"cuisine-vegan": "Vegana|vegetariana"
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Fast food",
|
||||
"cuisine-bagel": "Chiflă",
|
||||
"cuisine-breakfast": "Mic dejun",
|
||||
"cuisine-burger|@fastfood": "Burger",
|
||||
"cuisine-cake": "Tort",
|
||||
"cuisine-coffee_shop": "Cafea",
|
||||
"cuisine-curry": "Curry",
|
||||
"cuisine-diner": "Cină",
|
||||
"cuisine-donut": "Gogoașă",
|
||||
"cuisine-fish_and_chips": "Restaurant fish and chips",
|
||||
"cuisine-friture|@fastfood": "Prăjit",
|
||||
"cuisine-grill": "Grătar",
|
||||
"cuisine-hotdog|@fastfood": "Hot dog",
|
||||
"cuisine-ice_cream": "Înghețată",
|
||||
"cuisine-kebab|@fastfood": "Kebab",
|
||||
"cuisine-noodles": "Tăiței",
|
||||
"cuisine-pancake|cuisine-crepe": "Clătită|Crep",
|
||||
"cuisine-pasta": "Paste",
|
||||
"cuisine-pizza|@fastfood": "Pizza",
|
||||
"cuisine-ramen": "Ramen",
|
||||
"cuisine-sandwich|@fastfood": "Sandwich",
|
||||
"cuisine-sausage|@fastfood": "Cârnat",
|
||||
"cuisine-seafood|cuisine-fish": "Fructe de mare|Pește",
|
||||
"cuisine-soba": "Soba",
|
||||
"cuisine-steak_house": "Restaurant steakhouse",
|
||||
"cuisine-sushi": "Sushi",
|
||||
"cuisine-tapas": "Tapas",
|
||||
"cuisine-tea": "Ceai",
|
||||
"cuisine-vegetarian": "Bucătărie vegetarian",
|
||||
"cuisine-vegan": "Bucătărie vegan|Bucătărie vegetarian"
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
{
|
||||
"@fastfood": "Фастфуд",
|
||||
"cuisine-bagel": "Бубличная|бублики",
|
||||
"cuisine-breakfast": "Завтраки|завтрак|позавтракать",
|
||||
"cuisine-burger|@fastfood": "Бургеры",
|
||||
"cuisine-bubble_tea": "Чай с шариками",
|
||||
"cuisine-cake": "Кондитерская|выпечка|пекарня",
|
||||
"cuisine-coffee_shop": "Кофе|кофейня",
|
||||
"cuisine-curry": "Блюда карри",
|
||||
"cuisine-diner": "Дайнер",
|
||||
"cuisine-donut": "Пончики",
|
||||
"cuisine-fish_and_chips": "Рыба и картофель фри|фиш энд чипс",
|
||||
"cuisine-friture|@fastfood": "Блюда во фритюре",
|
||||
"cuisine-grill": "Гриль",
|
||||
"cuisine-hotdog|@fastfood": "Хот-доги|хотдог",
|
||||
"cuisine-ice_cream": "Кафе-мороженое",
|
||||
"cuisine-kebab|@fastfood": "Кебабы|кебаб|шаурма",
|
||||
"cuisine-noodles": "Лапшичная|Лапша",
|
||||
"cuisine-pancake|cuisine-crepe": "Блинная|блины|панкейки",
|
||||
"cuisine-pasta": "Паста",
|
||||
"cuisine-pizza|@fastfood": "Пиццерия|пицца",
|
||||
"cuisine-ramen": "Рамен",
|
||||
"cuisine-sandwich|@fastfood": "Сэндвичи",
|
||||
"cuisine-sausage|@fastfood": "Сосисочная",
|
||||
"cuisine-seafood|cuisine-fish": "Морепродукты|рыба|рыбный",
|
||||
"cuisine-soba": "Соба|лапша",
|
||||
"cuisine-steak_house": "Стейк-хаус|стейки",
|
||||
"cuisine-sushi": "Суши|роллы",
|
||||
"cuisine-tapas": "5Тапас-бар",
|
||||
"cuisine-tea": "3Чайная",
|
||||
"cuisine-vegetarian": "Вегетарианская кухня",
|
||||
"cuisine-vegan": "Веганская кухня|Вегетарианская кухня"
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user