Merge remote-tracking branch 'origin/master' into macgills/3780-media-construction

# Conflicts:
#	app/src/main/java/fr/free/nrw/commons/Media.java
#	app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.kt
#	app/src/main/java/fr/free/nrw/commons/contributions/Contribution.java
#	app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java
#	app/src/main/java/fr/free/nrw/commons/explore/BaseSearchFragment.kt
#	app/src/main/java/fr/free/nrw/commons/explore/depictions/SearchDepictionsFragment.kt
#	app/src/main/java/fr/free/nrw/commons/explore/media/MediaConverter.kt
#	app/src/main/java/fr/free/nrw/commons/explore/media/PageableMediaDataSource.kt
#	app/src/main/java/fr/free/nrw/commons/explore/media/SearchMediaAdapter.kt
#	app/src/main/java/fr/free/nrw/commons/media/MediaClient.kt
#	app/src/main/java/fr/free/nrw/commons/media/MediaInterface.java
#	app/src/main/java/fr/free/nrw/commons/upload/WikidataPlace.kt
#	app/src/test/kotlin/fr/free/nrw/commons/explore/BaseSearchPresenterTest.kt
#	app/src/test/kotlin/fr/free/nrw/commons/explore/media/PageableMediaDataSourceTest.kt
#	app/src/test/kotlin/fr/free/nrw/commons/media/MediaClientTest.kt
This commit is contained in:
Sean Mac Gillicuddy 2020-06-18 08:54:29 +01:00
commit 6bbf392e32
53 changed files with 1285 additions and 525 deletions

View file

@ -15,7 +15,7 @@ android:
components:
- tools
- platform-tools
- build-tools-28.0.3
- build-tools-29.0.2
- extra-google-m2repository
- extra-android-m2repository
- android-22

View file

