Merge branch 'master' into gsoc21-custom-picture-selector

This commit is contained in:
Aditya-Srivastav 2021-08-18 15:44:23 +05:30 committed by GitHub
commit 380471600a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
53 changed files with 3310 additions and 270 deletions

View file

@ -17,6 +17,8 @@ import androidx.browser.customtabs.CustomTabColorSchemeParams;
import androidx.browser.customtabs.CustomTabsIntent; import androidx.browser.customtabs.CustomTabsIntent;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import fr.free.nrw.commons.kvstore.JsonKvStore;
import java.util.Date;
import org.wikipedia.dataclient.WikiSite; import org.wikipedia.dataclient.WikiSite;
import org.wikipedia.page.PageTitle; import org.wikipedia.page.PageTitle;
@ -29,6 +31,7 @@ import fr.free.nrw.commons.utils.ViewUtil;
import timber.log.Timber; import timber.log.Timber;
import static android.widget.Toast.LENGTH_SHORT; import static android.widget.Toast.LENGTH_SHORT;
import static fr.free.nrw.commons.campaigns.CampaignView.CAMPAIGNS_DEFAULT_PREFERENCE;
public class Utils { public class Utils {
@ -210,4 +213,35 @@ public class Utils {
textView.setText(content); textView.setText(content);
} }
/**
* For now we are enabling the monuments only when the date lies between 1 Sept & 31 OCt
* @param date
* @return
*/
public static boolean isMonumentsEnabled(final Date date, final JsonKvStore store){
if(date.getDay()>=1 && date.getMonth()>=9 && date.getDay()<=31 && date.getMonth()<=10 ){
return true;
}
return store.getBoolean(CAMPAIGNS_DEFAULT_PREFERENCE) || true ;
}
/**
* Util function to get the start date of wlm monument
* For this release we are hardcoding it to be 1st September
* @return
*/
public static String getWLMStartDate() {
return "1 Sep";
}
/***
* Util function to get the end date of wlm monument
* For this release we are hardcoding it to be 31st October
* @return
*/
public static String getWLMEndDate() {
return "31 Oct";
}
} }

View file

