Merge branch 'organicmaps:master' into master
This commit is contained in:
commit
a326990268
135 changed files with 912 additions and 209 deletions
|
@ -81,6 +81,17 @@ jobject ToJavaResult(Result const & result, search::ProductInfo const & productI
|
|||
}
|
||||
env->ReleaseIntArrayElements(ranges.get(), rawArr, 0);
|
||||
|
||||
jni::TScopedLocalIntArrayRef descRanges(env, env->NewIntArray(
|
||||
static_cast<jsize>(result.GetDescHighlightRangesCount() * 2)));
|
||||
jint * rawArr2 = env->GetIntArrayElements(descRanges, nullptr);
|
||||
for (size_t i = 0; i < result.GetDescHighlightRangesCount(); i++)
|
||||
{
|
||||
auto const & range = result.GetDescHighlightRange(i);
|
||||
rawArr2[2 * i] = range.first;
|
||||
rawArr2[2 * i + 1] = range.second;
|
||||
}
|
||||
env->ReleaseIntArrayElements(descRanges.get(), rawArr2, 0);
|
||||
|
||||
ms::LatLon ll = ms::LatLon::Zero();
|
||||
if (result.HasPoint())
|
||||
ll = mercator::ToLatLon(result.GetFeatureCenter());
|
||||
|
@ -89,7 +100,7 @@ jobject ToJavaResult(Result const & result, search::ProductInfo const & productI
|
|||
{
|
||||
jni::TScopedLocalRef name(env, jni::ToJavaString(env, result.GetString()));
|
||||
jni::TScopedLocalRef suggest(env, jni::ToJavaString(env, result.GetSuggestionString()));
|
||||
return env->NewObject(g_resultClass, g_suggestConstructor, name.get(), suggest.get(), ll.m_lat, ll.m_lon, ranges.get());
|
||||
return env->NewObject(g_resultClass, g_suggestConstructor, name.get(), suggest.get(), ll.m_lat, ll.m_lon, ranges.get(),descRanges.get());
|
||||
}
|
||||
|
||||
platform::Distance distance;
|
||||
|
@ -125,7 +136,7 @@ jobject ToJavaResult(Result const & result, search::ProductInfo const & productI
|
|||
0/*static_cast<jint>(result.GetRankingInfo().m_popularity)*/));
|
||||
|
||||
return env->NewObject(g_resultClass, g_resultConstructor, name.get(), desc.get(), ll.m_lat, ll.m_lon,
|
||||
ranges.get(), popularity.get());
|
||||
ranges.get(), descRanges.get(), popularity.get());
|
||||
}
|
||||
|
||||
jobjectArray BuildSearchResults(vector<search::ProductInfo> const & productInfo,
|
||||
|
@ -232,9 +243,9 @@ extern "C"
|
|||
g_resultClass = jni::GetGlobalClassRef(env, "app/organicmaps/search/SearchResult");
|
||||
g_resultConstructor = jni::GetConstructorID(
|
||||
env, g_resultClass,
|
||||
"(Ljava/lang/String;Lapp/organicmaps/search/SearchResult$Description;DD[I"
|
||||
"(Ljava/lang/String;Lapp/organicmaps/search/SearchResult$Description;DD[I[I"
|
||||
"Lapp/organicmaps/search/Popularity;)V");
|
||||
g_suggestConstructor = jni::GetConstructorID(env, g_resultClass, "(Ljava/lang/String;Ljava/lang/String;DD[I)V");
|
||||
g_suggestConstructor = jni::GetConstructorID(env, g_resultClass, "(Ljava/lang/String;Ljava/lang/String;DD[I[I)V");
|
||||
g_descriptionClass = jni::GetGlobalClassRef(env, "app/organicmaps/search/SearchResult$Description");
|
||||
/*
|
||||
Description(FeatureId featureId, String featureType, String region, Distance distance,
|
||||
|
|
|
@ -16,17 +16,12 @@ extern "C"
|
|||
if (items.empty())
|
||||
return;
|
||||
|
||||
auto const & pairBuilder = jni::PairBuilder::Instance(env);
|
||||
auto const listAddMethod = jni::ListBuilder::Instance(env).m_add;
|
||||
|
||||
for (SearchRequest const & item : items)
|
||||
{
|
||||
using SLR = jni::TScopedLocalRef;
|
||||
SLR pair(env, pairBuilder.Create(env, SLR(env, jni::ToJavaString(env, item.first)),
|
||||
SLR(env, jni::ToJavaString(env, item.second))));
|
||||
ASSERT(pair.get(), (jni::DescribeException()));
|
||||
|
||||
env->CallBooleanMethod(result, listAddMethod, pair.get());
|
||||
jni::TScopedLocalRef str(env, jni::ToJavaString(env, item.second));
|
||||
env->CallBooleanMethod(result, listAddMethod, str.get());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,6 +2,10 @@ package app.organicmaps.search;
|
|||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Typeface;
|
||||
import android.text.SpannableStringBuilder;
|
||||
import android.text.Spanned;
|
||||
import android.text.style.StyleSpan;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
@ -138,7 +142,7 @@ class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.SearchDataViewHol
|
|||
|
||||
formatOpeningHours(mResult);
|
||||
UiUtils.setTextAndHideIfEmpty(mDescription, mResult.description.description);
|
||||
UiUtils.setTextAndHideIfEmpty(mRegion, mResult.description.region);
|
||||
mRegion.setText(mResult.getFormattedAddress(mRegion.getContext()));
|
||||
UiUtils.setTextAndHideIfEmpty(mDistance, mResult.description.distance.toString(mFrame.getContext()));
|
||||
}
|
||||
|
||||
|
|
|
@ -19,12 +19,8 @@ public final class SearchRecents
|
|||
|
||||
public static void refresh()
|
||||
{
|
||||
final List<Pair<String, String>> pairs = new ArrayList<>();
|
||||
nativeGetList(pairs);
|
||||
sRecents.clear();
|
||||
|
||||
for (Pair<String, String> pair : pairs)
|
||||
sRecents.add(pair.second);
|
||||
nativeGetList(sRecents);
|
||||
}
|
||||
|
||||
public static int getSize()
|
||||
|
@ -39,7 +35,7 @@ public final class SearchRecents
|
|||
|
||||
public static boolean add(@NonNull String query, @NonNull Context context)
|
||||
{
|
||||
if (TextUtils.isEmpty(query) || sRecents.contains(query))
|
||||
if (TextUtils.isEmpty(query))
|
||||
return false;
|
||||
|
||||
nativeAdd(Language.getKeyboardLocale(context), query);
|
||||
|
@ -53,7 +49,7 @@ public final class SearchRecents
|
|||
sRecents.clear();
|
||||
}
|
||||
|
||||
private static native void nativeGetList(List<Pair<String, String>> result);
|
||||
private static native void nativeGetList(List<String> result);
|
||||
private static native void nativeAdd(String locale, String query);
|
||||
private static native void nativeClear();
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@ public class SearchResult
|
|||
public static final int OPEN_NOW_NO = 2;
|
||||
|
||||
public static final SearchResult EMPTY = new SearchResult("", "", 0, 0,
|
||||
new int[] {});
|
||||
new int[] {}, new int[] {});
|
||||
|
||||
// Used by JNI.
|
||||
@Keep
|
||||
|
@ -77,11 +77,12 @@ public class SearchResult
|
|||
|
||||
// Consecutive pairs of indexes (each pair contains : start index, length), specifying highlighted matches of original query in result
|
||||
public final int[] highlightRanges;
|
||||
public final int[] descHighlightRanges;
|
||||
|
||||
@NonNull
|
||||
private final Popularity mPopularity;
|
||||
|
||||
public SearchResult(String name, String suggestion, double lat, double lon, int[] highlightRanges)
|
||||
public SearchResult(String name, String suggestion, double lat, double lon, int[] highlightRanges, int[] descHighlightRanges)
|
||||
{
|
||||
this.name = name;
|
||||
this.suggestion = suggestion;
|
||||
|
@ -94,11 +95,12 @@ public class SearchResult
|
|||
else
|
||||
this.type = TYPE_SUGGEST;
|
||||
this.highlightRanges = highlightRanges;
|
||||
this.descHighlightRanges = descHighlightRanges;
|
||||
mPopularity = Popularity.defaultInstance();
|
||||
}
|
||||
|
||||
public SearchResult(String name, Description description, double lat, double lon, int[] highlightRanges,
|
||||
@NonNull Popularity popularity)
|
||||
int[] descHighlightRanges, @NonNull Popularity popularity)
|
||||
{
|
||||
this.type = TYPE_RESULT;
|
||||
this.name = name;
|
||||
|
@ -108,6 +110,7 @@ public class SearchResult
|
|||
this.lon = lon;
|
||||
this.description = description;
|
||||
this.highlightRanges = highlightRanges;
|
||||
this.descHighlightRanges = descHighlightRanges;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
|
@ -119,26 +122,39 @@ public class SearchResult
|
|||
return title;
|
||||
}
|
||||
|
||||
public void formatText(SpannableStringBuilder builder, int[] ranges)
|
||||
{
|
||||
if (ranges != null)
|
||||
{
|
||||
final int size = ranges.length / 2;
|
||||
int index = 0;
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
final int start = ranges[index++];
|
||||
final int len = ranges[index++];
|
||||
|
||||
builder.setSpan(new StyleSpan(Typeface.BOLD), start, start + len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public Spannable getFormattedTitle(@NonNull Context context)
|
||||
{
|
||||
final String title = getTitle(context);
|
||||
final SpannableStringBuilder builder = new SpannableStringBuilder(title);
|
||||
|
||||
if (highlightRanges != null)
|
||||
{
|
||||
final int size = highlightRanges.length / 2;
|
||||
int index = 0;
|
||||
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
final int start = highlightRanges[index++];
|
||||
final int len = highlightRanges[index++];
|
||||
|
||||
builder.setSpan(new StyleSpan(Typeface.BOLD), start, start + len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
}
|
||||
}
|
||||
formatText(builder, highlightRanges);
|
||||
|
||||
return builder;
|
||||
}
|
||||
|
||||
public Spannable getFormattedAddress(@NonNull Context context)
|
||||
{
|
||||
final String address = description != null ? description.region : null;
|
||||
final SpannableStringBuilder builder = new SpannableStringBuilder(address);
|
||||
formatText(builder, descHighlightRanges);
|
||||
|
||||
return builder;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -555,6 +555,7 @@
|
|||
<string name="miles_per_hour">ميل/ساعة</string>
|
||||
<string name="hour">س</string>
|
||||
<string name="minute">د</string>
|
||||
<string name="day">يوم</string>
|
||||
<string name="placepage_more_button">المزيد</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">الصور والتعليقات والحجز</string>
|
||||
|
|
|
@ -542,6 +542,7 @@
|
|||
<string name="miles_per_hour">mil/saat</string>
|
||||
<string name="hour">saat</string>
|
||||
<string name="minute">dəq</string>
|
||||
<string name="day">gün</string>
|
||||
<string name="placepage_more_button">Digər</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Şəkillər, rəylər, rezervasiya</string>
|
||||
|
|
|
@ -541,6 +541,7 @@
|
|||
<string name="miles_per_hour">міль/г</string>
|
||||
<string name="hour">г</string>
|
||||
<string name="minute">хв</string>
|
||||
<string name="day">д</string>
|
||||
<string name="placepage_more_button">Яшчэ</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Фота, водгукі, браніраванне</string>
|
||||
|
|
|
@ -501,6 +501,7 @@
|
|||
<string name="ft">фут</string>
|
||||
<string name="hour">ч</string>
|
||||
<string name="minute">мин</string>
|
||||
<string name="day">д</string>
|
||||
<string name="placepage_more_button">Още</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Снимки, отзиви, резервация</string>
|
||||
|
|
|
@ -542,6 +542,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">h</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">d</string>
|
||||
<string name="placepage_more_button">Més</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Fotos, comentaris, reserves</string>
|
||||
|
|
|
@ -519,6 +519,7 @@
|
|||
<string name="miles_per_hour">mil/h</string>
|
||||
<string name="hour">hod</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">d</string>
|
||||
<string name="placepage_more_button">Více</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Fotografie, recenze, rezervace</string>
|
||||
|
|
|
@ -511,6 +511,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">time</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">d</string>
|
||||
<string name="placepage_more_button">Mere</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Fotos, anmeldelser, booking</string>
|
||||
|
|
|
@ -541,6 +541,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">h</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">d</string>
|
||||
<string name="placepage_more_button">Mehr</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Fotos, bewertungen, buchung</string>
|
||||
|
|
|
@ -540,6 +540,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">h</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">d</string>
|
||||
<string name="placepage_more_button">Más</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Fotos, opiniones, reservas</string>
|
||||
|
|
|
@ -534,6 +534,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">h</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">p</string>
|
||||
<string name="placepage_more_button">Veel</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Fotod, arvustused, broneerimine</string>
|
||||
|
|
|
@ -540,6 +540,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">h</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">e</string>
|
||||
<string name="placepage_more_button">Gehiago</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Argazkiak, iritziak, erreserba</string>
|
||||
|
|
|
@ -506,6 +506,7 @@
|
|||
<string name="miles_per_hour">مایل بر ساعت (mph)</string>
|
||||
<string name="hour">ساعت</string>
|
||||
<string name="minute">دقیقه</string>
|
||||
<string name="day">روز</string>
|
||||
<string name="placepage_more_button">بیشتر</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">عکس ها، نظرات، رزرو</string>
|
||||
|
|
|
@ -540,6 +540,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">t</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">pv</string>
|
||||
<string name="placepage_more_button">Lisää</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Kuvat, arvostelut, varaus</string>
|
||||
|
|
|
@ -548,6 +548,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">h</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">j</string>
|
||||
<string name="placepage_more_button">Plus</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Photos, commentaires, réservations</string>
|
||||
|
|
|
@ -407,6 +407,7 @@
|
|||
<string name="km">किमी</string>
|
||||
<string name="hour">घंटे</string>
|
||||
<string name="minute">मिनट</string>
|
||||
<string name="day">दिन</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">तस्वीरें, समीक्षाएँ, बुकिंग</string>
|
||||
<!-- An explanation dialog shown when clicking on more_on_kayak link. -->
|
||||
|
|
|
@ -526,6 +526,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">ó</string>
|
||||
<string name="minute">p</string>
|
||||
<string name="day">nap</string>
|
||||
<string name="placepage_more_button">Még</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Fényképek, vélemények, foglalás</string>
|
||||
|
|
|
@ -514,6 +514,7 @@
|
|||
<string name="miles_per_hour">mpj</string>
|
||||
<string name="hour">j</string>
|
||||
<string name="minute">mnt</string>
|
||||
<string name="day">hr</string>
|
||||
<string name="placepage_more_button">Lainnya</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Foto, ulasan, pemesanan</string>
|
||||
|
|
|
@ -526,6 +526,7 @@
|
|||
<string name="mi">mi</string>
|
||||
<string name="miles_per_hour">mph</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">g</string>
|
||||
<string name="placepage_more_button">Di più</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Foto, recensioni, prenotazioni</string>
|
||||
|
|
|
@ -537,6 +537,7 @@
|
|||
<string name="miles_per_hour">מייל לשעה</string>
|
||||
<string name="hour">ש׳</string>
|
||||
<string name="minute">ד׳</string>
|
||||
<string name="day">י</string>
|
||||
<string name="placepage_more_button">עוד</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">תמונות, ביקורות, הזמנה</string>
|
||||
|
|
|
@ -545,6 +545,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">時間</string>
|
||||
<string name="minute">分</string>
|
||||
<string name="day">日</string>
|
||||
<string name="placepage_more_button">さらに詳しく</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">写真、レビュー、予約</string>
|
||||
|
|
|
@ -512,6 +512,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">t</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">일</string>
|
||||
<string name="placepage_more_button">자세히</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">사진, 리뷰, 예약</string>
|
||||
|
|
|
@ -510,6 +510,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">तास</string>
|
||||
<string name="minute">मिनिट</string>
|
||||
<string name="day">दि</string>
|
||||
<string name="placepage_more_button">अधिक</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">फोटोपुनरावलोकनेबुकिंगबुकिंग</string>
|
||||
|
|
|
@ -539,6 +539,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">t</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">d</string>
|
||||
<string name="placepage_more_button">Mer</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Bilder, anmeldelser, bestilling</string>
|
||||
|
|
|
@ -539,6 +539,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">u</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">d</string>
|
||||
<string name="placepage_more_button">Meer</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Foto\'s, beoordelingen, boeken</string>
|
||||
|
|
|
@ -543,6 +543,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">godz</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">d</string>
|
||||
<string name="placepage_more_button">Więcej</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Zdjęcia, opinie, rezerwacja</string>
|
||||
|
|
|
@ -493,6 +493,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">h</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">dia</string>
|
||||
<string name="placepage_more_button">Mais</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Fotos, avaliações, reservas</string>
|
||||
|
|
|
@ -524,6 +524,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">h</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">dia</string>
|
||||
<string name="placepage_more_button">Mais</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Fotos, comentários, reservas</string>
|
||||
|
|
|
@ -525,6 +525,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">h</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">z</string>
|
||||
<string name="placepage_more_button">Mai mult</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Fotografii, comentarii, rezervări</string>
|
||||
|
|
|
@ -548,6 +548,7 @@
|
|||
<string name="miles_per_hour">ми/ч</string>
|
||||
<string name="hour">ч</string>
|
||||
<string name="minute">мин</string>
|
||||
<string name="day">д</string>
|
||||
<string name="placepage_more_button">Ещё</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Фотографии, отзывы, бронирование</string>
|
||||
|
|
|
@ -541,6 +541,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">hod</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">d</string>
|
||||
<string name="placepage_more_button">Viac</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Fotografie, recenzie, rezervácie</string>
|
||||
|
|
|
@ -511,6 +511,7 @@
|
|||
<string name="miles_per_hour">mi/tim</string>
|
||||
<string name="hour">tim</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">d</string>
|
||||
<string name="placepage_more_button">Mer</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Foton, recensioner, bokning</string>
|
||||
|
|
|
@ -515,6 +515,7 @@
|
|||
<string name="miles_per_hour">ไมล์/ชม.</string>
|
||||
<string name="hour">ชม.</string>
|
||||
<string name="minute">น.</string>
|
||||
<string name="day">วัน</string>
|
||||
<string name="placepage_more_button">เพิ่มเติม</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">รูปภาพ รีวิว การจอง</string>
|
||||
|
|
|
@ -545,6 +545,7 @@
|
|||
<string name="miles_per_hour">saatte mil</string>
|
||||
<string name="hour">sa</string>
|
||||
<string name="minute">dk</string>
|
||||
<string name="day">g</string>
|
||||
<string name="placepage_more_button">Diğer</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Fotoğraflar, yorumlar, rezervasyon</string>
|
||||
|
|
|
@ -545,6 +545,7 @@
|
|||
<string name="miles_per_hour">ми/год</string>
|
||||
<string name="hour">год</string>
|
||||
<string name="minute">хв</string>
|
||||
<string name="day">д</string>
|
||||
<string name="placepage_more_button">Ще</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Фото, відгуки, бронювання</string>
|
||||
|
|
|
@ -513,6 +513,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">giờ</string>
|
||||
<string name="minute">phút</string>
|
||||
<string name="day">ngày</string>
|
||||
<string name="placepage_more_button">Bổ sung</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Hình ảnh, đánh giá, đặt phòng</string>
|
||||
|
|
|
@ -553,6 +553,7 @@
|
|||
<string name="miles_per_hour">英哩每小時</string>
|
||||
<string name="hour">小時</string>
|
||||
<string name="minute">分鐘</string>
|
||||
<string name="day">天</string>
|
||||
<string name="placepage_more_button">更多</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">照片、評論、預訂</string>
|
||||
|
|
|
@ -553,6 +553,7 @@
|
|||
<string name="miles_per_hour">英里每小时</string>
|
||||
<string name="hour">小时</string>
|
||||
<string name="minute">分钟</string>
|
||||
<string name="day">天</string>
|
||||
<string name="placepage_more_button">更多</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">照片、评论、预订</string>
|
||||
|
|
|
@ -570,6 +570,7 @@
|
|||
<string name="miles_per_hour">mph</string>
|
||||
<string name="hour">h</string>
|
||||
<string name="minute">min</string>
|
||||
<string name="day">d</string>
|
||||
<string name="placepage_more_button">More</string>
|
||||
<!-- A referral link on the place page for some hotels -->
|
||||
<string name="more_on_kayak">Photos, reviews, booking</string>
|
||||
|
|
BIN
android/gradle/wrapper/gradle-wrapper.jar
vendored
BIN
android/gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
|
@ -1,6 +1,6 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
#include "testing/testing.hpp"
|
||||
|
||||
#include "base/macros.hpp"
|
||||
#include "base/stl_helpers.hpp"
|
||||
|
||||
#include <algorithm>
|
||||
#include <deque>
|
||||
#include <utility>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
|
||||
namespace stl_helpers_tests
|
||||
{
|
||||
using namespace base;
|
||||
|
||||
namespace stl_helpers_test
|
||||
{
|
||||
class Int
|
||||
{
|
||||
public:
|
||||
|
@ -326,4 +326,48 @@ UNIT_TEST(AccumulateIntervals)
|
|||
CheckAccumulateIntervals(idTest, arr1, arr2, res);
|
||||
}
|
||||
}
|
||||
|
||||
UNIT_TEST(Map_EmplaceOrAssign)
|
||||
{
|
||||
{
|
||||
std::map<std::string, std::string, std::less<>> theMap;
|
||||
|
||||
std::string_view key = "key";
|
||||
std::string_view val1 = "value";
|
||||
TEST(EmplaceOrAssign(theMap, key, val1).second, ());
|
||||
TEST_EQUAL(theMap.find(key)->second, val1, ());
|
||||
|
||||
std::string_view val2 = "some_long_value";
|
||||
TEST(!EmplaceOrAssign(theMap, key, val2).second, ());
|
||||
TEST_EQUAL(theMap.find(key)->second, val2, ());
|
||||
|
||||
std::string_view val3 = "some_other_long_value";
|
||||
TEST(!EmplaceOrAssign(theMap, key, std::string(val3)).second, ());
|
||||
TEST_EQUAL(theMap.find(key)->second, val3, ());
|
||||
}
|
||||
|
||||
{
|
||||
class Obj
|
||||
{
|
||||
int m_v;
|
||||
|
||||
Obj(Obj const &) = delete;
|
||||
Obj & operator=(Obj const &) = delete;
|
||||
public:
|
||||
Obj(int v) : m_v(v) {}
|
||||
Obj(Obj &&) = default;
|
||||
Obj & operator=(Obj &&) = default;
|
||||
|
||||
bool operator==(Obj const & o) const { return m_v == o.m_v; }
|
||||
bool operator<(Obj const & o) const { return m_v < o.m_v; }
|
||||
};
|
||||
|
||||
std::map<Obj, Obj> theMap;
|
||||
|
||||
TEST(EmplaceOrAssign(theMap, Obj(1), Obj(2)).second, ());
|
||||
TEST(!EmplaceOrAssign(theMap, Obj(1), Obj(3)).second, ());
|
||||
TEST(theMap.find(Obj(1))->second == Obj(3), ());
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace stl_helpers_test
|
||||
|
|
|
@ -165,6 +165,18 @@ bool IsExist(Cont const & c, T const & t)
|
|||
return std::find(std::cbegin(c), end, t) != end;
|
||||
}
|
||||
|
||||
template <class MapT, class K, class V>
|
||||
auto EmplaceOrAssign(MapT & theMap, K && k, V && v)
|
||||
{
|
||||
auto it = theMap.lower_bound(k);
|
||||
if (it != theMap.end() && k == it->first)
|
||||
{
|
||||
it->second = std::forward<V>(v);
|
||||
return std::make_pair(it, false);
|
||||
}
|
||||
return std::make_pair(theMap.emplace_hint(it, std::forward<K>(k), std::forward<V>(v)), true);
|
||||
}
|
||||
|
||||
// Creates a comparer being able to compare two instances of class C
|
||||
// (given by reference or pointer) by a field or const method of C.
|
||||
// For example, to create comparer that is able to compare pairs of
|
||||
|
|
|
@ -9618,7 +9618,7 @@ cs:4bezpečnost
|
|||
de:Polizeiwache|Polizei
|
||||
fr:Poste de police|Commissariat
|
||||
hi:3थाना
|
||||
it:Posto di polizia
|
||||
it:6Commissariato|5Questura|4Caserma|4Guardia|5Carabinieri
|
||||
ja:1屯所|ポリス|交番|お巡りさん|おまわりさん|通報
|
||||
ko:보안대
|
||||
pl:Policja|komisariat|posterunek
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"make_a_slight_right_turn":"Држите се десно.",
|
||||
"make_a_slight_right_turn":"Скрените благо десно.",
|
||||
"make_a_slight_right_turn_street":"NULL",
|
||||
"make_a_slight_right_turn_street_verb":"NULL",
|
||||
"make_a_right_turn":"Скрените десно.",
|
||||
|
@ -12,7 +12,7 @@
|
|||
"leave_the_roundabout":"Изађите из кружног тока.",
|
||||
"leave_the_roundabout_street":"NULL",
|
||||
"leave_the_roundabout_street_verb":"NULL",
|
||||
"make_a_slight_left_turn":"Држите се лево.",
|
||||
"make_a_slight_left_turn":"Скрените благо лево.",
|
||||
"make_a_slight_left_turn_street":"NULL",
|
||||
"make_a_slight_left_turn_street_verb":"NULL",
|
||||
"make_a_left_turn":"Скрените лево.",
|
||||
|
@ -24,8 +24,8 @@
|
|||
"make_a_u_turn_street_verb":"NULL",
|
||||
"go_straight":"Наставите право.",
|
||||
"exit":"Излаз.",
|
||||
"onto":"onto",
|
||||
"take_exit_number":"Take exit",
|
||||
"onto":"у улицу",
|
||||
"take_exit_number":"Изађите на излаз",
|
||||
"take_exit_number_street_verb":"NULL",
|
||||
"destination":"Стижете на одредиште.",
|
||||
"you_have_reached_the_destination":"Стигли сте.",
|
||||
|
@ -103,5 +103,5 @@
|
|||
"in_1_mile":"За једну миљу",
|
||||
"in_1_5_miles":"За једну и по миљу",
|
||||
"in_2_miles":"За две миље",
|
||||
"unknown_camera":"Пажња, радар!"
|
||||
"unknown_camera":"Пажња, прекршајна камера!"
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
ro = Păstrați la dreapta.
|
||||
ru = Держитесь правее.
|
||||
sk = Držte sa vpravo.
|
||||
sr = Држите се десно.
|
||||
sr = Скрените благо десно.
|
||||
sv = Håll höger.
|
||||
sw = Kaa kuria.
|
||||
th = ชิดขวาไว้
|
||||
|
@ -285,7 +285,7 @@
|
|||
ro = Păstrați la stânga.
|
||||
ru = Держитесь левее.
|
||||
sk = Držte sa vľavo.
|
||||
sr = Држите се лево.
|
||||
sr = Скрените благо лево.
|
||||
sv = Håll vänster.
|
||||
sw = Kaa kushoto.
|
||||
th = ชิดซ้ายไว้
|
||||
|
@ -565,6 +565,7 @@
|
|||
ro = pe
|
||||
ru = на
|
||||
sk = na
|
||||
sr = у улицу
|
||||
sv = in på
|
||||
sw = kwenye
|
||||
th = เข้าสู่
|
||||
|
@ -607,6 +608,7 @@
|
|||
ro = Ieșire pe
|
||||
ru = Съезд на
|
||||
sk = Výjazd na
|
||||
sr = Изађите на излаз
|
||||
sv = Utgång in på
|
||||
sw = Kuondoka kwenye
|
||||
th = ทางออก เข้าสู่
|
||||
|
@ -3021,7 +3023,7 @@
|
|||
ro = Cameră frontală
|
||||
ru = Впереди камера
|
||||
sk = Pozor, radar!
|
||||
sr = Пажња, радар!
|
||||
sr = Пажња, прекршајна камера!
|
||||
sv = Kamera framför
|
||||
sw = Kamera Mbele
|
||||
th = มีกล้องอยู่ข้างหน้า
|
||||
|
|
|
@ -17940,6 +17940,50 @@
|
|||
zh-Hans = 分钟
|
||||
zh-Hant = 分鐘
|
||||
|
||||
[day]
|
||||
tags = android,ios
|
||||
en = d
|
||||
af = d
|
||||
ar = يوم
|
||||
az = gün
|
||||
be = д
|
||||
bg = д
|
||||
ca = d
|
||||
cs = d
|
||||
da = d
|
||||
de = d
|
||||
es = d
|
||||
et = p
|
||||
eu = e
|
||||
fa = روز
|
||||
fi = pv
|
||||
fr = j
|
||||
he = י
|
||||
hi = दिन
|
||||
hu = nap
|
||||
id = hr
|
||||
it = g
|
||||
ja = 日
|
||||
ko = 일
|
||||
lt = d
|
||||
lv = d
|
||||
mr = दि
|
||||
nb = d
|
||||
nl = d
|
||||
pl = d
|
||||
pt = dia
|
||||
pt-BR = dia
|
||||
ro = z
|
||||
ru = д
|
||||
sk = d
|
||||
sv = d
|
||||
th = วัน
|
||||
tr = g
|
||||
uk = д
|
||||
vi = ngày
|
||||
zh-Hans = 天
|
||||
zh-Hant = 天
|
||||
|
||||
[placepage_more_button]
|
||||
tags = android,ios
|
||||
en = More
|
||||
|
|
|
@ -272,6 +272,9 @@ UNIT_TEST(GlyphLoadingTest)
|
|||
|
||||
constexpr int fontSize = 27;
|
||||
|
||||
renderer.SetString("Muḩāfaz̧at", fontSize, "en");
|
||||
RunTestLoop("Latin Extended", std::bind(&GlyphRenderer::RenderGlyphs, &renderer, _1));
|
||||
|
||||
renderer.SetString("Строка", fontSize, "ru");
|
||||
RunTestLoop("ru", std::bind(&GlyphRenderer::RenderGlyphs, &renderer, _1));
|
||||
|
||||
|
|
|
@ -19,8 +19,8 @@ struct SupportManager::Configuration
|
|||
Version m_driverVersion;
|
||||
};
|
||||
|
||||
char const * kSupportedAntialiasing = "Antialiasing";
|
||||
static char const * kVulkanForbidden = "VulkanForbidden";
|
||||
std::string_view kSupportedAntialiasing = "Antialiasing";
|
||||
std::string_view constexpr kVulkanForbidden = "VulkanForbidden";
|
||||
|
||||
void SupportManager::Init(ref_ptr<GraphicsContext> context)
|
||||
{
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
|
||||
namespace dp
|
||||
{
|
||||
extern char const * kSupportedAntialiasing;
|
||||
extern std::string_view kSupportedAntialiasing;
|
||||
|
||||
class SupportManager
|
||||
{
|
||||
|
|
|
@ -18,8 +18,8 @@ using namespace std::placeholders;
|
|||
|
||||
namespace
|
||||
{
|
||||
std::string const kLocationStateMode = "LastLocationStateMode";
|
||||
std::string const kLastEnterBackground = "LastEnterBackground";
|
||||
std::string_view constexpr kLocationStateMode = "LastLocationStateMode";
|
||||
std::string_view constexpr kLastEnterBackground = "LastEnterBackground";
|
||||
}
|
||||
|
||||
DrapeEngine::DrapeEngine(Params && params)
|
||||
|
|
|
@ -49,11 +49,11 @@ ReadManager::ReadManager(ref_ptr<ThreadsCommutator> commutator, MapDataProvider
|
|||
, m_trafficEnabled(trafficEnabled)
|
||||
, m_isolinesEnabled(isolinesEnabled)
|
||||
, m_modeChanged(false)
|
||||
, m_mapLangIndex(StringUtf8Multilang::kDefaultCode)
|
||||
, m_tasksPool(64, ReadMWMTaskFactory(m_model))
|
||||
, m_counter(0)
|
||||
, m_generationCounter(0)
|
||||
, m_userMarksGenerationCounter(0)
|
||||
, m_mapLangIndex(StringUtf8Multilang::kDefaultCode)
|
||||
{
|
||||
Start();
|
||||
}
|
||||
|
|
|
@ -246,7 +246,7 @@ void EditorTest::GetFeatureTypeInfoTest()
|
|||
|
||||
auto const featuresAfter = editor.m_features.Get();
|
||||
auto const fti = editor.GetFeatureTypeInfo(*featuresAfter, ft.GetID().m_mwmId, ft.GetID().m_index);
|
||||
TEST_NOT_EQUAL(fti, 0, ());
|
||||
TEST_NOT_EQUAL(fti, nullptr, ());
|
||||
TEST_EQUAL(fti->m_object.GetID(), ft.GetID(), ());
|
||||
});
|
||||
}
|
||||
|
|
|
@ -1,23 +1,20 @@
|
|||
#include "testing/testing.hpp"
|
||||
|
||||
#include "geometry/bounding_box.hpp"
|
||||
#include "geometry/point2d.hpp"
|
||||
|
||||
using namespace m2;
|
||||
|
||||
namespace
|
||||
namespace bounding_box_tests
|
||||
{
|
||||
UNIT_TEST(BoundingBox_Smoke)
|
||||
{
|
||||
{
|
||||
BoundingBox bbox;
|
||||
m2::BoundingBox bbox;
|
||||
|
||||
TEST(!bbox.HasPoint(0, 0), ());
|
||||
TEST(!bbox.HasPoint(-1, 1), ());
|
||||
}
|
||||
|
||||
{
|
||||
BoundingBox bbox;
|
||||
m2::BoundingBox bbox;
|
||||
|
||||
bbox.Add(0, 0);
|
||||
TEST(bbox.HasPoint(0, 0), ());
|
||||
|
@ -33,4 +30,4 @@ UNIT_TEST(BoundingBox_Smoke)
|
|||
TEST(bbox.HasPoint(0.5, 0.5), ());
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
} // namespace bounding_box_tests
|
|
@ -1,21 +1,18 @@
|
|||
#include "testing/testing.hpp"
|
||||
|
||||
#include "geometry/diamond_box.hpp"
|
||||
#include "geometry/point2d.hpp"
|
||||
|
||||
using namespace m2;
|
||||
|
||||
namespace
|
||||
namespace diamond_box_tests
|
||||
{
|
||||
UNIT_TEST(DiamondBox_Smoke)
|
||||
{
|
||||
{
|
||||
DiamondBox dbox;
|
||||
m2::DiamondBox dbox;
|
||||
TEST(!dbox.HasPoint(0, 0), ());
|
||||
}
|
||||
|
||||
{
|
||||
DiamondBox dbox;
|
||||
m2::DiamondBox dbox;
|
||||
dbox.Add(0, 0);
|
||||
TEST(dbox.HasPoint(0, 0), ());
|
||||
TEST(!dbox.HasPoint(0, 1), ());
|
||||
|
@ -32,7 +29,7 @@ UNIT_TEST(DiamondBox_Smoke)
|
|||
}
|
||||
|
||||
{
|
||||
DiamondBox dbox;
|
||||
m2::DiamondBox dbox;
|
||||
|
||||
dbox.Add(0, 1);
|
||||
dbox.Add(0, -1);
|
||||
|
@ -50,4 +47,4 @@ UNIT_TEST(DiamondBox_Smoke)
|
|||
TEST(!dbox.HasPoint(-0.51, -0.51), ());
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
} // namespace diamond_box_tests
|
||||
|
|
|
@ -6,10 +6,9 @@
|
|||
|
||||
#include <iterator>
|
||||
|
||||
using namespace m2::robust;
|
||||
|
||||
namespace
|
||||
namespace robust_test
|
||||
{
|
||||
using namespace m2::robust;
|
||||
using P = m2::PointD;
|
||||
|
||||
template <typename TIt>
|
||||
|
@ -29,7 +28,6 @@ bool InsideTriangle(P const & p, P const ps[])
|
|||
{
|
||||
return IsPointInsideTriangle(p, ps[0], ps[1], ps[2]);
|
||||
}
|
||||
} // namespace
|
||||
|
||||
UNIT_TEST(OrientedS_Smoke)
|
||||
{
|
||||
|
@ -170,3 +168,4 @@ UNIT_TEST(PolygonSelfIntersections_TangentSmoke)
|
|||
CheckSelfIntersections(&arr[0], arr + ARRAY_SIZE(arr), false);
|
||||
}
|
||||
}
|
||||
} // namespace robust_test
|
|
@ -91,7 +91,9 @@
|
|||
ED965B102CD67A470049E39E /* DistanceFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = ED965B092CD67A470049E39E /* DistanceFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
ED965B132CD67A9B0049E39E /* AltitudeFormatter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ED965B122CD67A9B0049E39E /* AltitudeFormatter.mm */; };
|
||||
ED965B142CD67A9B0049E39E /* AltitudeFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = ED965B112CD67A9B0049E39E /* AltitudeFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
ED965B162CD67ABA0049E39E /* DateTimeFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED965B152CD67ABA0049E39E /* DateTimeFormatter.swift */; };
|
||||
ED965B222CD8F5AA0049E39E /* DurationFormatter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ED965B212CD8F5AA0049E39E /* DurationFormatter.mm */; };
|
||||
ED965B232CD8F5AA0049E39E /* DurationFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = ED965B202CD8F5AA0049E39E /* DurationFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
ED965B2A2CDA1C440049E39E /* DateTimeFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED965B282CDA159C0049E39E /* DateTimeFormatter.swift */; };
|
||||
EDC4E3512C5D222D009286A2 /* RecentlyDeletedCategory.mm in Sources */ = {isa = PBXBuildFile; fileRef = EDC4E34E2C5D222D009286A2 /* RecentlyDeletedCategory.mm */; };
|
||||
EDC4E3522C5D222D009286A2 /* RecentlyDeletedCategory.h in Headers */ = {isa = PBXBuildFile; fileRef = EDC4E34F2C5D222D009286A2 /* RecentlyDeletedCategory.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
EDC4E3532C5D222D009286A2 /* RecentlyDeletedCategory+Core.h in Headers */ = {isa = PBXBuildFile; fileRef = EDC4E3502C5D222D009286A2 /* RecentlyDeletedCategory+Core.h */; };
|
||||
|
@ -189,7 +191,9 @@
|
|||
ED965B0A2CD67A470049E39E /* DistanceFormatter.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = DistanceFormatter.mm; sourceTree = "<group>"; };
|
||||
ED965B112CD67A9B0049E39E /* AltitudeFormatter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AltitudeFormatter.h; sourceTree = "<group>"; };
|
||||
ED965B122CD67A9B0049E39E /* AltitudeFormatter.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AltitudeFormatter.mm; sourceTree = "<group>"; };
|
||||
ED965B152CD67ABA0049E39E /* DateTimeFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateTimeFormatter.swift; sourceTree = "<group>"; };
|
||||
ED965B202CD8F5AA0049E39E /* DurationFormatter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DurationFormatter.h; sourceTree = "<group>"; };
|
||||
ED965B212CD8F5AA0049E39E /* DurationFormatter.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = DurationFormatter.mm; sourceTree = "<group>"; };
|
||||
ED965B282CDA159C0049E39E /* DateTimeFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateTimeFormatter.swift; sourceTree = "<group>"; };
|
||||
EDC4E34E2C5D222D009286A2 /* RecentlyDeletedCategory.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RecentlyDeletedCategory.mm; sourceTree = "<group>"; };
|
||||
EDC4E34F2C5D222D009286A2 /* RecentlyDeletedCategory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RecentlyDeletedCategory.h; sourceTree = "<group>"; };
|
||||
EDC4E3502C5D222D009286A2 /* RecentlyDeletedCategory+Core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "RecentlyDeletedCategory+Core.h"; sourceTree = "<group>"; };
|
||||
|
@ -434,11 +438,13 @@
|
|||
ED965B0B2CD67A470049E39E /* Formatting */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
ED965B152CD67ABA0049E39E /* DateTimeFormatter.swift */,
|
||||
ED965B112CD67A9B0049E39E /* AltitudeFormatter.h */,
|
||||
ED965B122CD67A9B0049E39E /* AltitudeFormatter.mm */,
|
||||
ED965B092CD67A470049E39E /* DistanceFormatter.h */,
|
||||
ED965B0A2CD67A470049E39E /* DistanceFormatter.mm */,
|
||||
ED965B282CDA159C0049E39E /* DateTimeFormatter.swift */,
|
||||
ED965B202CD8F5AA0049E39E /* DurationFormatter.h */,
|
||||
ED965B212CD8F5AA0049E39E /* DurationFormatter.mm */,
|
||||
);
|
||||
path = Formatting;
|
||||
sourceTree = "<group>";
|
||||
|
@ -506,6 +512,7 @@
|
|||
47942D9C237D927800DEFAE3 /* PlacePageBookmarkData.h in Headers */,
|
||||
EDC4E3522C5D222D009286A2 /* RecentlyDeletedCategory.h in Headers */,
|
||||
47942D72237CC40B00DEFAE3 /* OpeningHours.h in Headers */,
|
||||
ED965B232CD8F5AA0049E39E /* DurationFormatter.h in Headers */,
|
||||
ED0B1FF42CAAE3FF006E31A4 /* DeepLinkInAppFeatureHighlightData.h in Headers */,
|
||||
47942D6B237CC3D600DEFAE3 /* PlacePageData.h in Headers */,
|
||||
47D609DC234FE625008ECC47 /* MWMBookmarksObserver.h in Headers */,
|
||||
|
@ -593,7 +600,6 @@
|
|||
47942D88237CCA8800DEFAE3 /* PlacePagePreviewData.mm in Sources */,
|
||||
47942D9D237D927800DEFAE3 /* PlacePageBookmarkData.mm in Sources */,
|
||||
47942D86237CC55500DEFAE3 /* MWMOpeningHoursCommon.mm in Sources */,
|
||||
ED965B162CD67ABA0049E39E /* DateTimeFormatter.swift in Sources */,
|
||||
9974CA2A23DF1968003FE824 /* ElevationProfileData.mm in Sources */,
|
||||
47942D82237CC52A00DEFAE3 /* MWMOpeningHours.mm in Sources */,
|
||||
ED965B132CD67A9B0049E39E /* AltitudeFormatter.mm in Sources */,
|
||||
|
@ -616,12 +622,14 @@
|
|||
472602A924092C5B00731135 /* MWMGeoUtil.mm in Sources */,
|
||||
47F701F0238C86F000D18E95 /* PlacePageButtonsData.mm in Sources */,
|
||||
9940622123EAC57900493D1A /* ElevationHeightPoint.m in Sources */,
|
||||
ED965B2A2CDA1C440049E39E /* DateTimeFormatter.swift in Sources */,
|
||||
47EEAFF42350CEDB005CF316 /* AppInfo.mm in Sources */,
|
||||
47E8163623B1889C008FD836 /* MWMStorage.mm in Sources */,
|
||||
ED965B0D2CD67A470049E39E /* DistanceFormatter.mm in Sources */,
|
||||
EDC4E3512C5D222D009286A2 /* RecentlyDeletedCategory.mm in Sources */,
|
||||
47CA68DE2502022400671019 /* MWMBookmark.mm in Sources */,
|
||||
9957FAE9237AE5B000855F48 /* Logger.mm in Sources */,
|
||||
ED965B222CD8F5AA0049E39E /* DurationFormatter.mm in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -694,8 +702,6 @@
|
|||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 6.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
|
@ -721,7 +727,6 @@
|
|||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_VERSION = 6.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
|
|
|
@ -30,6 +30,7 @@ FOUNDATION_EXPORT const unsigned char CoreApiVersionString[];
|
|||
#import <CoreApi/RecentlyDeletedCategory.h>
|
||||
#import "CoreApi/DistanceFormatter.h"
|
||||
#import "CoreApi/AltitudeFormatter.h"
|
||||
#import "CoreApi/DurationFormatter.h"
|
||||
|
||||
#pragma mark - Place Page
|
||||
|
||||
|
|
|
@ -2,20 +2,8 @@ import Foundation
|
|||
|
||||
@objcMembers
|
||||
public final class DateTimeFormatter: NSObject {
|
||||
private static let timeFormatter: DateComponentsFormatter = {
|
||||
let formatter = DateComponentsFormatter()
|
||||
formatter.allowedUnits = [.day, .hour, .minute]
|
||||
formatter.unitsStyle = .short
|
||||
formatter.maximumUnitCount = 2
|
||||
formatter.zeroFormattingBehavior = .dropAll
|
||||
return formatter
|
||||
}()
|
||||
private static let dateFormatter = DateFormatter()
|
||||
|
||||
public static func durationString(from timeInterval: TimeInterval) -> String {
|
||||
timeFormatter.string(from: timeInterval) ?? ""
|
||||
}
|
||||
|
||||
public static func dateString(from date: Date, dateStyle: DateFormatter.Style, timeStyle: DateFormatter.Style) -> String {
|
||||
DateFormatter.localizedString(from: date, dateStyle: dateStyle, timeStyle: timeStyle)
|
||||
}
|
||||
|
|
11
iphone/CoreApi/CoreApi/Formatting/DurationFormatter.h
Normal file
11
iphone/CoreApi/CoreApi/Formatting/DurationFormatter.h
Normal file
|
@ -0,0 +1,11 @@
|
|||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface DurationFormatter: NSObject
|
||||
|
||||
+ (NSString *)durationStringFromTimeInterval:(NSTimeInterval)timeInterval NS_SWIFT_NAME(durationString(from:));
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
12
iphone/CoreApi/CoreApi/Formatting/DurationFormatter.mm
Normal file
12
iphone/CoreApi/CoreApi/Formatting/DurationFormatter.mm
Normal file
|
@ -0,0 +1,12 @@
|
|||
#import "DurationFormatter.h"
|
||||
|
||||
#include "platform/duration.hpp"
|
||||
|
||||
@implementation DurationFormatter
|
||||
|
||||
+ (NSString *)durationStringFromTimeInterval:(NSTimeInterval)timeInterval {
|
||||
auto const duration = platform::Duration(static_cast<int>(timeInterval));
|
||||
return [NSString stringWithCString:duration.GetPlatformLocalizedString().c_str() encoding:NSUTF8StringEncoding];
|
||||
}
|
||||
|
||||
@end
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
#import <AudioToolbox/AudioServices.h>
|
||||
#import <CoreApi/Framework.h>
|
||||
#import <CoreApi/CoreApi-Swift.h>
|
||||
#import <CoreApi/DurationFormatter.h>
|
||||
|
||||
#include "routing/following_info.hpp"
|
||||
#include "routing/turns.hpp"
|
||||
|
@ -142,7 +142,7 @@ NSArray<MWMRouterTransitStepInfo *> *buildRouteTransitSteps(NSArray<MWMRoutePoin
|
|||
|
||||
auto result = [[NSMutableAttributedString alloc] initWithString:@""];
|
||||
if (self.showEta) {
|
||||
NSString * eta = [DateTimeFormatter durationStringFrom:self.timeToTarget];
|
||||
NSString * eta = [DurationFormatter durationStringFromTimeInterval:self.timeToTarget];
|
||||
[result appendAttributedString:[[NSMutableAttributedString alloc] initWithString:eta attributes:primaryAttributes]];
|
||||
[result appendAttributedString:MWMNavigationDashboardEntity.estimateDot];
|
||||
}
|
||||
|
|
|
@ -136,7 +136,7 @@ final class NavigationControlView: SolidTouchView, MWMTextToSpeechObserver, MapO
|
|||
]
|
||||
|
||||
if timePageControl.currentPage == 0 {
|
||||
timeLabel.text = DateTimeFormatter.durationString(from: TimeInterval(info.timeToTarget))
|
||||
timeLabel.text = DurationFormatter.durationString(from: TimeInterval(info.timeToTarget))
|
||||
} else {
|
||||
timeLabel.text = info.arrival
|
||||
}
|
||||
|
|
|
@ -68,13 +68,17 @@ NSString *const kSettingsSegue = @"Map2Settings";
|
|||
|
||||
@interface MapViewController () <MWMFrameworkDrapeObserver,
|
||||
MWMKeyboardObserver,
|
||||
MWMBookmarksObserver>
|
||||
MWMBookmarksObserver,
|
||||
UIGestureRecognizerDelegate>
|
||||
|
||||
@property(nonatomic, readwrite) MWMMapViewControlsManager *controlsManager;
|
||||
|
||||
@property(nonatomic) BOOL disableStandbyOnLocationStateMode;
|
||||
|
||||
@property(nonatomic) UserTouchesAction userTouchesAction;
|
||||
@property(nonatomic) CGPoint pointerLocation API_AVAILABLE(ios(14.0));
|
||||
@property(nonatomic) CGFloat currentScale;
|
||||
@property(nonatomic) CGFloat currentRotation;
|
||||
|
||||
@property(nonatomic, readwrite) MWMMapDownloadDialog *downloadDialog;
|
||||
|
||||
|
@ -317,6 +321,9 @@ NSString *const kSettingsSegue = @"Map2Settings";
|
|||
- (void)viewDidLoad {
|
||||
[super viewDidLoad];
|
||||
|
||||
if (@available(iOS 14.0, *))
|
||||
[self setupTrackPadGestureRecognizers];
|
||||
|
||||
self.title = L(@"map");
|
||||
|
||||
// On iOS 10 (it was reproduced, it may be also on others), mapView can be uninitialized
|
||||
|
@ -345,7 +352,7 @@ NSString *const kSettingsSegue = @"Map2Settings";
|
|||
|
||||
if ([MWMNavigationDashboardManager sharedManager].state == MWMNavigationDashboardStateHidden)
|
||||
self.controlsManager.menuState = self.controlsManager.menuRestoreState;
|
||||
|
||||
|
||||
// Added in https://github.com/organicmaps/organicmaps/pull/7333
|
||||
// After all users migrate to OAuth2 we can remove next code
|
||||
[self migrateOAuthCredentials];
|
||||
|
@ -387,6 +394,33 @@ NSString *const kSettingsSegue = @"Map2Settings";
|
|||
[MapsAppDelegate customizeAppearance];
|
||||
}
|
||||
|
||||
- (void)setupTrackPadGestureRecognizers API_AVAILABLE(ios(14.0)) {
|
||||
if (!NSProcessInfo.processInfo.isiOSAppOnMac)
|
||||
return;
|
||||
// Mouse zoom
|
||||
UIPanGestureRecognizer * panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
|
||||
panRecognizer.allowedScrollTypesMask = UIScrollTypeMaskAll;
|
||||
panRecognizer.allowedTouchTypes = @[@(UITouchTypeIndirect)];
|
||||
[self.view addGestureRecognizer:panRecognizer];
|
||||
|
||||
// Trackpad zoom
|
||||
UIPinchGestureRecognizer * pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)];
|
||||
pinchRecognizer.allowedTouchTypes = @[@(UITouchTypeIndirect)];
|
||||
pinchRecognizer.delegate = self;
|
||||
[self.view addGestureRecognizer:pinchRecognizer];
|
||||
|
||||
// Trackpad rotation
|
||||
UIRotationGestureRecognizer * rotationRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(handleRotation:)];
|
||||
rotationRecognizer.allowedTouchTypes = @[@(UITouchTypeIndirect | UITouchTypeDirect)];
|
||||
rotationRecognizer.delegate = self;
|
||||
[self.view addGestureRecognizer:rotationRecognizer];
|
||||
|
||||
// Pointer location
|
||||
UIHoverGestureRecognizer * hoverRecognizer = [[UIHoverGestureRecognizer alloc] initWithTarget:self action:@selector(handlePointerHover:)];
|
||||
hoverRecognizer.allowedTouchTypes = @[@(UITouchTypeIndirectPointer)];
|
||||
[self.view addGestureRecognizer:hoverRecognizer];
|
||||
}
|
||||
|
||||
- (void)showViralAlertIfNeeded {
|
||||
NSUserDefaults *ud = NSUserDefaults.standardUserDefaults;
|
||||
|
||||
|
@ -755,4 +789,84 @@ NSString *const kSettingsSegue = @"Map2Settings";
|
|||
}
|
||||
}
|
||||
|
||||
// MARK: - Handle macOS trackpad gestures
|
||||
|
||||
- (void)handlePan:(UIPanGestureRecognizer *)recognizer API_AVAILABLE(ios(14.0)) {
|
||||
switch (recognizer.state) {
|
||||
case UIGestureRecognizerStateBegan:
|
||||
case UIGestureRecognizerStateChanged:
|
||||
{
|
||||
CGPoint translation = [recognizer translationInView:self.view];
|
||||
if (translation.x == 0 && CGPointEqualToPoint(translation, CGPointZero))
|
||||
return;
|
||||
self.userTouchesAction = UserTouchesActionScale;
|
||||
static const CGFloat kScaleFactor = 0.9;
|
||||
const CGFloat factor = translation.y > 0 ? 1 / kScaleFactor : kScaleFactor;
|
||||
GetFramework().Scale(factor, [self getZoomPoint], false);
|
||||
[recognizer setTranslation:CGPointZero inView:self.view];
|
||||
break;
|
||||
}
|
||||
case UIGestureRecognizerStateEnded:
|
||||
self.userTouchesAction = UserTouchesActionNone;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)handlePinch:(UIPinchGestureRecognizer *)recognizer API_AVAILABLE(ios(14.0)) {
|
||||
switch (recognizer.state) {
|
||||
case UIGestureRecognizerStateBegan:
|
||||
self.currentScale = 1.0;
|
||||
case UIGestureRecognizerStateChanged:
|
||||
{
|
||||
const CGFloat scale = [recognizer scale];
|
||||
static const CGFloat kScaleDeltaMultiplier = 4.0; // map trackpad scale to the map scale
|
||||
const CGFloat delta = scale - self.currentScale;
|
||||
const CGFloat scaleFactor = 1 + delta * kScaleDeltaMultiplier;
|
||||
GetFramework().Scale(scaleFactor, [self getZoomPoint], false);
|
||||
self.currentScale = scale;
|
||||
break;
|
||||
}
|
||||
case UIGestureRecognizerStateEnded:
|
||||
self.userTouchesAction = UserTouchesActionNone;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)handleRotation:(UIRotationGestureRecognizer *)recognizer API_AVAILABLE(ios(14.0)) {
|
||||
switch (recognizer.state) {
|
||||
case UIGestureRecognizerStateBegan:
|
||||
case UIGestureRecognizerStateChanged:
|
||||
{
|
||||
self.userTouchesAction = UserTouchesActionDrag;
|
||||
GetFramework().Rotate(self.currentRotation == 0 ? recognizer.rotation : self.currentRotation + recognizer.rotation, false);
|
||||
break;
|
||||
}
|
||||
case UIGestureRecognizerStateEnded:
|
||||
self.currentRotation += recognizer.rotation;
|
||||
self.userTouchesAction = UserTouchesActionNone;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)handlePointerHover:(UIHoverGestureRecognizer *)recognizer API_AVAILABLE(ios(14.0)) {
|
||||
self.pointerLocation = [recognizer locationInView:self.view];
|
||||
}
|
||||
|
||||
- (m2::PointD)getZoomPoint API_AVAILABLE(ios(14.0)) {
|
||||
const CGFloat scale = [UIScreen mainScreen].scale;
|
||||
return m2::PointD(self.pointerLocation.x * scale, self.pointerLocation.y * scale);
|
||||
}
|
||||
|
||||
// MARK: - UIGestureRecognizerDelegate
|
||||
|
||||
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
|
||||
return YES;
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "د";
|
||||
|
||||
"day" = "يوم";
|
||||
|
||||
"placepage_more_button" = "المزيد";
|
||||
|
||||
"book_button" = "حجز";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "dəq";
|
||||
|
||||
"day" = "gün";
|
||||
|
||||
"placepage_more_button" = "Digər";
|
||||
|
||||
"book_button" = "Rezervasyon";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "хв";
|
||||
|
||||
"day" = "д";
|
||||
|
||||
"placepage_more_button" = "Яшчэ";
|
||||
|
||||
"book_button" = "Забраніраваць";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "мин";
|
||||
|
||||
"day" = "д";
|
||||
|
||||
"placepage_more_button" = "Още";
|
||||
|
||||
"book_button" = "Резервиране";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "d";
|
||||
|
||||
"placepage_more_button" = "Més";
|
||||
|
||||
"book_button" = "Reserva";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "d";
|
||||
|
||||
"placepage_more_button" = "Více";
|
||||
|
||||
"book_button" = "Rezervace";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "d";
|
||||
|
||||
"placepage_more_button" = "Mere";
|
||||
|
||||
"book_button" = "Book";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "d";
|
||||
|
||||
"placepage_more_button" = "Mehr";
|
||||
|
||||
"book_button" = "Buchen";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "d";
|
||||
|
||||
"placepage_more_button" = "Περισσότερα";
|
||||
|
||||
"book_button" = "Κράτηση";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "d";
|
||||
|
||||
"placepage_more_button" = "More";
|
||||
|
||||
"book_button" = "Book";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "d";
|
||||
|
||||
"placepage_more_button" = "More";
|
||||
|
||||
"book_button" = "Book";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "d";
|
||||
|
||||
"placepage_more_button" = "Más";
|
||||
|
||||
"book_button" = "Reservar";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "d";
|
||||
|
||||
"placepage_more_button" = "Más";
|
||||
|
||||
"book_button" = "Reservar";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "p";
|
||||
|
||||
"placepage_more_button" = "Veel";
|
||||
|
||||
"book_button" = "Reserveeri";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "e";
|
||||
|
||||
"placepage_more_button" = "Gehiago";
|
||||
|
||||
"book_button" = "Erreserba";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "دقیقه";
|
||||
|
||||
"day" = "روز";
|
||||
|
||||
"placepage_more_button" = "بیشتر";
|
||||
|
||||
"book_button" = "رزرو";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "pv";
|
||||
|
||||
"placepage_more_button" = "Lisää";
|
||||
|
||||
"book_button" = "Varaa";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "j";
|
||||
|
||||
"placepage_more_button" = "Plus";
|
||||
|
||||
"book_button" = "Réserver";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "ד׳";
|
||||
|
||||
"day" = "י";
|
||||
|
||||
"placepage_more_button" = "עוד";
|
||||
|
||||
"book_button" = "הזמנה";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "मिनट";
|
||||
|
||||
"day" = "दिन";
|
||||
|
||||
"placepage_more_button" = "More";
|
||||
|
||||
"book_button" = "Book";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "p";
|
||||
|
||||
"day" = "nap";
|
||||
|
||||
"placepage_more_button" = "Még";
|
||||
|
||||
"book_button" = "Foglalás";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "mnt";
|
||||
|
||||
"day" = "hr";
|
||||
|
||||
"placepage_more_button" = "Lainnya";
|
||||
|
||||
"book_button" = "Pesan";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "g";
|
||||
|
||||
"placepage_more_button" = "Di più";
|
||||
|
||||
"book_button" = "Prenota";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "分";
|
||||
|
||||
"day" = "日";
|
||||
|
||||
"placepage_more_button" = "さらに詳しく";
|
||||
|
||||
"book_button" = "予約";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "일";
|
||||
|
||||
"placepage_more_button" = "자세히";
|
||||
|
||||
"book_button" = "예약";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "मिनिट";
|
||||
|
||||
"day" = "दि";
|
||||
|
||||
"placepage_more_button" = "अधिक";
|
||||
|
||||
"book_button" = "पुस्तक";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "d";
|
||||
|
||||
"placepage_more_button" = "Mer";
|
||||
|
||||
"book_button" = "Bestill";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "d";
|
||||
|
||||
"placepage_more_button" = "Meer";
|
||||
|
||||
"book_button" = "Boek";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "d";
|
||||
|
||||
"placepage_more_button" = "Więcej";
|
||||
|
||||
"book_button" = "Zarezerwuj";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "dia";
|
||||
|
||||
"placepage_more_button" = "Mais";
|
||||
|
||||
"book_button" = "Reservar";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "dia";
|
||||
|
||||
"placepage_more_button" = "Mais";
|
||||
|
||||
"book_button" = "Reservas";
|
||||
|
|
|
@ -795,6 +795,8 @@
|
|||
|
||||
"minute" = "min";
|
||||
|
||||
"day" = "z";
|
||||
|
||||
"placepage_more_button" = "Mai mult";
|
||||
|
||||
"book_button" = "Rezervare";
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Reference in a new issue