[GSoC] Added Click to open user profile for leaderboard (#3887)

* Localisation updates from https://translatewiki.net.

* Localisation updates from https://translatewiki.net.

* #3749 Improve MediaClient UnitTests  (#3846)

* #3468 Switch from RvRenderer to AdapterDelegates - replace SearchDepictionsRenderer

* #3468 Switch from RvRenderer to AdapterDelegates - replace UploadCategoryDepictionsRenderer

* #3468 Switch from RvRenderer to AdapterDelegates - update BaseAdapter to be easier to use

* #3468 Switch from RvRenderer to AdapterDelegates - replace SearchImagesRenderer

* #3468 Switch from RvRenderer to AdapterDelegates - replace SearchCategoriesRenderer

* #3468 Switch from RvRenderer to AdapterDelegates - replace NotificationRenderer

* #3468 Switch from RvRenderer to AdapterDelegates - replace UploadDepictsRenderer

* #3468 Switch from RvRenderer to AdapterDelegates - replace PlaceRenderer

* #3756 Convert SearchDepictionsFragment to use Pagination - convert SearchDepictionsFragment

* #3756 Convert SearchDepictionsFragment to use Pagination - fix presenter unit tests now that view is not nullable - fix Category prefix imports

* #3756 Convert SearchDepictionsFragment to use Pagination - test DataSource related classes

* #3756 Convert SearchDepictionsFragment to use Pagination - reset rx scheduler - ignore failing test

* #3760 Convert SearchCategoriesFragment to use Pagination - extract functionality of pagination to base classes - add category pagination

* #3772 Convert SearchImagesFragment to use Pagination  - convert SearchImagesFragment - tidy up showing the empty view - make search fragments show snackbar with appropriate text

* #3772 Convert SearchImagesFragment to use Pagination  - allow viewpager to load more data

* #3760 remove test that got re-added by merge

* #3760 remove duplicate dependency

* #3772 fix compilation

* #3780 Create media using a combination of Entities & MwQueryResult - construct media with an entity - move fields from media down to contribution - move dynamic fields outside of media - remove unused constructors - remove all unnecessary fetching of captions/descriptions - bump database version

* #3808 Construct media objects that depict an item id correctly - use generator to construct media for DepictedImages

* #3810 Convert DepictedImagesFragment to use Pagination - extract common media paging methods - convert to DepictedImages to use pagination

* #3810 Convert DepictedImagesFragment to use Pagination - rename base classes to better reflect usage

* #3810 Convert DepictedImagesFragment to use Pagination - map to empty result with no pages

* #3810 Convert DepictedImagesFragment to use Pagination - align test with returned values

* #3780 Create media using a combination of Entities & MwQueryResult - update wikicode to align with expected behaviour

* #3780 Create media using a combination of Entities & MwQueryResult - replace old site of thumbnail title with most relevant caption

* #3818 Convert SubDepictionListFragment to use Pagination - replace SubDepictionList with Child and Parent Fragments - replace contracts with simple presenter declarations - move classes to appropriate packages - delete unused network models - delete duplicated paging classes

* #3820 Convert CategoryImagesListFragment to use Pagination - replace CategoryImagesListFragment with CategoriesMediaFragment - disallow the construction of media objects without imageinfo

* #3822 Convert SubCategoryImagesListFragment to use Pagination - convert subcategories - add continuation support in category client - rely on interfaces for callbacks of PageableMediaFragments

* #3822 Convert SubCategoryImagesListFragment to use Pagination - convert parent categories - delete list fragment - creat base class to support continuation requests in clients

* #3822 Convert SubCategoryImagesListFragment to use Pagination - add tests for ParentCategoriesDataSource

* #3822 Convert SubCategoryImagesListFragment to use Pagination - remove no longer applicable test

* #3749 Improve MediaClient UnitTests - test rewrite

* #3749 Improve MediaClient UnitTests - align with buildConfig property

* With pause and resume for uploads (#3858)

* With pause and resume for uploads

* Dispose current upload

* Make pause and resume work

* Check stash validity

* With java docs

* minor

* Localisation updates from https://translatewiki.net.

* Localisation updates from https://translatewiki.net.

* Add nearby presenter unit tests  (#3615)

* init the test file

* Add tests to check if searchthisarea button action and checkbox actions are added after initialize test

* Add tests to locked unlocked nearby cases

* Add tests for null cases in updateMapAndList method

* Add test to check which locations are used to populate places, depending to LocationChangeType

* Add tests to test users position is not followed if blue dot (current location marker) is not visible

* Add tests to decide search this area method visibility on camera move

* Add tests for multi filteirng of placetypes

* add tests for single place type selection too

* Add tests to tests search view focus gain and bottom sheet visibilities

* Add tests for SearchCloseToCurrentLocation

* Remove two unneeded getter and setter for isNearbyLocked, use @VisibleForTesting annotation instead

* Add VisibleForTesting annotation to initializeNearbyOperations method so that it will be private by default

* Add missing tests

* Add tests for map updated case and add missing lines those are being tested

* Add some missind method verifications

* Create real latlang objects isntead of spying them

* Use a real presenter object instead of a spy

* Revert nonneeded @VisibleForTest annotations, instead reach via lockUnlock method

* Reduce code repetitions

* Do not call a test from another test method

* Add some more tests

* Fix minor issues

* Hidden categories are not showed in suggested categories (#3853)

* Localisation updates from https://translatewiki.net.

* Clarify that the caption would also be used as the image title (#3876)

The app uses the fist caption as the file title. This should also
be communicated to the user via the info box as they would not be
aware of it otherwise.

* Localisation updates from https://translatewiki.net.

* Added Click event for leaderboard, Fixed #3886

* Fixed Travis

Co-authored-by: translatewiki.net <l10n-bot@translatewiki.net>
Co-authored-by: Seán Mac Gillicuddy <seantheappdev@gmail.com>
Co-authored-by: Vivek Maskara <maskaravivek@gmail.com>
Co-authored-by: neslihanturan <tur.neslihan@gmail.com>
Co-authored-by: Paulina <63326136+PaulinaQuintero@users.noreply.github.com>
Co-authored-by: Kaartic Sivaraam <kaartic.sivaraam@gmail.com>
This commit is contained in:
Madhur Gupta 2020-08-09 20:29:54 +05:30 committed by GitHub
parent bc0b5c05c7
commit baee56e392
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
73 changed files with 1560 additions and 469 deletions

View file

@ -92,8 +92,9 @@ class CategoryClient @Inject constructor(private val categoryInterface: Category
it.query()?.pages() ?: emptyList()
}
.map {
it.map { page -> page.title().replace(CATEGORY_PREFIX, "") }
it.filter {
page -> page.categoryInfo() == null || !page.categoryInfo().isHidden
}.map { page -> page.title().replace(CATEGORY_PREFIX, "") }
}
}
}

View file

@ -32,7 +32,7 @@ public interface CategoryInterface {
* @return
*/
@GET("w/api.php?action=query&format=json&formatversion=2"
+ "&generator=allcategories")
+ "&generator=allcategories&prop=categoryinfo")
Single<MwQueryResponse> searchCategoriesForPrefix(@Query("gacprefix") String prefix,
@Query("gaclimit") int itemLimit, @Query("gacoffset") int offset);

View file

@ -0,0 +1,36 @@
package fr.free.nrw.commons.contributions
import android.os.Parcel
import android.os.Parcelable
import fr.free.nrw.commons.upload.UploadResult
import kotlinx.android.parcel.Parcelize
data class ChunkInfo(
val uploadResult: UploadResult,
val lastChunkIndex: Int
) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readParcelable(UploadResult::class.java.classLoader),
parcel.readInt()
) {
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeParcelable(uploadResult, flags)
parcel.writeInt(lastChunkIndex)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<ChunkInfo> {
override fun createFromParcel(parcel: Parcel): ChunkInfo {
return ChunkInfo(parcel)
}
override fun newArray(size: Int): Array<ChunkInfo?> {
return arrayOfNulls(size)
}
}
}

View file

@ -25,6 +25,7 @@ data class Contribution constructor(
val decimalCoords: String? = null,
var dateCreatedSource: String? = null,
var wikidataPlace: WikidataPlace? = null,
var chunkInfo: ChunkInfo? = null,
/**
* @return array list of entityids for the depictions
*/
@ -36,7 +37,8 @@ data class Contribution constructor(
var mimeType: String? = null,
val localUri: Uri? = null,
var dataLength: Long = 0,
var dateCreated: Date? = null
var dateCreated: Date? = null,
var dateModified: Date? = null
) : Parcelable {
fun completeWith(media: Media): Contribution {
@ -68,6 +70,7 @@ data class Contribution constructor(
const val STATE_FAILED = 1
const val STATE_QUEUED = 2
const val STATE_IN_PROGRESS = 3
const val STATE_PAUSED = 4
/**
* Formatting captions to the Wikibase format for sending labels

View file

@ -10,6 +10,8 @@ import androidx.room.Transaction;
import androidx.room.Update;
import io.reactivex.Completable;
import io.reactivex.Single;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
@Dao
@ -23,7 +25,10 @@ public abstract class ContributionDao {
public Completable save(final Contribution contribution) {
return Completable
.fromAction(() -> saveSynchronous(contribution));
.fromAction(() -> {
contribution.setDateModified(Calendar.getInstance().getTime());
saveSynchronous(contribution);
});
}
@Transaction
@ -67,6 +72,9 @@ public abstract class ContributionDao {
public Completable update(final Contribution contribution) {
return Completable
.fromAction(() -> updateSynchronous(contribution));
.fromAction(() -> {
contribution.setDateModified(Calendar.getInstance().getTime());
updateSynchronous(contribution);
});
}
}

View file

@ -43,6 +43,8 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
ImageButton retryButton;
@BindView(R.id.cancelButton)
ImageButton cancelButton;
@BindView(R.id.pauseResumeButton)
ImageButton pauseResumeButton;
private int position;
@ -93,7 +95,11 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
case Contribution.STATE_IN_PROGRESS:
stateView.setVisibility(View.GONE);
progressView.setVisibility(View.VISIBLE);
imageOptions.setVisibility(View.GONE);
addToWikipediaButton.setVisibility(View.GONE);
pauseResumeButton.setVisibility(View.VISIBLE);
cancelButton.setVisibility(View.GONE);
retryButton.setVisibility(View.GONE);
imageOptions.setVisibility(View.VISIBLE);
final long total = contribution.getDataLength();
final long transferred = contribution.getTransferred();
if (transferred == 0 || transferred >= total) {
@ -102,10 +108,23 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
progressView.setProgress((int) (((double) transferred / (double) total) * 100));
}
break;
case Contribution.STATE_PAUSED:
stateView.setVisibility(View.VISIBLE);
stateView.setText(R.string.paused);
setResume();
progressView.setVisibility(View.GONE);
cancelButton.setVisibility(View.GONE);
retryButton.setVisibility(View.GONE);
pauseResumeButton.setVisibility(View.VISIBLE);
imageOptions.setVisibility(View.VISIBLE);
break;
case Contribution.STATE_FAILED:
stateView.setVisibility(View.VISIBLE);
stateView.setText(R.string.contribution_state_failed);
progressView.setVisibility(View.GONE);
cancelButton.setVisibility(View.VISIBLE);
retryButton.setVisibility(View.VISIBLE);
pauseResumeButton.setVisibility(View.GONE);
imageOptions.setVisibility(View.VISIBLE);
break;
}
@ -187,4 +206,34 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
public void wikipediaButtonClicked() {
callback.addImageToWikipedia(contribution);
}
/**
* Triggers a callback for pause/resume
*/
@OnClick(R.id.pauseResumeButton)
public void onPauseResumeButtonClicked() {
if (pauseResumeButton.getTag().toString().equals("pause")) {
callback.pauseUpload(contribution);
setResume();
} else {
callback.resumeUpload(contribution);
setPaused();
}
}
/**
* Update pause/resume button to show pause state
*/
private void setPaused() {
pauseResumeButton.setImageResource(R.drawable.pause_icon);
pauseResumeButton.setTag(R.string.pause);
}
/**
* Update pause/resume button to show resume state
*/
private void setResume() {
pauseResumeButton.setImageResource(R.drawable.play_icon);
pauseResumeButton.setTag(R.string.resume);
}
}

View file

@ -1,6 +1,7 @@
package fr.free.nrw.commons.contributions;
import static fr.free.nrw.commons.contributions.Contribution.STATE_FAILED;
import static fr.free.nrw.commons.contributions.Contribution.STATE_PAUSED;
import static fr.free.nrw.commons.contributions.MainActivity.CONTRIBUTIONS_TAB_POSITION;
import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween;
@ -454,7 +455,7 @@ public class ContributionsFragment
@Override
public void retryUpload(Contribution contribution) {
if (NetworkUtils.isInternetConnectionEstablished(getContext())) {
if (contribution.getState() == STATE_FAILED && null != uploadService) {
if (contribution.getState() == STATE_FAILED || contribution.getState() == STATE_PAUSED && null != uploadService) {
uploadService.queue(contribution);
Timber.d("Restarting for %s", contribution.toString());
} else {
@ -466,6 +467,15 @@ public class ContributionsFragment
}
/**
* Pauses the upload
* @param contribution
*/
@Override
public void pauseUpload(Contribution contribution) {
uploadService.pauseUpload(contribution);
}
/**
* Replace whatever is in the current contributionsFragmentContainer view with
* mediaDetailPagerFragment, and preserve previous state in back stack. Called when user selects a

View file

@ -78,5 +78,9 @@ public class ContributionsListAdapter extends
void openMediaDetail(int contribution);
void addImageToWikipedia(Contribution contribution);
void pauseUpload(Contribution contribution);
void resumeUpload(Contribution contribution);
}
}

View file

@ -36,6 +36,7 @@ import java.util.Locale;
import javax.inject.Inject;
import javax.inject.Named;
import org.wikipedia.dataclient.WikiSite;
import timber.log.Timber;
/**
* Created by root on 01.06.2018.
@ -90,6 +91,7 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
private final int SPAN_COUNT_PORTRAIT = 1;
@Override
public View onCreateView(
final LayoutInflater inflater, @Nullable final ViewGroup container,
@Nullable final Bundle savedInstanceState) {
@ -192,6 +194,7 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
/**
* Shows welcome message if user has no contributions yet i.e. new user.
*/
@Override
public void showWelcomeTip(final boolean shouldShow) {
noContributionsYet.setVisibility(shouldShow ? VISIBLE : GONE);
}
@ -201,10 +204,12 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
*
* @param shouldShow True when contributions list should be hidden.
*/
@Override
public void showProgress(final boolean shouldShow) {
progressBar.setVisibility(shouldShow ? VISIBLE : GONE);
}
@Override
public void showNoContributionsUI(final boolean shouldShow) {
noContributionsYet.setVisibility(shouldShow ? VISIBLE : GONE);
}
@ -263,6 +268,24 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
});
}
/**
* Pauses the current upload
* @param contribution
*/
@Override
public void pauseUpload(Contribution contribution) {
callback.pauseUpload(contribution);
}
/**
* Resumes the current upload
* @param contribution
*/
@Override
public void resumeUpload(Contribution contribution) {
callback.retryUpload(contribution);
}
/**
* Display confirmation dialog with instructions when the user tries to add image to wikipedia
*
@ -311,6 +334,8 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
void retryUpload(Contribution contribution);
void pauseUpload(Contribution contribution);
void showDetail(int position);
}
}

View file

@ -3,6 +3,7 @@ package fr.free.nrw.commons.contributions;
import androidx.paging.DataSource.Factory;
import io.reactivex.Completable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.inject.Inject;

View file

@ -10,7 +10,7 @@ import fr.free.nrw.commons.contributions.ContributionDao
* The database for accessing the respective DAOs
*
*/
@Database(entities = [Contribution::class], version = 4, exportSchema = false)
@Database(entities = [Contribution::class], version = 5, exportSchema = false)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun contributionDao(): ContributionDao

View file

@ -5,6 +5,7 @@ import androidx.room.TypeConverter;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.contributions.ChunkInfo;
import fr.free.nrw.commons.di.ApplicationlessInjection;
import fr.free.nrw.commons.location.LatLng;
import fr.free.nrw.commons.upload.WikidataPlace;
@ -82,6 +83,16 @@ public class Converters {
return readObjectFromString(wikidataPlace, WikidataPlace.class);
}
@TypeConverter
public static String chunkInfoToString(ChunkInfo chunkInfo) {
return writeObjectToString(chunkInfo);
}
@TypeConverter
public static ChunkInfo stringToChunkInfo(String chunkInfo) {
return readObjectFromString(chunkInfo, ChunkInfo.class);
}
@TypeConverter
public static String depictionListToString(List<DepictedItem> depictedItems) {
return writeObjectToString(depictedItems);

View file

@ -107,21 +107,6 @@ class MediaClient @Inject constructor(
)
}
private fun mediaFromPageAndEntity(pages: List<MwQueryPage>): Single<List<Media>> {
return if (pages.isEmpty())
Single.just(emptyList())
else
getEntities(pages.map { "$PAGE_ID_PREFIX${it.pageId()}" })
.map {
pages.zip(it.entities().values)
.mapNotNull { (page, entity) ->
page.imageInfo()?.let {
mediaConverter.convert(page, entity, it)
}
}
}
}
/**
* Fetches Media object from the imageInfo API
*
@ -141,7 +126,6 @@ class MediaClient @Inject constructor(
fun getPictureOfTheDay(): Single<Media> {
val date = CommonsDateUtil.getIso8601DateFormatShort().format(Date())
return responseMapper(mediaInterface.getMediaWithGenerator("Template:Potd/$date")).map { it.first() }
}
fun getPageHtml(title: String?): Single<String> {
@ -156,7 +140,6 @@ class MediaClient @Inject constructor(
mediaDetailInterface.getEntity(entityIds.joinToString("|"))
}
fun doesPageContainMedia(title: String?): Single<Boolean> {
return pageMediaInterface.getMediaList(title)
.map { it.items.isNotEmpty() }
@ -175,4 +158,19 @@ class MediaClient @Inject constructor(
it.query()?.pages() ?: emptyList()
}.flatMap(::mediaFromPageAndEntity)
}
private fun mediaFromPageAndEntity(pages: List<MwQueryPage>): Single<List<Media>> {
return if (pages.isEmpty())
Single.just(emptyList())
else
getEntities(pages.map { "$PAGE_ID_PREFIX${it.pageId()}" })
.map {
pages.zip(it.entities().values)
.mapNotNull { (page, entity) ->
page.imageInfo()?.let {
mediaConverter.convert(page, entity, it)
}
}
}
}
}

View file

@ -6,6 +6,8 @@ public class LeaderboardConstants {
public static final int START_OFFSET = 0;
public static final String USER_LINK_PREFIX = "https://commons.wikimedia.org/wiki/User:";
public final static String LOADING = "Loading";
public final static String LOADED = "Loaded";

View file

@ -1,5 +1,7 @@
package fr.free.nrw.commons.profile.leaderboard;
import static fr.free.nrw.commons.profile.leaderboard.LeaderboardConstants.USER_LINK_PREFIX;
import android.content.Context;
import android.net.Uri;
import android.view.LayoutInflater;
@ -11,6 +13,7 @@ import androidx.paging.PagedListAdapter;
import androidx.recyclerview.widget.RecyclerView;
import com.facebook.drawee.view.SimpleDraweeView;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
public class LeaderboardListAdapter extends PagedListAdapter<LeaderboardList, LeaderboardListAdapter.ListViewHolder> {
@ -73,5 +76,13 @@ public class LeaderboardListAdapter extends PagedListAdapter<LeaderboardList, Le
avatar.setImageURI(Uri.parse(getItem(position).getAvatar()));
username.setText(getItem(position).getUsername());
count.setText(getItem(position).getCategoryCount().toString());
/*
Open the user profile in a webview when a username is clicked on leaderboard
We are not using the commons url from build config because the leaderboard is only
supported for prod at the moment
*/
holder.itemView.setOnClickListener(view -> Utils.handleWebUrl(holder.getContext(), Uri.parse(
String.format("%s%s", USER_LINK_PREFIX, getItem(position).getUsername()))));
}
}

View file

@ -1,5 +1,6 @@
package fr.free.nrw.commons.upload
import fr.free.nrw.commons.contributions.ChunkInfo
import okhttp3.MediaType
import okhttp3.RequestBody
import okio.*

View file

@ -0,0 +1,12 @@
package fr.free.nrw.commons.upload
data class StashUploadResult(
val state: StashUploadState,
val fileKey: String?
)
enum class StashUploadState {
SUCCESS,
PAUSED,
FAILED
}

View file

@ -6,12 +6,16 @@ import android.content.Context;
import android.net.Uri;
import androidx.annotation.Nullable;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.contributions.ChunkInfo;
import fr.free.nrw.commons.contributions.Contribution;
import fr.free.nrw.commons.upload.UploadService.NotificationUpdateProgressListener;
import io.reactivex.Observable;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.functions.Consumer;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import javax.inject.Inject;
import javax.inject.Named;
@ -27,10 +31,17 @@ public class UploadClient {
private final int CHUNK_SIZE = 256 * 1024; // 256 KB
//This is maximum duration for which a stash is persisted on MediaWiki
// https://www.mediawiki.org/wiki/Manual:$wgUploadStashMaxAge
private final int MAX_CHUNK_AGE = 6 * 3600 * 1000; // 6 hours
private final UploadInterface uploadInterface;
private final CsrfTokenClient csrfTokenClient;
private final PageContentsCreator pageContentsCreator;
private final FileUtilsWrapper fileUtilsWrapper;
private boolean pauseUploads = false;
private final CompositeDisposable compositeDisposable = new CompositeDisposable();
@Inject
public UploadClient(final UploadInterface uploadInterface,
@ -47,32 +58,68 @@ public class UploadClient {
* Upload file to stash in chunks of specified size. Uploading files in chunks will make handling
* of large files easier. Also, it will be useful in supporting pause/resume of uploads
*/
Observable<UploadResult> uploadFileToStash(
final Context context, final String filename, final File file,
Observable<StashUploadResult> uploadFileToStash(
final Context context, final String filename, final Contribution contribution,
final NotificationUpdateProgressListener notificationUpdater) throws IOException {
pauseUploads = false;
File file = new File(contribution.getLocalUri().getPath());
final Observable<File> fileChunks = fileUtilsWrapper.getFileChunks(context, file, CHUNK_SIZE);
final MediaType mediaType = MediaType
.parse(FileUtils.getMimeType(context, Uri.parse(file.getPath())));
final long[] offset = {0};
final String[] fileKey = {null};
final AtomicReference<UploadResult> result = new AtomicReference<>();
fileChunks.blockingForEach(chunkFile -> {
final AtomicInteger index = new AtomicInteger();
final AtomicReference<ChunkInfo> chunkInfo = new AtomicReference<>();
if (contribution.getChunkInfo() != null && isStashValid(contribution)) {
chunkInfo.set(contribution.getChunkInfo());
}
compositeDisposable.add(fileChunks.forEach(chunkFile -> {
if (pauseUploads) {
return;
}
if (chunkInfo.get() != null && index.get() < chunkInfo.get().getLastChunkIndex()) {
index.getAndIncrement();
return;
}
final int offset =
chunkInfo.get() != null ? chunkInfo.get().getUploadResult().getOffset() : 0;
final String filekey =
chunkInfo.get() != null ? chunkInfo.get().getUploadResult().getFilekey() : null;
final RequestBody requestBody = RequestBody
.create(mediaType, chunkFile);
final CountingRequestBody countingRequestBody = new CountingRequestBody(requestBody,
notificationUpdater::onProgress, offset[0], file.length());
uploadChunkToStash(filename,
notificationUpdater::onProgress, offset,
file.length());
compositeDisposable.add(uploadChunkToStash(filename,
file.length(),
offset[0],
fileKey[0],
countingRequestBody).blockingSubscribe(uploadResult -> {
result.set(uploadResult);
offset[0] = uploadResult.getOffset();
fileKey[0] = uploadResult.getFilekey();
});
});
return Observable.just(result.get());
offset,
filekey,
countingRequestBody).subscribe(uploadResult -> {
chunkInfo.set(new ChunkInfo(uploadResult, index.incrementAndGet()));
notificationUpdater.onChunkUploaded(contribution, chunkInfo.get());
}, throwable -> {
Timber.e(throwable, "Error occurred in uploading chunk");
}));
}));
if (pauseUploads) {
return Observable.just(new StashUploadResult(StashUploadState.PAUSED, null));
} else if (chunkInfo.get() != null) {
return Observable.just(new StashUploadResult(StashUploadState.SUCCESS,
chunkInfo.get().getUploadResult().getFilekey()));
} else {
return Observable.just(new StashUploadResult(StashUploadState.FAILED, null));
}
}
/**
* Stash is valid for 6 hours. This function checks the validity of stash
* @param contribution
* @return
*/
private boolean isStashValid(Contribution contribution) {
return contribution.getDateModified()
.after(new Date(System.currentTimeMillis() - MAX_CHUNK_AGE));
}
/**
@ -106,6 +153,20 @@ public class UploadClient {
}
}
/**
* Dispose the active disposable and sets the pause variable
*/
public void pauseUpload() {
pauseUploads = true;
if (!compositeDisposable.isDisposed()) {
compositeDisposable.dispose();
}
compositeDisposable.clear();
}
/**
* Converts string value to request body
*/
@Nullable
private RequestBody toRequestBody(@Nullable final String value) {
return value == null ? null : RequestBody.create(okhttp3.MultipartBody.FORM, value);

View file

@ -1,18 +1,47 @@
package fr.free.nrw.commons.upload
import android.os.Parcel
import android.os.Parcelable
import org.wikipedia.gallery.ImageInfo
private const val RESULT_SUCCESS = "Success"
data class UploadResult(
val result: String,
val filekey: String,
val offset: Int,
val filename: String,
val sessionkey: String,
val imageinfo: ImageInfo
val filename: String
) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readString(),
parcel.readString(),
parcel.readInt(),
parcel.readString()
) {
}
fun isSuccessful(): Boolean = result == RESULT_SUCCESS
fun createCanonicalFileName() = "File:$filename"
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(result)
parcel.writeString(filekey)
parcel.writeInt(offset)
parcel.writeString(filename)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<UploadResult> {
override fun createFromParcel(parcel: Parcel): UploadResult {
return UploadResult(parcel)
}
override fun newArray(size: Int): Array<UploadResult?> {
return arrayOfNulls(size)
}
}
}

View file

@ -5,7 +5,6 @@ import android.app.PendingIntent;
import android.content.ContentResolver;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
@ -16,6 +15,7 @@ import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.auth.SessionManager;
import fr.free.nrw.commons.contributions.ChunkInfo;
import fr.free.nrw.commons.contributions.Contribution;
import fr.free.nrw.commons.contributions.ContributionDao;
import fr.free.nrw.commons.contributions.MainActivity;
@ -28,8 +28,8 @@ import io.reactivex.Scheduler;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.processors.PublishProcessor;
import io.reactivex.schedulers.Schedulers;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
@ -76,6 +76,7 @@ public class UploadService extends CommonsDaggerService {
// Seriously, Android?
public static final int NOTIFICATION_UPLOAD_IN_PROGRESS = 1;
public static final int NOTIFICATION_UPLOAD_FAILED = 3;
public static final int NOTIFICATION_UPLOAD_PAUSED = 4;
protected class NotificationUpdateProgressListener {
@ -119,6 +120,24 @@ public class UploadService extends CommonsDaggerService {
.subscribe());
}
public void onChunkUploaded(Contribution contribution, ChunkInfo chunkInfo) {
contribution.setChunkInfo(chunkInfo);
compositeDisposable.add(contributionDao.update(contribution)
.subscribeOn(ioThreadScheduler)
.subscribe());
}
}
/**
* Sets contribution state to paused and disposes the active disposable
* @param contribution
*/
public void pauseUpload(Contribution contribution) {
uploadClient.pauseUpload();
contribution.setState(Contribution.STATE_PAUSED);
compositeDisposable.add(contributionDao.update(contribution)
.subscribeOn(ioThreadScheduler)
.subscribe());
}
@Override
@ -208,13 +227,11 @@ public class UploadService extends CommonsDaggerService {
@SuppressLint("CheckResult")
private void uploadContribution(Contribution contribution) {
Uri localUri = contribution.getLocalUri();
if (localUri == null || localUri.getPath() == null) {
if (contribution.getLocalUri() == null || contribution.getLocalUri().getPath() == null) {
Timber.d("localUri/path is null");
return;
}
String notificationTag = localUri.toString();
File localFile = new File(localUri.getPath());
String notificationTag = contribution.getLocalUri().toString();
Timber.d("Before execution!");
final Media media = contribution.getMedia();
@ -243,7 +260,7 @@ public class UploadService extends CommonsDaggerService {
Observable.fromCallable(() -> "Temp_" + contribution.hashCode() + filename)
.flatMap(stashFilename -> uploadClient
.uploadFileToStash(getApplicationContext(), stashFilename, localFile,
.uploadFileToStash(getApplicationContext(), stashFilename, contribution,
notificationUpdater))
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
@ -265,7 +282,7 @@ public class UploadService extends CommonsDaggerService {
Timber.d("Stash upload response 1 is %s", uploadStash.toString());
if (uploadStash.isSuccessful()) {
if (uploadStash.getState() == StashUploadState.SUCCESS) {
Timber.d("making sure of uniqueness of name: %s", filename);
String uniqueFilename = findUniqueFilename(filename);
unfinishedUploads.add(uniqueFilename);
@ -273,7 +290,11 @@ public class UploadService extends CommonsDaggerService {
getApplicationContext(),
contribution,
uniqueFilename,
uploadStash.getFilekey());
uploadStash.getFileKey());
} else if (uploadStash.getState() == StashUploadState.PAUSED) {
Timber.d("Contribution upload paused");
showPausedNotification(contribution);
return Observable.never();
} else {
Timber.d("Contribution upload failed. Wikidata entity won't be edited");
showFailedNotification(contribution);
@ -308,7 +329,8 @@ public class UploadService extends CommonsDaggerService {
.add(wikidataEditService.addDepictionsAndCaptions(uploadResult, contribution));
WikidataPlace wikidataPlace = contribution.getWikidataPlace();
if (wikidataPlace != null && wikidataPlace.getImageValue() == null) {
wikidataEditService.createClaim(wikidataPlace, uploadResult.getFilename(), contribution.getMedia().getCaptions());
wikidataEditService.createClaim(wikidataPlace, uploadResult.getFilename(),
contribution.getMedia().getCaptions());
}
saveCompletedContribution(contribution, uploadResult);
}
@ -317,7 +339,10 @@ public class UploadService extends CommonsDaggerService {
compositeDisposable.add(mediaClient.getMedia("File:" + uploadResult.getFilename())
.map(contribution::completeWith)
.flatMapCompletable(
newContribution -> contributionDao.saveAndDelete(contribution, newContribution))
newContribution -> {
newContribution.setDateModified(new Date());
return contributionDao.saveAndDelete(contribution, newContribution);
})
.subscribe());
}
@ -341,6 +366,24 @@ public class UploadService extends CommonsDaggerService {
.subscribe());
}
private void showPausedNotification(Contribution contribution) {
final String displayTitle = contribution.getMedia().getDisplayTitle();
curNotification.setTicker(getString(R.string.upload_paused_notification_title, displayTitle))
.setContentTitle(getString(R.string.upload_paused_notification_title, displayTitle))
.setContentText(getString(R.string.upload_paused_notification_subtitle))
.setProgress(0, 0, false)
.setOngoing(false);
notificationManager.notify(contribution.getLocalUri().toString(), NOTIFICATION_UPLOAD_PAUSED,
curNotification.build());
contribution.setState(Contribution.STATE_PAUSED);
compositeDisposable.add(contributionDao
.update(contribution)
.subscribeOn(ioThreadScheduler)
.subscribe());
}
private String findUniqueFilename(String fileName) throws IOException {
String sequenceFileName;
for (int sequenceNumber = 1; true; sequenceNumber++) {

View file

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#FFFFFF">
<group android:scaleX="1.44427"
android:scaleY="1.44427"
android:translateX="-5.33124"
android:translateY="-5.33124">
<path
android:fillColor="@android:color/white"
android:pathData="M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z"/>
</group>
</vector>

View file

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#FFFFFF">
<group android:scaleX="1.44427"
android:scaleY="1.44427"
android:translateX="-7.4976454"
android:translateY="-5.33124">
<path
android:fillColor="@android:color/white"
android:pathData="M8,5v14l11,-7z"/>
</group>
</vector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 B

View file

@ -2,9 +2,9 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:fresco="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/miniscule_margin"
android:paddingBottom="@dimen/dimen_0">
@ -12,65 +12,59 @@
android:id="@+id/contributionSequenceNumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="98sp"
android:textColor="#33FFFFFF"
android:typeface="serif"
android:layout_gravity="end|bottom"
/>
android:textColor="#33FFFFFF"
android:textSize="98sp"
android:typeface="serif" />
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/contributionImage"
android:layout_width="match_parent"
android:layout_height="@dimen/very_large_height"
app:actualImageScaleType="centerCrop"
android:background="?attr/mainBackground"
fresco:placeholderImage="@drawable/ic_image_black_24dp"
/>
app:actualImageScaleType="centerCrop"
fresco:placeholderImage="@drawable/ic_image_black_24dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center|bottom"
android:background="#AA000000"
>
android:orientation="horizontal">
<LinearLayout
android:layout_width="@dimen/dimen_0"
android:layout_height="wrap_content"
android:layout_gravity="center|bottom"
android:orientation="vertical"
android:layout_weight="5"
android:padding="@dimen/small_gap"
>
android:orientation="vertical"
android:padding="@dimen/small_gap">
<ProgressBar
android:id="@+id/contributionProgress"
style="@style/ProgressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/ProgressBar"
android:indeterminateOnly="false"
android:max="100"
android:visibility="gone"
/>
android:visibility="gone" />
<TextView
android:id="@+id/contributionState"
style="?android:textAppearanceSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="?android:textAppearanceSmall"
android:textColor="#FFFFFFFF"
android:visibility="gone"
/>
android:visibility="gone" />
<TextView
android:id="@+id/contributionTitle"
style="?android:textAppearanceMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFFFF"
style="?android:textAppearanceMedium"
android:maxLines="2"
android:ellipsize="end"
/>
android:maxLines="2"
android:textColor="#FFFFFFFF" />
</LinearLayout>
@ -78,50 +72,56 @@
android:id="@+id/image_options"
android:layout_width="@dimen/dimen_0"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_weight="2.6"
android:visibility="visible"
android:layout_gravity="right"
android:layout_weight="2.6"
android:gravity="right"
android:orientation="horizontal"
android:padding="@dimen/tiny_gap"
>
android:visibility="visible">
<ImageButton
android:id="@+id/pauseResumeButton"
android:layout_width="@dimen/dimen_40"
android:layout_height="@dimen/dimen_40"
android:layout_marginEnd="@dimen/tiny_padding"
android:layout_toStartOf="@id/cancelButton"
android:background="@android:color/transparent"
android:tag="@string/pause"
app:srcCompat="@drawable/pause_icon" />
<ImageButton
android:id="@+id/cancelButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_cancel_white"
android:text="@string/menu_cancel_upload"
android:layout_marginEnd="@dimen/tiny_padding"
android:layout_toStartOf="@id/retryButton"
android:background="@android:color/transparent"
android:padding="@dimen/activity_margin_horizontal"
android:layout_toStartOf="@id/retryButton"
android:layout_marginEnd="@dimen/tiny_padding"
/>
android:src="@drawable/ic_cancel_white"
android:text="@string/menu_cancel_upload" />
<ImageButton
android:id="@+id/retryButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_retry_white"
android:text="@string/menu_retry_upload"
android:layout_marginEnd="@dimen/tiny_padding"
android:layout_toStartOf="@id/wikipediaButton"
android:background="@android:color/transparent"
android:padding="@dimen/activity_margin_horizontal"
android:layout_toStartOf="@id/wikipediaButton"
android:layout_marginEnd="@dimen/tiny_padding"
/>
android:src="@drawable/ic_retry_white"
android:text="@string/menu_retry_upload" />
<ImageButton
android:id="@+id/wikipediaButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_marginEnd="@dimen/tiny_padding"
android:background="@android:color/transparent"
android:padding="@dimen/activity_margin_horizontal"
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"
/>
android:visibility="visible" />
</RelativeLayout>

View file

@ -302,7 +302,7 @@
<string name="error_while_cache">خطأ أثناء تخزين الصور</string>
<string name="title_info">عنوان وصفي فريد للملف، والذي سيكون بمثابة اسم الملف، يمكنك استخدام لغة واضحة مع مسافات، لا تقم بتضمين امتداد الملف</string>
<string name="description_info">يُرجَى وصف الوسائط قدر الإمكان: أين تم التقاطها؟ ما تظهر؟ ما هو السياق؟ يُرجَى وصف الأشياء أو الأشخاص، اكشف المعلومات التي لا يمكن تخمينها بسهولة، على سبيل المثال الوقت في اليوم إذا كان منظرا طبيعيا، إذا أظهرت الوسائط شيئا غير عادي، فيُرجَى توضيح ما يجعله غير عادي.</string>
<string name="caption_info">(يرجى كتابة وصف موجز للصورة (قيد ٢٥٥ حرف</string>
<string name="caption_info" fuzzy="true">(يرجى كتابة وصف موجز للصورة (قيد ٢٥٥ حرف</string>
<string name="upload_image_too_dark">هذه الصورة مظلمة للغاية، هل أنت متأكد من رغبتك في رفعها؟ ويكيميديا ​​كومنز للصور ذات القيمة الموسوعية فقط.</string>
<string name="upload_image_blurry">هذه الصورة ضبابية، هل أنت متأكد من رغبتك في رفعها؟ ويكيميديا ​​كومنز للصور ذات القيمة الموسوعية فقط.</string>
<string name="upload_problem_exist">مشاكل محتملة في هذه الصورة:</string>
@ -366,6 +366,7 @@
<string name="retry">إعادة المحاولة</string>
<string name="showcase_view_got_it_button">فهمت!</string>
<string name="showcase_view_whole_nearby_activity">هذه هي الأماكن القريبة منك التي تحتاج إلى صور لتوضيح مقالات ويكيبيديا الخاصة بها. \n\nيؤدي النقر فوق \"البحث في هذه المنطقة\" إلى إغلاق الخريطة وإطلاق بحث قريب حول هذا الموقع.</string>
<string name="showcase_view_no_longer_exists">هذه الصفحة لم تعد موجودة.</string>
<string name="showcase_view_list_icon">يؤدي النقر على هذا الزر إلى جلب قائمة بهذه الأماكن</string>
<string name="showcase_view_plus_fab">يمكنك رفع صورة لأي مكان من معرضك أو كاميرتك</string>
<string name="no_images_found">لم يتم العثور على صور!</string>

View file

@ -259,7 +259,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="caption_info" fuzzy="true">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>

View file

@ -10,6 +10,7 @@
* NahidHossain
* Rasal Lia
* Sankarshan
* Sibabrata Banerjee
* Tahmid02016
* Tauhid16
* আফতাবুজ্জামান
@ -66,7 +67,9 @@
<string name="upload_progress_notification_title_in_progress">%1$s আপলোড হচ্ছে</string>
<string name="upload_progress_notification_title_finishing">%1$s আপলোড শেষ হয়েছে</string>
<string name="upload_failed_notification_title">%1$s আপলোড ব্যর্থ</string>
<string name="upload_paused_notification_title">%1$s আপলোড বিরত রয়েছে</string>
<string name="upload_failed_notification_subtitle">দেখার জন্য টোকা দিন</string>
<string name="upload_paused_notification_subtitle">দেখার জন্য টোকা দিন</string>
<string name="title_activity_contributions">আমার সাম্প্রতিক আপলোড</string>
<string name="contribution_state_queued">অপেক্ষারত</string>
<string name="contribution_state_failed">ব্যর্থ</string>
@ -326,4 +329,7 @@
<string name="remove_bookmark">বুকমার্ক থেকে সরানো হয়েছে</string>
<string name="add_bookmark">বুকমার্কে যোগ করা হয়েছে</string>
<string name="confirm">নিশ্চিত করুন</string>
<string name="pause">থামান</string>
<string name="resume">পুনরায় শুরু করুন</string>
<string name="paused">থামানো হয়েছে</string>
</resources>

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Authors:
* Srdjan m
* Srđan
-->
<resources>
<string name="crash_dialog_title">Commons se srušio</string>

View file

@ -282,6 +282,9 @@
<string name="about_translate_cancel">Annullér</string>
<string name="retry">Prøv igen</string>
<string name="showcase_view_got_it_button">Forstået!</string>
<string name="showcase_view_needs_photo">Dette sted mangler et billede.</string>
<string name="showcase_view_has_photo">Dette sted har allerede et billede.</string>
<string name="showcase_view_no_longer_exists">Dette sted findes ikke længere.</string>
<string name="no_images_found">Ingen billeder fundet!</string>
<string name="error_loading_images">Der opstod en fejl under indlæsningen af billeder.</string>
<string name="image_uploaded_by">Lagt op af: %1$s</string>
@ -391,4 +394,7 @@
<string name="add_picture_to_wikipedia_instructions_title">Instruktioner</string>
<string name="confirm">Bekræft</string>
<string name="instructions_title">Instruktioner</string>
<string name="pause">sæt på pause</string>
<string name="resume">genoptag</string>
<string name="paused">Sat på pause</string>
</resources>

View file

@ -2,6 +2,7 @@
<!-- Authors:
* Abijeet Patro
* Bjarncraft
* Bxalber
* Envlh
* FF11
* Ferdinand0101
@ -323,6 +324,9 @@
<string name="retry">Erneut versuchen</string>
<string name="showcase_view_got_it_button">Verstanden!</string>
<string name="showcase_view_whole_nearby_activity">Dies sind die Orte in deiner Nähe, die Bilder zur Illustration ihrer Wikipedia-Artikel benötigen.\n\nEin Klick auf „DIESEN BEREICH DURCHSUCHEN“ sperrt die Karte und startet eine Suche um diesen Standort.</string>
<string name="showcase_view_needs_photo">Dieser Ort braucht ein Foto.</string>
<string name="showcase_view_has_photo">Dieser Ort hat bereits ein Foto.</string>
<string name="showcase_view_no_longer_exists">Dieser Ort existiert nicht mehr.</string>
<string name="showcase_view_list_icon">Das Antippen dieser Schaltfläche zeigt eine Liste mit diesen Orten</string>
<string name="showcase_view_plus_fab">Du kannst ein Bild für einen beliebigen Ort von deiner Galerie oder Kamera hochladen</string>
<string name="no_images_found">Keine Bilder gefunden!</string>

View file

@ -12,6 +12,7 @@
* ManosHacker
* Nikosgranturismogt
* Nikosguard
* Norhorn
* Panos78
* Protnet
* Tgkarounos
@ -300,6 +301,9 @@
<string name="retry">Ξαναπροσπαθήστε</string>
<string name="showcase_view_got_it_button">Κατάλαβα!</string>
<string name="showcase_view_whole_nearby_activity" fuzzy="true">Αυτά είναι τα μέρη κοντά σας που χρειάζονται φωτογραφίες για να εικονογραφηθούν τα λήμματά τους στη Βικιπαίδεια</string>
<string name="showcase_view_needs_photo">Αυτή η τοποθεσία χρειάζεται φωτογραφία.</string>
<string name="showcase_view_has_photo">Αυτή η τοποθεσία έχει ήδη φωτογραφία.</string>
<string name="showcase_view_no_longer_exists">Η τοποθεσία δεν υπάρχει πλέον.</string>
<string name="showcase_view_list_icon">Πατώντας αυτό το κουμπί φέρνει μια λίστα αυτών των μερών</string>
<string name="showcase_view_plus_fab">Μπορείτε να ανεβάσετε μια εικόνα για οποιοδήποτε μέρος από την γκαλερί ή την κάμερά σας</string>
<string name="no_images_found">Δεν βρέθηκαν εικόνες!</string>

View file

@ -90,6 +90,7 @@
<string name="upload_progress_notification_title_finishing">Finalizando la subida de %1$s</string>
<string name="upload_failed_notification_title">Falló la carga de %1$s</string>
<string name="upload_failed_notification_subtitle">Toca para ver</string>
<string name="upload_paused_notification_subtitle">Tocar para ver</string>
<string name="title_activity_contributions">Mis subidas recientes</string>
<string name="contribution_state_queued">En la cola</string>
<string name="contribution_state_failed">Fallido</string>
@ -336,6 +337,9 @@
<string name="retry">Reintentar</string>
<string name="showcase_view_got_it_button">Entendido</string>
<string name="showcase_view_whole_nearby_activity">Estos son los sitios cercanos a ti necesitan imágenes para ilustrar sus artículos de Wikipedia.\n\n\nCliqueando en \'BUSCA EN ESTE ÁREA\' centrara el mapa e iniciara una búsqueda cercana alrededor de esa ubicación.</string>
<string name="showcase_view_needs_photo">Este sitio necesita una foto.</string>
<string name="showcase_view_has_photo">Este sitio ya tiene una foto.</string>
<string name="showcase_view_no_longer_exists">Este sitio ya no existe.</string>
<string name="showcase_view_list_icon">Tocando este botón se desplegara una lista de estos lugares</string>
<string name="showcase_view_plus_fab">Puedes cargar una imagen para cualquier sitio desde la galería o la cámara</string>
<string name="no_images_found">No se encontró ninguna imagen.</string>
@ -585,4 +589,7 @@
<string name="theme_default_name">Seguir sistema</string>
<string name="theme_dark_name">Oscuro</string>
<string name="theme_light_name">Claro</string>
<string name="pause">pausar</string>
<string name="resume">reanudar</string>
<string name="paused">En pausa</string>
</resources>

View file

@ -268,7 +268,7 @@
<string name="error_while_cache">خطا در زمان دریافت تصاویر</string>
<string name="title_info">عنوانی توصیفی و یکتا برای پرونده که به عنوان نام پرونده در نظر گرفته خواهد شد. ترجیحاً به زبان ساده باشد، می‌توانید فاصله هم به کار ببرید. پسوند پرونده را ننویسید.</string>
<string name="description_info">لطفاً تصویر را تا حد توان شرح دهید. کجا گرفته شده‌است؟ شامل چه چیزی می‌شود؟ لطفاً اشیا یا افراد را شرح دهید. اطلاعاتی که به راحتی قابل مشاهده هستند را صرفه‌نظر کنید. اگر چیزی در تصویر غیر طبیعی به نظر می‌رسد آن را شرح دهید.</string>
<string name="caption_info">لطفاً شرح مختصری برای این تصویر بنویسید. (محدود به ۲۵۵ نویسه)</string>
<string name="caption_info" fuzzy="true">لطفاً شرح مختصری برای این تصویر بنویسید. (محدود به ۲۵۵ نویسه)</string>
<string name="upload_image_too_dark">این تصویر خیلی تار است. آیا مطمئنید که می‌خواهید آن را بارگذاری کنید؟ ویکی‌انبار فقط برای نگهداری از تصاویری است که ارزش دانشنامه‌ای داشته باشند.</string>
<string name="upload_image_blurry">این تصویر خیلی محو است. آیا مطمئنید که می‌خواهید آن را بارگذاری کنید؟ ویکی‌انبار فقط برای نگهداری از تصاویری است که ارزش دانشنامه‌ای داشته باشند.</string>
<string name="upload_problem_exist">مشکلات احتمالی با این تصویر :</string>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Authors:
* 01miki10
* Abijeet Patro
* Alluk.
* Crt
@ -52,7 +53,7 @@
<string name="bullet"></string>
<string name="menu_settings">Asetukset</string>
<string name="intent_share_upload_label">Tallenna Commonsiin</string>
<string name="username">Käyttäjätunnus</string>
<string name="username">Käyttäjänimi</string>
<string name="password">Salasana</string>
<string name="login_credential">Kirjaudu Commons Beta -tilillesi</string>
<string name="login">Kirjaudu sisään</string>

View file

@ -89,7 +89,9 @@
<string name="upload_progress_notification_title_in_progress">%1$s téléversé</string>
<string name="upload_progress_notification_title_finishing">Fin du téléversement de %1$s</string>
<string name="upload_failed_notification_title">Le téléversement de %1$s a échoué</string>
<string name="upload_paused_notification_title">Téléversement %1$s en pause</string>
<string name="upload_failed_notification_subtitle">Appuyer pour afficher</string>
<string name="upload_paused_notification_subtitle">Taper pour afficher</string>
<string name="title_activity_contributions">Mes téléversements récents</string>
<string name="contribution_state_queued">Mis en file dattente</string>
<string name="contribution_state_failed">Échec</string>
@ -285,7 +287,7 @@
<string name="error_while_cache">Erreur en mettant les images en cache</string>
<string name="title_info">Un titre descriptif unique pour le fichier, qui servira de nom de fichier. Vous pouvez utiliser un langage simple avec des espaces. Nincluez pas lextension du fichier</string>
<string name="description_info">Veuillez décrire le média autant que possible: Où a-t-il été enregistré? Que montre-t-il? Quel est le contexte? Veuillez décrire les objets ou les personnes. Révélez les informations qui ne peuvent pas être devinées facilement, par exemple lheure de la journée si cest un paysage. Si le média montre quelque chose dinhabituel, veuillez expliquer ce qui le rend exceptionnel.</string>
<string name="caption_info">Veuillez rédiger une brève description de limage (limitée à 255 caractères).</string>
<string name="caption_info" fuzzy="true">Veuillez rédiger une brève description de limage (limitée à 255 caractères).</string>
<string name="upload_image_too_dark">Cette image est trop sombre, êtes-vous sûr de vouloir la téléverser? Wikimedia Commons est réservé pour les images ayant une valeur encyclopédique.</string>
<string name="upload_image_blurry">Cette image est floue, êtes-vous sûr de vouloir la téléverser? Wikimedia Commons est réservé aux images ayant une valeur encyclopédique.</string>
<string name="upload_problem_exist">Problèmes potentiels avec cette image:</string>
@ -349,6 +351,9 @@
<string name="retry">Réessayer</string>
<string name="showcase_view_got_it_button">Cest bon!</string>
<string name="showcase_view_whole_nearby_activity">Ce sont les lieux autour de vous qui ont besoin dimages pour illustrer leurs articles sur Wikipédia.\n\nEn cliquant sur «CHERCHER DANS CETTE ZONE» vous verrouillez la carte et lancez une recherche à proximité de ce lieu.</string>
<string name="showcase_view_needs_photo">Cet endroit a besoin dune photo.</string>
<string name="showcase_view_has_photo">Cet endroit a déjà une photo.</string>
<string name="showcase_view_no_longer_exists">Cet endroit nexiste plus.</string>
<string name="showcase_view_list_icon">En cliquant sur ce bouton vous afficherez une liste de ces lieux</string>
<string name="showcase_view_plus_fab">Vous pouvez téléverser une photo de nimporte quel lieu depuis votre galerie ou votre appareil photo</string>
<string name="no_images_found">Aucune image trouvée!</string>
@ -634,4 +639,7 @@
<string name="wikipedia_instructions_step_6">6. Modifier le wikitexte pour un positionnement approprié, si besoin. Pour plus dinformation, voir &lt;a href=\"https://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style/Images#How_to_place_an_image\"&gt;ici&lt;/a&gt;.</string>
<string name="wikipedia_instructions_step_7">7. Publier larticle</string>
<string name="copy_wikicode_to_clipboard">Copier le wikicode dans le presse-papier</string>
<string name="pause">pause</string>
<string name="resume">reprise</string>
<string name="paused">En pause</string>
</resources>

View file

@ -56,7 +56,9 @@
<string name="upload_progress_notification_title_in_progress">Postavljanje %1$s</string>
<string name="upload_progress_notification_title_finishing">Završeno postavljanje %1$s</string>
<string name="upload_failed_notification_title">Postavljanje %1$s neuspješno</string>
<string name="upload_paused_notification_title">Postavljanje %1$s pauzirano</string>
<string name="upload_failed_notification_subtitle">Dodirnite da biste vidjeli</string>
<string name="upload_paused_notification_subtitle">Dodirnite da biste vidjeli</string>
<string name="title_activity_contributions">Moja nedavja postavljanja</string>
<string name="contribution_state_queued">U redu čekanja</string>
<string name="contribution_state_failed">Neuspješno</string>
@ -349,4 +351,7 @@
<string name="theme_dark_name">Tamno</string>
<string name="theme_light_name">Svijetlo</string>
<string name="load_more">Učitaj više</string>
<string name="pause">stanka</string>
<string name="resume">nastavi</string>
<string name="paused">Pauzirano</string>
</resources>

View file

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Authors:
* Armeniki
* Azniv Stepanian
-->
<resources>
<string name="crash_dialog_ok_toast">Շնորհակալութիւն:</string>
<string name="crash_dialog_ok_toast">Շնորհակալութիւն</string>
</resources>

View file

@ -75,7 +75,9 @@
<string name="upload_progress_notification_title_in_progress">Sto caricando %1$s</string>
<string name="upload_progress_notification_title_finishing">Terminato il caricamento di %1$s</string>
<string name="upload_failed_notification_title">Caricamento di %1$s non riuscito</string>
<string name="upload_paused_notification_title">Caricamento di %1$s in pausa</string>
<string name="upload_failed_notification_subtitle">Premi per visualizzare</string>
<string name="upload_paused_notification_subtitle">Premi per visualizzare</string>
<string name="title_activity_contributions">I miei ultimi caricamenti</string>
<string name="contribution_state_queued">In coda</string>
<string name="contribution_state_failed">Non riuscito</string>
@ -320,6 +322,9 @@
<string name="retry">Riprova</string>
<string name="showcase_view_got_it_button">Capito!</string>
<string name="showcase_view_whole_nearby_activity">Questi sono i luoghi vicino a te che necessitano di immagini per illustrare le loro voci di Wikipedia.\n\nCliccando su \"CERCA QUESTA AREA\" si blocca la mappa e si avvia una ricerca nelle vicinanze intorno a quella posizione.</string>
<string name="showcase_view_needs_photo">Questo luogo ha molto bisogno di una foto.</string>
<string name="showcase_view_has_photo">Questo luogo già ha una foto.</string>
<string name="showcase_view_no_longer_exists">Questo luogo non esiste più.</string>
<string name="showcase_view_list_icon">Toccando questo pulsante viene visualizzato un elenco di questi luoghi</string>
<string name="showcase_view_plus_fab">Puoi caricare un\'immagine per ogni luogo dalla tua galleria o fotocamera</string>
<string name="no_images_found">Nessuna immagine trovata!</string>
@ -545,4 +550,7 @@
<string name="wikipedia_instructions_step_6">6. Modifica il wikitesto per il posizionamento appropriato, se necessario. Per ulteriori informazioni vedi &lt;a href=\"https://it.wikipedia.org/wiki/Aiuto:Markup_immagini\"&gt;questa pagina&lt;/a&gt;.</string>
<string name="wikipedia_instructions_step_7">7. Pubblica la voce</string>
<string name="copy_wikicode_to_clipboard">Copia il wikicodice negli appunti</string>
<string name="pause">pausa</string>
<string name="resume">riprendi</string>
<string name="paused">In pausa</string>
</resources>

View file

@ -287,7 +287,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="caption_info" fuzzy="true">נא לרשום תיאור קצר של התמונה. (מוגבל ל־255 תווים)</string>
<string name="upload_image_too_dark">התמונה הזאת חשוכה מדי, האם ברצונך באמת להעלות אותה? ויקישיתוף מיועד רק לתמונות בעלות ערך אנציקלופדי.</string>
<string name="upload_image_blurry">התמונה הזאת מטושטשת, האם ברצונך באמת להעלות אותה? ויקישיתוף מיועד רק לתמונות בעלות ערך אנציקלופדי.</string>
<string name="upload_problem_exist">בעיות פוטנציאליות עם התמונה הזאת:</string>
@ -351,6 +351,9 @@
<string name="retry">לנסות שוב</string>
<string name="showcase_view_got_it_button">הבנתי!</string>
<string name="showcase_view_whole_nearby_activity">אלה המקומות בסביבתך שזקוקים לתמונות כדי להמחיש את הערכים שלהם בוויקיפדיה.\n\nלחיצה על חיפוש באזור הזה נועלת את המפה ומתחילה חיפוש סביב המיקום הזה.</string>
<string name="showcase_view_needs_photo">מקום זה צריך תמונה.</string>
<string name="showcase_view_has_photo">למקום הזה יש כבר תמונה.</string>
<string name="showcase_view_no_longer_exists">מקום זה לא קיים יותר.</string>
<string name="showcase_view_list_icon">ניתן ללחוץ על כפתור זה כדי להציג רשימה של המקומות האלה</string>
<string name="showcase_view_plus_fab">באפשרותך להעלות תמונה של כל מקום מהגלריה או מהמצלמה שלך</string>
<string name="no_images_found">לא נמצאו תמונות!</string>
@ -622,4 +625,10 @@
<string name="use_location_from_similar_image">האם צילמת את שתי התמונות באותו המקום? האם ברצונך להשתמש בקו הרוחב וקו האורך של התמונה משמאל?</string>
<string name="load_more">לטעון עוד</string>
<string name="nearby_no_results">לא נמצאו מקומות, נא לנסות לשנות את החיפוש.</string>
<string name="add_picture_to_wikipedia_article_title">הוספת תמונה לוויקיפדיה</string>
<string name="add_picture_to_wikipedia_instructions_title">הוראות</string>
<string name="confirm">אישור</string>
<string name="instructions_title">הוראות</string>
<string name="copy_wikicode_to_clipboard">העתקת קוד־ויקי ללוח</string>
<string name="pause">השהיה</string>
</resources>

View file

@ -3,6 +3,7 @@
* Abijeet Patro
* Aefgh39622
* Afaz
* Bonfire12
* Dude1717
* Hinaloe
* Kkairri
@ -12,6 +13,7 @@
* Shirayuki
* Suyama
* Takot
* Tmv
* Whym
* Yusuke1109
* Yuukin0248
@ -73,7 +75,9 @@
<string name="upload_progress_notification_title_in_progress">%1$s をアップロード中</string>
<string name="upload_progress_notification_title_finishing">%1$s のアップロードを完了中</string>
<string name="upload_failed_notification_title">%1$s のアップロードに失敗しました</string>
<string name="upload_paused_notification_title">%1$sのアップロードに失敗しました</string>
<string name="upload_failed_notification_subtitle">閲覧するにはタップしてください</string>
<string name="upload_paused_notification_subtitle">タップでビュー</string>
<string name="title_activity_contributions">自分の最近のアップロードファイル</string>
<string name="contribution_state_queued">順番待ち中</string>
<string name="contribution_state_failed">失敗しました</string>
@ -573,4 +577,7 @@
<string name="ask_to_turn_location_on">位置を有効にしますか?</string>
<string name="nearby_needs_location">付近が正確に機能するには、位置を有効にしてください</string>
<string name="use_location_from_similar_image">これら2点の撮影場所は同じですか 右側の画像に緯度経度情報を添付しますか?</string>
<string name="pause">一時停止</string>
<string name="resume">継続</string>
<string name="paused">一時停止</string>
</resources>

View file

@ -5,6 +5,7 @@
* Codenstory
* Dlsrks1021
* Doyoon1995
* Ellif
* Freebiekr
* Garam
* Jerrykim306
@ -74,6 +75,7 @@
<string name="upload_progress_notification_title_finishing">%1$s 파일 올리기를 끝내는 중</string>
<string name="upload_failed_notification_title">%1$s 파일 올리기 실패</string>
<string name="upload_failed_notification_subtitle">보려면 탭하세요</string>
<string name="upload_paused_notification_subtitle">보려면 탭하세요</string>
<string name="title_activity_contributions">내 최근 업로드</string>
<string name="contribution_state_queued">대기 중</string>
<string name="contribution_state_failed">실패</string>
@ -269,7 +271,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="caption_info" fuzzy="true">그림 설명을 작성해 주세요. (255자 제한)</string>
<string name="upload_image_too_dark">이 사진은 너무 어둡습니다. 정말 업로드하시겠습니까? 위키미디어 공용은 백과사전적인 가치가 있는 사진을 위한 공간입니다.</string>
<string name="upload_image_blurry">이 사진은 흐릿합니다. 정말 업로드하시겠습니까? 위키미디어 공용은 백과사전적인 가치가 있는 사진을 위한 공간입니다.</string>
<string name="upload_problem_exist">이 그림에 잠재적인 문제가 있습니다:</string>
@ -331,6 +333,9 @@
<string name="retry">다시 시도</string>
<string name="showcase_view_got_it_button">알겠습니다!</string>
<string name="showcase_view_whole_nearby_activity" fuzzy="true">이들은 위키백과 글에 사진을 넣을 필요가 있는 당신 주위의 장소들입니다</string>
<string name="showcase_view_needs_photo">이 장소에는 사진이 필요합니다.</string>
<string name="showcase_view_has_photo">이 장소의 사진이 이미 있습니다.</string>
<string name="showcase_view_no_longer_exists">이 장소는 더 이상 있지 않습니다.</string>
<string name="showcase_view_list_icon">이 버튼을 탭하면 이 장소들의 목록을 가져옵니다</string>
<string name="showcase_view_plus_fab">갤러리나 카메라 어느 곳이든 사진을 올릴 수 있습니다</string>
<string name="no_images_found">그림이 없습니다!</string>
@ -454,7 +459,7 @@
<string name="unable_to_display_nearest_place">위치 권한 없이 사진이 필요한 주변 장소를 표시할 수 없습니다</string>
<string name="never_ask_again">다시는 묻지 않음</string>
<string name="display_location_permission_title">위치 권한 표시</string>
<string name="achievements_fetch_failed">무언가가 잘못되어, 저희는 당신의 업적을 가져올 수 없었습니다.</string>
<string name="achievements_fetch_failed">무언가가 잘못되어, 저희는 당신의 업적을 가져올 수 없었습니다</string>
<string name="display_campaigns">캠페인 표시</string>
<string name="display_campaigns_explanation">진행되고 있는 캠페인 보기</string>
<string name="this_function_needs_network_connection">이 기능에는 네트워크 연결이 필요합니다. 연결 설정을 확인해 주십시오.</string>
@ -510,7 +515,7 @@
<string name="default_description_language">기본 설명 언어</string>
<string name="delete_helper_show_deletion_title_success">성공</string>
<string name="delete_helper_show_deletion_title_failed">실패</string>
<string name="delete_helper_show_deletion_message_else">삭제를 요청할 수 없음.</string>
<string name="delete_helper_show_deletion_message_else">삭제를 요청하지 못했습니다.</string>
<string name="delete_helper_ask_spam_selfie">셀카</string>
<string name="delete_helper_ask_spam_blurry">흐림</string>
<string name="delete_helper_ask_spam_other">기타</string>
@ -534,7 +539,7 @@
<string name="title_for_media">미디어</string>
<string name="title_for_child_classes">자식 클래스</string>
<string name="title_for_parent_classes">부모 클래스</string>
<string name="upload_nearby_place_found_title">가까운 장소 발견</string>
<string name="upload_nearby_place_found_title">주변 장소 발견</string>
<string name="title_app_shortcut_explore">찾아보기</string>
<string name="title_app_shortcut_bookmark">북마크</string>
<string name="title_app_shortcut_setting">설정</string>
@ -545,7 +550,7 @@
<string name="setting_wallpaper_dialog_message">배경화면을 설정 중입니다. 기다려 주십시오...</string>
<string name="theme_dark_name">어두움</string>
<string name="theme_light_name">밝음</string>
<string name="cannot_open_location_settings">위치 설정을 열지 못함. 위치를 수동으로 켜세요</string>
<string name="cannot_open_location_settings">위치 설정을 열지 못했습니다. 위치를 수동으로 켜주세요</string>
<string name="ask_to_turn_location_on">위치를 켭니까?</string>
<string name="load_more">더 불러오기</string>
<string name="nearby_no_results">발견된 장소가 없습니다. 검색 기준을 바꾸어 보십시오.</string>
@ -559,4 +564,7 @@
<string name="wikipedia_instructions_step_5">5. 위키텍스트를 적절한 위치에 붙여 넣으세요.</string>
<string name="wikipedia_instructions_step_7">7. 문서 게시</string>
<string name="copy_wikicode_to_clipboard">클립보드에 위키코드 복사</string>
<string name="pause">일시 정지</string>
<string name="resume">계속하기</string>
<string name="paused">일시 중단됨</string>
</resources>

View file

@ -260,6 +260,9 @@
<string name="about_translate_cancel">Ofbriechen</string>
<string name="retry">Nach eng Kéier probéieren</string>
<string name="showcase_view_got_it_button">Verstanen!</string>
<string name="showcase_view_needs_photo">Dës Plaz brauch eng Foto.</string>
<string name="showcase_view_has_photo">Dës Plaz brauch eng Foto.</string>
<string name="showcase_view_no_longer_exists">Dës Plaz gëtt et net méi.</string>
<string name="no_images_found">Keng Biller fonnt!</string>
<string name="error_loading_images">Feeler beim Eropluede vu Biller.</string>
<string name="image_uploaded_by">Eropgeluede vum: %1$s</string>
@ -373,4 +376,7 @@
<string name="confirm">Confirméieren</string>
<string name="instructions_title">Instruktiounen</string>
<string name="wikipedia_instructions_step_7">7.Den Artikel publizéieren</string>
<string name="pause">ënnerbriechen</string>
<string name="resume">virufueren</string>
<string name="paused">Ënnerbrach</string>
</resources>

View file

@ -65,7 +65,9 @@
<string name="upload_progress_notification_title_in_progress">Подигање на „%1$s“</string>
<string name="upload_progress_notification_title_finishing">Завршувам со подигање на „%1$s“</string>
<string name="upload_failed_notification_title">Подигањето на „%1$s“ не успеа</string>
<string name="upload_paused_notification_title">Подигањето на %1$s е запрено</string>
<string name="upload_failed_notification_subtitle">Допрете за да погледате</string>
<string name="upload_paused_notification_subtitle">Допрете за да погледате</string>
<string name="title_activity_contributions">Мои скорешни подигања</string>
<string name="contribution_state_queued">Чека ред</string>
<string name="contribution_state_failed">Не успеа</string>
@ -261,7 +263,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="caption_info" fuzzy="true">Ставете краток опис на сликата. (највеќе 255 знаци)</string>
<string name="upload_image_too_dark">Сликата ви е претемна. Дали сигурно сакате да ја подигнете? Ризницата е посветена само на слики со енциклопедиска вредност.</string>
<string name="upload_image_blurry">Сликата ви е матна. Дали сигурно сакате да ја подигнете? Ризницата е посветена само на слики со енциклопедиска вредност.</string>
<string name="upload_problem_exist">Потенцијални проблеми со сликава:</string>
@ -325,6 +327,9 @@
<string name="retry">Пробај пак</string>
<string name="showcase_view_got_it_button">Јасно!</string>
<string name="showcase_view_whole_nearby_activity">Ова се места во ваша близинана кои им требаат слики за илустрирање на нивните статии на Википедија.\n\nСо стискање на „ПРЕБАРАЈ НА ОВА ПОДРАЧЈЕ“ ќе направите задршка на картата и ќе ви се даде пребарување на нешта во таа околина.</string>
<string name="showcase_view_needs_photo">На местово му треба слика.</string>
<string name="showcase_view_has_photo">Местово веќе има слика.</string>
<string name="showcase_view_no_longer_exists">Местово повеќе не постои.</string>
<string name="showcase_view_list_icon">Ако допрете на копчево ќе добиете список на тие места</string>
<string name="showcase_view_plus_fab">Можете да подигнете слика за било кое од местата од вашата галерија или камера</string>
<string name="no_images_found">Не пронајдов ниедна слика!</string>
@ -610,4 +615,7 @@
<string name="wikipedia_instructions_step_6">6. По потреба, уредете го викитекстот за да ја ставите сликата во прикладна положба во одност на текстот. Повеќе информации за тоа ќе видите &lt;a href=\"https://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style/Images#How_to_place_an_image\"&gt;тука&lt;/a&gt;.</string>
<string name="wikipedia_instructions_step_7">7. Објавете ја статијата</string>
<string name="copy_wikicode_to_clipboard">Прекопирајте го викикодот во меѓускладот</string>
<string name="pause">запри</string>
<string name="resume">продолжи</string>
<string name="paused">Запрено</string>
</resources>

View file

@ -2,6 +2,7 @@
<!-- Authors:
* Dr Lotus Black
* Ninjastrikers
* Teitei Para
-->
<resources>
<plurals name="uploads_pending_notification_indicator">
@ -49,6 +50,8 @@
<string name="upload_progress_notification_title_in_progress">%1$s ဖိုင်တင်နေသည်</string>
<string name="upload_progress_notification_title_finishing">ဖိုင်တင်ခြင်း ပြီးဆုံးမှု %1$s</string>
<string name="upload_failed_notification_title">ဖိုင်တင်ခြင်း %1$s မအောင်မြင်ပါ</string>
<string name="upload_paused_notification_title">ဖိုင်တင်ခြင်း %1$s မအောင်မြင်ပါ</string>
<string name="upload_paused_notification_subtitle">ကြည့်ရန်နှိပ်ပါ</string>
<string name="title_activity_contributions">မကြာသေးခင်က မိမိတင်ထားသည်များ</string>
<string name="contribution_state_failed">မအောင်မြင်ပါ</string>
<string name="contribution_state_in_progress">%1$d%% ပြီးဆုံး</string>
@ -374,4 +377,7 @@
<string name="notification_mark_read">အသိပေးချက်ကို ဖတ်ပြီးကြောင်းမှတ်သားပြီးပြီ</string>
<string name="some_error">အမှားအယွင်းအချို့ရှိခဲ့သည်</string>
<string name="upload_nearby_place_found_title">အနီးအနားနေရာ တွေ့ရှိသည်</string>
<string name="pause">ခေတ္တရပ်</string>
<string name="resume">ခေတ္တရပ်နားရာမှ ပြန်လုပ်ရန်</string>
<string name="paused">ခေတ္တရပ်ပြီး</string>
</resources>

View file

@ -3,6 +3,7 @@
* A67-A67
* Abijeet Patro
* Bouman4
* Dutchy45
* Elroy
* Festina90
* Klaas van Buiten
@ -67,6 +68,7 @@
<string name="upload_progress_notification_title_in_progress">Bezig met het uploaden van %1$s</string>
<string name="upload_progress_notification_title_finishing">Het uploaden van %1$s is afgerond</string>
<string name="upload_failed_notification_title">Het uploaden van %1$s is mislukt</string>
<string name="upload_paused_notification_title">Het uploaden van %1$s is gepauzeerd</string>
<string name="upload_failed_notification_subtitle">Wijs aan om te bekijken</string>
<string name="title_activity_contributions">Mijn recente uploads</string>
<string name="contribution_state_queued">In wachtrij</string>
@ -325,4 +327,7 @@
<string name="add_picture_to_wikipedia_instructions_title">Instructies</string>
<string name="confirm">Bevestigen</string>
<string name="instructions_title">Instructies</string>
<string name="pause">pauzeren</string>
<string name="resume">hervatten</string>
<string name="paused">Gepauzeerd</string>
</resources>

View file

@ -39,7 +39,9 @@
<string name="upload_progress_notification_title_in_progress"> %1$s ߟߊ߬ߦߟߍ߬ߟߌ ߦߋ߫ ߛߋ߲߬ߠߊ߫</string>
<string name="upload_progress_notification_title_finishing"> %1$s ߟߊ߬ߦߟߍ߬ߟߌ ߞߎ߲߬ߘߏ߲߬ߠߌ߲ ߦߴߌ ߘߐ߫</string>
<string name="upload_failed_notification_title"> %1$s ߟߊ߬ߦߟߍ߬ߟߌ ߓߘߊ߫ ߗߌߙߏ߲߫</string>
<string name="upload_paused_notification_title">%1$s ߟߊߦߟߍ߬ߟߌ ߓߘߊ߫ ߟߊߟߐ߬</string>
<string name="upload_failed_notification_subtitle">ߊ߬ ߛߐ߲߬ߞߌ߲߫ ߞߵߊ߬ ߦߋ߫</string>
<string name="upload_paused_notification_subtitle">ߊ߬ ߛߐ߲߬ߞߌ߲߫ ߞߵߊ߬ ߦߋ߫</string>
<string name="title_activity_contributions">ߒ ߠߊ߫ ߟߊ߬ߦߟߍ߬ߣߍ߲߬ ߞߐ߯ߟߕߊ ߟߎ߬</string>
<string name="contribution_state_failed">ߊ߬ ߓߘߊ߫ ߗߌߙߏ߲߫</string>
<string name="contribution_state_in_progress">%1$d%% ߓߘߊ߫ ߘߝߊ߫</string>
@ -72,6 +74,11 @@
<string name="enable_gps">GPS ߟߊߞߎߣߎ߲߫</string>
<string name="contributions_subtitle_zero">ߟߊ߬ߦߟߍ߬ߣߍ߲߬ ߕߴߦߋ߲߬ ߡߎߣߎ߲߬</string>
<string name="categories_not_found">ߞߎߡߘߊ߫ %1$s ߡߊ߫ ߛߐ߬ߘߐ߲߬.</string>
<string name="depictions_not_found">ߥߞߌߘߕߊ ߞߣߐߘߐ߫ ߛߌ߫ ߕߍ߫ ߦߋ߲߬ %1$s ߘߌ߫</string>
<string name="no_child_classes">ߘߋߣߍ߲߫ ߛߊ߯ߘߊ߫ ߕߍ߫ %1$s ߓߟߏ߫</string>
<string name="no_parent_classes">ߡߏߦߌߓߊ߯ ߛߊ߯ߘߊ߫ ߛߌ߫ ߕߍ߫ %1$s ߓߟߏ߫.</string>
<string name="depictions_image_not_found">ߖߌ߬ߦߊ߬ߓߍ߫ ߦߌ߬ߘߊ߬ߕߊ߫ ߕߍ߫ ߦߋ߲߬</string>
<string name="categories_skip_explanation">ߦߌߟߡߊ ߘߏ߫ ߝߙߊ߬ ߞߵߌ ߟߊ߫ ߖߌ߬ߦߊ߬ߓߍ ߞߎ߲߬ߠߞߊ߬ߕߊ߫ ߘߌ߫ ߥߞߌߡߋߘߌߦߊ߫ ߞߐߡߐ߲ ߞߊ߲߬.\nߛߐ߲߬ߞߌ߲߬ߠߌ߲ ߘߊߡߌ߬ߣߊ߬ ߞߊ߬ ߦߌߟߡߊ ߟߎ߫ ߝߙߊ߬.</string>
<string name="categories_activity_title">ߦߌߟߡߊ ߟߎ߬</string>
<string name="title_activity_settings">ߟߊ߬ߓߍ߲߬ߢߐ߲߰ߡߦߊ߬ߘߊ</string>
<string name="title_activity_signup">ߖߊ߬ߕߋ߬ߘߊ ߟߊߞߊ߬</string>
@ -107,7 +114,7 @@
<string name="tutorial_4_subtext_1">ߞߎ߲߬ߕߐ߮:ߛߌߘߑߣߋ߫ ߘߐ߬ߓߛߏ߬ߟߌ߬ ߟߎ</string>
<string name="welcome_final_text">ߌ ߦߴߊ߬ ߖߌ߰ ߟߊ߫ ߞߴߌ ߓߘߴߊ߬ ߛߐ߬ߘߐ߲߬؟</string>
<string name="welcome_final_button_text">ߐ߲߬ߐ߲߬ߐ߲߫߹</string>
<string name="welcome_help_button_text" fuzzy="true">&lt;u&gt;ߞߟߊ߬ߟߐ߲߬ߠߌ߲߬ ߜߘߍ߫ ߟߎ߫&lt;/u&gt;</string>
<string name="welcome_help_button_text">ߞߎ߲߬ߠߊ߬ߝߎ߬ߟߋ߲߬ ߜߘߍ ߟߎ߬</string>
<string name="detail_panel_cats_label">ߦߌߟߡߊ ߟߎ߬</string>
<string name="detail_panel_cats_loading">ߟߊ߬ߢߎ߲߬ߠߌ߲ ߦߵߌ ߘߐ߫...</string>
<string name="detail_panel_cats_none">ߊ߬ ߡߊ߫ ߓߊߕߐ߬ߡߐ߲߬</string>
@ -146,6 +153,7 @@
<string name="commons_logo">ߞߐߡߐ߲ ߛߌ߲ߞߐ߲</string>
<string name="commons_website">ߞߐߡߐ߲ ߞߍߦߙߐ</string>
<string name="commons_facebook">ߞߐߡߐ߲ ߝߋߛߑߓߎߞ ߞߐߜߍ</string>
<string name="background_image">ߝߊ߲߬ߝߘߊ ߞߘߐߟߊ ߖߌ߬ߦߊ߬ߓߍ</string>
<string name="no_image_found">ߖߌ߬ߦߊ߬ߓߍ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬</string>
<string name="no_subcategory_found">ߦߌߟߡߊߙߋ߲߫ ߕߴߦߋ߲߬</string>
<string name="upload_image">ߖߌ߬ߦߊ߬ߓߍ ߟߊߦߟߍ߬</string>
@ -211,6 +219,11 @@
<string name="about_translate_cancel">ߊ߬ ߘߐߛߊ߬</string>
<string name="retry">ߊ߬ ߡߊߝߍߣߍ߲߫ ߕߎ߲߯</string>
<string name="showcase_view_got_it_button">ߊ߬ ߟߊߛߐ߬ߘߐ߲߬߹</string>
<string name="showcase_view_needs_photo">ߦߙߐ ߡߊ߬ߞߏ ߦߋ߫ ߖߌ߬ߦߊ߬ߓߍ ߟߊ߫</string>
<string name="showcase_view_has_photo">ߖߌ߬ߦߊ߬ߓߍ ߘߏ߫ ߦߋ߫ ߦߙߐ ߣߌ߲߬ ߘߐ߫ ߞߘߐ߬ߡߊ߲߫</string>
<string name="showcase_view_no_longer_exists">ߦߙߐ ߣߌ߲߬ ߕߍߣߊ߬ ߡߍ߲߫ ߠߊ߫ ߓߍߓߊ߯ߦߊ ߘߐ߫ ߏ߬ ߞߐ߫.</string>
<string name="showcase_view_list_icon">ߞߎ߬ߘߎ ߣߌ߲߬ ߛߐ߲߬ߞߌ߲ ߘߌ߫ ߦߙߐ ߢߌ߲߬ ߠߎ߬ ߛߙߍߘߍ ߟߊߛߊ߬ߦߌ߫ ߟߊ߫.</string>
<string name="showcase_view_plus_fab">ߌ ߘߌ߫ ߛߋ߫ ߦߙߐ ߓߍ߯ ߖߌ߬ߦߊ߬ߓߍ ߟߊߦߟߍ߬ ߟߊ߫ ߞߊ߬ ߓߐ߫ ߌ ߟߊ߫ ߖߌ߬ߦߊ߬ߝߍ ߘߐ߫ ߥߟߊ߫ ߞߍߟߊ߲ ߠߊ߫</string>
<string name="no_images_found">ߖߌ߬ߦߊ߬ߓߍ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬</string>
<string name="error_loading_images">ߝߎ߬ߕߎ߲߬ߕߌ ߓߌ߬ߟߊ߬ߣߍ߲߫ ߊ߬ ߘߐ߫ ߞߵߌ ߕߏ߫ ߖߌ߬ߦߊ߬ߓߍ ߟߊߦߍ߬ߟߍ ߞߊ߲߬.</string>
<string name="image_uploaded_by">ߖߌ߬ߦߊ߬ߓߍ ߟߊ߬ߦߟߍ߬ߣߍ߲߬ ߦߋ߫: %1$s ߟߋ߬ ߓߟߏ߫</string>
@ -257,6 +270,8 @@
<string name="submit">ߊ߬ ߞߘߊߡߊ߫</string>
<string name="upload_title_duplicate">ߞߐߕߐ߮ ߣߌ߲߬ ߕߐ߮ ߦߋ߫ ߦߋ߲߬ %1$s ߞߘߐ߬ߡߊ߲߫. ߌ ߦߴߊ߬ ߝߍ߬ ߞߵߊ߬ ߘߊߓߊ߲߫ ߓߊ߬؟</string>
<string name="title_page_bookmarks_pictures">ߖߌ߬ߦߊ߬ߓߍ ߟߎ߬</string>
<string name="deletion_reason_uploaded_by_mistake">ߒ ߣߵߊ߬ ߟߊߦߟߍ߬ ߟߊ߫ ߢߌ߬ߣߊ߬ ߓߟߏ ߟߋ߬ ߡߊ߬</string>
<string name="deletion_reason_publicly_visible">ߒ ߕߎ߲߬ ߡߴߊ߬ ߟߐ߲߫ ߞߴߊ߬ ߘߌ߫ ߞߍ߫ ߟߊ߬ߥߊ߲߬ߞߊ߬ߟߌ߬ ߦߋߕߊ߫ ߘߌ߫</string>
<string name="desc_language_Worldwide">ߞߌߢߍ߲߫ ߝߊ߲߭ ߓߍ߯</string>
<string name="desc_language_America">ߊߡߋߙߌߞߌ߬</string>
<string name="desc_language_Europe">ߋߙߐߔߎ߬</string>
@ -299,6 +314,9 @@
<string name="review_thanks_no_button_text">ߖߌ߬ߦߊ߬ߓߍ ߣߊ߬ߕߐ</string>
<string name="no_image">ߖߌ߬ߦߊ߬ߓߍ߬ ߡߊ߫ ߟߊߓߊ߯ߙߊ߫</string>
<string name="no_image_uploaded">ߖߌ߬ߦߊ߬ߓߍ߫ ߡߊ߫ ߟߊߦߟߍ߬</string>
<string name="menu_option_read">ߘߐ߬ߞߊ߬ߙߊ߲߬ߣߍ߲ ߠߎ߬ ߦߋ߫</string>
<string name="menu_option_unread">ߘߐ߬ߞߊ߬ߙߊ߲߬ߓߊߟߌ ߟߎ߬ ߦߋ߫</string>
<string name="error_occurred_in_picking_images">ߝߎ߬ߕߎ߲߬ߕߌ ߓߌ߬ߟߊ߬ߣߍ߲߫ ߊ߬ ߘߐ߫ ߞߵߌ ߕߏ߫ ߖߌ߬ߦߊ߬ߓߍ ߓߊߕߐ߬ߡߐ߲ ߞߊ߲߬.</string>
<string name="image_chooser_title">ߖߌ߬ߦߊ߬ߓߍ߫ ߟߊߦߟߍ߬ߕߊ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫</string>
<string name="please_wait">ߡߊ߬ߞߐ߬ߣߐ߲߬ߠߌ߲ ߞߍ߫ ߖߊ߰ߣߌ߲߬...</string>
<string name="skip_image">ߖߌ߬ߦߊ߬ߓߍ ߣߌ߲߬ ߠߊߜߊ߲߫</string>
@ -306,10 +324,12 @@
<string name="exif_tag_name_copyright">ߓߊߦߟߍߡߊ߲ ߤߊߞߍ</string>
<string name="exif_tag_name_location">ߘߌ߲߬ߞߌߙߊ</string>
<string name="exif_tag_name_cameraModel">ߖߌ߬ߦߊ߬ߕߊ߬ߟߊ߲ ߛߎ߮ߦߊ</string>
<string name="share_via">ߟߥߊ߬ߟߌ߬ߟߊ߲ ߠߊߖߍ߲ߛߍ߲ ߢߌ߲߬ ߠߎ߫ ߞߊ߲߬...</string>
<string name="image_info">ߖߌ߬ߦߊ߬ߓߍ ߞߌ߬ߓߊ߬ߙߏ߬ߦߊ</string>
<string name="no_categories_found">ߦߌߟߡߊߙߋ߲߫ ߕߴߦߋ߲߬</string>
<string name="no_depiction_found">ߘߊ߲߬ߠߊ߬ߕߍ߰ߟߌ ߡߊ߫ ߛߐ߬ߘߐ߲߬</string>
<string name="upload_cancelled">ߟߊ߬ߦߟߍ߬ߟߌ ߘߊߓߌ߬ߟߊ߬</string>
<string name="previous_image_title_description_not_found">ߓߟߏߡߟߊ߫ ߛߌ߫ ߕߍ߫ ߖߌ߬ߦߊ߬ߓߍ ߣߊ߬ߕߐ ߞߎ߲߬ߕߐ߮ ߟߊ߫ ߥߟߴߊ߬ ߞߊ߲߬ߛߓߍߟߌ</string>
<string name="dialog_box_text_nomination">ߡߎ߲߬ߠߊ߫ %1$s ߖߏ߬ߛߌ߬ߕߐ߫؟</string>
<string name="review_is_uploaded_by">%1$s ߟߊߦߟߍ߬ߣߍ߲߬ ߦߋ߫: %2$s ߟߋ߬ ߓߟߏ߫</string>
<string name="default_description_language">ߞߊ߲߬ߛߓߍߟߌ ߞߍ߫ ߞߊ߲ ߓߊߖߎߡߊ</string>
@ -319,6 +339,7 @@
<string name="delete_helper_show_deletion_message_if">%1$s ߕߐ߯ߦߊߟߌ ߦߴߌ ߘߐ߫ ߖߏ߬ߛߌ߬ߟߌ ߞߊ߲ߡߊ߬</string>
<string name="delete_helper_show_deletion_title_failed">ߊ߬ ߓߘߊ߫ ߗߌߙߏ߲߫</string>
<string name="delete_helper_show_deletion_message_else">ߌ ߕߍ߫ ߛߋ߫ ߖߏ߰ߛߌ߬ߟߌ ߡߊߢߌߣߌ߲߫ ߠߊ߫</string>
<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_press_photo">ߖߌ߬ߦߊ߬ߓߍ ߜߍ߬ߙߍ߲߬ߘߍ߬ߣߍ߲</string>
@ -329,7 +350,17 @@
<string name="no_achievements_yet">ߌ ߡߊ߫ ߓߟߏߓߌߟߊߢߐ߲߯ߞߊ߲ ߛߌ߫ ߞߍ߫ ߡߎߣߎ߲߬</string>
<string name="account_created">ߖߊ߬ߕߋ߬ߘߊ ߓߘߊ߫ ߛߌ߲ߘߌ߫߹</string>
<string name="some_error">ߝߎ߬ߕߎ߲߬ߕߌ ߘߏ߫ ߕߘߍ߬ ߦߋ߫ ߦߋ߲߬߹</string>
<string name="place_state_exists">ߊ߬ ߦߋ߫ ߦߋ߲߬</string>
<string name="place_state_needs_photo">ߡߊ߬ߞߏ ߦߋ߫ ߖߌ߬ߦߊ߬ߓߍ ߟߊ߫</string>
<string name="place_type">ߦߙߐ ߛߎ߯ߦߊ:</string>
<string name="nearby_search_hint">ߛߍ߲߸ ߗߍߓߏ߲߸ ߖߌ߬ߦߊ߬ߓߏ߲ ߊ߬ ߣߌ߫.</string>
<string name="you_must_reset_your_passsword">ߞߏ ߘߏ߫ ߓߍ߲߬ ߣߍ߲߬ ߕߍ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߘߐ߫߸ ߌ ߦߴߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߝߊ߲߬ߟߋ߲߬߹߹</string>
<string name="title_for_child_classes">ߘߋ߲ ߠߎ߬ ߟߊ߫ ߛߊ߯ߘߊ ߟߎ߫</string>
<string name="title_for_parent_classes">ߡߏߦߌߓߊ߮ ߟߎ߬ ߟߊ߫ ߛߊ߯ߘߊ ߟߎ߫</string>
<string name="upload_nearby_place_found_title">ߛߌ߰ߢߐ߲߰ ߦߙߐ ߦߴߊ߬ ߘߐ߫</string>
<string name="upload_nearby_place_found_description">ߦߙߐ %1$s ߖߌ߬ߦߊ߬ߓߍ ߟߋ߬ ߦߋ߫ ߣߌ߲߬ ߘߌ߫ ߓߊ߬؟</string>
<string name="theme_dark_name">ߘߌ߬ߓߌ</string>
<string name="theme_light_name">ߦߋߟߋ߲</string>
<string name="load_more">ߘߏߜߘߍ߫ ߟߎ߫ ߟߊߢߎ߲߫</string>
<string name="add_picture_to_wikipedia_article_title">ߖߌ߬ߦߊ߬ߓߍ ߝߙߊ߬ ߥߞߌߔߋߘߌߦߊ ߞߊ߲߬</string>
<string name="add_picture_to_wikipedia_article_desc">ߌ ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߖߌ߬ߦߊ߬ߓߍ ߣߌ߲߬ ߓߌ߬ߟߊ߬ %1$ ߞߊ߲ ߥߞߌߔߋߘߌߦߊ ߞߎߡߘߊ ߟߊ߫ ߓߊ߬؟</string>

View file

@ -15,6 +15,7 @@
* Rezonansowy
* Rzuwig
* Sp5uhe
* Strebski
* Ty221
* Vesihiisi
* WaldiSt
@ -58,6 +59,12 @@
<item quantity="many">%1$d Przesłanych</item>
<item quantity="other">Przesłania</item>
</plurals>
<plurals name="receiving_shared_content">
<item quantity="one">Odbieranie udostępnianych treści. Przetwarzanie obrazu może zająć trochę czasu, w zależności od jego rozmiaru i urządzenia</item>
<item quantity="few">Odbieranie udostępnionej treści. Przetwarzanie obrazów może zająć trochę czasu, w zależności od ich rozmiaru i urządzenia</item>
<item quantity="many">Odbieranie udostępnionej treści. Przetwarzanie obrazów może zająć trochę czasu, w zależności od ich rozmiaru i urządzenia</item>
<item quantity="other"/>
</plurals>
<string name="title_activity_explore">Odkrywaj</string>
<string name="navigation_item_explore">Odkrywaj</string>
<string name="preference_category_appearance">Wygląd</string>
@ -71,7 +78,7 @@
<string name="intent_share_upload_label">Prześlij do Commons</string>
<string name="username">Nazwa użytkownika</string>
<string name="password">Hasło</string>
<string name="login_credential">Zaloguj sie do Commons Beta</string>
<string name="login_credential">Zaloguj się na konto Commons Beta</string>
<string name="login">Zaloguj się</string>
<string name="forgot_password">Nie pamiętasz hasła?</string>
<string name="signup">Zarejestruj się</string>
@ -88,7 +95,9 @@
<string name="upload_progress_notification_title_in_progress">Wysyłanie %1$s</string>
<string name="upload_progress_notification_title_finishing">Zakończono wysyłanie pliku %1$s</string>
<string name="upload_failed_notification_title">Wysyłanie %1$s nieudane</string>
<string name="upload_paused_notification_title">Zatrzymano przesyłanie %1$ plików</string>
<string name="upload_failed_notification_subtitle">Dotknij, aby zobaczyć</string>
<string name="upload_paused_notification_subtitle">Dotknij, aby zobaczyć</string>
<string name="title_activity_contributions">Niedawno przesłane</string>
<string name="contribution_state_queued">W kolejce</string>
<string name="contribution_state_failed">Porażka</string>
@ -198,7 +207,7 @@
<string name="welcome_final_button_text">Tak!</string>
<string name="welcome_help_button_text">Więcej informacji</string>
<string name="detail_panel_cats_label">Kategorie</string>
<string name="detail_panel_cats_loading">Ładowanie…</string>
<string name="detail_panel_cats_loading">Wczytywanie…</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>
@ -284,7 +293,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="caption_info" fuzzy="true">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>
@ -348,10 +357,13 @@
<string name="retry">Ponów próbę</string>
<string name="showcase_view_got_it_button">Wszystko jasne!</string>
<string name="showcase_view_whole_nearby_activity">Kliknięcie „WYSZUKAJ TEN OBSZAR” blokuje mapę i rozpoczyna pobliskie wyszukiwanie w tej lokalizacji.</string>
<string name="showcase_view_needs_photo">To miejsce wymaga zdjęcia.</string>
<string name="showcase_view_has_photo">To miejsce już posiada zdjęcie.</string>
<string name="showcase_view_no_longer_exists">To miejsce już nie istnieje.</string>
<string name="showcase_view_list_icon">Stuknięcie tego przycisku powoduje wyświetlenie listy tych miejsc</string>
<string name="showcase_view_plus_fab">Możesz przesłać zdjęcie do dowolnego miejsca ze swojej galerii lub aparatu</string>
<string name="no_images_found">Nie znaleziono grafik!</string>
<string name="error_loading_images">Wystąpił błąd podczas ładowania grafik.</string>
<string name="error_loading_images">Wystąpił błąd podczas wczytywania grafik.</string>
<string name="image_uploaded_by">Przesłano przez %1$s</string>
<string name="block_notification_title">Zablokowany(-a)</string>
<string name="block_notification">Zostałeś zablokowany(-a) w Commons</string>
@ -363,9 +375,9 @@
<string name="title_activity_search">Szukaj</string>
<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_categories">Wystąpił błąd podczas wczytywania 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="error_loading_subcategories">Wystąpił błąd podczas wczytywania 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>
@ -431,6 +443,7 @@
<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="no_close_nearby">Nie odnaleziono pobliskich Tobie miejsc</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>
@ -468,6 +481,7 @@
<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="no_depictions_selected_warning_desc">Obrazy ze wskazanymi przedstawieniami są łatwiejsze do znalezienia i częściej używane. Czy na pewno chcesz kontynuować bez wybierania przedstawień?</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>
@ -479,6 +493,7 @@
<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">Wyświetl kampanie</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>
@ -512,6 +527,7 @@
<string name="review_thanks">Czy chciałbyś podziękować autorowi?</string>
<string name="review_spam_explanation">Kliknij NIE, aby nominować ten obraz do usunięcia, jeśli nie jest w ogóle przydatny.</string>
<string name="review_copyright_explanation">Logo, zrzuty ekranu, plakaty filmowe często stanowią naruszenie praw autorskich.\nKliknij NIE, aby nominować ten obraz do usunięcia</string>
<string name="review_thanks_explanation">%1$s będzie wdzięczny za Twoje docenienie</string>
<string name="review_no_category">Och, to nie jest nawet skategoryzowane!</string>
<string name="review_category_explanation">Ten obraz należy do kategorii %1$s</string>
<string name="review_spam_report_question">Jest poza zakresem, ponieważ jest</string>
@ -593,6 +609,8 @@
<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="title_for_child_classes">KLASY POTOMNE</string>
<string name="title_for_parent_classes">KLASY NADRZĘDNE</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>
@ -611,7 +629,7 @@
<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="load_more">Wczytaj więcej</string>
<string name="nearby_no_results">Nie znaleziono miejsc, spróbuj zmienić kryteria wyszukiwania.</string>
<string name="add_picture_to_wikipedia_article_title">Dodaj obraz do Wikipedii</string>
<string name="add_picture_to_wikipedia_article_desc">Czy chcesz dodać to zdjęcie do artykułu w Wikipedii w języku %1$s?</string>
@ -627,4 +645,7 @@
<string name="wikipedia_instructions_step_6">6. Edytuj wikitekst w celu odpowiedniego pozycjonowania, jeśli to konieczne. Aby uzyskać więcej informacji, zobacz &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. Opublikuj artykuł</string>
<string name="copy_wikicode_to_clipboard">Skopiuj wikicode do schowka</string>
<string name="pause">zatrzymaj</string>
<string name="resume">wznów</string>
<string name="paused">Zatrzymano</string>
</resources>

View file

@ -63,7 +63,9 @@
<string name="upload_progress_notification_title_in_progress">%1$s carià</string>
<string name="upload_progress_notification_title_finishing">Fin dël cariament %1$s</string>
<string name="upload_failed_notification_title">Cariament falì a %1$s</string>
<string name="upload_paused_notification_title">Cariament %1$s an pàusa</string>
<string name="upload_failed_notification_subtitle">Sgnaché për ësmon-e</string>
<string name="upload_paused_notification_subtitle">Sgnaché për vëdde</string>
<string name="title_activity_contributions">Ij mè cariament recent</string>
<string name="contribution_state_queued">An coa</string>
<string name="contribution_state_failed">Falì</string>
@ -259,7 +261,7 @@
<string name="error_while_cache">Eror antramentre ch\'as butavo le plance an memòria local</string>
<string name="title_info">Un tìtol dëscritiv ùnich për l\'archivi, che a servirà com nòm d\'archivi. A peul dovré un lengagi sempi con djë spassi. Ch\'a ancluda pa l\'estension dl\'archivi</string>
<string name="description_info">Për piasì, ch\'a descriva ël mojen mej ch\'a peul: Andoa a l\'é stàit fàit? Për piasì, ch\'a descriva j\'oget o le përson-e. Ch\'a arvela j\'anformassion ch\'a l\'é nen belfé andviné, për esempi l\'ora dël dì, s\'a l\'é un panorama. Si ël mojen a smon cheicòs ëd foravìa, për piasì ch\'a spiega lòn ch\'a lo rend foravìa.</string>
<string name="caption_info">Për piasì, ch\'a scriva na curta descrission ëd la plancia (limità a 255 caràter).</string>
<string name="caption_info" fuzzy="true">Për piasì, ch\'a scriva na curta descrission ëd la plancia (limità a 255 caràter).</string>
<string name="upload_image_too_dark">Sa plancia a l\'é tròp sombra, e-lo sigur ëd vorèj cariela? Wikipedia Commons a l\'é mach për plance con un valor enciclopédich.</string>
<string name="upload_image_blurry">Sa plancia a l\'é tërbola, e-lo sigur ëd vorèj cariela? Wikipedia Comun a l\'é mach për plance con un valor enciclopédich.</string>
<string name="upload_problem_exist">Problema potensiaj con costa plancia:</string>
@ -323,6 +325,9 @@
<string name="retry">Prové torna</string>
<string name="showcase_view_got_it_button">Fàit!</string>
<string name="showcase_view_whole_nearby_activity">A-i é dij pòst davzin a chiel ch\'a l\'han da manca ëd plance për ilustré ij sò artìcoj su Wikipedia.\n\nSgnaché su \'SËRCHÉ AN COSTA ZÒNA\' a blòca la carta e a fa parte n\'arserca ëd prossimità davzin a cola posission.</string>
<string name="showcase_view_needs_photo">Ës pòst-sì a l\'ha damanca ëd na fòto.</string>
<string name="showcase_view_has_photo">Ës pòst-sì a l\'ha già na fòto.</string>
<string name="showcase_view_no_longer_exists">Ës pòst a esist pi.</string>
<string name="showcase_view_list_icon">Sgnacand su \'s boton a comparirà na lista ëd si pòst</string>
<string name="showcase_view_plus_fab">A peul carié na fòto da \'n pòst qualsëssìa ëd soa galarìa o màchina fòto</string>
<string name="no_images_found">Gnun-e plance trovà!</string>
@ -608,4 +613,7 @@
<string name="wikipedia_instructions_step_6">6. Modifiché ël wikitest për posissionelo bin, si necessari. Për pi d\'anformassion, vëdde &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. Publiché l\'artìcol</string>
<string name="copy_wikicode_to_clipboard">Copié ël còdes wiki an sla taulëtta</string>
<string name="pause">pàusa</string>
<string name="resume">ancaminé torna</string>
<string name="paused">An pàura</string>
</resources>

View file

@ -77,7 +77,9 @@
<string name="upload_progress_notification_title_in_progress">%1$s enviando!</string>
<string name="upload_progress_notification_title_finishing">Terminando o envio de %1$s</string>
<string name="upload_failed_notification_title">Envio de %1$s falhou</string>
<string name="upload_paused_notification_title">Envio de %1$s em pausa</string>
<string name="upload_failed_notification_subtitle">Toque para ver</string>
<string name="upload_paused_notification_subtitle">Toque para ver</string>
<string name="title_activity_contributions">Meus envios recentes</string>
<string name="contribution_state_queued">Na fila</string>
<string name="contribution_state_failed">Falhou</string>
@ -273,7 +275,7 @@
<string name="error_while_cache">Erro durante o cache de imagens</string>
<string name="title_info">Um título descritivo exclusivo para o arquivo, que servirá como um nome de arquivo. Você pode usar linguagem simples com espaços. Não inclua a extensão do arquivo</string>
<string name="description_info">Por favor, descreva a mídia tanto quanto possível: onde foi tomada? O que isso mostra? Qual é o contexto? Descreva os objetos ou pessoas. Revelar informações que não podem ser facilmente adivinhadas, por exemplo, a hora do dia, se for uma paisagem. Se a mídia mostrar algo incomum, explique o que torna incomum.</string>
<string name="caption_info">Por favor, escreva uma breve descrição da imagem. (Limite a 255 caracteres)</string>
<string name="caption_info" fuzzy="true">Por favor, escreva uma breve descrição da imagem. (Limite a 255 caracteres)</string>
<string name="upload_image_too_dark">Esta foto está muito escura, você tem certeza de que deseja enviá-la? O Wikimedia Commons é apenas para imagens com valor enciclopédico.</string>
<string name="upload_image_blurry">Esta foto está embaçada, tem certeza de que deseja enviá-la? O Wikimedia Commons é apenas para imagens com valor enciclopédico.</string>
<string name="upload_problem_exist">Problemas potenciais com esta imagem:</string>
@ -337,6 +339,9 @@
<string name="retry">Tentar novamente</string>
<string name="showcase_view_got_it_button">Entendido!</string>
<string name="showcase_view_whole_nearby_activity">Estes são os lugares perto de si que precisam de fotografias para ilustrar os respetivos artigos na Wikipédia.\n\nClicar em \'Pesquisar nesta área\' bloqueia a localização do mapa e inicia uma pesquisa de lugares na área circundante.</string>
<string name="showcase_view_needs_photo">Este lugar precisa de uma foto.</string>
<string name="showcase_view_has_photo">Este lugar já tem uma foto.</string>
<string name="showcase_view_no_longer_exists">Este lugar não existe mais.</string>
<string name="showcase_view_list_icon">Tocar neste botão fará surgir uma lista destes lugares</string>
<string name="showcase_view_plus_fab">Pode carregar uma fotografia para qualquer dos lugares, da sua galeria ou câmara</string>
<string name="no_images_found">Não foi encontrada nenhuma imagem!</string>
@ -622,4 +627,7 @@
<string name="wikipedia_instructions_step_6">6. Editar o wikitexto para o posicionamento apropriado, se necessário. Para mais informações, veja &lt;a href=\"https://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style/Images#How_to_place_an_image\"&gt;aqui&lt;/a&gt;.</string>
<string name="wikipedia_instructions_step_7">7. Publique o artigo</string>
<string name="copy_wikicode_to_clipboard">Copiar wikicode para a área de transferência</string>
<string name="pause">pausar</string>
<string name="resume">continuar</string>
<string name="paused">Pausado</string>
</resources>

View file

@ -77,7 +77,9 @@
<string name="upload_progress_notification_title_in_progress">A carregar %1$s</string>
<string name="upload_progress_notification_title_finishing">A terminar o carregamento de %1$s</string>
<string name="upload_failed_notification_title">O carregamento de %1$s falhou</string>
<string name="upload_paused_notification_title">Carregamento de %1$s em pausa</string>
<string name="upload_failed_notification_subtitle">Tocar para ver</string>
<string name="upload_paused_notification_subtitle">Tocar para ver</string>
<string name="title_activity_contributions">Carregamentos recentes</string>
<string name="contribution_state_queued">Em espera</string>
<string name="contribution_state_failed">Falhado</string>
@ -90,7 +92,9 @@
<string name="menu_share">Partilhar</string>
<string name="menu_open_in_browser">Ver no navegador</string>
<string name="share_title_hint">Legenda (obrigatória)</string>
<string name="add_caption_toast">Forneça uma legenda para este ficheiro, por favor</string>
<string name="share_description_hint">Descrição</string>
<string name="share_caption_hint">Legenda (limite de 255 caracteres)</string>
<string name="login_failed_network">Não é possível iniciar uma sessão - falha de rede</string>
<string name="login_failed_wrong_credentials">Não é possível iniciar uma sessão - verifique o seu nome de utilizador e a palavra-passe, por favor</string>
<string name="login_failed_throttled">Demasiadas tentativas mal sucedidas. Por favor, tente novamente dentro de minutos.</string>
@ -103,6 +107,7 @@
<string name="provider_modifications">Modificações</string>
<string name="menu_upload_single">Carregar</string>
<string name="categories_search_text_hint">Pesquisar categorias</string>
<string name="depicts_search_text_hint">Procurar elementos que o seu conteúdo multimédia retrata (montanha, o Taj Mahal, etc.)</string>
<string name="menu_save_categories">Gravar</string>
<string name="refresh_button">Atualizar</string>
<string name="display_list_button">Lista</string>
@ -110,6 +115,10 @@
<string name="enable_gps">Ativar GPS</string>
<string name="contributions_subtitle_zero">Ainda não foram enviados ficheiros</string>
<string name="categories_not_found">Não foi encontrada nenhuma categoria que corresponda a %1$s</string>
<string name="depictions_not_found">Não foi encontrado nenhum elemento Wikidata que corresponda a %1$s</string>
<string name="no_child_classes">%1$s não tem nenhuma classe descendente</string>
<string name="no_parent_classes">%1$s não tem nenhuma classe progenitora</string>
<string name="depictions_image_not_found">Não há nenhuma imagem para a representação</string>
<string name="categories_skip_explanation">Adicione categorias para tornar as suas imagens mais fáceis de encontrar na wiki Wikimedia Commons.\nComece a escrever para adicionar categorias.</string>
<string name="categories_activity_title">Categorias</string>
<string name="title_activity_settings">Configurações</string>
@ -126,6 +135,7 @@
<string name="menu_feedback">Enviar comentários (por correio eletrónico)</string>
<string name="no_email_client">Não foi instalado nenhum cliente de correio eletrónico</string>
<string name="provider_categories">Categorias usadas recentemente</string>
<string name="provider_depictions">Representações usadas recentemente</string>
<string name="waiting_first_sync">A aguardar pela primeira sincronização…</string>
<string name="no_uploads_yet">Não carregou ainda nenhuma foto.</string>
<string name="menu_retry_upload">Tentar novamente</string>
@ -136,7 +146,7 @@
<string name="use_previous">Usar título e descrição anteriores</string>
<string name="allow_gps">Obter automaticamente a localização atual</string>
<string name="allow_gps_summary">Se a imagem não estiver georreferenciada, obtém a localização atual e georreferencia a imagem com ela. Aviso: isto revela a sua localização corrente.</string>
<string name="preference_theme" fuzzy="true">Modo noturno</string>
<string name="preference_theme">Tema</string>
<string name="license_name_cc_by_sa_four">Atribuição-CompartilhaIgual 4.0</string>
<string name="license_name_cc_by_four">Atribuição 4.0</string>
<string name="license_name_cc_by_sa"> AtribuiçãoCompartilhaIgual 3.0</string>
@ -182,7 +192,8 @@
<string name="detail_panel_cats_loading">A carregar…</string>
<string name="detail_panel_cats_none">Nenhuma selecionada</string>
<string name="detail_caption_empty">Sem legenda</string>
<string name="detail_description_empty">Sem descrição</string>
<string name="detail_depiction_empty">Não há nenhuma representação</string>
<string name="detail_description_empty">Não há nenhuma descrição</string>
<string name="detail_discussion_empty">Não há nenhuma discussão</string>
<string name="detail_license_empty">Licença desconhecida</string>
<string name="menu_refresh">Atualizar</string>
@ -195,11 +206,14 @@
<string name="title_activity_nearby">Locais Próximos</string>
<string name="no_nearby">Não foi encontrado nenhum local próximo</string>
<string name="warning">Aviso</string>
<string name="upload_image_duplicate">Este ficheiro já existe na wiki Commons. Tem a certeza de que deseja continuar?</string>
<string name="duplicate_image_found">Foi encontrada uma imagem duplicada</string>
<string name="upload_image_duplicate">Este ficheiro já foi destruído na wiki Commons. Tem a certeza de que deseja continuar?</string>
<string name="upload">Carregar</string>
<string name="yes">Sim</string>
<string name="no">Não</string>
<string name="media_detail_caption">Legenda</string>
<string name="media_detail_title">Título</string>
<string name="media_detail_depiction">Representações</string>
<string name="media_detail_description">Descrição</string>
<string name="media_detail_discussion">Discussão</string>
<string name="media_detail_author">Autor</string>
@ -261,6 +275,7 @@
<string name="error_while_cache">Erro ao colocar imagens na cache</string>
<string name="title_info">Um título descritivo exclusivo para o ficheiro, que servirá como um nome de ficheiro. Pode utilizar uma linguagem simples com espaços. Não inclua a extensão do ficheiro</string>
<string name="description_info">Descreva o elemento multimédia da melhor forma possível, por favor. Onde foi tirado? O que é mostrado? Qual é o contexto? Descreva os objetos ou pessoas. Indique as informações que não podem ser facilmente adivinhadas; por exemplo, a hora do dia, se for uma paisagem. Se o ficheiro mostra algo incomum, explique o que é incomum.</string>
<string name="caption_info" fuzzy="true">Escreva uma breve descrição da imagem, por favor (limite de 255 caracteres).</string>
<string name="upload_image_too_dark">Esta imagem está demasiado escura; tem a certeza de que deseja carregá-la? A wiki Wikimedia Commons só aceita as imagens de valor enciclopédico.</string>
<string name="upload_image_blurry">Esta imagem está desfocada; tem a certeza de que deseja carregá-la? A wiki Wikimedia Commons serve apenas para imagens de valor enciclopédico.</string>
<string name="upload_problem_exist">Possíveis problemas com esta imagem:</string>
@ -270,6 +285,7 @@
<string name="upload_problem_different_geolocation">Esta fotografia foi tirada num local diferente.</string>
<string name="upload_problem_fbmd">Carregue só fotografias tiradas por si, por favor. Não carregue fotografias que encontrou na conta do Facebook de outra pessoa.</string>
<string name="upload_problem_do_you_continue">Quer, mesmo assim, carregar esta fotografia?</string>
<string name="upload_problem_image">Problemas encontrados na imagem</string>
<string name="internet_downloaded">Carregue só fotografias tiradas por si, por favor. Não carregue fotografias que tenha descarregado da Internet.</string>
<string name="give_permission">Permitir</string>
<string name="use_external_storage">Utilizar armazenamento externo</string>
@ -323,6 +339,9 @@
<string name="retry">Tentar novamente</string>
<string name="showcase_view_got_it_button">Entendido!</string>
<string name="showcase_view_whole_nearby_activity">Estes são os locais próximos de si que precisam de fotografias para ilustrar os respetivos artigos na Wikipédia.\n\nClicar em \'Pesquisar nesta área\' bloqueia a localização do mapa e inicia uma pesquisa de locais na área circundante.</string>
<string name="showcase_view_needs_photo">Este local precisa de uma foto.</string>
<string name="showcase_view_has_photo">Este local já tem uma foto.</string>
<string name="showcase_view_no_longer_exists">Este local já não existe.</string>
<string name="showcase_view_list_icon">Tocar neste botão fará surgir uma lista destes locais</string>
<string name="showcase_view_plus_fab">Pode carregar uma fotografia de qualquer local, vinda da sua galeria ou câmara</string>
<string name="no_images_found">Não foi encontrada nenhuma imagem!</string>
@ -339,6 +358,7 @@
<string name="search_recent_header">Pesquisas recentes:</string>
<string name="provider_searches">Consultas pesquisadas recentemente</string>
<string name="error_loading_categories">Ocorreu um erro ao carregar categorias.</string>
<string name="error_loading_depictions">Ocorreu um erro ao carregar representações.</string>
<string name="error_loading_subcategories">Ocorreu um erro ao carregar subcategorias.</string>
<string name="search_tab_title_media">Multimédia</string>
<string name="search_tab_title_categories">Categorias</string>
@ -402,7 +422,7 @@
<string name="contributions_fragment">Contribuições</string>
<string name="nearby_fragment">Aqui perto</string>
<string name="notifications">Notificações</string>
<string name="read_notifications" fuzzy="true">Notificações (arquivadas)</string>
<string name="read_notifications">Notificações (lidas)</string>
<string name="display_nearby_notification">Apresentar notificação de proximidade</string>
<string name="display_nearby_notification_summary">Toque aqui para ver o local mais próximo que precisa de fotos</string>
<string name="no_close_nearby">Não foi encontrado nenhum local próximo</string>
@ -442,6 +462,8 @@
<string name="desc_language_Pacific">Pacífico</string>
<string name="no_categories_selected">Não foi selecionada nenhuma categoria</string>
<string name="no_categories_selected_warning_desc">As imagens sem categorias só raramente são utilizáveis. Tem a certeza de que deseja continuar sem selecionar categorias?</string>
<string name="no_depictions_selected">Não foram selecionadas representações</string>
<string name="no_depictions_selected_warning_desc">As imagens com representações são encontradas mais facilmente e mais propensas a serem usadas. Tem a certeza de que deseja continuar sem selecionar representações?</string>
<string name="upload_flow_all_images_in_set">(Para todas as imagens do conjunto)</string>
<string name="search_this_area">Pesquisar nesta área</string>
<string name="nearby_card_permission_title">Pedido de permissões</string>
@ -451,6 +473,7 @@
<string name="display_location_permission_title">Apresentar permissões de localização</string>
<string name="display_location_permission_explanation">Pedir permissões de localização quando for necessário para a funcionalidade do cartão de notificação de proximidade.</string>
<string name="achievements_fetch_failed">Algo correu mal, não conseguimos obter as suas realizações</string>
<string name="achievements_fetch_failed_ultimate_achievement">As suas contribuições foram tantas que o nosso sistema de cálculo de realizações não consegue processá-las. Essa é a realização máxima.</string>
<string name="ends_on">Termina em:</string>
<string name="display_campaigns">Apresentar campanhas</string>
<string name="display_campaigns_explanation">Ver as campanhas em andamento</string>
@ -505,9 +528,9 @@
<string name="no_image_reverted">Não foi revertida nenhuma imagem</string>
<string name="no_image_uploaded">Não foi carregada nenhuma imagem</string>
<string name="no_notification">Não tem nenhuma notificação por ler</string>
<string name="no_read_notification" fuzzy="true">Não tem nenhuma notificação arquivada</string>
<string name="no_read_notification">Não tem nenhuma notificação lida</string>
<string name="share_logs_using">Partilhar os registos usando</string>
<string name="menu_option_read" fuzzy="true">Ver arquivadas</string>
<string name="menu_option_read">Ver lidas</string>
<string name="menu_option_unread">Ver não lidas</string>
<string name="error_occurred_in_picking_images">Ocorreu um erro ao escolher imagens</string>
<string name="image_chooser_title">Escolher imagens a carregar</string>
@ -515,6 +538,7 @@
<string name="images_featured_explanation">As fotografias destacadas são imagens de fotógrafos e ilustradores altamente qualificados, que a comunidade da wiki Wikimedia Commons escolheu como as de melhor qualidade do \'\'site\'\'.</string>
<string name="images_via_nearby_explanation">As imagens carregadas via \"Locais próximos\" são as imagens que são carregadas descobrindo locais do mapa.</string>
<string name="thanks_received_explanation">Esta funcionalidade permite que os editores enviem uma notificação de agradecimento aos utilizadores que fizerem edições úteis - usando uma pequena hiperligação de agradecimento na página do historial ou na de diferenças.</string>
<string name="previous_image_caption_description">Copiar legendas e descrição anteriores</string>
<string name="previous_button_tooltip_message">Clique para reutilizar o título e a descrição que inseriu na sua fotografia anterior e adequá-los à atual</string>
<string name="welcome_do_upload_content_description">Exemplos de imagens que podem ser carregadas na wiki Commons</string>
<string name="welcome_dont_upload_content_description">Exemplos de imagens que não devem ser carregadas</string>
@ -533,6 +557,7 @@
<string name="share_via">Partilhar aplicação por...</string>
<string name="image_info">Informação da imagem</string>
<string name="no_categories_found">Não foi encontrada nenhuma categoria</string>
<string name="no_depiction_found">Não foi encontrada nenhuma representação</string>
<string name="upload_cancelled">Carregamento cancelado</string>
<string name="previous_image_title_description_not_found">Não há dados para o título ou descrição da imagem anterior</string>
<string name="dialog_box_text_nomination">Porque deve %1$s ser eliminado?</string>
@ -566,11 +591,43 @@
<string name="nearby_search_hint">Ponte, museu, hotel, etc.</string>
<string name="you_must_reset_your_passsword">Ocorreu algo de errado com a sessão, tem de redefinir a sua palavra-passe!</string>
<string name="title_for_media">MULTIMÉDIA</string>
<string name="title_for_child_classes">CLASSES DESCENDENTES</string>
<string name="title_for_parent_classes">CLASSES PROGENITORAS</string>
<string name="upload_nearby_place_found_title">Foi encontrado um local próximo</string>
<string name="upload_nearby_place_found_description">Isto é uma foto do local %1$s?</string>
<string name="title_app_shortcut_explore">Explorar</string>
<string name="title_app_shortcut_bookmark">Marcadores</string>
<string name="title_app_shortcut_setting">Definições</string>
<string name="remove_bookmark">Removido dos marcadores</string>
<string name="add_bookmark">Adicionado aos marcadores</string>
<string name="wallpaper_set_unsuccessfully">Ocorreu um problema. Não foi possível definir a imagem de fundo</string>
<string name="setting_wallpaper_dialog_title">Definir como imagem de fundo</string>
<string name="setting_wallpaper_dialog_message">A definir a imagem de fundo. Aguarde, por favor...</string>
<string name="theme_default_name">Seguir sistema</string>
<string name="theme_dark_name">Escuro</string>
<string name="theme_light_name">Claro</string>
<string name="cannot_open_location_settings">Não foi possível abrir as definições de localização. Ative a localização manualmente, por favor</string>
<string name="recommend_high_accuracy_mode">Para obter os melhores resultados, escolha o modo Alta Precisão.</string>
<string name="ask_to_turn_location_on">Ativar a localização?</string>
<string name="nearby_needs_location">A funcionalidade de proximidade precisa que a localização esteja ativada para funcionar corretamente</string>
<string name="use_location_from_similar_image">Tirou estas duas fotos no mesmo lugar? Quer usar a latitude/longitude da fotografia da direita?</string>
<string name="load_more">Carregar mais</string>
<string name="nearby_no_results">Não foi encontrado nenhum local; tente alterar os seus critérios de pesquisa.</string>
<string name="add_picture_to_wikipedia_article_title">Adicionar imagem à Wikipédia</string>
<string name="add_picture_to_wikipedia_article_desc">Deseja adicionar esta fotografia ao artigo da Wikipédia em %1$s?</string>
<string name="add_picture_to_wikipedia_instructions_title">Instruções</string>
<string name="add_picture_to_wikipedia_instructions_desc">Tenha o cuidado de seguir as diretrizes de edição!</string>
<string name="confirm">Confirmar</string>
<string name="instructions_title">Instruções</string>
<string name="wikipedia_instructions_step_1">1. Usar o seguinte texto wiki:</string>
<string name="wikipedia_instructions_step_2">2. Clicar em \"Confirmar\" abrirá o artigo da Wikipédia</string>
<string name="wikipedia_instructions_step_3">3. Encontrar uma secção apropriada no artigo para a sua imagem</string>
<string name="wikipedia_instructions_step_4">4. Clicar o ícone \"Editar\" (que parece um lápis) dessa secção.</string>
<string name="wikipedia_instructions_step_5">5. Inserir o texto wiki no local apropriado.</string>
<string name="wikipedia_instructions_step_6">6. Editar o texto wiki para colocar no posicionamento apropriado, se necessário. Para mais informações, ver &lt;a href=\"https://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style/Images#How_to_place_an_image\"&gt;aqui&lt;/a&gt;.</string>
<string name="wikipedia_instructions_step_7">7. Publicar o artigo</string>
<string name="copy_wikicode_to_clipboard">Copiar código wiki para a área de transferência</string>
<string name="pause">pausar</string>
<string name="resume">continuar</string>
<string name="paused">Em pausa</string>
</resources>

View file

@ -270,7 +270,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="caption_info" fuzzy="true">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>

View file

@ -12,6 +12,7 @@
* Iluvatar
* Kaganer
* MaxBioHazard
* Monirec
* Movses
* Nitch
* Okras
@ -207,6 +208,7 @@
<string name="detail_panel_cats_label">Категории</string>
<string name="detail_panel_cats_loading">Загрузка…</string>
<string name="detail_panel_cats_none">Ничего не выбрано</string>
<string name="detail_caption_empty">Без подписи</string>
<string name="detail_description_empty">Нет описания</string>
<string name="detail_discussion_empty">Обсуждений нет</string>
<string name="detail_license_empty">Неизвестная лицензия</string>
@ -287,7 +289,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="caption_info" fuzzy="true">Пожалуйста, напишите краткое описание изображения (не более 255 символов).</string>
<string name="upload_image_too_dark">Это изображение слишком тёмное. Вы уверены, что хотите его загрузить? Викисклад подходит только для изображений, имеющих энциклопедическую ценность.</string>
<string name="upload_image_blurry">Это изображение размыто. Вы уверены, что хотите его загрузить? Викисклад подходит только для изображений, имеющих энциклопедическую ценность.</string>
<string name="upload_problem_exist">Потенциальные проблемы с этим изображением:</string>
@ -430,7 +432,7 @@
<string name="contributions_fragment">Вклад</string>
<string name="nearby_fragment">Поблизости</string>
<string name="notifications">Уведомления</string>
<string name="read_notifications" fuzzy="true">Уведомления (архивированные)</string>
<string name="read_notifications">Уведомления (читать)</string>
<string name="display_nearby_notification">Уведомлять меня о местах поблизости</string>
<string name="display_nearby_notification_summary">Нажмите здесь, чтобы увидеть ближайшее место без изображений</string>
<string name="no_close_nearby">Не найдено мест поблизости</string>
@ -620,6 +622,8 @@
<string name="nearby_no_results">Мест не найдено, попытайтесь изменить критерии поиска.</string>
<string name="add_picture_to_wikipedia_article_title">Добавить изображение в Википедию</string>
<string name="add_picture_to_wikipedia_instructions_title">Инструкции</string>
<string name="add_picture_to_wikipedia_instructions_desc">Соблюдайте правила редактирования!</string>
<string name="confirm">Подтвердить</string>
<string name="instructions_title">Инструкции</string>
<string name="copy_wikicode_to_clipboard">Скопировать вики-код в буфер обмена</string>
</resources>

View file

@ -5,11 +5,14 @@
* Luky001
* Patriccck
* Sudo77(new)
* TomášPolonec
-->
<resources>
<plurals name="uploads_pending_notification_indicator" fuzzy="true">
<plurals name="uploads_pending_notification_indicator">
<item quantity="one">nahráva sa %1$d súbor</item>
<item quantity="other">nahrávajú sa %1$d súbory</item>
<item quantity="few">nahrávajú sa %1$d súbory</item>
<item quantity="many">nahráva sa %1$d súborov</item>
<item quantity="other">nahráva sa %1$d súborov</item>
</plurals>
<plurals name="contributions_subtitle" fuzzy="true">
<item quantity="zero">\@string/contributions_subtitle_zero</item>
@ -103,6 +106,9 @@
<string name="contributions_subtitle_zero">Žiadne nahrané súbory</string>
<string name="categories_not_found">Žiadne kategórie nezodpovedajú „%1$s“</string>
<string name="depictions_not_found">Neboli nájdené žiadne položky Wikiúdajov zhodujúce sa s %1$s</string>
<string name="no_child_classes">%1$s nemá žiadne dcérske triedy</string>
<string name="no_parent_classes">%1$s nemá žiadne rodičovské triedy</string>
<string name="depictions_image_not_found">Žiaden obrázok na zobrazenie</string>
<string name="categories_skip_explanation">Pridajte kategórie, aby bolo vaše obrázky možné na Wikimedia Commons nájsť.\nPre pridanie kategórií začnite písať.</string>
<string name="categories_activity_title">Kategórie</string>
<string name="title_activity_settings">Nastavenia</string>
@ -119,6 +125,7 @@
<string name="menu_feedback">Odoslať spätnú väzbu (emailom)</string>
<string name="no_email_client">Nemáte nainštalovaného žiadneho e-mailového klienta</string>
<string name="provider_categories">Nedávno použité kategórie</string>
<string name="provider_depictions">Nedávno použité zobrazenia</string>
<string name="waiting_first_sync">Čaká sa na prvú synchronizáciu…</string>
<string name="no_uploads_yet">Ešte ste nenahrali žiadne fotografie.</string>
<string name="menu_retry_upload">Znova</string>
@ -175,6 +182,7 @@
<string name="detail_panel_cats_loading">Načítava sa…</string>
<string name="detail_panel_cats_none">Nič nebolo vybrané</string>
<string name="detail_caption_empty">Žiadny titulok</string>
<string name="detail_depiction_empty">Žiadne zobrazenie</string>
<string name="detail_description_empty">Bez popisu</string>
<string name="detail_discussion_empty">Žiadna diskusia</string>
<string name="detail_license_empty">Neznáma licencia</string>
@ -193,7 +201,9 @@
<string name="upload">Nahrať</string>
<string name="yes">Áno</string>
<string name="no">Nie</string>
<string name="media_detail_caption">Titulok</string>
<string name="media_detail_title">Názov</string>
<string name="media_detail_depiction">Zobrazenia</string>
<string name="media_detail_description">Popis</string>
<string name="media_detail_discussion">Diskusia</string>
<string name="media_detail_author">Autor</string>
@ -255,6 +265,7 @@
<string name="error_while_cache">Chyba pri ukladaní obrázkov</string>
<string name="title_info">Jedinečný popis súboru, ktorý bude slúžiť ako názov súboru. Môžete použiť bežný jazyk s medzerami. Nezadávajte príponu súboru.</string>
<string name="description_info">Opíšte obrázok čo najviac, ako je to len možné: Kde bol zhotovený? Čo znázorňuje? Aký je kontext obrázku? Popíšte, prosím, predmety alebo osoby na obrázku a nezabudnite na informácie, ktoré nie je možné ľahko odhadnúť zo samotného obrázku, ako je napríklad denná doba, pokiaľ ide o krajinu. Ak je na obrázku niečo neobvyklé, popíšte, čo ho robí neobvyklým.</string>
<string name="caption_info" fuzzy="true">Prosím napíšte krátky popis obrázku (maximálne 255 znakov).</string>
<string name="upload_image_too_dark">Tento obrázok je príliš tmavý. Ste si istí, že ho chcete nahrať? Wikimedia Commons slúži len na obrázky s encyklopedickou hodnotou.</string>
<string name="upload_image_blurry">Tento obrázok je rozmazaný. Ste si istí, že ho chcete nahrať? Wikimedia Commons slúži len na obrázky s encyklopedickou hodnotou.</string>
<string name="upload_problem_exist">Potenciálne problémy s týmto obrázkom:</string>
@ -317,6 +328,9 @@
<string name="retry">Obnoviť</string>
<string name="showcase_view_got_it_button">Rozumiem</string>
<string name="showcase_view_whole_nearby_activity">Toto sú miesta v blízkosti vašej súčasnej polohy, ktoré potrebujú fotografie na ilustráciu príslušných článkov na Wikipédii.\n\nKliknutím na PREHĽADAŤ TÚTO OBLASŤ sa zamkne mapa a spustí sa prehľadávanie okolia daného miesta.</string>
<string name="showcase_view_needs_photo">Toto miesto potrebuje obrázok.</string>
<string name="showcase_view_has_photo">Toto miesto už má obrázok.</string>
<string name="showcase_view_no_longer_exists">Toto miesto už nejestvuje.</string>
<string name="showcase_view_list_icon">Ťuknutím na toto tlačidlo otvoríte zoznam týchto miest</string>
<string name="showcase_view_plus_fab">Môžete nahrať obrázok akéhokoľvek z týchto miest z vašej galérie alebo priamo z fotoaparátu.</string>
<string name="no_images_found">Neboli nájdené žiadne obrázky!</string>
@ -333,9 +347,11 @@
<string name="search_recent_header">Nedávne hľadania:</string>
<string name="provider_searches">Nedávno hľadané dopyty</string>
<string name="error_loading_categories">Chyba pri načítaní kategórií.</string>
<string name="error_loading_depictions">Chyba pri načítaní zobrazení.</string>
<string name="error_loading_subcategories">Chyba pri načítaní podkategórií.</string>
<string name="search_tab_title_media">Multimediálne súbory</string>
<string name="search_tab_title_categories">Kategórie</string>
<string name="search_tab_title_depictions">Položky</string>
<string name="explore_tab_title_featured">Najlepšie</string>
<string name="explore_tab_title_mobile">Nahrané mobilom</string>
<string name="successful_wikidata_edit">Obrázok bol pridaný do položky %1$s na Wikiúdajoch!</string>
@ -395,7 +411,7 @@
<string name="contributions_fragment">Príspevky</string>
<string name="nearby_fragment">V okolí</string>
<string name="notifications">Upozornenia</string>
<string name="read_notifications" fuzzy="true">Upozornenia (prečítané)</string>
<string name="read_notifications">Upozornenia (prečítané)</string>
<string name="display_nearby_notification">Zobraziť notifikáciu o miestach v okolí</string>
<string name="display_nearby_notification_summary">Kliknutím sem sa zobrazí najbližšie miesto, ktoré potrebuje obrázky</string>
<string name="no_close_nearby">Vo vašej blízkosti neboli nájdené žiadne miesta</string>
@ -434,7 +450,8 @@
<string name="desc_language_Asia">Ázia</string>
<string name="desc_language_Pacific">Tichomorie</string>
<string name="no_categories_selected">Neboli vybrané žiadne kategórie</string>
<string name="no_categories_selected_warning_desc" fuzzy="true">Obrázky bez kategórií sú používané len zriedka. Naozaj chcete nahrať obrázok bez výberu kategórií?</string>
<string name="no_categories_selected_warning_desc">Obrázky bez kategórií sú zriedka použiteľné. Naozaj chcete nahrať obrázok bez výberu kategórií?</string>
<string name="no_depictions_selected">Neboli zvolené žiadne zobrazenia</string>
<string name="upload_flow_all_images_in_set">(Pre všetky obrázky v sade)</string>
<string name="search_this_area">Prehľadať túto oblasť</string>
<string name="nearby_card_permission_title">Je požadované oprávnenie</string>
@ -499,9 +516,9 @@
<string name="no_image_reverted">Žiadne revertované obrázky</string>
<string name="no_image_uploaded">Žiadne nahrané obrázky</string>
<string name="no_notification">Nemáte žiadne neprečítané upozornenia</string>
<string name="no_read_notification" fuzzy="true">Nemáte žiadne prečítané upozornenia</string>
<string name="no_read_notification">Nemáte žiadne prečítané upozornenia</string>
<string name="share_logs_using">Zdieľať log pomocou</string>
<string name="menu_option_read" fuzzy="true">Zobraziť prečítané</string>
<string name="menu_option_read">Zobraziť prečítané</string>
<string name="menu_option_unread">Zobraziť neprečítané</string>
<string name="error_occurred_in_picking_images">Nastala chyba pri vyberaní obrázkov</string>
<string name="image_chooser_title">Vyberte obrázky, ktoré chcete nahrať</string>
@ -509,6 +526,7 @@
<string name="images_featured_explanation">Najlepšie obrázky sú fotografie od vysoko skúsených fotografov a ilustrátorov, ktoré vybrala komunita Wikimedie Commons ako jedny z najkvalitnejších na stránke.</string>
<string name="images_via_nearby_explanation">Obrázky nahrané cez Miesta v okolí sú obrázky, ktoré sú nahrané vďaka objavovaniu miest na mape.</string>
<string name="thanks_received_explanation">Táto funkcia umožňuje poslať poďakovanie za užitočné úpravy používateľom použitím malého odkazu poďakovať v histórií stránky alebo na stránke rozdielu medzi revíziami.</string>
<string name="previous_image_caption_description">Kopírovať predchádzajúce titulky a popis</string>
<string name="previous_button_tooltip_message">Kliknutím znovu použijete názov a popis, ktorý ste zadali pri predchádzajúcom obrázku, a upravíte ho tak, aby vyhovoval vášmu aktuálnemu obrázku</string>
<string name="welcome_do_upload_content_description">Príklady dobrých obrázkov na nahranie na Commons</string>
<string name="welcome_dont_upload_content_description">Príklady obrázkov, ktoré by ste nemali nahrávať</string>
@ -572,6 +590,22 @@
<string name="theme_default_name" fuzzy="true">Predvolený</string>
<string name="theme_dark_name">Tmavý</string>
<string name="theme_light_name">Svetlý</string>
<string name="recommend_high_accuracy_mode">Pre najpresnejšie výsledky zvoľte režim vysokej presnosti.</string>
<string name="ask_to_turn_location_on">Zapnúť lokáciu?</string>
<string name="load_more">Načítať ďalšie</string>
<string name="nearby_no_results">Neboli nájdené žiadne miesta, skúste zmeniť vyhľadávacie kritériá.</string>
<string name="add_picture_to_wikipedia_article_title">Pridať obrázok na Wikipédiu</string>
<string name="add_picture_to_wikipedia_article_desc">Chcete pridať tento obrázok do článku na %1$s Wikipédii?</string>
<string name="add_picture_to_wikipedia_instructions_title">Pokyny</string>
<string name="add_picture_to_wikipedia_instructions_desc">Dbajte na to, aby ste sa držali návodov na editovanie!</string>
<string name="confirm">Potvrdiť</string>
<string name="instructions_title">Inštrukcie</string>
<string name="wikipedia_instructions_step_1">1. Použiť nasledovný wikitext:</string>
<string name="wikipedia_instructions_step_2">2. Po kliknutí na „Potvrdiť“ sa otvorí článok na Wikipédii</string>
<string name="wikipedia_instructions_step_3">3. Nájdite vhodný odsek v článku pre Váš obrázok</string>
<string name="wikipedia_instructions_step_4">4. Kliknite na ikonku „Upraviť“ (tú s ceruzkou) pre daný odsek.</string>
<string name="wikipedia_instructions_step_5">5. Vložte wikitext na vhodné miesto.</string>
<string name="wikipedia_instructions_step_6">6. Ak načim, upravte wikitext pre vhodné umiestnenie. Pre viac informácií, pozrite &lt;a href=\"https://sk.wikipedia.org/wiki/Pomoc:Obr%C3%A1zok#Vlo%C5%BEenie_obr%C3%A1zku_do_%C4%8Dl%C3%A1nku\"&gt;sem&lt;/a&gt;.</string>
<string name="wikipedia_instructions_step_7">7. Uložte článok</string>
<string name="copy_wikicode_to_clipboard">Skopírujte wikikód</string>
</resources>

View file

@ -5,6 +5,7 @@
* Ainali
* Jopparn
* Liuxinyu970226
* Sabelöga
* Skalman
* Tor.klingberg
* WikiPhoenix
@ -32,12 +33,12 @@
<item quantity="other">Dessa bilder kommer att licensieras under %1$s</item>
</plurals>
<plurals name="upload_count_title">
<item quantity="one">%1$d uppladdning</item>
<item quantity="other">%1$d uppladdningar</item>
<item quantity="one">%1$d Uppladdning</item>
<item quantity="other">%1$d Uppladdningar</item>
</plurals>
<plurals name="receiving_shared_content">
<item quantity="one">Hämtar delat innehåll. Det kan ta en stund att behandla bilden beroende på bildens storlek och din enhet</item>
<item quantity="other">Hämtar delat innehåll. Det kan ta en stund att behandla bilderna beroende på bildens storlek och din enhet</item>
<item quantity="other">Hämtar delat innehåll. Det kan ta en stund att behandla bilderna beroende på bildernas storlek och din enhet</item>
</plurals>
<string name="title_activity_explore">Utforska</string>
<string name="navigation_item_explore">Utforska</string>
@ -61,7 +62,7 @@
<string name="login_success">Inloggningen lyckades!</string>
<string name="login_failed">Det gick inte att logga in!</string>
<string name="upload_failed">Filen hittades inte. Försök med en annan fil.</string>
<string name="authentication_failed">Autentisering misslyckades, var god logga in igen!</string>
<string name="authentication_failed">Autentisering misslyckades, var god logga in igen</string>
<string name="uploading_started">Överföring påbörjad!</string>
<string name="upload_completed_notification_title">%1$s överförd!</string>
<string name="upload_completed_notification_text">Tryck för att visa din uppladdning</string>
@ -69,7 +70,9 @@
<string name="upload_progress_notification_title_in_progress">%1$s laddas upp</string>
<string name="upload_progress_notification_title_finishing">Avslutar uppladdning av %1$s</string>
<string name="upload_failed_notification_title">Uppladdning av %1$s misslyckades</string>
<string name="upload_paused_notification_title">Uppladdning av %1$s pausades</string>
<string name="upload_failed_notification_subtitle">Tryck för att visa</string>
<string name="upload_paused_notification_subtitle">Tryck för att visa</string>
<string name="title_activity_contributions">Mina senaste uppladdningar</string>
<string name="contribution_state_queued">Köade</string>
<string name="contribution_state_failed">Misslyckades</string>
@ -81,7 +84,7 @@
<string name="provider_contributions">Mina uppladdningar</string>
<string name="menu_share">Dela</string>
<string name="menu_open_in_browser">Visa i webbläsaren</string>
<string name="share_title_hint">Bildtext (nödvändigt)</string>
<string name="share_title_hint">Bildtext (obligatoriskt)</string>
<string name="add_caption_toast">Var god ange en bildtext för denna fil</string>
<string name="share_description_hint">Beskrivning</string>
<string name="share_caption_hint">Bildtext (maximalt 255 tecken)</string>
@ -122,7 +125,7 @@
<string name="about_privacy_policy">Integritetspolicy</string>
<string name="about_credits">Erkännande</string>
<string name="title_activity_about">Om</string>
<string name="menu_feedback">Skicka feedback (via e-post)</string>
<string name="menu_feedback">Skicka återkoppling (via e-post)</string>
<string name="no_email_client">Ingen e-postklient är installerad</string>
<string name="provider_categories">Nyligen använda kategorier</string>
<string name="provider_depictions">Senast använda skildringar</string>
@ -265,7 +268,7 @@
<string name="error_while_cache">Fel uppstod när bilder cachelagras</string>
<string name="title_info">En unik beskrivande titel för filen, som kommer att fungera som ett filnamn. Du kan använda klarspråk med mellanslag. Ta inte med filändelsen</string>
<string name="description_info">Beskriv mediafilen så mycket som möjligt. Var togs den? Vad visar den? Vad är sammanhanget? Beskriv föremålen eller personerna. Ge information som inte kan gissas fram, t.ex. tidpunkten om det är ett landskap. Om mediafilen visar någonting ovanligt, förklara vad som gör den ovanlig.</string>
<string name="caption_info">Var god skriv en kort beskrivning av bilden. (Maximalt 255 tecken)</string>
<string name="caption_info" fuzzy="true">Var god skriv en kort beskrivning av bilden. (Maximalt 255 tecken)</string>
<string name="upload_image_too_dark">Denna bild är för mörk, är du säker på att du vill ladda upp den? Wikimedia Commons är endast till för bilder med encyklopediskt värde.</string>
<string name="upload_image_blurry">Denna bild är suddig, är du säker på att du vill ladda upp den? Wikimedia Commons är endast till för bilder med encyklopediskt värde.</string>
<string name="upload_problem_exist">Möjliga problem med denna bild:</string>
@ -294,7 +297,7 @@
<string name="skip_login">Hoppa över</string>
<string name="navigation_item_login">Logga in</string>
<string name="skip_login_title">Vill du verkligen hoppa över inloggningen?</string>
<string name="skip_login_message">Du behöver logga ini för att ladda upp bilder i framtiden.</string>
<string name="skip_login_message">Du behöver logga in för att ladda upp bilder i framtiden.</string>
<string name="login_alert_message">Logga in för att använda denna funktion</string>
<string name="copy_wikicode">Kopiera wikitexten till urklipp</string>
<string name="wikicode_copied">Wikitexten kopierades till urklipp</string>
@ -329,6 +332,9 @@
<string name="retry">Försök igen</string>
<string name="showcase_view_got_it_button">Uppfattat!</string>
<string name="showcase_view_whole_nearby_activity">Detta är platserna nära dig som behöver bilder för att illustrera deras Wikipedia-artiklar.\n\nNär du klickar på \"SÖK I DETTA OMRÅDE\" kommer kartan låsas och en sökning startas i närheten runt detta plats.</string>
<string name="showcase_view_needs_photo">Den här platsen behöver ett foto.</string>
<string name="showcase_view_has_photo">Den här platsen har redan ett foto.</string>
<string name="showcase_view_no_longer_exists">Den här platsen finns inte längre.</string>
<string name="showcase_view_list_icon">Klicka på den här knappen för att få upp en lista med dessa platser</string>
<string name="showcase_view_plus_fab">Du kan ladda upp en bild från vilken plats som helst från ditt galleri eller kamera</string>
<string name="no_images_found">Inga bilder hittades!</string>
@ -360,20 +366,20 @@
<string name="quiz_question_string">Är det okej att ladda upp denna bild?</string>
<string name="question">Fråga</string>
<string name="result">Resultat</string>
<string name="quiz_back_button">Om du fortsätter ladda upp bilder som kommer att raderas kommer ditt konto förmodligen bannlysas. Är du säker på att du vill avsluta frågesporten?</string>
<string name="quiz_alert_message">Fler än %1$s av bilderna du har laddat upp har raderats. Om du fortsätter ladda upp bilder som kommer att raderas kommer ditt konto förmodligen bannlysas.\n\nVill du se guiden igen och sedan göra frågesporten för att hjälpa dig förstå vilka bildtyper du bör och inte bör ladda upp?</string>
<string name="quiz_back_button">Om du fortsätter ladda upp bilder som behöver raderas kommer ditt konto förmodligen blockeras. Är du säker på att du vill avsluta frågorna?</string>
<string name="quiz_alert_message">Fler än %1$s av bilderna du laddat upp har raderats. Om du fortsätter ladda upp bilder som behöver raderas kommer ditt konto förmodligen blockeras.\n\nVill du se guiden igen och sedan svara på frågor för att hjälpa dig förstå vilka bildtyper du bör och inte bör ladda upp?</string>
<string name="selfie_answer">Bilder på dig själv (selfies) har inte mycket encyklopediskt värde. Ladda inte upp en bild på dig själv såvida du inte har en Wikipedia-artikel om dig.</string>
<string name="taj_mahal_answer">Bilder på monument och utomhuslandskap är okej att ladda upp i de flesta länder. Observera att tillfälliga konstinstallationer är oftast upphovsrättsskyddade och inte okej att ladda upp.</string>
<string name="screenshot_answer">Skärmdumpar på webbplatser anses vara deriverade verk och föremål för all upphovsrätt på själva webbplatsen. Dessa kan användas efter tillstånd från författaren. Utan sådant tillstånd anses all konst du skapar baserat på deras verk juridiskt sett vara en olicensierad kopia som ägs av den ursprungliga författaren.</string>
<string name="blurry_image_answer">Ett av Commons mål är att samla ihop kvalitetsbilder. Därför bör inte suddiga bilder laddas upp. Försök alltid att ta fina bilder med bra ljus.</string>
<string name="construction_event_answer">Bilder som skildrar teknologi eller kultur är mycket välkomna på Commons.</string>
<string name="warning_for_image_reverts">VARNING: Fler än %1$s av bilderna du har laddat upp har raderats. Om du fortsätter ladda upp bilder som kommer att raderas kommer ditt konto förmodligen bannlysas.</string>
<string name="warning_for_image_reverts">VARNING: Fler än %1$s av bilderna du har laddat upp har raderats. Om du fortsätter ladda upp bilder som behöver raderas kommer ditt konto förmodligen blockeras.</string>
<string name="congratulatory_message_quiz">Du svarade rätt på %1$s av svaren. Gratulerar!</string>
<string name="warning_for_no_answer">Välj ett av de två alternativet för att svara på frågan</string>
<string name="user_not_logged_in">Inloggningssessionen löptes ut, var god logga in igen.</string>
<string name="quiz_result_share_message">Dela din frågesport med dina vänner!</string>
<string name="continue_message">Fortsätt</string>
<string name="correct">Korrekt svar</string>
<string name="correct">Rätt svar</string>
<string name="wrong">Fel svar</string>
<string name="quiz_screenshot_question">Är det okej att ladda upp denna skärmdump?</string>
<string name="share_app_title">Dela app</string>
@ -537,7 +543,7 @@
<string name="exif_tag_name_copyright">Upphovsrätt</string>
<string name="exif_tag_name_location">Plats</string>
<string name="exif_tag_name_cameraModel">Kameramodell</string>
<string name="exif_tag_name_lensModel">Linsmodell</string>
<string name="exif_tag_name_lensModel">Objektiv</string>
<string name="exif_tag_name_serialNumbers">Serienummer</string>
<string name="exif_tag_name_software">Programvara</string>
<string name="share_text">Ladda upp foton till Wikimedia Commons direkt från din telefon. Ladda ned Commons-appen nu: %1$s</string>
@ -614,4 +620,7 @@
<string name="wikipedia_instructions_step_6">6. Redigera wikitexten för att placera den mer lämpligt vid behov. För mer information, se &lt;a href=\"https://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style/Images#How_to_place_an_image\"&gt;här&lt;/a&gt;.</string>
<string name="wikipedia_instructions_step_7">7. Publicera artikeln</string>
<string name="copy_wikicode_to_clipboard">Kopiera wikikod till urklipp</string>
<string name="pause">pausa</string>
<string name="resume">återuppta</string>
<string name="paused">Pausad</string>
</resources>

View file

@ -4,6 +4,7 @@
* Aefgh39622
* B20180
* Horus
* Korrawit
* Nitisart Jungtrakungrat
* Octahedron80
* Patsagorn Y.
@ -41,7 +42,7 @@
<string name="username">ชื่อผู้ใช้</string>
<string name="password">รหัสผ่าน</string>
<string name="login_credential">ลงชื่อเข้าระบบบัญชีคอมมอนส์บีตาของคุณ</string>
<string name="login">ลงชื่อเข้า</string>
<string name="login">เข้าสู่ระบบ</string>
<string name="forgot_password">ลืมรหัสผ่านหรือ?</string>
<string name="signup">สมัครสมาชิก</string>
<string name="logging_in_title">กำลังเข้าสู่ระบบ</string>

View file

@ -4,10 +4,11 @@
* Emperyan
* Hedda
* Sayginer
* ToprakM
-->
<resources>
<string name="crash_dialog_title">Commons çöktü</string>
<string name="crash_dialog_text">Hata. Bir şeyler yanlış gitti!</string>
<string name="crash_dialog_text">Ups. Bir şeyler yanlış gitti!</string>
<string name="crash_dialog_comment_prompt">Ne yaptığınızı bize söyleyin, ardından bizimle e-posta ile durumu paylaşın. Sorunu düzeltmemize yardımcı olacak!</string>
<string name="crash_dialog_ok_toast">Teşekkürler!</string>
</resources>

View file

@ -81,7 +81,9 @@
<string name="upload_progress_notification_title_in_progress">%1$s yükleniyor</string>
<string name="upload_progress_notification_title_finishing">%1$s yüklemesi bitiriliyor</string>
<string name="upload_failed_notification_title">%1$s dosyasının yüklemesi başarısız oldu</string>
<string name="upload_failed_notification_subtitle">Görüntülemek için dokunun</string>
<string name="upload_paused_notification_title">%1$s yükleme duraklatıldı</string>
<string name="upload_failed_notification_subtitle">Görüntülemek için tıklayın</string>
<string name="upload_paused_notification_subtitle">Görüntülemek için tıklayın</string>
<string name="title_activity_contributions">Son Yüklemelerim</string>
<string name="contribution_state_queued">Sırada</string>
<string name="contribution_state_failed">Başarısız</string>
@ -142,17 +144,17 @@
<string name="no_uploads_yet">Henüz yüklenmiş hiç fotoğrafınız yok.</string>
<string name="menu_retry_upload">Tekrar dene</string>
<string name="menu_cancel_upload">İptal</string>
<string name="media_upload_policy">Bu resmi göndererek bunun kendi çalışmam olduğunu, telif hakkıyla korunan materyal veya özçekim (selfie) içermediğini ve başka türlü &lt;a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\"&gt;Wikimedia Commons politikalarına&lt;/a&gt; uyduğunu beyan ederim</string>
<string name="media_upload_policy">Bu resmi göndererek bunun kendi çalışmam olduğunu, telif hakkıyla korunan materyal veya özçekim (selfie) içermediğini ve diğer &lt;a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\"&gt;Wikimedia Commons politikalarına&lt;/a&gt; uyduğunu beyan ederim.</string>
<string name="menu_download">İndir</string>
<string name="preference_license">Varsayılan Lisans</string>
<string name="use_previous">Önceki başlığı ve açıklamayı kullan</string>
<string name="allow_gps">Otomatik olarak mevcut konumu al</string>
<string name="allow_gps_summary">Görüntü coğrafi olarak etiketlenmemişse geçerli konumu alır ve görüntüye coğrafi etiket ekler. Uyarı: Bu, geçerli konumunuzu gösterir.</string>
<string name="preference_theme">Tema</string>
<string name="license_name_cc_by_sa_four"> Attribution-ShareAlike 4.0</string>
<string name="license_name_cc_by_four"> Attribution 4.0</string>
<string name="license_name_cc_by_sa"> Attribution-ShareAlike 3.0</string>
<string name="license_name_cc_by"> Attribution 3.0</string>
<string name="license_name_cc_by_sa_four"> Atıf-BenzerPaylaşım 4.0</string>
<string name="license_name_cc_by_four"> Atıf 4.0</string>
<string name="license_name_cc_by_sa">Atıf-BenzerPaylaşım 3.0</string>
<string name="license_name_cc_by"> Atıf 3.0</string>
<string name="license_name_cc0">CC0</string>
<string name="license_name_cc_by_sa_3_0">CC BY-SA 3.0</string>
<string name="license_name_cc_by_sa_3_0_at">CC BY-SA 3.0 (Avusturya)</string>
@ -277,7 +279,7 @@
<string name="error_while_cache">Resimleri önbelleğe alırken hata oluştu</string>
<string name="title_info">Dosya adı olarak kullanılacak benzersiz bir açıklayıcı başlık. Sade bir dil kullanabilirsiniz. Dosya uzantısını dahil etmeyin</string>
<string name="description_info">Lütfen medyayı olabildiğince açıklayın: Nerede çekildi? Ne gösteriyor? Bağlam nedir? Lütfen nesneleri veya kişileri tanımlayın. Kolayca tahmin edilemeyen bilgileri, örneğin bir manzara ise günün saatini gösterin. Medya alışılmadık bir şey gösteriyorsa lütfen alışılmadık hâle getiren şeyi açıklayın.</string>
<string name="caption_info">Lütfen resmin kısa bir açıklamasını yazın. (255 karakterle sınırı vardır)</string>
<string name="caption_info" fuzzy="true">Lütfen resmin kısa bir açıklamasını yazın. (255 karakterle sınırı vardır)</string>
<string name="upload_image_too_dark">Bu resim çok karanlık, yüklemek istediğinizden emin misiniz? Wikimedia Commons yalnızca ansiklopedik değeri olan resimler içindir.</string>
<string name="upload_image_blurry">Bu resim bulanık, yüklemek istediğinizden emin misiniz? Wikimedia Commons yalnızca ansiklopedik değeri olan resimler içindir.</string>
<string name="upload_problem_exist">Bu görselle ilgili olası sorunlar:</string>
@ -297,7 +299,7 @@
<string name="send_log_file_description">Uygulama ile ilgili sorunları çözmek için geliştiricilere günlük dosyasını e-posta yoluyla gönderin. Not: Günlükler potansiyel olarak tanımlayıcı bilgiler içerebilir</string>
<string name="no_web_browser">URL\'yi açacak web tarayıcısı bulunamadı</string>
<string name="null_url">Hata! URL bulunamadı</string>
<string name="nominate_deletion">Silinme Adayı</string>
<string name="nominate_deletion">Silinmeye aday göster</string>
<string name="nominated_for_deletion">Bu görüntü silinmek üzere aday gösterildi.</string>
<string name="nominated_see_more">Web sayfasının detaylarını gör</string>
<string name="nominating_file_for_deletion">%1$s, silme için aday gösteriliyor.</string>
@ -341,6 +343,9 @@
<string name="retry">Tekrar dene</string>
<string name="showcase_view_got_it_button">Anladım!</string>
<string name="showcase_view_whole_nearby_activity">Bunlar, Vikipedi maddeleri görselleştirmek için resimlere ihtiyaç duyan size yakın yerler.\n\n\'BU ALANI ARA\'yı tıklamak haritayı açar ve o konumun yakınında bir arama başlatır.</string>
<string name="showcase_view_needs_photo">Burada bir fotoğrafa ihtiyacı var.</string>
<string name="showcase_view_has_photo">Burada zaten bir fotoğrafı var.</string>
<string name="showcase_view_no_longer_exists">Burası artık mevcut değil.</string>
<string name="showcase_view_list_icon">Bu butona dokunduğunuzda bu yerlerin bir listesi görüntülenir</string>
<string name="showcase_view_plus_fab">Galerinizden veya kameranızdan herhangi bir yer için resim yükleyebilirsiniz</string>
<string name="no_images_found">Resim bulunamadı!</string>
@ -396,7 +401,7 @@
<string name="delete_recent_searches_dialog">Arama geçmişinizi silmek istediğinizden emin misiniz?</string>
<string name="delete_search_dialog">Bu aramayı silmek istiyor musunuz?</string>
<string name="search_history_deleted">Arama geçmişi silindi</string>
<string name="nominate_delete">Silinmesi İçin Aday Göster</string>
<string name="nominate_delete">Silinmeye Aday Göster</string>
<string name="delete">Sil</string>
<string name="Achievements">Başarılar</string>
<string name="statistics">İstatistikler</string>
@ -489,11 +494,11 @@
<string name="check_category_success_message">%1$s için istenen kategori kontrolü</string>
<string name="check_category_failure_message">%1$s için kategori kontrolü istenemedi</string>
<string name="check_category_toast">%1$s için kategori kontrolü isteniyor</string>
<string name="nominate_for_deletion_edit_file_page">Dosyaya silme mesajı ekleme</string>
<string name="nominate_for_deletion_edit_file_page">Dosyaya silme mesajı ekleniyor</string>
<string name="nominate_for_deletion_done">Yapıldı</string>
<string name="nominate_for_deletion_notify_user">Mesaj sayfasında kullanıcıya haber verme</string>
<string name="nominate_for_deletion_edit_deletion_request_log">Silme isteklerine dosya ekleneme</string>
<string name="nominate_for_deletion_create_deletion_request">İstekleri sil alt sayfası oluşturma</string>
<string name="nominate_for_deletion_notify_user">Mesaj sayfasında kullanıcıya haber veriliyor</string>
<string name="nominate_for_deletion_edit_deletion_request_log">Dosya, silme istekleri kayıtlarına ekleniyor</string>
<string name="nominate_for_deletion_create_deletion_request">Silme istekleri alt sayfası oluşturuluyor</string>
<string name="notsure">Emin değil</string>
<string name="send_thank_success_title">Teşekkür Gönderme: Başarılı</string>
<string name="send_thank_success_message">%1$s sayesinde başarıyla gönderildi</string>
@ -626,4 +631,7 @@
<string name="wikipedia_instructions_step_6">6. Gerekirse vikimetini uygun konumlandırma için düzenleyin. Daha fazla bilgi için &lt;a href=\"https://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style/Images#How_to_place_an_image\"&gt;buraya&lt;/a&gt; bakın.</string>
<string name="wikipedia_instructions_step_7">7. Maddeyi yayınlayın</string>
<string name="copy_wikicode_to_clipboard">Vikikodu panoya kopyala</string>
<string name="pause">duraklat</string>
<string name="resume">devam et</string>
<string name="paused">Durduruldu</string>
</resources>

View file

@ -87,7 +87,9 @@
<string name="upload_progress_notification_title_in_progress">%1$s завантажується</string>
<string name="upload_progress_notification_title_finishing">Завершення завантаження %1$s</string>
<string name="upload_failed_notification_title">Не вдалося завантажити %1$s</string>
<string name="upload_paused_notification_title">Завантаження %1$s призупинене</string>
<string name="upload_failed_notification_subtitle">Торкніться, щоб переглянути</string>
<string name="upload_paused_notification_subtitle">Торкніться, щоб переглянути</string>
<string name="title_activity_contributions">Мої останні завантаження</string>
<string name="contribution_state_queued">У черзі</string>
<string name="contribution_state_failed">Не вдалося</string>
@ -283,7 +285,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="caption_info" fuzzy="true">Будь ласка, створіть короткий опис цього зображення (не більше 255 символів).</string>
<string name="upload_image_too_dark">Це зображення надто темне; Ви впевнені, що хочете його завантажити? Вікісховище призначене для зображень, що мають енциклопедичне значення.</string>
<string name="upload_image_blurry">Це зображення розмите; Ви впевнені, що хочете його завантажити? Вікісховище призначене для зображень, що мають енциклопедичне значення.</string>
<string name="upload_problem_exist">Потенційні проблеми з цим зображенням:</string>
@ -347,6 +349,9 @@
<string name="retry">Повторити</string>
<string name="showcase_view_got_it_button">Зрозуміло</string>
<string name="showcase_view_whole_nearby_activity">Це місця поблизу, про які є статті Вікіпедії, але які потребують ілюстрацій.\n\nПісля натискання кнопки \"Шукати в цій зоні\" карта фіксується та відбувається пошук поблизу вказаного місця.</string>
<string name="showcase_view_needs_photo">Цьому місцю бракує фото.</string>
<string name="showcase_view_has_photo">Це місце уже має фото.</string>
<string name="showcase_view_no_longer_exists">Це місце більше не існує.</string>
<string name="showcase_view_list_icon">Натискання цієї кнопки згенерує список таких місць</string>
<string name="showcase_view_plus_fab">Ви можете завантажити зображення для любого з цих місць, зробивши знімок камерою або вибравши зображення з галереї</string>
<string name="no_images_found">Зображень не знайдено!</string>
@ -616,5 +621,23 @@
<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>
<string name="add_picture_to_wikipedia_article_title">Додати зображення у Вікіпедію</string>
<string name="add_picture_to_wikipedia_article_desc">Ви хочете додати це зображення у статтю Вікіпедії мовою %1$s?</string>
<string name="add_picture_to_wikipedia_instructions_title">Інструкції</string>
<string name="add_picture_to_wikipedia_instructions_desc">Дотримуйтеся правил редагування!</string>
<string name="confirm">Підтвердити</string>
<string name="instructions_title">Інструкції</string>
<string name="wikipedia_instructions_step_1">1. Використовуйте такий вікітекст:</string>
<string name="wikipedia_instructions_step_2">2. Натискання на «Підтвердити» відкриє статтю Вікіпедії</string>
<string name="wikipedia_instructions_step_3">3. Знайдіть розділ статті, до якого пасуватиме ваше зображення</string>
<string name="wikipedia_instructions_step_4">4. Натисніть на іконку «Редагувати» (у вигляді олівця) біля цього розділу.</string>
<string name="wikipedia_instructions_step_5">5. Вставте вікітекст у підхожому місці.</string>
<string name="wikipedia_instructions_step_6">6. Відредагуйте вікітекст за потреби, вказавши потрібне розміщення. Детальнішу інформацію знайдете &lt;a href=\"https://uk.wikipedia.org/wiki/Довідка:Розширений_синтаксисображень\"&gt;тут&lt;/a&gt;.</string>
<string name="wikipedia_instructions_step_7">7. Опублікуйте статтю</string>
<string name="copy_wikicode_to_clipboard">Скопіювати вікікод у буфер обміну</string>
<string name="pause">пауза</string>
<string name="resume">продовжити</string>
<string name="paused">Призупинено</string>
</resources>

View file

@ -231,7 +231,7 @@
<string name="navigation_item_about">Informasion</string>
<string name="navigation_item_settings">Inpostasion</string>
<string name="navigation_item_feedback">Feedback</string>
<string name="navigation_item_logout">Va fora</string>
<string name="navigation_item_logout">Deslòghite</string>
<string name="navigation_item_info">Tutorial</string>
<string name="navigation_item_notification">Notifega</string>
<string name="navigation_item_featured_images">In evidensa</string>

View file

@ -55,6 +55,7 @@
<string name="upload_progress_notification_title_finishing">ეხარგუაშ თება %1$</string>
<string name="upload_failed_notification_title">%1$ ეხარგუაქ ვემიხუჯინუ</string>
<string name="upload_failed_notification_subtitle">ოძირაფალო ქეგუწკანტეთ</string>
<string name="upload_paused_notification_subtitle">ოძირაფალო ქეგუწკანტეთ</string>
<string name="title_activity_contributions">ჩქიმი ბოლო ეხარგუეფი</string>
<string name="contribution_state_queued">რადი</string>
<string name="contribution_state_failed">ვემიხუჯინუ</string>

View file

@ -76,7 +76,9 @@
<string name="upload_progress_notification_title_in_progress">正在上傳%1$s</string>
<string name="upload_progress_notification_title_finishing">即將完成上傳%1$s</string>
<string name="upload_failed_notification_title">上傳%1$s失敗</string>
<string name="upload_paused_notification_title">已暫停上傳%1$s</string>
<string name="upload_failed_notification_subtitle">輕觸檢視</string>
<string name="upload_paused_notification_subtitle">輕觸檢視</string>
<string name="title_activity_contributions">我最近的上傳</string>
<string name="contribution_state_queued">已佇列</string>
<string name="contribution_state_failed">失敗</string>
@ -272,7 +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="caption_info" fuzzy="true">請寫入圖片的簡要描述(不能超過 255 個字元)</string>
<string name="upload_image_too_dark">此圖片太暗,您確定您要上傳它嗎?維基共享資源僅適用對於百科全書有價值的圖片。</string>
<string name="upload_image_blurry">此圖片太模糊,您確定您要上傳它嗎?維基共享資源僅適用對於百科全書有價值的圖片。</string>
<string name="upload_problem_exist">此圖片有以下潛在問題:</string>
@ -336,6 +338,9 @@
<string name="retry">重試</string>
<string name="showcase_view_got_it_button">了解!</string>
<string name="showcase_view_whole_nearby_activity">這些是在您的周遭,並且需要圖片來圖解、描述它們本身的維基百科條目之地點。\n\n請點擊「搜尋此區域」來查看地圖然後在位置啟動周遭搜尋。</string>
<string name="showcase_view_needs_photo">此地點需要照片。</string>
<string name="showcase_view_has_photo">此地點已有照片。</string>
<string name="showcase_view_no_longer_exists">此地點已不存在。</string>
<string name="showcase_view_list_icon">輕觸此按鈕來帶出這些地點的清單</string>
<string name="showcase_view_plus_fab">您可從您的圖庫或相機,來上傳任何地點的圖片</string>
<string name="no_images_found">找不到圖片!</string>
@ -543,8 +548,8 @@
<string name="exif_tag_name_author">作者</string>
<string name="exif_tag_name_copyright">版權</string>
<string name="exif_tag_name_location">位置</string>
<string name="exif_tag_name_cameraModel">相機</string>
<string name="exif_tag_name_lensModel">透鏡</string>
<string name="exif_tag_name_cameraModel">相機型</string>
<string name="exif_tag_name_lensModel">透鏡型</string>
<string name="exif_tag_name_serialNumbers">序號</string>
<string name="exif_tag_name_software">軟體</string>
<string name="share_text">從您的手機上直接更新照片到維基共享資源,請現在下載共享資源應用程式:%1$s</string>
@ -621,4 +626,7 @@
<string name="wikipedia_instructions_step_6">6. 若有需要,可編輯維基語法來調整到適當的定位。更多相關資訊請查看&lt;a href=\"https://zh.wikipedia.org/wiki/Help:%E5%9B%BE%E5%83%8F\"&gt;此頁面&lt;/a&gt;</string>
<string name="wikipedia_instructions_step_7">7. 發布條目</string>
<string name="copy_wikicode_to_clipboard">複製維基代碼到剪貼簿</string>
<string name="pause">暫停</string>
<string name="resume">繼續</string>
<string name="paused">已暫停</string>
</resources>

View file

@ -14,6 +14,7 @@
* Looong
* Qiyue2001
* Shizhao
* Shuiwater
* SomeyaMako
* VulpesVulpes825
* Wxyveronica
@ -87,7 +88,9 @@
<string name="upload_progress_notification_title_in_progress">%1$s正在上传</string>
<string name="upload_progress_notification_title_finishing">正在完成上传%1$s</string>
<string name="upload_failed_notification_title">上传%1$s失败</string>
<string name="upload_paused_notification_title">上传%1$s已暂停</string>
<string name="upload_failed_notification_subtitle">点击查看</string>
<string name="upload_paused_notification_subtitle">点击查看</string>
<string name="title_activity_contributions">我的最近上传</string>
<string name="contribution_state_queued">已入队列</string>
<string name="contribution_state_failed">失败</string>
@ -132,8 +135,8 @@
<string name="menu_about">关于</string>
<string name="about_license">维基共享资源应用是由维基媒体社区的受助者和志愿者创建和维护的开源应用。维基媒体基金会不参与该应用程序的创立,开发或维护。</string>
<string name="about_improve">创建新的&lt;a href=\"%1$s\"&gt;GitHub问题&lt;/a&gt;以发送错误报告和建议。</string>
<string name="about_privacy_policy" fuzzy="true">&lt;u&gt;隐私政策&lt;/u&gt;</string>
<string name="about_credits" fuzzy="true">&lt;u&gt;信用&lt;/u&gt;</string>
<string name="about_privacy_policy">隐私政策</string>
<string name="about_credits">制作人员</string>
<string name="title_activity_about">关于</string>
<string name="menu_feedback">发送反馈(通过电子邮件)</string>
<string name="no_email_client">未安装电子邮件客户端</string>
@ -148,7 +151,7 @@
<string name="use_previous">使用之前的标题及描述</string>
<string name="allow_gps">自动获取当前位置</string>
<string name="allow_gps_summary">如果图片没有地理标记,以及地理标签图片的话,就取得当前位置。警告:这将暴露您的当前位置。</string>
<string name="preference_theme" fuzzy="true">夜间模式</string>
<string name="preference_theme">主题</string>
<string name="license_name_cc_by_sa_four">署名-ShareAlike4.0</string>
<string name="license_name_cc_by_four">署名4.0</string>
<string name="license_name_cc_by_sa">署名-ShareAlike3.0</string>
@ -189,10 +192,11 @@
<string name="welcome_copyright_subtext">请避免上传您在互联网找到的有版权的素材以及海报的图像、图书封面等。</string>
<string name="welcome_final_text">您明白了吗?</string>
<string name="welcome_final_button_text">是!</string>
<string name="welcome_help_button_text" fuzzy="true">&lt;u&gt;更多信息&lt;/u&gt;</string>
<string name="welcome_help_button_text">更多信息</string>
<string name="detail_panel_cats_label">分类</string>
<string name="detail_panel_cats_loading">正在载入…</string>
<string name="detail_panel_cats_none">未选择</string>
<string name="detail_caption_empty">无字幕</string>
<string name="detail_description_empty">没有说明</string>
<string name="detail_discussion_empty">没有讨论</string>
<string name="detail_license_empty">未知许可协议</string>
@ -293,7 +297,7 @@
<string name="null_url">错误找不到URL</string>
<string name="nominate_deletion">提交删除</string>
<string name="nominated_for_deletion">此图片已被提交删除。</string>
<string name="nominated_see_more" fuzzy="true">&lt;u&gt;查看网页获取详情&lt;/u&gt;</string>
<string name="nominated_see_more">查看网页获取详情</string>
<string name="nominating_file_for_deletion">提名%1$s删除。</string>
<string name="nominating_for_deletion_status">提名删除:%1$s</string>
<string name="view_browser">在浏览器中预览</string>
@ -335,6 +339,9 @@
<string name="retry">重试</string>
<string name="showcase_view_got_it_button">明白了!</string>
<string name="showcase_view_whole_nearby_activity">这些是您附近需要图片以阐明维基百科条目的地方。\n点击“检索这个区域”来锁定地图并启动定位功能来检索附近位置。</string>
<string name="showcase_view_needs_photo">这个地点需要一张照片。</string>
<string name="showcase_view_has_photo">这个地点已经有一张图片了。</string>
<string name="showcase_view_no_longer_exists">这个地点不再存在。</string>
<string name="showcase_view_list_icon">点按此按钮会出现这些地点的列表</string>
<string name="showcase_view_plus_fab">您可以从您的图库或照相机中上传任意地点的图片</string>
<string name="no_images_found">找不到图片!</string>
@ -590,4 +597,7 @@
<string name="confirm">确认</string>
<string name="instructions_title">说明</string>
<string name="copy_wikicode_to_clipboard">复制维基代码到剪贴板</string>
<string name="pause">暂停</string>
<string name="resume">继续</string>
<string name="paused">已暂停</string>
</resources>

View file

@ -60,7 +60,9 @@
<string name="upload_progress_notification_title_in_progress">%1$s uploading</string>
<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_paused_notification_title">Uploading %1$s paused</string>
<string name="upload_failed_notification_subtitle">Tap to view</string>
<string name="upload_paused_notification_subtitle">Tap to view</string>
<string name="title_activity_contributions">My Recent Uploads</string>
<string name="contribution_state_queued">Queued</string>
<string name="contribution_state_failed">Failed</string>
@ -261,7 +263,7 @@
<string name="error_while_cache">Error while caching pictures</string>
<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="caption_info">Please write a brief description of the image. The first caption would be used as the Title for the image.</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>
@ -649,6 +651,9 @@ Upload your first media by tapping on the add button.</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>
<string name="pause">pause</string>
<string name="resume">resume</string>
<string name="paused">Paused</string>
<string name="achievements_tab_title">Achievements</string>
<string name="leaderboard_tab_title">Leaderboard</string>
<string name="rank_prefix">Rank:</string>

View file

@ -2,268 +2,234 @@ package fr.free.nrw.commons.media
import com.nhaarman.mockitokotlin2.mock
import com.nhaarman.mockitokotlin2.whenever
import fr.free.nrw.commons.BuildConfig
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.*
import media
import org.junit.Before
import org.junit.Test
import org.mockito.*
import org.mockito.Mockito.*
import org.wikipedia.dataclient.mwapi.ImageDetails
import org.mockito.ArgumentMatchers
import org.mockito.Mock
import org.mockito.MockitoAnnotations
import org.wikipedia.dataclient.mwapi.MwQueryPage
import org.wikipedia.dataclient.mwapi.MwQueryResponse
import org.wikipedia.dataclient.mwapi.MwQueryResult
import org.wikipedia.gallery.ImageInfo
import org.wikipedia.wikidata.Entities
import java.util.*
class MediaClientTest {
@Mock
internal var mediaInterface: MediaInterface? = null
@Mock
internal var mediaConverter: MediaConverter? = null
@Mock
internal var mediaDetailInterface: MediaDetailInterface? = null
internal lateinit var mediaInterface: MediaInterface
@Mock
internal var pageMediaInterface: PageMediaInterface? = null
internal lateinit var mediaConverter: MediaConverter
@Mock
internal lateinit var mediaDetailInterface: MediaDetailInterface
@InjectMocks
var mediaClient: MediaClient? = null
@Mock
internal lateinit var pageMediaInterface: PageMediaInterface
val continuationMap = mapOf("continuation" to "continuation")
private lateinit var mediaClient: MediaClient
@Before
@Throws(Exception::class)
fun setUp() {
MockitoAnnotations.initMocks(this)
mediaClient =
MediaClient(mediaInterface, pageMediaInterface, mediaDetailInterface, mediaConverter)
}
@Test
fun checkPageExistsUsingTitle() {
val mwQueryPage = mock(MwQueryPage::class.java)
`when`(mwQueryPage.pageId()).thenReturn(10)
val mwQueryResult = mock(MwQueryResult::class.java)
`when`(mwQueryResult.firstPage()).thenReturn(mwQueryPage)
`when`(mwQueryResult.pages()).thenReturn(listOf(mwQueryPage))
val mockResponse = mock(MwQueryResponse::class.java)
`when`(mockResponse.query()).thenReturn(mwQueryResult)
`when`(mediaInterface!!.checkPageExistsUsingTitle(ArgumentMatchers.anyString()))
.thenReturn(Single.just(mockResponse))
val checkPageExistsUsingTitle =
mediaClient!!.checkPageExistsUsingTitle("File:Test.jpg").blockingGet()
assertTrue(checkPageExistsUsingTitle)
fun `getMediaById maps response of interface`() {
val (mwQueryResponse, media) = expectSuccessfulMapping()
whenever(mediaInterface.getMediaById("id")).thenReturn(Single.just(mwQueryResponse))
mediaClient.getMediaById("id").test().assertValue(media)
}
@Test
fun checkPageNotExistsUsingTitle() {
val mwQueryPage = mock(MwQueryPage::class.java)
`when`(mwQueryPage.pageId()).thenReturn(0)
val mwQueryResult = mock(MwQueryResult::class.java)
`when`(mwQueryResult.firstPage()).thenReturn(mwQueryPage)
`when`(mwQueryResult.pages()).thenReturn(listOf())
val mockResponse = mock(MwQueryResponse::class.java)
`when`(mockResponse.query()).thenReturn(mwQueryResult)
`when`(mediaInterface!!.checkPageExistsUsingTitle(ArgumentMatchers.anyString()))
.thenReturn(Single.just(mockResponse))
val checkPageExistsUsingTitle =
mediaClient!!.checkPageExistsUsingTitle("File:Test.jpg").blockingGet()
assertFalse(checkPageExistsUsingTitle)
fun `checkPageExistsUsingTitle returns true for greater than 0 id`() {
val mwQueryResponse = expectResponseWithPageId(1)
whenever(mediaInterface.checkPageExistsUsingTitle(""))
.thenReturn(Single.just(mwQueryResponse))
mediaClient.checkPageExistsUsingTitle("").test().assertValue(true)
}
@Test
fun checkFileExistsUsingSha() {
val mwQueryPage = mock(MwQueryPage::class.java)
val mwQueryResult = mock(MwQueryResult::class.java)
`when`(mwQueryResult.allImages()).thenReturn(listOf(mock(ImageDetails::class.java)))
`when`(mwQueryResult.firstPage()).thenReturn(mwQueryPage)
`when`(mwQueryResult.pages()).thenReturn(listOf(mwQueryPage))
val mockResponse = mock(MwQueryResponse::class.java)
`when`(mockResponse.query()).thenReturn(mwQueryResult)
`when`(mediaInterface!!.checkFileExistsUsingSha(ArgumentMatchers.anyString()))
.thenReturn(Single.just(mockResponse))
val checkFileExistsUsingSha = mediaClient!!.checkFileExistsUsingSha("abcde").blockingGet()
assertTrue(checkFileExistsUsingSha)
fun `checkPageExistsUsingTitle returns false for 0 id`() {
val mwQueryResponse = expectResponseWithPageId(0)
whenever(mediaInterface.checkPageExistsUsingTitle(""))
.thenReturn(Single.just(mwQueryResponse))
mediaClient.checkPageExistsUsingTitle("").test().assertValue(false)
}
@Test
fun checkFileNotExistsUsingSha() {
val mwQueryPage = mock(MwQueryPage::class.java)
val mwQueryResult = mock(MwQueryResult::class.java)
`when`(mwQueryResult.allImages()).thenReturn(listOf())
`when`(mwQueryResult.firstPage()).thenReturn(mwQueryPage)
`when`(mwQueryResult.pages()).thenReturn(listOf(mwQueryPage))
val mockResponse = mock(MwQueryResponse::class.java)
`when`(mockResponse.query()).thenReturn(mwQueryResult)
`when`(mediaInterface!!.checkFileExistsUsingSha(ArgumentMatchers.anyString()))
.thenReturn(Single.just(mockResponse))
val checkFileExistsUsingSha = mediaClient!!.checkFileExistsUsingSha("abcde").blockingGet()
assertFalse(checkFileExistsUsingSha)
fun `checkFileExistsUsingSha returns false with no Images`() {
val mwQueryResponse = mockQuery {
whenever(allImages()).thenReturn(listOf())
}
whenever(mediaInterface.checkFileExistsUsingSha(""))
.thenReturn(Single.just(mwQueryResponse))
mediaClient.checkFileExistsUsingSha("").test().assertValue(false)
}
@Test
fun getMedia() {
val (mockResponse, media: Media) = expectGetEntitiesAndMediaConversion()
`when`(mediaInterface!!.getMedia(ArgumentMatchers.anyString()))
.thenReturn(Single.just(mockResponse))
mediaClient!!.getMedia("abcde").test().assertValue(media)
fun `checkFileExistsUsingSha returns true with Images`() {
val mwQueryResponse = mockQuery {
whenever(allImages()).thenReturn(listOf(mock()))
}
whenever(mediaInterface.checkFileExistsUsingSha(""))
.thenReturn(Single.just(mwQueryResponse))
mediaClient.checkFileExistsUsingSha("").test().assertValue(true)
}
@Test
fun getMediaNull() {
val imageInfo = ImageInfo()
fun `getMediaListFromCategory is continuable and returns mapped response`() {
val (mwQueryResponse, media) = expectSuccessfulMapping(continuationMap)
whenever(mediaInterface.getMediaListFromCategory("", 10, emptyMap()))
.thenReturn(Single.just(mwQueryResponse))
mediaClient.getMediaListFromCategory("").test().assertValues(listOf(media))
val mwQueryPage = mock(MwQueryPage::class.java)
`when`(mwQueryPage.title()).thenReturn("Test")
`when`(mwQueryPage.imageInfo()).thenReturn(imageInfo)
whenever(mediaInterface.getMediaListFromCategory("", 10, continuationMap))
.thenReturn(Single.error(Exception()))
mediaClient.getMediaListFromCategory("").test().assertError { true }
val mwQueryResult = mock(MwQueryResult::class.java)
`when`(mwQueryResult.firstPage()).thenReturn(null)
val mockResponse = mock(MwQueryResponse::class.java)
`when`(mockResponse.query()).thenReturn(mwQueryResult)
`when`(mediaInterface!!.getMedia(ArgumentMatchers.anyString()))
.thenReturn(Single.just(mockResponse))
mediaClient!!.getMedia("abcde").test().assertErrorMessage("List is empty.")
mediaClient.resetCategoryContinuation("")
val (resetMwQueryResponse, resetMedia)=expectSuccessfulMapping()
whenever(mediaInterface.getMediaListFromCategory("", 10, emptyMap()))
.thenReturn(Single.just(resetMwQueryResponse))
mediaClient.getMediaListFromCategory("").test().assertValues(listOf(resetMedia))
}
@Test
fun getPictureOfTheDay() {
val template = "Template:Potd/" + CommonsDateUtil.getIso8601DateFormatShort().format(Date())
val (mockResponse, media: Media) = expectGetEntitiesAndMediaConversion()
`when`(mediaInterface!!.getMediaWithGenerator(template))
.thenReturn(Single.just(mockResponse))
mediaClient!!.getPictureOfTheDay().test().assertValue(media)
fun `getMediaListForUser is continuable and returns mapped response`() {
val (mwQueryResponse, media) = expectSuccessfulMapping(null)
whenever(mediaInterface.getMediaListForUser("", 10, emptyMap()))
.thenReturn(Single.just(mwQueryResponse))
mediaClient.getMediaListForUser("").test().assertValues(listOf(media))
mediaClient.getMediaListForUser("").test().assertValue(emptyList())
}
private fun expectGetEntitiesAndMediaConversion(): Pair<MwQueryResponse, Media> {
val mockResponse = mock(MwQueryResponse::class.java)
val queryResult: MwQueryResult = mock()
whenever(mockResponse.query()).thenReturn(queryResult)
val queryPage: MwQueryPage = mock()
whenever(queryResult.pages()).thenReturn(listOf(queryPage))
whenever(queryPage.pageId()).thenReturn(0)
val entities: Entities = mock()
whenever(mediaDetailInterface!!.getEntity("M0")).thenReturn(Single.just(entities))
val entity: Entities.Entity = mock()
whenever(entities.entities()).thenReturn(mapOf("id" to entity))
val media: Media = mock()
@Test
fun `getMediaListFromSearch returns mapped response`() {
val (mwQueryResponse, media) = expectSuccessfulMapping()
whenever(mediaInterface.getMediaListFromSearch("", 0, 1))
.thenReturn(Single.just(mwQueryResponse))
mediaClient.getMediaListFromSearch("", 0, 1)
.test()
.assertValues(listOf(media))
}
@Test
fun `fetchImagesForDepictedItem returns mapped response`() {
val (mwQueryResponse, media) = expectSuccessfulMapping()
whenever(mediaInterface.fetchImagesForDepictedItem("haswbstatement:${BuildConfig.DEPICTS_PROPERTY}=", "0", "1"))
.thenReturn(Single.just(mwQueryResponse))
mediaClient.fetchImagesForDepictedItem("", 0, 1)
.test()
.assertValues(listOf(media))
}
@Test
fun `getMedia returns mapped response`() {
val (mwQueryResponse, media) = expectSuccessfulMapping()
whenever(mediaInterface.getMedia("")).thenReturn(Single.just(mwQueryResponse))
mediaClient.getMedia("").test().assertValues(media)
}
@Test
fun `getPictureOfTheDay returns mapped response`() {
val (mwQueryResponse, media) = expectSuccessfulMapping()
whenever(mediaInterface.getMediaWithGenerator(ArgumentMatchers.startsWith("Template:Potd/")))
.thenReturn(Single.just(mwQueryResponse))
mediaClient.getPictureOfTheDay().test().assertValues(media)
}
@Test
fun `getPageHtml with null parse result returns empty`() {
val mwParseResponse = mock<MwParseResponse>()
whenever(mediaInterface.getPageHtml("")).thenReturn(Single.just(mwParseResponse))
whenever(mwParseResponse.parse()).thenReturn(null)
mediaClient.getPageHtml("").test().assertValues("")
}
@Test
fun `getPageHtml with parse result returns text`() {
val mwParseResponse = mock<MwParseResponse>()
whenever(mediaInterface.getPageHtml("")).thenReturn(Single.just(mwParseResponse))
val mwParseResult = mock<MwParseResult>()
whenever(mwParseResponse.parse()).thenReturn(mwParseResult)
whenever(mwParseResult.text()).thenReturn("text")
mediaClient.getPageHtml("").test().assertValues("text")
}
@Test
fun `getEntities throws exception for empty ids`() {
mediaClient.getEntities(emptyList()).test().assertErrorMessage("empty list passed for ids")
}
@Test
fun `getEntities invokes interface with non empty ids`() {
val entities = mock<Entities>()
whenever(mediaDetailInterface.getEntity("1|2")).thenReturn(Single.just(entities))
mediaClient.getEntities(listOf("1","2")).test().assertValue(entities)
}
@Test
fun `doesPageContainMedia returns false for empty items`() {
val pageMediaListResponse = mock<PageMediaListResponse>()
whenever(pageMediaInterface.getMediaList(""))
.thenReturn(Single.just(pageMediaListResponse))
whenever(pageMediaListResponse.items).thenReturn(emptyList())
mediaClient.doesPageContainMedia("").test().assertValue(false)
}
@Test
fun `doesPageContainMedia returns true for non empty items`() {
val pageMediaListResponse = mock<PageMediaListResponse>()
whenever(pageMediaInterface.getMediaList(""))
.thenReturn(Single.just(pageMediaListResponse))
whenever(pageMediaListResponse.items).thenReturn(listOf(mock()))
mediaClient.doesPageContainMedia("").test().assertValue(true)
}
private fun mockQuery(queryReceiver: MwQueryResult.() -> Unit): MwQueryResponse {
val mwQueryResponse = mock<MwQueryResponse>()
val mwQueryResult = mock<MwQueryResult>()
whenever(mwQueryResponse.query()).thenReturn(mwQueryResult)
mwQueryResult.queryReceiver()
return mwQueryResponse
}
private fun expectResponseWithPageId(expectedId: Int): MwQueryResponse {
return mockQuery {
val mwQueryPage = mock<MwQueryPage>()
whenever(firstPage()).thenReturn(mwQueryPage)
whenever(mwQueryPage.pageId()).thenReturn(expectedId)
}
}
private fun expectSuccessfulMapping(continuationMap: Map<String, String>? = emptyMap()): Pair<MwQueryResponse, Media> {
val media = media()
val mwQueryPage = mock<MwQueryPage>()
val mwQueryResponse = mockQuery {
whenever(pages()).thenReturn(listOf(mwQueryPage, mwQueryPage))
whenever(mwQueryPage.pageId()).thenReturn(1, 2)
}
whenever(mwQueryResponse.continuation()).thenReturn(continuationMap)
val entities = mock<Entities>()
whenever(mediaDetailInterface.getEntity("M1|M2")).thenReturn(Single.just(entities))
val entity = mock<Entities.Entity>()
whenever(entities.entities()).thenReturn(mapOf("a" to entity, "b" to entity))
val imageInfo = mock<ImageInfo>()
whenever(queryPage.imageInfo()).thenReturn(imageInfo)
whenever(mediaConverter!!.convert(queryPage, entity, imageInfo)).thenReturn(media)
return Pair(mockResponse, media)
}
@Captor
private val continuationCaptor: ArgumentCaptor<Map<String, String>>? = null
@Test
fun getMediaListFromCategoryTwice() {
val mockContinuation = mapOf(Pair("gcmcontinue", "test"))
val (mockResponse, media: Media) = expectGetEntitiesAndMediaConversion()
`when`(mockResponse.continuation()).thenReturn(mockContinuation)
`when`(
mediaInterface!!.getMediaListFromCategory(
ArgumentMatchers.anyString(), ArgumentMatchers.anyInt(),
continuationCaptor!!.capture()
)
)
.thenReturn(Single.just(mockResponse))
val media1 = mediaClient!!.getMediaListFromCategory("abcde").blockingGet().get(0)
val media2 = mediaClient!!.getMediaListFromCategory("abcde").blockingGet().get(0)
assertEquals(continuationCaptor.allValues[0], emptyMap<String, String>())
assertEquals(continuationCaptor.allValues[1], mockContinuation)
assertEquals(media1, media)
assertEquals(media2, media)
}
@Test
fun getMediaListForUser() {
val mockContinuation = mapOf("gcmcontinue" to "test")
val (mockResponse, media: Media) = expectGetEntitiesAndMediaConversion()
whenever(mockResponse.continuation()).thenReturn(mockContinuation)
whenever(
mediaInterface!!.getMediaListForUser(
ArgumentMatchers.anyString(), ArgumentMatchers.anyInt(),
continuationCaptor!!.capture()
)
)
.thenReturn(Single.just(mockResponse))
val media1 = mediaClient!!.getMediaListForUser("Test").blockingGet().get(0)
val media2 = mediaClient!!.getMediaListForUser("Test").blockingGet().get(0)
verify(mediaInterface, times(2))?.getMediaListForUser(
ArgumentMatchers.anyString(),
ArgumentMatchers.anyInt(), ArgumentMatchers.anyMap<String, String>()
)
}
@Test
fun getPageHtmlTest() {
val mwParseResult = mock(MwParseResult::class.java)
`when`(mwParseResult.text()).thenReturn("Test")
val mockResponse = MwParseResponse()
mockResponse.setParse(mwParseResult)
`when`(mediaInterface!!.getPageHtml(ArgumentMatchers.anyString()))
.thenReturn(Single.just(mockResponse))
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()
mockResponse.setParse(null)
`when`(mediaInterface!!.getPageHtml(ArgumentMatchers.anyString()))
.thenReturn(Single.just(mockResponse))
assertEquals("", mediaClient!!.getPageHtml("abcde").blockingGet())
whenever(mwQueryPage.imageInfo()).thenReturn(imageInfo, null)
whenever(mediaConverter.convert(mwQueryPage, entity, imageInfo)).thenReturn(media)
return Pair(mwQueryResponse, media)
}
}

View file

@ -0,0 +1,444 @@
package fr.free.nrw.commons.nearby
import com.mapbox.mapboxsdk.annotations.Marker
import com.nhaarman.mockitokotlin2.*
import fr.free.nrw.commons.bookmarks.locations.BookmarkLocationsDao
import fr.free.nrw.commons.location.LatLng
import fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType
import fr.free.nrw.commons.nearby.contract.NearbyParentFragmentContract
import fr.free.nrw.commons.nearby.presenter.NearbyParentFragmentPresenter
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.MockitoAnnotations
/**
* The unit test class for NearbyParentFragmentPresenter
*/
class NearbyParentFragmentPresenterTest {
@Mock
internal lateinit var nearbyParentFragmentView: NearbyParentFragmentContract.View
@Mock
internal lateinit var bookmarkLocationsDao: BookmarkLocationsDao
@Mock
internal lateinit var latestLocation: LatLng
@Mock
internal lateinit var cameraTarget: LatLng
@Mock
internal lateinit var selectedLabels: List<Label>
@Mock
internal lateinit var marker: Marker
private lateinit var nearbyPresenter: NearbyParentFragmentPresenter
private lateinit var mapboxCameraTarget: com.mapbox.mapboxsdk.geometry.LatLng
/**
* initial setup
*/
@Before
@Throws(Exception::class)
fun setUp() {
MockitoAnnotations.initMocks(this)
nearbyPresenter = NearbyParentFragmentPresenter(bookmarkLocationsDao)
nearbyPresenter.attachView(nearbyParentFragmentView)
}
/**
* Tests nearby operations are initialized
*/
@Test
fun testInitializeNearbyMapOperations() {
nearbyPresenter.initializeMapOperations()
verify(nearbyParentFragmentView).enableFABRecenter()
expectMapAndListUpdate()
nearbyPresenter.updateMapAndList(LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED)
verify(nearbyParentFragmentView).disableFABRecenter();
verify(nearbyParentFragmentView).setProgressBarVisibility(true)
verify(nearbyParentFragmentView).populatePlaces(latestLocation)
verify(nearbyParentFragmentView).addSearchThisAreaButtonAction()
verify(nearbyParentFragmentView).setCheckBoxAction()
}
/**
* Test lockUnlockNearby method to lock nearby case
*/
@Test
fun testLockUnlockNearbyForLocked() {
nearbyPresenter.lockUnlockNearby(true)
verify(nearbyParentFragmentView).disableFABRecenter()
}
/**
* Test lockUnlockNearby method to unlock nearby case
*/
@Test
fun testLockUnlockNearbyForUnlocked() {
nearbyPresenter.lockUnlockNearby(false)
verify(nearbyParentFragmentView).enableFABRecenter()
}
/**
* Test updateMapAndList method returns with zero interactions when location is locked
*/
@Test
fun testUpdateMapAndListWhenLocationLocked() {
nearbyPresenter.lockUnlockNearby(true)
nearbyPresenter.updateMapAndList(null)
verify(nearbyParentFragmentView).disableFABRecenter()
verifyZeroInteractions(nearbyParentFragmentView)
}
/**
* Test updateMapAndList method returns with zero interactions when network connection
* is not established
*/
@Test
fun testUpdateMapAndListWhenNoNetworkConnection() {
nearbyPresenter.lockUnlockNearby(false)
whenever(nearbyParentFragmentView.isNetworkConnectionEstablished()).thenReturn(false)
nearbyPresenter.updateMapAndList(null)
verify(nearbyParentFragmentView).enableFABRecenter()
verify(nearbyParentFragmentView).isNetworkConnectionEstablished()
verifyNoMoreInteractions(nearbyParentFragmentView)
}
/**
* Test updateMapAndList method returns with zero interactions when last location is null
*/
@Test
fun testUpdateMapAndListWhenLastLocationIsNull() {
nearbyPresenter.lockUnlockNearby(false)
whenever(nearbyParentFragmentView.isNetworkConnectionEstablished()).thenReturn(true)
whenever(nearbyParentFragmentView.getLastLocation()).thenReturn(null)
nearbyPresenter.updateMapAndList(null)
verify(nearbyParentFragmentView).enableFABRecenter()
verify(nearbyParentFragmentView).isNetworkConnectionEstablished()
verify(nearbyParentFragmentView).getLastLocation()
verifyNoMoreInteractions(nearbyParentFragmentView)
}
/**
* Test updateMapAndList method updates parent fragment view with latest location of user
* at significant location change
*/
@Test
fun testPlacesPopulatedForLatestLocationWhenLocationSignificantlyChanged() {
expectMapAndListUpdate()
nearbyPresenter.updateMapAndList(LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED)
updateMapSignificantly()
}
/**
* Test updateMapAndList method updates parent fragment view with latest location of user
* at map is updated location change type
*/
@Test
fun testPlacesPopulatedForLatestLocationWhenLocationMapUpdated() {
expectMapAndListUpdate()
nearbyPresenter.updateMapAndList(LocationChangeType.MAP_UPDATED)
updateMapSignificantly()
}
fun updateMapSignificantly() {
verify(nearbyParentFragmentView).disableFABRecenter()
verify(nearbyParentFragmentView).setProgressBarVisibility(true)
verify(nearbyParentFragmentView).populatePlaces(latestLocation)
}
/**
* Test updateMapAndList method updates parent fragment view with camera target location
* at search custom area mode
*/
@Test
fun testPlacesPopulatedForCameraTargetLocationWhenSearchCustomArea() {
expectMapAndListUpdate()
whenever(nearbyParentFragmentView.getCameraTarget()).thenReturn(cameraTarget)
nearbyPresenter.updateMapAndList(LocationChangeType.SEARCH_CUSTOM_AREA)
verify(nearbyParentFragmentView).disableFABRecenter()
verify(nearbyParentFragmentView).setProgressBarVisibility(true)
verify(nearbyParentFragmentView).populatePlaces(cameraTarget)
}
/**
* Test testUpdateMapAndList tracks users location if current location marker is visible and
* location is slightly changed
*/
@Test
fun testUserTrackedWhenCurrentLocationMarkerVisible() {
expectMapAndListUpdate()
whenever(nearbyParentFragmentView.isCurrentLocationMarkerVisible()).thenReturn(true)
nearbyPresenter.updateMapAndList(LocationChangeType.LOCATION_SLIGHTLY_CHANGED)
verify(nearbyParentFragmentView).recenterMap(latestLocation)
}
/**
* Test testUpdateMapAndList doesn't track users location if current location marker is
* invisible and location is slightly changed
*/
@Test
fun testUserNotTrackedWhenCurrentLocationMarkerInvisible() {
expectMapAndListUpdate()
whenever(nearbyParentFragmentView.isCurrentLocationMarkerVisible()).thenReturn(false)
nearbyPresenter.updateMapAndList(LocationChangeType.LOCATION_SLIGHTLY_CHANGED)
verify(nearbyParentFragmentView).enableFABRecenter()
verify(nearbyParentFragmentView).isNetworkConnectionEstablished()
verify(nearbyParentFragmentView).getLastLocation()
verify(nearbyParentFragmentView).isCurrentLocationMarkerVisible()
verifyNoMoreInteractions(nearbyParentFragmentView)
}
/**
* Test search this area button became visible after user moved the camera target to far
* away from current target. Distance between these two point is 111.19 km, so our camera target
* is at outside of previously searched region if we set latestSearchRadius below 111.19. Thus,
* setSearchThisAreaButtonVisibility(true) should be verified.
*/
@Test
fun testSearchThisAreaButtonVisibleWhenMoveToFarPosition() {
NearbyController.latestSearchLocation = Mockito.spy(LatLng(2.0,1.0,0.0F))
mapboxCameraTarget = Mockito.spy(com.mapbox.mapboxsdk.geometry.LatLng(1.0,1.0,0.0))
// Distance between these two point is 111.19 km
NearbyController.latestSearchRadius = 111.0*1000 // To meter
whenever(nearbyParentFragmentView.isNetworkConnectionEstablished()).thenReturn(true)
nearbyPresenter.onCameraMove(mapboxCameraTarget)
verify(nearbyParentFragmentView).setSearchThisAreaButtonVisibility(true)
}
/**
* Test search this area button became visible after user moved the camera target to far
* away from current target. Distance between these two point is 111.19 km, so our camera target
* is at inside of previously searched region if we set latestSearchRadius above 111.19. Thus,
* setSearchThisAreaButtonVisibility(false) should be verified.
*/
@Test
fun testSearchThisAreaButtonInvisibleWhenMoveToClosePosition() {
NearbyController.latestSearchLocation = Mockito.spy(LatLng(2.0,1.0,0.0F))
mapboxCameraTarget = Mockito.spy(com.mapbox.mapboxsdk.geometry.LatLng(1.0,1.0,0.0))
// Distance between these two point is 111.19 km
NearbyController.latestSearchRadius = 112.0*1000 // To meter
whenever(nearbyParentFragmentView.isNetworkConnectionEstablished()).thenReturn(true)
nearbyPresenter.onCameraMove(mapboxCameraTarget)
verify(nearbyParentFragmentView).setSearchThisAreaButtonVisibility(false)
}
/**
* Multi selection should overwrite single selection of marker types. Ie. when user choose
*"parks", then they multi select to display all or none, we overwrite previous "park" filter.
*
* We expect zero interaction from view when state is UNKNOWN
*/
@Test
fun testFilterByMarkerTypeMultiSelectUNKNOWN() {
val state = CheckBoxTriStates.UNKNOWN
nearbyPresenter.filterByMarkerType(selectedLabels,state,false,true)
verifyZeroInteractions(nearbyParentFragmentView)
}
/**
* Multi selection should overwrite single selection of marker types. Ie. when user choose
*"parks", then they multi select to display all or none, we overwrite previous "park" filter.
*
* We expect just filterOutAllMarkers and setRecyclerViewAdapterItemsGreyedOut is called when
* the state is UNCHECKED
*/
@Test
fun testFilterByMarkerTypeMultiSelectUNCHECKED() {
val state = CheckBoxTriStates.UNCHECKED
nearbyPresenter.filterByMarkerType(selectedLabels,state,false,true)
verify(nearbyParentFragmentView).filterOutAllMarkers()
verify(nearbyParentFragmentView).setRecyclerViewAdapterItemsGreyedOut()
verifyNoMoreInteractions(nearbyParentFragmentView)
}
/**
* Multi selection should overwrite single selection of marker types. Ie. when user choose
*"parks", then they multi select to display all or none, we overwrite previous "park" filter.
*
* We expect just displayAllMarkers and setRecyclerViewAdapterAllSelected is called when
* the state is CHECKED
*/
@Test
fun testFilterByMarkerTypeMultiSelectCHECKED() {
val state = CheckBoxTriStates.CHECKED
nearbyPresenter.filterByMarkerType(selectedLabels, state, false,true)
verify(nearbyParentFragmentView).displayAllMarkers()
verify(nearbyParentFragmentView).setRecyclerViewAdapterAllSelected()
verifyNoMoreInteractions(nearbyParentFragmentView)
}
/**
* We expect just filterMarkersByLabels is called when filterForAllNoneType is false
*/
@Test
fun testFilterByMarkerTypeSingleSelect() {
nearbyPresenter.filterByMarkerType(selectedLabels, 0, true,false)
verify(nearbyParentFragmentView).filterMarkersByLabels(any(), any(), any(), any(), any());
verifyNoMoreInteractions(nearbyParentFragmentView)
}
/**
* Test if bottom sheet gets hidden after search view gained focus
*/
@Test
fun testSearchViewFocusWhenBottomSheetExpanded() {
whenever(nearbyParentFragmentView.isListBottomSheetExpanded()).thenReturn(true)
nearbyPresenter.searchViewGainedFocus()
verify(nearbyParentFragmentView).hideBottomSheet()
}
/**
* Test if bottom details sheet gets hidden after search view gained focus
*/
@Test
fun testSearchViewFocusWhenDetailsBottomSheetVisible() {
whenever(nearbyParentFragmentView.isListBottomSheetExpanded()).thenReturn(false)
whenever(nearbyParentFragmentView.isDetailsBottomSheetVisible()).thenReturn(true)
nearbyPresenter.searchViewGainedFocus()
verify(nearbyParentFragmentView).hideBottomDetailsSheet()
}
/**
* Test if the search is close to current location, when last location is null we expect it to
* return true
*/
@Test
fun testSearchCloseToCurrentLocationNullLastLocation() {
whenever(nearbyParentFragmentView.getLastFocusLocation()).thenReturn(null)
val isClose = nearbyPresenter?.searchCloseToCurrentLocation()
assertTrue(isClose!!)
}
/**
* Test if the search is close to current location, when far
*/
@Test
fun testSearchCloseToCurrentLocationWhenFar() {
whenever(nearbyParentFragmentView.getLastFocusLocation()).
thenReturn(com.mapbox.mapboxsdk.geometry.LatLng(1.0,1.0,0.0))
whenever(nearbyParentFragmentView.getCameraTarget()).
thenReturn(LatLng(2.0,1.0,0.0F))
//111.19 km real distance, return false if 148306.444306 > currentLocationSearchRadius
NearbyController.currentLocationSearchRadius = 148306.0
val isClose = nearbyPresenter?.searchCloseToCurrentLocation()
assertFalse(isClose!!)
}
/**
* Test if the search is close to current location, when close
*/
@Test
fun testSearchCloseToCurrentLocationWhenClose() {
whenever(nearbyParentFragmentView.getLastFocusLocation()).
thenReturn(com.mapbox.mapboxsdk.geometry.LatLng(1.0,1.0,0.0))
whenever(nearbyParentFragmentView.getCameraTarget()).
thenReturn(LatLng(2.0,1.0,0.0F))
//111.19 km real distance, return false if 148253.333 > currentLocationSearchRadius
NearbyController.currentLocationSearchRadius = 148307.0
val isClose = nearbyPresenter?.searchCloseToCurrentLocation()
assertTrue(isClose!!)
}
fun expectMapAndListUpdate() {
nearbyPresenter.lockUnlockNearby(false)
whenever(nearbyParentFragmentView.isNetworkConnectionEstablished()).thenReturn(true)
whenever(nearbyParentFragmentView.getLastLocation()).thenReturn(latestLocation)
}
@Test
fun testSetActionListeners() {
nearbyPresenter.setActionListeners(any())
verify(nearbyParentFragmentView).setFABPlusAction(any())
verify(nearbyParentFragmentView).setFABRecenterAction(any())
}
@Test
fun testBackButtonClickedWhenBottomSheetExpanded() {
whenever(nearbyParentFragmentView.isListBottomSheetExpanded()).thenReturn(true)
nearbyPresenter.backButtonClicked()
verify(nearbyParentFragmentView).listOptionMenuItemClicked()
}
@Test
fun testBackButtonClickedWhenDetailsBottomSheetVisible() {
whenever(nearbyParentFragmentView.isListBottomSheetExpanded()).thenReturn(false)
whenever(nearbyParentFragmentView.isDetailsBottomSheetVisible()).thenReturn(true)
nearbyPresenter.backButtonClicked()
verify(nearbyParentFragmentView).setBottomSheetDetailsSmaller()
}
@Test
fun testBackButtonClickedWhenNoSheetVisible() {
whenever(nearbyParentFragmentView.isListBottomSheetExpanded()).thenReturn(false)
whenever(nearbyParentFragmentView.isDetailsBottomSheetVisible()).thenReturn(false)
nearbyPresenter.backButtonClicked()
verify(nearbyParentFragmentView).setTabItemContributions()
}
@Test
fun testMarkerUnselected() {
nearbyPresenter.markerUnselected()
verify(nearbyParentFragmentView).hideBottomSheet();
}
@Test
fun testMarkerSelected() {
nearbyPresenter.markerSelected(marker)
verify(nearbyParentFragmentView).displayBottomSheetWithInfo(marker)
}
@Test
fun testOnWikidataEditSuccessful() {
nearbyPresenter.onWikidataEditSuccessful()
expectMapAndListUpdate()
nearbyPresenter.updateMapAndList(LocationChangeType.MAP_UPDATED)
updateMapSignificantly()
}
@Test
fun testOnLocationChangedSignificantly() {
nearbyPresenter.onLocationChangedSignificantly(latestLocation)
expectMapAndListUpdate()
nearbyPresenter.updateMapAndList(LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED)
updateMapSignificantly()
}
@Test
fun testOnLocationChangedSlightly() {
nearbyPresenter.onLocationChangedSlightly(latestLocation)
expectMapAndListUpdate()
whenever(nearbyParentFragmentView.isCurrentLocationMarkerVisible()).thenReturn(true)
nearbyPresenter.updateMapAndList(LocationChangeType.LOCATION_SLIGHTLY_CHANGED)
verify(nearbyParentFragmentView).recenterMap(latestLocation)
}
@Test
fun testOnCameraMoveWhenSearchLocationNull() {
NearbyController.latestSearchLocation = null
nearbyPresenter.onCameraMove(Mockito.mock(com.mapbox.mapboxsdk.geometry.LatLng::class.java))
verify(nearbyParentFragmentView).setProjectorLatLngBounds()
verify(nearbyParentFragmentView).setSearchThisAreaButtonVisibility(false)
}
@Test
fun testOnCameraMoveWhenNetworkConnectionNotEstablished() {
NearbyController.latestSearchLocation = latestLocation
whenever(nearbyParentFragmentView.isNetworkConnectionEstablished()).thenReturn(false)
nearbyPresenter.onCameraMove(Mockito.mock(com.mapbox.mapboxsdk.geometry.LatLng::class.java))
verify(nearbyParentFragmentView).setProjectorLatLngBounds()
verify(nearbyParentFragmentView).isNetworkConnectionEstablished()
verifyZeroInteractions(nearbyParentFragmentView)
}
@Test
fun testOnCameraMoveWhenNetworkConnectionEstablished() {
NearbyController.latestSearchLocation = latestLocation
whenever(nearbyParentFragmentView.isNetworkConnectionEstablished()).thenReturn(false)
nearbyPresenter.onCameraMove(Mockito.mock(com.mapbox.mapboxsdk.geometry.LatLng::class.java))
verify(nearbyParentFragmentView).setProjectorLatLngBounds()
verify(nearbyParentFragmentView).isNetworkConnectionEstablished()
verifyZeroInteractions(nearbyParentFragmentView)
}
}

View file

@ -22,6 +22,7 @@ public class MwQueryPage extends BaseModel {
@SuppressWarnings("unused") private int ns;
@SuppressWarnings("unused") private int index;
@SuppressWarnings("unused,NullableProblems") @NonNull private String title;
@SuppressWarnings("unused,NullableProblems") @NonNull private CategoryInfo categoryinfo;
@SuppressWarnings("unused") @Nullable private List<LangLink> langlinks;
@SuppressWarnings("unused") @Nullable private List<Revision> revisions;
@SuppressWarnings("unused") @Nullable private List<Coordinates> coordinates;
@ -42,6 +43,10 @@ public class MwQueryPage extends BaseModel {
return title;
}
@NonNull public CategoryInfo categoryInfo() {
return categoryinfo;
}
public int index() {
return index;
}
@ -185,6 +190,17 @@ public class MwQueryPage extends BaseModel {
}
}
public static class CategoryInfo {
@SuppressWarnings("unused") private boolean hidden;
@SuppressWarnings("unused") private int size;
@SuppressWarnings("unused") private int pages;
@SuppressWarnings("unused") private int files;
@SuppressWarnings("unused") private int subcats;
public boolean isHidden() {
return hidden;
}
}
static class Thumbnail {
@SuppressWarnings("unused") private String source;
@SuppressWarnings("unused") private int width;