@ -134,7 +134,6 @@ dependencies {
android {
compileSdkVersion 28
buildToolsVersion "28.0.3"
defaultConfig {
//applicationId 'fr.free.nrw.commons'
@ -152,7 +151,6 @@ android {
testOptions {
execution 'ANDROIDX_TEST_ORCHESTRATOR'
}
multiDexEnabled true
vectorDrawables.useSupportLibrary = true
}

View file

@ -285,6 +285,14 @@ public class Media implements Parcelable {
this.coordinates = coordinates;
}
/**
* Returns wikicode to use the media file on a MediaWiki site
* @return
*/
public String getWikiCode() {
return String.format("[[%s|thumb|%s]]", filename, getDisplayTitle());
}
/**
* Sets the categories the file falls under.
* </p>

View file

@ -53,6 +53,9 @@ public abstract class ContributionDao {
@Query("SELECT * from contribution WHERE filename=:fileName")
public abstract List<Contribution> getContributionWithTitle(String fileName);
@Query("SELECT * from contribution WHERE pageId=:pageId")
public abstract Contribution getContribution(String pageId);
@Query("UPDATE contribution SET state=:state WHERE state in (:toUpdateStates)")
public abstract Single<Integer> updateStates(int state, int[] toUpdateStates);

View file

@ -3,8 +3,9 @@ package fr.free.nrw.commons.contributions;
import android.net.Uri;
import android.text.TextUtils;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
@ -17,137 +18,181 @@ import com.facebook.imagepipeline.request.ImageRequestBuilder;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.contributions.ContributionsListAdapter.Callback;
import fr.free.nrw.commons.media.MediaClient;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.schedulers.Schedulers;
public class ContributionViewHolder extends RecyclerView.ViewHolder {
private final Callback callback;
@BindView(R.id.contributionImage)
SimpleDraweeView imageView;
@BindView(R.id.contributionTitle) TextView titleView;
@BindView(R.id.contributionState) TextView stateView;
@BindView(R.id.contributionSequenceNumber) TextView seqNumView;
@BindView(R.id.contributionProgress) ProgressBar progressView;
@BindView(R.id.failed_image_options) LinearLayout failedImageOptions;
private final Callback callback;
@BindView(R.id.contributionImage)
SimpleDraweeView imageView;
@BindView(R.id.contributionTitle)
TextView titleView;
@BindView(R.id.contributionState)
TextView stateView;
@BindView(R.id.contributionSequenceNumber)
TextView seqNumView;
@BindView(R.id.contributionProgress)
ProgressBar progressView;
@BindView(R.id.image_options)
RelativeLayout imageOptions;
@BindView(R.id.wikipediaButton)
ImageButton addToWikipediaButton;
@BindView(R.id.retryButton)
ImageButton retryButton;
@BindView(R.id.cancelButton)
ImageButton cancelButton;
private int position;
private Contribution contribution;
private final CompositeDisposable compositeDisposable = new CompositeDisposable();
private final MediaClient mediaClient;
private int position;
private Contribution contribution;
private final CompositeDisposable compositeDisposable = new CompositeDisposable();
private final MediaClient mediaClient;
ContributionViewHolder(final View parent, final Callback callback,
final MediaClient mediaClient) {
super(parent);
this.mediaClient = mediaClient;
ButterKnife.bind(this, parent);
this.callback=callback;
ContributionViewHolder(final View parent, final Callback callback,
final MediaClient mediaClient) {
super(parent);
this.mediaClient = mediaClient;
ButterKnife.bind(this, parent);
this.callback = callback;
}
public void init(final int position, final Contribution contribution) {
this.contribution = contribution;
this.position = position;
titleView.setText(getTitle(contribution));
final String imageSource = chooseImageSource(contribution.getThumbUrl(),
contribution.getLocalUri());
if (!TextUtils.isEmpty(imageSource)) {
final ImageRequest imageRequest =
ImageRequestBuilder.newBuilderWithSource(Uri.parse(imageSource))
.setProgressiveRenderingEnabled(true)
.build();
imageView.setImageRequest(imageRequest);
}
public void init(final int position, final Contribution contribution) {
this.contribution = contribution;
fetchAndDisplayCaption(contribution);
this.position = position;
final String imageSource = chooseImageSource(contribution.getThumbUrl(), contribution.getLocalUri());
if (!TextUtils.isEmpty(imageSource)) {
final ImageRequest imageRequest =
ImageRequestBuilder.newBuilderWithSource(Uri.parse(imageSource))
.setProgressiveRenderingEnabled(true)
.build();
imageView.setImageRequest(imageRequest);
}
seqNumView.setText(String.valueOf(position + 1));
seqNumView.setVisibility(View.VISIBLE);
seqNumView.setText(String.valueOf(position + 1));
seqNumView.setVisibility(View.VISIBLE);
switch (contribution.getState()) {
case Contribution.STATE_COMPLETED:
stateView.setVisibility(View.GONE);
progressView.setVisibility(View.GONE);
failedImageOptions.setVisibility(View.GONE);
stateView.setText("");
break;
case Contribution.STATE_QUEUED:
stateView.setVisibility(View.VISIBLE);
progressView.setVisibility(View.GONE);
stateView.setText(R.string.contribution_state_queued);
failedImageOptions.setVisibility(View.GONE);
break;
case Contribution.STATE_IN_PROGRESS:
stateView.setVisibility(View.GONE);
progressView.setVisibility(View.VISIBLE);
failedImageOptions.setVisibility(View.GONE);
final long total = contribution.getDataLength();
final long transferred = contribution.getTransferred();
if (transferred == 0 || transferred >= total) {
progressView.setIndeterminate(true);
} else {
progressView.setProgress((int)(((double)transferred / (double)total) * 100));
}
break;
case Contribution.STATE_FAILED:
stateView.setVisibility(View.VISIBLE);
stateView.setText(R.string.contribution_state_failed);
progressView.setVisibility(View.GONE);
failedImageOptions.setVisibility(View.VISIBLE);
break;
}
}
/**
* In contributions first we show the title for the image stored in cache,
* then we fetch captions associated with the image and replace title on the thumbnail with caption
*
* @param contribution
*/
private void fetchAndDisplayCaption(final Contribution contribution) {
if ((contribution.getState() != Contribution.STATE_COMPLETED)) {
titleView.setText(contribution.getDisplayTitle());
addToWikipediaButton.setVisibility(View.GONE);
switch (contribution.getState()) {
case Contribution.STATE_COMPLETED:
stateView.setVisibility(View.GONE);
progressView.setVisibility(View.GONE);
imageOptions.setVisibility(View.GONE);
stateView.setText("");
checkIfMediaExistsOnWikipediaPage(contribution);
break;
case Contribution.STATE_QUEUED:
stateView.setVisibility(View.VISIBLE);
progressView.setVisibility(View.GONE);
stateView.setText(R.string.contribution_state_queued);
imageOptions.setVisibility(View.GONE);
break;
case Contribution.STATE_IN_PROGRESS:
stateView.setVisibility(View.GONE);
progressView.setVisibility(View.VISIBLE);
imageOptions.setVisibility(View.GONE);
final long total = contribution.getDataLength();
final long transferred = contribution.getTransferred();
if (transferred == 0 || transferred >= total) {
progressView.setIndeterminate(true);
} else {
titleView.setText(getTitle(contribution));
progressView.setProgress((int) (((double) transferred / (double) total) * 100));
}
break;
case Contribution.STATE_FAILED:
stateView.setVisibility(View.VISIBLE);
stateView.setText(R.string.contribution_state_failed);
progressView.setVisibility(View.GONE);
imageOptions.setVisibility(View.VISIBLE);
break;
}
}
private String getTitle(Contribution contribution) {
for (String value : contribution.getCaptions().values()) {
return value;
}
return contribution.getDisplayTitle();
private String getTitle(Contribution contribution) {
for (String value : contribution.getCaptions().values()) {
return value;
}
return contribution.getDisplayTitle();
}
/**
* Returns the image source for the image view, first preference is given to thumbUrl if that is
* null, moves to local uri and if both are null return null
*
* @param thumbUrl
* @param localUri
* @return
*/
@Nullable
private String chooseImageSource(final String thumbUrl, final Uri localUri) {
return !TextUtils.isEmpty(thumbUrl) ? thumbUrl :
localUri != null ? localUri.toString() :
null;
}
/**
* Retry upload when it is failed
*/
@OnClick(R.id.retryButton)
public void retryUpload() {
callback.retryUpload(contribution);
/**
* Checks if a media exists on the corresponding Wikipedia article Currently the check is made for
* the device's current language Wikipedia
*
* @param contribution
*/
private void checkIfMediaExistsOnWikipediaPage(final Contribution contribution) {
if (contribution.getWikidataPlace() == null
|| contribution.getWikidataPlace().getWikipediaArticle() == null) {
return;
}
final String wikipediaArticle = contribution.getWikidataPlace().getWikipediaPageTitle();
compositeDisposable.add(mediaClient.doesPageContainMedia(wikipediaArticle)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(mediaExists -> {
displayWikipediaButton(mediaExists);
}));
}
/**
* Delete a failed upload attempt
*/
@OnClick(R.id.cancelButton)
public void deleteUpload() {
callback.deleteUpload(contribution);
/**
* Handle action buttons visibility if the corresponding wikipedia page doesn't contain any media.
* This method needs to control the state of just the scenario where media does not exists as
* other scenarios are already handled in the init method.
*
* @param mediaExists
*/
private void displayWikipediaButton(Boolean mediaExists) {
if (!mediaExists) {
addToWikipediaButton.setVisibility(View.VISIBLE);
cancelButton.setVisibility(View.GONE);
retryButton.setVisibility(View.GONE);
imageOptions.setVisibility(View.VISIBLE);
}
}
@OnClick(R.id.contributionImage)
public void imageClicked(){
callback.openMediaDetail(position);
}
/**
* Returns the image source for the image view, first preference is given to thumbUrl if that is
* null, moves to local uri and if both are null return null
*
* @param thumbUrl
* @param localUri
* @return
*/
@Nullable
private String chooseImageSource(final String thumbUrl, final Uri localUri) {
return !TextUtils.isEmpty(thumbUrl) ? thumbUrl :
localUri != null ? localUri.toString() :
null;
}
/**
* Retry upload when it is failed
*/
@OnClick(R.id.retryButton)
public void retryUpload() {
callback.retryUpload(contribution);
}
/**
* Delete a failed upload attempt
*/
@OnClick(R.id.cancelButton)
public void deleteUpload() {
callback.deleteUpload(contribution);
}
@OnClick(R.id.contributionImage)
public void imageClicked() {
callback.openMediaDetail(position);
}
@OnClick(R.id.wikipediaButton)
public void wikipediaButtonClicked() {
callback.addImageToWikipedia(contribution);
}
}

View file

@ -223,7 +223,7 @@ public class ContributionsFragment
private void initFragments() {
if (null == contributionsListFragment) {
contributionsListFragment = new ContributionsListFragment(this);
contributionsListFragment = new ContributionsListFragment();
}
if (shouldShowMediaDetailsFragment) {

View file

@ -7,8 +7,9 @@ import androidx.paging.PagedListAdapter;
import androidx.recyclerview.widget.DiffUtil;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.media.MediaClient;
import org.wikipedia.dataclient.WikiSite;
/**
/**
* Represents The View Adapter for the List of Contributions
*/
public class ContributionsListAdapter extends
@ -63,7 +64,8 @@ public class ContributionsListAdapter extends
final int viewType) {
final ContributionViewHolder viewHolder = new ContributionViewHolder(
LayoutInflater.from(parent.getContext())
.inflate(R.layout.layout_contribution, parent, false), callback, mediaClient);
.inflate(R.layout.layout_contribution, parent, false),
callback, mediaClient);
return viewHolder;
}
@ -74,5 +76,7 @@ public class ContributionsListAdapter extends
void deleteUpload(Contribution contribution);
void openMediaDetail(int contribution);
void addImageToWikipedia(Contribution contribution);
}
}

View file

@ -2,8 +2,11 @@ package fr.free.nrw.commons.contributions;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static fr.free.nrw.commons.di.NetworkingModule.NAMED_LANGUAGE_WIKI_PEDIA_WIKI_SITE;
import android.content.Context;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.LayoutInflater;
@ -16,25 +19,29 @@ import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.LayoutManager;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.media.MediaClient;
import fr.free.nrw.commons.media.MediaDetailPagerFragment;
import fr.free.nrw.commons.utils.DialogUtil;
import java.util.Locale;
import javax.inject.Inject;
import javax.inject.Named;
import org.wikipedia.dataclient.WikiSite;
/**
* Created by root on 01.06.2018.
*/
public class ContributionsListFragment extends CommonsDaggerSupportFragment implements
ContributionsListContract.View, ContributionsListAdapter.Callback {
ContributionsListContract.View, ContributionsListAdapter.Callback, WikipediaInstructionsDialogFragment.Callback {
private static final String RV_STATE = "rv_scroll_state";
@ -58,6 +65,10 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
@Inject
MediaClient mediaClient;
@Named(NAMED_LANGUAGE_WIKI_PEDIA_WIKI_SITE)
@Inject
WikiSite languageWikipediaSite;
@Inject
ContributionsListPresenter contributionsListPresenter;
@ -71,14 +82,11 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
private ContributionsListAdapter adapter;
private final Callback callback;
private Callback callback;
private final int SPAN_COUNT_LANDSCAPE = 3;
private final int SPAN_COUNT_PORTRAIT = 1;
ContributionsListFragment(final Callback callback) {
this.callback = callback;
}
public View onCreateView(
final LayoutInflater inflater, @Nullable final ViewGroup container,
@ -90,6 +98,20 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
return view;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (getParentFragment() != null && getParentFragment() instanceof ContributionsFragment) {
callback = ((ContributionsFragment) getParentFragment());
}
}
@Override
public void onDetach() {
super.onDetach();
callback = null;//To avoid possible memory leak
}
private void initAdapter() {
adapter = new ContributionsListAdapter(this, mediaClient);
}
@ -188,7 +210,8 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
final GridLayoutManager layoutManager = (GridLayoutManager) rvContributionsList.getLayoutManager();
final GridLayoutManager layoutManager = (GridLayoutManager) rvContributionsList
.getLayoutManager();
outState.putParcelable(RV_STATE, layoutManager.onSaveInstanceState());
}
@ -203,7 +226,9 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
@Override
public void retryUpload(final Contribution contribution) {
callback.retryUpload(contribution);
if (null != callback) {//Just being safe, ideally they won't be called when detached
callback.retryUpload(contribution);
}
}
@Override
@ -213,9 +238,44 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
@Override
public void openMediaDetail(final int position) {
callback.showDetail(position);
if (null != callback) {//Just being safe, ideally they won't be called when detached
callback.showDetail(position);
}
}
/**
* Handle callback for wikipedia icon clicked
*
* @param contribution
*/
@Override
public void addImageToWikipedia(Contribution contribution) {
DialogUtil.showAlertDialog(getActivity(),
getString(R.string.add_picture_to_wikipedia_article_title),
String.format(getString(R.string.add_picture_to_wikipedia_article_desc),
Locale.getDefault().getDisplayLanguage()),
() -> {
showAddImageToWikipediaInstructions(contribution);
}, () -> {
// do nothing
});
}
/**
* Display confirmation dialog with instructions when the user tries to add image to wikipedia
*
* @param contribution
*/
private void showAddImageToWikipediaInstructions(Contribution contribution) {
FragmentManager fragmentManager = getFragmentManager();
WikipediaInstructionsDialogFragment fragment = WikipediaInstructionsDialogFragment
.newInstance(contribution);
fragment.setCallback(this::onConfirmClicked);
fragment.show(fragmentManager, "WikimediaFragment");
}
public Media getMediaAtPosition(final int i) {
return adapter.getContributionForPosition(i);
}
@ -224,6 +284,23 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
return adapter.getItemCount();
}
/**
* Open the editor for the language Wikipedia
*
* @param contribution
*/
@Override
public void onConfirmClicked(@Nullable Contribution contribution, boolean copyWikicode) {
if(copyWikicode) {
String wikicode = contribution.getWikiCode();
Utils.copy("wikicode", wikicode, getContext());
}
final String url = languageWikipediaSite.mobileUrl() + "/wiki/" + contribution.getWikidataPlace()
.getWikipediaPageTitle();
Utils.handleWebUrl(getContext(), Uri.parse(url));
}
public interface Callback {
void retryUpload(Contribution contribution);

View file

@ -2,6 +2,7 @@ package fr.free.nrw.commons.contributions;
import androidx.paging.DataSource.Factory;
import io.reactivex.Completable;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
@ -67,7 +68,15 @@ class ContributionsLocalDataSource {
}
public Single<List<Long>> saveContributions(List<Contribution> contributions) {
return contributionDao.save(contributions);
List<Contribution> contributionList = new ArrayList<>();
for(Contribution contribution: contributions) {
Contribution oldContribution = contributionDao.getContribution(contribution.getPageId());
if(oldContribution != null) {
contribution.setWikidataPlace(oldContribution.getWikidataPlace());
}
contributionList.add(contribution);
}
return contributionDao.save(contributionList);
}
public void set(String key, long value) {

View file

@ -0,0 +1,67 @@
package fr.free.nrw.commons.contributions
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.fragment.app.DialogFragment
import fr.free.nrw.commons.R
import kotlinx.android.synthetic.main.dialog_add_to_wikipedia_instructions.*
/**
* Dialog fragment for displaying instructions for editing wikipedia
*/
class WikipediaInstructionsDialogFragment : DialogFragment() {
var contribution: Contribution? = null
var callback: Callback? = null
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.dialog_add_to_wikipedia_instructions, container)
}
override fun onViewCreated(
view: View,
savedInstanceState: Bundle?
) {
super.onViewCreated(view, savedInstanceState)
contribution = arguments!!.getParcelable(ARG_CONTRIBUTION)
tv_wikicode.setText(contribution?.wikiCode)
instructions_cancel.setOnClickListener {
dismiss()
}
instructions_confirm.setOnClickListener {
callback?.onConfirmClicked(contribution, checkbox_copy_wikicode.isChecked)
}
dialog!!.window.setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
)
}
/**
* Callback for handling confirm button clicked
*/
interface Callback {
fun onConfirmClicked(contribution: Contribution?, copyWikicode: Boolean)
}
companion object {
val ARG_CONTRIBUTION = "contribution"
@JvmStatic
fun newInstance(contribution: Contribution): WikipediaInstructionsDialogFragment {
val frag = WikipediaInstructionsDialogFragment()
val args = Bundle()
args.putParcelable(ARG_CONTRIBUTION, contribution)
frag.arguments = args
return frag
}
}
}

View file

@ -13,6 +13,7 @@ import fr.free.nrw.commons.explore.depictions.DepictsClient;
import fr.free.nrw.commons.kvstore.JsonKvStore;
import fr.free.nrw.commons.media.MediaDetailInterface;
import fr.free.nrw.commons.media.MediaInterface;
import fr.free.nrw.commons.media.PageMediaInterface;
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
import fr.free.nrw.commons.mwapi.UserInterface;
import fr.free.nrw.commons.review.ReviewInterface;
@ -21,6 +22,7 @@ import fr.free.nrw.commons.upload.WikiBaseInterface;
import fr.free.nrw.commons.upload.depicts.DepictsInterface;
import fr.free.nrw.commons.wikidata.WikidataInterface;
import java.io.File;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
import javax.inject.Named;
import javax.inject.Singleton;
@ -49,6 +51,9 @@ public class NetworkingModule {
public static final String NAMED_COMMONS_WIKI_SITE = "commons-wikisite";
private static final String NAMED_WIKI_DATA_WIKI_SITE = "wikidata-wikisite";
private static final String NAMED_WIKI_PEDIA_WIKI_SITE = "wikipedia-wikisite";
public static final String NAMED_LANGUAGE_WIKI_PEDIA_WIKI_SITE = "language-wikipedia-wikisite";
public static final String NAMED_COMMONS_CSRF = "commons-csrf";
@ -234,4 +239,21 @@ public class NetworkingModule {
public WikidataInterface provideWikidataInterface(@Named(NAMED_WIKI_DATA_WIKI_SITE) WikiSite wikiDataWikiSite) {
return ServiceFactory.get(wikiDataWikiSite, BuildConfig.WIKIDATA_URL, WikidataInterface.class);
}
/**
* Add provider for PageMediaInterface
* It creates a retrofit service for the wiki site using device's current language
*/
@Provides
@Singleton
public PageMediaInterface providePageMediaInterface(@Named(NAMED_LANGUAGE_WIKI_PEDIA_WIKI_SITE) WikiSite wikiSite) {
return ServiceFactory.get(wikiSite, wikiSite.url(), PageMediaInterface.class);
}
@Provides
@Singleton
@Named(NAMED_LANGUAGE_WIKI_PEDIA_WIKI_SITE)
public WikiSite provideLanguageWikipediaSite() {
return WikiSite.forLanguageCode(Locale.getDefault().getLanguage());
}
}

View file

@ -5,6 +5,7 @@ import android.content.res.Configuration
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.View.*
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.LiveData
@ -67,11 +68,11 @@ abstract class BaseSearchFragment<T> : CommonsDaggerSupportFragment(),
}
override fun hideInitialLoadProgress() {
paginatedSearchInitialLoadProgress.visibility = View.GONE
paginatedSearchInitialLoadProgress.visibility = GONE
}
override fun showInitialLoadInProgress() {
paginatedSearchInitialLoadProgress.visibility = View.VISIBLE
paginatedSearchInitialLoadProgress.visibility = VISIBLE
}
override fun showSnackbar() {
@ -84,11 +85,11 @@ abstract class BaseSearchFragment<T> : CommonsDaggerSupportFragment(),
override fun showEmptyText(query: String) {
contentNotFound.text = getString(emptyTemplateTextId, query)
contentNotFound.visibility = View.VISIBLE
contentNotFound.visibility = VISIBLE
}
override fun hideEmptyText() {
contentNotFound.visibility = View.GONE
contentNotFound.visibility = GONE
}
}

View file

@ -19,6 +19,7 @@ import javax.inject.Singleton
@Singleton
class MediaClient @Inject constructor(
private val mediaInterface: MediaInterface,
private val pageMediaInterface: PageMediaInterface,
private val mediaDetailInterface: MediaDetailInterface,
private val mediaConverter: MediaConverter
) {
@ -105,10 +106,12 @@ class MediaClient @Inject constructor(
* @return list of images for a particular depict entity
*/
fun fetchImagesForDepictedItem(query: String, sroffset: Int): Single<List<Media>> {
return responseToMediaList(mediaInterface.fetchImagesForDepictedItem(
"haswbstatement:" + BuildConfig.DEPICTS_PROPERTY + "=" + query,
sroffset.toString()
))
return responseToMediaList(
mediaInterface.fetchImagesForDepictedItem(
"haswbstatement:" + BuildConfig.DEPICTS_PROPERTY + "=" + query,
sroffset.toString()
)
)
}
@ -181,4 +184,9 @@ class MediaClient @Inject constructor(
val key = "user_$userName"
return if (continuationExists.containsKey(key)) continuationExists[key]!! else true
}
fun doesPageContainMedia(title: String?): Single<Boolean> {
return pageMediaInterface.getMediaList(title)
.map { it.items.isNotEmpty() }
}
}

View file

@ -43,6 +43,7 @@ import fr.free.nrw.commons.MediaDataExtractor;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.auth.AccountUtil;
import fr.free.nrw.commons.category.CategoryClient;
import fr.free.nrw.commons.category.CategoryDetailsActivity;
import fr.free.nrw.commons.contributions.ContributionsFragment;
import fr.free.nrw.commons.delete.DeleteHelper;

View file

@ -0,0 +1,19 @@
package fr.free.nrw.commons.media
import fr.free.nrw.commons.media.model.PageMediaListResponse
import io.reactivex.Single
import retrofit2.http.GET
import retrofit2.http.Path
/**
* Interface for MediaWiki Page REST APIs
*/
interface PageMediaInterface {
/**
* Get a list of media used on a page
*
* @param title the title of the page
*/
@GET("api/rest_v1/page/media-list/{title}")
fun getMediaList(@Path("title") title: String?): Single<PageMediaListResponse>
}

View file

@ -0,0 +1,9 @@
package fr.free.nrw.commons.media.model
data class PageMediaListResponse(
val revision: String,
val tid: String,
val items: List<PageMediaListItem>
)
data class PageMediaListItem(val title: String)

View file

@ -125,7 +125,6 @@ public class Place implements Parcelable {
}
String wikiDataLink = siteLinks.getWikidataLink().toString();
Timber.d("Wikidata entity is %s", wikiDataLink);
return wikiDataLink.replace("http://www.wikidata.org/entity/", "");
}

View file

@ -1419,14 +1419,17 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
if (fabGallery.isShown()) {
Timber.d("Gallery button tapped. Place: %s", selectedPlace.toString());
storeSharedPrefs(selectedPlace);
controller.initiateGalleryPick(getActivity(), false);
}
});
}
private void storeSharedPrefs(final Place selectedPlace) {
Timber.d("Store place object %s", selectedPlace.toString());
applicationKvStore.putJson(PLACE_OBJECT, selectedPlace);
Place place = applicationKvStore.getJson(PLACE_OBJECT, Place.class);
Timber.d("Stored place object %s", place.toString());
}
private void updateBookmarkButtonImage(final Place place) {

View file

@ -47,300 +47,335 @@ import timber.log.Timber;
public class UploadService extends CommonsDaggerService {
private static final String EXTRA_PREFIX = "fr.free.nrw.commons.upload";
private static final String EXTRA_PREFIX = "fr.free.nrw.commons.upload";
public static final String ACTION_START_SERVICE = EXTRA_PREFIX + ".upload";
public static final String EXTRA_FILES = EXTRA_PREFIX + ".files";
@Inject WikidataEditService wikidataEditService;
@Inject SessionManager sessionManager;
@Inject
ContributionDao contributionDao;
@Inject UploadClient uploadClient;
@Inject MediaClient mediaClient;
@Inject
@Named(CommonsApplicationModule.MAIN_THREAD)
Scheduler mainThreadScheduler;
@Inject
@Named(CommonsApplicationModule.IO_THREAD) Scheduler ioThreadScheduler;
public static final String ACTION_START_SERVICE = EXTRA_PREFIX + ".upload";
public static final String EXTRA_FILES = EXTRA_PREFIX + ".files";
@Inject
WikidataEditService wikidataEditService;
@Inject
SessionManager sessionManager;
@Inject
ContributionDao contributionDao;
@Inject
UploadClient uploadClient;
@Inject
MediaClient mediaClient;
@Inject
@Named(CommonsApplicationModule.MAIN_THREAD)
Scheduler mainThreadScheduler;
@Inject
@Named(CommonsApplicationModule.IO_THREAD)
Scheduler ioThreadScheduler;
private NotificationManagerCompat notificationManager;
private NotificationCompat.Builder curNotification;
private int toUpload;
private CompositeDisposable compositeDisposable;
private NotificationManagerCompat notificationManager;
private NotificationCompat.Builder curNotification;
private int toUpload;
private CompositeDisposable compositeDisposable;
/**
* The filePath names of unfinished uploads, used to prevent overwriting
*/
private Set<String> unfinishedUploads = new HashSet<>();
/**
* The filePath names of unfinished uploads, used to prevent overwriting
*/
private Set<String> unfinishedUploads = new HashSet<>();
// DO NOT HAVE NOTIFICATION ID OF 0 FOR ANYTHING
// See http://stackoverflow.com/questions/8725909/startforeground-does-not-show-my-notification
// Seriously, Android?
public static final int NOTIFICATION_UPLOAD_IN_PROGRESS = 1;
public static final int NOTIFICATION_UPLOAD_FAILED = 3;
// DO NOT HAVE NOTIFICATION ID OF 0 FOR ANYTHING
// See http://stackoverflow.com/questions/8725909/startforeground-does-not-show-my-notification
// Seriously, Android?
public static final int NOTIFICATION_UPLOAD_IN_PROGRESS = 1;
public static final int NOTIFICATION_UPLOAD_FAILED = 3;
protected class NotificationUpdateProgressListener{
protected class NotificationUpdateProgressListener {
String notificationTag;
boolean notificationTitleChanged;
Contribution contribution;
String notificationTag;
boolean notificationTitleChanged;
Contribution contribution;
String notificationProgressTitle;
String notificationFinishingTitle;
NotificationUpdateProgressListener(String notificationTag, String notificationProgressTitle, String notificationFinishingTitle, Contribution contribution) {
this.notificationTag = notificationTag;
this.notificationProgressTitle = notificationProgressTitle;
this.notificationFinishingTitle = notificationFinishingTitle;
this.contribution = contribution;
}
public void onProgress(long transferred, long total) {
if (!notificationTitleChanged) {
curNotification.setContentTitle(notificationProgressTitle);
notificationTitleChanged = true;
contribution.setState(Contribution.STATE_IN_PROGRESS);
}
if (transferred == total) {
// Completed!
curNotification.setContentTitle(notificationFinishingTitle)
.setTicker(notificationFinishingTitle)
.setProgress(0, 100, true);
} else {
curNotification.setProgress(100, (int) (((double) transferred / (double) total) * 100), false);
}
notificationManager.notify(notificationTag, NOTIFICATION_UPLOAD_IN_PROGRESS, curNotification.build());
contribution.setTransferred(transferred);
compositeDisposable.add(contributionDao.update(contribution)
.subscribeOn(ioThreadScheduler)
.subscribe());
}
String notificationProgressTitle;
String notificationFinishingTitle;
NotificationUpdateProgressListener(String notificationTag, String notificationProgressTitle,
String notificationFinishingTitle, Contribution contribution) {
this.notificationTag = notificationTag;
this.notificationProgressTitle = notificationProgressTitle;
this.notificationFinishingTitle = notificationFinishingTitle;
this.contribution = contribution;
}
@Override
public void onDestroy() {
super.onDestroy();
compositeDisposable.dispose();
Timber.d("UploadService.onDestroy; %s are yet to be uploaded", unfinishedUploads);
public void onProgress(long transferred, long total) {
if (!notificationTitleChanged) {
curNotification.setContentTitle(notificationProgressTitle);
notificationTitleChanged = true;
contribution.setState(Contribution.STATE_IN_PROGRESS);
}
if (transferred == total) {
// Completed!
curNotification.setContentTitle(notificationFinishingTitle)
.setTicker(notificationFinishingTitle)
.setProgress(0, 100, true);
} else {
curNotification
.setProgress(100, (int) (((double) transferred / (double) total) * 100), false);
}
notificationManager
.notify(notificationTag, NOTIFICATION_UPLOAD_IN_PROGRESS, curNotification.build());
contribution.setTransferred(transferred);
compositeDisposable.add(contributionDao.update(contribution)
.subscribeOn(ioThreadScheduler)
.subscribe());
}
public class UploadServiceLocalBinder extends Binder {
public UploadService getService() {
return UploadService.this;
}
}
@Override
public void onDestroy() {
super.onDestroy();
compositeDisposable.dispose();
Timber.d("UploadService.onDestroy; %s are yet to be uploaded", unfinishedUploads);
}
public class UploadServiceLocalBinder extends Binder {
public UploadService getService() {
return UploadService.this;
}
}
private final IBinder localBinder = new UploadServiceLocalBinder();
private PublishProcessor<Contribution> contributionsToUpload;
@Override
public IBinder onBind(Intent intent) {
return localBinder;
}
@Override
public void onCreate() {
super.onCreate();
CommonsApplication.createNotificationChannel(getApplicationContext());
compositeDisposable = new CompositeDisposable();
notificationManager = NotificationManagerCompat.from(this);
curNotification = getNotificationBuilder(CommonsApplication.NOTIFICATION_CHANNEL_ID_ALL);
contributionsToUpload = PublishProcessor.create();
compositeDisposable.add(contributionsToUpload.subscribe(this::handleUpload));
}
public void handleUpload(Contribution contribution) {
contribution.setState(Contribution.STATE_QUEUED);
contribution.setTransferred(0);
toUpload++;
if (curNotification != null && toUpload != 1) {
curNotification.setContentText(getResources()
.getQuantityString(R.plurals.uploads_pending_notification_indicator, toUpload, toUpload));
Timber.d("%d uploads left", toUpload);
notificationManager
.notify(contribution.getLocalUri().toString(), NOTIFICATION_UPLOAD_IN_PROGRESS,
curNotification.build());
}
private final IBinder localBinder = new UploadServiceLocalBinder();
compositeDisposable.add(contributionDao
.save(contribution)
.subscribeOn(ioThreadScheduler)
.subscribe(() -> uploadContribution(contribution)));
}
private PublishProcessor<Contribution> contributionsToUpload;
private boolean freshStart = true;
@Override
public IBinder onBind(Intent intent) {
return localBinder;
public void queue(Contribution contribution) {
contributionsToUpload.offer(contribution);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (ACTION_START_SERVICE.equals(intent.getAction()) && freshStart) {
compositeDisposable.add(contributionDao.updateStates(Contribution.STATE_FAILED,
new int[]{Contribution.STATE_QUEUED, Contribution.STATE_IN_PROGRESS})
.observeOn(mainThreadScheduler)
.subscribeOn(ioThreadScheduler)
.subscribe());
freshStart = false;
}
return START_REDELIVER_INTENT;
}
@Override
public void onCreate() {
super.onCreate();
CommonsApplication.createNotificationChannel(getApplicationContext());
compositeDisposable = new CompositeDisposable();
notificationManager = NotificationManagerCompat.from(this);
curNotification = getNotificationBuilder(CommonsApplication.NOTIFICATION_CHANNEL_ID_ALL);
contributionsToUpload = PublishProcessor.create();
compositeDisposable.add(contributionsToUpload.subscribe(this::handleUpload));
@SuppressLint("StringFormatInvalid")
private NotificationCompat.Builder getNotificationBuilder(String channelId) {
return new NotificationCompat.Builder(this, channelId).setAutoCancel(true)
.setSmallIcon(R.drawable.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher))
.setAutoCancel(true)
.setOnlyAlertOnce(true)
.setProgress(100, 0, true)
.setOngoing(true)
.setContentIntent(
PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0));
}
@SuppressLint("CheckResult")
private void uploadContribution(Contribution contribution) {
Uri localUri = contribution.getLocalUri();
if (localUri == null || localUri.getPath() == null) {
Timber.d("localUri/path is null");
return;
}
String notificationTag = localUri.toString();
File localFile = new File(localUri.getPath());
public void handleUpload(Contribution contribution) {
contribution.setState(Contribution.STATE_QUEUED);
contribution.setTransferred(0);
toUpload++;
if (curNotification != null && toUpload != 1) {
curNotification.setContentText(getResources().getQuantityString(R.plurals.uploads_pending_notification_indicator, toUpload, toUpload));
Timber.d("%d uploads left", toUpload);
notificationManager.notify(contribution.getLocalUri().toString(), NOTIFICATION_UPLOAD_IN_PROGRESS, curNotification.build());
}
Timber.d("Before execution!");
curNotification.setContentTitle(getString(R.string.upload_progress_notification_title_start,
contribution.getDisplayTitle()))
.setContentText(getResources()
.getQuantityString(R.plurals.uploads_pending_notification_indicator, toUpload,
toUpload))
.setTicker(getString(R.string.upload_progress_notification_title_in_progress,
contribution.getDisplayTitle()))
.setOngoing(true);
notificationManager
.notify(notificationTag, NOTIFICATION_UPLOAD_IN_PROGRESS, curNotification.build());
compositeDisposable.add(contributionDao
.save(contribution)
.subscribeOn(ioThreadScheduler)
.subscribe(() -> uploadContribution(contribution)));
}
String filename = contribution.getFilename();
private boolean freshStart = true;
NotificationUpdateProgressListener notificationUpdater = new NotificationUpdateProgressListener(
notificationTag,
getString(R.string.upload_progress_notification_title_in_progress,
contribution.getDisplayTitle()),
getString(R.string.upload_progress_notification_title_finishing,
contribution.getDisplayTitle()),
contribution
);
public void queue(Contribution contribution) {
contributionsToUpload.offer(contribution);
}
Observable.fromCallable(() -> "Temp_" + contribution.hashCode() + filename)
.flatMap(stashFilename -> uploadClient
.uploadFileToStash(getApplicationContext(), stashFilename, localFile,
notificationUpdater))
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.doFinally(() -> {
if (filename != null) {
unfinishedUploads.remove(filename);
}
toUpload--;
if (toUpload == 0) {
// Sync modifications right after all uploads are processed
ContentResolver
.requestSync(sessionManager.getCurrentAccount(), BuildConfig.MODIFICATION_AUTHORITY,
new Bundle());
stopForeground(true);
}
})
.flatMap(uploadStash -> {
notificationManager.cancel(notificationTag, NOTIFICATION_UPLOAD_IN_PROGRESS);
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (ACTION_START_SERVICE.equals(intent.getAction()) && freshStart) {
compositeDisposable.add(contributionDao.updateStates(Contribution.STATE_FAILED, new int[]{Contribution.STATE_QUEUED, Contribution.STATE_IN_PROGRESS})
.observeOn(mainThreadScheduler)
.subscribeOn(ioThreadScheduler)
.subscribe());
freshStart = false;
}
return START_REDELIVER_INTENT;
}
Timber.d("Stash upload response 1 is %s", uploadStash.toString());
@SuppressLint("StringFormatInvalid")
private NotificationCompat.Builder getNotificationBuilder(String channelId) {
return new NotificationCompat.Builder(this, channelId).setAutoCancel(true)
.setSmallIcon(R.drawable.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher))
.setAutoCancel(true)
.setOnlyAlertOnce(true)
.setProgress(100, 0, true)
.setOngoing(true)
.setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0));
}
@SuppressLint("CheckResult")
private void uploadContribution(Contribution contribution) {
Uri localUri = contribution.getLocalUri();
if (localUri == null || localUri.getPath() == null) {
Timber.d("localUri/path is null");
return;
}
String notificationTag = localUri.toString();
File localFile = new File(localUri.getPath());
Timber.d("Before execution!");
curNotification.setContentTitle(getString(R.string.upload_progress_notification_title_start, contribution.getDisplayTitle()))
.setContentText(getResources().getQuantityString(R.plurals.uploads_pending_notification_indicator, toUpload, toUpload))
.setTicker(getString(R.string.upload_progress_notification_title_in_progress, contribution.getDisplayTitle()))
.setOngoing(true);
notificationManager
.notify(notificationTag, NOTIFICATION_UPLOAD_IN_PROGRESS, curNotification.build());
String filename = contribution.getFilename();
NotificationUpdateProgressListener notificationUpdater = new NotificationUpdateProgressListener(notificationTag,
getString(R.string.upload_progress_notification_title_in_progress, contribution.getDisplayTitle()),
getString(R.string.upload_progress_notification_title_finishing, contribution.getDisplayTitle()),
contribution
);
Observable.fromCallable(() -> "Temp_" + contribution.hashCode() + filename)
.flatMap(stashFilename -> uploadClient
.uploadFileToStash(getApplicationContext(), stashFilename, localFile,
notificationUpdater))
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.doFinally(() -> {
if (filename != null) {
unfinishedUploads.remove(filename);
}
toUpload--;
if (toUpload == 0) {
// Sync modifications right after all uploads are processed
ContentResolver.requestSync(sessionManager.getCurrentAccount(), BuildConfig.MODIFICATION_AUTHORITY, new Bundle());
stopForeground(true);
}
})
.flatMap(uploadStash -> {
notificationManager.cancel(notificationTag, NOTIFICATION_UPLOAD_IN_PROGRESS);
Timber.d("Stash upload response 1 is %s", uploadStash.toString());
if (uploadStash.isSuccessful()) {
Timber.d("making sure of uniqueness of name: %s", filename);
String uniqueFilename = findUniqueFilename(filename);
unfinishedUploads.add(uniqueFilename);
return uploadClient.uploadFileFromStash(
getApplicationContext(),
contribution,
uniqueFilename,
uploadStash.getFilekey());
} else {
Timber.d("Contribution upload failed. Wikidata entity won't be edited");
showFailedNotification(contribution);
return Observable.never();
}
})
.subscribe(
uploadResult -> onUpload(contribution, notificationTag, uploadResult),
throwable -> {
Timber.w(throwable, "Exception during upload");
notificationManager.cancel(notificationTag, NOTIFICATION_UPLOAD_IN_PROGRESS);
showFailedNotification(contribution);
});
}
private void onUpload(Contribution contribution, String notificationTag,
UploadResult uploadResult) {
Timber.d("Stash upload response 2 is %s", uploadResult.toString());
notificationManager.cancel(notificationTag, NOTIFICATION_UPLOAD_IN_PROGRESS);
if (uploadResult.isSuccessful()) {
onSuccessfulUpload(contribution, uploadResult);
} else {
if (uploadStash.isSuccessful()) {
Timber.d("making sure of uniqueness of name: %s", filename);
String uniqueFilename = findUniqueFilename(filename);
unfinishedUploads.add(uniqueFilename);
return uploadClient.uploadFileFromStash(
getApplicationContext(),
contribution,
uniqueFilename,
uploadStash.getFilekey());
} else {
Timber.d("Contribution upload failed. Wikidata entity won't be edited");
showFailedNotification(contribution);
}
}
return Observable.never();
}
})
.subscribe(
uploadResult -> onUpload(contribution, notificationTag, uploadResult),
throwable -> {
Timber.w(throwable, "Exception during upload");
notificationManager.cancel(notificationTag, NOTIFICATION_UPLOAD_IN_PROGRESS);
showFailedNotification(contribution);
});
}
private void onSuccessfulUpload(Contribution contribution, UploadResult uploadResult) {
compositeDisposable
.add(wikidataEditService.addDepictionsAndCaptions(uploadResult, contribution));
WikidataPlace wikidataPlace = contribution.getWikidataPlace();
if (wikidataPlace != null && wikidataPlace.getImageValue() == null) {
wikidataEditService.createImageClaim(wikidataPlace, uploadResult);
}
saveCompletedContribution(contribution, uploadResult);
}
private void onUpload(Contribution contribution, String notificationTag,
UploadResult uploadResult) {
Timber.d("Stash upload response 2 is %s", uploadResult.toString());
private void saveCompletedContribution(Contribution contribution, UploadResult uploadResult) {
compositeDisposable.add(mediaClient.getMedia("File:" + uploadResult.getFilename())
.map(media -> new Contribution(media, Contribution.STATE_COMPLETED))
.flatMapCompletable(newContribution -> contributionDao.saveAndDelete(contribution, newContribution))
notificationManager.cancel(notificationTag, NOTIFICATION_UPLOAD_IN_PROGRESS);
if (uploadResult.isSuccessful()) {
onSuccessfulUpload(contribution, uploadResult);
} else {
Timber.d("Contribution upload failed. Wikidata entity won't be edited");
showFailedNotification(contribution);
}
}
private void onSuccessfulUpload(Contribution contribution, UploadResult uploadResult) {
compositeDisposable
.add(wikidataEditService.addDepictionsAndCaptions(uploadResult, contribution));
WikidataPlace wikidataPlace = contribution.getWikidataPlace();
Timber.d("Wikidata place %s", wikidataPlace.toString());
if (wikidataPlace != null && wikidataPlace.getImageValue() == null) {
wikidataEditService.createImageClaim(wikidataPlace, uploadResult);
}
saveCompletedContribution(contribution, uploadResult);
}
private void saveCompletedContribution(Contribution contribution, UploadResult uploadResult) {
compositeDisposable.add(mediaClient.getMedia("File:" + uploadResult.getFilename())
.map(media -> {
Contribution newContribution = new Contribution(media, Contribution.STATE_COMPLETED);
if (contribution.getWikidataPlace() != null) {
newContribution.setWikidataPlace(contribution.getWikidataPlace());
}
return newContribution;
})
.flatMapCompletable(
newContribution -> contributionDao.saveAndDelete(contribution, newContribution))
.subscribe());
}
}
@SuppressLint("StringFormatInvalid")
@SuppressWarnings("deprecation")
private void showFailedNotification(Contribution contribution) {
curNotification.setTicker(getString(R.string.upload_failed_notification_title, contribution.getDisplayTitle()))
.setContentTitle(getString(R.string.upload_failed_notification_title, contribution.getDisplayTitle()))
.setContentText(getString(R.string.upload_failed_notification_subtitle))
.setProgress(0, 0, false)
.setOngoing(false);
notificationManager.notify(contribution.getLocalUri().toString(), NOTIFICATION_UPLOAD_FAILED, curNotification.build());
@SuppressLint("StringFormatInvalid")
@SuppressWarnings("deprecation")
private void showFailedNotification(Contribution contribution) {
curNotification.setTicker(
getString(R.string.upload_failed_notification_title, contribution.getDisplayTitle()))
.setContentTitle(
getString(R.string.upload_failed_notification_title, contribution.getDisplayTitle()))
.setContentText(getString(R.string.upload_failed_notification_subtitle))
.setProgress(0, 0, false)
.setOngoing(false);
notificationManager.notify(contribution.getLocalUri().toString(), NOTIFICATION_UPLOAD_FAILED,
curNotification.build());
contribution.setState(Contribution.STATE_FAILED);
contribution.setState(Contribution.STATE_FAILED);
compositeDisposable.add(contributionDao
.update(contribution)
.subscribeOn(ioThreadScheduler)
.subscribe());
}
compositeDisposable.add(contributionDao
.update(contribution)
.subscribeOn(ioThreadScheduler)
.subscribe());
}
private String findUniqueFilename(String fileName) throws IOException {
String sequenceFileName;
for (int sequenceNumber = 1; true; sequenceNumber++) {
if (sequenceNumber == 1) {
sequenceFileName = fileName;
} else {
if (fileName.indexOf('.') == -1) {
// We really should have appended a filePath type suffix already.
// But... we might not.
sequenceFileName = fileName + " " + sequenceNumber;
} else {
Pattern regex = Pattern.compile("^(.*)(\\..+?)$");
Matcher regexMatcher = regex.matcher(fileName);
sequenceFileName = regexMatcher.replaceAll("$1 " + sequenceNumber + "$2");
}
}
if (!mediaClient.checkPageExistsUsingTitle(String.format("File:%s",sequenceFileName)).blockingGet()
&& !unfinishedUploads.contains(sequenceFileName)) {
break;
}
private String findUniqueFilename(String fileName) throws IOException {
String sequenceFileName;
for (int sequenceNumber = 1; true; sequenceNumber++) {
if (sequenceNumber == 1) {
sequenceFileName = fileName;
} else {
if (fileName.indexOf('.') == -1) {
// We really should have appended a filePath type suffix already.
// But... we might not.
sequenceFileName = fileName + " " + sequenceNumber;
} else {
Pattern regex = Pattern.compile("^(.*)(\\..+?)$");
Matcher regexMatcher = regex.matcher(fileName);
sequenceFileName = regexMatcher.replaceAll("$1 " + sequenceNumber + "$2");
}
return sequenceFileName;
}
if (!mediaClient.checkPageExistsUsingTitle(String.format("File:%s", sequenceFileName))
.blockingGet()
&& !unfinishedUploads.contains(sequenceFileName)) {
break;
}
}
return sequenceFileName;
}
}

View file

@ -5,12 +5,19 @@ import fr.free.nrw.commons.nearby.Place
import kotlinx.android.parcel.Parcelize
@Parcelize
data class WikidataPlace(override val id: String, override val name: String, val imageValue: String?) :
WikidataItem,Parcelable {
internal data class WikidataPlace(
override val id: String,
override val name: String,
val imageValue: String?,
val wikipediaArticle: String?
) :
WikidataItem, Parcelable {
constructor(place: Place) : this(
place.wikiDataEntityId!!,
place.name,
place.pic.takeIf { it.isNotBlank() })
place.pic.takeIf { it.isNotBlank() },
place.siteLinks.wikipediaLink?.toString() ?: ""
)
companion object {
@JvmStatic
@ -18,4 +25,8 @@ data class WikidataPlace(override val id: String, override val name: String, val
return place?.let { WikidataPlace(it) }
}
}
fun getWikipediaPageTitle(): String? {
return wikipediaArticle?.substringAfterLast("/")
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 647 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 895 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View file

@ -0,0 +1,110 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dimen_10"
android:padding="@dimen/dimen_10"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/instructions_title"
android:layout_marginBottom="@dimen/dimen_20"
android:textSize="@dimen/heading_text_size" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen_10"
android:text="@string/wikipedia_instructions_step_1" />
<EditText
android:id="@+id/tv_wikicode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00000000"
android:textSize="@dimen/description_text_size"
android:layout_marginBottom="@dimen/dimen_10"
tools:text="[File:Hello.jpg|Hello]"
android:inputType="text" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen_6"
android:text="@string/wikipedia_instructions_step_2" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen_6"
android:text="@string/wikipedia_instructions_step_3" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen_6"
android:text="@string/wikipedia_instructions_step_4" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen_6"
android:text="@string/wikipedia_instructions_step_5" />
<fr.free.nrw.commons.ui.widget.HtmlTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen_6"
android:text="@string/wikipedia_instructions_step_6" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dimen_6"
android:text="@string/wikipedia_instructions_step_7" />
<CheckBox
android:id="@+id/checkbox_copy_wikicode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen_6"
android:layout_marginBottom="@dimen/dimen_6"
android:checked="true"
android:text="@string/copy_wikicode_to_clipboard"/>
<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:weightSum="2"
android:layout_height="wrap_content">
<Button
android:id="@+id/instructions_cancel"
android:layout_width="wrap_content"
android:text="@string/cancel"
android:textColor="@color/button_blue"
android:padding="@dimen/dimen_10"
android:backgroundTint="@color/white"
android:layout_weight="1"
android:layout_margin="@dimen/dimen_6"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/instructions_confirm"
android:layout_width="wrap_content"
android:text="@string/confirm"
android:textColor="@color/white"
android:padding="@dimen/dimen_10"
android:layout_weight="1"
android:layout_margin="@dimen/dimen_6"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
</ScrollView>

View file

@ -74,14 +74,16 @@
</LinearLayout>
<LinearLayout
android:id="@+id/failed_image_options"
<RelativeLayout
android:id="@+id/image_options"
android:layout_width="@dimen/dimen_0"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_weight="2"
android:visibility="gone"
android:padding="@dimen/small_gap"
android:layout_weight="2.6"
android:visibility="visible"
android:layout_gravity="right"
android:gravity="right"
android:padding="@dimen/tiny_gap"
>
<ImageButton
@ -92,7 +94,8 @@
android:text="@string/menu_cancel_upload"
android:background="@android:color/transparent"
android:padding="@dimen/activity_margin_horizontal"
android:layout_marginRight="@dimen/tiny_padding"
android:layout_toStartOf="@id/retryButton"
android:layout_marginEnd="@dimen/tiny_padding"
/>
<ImageButton
@ -103,9 +106,24 @@
android:text="@string/menu_retry_upload"
android:background="@android:color/transparent"
android:padding="@dimen/activity_margin_horizontal"
android:layout_toStartOf="@id/wikipediaButton"
android:layout_marginEnd="@dimen/tiny_padding"
/>
</LinearLayout>
<ImageButton
android:id="@+id/wikipediaButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_wikipedia"
android:text="@string/menu_cancel_upload"
android:background="@android:color/transparent"
android:visibility="visible"
android:layout_alignParentEnd="true"
android:padding="@dimen/activity_margin_horizontal"
android:layout_marginEnd="@dimen/tiny_padding"
/>
</RelativeLayout>
</LinearLayout>

View file

@ -635,4 +635,6 @@
<string name="ask_to_turn_location_on">تشغيل الموقع؟</string>
<string name="nearby_needs_location">خدمة قريب من هنا تحتاج إلى تفعيل خدمة الموقع للعمل بشكل صحيح</string>
<string name="use_location_from_similar_image">هل قمت بتصوير هاتين الصورتين في نفس المكان؟ هل تريد استخدام دائرة العرض / خط الطول للصورة على اليمين؟</string>
<string name="load_more">تحميل المزيد</string>
<string name="nearby_no_results">لم يتم العثور على أي أماكن، جرب تغيير محددات بحثك.</string>
</resources>

View file

@ -51,8 +51,10 @@
<string name="provider_contributions">Les mios xubes</string>
<string name="menu_share">Compartir</string>
<string name="menu_open_in_browser">Ver nel navegador</string>
<string name="share_title_hint" fuzzy="true">Títulu (Riquíu)</string>
<string name="share_title_hint">Pie (Riquíu)</string>
<string name="add_caption_toast">Apurre un pie pa esti ficheru</string>
<string name="share_description_hint">Descripción</string>
<string name="share_caption_hint">Pie (llende 255 caráuteres)</string>
<string name="login_failed_network">Nun se pudo aniciar sesión error de rede</string>
<string name="login_failed_wrong_credentials">Nun pudo aniciase sesión. Revisa\'l nome d\'usuariu y la contraseña</string>
<string name="login_failed_throttled">Demasiaos intentos incorreutos. Téntalo otra vuelta n\'unos minutos.</string>
@ -65,6 +67,7 @@
<string name="provider_modifications">Cambeos</string>
<string name="menu_upload_single">Xubir</string>
<string name="categories_search_text_hint">Guetar categoríes</string>
<string name="depicts_search_text_hint">Buscar elementos retrataos nel mediu (monte, Taj Mahal, etc.)</string>
<string name="menu_save_categories">Guardar</string>
<string name="refresh_button">Refrescar</string>
<string name="display_list_button">Llista</string>
@ -84,6 +87,10 @@
<item quantity="other">%1$d cargues</item>
</plurals>
<string name="categories_not_found">Nun s\'alcontró denguna categoría que case con %1$s</string>
<string name="depictions_not_found">Nun s\'alcontraron elementos de Wikidata que casen con %1$s</string>
<string name="no_child_classes">%1$s nun tien clases fíes</string>
<string name="no_parent_classes">%1$s nun tien clases madres</string>
<string name="depictions_image_not_found">Nun hai Imaxe pal Retratu</string>
<string name="categories_skip_explanation">Amiesta categoríes pa facer les imaxes más fáciles d\'alcontrar en Wikimedia Commons.\nPrincipia a escribir p\'amestar categoríes.</string>
<string name="categories_activity_title">Categoríes</string>
<string name="title_activity_settings">Configuración</string>
@ -100,6 +107,7 @@
<string name="menu_feedback">Unviar comentarios (per corréu)</string>
<string name="no_email_client">Nun s\'instaló nengún veceru de corréu</string>
<string name="provider_categories">Categoríes usaes de recién</string>
<string name="provider_depictions">Retratos usaos de recién</string>
<string name="waiting_first_sync">Esperando pola primera sincronización…</string>
<string name="no_uploads_yet">Inda nun xubió denguna foto.</string>
<string name="menu_retry_upload">Reintentar</string>
@ -159,6 +167,8 @@
<string name="detail_panel_cats_label">Categoríes</string>
<string name="detail_panel_cats_loading">Cargando…</string>
<string name="detail_panel_cats_none">Nenguna seleicionada</string>
<string name="detail_caption_empty">Nun tien pie</string>
<string name="detail_depiction_empty">Nun tien retratu</string>
<string name="detail_description_empty">Ensin descripción</string>
<string name="detail_discussion_empty">Nun hai alderique</string>
<string name="detail_license_empty">Llicencia desconocida</string>
@ -177,7 +187,9 @@
<string name="upload">Xubir</string>
<string name="yes"></string>
<string name="no">Non</string>
<string name="media_detail_caption">Pie</string>
<string name="media_detail_title">Títulu</string>
<string name="media_detail_depiction">Retratos</string>
<string name="media_detail_description">Descripción</string>
<string name="media_detail_discussion">Alderique</string>
<string name="media_detail_author">Autor</string>
@ -239,6 +251,7 @@
<string name="error_while_cache">Error al poner les fotos na caché</string>
<string name="title_info">Un títulu descriptivu únicu pal ficheru, que sirvirá para da-y nome al mesmu. Puede usase llinguaxe normal con espacios. Nun incluyas la estensión del ficheru</string>
<string name="description_info">Por favor, describi l\'elementu multimedia tantu como sía posible: ¿ónde se tomó?, ¿qué amuesa?, ¿cuál ye\'l contestu? Por favor, describi los oxetos o persones. Revela la información que nun pueda aldovinase de mou cenciellu, por casu el momentu del día si ye un paisaxe. Si\'l mediu amuesa daqué desacostumao, esplica qué lo fai raro.</string>
<string name="caption_info">Escribi una descripción curtia de la imaxe. (Llende de 255 caráuteres)</string>
<string name="upload_image_too_dark">Esta imaxe ye escura enforma, ¿tas seguru de que quies xubila? Wikimedia Commons ye sólo pa imaxes con valor enciclopédicu.</string>
<string name="upload_image_blurry">Esta imaxe ta borrosa, ¿tas seguru de que quies xubila? Wikimedia Commons ye sólo pa imaxes con valor enciclopédicu.</string>
<string name="upload_problem_exist">Problemes potenciales con esta imaxe:</string>
@ -318,9 +331,11 @@
<string name="search_recent_header">Guetao de recién:</string>
<string name="provider_searches">Consultes buscaes apocayá</string>
<string name="error_loading_categories">Asocedió un error al cargar les categoríes.</string>
<string name="error_loading_depictions">Asocedió un error al cargar les imáxenes.</string>
<string name="error_loading_subcategories">Asocedió un error al cargar les subcategoríes.</string>
<string name="search_tab_title_media">Multimedia</string>
<string name="search_tab_title_categories">Categoríes</string>
<string name="search_tab_title_depictions">Elementos</string>
<string name="explore_tab_title_featured">Destacada</string>
<string name="explore_tab_title_mobile">Xubío dende\'l móvil</string>
<string name="successful_wikidata_edit">Añadióse la imaxe a %1$s en Wikidata.</string>
@ -423,7 +438,9 @@
<string name="desc_language_Asia">Asia</string>
<string name="desc_language_Pacific">Pacíficu</string>
<string name="no_categories_selected">Nun hai categoríes seleicionaes</string>
<string name="no_categories_selected_warning_desc" fuzzy="true">Les imaxes ensin categoríes raramente puen usase. ¿Seguro que quies unviar ensin escoyer categoría dala?</string>
<string name="no_categories_selected_warning_desc">Les imáxenes ensin categoríes raramente puen usase. ¿Seguro que quies siguir ensin escoyer categoría dala?</string>
<string name="no_depictions_selected">Nun tien retratos seleicionaos</string>
<string name="no_depictions_selected_warning_desc">Les imáxenes con retratos alcuéntrense más fácilmente y ye más fácil que s\'usen. ¿Seguro que quies siguir ensin retratos?</string>
<string name="upload_flow_all_images_in_set">(Pa toles imaxes del conxuntu)</string>
<string name="search_this_area">Buscar nesta área</string>
<string name="nearby_card_permission_title">Solicitú de permisu</string>
@ -502,6 +519,7 @@
<string name="images_featured_explanation">Les imaxes destacaes son creaciones de talentosos fotógrafos y ilustradores que la comunidá de Wikimedia Commons reconoció como les de mayor calidá del sitiu.</string>
<string name="images_via_nearby_explanation">Les imaxes xubíes via Llugares Cercanos son les imaxes que se cargaron descubriendo llugares nel mapa.</string>
<string name="thanks_received_explanation">Esta función permite que los editores unvien una nota Gracies a los usuarios que realicen ediciones útiles usando un pequeñu enllaz d\'agradecimientu na páxina d\'historial o na de diferencies.</string>
<string name="previous_image_caption_description">Copiar los retratos y descripción anteriores</string>
<string name="previous_button_tooltip_message">Fai clic para reutilizar el títulu y descripción qu\'escribisti na imaxe anterior y cambialu p\'adautalu a la imaxe actual</string>
<string name="welcome_do_upload_content_description">Exemplos d\'imaxes bones pa xubir a Commons</string>
<string name="welcome_dont_upload_content_description">Exemplos d\'imaxes que nun tienen de xubise</string>
@ -520,6 +538,7 @@
<string name="share_via">Compartir l\'aplicación per...</string>
<string name="image_info">Información de la imaxe</string>
<string name="no_categories_found">Nun s\'alcontró nenguna categoría</string>
<string name="no_depiction_found">Nun s\'alcontraron retratos</string>
<string name="upload_cancelled">Carga encaboxada</string>
<string name="previous_image_title_description_not_found">Nun hai datos sobro\'l títulu o la descripción de la imaxe anterior</string>
<string name="dialog_box_text_nomination">¿Por qué tien de desaniciase %1$s?</string>
@ -552,6 +571,9 @@
<string name="place_type">Tipu de llugar:</string>
<string name="nearby_search_hint">Ponte, muséu, hotel etc.</string>
<string name="you_must_reset_your_passsword">¡¡Falló daqué al aniciar sesión, tienes de reaniciar la contraseña!!</string>
<string name="title_for_media">MEDIOS</string>
<string name="title_for_child_classes">CLASES FÍES</string>
<string name="title_for_parent_classes">CLASES PADRES</string>
<string name="upload_nearby_place_found_title">Llugar cercanu alcontráu</string>
<string name="upload_nearby_place_found_description">¿Ye esta una foto del Llugar %1$s?</string>
<string name="title_app_shortcut_explore">Esplorar</string>
@ -570,4 +592,6 @@
<string name="ask_to_turn_location_on">¿Activar l\'allugamientu?</string>
<string name="nearby_needs_location">«Cercano» precisa activar l\'allugamientu pa funcionar correutamente</string>
<string name="use_location_from_similar_image">¿Sacasti estes dos semeyes nel mesmu llugar? ¿Quies usar la llatitú/llonxitú da la semeya de la derecha?</string>
<string name="load_more">Cargar más</string>
<string name="nearby_no_results">Nun s\'alcontraron llugares, tenta cambiar los criterios de gueta.</string>
</resources>

View file

@ -387,4 +387,5 @@
<string name="theme_default_name" fuzzy="true">Standard</string>
<string name="theme_dark_name">Mørkt</string>
<string name="theme_light_name">Lyst</string>
<string name="load_more">Indlæs mere</string>
</resources>

View file

@ -618,5 +618,6 @@
<string name="ask_to_turn_location_on">Activer la localisation?</string>
<string name="nearby_needs_location">À proximité nécessite que la localisation soit activée pour bien fonctionner</string>
<string name="use_location_from_similar_image">Avez-vous pris ces deux photos du même endroit? Voulez-vous utiliser les latitude/longitude de limage sur la droite?</string>
<string name="load_more">Charger davantage</string>
<string name="nearby_no_results">Pas dendroit trouvé, essayez de modifier vos critères de recherche.</string>
</resources>

View file

@ -312,6 +312,7 @@
<string name="quiz_back_button">Ako nastavite postavljati slike koje je potrebno izbrisati, Vaš će račun vjerojatno biti blokiran. Jeste li sigurni da želite završiti kviz?</string>
<string name="construction_event_answer">Slike koje prikazuju tehnologiju ili kulturu dobrodošle su na Zajedničkom poslužitelju.</string>
<string name="warning_for_no_answer">Izaberite jednu opciju od dvije da biste odgovorili na pitanje</string>
<string name="user_not_logged_in">Sesija prijavljivanja istekla je, molimo Vas, prijavite se ponovo.</string>
<string name="quiz_result_share_message">Podijelite kviz s prijateljima!</string>
<string name="correct">Točan odgovor</string>
<string name="wrong">Pogrešan odgovor</string>
@ -347,4 +348,5 @@
<string name="theme_default_name" fuzzy="true">Zadano</string>
<string name="theme_dark_name">Tamno</string>
<string name="theme_light_name">Svijetlo</string>
<string name="load_more">Učitaj više</string>
</resources>

View file

@ -530,4 +530,5 @@
<string name="theme_default_name">Segui sistema</string>
<string name="theme_dark_name">Scuro</string>
<string name="theme_light_name">Chiaro</string>
<string name="load_more">Caricane ancora</string>
</resources>

View file

@ -5,6 +5,7 @@
* N219
* NoiX180
* Notanotheramy
* Sumbukompor
-->
<resources>
<string name="title_activity_explore">Dlajah</string>
@ -24,7 +25,7 @@
<string name="forgot_password">Lali Tembung Sandi?</string>
<string name="signup">Dhaftar</string>
<string name="logging_in_title">Lagi mlebu log</string>
<string name="logging_in_message">Entènana sadhela…</string>
<string name="logging_in_message">Entènana sadhéla…</string>
<string name="login_success">Kasil mlebu log!</string>
<string name="login_failed">Wurung mlebu log!</string>
<string name="upload_failed">Berkas ora tinemu. Jajal berkas liyané.</string>
@ -195,7 +196,7 @@
<string name="navigation_item_featured_images">Pinilih</string>
<string name="no_description_found">dhèksripsi ora tinemu</string>
<string name="nearby_info_menu_commons_article">Kaca barkas Commons</string>
<string name="nearby_info_menu_wikidata_article">Wiji Wikidata</string>
<string name="nearby_info_menu_wikidata_article">Wiji Wikidhata</string>
<string name="nearby_info_menu_wikipedia_article">Artikel Wikipédia</string>
<string name="give_permission">Awèh idin</string>
<string name="use_external_storage">Anggo panyimpenan njaba</string>

View file

@ -13,6 +13,7 @@
* Nuevo Paso
* Revi
* Ykhwong
* YuzaTea
* 그냥기여자
* 아라
-->
@ -186,7 +187,7 @@
<string name="menu_refresh">새로 고침</string>
<string name="storage_permission_title">기억 장치 권한 요청 중</string>
<string name="read_storage_permission_rationale">권한 필요: 외부 저장소 읽기. 이것이 없으면 앱은 갤러리에 접근할 수 없습니다.</string>
<string name="write_storage_permission_rationale" fuzzy="true">권한 필요: 외부 저장소 쓰기. 이것이 없으면 앱은 카메라에 접근할 수 없습니다.</string>
<string name="write_storage_permission_rationale">권한 필요: 외부 저장소 쓰기. 이것이 없으면 앱은 카메라/갤러리에 접근할 수 없습니다.</string>
<string name="location_permission_title">위치 권한 요청 중</string>
<string name="location_permission_rationale">선택적 권한: 분류 추천을 위해 현재 위치 정보를 가져옵니다.</string>
<string name="ok">확인</string>
@ -253,6 +254,7 @@
<string name="navigation_item_info">강좌</string>
<string name="navigation_item_notification">알림</string>
<string name="navigation_item_featured_images">알참</string>
<string name="navigation_item_review">검토</string>
<string name="nearby_needs_permissions">위치 권한이 없으면 주변 장소를 표시할 수 없습니다</string>
<string name="no_description_found">설명이 없습니다</string>
<string name="nearby_info_menu_commons_article">공용 파일 문서</string>
@ -269,8 +271,10 @@
<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_problem_image">이미지에 문제가 있습니다</string>
<string name="internet_downloaded">직접 찍은 사진만 업로드하세요. 인터넷에서 다운로드한 사진을 업로드하지 마세요.</string>
<string name="give_permission">권한 부여</string>
<string name="use_external_storage">외부 저장소 사용하기</string>
<string name="use_external_storage_summary">장치의 인앱 카메라로 찍은 사진 저장하기</string>
@ -310,6 +314,8 @@
<string name="no_internet">인터넷 사용 불가</string>
<string name="internet_established">인터넷 사용 가능</string>
<string name="error_notifications">알림 가져오기 오류</string>
<string name="error_review">검토할 이미지를 가져오는 중 오류 발생. 새로 고침을 눌러 다시 시도하세요.</string>
<string name="error_review_categories">검토할 이미지의 범주를 가져오는 중 오류 발생. 새로 고침을 눌러 다시 시도하세요.</string>
<string name="no_notifications">알림이 없습니다</string>
<string name="about_translate">번역</string>
<string name="about_translate_title">언어</string>
@ -340,6 +346,7 @@
<string name="search_tab_title_media">미디어</string>
<string name="search_tab_title_categories">분류</string>
<string name="search_tab_title_depictions">항목</string>
<string name="explore_tab_title_featured">추천됨</string>
<string name="explore_tab_title_mobile">모바일을 통해 업로드됨</string>
<string name="successful_wikidata_edit">위키데이터의 %1$s에 그림을 추가했습니다!</string>
<string name="wikidata_edit_failure">일치하는 위키데이터 엔티티의 업데이트를 실패했습니다!</string>
@ -382,6 +389,7 @@
<string name="statistics_wikidata_edits">\"주변 장소\" 경유 이미지</string>
<string name="level">레벨</string>
<string name="images_uploaded">사진 업로드됨</string>
<string name="images_used_by_wiki">사용된 이미지</string>
<string name="achievements_share_message">친구와 성과를 공유하세요!</string>
<string name="achievements_revert_limit_message">최소 요구사항:</string>
<string name="images_uploaded_explanation">업로드 소프트웨어를 통해 공용에 업로드한 그림 수</string>
@ -496,7 +504,7 @@
<string name="delete_helper_ask_spam_selfie">셀카</string>
<string name="delete_helper_ask_spam_blurry">흐림</string>
<string name="delete_helper_ask_spam_other">기타</string>
<string name="delete_helper_ask_reason_copyright_internet_photo">인터넷의 임의 사진</string>
<string name="delete_helper_ask_reason_copyright_internet_photo">인터넷상의 무작위 이미지</string>
<string name="delete_helper_ask_reason_copyright_logo">로고</string>
<string name="delete_helper_ask_reason_copyright_other">기타</string>
<string name="delete_helper_ask_alert_set_positive_button_reason">왜냐하면</string>
@ -525,5 +533,6 @@
<string name="theme_dark_name">어두움</string>
<string name="theme_light_name">밝음</string>
<string name="ask_to_turn_location_on">위치를 켭니까?</string>
<string name="load_more">더 불러오기</string>
<string name="nearby_no_results">발견된 장소가 없습니다. 검색 기준을 바꾸어 보십시오.</string>
</resources>

View file

@ -366,4 +366,6 @@
<string name="theme_default_name">System suivéieren</string>
<string name="theme_dark_name">Däischter</string>
<string name="theme_light_name">Hell</string>
<string name="load_more">Méi lueden</string>
<string name="nearby_no_results">Keng Plaze fonnt, probéiert Är Sich-Critèren z\'änneren.</string>
</resources>

View file

@ -594,5 +594,6 @@
<string name="ask_to_turn_location_on">Да ја вклучам местоположбата?</string>
<string name="nearby_needs_location">„Во близина“ бара местоположба за да работи</string>
<string name="use_location_from_similar_image">Дали ги направивте ови две слики на истото место? Дали сакате да ја искористите географската ширина/должина од десната слика?</string>
<string name="load_more">Вчитај уште</string>
<string name="nearby_no_results">Не пронајдов места. Изменете ги критериумите во барањето.</string>
</resources>

View file

@ -83,6 +83,7 @@
<string name="provider_modifications">Zmiany</string>
<string name="menu_upload_single">Prześlij</string>
<string name="categories_search_text_hint">Szukaj kategorii</string>
<string name="depicts_search_text_hint">Wyszukiwanie elementów, które przedstawiają twoje media (góra, Tadż Mahal itp.)</string>
<string name="menu_save_categories">Zapisz</string>
<string name="refresh_button">Odśwież</string>
<string name="display_list_button">Lista</string>
@ -104,6 +105,7 @@
</plurals>
<string name="categories_not_found">Nie znaleziono kategorii pasujących do %1$s</string>
<string name="depictions_not_found">Nie znaleziono przedmiotów Wikidata pasujących do %1$s</string>
<string name="depictions_image_not_found">Brak obrazu do przedstawienia</string>
<string name="categories_skip_explanation">Dodaj kategorie, aby ułatwić odnalezienie plików w Wikimedia Commons.\nZacznij pisać, aby dodać kategorie.</string>
<string name="categories_activity_title">Kategorie</string>
<string name="title_activity_settings">Ustawienia</string>
@ -113,7 +115,7 @@
<string name="title_activity_review">Recenzja</string>
<string name="menu_about">O aplikacji</string>
<string name="about_license">Aplikacja Wikimedia Commons jest oprogramowaniem typu open-source tworzonym i rozwijanym przez stypendystów i wolontariuszy ze społeczności Wikimedii. Fundacja Wikimedia nie bierze udziału w tworzeniu, rozwijaniu ani utrzymywaniu aplikacji.</string>
<string name="about_improve">&lt;a href=\"https://github.com/commons-app/apps-android-commons\"&gt;Kod źródłowy&lt;/a&gt; oraz &lt;a href=\"https://commons-app.github.io/\"&gt;strona internetowa&lt;/a&gt; na GitHub. Aby zgłosić błąd lub sugestię, utwórz nowe &lt;a href=\"%1$s\"&gt;zgłoszenie na GitHub&lt;/a&gt;.</string>
<string name="about_improve">Utwórz nowe &lt;a href=\"%1$s\"&gt;zgłoszenie na GitHub&lt;/a&gt;, aby zgłosić błąd lub sugestię.</string>
<string name="about_privacy_policy">Polityka prywatności</string>
<string name="about_credits">Twórcy</string>
<string name="title_activity_about">O aplikacji</string>
@ -180,6 +182,7 @@
<string name="detail_panel_cats_loading">Ładowanie…</string>
<string name="detail_panel_cats_none">Nic nie zaznaczono</string>
<string name="detail_caption_empty">Brak podpisu</string>
<string name="detail_depiction_empty">Bez opisu</string>
<string name="detail_description_empty">Brak opisu</string>
<string name="detail_discussion_empty">Brak dyskusji</string>
<string name="detail_license_empty">Nieznana licencja</string>
@ -193,6 +196,7 @@
<string name="title_activity_nearby">Pobliskie miejsca</string>
<string name="no_nearby">Nie znaleziono niczego w pobliżu</string>
<string name="warning">Ostrzeżenie</string>
<string name="duplicate_image_found">Znaleziono zduplikowany obraz</string>
<string name="upload_image_duplicate">Ten plik już istnieje na Commons. Jesteś pewien, że chcesz kontynuować?</string>
<string name="upload">Prześlij</string>
<string name="yes">Tak</string>
@ -225,6 +229,7 @@
<string name="commons_facebook">Strona Commons na Facebooku</string>
<string name="commons_github">Kod źródłowy Commons na GitHubie</string>
<string name="background_image">Obraz w tle</string>
<string name="mediaimage_failed">Błąd obrazu multimedialnego</string>
<string name="no_image_found">Nie znaleziono obrazu</string>
<string name="no_subcategory_found">Nie znaleziono podkategorii</string>
<string name="no_parentcategory_found">Nie znaleziono kategorii nadrzędnych</string>
@ -235,7 +240,7 @@
<string name="welcome_image_tulip">Tulipan</string>
<string name="welcome_image_no_selfies">Brak Selfie</string>
<string name="welcome_image_welcome_wikipedia">Witaj na Wikipedii</string>
<string name="welcome_image_welcome_copyright">Witaj Prawa Autorskie.</string>
<string name="welcome_image_welcome_copyright">Witamy Prawa Autorskie.</string>
<string name="welcome_image_sydney_opera_house">Opera Sydnej</string>
<string name="cancel">Anuluj</string>
<string name="navigation_drawer_open">Otwórz</string>
@ -259,6 +264,7 @@
<string name="error_while_cache">Błąd podczas buforowania zdjęć</string>
<string name="title_info">Podaj krótką, opisową i unikalną nazwę, która będzie służyła jako nazwa pliku. Możesz używać prostego języka i spacji. Nie dodawaj rozszerzenia pliku.</string>
<string name="description_info">Opisz jak najwięcej mediów: Gdzie zostało zrobione? Co to pokazuje? Jaki jest kontekst? Proszę opisać przedmioty lub osoby. Ujawnij informacje, których nie można łatwo odgadnąć, na przykład porę dnia, jeśli jest to krajobraz. Jeśli media pokazują coś niezwykłego, wyjaśnij, co sprawia, że jest to niezwykłe.</string>
<string name="caption_info">Proszę napisać krótki opis obrazu. (Limit do 255 znaków)</string>
<string name="upload_image_too_dark">To zdjęcie jest zbyt ciemne, czy na pewno chcesz je załadować? Wikimedia Commons jest tylko dla zdjęć o wartości encyklopedycznej.</string>
<string name="upload_image_blurry">To zdjęcie jest rozmazane, czy na pewno chcesz je załadować? Wikimedia Commons jest tylko dla zdjęć o wartości encyklopedycznej.</string>
<string name="upload_problem_exist">Potencjalne problemy z tym obrazem:</string>
@ -268,6 +274,7 @@
<string name="upload_problem_different_geolocation">To zdjęcie zostało zrobione w innym miejscu.</string>
<string name="upload_problem_fbmd">Prześlij tylko zdjęcia, które sam wykonałeś. Nie przesyłaj zdjęć znalezionych na kontach innych osób na Facebooku.</string>
<string name="upload_problem_do_you_continue">Czy nadal chcesz przesłać to zdjęcie?</string>
<string name="upload_problem_image">Problemy znalezione na obrazie</string>
<string name="internet_downloaded">Prześlij tylko zdjęcia, które sam wykonałeś. Nie przesyłaj zdjęć pobranych z Internetu.</string>
<string name="give_permission">Uzyskaj uprawnienie</string>
<string name="use_external_storage">Użyj pamięci zewnętrznej</string>
@ -337,7 +344,9 @@
<string name="search_recent_header">Ostatnie wyszukiwania:</string>
<string name="provider_searches">Ostatnio wyszukiwane zapytania</string>
<string name="error_loading_categories">Wystąpił błąd podczas ładowania kategorii.</string>
<string name="error_loading_depictions">Wystąpił błąd podczas ładowania obrazów.</string>
<string name="error_loading_subcategories">Wystąpił błąd podczas ładowania podkategorii.</string>
<string name="search_tab_title_media">Multimedia</string>
<string name="search_tab_title_categories">Kategorie</string>
<string name="search_tab_title_depictions">Elementy</string>
<string name="explore_tab_title_featured">Wyróżnione</string>
@ -396,15 +405,23 @@
<string name="preference_author_name_toggle">Użyj niestandardowej nazwy autora</string>
<string name="preference_author_name_toggle_summary">Podczas przesyłania zdjęć użyj niestandardowej nazwy autora zamiast nazwy użytkownika</string>
<string name="preference_author_name">Niestandardowa nazwa autora</string>
<string name="contributions_fragment">Wkład</string>
<string name="nearby_fragment">W pobliżu</string>
<string name="notifications">Powiadomienia</string>
<string name="read_notifications">Powiadomienia (przeczytaj)</string>
<string name="display_nearby_notification">Wyświetl powiadomienie w pobliżu</string>
<string name="display_nearby_notification_summary">Stuknij tutaj, aby zobaczyć najbliższe miejsce, które wymaga zdjęć</string>
<string name="list_sheet">Lista</string>
<string name="storage_permission">Uprawnienie do przechowywania</string>
<string name="write_storage_permission_rationale_for_image_share">Potrzebujemy Twojej zgody na dostęp do zewnętrznej pamięci urządzenia w celu przesyłania obrazów.</string>
<string name="nearby_notification_dismiss_message">Nie zobaczysz już najbliższego miejsca, które potrzebuje zdjęć. Możesz jednak ponownie włączyć to powiadomienie w Ustawieniach, jeśli chcesz.</string>
<string name="step_count">Krok %1$d z %2$d</string>
<string name="image_in_set_label">Obraz %1$d w zestawie</string>
<string name="next">Następny</string>
<string name="previous">Poprzedni</string>
<string name="submit">Prześlij</string>
<string name="upload_title_duplicate">Plik o nazwie pliku %1$s już istnieje. Czy na pewno chcesz kontynuować?</string>
<string name="map_application_missing">W twoim urządzeniu nie znaleziono kompatybilnej aplikacji mapowej. Zainstaluj aplikację mapową, aby korzystać z tej funkcji.</string>
<string name="navigation_item_bookmarks">Zakładki</string>
<string name="title_activity_bookmarks">Zakładki</string>
<string name="title_page_bookmarks_pictures">Zdjęcia</string>
@ -413,17 +430,45 @@
<string name="provider_bookmarks">Zakładki</string>
<string name="bookmark_empty">Nie dodałeś żadnych zakładek</string>
<string name="provider_bookmarks_location">Zakładki</string>
<string name="log_collection_started">Rozpoczęto zbieranie dzienników. Uruchom ponownie aplikację, wykonaj działanie, które chcesz zarejestrować, a następnie ponownie dotknij opcji „Wyślij plik dziennika”</string>
<string name="deletion_reason_uploaded_by_mistake">Przesłałem go przez pomyłkę</string>
<string name="deletion_reason_publicly_visible">Nie wiedziałem, że będzie to publicznie widoczne</string>
<string name="deletion_reason_bad_for_my_privacy">Zdałem sobie sprawę, że jest to szkodliwe dla mojej prywatności</string>
<string name="deletion_reason_no_longer_want_public">Zmieniłem zdanie, nie chcę, aby było to już publicznie widoczne</string>
<string name="deletion_reason_not_interesting">Przepraszamy, to zdjęcie nie jest interesujące dla encyklopedii</string>
<string name="uploaded_by_myself">Przesłane przeze mnie na %1$s, używane w artykułach %2$d.</string>
<string name="no_uploads">Prześlij swoje pierwsze multimedia, dotykając przycisku Dodaj.</string>
<string name="desc_language_Worldwide">Cały świat</string>
<string name="desc_language_America">Ameryka</string>
<string name="desc_language_Europe">Europa</string>
<string name="desc_language_Middle_East">Bliski Wschód</string>
<string name="desc_language_Africa">Afryka</string>
<string name="desc_language_Asia">Azja</string>
<string name="desc_language_Pacific">Pacyfik</string>
<string name="no_categories_selected">Nie wybrano kategorii</string>
<string name="no_categories_selected_warning_desc">Obrazy bez kategorii rzadko nadają się do użycia. Czy na pewno chcesz kontynuować bez wybierania kategorii?</string>
<string name="no_depictions_selected">Nie wybrano żadnych obrazów</string>
<string name="upload_flow_all_images_in_set">(Dla wszystkich obrazów w zestawie)</string>
<string name="search_this_area">Przeszukaj ten obszar</string>
<string name="nearby_card_permission_title">Prośba o pozwolenie</string>
<string name="nearby_card_permission_explanation">Czy chcesz, abyśmy użyli Twojej bieżącej lokalizacji do wyświetlenia najbliższego miejsca, w którym będą potrzebne zdjęcia?</string>
<string name="unable_to_display_nearest_place">Nie można wyświetlić najbliższego miejsca wymagającego zdjęć bez uprawnień do lokalizacji</string>
<string name="never_ask_again">Nigdy więcej nie pytaj o to</string>
<string name="display_location_permission_title">Wyświetl pozwolenie na lokalizację</string>
<string name="display_location_permission_explanation">W razie potrzeby zapytaj o pozwolenie na lokalizację w przypadku funkcji widoku pobliskiej karty powiadomień.</string>
<string name="achievements_fetch_failed">Coś poszło nie tak, nie mogliśmy pobrać twoich osiągnięć</string>
<string name="achievements_fetch_failed_ultimate_achievement">Zrobiłeś tak wiele wkładu, że nasz system obliczania osiągnięć nie może sobie poradzić. To jest najwyższym osiągnięciem.</string>
<string name="ends_on">Kończy się na:</string>
<string name="display_campaigns_explanation">Zobacz trwające kampanie</string>
<string name="nearby_campaign_dismiss_message">Kampanie już nie będą widoczne. Jednak w razie potrzeby możesz ponownie włączyć to powiadomienie w ustawieniach.</string>
<string name="this_function_needs_network_connection">Ta funkcja wymaga połączenia sieciowego, sprawdź ustawienia połączenia.</string>
<string name="bad_token_error_proposed_solution">Przesyłanie nie powiodło się z powodu problemów z edytowaniem tokenu. Spróbuj się wylogować i zalogować ponownie.</string>
<string name="error_processing_image">Wystąpił błąd podczas przetwarzania obrazu. Spróbuj ponownie!</string>
<string name="getting_edit_token">Pobieranie tokenu do edycji</string>
<string name="check_category_adding_template">Dodawanie szablonu do sprawdzania kategorii</string>
<string name="check_category_notification_title">Żądanie sprawdzania kategorii dla %1$s</string>
<string name="check_category_edit_summary">Żądanie sprawdzenia kategorii</string>
<string name="check_category_success_title">Wymagana kontrola kategorii</string>
<string name="check_category_failure_title">Żądanie sprawdzania kategorii nie zadziałało</string>
<string name="check_category_success_message">Zażądano sprawdzenia kategorii dla %1$s</string>
<string name="check_category_failure_message">Nie można zażądać sprawdzania kategorii dla %1$s</string>
@ -431,6 +476,8 @@
<string name="nominate_for_deletion_edit_file_page">Dodawanie wiadomości usuwania do pliku</string>
<string name="nominate_for_deletion_done">Zrobione</string>
<string name="nominate_for_deletion_notify_user">Powiadomienie użytkownika na stronie dyskusji</string>
<string name="nominate_for_deletion_edit_deletion_request_log">Dodanie pliku do Usuń dziennik żądań</string>
<string name="nominate_for_deletion_create_deletion_request">Tworzenie podstrony Usuń żądania</string>
<string name="notsure">Nie jestem pewien</string>
<string name="send_thank_success_title">Wysyłanie podziękowań: Powodzenie</string>
<string name="send_thank_success_message">Pomyślnie wysłano podziękowania do %1$s</string>
@ -459,9 +506,12 @@
<string name="review_thanks_no_button_text">Następny obraz</string>
<string name="skip_image_explanation">Kliknięcie tego przycisku spowoduje wyświetlenie kolejnego ostatnio przesłanego obrazu z Wikimedia Commons</string>
<string name="review_image_explanation">Możesz przeglądać obrazy i poprawiać jakość Wikimedia Commons.\n Cztery parametry przeglądu to:\n - Czy ten obraz jest objęty zakresem?\n - Czy ten obraz jest zgodny z zasadami praw autorskich?\n - Czy ten obraz jest poprawnie sklasyfikowany?\n - Jeśli wszystko pójdzie dobrze, możesz również podziękować autorowi.</string>
<string name="no_image">Nie użyto żadnych obrazów</string>
<string name="no_image_reverted">Żadne obrazy nie zostały przywrócone</string>
<string name="no_image_uploaded">Nie przesłano żadnych obrazów</string>
<string name="no_notification">Nie masz nieprzeczytanych powiadomień</string>
<string name="no_read_notification">Nie masz powiadomień o przeczytaniu</string>
<string name="share_logs_using">Udostępniaj dzienniki za pomocą</string>
<string name="menu_option_read">Zobacz przeczytane</string>
<string name="menu_option_unread">Wyświetl nieprzeczytane</string>
<string name="error_occurred_in_picking_images">Wystąpił błąd podczas pobierania zdjęć</string>
@ -470,6 +520,7 @@
<string name="images_featured_explanation">Polecane zdjęcia to zdjęcia wysoko wykwalifikowanych fotografów i ilustratorów, które społeczność Wikimedia Commons wybrała jako jedne z najwyższych jakości na stronie.</string>
<string name="images_via_nearby_explanation">Obrazy przesłane przez Pobliskie miejsca to obrazy, które są przesyłane przez odkrywanie miejsc na mapie.</string>
<string name="thanks_received_explanation">Ta funkcja umożliwia redaktorom wysyłanie powiadomień z podziękowaniem do użytkowników, którzy dokonują przydatnych zmian - za pomocą małego linku z podziękowaniem na stronie historii lub na stronie diff.</string>
<string name="previous_image_caption_description">Skopiuj poprzednie podpisy i opis</string>
<string name="previous_button_tooltip_message">Kliknij, aby ponownie użyć tytułu i opisu podanego na poprzednim zdjęciu i zmodyfikuj go, aby pasował do bieżącego</string>
<string name="welcome_do_upload_content_description">Przykłady dobrych zdjęć do przesłania na Commons</string>
<string name="welcome_dont_upload_content_description">Przykłady obrazów, których nie można przesyłać</string>
@ -488,6 +539,7 @@
<string name="share_via">Udostępnij za pośrednictwem…</string>
<string name="image_info">Informacje o obrazie</string>
<string name="no_categories_found">Nie znaleziono kategorii</string>
<string name="no_depiction_found">Nie znaleziono zdjęć</string>
<string name="upload_cancelled">Anulowano przesyłanie</string>
<string name="previous_image_title_description_not_found">Brakuje danych co do poprzedniego tytułu lub opisu obrazu</string>
<string name="dialog_box_text_nomination">Dlaczego należy usunąć %1$s?</string>
@ -520,8 +572,10 @@
<string name="place_type">Typ miejsca:</string>
<string name="nearby_search_hint">Most, muzeum, hotel itp.</string>
<string name="you_must_reset_your_passsword">Coś poszło nie tak podczas logowania, musisz zresetować hasło!</string>
<string name="title_for_media">MEDIA</string>
<string name="upload_nearby_place_found_title">Znaleziono miejsce w pobliżu</string>
<string name="upload_nearby_place_found_description">Czy jest to zdjęcie miejsca %1$s?</string>
<string name="title_app_shortcut_explore">Odkryj</string>
<string name="title_app_shortcut_bookmark">Zakładki</string>
<string name="title_app_shortcut_setting">Ustawienia</string>
<string name="remove_bookmark">Usunięto z zakładek</string>
@ -529,10 +583,14 @@
<string name="wallpaper_set_unsuccessfully">Coś poszło nie tak. Nie można ustawić tapety</string>
<string name="setting_wallpaper_dialog_title">Ustaw jako tapetę</string>
<string name="setting_wallpaper_dialog_message">Ustawianie tapety. Proszę czekać…</string>
<string name="theme_default_name" fuzzy="true">Domyślny</string>
<string name="theme_default_name">Śledź system</string>
<string name="theme_dark_name">Ciemny</string>
<string name="theme_light_name">Jasny</string>
<string name="cannot_open_location_settings">Nie można otworzyć ustawień lokalizacji. Włącz lokalizację ręcznie</string>
<string name="recommend_high_accuracy_mode">Aby uzyskać najlepsze wyniki, wybierz tryb wysokiej dokładności.</string>
<string name="ask_to_turn_location_on">Włączyć lokalizację?</string>
<string name="nearby_needs_location">Lokalizacja W pobliżu wymaga włączonej lokalizacji, aby działać poprawnie</string>
<string name="use_location_from_similar_image">Czy zrobiłeś te dwa zdjęcia w tym samym miejscu? Czy chcesz użyć szerokości/długości geograficznej obrazu po prawej stronie?</string>
<string name="load_more">Załaduj więcej</string>
<string name="nearby_no_results">Nie znaleziono miejsc, spróbuj zmienić kryteria wyszukiwania.</string>
</resources>

View file

@ -592,5 +592,6 @@
<string name="ask_to_turn_location_on">Anvisché la localisassion?</string>
<string name="nearby_needs_location">Nearby a l\'ha damanca dla localisassion abilità për marcé \'me ch\'as dev</string>
<string name="use_location_from_similar_image">A la fàit se doe fòto ant l\'istess pòst? A veul dovré la latitùdin e la longitùdin ëd la fòto an sla drita?</string>
<string name="load_more">Carié \'d pi</string>
<string name="nearby_no_results">Gnun pòst trovà, ch\'a preuva a modifiché ij sò criteri d\'arserca.</string>
</resources>

View file

@ -606,5 +606,6 @@
<string name="ask_to_turn_location_on">Ativar a localização?</string>
<string name="nearby_needs_location">Proximidade precisa de localização ativado para funcionar corretamente</string>
<string name="use_location_from_similar_image">Você tirou essas duas fotos no mesmo lugar? Deseja usar a latitude/longitude da imagem à direita?</string>
<string name="load_more">Carregar mais</string>
<string name="nearby_no_results">Nenhum local encontrado, tente alterar seus critérios de pesquisa.</string>
</resources>

View file

@ -56,8 +56,10 @@
<string name="provider_contributions">Încărcările mele</string>
<string name="menu_share">Partajare</string>
<string name="menu_open_in_browser">Afișează în navigator</string>
<string name="share_title_hint" fuzzy="true">Titlu</string>
<string name="share_title_hint">Descriere (Necesară)</string>
<string name="add_caption_toast">Vă rugăm să oferiți o descriere pentru acest fișier</string>
<string name="share_description_hint">Descriere</string>
<string name="share_caption_hint">Descriere (limită 255 caractere)</string>
<string name="login_failed_network">Autentificare nereușită defecțiune de rețea</string>
<string name="login_failed_wrong_credentials">Nu poți să te autentifici - verifică-ți numele de utilizator și parola</string>
<string name="login_failed_throttled">Prea multe încercări nereușite. Încercați din nou peste câteva minute.</string>
@ -70,6 +72,7 @@
<string name="provider_modifications">Modificări</string>
<string name="menu_upload_single">Încărcare</string>
<string name="categories_search_text_hint">Căutare categorii</string>
<string name="depicts_search_text_hint">Căutați articole pe care media dvs. le înfățișează (munte, Taj Mahal etc.)</string>
<string name="menu_save_categories">Salvare</string>
<string name="refresh_button">Reîncarcă</string>
<string name="display_list_button">Listă</string>
@ -92,36 +95,43 @@
<item quantity="other">%1$d de încărcări</item>
</plurals>
<string name="categories_not_found">Nu s-a găsit nicio categorie corespunzătoare cu %1$s</string>
<string name="depictions_not_found">Nu s-au găsit articole Wikidata care corespund %1$s</string>
<string name="no_child_classes">%1$s nu are clase copil</string>
<string name="no_parent_classes">%1$s nu are clase părinte</string>
<string name="depictions_image_not_found">Nicio imagine pentru reprezentare</string>
<string name="categories_skip_explanation">Adăugați categorii pentru a facilita găsirea imaginilor dumneavoastră la Wikimedia Commons.\n\nÎncepeți să tastați pentru a adăuga categorii.</string>
<string name="categories_activity_title">Categorii</string>
<string name="title_activity_settings">Setări</string>
<string name="title_activity_signup">Înregistrare</string>
<string name="title_activity_featured_images">Imagini recomandate</string>
<string name="title_activity_category_details">Categorie</string>
<string name="title_activity_review">Evaluare colegială</string>
<string name="menu_about">Despre</string>
<string name="about_license">Aplicația Wikimedia Commons este un software cu sursă deschisă creat și menținut de bursieri și voluntari ai comunității Wikimedia. Fundația Wikimedia nu este implicată în crearea, dezvoltarea sau mentenanța aplicației.</string>
<string name="about_improve">Creați un nou &lt;a href=\"%1$s\"&gt;tichet pe GitHub&lt;/a&gt; pentru a raporta buguri sau sugestii.</string>
<string name="about_privacy_policy" fuzzy="true">&lt;u&gt;Politica de confidențialitate&lt;/u&gt;</string>
<string name="about_credits" fuzzy="true">&lt;u&gt;Autori&lt;/u&gt;</string>
<string name="about_privacy_policy">Politica de confidențialitate</string>
<string name="about_credits">&lt;u&gt;Mulţumiri&lt;/u&gt;</string>
<string name="title_activity_about">Despre</string>
<string name="menu_feedback">Trimitere reacții (prin e-mail)</string>
<string name="no_email_client">Niciun client de email instalat</string>
<string name="provider_categories">Categorii utilizate recent</string>
<string name="provider_depictions">Reprezentări folosite recent</string>
<string name="waiting_first_sync">Se așteaptă prima sincronizare…</string>
<string name="no_uploads_yet">Încă nu ați încărcat nicio fotografie.</string>
<string name="menu_retry_upload">Reîncercare</string>
<string name="menu_cancel_upload">Revocare</string>
<plurals name="share_license_summary" fuzzy="true">
<plurals name="share_license_summary">
<item quantity="one">Această imagine va fi licențiată sub %1$s</item>
<item quantity="other">Această imagine va fi licențiată sub %1$s</item>
<item quantity="few">Aceste imagini vor fi licenţiate sub %1$s</item>
<item quantity="other"/>
</plurals>
<string name="media_upload_policy">Prin prezentarea acestei imagini, declar că aceasta este lucrarea mea proprie, că nu conține materiale protejate prin drepturi de autor sau selfiuri și că aderă la &lt;a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\"&gt;Wikimedia Commons policies&lt;/a&gt;.</string>
<string name="menu_download">Descarcă</string>
<string name="preference_license">Licență implicită</string>
<string name="use_previous" fuzzy="true">Folosiți titlul/descrierea anterioară</string>
<string name="use_previous">Utilizați titlul și descrierea anterioară</string>
<string name="allow_gps">Obține în mod automat locația curentă</string>
<string name="allow_gps_summary">Preia locația curentă dacă imaginea nu are salvată locația și salvează imaginea cu ea. Avertisment: Aceasta va dezvălui locația dvs. curentă.</string>
<string name="preference_theme" fuzzy="true">Mod de noapte</string>
<string name="preference_theme">Tema</string>
<string name="license_name_cc_by_sa_four">Atribuire și distribuire în condiții identice 4.0</string>
<string name="license_name_cc_by_four">Atribuire 4.0</string>
<string name="license_name_cc_by_sa">Atribuire și distribuire în condiții identice 3.0</string>
@ -162,26 +172,33 @@
<string name="welcome_copyright_subtext">Evitați materialele cu drepturi de autor găsite pe Internet, precum și imagini ale posterelor, coperților de cărți etc.</string>
<string name="welcome_final_text">Credeți că ați înțeles?</string>
<string name="welcome_final_button_text">Da!</string>
<string name="welcome_help_button_text" fuzzy="true">&lt;u&gt;Mai multe informații&lt;/u&gt;</string>
<string name="welcome_help_button_text">Mai multe informații</string>
<string name="detail_panel_cats_label">Categorii</string>
<string name="detail_panel_cats_loading">Se încarcă…</string>
<string name="detail_panel_cats_none">Niciuna selectată</string>
<string name="detail_caption_empty">Fără descriere</string>
<string name="detail_depiction_empty">Fără ilustrare</string>
<string name="detail_description_empty">Fără descriere</string>
<string name="detail_discussion_empty">Nu există discuții</string>
<string name="detail_license_empty">Licență necunoscută</string>
<string name="menu_refresh">Reîncarcă</string>
<string name="storage_permission_title">Solicitarea Permisiunilor de Stocare</string>
<string name="read_storage_permission_rationale">Necesită permisiune: Citiți spațiul de stocare extern. Aplicația nu poate accesa galeria dvs. fără aceasta.</string>
<string name="write_storage_permission_rationale" fuzzy="true">Necesită permisiune: Scrieți un spațiu de stocare extern. Aplicația nu poate accesa camera fără acest lucru.</string>
<string name="write_storage_permission_rationale">Permisiune necesară: Scrieți stocare externă. Aplicația nu vă poate accesa camera/galeria fără acest lucru.</string>
<string name="location_permission_title">Solicitarea Permisiunii de Locație</string>
<string name="location_permission_rationale">Permisiune opțională: Obțineți locația curentă pentru sugestiile de categorii</string>
<string name="ok">OK</string>
<string name="title_activity_nearby">Locurile din Apropiere</string>
<string name="no_nearby">Nu au fost găsite locații din apropiere</string>
<string name="warning">Avertisment</string>
<string name="duplicate_image_found">Imagine Duplicată Găsită</string>
<string name="upload_image_duplicate">Acest fișier există deja pe Commons. Sunteți sigur că doriți să continuați?</string>
<string name="upload">Încarcă</string>
<string name="yes">Da</string>
<string name="no">Nu</string>
<string name="media_detail_caption">Descriere</string>
<string name="media_detail_title">Titlu</string>
<string name="media_detail_depiction">Înfățisează</string>
<string name="media_detail_description">Descriere</string>
<string name="media_detail_discussion">Discuție</string>
<string name="media_detail_author">Autor</string>
@ -195,6 +212,7 @@
<string name="number_of_uploads">Limita mea de încărcare recentă</string>
<string name="maximum_limit">Limită maximă</string>
<string name="invalid_zero">Zero nu este valid</string>
<string name="invalid_input">Input nevalid</string>
<string name="maximum_limit_alert">Nu pot afișa mai mult de 500</string>
<string name="enter_valid">Introduceți un număr valid</string>
<string name="cannot_be_zero">Limita de încărcări nu poate fi 0</string>
@ -242,6 +260,7 @@
<string name="error_while_cache">Eroare la cache imaginilor</string>
<string name="title_info">Un titlu descriptiv unic pentru fișier, care va servi ca nume de fișier. Puteți utiliza un limbaj simplu cu spații. Nu includeți extensia de fișier</string>
<string name="description_info">Vă rugăm să descrieți media cât mai mult posibil: Unde a fost făcut? Ce arată? Care este contextul? Descrieți obiectele sau persoanele. Dezvăluiți informații care nu pot fi ușor ghicite, cum ar fi timpul zilei dacă este un peisaj. În cazul în care materialul transmis arată ceva neobișnuit, vă rugăm să explicați ceea ce o face neobișnuită.</string>
<string name="caption_info">Vă rugăm să scrieți o scurtă descriere a imaginii. (Limită la 255 de caractere)</string>
<string name="upload_image_too_dark">Această imagine este prea întunecată, sunteți sigur că doriți să o încărcați? Wikimedia Commons este numai pentru imagini cu valoare enciclopedică.</string>
<string name="upload_image_blurry">Această imagine este neclară, sunteți sigur că doriți să o încărcați? Wikimedia Commons este numai pentru imagini cu valoare enciclopedică.</string>
<string name="upload_problem_exist">Probleme potențiale cu această imagine:</string>
@ -251,6 +270,8 @@
<string name="upload_problem_different_geolocation">Această fotografie a fost făcută într-o altă locație.</string>
<string name="upload_problem_fbmd">Vă rugăm să nu încărcați decât imagini pe care le-ați făcut personal. Nu încărcați imagini găsite pe conturile de Facebook ale altor persoane.</string>
<string name="upload_problem_do_you_continue">Încă doriți să încărcați această imagine?</string>
<string name="upload_problem_image">Probleme găsite în imagine</string>
<string name="internet_downloaded">Vă rugăm să încărcați doar fotografiile realizate de dvs. Nu încărcați imaginile pe care le-ați descărcat de pe Internet.</string>
<string name="give_permission">Obțineți permisiunea</string>
<string name="use_external_storage">Utilizați spațiul de stocare extern</string>
<string name="use_external_storage_summary">Salvați fotografiile realizate cu aparatul foto în aplicație de pe dispozitiv</string>
@ -261,7 +282,7 @@
<string name="null_url">Eroare! Adresa URL nu a fost găsită</string>
<string name="nominate_deletion">Nominalizați pentru ștergere</string>
<string name="nominated_for_deletion">Această imagine a fost nominalizată pentru ștergere.</string>
<string name="nominated_see_more" fuzzy="true">&lt;u&gt;Vedeți pagina web pentru detalii&lt;/u&gt;</string>
<string name="nominated_see_more">Consultați pagina web pentru detalii</string>
<string name="nominating_file_for_deletion">Propun %1$s pentru ștergere.</string>
<string name="nominating_for_deletion_status">Propun fișierul pentru ștergere: %1$s</string>
<string name="view_browser">Vizualizează cu navigatorul</string>
@ -273,7 +294,7 @@
<string name="copy_wikicode">Copiați wikitext-ul în clipboard</string>
<string name="wikicode_copied">Wikitext-ul a fost copiat în clipboard</string>
<string name="nearby_location_has_not_changed">Locația nu s-a schimbat.</string>
<string name="nearby_location_not_available" fuzzy="true">Locația nu este disponibilă.</string>
<string name="nearby_location_not_available">Este posibil să nu funcționeze Apropiere, Locația nu este disponibilă.</string>
<string name="location_permission_rationale_nearby">Permisiunea necesară pentru a afișa o listă de locații din apropiere</string>
<string name="get_directions">Obțineți indicații de orientare</string>
<string name="read_article">Citiți articolul</string>
@ -286,26 +307,29 @@
<string name="nearby_wikidata">Wikidata</string>
<string name="nearby_wikipedia">Wikipedia</string>
<string name="nearby_commons">Commons</string>
<string name="about_rate_us" fuzzy="true">&lt;u&gt;Dă-ne o notă&lt;/u&gt;</string>
<string name="about_faq" fuzzy="true">&lt;u&gt;FAQ&lt;/u&gt;</string>
<string name="about_rate_us">Recenzie</string>
<string name="about_faq">Întrebări frecvente</string>
<string name="welcome_skip_button">Sari peste tutorial</string>
<string name="no_internet">Nu aveți internet</string>
<string name="internet_established">Aveți internet</string>
<string name="error_notifications">Eroare la preluarea notificărilor</string>
<string name="error_review">Eroare la preluarea imaginii pentru revizuire. Apăsați actualizare pentru a încerca din nou.</string>
<string name="error_review_categories">Eroare la preluarea categoriilor de imagini pentru revizuire. Apăsați actualizare pentru a încerca din nou.</string>
<string name="no_notifications">Nu au fost găsite notificări</string>
<string name="about_translate" fuzzy="true">&lt;u&gt;Traduceți&lt;/u&gt;</string>
<string name="about_translate">Traduceți</string>
<string name="about_translate_title">Limbi</string>
<string name="about_translate_message">Selectați limba în care doriți să trimiteți traduceri pentru</string>
<string name="about_translate_proceed">Continuă</string>
<string name="about_translate_cancel">Anulare</string>
<string name="retry">Reîncercare</string>
<string name="showcase_view_got_it_button">Am înțeles!</string>
<string name="showcase_view_whole_nearby_activity" fuzzy="true">Acestea sunt locurile din apropierea ta care au nevoie de imagini pentru a ilustra articolele lor Wikipedia</string>
<string name="showcase_view_whole_nearby_activity">Acestea sunt locurile din apropierea dvs. care au nevoie de imagini pentru a ilustra articolele lor Wikipedia.\n\nFăcând click pe „CAUTĂ ACEASTĂ ZONĂ”, se blochează harta și se lansează o căutare în apropiere în jurul locației respective.</string>
<string name="showcase_view_list_icon">Atingând acest buton, se afișează o listă a acestor locuri</string>
<string name="showcase_view_plus_fab">Puteți încărca o imagine pentru orice loc din galerie sau camera foto</string>
<string name="no_images_found">Nu s-au gasit imagini!</string>
<string name="error_loading_images">A apărut o eroare la încărcarea imaginilor.</string>
<string name="image_uploaded_by">Încărcată de: %1$s</string>
<string name="block_notification_title">Blocat</string>
<string name="block_notification">Sunteți blocat de la editarea Commons</string>
<string name="appwidget_img">Imaginea zilei</string>
<string name="app_widget_heading">Imaginea zilei</string>
@ -316,12 +340,14 @@
<string name="search_recent_header">Căutări recente:</string>
<string name="provider_searches">Interogări căutate recent</string>
<string name="error_loading_categories">A apărut o eroare la încărcarea categoriilor.</string>
<string name="error_loading_depictions">A apărut o eroare la încărcarea reprezentărilor.</string>
<string name="error_loading_subcategories">A apărut o eroare la încărcarea subcategoriilor.</string>
<string name="search_tab_title_media">Media</string>
<string name="search_tab_title_categories">Categorii</string>
<string name="search_tab_title_depictions">Elemente</string>
<string name="explore_tab_title_featured">Recomandate</string>
<string name="explore_tab_title_mobile">Încărcat de pe telefon</string>
<string name="successful_wikidata_edit" fuzzy="true">Imaginea a fost adăugată cu succes la %1$s pe Wikidata!</string>
<string name="successful_wikidata_edit">Imaginea adăugată la %1$s pe Wikidata!</string>
<string name="wikidata_edit_failure">Nu s-a actualizat entitatea corespunzătoare Wikidata!</string>
<string name="menu_set_wallpaper">Setează ca Imagine de fundal</string>
<string name="wallpaper_set_successfully">Wallpaper setat cu succes!</string>
@ -359,6 +385,7 @@
<string name="statistics">Statistici</string>
<string name="statistics_thanks">Mulțumiri primite</string>
<string name="statistics_featured">Imagini recomandate</string>
<string name="statistics_wikidata_edits">Imagini prin „Locații în apropiere”</string>
<string name="level">Nivel</string>
<string name="images_uploaded">Imaginile au fost încărcate</string>
<string name="image_reverts">Imaginile nu au fost reluate</string>
@ -377,7 +404,7 @@
<string name="contributions_fragment">Contribuții</string>
<string name="nearby_fragment">În apropiere</string>
<string name="notifications">Notificări</string>
<string name="read_notifications" fuzzy="true">Notificări (arhivate)</string>
<string name="read_notifications">Notificări (citite)</string>
<string name="display_nearby_notification">Afișați notificarea din apropiere</string>
<string name="display_nearby_notification_summary">Apăsați aici pentru a vedea cel mai apropiat loc care are nevoie de imagini</string>
<string name="no_close_nearby">Nu există locuri apropiate găsite în apropierea dvs.</string>
@ -392,9 +419,10 @@
<string name="submit">Trimite</string>
<string name="upload_title_duplicate">Există un fișier cu numele de fișier %1$s. Sunteți sigur că doriți să continuați?</string>
<string name="map_application_missing">Nu s-a găsit nicio aplicație de hartă compatibilă pe dispozitiv. Instalați o aplicație de hartă pentru a utiliza această caracteristică.</string>
<plurals name="upload_count_title" fuzzy="true">
<item quantity="one">%1$d Încărcați</item>
<item quantity="other">%1$d Încărcări</item>
<plurals name="upload_count_title">
<item quantity="one">%1$d Încarcă</item>
<item quantity="few">%1$d Încărcări</item>
<item quantity="other"/>
</plurals>
<string name="navigation_item_bookmarks">Semne de carte</string>
<string name="title_activity_bookmarks">Semne de carte</string>
@ -410,8 +438,8 @@
<string name="deletion_reason_bad_for_my_privacy">Mi-am dat seama că este rău pentru intimitatea mea</string>
<string name="deletion_reason_no_longer_want_public">M-am răzgândit, nu mai vreau să fie publică</string>
<string name="deletion_reason_not_interesting">Ne pare rău că această imagine nu este interesantă pentru o enciclopedie</string>
<string name="uploaded_by_myself" fuzzy="true">Încărcat de mine însumi</string>
<string name="no_uploads" fuzzy="true">Bun venit la Commons!\n\nÎncărcați primul dvs. suport media atingând pictograma camerei sau galeria de mai sus.</string>
<string name="uploaded_by_myself">Încărcat de mine pe %1$s, folosit în %2$d articol(e).</string>
<string name="no_uploads">Bine ați venit la Commons!\n\nÎncărcați primul dvs. media apăsând pe butonul de adăugare.</string>
<string name="desc_language_Worldwide">La nivel mondial</string>
<string name="desc_language_America">America</string>
<string name="desc_language_Europe">Europa</string>
@ -420,7 +448,9 @@
<string name="desc_language_Asia">Asia</string>
<string name="desc_language_Pacific">Pacific</string>
<string name="no_categories_selected">Nici o categorie selectată</string>
<string name="no_categories_selected_warning_desc" fuzzy="true">Imaginile fără categorii sunt rareori utilizabile. Sigur doriți să trimiteți fără a selecta categorii?</string>
<string name="no_categories_selected_warning_desc">Imaginile fără categorii sunt rareori utilizabile. Sigur doriți să continuați fără a selecta categorii?</string>
<string name="no_depictions_selected">Nu Sunt Selectate Reprezentări</string>
<string name="no_depictions_selected_warning_desc">Imaginile cu ilustrații sunt mai ușor de găsit și mai probabil să fie utilizate. Sunteți sigur că doriți să continuați fără a selecta reprezentări?</string>
<string name="upload_flow_all_images_in_set">(Pentru toate imaginile din set)</string>
<string name="search_this_area">Căutați în acest domeniu</string>
<string name="nearby_card_permission_title">Cerere de permisiune</string>
@ -430,31 +460,149 @@
<string name="display_location_permission_title">Afișați permisiunea de locație</string>
<string name="display_location_permission_explanation">Solicitați permisiunea de localizare atunci când este necesar pentru a utiliza funcția notificărilor de localizare.</string>
<string name="achievements_fetch_failed">Ceva a mers prost, nu am reușit să ne aducem realizările</string>
<string name="achievements_fetch_failed_ultimate_achievement">Ai făcut atâtea contribuții sistemul nostru de calcul al realizărilor nu poate face față. Aceasta este realizarea finală.</string>
<string name="ends_on">Se încheie la:</string>
<string name="display_campaigns">Campaniile de afișare</string>
<string name="display_campaigns_explanation" fuzzy="true">Atingeți aici pentru a vedea campaniile în desfășurare</string>
<string name="display_campaigns_explanation">Vedeți campaniile în curs</string>
<string name="nearby_campaign_dismiss_message">Nu veți mai vedea campaniile. Cu toate acestea, puteți reactiva această notificare în Setări, dacă doriți.</string>
<string name="this_function_needs_network_connection">Această funcție necesită conectare la rețea, verificați setările de conectare.</string>
<string name="bad_token_error_proposed_solution">Încărcarea a eșuat din cauza problemelor cu Edit token. Încearcă să te deconectezi și să intri din nou.</string>
<string name="error_processing_image">A apărut o eroare la procesarea imaginii. Vă rugăm să încercați din nou!</string>
<string name="getting_edit_token">Obținerea de jeton pentru editare</string>
<string name="check_category_adding_template">Adăugarea formatului pentru verificarea categoriei</string>
<string name="check_category_notification_title">Solicitați verificarea categoriei pentru %1$s</string>
<string name="check_category_edit_summary">Solicitarea verificării categoriei</string>
<string name="check_category_success_title">Verificare de categorie solicitată</string>
<string name="check_category_failure_title">Cererea de verificare a categoriei nu a funcționat</string>
<string name="check_category_success_message">Solicitare de verificare a categoriei pentru %1$s</string>
<string name="check_category_failure_message">Nu s-a putut solicita verificarea categoriei pentru %1$s</string>
<string name="check_category_toast">Solicitați verificarea categoriei pentru %1$s</string>
<string name="nominate_for_deletion_edit_file_page">Adăugarea mesajului de ștergere în fișier</string>
<string name="nominate_for_deletion_done">Realizat</string>
<string name="nominate_for_deletion_notify_user">Notificarea utilizatorului pe pagina de discuţie</string>
<string name="nominate_for_deletion_edit_deletion_request_log">Adăugarea fișierului la Ștergerea jurnalului de solicitări</string>
<string name="nominate_for_deletion_create_deletion_request">Crearea subpaginii Ștergere solicitări</string>
<string name="notsure">Nu sunt sigur</string>
<string name="send_thank_success_title">Se Trimit Mulțumiri: Succes</string>
<string name="send_thank_success_message">Trimis mulţumiri cu succes datorită %1$s</string>
<string name="send_thank_failure_message">Nu a reușit să trimită mulțumiri %1$s</string>
<string name="send_thank_failure_title">Se trimite mulțumiri: Eșec</string>
<string name="send_thank_send">Trimitere mulțumiri</string>
<string name="send_thank_notification_title">Trimitere mulțumiri</string>
<string name="send_thank_toast">Se trimite Mulțumiri pentru %1$s</string>
<string name="review_copyright">Respectă acest lucru regulile dreptului de autor?</string>
<string name="review_category">Este corect catalogat acest lucru?</string>
<string name="review_spam">Este acesta obiectiv?</string>
<string name="review_thanks">Ați dori să mulțumiți contribuitorului?</string>
<string name="review_spam_explanation">Faceți click pe NU pentru a nominaliza această imagine pentru ștergere, dacă nu este deloc utilă.</string>
<string name="review_copyright_explanation">Logo-uri, capturi de ecran, afișe de filme sunt adesea încălcări ale drepturilor de autor.\nFaceți clic pe NU pentru a nominaliza această imagine pentru ștergere</string>
<string name="review_thanks_explanation">%1$s va fi încurajat de apreciere ta</string>
<string name="review_no_category">Oh, asta nici măcar nu este categorizat!</string>
<string name="review_category_explanation">Această imagine este sub %1$s categorii.</string>
<string name="review_spam_report_question">Este în afara scopului, deoarece este</string>
<string name="review_c_violation_report_question">Este încălcare a dreptului de autor, deoarece este</string>
<string name="review_category_yes_button_text">Nu, categorizat greșit</string>
<string name="review_category_no_button_text">Pare bine</string>
<string name="review_spam_yes_button_text">Nu, în afara scopului</string>
<string name="review_spam_no_button_text">Pare bine</string>
<string name="review_copyright_yes_button_text">Nu, încălcarea dreptului de autor</string>
<string name="review_copyright_no_button_text">Pare bine</string>
<string name="review_thanks_yes_button_text">Da, de ce nu</string>
<string name="review_thanks_no_button_text">Următoarea imagine</string>
<plurals name="receiving_shared_content" fuzzy="true">
<item quantity="one">Primirea conținutului partajat. Procesarea imaginii poate dura ceva timp, în funcție de dimensiunea imaginii și a dispozitivului dvs. </item>
<item quantity="other"> Primirea conținutului partajat. Procesarea imaginilor poate dura ceva timp, în funcție de mărimea imaginilor și a dispozitivului</item>
<string name="skip_image_explanation">Dacă faceți click pe acest buton vă va oferi o altă imagine încărcată recent de pe Wikimedia Commons</string>
<string name="review_image_explanation">Puteți revizui imaginile și îmbunătăți calitatea Wikimedia Commons.\n Cei patru parametri ai revizuirii sunt:\n - Această imagine este în scopul de aplicare?\n - Această imagine respectă regulile dreptului de autor?\n - Această imagine este corect clasificată?\n - Dacă totul merge bine, puteți, de asemenea, să îi mulțumiți contribuitorului.</string>
<plurals name="receiving_shared_content">
<item quantity="one">Primirea de conținut partajat. Prelucrarea imaginii poate dura ceva timp, în funcție de dimensiunea imaginii și de dispozitivul dvs.</item>
<item quantity="few">Primirea de conținut partajat. Prelucrarea imaginilor poate dura ceva timp, în funcție de dimensiunea imaginilor și de dispozitivul dvs.</item>
<item quantity="other"/>
</plurals>
<string name="no_image">Nu s-au folosit imagini</string>
<string name="no_image_reverted">Nici o imagine nu a fost anulată</string>
<string name="no_image_uploaded">Nu au fost încărcate imagini</string>
<string name="no_notification">Nu aveți notificări necitite</string>
<string name="no_read_notification">Nu aveți notificări de citit</string>
<string name="share_logs_using">Distribuiți jurnalele folosind</string>
<string name="menu_option_read">Vezi citit</string>
<string name="menu_option_unread">Vezi necitit</string>
<string name="error_occurred_in_picking_images">A apărut o eroare la alegerea imaginilor</string>
<string name="image_chooser_title">Alegeți Imagini de încărcat</string>
<string name="please_wait">Vă rugăm să așteptați ...</string>
<string name="images_featured_explanation">Imaginile de Calitate sunt imagini ale unor fotografi și ilustratori de înaltă calificare, pe care comunitatea Wikimedia Commons a ales-o ca fiind de cea mai înaltă calitate pe site.</string>
<string name="images_via_nearby_explanation">Imaginile Încărcate prin Locurile din Apropiere sunt imaginile care sunt încărcate prin descoperirea locurilor de pe hartă.</string>
<string name="thanks_received_explanation">Această caracteristică permite editorilor să trimită o notificare de Mulțumire utilizatorilor care fac modificări utile - folosind un mic link de mulțumire pe pagina istoric sau pe pagina dif.</string>
<string name="previous_image_caption_description">Copiați legendele și descrierea anterioară</string>
<string name="previous_button_tooltip_message">Faceți click pentru a reutiliza titlul și descrierea introdusă în imaginea anterioară și modificați-l pentru a se potrivi cu cel actual</string>
<string name="welcome_do_upload_content_description">Exemple de imagini bune de încărcat pe Commons</string>
<string name="welcome_dont_upload_content_description">Exemple de imagini care nu trebuie încărcate</string>
<string name="skip_image">Săriți această imagine</string>
<string name="download_failed_we_cannot_download_the_file_without_storage_permission">Descarcare Eşuată!!. Nu putem descărca fișierul fără permisiunea de stocare externă.</string>
<string name="manage_exif_tags">Gestionați etichetele EXIF</string>
<string name="manage_exif_tags_summary">Selectați ce etichete EXIF de păstrat în încărcări</string>
<string name="exif_tag_name_author">Autor</string>
<string name="exif_tag_name_copyright">Drepturi de autor</string>
<string name="exif_tag_name_location">Locația</string>
<string name="exif_tag_name_cameraModel">Model Cameră</string>
<string name="exif_tag_name_lensModel">Model Lentilă</string>
<string name="exif_tag_name_serialNumbers">Numere Serie</string>
<string name="exif_tag_name_software">Software</string>
<string name="share_text">Încărcați fotografii pe Wikimedia Commons direct de pe telefon. Descărcați aplicația Commons acum: %1$s</string>
<string name="share_via">Partajează aplicația prin ...</string>
<string name="image_info">Informații despre imagine</string>
<string name="no_categories_found">Nu s-au găsit categorii</string>
<string name="no_depiction_found">Nu s-au Găsit Reprezentări</string>
<string name="upload_cancelled">Încărcare anulată</string>
<string name="previous_image_title_description_not_found">Nu există date pentru titlul sau descrierea imaginii anterioare</string>
<string name="dialog_box_text_nomination">De ce trebuie șterse %1$s?</string>
<string name="review_is_uploaded_by">%1$s este încărcat de: %2$s</string>
<string name="default_description_language">Limbă de descriere implicită</string>
<string name="delete_helper_make_deletion_toast">Încercați să nominalizați %1$s pentru ștergere</string>
<string name="delete_helper_show_deletion_title">Nominalizare pentru ștergere</string>
<string name="delete_helper_show_deletion_title_success">Succes</string>
<string name="delete_helper_show_deletion_message_if">Nominalizat %1$s pentru ștergere.</string>
<string name="delete_helper_show_deletion_title_failed">Eșuat</string>
<string name="delete_helper_show_deletion_message_else">Nu s-a putut solicita ștergerea.</string>
<string name="delete_helper_ask_spam_selfie">Un selfie</string>
<string name="delete_helper_ask_spam_blurry">În ceață</string>
<string name="delete_helper_ask_spam_nonsense">Prostii</string>
<string name="delete_helper_ask_spam_other">Altele</string>
<string name="delete_helper_ask_reason_copyright_press_photo">Foto din presă</string>
<string name="delete_helper_ask_reason_copyright_internet_photo">Fotografie aleatorie de pe internet</string>
<string name="delete_helper_ask_reason_copyright_logo">Logo</string>
<string name="delete_helper_ask_reason_copyright_other">Altul</string>
<string name="delete_helper_ask_alert_set_positive_button_reason">Pentru că este</string>
<string name="share_image_via">Partajează imaginea prin</string>
<string name="no_achievements_yet">Încă nu ați făcut contribuții</string>
<string name="account_created">Cont creat!</string>
<string name="text_copy">Text copiat în clipboard</string>
<string name="notification_mark_read">Notificare marcată ca citită</string>
<string name="some_error">A fost o eroare!</string>
<string name="place_state">Starea locului:</string>
<string name="place_state_exists">Există</string>
<string name="place_state_needs_photo">Are nevoie de foto</string>
<string name="place_type">Tipul locului:</string>
<string name="nearby_search_hint">Pod, muzeu, hotel etc.</string>
<string name="you_must_reset_your_passsword">Ceva nu a mers corect la autentificare, trebuie să vă resetați parola !!</string>
<string name="title_for_media">MEDIA</string>
<string name="title_for_child_classes">CLASE COPIl</string>
<string name="title_for_parent_classes">CLASE PĂRINTE</string>
<string name="upload_nearby_place_found_title">Locație Găsită în Apropiere</string>
<string name="upload_nearby_place_found_description">Este o fotografie a Locului %1$s?</string>
<string name="title_app_shortcut_explore">Explorează</string>
<string name="title_app_shortcut_bookmark">Semne de carte</string>
<string name="title_app_shortcut_setting">Setări</string>
<string name="remove_bookmark">Eliminat din semne de carte</string>
<string name="add_bookmark">Adăugat la semne de carte</string>
<string name="wallpaper_set_unsuccessfully">Ceva n-a mers bine. Imposibil de setat imaginea de fundal</string>
<string name="setting_wallpaper_dialog_title">Setează ca Imagine de fundal</string>
<string name="setting_wallpaper_dialog_message">Setează Imaginea de fundal. Te rog aşteaptă…</string>
<string name="theme_default_name">Urmăriți sistemul</string>
<string name="theme_dark_name">Întunecat</string>
<string name="theme_light_name">Deschis</string>
<string name="cannot_open_location_settings">Eroare la deschiderea setărilor locației. Vă rugăm să activați locația manual</string>
<string name="recommend_high_accuracy_mode">Pentru cele mai bune rezultate, alegeți modul de Înaltă precizie.</string>
<string name="ask_to_turn_location_on">Activați locația?</string>
<string name="nearby_needs_location">În apropiere este nevoie de locația activată pentru a funcționa corect</string>
<string name="use_location_from_similar_image">Ai fotografiat aceste două poze în același loc? Doriți să folosiți latitudinea/longitudinea imaginii din dreapta?</string>
<string name="load_more">Încarcă mai mult</string>
<string name="nearby_no_results">Nu s-au găsit locuri, încercați să schimbați criteriile de căutare.</string>
</resources>

View file

@ -79,6 +79,7 @@
<string name="share_title_hint">Подпись (Обязательна)</string>
<string name="add_caption_toast">Пожалуйста, укажите название этого файла</string>
<string name="share_description_hint">Описание</string>
<string name="share_caption_hint">Подпись (не более 255 символов)</string>
<string name="login_failed_network">Не удаётся войти — сбой сети</string>
<string name="login_failed_wrong_credentials">Не удаётся войти — проверьте ваше имя пользователя и пароль</string>
<string name="login_failed_throttled">Слишком много неудачных попыток. Пожалуйста, попробуйте ещё раз через несколько минут.</string>
@ -210,6 +211,7 @@
<string name="upload">Загрузить</string>
<string name="yes">Да</string>
<string name="no">Нет</string>
<string name="media_detail_caption">Подпись</string>
<string name="media_detail_title">Название</string>
<string name="media_detail_description">Описание</string>
<string name="media_detail_discussion">Обсуждение</string>
@ -272,6 +274,7 @@
<string name="error_while_cache">Ошибка при кэшировании картинок</string>
<string name="title_info">Уникальное описание, которое будет сохранено как имя файла. Вы можете использовать естественный язык, разделяя слова пробелами. Пожалуйста, не указывайте расширение файла.</string>
<string name="description_info">Пожалуйста, подробно опишите загружаемый файл: где он был снят? что на нём изображено? каков его контекст? Пожалуйста опишите изображённых персон или объекты. Добавьте информацию, о которой нельзя легко догадаться, например, время суток, когда снимался файл. Если снято что-то необычное, постарайтесь пояснить, что именно в этом необычного.</string>
<string name="caption_info">Пожалуйста, напишите краткое описание изображения (не более 255 символов).</string>
<string name="upload_image_too_dark">Это изображение слишком тёмное. Вы уверены, что хотите его загрузить? Викисклад подходит только для изображений, имеющих энциклопедическую ценность.</string>
<string name="upload_image_blurry">Это изображение размыто. Вы уверены, что хотите его загрузить? Викисклад подходит только для изображений, имеющих энциклопедическую ценность.</string>
<string name="upload_problem_exist">Потенциальные проблемы с этим изображением:</string>
@ -281,6 +284,7 @@
<string name="upload_problem_different_geolocation">Это изображение было сделано в другом месте.</string>
<string name="upload_problem_fbmd">Пожалуйста, загружайте только те изображения, которые были сделаны вами. Не загружайте изображений, которые вы нашли в Фейсбуке.</string>
<string name="upload_problem_do_you_continue">Всё равно желаете загрузить это изображение?</string>
<string name="upload_problem_image">Проблемы, найденные в изображении</string>
<string name="internet_downloaded">Пожалуйста, загружайте только те изображения, которые были сделаны вами. Не загружайте изображений, которые вы скачали из Интернета.</string>
<string name="give_permission">Разрешить</string>
<string name="use_external_storage">Использовать внешний носитель</string>
@ -610,5 +614,7 @@
<string name="recommend_high_accuracy_mode">Для достижения наилучших результатов выберите режим высокой точности.</string>
<string name="ask_to_turn_location_on">Включить местоположение?</string>
<string name="nearby_needs_location">Рядом необходимо, чтобы местоположение было включено для правильной работы.</string>
<string name="use_location_from_similar_image">Вы снимали эти две фотографии в одном месте? Хотите использовать широту/долготу изображения справа?</string>
<string name="load_more">Загрузить ещё</string>
<string name="nearby_no_results">Мест не найдено, попытайтесь изменить критерии поиска.</string>
</resources>

View file

@ -598,5 +598,6 @@
<string name="ask_to_turn_location_on">Aktivera plats?</string>
<string name="nearby_needs_location">I närheten behöver ha plats aktiverat för att fungera ordentligt</string>
<string name="use_location_from_similar_image">Tog du dessa två bilder på samma plats? Vill du använda den högra bildens latitud/longitud?</string>
<string name="load_more">Läs in fler</string>
<string name="nearby_no_results">Inga platser hittades, försök ändra dina sökkriterier.</string>
</resources>

View file

@ -610,5 +610,6 @@
<string name="ask_to_turn_location_on">Konum açılsın mı?</string>
<string name="nearby_needs_location">Yakınımdakilerin düzgün çalışması için konumun açık olması gerekiyor</string>
<string name="use_location_from_similar_image">Bu iki fotoğrafı aynı yerde mi çektiniz? Sağdaki resmin enlem/boylamını kullanmak ister misiniz?</string>
<string name="load_more">Daha Fazla Yükle</string>
<string name="nearby_no_results">Yer bulunamadı, arama kriterlerinizi değiştirmeyi deneyin.</string>
</resources>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Authors:
* Candalua
* Fierodelveneto
-->
<resources>
@ -48,8 +49,10 @@
<string name="provider_contributions">I me cargamenti</string>
<string name="menu_share">Spartisi in jiro</string>
<string name="menu_open_in_browser">Varda sol navegadore web</string>
<string name="share_title_hint" fuzzy="true">Titoło (obligatorio)</string>
<string name="share_title_hint">Didascalia (obligatorio)</string>
<string name="add_caption_toast">Par piaser, daghe na didascalia a sto file</string>
<string name="share_description_hint">Descrision</string>
<string name="share_caption_hint">Didascalia (màsimo 255 caràteri)</string>
<string name="login_failed_network">No xé posibiłe ndarghe drento - erore de rete</string>
<string name="login_failed_wrong_credentials">Entrada no riusia - Daghe na ociada al nome utente e ciave</string>
<string name="login_failed_throttled">Masa volte te ghè provà. Riprova tra on fià de minudi.</string>
@ -62,6 +65,7 @@
<string name="provider_modifications">Modifeghe</string>
<string name="menu_upload_single">Carga</string>
<string name="categories_search_text_hint">Serca łe categorie</string>
<string name="depicts_search_text_hint">Serca le robe che se vede nel to file (le montagne, el Taj Mahal, ec.)</string>
<string name="menu_save_categories">Salva</string>
<string name="refresh_button">Ajorna</string>
<string name="display_list_button">Lista</string>
@ -82,6 +86,7 @@
<item quantity="other">%1$d cargamenti</item>
</plurals>
<string name="categories_not_found">No ła xé sta catada na categoria che ła contegna %1$s</string>
<string name="depictions_not_found">No gò catà nisun elemento Wikidata che corisponda a %1$s</string>
<string name="categories_skip_explanation">Xonta categorie par far sì che łe to someje e imajini łe sia pì façilmente riçercae so Wikimedia Commons.\nScumisia a dijitare par xontare categorie.</string>
<string name="categories_activity_title">Categorie</string>
<string name="title_activity_settings">Inpostasion</string>
@ -562,4 +567,6 @@
<string name="ask_to_turn_location_on">Ativar ła poxision?</string>
<string name="nearby_needs_location">La locałixasion n\'te łe viçinanse ła ga da esare inpisada parché ła funsionee in modo justo.</string>
<string name="use_location_from_similar_image">Ste do foto łe gheto fate in tel steso posto? Vuto doparar ła stesa latitudine/lonxitudine de l\'imajine a drita?</string>
<string name="load_more">Carga \'ncora</string>
<string name="nearby_no_results">No go catà nisun posto, pròa a canbiar la to riserca.</string>
</resources>

View file

@ -603,5 +603,6 @@
<string name="ask_to_turn_location_on">打開位置?</string>
<string name="nearby_needs_location">附近功能需要啟用位置才能運作正常</string>
<string name="use_location_from_similar_image">您是否在同一地點拍攝了這兩張圖片?您要使用圖片右側的緯度/經度嗎?</string>
<string name="load_more">載入更多</string>
<string name="nearby_no_results">查無地點,請嘗試更改您的搜尋條件。</string>
</resources>

View file

@ -14,6 +14,7 @@
* Looong
* Qiyue2001
* Shizhao
* SomeyaMako
* VulpesVulpes825
* Wxyveronica
* Yfdyh000
@ -577,4 +578,5 @@
<string name="wallpaper_set_unsuccessfully">出错了。无法设置壁纸</string>
<string name="setting_wallpaper_dialog_title">设为壁纸</string>
<string name="setting_wallpaper_dialog_message">正在设置壁纸。请稍等…</string>
<string name="load_more">加载更多</string>
</resources>

View file

@ -1,5 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="uploads_pending_notification_indicator">
<item quantity="one">%1$d file uploading</item>
<item quantity="other">%1$d files uploading</item>
</plurals>
<plurals name="contributions_subtitle">
<!--zero is not used in english. Category mentioned here for easy reference in future-->
<item quantity="zero">@string/contributions_subtitle_zero</item>
<item quantity="one">(%1$d)</item>
<item quantity="other">(%1$d)</item>
</plurals>
<plurals name="starting_multiple_uploads">
<item quantity="one">Starting %1$d upload</item>
<item quantity="other">Starting %1$d uploads</item>
</plurals>
<plurals name="multiple_uploads_title">
<item quantity="one">%1$d upload</item>
<item quantity="other">%1$d uploads</item>
</plurals>
<plurals name="share_license_summary">
<item quantity="one">This image will be licensed under %1$s</item>
<item quantity="other">These images will be licensed under %1$s</item>
</plurals>
<plurals name="upload_count_title">
<item quantity="one">%1$d Upload</item>
<item quantity="other">%1$d Uploads</item>
</plurals>
<plurals name="receiving_shared_content">
<item quantity="one">Receiving shared content. Processing the image might take some time depending on the size of the image and your device</item>
<item quantity="other">Receiving shared content. Processing the images might take some time depending on the size of the images and your device</item>
</plurals>
<string name="title_activity_explore">Explore</string>
<string name="navigation_item_explore">Explore</string>
<string name="preference_category_appearance">Appearance</string>
@ -31,10 +61,6 @@
<string name="upload_progress_notification_title_finishing">Finishing uploading %1$s</string>
<string name="upload_failed_notification_title">Uploading %1$s failed</string>
<string name="upload_failed_notification_subtitle">Tap to view</string>
<plurals name="uploads_pending_notification_indicator">
<item quantity="one">%1$d file uploading</item>
<item quantity="other">%1$d files uploading</item>
</plurals>
<string name="title_activity_contributions">My Recent Uploads</string>
<string name="contribution_state_queued">Queued</string>
<string name="contribution_state_failed">Failed</string>
@ -69,20 +95,6 @@
<string name="gps_disabled">GPS is disabled in your device. Would you like to enable it?</string>
<string name="enable_gps">Enable GPS</string>
<string name="contributions_subtitle_zero">No uploads yet</string>
<plurals name="contributions_subtitle">
<!--zero is not used in english. Category mentioned here for easy reference in future-->
<item quantity="zero">@string/contributions_subtitle_zero</item>
<item quantity="one">(%1$d)</item>
<item quantity="other">(%1$d)</item>
</plurals>
<plurals name="starting_multiple_uploads">
<item quantity="one">Starting %1$d upload</item>
<item quantity="other">Starting %1$d uploads</item>
</plurals>
<plurals name="multiple_uploads_title">
<item quantity="one">%1$d upload</item>
<item quantity="other">%1$d uploads</item>
</plurals>
<string name="categories_not_found">No categories matching %1$s found</string>
<string name="depictions_not_found">No Wikidata items matching %1$s found</string>
<string name="no_child_classes">%1$s has no child classes</string>
@ -110,10 +122,6 @@
<string name="no_uploads_yet">You have not yet uploaded any photos.</string>
<string name="menu_retry_upload">Retry</string>
<string name="menu_cancel_upload">Cancel</string>
<plurals name="share_license_summary">
<item quantity="one">This image will be licensed under %1$s</item>
<item quantity="other">These images will be licensed under %1$s</item>
</plurals>
<string name="media_upload_policy">By submitting this picture, I declare that this is my own work, that it does not contain copyrighted material or selfies, and otherwise adheres to &lt;a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\"&gt;Wikimedia Commons policies&lt;/a&gt;.</string>
<string name="menu_download">Download</string>
<string name="preference_license">Default License</string>
@ -254,9 +262,9 @@
<string name="title_info">A unique descriptive title for the file, which will serve as a filename. You may use plain language with spaces. Do not include the file extension</string>
<string name="description_info">Please describe the media as much as possible: Where was it taken? What does it show? What is the context? Please describe the objects or persons. Reveal information that can not be easily guessed, for instance the time of day if it is a landscape. If the media shows something unusual, please explain what makes it unusual.</string>
<string name="caption_info">Please write a brief description of the image. (Limit to 255 characters)</string>
<string name="upload_image_too_dark">This picture is too dark, are you sure you want to upload it? Wikimedia Commons is only for pictures with encyclopedic value.</string>
<string name="upload_image_blurry">This picture is blurry, are you sure you want to upload it? Wikimedia Commons is only for pictures with encyclopedic value.</string>
<string name="upload_problem_exist">Potential problems with this image:</string>
<string name="upload_problem_image_dark">Image is too dark.</string>
<string name="upload_problem_image_blurry">Image is blurry.</string>
@ -264,10 +272,10 @@
<string name="upload_problem_different_geolocation">This picture was taken at a different location.</string>
<string name="upload_problem_fbmd">Please only upload pictures that you have taken by yourself. Don\'t upload pictures that you have found on other people\'s Facebook accounts.</string>
<string name="upload_problem_do_you_continue">Do you still want to upload this picture?</string>
<string name="upload_problem_image">Problems found in image</string>
<string name="internet_downloaded">Please only upload pictures that you have taken by yourself. Don\'t upload pictures that you have downloaded from the Internet.</string>
<string name="give_permission">Give permission</string>
<string name="use_external_storage">Use external storage</string>
<string name="use_external_storage_summary">Save pictures taken with the in-app camera on your device</string>
@ -287,15 +295,15 @@
<string name="skip_login_title">Do you really want to skip login?</string>
<string name="skip_login_message">You would have to log in to upload pictures in the future.</string>
<string name="login_alert_message">Please log in to use this feature</string>
<string name="copy_wikicode">Copy the wikitext to the clipboard</string>
<string name="wikicode_copied">The wikitext was copied to the clipboard</string>
<string name="nearby_location_has_not_changed">Location has not changed.</string>
<string name="nearby_location_not_available">Nearby might not work properly, Location not available.</string>
<string name="location_permission_rationale_nearby">Permission required to display a list of nearby places</string>
<string name="get_directions">Get directions</string>
<string name="read_article">Read article</string>
<string formatted="false" name="notifications_welcome">Welcome to Wikimedia Commons, %1$s! We\'re glad you\'re here.</string>
<string name="notifications_talk_page_message">%1$s left a message on your talk page</string>
<string name="notifications_thank_you_edit">Thank you for making an edit</string>
@ -318,18 +326,18 @@
<string name="about_translate_title">Languages</string>
<string name="about_translate_message">Select the language that you would like to submit translations for</string>
<string name="about_translate_proceed">Proceed</string>
<string name="about_translate_cancel">Cancel</string>
<string name="retry">Retry</string>
<string name="showcase_view_got_it_button">Got it!</string>
<string name="showcase_view_whole_nearby_activity">These are the places near you that need pictures to illustrate their Wikipedia articles.\n\nClicking on \'SEARCH THIS AREA\' locks the map and launches a nearby search around that location.</string>
<string name="showcase_view_list_icon">Tapping this button brings up a list of these places</string>
<string name="showcase_view_plus_fab">You can upload a picture for any place from your gallery or camera</string>
<string name="no_images_found">No images found!</string>
<string name="error_loading_images">Error occurred while loading images.</string>
<string name="image_uploaded_by">Uploaded by: %1$s</string>
<string name="block_notification_title">Blocked</string>
<string name="block_notification">You are blocked from editing Commons</string>
<string name="appwidget_img">Pic of the Day</string>
@ -346,9 +354,9 @@
<string name="search_tab_title_media">Media</string>
<string name="search_tab_title_categories">Categories</string>
<string name="search_tab_title_depictions">Items</string>
<string name="explore_tab_title_featured">Featured</string>
<string name="explore_tab_title_mobile">Uploaded via mobile</string>
<string name="successful_wikidata_edit">Image added to %1$s on Wikidata!</string>
<string name="wikidata_edit_failure">Failed to update corresponding Wikidata entity!</string>
<string name="menu_set_wallpaper">Set as wallpaper</string>
@ -375,16 +383,16 @@
<string name="quiz_screenshot_question">Is this screenshot OK to upload?</string>
<string name="share_app_title">Share App</string>
<string name="share_coordinates_not_present">Coordinates were not specified during image selection</string>
<string name="error_fetching_nearby_places">Error fetching nearby places.</string>
<string name="add_description">+ Add description</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_search_dialog">Do you want to delete this search?</string>
<string name="search_history_deleted">Search history deleted</string>
<string name="nominate_delete">Nominate For Deletion</string>
<string name="delete">Delete</string>
<string name="Achievements">Achievements</string>
<string name="statistics">Statistics</string>
<string name="statistics_thanks">Thanks Received</string>
@ -398,12 +406,12 @@
<string name="achievements_info_message">Your level increases as you meet these requirements. Items in the "statistics" section do not count towards your level.</string>
<string name="achievements_revert_limit_message">minimum required: </string>
<string name="images_uploaded_explanation">The number of images you have uploaded to Commons, via any upload software</string>
<string name="images_reverted_explanation">The percentage of images you have uploaded to Commons that were not deleted</string>
<string name="images_used_explanation">The number of images you have uploaded to Commons that were used in Wikimedia articles</string>
<string name="error_occurred">Error occurred!</string>
<string name="notifications_channel_name_all">Commons Notification</string>
<string name="preference_author_name_toggle">Use custom author name</string>
<string name="preference_author_name_toggle_summary">Use a custom author name instead of your username while uploading photos</string>
<string name="preference_author_name">Custom author name</string>
@ -413,24 +421,20 @@
<string name="read_notifications">Notifications (read)</string>
<string name="display_nearby_notification">Display nearby notification</string>
<string name="display_nearby_notification_summary">Tap here to see the nearest place that needs pictures</string>
<string name="no_close_nearby">No nearby places found close to you</string>
<string name="list_sheet">List</string>
<string name="storage_permission">Storage Permission</string>
<string name="write_storage_permission_rationale_for_image_share">We need your permission to access the external storage of your device in order to upload images.</string>
<string name="nearby_notification_dismiss_message">You won\'t see the nearest place that needs pictures anymore. However, you can re-enable this notification in Settings if you wish.</string>
<string name="step_count">Step %1$d of %2$d</string>
<string name="image_in_set_label">Image %1$d in set</string>
<string name="next">Next</string>
<string name="previous">Previous</string>
<string name="submit">Submit</string>
<string name="upload_title_duplicate" formatted="true">A file with the file name %1$s exists. Are you sure you want to proceed?</string>
<string formatted="true" name="upload_title_duplicate">A file with the file name %1$s exists. Are you sure you want to proceed?</string>
<string name="map_application_missing">No compatible map application could be found on your device. Please install a map application to use this feature.</string>
<plurals name="upload_count_title">
<item quantity="one">%1$d Upload</item>
<item quantity="other">%1$d Uploads</item>
</plurals>
<string name="navigation_item_bookmarks">Bookmarks</string>
<string name="title_activity_bookmarks">Bookmarks</string>
<string name="title_page_bookmarks_pictures">Pictures</string>
@ -439,32 +443,32 @@
<string name="provider_bookmarks">Bookmarks</string>
<string name="bookmark_empty">You haven\'t added any bookmarks</string>
<string name="provider_bookmarks_location">Bookmarks</string>
<string name="log_collection_started">Log collection started. Please RESTART the app, perform action that you wish to log, and then tap \'Send log file\' again</string>
<string name="log_collection_started">Log collection started. Please RESTART the app, perform action that you wish to log, and then tap \'Send log file\' again</string>
<string name="deletion_reason_uploaded_by_mistake">I uploaded it by mistake</string>
<string name="deletion_reason_publicly_visible">I did not know it would be publicly visible</string>
<string name="deletion_reason_bad_for_my_privacy">I realized it is bad for my privacy</string>
<string name="deletion_reason_no_longer_want_public">I changed my mind, I don\'t want it to be publicly visible anymore</string>
<string name="deletion_reason_not_interesting">Sorry this picture is not interesting for an encyclopedia</string>
<string name="uploaded_by_myself">Uploaded by myself on %1$s, used in %2$d article(s).</string>
<string name="no_uploads">Welcome to Commons!\n
Upload your first media by tapping on the add button.</string>
<string name="desc_language_Worldwide">Worldwide</string>
<string name="desc_language_America">America</string>
<string name="desc_language_Europe">Europe</string>
<string name="desc_language_Middle_East">Middle East</string>
<string name="desc_language_Africa">Africa</string>
<string name="desc_language_Asia">Asia</string>
<string name="desc_language_Pacific">Pacific</string>
<string name="no_categories_selected">No Categories Selected</string>
<string name="no_categories_selected_warning_desc">Images without categories are rarely usable. Are you sure you want to continue without selecting categories?</string>
<string name="no_depictions_selected">No Depictions Selected</string>
<string name="no_depictions_selected_warning_desc">Images with depictions are more easily found and more likely to be used. Are you sure you want to continue without selecting depictions?</string>
<string name="no_depictions_selected_warning_desc">Images with depictions are more easily found and more likely to be used. Are you sure you want to continue without selecting depictions?</string>
<string name="upload_flow_all_images_in_set">(For all images in set)</string>
<string name="search_this_area">Search this area</string>
<string name="nearby_card_permission_title">Permission Request</string>
@ -478,15 +482,15 @@ Upload your first media by tapping on the add button.</string>
<string name="ends_on">Ends on:</string>
<string name="display_campaigns">Display campaigns</string>
<string name="display_campaigns_explanation">See the ongoing campaigns</string>
<string name="nearby_campaign_dismiss_message">You won\'t see the campaigns anymore. However, you can re-enable this notification in Settings if you wish.</string>
<string name="nearby_campaign_dismiss_message">You won\'t see the campaigns anymore. However, you can re-enable this notification in Settings if you wish.</string>
<string name="this_function_needs_network_connection">This function requires network connection, please check your connection settings.</string>
<string name="bad_token_error_proposed_solution">Upload failed due to issues with edit token. Please try logging out and in again. </string>
<string name="error_processing_image">Error occurred while processing the image. Please try again!</string>
<string name="error_processing_image">Error occurred while processing the image. Please try again!</string>
<string name="getting_edit_token">Getting token for editing</string>
<string name="check_category_adding_template">Adding template for category check</string>
<string name="check_category_notification_title">Requesting category check for %1$s</string>
<string name="check_category_edit_summary">Requesting category check</string>
<string name="check_category_edit_summary">Requesting category check</string>
<string name="check_category_success_title">Category check requested</string>
<string name="check_category_failure_title">Category check request didn\'t work</string>
<string name="check_category_success_message">Requested category check for %1$s</string>
@ -498,14 +502,14 @@ Upload your first media by tapping on the add button.</string>
<string name="nominate_for_deletion_edit_deletion_request_log">Adding file to Delete requests log</string>
<string name="nominate_for_deletion_create_deletion_request">Creating Delete requests subpage</string>
<string name="notsure">Not sure</string>
<string name="send_thank_success_title">Sending Thanks: Success</string>
<string name="send_thank_success_title">Sending Thanks: Success</string>
<string name="send_thank_success_message">Successfully sent thanks to %1$s</string>
<string name="send_thank_failure_message">Failed to send thanks %1$s</string>
<string name="send_thank_failure_title">Sending Thanks: Failure</string>
<string name="send_thank_send">Sending thanks</string>
<string name="send_thank_notification_title">Sending thanks</string>
<string name="send_thank_toast">Sending Thanks for %1$s</string>
<string name="send_thank_toast">Sending Thanks for %1$s</string>
<string name="review_copyright">Does this follow the rules of copyright?</string>
<string name="review_category">Is this correctly categorized?</string>
<string name="review_spam">Is this in-scope?</string>
@ -517,21 +521,17 @@ Upload your first media by tapping on the add button.</string>
<string name="review_category_explanation">This image is under %1$s categories.</string>
<string name="review_spam_report_question">It is out of scope because it is</string>
<string name="review_c_violation_report_question">It is copyright violation because it is </string>
<string name="review_category_yes_button_text">No, mis-categorized</string>
<string name="review_category_no_button_text">Seems fine</string>
<string name="review_spam_yes_button_text">No, out of scope</string>
<string name="review_spam_no_button_text">Seems fine</string>
<string name="review_copyright_yes_button_text">No, copyright violation</string>
<string name="review_copyright_no_button_text">Seems fine</string>
<string name="review_thanks_yes_button_text">Yes, why not</string>
<string name="review_thanks_no_button_text">Next image</string>
<string name="skip_image_explanation">Clicking this button will give you another recently uploaded image from Wikimedia Commons</string>
<string name="review_image_explanation">You can review images and improve the quality of Wikimedia Commons.\n The four parameters of review are: \n - Is this image in-scope? \n - Does this image follow the rules of copyright? \n - Is this image correctly categorized? \n - If all goes well you can also thank the contributor.</string>
<string name="review_category_yes_button_text">No, mis-categorized</string>
<string name="review_category_no_button_text">Seems fine</string>
<string name="review_spam_yes_button_text">No, out of scope</string>
<string name="review_spam_no_button_text">Seems fine</string>
<string name="review_copyright_yes_button_text">No, copyright violation</string>
<string name="review_copyright_no_button_text">Seems fine</string>
<string name="review_thanks_yes_button_text">Yes, why not</string>
<string name="review_thanks_no_button_text">Next image</string>
<string name="skip_image_explanation">Clicking this button will give you another recently uploaded image from Wikimedia Commons</string>
<plurals name="receiving_shared_content">
<item quantity="one">Receiving shared content. Processing the image might take some time depending on the size of the image and your device</item>
<item quantity="other">Receiving shared content. Processing the images might take some time depending on the size of the images and your device</item>
</plurals>
<string name="review_image_explanation">You can review images and improve the quality of Wikimedia Commons.\n The four parameters of review are: \n - Is this image in-scope? \n - Does this image follow the rules of copyright? \n - Is this image correctly categorized? \n - If all goes well you can also thank the contributor.</string>
<string name="no_image">No images used</string>
<string name="no_image_reverted">No images reverted</string>
@ -549,7 +549,7 @@ Upload your first media by tapping on the add button.</string>
<string name="please_wait">Please wait…</string>
<string name="images_featured_explanation">Featured pictures are images from highly skilled photographers and illustrators that the Wikimedia Commons community has chosen as some of the highest quality on the site.</string>
<string name="images_via_nearby_explanation">Images Uploaded via Nearby places are the images which are uploaded by discovering places on the map.</string>
<string name="thanks_received_explanation" >This feature allows editors to send a Thank you notification to users who make useful edits by using a small thank link on the history page or diff page.</string>
<string name="thanks_received_explanation">This feature allows editors to send a Thank you notification to users who make useful edits by using a small thank link on the history page or diff page.</string>
<string name="previous_image_caption_description">Copy previous captions &amp; description</string>
<string name="previous_button_tooltip_message">Click to reuse the title and description you entered in your previous picture and modify it to fit your current one</string>
<string name="welcome_do_upload_content_description">Examples of good images to upload to Commons</string>
@ -630,4 +630,20 @@ Upload your first media by tapping on the add button.</string>
<string name="use_location_from_similar_image">Did you shoot these two pictures at the same place? Do you want to use the latitude/longitude of the picture on the right?</string>
<string name="load_more">Load More</string>
<string name="nearby_no_results">No places found, try changing your search criteria.</string>
<string name="add_picture_to_wikipedia_article_title">Add image to Wikipedia</string>
<string name="add_picture_to_wikipedia_article_desc">Do you want to add this picture to the %1$s language Wikipedia article?</string>
<string name="add_picture_to_wikipedia_instructions_title">Instructions</string>
<string name="add_picture_to_wikipedia_instructions_desc">Take care to follow editing guidelines!</string>
<string name="confirm">Confirm</string>
<string name="instructions_title">Instructions</string>
<string name="wikipedia_instructions_step_1">1. Use the following wikitext:</string>
<string name="wikipedia_instructions_step_2">2. Clicking on Confirm will open the Wikipedia article</string>
<string name="wikipedia_instructions_step_3">3. Find an appropriate section in the article for your image</string>
<string name="wikipedia_instructions_step_4">4. Click on the Edit icon (the one like a pencil) for that section.</string>
<string name="wikipedia_instructions_step_5">5. Paste the wikitext in the appropriate place.</string>
<string name="wikipedia_instructions_step_6">6. Edit the wikitext for appropriate positioning, if necessary. For more information, see &lt;a href="https://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style/Images#How_to_place_an_image"&gt;here&lt;/a&gt;.</string>
<string name="wikipedia_instructions_step_7">7. Publish the article</string>
<string name="copy_wikicode_to_clipboard">Copy wikicode to clipboard</string>
</resources>

View file

@ -1,27 +1,21 @@
package fr.free.nrw.commons.contributions
import android.content.Context
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.nhaarman.mockitokotlin2.*
import fr.free.nrw.commons.Media
import fr.free.nrw.commons.auth.SessionManager
import fr.free.nrw.commons.media.MediaClient
import fr.free.nrw.commons.utils.NetworkUtilsTest
import fr.free.nrw.commons.utils.createMockDataSourceFactory
import io.reactivex.Scheduler
import io.reactivex.Single
import io.reactivex.schedulers.Schedulers
import io.reactivex.schedulers.TestScheduler
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mockito.ArgumentMatchers.*
import org.mockito.InjectMocks
import org.mockito.ArgumentMatchers.anyList
import org.mockito.ArgumentMatchers.anyString
import org.mockito.Mock
import org.mockito.Mockito.mock
import org.mockito.MockitoAnnotations
import java.lang.RuntimeException
import java.util.*
/**
* The unit test class for ContributionBoundaryCallbackTest

View file

@ -6,11 +6,9 @@ import com.nhaarman.mockitokotlin2.whenever
import fr.free.nrw.commons.utils.createMockDataSourceFactory
import io.reactivex.Scheduler
import io.reactivex.Single
import junit.framework.Assert.assertEquals
import org.junit.Before
import org.junit.Test
import org.mockito.*
import org.mockito.Mockito.any
import org.mockito.Mockito.mock
/**

View file

@ -4,6 +4,8 @@ import com.nhaarman.mockitokotlin2.mock
import com.nhaarman.mockitokotlin2.whenever
import fr.free.nrw.commons.Media
import fr.free.nrw.commons.explore.media.MediaConverter
import fr.free.nrw.commons.media.model.PageMediaListItem
import fr.free.nrw.commons.media.model.PageMediaListResponse
import fr.free.nrw.commons.utils.CommonsDateUtil
import io.reactivex.Single
import junit.framework.Assert.*
@ -29,6 +31,10 @@ class MediaClientTest {
@Mock
internal var mediaDetailInterface: MediaDetailInterface? = null
@Mock
internal var pageMediaInterface: PageMediaInterface? = null
@InjectMocks
var mediaClient: MediaClient? = null
@ -228,6 +234,26 @@ class MediaClientTest {
assertEquals("Test", mediaClient!!.getPageHtml("abcde").blockingGet())
}
@Test
fun doesPageContainMedia() {
val mock = mock(PageMediaListResponse::class.java)
whenever(mock.items).thenReturn(listOf<PageMediaListItem>(mock(PageMediaListItem::class.java)))
`when`(pageMediaInterface!!.getMediaList(ArgumentMatchers.anyString()))
.thenReturn(Single.just(mock))
mediaClient!!.doesPageContainMedia("Test").test().assertValue(true)
}
@Test
fun doesPageContainMediaWithNoMedia() {
val mock = mock(PageMediaListResponse::class.java)
whenever(mock.items).thenReturn(listOf<PageMediaListItem>())
`when`(pageMediaInterface!!.getMediaList(ArgumentMatchers.anyString()))
.thenReturn(Single.just(mock))
mediaClient!!.doesPageContainMedia("Test").test().assertValue(false)
}
@Test
fun getPageHtmlTestNull() {
val mockResponse = MwParseResponse()

View file

@ -7,7 +7,7 @@ buildscript {
maven { url "https://plugins.gradle.org/m2/" }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.3'
classpath 'com.android.tools.build:gradle:4.0.0'
classpath "com.hiya:jacoco-android:0.2"
classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.8.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$KOTLIN_VERSION"

View file

@ -138,6 +138,15 @@ public class WikiSite implements Parcelable {
return authorityToMobile(authority());
}
/**
* Get wiki's mobile URL
* Eg. https://en.m.wikipedia.org
* @return
*/
public String mobileUrl() {
return String.format("%1$s://%2$s", scheme(), mobileAuthority());
}
/**
* @return The canonical "desktop" form of the authority. For example, if the authority
* is in a "mobile" form, e.g. en.m.wikipedia.org, this will become en.wikipedia.org.