From b9b54fdff6b812e83c8c046d355afa67cd65f455 Mon Sep 17 00:00:00 2001 From: Vishan Seru Date: Sun, 15 Oct 2017 10:22:01 +0530 Subject: [PATCH 01/18] Made changes to ensure that when attempting to upload multiple images, the GPS data is extracted and attached correctly. --- .../commons/contributions/Contribution.java | 4 ++ .../fr/free/nrw/commons/upload/FileUtils.java | 41 ++++++++++++- .../commons/upload/MultipleShareActivity.java | 60 +++++++++++++++++++ 3 files changed, 104 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.java b/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.java index 338743f02..f9060b7b5 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.java @@ -263,6 +263,10 @@ public class Contribution extends Media { this.localUri = localUri; } + public void setDecimalCoords(String decimalCoords) { + this.decimalCoords = decimalCoords; + } + public static class Table { public static final String TABLE_NAME = "contributions"; diff --git a/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java b/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java index a211a38bf..3c0775ac5 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java @@ -3,21 +3,27 @@ package fr.free.nrw.commons.upload; import android.annotation.SuppressLint; import android.content.ContentUris; import android.content.Context; +import android.content.SharedPreferences; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Environment; +import android.os.ParcelFileDescriptor; +import android.preference.PreferenceManager; import android.provider.DocumentsContract; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; +import java.util.Date; +import fr.free.nrw.commons.CommonsApplication; import timber.log.Timber; public class FileUtils { @@ -89,8 +95,41 @@ public class FileUtils { // File else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); + } else { + //fetching path may fail depending on the source URI and all hope is lost + //so we will create and use a copy of the file, which seems to work + String copyPath = null; + try { + ParcelFileDescriptor descriptor + = context.getContentResolver().openFileDescriptor(uri, "r"); + if (descriptor != null) { + SharedPreferences sharedPref = PreferenceManager + .getDefaultSharedPreferences(CommonsApplication.getInstance()); + boolean useExtStorage = sharedPref.getBoolean("useExternalStorage", true); + if (useExtStorage) { + copyPath = Environment.getExternalStorageDirectory().toString() + + "/CommonsApp/" + new Date().getTime() + ".jpg"; + File newFile = new File(Environment.getExternalStorageDirectory().toString() + "/CommonsApp"); + newFile.mkdir(); + FileUtils.copy( + descriptor.getFileDescriptor(), + copyPath); + Timber.d("Filepath (copied): %s", copyPath); + return copyPath; + } + copyPath = context.getCacheDir().getAbsolutePath() + + "/" + new Date().getTime() + ".jpg"; + FileUtils.copy( + descriptor.getFileDescriptor(), + copyPath); + Timber.d("Filepath (copied): %s", copyPath); + return copyPath; + } + } catch (IOException e) { + Timber.w(e, "Error in file " + copyPath); + return null; + } } - return null; } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java index e57ce4e44..def318fee 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java @@ -11,7 +11,9 @@ import android.database.DataSetObserver; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.os.ParcelFileDescriptor; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; import android.support.v4.app.FragmentManager; import android.support.v4.content.ContextCompat; @@ -21,6 +23,7 @@ import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.Toast; +import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; @@ -56,6 +59,8 @@ public class MultipleShareActivity private UploadController uploadController; + private boolean locationPermitted = false; + @Override public Media getMediaAtPosition(int i) { return photosList.get(i); @@ -215,6 +220,14 @@ public class MultipleShareActivity getSupportFragmentManager().addOnBackStackChangedListener(this); requestAuthToken(); + + //TODO: 15/10/17 should location permission be explicitly requested if not provided? + //check if location permission is enabled + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + locationPermitted = true; + } + } } @Override @@ -260,6 +273,11 @@ public class MultipleShareActivity up.setTag("sequence", i); up.setSource(Contribution.SOURCE_EXTERNAL); up.setMultiple(true); + String imageGpsCoordinates = extractImageGpsData(uri); + if (imageGpsCoordinates != null) { + Timber.d("GPS data for image found!"); + up.setDecimalCoords(imageGpsCoordinates); + } photosList.add(up); } } @@ -314,4 +332,46 @@ public class MultipleShareActivity } } + /** + * Will attempt to extract the gps coordinates using exif data or by using the current + * location if available for the image who's imageUri has been provided. + * @param imageUri The uri of the image who's GPS coordinates data we wish to extract + * @return GPS coordinates as a String as is returned by {@link GPSExtractor} + */ + @Nullable + private String extractImageGpsData(Uri imageUri) { + Timber.d("Entering extractImagesGpsData"); + + if (imageUri == null) { + //now why would you do that??? + return null; + } + + GPSExtractor gpsExtractor = null; + + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + ParcelFileDescriptor fd = getContentResolver().openFileDescriptor(imageUri,"r"); + if (fd != null) { + gpsExtractor = new GPSExtractor(fd.getFileDescriptor()); + } + } else { + String filePath = FileUtils.getPath(this,imageUri); + if (filePath != null) { + gpsExtractor = new GPSExtractor(filePath); + } + } + + if (gpsExtractor != null) { + //get image coordinates from exif data or user location + return gpsExtractor.getCoords(locationPermitted); + } + + } catch (FileNotFoundException fnfe) { + Timber.w(fnfe); + return null; + } + + return null; + } } \ No newline at end of file From f07d78489f1c54bbf6adcc270bfd2d785012ea0b Mon Sep 17 00:00:00 2001 From: Ujjwal Agrawal Date: Wed, 14 Feb 2018 23:22:56 +0530 Subject: [PATCH 02/18] Created Template for PR for new contributor --- PULL_REQUEST_TEMPLATE.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 PULL_REQUEST_TEMPLATE.md diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..d1d924ee0 --- /dev/null +++ b/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,9 @@ +## Description + +Describe the changes made and why they were made instead of how they were made. + +## Related issues and discussion +#{Issue Number} + +## Screen-shots, if any + From 751407c5367ad6e71efacde0945b81b2f3f6f42d Mon Sep 17 00:00:00 2001 From: Ujjwal Agrawal Date: Thu, 15 Feb 2018 19:29:13 +0530 Subject: [PATCH 03/18] Update PULL_REQUEST_TEMPLATE.md --- PULL_REQUEST_TEMPLATE.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index d1d924ee0..4ac4ba254 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -5,5 +5,6 @@ Describe the changes made and why they were made instead of how they were made. ## Related issues and discussion #{Issue Number} -## Screen-shots, if any +## For user interface changes: Screenshots showing what changed + From 619a911c275701157d301cf0e802752d8d0a41cb Mon Sep 17 00:00:00 2001 From: Ujjwal Agrawal Date: Fri, 16 Feb 2018 19:31:50 +0530 Subject: [PATCH 04/18] Update PULL_REQUEST_TEMPLATE.md --- PULL_REQUEST_TEMPLATE.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index 4ac4ba254..e9e14f77a 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -1,7 +1,6 @@ ## Description -Describe the changes made and why they were made instead of how they were made. - +Describe the changes made and why they were made. ## Related issues and discussion #{Issue Number} From 054fa9346098015fbda4b6cfec0788c3b0651264 Mon Sep 17 00:00:00 2001 From: Vishan Seru Date: Sun, 18 Feb 2018 15:01:42 +0530 Subject: [PATCH 05/18] Detecting pictures that are too dark (#926) * Made the following changes: ->Added OpenCV library to the project ->Added functionality to detect if an image being uploaded is too dark ->Added functionality to detect if an image being uploaded is blurred * Made corrections and changes based on gradle checkstyle requirements * Updated gitignore to remove binary files related to OpenCV from project * Image blurriness detection was undone. Images are checked only for being too dark now * Removed OpenCV documentation folder containing a lot of html files * Removed unnecessary buildScript usage in build.gradle file for opencv library and also added abi splits * Removed OpenCV library usages and references from project * Removed OpenCV library folder from project --- .gitignore | 7 + app/build.gradle | 22 +++ .../upload/DetectUnwantedPicturesAsync.java | 59 ++++++++ .../fr/free/nrw/commons/upload/FileUtils.java | 23 +-- .../nrw/commons/upload/ShareActivity.java | 62 ++++++-- .../fr/free/nrw/commons/utils/ImageUtils.java | 135 ++++++++++++++++++ app/src/main/res/values/strings.xml | 4 +- 7 files changed, 295 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/fr/free/nrw/commons/upload/DetectUnwantedPicturesAsync.java create mode 100644 app/src/main/java/fr/free/nrw/commons/utils/ImageUtils.java diff --git a/.gitignore b/.gitignore index 1ab05305e..5514c2b09 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,10 @@ app/gradle/wrapper/gradle-wrapper.jar app/gradlew app/gradlew.bat app/gradle/wrapper/gradle-wrapper.properties + +#related to OpenCV +/libraries/opencv/build +app/src/main/jniLibs +#Below removes all the HTML files related to OpenCV documentation. The documentation can be otherwise found at: +#https://docs.opencv.org/3.3.0/ +/libraries/opencv/javadoc/ diff --git a/app/build.gradle b/app/build.gradle index 98693126e..480916ee8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -38,6 +38,26 @@ dependencies { implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' // Because RxAndroid releases are few and far between, it is recommended you also // explicitly depend on RxJava's latest version for bug fixes and new features. + compile 'io.reactivex.rxjava2:rxjava:2.1.2' + compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0' + compile 'com.jakewharton.rxbinding2:rxbinding-support-v4:2.0.0' + compile 'com.jakewharton.rxbinding2:rxbinding-appcompat-v7:2.0.0' + compile 'com.jakewharton.rxbinding2:rxbinding-design:2.0.0' + + compile 'com.facebook.fresco:fresco:1.3.0' + compile 'com.facebook.stetho:stetho:1.5.0' + + testCompile 'junit:junit:4.12' + testCompile 'org.robolectric:robolectric:3.4' + + testCompile 'com.squareup.okhttp3:mockwebserver:3.8.1' + androidTestCompile 'com.squareup.okhttp3:mockwebserver:3.8.1' + androidTestCompile "com.android.support:support-annotations:${project.SUPPORT_LIB_VERSION}" + androidTestCompile 'com.android.support.test.espresso:espresso-core:3.0.1' + + debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.1' + releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1' + testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1' implementation 'io.reactivex.rxjava2:rxjava:2.1.2' implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0' implementation 'com.jakewharton.rxbinding2:rxbinding-support-v4:2.0.0' @@ -91,6 +111,8 @@ android { targetSdkVersion project.targetSdkVersion testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true + + multiDexEnabled true } sourceSets { diff --git a/app/src/main/java/fr/free/nrw/commons/upload/DetectUnwantedPicturesAsync.java b/app/src/main/java/fr/free/nrw/commons/upload/DetectUnwantedPicturesAsync.java new file mode 100644 index 000000000..b383601ec --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/upload/DetectUnwantedPicturesAsync.java @@ -0,0 +1,59 @@ +package fr.free.nrw.commons.upload; + +import android.content.Context; +import android.graphics.BitmapRegionDecoder; +import android.net.Uri; +import android.os.AsyncTask; + +import java.io.IOException; + +import fr.free.nrw.commons.utils.ImageUtils; +import timber.log.Timber; + +/** + * Created by bluesir9 on 16/9/17. + * + *

Responsible for checking if the picture that the user is trying to upload is useful or not. Will attempt to filter + * away completely black,fuzzy/blurry pictures(for now). + * + *

todo: Detect selfies? + */ + +public class DetectUnwantedPicturesAsync extends AsyncTask { + + interface Callback { + void onResult(ImageUtils.Result result); + } + + private final Callback callback; + private final String imageMediaFilePath; + + DetectUnwantedPicturesAsync(String imageMediaFilePath, Callback callback) { + this.callback = callback; + this.imageMediaFilePath = imageMediaFilePath; + } + + @Override + protected ImageUtils.Result doInBackground(Void... voids) { + try { + Timber.d("FilePath: " + imageMediaFilePath); + if (imageMediaFilePath == null) { + return ImageUtils.Result.IMAGE_OK; + } + + BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(imageMediaFilePath,false); + + return ImageUtils.checkIfImageIsTooDark(decoder); + } catch (IOException ioe) { + Timber.e(ioe, "IO Exception"); + return ImageUtils.Result.IMAGE_OK; + } + } + + @Override + protected void onPostExecute(ImageUtils.Result result) { + super.onPostExecute(result); + //callback to UI so that it can take necessary decision based on the result obtained + callback.onResult(result); + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java b/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java index daa2b6d09..13056ad4b 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/FileUtils.java @@ -23,7 +23,6 @@ import java.io.IOException; import java.nio.channels.FileChannel; import java.util.Date; -import fr.free.nrw.commons.CommonsApplication; import timber.log.Timber; public class FileUtils { @@ -42,6 +41,7 @@ public class FileUtils { @Nullable public static String getPath(Context context, Uri uri) { + String returnPath = null; final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; // DocumentProvider @@ -53,7 +53,7 @@ public class FileUtils { final String type = split[0]; if ("primary".equalsIgnoreCase(type)) { - return Environment.getExternalStorageDirectory() + "/" + split[1]; + returnPath = Environment.getExternalStorageDirectory() + "/" + split[1]; } } else if (isDownloadsDocument(uri)) { // DownloadsProvider @@ -61,8 +61,9 @@ public class FileUtils { final Uri contentUri = ContentUris.withAppendedId( Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); - return getDataColumn(context, contentUri, null, null); + returnPath = getDataColumn(context, contentUri, null, null); } else if (isMediaDocument(uri)) { // MediaProvider + final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; @@ -87,17 +88,19 @@ public class FileUtils { split[1] }; - return getDataColumn(context, contentUri, selection, selectionArgs); + returnPath = getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore (and general) else if ("content".equalsIgnoreCase(uri.getScheme())) { - return getDataColumn(context, uri, null, null); + returnPath = getDataColumn(context, uri, null, null); } // File else if ("file".equalsIgnoreCase(uri.getScheme())) { - return uri.getPath(); - } else { + returnPath = uri.getPath(); + } + + if(returnPath == null) { //fetching path may fail depending on the source URI and all hope is lost //so we will create and use a copy of the file, which seems to work String copyPath = null; @@ -105,6 +108,7 @@ public class FileUtils { ParcelFileDescriptor descriptor = context.getContentResolver().openFileDescriptor(uri, "r"); if (descriptor != null) { + SharedPreferences sharedPref = PreferenceManager .getDefaultSharedPreferences(context); boolean useExtStorage = sharedPref.getBoolean("useExternalStorage", true); @@ -131,7 +135,10 @@ public class FileUtils { Timber.w(e, "Error in file " + copyPath); return null; } + } else { + return returnPath; } + return null; } @@ -150,7 +157,7 @@ public class FileUtils { String[] selectionArgs) { Cursor cursor = null; - final String column = "_data"; + final String column = MediaStore.Images.ImageColumns.DATA; final String[] projection = { column }; diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java index a0b9102b6..a5756c06b 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java @@ -2,6 +2,7 @@ package fr.free.nrw.commons.upload; import android.Manifest; import android.content.ContentResolver; +import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; @@ -18,6 +19,7 @@ import android.support.graphics.drawable.VectorDrawableCompat; import android.support.v4.app.ActivityCompat; import android.support.v4.app.FragmentManager; import android.support.v4.content.ContextCompat; +import android.support.v7.app.AlertDialog; import android.view.MenuItem; import android.view.View; import android.widget.TextView; @@ -47,11 +49,14 @@ import fr.free.nrw.commons.caching.CacheController; import fr.free.nrw.commons.category.CategorizationFragment; import fr.free.nrw.commons.category.OnCategoriesSaveHandler; import fr.free.nrw.commons.contributions.Contribution; +import fr.free.nrw.commons.contributions.ContributionsActivity; import fr.free.nrw.commons.modifications.CategoryModifier; import fr.free.nrw.commons.modifications.ModificationsContentProvider; import fr.free.nrw.commons.modifications.ModifierSequence; import fr.free.nrw.commons.modifications.ModifierSequenceDao; import fr.free.nrw.commons.modifications.TemplateRemoveModifier; +import fr.free.nrw.commons.mwapi.EventLog; +import fr.free.nrw.commons.utils.ImageUtils; import fr.free.nrw.commons.mwapi.MediaWikiApi; import timber.log.Timber; @@ -287,7 +292,7 @@ public class ShareActivity REQUEST_PERM_ON_CREATE_LOCATION); } } - performPreuploadProcessingOfFile(); + performPreUploadProcessingOfFile(); SingleUploadFragment shareView = (SingleUploadFragment) getSupportFragmentManager().findFragmentByTag("shareView"); @@ -311,7 +316,7 @@ public class ShareActivity && grantResults[0] == PackageManager.PERMISSION_GRANTED) { backgroundImageView.setImageURI(mediaUri); storagePermitted = true; - performPreuploadProcessingOfFile(); + performPreUploadProcessingOfFile(); } return; } @@ -319,7 +324,7 @@ public class ShareActivity if (grantResults.length >= 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { locationPermitted = true; - performPreuploadProcessingOfFile(); + performPreUploadProcessingOfFile(); } return; } @@ -328,12 +333,12 @@ public class ShareActivity && grantResults[0] == PackageManager.PERMISSION_GRANTED) { backgroundImageView.setImageURI(mediaUri); storagePermitted = true; - performPreuploadProcessingOfFile(); + performPreUploadProcessingOfFile(); } if (grantResults.length >= 2 && grantResults[1] == PackageManager.PERMISSION_GRANTED) { locationPermitted = true; - performPreuploadProcessingOfFile(); + performPreUploadProcessingOfFile(); } return; } @@ -344,7 +349,7 @@ public class ShareActivity && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //It is OK to call this at both (1) and (4) because if perm had been granted at //snackbar, user should not be prompted at submit button - performPreuploadProcessingOfFile(); + performPreUploadProcessingOfFile(); //Uploading only begins if storage permission granted from arrow icon uploadBegins(); @@ -355,7 +360,7 @@ public class ShareActivity } } - private void performPreuploadProcessingOfFile() { + private void performPreUploadProcessingOfFile() { if (!useNewPermissions || storagePermitted) { if (!duplicateCheckPassed) { //Test SHA1 of image to see if it matches SHA1 of a file on Commons @@ -370,7 +375,17 @@ public class ShareActivity Timber.d("%s duplicate check: %s", mediaUri.toString(), result); duplicateCheckPassed = (result == DUPLICATE_PROCEED || result == NO_DUPLICATE); - }, mwApi); + /* + TODO: 16/9/17 should we run DetectUnwantedPicturesAsync if DUPLICATE_PROCEED is returned? Since that means + we are processing images that are already on server???... + */ + + if (duplicateCheckPassed) { + //image can be uploaded, so now check if its a useless picture or not + performUnwantedPictureDetectionProcess(); + } + + },mwApi); fileAsyncTask.execute(); } catch (IOException e) { Timber.d(e, "IO Exception: "); @@ -384,6 +399,37 @@ public class ShareActivity } } + private void performUnwantedPictureDetectionProcess() { + String imageMediaFilePath = FileUtils.getPath(this,mediaUri); + DetectUnwantedPicturesAsync detectUnwantedPicturesAsync = new DetectUnwantedPicturesAsync(imageMediaFilePath, result -> { + + if (result != ImageUtils.Result.IMAGE_OK) { + //show appropriate error message + String errorMessage = result == ImageUtils.Result.IMAGE_DARK ? getString(R.string.upload_image_too_dark) : getString(R.string.upload_image_blurry); + AlertDialog.Builder errorDialogBuilder = new AlertDialog.Builder(this); + errorDialogBuilder.setMessage(errorMessage); + errorDialogBuilder.setTitle(getString(R.string.warning)); + errorDialogBuilder.setPositiveButton(getString(R.string.no), (dialogInterface, i) -> { + //user does not wish to upload the picture, take them back to ContributionsActivity + Intent intent = new Intent(ShareActivity.this, ContributionsActivity.class); + dialogInterface.dismiss(); + startActivity(intent); + }); + errorDialogBuilder.setNegativeButton(getString(R.string.yes), (dialogInterface, i) -> { + //user wishes to go ahead with the upload of this picture, just dismiss this dialog + dialogInterface.dismiss(); + }); + + AlertDialog errorDialog = errorDialogBuilder.create(); + if (!isFinishing()) { + errorDialog.show(); + } + } + }); + + detectUnwantedPicturesAsync.execute(); + } + private Snackbar requestPermissionUsingSnackBar(String rationale, final String[] perms, final int code) { diff --git a/app/src/main/java/fr/free/nrw/commons/utils/ImageUtils.java b/app/src/main/java/fr/free/nrw/commons/utils/ImageUtils.java new file mode 100644 index 000000000..6627f2886 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/utils/ImageUtils.java @@ -0,0 +1,135 @@ +package fr.free.nrw.commons.utils; + +import android.graphics.Bitmap; +import android.graphics.BitmapRegionDecoder; +import android.graphics.Color; +import android.graphics.Rect; + +import timber.log.Timber; + +/** + * Created by bluesir9 on 3/10/17. + */ + +public class ImageUtils { + //atleast 50% of the image in question should be considered dark for the entire image to be dark + private static final double MINIMUM_DARKNESS_FACTOR = 0.50; + //atleast 50% of the image in question should be considered blurry for the entire image to be blurry + private static final double MINIMUM_BLURRYNESS_FACTOR = 0.50; + private static final int LAPLACIAN_VARIANCE_THRESHOLD = 70; + + public enum Result { + IMAGE_DARK, + IMAGE_OK + } + + /** + * BitmapRegionDecoder allows us to process a large bitmap by breaking it down into smaller rectangles. The rectangles + * are obtained by setting an initial width, height and start position of the rectangle as a factor of the width and + * height of the original bitmap and then manipulating the width, height and position to loop over the entire original + * bitmap. Each individual rectangle is independently processed to check if its too dark. Based on + * the factor of "bright enough" individual rectangles amongst the total rectangles into which the image + * was divided, we will declare the image as wanted/unwanted + * + * @param bitmapRegionDecoder BitmapRegionDecoder for the image we wish to process + * @return Result.IMAGE_OK if image is neither dark nor blurry or if the input bitmapRegionDecoder provided is null + * Result.IMAGE_DARK if image is too dark + */ + public static Result checkIfImageIsTooDark(BitmapRegionDecoder bitmapRegionDecoder) { + if (bitmapRegionDecoder == null) { + Timber.e("Expected bitmapRegionDecoder was null"); + return Result.IMAGE_OK; + } + + int loadImageHeight = bitmapRegionDecoder.getHeight(); + int loadImageWidth = bitmapRegionDecoder.getWidth(); + + int checkImageTopPosition = 0; + int checkImageBottomPosition = loadImageHeight / 10; + int checkImageLeftPosition = 0; + int checkImageRightPosition = loadImageWidth / 10; + + int totalDividedRectangles = 0; + int numberOfDarkRectangles = 0; + + while ((checkImageRightPosition <= loadImageWidth) && (checkImageLeftPosition < checkImageRightPosition)) { + while ((checkImageBottomPosition <= loadImageHeight) && (checkImageTopPosition < checkImageBottomPosition)) { + Timber.d("left: " + checkImageLeftPosition + " right: " + checkImageRightPosition + " top: " + checkImageTopPosition + " bottom: " + checkImageBottomPosition); + + Rect rect = new Rect(checkImageLeftPosition,checkImageTopPosition,checkImageRightPosition,checkImageBottomPosition); + totalDividedRectangles++; + + Bitmap processBitmap = bitmapRegionDecoder.decodeRegion(rect,null); + + if (checkIfImageIsDark(processBitmap)) { + numberOfDarkRectangles++; + } + + checkImageTopPosition = checkImageBottomPosition; + checkImageBottomPosition += (checkImageBottomPosition < (loadImageHeight - checkImageBottomPosition)) ? checkImageBottomPosition : (loadImageHeight - checkImageBottomPosition); + } + + checkImageTopPosition = 0; //reset to start + checkImageBottomPosition = loadImageHeight / 10; //reset to start + checkImageLeftPosition = checkImageRightPosition; + checkImageRightPosition += (checkImageRightPosition < (loadImageWidth - checkImageRightPosition)) ? checkImageRightPosition : (loadImageWidth - checkImageRightPosition); + } + + Timber.d("dark rectangles count = " + numberOfDarkRectangles + ", total rectangles count = " + totalDividedRectangles); + + if (numberOfDarkRectangles > totalDividedRectangles * MINIMUM_DARKNESS_FACTOR) { + return Result.IMAGE_DARK; + } + + return Result.IMAGE_OK; + } + + /** + * Pulls the pixels into an array and then runs through it while checking the brightness of each pixel. + * The calculation of brightness of each pixel is done by extracting the RGB constituents of the pixel + * and then applying the formula to calculate its "Luminance". If this brightness value is less than + * 50 then the pixel is considered to be dark. Based on the MINIMUM_DARKNESS_FACTOR if enough pixels + * are dark then the entire bitmap is considered to be dark. + * + *

For more information on this brightness/darkness calculation technique refer the accepted answer + * on this -> https://stackoverflow.com/questions/35914461/how-to-detect-dark-photos-in-android/35914745 + * SO question and follow the trail. + * + * @param bitmap The bitmap that needs to be checked. + * @return true if bitmap is dark or null, false if bitmap is bright + */ + private static boolean checkIfImageIsDark(Bitmap bitmap) { + if (bitmap == null) { + Timber.e("Expected bitmap was null"); + return true; + } + + int bitmapWidth = bitmap.getWidth(); + int bitmapHeight = bitmap.getHeight(); + + int allPixelsCount = bitmapWidth * bitmapHeight; + int[] bitmapPixels = new int[allPixelsCount]; + + bitmap.getPixels(bitmapPixels,0,bitmapWidth,0,0,bitmapWidth,bitmapHeight); + boolean isImageDark = false; + int darkPixelsCount = 0; + + for (int pixel : bitmapPixels) { + int r = Color.red(pixel); + int g = Color.green(pixel); + int b = Color.blue(pixel); + + int brightness = (int) (0.2126 * r + 0.7152 * g + 0.0722 * b); + if (brightness < 50) { + //pixel is dark + darkPixelsCount++; + if (darkPixelsCount > allPixelsCount * MINIMUM_DARKNESS_FACTOR) { + isImageDark = true; + break; + } + } + } + + return isImageDark; + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ceba924e1..92b6be921 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -205,12 +205,14 @@ Error while caching pictures 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 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. + This picture is too dark, are you sure you want to upload it? Wikimedia Commons is only for pictures with encyclopedic value. + This picture is blurry, are you sure you want to upload it? Wikimedia Commons is only for pictures with encyclopedic value. Give permission Use external storage Save pictures taken with the in-app camera on your device + Login to your account Send log file Send log file to developers via email - Login to your account Location has not changed. Location not available. From 6df113b2b3ab16ee3e119ec228abb98337a27cc4 Mon Sep 17 00:00:00 2001 From: Ujjwal Agrawal Date: Mon, 19 Feb 2018 12:15:47 +0530 Subject: [PATCH 06/18] Update PULL_REQUEST_TEMPLATE.md --- PULL_REQUEST_TEMPLATE.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index e9e14f77a..9e7714035 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -1,9 +1,6 @@ ## Description -Describe the changes made and why they were made. -## Related issues and discussion -#{Issue Number} - +Fixes #{Issue Number} ## For user interface changes: Screenshots showing what changed From f6c6d87eb2b07e0763409dee126eda58d16c1d3e Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 19 Feb 2018 08:56:11 +0100 Subject: [PATCH 07/18] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-ast/strings.xml | 4 ++- app/src/main/res/values-b+sr+Latn/strings.xml | 2 +- app/src/main/res/values-bn/strings.xml | 2 +- app/src/main/res/values-ca/strings.xml | 2 +- app/src/main/res/values-cs/strings.xml | 4 ++- app/src/main/res/values-da/strings.xml | 4 ++- app/src/main/res/values-de/strings.xml | 4 ++- app/src/main/res/values-el/strings.xml | 4 ++- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-fa/strings.xml | 2 +- app/src/main/res/values-fi/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-gl/strings.xml | 2 +- app/src/main/res/values-hi/strings.xml | 3 +- app/src/main/res/values-hu/strings.xml | 2 +- app/src/main/res/values-is/strings.xml | 2 +- app/src/main/res/values-iw/strings.xml | 2 +- app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-kab/strings.xml | 2 +- app/src/main/res/values-ko/strings.xml | 2 +- app/src/main/res/values-lb/strings.xml | 2 +- app/src/main/res/values-mk/strings.xml | 4 ++- app/src/main/res/values-mr/strings.xml | 30 +++++++++++-------- app/src/main/res/values-nb/strings.xml | 2 +- app/src/main/res/values-pms/strings.xml | 4 ++- app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 4 ++- app/src/main/res/values-ru/strings.xml | 4 ++- app/src/main/res/values-sd/strings.xml | 2 +- app/src/main/res/values-skr/strings.xml | 2 +- app/src/main/res/values-sr/strings.xml | 13 +++++--- app/src/main/res/values-su/strings.xml | 2 +- app/src/main/res/values-sv/strings.xml | 2 +- app/src/main/res/values-tr/strings.xml | 2 +- app/src/main/res/values-ug/strings.xml | 12 ++++---- app/src/main/res/values-uk/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 4 ++- app/src/main/res/values-zh/strings.xml | 4 ++- 38 files changed, 91 insertions(+), 57 deletions(-) diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml index 204fd3767..277da76af 100644 --- a/app/src/main/res/values-ast/strings.xml +++ b/app/src/main/res/values-ast/strings.xml @@ -199,12 +199,14 @@ Error al poner les fotos na caché Un títulu descriptivu únicu pal ficheru, que sirvirá para da-y nome al ficheru. Se pue usar llinguax normal con espacios. Nun amiestes la estensión del ficheru 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. + Esta imaxe ye escura enforma, ¿tas seguru de que quies xubila? Wikimedia Commons ye sólo pa imáxenes con valor enciclopédicu. + Esta imaxe ta borrosa, ¿tas seguru de que quies xubila? Wikimedia Commons ye sólo pa imáxenes con valor enciclopédicu. Dar permisu Usar almacenamientu esternu Guardar nel preséu les imaxes tomaes cola cámara de la app + Anicia sesión na to cuenta Unviar ficheru de rexistru Unviar ficheru de rexistru a los desendolcadores per corréu electrónicu - Anicia sesión na to cuenta L\'allugamientu nun camudó. L\'allugamientu nun ta disponible. Ríquese permisu p\'amosar una llista de llugares cercanos diff --git a/app/src/main/res/values-b+sr+Latn/strings.xml b/app/src/main/res/values-b+sr+Latn/strings.xml index be209bfa5..bc3d2b720 100644 --- a/app/src/main/res/values-b+sr+Latn/strings.xml +++ b/app/src/main/res/values-b+sr+Latn/strings.xml @@ -199,9 +199,9 @@ Davanje dozvole Upotreba spoljašnjeg skladišta Spremanje slika napravljenih kamerom aplikacije na Vašem uređaju + Prijavite se na svoj nalog Pošalji dnevničku datoteku Pošalji dnevničku datoteku developerima preko imejla - Prijavite se na svoj nalog Lokacija nije promenjena. Lokacija nije dostupna. Potrebna je dozvola za prikazivanje liste lokacija u blizini diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index d8e927712..ad5af3b8b 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -202,9 +202,9 @@ অনুমতি দিন বাহ্যিক সঞ্চয়স্থান ব্যবহার করুন অাপনার ডিভাইসের নিজস্ব ক্যামেরায় ধারণকৃত ছবি সংরক্ষণ করুন + আপনার অ্যাকাউন্টে প্রবেশ করুন লগ ফাইল পাঠান ইমেইলের মাধ্যমে উন্নয়নকারীর কাছে লগ ফাইল পাঠান - আপনার অ্যাকাউন্টে প্রবেশ করুন অবস্থান পরিবর্তন হয়নি। অবস্থান উপলব্ধ নয়। কাছাকাছি স্থানসমূহের একটি তালিকা প্রদর্শন করতে অনুমতি প্রয়োজন diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index e678dfc26..0370b5f3f 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -170,9 +170,9 @@ Error mentre es carregaven les fotografies Dóna permís Utilitza l’emmagatzematge extern + Entreu en el vostre compte Envia el fitxer de registre Envia el registre als desenvolupadors per correu - Entreu en el vostre compte La ubicació no ha canviat. La ubicació no és disponible. COM ANAR-HI diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 77fdac33c..acbf8c433 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -199,12 +199,14 @@ Chyba při meziukládání obrázků Unikátní a popisný název pro daný soubor, který bude sloužit jako název souboru. Můžete použít běžný psaný jazyk s mezerami; nezahrnujte koncovku souboru. Popište prosím obrázek, jak jen to je možné: Kde byl pořízen? Co znázorňuje? Jaký je kontext obrázku? Popisujte prosím významné předměty nebo osoby na obrázku a nezapomeňte na informace, které není možné snadno odhadnout ze samotného obrázku, jako je například denní doba, pokud jde o krajinu. Pokud je na obrázku něco neobvyklého, popište, co to dělá neobvyklým. + Tento obrázek je příliš tmavý, jste si jist/a, že ho chcete nahrát? Wikimedia Commons slouží jenom pro obrázky s encyklopedickou hodnotou. + Tento obrázek je rozmazaný, jste si jist/a, že ho chcete nahrát? Wikimedia Commons slouží jenom pro obrázky s encyklopedickou hodnotou. Dát povolení Použít externí úložiště Uložit obrázky pořízené fotoaparátem, jenž je součástí této aplikace + Přihlásit se k účtu Odeslat log Odeslat log vývojářům e-mailem - Přihlásit se k účtu Vaše umístění se nezměnilo. Umístění není dostupné. Vyžadováno povolení k zobrazení seznamu blízkých míst diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 5437d0008..f8d0caf0d 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -199,12 +199,14 @@ Fejl under mellemlagring af billeder En unik beskrivelse for filen, som vil fungere som et filnavn. Du kan bruge normalt sprog med mellemrum. Udelad filendelsen. Beskriv mediet så godt som muligt: Hvor blev det taget? Hvad viser det? Hvad er konteksten? Beskriv objekterne eller personerne. Giv information som ikke nemt kan gættes, for eksempel hvornår på dagen billedet blev taget, om det er et landskabsbillede. Om billedet viser noget usædvanligt, forklar hvad som gør det usædvanlig. + Billedet er for mørkt. Er du sikker på, at du ønsker at overføre det? Wikimedia Commons er kun for billeder encyklopædisk værdi. + Dette billede er sløret. Er du sikker på, at du ønsker at overføre det? Wikimedia Commons er kun for billeder med encyklopædisk værdi. Giv tilladelse Brug eksternt lager Gem billeder taget med din enheds program på kameraet + Log ind på din konto Send logfil Send logfil til udviklerne via e-post - Log ind på din konto Sted er ikke ændret. Sted ikke tilgængeligt. Tilladelse kræves for at vise en liste over steder i nærheden diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 58e0b272a..4312eff1f 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -199,12 +199,14 @@ Fehler beim Zwischenspeichern der Bilder Ein eindeutiger beschreibender Titel für die Datei, der als Dateiname dient. Du kannst Klartext mit Leerzeichen verwenden. Gib nicht die Dateierweiterung mit an. Bitte beschreibe das Medium so gut wie möglich: Wo wurde es aufgenommen? Was zeigt es? Was ist der Kontext? Bitte beschreibe die Objekte oder Personen. Zeige Informationen auf, die nicht einfach erraten werden können, zum Beispiel die Tageszeit, falls es eine Landschaft ist. Falls das Medium etwas Ungewöhnliches zeigt, erkläre bitte, was es ungewöhnlich macht. + Dieses Bild ist zu dunkel. Bist du sicher, dass du es hochladen möchtest? Wikimedia Commons ist nur für Bilder mit enzyklopädischem Wert gedacht. + Dieses Bild ist verschwommen. Bist du sicher, dass du es hochladen möchtest? Wikimedia Commons ist nur für Bilder mit enzyklopädischem Wert gedacht. Berechtigung geben Externen Speicher verwenden Mit der In-App-Kamera aufgenommene Bilder auf deinem Gerät speichern + Bei deinem Benutzerkonto anmelden Logdatei senden Logdatei an die Entwickler per E-Mail senden - Bei deinem Benutzerkonto anmelden Der Standort hat sich nicht geändert. Der Standort ist nicht verfügbar. Berechtigung zur Anzeige einer Liste mit Orten in der Nähe erforderlich diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index bdaafb27b..5d10d771f 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -199,12 +199,14 @@ Υπήρξε σφάλμα κατά την σκίαση εικόνων Ένας μοναδικός τίτλος περιγραφής του φακέλλου, που θα χρησιμεύσει ως όνομα φακέλλου. Μπορείτε να χρησιμοποιήσετε τις ήδη υπάρχουσες γλώσσες με διαστήματα. Μην συμπεριλάβετε την επέκταση φακέλλου \nΠαρακαλώ περιγράψετε τα μέσα το δυνατό περισσότερο : Πού οδηγήθηκε αυτό; Τι δείχνει; Ποιο είναι το περιεχόμενο του; Παρακαλώ περιγράψετε τα αντικείμενα ή τα πρόσωπα. Αποκαλύψετε πληροφορίες που δεν μπορούν εύκολο να μαντέψει κανείς, για παράδειγμα την ώρα εντός της ημέρας αν πρόκειται για τοπίο. Αν τα μέσα δείξουν κάτι ασύνηθες, παρακαλώ εξηγήστε τι το καθιστά μη συνηθισμένα. + Αυτή η εικόνα είναι πολύ σκοτεινή, είστε βέβαιοι ότι θέλετε να την ανεβάσετε; Το Wikimedia Commons είναι μόνο για εικόνες με εγκυκλοπαιδική αξία. + Αυτή η εικόνα είναι θολή, είστε βέβαιοι ότι θέλετε να την ανεβάσετε; Το Wikimedia Commons είναι μόνο για εικόνες με εγκυκλοπαιδική αξία. Χορηγήστε άδεια Χρησιμοποιήσετε την εξωτερική αποθήκευση Αποθηκεύσετε εικόνες που παίρνονται στην κάμερα εφαρμογής στην συσκευή σας + Συνδεθείτε στο λογαριασμό σας. Αποστείλατε τον φάκελλο σύνδεσης Στείλατε τον φάκελλο σύνδεσης στους δημιουργούς μέσω email - Συνδεθείτε στο λογαριασμό σας. Ο εντοπισμός δεν έχει αλλάξει. Ο τόπος δεν είναι διαθέσιμος. Απαιτείται άδεια για την εμφάνιση λίστας κοντινών σημείων diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 0a2c423ae..7067f5f9b 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -202,9 +202,9 @@ Otorgar permiso Utilizar almacenamiento externo Guardar en el dispositivo imágenes capturadas con la cámara de la aplicación + Accede a tu cuenta Enviar archivo de registro Enviar archivo de registro a los desarrolladores por correo electrónico - Accede a tu cuenta La ubicación no ha cambiado. La ubicación no está disponible. Se necesita permiso para mostrar una lista de lugares cercanos diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 68d522865..f0759e75e 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -198,9 +198,9 @@ اجازه بده استفاده از حافظهٔ خارجی ذخیرهٔ تصویرهای گرفته شده توسط دوربین درونکار اپلیکیشن بر روی دستگاه شما + ورود به حساب کاربریتان ارسال فایل سیاهه ارسال فایل سیاهه به‌وسیلهٔ ایمیل برای توسعه‌دهندگان - ورود به حساب کاربریتان مکان تغییر نکرده‌است. مکان موجود نیست. برای نمایش مکان‌ّای اطراف نیاز به اجازه است. diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 01864d294..d341f7b0f 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -192,9 +192,9 @@ Tiedoston yksilöllinen ja kuvaava otsikko, jota käytetään tiedostonimenä. Voit käyttää tavallista kieltä välilyönnein. Älä sisällytä tiedoston päätettä. Anna lupa Käytä ulkoista tallennustilaa + Kirjaudu tilillesi Lähetä lokitiedosto Lähetä logitiedosto kehittäjille sähköpostin kautta - Kirjaudu tilillesi Sijainti ei ole muuttunut. Sijainti ei käytettävissä. LUE ARTIKKELI diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 75e42c9d5..860cb6e2c 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -202,9 +202,9 @@ Accorder le droit Utiliser le stockage externe Enregistrer les images prises avec l’appareil photo de votre appareil + Connectez-vous à votre compte Envoyer le journal Envoyer le journal aux développeurs par courriel - Connectez-vous à votre compte L\'emplacement n\'a pas changé. Emplacement non disponible. Une permission est requise pour afficher une liste de lieux relatifs diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 90de742cc..293c66808 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -202,9 +202,9 @@ Outorgar permiso Usar o almacenamento externo Gardar as imaxes capturadas coa cámara do seu dispositivo + Comezar sesión na súa conta Enviar ficheiro de rexistro Enviar ficheiro de rexistro ós desenvolvedores por correo electrónico - Comezar sesión na súa conta A localización non cambiou. A localización non está dispoñible. Precísase permiso para amosar unha lista de lugares preto de aquí diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 452bb6523..f0a0b2633 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -198,12 +198,13 @@ चित्र कैशिंग करते समय त्रुटि फ़ाइल के लिए एक अद्वितीय वर्णनात्मक शीर्षक, जो एक फ़ाइल नाम के रूप में काम करेगा। आप रिक्त स्थान के साथ सादे भाषा का उपयोग कर सकते हैं। फ़ाइल विस्तार शामिल न करें कृपया मीडिया जितना संभव हो उतना बताएं: यह कहां लिया गया? यह क्या दिखाता है? संदर्भ क्या है? कृपया वस्तुओं या व्यक्तियों का वर्णन करें। ऐसी जानकारी का खुलासा करें जिसे आसानी से अनुमानित नहीं किया जा सकता, उदाहरण के लिए दिन का समय यदि यह परिदृश्य है। अगर मीडिया कुछ असामान्य दिखाता है, तो कृपया बताएं कि इसे क्या असामान्य बनाता है। + यह चित्र बहुत गहरा है, क्या आप वाकई इसे अपलोड करना चाहते हैं? विकिमीडिया कॉमन्स केवल विश्वकोषीय मूल्य वाले चित्रों के लिए है। अनुमति दें बाहरी स्टॉरज का पृयोग करे। आप अपने डिवाइस के इन-ऐप कैमरा से ली गई तस्वीरों को सहेजें। + अपने खाते में प्रवेश करें लॉग फाइल भेजें डेवेलपर्स को लॉग फाइल ई-मेल से भेजें - अपने खाते में प्रवेश करें स्थान परिवर्तन नहीं हुआ। स्थान उपलब्ध नहीं। आसपास के स्थान दिखाने के लिए अनुमति चाहिए diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 134563a09..d63a9f046 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -196,9 +196,9 @@ Engedély adása Külső tárhely használata Az alkalmazáson belüli kamerával készült képek mentése az eszközre + Bejelentkezés a fiókodba Naplófájlok küldése Naplófájlok küldése e-mailben a fejlesztőknek - Bejelentkezés a fiókodba A hely nem változott. A hely nem érhető el. diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 36c7ee2b4..0b0bf3b5a 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -202,9 +202,9 @@ Gefa heimild Nota ytri gagnageymslu Vistaðu myndir sem teknar hafa verið með innbyggðu myndavélinni í tækinu þínu + Skrá inn á aðganginn þinn Senda atvikaskrá Senda atvikaskrá til forritaranna með tölvupósti - Skrá inn á aðganginn þinn Staðsetning hefur ekki breyst. Staðsetning ekki tiltæk. Heimild þarf til að birta lista yfir staði í nágrenninu diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index cc5026d83..483756789 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -201,9 +201,9 @@ לתת הרשאה להשתמש באחסון חיצוני שמירת תמונות שצולמו באמצעות מצלמה בתוך היישום במכשיר שלך + כניסה לחשבון שלך שליחת קובץ יומן שליחת קובץ יומן למפתחים בדואר אלקטרוני - כניסה לחשבון שלך המיקום לא השתנה. המיקום אינו זמין. נדרשת הרשאה כדי להציג רשימה של מקומות בסביבה diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 0806e8f54..aa2a840d4 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -186,9 +186,9 @@ 権限を取得 外部ストレージを使用 アプリ内のカメラで撮影した写真を端末に保存する + 自分のアカウントにログイン ログファイルを送信する メールで開発者にログファイルを送信する - 自分のアカウントにログイン 場所は変更されていません。 位置が無効です。 diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index 651981705..3ea1cf79e 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -202,9 +202,9 @@ Mudd tasiregt Seqdec asekles azɣaray Sekles tiwlafin yettwaṭṭfen s tkamirat yellan deg ibenk + Qqen ar umiḍan-ik Azen afaylu n uɣmis Azen afaylu n uɣmis i yinermisen s yimayl - Qqen ar umiḍan-ik Adeg ur ibeddel ara. Ulac adeg Ilaq usireg i uskan tabdart n wadigen iqerben diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index a38bf2fc8..7224151a7 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -197,9 +197,9 @@ 권한 부여 외부 저장소 사용하기 장치의 인앱 카메라로 찍은 사진 저장하기 + 자신의 계정으로 로그인 로그 파일 보내기 이메일로 개발자에게 로그 파일 보내기 - 자신의 계정으로 로그인 위치가 변경되지 않았습니다. 위치를 사용할 수 없습니다. 주변 장소의 목록을 표시하기 위한 권한이 필요합니다. diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index 70e72e959..c5e85804f 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -189,9 +189,9 @@ Autorisatioun ginn Externe Späicher benotzen Biller späicheren déi mat der in-app Kamera vun Ärem Apparat gemaach goufen + An Äre Benotzerkont aloggen Log-Fichier schécken Log-Fichier per E-Mail un d\'Entwéckler schécken - An Äre Benotzerkont aloggen De Plaz huet net geännert. Plaz ass net disponibel. ARTIKEL LIESEN diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 8a9811cd0..82824783b 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -199,12 +199,14 @@ Грешка при меѓускладирање на сликите Краток и единствен наслов на податотеката, кој ќе служи како нејзин назив. Можете да користите прост јазик со меѓупростор, но не пишувајте ја податотечната наставка Објаснете ја податотеката што подобро можете: Каде е направена? Што е прикажано на неа? Кој е контекстот? Опишете ги предметите, објектите и личностите. Дајте сознанија што не можат лесно да се погодат, како на пр. време од денот ако се работи за природен предел. Ако на неа е претставено нешто необично, објаснете зошто прикажаното е необично. + Сликата ви е претемна. Дали сигурно сакате да ја подигнете? Ризницата е посветена само на слики со енциклопедиска вредност. + Сликата ви е матна. Дали сигурно сакате да ја подигнете? Ризницата е посветена само на слики со енциклопедиска вредност. Дај дозвола Користи надворешен склад Зачувување на направените слики во прилогот со камерата на вашиот уред + Најавете се со вашата сметка Испрати дневничка податотека Испрати дневничка податотека на разработувачите по е-пошта - Најавете се со вашата сметка Местоположбата не е сменета. Местоположбата е недостапна. Се бара дозвола за приказ на список на околни места diff --git a/app/src/main/res/values-mr/strings.xml b/app/src/main/res/values-mr/strings.xml index f7f65ef00..1119d2b46 100644 --- a/app/src/main/res/values-mr/strings.xml +++ b/app/src/main/res/values-mr/strings.xml @@ -1,7 +1,7 @@ कॉमन्स - मांडण्या + सेटिंग्स सदस्यनाव परवलीचा शब्द(पासवर्ड) सनोंद-प्रवेश करा @@ -20,12 +20,12 @@ %1$s अपभारण पूर्ण करीत आहे %1$s अपभारण अयशस्वी बघण्यास अलगद टपली मारा - - १ संचिका अपभारीत आहे - %1$d संचिका अपभारीत आहे + + १ संचिका अपभारीत होत आहे + %1$d संचिका अपभारीत होत आहे माझी अपभारणे - प्रतिक्षावलीत ठेवले + रांगेत आहे अपयशी %1$d%% पूर्ण अपभारण करीत आहे @@ -41,7 +41,7 @@ सनोंद प्रवेश अशक्य - कृपया आपले सदस्यनाव तपासा सनोंद प्रवेश अशक्य - कृपया आपला परवलीचा शब्द तपासा अनेक अयशस्वी प्रयत्न.काही मिनीटांनंतर पुन्हा प्रयत्न करा. - माफ करा,कॉमन्सवर हा सदस्य प्रतिबंधित आहे + माफ करा, कॉमन्सवर हा सदस्य प्रतिबंधित आहे आपण आपल्या दोन कारक प्रमाणिकरण कोड प्रदान करणे आवश्यक आहे. सनोंद प्रवेश अयशस्वी! अपभारण करा @@ -50,21 +50,25 @@ अपभारण करा वर्ग शोधा जतन करा - + ताजेतवाने करा + आपल्या मोबाईलचे गिपीएस बंद आहे, तुम्हांला ते चालू करायचे आहे का? + जिपीएस चालू करा + अद्याप काहीही चढवलेले नाही + अद्याप अपभारणे नाहीत एक अपभारण %1$d अपभारणे - + १ अपभारण सुरू करीत आहे upload %1$d अपभारणे सुरू करीत आहे - + १ अपभारण %1$d अपभारणे %1$s शी जुळणारे कोणतेच वर्ग सापडले नाहीत - विकिमिडिया कॉमन्सवर आपल्या संचिकांना शोधणे सोपी जाण्यासाठी त्यांना वर्ग जोडा.\n\nवर्ग जोडण्यास टंकन सुरू करा.\nही पायरी चुकविण्यास या संदेशावर अलगद टिचका (किंवा बॅक कळ टिचका) + विकिमिडिया कॉमन्सवर आपल्या संचिकांना शोधणे सोपी जाण्यासाठी त्यांना वर्ग जोडा.\n\nवर्ग जोडण्यास टंकन सुरू करा.\nही पायरी चुकविण्यास या संदेशावर अलगद टिचका (किंवा बॅक कळ टिचका) वर्ग मांडण्या नोंदणी करा @@ -103,10 +107,10 @@ कृपया निव्वळ आपण घेतलेल्या किंवा तयार केलेल्या चित्रांचेच अपभारण करा: - नैसर्गिक गोष्टी (फुले, प्राणी, पर्वत)\n- नित्योपयोगी गोष्टी (दुचाकी, रेल्वे स्थानके)\n- प्रसिद्ध व्यक्ति (आपले महापौर, आपणास भेटलेले ऑलिंपिक खेळाडू) कृपया अपभारण करू \'\'\'नका\'\'\': - -आपल्या किंवा मित्रांच्या सेल्फी\n-आपण आंतरजाल (इंटरनेट) वरुन अधिभारण केलेली चित्रे\n-प्रोप्रायटरी अॲप्सचे स्क्रिनशॉट + -आपल्या किंवा मित्रांच्या सेल्फी\n-आपण आंतरजाल (इंटरनेट) वरुन अधिभारण केलेली चित्रे\n-प्रोप्रायटरी अॅप्सचे स्क्रिनशॉट उदाहरणादाखल अपभारण: - शीर्षक: Sydney Opera House\n- वर्णन: Sydney Opera House as viewed from across the bay\n- वर्ग: Sydney Opera House, Sydney Opera House from the west, Sydney Opera House remote views - आपली चित्रे सहभागा. विकिपीडियावरील लेखात जीवंतपणा आणा! + आपली चित्रे जोडा. विकिपीडियावरील लेखात जीवंतपणा आणा! विकिपीडियावरची चित्रे विकिमिडिया कॉमन्सवरुन येतात. जगातल्या अनेक लोकांना आपल्या चित्राद्वारे शिकता येते. आपण इंटरनेटवर शोधलेले प्रताधिकारीत साहित्य टाळा तसेच भित्तीपत्रकांची चित्रे, पुस्तकांचे कव्हर इत्यादी. @@ -118,7 +122,7 @@ वर्णन नाही. अनोळखी परवाना ताजेतवाने करा - परवानगी आवश्यक:बाह्य भंडारण वाचन. याशिवाय अॲप काम करू शकत नाही. + परवानगी आवश्यक:बाह्य भंडारण वाचन. याशिवाय अॅप काम करू शकत नाही. ऐच्छिक परवानगी:वर्ग सुचवण्यांसाठी सध्याचे स्थान मिळवा ठीक आहे जवळपासची स्थाने diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 25eb9ee4e..be8fce740 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -202,9 +202,9 @@ Gi tillatelse Bruk ekstern lagring Lagre bilder som er tatt med kameraet i appen på enheten din + Logg inn med kontoen din Send loggfil Send loggfil til utviklerne via epost - Logg inn med kontoen din Stedet har ikke blitt endret. Sted ikke tilgjengelig. Tillatelse kreves for å vise listen over steder i nærheten diff --git a/app/src/main/res/values-pms/strings.xml b/app/src/main/res/values-pms/strings.xml index 42347b7ee..bd9c1ff38 100644 --- a/app/src/main/res/values-pms/strings.xml +++ b/app/src/main/res/values-pms/strings.xml @@ -199,12 +199,14 @@ Eror antramentre ch\'as butavo le plance an memòria local 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 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. + Sa plancia a l\'é tròp sombra, e-lo sigur ëd vorèj cariela? Wikipedia Comun a l\'é mach për plance con un valor enciclopédich. + 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. Dé ël përmess Dovré n\'anmagasinament estern Argistré le plance pijà con la màchina fòto ëd sò angign + Ch\'as colega a sò cont Mandé l\'archivi d\'argistr Mandé l\'archivi d\'argistr ai dësvlupator për pòsta eletrònica - Ch\'as colega a sò cont Ël leu a l\'é nen cangià. Leu nen disponìbil. A-i é da manca dël përmess pr\'ësmon-e na lista dij pòst davzin diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 5792df782..98bb346aa 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -202,9 +202,9 @@ Dar permissão Usar o armazenamento externo Salvar as fotos tiradas com a câmera no aplicativo no seu dispositivo + Faça login na sua conta Enviar arquivo de registro Enviar arquivo de log para desenvolvedores por e-mail - Faça login na sua conta O local não mudou. Localização não disponível. Permissão necessária para exibir uma lista de locais próximos diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index bfd0027fd..146349281 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -199,12 +199,14 @@ Erro ao colocar imagens na cache 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 Por favor, descreva o ficheiro da melhor forma possível: Onde foi tirado? O que isso mostra? Qual é o contexto? Por favor, descreva os objetos ou as 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 mostrar algo incomum, explique o que torna incomum. + Esta imagem está demasiada escura, tem a certeza de que deseja carregá-la? O Wikimedia Commons só aceita as imagens de valor enciclopédico. + Esta imagem está desfocada, tem a certeza de que deseja carregá-la? O Wikimedia Commons serve apenas para imagens de valor enciclopédico. Permitir Utilizar a armazenagem externa Gravar as fotografias tiradas com a câmara da aplicação no seu dispositivo + Inicie sessão na sua conta Enviar ficheiro de registo Enviar o ficheiro de registo aos programadores por correio eletrónico - Inicie sessão na sua conta A localização não foi alterada. A localização não está disponível. É necessária a permissão para mostrar uma lista dos sítios aqui perto diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index eece93a93..1c3fbcb46 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -203,12 +203,14 @@ Ошибка при кэшировании картинок Уникальное описание, которое будет сохранено как имя файла. Вы можете использовать естественный язык, разделяя слова пробелами. Пожалуйста, не указывайте расширение файла. Пожалуйста, подробно опишите загружаемый файл: где он был снят? что на нём изображено? каков его контекст? Пожалуйста опишите изображённых персон или объекты. Добавьте информацию, о которой нельзя легко догадаться, например, время суток, когда снимался файл. Если снято что-то необычное, постарайтесь пояснить, что именно в этом необычного. + Это изображение слишком темное. Вы уверены, что хотите его загрузить? Викисклад подходит только для фотографий, имеющих энциклопедическую ценность. + Это изображение размыто. Вы уверены, что хотите его загрузить? Викисклад подходит только для фотографий, имеющих энциклопедическую ценность. Дать разрешение Использовать внешнее хранилище Сохранять изображения, сделанные с помощью встроенной камеры на устройстве + Войдите в свою учётную запись Выслать лог-файл Выслать лог-файл разработчикам по е-мейлу - Войдите в свою учётную запись Местоположение не изменено. Местоположение недоступно. Необходимо разрешение для отображения списка мест поблизости diff --git a/app/src/main/res/values-sd/strings.xml b/app/src/main/res/values-sd/strings.xml index c42a38464..358ab2efa 100644 --- a/app/src/main/res/values-sd/strings.xml +++ b/app/src/main/res/values-sd/strings.xml @@ -176,9 +176,9 @@ اجازت ڏيو ٻاھري سنڀار استعمال ڪريو ايپ ۾ ڪئمرا سان ڪڍيل تصويرون پنھنجي ڊوائيس تي سانڍيو + پنھنجي کاتي ۾ داخل ٿيو لاگ فائيل موڪليو لاگ فائيل سرجڻھارن کي برقٽپال ذريعي موڪليو - پنھنجي کاتي ۾ داخل ٿيو مڪانيت تبديلي ناھي ٿي. مڪانيت موجود ناھي. ويجھين جڳھن جي فھرست ڏيکارڻ لاءِ اجازت گھربل آھي diff --git a/app/src/main/res/values-skr/strings.xml b/app/src/main/res/values-skr/strings.xml index f83eebb4a..02c944f5b 100644 --- a/app/src/main/res/values-skr/strings.xml +++ b/app/src/main/res/values-skr/strings.xml @@ -106,6 +106,6 @@ ٹیٹوریل وکی ڈیٹا آئٹم اجازت ݙیوو - لاگ فائل بھیجو آپݨے کھاتے وچ لاگ ان تھیوو + لاگ فائل بھیجو diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index cb3ba3419..0701e6211 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -54,12 +54,12 @@ GPS је онемогућен на Вашем уређају. Желите ли га омогућити? Омогући GPS Још увек нема отпремања - + \@string/contributions_subtitle_zero %1$d отпремање %1$d отпремања - + Започни %1$d отпремање Започни %1$d отпремања @@ -74,7 +74,7 @@ Отвори налог О апликацији Софтвер отвореног кода доступан под лиценцом <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache вер. 2</a> Викимедијина Остава и њен лого су заштитни знаци Викимедијине Фондације и користе се са дозволом Викимедијине Фондацине. Ми не одобравамо или подржавмо Викимедијину Фондацију.\n\nАпликација за Викимедијину оставу је апликација отвореног кода која је направљена и која се одржава помоћу грантова и волонтера Викимедијине заједнице. Задужбина Викимедија није укључена у стварање, развој или одржавање апликације. - <a href=\"https://github.com/commons-app/apps-android-commons\">Изворни кôд</a> и <a href=\"https://commons-app.github.io/\">веб-сајт</a> на GitHub-у. Направите нови <a href=\"https://github.com/commons-app/apps-android-commons/issues\">захтев на GitHub-у</a> да бисте пријавили грешке или дали предлоге. + Направите нови <a href=\"https://github.com/commons-app/apps-android-commons/issues\">захтев на GitHub-у</a> да бисте пријавили грешке или дали предлоге. <a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\">Политика приватности</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Заслуге</a> О апликацији @@ -164,6 +164,9 @@ Двофакторска аутентификација тренутно није подржана. Заиста желите да се одјавите? Лого Оставе + Веб-сајт Оставе + Фејсбук страница Оставе + Изворни код на Github-у Позадинска слика Медијска слика неуспешна Нисам пронашла слику @@ -199,12 +202,14 @@ Давање дозволе Употреба спољашње меморије Спремање слика направљених камером апликације на Вашем уређају + Пријавите се на Ваш налог Пошаљи дневничку датотеку Пошаљи дневничку датотеку девелоперима преко имејла - Пријавите се на Ваш налог Локација није промењена. Локација није доступна. Потребна је дозвола за приказивање листе локација у близини Добити упутства Прочитај чланак + Хвала Вам за прављење измене + Пребаци приказ diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index 042cae3fc..4d766c0b8 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -198,7 +198,7 @@ Béré idin Paké panyimpenan éksternal Simpen gambar nu nyomotna ku aplikasi kaména na parangkat anjeun + Asup log kana akun anjeun Kirim berkas log Kirim berkas log ka pamekar liwat surélék - Asup log kana akun anjeun diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index a0450280b..385e1e04d 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -202,9 +202,9 @@ Ge behörighet Använd extern lagring Spara bilder som tas med kameran i appen på din enhet + Logga in på ditt konto Skicka loggfil Skicka loggfilen till utvecklarna via e-post - Logga in på ditt konto Platsen har inte ändrats. Platsen är inte tillgänglig. Behörighet krävs för att visa en lista över platser i närheten diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index f5df91381..d9559d67a 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -199,9 +199,9 @@ İzin ver Harici depolamayı kullanın Uygulama kamerası kullanıldığında çekilen fotoğrafları cihazına kaydedin + Hesabınızda oturum açın Kayıt dosyasını gönder Kayıt dosyasını, e-posta aracılığıyla geliştiricilere gönderin - Hesabınızda oturum açın Konum değiştirilmedi Konum kullanılamıyor. Yakındaki yerler listesini görüntülemek için izin vermeniz gerekiyor diff --git a/app/src/main/res/values-ug/strings.xml b/app/src/main/res/values-ug/strings.xml index b0f0333db..2156ceab2 100644 --- a/app/src/main/res/values-ug/strings.xml +++ b/app/src/main/res/values-ug/strings.xml @@ -1,6 +1,6 @@ - ۋىكى ۋاستە ھەمبەھىر + بايلىق ھەمبەھىرلەش تەڭشەكلەر ئىشلەتكۇچى ئىسمى پارول @@ -20,7 +20,7 @@ %1$s يۈكلەش تاماملىنىۋاتىدۇ يۈكلىنىۋاتىدۇ %1$s مەغلۇپ بولدى چېكىپ كۆرۈش - يۈكلىگەنلىرىم + يىقىندا يوللىغىنىم ئادەم كىردى مەغلۇپ بولدى %1$d%% تاماملاندى @@ -54,8 +54,8 @@ ۋاز كەچ چۈشۈرۈڭ ئىجازەتنامە - CC Attribution-ShareAlike 3.0 - CC Attribution 3.0 + ئوخشاش ئىمزالىق ئورتاق ھەمبەھىرلىنىش + ئىمزا قويۇش CC0 CC BY-SA 3.0 CC BY-SA 3.0 (ئاۋستىرىيە) @@ -70,9 +70,11 @@ CC0 ھەئە! تۈرلەر - يۈكلەۋاتىدۇ… + يۈكلىنۋاتىدۇ… تاللانمىغان چۈشەندۈرۈلۈشى يوق + نامەلۇم ئىجازەت كېلىشىمى + تولۇق يېڭىلاش جەزملەش ئاگاھلاندۇرۇش ھەئە diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 809bfc84b..28558315b 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -210,9 +210,9 @@ Надати дозвіл Використовувати зовнішнє сховище Зберігати зображення, виконані вбудованою камерою Вашого пристрою + Увійдіть у свій обліковий запис Надіслати лог-файл Надіслати лог-файл розробникам електронною поштою - Увійдіть у свій обліковий запис Розташування не змінено Місцезнаходження недоступне Потрібний дозвіл для показу списку місць поблизу diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index fa6265e52..794dd3b10 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -199,12 +199,14 @@ 在快取圖片時發生錯誤 用於本檔案的唯一描述性標題。您可以使用帶有空格的簡明語言,另外請不要包含副檔名。 請盡可能說明媒體內容:拍攝於何處?是顯示什麼事物?有什麼脈絡?請描述對象或人物。透露出一些較不易猜測的訊息,例如是風景的話,可以是一天裡的時間。如果媒體顯示出一些不正常的事物,請說明出造成不正常原因。 + 此圖片太暗,您確定您要上傳它嗎?維基共享資源僅適用對於百科全書有價值的圖片。 + 此圖片太模糊,您確定您要上傳它嗎?維基共享資源僅適用對於百科全書有價值的圖片。 給予權限 使用外部存儲裝置 在您的裝置上使用照相機應用程式來儲存照片 + 登入您的帳號 寄送日誌檔案 經由電子郵件寄送日誌檔案給開發人員 - 登入您的帳號 位置無法更改。 位置無效。 需權限來顯示附近地點清單 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 201f93f42..2a6fc6f5d 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -199,12 +199,14 @@ 缓存图片时出错 用于文件的唯一描述性标题,它将作为文件名使用。您可以使用有空格的简明语言。请不要包含文件扩展名 请尽可能详细地描述媒体:拍摄在何地?显示什么?例文是什么?请描述对象或个人。透露一些不易猜想到的信息,例如这幅风景画的具体日期时间。如果媒体显示了一些不寻常的事物,请说明为什么它显得不寻常。 + 此图片太暗,您确定要上传它么?维基共享资源只接受对百科全书有价值的图片。 + 此图片模糊不清,您确定要上传它么?维基共享资源只接受对百科全书有价值的图片。 提供权限 使用外部存储 在您的设备上,使用应用中的照相机保存照片 + 登录您的账户 发送日志文件 通过电子邮件将日志文件发送给开发人员 - 登录您的账户 位置没有更新。 位置不可用。 需要权限以显示附近地点列表 From f47c3989e670e8502a6d03a1ebfa00e5ef6bb3e3 Mon Sep 17 00:00:00 2001 From: Ujjwal Agrawal Date: Mon, 19 Feb 2018 20:05:22 +0530 Subject: [PATCH 08/18] Update PULL_REQUEST_TEMPLATE.md --- PULL_REQUEST_TEMPLATE.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index 9e7714035..afd20f763 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,8 @@ ## Description Fixes #{Issue Number} + +Describe the changes made and why they were made. ## For user interface changes: Screenshots showing what changed From 80134ed13b623f4bde86a927a1c86b5e1a30c3ab Mon Sep 17 00:00:00 2001 From: Josephine Lim Date: Tue, 20 Feb 2018 01:48:08 +1000 Subject: [PATCH 09/18] Add newline before second section --- PULL_REQUEST_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index afd20f763..3fada65f9 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -3,6 +3,7 @@ Fixes #{Issue Number} Describe the changes made and why they were made. + ## For user interface changes: Screenshots showing what changed From 22b10d1c4743d4fd0eb82b0e37a9222b14d820a3 Mon Sep 17 00:00:00 2001 From: Nicolas Raoul Date: Tue, 20 Feb 2018 17:25:51 +0900 Subject: [PATCH 10/18] Minor changes, link about how to take a screenshot I haven't found a good page yet about taking screencasts --- PULL_REQUEST_TEMPLATE.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index 3fada65f9..f58c9225b 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -1,9 +1,9 @@ ## Description -Fixes #{Issue Number} +Fixes #{GitHub issue number} -Describe the changes made and why they were made. +{Describe the changes made and why they were made.} -## For user interface changes: Screenshots showing what changed +## Screenshots showing what changed - +{Only for user interface changes, otherwise remove this section. See [how to take a screenshot](https://android.stackexchange.com/questions/1759/how-to-take-a-screenshot-with-an-android-device)} From 45aab1ce76282d62d016b3392eb59bcad0a9c6cb Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 22 Feb 2018 12:06:27 +0100 Subject: [PATCH 11/18] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-diq/strings.xml | 24 +++--- app/src/main/res/values-es/strings.xml | 2 + app/src/main/res/values-fr/strings.xml | 2 + app/src/main/res/values-is/strings.xml | 13 ++-- app/src/main/res/values-ja/strings.xml | 3 + app/src/main/res/values-mr/strings.xml | 89 +++++++++++++++++++++- app/src/main/res/values-nb/strings.xml | 9 ++- app/src/main/res/values-pt-rBR/strings.xml | 2 + app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-sv/strings.xml | 2 + app/src/main/res/values-uk/strings.xml | 2 + app/src/main/res/values-yue/error.xml | 6 ++ 12 files changed, 134 insertions(+), 22 deletions(-) create mode 100644 app/src/main/res/values-yue/error.xml diff --git a/app/src/main/res/values-diq/strings.xml b/app/src/main/res/values-diq/strings.xml index 8ab93b5ed..1dec79926 100644 --- a/app/src/main/res/values-diq/strings.xml +++ b/app/src/main/res/values-diq/strings.xml @@ -7,7 +7,7 @@ Cı kewe Qeyd be Cıkewtış - Tay bıpawe + Kerem kerên, bıpawên... Cıkewtış hewl bi. Nidekeweya de Dosya nêvineya. Dosyê da bine bıcerebnê. @@ -20,9 +20,9 @@ Barkerdışe %1$s qedya %1$s bar nêbeno. pıpawane xo bıvin - - 1 dosye selagnayış - %1$d dosye Selagnayışi + + 1 dosya bar bena + %1$d dosyeyi bar benê Barkerdışê mınê peyêni Ratneya @@ -49,18 +49,18 @@ Bar ke Kategoriyan dı cı geyr Star ke - - Theba bar nêbı - 1 bar kerdış - %1$d bar kerdışi + + \@string/contributions_subtitle_zero + Yew barbiyayış + %1$d barbiyayışi Sergendış 1 bar kerdış Sergendış %1$d bar kerdışi - - 1 bar kerdış - %1$d bar kerdışi + + %1$d barkerdış + %1$d barkerdışi Kategoriyan de %1$s deye theba çıniyo Kategori cı kerdışi rê nusnayış bıkeré. Ena gamer ravêrdışi rê mesaci bıpıloğnê yana peyd şırê. @@ -69,7 +69,7 @@ Qeyd be Heq te cı <a href=\"https://github.com/commons-app/apps-android-commons\">Çıme</a> u <a href=\"https://commons-app.github.io/\">website</a> on GitHub</a>. Newe vıraz <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub mewzu </a> U rapor bıweseynê - / + <a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\">Politikay nımıtışi</a> Heq te cı Peyd rışten bırış (E-posta ra) E-posta eyar nêbi diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 7067f5f9b..40b807084 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -199,6 +199,8 @@ Error al almacenar imágenes en la antememoria Un título único descriptivo para el archivo, que servirá como un nombre de archivo. Puede usar un lenguaje claro con espacios. No incluya la extensión del archivo. Por favor, describa el elemento multimedia tanto como sea posible: ¿dónde fue tomado?, ¿qué muestra?, ¿cuál es el contexto? Por favor, describa los objetos o personas. Ofrezca la información que no puede ser inferida tan fácilmente, por ejemplo el momento del día si es un paisaje. Si el medio muestra algo inusual, explique qué lo hace insual. + Esta imagen es demasiado oscura. ¿Confirmas que quieres cargarla? Wikimedia Commons solo acepta imágenes con valor enciclopédico. + Esta imagen se ve borrosa. ¿Confirmas que quieres cargarla? Wikimedia Commons solo acepta imágenes con valor enciclopédico. Otorgar permiso Utilizar almacenamiento externo Guardar en el dispositivo imágenes capturadas con la cámara de la aplicación diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 860cb6e2c..745d8811e 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -199,6 +199,8 @@ Erreur en mettant les images en cache Un titre descriptif unique pour le fichier, qui servira de nom de fichier. Vous pouvez utiliser un langage simple avec des espaces. N’incluez pas l’extension du fichier 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 l’heure de la journée si c’est un paysage. Si le média montre quelque chose d’inhabituel, veuillez expliquer ce qui le rend exceptionnel. + Cette image est trop sombre, êtes-vous sûr de vouloir la télécharger ? Wikimédia Communs n’est que pour les images avec une valeur encyclopédique. + Cette image est floue, êtes-vous sûr de vouloir la télécharger ? Wikimédia Communs n’est que pour les images ayant une valeur encyclopédique. Accorder le droit Utiliser le stockage externe Enregistrer les images prises avec l’appareil photo de votre appareil diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 0b0bf3b5a..b6358b88e 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -54,16 +54,16 @@ GPS er óvirkt í tækinu þínu. Viltu virkja það? Virkja GPS Engar innsendingar ennþá - + \@string/contributions_subtitle_zero %1$d innsending %1$d innsendingar - + Byrja %1$d innsendingu Byrja %1$d innsendingar - + %1$d innsending %1$d innsendingar @@ -199,6 +199,8 @@ Villa kom upp í skyndiminni mynda Einstakur og lýsandi titill, sem mun verða skráarheiti. Þú mátt nota einfaldan texta með bilum. Ekki hafa með neina skráarendingu Lýstu gögnunum eins vel og auðið er: Hvar er myndin tekin? Hvað sýnir hún? Hvert er samhengið? Lýstu fólki og fyrirbærum. Gefðu upp þær upplýsingar sem ekki er auðvelt að giska á, til dæmis á hvaða tíma dags myndin er tekin ef hún sýnir landslag. Ef gögnin sýna eitthvað óvenjulegt, útskýrðu þá hvað það er sem sé sérstakt. + Þessi mynd er of dökk, ertu viss um að þú viljir senda hana inn? Wikimedia Commons er aðeins fyrir myndir sem hafa eitthvað fræðslugildi. + Þessi mynd er ekki skörp, ertu viss um að þú viljir senda hana inn? Wikimedia Commons er aðeins fyrir myndir sem hafa eitthvað fræðslugildi. Gefa heimild Nota ytri gagnageymslu Vistaðu myndir sem teknar hafa verið með innbyggðu myndavélinni í tækinu þínu @@ -210,8 +212,9 @@ Heimild þarf til að birta lista yfir staði í nágrenninu FÁ LEIÐSÖGN LESA GREIN - Velkomin á Wikimedia Commons, %1$s! Við erum ánægð með að þú skulir vera hérna. + Velkomin á Wikimedia Commons, %1$s! Við erum ánægð með að þú skulir vera hérna. %1$s skildi eftir skilaboð á spjallsíðunni þinni Takk fyrir að hafa gert breytingar - %1$s minntist á þig á %2$s. + %1$s minntist á þig á %2$s. + Víxla sýn diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index aa2a840d4..3f48c3c98 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -41,6 +41,7 @@ ログインできません - パスワードを確認してください 失敗した回数が多すぎます。数分でもう一度お試しください。 申し訳ありませんが、この利用者はコモンズでブロックされています。 + 2 要素認証コードを提供する必要があります。 ログイン失敗 アップロード このセットに名前をつけてください @@ -150,8 +151,10 @@ Google Playのベータ版チャンネルにオプトインして、新機能やバグ修正プログラムに早期にアクセス ウィキデータを使用してください (警告:これを無効にすると、モバイルデータを大量に消費する可能性があります) + 2FA コード 最近のアップロードファイルに表示する最大件数 最大限 + 500 以上の項目を表示できません 最近のアップロードファイルに表示する最大件数 2段階認証は現在サポートされていません。 ログアウトしてもよろしいですか? diff --git a/app/src/main/res/values-mr/strings.xml b/app/src/main/res/values-mr/strings.xml index 1119d2b46..83d826c0f 100644 --- a/app/src/main/res/values-mr/strings.xml +++ b/app/src/main/res/values-mr/strings.xml @@ -73,17 +73,29 @@ मांडण्या नोंदणी करा आमच्याबद्दल + विकीमिडीया कॉमन्स अॅप हे एक मुक्तस्त्रोत अॅप असून ते विकीमिडीया समुदायातील स्वयंसेवकांनी आणि अनुदानित सदस्यांकडून निर्माण आणि सांभाळले जाते. विकीमिडीया फ़ांउंडेशनचा ह्या अॅपच्या निर्मिती,सांभाळामध्ये सहभाग नाही. + नव्याने तयार करा <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub issue</a> त्रुटी अहवालांसाठी आणि सुचनांसाठी. + <a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\">Privacy policy</a> + <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Credits</a> च्या विषयी प्रतिसाद पाठवा (विपत्राद्वारे) + कोणतेही ईमेल क्लायंट स्थापित नाहीत अलीकडे वापरलेले वर्ग + प्रथम संकालनाची प्रतीक्षा करीत आहे ... आपण अद्याप काहीच चित्रे अपभारीत केली नाहीत. पुन्हा प्रयत्न करा रद्द करा ही संचिका %1$s या परवान्यांतर्गत राहील + हे चित्र इथे चढवत असताना, मी हे घोषीत करतो की हे माझेच काम आहे आणि ह्या कामावर इतर कुणाचाही प्रताधिकार नाही तसेच हे सेल्फ़ी नाहीये, म्हणून हे काम ह्या संकेतांचे पालन करेल <a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\">Wikimedia Commons policies</a>. अधिभारण करा परवाना मागील शीर्षक/वर्णन वापरा आपोआप सध्याचे स्थान मिळवा + जर छायाचित्राला जिओटॅग नसल्यास तुम्ही तुमच्या स्थानाची निश्चिती करा जेणे करुन संबंधीत वर्ग सुचवले जातील + रात्रीच्या वेळेच्या व्यवस्था + गडद त्वचा वापरा + Attribution-ShareAlike 3.0 + Attribution 3.0 Attribution-ShareAlike 3.0 Attribution 3.0 CC0 @@ -109,7 +121,7 @@ कृपया अपभारण करू \'\'\'नका\'\'\': -आपल्या किंवा मित्रांच्या सेल्फी\n-आपण आंतरजाल (इंटरनेट) वरुन अधिभारण केलेली चित्रे\n-प्रोप्रायटरी अॅप्सचे स्क्रिनशॉट उदाहरणादाखल अपभारण: - - शीर्षक: Sydney Opera House\n- वर्णन: Sydney Opera House as viewed from across the bay\n- वर्ग: Sydney Opera House, Sydney Opera House from the west, Sydney Opera House remote views + - शीर्षक: Sydney Opera House\n- वर्णन: Sydney Opera House as viewed from across the bay\n- वर्ग: Sydney Opera House, Sydney Opera House from the west, Sydney Opera House remote views आपली चित्रे जोडा. विकिपीडियावरील लेखात जीवंतपणा आणा! विकिपीडियावरची चित्रे विकिमिडिया कॉमन्सवरुन येतात. जगातल्या अनेक लोकांना आपल्या चित्राद्वारे शिकता येते. @@ -123,11 +135,86 @@ अनोळखी परवाना ताजेतवाने करा परवानगी आवश्यक:बाह्य भंडारण वाचन. याशिवाय अॅप काम करू शकत नाही. + परवानगी आवश्यक:बाह्य भंडारण वाचन. याशिवाय अॅप काम करू शकत नाही. ऐच्छिक परवानगी:वर्ग सुचवण्यांसाठी सध्याचे स्थान मिळवा ठीक आहे जवळपासची स्थाने + आसपास काहीही सापडले नाही इशारा ही संचिका पूर्वीच कॉमन्सवर उपलब्ध आहे. आपणास पुढे जायचे याची निश्चिती करता काय? होय नाही + शीर्षक + माध्यमाचे शिर्षक + वर्णन + माध्यमाची माहिती इथे दिली आहे. ती बरीच मोठी असू शकते, तरीही आम्हांला वाटते ती आपल्या उपयोगाची असावी. + चढवल्याची तारिख + परवाना + अक्षांश-रेखांश + दिलेले नाही + बिटा आवृत्तीचे तपासक बना + गुगल प्ले वरील आमच्या बिटा चॅनलचा पाठलाग करा आणि आमच्या नव्या सेवा-सुविधांचा तसाच त्रुटी-निरसनांचा फ़ायदा घ्या. + विकीडाटा वापरा + (ताकीद: हे बंद केल्यामुळे तुम्हांला मोठ्याप्रमाणात डेटा खर्च करावा लागेल) + 2FA कोड + माझ्या अलिकडच्या अपभरणाची मर्यादा + जास्तीची मर्यादा + ५०० पेक्षा जास्त दाखवण्यास असमर्थ + माझ्या अलिकडच्या अपभरणाची मर्यादा + दोन पायऱ्यांची वैधता तपासणी सध्या उपलब्ध नाही. + काय आपणास खरेच बंद करायचे आहे? + कॉमन्सचे चिन्ह + कॉमन्सचे संकेतस्थळ + कॉमन्सचे फ़ेसबुक पान + कॉमन्सचे गिटहब स्त्रोत कोड + पार्श्वभूमी चित्र + चित्र माध्यमे कोसळली + कोणतेही चित्र सापडले नाही + चित्र अपभारीत करा + जाओ जान पर्वत + लामा + रेनबो पूल + टुलिप + सेल्फ़ी चालणार नाहीत + मालकी हक्क प्रतिमा + विकीपिडीयात स्वागत आहे + प्रताधिकार स्वागत आहे + सिडनीचे ओपेरा हाऊस + रद्द करा + उघडा + बंद करा + मुख्य + अपभारण करा + जवळपास + आमच्याबद्दल + सेटिंग्स + प्रतिक्रिया + बाहेर पडा + माहिती पुस्तिका + अधिसूचना + लोकेशन सेवा वापराची परवानगी दिल्याशिवाय जवळपासची ठिकाणे दाखवली जाउ शकत नाहीत. + कोणतीही माहिती सापडली नाही + कॉमन्स फ़ाईलचे पान + विकिबेस कलम + चित्र दाखवताना त्रुटी आढळली + फ़ाईलला असे नाव द्या जे सुयोग्य असेल,चित्राविषयी त्यामधून माहिती कळेल अशी साधी भाषा वापरा,नावामध्ये फ़ाईलचे एक्सटेन्शन लिहू नका. + माध्यमांची शक्य तितकी जास्त माहिती द्या:छायाचित्र/चलचित्र/ध्वनिमुद्रण कोठे घेतले आहे? त्यात काय दाखवले आहे? त्या माध्यमांचा संदर्भ काय? त्यातील वस्तू,व्यक्ति व इतर माहिती द्या? अशी सगळी माहिती जी त्या माध्यमाकडे पाहून लक्षात येणार नाही पण ती महत्वाचे आहे ती सर्व पुरवा. जर त्या माध्यमामध्ये काहीही वेगळे दिसत असेल तर ते वेगळे का आहे याची माहिती पुरवा. + हे छायाचित्र खुप अंधारलेले आहे, तुम्ही खरच हे छायाचित्र येथे चढवू इच्छीता का? विकीमिडीया कॉमन्सवर नेहमी विश्वकोषात महत्त्वाची असलेलीच चित्रे चढवली जाऊ शकतात. + हे छायाचित्र खुप फ़िकट आलेले आहे, तुम्ही खरच हे छायाचित्र येथे चढवू इच्छीता का? विकीमिडीया कॉमन्सवर नेहमी विश्वकोषात महत्त्वाची असलेलीच चित्रे चढवली जाऊ शकतात. + परवानगी द्या + बाहेरील स्टोरेज वापरा + आपल्या डिव्हाइसवरील इन-अॅप्स कॅमेर्यासह घेतलेली चित्रे जतन करा + तुमच्या खात्यावरुन सनोंद प्रवेश करा + लॉग फ़ाईल पाठवा + विकसकांना लॉग फ़ाईल विपत्राने पाठवा + लोकेशन बदलली नाहीये. + ही लोकेशन उपलब्ध नाही + जवळपासच्या ठिकाणांची यादी दाखवण्यासाठी आपली परवानगी आवश्यक आहे + दिशानिर्देश मिळवा + लेख वाचा + विकीमिडीया कॉमन्समध्ये आपले स्वागत आहे,%1$s! आम्हांला आनंद आहे आपण इथे आलात. + %1$s यांनी तुमच्या चर्चापानावर संदेश टाकला + तुमच्या संपादनासाठी तुमचे आभार ! + %1$s यांनी तुमचा उल्लेख %2$s येथे केला. + टॉगल दृश्य diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index be8fce740..ef23af5b6 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -20,7 +20,7 @@ Avslutter opplasting av %1$s Opplastingen av %1$s feilet Trykk for å vise - + %1$d fil lastes opp %1$d filer lastes opp @@ -54,7 +54,7 @@ GPS er slått av på denne enheten. Ønsker du å slå den på? Slå på GPS Ingen opplastinger ennå - + \@string/contributions_subtitle_zero %1$d opplasting %1$d opplastinger @@ -63,7 +63,7 @@ Starter %1$d opplasting Starter %1$d opplastinger - + %1$d opplasting %1$d opplastinger @@ -199,6 +199,8 @@ Feil under mellomlagring av bilder En unik beskrivende tittel for fila, som vil fungere som filnavn. Du kan bruke vanlig språk med mellomrom. Ikke ta med filendelsen Beskriv bidraget så mye som mulig: Hvor ble det tatt? Hva viser det? Hva er konteksten? Beskriv objektene eller personene. Gi informasjon som ikke kan gjettes lett, for eksempel når på dagen bildet ble tatt om det er et landskapsbilde. Om bildet viser noe uvanlig, forklar hva som gjør det uvanlig. + Dette bildet er for mørkt, er du sikker på at du ønsker å laste det opp? Wikimedia Commons er kun for bilder med ensyklopedisk verdi. + Dette bildet er uklart, er du sikker på at du ønsker å laste det opp? Wikimedia Commons er bare for bilder med ensyklopedisk verdi. Gi tillatelse Bruk ekstern lagring Lagre bilder som er tatt med kameraet i appen på enheten din @@ -214,4 +216,5 @@ %1$s la igjen en beskjed på diskusjonssiden din Takk for at du har gjort en redigering %1$s nevnte deg på %2$s. + Skift visning diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 98bb346aa..b08520060 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -199,6 +199,8 @@ Erro durante o cache de imagens 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 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. + Esta foto está muito escura, você tem certeza de que deseja enviá-la? O Wikimedia Commons é apenas para imagens com valor enciclopédico. + Esta foto está embaçada, tem certeza de que deseja enviá-la? O Wikimedia Commons é apenas para imagens com valor enciclopédico. Dar permissão Usar o armazenamento externo Salvar as fotos tiradas com a câmera no aplicativo no seu dispositivo diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 1c3fbcb46..c47473dbc 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -203,7 +203,7 @@ Ошибка при кэшировании картинок Уникальное описание, которое будет сохранено как имя файла. Вы можете использовать естественный язык, разделяя слова пробелами. Пожалуйста, не указывайте расширение файла. Пожалуйста, подробно опишите загружаемый файл: где он был снят? что на нём изображено? каков его контекст? Пожалуйста опишите изображённых персон или объекты. Добавьте информацию, о которой нельзя легко догадаться, например, время суток, когда снимался файл. Если снято что-то необычное, постарайтесь пояснить, что именно в этом необычного. - Это изображение слишком темное. Вы уверены, что хотите его загрузить? Викисклад подходит только для фотографий, имеющих энциклопедическую ценность. + Это изображение слишком тёмное. Вы уверены, что хотите его загрузить? Викисклад подходит только для фотографий, имеющих энциклопедическую ценность. Это изображение размыто. Вы уверены, что хотите его загрузить? Викисклад подходит только для фотографий, имеющих энциклопедическую ценность. Дать разрешение Использовать внешнее хранилище diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 385e1e04d..caea75ee5 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -199,6 +199,8 @@ Fel uppstod när bilder cachelagras 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 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. + 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. + 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. Ge behörighet Använd extern lagring Spara bilder som tas med kameran i appen på din enhet diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 28558315b..adc4fc75f 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -207,6 +207,8 @@ Помилка кешування зображень Унікальна описова назва файлу. Ви можете використовувати простий текст з пробілами. Не вказуйте розширення файлу Будь ласка, докладно опишіть файл: де його було зроблено? що на ньому зображено? який контекст? Будь ласка, опишіть об\'єкти чи осіб. Додайте інформацію, яку не можна легко здогадатися, наприклад, пору доби для фотографії пейзажу. Якщо зображено щось незвичайне, постарайтеся пояснити, що робить його незвичайним. + Це зображення надто темне. Ви упевнені, що хочете його завантажити? Вікісховище призначене лише для зображень, що мають енциклопедичну цінність. + Це зображення розмите. Ви упевнені, що хочете його завантажити? Вікісховище призначене лише для зображень, що мають енциклопедичну цінність. Надати дозвіл Використовувати зовнішнє сховище Зберігати зображення, виконані вбудованою камерою Вашого пристрою diff --git a/app/src/main/res/values-yue/error.xml b/app/src/main/res/values-yue/error.xml new file mode 100644 index 000000000..081685201 --- /dev/null +++ b/app/src/main/res/values-yue/error.xml @@ -0,0 +1,6 @@ + + + 同享壞咗 + 哎呀。出咗錯! + 多謝你! + From 9aceaca95dbf0f47a79fd2a843a302dd1110a12f Mon Sep 17 00:00:00 2001 From: Meghna Gupta Date: Sat, 24 Feb 2018 00:00:45 +0530 Subject: [PATCH 12/18] Hide Keypad when EditText out of focus (#1168) * Hide Keypad when EditText out of focus --- .../free/nrw/commons/auth/LoginActivity.java | 22 ++++++++ .../category/CategorizationFragment.java | 45 ++++++++++++++++ .../upload/MultipleUploadListFragment.java | 14 +++++ app/src/main/res/layout/activity_login.xml | 18 ++++--- .../res/layout/fragment_categorization.xml | 53 +++++++++---------- .../layout/fragment_multiple_uploads_list.xml | 3 ++ 6 files changed, 120 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java index 3e90fbf5e..b771e8c1d 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java @@ -4,6 +4,7 @@ import android.accounts.Account; import android.accounts.AccountAuthenticatorActivity; import android.accounts.AccountAuthenticatorResponse; import android.accounts.AccountManager; +import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.content.SharedPreferences; @@ -17,10 +18,12 @@ import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatDelegate; import android.text.Editable; import android.text.TextWatcher; +import android.util.Log; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.view.inputmethod.InputMethodManager; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; @@ -91,7 +94,19 @@ public class LoginActivity extends AccountAuthenticatorActivity { ButterKnife.bind(this); usernameEdit.addTextChangedListener(textWatcher); + usernameEdit.setOnFocusChangeListener((v, hasFocus) -> { + if (!hasFocus) { + hideKeyboard(v); + } + }); + passwordEdit.addTextChangedListener(textWatcher); + passwordEdit.setOnFocusChangeListener((v, hasFocus) -> { + if (!hasFocus) { + hideKeyboard(v); + } + }); + twoFactorEdit.addTextChangedListener(textWatcher); passwordEdit.setOnEditorActionListener(newLoginInputActionListener()); @@ -99,6 +114,13 @@ public class LoginActivity extends AccountAuthenticatorActivity { signupButton.setOnClickListener(view -> signUp()); } + + public void hideKeyboard(View view) { + InputMethodManager inputMethodManager =(InputMethodManager)this.getSystemService(Activity.INPUT_METHOD_SERVICE); + inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + + @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java b/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java index 7c2e910c4..c826013f0 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategorizationFragment.java @@ -1,17 +1,22 @@ package fr.free.nrw.commons.category; +import android.app.Activity; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.text.Editable; import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.TextView; @@ -37,6 +42,7 @@ import fr.free.nrw.commons.R; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; import fr.free.nrw.commons.mwapi.MediaWikiApi; import fr.free.nrw.commons.upload.MwVolleyApi; +import fr.free.nrw.commons.upload.SingleUploadFragment; import fr.free.nrw.commons.utils.StringSortingUtils; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -72,6 +78,7 @@ public class CategorizationFragment extends CommonsDaggerSupportFragment { private OnCategoriesSaveHandler onCategoriesSaveHandler; private HashMap> categoriesCache; private List selectedCategories = new ArrayList<>(); + private TitleTextWatcher textWatcher = new TitleTextWatcher(); private final CategoriesAdapterFactory adapterFactory = new CategoriesAdapterFactory(item -> { if (item.isSelected()) { @@ -102,6 +109,15 @@ public class CategorizationFragment extends CommonsDaggerSupportFragment { categoriesAdapter = adapterFactory.create(items); categoriesList.setAdapter(categoriesAdapter); + + categoriesFilter.addTextChangedListener(textWatcher); + + categoriesFilter.setOnFocusChangeListener((v, hasFocus) -> { + if (!hasFocus) { + hideKeyboard(v); + } + }); + RxTextView.textChanges(categoriesFilter) .takeUntil(RxView.detaches(categoriesFilter)) .debounce(500, TimeUnit.MILLISECONDS) @@ -110,6 +126,18 @@ public class CategorizationFragment extends CommonsDaggerSupportFragment { return rootView; } + public void hideKeyboard(View view) { + InputMethodManager inputMethodManager =(InputMethodManager)getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE); + inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + + @Override + public void onDestroyView() { + categoriesFilter.removeTextChangedListener(textWatcher); + super.onDestroyView(); + } + + @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.clear(); @@ -351,4 +379,21 @@ public class CategorizationFragment extends CommonsDaggerSupportFragment { .create() .show(); } + + private class TitleTextWatcher implements TextWatcher { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { + } + + @Override + public void afterTextChanged(Editable editable) { + if (getActivity() != null) { + getActivity().invalidateOptionsMenu(); + } + } + } } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java index 0b6e527e5..5b39b92f7 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/MultipleUploadListFragment.java @@ -1,5 +1,6 @@ package fr.free.nrw.commons.upload; +import android.app.Activity; import android.content.Context; import android.graphics.Point; import android.net.Uri; @@ -10,6 +11,7 @@ import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.util.DisplayMetrics; +import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -177,9 +179,21 @@ public class MultipleUploadListFragment extends Fragment { photosGrid.setColumnWidth(photoSize.x); baseTitle.addTextChangedListener(textWatcher); + + baseTitle.setOnFocusChangeListener((v, hasFocus) -> { + if (!hasFocus) { + hideKeyboard(v); + } + }); + return view; } + public void hideKeyboard(View view) { + InputMethodManager inputMethodManager =(InputMethodManager)getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE); + inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + @Override public void onDestroyView() { baseTitle.removeTextChangedListener(textWatcher); diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 278e3464f..15d4c099d 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -19,12 +19,16 @@ android:layout_marginRight="@dimen/standard_gap" android:layout_marginStart="@dimen/standard_gap" android:layout_marginTop="@dimen/large_gap" + android:clickable="true" + android:focusableInTouchMode="true" app:cardCornerRadius="4dp" app:cardElevation="4dp"> @@ -149,8 +153,8 @@