Compare commits

..

5 Commits

Author SHA1 Message Date
zyphlar
a1b3fc939a only track during nav
Signed-off-by: zyphlar <zyphlar@gmail.com>
2025-10-25 18:16:05 -07:00
zyphlar
d234930464 Live location web app commit (REMOVE) 2025-10-25 15:38:41 -07:00
zyphlar
7e75aac135 Indicate when location sharing is active
Signed-off-by: zyphlar <zyphlar@gmail.com>
2025-10-24 15:33:02 -07:00
zyphlar
6c3710859b implement crypto
Signed-off-by: zyphlar <zyphlar@gmail.com>
2025-10-20 17:25:51 -07:00
zyphlar
d430a2202e Initial implementation of location sharing
Signed-off-by: zyphlar <zyphlar@gmail.com>
2025-10-20 04:32:30 -07:00
173 changed files with 11382 additions and 1846 deletions

3
.gitignore vendored
View File

@@ -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

View File

@@ -1 +0,0 @@
Лесна навигация - Открийте повече от вашето пътуване - Подкрепен от общността

View File

@@ -1 +0,0 @@
CoMaps - Хайкинг, Велосипед, Пътуване без Интернет

View File

@@ -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>

View File

@@ -1 +0,0 @@
Лесна навигация - Открийте повече от вашето пътуване - Подкрепен от общността

View File

@@ -1 +0,0 @@
CoMaps - Пътуване с Приватност

View File

@@ -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!

View File

@@ -1 +0,0 @@
CoMaps - Navigacija z zasebnostjo

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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();
}
}
}

View File

@@ -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)

View File

@@ -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;
}
}
}

View File

@@ -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)));
}
}

View File

@@ -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);
}

View File

@@ -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);
}
}

View File

@@ -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();
}
}

View File

@@ -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()

View File

@@ -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;
}
}

View File

@@ -205,6 +205,11 @@ public class NavigationController implements TrafficManager.TrafficCallback, Nav
mNavMenu.refreshTts();
}
public void refreshShareLocationColor()
{
mNavMenu.updateShareLocationColor();
}
@Override
public void onEnabled()
{

View File

@@ -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)

View File

@@ -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)
{

View File

@@ -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();

View File

@@ -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>

View 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>

View File

@@ -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>

View File

@@ -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" />

View File

@@ -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"

View 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>

View File

@@ -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"

View File

@@ -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>

View File

@@ -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 &amp; Central, Moscow"/>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/distance"

View File

@@ -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"

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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 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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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. -->

View File

@@ -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>

View File

@@ -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>

View File

@@ -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.orgOSM是一个构建自由开放地图的社区项目。它是 CoMaps 中地图数据的主要来源,其工作原理类似于维基百科。您可以添加或编辑地点,可供全世界数以百万计的用户使用并受益。\n加入社区,让我们共绘更优质的地图吧!</string>
<string name="login_osm_presentation">OpenStreetMap.orgOSM是一个构建免费开放地图的社区项目。它是 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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View 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>

View File

@@ -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>

View File

@@ -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"

View File

@@ -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

View File

@@ -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"

View File

@@ -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);

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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

View File

@@ -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

File diff suppressed because it is too large Load Diff

View File

@@ -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>&copy; 2002&ndash;2005 Maxim Shemanarev; <a href="#agg-license" class="license">License</a></li>
<li><a href="http://antigrain.com/">Anti-Grain Geometry</a><br>&copy; 2002&ndash;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>
&copy; 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>
&copy; 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>
&copy; 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>
&copy; 2005&ndash;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>
&copy; 1995&ndash;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>
&copy; 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>
&copy; 2004-2007 Martin F. Krafft, parts are &copy; 2004-2008 Paul Harris and &copy; 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>
&copy; 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>
&copy; 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>
&copy; 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>
&copy; 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>
&copy; 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>
&copy; 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>
&copy; 2003 Bitstream Inc., &copy; 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>
&copy; 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&amp;id=padauk">Padauk</a><br>
<li><a href="http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&amp;id=padauk">Padauk</a><br>
&copy; 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>
&copy; 2005 Danh Hong, &copy; 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>
&copy; 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>
&copy; 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>

View File

@@ -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",

View File

@@ -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":"Запорожье, Мелитополь, Бердянск",

View File

@@ -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",

View File

@@ -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": "مطبخ نباتي"
}

View File

@@ -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": "Веганская кухня|Вегетарыянская кухня"
}

View File

@@ -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": "Веганско|Вегетарианско"
}

View File

@@ -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ě"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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": "Για χορτοφάγους|Χορτοφαγική"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -1,3 +0,0 @@
{
"@fastfood": "غذای حاضری"
}

View File

@@ -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ö"
}

View File

@@ -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"
}

View File

@@ -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": "מטבח טבעוני|מטבח צמחוני"
}

View File

@@ -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": "शाकाहारी"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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": "ビーガン料理|ベジタリアン料理"
}

View File

@@ -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": "비건 음식|채식주의자 음식"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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