@ -147,25 +147,25 @@ public class BookmarkLocationsDao {
} }
@NonNull @NonNull
Place fromCursor(Cursor cursor) { Place fromCursor(final Cursor cursor) {
LatLng location = new LatLng(cursor.getDouble(cursor.getColumnIndex(Table.COLUMN_LAT)), final LatLng location = new LatLng(cursor.getDouble(cursor.getColumnIndex(Table.COLUMN_LAT)),
cursor.getDouble(cursor.getColumnIndex(Table.COLUMN_LONG)), 1F); cursor.getDouble(cursor.getColumnIndex(Table.COLUMN_LONG)), 1F);
Sitelinks.Builder builder = new Sitelinks.Builder(); final Sitelinks.Builder builder = new Sitelinks.Builder();
builder.setWikipediaLink(cursor.getString(cursor.getColumnIndex(Table.COLUMN_WIKIPEDIA_LINK))); builder.setWikipediaLink(cursor.getString(cursor.getColumnIndex(Table.COLUMN_WIKIPEDIA_LINK)));
builder.setWikidataLink(cursor.getString(cursor.getColumnIndex(Table.COLUMN_WIKIDATA_LINK))); builder.setWikidataLink(cursor.getString(cursor.getColumnIndex(Table.COLUMN_WIKIDATA_LINK)));
builder.setCommonsLink(cursor.getString(cursor.getColumnIndex(Table.COLUMN_COMMONS_LINK))); builder.setCommonsLink(cursor.getString(cursor.getColumnIndex(Table.COLUMN_COMMONS_LINK)));
return new Place( return new Place(
cursor.getString(cursor.getColumnIndex(Table.COLUMN_LANGUAGE)), cursor.getString(cursor.getColumnIndex(Table.COLUMN_LANGUAGE)),
cursor.getString(cursor.getColumnIndex(Table.COLUMN_NAME)), cursor.getString(cursor.getColumnIndex(Table.COLUMN_NAME)),
Label.fromText((cursor.getString(cursor.getColumnIndex(Table.COLUMN_LABEL_TEXT)))), Label.fromText((cursor.getString(cursor.getColumnIndex(Table.COLUMN_LABEL_TEXT)))),
cursor.getString(cursor.getColumnIndex(Table.COLUMN_DESCRIPTION)), cursor.getString(cursor.getColumnIndex(Table.COLUMN_DESCRIPTION)),
location, location,
cursor.getString(cursor.getColumnIndex(Table.COLUMN_CATEGORY)), cursor.getString(cursor.getColumnIndex(Table.COLUMN_CATEGORY)),
builder.build(), builder.build(),
cursor.getString(cursor.getColumnIndex(Table.COLUMN_PIC)), cursor.getString(cursor.getColumnIndex(Table.COLUMN_PIC)),
Boolean.parseBoolean(cursor.getString(cursor.getColumnIndex(Table.COLUMN_EXISTS))) Boolean.parseBoolean(cursor.getString(cursor.getColumnIndex(Table.COLUMN_EXISTS)))
); );
} }
@ -220,7 +220,7 @@ public class BookmarkLocationsDao {
COLUMN_WIKIDATA_LINK, COLUMN_WIKIDATA_LINK,
COLUMN_COMMONS_LINK, COLUMN_COMMONS_LINK,
COLUMN_PIC, COLUMN_PIC,
COLUMN_EXISTS COLUMN_EXISTS,
}; };
static final String DROP_TABLE_STATEMENT = "DROP TABLE IF EXISTS " + TABLE_NAME; static final String DROP_TABLE_STATEMENT = "DROP TABLE IF EXISTS " + TABLE_NAME;
@ -251,7 +251,7 @@ public class BookmarkLocationsDao {
onCreate(db); onCreate(db);
} }
public static void onUpdate(SQLiteDatabase db, int from, int to) { public static void onUpdate(final SQLiteDatabase db, int from, final int to) {
Timber.d("bookmarksLocations db is updated from:"+from+", to:"+to); Timber.d("bookmarksLocations db is updated from:"+from+", to:"+to);
if (from == to) { if (from == to) {
return; return;

View file

@ -7,4 +7,5 @@ data class Campaign(var title: String? = null,
var description: String? = null, var description: String? = null,
var startDate: String? = null, var startDate: String? = null,
var endDate: String? = null, var endDate: String? = null,
var link: String? = null) var link: String? = null,
var isWLMCampaign: Boolean = false)

View file

@ -4,11 +4,13 @@ import android.content.Context;
import android.net.Uri; import android.net.Uri;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.View; import android.view.View;
import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import fr.free.nrw.commons.theme.BaseActivity;
import org.wikipedia.util.DateUtil; import org.wikipedia.util.DateUtil;
import java.text.ParseException; import java.text.ParseException;
@ -27,9 +29,14 @@ import fr.free.nrw.commons.utils.ViewUtil;
* A view which represents a single campaign * A view which represents a single campaign
*/ */
public class CampaignView extends SwipableCardView { public class CampaignView extends SwipableCardView {
Campaign campaign = null; Campaign campaign;
private ViewHolder viewHolder; private ViewHolder viewHolder;
public static final String CAMPAIGNS_DEFAULT_PREFERENCE = "displayCampaignsCardView";
public static final String WLM_CARD_PREFERENCE = "displayWLMCardView";
private String campaignPreference = CAMPAIGNS_DEFAULT_PREFERENCE;
public CampaignView(@NonNull Context context) { public CampaignView(@NonNull Context context) {
super(context); super(context);
init(); init();
@ -45,37 +52,46 @@ public class CampaignView extends SwipableCardView {
init(); init();
} }
public void setCampaign(Campaign campaign) { public void setCampaign(final Campaign campaign) {
this.campaign = campaign; this.campaign = campaign;
if (campaign != null) { if (campaign != null) {
this.setVisibility(View.VISIBLE); if (campaign.isWLMCampaign()) {
campaignPreference = WLM_CARD_PREFERENCE;
}
setVisibility(View.VISIBLE);
viewHolder.init(); viewHolder.init();
} else { } else {
this.setVisibility(View.GONE); this.setVisibility(View.GONE);
} }
} }
@Override public boolean onSwipe(View view) { @Override public boolean onSwipe(final View view) {
view.setVisibility(View.GONE); view.setVisibility(View.GONE);
((MainActivity) getContext()).defaultKvStore ((BaseActivity) getContext()).defaultKvStore
.putBoolean("displayCampaignsCardView", false); .putBoolean(campaignPreference, false);
ViewUtil.showLongToast(getContext(), ViewUtil.showLongToast(getContext(),
getResources().getString(R.string.nearby_campaign_dismiss_message)); getResources().getString(R.string.nearby_campaign_dismiss_message));
return true; return true;
} }
private void init() { private void init() {
View rootView = inflate(getContext(), R.layout.layout_campagin, this); final View rootView = inflate(getContext(), R.layout.layout_campagin, this);
viewHolder = new ViewHolder(rootView); viewHolder = new ViewHolder(rootView);
setOnClickListener(view -> { setOnClickListener(view -> {
if (campaign != null) { if (campaign != null) {
Utils.handleWebUrl(getContext(), Uri.parse(campaign.getLink())); if (campaign.isWLMCampaign()) {
((MainActivity)(getContext())).showNearby();
} else {
Utils.handleWebUrl(getContext(), Uri.parse(campaign.getLink()));
}
} }
}); });
} }
public class ViewHolder { public class ViewHolder {
@BindView(R.id.iv_campaign)
ImageView ivCampaign;
@BindView(R.id.tv_title) TextView tvTitle; @BindView(R.id.tv_title) TextView tvTitle;
@BindView(R.id.tv_description) TextView tvDescription; @BindView(R.id.tv_description) TextView tvDescription;
@BindView(R.id.tv_dates) TextView tvDates; @BindView(R.id.tv_dates) TextView tvDates;
@ -86,14 +102,26 @@ public class CampaignView extends SwipableCardView {
public void init() { public void init() {
if (campaign != null) { if (campaign != null) {
ivCampaign.setImageDrawable(
getResources().getDrawable(R.drawable.ic_campaign));
tvTitle.setText(campaign.getTitle()); tvTitle.setText(campaign.getTitle());
tvDescription.setText(campaign.getDescription()); tvDescription.setText(campaign.getDescription());
try { try {
Date startDate = CommonsDateUtil.getIso8601DateFormatShort().parse(campaign.getStartDate()); if (campaign.isWLMCampaign()) {
Date endDate = CommonsDateUtil.getIso8601DateFormatShort().parse(campaign.getEndDate()); tvDates.setText(
tvDates.setText(String.format("%1s - %2s", DateUtil.getExtraShortDateString(startDate), String.format("%1s - %2s", campaign.getStartDate(),
DateUtil.getExtraShortDateString(endDate))); campaign.getEndDate()));
} catch (ParseException e) { } else {
final Date startDate = CommonsDateUtil.getIso8601DateFormatShort()
.parse(campaign.getStartDate());
final Date endDate = CommonsDateUtil.getIso8601DateFormatShort()
.parse(campaign.getEndDate());
tvDates.setText(
String.format("%1s - %2s", startDate,
endDate));
}
} catch (final ParseException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }

View file

@ -2,14 +2,13 @@ package fr.free.nrw.commons.contributions;
import static fr.free.nrw.commons.contributions.Contribution.STATE_FAILED; import static fr.free.nrw.commons.contributions.Contribution.STATE_FAILED;
import static fr.free.nrw.commons.contributions.Contribution.STATE_PAUSED; import static fr.free.nrw.commons.contributions.Contribution.STATE_PAUSED;
import static fr.free.nrw.commons.nearby.fragments.NearbyParentFragment.WLM_URL;
import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween; import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween;
import android.Manifest; import android.Manifest;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
@ -27,21 +26,21 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager.OnBackStackChangedListener; import androidx.fragment.app.FragmentManager.OnBackStackChangedListener;
import androidx.fragment.app.FragmentTransaction; import androidx.fragment.app.FragmentTransaction;
import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.auth.SessionManager; import fr.free.nrw.commons.auth.SessionManager;
import fr.free.nrw.commons.notification.Notification; import fr.free.nrw.commons.notification.Notification;
import fr.free.nrw.commons.notification.NotificationController; import fr.free.nrw.commons.notification.NotificationController;
import fr.free.nrw.commons.theme.BaseActivity; import fr.free.nrw.commons.theme.BaseActivity;
import java.text.ParseException;
import java.util.Date;
import java.util.List; import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import androidx.work.WorkInfo;
import androidx.work.WorkManager; import androidx.work.WorkManager;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.Media; import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
import fr.free.nrw.commons.auth.SessionManager;
import fr.free.nrw.commons.campaigns.Campaign; import fr.free.nrw.commons.campaigns.Campaign;
import fr.free.nrw.commons.campaigns.CampaignView; import fr.free.nrw.commons.campaigns.CampaignView;
import fr.free.nrw.commons.campaigns.CampaignsPresenter; import fr.free.nrw.commons.campaigns.CampaignsPresenter;
@ -59,10 +58,7 @@ import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
import fr.free.nrw.commons.nearby.NearbyController; import fr.free.nrw.commons.nearby.NearbyController;
import fr.free.nrw.commons.nearby.NearbyNotificationCardView; import fr.free.nrw.commons.nearby.NearbyNotificationCardView;
import fr.free.nrw.commons.nearby.Place; import fr.free.nrw.commons.nearby.Place;
import fr.free.nrw.commons.notification.Notification;
import fr.free.nrw.commons.notification.NotificationActivity; import fr.free.nrw.commons.notification.NotificationActivity;
import fr.free.nrw.commons.notification.NotificationController;
import fr.free.nrw.commons.theme.BaseActivity;
import fr.free.nrw.commons.upload.worker.UploadWorker; import fr.free.nrw.commons.upload.worker.UploadWorker;
import fr.free.nrw.commons.utils.ConfigUtils; import fr.free.nrw.commons.utils.ConfigUtils;
import fr.free.nrw.commons.utils.DialogUtil; import fr.free.nrw.commons.utils.DialogUtil;
@ -73,9 +69,6 @@ import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import timber.log.Timber; import timber.log.Timber;
public class ContributionsFragment public class ContributionsFragment
@ -118,6 +111,8 @@ public class ContributionsFragment
public TextView notificationCount; public TextView notificationCount;
private Campaign wlmCampaign;
@NonNull @NonNull
public static ContributionsFragment newInstance() { public static ContributionsFragment newInstance() {
ContributionsFragment fragment = new ContributionsFragment(); ContributionsFragment fragment = new ContributionsFragment();
@ -137,6 +132,7 @@ public class ContributionsFragment
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_contributions, container, false); View view = inflater.inflate(R.layout.fragment_contributions, container, false);
ButterKnife.bind(this, view); ButterKnife.bind(this, view);
initWLMCampaign();
presenter.onAttachView(this); presenter.onAttachView(this);
contributionsPresenter.onAttachView(this); contributionsPresenter.onAttachView(this);
campaignView.setVisibility(View.GONE); campaignView.setVisibility(View.GONE);
@ -177,6 +173,15 @@ public class ContributionsFragment
return view; return view;
} }
/**
* Initialise the campaign object for WML
*/
private void initWLMCampaign() {
wlmCampaign = new Campaign(getString(R.string.wlm_campaign_title),
getString(R.string.wlm_campaign_description), Utils.getWLMStartDate().toString(),
Utils.getWLMEndDate().toString(), WLM_URL, true);
}
@Override @Override
public void onCreateOptionsMenu(@NonNull final Menu menu, @NonNull final MenuInflater inflater) { public void onCreateOptionsMenu(@NonNull final Menu menu, @NonNull final MenuInflater inflater) {
inflater.inflate(R.menu.contribution_activity_notification_menu, menu); inflater.inflate(R.menu.contribution_activity_notification_menu, menu);
@ -518,13 +523,17 @@ public class ContributionsFragment
} }
/** /**
* ask the presenter to fetch the campaigns only if user has not manually disabled it * As the home screen has limited space, we have choosen to show either campaigns or WLM card.
* The WLM Card gets the priority over monuments, so if the WLM is going on we show that instead
* of campaigns on the campaigns card
*/ */
private void fetchCampaigns() { private void fetchCampaigns() {
if (store.getBoolean("displayCampaignsCardView", true)) { if (Utils.isMonumentsEnabled(new Date(), store)) {
campaignView.setCampaign(wlmCampaign);
campaignView.setVisibility(View.VISIBLE);
} else if (store.getBoolean(CampaignView.CAMPAIGNS_DEFAULT_PREFERENCE, true)) {
presenter.getCampaigns(); presenter.getCampaigns();
} } else {
else{
campaignView.setVisibility(View.GONE); campaignView.setVisibility(View.GONE);
} }
} }

View file

@ -99,7 +99,7 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
private ContributionsListAdapter adapter; private ContributionsListAdapter adapter;
private Callback callback; @Nullable private Callback callback;
private final int SPAN_COUNT_LANDSCAPE = 3; private final int SPAN_COUNT_LANDSCAPE = 3;
private final int SPAN_COUNT_PORTRAIT = 1; private final int SPAN_COUNT_PORTRAIT = 1;
@ -159,7 +159,9 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
contributionsListPresenter.contributionList.observe(this.getViewLifecycleOwner(), list -> { contributionsListPresenter.contributionList.observe(this.getViewLifecycleOwner(), list -> {
contributionsSize = list.size(); contributionsSize = list.size();
adapter.submitList(list); adapter.submitList(list);
callback.notifyDataSetChanged(); if (callback != null) {
callback.notifyDataSetChanged();
}
}); });
rvContributionsList.setAdapter(adapter); rvContributionsList.setAdapter(adapter);
adapter.registerAdapterDataObserver(new AdapterDataObserver() { adapter.registerAdapterDataObserver(new AdapterDataObserver() {
@ -181,7 +183,9 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
@Override @Override
public void onItemRangeChanged(final int positionStart, final int itemCount) { public void onItemRangeChanged(final int positionStart, final int itemCount) {
super.onItemRangeChanged(positionStart, itemCount); super.onItemRangeChanged(positionStart, itemCount);
callback.viewPagerNotifyDataSetChanged(); if (callback != null) {
callback.viewPagerNotifyDataSetChanged();
}
} }
}); });

View file

@ -373,6 +373,13 @@ public class MainActivity extends BaseActivity
super.onDestroy(); super.onDestroy();
} }
/**
* Public method to show nearby from the reference of this.
*/
public void showNearby() {
tabLayout.setSelectedItemId(NavTab.NEARBY.code());
}
public enum ActiveFragment { public enum ActiveFragment {
CONTRIBUTIONS, CONTRIBUTIONS,
NEARBY, NEARBY,

View file

@ -13,7 +13,7 @@ import fr.free.nrw.commons.explore.recentsearches.RecentSearchesDao;
public class DBOpenHelper extends SQLiteOpenHelper { public class DBOpenHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "commons.db"; private static final String DATABASE_NAME = "commons.db";
private static final int DATABASE_VERSION = 16; private static final int DATABASE_VERSION = 18;
public static final String CONTRIBUTIONS_TABLE = "contributions"; public static final String CONTRIBUTIONS_TABLE = "contributions";
private final String DROP_TABLE_STATEMENT="DROP TABLE IF EXISTS %s"; private final String DROP_TABLE_STATEMENT="DROP TABLE IF EXISTS %s";

View file

@ -265,7 +265,9 @@ public class OkHttpJsonApiClient {
} }
public Observable<List<Place>> getNearbyPlaces(LatLng cur, String language, double radius) public Observable<List<Place>> getNearbyPlaces(LatLng cur, String language, double radius)
throws IOException { throws Exception {
Timber.d("Fetching nearby items at radius %s", radius);
String wikidataQuery = FileUtils.readFromResource("/queries/nearby_query.rq"); String wikidataQuery = FileUtils.readFromResource("/queries/nearby_query.rq");
String query = wikidataQuery String query = wikidataQuery
.replace("${RAD}", String.format(Locale.ROOT, "%.2f", radius)) .replace("${RAD}", String.format(Locale.ROOT, "%.2f", radius))
@ -302,6 +304,67 @@ public class OkHttpJsonApiClient {
}); });
} }
/**
* Wikidata query to fetch monuments
*
* @param cur : The current location coordinates
* @param language : The language
* @param radius : The radius around the current location within which we expect the results
* @return
* @throws IOException
*/
public Observable<List<Place>> getNearbyMonuments(LatLng cur, String language, final double radius){
Timber.d("Fetching monuments at radius %s", radius);
final String wikidataQuery;
try {
wikidataQuery = FileUtils.readFromResource("/queries/monuments_query.rq");
if (TextUtils.isEmpty(language)) {
language = "en";
}
String query = wikidataQuery
.replace("${RAD}", String.format(Locale.ROOT, "%.2f", radius))
.replace("${LAT}", String.format(Locale.ROOT, "%.4f", cur.getLatitude()))
.replace("${LONG}", String.format(Locale.ROOT, "%.4f", cur.getLongitude()))
.replace("${LANG}", language);
HttpUrl.Builder urlBuilder = HttpUrl
.parse(sparqlQueryUrl)
.newBuilder()
.addQueryParameter("query", query)
.addQueryParameter("format", "json");
Request request = new Request.Builder()
.url(urlBuilder.build())
.build();
Timber.d("Monuments URL: %s", request.url().toString());
return Observable.fromCallable(() -> {
final Response response = okHttpClient.newCall(request).execute();
if (response != null && response.body() != null && response.isSuccessful()) {
final String json = response.body().string();
if (json == null) {
return new ArrayList<>();
}
final NearbyResponse nearbyResponse = gson.fromJson(json, NearbyResponse.class);
final List<NearbyResultItem> bindings = nearbyResponse.getResults().getBindings();
final List<Place> places = new ArrayList<>();
for (final NearbyResultItem item : bindings) {
final Place place = Place.from(item);
place.setMonument(true);
places.add(place);
}
return places;
}
return new ArrayList<>();
});
} catch (final IOException e) {
e.printStackTrace();
return Observable.error(e);
}
}
/** /**
* Get the QIDs of all Wikidata items that are subclasses of the given Wikidata item. Example: * Get the QIDs of all Wikidata items that are subclasses of the given Wikidata item. Example:
* bridge -> suspended bridge, aqueduct, etc * bridge -> suspended bridge, aqueduct, etc

View file

@ -8,14 +8,17 @@ import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions;
import com.mapbox.mapboxsdk.annotations.Icon; import com.mapbox.mapboxsdk.annotations.Icon;
import com.mapbox.mapboxsdk.annotations.IconFactory; import com.mapbox.mapboxsdk.annotations.IconFactory;
import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.geometry.LatLng;
import java.util.Objects;
public class NearbyBaseMarker extends BaseMarkerOptions<NearbyMarker, NearbyBaseMarker> { public class NearbyBaseMarker extends BaseMarkerOptions<NearbyMarker, NearbyBaseMarker> {
public static final Parcelable.Creator<NearbyBaseMarker> CREATOR = new Parcelable.Creator<NearbyBaseMarker>() { public static final Parcelable.Creator<NearbyBaseMarker> CREATOR = new Parcelable.Creator<NearbyBaseMarker>() {
@Override
public NearbyBaseMarker createFromParcel(Parcel in) { public NearbyBaseMarker createFromParcel(Parcel in) {
return new NearbyBaseMarker(in); return new NearbyBaseMarker(in);
} }
@Override
public NearbyBaseMarker[] newArray(int size) { public NearbyBaseMarker[] newArray(int size) {
return new NearbyBaseMarker[size]; return new NearbyBaseMarker[size];
} }
@ -70,4 +73,21 @@ public class NearbyBaseMarker extends BaseMarkerOptions<NearbyMarker, NearbyBase
dest.writeString(title); dest.writeString(title);
dest.writeParcelable(place, 0); dest.writeParcelable(place, 0);
} }
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final NearbyBaseMarker that = (NearbyBaseMarker) o;
return Objects.equals(place.location, that.place.location);
}
@Override
public int hashCode() {
return Objects.hash(place);
}
} }

View file

@ -10,6 +10,7 @@ import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
import com.mapbox.mapboxsdk.annotations.IconFactory; import com.mapbox.mapboxsdk.annotations.IconFactory;
import com.mapbox.mapboxsdk.annotations.Marker; import com.mapbox.mapboxsdk.annotations.Marker;
import io.reactivex.Observable;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -127,6 +128,11 @@ public class NearbyController {
} }
} }
public Observable<List<Place>> queryWikiDataForMonuments(
final LatLng latLng, final String language) {
return nearbyPlaces.queryWikiDataForMonuments(latLng, language);
}
/** /**
* Loads attractions from location for list view, we need to return Place data type. * Loads attractions from location for list view, we need to return Place data type.
* *
@ -168,6 +174,7 @@ public class NearbyController {
VectorDrawableCompat vectorDrawable = null; VectorDrawableCompat vectorDrawable = null;
VectorDrawableCompat vectorDrawableGreen = null; VectorDrawableCompat vectorDrawableGreen = null;
VectorDrawableCompat vectorDrawableGrey = null; VectorDrawableCompat vectorDrawableGrey = null;
VectorDrawableCompat vectorDrawableMonuments = null;
vectorDrawable = null; vectorDrawable = null;
try { try {
vectorDrawable = VectorDrawableCompat.create( vectorDrawable = VectorDrawableCompat.create(
@ -176,6 +183,9 @@ public class NearbyController {
context.getResources(), R.drawable.ic_custom_map_marker_green, context.getTheme()); context.getResources(), R.drawable.ic_custom_map_marker_green, context.getTheme());
vectorDrawableGrey = VectorDrawableCompat.create( vectorDrawableGrey = VectorDrawableCompat.create(
context.getResources(), R.drawable.ic_custom_map_marker_grey, context.getTheme()); context.getResources(), R.drawable.ic_custom_map_marker_grey, context.getTheme());
vectorDrawableMonuments = VectorDrawableCompat
.create(context.getResources(), R.drawable.ic_custom_map_marker_monuments,
context.getTheme());
} catch (Resources.NotFoundException e) { } catch (Resources.NotFoundException e) {
// ignore when running tests. // ignore when running tests.
} }
@ -183,34 +193,39 @@ public class NearbyController {
Bitmap icon = UiUtils.getBitmap(vectorDrawable); Bitmap icon = UiUtils.getBitmap(vectorDrawable);
Bitmap iconGreen = UiUtils.getBitmap(vectorDrawableGreen); Bitmap iconGreen = UiUtils.getBitmap(vectorDrawableGreen);
Bitmap iconGrey = UiUtils.getBitmap(vectorDrawableGrey); Bitmap iconGrey = UiUtils.getBitmap(vectorDrawableGrey);
Bitmap iconMonuments = UiUtils.getBitmap(vectorDrawableMonuments);
for (Place place : placeList) { for (Place place : placeList) {
NearbyBaseMarker nearbyBaseMarker = new NearbyBaseMarker();
String distance = formatDistanceBetween(curLatLng, place.location); String distance = formatDistanceBetween(curLatLng, place.location);
place.setDistance(distance); place.setDistance(distance);
NearbyBaseMarker nearbyBaseMarker = new NearbyBaseMarker();
nearbyBaseMarker.title(place.name); nearbyBaseMarker.title(place.name);
nearbyBaseMarker.position( nearbyBaseMarker.position(
new com.mapbox.mapboxsdk.geometry.LatLng( new com.mapbox.mapboxsdk.geometry.LatLng(
place.location.getLatitude(), place.location.getLatitude(),
place.location.getLongitude())); place.location.getLongitude()));
nearbyBaseMarker.place(place); nearbyBaseMarker.place(place);
// Check if string is only spaces or empty, if so place doesn't have any picture // Check if string is only spaces or empty, if so place doesn't have any picture
if (!place.pic.trim().isEmpty()) {
if (place.isMonument()) {
nearbyBaseMarker.icon(IconFactory.getInstance(context)
.fromBitmap(iconMonuments));
}
else if (!place.pic.trim().isEmpty()) {
if (iconGreen != null) { if (iconGreen != null) {
nearbyBaseMarker.icon(IconFactory.getInstance(context) nearbyBaseMarker.icon(IconFactory.getInstance(context)
.fromBitmap(iconGreen)); .fromBitmap(iconGreen));
} }
} else if (!place.exists) { // Means that the topic of the Wikidata item does not exist in the real world anymore, for instance it is a past event, or a place that was destroyed } else if (!place.exists) { // Means that the topic of the Wikidata item does not exist in the real world anymore, for instance it is a past event, or a place that was destroyed
if (iconGrey != null) { if (iconGrey != null) {
nearbyBaseMarker.icon(IconFactory.getInstance(context) nearbyBaseMarker.icon(IconFactory.getInstance(context)
.fromBitmap(iconGrey)); .fromBitmap(iconGrey));
} }
} else { } else {
nearbyBaseMarker.icon(IconFactory.getInstance(context) nearbyBaseMarker.icon(IconFactory.getInstance(context)
.fromBitmap(icon)); .fromBitmap(icon));
} }
baseMarkerOptions.add(nearbyBaseMarker); baseMarkerOptions.add(nearbyBaseMarker);
} }
} }

View file

@ -5,6 +5,7 @@ import java.util.ArrayList;
public class NearbyFilterState { public class NearbyFilterState {
private boolean existsSelected; private boolean existsSelected;
private boolean needPhotoSelected; private boolean needPhotoSelected;
private boolean wlmSelected;
private int checkBoxTriState; private int checkBoxTriState;
private ArrayList<Label> selectedLabels; private ArrayList<Label> selectedLabels;
@ -16,6 +17,7 @@ public class NearbyFilterState {
private NearbyFilterState() { private NearbyFilterState() {
existsSelected = false; existsSelected = false;
needPhotoSelected = true; needPhotoSelected = true;
wlmSelected = true;
checkBoxTriState = -1; // Unknown checkBoxTriState = -1; // Unknown
selectedLabels = new ArrayList<>(); // Initially empty selectedLabels = new ArrayList<>(); // Initially empty
} }
@ -39,6 +41,14 @@ public class NearbyFilterState {
getInstance().needPhotoSelected = needPhotoSelected; getInstance().needPhotoSelected = needPhotoSelected;
} }
public static void setWlmSelected(final boolean wlmSelected) {
getInstance().wlmSelected = wlmSelected;
}
public boolean isWlmSelected() {
return wlmSelected;
}
public boolean isExistsSelected() { public boolean isExistsSelected() {
return existsSelected; return existsSelected;
} }

View file

@ -1,5 +1,6 @@
package fr.free.nrw.commons.nearby; package fr.free.nrw.commons.nearby;
import io.reactivex.Observable;
import java.io.IOException; import java.io.IOException;
import java.io.InterruptedIOException; import java.io.InterruptedIOException;
import java.util.Collections; import java.util.Collections;
@ -65,9 +66,9 @@ public class NearbyPlaces {
while (radius <= maxRadius) { while (radius <= maxRadius) {
try { try {
places = getFromWikidataQuery(curLatLng, lang, radius); places = getFromWikidataQuery(curLatLng, lang, radius);
} catch (InterruptedIOException e) { } catch (final Exception e) {
Timber.e(e, "exception in fetching nearby places"); Timber.e(e, "Exception in fetching nearby places");
return places; break;
} }
Timber.d("%d results at radius: %f", places.size(), radius); Timber.d("%d results at radius: %f", places.size(), radius);
if (places.size() >= minResults) { if (places.size() >= minResults) {
@ -91,7 +92,13 @@ public class NearbyPlaces {
* @return list of places obtained * @return list of places obtained
* @throws IOException if query fails * @throws IOException if query fails
*/ */
public List<Place> getFromWikidataQuery(LatLng cur, String lang, double radius) throws IOException { public List<Place> getFromWikidataQuery(LatLng cur, String lang, double radius) throws Exception {
return okHttpJsonApiClient.getNearbyPlaces(cur, lang, radius).blockingSingle(); return okHttpJsonApiClient.getNearbyPlaces(cur, lang, radius).blockingSingle();
} }
public Observable<List<Place>> queryWikiDataForMonuments(
LatLng latLng, String language) {
return okHttpJsonApiClient
.getNearbyMonuments(latLng, language, radius);
}
} }

View file

@ -4,8 +4,10 @@ import android.net.Uri;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import android.text.TextUtils;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import fr.free.nrw.commons.nearby.NearbyController.NearbyPlacesInfo;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.location.LatLng;
@ -31,6 +33,7 @@ public class Place implements Parcelable {
public String distance; public String distance;
public final Sitelinks siteLinks; public final Sitelinks siteLinks;
private boolean isMonument;
public Place(String language,String name, Label label, String longDescription, LatLng location, String category, Sitelinks siteLinks, String pic, Boolean exists) { public Place(String language,String name, Label label, String longDescription, LatLng location, String category, Sitelinks siteLinks, String pic, Boolean exists) {
@ -56,6 +59,7 @@ public class Place implements Parcelable {
this.pic = (picString == null) ? "":picString; this.pic = (picString == null) ? "":picString;
String existString = in.readString(); String existString = in.readString();
this.exists = Boolean.parseBoolean(existString); this.exists = Boolean.parseBoolean(existString);
this.isMonument = in.readInt() == 1;
} }
public static Place from(NearbyResultItem item) { public static Place from(NearbyResultItem item) {
String itemClass = item.getClassName().getValue(); String itemClass = item.getClassName().getValue();
@ -80,20 +84,20 @@ public class Place implements Parcelable {
? " (" + description + ")" : "") ? " (" + description + ")" : "")
: description); : description);
return new Place( return new Place(
item.getLabel().getLanguage(), item.getLabel().getLanguage(),
item.getLabel().getValue(), item.getLabel().getValue(),
Label.fromText(classEntityId), // list Label.fromText(classEntityId), // list
description, // description and label of Wikidata item description, // description and label of Wikidata item
PlaceUtils.latLngFromPointString(item.getLocation().getValue()), PlaceUtils.latLngFromPointString(item.getLocation().getValue()),
item.getCommonsCategory().getValue(), item.getCommonsCategory().getValue(),
new Sitelinks.Builder() new Sitelinks.Builder()
.setWikipediaLink(item.getWikipediaArticle().getValue()) .setWikipediaLink(item.getWikipediaArticle().getValue())
.setCommonsLink(item.getCommonsArticle().getValue()) .setCommonsLink(item.getCommonsArticle().getValue())
.setWikidataLink(item.getItem().getValue()) .setWikidataLink(item.getItem().getValue())
.build(), .build(),
item.getPic().getValue(), item.getPic().getValue(),
// Checking if the place exists or not // Checking if the place exists or not
(item.getDestroyed().getValue() == "") && (item.getEndTime().getValue() == "")); (item.getDestroyed().getValue() == "") && (item.getEndTime().getValue() == ""));
} }
/** /**
@ -126,7 +130,9 @@ public class Place implements Parcelable {
* Gets the long description of the place * Gets the long description of the place
* @return long description * @return long description
*/ */
public String getLongDescription() { return longDescription; } public String getLongDescription() {
return longDescription;
}
/** /**
* Gets the Commons category of the place * Gets the Commons category of the place
@ -181,6 +187,22 @@ public class Place implements Parcelable {
return !(siteLinks == null || Uri.EMPTY.equals(siteLinks.getCommonsLink())); return !(siteLinks == null || Uri.EMPTY.equals(siteLinks.getCommonsLink()));
} }
/**
* Sets that this place in nearby is a WikiData monument
* @param monument
*/
public void setMonument(final boolean monument) {
isMonument = monument;
}
/**
* Returns if this place is a WikiData monument
* @return
*/
public boolean isMonument() {
return isMonument;
}
/** /**
* Check if we already have the exact same Place * Check if we already have the exact same Place
* @param o Place being tested * @param o Place being tested
@ -233,6 +255,7 @@ public class Place implements Parcelable {
dest.writeParcelable(siteLinks, 0); dest.writeParcelable(siteLinks, 0);
dest.writeString(pic); dest.writeString(pic);
dest.writeString(exists.toString()); dest.writeString(exists.toString());
dest.writeInt(isMonument ? 1 : 0);
} }
public static final Creator<Place> CREATOR = new Creator<Place>() { public static final Creator<Place> CREATOR = new Creator<Place>() {

View file

@ -3,7 +3,6 @@ package fr.free.nrw.commons.nearby.contract;
import android.content.Context; import android.content.Context;
import com.mapbox.mapboxsdk.annotations.Marker; import com.mapbox.mapboxsdk.annotations.Marker;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import java.util.List; import java.util.List;
@ -13,7 +12,6 @@ import fr.free.nrw.commons.location.LocationServiceManager;
import fr.free.nrw.commons.nearby.Label; import fr.free.nrw.commons.nearby.Label;
import fr.free.nrw.commons.nearby.NearbyBaseMarker; import fr.free.nrw.commons.nearby.NearbyBaseMarker;
import fr.free.nrw.commons.nearby.Place; import fr.free.nrw.commons.nearby.Place;
import fr.free.nrw.commons.nearby.presenter.NearbyParentFragmentPresenter;
public interface NearbyParentFragmentContract { public interface NearbyParentFragmentContract {
@ -60,7 +58,7 @@ public interface NearbyParentFragmentContract {
void displayAllMarkers(); void displayAllMarkers();
void filterMarkersByLabels(List<Label> selectedLabels, boolean existsSelected, boolean needPhotoSelected, boolean filterForPlaceState, boolean filterForAllNoneType); void filterMarkersByLabels(List<Label> selectedLabels, boolean existsSelected, boolean needPhotoSelected, boolean wlmSelected, boolean filterForPlaceState, boolean filterForAllNoneType);
LatLng getCameraTarget(); LatLng getCameraTarget();

View file

@ -3,7 +3,6 @@ package fr.free.nrw.commons.nearby.fragments;
import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED; import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED;
import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.LOCATION_SLIGHTLY_CHANGED; import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.LOCATION_SLIGHTLY_CHANGED;
import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.MAP_UPDATED; import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.MAP_UPDATED;
import static fr.free.nrw.commons.nearby.Label.TEXT_TO_DESCRIPTION;
import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween; import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween;
import static fr.free.nrw.commons.wikidata.WikidataConstants.PLACE_OBJECT; import static fr.free.nrw.commons.wikidata.WikidataConstants.PLACE_OBJECT;
@ -16,8 +15,8 @@ import android.content.IntentFilter;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.drawable.VectorDrawable;
import android.location.LocationManager; import android.location.LocationManager;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings; import android.provider.Settings;
import android.text.Html; import android.text.Html;
@ -45,8 +44,8 @@ import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.SearchView;
import androidx.fragment.app.Fragment;
import androidx.appcompat.widget.AppCompatTextView; import androidx.appcompat.widget.AppCompatTextView;
import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
@ -54,6 +53,7 @@ import androidx.recyclerview.widget.RecyclerView;
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat; import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import butterknife.OnClick;
import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.chip.Chip; import com.google.android.material.chip.Chip;
import com.google.android.material.chip.ChipGroup; import com.google.android.material.chip.ChipGroup;
@ -83,26 +83,24 @@ import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.auth.LoginActivity; import fr.free.nrw.commons.auth.LoginActivity;
import fr.free.nrw.commons.bookmarks.locations.BookmarkLocationsDao; import fr.free.nrw.commons.bookmarks.locations.BookmarkLocationsDao;
import fr.free.nrw.commons.contributions.ContributionController; import fr.free.nrw.commons.contributions.ContributionController;
import fr.free.nrw.commons.contributions.ContributionsFragment;
import fr.free.nrw.commons.contributions.MainActivity; import fr.free.nrw.commons.contributions.MainActivity;
import fr.free.nrw.commons.contributions.MainActivity.ActiveFragment; import fr.free.nrw.commons.contributions.MainActivity.ActiveFragment;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.kvstore.JsonKvStore; import fr.free.nrw.commons.kvstore.JsonKvStore;
import fr.free.nrw.commons.location.LocationServiceManager; import fr.free.nrw.commons.location.LocationServiceManager;
import fr.free.nrw.commons.location.LocationUpdateListener; import fr.free.nrw.commons.location.LocationUpdateListener;
import fr.free.nrw.commons.navtab.NavTab;
import fr.free.nrw.commons.nearby.CheckBoxTriStates; import fr.free.nrw.commons.nearby.CheckBoxTriStates;
import fr.free.nrw.commons.nearby.Label; import fr.free.nrw.commons.nearby.Label;
import fr.free.nrw.commons.nearby.MarkerPlaceGroup; import fr.free.nrw.commons.nearby.MarkerPlaceGroup;
import fr.free.nrw.commons.nearby.NearbyBaseMarker; import fr.free.nrw.commons.nearby.NearbyBaseMarker;
import fr.free.nrw.commons.nearby.NearbyController; import fr.free.nrw.commons.nearby.NearbyController;
import fr.free.nrw.commons.nearby.NearbyController.NearbyPlacesInfo;
import fr.free.nrw.commons.nearby.NearbyFilterSearchRecyclerViewAdapter; import fr.free.nrw.commons.nearby.NearbyFilterSearchRecyclerViewAdapter;
import fr.free.nrw.commons.nearby.NearbyFilterState; import fr.free.nrw.commons.nearby.NearbyFilterState;
import fr.free.nrw.commons.nearby.NearbyMarker; import fr.free.nrw.commons.nearby.NearbyMarker;
import fr.free.nrw.commons.nearby.Place; import fr.free.nrw.commons.nearby.Place;
import fr.free.nrw.commons.nearby.contract.NearbyParentFragmentContract; import fr.free.nrw.commons.nearby.contract.NearbyParentFragmentContract;
import fr.free.nrw.commons.nearby.presenter.NearbyParentFragmentPresenter; import fr.free.nrw.commons.nearby.presenter.NearbyParentFragmentPresenter;
import fr.free.nrw.commons.notification.NotificationActivity;
import fr.free.nrw.commons.utils.DialogUtil; import fr.free.nrw.commons.utils.DialogUtil;
import fr.free.nrw.commons.utils.ExecutorUtils; import fr.free.nrw.commons.utils.ExecutorUtils;
import fr.free.nrw.commons.utils.LayoutUtils; import fr.free.nrw.commons.utils.LayoutUtils;
@ -116,14 +114,18 @@ import fr.free.nrw.commons.utils.ViewUtil;
import fr.free.nrw.commons.wikidata.WikidataEditListener; import fr.free.nrw.commons.wikidata.WikidataEditListener;
import io.reactivex.Observable; import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable; import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import kotlin.Unit; import kotlin.Unit;
import org.jetbrains.annotations.NotNull;
import timber.log.Timber; import timber.log.Timber;
@ -155,6 +157,7 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
@BindView(R.id.search_this_area_button) Button searchThisAreaButton; @BindView(R.id.search_this_area_button) Button searchThisAreaButton;
@BindView(R.id.map_progress_bar) ProgressBar progressBar; @BindView(R.id.map_progress_bar) ProgressBar progressBar;
@BindView(R.id.choice_chip_exists) Chip chipExists; @BindView(R.id.choice_chip_exists) Chip chipExists;
@BindView(R.id.choice_chip_wlm) Chip chipWlm;
@BindView(R.id.choice_chip_needs_photo) Chip chipNeedsPhoto; @BindView(R.id.choice_chip_needs_photo) Chip chipNeedsPhoto;
@BindView(R.id.choice_chip_group) ChipGroup choiceChipGroup; @BindView(R.id.choice_chip_group) ChipGroup choiceChipGroup;
@BindView(R.id.search_view) SearchView searchView; @BindView(R.id.search_view) SearchView searchView;
@ -168,6 +171,14 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
@BindView(R.id.no_results_message) TextView noResultsView; @BindView(R.id.no_results_message) TextView noResultsView;
@BindView(R.id.tv_attribution) @BindView(R.id.tv_attribution)
AppCompatTextView tvAttribution; AppCompatTextView tvAttribution;
@BindView(R.id.rl_container_wlm_month_message)
RelativeLayout rlContainerWLMMonthMessage;
@BindView(R.id.tv_learn_more)
AppCompatTextView tvLearnMore;
@BindView(R.id.iv_toggle_chips)
AppCompatImageView ivToggleChips;
@BindView(R.id.chip_view)
View llContainerChips;
@Inject LocationServiceManager locationManager; @Inject LocationServiceManager locationManager;
@Inject NearbyController nearbyController; @Inject NearbyController nearbyController;
@ -229,7 +240,12 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
/** /**
* Holds all the markers * Holds all the markers
*/ */
private List<NearbyBaseMarker> allMarkers; private List<NearbyBaseMarker> allMarkers =new ArrayList<>();
/**
* WLM URL
*/
public static final String WLM_URL = "https://www.wikilovesmonuments.org/";
@NonNull @NonNull
public static NearbyParentFragment newInstance() { public static NearbyParentFragment newInstance() {
@ -268,6 +284,12 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) { public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
isDarkTheme = systemThemeUtils.isDeviceInNightMode(); isDarkTheme = systemThemeUtils.isDeviceInNightMode();
if (Utils.isMonumentsEnabled(new Date(), applicationKvStore)) {
rlContainerWLMMonthMessage.setVisibility(View.VISIBLE);
} else {
rlContainerWLMMonthMessage.setVisibility(View.GONE);
}
cameraMoveListener= () -> presenter.onCameraMove(mapBox.getCameraPosition().target); cameraMoveListener= () -> presenter.onCameraMove(mapBox.getCameraPosition().target);
addCheckBoxCallback(); addCheckBoxCallback();
presenter.attachView(this); presenter.attachView(this);
@ -491,6 +513,9 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
setBottomSheetCallbacks(); setBottomSheetCallbacks();
decideButtonVisibilities(); decideButtonVisibilities();
addActionToTitle(); addActionToTitle();
if(!Utils.isMonumentsEnabled(new Date(), applicationKvStore)){
chipWlm.setVisibility(View.GONE);
}
} }
/** /**
@ -598,6 +623,7 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
Log.d("deneme5","setfilterState"); Log.d("deneme5","setfilterState");
chipNeedsPhoto.setChecked(NearbyFilterState.getInstance().isNeedPhotoSelected()); chipNeedsPhoto.setChecked(NearbyFilterState.getInstance().isNeedPhotoSelected());
chipExists.setChecked(NearbyFilterState.getInstance().isExistsSelected()); chipExists.setChecked(NearbyFilterState.getInstance().isExistsSelected());
chipWlm.setChecked(NearbyFilterState.getInstance().isWlmSelected());
if (NearbyController.currentLocation != null) { if (NearbyController.currentLocation != null) {
presenter.filterByMarkerType(nearbyFilterSearchRecyclerViewAdapter.selectedLabels, checkBoxTriStates.getState(), true, false); presenter.filterByMarkerType(nearbyFilterSearchRecyclerViewAdapter.selectedLabels, checkBoxTriStates.getState(), true, false);
} }
@ -608,13 +634,8 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
chipNeedsPhoto.setOnCheckedChangeListener((buttonView, isChecked) -> { chipNeedsPhoto.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (NearbyController.currentLocation != null) { if (NearbyController.currentLocation != null) {
checkBoxTriStates.setState(CheckBoxTriStates.UNKNOWN); checkBoxTriStates.setState(CheckBoxTriStates.UNKNOWN);
if (isChecked) { NearbyFilterState.setNeedPhotoSelected(isChecked);
NearbyFilterState.setNeedPhotoSelected(true); presenter.filterByMarkerType(nearbyFilterSearchRecyclerViewAdapter.selectedLabels, checkBoxTriStates.getState(), true, false);
presenter.filterByMarkerType(nearbyFilterSearchRecyclerViewAdapter.selectedLabels, checkBoxTriStates.getState(), true, false);
} else {
NearbyFilterState.setNeedPhotoSelected(false);
presenter.filterByMarkerType(nearbyFilterSearchRecyclerViewAdapter.selectedLabels, checkBoxTriStates.getState(), true, false);
}
} else { } else {
chipNeedsPhoto.setChecked(!isChecked); chipNeedsPhoto.setChecked(!isChecked);
} }
@ -624,17 +645,23 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
chipExists.setOnCheckedChangeListener((buttonView, isChecked) -> { chipExists.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (NearbyController.currentLocation != null) { if (NearbyController.currentLocation != null) {
checkBoxTriStates.setState(CheckBoxTriStates.UNKNOWN); checkBoxTriStates.setState(CheckBoxTriStates.UNKNOWN);
if (isChecked) { NearbyFilterState.setExistsSelected(isChecked);
NearbyFilterState.setExistsSelected(true); presenter.filterByMarkerType(nearbyFilterSearchRecyclerViewAdapter.selectedLabels, checkBoxTriStates.getState(), true, false);
presenter.filterByMarkerType(nearbyFilterSearchRecyclerViewAdapter.selectedLabels, checkBoxTriStates.getState(), true, false);
} else {
NearbyFilterState.setExistsSelected(false);
presenter.filterByMarkerType(nearbyFilterSearchRecyclerViewAdapter.selectedLabels, checkBoxTriStates.getState(), true, false);
}
} else { } else {
chipExists.setChecked(!isChecked); chipExists.setChecked(!isChecked);
} }
}); });
chipWlm.setOnCheckedChangeListener((buttonView, isChecked) -> {
if(NearbyController.currentLocation!=null){
checkBoxTriStates.setState(CheckBoxTriStates.UNKNOWN);
NearbyFilterState.setWlmSelected(isChecked);
presenter.filterByMarkerType(nearbyFilterSearchRecyclerViewAdapter.selectedLabels, checkBoxTriStates.getState(), true, false);
}else{
chipWlm.setChecked(!isChecked);
}
});
} }
/** /**
@ -852,40 +879,105 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
} }
private void populatePlacesForCurrentLocation(final fr.free.nrw.commons.location.LatLng curlatLng, private void populatePlacesForCurrentLocation(final fr.free.nrw.commons.location.LatLng curlatLng,
final fr.free.nrw.commons.location.LatLng searchLatLng) { final fr.free.nrw.commons.location.LatLng searchLatLng){
compositeDisposable.add(Observable.fromCallable(() -> nearbyController
.loadAttractionsFromLocation(curlatLng, searchLatLng, false, true)) final Observable<NearbyPlacesInfo> nearbyPlacesInfoObservable = Observable
.subscribeOn(Schedulers.io()) .fromCallable(() -> nearbyController
.observeOn(AndroidSchedulers.mainThread()) .loadAttractionsFromLocation(curlatLng, searchLatLng, false, true));
.subscribe(nearbyPlacesInfo -> {
updateMapMarkers(nearbyPlacesInfo, true); Observable<List<Place>> observableWikidataMonuments = Observable.empty();
lastFocusLocation=searchLatLng; if(Utils.isMonumentsEnabled(new Date(), applicationKvStore)){
}, observableWikidataMonuments =
throwable -> { nearbyController
Timber.d(throwable); .queryWikiDataForMonuments(searchLatLng, Locale.getDefault().getLanguage());
showErrorMessage(getString(R.string.error_fetching_nearby_places)+throwable.getLocalizedMessage());
setProgressBarVisibility(false); }
presenter.lockUnlockNearby(false);
setFilterState(); compositeDisposable.add(Observable.zip(nearbyPlacesInfoObservable
})); , observableWikidataMonuments.onErrorReturn(throwable -> {
showErrorMessage(getString(R.string.error_fetching_nearby_monuments) + throwable
.getLocalizedMessage());
return new ArrayList<>();
}),
(nearbyPlacesInfo, monuments) -> {
final List<Place> places = mergeNearbyPlacesAndMonuments(nearbyPlacesInfo.placeList,
monuments);
nearbyPlacesInfo.placeList.clear();
nearbyPlacesInfo.placeList.addAll(places);
return nearbyPlacesInfo;
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(nearbyPlacesInfo -> {
updateMapMarkers(nearbyPlacesInfo, true);
lastFocusLocation=searchLatLng;
},
throwable -> {
Timber.d(throwable);
showErrorMessage(getString(R.string.error_fetching_nearby_places)+throwable.getLocalizedMessage());
setProgressBarVisibility(false);
presenter.lockUnlockNearby(false);
setFilterState();
}));
} }
private void populatePlacesForAnotherLocation(final fr.free.nrw.commons.location.LatLng curlatLng, private void populatePlacesForAnotherLocation(final fr.free.nrw.commons.location.LatLng curlatLng,
final fr.free.nrw.commons.location.LatLng searchLatLng) { final fr.free.nrw.commons.location.LatLng searchLatLng){
compositeDisposable.add(Observable.fromCallable(() -> nearbyController
.loadAttractionsFromLocation(curlatLng, searchLatLng, false, false)) final Observable<NearbyPlacesInfo> nearbyPlacesInfoObservable = Observable
.subscribeOn(Schedulers.io()) .fromCallable(() -> nearbyController
.observeOn(AndroidSchedulers.mainThread()) .loadAttractionsFromLocation(curlatLng, searchLatLng, false, false));
.subscribe(nearbyPlacesInfo -> {
updateMapMarkers(nearbyPlacesInfo, false); Observable<List<Place>> observableWikidataMonuments = Observable.empty();
lastFocusLocation=searchLatLng; if (Utils.isMonumentsEnabled(new Date(), applicationKvStore)) {
}, observableWikidataMonuments = nearbyController
throwable -> { .queryWikiDataForMonuments(searchLatLng, Locale.getDefault().getLanguage());
Timber.d(throwable);
showErrorMessage(getString(R.string.error_fetching_nearby_places)+throwable.getLocalizedMessage()); }
setProgressBarVisibility(false);
presenter.lockUnlockNearby(false); compositeDisposable.add(Observable.zip(nearbyPlacesInfoObservable
})); , observableWikidataMonuments.onErrorReturn(throwable -> {
showErrorMessage(getString(R.string.error_fetching_nearby_monuments) + throwable
.getLocalizedMessage());
return new ArrayList<>();
}),
(nearbyPlacesInfo, monuments) -> {
final List<Place> places = mergeNearbyPlacesAndMonuments(nearbyPlacesInfo.placeList,
monuments);
nearbyPlacesInfo.placeList.clear();
nearbyPlacesInfo.placeList.addAll(places);
return nearbyPlacesInfo;
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(nearbyPlacesInfo -> {
updateMapMarkers(nearbyPlacesInfo, false);
lastFocusLocation=searchLatLng;
},
throwable -> {
Timber.e(throwable);
showErrorMessage(getString(R.string.error_fetching_nearby_places)+throwable.getLocalizedMessage());
setProgressBarVisibility(false);
presenter.lockUnlockNearby(false);
setFilterState();
}));
}
/**
* If a nearby place happens to be a monument as well, don't make the Pin's overlap, instead
* show it as a monument
*
* @param nearbyPlaces
* @param monuments
* @return
*/
private List<Place> mergeNearbyPlacesAndMonuments(List<Place> nearbyPlaces, List<Place> monuments){
List<Place> allPlaces= new ArrayList<>();
allPlaces.addAll(monuments);
for (Place place : nearbyPlaces){
if(!allPlaces.contains(place)){
allPlaces.add(place);
}
}
return allPlaces;
} }
/** /**
@ -1178,7 +1270,9 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
private void removeCurrentLocationMarker() { private void removeCurrentLocationMarker() {
if (currentLocationMarker != null && mapBox!=null) { if (currentLocationMarker != null && mapBox!=null) {
mapBox.removeMarker(currentLocationMarker); mapBox.removeMarker(currentLocationMarker);
mapBox.removePolygon(currentLocationPolygon); if (currentLocationPolygon != null) {
mapBox.removePolygon(currentLocationPolygon);
}
} }
} }
@ -1244,6 +1338,7 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
public void filterMarkersByLabels(final List<Label> selectedLabels, public void filterMarkersByLabels(final List<Label> selectedLabels,
final boolean displayExists, final boolean displayExists,
final boolean displayNeedsPhoto, final boolean displayNeedsPhoto,
final boolean displayWlm,
final boolean filterForPlaceState, final boolean filterForPlaceState,
final boolean filterForAllNoneType) { final boolean filterForAllNoneType) {
@ -1263,23 +1358,36 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
continue; continue;
} }
if (displayExists && displayNeedsPhoto) { if (!displayWlm && place.isMonument()) {
continue;
}
boolean shouldUpdateMarker=false;
if (displayWlm && place.isMonument()) {
shouldUpdateMarker=true;
}
else if (displayExists && displayNeedsPhoto) {
// Exists and needs photo // Exists and needs photo
if (place.exists && place.pic.trim().isEmpty()) { if (place.exists && place.pic.trim().isEmpty()) {
updateMarker(markerPlaceGroup.getIsBookmarked(), place, NearbyController.currentLocation); shouldUpdateMarker=true;
} }
} else if (displayExists && !displayNeedsPhoto) { } else if (displayExists && !displayNeedsPhoto) {
// Exists and all included needs and doesn't needs photo // Exists and all included needs and doesn't needs photo
if (place.exists) { if (place.exists) {
updateMarker(markerPlaceGroup.getIsBookmarked(), place, NearbyController.currentLocation); shouldUpdateMarker=true;
} }
} else if (!displayExists && displayNeedsPhoto) { } else if (!displayExists && displayNeedsPhoto) {
// All and only needs photo // All and only needs photo
if (place.pic.trim().isEmpty()) { if (place.pic.trim().isEmpty()) {
updateMarker(markerPlaceGroup.getIsBookmarked(), place, NearbyController.currentLocation); shouldUpdateMarker=true;
} }
} else if (!displayExists && !displayNeedsPhoto) { } else if (!displayExists && !displayNeedsPhoto) {
// all // all
shouldUpdateMarker=true;
}
if(shouldUpdateMarker){
updateMarker(markerPlaceGroup.getIsBookmarked(), place, NearbyController.currentLocation); updateMarker(markerPlaceGroup.getIsBookmarked(), place, NearbyController.currentLocation);
} }
} }
@ -1337,7 +1445,10 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
} }
private @DrawableRes int getIconFor(Place place, Boolean isBookmarked) { private @DrawableRes int getIconFor(Place place, Boolean isBookmarked) {
if (!place.pic.trim().isEmpty()) { if(place.isMonument()){
return R.drawable.ic_custom_map_marker_monuments;
}
else if (!place.pic.trim().isEmpty()) {
return (isBookmarked ? return (isBookmarked ?
R.drawable.ic_custom_map_marker_green_bookmarked : R.drawable.ic_custom_map_marker_green_bookmarked :
R.drawable.ic_custom_map_marker_green); R.drawable.ic_custom_map_marker_green);
@ -1397,7 +1508,7 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
} }
@Override @Override
public void recenterMap(final fr.free.nrw.commons.location.LatLng curLatLng) { public void recenterMap(fr.free.nrw.commons.location.LatLng curLatLng) {
if (isPermissionDenied || curLatLng == null) { if (isPermissionDenied || curLatLng == null) {
recenterToUserLocation = true; recenterToUserLocation = true;
checkPermissionsAndPerformAction(); checkPermissionsAndPerformAction();
@ -1667,4 +1778,21 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
rlBottomSheetLayoutParams.height = getActivity().getWindowManager().getDefaultDisplay().getHeight() / 16 * 9; rlBottomSheetLayoutParams.height = getActivity().getWindowManager().getDefaultDisplay().getHeight() / 16 * 9;
rlBottomSheet.setLayoutParams(rlBottomSheetLayoutParams); rlBottomSheet.setLayoutParams(rlBottomSheetLayoutParams);
} }
@OnClick(R.id.tv_learn_more)
public void onLearnMoreClicked() {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(WLM_URL));
startActivity(intent);
}
@OnClick(R.id.iv_toggle_chips)
public void onToggleChipsClicked() {
if (llContainerChips.getVisibility() == View.VISIBLE) {
llContainerChips.setVisibility(View.GONE);
} else {
llContainerChips.setVisibility(View.VISIBLE);
}
ivToggleChips.setRotation(ivToggleChips.getRotation() + 180);
}
} }

View file

@ -7,6 +7,7 @@ class NearbyResultItem(private val item: ResultTuple?,
private val commonsArticle: ResultTuple?, private val commonsArticle: ResultTuple?,
private val location: ResultTuple?, private val location: ResultTuple?,
private val label: ResultTuple?, private val label: ResultTuple?,
@field:SerializedName("streetAddress") private val address: ResultTuple?,
private val icon: ResultTuple?, @field:SerializedName("class") private val className: ResultTuple?, private val icon: ResultTuple?, @field:SerializedName("class") private val className: ResultTuple?,
@field:SerializedName("classLabel") private val classLabel: ResultTuple?, @field:SerializedName("classLabel") private val classLabel: ResultTuple?,
@field:SerializedName("commonsCategory") private val commonsCategory: ResultTuple?, @field:SerializedName("commonsCategory") private val commonsCategory: ResultTuple?,
@ -66,4 +67,8 @@ class NearbyResultItem(private val item: ResultTuple?,
fun getEndTime(): ResultTuple { fun getEndTime(): ResultTuple {
return endTime ?: ResultTuple() return endTime ?: ResultTuple()
} }
fun getAddress(): String {
return address?.value?:""
}
} }

View file

@ -1,6 +1,5 @@
package fr.free.nrw.commons.nearby.presenter; package fr.free.nrw.commons.nearby.presenter;
import android.util.Log;
import android.view.View; import android.view.View;
import androidx.annotation.MainThread; import androidx.annotation.MainThread;
@ -297,6 +296,7 @@ public class NearbyParentFragmentPresenter
nearbyParentFragmentView.filterMarkersByLabels(selectedLabels, nearbyParentFragmentView.filterMarkersByLabels(selectedLabels,
NearbyFilterState.getInstance().isExistsSelected(), NearbyFilterState.getInstance().isExistsSelected(),
NearbyFilterState.getInstance().isNeedPhotoSelected(), NearbyFilterState.getInstance().isNeedPhotoSelected(),
NearbyFilterState.getInstance().isWlmSelected(),
filterForPlaceState, false); filterForPlaceState, false);
nearbyParentFragmentView.setRecyclerViewAdapterAllSelected(); nearbyParentFragmentView.setRecyclerViewAdapterAllSelected();
break; break;
@ -305,6 +305,7 @@ public class NearbyParentFragmentPresenter
nearbyParentFragmentView.filterMarkersByLabels(selectedLabels, nearbyParentFragmentView.filterMarkersByLabels(selectedLabels,
NearbyFilterState.getInstance().isExistsSelected(), NearbyFilterState.getInstance().isExistsSelected(),
NearbyFilterState.getInstance().isNeedPhotoSelected(), NearbyFilterState.getInstance().isNeedPhotoSelected(),
NearbyFilterState.getInstance().isWlmSelected(),
filterForPlaceState, false); filterForPlaceState, false);
} }
} }

View file

@ -1,5 +1,6 @@
package fr.free.nrw.commons.repository; package fr.free.nrw.commons.repository;
import androidx.annotation.Nullable;
import fr.free.nrw.commons.category.CategoriesModel; import fr.free.nrw.commons.category.CategoriesModel;
import fr.free.nrw.commons.category.CategoryItem; import fr.free.nrw.commons.category.CategoryItem;
import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.contributions.Contribution;
@ -26,6 +27,7 @@ import java.util.Locale;
import java.util.Set; import java.util.Set;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import timber.log.Timber;
/** /**
* The repository class for UploadActivity * The repository class for UploadActivity
@ -280,6 +282,7 @@ public class UploadRepository {
* @param decLongitude * @param decLongitude
* @return * @return
*/ */
@Nullable
public Place checkNearbyPlaces(double decLatitude, double decLongitude) { public Place checkNearbyPlaces(double decLatitude, double decLongitude) {
try { try {
List<Place> fromWikidataQuery = nearbyPlaces.getFromWikidataQuery(new LatLng( List<Place> fromWikidataQuery = nearbyPlaces.getFromWikidataQuery(new LatLng(
@ -287,7 +290,8 @@ public class UploadRepository {
Locale.getDefault().getLanguage(), Locale.getDefault().getLanguage(),
NEARBY_RADIUS_IN_KILO_METERS); NEARBY_RADIUS_IN_KILO_METERS);
return fromWikidataQuery.size() > 0 ? fromWikidataQuery.get(0) : null; return fromWikidataQuery.size() > 0 ? fromWikidataQuery.get(0) : null;
} catch (IOException e) { }catch (final Exception e) {
Timber.e("Error fetching nearby places: %s", e.getMessage());
return null; return null;
} }
} }

View file

@ -8,11 +8,13 @@ import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import androidx.preference.ListPreference; import androidx.preference.ListPreference;
import androidx.preference.MultiSelectListPreference; import androidx.preference.MultiSelectListPreference;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.Preference.OnPreferenceChangeListener;
import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceGroupAdapter; import androidx.preference.PreferenceGroupAdapter;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
@ -25,6 +27,7 @@ import com.mapbox.mapboxsdk.Mapbox;
import com.mapbox.mapboxsdk.maps.TelemetryDefinition; import com.mapbox.mapboxsdk.maps.TelemetryDefinition;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.campaigns.CampaignView;
import fr.free.nrw.commons.contributions.MainActivity; import fr.free.nrw.commons.contributions.MainActivity;
import fr.free.nrw.commons.di.ApplicationlessInjection; import fr.free.nrw.commons.di.ApplicationlessInjection;
import fr.free.nrw.commons.kvstore.JsonKvStore; import fr.free.nrw.commons.kvstore.JsonKvStore;
@ -104,7 +107,7 @@ public class SettingsFragment extends PreferenceFragmentCompat {
findPreference("displayNearbyCardView").setEnabled(false); findPreference("displayNearbyCardView").setEnabled(false);
findPreference("descriptionDefaultLanguagePref").setEnabled(false); findPreference("descriptionDefaultLanguagePref").setEnabled(false);
findPreference("displayLocationPermissionForCardView").setEnabled(false); findPreference("displayLocationPermissionForCardView").setEnabled(false);
findPreference("displayCampaignsCardView").setEnabled(false); findPreference(CampaignView.CAMPAIGNS_DEFAULT_PREFERENCE).setEnabled(false);
} }
findPreference("telemetryOptOut").setOnPreferenceChangeListener( findPreference("telemetryOptOut").setOnPreferenceChangeListener(
@ -127,7 +130,7 @@ public class SettingsFragment extends PreferenceFragmentCompat {
} }
@Override @Override
protected Adapter onCreateAdapter(PreferenceScreen preferenceScreen) { protected Adapter onCreateAdapter(final PreferenceScreen preferenceScreen) {
return new PreferenceGroupAdapter(preferenceScreen) { return new PreferenceGroupAdapter(preferenceScreen) {
@Override @Override
public void onBindViewHolder(PreferenceViewHolder holder, int position) { public void onBindViewHolder(PreferenceViewHolder holder, int position) {

View file

@ -13,6 +13,7 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import javax.inject.Inject; import javax.inject.Inject;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import timber.log.Timber;
class PageContentsCreator { class PageContentsCreator {
@ -29,13 +30,15 @@ class PageContentsCreator {
this.context = context; this.context = context;
} }
public String createFrom(Contribution contribution) { public String createFrom(Contribution contribution, String countryCode) {
StringBuilder buffer = new StringBuilder(); StringBuilder buffer = new StringBuilder();
final Media media = contribution.getMedia(); final Media media = contribution.getMedia();
buffer buffer
.append("== {{int:filedesc}} ==\n") .append("== {{int:filedesc}} ==\n")
.append("{{Information\n") .append("{{Information\n")
.append("|description=").append(media.getFallbackDescription()).append("\n") .append("|description=").append(media.getFallbackDescription())
.append("{{ on Wikidata|").append(contribution.getWikidataPlace().getId()).append("}}")
.append("\n")
.append("|source=").append("{{own}}\n") .append("|source=").append("{{own}}\n")
.append("|author=[[User:").append(media.getAuthor()).append("|") .append("|author=[[User:").append(media.getAuthor()).append("|")
.append(media.getAuthor()).append("]]\n"); .append(media.getAuthor()).append("]]\n");
@ -48,6 +51,12 @@ class PageContentsCreator {
buffer.append("}}").append("\n"); buffer.append("}}").append("\n");
if (contribution.getWikidataPlace()!=null && contribution.getWikidataPlace().isMonumentUpload()) {
buffer.append("{{Wiki Loves Monuments 2021|1= ")
.append(countryCode)
.append("}}").append("\n");
}
//Only add Location template (e.g. {{Location|37.51136|-77.602615}} ) if coords is not null //Only add Location template (e.g. {{Location|37.51136|-77.602615}} ) if coords is not null
final String decimalCoords = contribution.getDecimalCoords(); final String decimalCoords = contribution.getDecimalCoords();
if (decimalCoords != null) { if (decimalCoords != null) {
@ -66,6 +75,7 @@ class PageContentsCreator {
} else { } else {
buffer.append("{{subst:unc}}"); buffer.append("{{subst:unc}}");
} }
Timber.d("Template: %s", buffer.toString());
return buffer.toString(); return buffer.toString();
} }

View file

@ -261,6 +261,11 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
return fragments.size(); return fragments.size();
} }
@Override
public boolean isWLMUpload() {
return place!=null && place.isMonument();
}
@Override @Override
public void showMessage(int messageResourceId) { public void showMessage(int messageResourceId) {
ViewUtil.showLongToast(this, messageResourceId); ViewUtil.showLongToast(this, messageResourceId);
@ -372,6 +377,11 @@ public class UploadActivity extends BaseActivity implements UploadContract.View,
public int getTotalNumberOfSteps() { public int getTotalNumberOfSteps() {
return fragments.size(); return fragments.size();
} }
@Override
public boolean isWLMUpload() {
return place!=null && place.isMonument();
}
}); });
fragments.add(uploadMediaDetailFragment); fragments.add(uploadMediaDetailFragment);
} }

View file

@ -37,5 +37,6 @@ public class UploadBaseFragment extends CommonsDaggerSupportFragment {
int getTotalNumberOfSteps(); int getTotalNumberOfSteps();
boolean isWLMUpload();
} }
} }

View file

@ -16,9 +16,7 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
@ -212,11 +210,11 @@ public class UploadClient {
public Observable<UploadResult> uploadFileFromStash( public Observable<UploadResult> uploadFileFromStash(
final Contribution contribution, final Contribution contribution,
final String uniqueFileName, final String uniqueFileName,
final String fileKey) { final String fileKey, @Nullable String countryCode) {
try { try {
return uploadInterface return uploadInterface
.uploadFileFromStash(csrfTokenClient.getTokenBlocking(), .uploadFileFromStash(csrfTokenClient.getTokenBlocking(),
pageContentsCreator.createFrom(contribution), pageContentsCreator.createFrom(contribution, countryCode),
CommonsApplication.DEFAULT_EDIT_SUMMARY, CommonsApplication.DEFAULT_EDIT_SUMMARY,
uniqueFileName, uniqueFileName,
fileKey).map(uploadResponse -> { fileKey).map(uploadResponse -> {

View file

@ -123,6 +123,8 @@ public class UploadMediaDetailAdapter extends RecyclerView.Adapter<UploadMediaDe
eventListener.onPrimaryCaptionTextChange(value.length() != 0); eventListener.onPrimaryCaptionTextChange(value.length() != 0);
} }
})); }));
captionItemEditText.setText(uploadMediaDetail.getCaptionText());
descItemEditText.setText(uploadMediaDetail.getDescriptionText());
if (position == 0) { if (position == 0) {
removeButton.setVisibility(View.GONE); removeButton.setVisibility(View.GONE);

View file

@ -1,6 +1,7 @@
package fr.free.nrw.commons.upload package fr.free.nrw.commons.upload
import android.os.Parcelable import android.os.Parcelable
import fr.free.nrw.commons.location.LatLng
import fr.free.nrw.commons.nearby.Place import fr.free.nrw.commons.nearby.Place
import kotlinx.android.parcel.Parcelize import kotlinx.android.parcel.Parcelize
@ -9,14 +10,18 @@ data class WikidataPlace(
override val id: String, override val id: String,
override val name: String, override val name: String,
val imageValue: String?, val imageValue: String?,
val wikipediaArticle: String? val wikipediaArticle: String?,
val location: LatLng? = null,
val isMonumentUpload : Boolean =false
) : ) :
WikidataItem, Parcelable { WikidataItem, Parcelable {
constructor(place: Place) : this( constructor(place: Place) : this(
place.wikiDataEntityId!!, place.wikiDataEntityId!!,
place.name, place.name,
place.pic.takeIf { it.isNotBlank() }, place.pic.takeIf { it.isNotBlank() },
place.siteLinks.wikipediaLink?.toString() ?: "" place.siteLinks.wikipediaLink?.toString() ?: "",
place.location,
isMonumentUpload=place.isMonument
) )
companion object { companion object {

View file

@ -16,6 +16,7 @@ import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener; import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -48,6 +49,8 @@ public class MediaLicenseFragment extends UploadBaseFragment implements MediaLic
TextView tvShareLicenseSummary; TextView tvShareLicenseSummary;
@BindView(R.id.tooltip) @BindView(R.id.tooltip)
ImageView tooltip; ImageView tooltip;
@BindView(R.id.ll_info_monument_upload)
LinearLayout llInfoMonumentUpload;
@Inject @Inject
MediaLicenseContract.UserActionListener presenter; MediaLicenseContract.UserActionListener presenter;
@ -87,6 +90,16 @@ public class MediaLicenseFragment extends UploadBaseFragment implements MediaLic
initPresenter(); initPresenter();
initLicenseSpinner(); initLicenseSpinner();
presenter.getLicenses(); presenter.getLicenses();
/**
* Show the wlm info message if the upload is a WLM upload
*/
if(callback.isWLMUpload()){
//TODO : Update the info message logo
llInfoMonumentUpload.setVisibility(View.VISIBLE);
}else{
llInfoMonumentUpload.setVisibility(View.GONE);
}
} }
/** /**

View file

@ -3,12 +3,12 @@ package fr.free.nrw.commons.upload.worker
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.location.Geocoder
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat
import androidx.work.CoroutineWorker import androidx.work.CoroutineWorker
import androidx.work.Data import androidx.work.Data
import androidx.work.WorkerParameters import androidx.work.WorkerParameters
import com.google.gson.Gson
import com.mapbox.mapboxsdk.plugins.localization.BuildConfig import com.mapbox.mapboxsdk.plugins.localization.BuildConfig
import dagger.android.ContributesAndroidInjector import dagger.android.ContributesAndroidInjector
import fr.free.nrw.commons.CommonsApplication import fr.free.nrw.commons.CommonsApplication
@ -21,6 +21,7 @@ import fr.free.nrw.commons.contributions.ContributionDao
import fr.free.nrw.commons.customselector.database.UploadedStatus import fr.free.nrw.commons.customselector.database.UploadedStatus
import fr.free.nrw.commons.customselector.database.UploadedStatusDao import fr.free.nrw.commons.customselector.database.UploadedStatusDao
import fr.free.nrw.commons.di.ApplicationlessInjection import fr.free.nrw.commons.di.ApplicationlessInjection
import fr.free.nrw.commons.location.LatLng
import fr.free.nrw.commons.media.MediaClient import fr.free.nrw.commons.media.MediaClient
import fr.free.nrw.commons.upload.FileUtilsWrapper import fr.free.nrw.commons.upload.FileUtilsWrapper
import fr.free.nrw.commons.upload.StashUploadState import fr.free.nrw.commons.upload.StashUploadState
@ -35,6 +36,7 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import timber.log.Timber import timber.log.Timber
import java.io.IOException
import java.util.* import java.util.*
import java.util.regex.Pattern import java.util.regex.Pattern
import javax.inject.Inject import javax.inject.Inject
@ -286,8 +288,16 @@ class UploadWorker(var appContext: Context, workerParams: WorkerParameters) :
try { try {
//Upload the file from stash //Upload the file from stash
var countryCode: String? =null
with(contribution.wikidataPlace?.location){
if(contribution.wikidataPlace?.isMonumentUpload!!) {
countryCode =
reverseGeoCode(contribution.wikidataPlace?.location!!)?.toLowerCase()
}
}
val uploadResult = uploadClient.uploadFileFromStash( val uploadResult = uploadClient.uploadFileFromStash(
contribution, uniqueFileName, stashUploadResult.fileKey contribution, uniqueFileName, stashUploadResult.fileKey, countryCode
).blockingSingle() ).blockingSingle()
if (uploadResult.isSuccessful()) { if (uploadResult.isSuccessful()) {
@ -350,6 +360,26 @@ class UploadWorker(var appContext: Context, workerParams: WorkerParameters) :
} }
} }
private fun reverseGeoCode(latLng: LatLng): String? {
val geocoder = Geocoder(
CommonsApplication.getInstance().applicationContext, Locale
.getDefault()
)
try {
val addresses =
geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1)
for (address in addresses) {
if (address != null && address.locale.isO3Country != null) {
return address.locale.country
}
}
} catch (e: IOException) {
Timber.e(e)
}
return null
}
private fun clearChunks(contribution: Contribution) { private fun clearChunks(contribution: Contribution) {
contribution.chunkInfo=null contribution.chunkInfo=null
contributionDao.saveSynchronous(contribution) contributionDao.saveSynchronous(contribution)

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

View file

@ -37,6 +37,14 @@
app:chipBackgroundColor="@color/bg_chip_state" app:chipBackgroundColor="@color/bg_chip_state"
android:text="@string/place_state_needs_photo"/> android:text="@string/place_state_needs_photo"/>
<com.google.android.material.chip.Chip
android:id="@+id/choice_chip_wlm"
style="@style/Widget.MaterialComponents.Chip.Filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:chipBackgroundColor="@color/bg_chip_state"
android:text="@string/place_state_wlm"/>
</com.google.android.material.chip.ChipGroup> </com.google.android.material.chip.ChipGroup>
</LinearLayout> </LinearLayout>

View file

@ -3,9 +3,9 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_marginBottom="@dimen/activity_margin_horizontal" android:layout_marginBottom="@dimen/activity_margin_horizontal"
android:padding="@dimen/standard_gap" android:padding="@dimen/standard_gap">
>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -67,8 +67,29 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:padding="10dp"
android:orientation="vertical"> android:orientation="vertical">
<LinearLayout
android:id="@+id/ll_info_monument_upload"
android:visibility="gone"
tools:visibility="visible"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="96dp"
android:layout_height="96dp"
app:srcCompat="@drawable/ic_custom_map_marker_monuments"/>
<androidx.appcompat.widget.AppCompatTextView
android:layout_marginLeft="10dp"
android:layout_width="match_parent"
android:text="@string/wlm_upload_info"
android:layout_height="wrap_content"/>
</LinearLayout>
<fr.free.nrw.commons.ui.widget.HtmlTextView <fr.free.nrw.commons.ui.widget.HtmlTextView
android:id="@+id/tv_media_upload_policy" android:id="@+id/tv_media_upload_policy"
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/coordinator_layout" android:id="@+id/coordinator_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
@ -15,6 +16,35 @@
layout="@layout/nearby_filter_all_items" layout="@layout/nearby_filter_all_items"
android:id="@+id/nearby_filter"/> android:id="@+id/nearby_filter"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="12dp"
android:gravity="center"
android:id="@+id/rl_container_wlm_month_message"
android:background="@color/white"
tools:visibility="visible"
android:visibility="gone"
android:layout_below="@id/nearby_filter">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toStartOf="@id/tv_learn_more"
android:textStyle="bold"
android:textColor="@color/secondaryTextColor"
android:text="@string/wlm_month_message"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_learn_more"
android:textColor="@color/status_bar_blue"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_alignParentEnd="true"
android:text="@string/learn_more"
android:layout_height="wrap_content">
</androidx.appcompat.widget.AppCompatTextView>
</RelativeLayout>
<include layout="@layout/nearby_filter_list" <include layout="@layout/nearby_filter_list"
android:id="@+id/nearby_filter_list" android:id="@+id/nearby_filter_list"
android:layout_below="@id/nearby_filter" android:layout_below="@id/nearby_filter"
@ -28,7 +58,7 @@
<RelativeLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_below="@id/nearby_filter"> android:layout_below="@id/rl_container_wlm_month_message">
<com.mapbox.mapboxsdk.maps.MapView <com.mapbox.mapboxsdk.maps.MapView
android:id="@+id/map_view" android:id="@+id/map_view"
@ -69,7 +99,8 @@
android:textColor="@color/status_bar_blue" android:textColor="@color/status_bar_blue"
android:visibility="gone" android:visibility="gone"
app:elevation="@dimen/dimen_6" app:elevation="@dimen/dimen_6"
android:layout_below="@id/nearby_filter"/> android:layout_below="@id/rl_container_wlm_month_message"
/>
<View <View
android:id="@+id/transparentView" android:id="@+id/transparentView"
@ -88,7 +119,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:layout_below="@id/nearby_filter" android:layout_below="@id/rl_container_wlm_month_message"
android:clickable="true" android:clickable="true"
android:visibility="visible" android:visibility="visible"
app:backgroundTint="@color/main_background_light" app:backgroundTint="@color/main_background_light"

View file

@ -1,22 +1,35 @@
<LinearLayout android:layout_width="match_parent" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/status_bar_blue">
<include
android:layout_toStartOf="@+id/iv_toggle_chips"
android:id="@+id/chip_view"
layout="@layout/filter_chip_view"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@android:color/transparent" android:layout_width="match_parent"
android:orientation="vertical" android:background="@color/deleteRed" />
xmlns:android="http://schemas.android.com/apk/res/android">
<include <include
android:id="@+id/chip_view" android:layout_toStartOf="@+id/iv_toggle_chips"
layout="@layout/filter_chip_view" android:id="@+id/search_view_layout"
android:background="@color/deleteRed" layout="@layout/filter_search_view_layout"
/> android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/chip_view" />
<include android:id="@+id/search_view_layout" layout="@layout/filter_search_view_layout" /> <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_toggle_chips"
android:layout_width="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:scaleType="centerCrop"
app:srcCompat="@drawable/ic_expand_less_black_24dp"
android:tint="@color/white"
android:layout_height="wrap_content"
android:padding="12dp"
android:layout_gravity="center" />
<RelativeLayout </RelativeLayout>
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/search_view_layout"
android:background="@color/status_bar_blue">
</RelativeLayout>
</LinearLayout>

View file

@ -27,6 +27,7 @@
* Miguel2706 * Miguel2706
* Mirzali * Mirzali
* Rodney Araujo * Rodney Araujo
* Superzerocool
* Tiberius1701 * Tiberius1701
* Vivaelcelta * Vivaelcelta
* Wizardeck * Wizardeck
@ -41,13 +42,13 @@
<item quantity="other">(%1$d)</item> <item quantity="other">(%1$d)</item>
</plurals> </plurals>
<string name="starting_uploads">Comenzando las subidas</string> <string name="starting_uploads">Comenzando las subidas</string>
<plurals name="starting_multiple_uploads" fuzzy="true"> <plurals name="starting_multiple_uploads">
<item quantity="one">Iniciando %1$d carga</item> <item quantity="one">Procesando %d carga</item>
<item quantity="other">Iniciando %1$d cargas</item> <item quantity="other">Procesando %d cargas</item>
</plurals> </plurals>
<plurals name="multiple_uploads_title" fuzzy="true"> <plurals name="multiple_uploads_title">
<item quantity="one">%1$d carga</item> <item quantity="one">%d carga</item>
<item quantity="other">%1$d cargas</item> <item quantity="other">%1 cargas</item>
</plurals> </plurals>
<plurals name="share_license_summary"> <plurals name="share_license_summary">
<item quantity="one">Esta imagen se publicará bajo la licencia %1$s</item> <item quantity="one">Esta imagen se publicará bajo la licencia %1$s</item>
@ -86,7 +87,7 @@
<string name="uploading_queued">Carga en cola (modo de conexión limitada activado)</string> <string name="uploading_queued">Carga en cola (modo de conexión limitada activado)</string>
<string name="upload_completed_notification_title">¡Se ha subido %1$s!</string> <string name="upload_completed_notification_title">¡Se ha subido %1$s!</string>
<string name="upload_completed_notification_text">Pulsa para ver tu subida</string> <string name="upload_completed_notification_text">Pulsa para ver tu subida</string>
<string name="upload_progress_notification_title_start" fuzzy="true">Empezando la subida de %1$s</string> <string name="upload_progress_notification_title_start">Empezando la subida de %s</string>
<string name="upload_progress_notification_title_in_progress">Subiendo %1$s</string> <string name="upload_progress_notification_title_in_progress">Subiendo %1$s</string>
<string name="upload_progress_notification_title_finishing">Finalizando la subida de %1$s</string> <string name="upload_progress_notification_title_finishing">Finalizando la subida de %1$s</string>
<string name="upload_failed_notification_title">Falló la carga de %1$s</string> <string name="upload_failed_notification_title">Falló la carga de %1$s</string>
@ -254,6 +255,7 @@
<string name="upload_problem_different_geolocation">Esta imagen fue tomada en una ubicación diferente.</string> <string name="upload_problem_different_geolocation">Esta imagen fue tomada en una ubicación diferente.</string>
<string name="upload_problem_fbmd">Por favor sube solo fotografías que tu mismo hayas tomado. No subas imágenes o fotografías que hayas encontrado en las cuentas de Facebook de otros.</string> <string name="upload_problem_fbmd">Por favor sube solo fotografías que tu mismo hayas tomado. No subas imágenes o fotografías que hayas encontrado en las cuentas de Facebook de otros.</string>
<string name="upload_problem_do_you_continue">¿Todavía quieres cargar esta imagen?</string> <string name="upload_problem_do_you_continue">¿Todavía quieres cargar esta imagen?</string>
<string name="upload_connection_error_alert_title">Error de conexión</string>
<string name="upload_connection_error_alert_detail">El cargar el proceso requiere acceso de internet activo. Complacer comprobar vuestra conexión de red.</string> <string name="upload_connection_error_alert_detail">El cargar el proceso requiere acceso de internet activo. Complacer comprobar vuestra conexión de red.</string>
<string name="upload_problem_image">Problemas encontrados en la imagen</string> <string name="upload_problem_image">Problemas encontrados en la imagen</string>
<string name="internet_downloaded">Carga únicamente fotografías que hayas creado tú. No cargues imágenes o fotografías que hayas descargado de Internet.</string> <string name="internet_downloaded">Carga únicamente fotografías que hayas creado tú. No cargues imágenes o fotografías que hayas descargado de Internet.</string>
@ -401,6 +403,8 @@
<string name="no_categories_selected">No hay categorías seleccionadas</string> <string name="no_categories_selected">No hay categorías seleccionadas</string>
<string name="no_categories_selected_warning_desc">Las imágenes sin categorías raramente se pueden usar. ¿Seguro que quieres continuar sin seleccionar ninguna categoría?</string> <string name="no_categories_selected_warning_desc">Las imágenes sin categorías raramente se pueden usar. ¿Seguro que quieres continuar sin seleccionar ninguna categoría?</string>
<string name="no_depictions_selected">No se han seleccionado representaciones</string> <string name="no_depictions_selected">No se han seleccionado representaciones</string>
<string name="back_button_warning">Cancelar la carga</string>
<string name="back_button_continue">Continuar la carga</string>
<string name="upload_flow_all_images_in_set">(Para todas las imágenes en el conjunto)</string> <string name="upload_flow_all_images_in_set">(Para todas las imágenes en el conjunto)</string>
<string name="search_this_area">Buscar en esta área</string> <string name="search_this_area">Buscar en esta área</string>
<string name="nearby_card_permission_title">Solicitud de permiso</string> <string name="nearby_card_permission_title">Solicitud de permiso</string>
@ -459,6 +463,7 @@
<string name="images_featured_explanation">Las imágenes destacadas son creaciones de talentosos fotógrafos e ilustradores que la comunidad de Wikimedia Commons ha reconocido como las de mayor calidad del sitio.</string> <string name="images_featured_explanation">Las imágenes destacadas son creaciones de talentosos fotógrafos e ilustradores que la comunidad de Wikimedia Commons ha reconocido como las de mayor calidad del sitio.</string>
<string name="images_via_nearby_explanation">Las imágenes subidas via Lugares Cercanos son las imágenes que han sido cargadas al descubrir lugares en el mapa.</string> <string name="images_via_nearby_explanation">Las imágenes subidas via Lugares Cercanos son las imágenes que han sido cargadas al descubrir lugares en el mapa.</string>
<string name="thanks_received_explanation">Esta funcionalidad permite a los editores enviar una notificación de agradecimiento a aquellos usuarios que realicen ediciones útiles mediante un pequeño enlace en la página de historial o de diferencias.</string> <string name="thanks_received_explanation">Esta funcionalidad permite a los editores enviar una notificación de agradecimiento a aquellos usuarios que realicen ediciones útiles mediante un pequeño enlace en la página de historial o de diferencias.</string>
<string name="copied_successfully">Copiado</string>
<string name="welcome_do_upload_content_description">Ejemplos de imágenes adecuadas para Commons</string> <string name="welcome_do_upload_content_description">Ejemplos de imágenes adecuadas para Commons</string>
<string name="welcome_dont_upload_content_description">Ejemplos de imágenes que no deben cargarse</string> <string name="welcome_dont_upload_content_description">Ejemplos de imágenes que no deben cargarse</string>
<string name="skip_image">Omitir esta imagen</string> <string name="skip_image">Omitir esta imagen</string>
@ -528,20 +533,29 @@
<string name="theme_default_name">Seguir sistema</string> <string name="theme_default_name">Seguir sistema</string>
<string name="theme_dark_name">Oscuro</string> <string name="theme_dark_name">Oscuro</string>
<string name="theme_light_name">Claro</string> <string name="theme_light_name">Claro</string>
<string name="load_more">Cargar más</string>
<string name="todo_improve">Mejoras sugeridas:</string> <string name="todo_improve">Mejoras sugeridas:</string>
<string name="confirm">Confirmar</string>
<string name="instructions_title">Instrucciones</string>
<string name="pause">pausar</string> <string name="pause">pausar</string>
<string name="resume">reanudar</string> <string name="resume">reanudar</string>
<string name="paused">En pausa</string> <string name="paused">En pausa</string>
<string name="more">Más</string>
<string name="favorites">Favoritos</string>
<string name="achievements_tab_title">Logros</string> <string name="achievements_tab_title">Logros</string>
<string name="leaderboard_tab_title">Tabla de posiciones</string>
<string name="count_prefix">Recuento:</string> <string name="count_prefix">Recuento:</string>
<string name="leaderboard_column_user">Usuario</string> <string name="leaderboard_column_user">Usuario</string>
<string name="menu_set_avatar">Establecer como avatar</string> <string name="menu_set_avatar">Establecer como avatar</string>
<string name="leaderboard_yearly">Por año</string> <string name="leaderboard_yearly">Por año</string>
<string name="leaderboard_weekly">Por semana</string> <string name="leaderboard_weekly">Por semana</string>
<string name="leaderboard_all_time">Todo el tiempo</string> <string name="leaderboard_all_time">Todo el tiempo</string>
<string name="leaderboard_upload">Subir</string>
<string name="limited_connection_enabled">Se activó el modo de conexión limitada.</string> <string name="limited_connection_enabled">Se activó el modo de conexión limitada.</string>
<string name="limited_connection_disabled">Se desactivó el modo de conexión limitada. Las cargas pendientes se reanudarán ahora.</string> <string name="limited_connection_disabled">Se desactivó el modo de conexión limitada. Las cargas pendientes se reanudarán ahora.</string>
<string name="limited_connection_mode" fuzzy="true">Conexión limitada</string> <string name="limited_connection_mode">Modo de conexión limitada</string>
<string name="statistics_quality">Imágenes de calidad</string>
<string name="read_help_link">Más información</string>
<string name="media_detail_in_all_languages">En más idiomas</string> <string name="media_detail_in_all_languages">En más idiomas</string>
<string name="choose_a_location">Escoge una ubicación</string> <string name="choose_a_location">Escoge una ubicación</string>
<string name="pan_and_zoom_to_adjust">Haz una panorámica y acércate para ajustar</string> <string name="pan_and_zoom_to_adjust">Haz una panorámica y acércate para ajustar</string>

View file

@ -364,6 +364,9 @@
<string name="no_uploads">به کامانز خوش آمدید!\n\nاولین فایلتان را با فشردن کلید اضافه بارگذاری کنید.</string> <string name="no_uploads">به کامانز خوش آمدید!\n\nاولین فایلتان را با فشردن کلید اضافه بارگذاری کنید.</string>
<string name="no_categories_selected">رده‌ای انتخاب نشده‌است</string> <string name="no_categories_selected">رده‌ای انتخاب نشده‌است</string>
<string name="no_categories_selected_warning_desc">تصاویر بدون رده به ندرت قابل‌استفاده هستند. آیا مطمئنید که می‌خواهید بدون انتخاب رده ادامه دهید؟</string> <string name="no_categories_selected_warning_desc">تصاویر بدون رده به ندرت قابل‌استفاده هستند. آیا مطمئنید که می‌خواهید بدون انتخاب رده ادامه دهید؟</string>
<string name="back_button_warning">لغو بارگذاری</string>
<string name="back_button_warning_desc">استفاده از دکمهٔ بازگشت این بارگذاری را لغو خواهد کرد و پیشرفت شما از دست خواهد رفت</string>
<string name="back_button_continue">ادامهٔ بارگذاری</string>
<string name="upload_flow_all_images_in_set" fuzzy="true">(برای همهٔ تصاویر موجود در مجموعه)</string> <string name="upload_flow_all_images_in_set" fuzzy="true">(برای همهٔ تصاویر موجود در مجموعه)</string>
<string name="search_this_area">جستجوی این محدوده</string> <string name="search_this_area">جستجوی این محدوده</string>
<string name="nearby_card_permission_title">درخواست اجازه</string> <string name="nearby_card_permission_title">درخواست اجازه</string>

View file

@ -170,6 +170,7 @@
<string name="location_permission_title">Helymeghatározás hozzáférés igénylése</string> <string name="location_permission_title">Helymeghatározás hozzáférés igénylése</string>
<string name="ok">OK</string> <string name="ok">OK</string>
<string name="warning">Figyelmeztetés</string> <string name="warning">Figyelmeztetés</string>
<string name="upload">Feltöltés</string>
<string name="yes">Igen</string> <string name="yes">Igen</string>
<string name="no">Nem</string> <string name="no">Nem</string>
<string name="media_detail_title">Cím</string> <string name="media_detail_title">Cím</string>
@ -223,9 +224,10 @@
<string name="upload_problem_different_geolocation">A kép máshol készült.</string> <string name="upload_problem_different_geolocation">A kép máshol készült.</string>
<string name="upload_problem_fbmd">Csak saját magad által készített képeket töltsél fel. Ne tölts fel mások Facebook oldalán talált képeket.</string> <string name="upload_problem_fbmd">Csak saját magad által készített képeket töltsél fel. Ne tölts fel mások Facebook oldalán talált képeket.</string>
<string name="upload_problem_do_you_continue">Biztosan fel akarod tölteni ezt a képet?</string> <string name="upload_problem_do_you_continue">Biztosan fel akarod tölteni ezt a képet?</string>
<string name="upload_connection_error_alert_title">Kapcsolódási hiba</string>
<string name="internet_downloaded">Csak saját magad által készített képeket töltsél fel. Ne tölts fel az Internetről letöltött képeket.</string> <string name="internet_downloaded">Csak saját magad által készített képeket töltsél fel. Ne tölts fel az Internetről letöltött képeket.</string>
<string name="use_external_storage" fuzzy="true">Külső tárhely használata</string> <string name="use_external_storage" fuzzy="true">Külső tárhely használata</string>
<string name="use_external_storage_summary" fuzzy="true">Az alkalmazáson belüli kamerával készült képek mentése az eszközre</string> <string name="use_external_storage_summary">Az alkalmazáson belüli kamerával készült képek mentése az eszközre</string>
<string name="login_to_your_account">Bejelentkezés a fiókodba</string> <string name="login_to_your_account">Bejelentkezés a fiókodba</string>
<string name="send_log_file">Naplófájl küldése</string> <string name="send_log_file">Naplófájl küldése</string>
<string name="send_log_file_description">Naplófájl küldése e-mailben a fejlesztőknek, az alkalmazásban található hiba kiküszöbölésére. Megjegyzés: a napló potenciálisan azonosításra alkalmas adatokat tartalmazhat.</string> <string name="send_log_file_description">Naplófájl küldése e-mailben a fejlesztőknek, az alkalmazásban található hiba kiküszöbölésére. Megjegyzés: a napló potenciálisan azonosításra alkalmas adatokat tartalmazhat.</string>
@ -241,7 +243,7 @@
<string name="login_alert_message">A funkció használatához kérlek jelentkezz be.</string> <string name="login_alert_message">A funkció használatához kérlek jelentkezz be.</string>
<string name="copy_wikicode">Wikiszöveg vágólapra másolása</string> <string name="copy_wikicode">Wikiszöveg vágólapra másolása</string>
<string name="wikicode_copied">A wikiszöveg a vágólapra lett másolva</string> <string name="wikicode_copied">A wikiszöveg a vágólapra lett másolva</string>
<string name="nearby_location_not_available" fuzzy="true">A hely nem érhető el.</string> <string name="nearby_location_not_available">A hely nem érhető el.</string>
<string name="location_permission_rationale_nearby">Közeli helyek listájának megtekintéséhez engedély szükséges</string> <string name="location_permission_rationale_nearby">Közeli helyek listájának megtekintéséhez engedély szükséges</string>
<string name="nearby_directions">Irányok</string> <string name="nearby_directions">Irányok</string>
<string name="nearby_wikidata">Wikidata</string> <string name="nearby_wikidata">Wikidata</string>
@ -261,6 +263,7 @@
<string name="about_translate_cancel">Mégse</string> <string name="about_translate_cancel">Mégse</string>
<string name="retry">Újra</string> <string name="retry">Újra</string>
<string name="showcase_view_whole_nearby_activity">Vannak olyan helyek a közeledben, amikről van Wikipédia szócikk és nincs bennük kép.\n\nA \"Keresés ezen a helyen\"-re kattintva közeli helyekre vonatkozó keresést indíthatsz el.</string> <string name="showcase_view_whole_nearby_activity">Vannak olyan helyek a közeledben, amikről van Wikipédia szócikk és nincs bennük kép.\n\nA \"Keresés ezen a helyen\"-re kattintva közeli helyekre vonatkozó keresést indíthatsz el.</string>
<string name="showcase_view_no_longer_exists">A hely nem létezik.</string>
<string name="no_images_found">Nem található kép!</string> <string name="no_images_found">Nem található kép!</string>
<string name="error_loading_images">Képbetöltés közben hiba történt</string> <string name="error_loading_images">Képbetöltés közben hiba történt</string>
<string name="image_uploaded_by">Feltöltötte: %1$s</string> <string name="image_uploaded_by">Feltöltötte: %1$s</string>
@ -356,13 +359,14 @@
<string name="no_uploads">Üdvözlünk a Commons-ban. \n\nA hozzáadás gombra koppintva feltöltheted első képedet.</string> <string name="no_uploads">Üdvözlünk a Commons-ban. \n\nA hozzáadás gombra koppintva feltöltheted első képedet.</string>
<string name="no_categories_selected">Nincs kiválasztott kategória</string> <string name="no_categories_selected">Nincs kiválasztott kategória</string>
<string name="no_categories_selected_warning_desc">A kategória nélküli képek ritkán használhatóak. Biztos, hogy kategória kiválasztása nélkül akarsz továbblépni?</string> <string name="no_categories_selected_warning_desc">A kategória nélküli képek ritkán használhatóak. Biztos, hogy kategória kiválasztása nélkül akarsz továbblépni?</string>
<string name="back_button_warning">Feltöltés megszakítása</string>
<string name="upload_flow_all_images_in_set">(az összes képre)</string> <string name="upload_flow_all_images_in_set">(az összes képre)</string>
<string name="search_this_area">Keresés ezen a helyen</string> <string name="search_this_area">Keresés ezen a helyen</string>
<string name="nearby_card_permission_title">Engedély kérése</string> <string name="nearby_card_permission_title">Engedély kérése</string>
<string name="nearby_card_permission_explanation">A földrajzi hely ismerete szükséges a közeli hely meghatározásához, ami képet igényel.</string> <string name="nearby_card_permission_explanation">A földrajzi hely ismerete szükséges a közeli hely meghatározásához, ami képet igényel.</string>
<string name="unable_to_display_nearest_place">A helymeghatározás nélkül nem használható ez a funkció.</string> <string name="unable_to_display_nearest_place">A helymeghatározás nélkül nem használható ez a funkció.</string>
<string name="never_ask_again">Ne kérdezd meg többször</string> <string name="never_ask_again">Ne kérdezd meg többször</string>
<string name="display_location_permission_title" fuzzy="true">Helymeghatározási engedély</string> <string name="display_location_permission_title">Helymeghatározási engedély</string>
<string name="achievements_fetch_failed">Valami hiba történt, nem sikerült az eredményeid betöltése</string> <string name="achievements_fetch_failed">Valami hiba történt, nem sikerült az eredményeid betöltése</string>
<string name="display_campaigns">Kampányok megjelenítése</string> <string name="display_campaigns">Kampányok megjelenítése</string>
<string name="display_campaigns_explanation">Folyamatban lévő kampányok megjelenítése</string> <string name="display_campaigns_explanation">Folyamatban lévő kampányok megjelenítése</string>
@ -455,11 +459,13 @@
<string name="place_type">Hely típusa:</string> <string name="place_type">Hely típusa:</string>
<string name="nearby_search_hint">Híd, múzeum, szálloda, stb.</string> <string name="nearby_search_hint">Híd, múzeum, szálloda, stb.</string>
<string name="you_must_reset_your_passsword">A belépés nem sikerült, kérj új jelszót.</string> <string name="you_must_reset_your_passsword">A belépés nem sikerült, kérj új jelszót.</string>
<string name="setting_wallpaper_dialog_title">Beállítás háttérképnek</string>
<string name="setting_wallpaper_dialog_message">Beállítás háttérképnek. Kérem várjon...</string>
<string name="theme_default_name">Rendszerbeállítás követése</string> <string name="theme_default_name">Rendszerbeállítás követése</string>
<string name="theme_dark_name">Sötét</string> <string name="theme_dark_name">Sötét</string>
<string name="theme_light_name">Világos</string> <string name="theme_light_name">Világos</string>
<string name="map_attribution">&amp;#169; &lt;a href=\"https://www.mapbox.com/about/maps/\"&gt;Mapbox&lt;/a&gt; &amp;#169; &lt;a href=\"https://www.openstreetmap.org/copyright\"&gt;OpenStreetMap&lt;/a&gt; &lt;a href=\"https://www.mapbox.com/map-feedback/\"&gt;Térkép fejlesztése&lt;/a&gt;</string> <string name="map_attribution">&amp;#169; &lt;a href=\"https://www.mapbox.com/about/maps/\"&gt;Mapbox&lt;/a&gt; &amp;#169; &lt;a href=\"https://www.openstreetmap.org/copyright\"&gt;OpenStreetMap&lt;/a&gt; &lt;a href=\"https://www.mapbox.com/map-feedback/\"&gt;Térkép fejlesztése&lt;/a&gt;</string>
<string name="limited_connection_enabled">Korlátozott kapcsolat-mód bekapcsolva!</string> <string name="limited_connection_enabled">Korlátozott kapcsolat-mód bekapcsolva!</string>
<string name="limited_connection_disabled">Korlátozott kapcsolat-mód kikapcsolva. Függőben lévő feltöltések folytatása.</string> <string name="limited_connection_disabled">Korlátozott kapcsolat-mód kikapcsolva. Függőben lévő feltöltések folytatása.</string>
<string name="limited_connection_mode" fuzzy="true">Korlátozott kapcsolat</string> <string name="limited_connection_mode">Korlátozott kapcsolat mód</string>
</resources> </resources>

View file

@ -33,7 +33,7 @@
<string name="menu_from_gallery">Del galeria</string> <string name="menu_from_gallery">Del galeria</string>
<string name="menu_from_camera">Prender photo</string> <string name="menu_from_camera">Prender photo</string>
<string name="provider_contributions">Mi incargamentos</string> <string name="provider_contributions">Mi incargamentos</string>
<string name="menu_share">Divider</string> <string name="menu_share">Condivider</string>
<string name="write_storage_permission_rationale">Permission necessari: Scriber sur immagazinage externe. Le app non pote acceder a tu camera/galeria sin isto.</string> <string name="write_storage_permission_rationale">Permission necessari: Scriber sur immagazinage externe. Le app non pote acceder a tu camera/galeria sin isto.</string>
<string name="upload_connection_error_alert_title">Error de connexion</string> <string name="upload_connection_error_alert_title">Error de connexion</string>
<string name="upload_connection_error_alert_detail">Le processo de incargamento require un accesso a internet active. Per favor verifica tu connexion al rete.</string> <string name="upload_connection_error_alert_detail">Le processo de incargamento require un accesso a internet active. Per favor verifica tu connexion al rete.</string>

View file

@ -8,25 +8,40 @@
<item quantity="one">%1$d n ufaylu yezga yettali</item> <item quantity="one">%1$d n ufaylu yezga yettali</item>
<item quantity="other">%1$d n ifuyla zgan ttalin</item> <item quantity="other">%1$d n ifuyla zgan ttalin</item>
</plurals> </plurals>
<plurals name="contributions_subtitle" fuzzy="true"> <plurals name="contributions_subtitle">
<item quantity="zero">\@string/contributions_subtitle_zero</item> <item quantity="one">(%1$d)</item>
<item quantity="other">(%1$d)</item>
</plurals>
<string name="starting_uploads">Beddu n walluy</string>
<plurals name="starting_multiple_uploads">
<item quantity="one">%d n usali iteddu</item>
<item quantity="other">%d n usali iteddu</item>
</plurals>
<plurals name="multiple_uploads_title">
<item quantity="one">%1$d n usali</item> <item quantity="one">%1$d n usali</item>
<item quantity="other">%1$d n usali</item> <item quantity="other">%1$d n usali</item>
</plurals> </plurals>
<plurals name="starting_multiple_uploads" fuzzy="true"> <plurals name="share_license_summary">
<item quantity="one">Beddu n %1$d n usali</item> <item quantity="one">Tugna-a ad tili s turagt %1$s.</item>
<item quantity="other">Beddu n %1$d n usali</item> <item quantity="other">Tugniwin-a ad ilint s turagt %1$s.</item>
</plurals> </plurals>
<plurals name="multiple_uploads_title" fuzzy="true"> <plurals name="upload_count_title">
<item quantity="one">%1$d n usali</item> <item quantity="one">%1$d n usali</item>
<item quantity="other">%1$d n usali</item> <item quantity="other">%1$d n usali</item>
</plurals> </plurals>
<string name="share_license_summary" fuzzy="true">Tugna-agi ad tili daw n turagt %1$s</string> <string name="navigation_item_explore">Snirem</string>
<string name="preference_category_appearance">Tummant</string>
<string name="preference_category_general">Amatu</string>
<string name="preference_category_feedback">Tikti</string>
<string name="preference_category_privacy">Tabaḍnit</string>
<string name="app_name">Ayen yettwasnen</string> <string name="app_name">Ayen yettwasnen</string>
<string name="menu_settings">Iɣewwaren</string> <string name="menu_settings">Iɣewwaren</string>
<string name="intent_share_upload_label">Sali ɣer Commons</string>
<string name="username">Isem n useqdac</string> <string name="username">Isem n useqdac</string>
<string name="password">Awal uffir</string> <string name="password">Awal uffir</string>
<string name="login_credential">Qqen ɣer umiḍan-ik Commons Beta</string>
<string name="login">Qqen</string> <string name="login">Qqen</string>
<string name="forgot_password">Tettuḍ awal uffir?</string>
<string name="signup">Jerred</string> <string name="signup">Jerred</string>
<string name="logging_in_title">Tuqqna...</string> <string name="logging_in_title">Tuqqna...</string>
<string name="logging_in_message">Rǧu...</string> <string name="logging_in_message">Rǧu...</string>

View file

@ -12,13 +12,13 @@
<item quantity="other">(%1$d)</item> <item quantity="other">(%1$d)</item>
</plurals> </plurals>
<string name="starting_uploads">Hilbarkirinan bide dest pê kirin</string> <string name="starting_uploads">Hilbarkirinan bide dest pê kirin</string>
<plurals name="starting_multiple_uploads" fuzzy="true"> <plurals name="starting_multiple_uploads">
<item quantity="one">%1$d barkirinê dide destpêkirin</item> <item quantity="one">%1$d barkirinê dide xebitandin</item>
<item quantity="other">%1$d barkirinan dide destpêkirin</item> <item quantity="other">%1$d barkirinan dide xebitandin</item>
</plurals> </plurals>
<plurals name="multiple_uploads_title" fuzzy="true"> <plurals name="multiple_uploads_title">
<item quantity="one">%1$d barkirin</item> <item quantity="one">%d barkirin</item>
<item quantity="other">%1$d barkirin</item> <item quantity="other">%d barkirin</item>
</plurals> </plurals>
<string name="navigation_item_explore">Kişf bike</string> <string name="navigation_item_explore">Kişf bike</string>
<string name="preference_category_appearance">Xuyabûn</string> <string name="preference_category_appearance">Xuyabûn</string>
@ -97,6 +97,11 @@
<string name="cancel">Betal bike</string> <string name="cancel">Betal bike</string>
<string name="navigation_drawer_open">Veke</string> <string name="navigation_drawer_open">Veke</string>
<string name="navigation_drawer_close">Bigre</string> <string name="navigation_drawer_close">Bigre</string>
<string name="navigation_item_home">Destpêk</string>
<string name="navigation_item_upload">Hilbar bike</string>
<string name="navigation_item_nearby">Yên nêzîk</string>
<string name="navigation_item_about">Derbar</string>
<string name="navigation_item_settings">Mîheng</string>
<string name="navigation_item_feedback">Paşragihandin</string> <string name="navigation_item_feedback">Paşragihandin</string>
<string name="navigation_item_logout">Derkeve</string> <string name="navigation_item_logout">Derkeve</string>
<string name="skip_login">Derbas bike</string> <string name="skip_login">Derbas bike</string>
@ -141,8 +146,8 @@
<string name="statistics_wikidata_edits">Wêneyên bi riya \"Cihên Nêz\"</string> <string name="statistics_wikidata_edits">Wêneyên bi riya \"Cihên Nêz\"</string>
<string name="level">Derece</string> <string name="level">Derece</string>
<string name="images_uploaded">Wêneyên Hilbarkirî</string> <string name="images_uploaded">Wêneyên Hilbarkirî</string>
<string name="review_thanks_yes_button_text" fuzzy="true">Belê, çima nebe</string> <string name="review_thanks_yes_button_text">Rûpela din</string>
<string name="review_thanks_no_button_text" fuzzy="true">Wêneya pêş</string> <string name="review_thanks_no_button_text">Belê, çima na</string>
<string name="please_wait">Ji kerema xwe re bisekine ...</string> <string name="please_wait">Ji kerema xwe re bisekine ...</string>
<string name="add_picture_to_wikipedia_article_title">Wêne tevlî Wîkîpediyayê bike</string> <string name="add_picture_to_wikipedia_article_title">Wêne tevlî Wîkîpediyayê bike</string>
<string name="add_picture_to_wikipedia_article_desc">Tu dixwazî vê wêneyê tevlî gotara Wîkîpediyayê ya bi zimanê %1$s bikî?</string> <string name="add_picture_to_wikipedia_article_desc">Tu dixwazî vê wêneyê tevlî gotara Wîkîpediyayê ya bi zimanê %1$s bikî?</string>

View file

@ -240,6 +240,8 @@
<string name="upload_problem_different_geolocation">Esta fotografia foi tirada num local diferente.</string> <string name="upload_problem_different_geolocation">Esta fotografia foi tirada num local diferente.</string>
<string name="upload_problem_fbmd">Carregue só fotografias tiradas por si, por favor. Não carregue fotografias que encontrou na conta do Facebook de outra pessoa.</string> <string name="upload_problem_fbmd">Carregue só fotografias tiradas por si, por favor. Não carregue fotografias que encontrou na conta do Facebook de outra pessoa.</string>
<string name="upload_problem_do_you_continue">Quer, mesmo assim, carregar esta fotografia?</string> <string name="upload_problem_do_you_continue">Quer, mesmo assim, carregar esta fotografia?</string>
<string name="upload_connection_error_alert_title">Erro de ligação</string>
<string name="upload_connection_error_alert_detail">O processo de carregamento requer um acesso ativo à internet. Verifique a sua ligação de rede.</string>
<string name="upload_problem_image">Problemas encontrados na imagem</string> <string name="upload_problem_image">Problemas encontrados na imagem</string>
<string name="internet_downloaded">Carregue só fotografias tiradas por si, por favor. Não carregue fotografias que tenha descarregado da Internet.</string> <string name="internet_downloaded">Carregue só fotografias tiradas por si, por favor. Não carregue fotografias que tenha descarregado da Internet.</string>
<string name="use_external_storage">Guardar fotos tiradas com a aplicação</string> <string name="use_external_storage">Guardar fotos tiradas com a aplicação</string>
@ -387,6 +389,9 @@
<string name="no_categories_selected_warning_desc">As imagens sem categorias só raramente são utilizáveis. Tem a certeza de que deseja continuar sem selecionar categorias?</string> <string name="no_categories_selected_warning_desc">As imagens sem categorias só raramente são utilizáveis. Tem a certeza de que deseja continuar sem selecionar categorias?</string>
<string name="no_depictions_selected">Não foram selecionadas representações</string> <string name="no_depictions_selected">Não foram selecionadas representações</string>
<string name="no_depictions_selected_warning_desc">As imagens com representações são encontradas mais facilmente e mais propensas a serem usadas. Tem a certeza de que deseja continuar sem selecionar representações?</string> <string name="no_depictions_selected_warning_desc">As imagens com representações são encontradas mais facilmente e mais propensas a serem usadas. Tem a certeza de que deseja continuar sem selecionar representações?</string>
<string name="back_button_warning">Cancelar carregamento</string>
<string name="back_button_warning_desc">Usar o botão Voltar cancelará este carregamento e perderá o seu progresso</string>
<string name="back_button_continue">Continuar carregamento</string>
<string name="upload_flow_all_images_in_set">(Para todas as imagens do conjunto)</string> <string name="upload_flow_all_images_in_set">(Para todas as imagens do conjunto)</string>
<string name="search_this_area">Pesquisar nesta área</string> <string name="search_this_area">Pesquisar nesta área</string>
<string name="nearby_card_permission_title">Pedido de permissões</string> <string name="nearby_card_permission_title">Pedido de permissões</string>
@ -492,6 +497,12 @@
</plurals> </plurals>
<string name="category_edit_helper_edit_message_else">Não foi possível adicionar categorias.</string> <string name="category_edit_helper_edit_message_else">Não foi possível adicionar categorias.</string>
<string name="category_edit_button_text">Atualizar categorias</string> <string name="category_edit_button_text">Atualizar categorias</string>
<string name="coordinates_edit_helper_make_edit_toast">A tentar atualizar coordenadas.</string>
<string name="coordinates_edit_helper_show_edit_title">Atualização de coordenadas</string>
<string name="coordinates_edit_helper_show_edit_title_success">Êxito</string>
<string name="coordinates_edit_helper_show_edit_message">As coordenadas %1$s foram adicionadas.</string>
<string name="coordinates_edit_helper_edit_message_else">Não foi possível adicionar coordenadas.</string>
<string name="coordinates_picking_unsuccessful">Não foi possível obter coordenadas.</string>
<string name="share_image_via">Partilhar imagem via</string> <string name="share_image_via">Partilhar imagem via</string>
<string name="no_achievements_yet">Ainda não fez nenhuma contribuição</string> <string name="no_achievements_yet">Ainda não fez nenhuma contribuição</string>
<string name="account_created">Conta criada!</string> <string name="account_created">Conta criada!</string>
@ -586,5 +597,18 @@
<string name="media_detail_step_title">Detalhes de multimédia</string> <string name="media_detail_step_title">Detalhes de multimédia</string>
<string name="menu_view_category_page">Ver página de categoria</string> <string name="menu_view_category_page">Ver página de categoria</string>
<string name="menu_view_item_page">Ver página do elemento</string> <string name="menu_view_item_page">Ver página do elemento</string>
<string name="app_ui_language">Língua da interface do utilizador da aplicação</string>
<string name="remove">Remove uma legenda e descrição</string>
<string name="read_help_link">Ler mais</string> <string name="read_help_link">Ler mais</string>
<string name="media_detail_in_all_languages">Em todas as línguas</string>
<string name="choose_a_location">Escolher uma localização</string>
<string name="pan_and_zoom_to_adjust">Fazer uma panorâmica e aproximar para ajustar</string>
<string name="exit_location_picker">Sair do selecionador de localização</string>
<string name="select_location_location_picker">Selecionar localização</string>
<string name="show_in_map_app">Mostrar na aplicação de mapa</string>
<string name="modify_location">Editar localização</string>
<string name="location_picker_image_view">A vista de imagem do selecionador de localização</string>
<string name="location_picker_image_view_shadow">A sombra da vista de imagem do selecionador de localização</string>
<string name="image_location">Localização da imagem</string>
<string name="check_whether_location_is_correct">Verificar se a localização está correta</string>
</resources> </resources>

View file

@ -41,6 +41,7 @@
<string name="upload_progress_notification_title_in_progress">%1$s தரவேற்றப்படுகிறது</string> <string name="upload_progress_notification_title_in_progress">%1$s தரவேற்றப்படுகிறது</string>
<string name="upload_progress_notification_title_finishing">%1$s தரவேற்றம் முடிக்கப்படுகிறது</string> <string name="upload_progress_notification_title_finishing">%1$s தரவேற்றம் முடிக்கப்படுகிறது</string>
<string name="upload_failed_notification_title">%1$s பதிவேற்றுவது தோல்வியுற்றது</string> <string name="upload_failed_notification_title">%1$s பதிவேற்றுவது தோல்வியுற்றது</string>
<string name="upload_paused_notification_title">%1$s பதிவேற்றுவது இடைநிறுத்தப்பட்டுள்ளது</string>
<string name="upload_failed_notification_subtitle">காண்பதற்கு தட்டுக</string> <string name="upload_failed_notification_subtitle">காண்பதற்கு தட்டுக</string>
<string name="upload_paused_notification_subtitle">காண்பதற்கு தட்டுக</string> <string name="upload_paused_notification_subtitle">காண்பதற்கு தட்டுக</string>
<string name="title_activity_contributions">எனது தற்போதய பதிவேற்றங்கள்</string> <string name="title_activity_contributions">எனது தற்போதய பதிவேற்றங்கள்</string>
@ -75,12 +76,15 @@
<string name="contributions_subtitle_zero">(இதுவரை பதிவேற்றங்கள் இல்லை)</string> <string name="contributions_subtitle_zero">(இதுவரை பதிவேற்றங்கள் இல்லை)</string>
<string name="categories_not_found">%1$s பொருந்தக்கூடிய வகைகள் எதுவும் காணப்படவில்லை</string> <string name="categories_not_found">%1$s பொருந்தக்கூடிய வகைகள் எதுவும் காணப்படவில்லை</string>
<string name="depictions_not_found">%1$s பொருந்தக்கூடிய விக்கிடேட்டா உருப்படிகள் எதுவும் கிடைக்கவில்லை</string> <string name="depictions_not_found">%1$s பொருந்தக்கூடிய விக்கிடேட்டா உருப்படிகள் எதுவும் கிடைக்கவில்லை</string>
<string name="categories_skip_explanation">விக்கிமீடியா காமன்ஸில் உங்களின் படங்களை மேலும் கண்டறியும் வகையில் வகைகளைச் சேர்க்கவும்.\nவகைகளைச் (categories) சேர்க்க தட்டச்சு செய்யத் தொடங்குங்கள்.</string>
<string name="categories_activity_title">பகுப்புகள்</string> <string name="categories_activity_title">பகுப்புகள்</string>
<string name="title_activity_settings">அமைப்புகள்</string> <string name="title_activity_settings">அமைப்புகள்</string>
<string name="title_activity_signup">கணக்கை உருவாக்கு</string> <string name="title_activity_signup">கணக்கை உருவாக்கு</string>
<string name="title_activity_featured_images">சிறப்புப் படம்</string> <string name="title_activity_featured_images">சிறப்புப் படம்</string>
<string name="title_activity_category_details">பகுப்பு</string> <string name="title_activity_category_details">பகுப்பு</string>
<string name="title_activity_review">சக மதிப்பாய்வு</string>
<string name="menu_about">இதுபற்றி</string> <string name="menu_about">இதுபற்றி</string>
<string name="about_license">விக்கிமீடியா காமன்ஸ் செயலி என்பது விக்கிமீடியா சமூகத்தின் மானியதாரர்கள் மற்றும் தன்னார்வலர்களால் உருவாக்கப்பட்டு பராமரிக்கப்படும் ஒரு திறந்த மூல செயலியாகும். இந்தச் செயலியை உருவாக்குதல், மேம்படுத்துதல் அல்லது பராமரிப்பதில் விக்கிமீடியா அறக்கட்டளை ஈடுபடவில்லை.</string>
<string name="about_privacy_policy">தனியுரிமைக் கொள்கை</string> <string name="about_privacy_policy">தனியுரிமைக் கொள்கை</string>
<string name="about_credits">அங்கீகாரங்கள்</string> <string name="about_credits">அங்கீகாரங்கள்</string>
<string name="title_activity_about">இதுபற்றி</string> <string name="title_activity_about">இதுபற்றி</string>
@ -112,13 +116,76 @@
<string name="tutorial_4_text">எடுத்துக்காட்டு பதிவேற்றம்:</string> <string name="tutorial_4_text">எடுத்துக்காட்டு பதிவேற்றம்:</string>
<string name="tutorial_4_subtext_1">தலைப்பு: சிட்னி ஒப்பேரா மாளிகை</string> <string name="tutorial_4_subtext_1">தலைப்பு: சிட்னி ஒப்பேரா மாளிகை</string>
<string name="tutorial_4_subtext_2">விளக்கம்: விரிகுடாவின் குறுக்கே சிட்னி ஒப்பேரா மாளிகை பார்க்கப்படுகிறது</string> <string name="tutorial_4_subtext_2">விளக்கம்: விரிகுடாவின் குறுக்கே சிட்னி ஒப்பேரா மாளிகை பார்க்கப்படுகிறது</string>
<string name="welcome_copyright_text">உலகெங்கிலும் உள்ள மக்களுக்கு கல்வி கற்பதற்கு உங்கள் படங்கள் உதவுகின்றன.</string>
<string name="welcome_copyright_subtext">இணையத்தில் நீங்கள் கண்ட பதிப்புரிமை பெற்ற பொருட்கள் மற்றும் சுவரொட்டிகள், புத்தக அட்டைகள் போன்றவற்றின் படங்களைத் தவிர்க்கவும்.</string>
<string name="welcome_final_text">உங்களுக்கு கிடைத்தது என்று நினைக்கிறீர்களா?</string>
<string name="welcome_final_button_text">ஆம்!</string> <string name="welcome_final_button_text">ஆம்!</string>
<string name="welcome_help_button_text" fuzzy="true">&lt;u&gt;மேலதிக விவரம்&lt;/u&gt;</string> <string name="welcome_help_button_text">மேலதிக தகவல்கள்</string>
<string name="detail_panel_cats_label">பகுப்புகள்</string> <string name="detail_panel_cats_label">பகுப்புகள்</string>
<string name="detail_panel_cats_loading">ஏற்றப்படுகிறது...</string>
<string name="detail_panel_cats_none">தெரிவு செய்யப்படவில்லை</string>
<string name="detail_caption_empty">தலைப்பு இல்லை</string>
<string name="detail_description_empty">விளக்கம் இல்லை</string>
<string name="detail_discussion_empty">உரையாடல் இல்லை</string>
<string name="detail_license_empty">உரிமம் தெரியவில்லை</string>
<string name="menu_refresh">புதுப்பி</string>
<string name="storage_permission_title">சேமிப்பு அனுமதியைக் கோருகிறது</string>
<string name="read_storage_permission_rationale">தேவையான அனுமதி: வெளிப்புற சேமிப்பகத்தைப் படிக்கவும். இது இல்லாமல் உங்கள் காட்சியகத்தை செயலியால் அணுக முடியாது.</string>
<string name="write_storage_permission_rationale">தேவையான அனுமதி: வெளிப்புற சேமிப்பகத்தை எழுதுங்கள். இது இல்லாமல் உங்கள் நிழற்படக்கருவி / காட்சியகத்தை செயலியால் அணுக முடியாது.</string>
<string name="location_permission_title">இருப்பிட அனுமதியைக் கோருகிறது</string>
<string name="ok">சரி</string> <string name="ok">சரி</string>
<string name="warning">எச்சரிக்கை</string> <string name="warning">எச்சரிக்கை</string>
<string name="duplicate_image_found">நகல் படம் கண்டறியப்பட்டது</string>
<string name="upload">பதிவேற்று</string>
<string name="yes">ஆம்</string> <string name="yes">ஆம்</string>
<string name="no">இல்லை</string> <string name="no">இல்லை</string>
<string name="media_detail_caption">தலைப்பு</string>
<string name="media_detail_title">தலைப்பு</string> <string name="media_detail_title">தலைப்பு</string>
<string name="media_detail_depiction">சித்தரிப்புகள்</string>
<string name="media_detail_description">விளக்கம்</string>
<string name="media_detail_discussion">உரையாடல்</string>
<string name="media_detail_author">ஆசிரியர்</string>
<string name="media_detail_uploaded_date">பதிவேற்றிய தேதி</string>
<string name="media_detail_license">உரிமம்</string> <string name="media_detail_license">உரிமம்</string>
<string name="media_detail_coordinates">ஆயத்தொலைகள்</string>
<string name="media_detail_coordinates_empty">வழங்கப்படவில்லை</string>
<string name="logout_verification">தாங்கள் மெய்யாகவே மூடுவதற்கு விரும்புகிறீர்களா?</string>
<string name="commons_logo">பொதுவகம் இலச்சினை</string>
<string name="commons_website">காமென்ஸ் இணையதளம்</string>
<string name="commons_facebook">காமென்ஸ் முகநூல் பக்கம்</string>
<string name="commons_github">காமென்ஸ் கிட்கப் மூலம்</string>
<string name="mediaimage_failed">பட ஊடகம் தோல்வியடைந்தது</string>
<string name="no_subcategory_found">துணைப்பிரிவுகள் இல்லை</string>
<string name="no_parentcategory_found">முதன்மை வகைகள் இல்லை</string>
<string name="welcome_image_welcome_wikipedia">விக்கிப்பீடியாவிற்கு வருக</string>
<string name="cancel">ரத்து செய்</string>
<string name="navigation_drawer_open">திற</string>
<string name="navigation_drawer_close">மூடு</string>
<string name="navigation_item_home">முகப்பு</string>
<string name="navigation_item_upload">பதிவேற்று</string>
<string name="navigation_item_nearby">அருகிலுள்ள</string>
<string name="navigation_item_about">இதுபற்றி</string>
<string name="navigation_item_settings">அமைப்புகள்</string>
<string name="navigation_item_feedback">பின்னூட்டம்</string>
<string name="navigation_item_logout">விடுபதிகை</string>
<string name="navigation_item_info">பயிற்சி</string>
<string name="navigation_item_notification">அறிவிப்புகள்</string>
<string name="navigation_item_review">மதிப்பிடு</string>
<string name="no_description_found">எந்த விளக்கமும் கிடைக்கவில்லை</string>
<string name="nearby_info_menu_commons_article">பொதுவக கோப்புப் பக்கம்</string>
<string name="nearby_info_menu_wikidata_article">விக்கித்தரவு உருப்படி</string>
<string name="nearby_info_menu_wikipedia_article">விக்கிபீடியா கட்டுரை</string>
<string name="description_info">தயவுசெய்து முடிந்தவரை ஊடகங்களை விவரிக்கவும்: அது எங்கு எடுக்கப்பட்டது? அது என்ன காட்டுகிறது? சூழல் என்ன? பொருள்கள் அல்லது நபர்களை தயவுசெய்து விவரிக்கவும். எளிதில் யூகிக்க முடியாத தகவல்களை வெளிப்படுத்துங்கள், உதாரணமாக அது ஒரு நிலப்பரப்பாக இருந்தால் அதன் பகல் நேரம். ஊடகங்கள் அசாதாரணமான ஒன்றைக் காட்டினால், அது எதனால் அசாதாரணமானது என்பதை விளக்கவும்.</string>
<string name="caption_info">தயவுசெய்து படத்தின் சுருக்கமான விளக்கத்தை எழுதுங்கள். அதன் முதல் விளக்கம் படத்திற்கான தலைப்பாக பயன்படுத்தப்படும். 255 எழுத்துகளுக்குள் விவரிக்கவும்.</string>
<string name="upload_problem_exist">இந்த படத்தில் சாத்தியமான சிக்கல்கள்:</string>
<string name="upload_problem_image_dark">படம் மிகவும் கருமையாக உள்ளது.</string>
<string name="upload_problem_image_blurry">படம் மங்கலாக உள்ளது.</string>
<string name="upload_problem_image_duplicate">படம் ஏற்கனவே பொதுவகத்தில் உள்ளது.</string>
<string name="upload_problem_different_geolocation">இந்தப் படம் வேறு இடத்தில் எடுக்கப்பட்டது.</string>
<string name="upload_problem_fbmd">தயவுசெய்து நீங்களே எடுத்த படங்களை மட்டும் பதிவேற்றவும். மற்றவர்களின் பேஸ்புக் கணக்குகளிலிருந்து நீங்கள் கண்டறிந்த படங்களை பதிவேற்றாதீர்கள்.</string>
<string name="upload_problem_do_you_continue">நீங்கள் இன்னும் இந்தப் படத்தை பதிவேற்ற வேண்டுமா?</string>
<string name="upload_connection_error_alert_title">இணைப்பு பிழை</string>
<string name="upload_connection_error_alert_detail">பதிவேற்ற செயல்முறைக்கு இணைய அணுகல் தேவை. உங்கள் பிணைய இணைப்பைச் சரிபார்க்கவும்.</string>
<string name="upload_problem_image">படத்தில் காணப்படும் சிக்கல்கள்</string>
<string name="internet_downloaded">தயவுசெய்து நீங்களே எடுத்த படங்களை மட்டும் பதிவேற்றவும். இணையத்தில் நீங்கள் பதிவிறக்கம் செய்த படங்களை பதிவேற்றாதீர்கள்.</string>
</resources> </resources>

View file

@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Authors: <!-- Authors:
* BHARATHESHA ALASANDEMAJALU * BHARATHESHA ALASANDEMAJALU
* Chidananda Kampa
--> -->
<resources> <resources>
<string name="crash_dialog_text">ಉಸಬ್ಬಾ. ದಾದೋನಾ ತೊಂದರೆ ಅಂಡ್!</string> <string name="crash_dialog_text">ಉಸಬ್ಬಾ. ದಾದೋನಾ ತೊಂದರೆ ಅಂಡ್!</string>
<string name="crash_dialog_ok_toast">ಸೊಲ್ಮೆಲೋ</string> <string name="crash_dialog_comment_prompt">ಈರ್ ದಾದ ಮಲ್ತರುಂದು ನಮಕ್ ಪನ್ಲೆ, ಅವೆನ್ ಬುಕ್ಕ ಇಮೇಲ್‌ದ್ ಪಟ್ಟೊನ್ಲೆ. ಅವೆನ್ ಸರಿ ಮಲ್ಪರ ಸಹಾಯೋ ಅಪುಂಡು!</string>
<string name="crash_dialog_ok_toast">ಸೊಲ್ಮೆಲೋ!</string>
</resources> </resources>

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Authors: <!-- Authors:
* BHARATHESHA ALASANDEMAJALU * BHARATHESHA ALASANDEMAJALU
* Chidananda Kampa
* Kiranpoojary * Kiranpoojary
* Lokesha kunchadka * Lokesha kunchadka
* Ravi Mundkur * Ravi Mundkur
@ -39,7 +40,7 @@
<string name="bullet"></string> <string name="bullet"></string>
<string name="menu_settings">ಸಂಯೋಜನೆಲು</string> <string name="menu_settings">ಸಂಯೋಜನೆಲು</string>
<string name="intent_share_upload_label">ಕಾಮನ್ಸ್ ಗ್ ಸೆರಲೆ</string> <string name="intent_share_upload_label">ಕಾಮನ್ಸ್ ಗ್ ಸೆರಲೆ</string>
<string name="username">ಸದಸ್ಯೆರ್ನ ಪುದರ್</string> <string name="username">ಬಳಕೆದಾರೆರೆಪುದರ್</string>
<string name="password">ಪ್ರವೇಸೊ ಪದೊ</string> <string name="password">ಪ್ರವೇಸೊ ಪದೊ</string>
<string name="login_credential">ಕಾಮನ್ಸ್ ತ ಬೀಟಾತೊಟ್ಟು ಲಾಗಿನ್ ಅಲೆ</string> <string name="login_credential">ಕಾಮನ್ಸ್ ತ ಬೀಟಾತೊಟ್ಟು ಲಾಗಿನ್ ಅಲೆ</string>
<string name="login">ಲಾಗ್ ಇನ್</string> <string name="login">ಲಾಗ್ ಇನ್</string>
@ -69,7 +70,7 @@
<string name="menu_nearby">ಕೈತಲ್‍ದ</string> <string name="menu_nearby">ಕೈತಲ್‍ದ</string>
<string name="provider_contributions">ಎನ್ನ ದಿಂಜಯೀನಾ ವಿಚಾರೊಲು</string> <string name="provider_contributions">ಎನ್ನ ದಿಂಜಯೀನಾ ವಿಚಾರೊಲು</string>
<string name="menu_share">ಪಟ್ಟುಲೆ</string> <string name="menu_share">ಪಟ್ಟುಲೆ</string>
<string name="share_title_hint" fuzzy="true">ತರೆಬರವು (ಬೋಡಾಯಿನವು)</string> <string name="share_title_hint">ತರೆಬರವು (ಬೋಡೇ)</string>
<string name="share_description_hint">ವಿವರಣೆ</string> <string name="share_description_hint">ವಿವರಣೆ</string>
<string name="login_failed_network">ಲಾಗಿನ್ ಅತುಜಿ - ನೆಟ್ವರ್ಕ್ ತಿಕೊಂತಿಜ್ಜಿ</string> <string name="login_failed_network">ಲಾಗಿನ್ ಅತುಜಿ - ನೆಟ್ವರ್ಕ್ ತಿಕೊಂತಿಜ್ಜಿ</string>
<string name="login_failed_throttled">ಇರ್ ಮಸ್ತ್ ಪ್ರಯತ್ನ ಮಾಲ್ತರ್. ದಯ ದಿತ್ ಕೆಲ ನಿಮಿಷಟ್ಡತ್ ಬುಕ್ಕ ಪ್ರಯತ್ನ ಮಾಲ್ಪುಲೆ.</string> <string name="login_failed_throttled">ಇರ್ ಮಸ್ತ್ ಪ್ರಯತ್ನ ಮಾಲ್ತರ್. ದಯ ದಿತ್ ಕೆಲ ನಿಮಿಷಟ್ಡತ್ ಬುಕ್ಕ ಪ್ರಯತ್ನ ಮಾಲ್ಪುಲೆ.</string>
@ -84,7 +85,7 @@
<string name="menu_save_categories">ಒರಿಪಾಲೆ</string> <string name="menu_save_categories">ಒರಿಪಾಲೆ</string>
<string name="refresh_button">ರಿಫ್ರೆಶ್ ಮಲ್ಪುಲೆ</string> <string name="refresh_button">ರಿಫ್ರೆಶ್ ಮಲ್ಪುಲೆ</string>
<string name="display_list_button">ಪಟ್ಟಿ</string> <string name="display_list_button">ಪಟ್ಟಿ</string>
<string name="contributions_subtitle_zero" fuzzy="true">ಇಂದೆಟ್ ಒವೆ ಅಪ್ಲೋಡ್ ಇಜ್ಜಿ.</string> <string name="contributions_subtitle_zero">(ಇಂದೆಟ್ ಒವೆ ಅಪ್ಲೋಡ್ ಇಜ್ಜಿ)</string>
<string name="categories_not_found">No categories matching %1$s found</string> <string name="categories_not_found">No categories matching %1$s found</string>
<string name="categories_skip_explanation">ಇರೆನಾ ಪಟೊನ್ ವಿಕಿಮೀಡಿಯ ಕಾಮನ್ಸ್‌ಟ್ ಪತ್ತೆ ಮಾಲ್ಪುಯರ ವರ್ಗೊನ್ ಸೇರಾಲೆ.ವರ್ಗೊನ್ ಸೇರಾಯರ ಟೈಪ್ ಮಾಲ್ಪುಯರ ಪ್ರಾರಂಭ ಮಾಲ್ಪುಲೆ.</string> <string name="categories_skip_explanation">ಇರೆನಾ ಪಟೊನ್ ವಿಕಿಮೀಡಿಯ ಕಾಮನ್ಸ್‌ಟ್ ಪತ್ತೆ ಮಾಲ್ಪುಯರ ವರ್ಗೊನ್ ಸೇರಾಲೆ.ವರ್ಗೊನ್ ಸೇರಾಯರ ಟೈಪ್ ಮಾಲ್ಪುಯರ ಪ್ರಾರಂಭ ಮಾಲ್ಪುಲೆ.</string>
<string name="categories_activity_title">ವರ್ಗೊಲು</string> <string name="categories_activity_title">ವರ್ಗೊಲು</string>
@ -108,7 +109,7 @@
<string name="media_upload_policy">ಈ ಪಟೊನ್ ಕೊರಿಯರ ಅತ್ತಂದೆ, ಉಂದು ಎನ್ನ ಸ್ವಂತ ಬೆಲೆಗ್ ಯಾನ್ ಘೋಷಣೆ ಮಾಲ್ಪೆ, ಅವು ಹಕ್ಕುಸ್ವಾಮ್ಯತ ವಸ್ತು ಅತ್ತಂದೆ ಸ್ವಂತಲಾ ಅತ್ತ್&lt;a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\"&gt;Wikimedia Commons policies&lt;/a&gt;.</string> <string name="media_upload_policy">ಈ ಪಟೊನ್ ಕೊರಿಯರ ಅತ್ತಂದೆ, ಉಂದು ಎನ್ನ ಸ್ವಂತ ಬೆಲೆಗ್ ಯಾನ್ ಘೋಷಣೆ ಮಾಲ್ಪೆ, ಅವು ಹಕ್ಕುಸ್ವಾಮ್ಯತ ವಸ್ತು ಅತ್ತಂದೆ ಸ್ವಂತಲಾ ಅತ್ತ್&lt;a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\"&gt;Wikimedia Commons policies&lt;/a&gt;.</string>
<string name="menu_download">ಡೌನ್‍ಲೋಡ್</string> <string name="menu_download">ಡೌನ್‍ಲೋಡ್</string>
<string name="preference_license">ಪೂರ್ವನಿಯೋಜಿತ ಲೈಸನ್ಸ್‌.</string> <string name="preference_license">ಪೂರ್ವನಿಯೋಜಿತ ಲೈಸನ್ಸ್‌.</string>
<string name="use_previous" fuzzy="true">ಒಂದ್ಕಕ್ ಪುದರ್ ಬಕ್ಕ ವಿವರಣೆ ಕೊರ್ಲೆ.</string> <string name="use_previous">ದುಂಬುದ ಪುದರ್ ಬಕ್ಕ ವಿವರಣೆನ್ ಕೊರ್ಲೆ.</string>
<string name="preference_theme" fuzzy="true">ಕತ್ತಲೆದ ಕ್ರಮೊ</string> <string name="preference_theme" fuzzy="true">ಕತ್ತಲೆದ ಕ್ರಮೊ</string>
<string name="license_name_cc_by_sa_four">ಅಸ್ಟ್ರೀಬುಷನ್ - ಸೇರ್ ಎ ಲೈಕ್ 4.0.</string> <string name="license_name_cc_by_sa_four">ಅಸ್ಟ್ರೀಬುಷನ್ - ಸೇರ್ ಎ ಲೈಕ್ 4.0.</string>
<string name="license_name_cc_by_four"> Attribution 4.0</string> <string name="license_name_cc_by_four"> Attribution 4.0</string>
@ -139,7 +140,7 @@
<string name="welcome_copyright_subtext">ಇಂಟರ್ನೆಟ್ನ್‌ಡ್ತ್ ಇರ್ ತೊಜಾತ್ ಬರ್ಪಿನ ಕೃತಿಸ್ವಾಮ್ಯತ ವಸ್ತುಲೆನ್ ಅಂಚನೆ ಪೋಸ್ಟರ್ ಚಿತ್ರೊಲು, ಬೂಕುಲೆನ ವರ್ಗೊ ಇತ್ಯಾದಿ ತಪ್ಪಾತ್ ಇಪ್ಪು.</string> <string name="welcome_copyright_subtext">ಇಂಟರ್ನೆಟ್ನ್‌ಡ್ತ್ ಇರ್ ತೊಜಾತ್ ಬರ್ಪಿನ ಕೃತಿಸ್ವಾಮ್ಯತ ವಸ್ತುಲೆನ್ ಅಂಚನೆ ಪೋಸ್ಟರ್ ಚಿತ್ರೊಲು, ಬೂಕುಲೆನ ವರ್ಗೊ ಇತ್ಯಾದಿ ತಪ್ಪಾತ್ ಇಪ್ಪು.</string>
<string name="welcome_final_text">ಇರೆಗ್ ತಿಕ್ಕ್‌ಂಡ್ಂದು ಇರ್ ಭಾವಿಸುವರಾ?</string> <string name="welcome_final_text">ಇರೆಗ್ ತಿಕ್ಕ್‌ಂಡ್ಂದು ಇರ್ ಭಾವಿಸುವರಾ?</string>
<string name="welcome_final_button_text">ಅಂದ್!</string> <string name="welcome_final_button_text">ಅಂದ್!</string>
<string name="welcome_help_button_text" fuzzy="true">&lt;u&gt; ಹೆಚ್ಚಿನ ಮಾಹಿತಿಲು&lt;/u&gt;</string> <string name="welcome_help_button_text">ಹೆಚ್ಚಿನ ಮಾಹಿತಿಲು</string>
<string name="detail_panel_cats_label">ವರ್ಗೊಲು</string> <string name="detail_panel_cats_label">ವರ್ಗೊಲು</string>
<string name="detail_panel_cats_loading">ದಿಂಜಾವೊಂದುಂಡು……</string> <string name="detail_panel_cats_loading">ದಿಂಜಾವೊಂದುಂಡು……</string>
<string name="detail_panel_cats_none">ಒಂಜಿಲಾ ಅಯ್ಕೆ ಮಾಲ್ತಿಜ್ಜಿ.</string> <string name="detail_panel_cats_none">ಒಂಜಿಲಾ ಅಯ್ಕೆ ಮಾಲ್ತಿಜ್ಜಿ.</string>
@ -155,6 +156,7 @@
<string name="no">ಅತ್ತ್</string> <string name="no">ಅತ್ತ್</string>
<string name="media_detail_title">ತರೆಬರವು</string> <string name="media_detail_title">ತರೆಬರವು</string>
<string name="media_detail_description">ವಿವರಣೆ</string> <string name="media_detail_description">ವಿವರಣೆ</string>
<string name="media_detail_discussion">ಚರ್ಚೆ</string>
<string name="media_detail_author">ಬರೆತಿನಾರ್</string> <string name="media_detail_author">ಬರೆತಿನಾರ್</string>
<string name="media_detail_uploaded_date">ಅಪ್ಲೋಡ್ ಮಾಲ್ತಿನ ತಾರೀಕ್.</string> <string name="media_detail_uploaded_date">ಅಪ್ಲೋಡ್ ಮಾಲ್ತಿನ ತಾರೀಕ್.</string>
<string name="media_detail_license">ಪರವಾನಿಗೆ</string> <string name="media_detail_license">ಪರವಾನಿಗೆ</string>
@ -164,10 +166,10 @@
<string name="become_a_tester_description">Google Play ತಲ್ಪ ಇರ್ ಬೀಟಾ ಚಾನೆಲ್ ಆಯ್ಕೆ ಮಾಲ್ಪುಲೆ ಬುಕ್ಕ ಪೊಸ ವೈಶಿಷ್ಟ್ಯೊ ಅತ್ತಂದೆ ದೋಷ ಪರಿಹಾರಗ್ ದುಂಬು ಪ್ರವೇಶ ಪಡೆಲೆ.</string> <string name="become_a_tester_description">Google Play ತಲ್ಪ ಇರ್ ಬೀಟಾ ಚಾನೆಲ್ ಆಯ್ಕೆ ಮಾಲ್ಪುಲೆ ಬುಕ್ಕ ಪೊಸ ವೈಶಿಷ್ಟ್ಯೊ ಅತ್ತಂದೆ ದೋಷ ಪರಿಹಾರಗ್ ದುಂಬು ಪ್ರವೇಶ ಪಡೆಲೆ.</string>
<string name="_2fa_code">2FA Code</string> <string name="_2fa_code">2FA Code</string>
<string name="logout_verification">ಇರ್ ನಿಜವಾತ್ ಲಾಗ್ಔಟ್ ಮಾಲ್ಪಿಯರ ಬಯಸುವರಾ?</string> <string name="logout_verification">ಇರ್ ನಿಜವಾತ್ ಲಾಗ್ಔಟ್ ಮಾಲ್ಪಿಯರ ಬಯಸುವರಾ?</string>
<string name="commons_logo">\nಕಾಮನ್ಸ್ ಲೋಗೋ.</string> <string name="commons_logo">ಕಾಮನ್ಸ್ ಲೋಗೋ</string>
<string name="commons_website">\nಕಾಮನ್ಸ್ ವೆಬ್ಸೈಟ್.</string> <string name="commons_website">ಕಾಮನ್ಸ್ ವೆಬ್ಸೈಟ್</string>
<string name="commons_facebook">\nಕಾಮನ್ಸ್ ಫೇಸ್ಬುಕ್ ಪುಟೊ.</string> <string name="commons_facebook">ಕಾಮನ್ಸ್ ಫೇಸ್ಬುಕ್ ಪುಟೊ</string>
<string name="commons_github">\nಕಾಮನ್ಸ್ ಗಿಥಬ್ ಮೂಲ ಕೋಡ್.</string> <string name="commons_github">ಕಾಮನ್ಸ್ ಗಿಥಬ್ ಮೂಲ ಕೋಡ್</string>
<string name="mediaimage_failed">ಮೀಡಿಯಾ ಪಟೊ ಅಪ್ಲೋಡ್ ಅತ್‌ಜ್ಜಿ.</string> <string name="mediaimage_failed">ಮೀಡಿಯಾ ಪಟೊ ಅಪ್ಲೋಡ್ ಅತ್‌ಜ್ಜಿ.</string>
<string name="no_subcategory_found">ಒವೆ ಉಪವರ್ಗೊಲು ಇಜ್ಜಿ.</string> <string name="no_subcategory_found">ಒವೆ ಉಪವರ್ಗೊಲು ಇಜ್ಜಿ.</string>
<string name="no_parentcategory_found">ಇತ್ತೆ ಒವೆ ವರ್ಗೊಲು ಇಜ್ಜಿ.</string> <string name="no_parentcategory_found">ಇತ್ತೆ ಒವೆ ವರ್ಗೊಲು ಇಜ್ಜಿ.</string>
@ -175,25 +177,25 @@
<string name="welcome_image_llamas">\nಲಾಮಾಸ್.</string> <string name="welcome_image_llamas">\nಲಾಮಾಸ್.</string>
<string name="welcome_image_rainbow_bridge">\nರೇನ್ಬೋ ಬ್ರಿಡ್ಜ್.</string> <string name="welcome_image_rainbow_bridge">\nರೇನ್ಬೋ ಬ್ರಿಡ್ಜ್.</string>
<string name="welcome_image_tulip">ಟುಲಿಪ್.</string> <string name="welcome_image_tulip">ಟುಲಿಪ್.</string>
<string name="welcome_image_welcome_wikipedia">ವಿಕಿಪೀಡಿಯಗ್ ಸ್ವಾಗತೊ.</string> <string name="welcome_image_welcome_wikipedia">ವಿಕಿಪೀಡಿಯಗ್ ಸ್ವಾಗತೊ</string>
<string name="welcome_image_welcome_copyright">ಕೃತಿಸ್ವಾಮ್ಯಗ್ ಸ್ವಾಗತೊ.</string> <string name="welcome_image_welcome_copyright">ಕೃತಿಸ್ವಾಮ್ಯಗ್ ಸ್ವಾಗತೊ</string>
<string name="welcome_image_sydney_opera_house">\nಸಿಡ್ನಿ ಒಪೇರಾ ಹೌಸ್.</string> <string name="welcome_image_sydney_opera_house">ಸಿಡ್ನಿ ಒಪೇರಾ ಹೌಸ್</string>
<string name="cancel">ವಜಾ ಮಲ್ಪುಲೆ</string> <string name="cancel">ವಜಾ ಮಲ್ಪುಲೆ</string>
<string name="navigation_drawer_open">ತೋಜಾಲೇ</string> <string name="navigation_drawer_open">ತೋಜಾಲೇ</string>
<string name="navigation_drawer_close">ಮುಚ್ಚಿಲೆ</string> <string name="navigation_drawer_close">ಮುಚ್ಚಿಲೆ</string>
<string name="navigation_item_home">ಮುಖ್ಯಪುಟೊ</string> <string name="navigation_item_home">ಇಲ್ಲಗ್</string>
<string name="navigation_item_upload">ದಿಂಜಾಲೆ</string> <string name="navigation_item_upload">ದಿಂಜಾಲೆ</string>
<string name="navigation_item_nearby">ಕೈತಲ್‍ದ</string> <string name="navigation_item_nearby">ಕೈತಲ್‍ದ</string>
<string name="navigation_item_about">ಎಂಕ್ಲೆನ ಬಗ್ಗೆ</string> <string name="navigation_item_about">ಎಂಕ್ಲೆನ ಬಗ್ಗೆ</string>
<string name="navigation_item_settings">ಸಂಯೋಜನೆಲು</string> <string name="navigation_item_settings">ಸಂಯೋಜನೆಲು</string>
<string name="navigation_item_feedback">ಅಬಿಪ್ರಾಯೊ</string> <string name="navigation_item_feedback">ಅಬಿಪ್ರಾಯೊ</string>
<string name="navigation_item_logout">ನಿರ್ಗಮಿಸಾಲೆ</string> <string name="navigation_item_logout">ನಿರ್ಗಮಿಸಾಲೆ</string>
<string name="navigation_item_info">\nಟ್ಯುಟೋರಿಯಲ್.</string> <string name="navigation_item_info">\nಟ್ಯುಟೋರಿಯಲ್</string>
<string name="navigation_item_notification">ಸೂಚನೆಲು.</string> <string name="navigation_item_notification">ಸೂಚನೆಲು</string>
<string name="no_description_found">ಒವೆ ವಿವರಣೆ ಇಜ್ಜಿ.</string> <string name="no_description_found">ಒವೆ ವಿವರಣೆ ಇಜ್ಜಿ.</string>
<string name="nearby_info_menu_commons_article">ಕಾಮನ್ಸ್ ಫೈಲ್ ಪುಟೊ.</string> <string name="nearby_info_menu_commons_article">ಕಾಮನ್ಸ್ ಫೈಲ್ ಪುಟೊ</string>
<string name="nearby_info_menu_wikidata_article">\nವಿಕಿಡಾಟ ಐಟಂ.</string> <string name="nearby_info_menu_wikidata_article">ವಿಕಿಡಾಟ ಐಟಂ</string>
<string name="nearby_info_menu_wikipedia_article">\nವಿಕಿಪೀಡಿಯ ಲೇಖನೊ.</string> <string name="nearby_info_menu_wikipedia_article">ವಿಕಿಪೀಡಿಯ ಲೇಖನೊ</string>
<string name="description_info">ದಯಮಾಲ್ತ್ ಸಾಧ್ಯವಾಯಿನ ಮಾಧ್ಯಮಟ್ ವಿವರಣೆ ಕೊರ್ಲೆ: ಒಲ್ಪಾ ಅಯಿನ್ ದೆಪ್ಪೊಲಿ? ಉಂದೆನ್ ಎಂಚ ತೋಜಾವೊಲಿ? ಸನ್ನಿವೇಶ ಪಂಡದಾದ? ದಯಮಾಲ್ತ್ ವಸ್ತುಲು ಅತ್ತಂದೆ ವ್ಯಕ್ತಿಲು ಸುಲಭವಾತ್ ಊಹಿಸಲು ಸಾದ್ಯ ಇಜ್ಜಿ ಮಾಹಿತಿನ್ ಬಹಿರಂಗ ಮಾಲ್ಪುಲೆ, ಉದಾಹರಣೆಗ್ ಉಂದು ಭೂದೃಶ್ಯವಾತ್ ಇತ್ತಂಡ್ ದಿನೊತ ಸಮಯ. ಮಾಧ್ಯಮೊ ಅಸಾಮಾನ್ಯವಾತ್ ಇಪ್ಪುನಯಿನ್ ತೋಜಾತ್, ಅವು ಅಸಾಮಾನ್ಯವಾತ್ ವಿವರಣೆ ಇಪ್ಪು.</string> <string name="description_info">ದಯಮಾಲ್ತ್ ಸಾಧ್ಯವಾಯಿನ ಮಾಧ್ಯಮಟ್ ವಿವರಣೆ ಕೊರ್ಲೆ: ಒಲ್ಪಾ ಅಯಿನ್ ದೆಪ್ಪೊಲಿ? ಉಂದೆನ್ ಎಂಚ ತೋಜಾವೊಲಿ? ಸನ್ನಿವೇಶ ಪಂಡದಾದ? ದಯಮಾಲ್ತ್ ವಸ್ತುಲು ಅತ್ತಂದೆ ವ್ಯಕ್ತಿಲು ಸುಲಭವಾತ್ ಊಹಿಸಲು ಸಾದ್ಯ ಇಜ್ಜಿ ಮಾಹಿತಿನ್ ಬಹಿರಂಗ ಮಾಲ್ಪುಲೆ, ಉದಾಹರಣೆಗ್ ಉಂದು ಭೂದೃಶ್ಯವಾತ್ ಇತ್ತಂಡ್ ದಿನೊತ ಸಮಯ. ಮಾಧ್ಯಮೊ ಅಸಾಮಾನ್ಯವಾತ್ ಇಪ್ಪುನಯಿನ್ ತೋಜಾತ್, ಅವು ಅಸಾಮಾನ್ಯವಾತ್ ವಿವರಣೆ ಇಪ್ಪು.</string>
<string name="upload_problem_exist">ಈ ಆಕೃತಿದ ಸಂಭಾವ್ಯ ಸಮಸ್ಯೆಲು:</string> <string name="upload_problem_exist">ಈ ಆಕೃತಿದ ಸಂಭಾವ್ಯ ಸಮಸ್ಯೆಲು:</string>
<string name="upload_problem_image_dark">ಆಕೃತಿ ಮಸ್ತ್ ಕಪ್ಪಾದುಂಡು.</string> <string name="upload_problem_image_dark">ಆಕೃತಿ ಮಸ್ತ್ ಕಪ್ಪಾದುಂಡು.</string>
@ -204,7 +206,7 @@
<string name="use_external_storage" fuzzy="true">ಉಂದು ಎಕ್ಸ್‌ಟರ್ನಲ್ ಸ್ಟೊರೆಜ್.</string> <string name="use_external_storage" fuzzy="true">ಉಂದು ಎಕ್ಸ್‌ಟರ್ನಲ್ ಸ್ಟೊರೆಜ್.</string>
<string name="use_external_storage_summary" fuzzy="true">ಈ ಸಾಧನಟ್ ಅಪ್ಲಿಕೇಶನ್ ಕ್ಯಾಮೆರಾದೊಂಟ್ಟಗ್ ದೆತ್ತಿನ ಚಿತ್ರೊನ್ ಒರಿಪಾಲೆ.</string> <string name="use_external_storage_summary" fuzzy="true">ಈ ಸಾಧನಟ್ ಅಪ್ಲಿಕೇಶನ್ ಕ್ಯಾಮೆರಾದೊಂಟ್ಟಗ್ ದೆತ್ತಿನ ಚಿತ್ರೊನ್ ಒರಿಪಾಲೆ.</string>
<string name="login_to_your_account">ಇರೇನಾ ಖಾತೆಗ್ ಲಾಗಿನ್ ಅಲೇ.</string> <string name="login_to_your_account">ಇರೇನಾ ಖಾತೆಗ್ ಲಾಗಿನ್ ಅಲೇ.</string>
<string name="send_log_file">ಲಾಗ್ ಫೈಲ್ ಕಡ್ಪುಡ್ಲೆ.</string> <string name="send_log_file">ಲಾಗ್ ಫೈಲ್ ಕಡ್ಪುಡ್ಲೆ</string>
<string name="send_log_file_description"> ಸದರಿ ಕರಣ(ಆಪ್\')ದ ಪೀಡನಿವಾರಣ ಸಮಸ್ಯೆಲೆಗಾದ್ ಗಮನ ಕಡತೊನು ಅಭಿವರ್ಧಕರೆಗ್ ಇಮೇಲ್ ಮೂಲಕ ಕಡಪುಡುಲೆ.ಸೂಚನೆ:ಗಮನೊಲೆಡ್ ಸಂಭಾವ್ಯ ಗುರ್ತಿಸಾವುನ ಮಾಹಿತಿ ಉಪ್ಪರೆ ಯಾವು.</string> <string name="send_log_file_description"> ಸದರಿ ಕರಣ(ಆಪ್\')ದ ಪೀಡನಿವಾರಣ ಸಮಸ್ಯೆಲೆಗಾದ್ ಗಮನ ಕಡತೊನು ಅಭಿವರ್ಧಕರೆಗ್ ಇಮೇಲ್ ಮೂಲಕ ಕಡಪುಡುಲೆ.ಸೂಚನೆ:ಗಮನೊಲೆಡ್ ಸಂಭಾವ್ಯ ಗುರ್ತಿಸಾವುನ ಮಾಹಿತಿ ಉಪ್ಪರೆ ಯಾವು.</string>
<string name="no_web_browser">URLನ್ ದೆಪ್ಪಿಯರ ಒವೆ ವೆಬ್ ಬ್ರೌಸರ್ ತೋಜಾತ್ ಬರ್ಪುಜ್ಜಿ.</string> <string name="no_web_browser">URLನ್ ದೆಪ್ಪಿಯರ ಒವೆ ವೆಬ್ ಬ್ರೌಸರ್ ತೋಜಾತ್ ಬರ್ಪುಜ್ಜಿ.</string>
<string name="null_url">\nದೋಷೊ! URL ತೋಜಾತ್ ಬರ್ಪುಜ್ಜಿ.</string> <string name="null_url">\nದೋಷೊ! URL ತೋಜಾತ್ ಬರ್ಪುಜ್ಜಿ.</string>
@ -212,26 +214,26 @@
<string name="nominated_for_deletion">ಮಾಜಾಯರ ಈ ಚಿತ್ರೊನ್ ನಾಮನಿರ್ದೇಶನೊ ಮಾಲ್ತೆರ್.</string> <string name="nominated_for_deletion">ಮಾಜಾಯರ ಈ ಚಿತ್ರೊನ್ ನಾಮನಿರ್ದೇಶನೊ ಮಾಲ್ತೆರ್.</string>
<string name="nominated_see_more" fuzzy="true">&lt;u&gt;ವಿವರಗಾತ್ ವೆಬ್ಪುಟೊನ್ ತೂಲೆ&lt;/u&gt;</string> <string name="nominated_see_more" fuzzy="true">&lt;u&gt;ವಿವರಗಾತ್ ವೆಬ್ಪುಟೊನ್ ತೂಲೆ&lt;/u&gt;</string>
<string name="skip_login">ಬುಡ್ಲೆ</string> <string name="skip_login">ಬುಡ್ಲೆ</string>
<string name="navigation_item_login">ಲಾಗಿನ್ ಆಲೆ.</string> <string name="navigation_item_login">ಲಾಗಿನ್ ಆಲೆ</string>
<string name="skip_login_title">\nಇರ್ ನಿಜವಾತ್ ಲಾಗಿನ್ ಬುಡಿಯರ ಬಯಸುವರಾ?</string> <string name="skip_login_title">ಇರ್ ನಿಜವಾತ್ ಲಾಗಿನ್ ಬುಡಿಯರ ಬಯಸುವರಾ?</string>
<string name="skip_login_message">ದುಂಬಗ್ ಚಿತ್ರೊಲೆನ್ ಮಿತೇರಾವರೆ ಈರ್ ಉಳಗಮನ ಮಲ್ಪೊಡಾವು.</string> <string name="skip_login_message">ದುಂಬಗ್ ಚಿತ್ರೊಲೆನ್ ಮಿತೇರಾವರೆ ಈರ್ ಉಳಗಮನ ಮಲ್ಪೊಡಾವು.</string>
<string name="login_alert_message">ದಯಮಾಲ್ತ್ ಲಾಗೀನ್ ಆಲೆ ಬುಕ್ಕ ಉಪಯೋಗ ಮಾಲ್ಪುಲೆ.</string> <string name="login_alert_message">ದಯಮಾಲ್ತ್ ಲಾಗೀನ್ ಆಲೆ ಬುಕ್ಕ ಉಪಯೋಗ ಮಾಲ್ಪುಲೆ.</string>
<string name="copy_wikicode">ವಿಕಿಪಠ್ಯೊನ್ ಪಿಡಿಪಲಾಯಿಗ್ ನಕಲ್ ಮಲ್ಪುಲೆ.</string> <string name="copy_wikicode">ವಿಕಿಪಠ್ಯೊನ್ ಪಿಡಿಪಲಾಯಿಗ್ ನಕಲ್ ಮಲ್ಪುಲೆ.</string>
<string name="wikicode_copied">ವಿಕಿಪಠ್ಯೊನ್ ಪಿಡಿಪಲಾಯಿಗ್ ನಕಲ್ ಮಲ್ತ್ಂಡ್.</string> <string name="wikicode_copied">ವಿಕಿಪಠ್ಯೊನ್ ಪಿಡಿಪಲಾಯಿಗ್ ನಕಲ್ ಮಲ್ತ್ಂಡ್.</string>
<string name="nearby_location_not_available" fuzzy="true">ಜಾಗೆತ ಗುರುತು ಇಜ್ಜಿ.</string> <string name="nearby_location_not_available" fuzzy="true">ಜಾಗೆತ ಗುರುತು ಇಜ್ಜಿ.</string>
<string name="location_permission_rationale_nearby">ಮುಟ್ಟತ ಜಾಗೆತ ಪಟ್ಟಿನ್ ತೋಜಾಯರ ಅನುಮತಿ ಅಗತ್ಯವಾತ್ ಬೋಡು.</string> <string name="location_permission_rationale_nearby">ಮುಟ್ಟತ ಜಾಗೆತ ಪಟ್ಟಿನ್ ತೋಜಾಯರ ಅನುಮತಿ ಅಗತ್ಯವಾತ್ ಬೋಡು.</string>
<string name="nearby_directions" fuzzy="true">ನಿರ್ದೆಶನೊ.</string> <string name="nearby_directions">ನಿರ್ದೆಶನೊ</string>
<string name="nearby_wikidata" fuzzy="true">\nವಿಕಿಡಾಟ.</string> <string name="nearby_wikidata">ವಿಕಿಡಾಟ</string>
<string name="nearby_wikipedia" fuzzy="true">\nವಿಕಿಪೀಡಿಯ.</string> <string name="nearby_wikipedia">ವಿಕಿಪೀಡಿಯ</string>
<string name="nearby_commons" fuzzy="true">ಕಾಮನ್ಸ್.</string> <string name="nearby_commons">ಕಾಮನ್ಸ್</string>
<string name="about_rate_us" fuzzy="true">&lt;u&gt;Rate us&lt;/u&gt;</string> <string name="about_rate_us" fuzzy="true">&lt;u&gt;Rate us&lt;/u&gt;</string>
<string name="about_faq" fuzzy="true">&lt;u&gt;FAQ&lt;/u&gt;</string> <string name="about_faq" fuzzy="true">&lt;u&gt;FAQ&lt;/u&gt;</string>
<string name="welcome_skip_button">ಟ್ಯುಟೋರಿಯಲ್‌ನ್ ಬುಡ್ಲೆ.</string> <string name="welcome_skip_button">ಟ್ಯುಟೋರಿಯಲ್‌ನ್ ಬುಡ್ಲೆ</string>
<string name="no_internet">ಇಂಟರ್ನೆಟ್ ಇಜ್ಜಿ.</string> <string name="no_internet">ಇಂಟರ್ನೆಟ್ ಇಜ್ಜಿ</string>
<string name="error_notifications">\nಅಧಿಸೂಚನೆಟ್ ದೋಷೊ ಉಂಡು.</string> <string name="error_notifications">ಅಧಿಸೂಚನೆಟ್ ದೋಷೊ ಉಂಡು</string>
<string name="no_notifications">ಅಧಿಸೂಚನೆ ಇಜ್ಜಿ.</string> <string name="no_notifications">ಅಧಿಸೂಚನೆ ಇಜ್ಜಿ.</string>
<string name="about_translate" fuzzy="true">&lt;u&gt;ಅನುವಾದೊ&lt;/u&gt;</string> <string name="about_translate">ಅನುವಾದೊ</string>
<string name="about_translate_title">ಾಸೆಲು</string> <string name="about_translate_title">ಾಸೆಲು</string>
<string name="about_translate_message">ಇರ್ ಅನುವಾದೊನ್ ಕೊರಿಯರ ಒಪ್ಪಗೆ ಉಂಡಾ, ಭಾಷೆನ್ ಆಯ್ಕೆ ಮಾಲ್ಲುಲೆ.</string> <string name="about_translate_message">ಇರ್ ಅನುವಾದೊನ್ ಕೊರಿಯರ ಒಪ್ಪಗೆ ಉಂಡಾ, ಭಾಷೆನ್ ಆಯ್ಕೆ ಮಾಲ್ಲುಲೆ.</string>
<string name="about_translate_proceed">ಮುಂದುವರಿಪುಲೆ.</string> <string name="about_translate_proceed">ಮುಂದುವರಿಪುಲೆ.</string>
<string name="about_translate_cancel">ವಜಾ ಮಲ್ಪುಲೆ</string> <string name="about_translate_cancel">ವಜಾ ಮಲ್ಪುಲೆ</string>
@ -251,9 +253,9 @@
<string name="error_loading_categories">ವರ್ಗೊಲೆನ್ ಏರಾನಗ ದೋಷ ಆಂಡ್.</string> <string name="error_loading_categories">ವರ್ಗೊಲೆನ್ ಏರಾನಗ ದೋಷ ಆಂಡ್.</string>
<string name="search_tab_title_media" fuzzy="true">ಮಾಧ್ಯಮ</string> <string name="search_tab_title_media" fuzzy="true">ಮಾಧ್ಯಮ</string>
<string name="search_tab_title_categories" fuzzy="true">ವರ್ಗೊಲು</string> <string name="search_tab_title_categories" fuzzy="true">ವರ್ಗೊಲು</string>
<string name="successful_wikidata_edit" fuzzy="true">ವಿಕಿಡೇಟೊಡು ಆಕೃತಿನ್ ಸಫಲವಾದ್ %1$ ಗು ಸೇರಾಂಡ್!</string> <string name="successful_wikidata_edit">ವಿಕಿಡೇಟೊಡು ಆಕೃತಿನ್ %1$ ಗು ಸೇರಾಂಡ್!</string>
<string name="wikidata_edit_failure">ಹೊಂದಿಕೆ ಆಪಿನ ವಿಕಿಡೇಟಾ ವಸ್ತುನು ಕಾಲನವಿ ಮಲ್ಪುನ ವಿಫಲವಾಂಡ್.</string> <string name="wikidata_edit_failure">ಹೊಂದಿಕೆ ಆಪಿನ ವಿಕಿಡೇಟಾ ವಸ್ತುನು ಕಾಲನವಿ ಮಲ್ಪುನ ವಿಫಲವಾಂಡ್!</string>
<string name="menu_set_wallpaper">ಗೋಡೆಕಾಕಜಿ ಆದ್ ಗೋಡಿಸಾಲೆ.</string> <string name="menu_set_wallpaper">ಗೋಡೆಕಾಕಜಿ ಆದ್ ಗೋಡಿಸಾಲೆ</string>
<string name="wallpaper_set_successfully">ಗೋಡೆಕಾಕಜಿ ಸಫಲವಾದ್ ಗೋಡಣೆಯಾಂಡ್!</string> <string name="wallpaper_set_successfully">ಗೋಡೆಕಾಕಜಿ ಸಫಲವಾದ್ ಗೋಡಣೆಯಾಂಡ್!</string>
<string name="quiz">ರಸಪ್ರಶ್ನೆ</string> <string name="quiz">ರಸಪ್ರಶ್ನೆ</string>
<string name="quiz_question_string">ಈ ಚಿತ್ರ ಮಿತೇರಾರೆ ಒಪ್ಪಿಗೆನಾ?</string> <string name="quiz_question_string">ಈ ಚಿತ್ರ ಮಿತೇರಾರೆ ಒಪ್ಪಿಗೆನಾ?</string>
@ -270,37 +272,38 @@
<string name="warning_for_no_answer">ಪ್ರಶ್ನೆಗ್ ಉತ್ತರ ಕೊರಿಯರೆ ರಡ್ಡ್ ಆಯ್ಲೆಲೆಡ್ ಒಂಜೆನ್ ಪೆಜಿಲೆ.</string> <string name="warning_for_no_answer">ಪ್ರಶ್ನೆಗ್ ಉತ್ತರ ಕೊರಿಯರೆ ರಡ್ಡ್ ಆಯ್ಲೆಲೆಡ್ ಒಂಜೆನ್ ಪೆಜಿಲೆ.</string>
<string name="user_not_logged_in">ಉಳಗಮನದ ಕಲಾಪ ಮುಗಿದಿಂಡ್, ದಯಮಲ್ತ್ ಕುಡಾ ಉಳಗಮನ ಮಲ್ಪುಲೆ.</string> <string name="user_not_logged_in">ಉಳಗಮನದ ಕಲಾಪ ಮುಗಿದಿಂಡ್, ದಯಮಲ್ತ್ ಕುಡಾ ಉಳಗಮನ ಮಲ್ಪುಲೆ.</string>
<string name="quiz_result_share_message">ಇರೆನ ರಸಪ್ರಶ್ನೆನ್ ಇರೆನ ದೋಸ್ತಿಲೆಗ್ ಪಟ್ಟುಲೆ.</string> <string name="quiz_result_share_message">ಇರೆನ ರಸಪ್ರಶ್ನೆನ್ ಇರೆನ ದೋಸ್ತಿಲೆಗ್ ಪಟ್ಟುಲೆ.</string>
<string name="continue_message">ಮುಂದುವರೆಸಾಲೆ.</string> <string name="continue_message">ಮುಂದುವರೆಸಾಲೆ</string>
<string name="correct">ಸರಿಯಾಯಿನುತ್ತರೊ.</string> <string name="correct">ಸರಿಯಾಯಿನುತ್ತರೊ</string>
<string name="wrong">ತಪ್ಪು ಉತ್ತರೊ.</string> <string name="wrong">ತಪ್ಪು ಉತ್ತರೊ</string>
<string name="quiz_screenshot_question">ಈ ಪರದೆಚಿತ್ರನ್ ಮಿತೇರಾವರೆ ಒಪ್ಪಿಗೆ ಉಂಡಾ?</string> <string name="quiz_screenshot_question">ಈ ಪರದೆಚಿತ್ರನ್ ಮಿತೇರಾವರೆ ಒಪ್ಪಿಗೆ ಉಂಡಾ?</string>
<string name="share_app_title">ಶೇರ್ ಅಪ್ಯ್.</string> <string name="share_app_title">ಶೇರ್ ಅಪ್ಯ್</string>
<string name="error_fetching_nearby_places">ಕೈತಲ್ದ ಜಾಗೊಲೆನ್ ಕಣನಗ ದೋಷವಾಂಡ್.</string> <string name="error_fetching_nearby_places">ಕೈತಲ್ದ ಜಾಗೊಲೆನ್ ಕಣನಗ ದೋಷವಾಂಡ್.</string>
<string name="no_recent_searches">ಇಂಚೊಗು ನಾಡಿನವು ದಾಲಾ ಇಜ್ಜಿ</string> <string name="no_recent_searches">ಇಂಚೊಗು ನಾಡಿನವು ದಾಲಾ ಇಜ್ಜಿ</string>
<string name="delete_recent_searches_dialog">ಇರ್ ನಾಡ್ನಾ ಇತಿಹಾಸೋನ್ ಮಾಜಾಯಾರಾ ಉಪ್ಪುವರತಾ?</string> <string name="delete_recent_searches_dialog">ಇರ್ ನಾಡ್ನಾ ಇತಿಹಾಸೋನ್ ಮಾಜಾಯಾರಾ ಉಪ್ಪುವರತಾ?</string>
<string name="search_history_deleted">ನನಾಡುನ ಇತಿಹಾಸೊ ಮಾಜಾತೆರ್.</string> <string name="search_history_deleted">ನನಾಡುನ ಇತಿಹಾಸೊ ಮಾಜಾತೆರ್.</string>
<string name="nominate_delete">ಮಾಜಾವರೆ ನಾಮೀಕರಣ ಮಲ್ಪುಲೆ.</string> <string name="nominate_delete">ಮಾಜಾವರೆ ನಾಮೀಕರಣ ಮಲ್ಪುಲೆ.</string>
<string name="Achievements">ಸಾಧನೆಲು.</string> <string name="delete">ಮಾಜಾಲೆ</string>
<string name="statistics" fuzzy="true">ಅಂಕಿಸಂಖ್ಯೆ.</string> <string name="Achievements">ಸಾಧನೆಲು</string>
<string name="statistics">ಅಂಕಿ ಅಂಸೊಲು</string>
<string name="statistics_thanks">ಸೊಲ್ಮೆಲು ಪಂಡೆರ್</string> <string name="statistics_thanks">ಸೊಲ್ಮೆಲು ಪಂಡೆರ್</string>
<string name="statistics_featured">ವಿಸೆಸೊ ಪಟ.</string> <string name="statistics_featured">ವಿಸೆಸೊ ಪಟ</string>
<string name="statistics_wikidata_edits">ಆಕೃತಿಲೆನ ಮೂಲಕ \"ಕೈತಲ್ದ ಜಾಗೊಲು\"</string> <string name="statistics_wikidata_edits">ಆಕೃತಿಲೆನ ಮೂಲಕ \"ಕೈತಲ್ದ ಜಾಗೊಲು\"</string>
<string name="level" fuzzy="true">LEVEL</string> <string name="level" fuzzy="true">LEVEL</string>
<string name="images_uploaded">ಪಟೊ ಅಪ್ಲೋಡೆಡ್.</string> <string name="images_uploaded">ಪಟೊ ಅಪ್ಲೋಡೆಡ್</string>
<string name="image_reverts">ಪಟೊನ್ ಪುನಃ ಪಾಡಿಯರ ಅಪುಜ್ಜಿ.</string> <string name="image_reverts">ಪಟೊನ್ ಪುನಃ ಪಾಡಿಯರ ಅಪುಜ್ಜಿ</string>
<string name="images_used_by_wiki">ಪಟೊನ್ ಬಲಕೆ ಮಾತ್ರೆರ್.</string> <string name="images_used_by_wiki">ಪಟೊನ್ ಬಲಕೆ ಮಲ್ತೆರ್</string>
<string name="achievements_share_message">ಇರೆನ ಸಾಧನೆಲೆನ್ ಇರೆನ ದೋಸ್ತಿಲೆಗ್ ಪಟ್ಟುಲೆ.</string> <string name="achievements_share_message">ಇರೆನ ಸಾಧನೆಲೆನ್ ಇರೆನ ದೋಸ್ತಿಲೆಗ್ ಪಟ್ಟುಲೆ!</string>
<string name="achievements_info_message">ಈ ಅಗತ್ಯಲೆನ್ ಈರ್ ಪೂರೈಸಿಯರ್ಡ ಇರೆನ ಮಟ್ಟ ಹೆಚ್ಚುಂಡು. ಅಂಕಿಅಂಶೊಲು ವಿಭಾಗದ ವಿಷಯಾಂಸೊಲು ಇರೆನ ಮಟ್ಟದ ಗಣನೆಗ್ ಬರ್ಪುಜಾ.</string> <string name="achievements_info_message">ಈ ಅಗತ್ಯಲೆನ್ ಈರ್ ಪೂರೈಸಿಯರ್ಡ ಇರೆನ ಮಟ್ಟ ಹೆಚ್ಚುಂಡು. ಅಂಕಿಅಂಶೊಲು ವಿಭಾಗದ ವಿಷಯಾಂಸೊಲು ಇರೆನ ಮಟ್ಟದ ಗಣನೆಗ್ ಬರ್ಪುಜಾ.</string>
<string name="achievements_revert_limit_message">ಕನಿಷ್ಟ ಬೋಡಾಯಿನವು:</string> <string name="achievements_revert_limit_message">ಕನಿಷ್ಟ ಬೋಡಾಯಿನವು:</string>
<string name="images_uploaded_explanation">ಒವ್ವೆ ತಂತ್ರಾಂಶೊದ ಮೂಲಕ ಈರ್ ಕಾಮನ್ಸ್\'ಗು ಮಿತೇರಾಯಿನ ಆಕೃತಿಲೆನ ಸಂಖ್ಯೆ.</string> <string name="images_uploaded_explanation">ಒವ್ವೆ ತಂತ್ರಾಂಶೊದ ಮೂಲಕ ಈರ್ ಕಾಮನ್ಸ್\'ಗು ಮಿತೇರಾಯಿನ ಆಕೃತಿಲೆನ ಸಂಖ್ಯೆ</string>
<string name="images_reverted_explanation">ಈರ್ ಕಾಮನ್ಸ್\'ಗು ಮಿತೇರಾಯಿನ ಆಕೃತಿಲೆಡ್ ಮಾಜಾವಂದಿನ ಶೇಕಡ.</string> <string name="images_reverted_explanation">ಈರ್ ಕಾಮನ್ಸ್\'ಗು ಮಿತೇರಾಯಿನ ಆಕೃತಿಲೆಡ್ ಮಾಜಾವಂದಿನ ಶೇಕಡ.</string>
<string name="images_used_explanation">ಈರ್ ಕಾಮನ್ಸ್\'ಗು ಮಿತೇರಾಯಿನ ಆಕೃತಿಲೆಡ್ ವಿಕಿಮೀಡಿಯಾ ಲೇಖನೊಲೆಡ್ ಬಳಕೆಯಾಯಿನ ಸಂಖ್ಯೆ.</string> <string name="images_used_explanation">ಈರ್ ಕಾಮನ್ಸ್\'ಗು ಮಿತೇರಾಯಿನ ಆಕೃತಿಲೆಡ್ ವಿಕಿಮೀಡಿಯಾ ಲೇಖನೊಲೆಡ್ ಬಳಕೆಯಾಯಿನ ಸಂಖ್ಯೆ.</string>
<string name="error_occurred">ದೋಸೊ ಆತ್ಂಡ್!</string> <string name="error_occurred">ದೋಸೊ ಆತ್ಂಡ್!</string>
<string name="notifications_channel_name_all">ಕಾಮನ್ಸ್\' ಅಧಿಸೂಚನೆ</string> <string name="notifications_channel_name_all">ಕಾಮನ್ಸ್ ಅಧಿಸೂಚನೆ</string>
<string name="preference_author_name_toggle">ನಿಷ್ಟ ಲೇಖಕ ಪುದರ್ ಬಳಸುಲೆ.</string> <string name="preference_author_name_toggle">ನಿಷ್ಟ ಲೇಖಕ ಪುದರ್ ಬಳಸುಲೆ.</string>
<string name="preference_author_name_toggle_summary">ಚಿತ್ರೊಲೆನ್ ಮಿತೇರಾನಗ ಇರೆನ ಬಳಕೆಪುದರುದ ಬದಲ್ ಒಂಜಿ ನಿಷ್ಟ ಲೇಖಕ ಪುದರ್ ಬಳಸುಲೆ.</string> <string name="preference_author_name_toggle_summary">ಚಿತ್ರೊಲೆನ್ ಮಿತೇರಾನಗ ಇರೆನ ಬಳಕೆಪುದರುದ ಬದಲ್ ಒಂಜಿ ನಿಷ್ಟ ಲೇಖಕ ಪುದರ್ ಬಳಸುಲೆ.</string>
<string name="preference_author_name">ನಿಷ್ಟ ಲೇಖಕ ಪುದರ್</string> <string name="preference_author_name">ನಿಷ್ಟ ಲೇಖಕ ಪುದರ್</string>
<string name="contributions_fragment">ಕಾಿಕೆಲು</string> <string name="contributions_fragment">ಕಾಿಕೆಲು</string>
<string name="nearby_fragment">ಕೈತಲ್‍ದ</string> <string name="nearby_fragment">ಕೈತಲ್‍ದ</string>
<string name="notifications">ಅಧಿಸೂಚನೆಲು</string> <string name="notifications">ಅಧಿಸೂಚನೆಲು</string>
<string name="read_notifications" fuzzy="true">ಅಧಿಸೂಚನೆಲು(ಅನುರಕ್ಷಿತ)</string> <string name="read_notifications" fuzzy="true">ಅಧಿಸೂಚನೆಲು(ಅನುರಕ್ಷಿತ)</string>
@ -323,12 +326,19 @@
<string name="bookmark_empty">ಈರ್ ಒವ್ವೆ ಪುಸ್ತಕಗುರ್ತುಲೆನ್ ಸೇರಾದಿಜರ್.</string> <string name="bookmark_empty">ಈರ್ ಒವ್ವೆ ಪುಸ್ತಕಗುರ್ತುಲೆನ್ ಸೇರಾದಿಜರ್.</string>
<string name="provider_bookmarks_location">ಪುಸ್ತಕಗುರ್ತುಲು</string> <string name="provider_bookmarks_location">ಪುಸ್ತಕಗುರ್ತುಲು</string>
<string name="log_collection_started">ಗಮನಿ (ಲಾಗ್) ಸಂಗ್ರಹ ಸುರುವಾತ್ಂಡ್. ದಯಮಲ್ತ್ ಕರನ ಪಿರಸುರುಮಲ್ತ್, ಈರ್ ಗಮನಿಡ್ ಸೇರಾವರೆ ಬಯಕುನ ಕ್ರಿಯೆ ಮಲ್ತ್, ಬೊಕ ಕುಡ \"ಗಮನ ಕಡತ ಕಡಪುಡುಲೆ\" ತಟ್ಟ್\'ಲೆ.</string> <string name="log_collection_started">ಗಮನಿ (ಲಾಗ್) ಸಂಗ್ರಹ ಸುರುವಾತ್ಂಡ್. ದಯಮಲ್ತ್ ಕರನ ಪಿರಸುರುಮಲ್ತ್, ಈರ್ ಗಮನಿಡ್ ಸೇರಾವರೆ ಬಯಕುನ ಕ್ರಿಯೆ ಮಲ್ತ್, ಬೊಕ ಕುಡ \"ಗಮನ ಕಡತ ಕಡಪುಡುಲೆ\" ತಟ್ಟ್\'ಲೆ.</string>
<string name="deletion_reason_uploaded_by_mistake">ಯಾನ್ ಅವೆನ್ ತತ್ತ್\'ದ್ ಮಿತೇರಾಯೆ.</string> <string name="deletion_reason_uploaded_by_mistake">ಯಾನ್ ಅವೆನ್ ತತ್ತ್ದ್ ಮಿತೇರಾಯೆ.</string>
<string name="deletion_reason_publicly_visible">ಅವು ಸಾರ್ವತ್ರಿಕವಾದ್ ತೋಜುಂಡು ಇಂದ್ ಎಂಕ್ ಗೊತ್ತಿತ್ತಿಜಿ.</string> <string name="deletion_reason_publicly_visible">ಅವು ಸಾರ್ವತ್ರಿಕವಾದ್ ತೋಜುಂಡು ಇಂದ್ ಎಂಕ್ ಗೊತ್ತಿತ್ತಿಜಿ</string>
<string name="deletion_reason_bad_for_my_privacy">ಅವು ಎನ್ನ ಖಾಸಗಿತೆನೊಕು ಹಾಳ್ಂದ್ ಎಂಕ್ ತೆರಿಂಡ್.</string> <string name="deletion_reason_bad_for_my_privacy">ಅವು ಎನ್ನ ಖಾಸಗಿತೆನೊಕು ಹಾಳ್ಂದ್ ಎಂಕ್ ತೆರಿಂಡ್</string>
<string name="no_read_notification" fuzzy="true">ಇರೆಗ್ ಅನುರಕ್ಷಿತ ಅಧಿಸೂಚನೆ ಇಜ್ಜಿ</string> <string name="no_read_notification" fuzzy="true">ಇರೆಗ್ ಅನುರಕ್ಷಿತ ಅಧಿಸೂಚನೆ ಇಜ್ಜಿ</string>
<string name="menu_option_read" fuzzy="true">ಅನುರಕ್ಷಿತ ತೂಲೆ</string> <string name="menu_option_read" fuzzy="true">ಅನುರಕ್ಷಿತ ತೂಲೆ</string>
<string name="menu_option_unread">ಓದಂದಿನ ತೂಲೆ</string> <string name="menu_option_unread">ಓದಂದಿನ ತೂಲೆ</string>
<string name="error_occurred_in_picking_images">ಆಕೃತಿಲೆನ್ ಪೆಜ್ಜಿನಗ ದೋಷ ಆಂಡ್</string> <string name="error_occurred_in_picking_images">ಆಕೃತಿಲೆನ್ ಪೆಜ್ಜಿನಗ ದೋಷ ಆಂಡ್</string>
<string name="please_wait">ದಯಮಲ್ತ್ ಕಾಪುಲೆ</string> <string name="please_wait">ದಯಮಲ್ತ್ ಕಾಪುಲೆ...</string>
<string name="title_app_shortcut_setting">ಸಂಯೋಜನೆಲು</string>
<string name="instructions_title">ಸೂಚನೆಲು</string>
<string name="more">ನನಾತ್</string>
<string name="leaderboard_column_user">ಬಳಕೆದಾರೆರ್</string>
<string name="leaderboard_nearby">ಕೈತಲ್‍ದ</string>
<string name="read_help_link">ನನಾತ್ ಓದುಲೇ</string>
<string name="media_detail_in_all_languages">ಮಾಂತಾ ಬಾಸೆಲೆಡ್</string>
</resources> </resources>

View file

@ -20,11 +20,11 @@
<string name="upload_failed">ⴰⴼⴰⵢⵍⵓ ⵓⵔ ⵉⵜⵜⵢⵓⴼⴰ. ⴰⵎⵓⵔ ⵏⵏⴽ ⴰⵔⵎ ⴰⴼⴰⵢⵍⵓ ⵢⴰⴹⵏ.</string> <string name="upload_failed">ⴰⴼⴰⵢⵍⵓ ⵓⵔ ⵉⵜⵜⵢⵓⴼⴰ. ⴰⵎⵓⵔ ⵏⵏⴽ ⴰⵔⵎ ⴰⴼⴰⵢⵍⵓ ⵢⴰⴹⵏ.</string>
<string name="uploading_started">ⴰⵙⴽⵜⵔ ⵉⵙⵙⵏⵜⵉ!</string> <string name="uploading_started">ⴰⵙⴽⵜⵔ ⵉⵙⵙⵏⵜⵉ!</string>
<string name="upload_completed_notification_title">ⵉⵜⵜⵓⵙⴽⵜⵔ%1$s!</string> <string name="upload_completed_notification_title">ⵉⵜⵜⵓⵙⴽⵜⵔ%1$s!</string>
<string name="upload_completed_notification_text">ⴽⵍ ⴰⴼⴰⴷ ⴰⴷ ⵜⵥⵔⴷ ⴰⵙⴽⵜⵔ ⵏⵏⴽ</string> <string name="upload_completed_notification_text">ⴷⵔ ⵃⵎⴰ ⴰⴷ ⵜⵙⴽⵏⴷ ⴰⵙⴽⵜⵔ ⵏⵏⴽ</string>
<string name="upload_progress_notification_title_start" fuzzy="true">ⵉⵙⵙⵏⵜⵉ ⵓⵙⵙⴽⵜⵔ %1$s</string> <string name="upload_progress_notification_title_start" fuzzy="true">ⵉⵙⵙⵏⵜⵉ ⵓⵙⵙⴽⵜⵔ %1$s</string>
<string name="upload_progress_notification_title_in_progress">ⴷⴰ ⵉⵜⵜⵓⵙⴽⵜⴰⵔ %1$s</string> <string name="upload_progress_notification_title_in_progress">ⴰⵙⴽⵜⵓⵔ %1$s</string>
<string name="upload_failed_notification_title">ⴰⵙⵙⴽⵜⵔ %1$s ⵉⵣⴳⵍ</string> <string name="upload_failed_notification_title">ⴰⵙⵙⴽⵜⵔ %1$s ⵉⵣⴳⵍ</string>
<string name="upload_failed_notification_subtitle">ⴰⴽⵍ ⴰⴼⴰⴷ ⴰⴷ ⵜⵥⵔ</string> <string name="upload_failed_notification_subtitle">ⴰⴽⵍ ⴰⴼⴰⴷ ⴰⴷ ⵜⵙⴽⵏ</string>
<string name="title_activity_contributions">ⵉⵙⴽⵜⴰⵔⵏ ⵉⵏⵓ ⵉⵎⴳⴳⵓⵔⴰ</string> <string name="title_activity_contributions">ⵉⵙⴽⵜⴰⵔⵏ ⵉⵏⵓ ⵉⵎⴳⴳⵓⵔⴰ</string>
<string name="contribution_state_in_progress">ⵉⵙⵎⴷ %1$d%%</string> <string name="contribution_state_in_progress">ⵉⵙⵎⴷ %1$d%%</string>
<string name="contribution_state_starting">ⴰⵙⵙⴽⵜⵔ</string> <string name="contribution_state_starting">ⴰⵙⵙⴽⵜⵔ</string>

View file

@ -408,6 +408,7 @@
<string name="no_depictions_selected">没有选择描写</string> <string name="no_depictions_selected">没有选择描写</string>
<string name="no_depictions_selected_warning_desc">带有描述的图像更容易被发现并且更可能被使用。您确定不选择描述继续吗?</string> <string name="no_depictions_selected_warning_desc">带有描述的图像更容易被发现并且更可能被使用。您确定不选择描述继续吗?</string>
<string name="back_button_warning">取消上传</string> <string name="back_button_warning">取消上传</string>
<string name="back_button_warning_desc">点击退后按钮,您将取消上传并丢失进度</string>
<string name="back_button_continue">继续上传</string> <string name="back_button_continue">继续上传</string>
<string name="upload_flow_all_images_in_set">(对于设置中的所有图像)</string> <string name="upload_flow_all_images_in_set">(对于设置中的所有图像)</string>
<string name="search_this_area">搜索这个区域</string> <string name="search_this_area">搜索这个区域</string>

View file

@ -324,6 +324,7 @@
<string name="share_app_title">Share App</string> <string name="share_app_title">Share App</string>
<string name="error_fetching_nearby_places">Error fetching nearby places.</string> <string name="error_fetching_nearby_places">Error fetching nearby places.</string>
<string name="error_fetching_nearby_monuments">Error fetching nearby monuments.</string>
<string name="no_recent_searches">No recent searches</string> <string name="no_recent_searches">No recent searches</string>
<string name="delete_recent_searches_dialog">Are you sure you want to clear your search history?</string> <string name="delete_recent_searches_dialog">Are you sure you want to clear your search history?</string>
<string name="delete_search_dialog">Do you want to delete this search?</string> <string name="delete_search_dialog">Do you want to delete this search?</string>
@ -648,5 +649,11 @@ Upload your first media by tapping on the add button.</string>
<string name="custom_selector_info_text2">Unlike the picture on the left, the picture on the right has the Commons logo indicating it is already uploaded.</string> <string name="custom_selector_info_text2">Unlike the picture on the left, the picture on the right has the Commons logo indicating it is already uploaded.</string>
<string name="welcome_custom_selector_ok">Awesome</string> <string name="welcome_custom_selector_ok">Awesome</string>
<string name="custom_selector_already_uploaded_image_text">This image has already been uploaded to Commons.</string> <string name="custom_selector_already_uploaded_image_text">This image has already been uploaded to Commons.</string>
<string name="place_state_wlm">WLM</string>
<string name="wlm_upload_info">You are contributing to Wiki Loves Monuments Campaign. Related templates will be added accordingly.</string>
<string name="display_monuments">Display monuments</string>
<string name="wlm_month_message">It\'s Wiki Loves Monuments month!</string>
<string name="learn_more">LEARN MORE</string>
<string name="wlm_campaign_title">Wiki Loves Monuments</string>
<string name="wlm_campaign_description">Wiki Loves Monuments is an international photo contest for monuments organised by Wikimedia</string>
</resources> </resources>

View file

@ -70,7 +70,6 @@
app:singleLineTitle="false" app:singleLineTitle="false"
android:summary="@string/display_campaigns_explanation" android:summary="@string/display_campaigns_explanation"
android:title="@string/display_campaigns" /> android:title="@string/display_campaigns" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory

View file

@ -0,0 +1,60 @@
SELECT
(SAMPLE(?location) as ?location)
?item
(SAMPLE(COALESCE(?itemLabelPreferredLanguage, ?itemLabelAnyLanguage)) as ?label)
(SAMPLE(COALESCE(?itemDescriptionPreferredLanguage, ?itemDescriptionAnyLanguage, "?")) as ?description)
(SAMPLE(?classId) as ?class)
(SAMPLE(COALESCE(?classLabelPreferredLanguage, ?classLabelAnyLanguage, "?")) as ?classLabel)
(SAMPLE(COALESCE(?icon0, ?icon1)) as ?icon)
?wikipediaArticle
?commonsArticle
(SAMPLE(?commonsCategory) as ?commonsCategory)
(SAMPLE(?pic) as ?pic)
WHERE {
# Around given location...
SERVICE wikibase:around {
?item wdt:P625 ?location.
bd:serviceParam wikibase:center "Point(${LONG} ${LAT})"^^geo:wktLiteral.
bd:serviceParam wikibase:radius "${RAD}" . # Radius in kilometers.
}
{ ?item p:P1435 ?monument } UNION { ?item p:P2186 ?monument } UNION { ?item p:P1459 ?monument } UNION { ?item p:P1460 ?monument } UNION { ?item p:P1216 ?monument } UNION { ?item p:P709 ?monument } UNION { ?item p:P718 ?monument } UNION { ?item p:P5694 ?monument }
# Get Commons category (P373)
OPTIONAL { ?item wdt:P373 ?commonsCategory. }
# Get (P18)
OPTIONAL { ?item wdt:P18 ?pic. }
# Get the label in the preferred language of the user, or any other language if no label is available in that language.
OPTIONAL {?item rdfs:label ?itemLabelPreferredLanguage. FILTER (lang(?itemLabelPreferredLanguage) = "${LANG}")}
OPTIONAL {?item rdfs:label ?itemLabelAnyLanguage}
# Get the description in the preferred language of the user, or any other language if no description is available in that language.
OPTIONAL {?item schema:description ?itemDescriptionPreferredLanguage. FILTER (lang(?itemDescriptionPreferredLanguage) = "${LANG}")}
OPTIONAL {?item schema:description ?itemDescriptionAnyLanguage }
# Get the class label in the preferred language of the user, or any other language if no label is available in that language.
OPTIONAL {
?item p:P31/ps:P31 ?classId.
OPTIONAL {?classId rdfs:label ?classLabelPreferredLanguage. FILTER (lang(?classLabelPreferredLanguage) = "")}
OPTIONAL {?classId rdfs:label ?classLabelAnyLanguage}
OPTIONAL {
?wikipediaArticle schema:about ?item ;
schema:isPartOf <https://.wikipedia.org/> .
}
OPTIONAL {
?wikipediaArticle schema:about ?item ;
schema:isPartOf <https://en.wikipedia.org/> .
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}
OPTIONAL {
?commonsArticle schema:about ?item ;
schema:isPartOf <https://commons.wikimedia.org/> .
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}
}
}
GROUP BY ?item ?wikipediaArticle ?commonsArticle

View file

@ -1,9 +1,6 @@
package fr.free.nrw.commons.bookmarks.locations package fr.free.nrw.commons.bookmarks.locations
import android.net.Uri
import com.nhaarman.mockitokotlin2.whenever import com.nhaarman.mockitokotlin2.whenever
import fr.free.nrw.commons.bookmarks.Bookmark
import fr.free.nrw.commons.bookmarks.pictures.BookmarkPicturesDao
import fr.free.nrw.commons.nearby.Place import fr.free.nrw.commons.nearby.Place
import org.junit.Assert import org.junit.Assert
import org.junit.Before import org.junit.Before
@ -33,8 +30,23 @@ class BookmarkLocationControllerTest {
private val mockBookmarkList: List<Place> private val mockBookmarkList: List<Place>
private get() { private get() {
val list = ArrayList<Place>() val list = ArrayList<Place>()
list.add(Place("en","a place",null,"a description",null,"a cat",null,null,true)) list.add(
list.add(Place("en","another place",null,"another description",null,"another cat",null,null,true)) Place(
"en", "a place", null, "a description", null, "a cat", null, null, true)
)
list.add(
Place(
"en",
"another place",
null,
"another description",
null,
"another cat",
null,
null,
true
)
)
return list return list
} }

View file

@ -77,7 +77,18 @@ class BookmarkLocationFragmentUnitTests {
private val mockBookmarkList: List<Place> private val mockBookmarkList: List<Place>
private get() { private get() {
val list = ArrayList<Place>() val list = ArrayList<Place>()
list.add(Place("en","a place",null,"a description",null,"a cat",null,null,true)) list.add(
Place(
"en",
"a place",
null,
"a description",
null,
"a cat",
null,
null,
true)
)
return list return list
} }

View file

@ -265,7 +265,14 @@ class NearbyParentFragmentPresenterTest {
fun testFilterByMarkerTypeMultiSelectCHECKED() { fun testFilterByMarkerTypeMultiSelectCHECKED() {
val state = CheckBoxTriStates.CHECKED val state = CheckBoxTriStates.CHECKED
nearbyPresenter.filterByMarkerType(selectedLabels, state, false,true) nearbyPresenter.filterByMarkerType(selectedLabels, state, false,true)
verify(nearbyParentFragmentView).filterMarkersByLabels(ArgumentMatchers.anyList(),ArgumentMatchers.anyBoolean(),ArgumentMatchers.anyBoolean(),ArgumentMatchers.anyBoolean(),ArgumentMatchers.anyBoolean()); verify(nearbyParentFragmentView).filterMarkersByLabels(
ArgumentMatchers.anyList(),
ArgumentMatchers.anyBoolean(),
ArgumentMatchers.anyBoolean(),
ArgumentMatchers.anyBoolean(),
ArgumentMatchers.anyBoolean(),
ArgumentMatchers.anyBoolean()
);
verify(nearbyParentFragmentView).setRecyclerViewAdapterAllSelected() verify(nearbyParentFragmentView).setRecyclerViewAdapterAllSelected()
verifyNoMoreInteractions(nearbyParentFragmentView) verifyNoMoreInteractions(nearbyParentFragmentView)
} }
@ -276,7 +283,14 @@ class NearbyParentFragmentPresenterTest {
@Test @Test
fun testFilterByMarkerTypeSingleSelect() { fun testFilterByMarkerTypeSingleSelect() {
nearbyPresenter.filterByMarkerType(selectedLabels, 0, true,false) nearbyPresenter.filterByMarkerType(selectedLabels, 0, true,false)
verify(nearbyParentFragmentView).filterMarkersByLabels(any(), any(), any(), any(), any()); verify(nearbyParentFragmentView).filterMarkersByLabels(
any(),
any(),
any(),
any(),
any(),
any()
);
verifyNoMoreInteractions(nearbyParentFragmentView) verifyNoMoreInteractions(nearbyParentFragmentView)
} }

View file

@ -0,0 +1,171 @@
package fr.free.nrw.commons.utils
import android.app.ProgressDialog
import android.content.Context
import android.graphics.Bitmap
import fr.free.nrw.commons.TestCommonsApplication
import fr.free.nrw.commons.location.LatLng
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient
import io.reactivex.disposables.CompositeDisposable
import org.junit.Assert
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito.`when`
import org.mockito.Mockito.mock
import org.mockito.MockitoAnnotations
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
import org.robolectric.annotation.Config
import org.robolectric.annotation.LooperMode
import java.io.File
import java.lang.reflect.Field
import java.lang.reflect.Method
@RunWith(RobolectricTestRunner::class)
@Config(sdk = [21], application = TestCommonsApplication::class)
@LooperMode(LooperMode.Mode.PAUSED)
class ImageUtilsTest {
private lateinit var context: Context
@Mock
private lateinit var bitmap: Bitmap
@Mock
private lateinit var progressDialogWallpaper: ProgressDialog
@Mock
private lateinit var okHttpJsonApiClient: OkHttpJsonApiClient
@Mock
private lateinit var compositeDisposable: CompositeDisposable
@Before
fun setup() {
MockitoAnnotations.initMocks(this)
context = RuntimeEnvironment.application.applicationContext
}
@Test
fun testCheckIfImageIsTooDarkCaseException() {
Assert.assertEquals(ImageUtils.checkIfImageIsTooDark(""), ImageUtils.IMAGE_OK)
}
@Test
fun testCheckIfImageIsTooDark() {
val tempFile = File.createTempFile("prefix", "suffix")
ImageUtils.checkIfImageIsTooDark(tempFile.absolutePath)
}
@Test
fun testSetWallpaper() {
val mockImageUtils = mock(ImageUtils::class.java)
val method: Method = ImageUtils::class.java.getDeclaredMethod(
"setWallpaper",
Context::class.java,
Bitmap::class.java
)
method.isAccessible = true
`when`(progressDialogWallpaper.isShowing).thenReturn(true)
val progressDialogWallpaperField: Field =
ImageUtils::class.java.getDeclaredField("progressDialogWallpaper")
progressDialogWallpaperField.isAccessible = true
progressDialogWallpaperField.set(mockImageUtils, progressDialogWallpaper)
method.invoke(mockImageUtils, context, bitmap)
}
@Test
fun testShowSettingAvatarProgressBar() {
val mockImageUtils = mock(ImageUtils::class.java)
val method: Method = ImageUtils::class.java.getDeclaredMethod(
"showSettingAvatarProgressBar",
Context::class.java
)
method.isAccessible = true
method.invoke(mockImageUtils, context)
}
@Test
fun testGetErrorMessageForResultCase0() {
ImageUtils.getErrorMessageForResult(context, 0)
}
@Test
fun testGetErrorMessageForResultCaseIMAGE_DARK() {
ImageUtils.getErrorMessageForResult(context, 1)
}
@Test
fun testGetErrorMessageForResultCaseIMAGE_BLURRY() {
ImageUtils.getErrorMessageForResult(context, 2)
}
@Test
fun testGetErrorMessageForResultCaseIMAGE_DUPLICATE() {
ImageUtils.getErrorMessageForResult(context, 4)
}
@Test
fun testGetErrorMessageForResultCaseIMAGE_GEOLOCATION_DIFFERENT() {
ImageUtils.getErrorMessageForResult(context, 8)
}
@Test
fun testGetErrorMessageForResultCaseFILE_FBMD() {
ImageUtils.getErrorMessageForResult(context, 16)
}
@Test
fun testGetErrorMessageForResultCaseFILE_NO_EXIF() {
ImageUtils.getErrorMessageForResult(context, 32)
}
@Test
fun testSetAvatarFromImageUrl() {
ImageUtils.setAvatarFromImageUrl(
context,
"",
"",
okHttpJsonApiClient,
compositeDisposable
)
}
@Test
fun testCheckImageGeolocationIsDifferentCaseNull() {
Assert.assertEquals(
ImageUtils.checkImageGeolocationIsDifferent(
"test",
null
), false
)
}
@Test
fun testCheckImageGeolocationIsDifferent() {
Assert.assertEquals(
ImageUtils.checkImageGeolocationIsDifferent(
"0.0|0.0",
LatLng(0.0, 0.0, 0f)
), false
)
}
@Test
fun testCheckIfImageIsDark() {
val mockImageUtils = mock(ImageUtils::class.java)
val method: Method = ImageUtils::class.java.getDeclaredMethod(
"checkIfImageIsDark",
Bitmap::class.java
)
method.isAccessible = true
method.invoke(mockImageUtils, null)
}
}