Merge remote-tracking branch 'refs/remotes/commons-app/master'

This commit is contained in:
misaochan 2017-06-30 02:28:51 +10:00
commit 3a70ebbd6f
56 changed files with 765 additions and 286 deletions

View file

@ -1,20 +1,20 @@
package fr.free.nrw.commons;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import android.support.test.espresso.assertion.ViewAssertions;
import android.support.test.filters.LargeTest;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import fr.free.nrw.commons.nearby.NearbyActivity;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import fr.free.nrw.commons.nearby.NearbyActivity;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
@LargeTest
@RunWith(AndroidJUnit4.class)
public class NearbyActivityTest {
@ -24,6 +24,7 @@ public class NearbyActivityTest {
@Test
public void testActivityLaunch() {
onView(withText("Nearby Places")).check(ViewAssertions.matches(isDisplayed()));
onView(withText(R.string.title_activity_nearby))
.check(ViewAssertions.matches(isDisplayed()));
}
}

View file

@ -125,6 +125,16 @@
android:resource="@xml/modifications_sync_adapter" />
</service>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
<provider
android:name=".contributions.ContributionsContentProvider"
android:label="@string/provider_contributions"

View file

@ -3,10 +3,12 @@ package fr.free.nrw.commons.contributions;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;
import android.support.v4.content.FileProvider;
import java.io.File;
import java.io.IOException;
@ -29,34 +31,24 @@ public class ContributionController {
}
// See http://stackoverflow.com/a/5054673/17865 for why this is done
private Uri lastGeneratedCaptureURI;
private Uri lastGeneratedCaptureUri;
private Uri reGenerateImageCaptureURI() {
String storageState = Environment.getExternalStorageState();
if(storageState.equals(Environment.MEDIA_MOUNTED)) {
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Commons/images/" + new Date().getTime() + ".jpg";
File _photoFile = new File(path);
try {
if(!_photoFile.exists()) {
_photoFile.getParentFile().mkdirs();
_photoFile.createNewFile();
}
} catch (IOException e) {
Timber.e(e, "Could not create file: %s", path);
}
return Uri.fromFile(_photoFile);
} else {
throw new RuntimeException("No external storage found!");
}
private Uri reGenerateImageCaptureUriInCache() {
File photoFile = new File(fragment.getContext().getCacheDir() + "/images",
new Date().getTime() + ".jpg");
photoFile.getParentFile().mkdirs();
return FileProvider.getUriForFile(
fragment.getContext(),
fragment.getActivity().getApplicationContext().getPackageName() + ".provider",
photoFile);
}
public void startCameraCapture() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
lastGeneratedCaptureURI = reGenerateImageCaptureURI();
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, lastGeneratedCaptureURI);
lastGeneratedCaptureUri = reGenerateImageCaptureUriInCache();
takePictureIntent.setFlags(
Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, lastGeneratedCaptureUri);
fragment.startActivityForResult(takePictureIntent, SELECT_FROM_CAMERA);
}
@ -80,7 +72,7 @@ public class ContributionController {
break;
case SELECT_FROM_CAMERA:
shareIntent.setType("image/jpeg"); //FIXME: Find out appropriate mime type
shareIntent.putExtra(Intent.EXTRA_STREAM, lastGeneratedCaptureURI);
shareIntent.putExtra(Intent.EXTRA_STREAM, lastGeneratedCaptureUri);
shareIntent.putExtra(UploadService.EXTRA_SOURCE, Contribution.SOURCE_CAMERA);
break;
}
@ -93,12 +85,12 @@ public class ContributionController {
}
public void saveState(Bundle outState) {
outState.putParcelable("lastGeneratedCaptureURI", lastGeneratedCaptureURI);
outState.putParcelable("lastGeneratedCaptureURI", lastGeneratedCaptureUri);
}
public void loadState(Bundle savedInstanceState) {
if(savedInstanceState != null) {
lastGeneratedCaptureURI = savedInstanceState.getParcelable("lastGeneratedCaptureURI");
lastGeneratedCaptureUri = savedInstanceState.getParcelable("lastGeneratedCaptureURI");
}
}

View file

@ -197,7 +197,7 @@ public class MediaDetailFragment extends Fragment {
extractor.fetch();
return Boolean.TRUE;
} catch (IOException e) {
e.printStackTrace();
Timber.d(e);
}
return Boolean.FALSE;
}

View file

@ -64,7 +64,7 @@ public class NearbyInfoDialog extends OverlayDialog {
private void getArticleLink(Bundle bundle) {
this.sitelinks = bundle.getParcelable(ARG_SITE_LINK);
if (sitelinks.getWikipediaLink() == null) {
if (sitelinks.getWikipediaLink().equals(Uri.EMPTY)) {
goToButton.setVisibility(View.GONE);
}
@ -87,16 +87,16 @@ public class NearbyInfoDialog extends OverlayDialog {
MenuItem wikiDataArticle = popupMenu.getMenu()
.findItem(R.id.nearby_info_menu_wikidata_article);
commonsArticle.setEnabled(sitelinks.getCommonsLink() != null);
wikiDataArticle.setEnabled(sitelinks.getWikidataLink() != null);
commonsArticle.setEnabled(!sitelinks.getCommonsLink().equals(Uri.EMPTY));
wikiDataArticle.setEnabled(!sitelinks.getWikidataLink().equals(Uri.EMPTY));
popupMenu.setOnMenuItemClickListener(menuListener);
popupMenu.show();
}
private boolean showMenu() {
return sitelinks.getCommonsLink() != null
|| sitelinks.getWikidataLink() != null;
return !sitelinks.getCommonsLink().equals(Uri.EMPTY)
|| !sitelinks.getWikidataLink().equals(Uri.EMPTY);
}
private PopupMenu.OnMenuItemClickListener menuListener = new PopupMenu

View file

@ -5,8 +5,6 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.Nullable;
import fr.free.nrw.commons.Utils;
public class Sitelinks implements Parcelable {
private final String wikipediaLink;
private final String commonsLink;
@ -43,34 +41,24 @@ public class Sitelinks implements Parcelable {
}
};
@Nullable
public Uri getWikipediaLink() {
return sanitiseString(wikipediaLink);
}
@Nullable
public Uri getCommonsLink() {
return sanitiseString(commonsLink);
}
@Nullable
public Uri getWikidataLink() {
return sanitiseString(wikidataLink);
}
@Nullable
private Uri sanitiseString(String stringUrl) {
stringUrl = stringUrl
.replaceAll("<", "")
.replaceAll(">", "")
.replaceAll("[\n\r]", "");
if (!Utils.isNullOrWhiteSpace(stringUrl) && stringUrl != null) {
return Uri.parse(stringUrl);
}
return null;
private static Uri sanitiseString(String stringUrl) {
String sanitisedStringUrl = stringUrl.replaceAll("[<>\n\r]", "").trim();
return Uri.parse(sanitisedStringUrl);
}
public Sitelinks(Sitelinks.Builder builder) {
private Sitelinks(Sitelinks.Builder builder) {
this.wikidataLink = builder.wikidataLink;
this.wikipediaLink = builder.wikipediaLink;
this.commonsLink = builder.commonsLink;

View file

@ -6,13 +6,13 @@ import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.AlertDialog;
import fr.free.nrw.commons.MWApi;
import org.mediawiki.api.ApiResult;
import java.io.IOException;
import java.util.ArrayList;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.MWApi;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.contributions.ContributionsActivity;
import timber.log.Timber;
@ -22,13 +22,24 @@ import timber.log.Timber;
* Displays a warning to the user if the file already exists on Commons
*/
public class ExistingFileAsync extends AsyncTask<Void, Void, Boolean> {
interface Callback {
void onResult(Result result);
}
private String fileSHA1;
private Context context;
public enum Result {
NO_DUPLICATE,
DUPLICATE_PROCEED,
DUPLICATE_CANCELLED
}
public ExistingFileAsync(String fileSHA1, Context context) {
this.fileSHA1 = fileSHA1;
private final String fileSha1;
private final Context context;
private final Callback callback;
public ExistingFileAsync(String fileSha1, Context context, Callback callback) {
this.fileSha1 = fileSha1;
this.context = context;
this.callback = callback;
}
@Override
@ -46,7 +57,7 @@ public class ExistingFileAsync extends AsyncTask<Void, Void, Boolean> {
result = api.action("query")
.param("format", "xml")
.param("list", "allimages")
.param("aisha1", fileSHA1)
.param("aisha1", fileSha1)
.get();
Timber.d("Searching Commons API for existing file: %s", result);
} catch (IOException e) {
@ -79,17 +90,20 @@ public class ExistingFileAsync extends AsyncTask<Void, Void, Boolean> {
//Go back to ContributionsActivity
Intent intent = new Intent(context, ContributionsActivity.class);
context.startActivity(intent);
callback.onResult(Result.DUPLICATE_CANCELLED);
}
});
builder.setNegativeButton(R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
//No need to do anything, user remains on upload screen
callback.onResult(Result.DUPLICATE_PROCEED);
}
});
AlertDialog dialog = builder.create();
dialog.show();
} else {
callback.onResult(Result.NO_DUPLICATE);
}
}
}

View file

@ -9,6 +9,16 @@ import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import timber.log.Timber;
public class FileUtils {
@ -23,6 +33,7 @@ public class FileUtils {
*/
// Can be safely suppressed, checks for isKitKat before running isDocumentUri
@SuppressLint("NewApi")
@Nullable
public static String getPath(Context context, Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
@ -93,6 +104,7 @@ public class FileUtils {
* @param selectionArgs (Optional) Selection arguments used in the query.
* @return The value of the _data column, which is typically a file path.
*/
@Nullable
public static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {
@ -108,6 +120,8 @@ public class FileUtils {
final int column_index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(column_index);
}
} catch (IllegalArgumentException e) {
Timber.d(e);
} finally {
if (cursor != null)
cursor.close();
@ -119,7 +133,7 @@ public class FileUtils {
* @param uri The Uri to check.
* @return Whether the Uri authority is ExternalStorageProvider.
*/
public static boolean isExternalStorageDocument(Uri uri) {
private static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
@ -127,7 +141,7 @@ public class FileUtils {
* @param uri The Uri to check.
* @return Whether the Uri authority is DownloadsProvider.
*/
public static boolean isDownloadsDocument(Uri uri) {
private static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
@ -135,7 +149,39 @@ public class FileUtils {
* @param uri The Uri to check.
* @return Whether the Uri authority is MediaProvider.
*/
public static boolean isMediaDocument(Uri uri) {
private static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
/**
* Check if the URI is owned by the current app.
*/
public static boolean isSelfOwned(Context context, Uri uri) {
return uri.getAuthority().equals(context.getPackageName() + ".provider");
}
/**
* Copy content from source file to destination file.
* @param source stream copied from
* @param destination stream copied to
* @throws IOException thrown when failing to read source or opening destination file
*/
public static void copy(@NonNull FileInputStream source, @NonNull FileOutputStream destination)
throws IOException {
FileChannel sourceChannel = source.getChannel();
FileChannel destinationChannel = destination.getChannel();
sourceChannel.transferTo(0, sourceChannel.size(), destinationChannel);
}
/**
* Copy content from source file to destination file.
* @param source file descriptor copied from
* @param destination file path copied to
* @throws IOException thrown when failing to read source or opening destination file
*/
public static void copy(@NonNull FileDescriptor source, @NonNull String destination)
throws IOException {
copy(new FileInputStream(source), new FileOutputStream(destination));
}
}

View file

@ -7,10 +7,14 @@ import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.media.ExifInterface;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import java.io.FileDescriptor;
import java.io.IOException;
import fr.free.nrw.commons.CommonsApplication;
@ -23,17 +27,38 @@ import timber.log.Timber;
*/
public class GPSExtractor {
private String filePath;
private double decLatitude, decLongitude;
private ExifInterface exif;
private double decLatitude;
private double decLongitude;
private Double currentLatitude = null;
private Double currentLongitude = null;
public boolean imageCoordsExists;
private MyLocationListener myLocationListener;
private LocationManager locationManager;
/**
* Construct from the file descriptor of the image (only for API 24 or newer).
* @param fileDescriptor the file descriptor of the image
*/
@RequiresApi(24)
public GPSExtractor(@NonNull FileDescriptor fileDescriptor) {
try {
exif = new ExifInterface(fileDescriptor);
} catch (IOException | IllegalArgumentException e) {
Timber.w(e);
}
}
public GPSExtractor(String filePath) {
this.filePath = filePath;
/**
* Construct from the file path of the image.
* @param path file path of the image
*/
public GPSExtractor(@NonNull String path) {
try {
exif = new ExifInterface(path);
} catch (IOException | IllegalArgumentException e) {
Timber.w(e);
}
}
/**
@ -86,26 +111,15 @@ public class GPSExtractor {
*/
@Nullable
public String getCoords(boolean useGPS) {
ExifInterface exif;
String latitude = "";
String longitude = "";
String latitude_ref = "";
String longitude_ref = "";
String decimalCoords = "";
try {
exif = new ExifInterface(filePath);
} catch (IOException e) {
Timber.w(e);
return null;
} catch (IllegalArgumentException e) {
Timber.w(e);
return null;
}
//If image has no EXIF data and user has enabled GPS setting, get user's location
if (exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE) == null && useGPS) {
if (exif == null || exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE) == null) {
if (useGPS) {
registerLocationManager();
imageCoordsExists = false;
@ -114,7 +128,9 @@ public class GPSExtractor {
//Check what user's preference is for automatic location detection
boolean gpsPrefEnabled = gpsPreferenceEnabled();
//Check that currentLatitude and currentLongitude have been explicitly set by MyLocationListener and do not default to (0.0,0.0)
//Check that currentLatitude and currentLongitude have been
// explicitly set by MyLocationListener
// and do not default to (0.0,0.0)
if (gpsPrefEnabled && currentLatitude != null && currentLongitude != null) {
Timber.d("Current location values: Lat = %f Long = %f",
currentLatitude, currentLongitude);
@ -123,8 +139,9 @@ public class GPSExtractor {
// No coords found
return null;
}
} else if (exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE) == null) {
} else {
return null;
}
} else {
//If image has EXIF data, extract image coords
imageCoordsExists = true;

View file

@ -8,6 +8,9 @@ import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.design.widget.Snackbar;
import android.support.graphics.drawable.VectorDrawableCompat;
import android.support.v4.app.ActivityCompat;
@ -20,9 +23,11 @@ import android.widget.Toast;
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
import com.facebook.drawee.view.SimpleDraweeView;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import butterknife.ButterKnife;
@ -48,13 +53,16 @@ public class ShareActivity
implements SingleUploadFragment.OnUploadActionInitiated,
CategorizationFragment.OnCategoriesSaveHandler {
private static final int REQUEST_PERM_ON_CREATE_STORAGE = 1;
private static final int REQUEST_PERM_ON_CREATE_LOCATION = 2;
private static final int REQUEST_PERM_ON_CREATE_STORAGE_AND_LOCATION = 3;
private static final int REQUEST_PERM_ON_SUBMIT_STORAGE = 4;
private CategorizationFragment categorizationFragment;
private CommonsApplication app;
private String source;
private String mimeType;
private String mediaUriString;
private Uri mediaUri;
private Contribution contribution;
@ -68,15 +76,16 @@ public class ShareActivity
private String decimalCoords;
private boolean useNewPermissions = false;
private boolean storagePermission = false;
private boolean locationPermission = false;
private boolean storagePermitted = false;
private boolean locationPermitted = false;
private String title;
private String description;
private Snackbar snackbar;
private boolean duplicateCheckPassed = false;
/**
* Called when user taps the submit button
* Called when user taps the submit button.
*/
@Override
public void uploadActionInitiated(String title, String description) {
@ -85,10 +94,11 @@ public class ShareActivity
this.description = description;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//Check for Storage permission that is required for upload. Do not allow user to proceed without permission, otherwise will crash
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
//See http://stackoverflow.com/questions/33169455/onrequestpermissionsresult-not-being-called-in-dialog-fragment
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 4);
// Check for Storage permission that is required for upload.
// Do not allow user to proceed without permission, otherwise will crash
if (needsToRequestStoragePermission()) {
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
REQUEST_PERM_ON_SUBMIT_STORAGE);
} else {
uploadBegins();
}
@ -97,13 +107,19 @@ public class ShareActivity
}
}
private void uploadBegins() {
if (locationPermission) {
getFileMetadata(true);
} else {
getFileMetadata(false);
@RequiresApi(16)
private boolean needsToRequestStoragePermission() {
// We need to ask storage permission when
// the file is not owned by this app, (e.g. shared from the Gallery)
// and permission is not obtained.
return !FileUtils.isSelfOwned(getApplicationContext(), mediaUri)
&& (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED);
}
private void uploadBegins() {
getFileMetadata(locationPermitted);
Toast startingToast = Toast.makeText(
CommonsApplication.getInstance(),
R.string.uploading_started,
@ -243,22 +259,7 @@ public class ShareActivity
}
if (mediaUri != null) {
mediaUriString = mediaUri.toString();
backgroundImageView.setImageURI(mediaUriString);
//Test SHA1 of image to see if it matches SHA1 of a file on Commons
try {
InputStream inputStream = getContentResolver().openInputStream(mediaUri);
Timber.d("Input stream created from %s", mediaUriString);
String fileSHA1 = Utils.getSHA1(inputStream);
Timber.d("File SHA1 is: %s", fileSHA1);
ExistingFileAsync fileAsyncTask = new ExistingFileAsync(fileSHA1, this);
fileAsyncTask.execute();
} catch (IOException e) {
Timber.d(e, "IO Exception: ");
}
backgroundImageView.setImageURI(mediaUri);
}
if (savedInstanceState != null) {
@ -267,105 +268,94 @@ public class ShareActivity
requestAuthToken();
Timber.d("Uri: %s", mediaUriString);
Timber.d("Uri: %s", mediaUri.toString());
Timber.d("Ext storage dir: %s", Environment.getExternalStorageDirectory());
useNewPermissions = false;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
useNewPermissions = true;
if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
storagePermission = true;
if (!needsToRequestStoragePermission()) {
storagePermitted = true;
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
locationPermission = true;
locationPermitted = true;
}
}
// Check storage permissions if marshmallow or newer
if (useNewPermissions && (!storagePermission || !locationPermission)) {
if (!storagePermission && !locationPermission) {
String permissionRationales = getResources().getString(R.string.storage_permission_rationale) + "\n" + getResources().getString(R.string.location_permission_rationale);
snackbar = Snackbar.make(findViewById(android.R.id.content), permissionRationales,
Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.ok, new View.OnClickListener() {
@Override
public void onClick(View view) {
ActivityCompat.requestPermissions(ShareActivity.this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION}, 3);
}
});
snackbar.show();
if (useNewPermissions && (!storagePermitted || !locationPermitted)) {
if (!storagePermitted && !locationPermitted) {
String permissionRationales =
getResources().getString(R.string.storage_permission_rationale) + "\n"
+ getResources().getString(R.string.location_permission_rationale);
snackbar = requestPermissionUsingSnackBar(
permissionRationales,
new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION},
REQUEST_PERM_ON_CREATE_STORAGE_AND_LOCATION);
View snackbarView = snackbar.getView();
TextView textView = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
textView.setMaxLines(3);
} else if (!storagePermission) {
Snackbar.make(findViewById(android.R.id.content), R.string.storage_permission_rationale,
Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.ok, new View.OnClickListener() {
@Override
public void onClick(View view) {
ActivityCompat.requestPermissions(ShareActivity.this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
} else if (!storagePermitted) {
requestPermissionUsingSnackBar(
getString(R.string.storage_permission_rationale),
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
REQUEST_PERM_ON_CREATE_STORAGE);
} else if (!locationPermitted) {
requestPermissionUsingSnackBar(
getString(R.string.location_permission_rationale),
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
REQUEST_PERM_ON_CREATE_LOCATION);
}
}).show();
} else if (!locationPermission) {
Snackbar.make(findViewById(android.R.id.content), R.string.location_permission_rationale,
Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.ok, new View.OnClickListener() {
@Override
public void onClick(View view) {
ActivityCompat.requestPermissions(ShareActivity.this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 2);
}
}).show();
}
} else if (useNewPermissions && storagePermission && !locationPermission) {
getFileMetadata(true);
} else if(!useNewPermissions || (storagePermission && locationPermission)) {
getFileMetadata(true);
}
performPreuploadProcessingOfFile();
}
@Override
public void onRequestPermissionsResult(int requestCode,
String[] permissions, int[] grantResults) {
switch (requestCode) {
// 1 = Storage (from snackbar)
case 1: {
if (grantResults.length > 0
case REQUEST_PERM_ON_CREATE_STORAGE: {
if (grantResults.length >= 1
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getFileMetadata(true);
backgroundImageView.setImageURI(mediaUri);
storagePermitted = true;
performPreuploadProcessingOfFile();
}
return;
}
// 2 = Location
case 2: {
if (grantResults.length > 0
case REQUEST_PERM_ON_CREATE_LOCATION: {
if (grantResults.length >= 1
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getFileMetadata(false);
locationPermitted = true;
performPreuploadProcessingOfFile();
}
return;
}
// 3 = Storage + Location
case 3: {
if (grantResults.length > 1
case REQUEST_PERM_ON_CREATE_STORAGE_AND_LOCATION: {
if (grantResults.length >= 2
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getFileMetadata(true);
backgroundImageView.setImageURI(mediaUri);
storagePermitted = true;
performPreuploadProcessingOfFile();
}
if (grantResults.length > 1
if (grantResults.length >= 2
&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
getFileMetadata(false);
locationPermitted = true;
performPreuploadProcessingOfFile();
}
return;
}
// 4 = Storage (from submit button) - this needs to be separate from (1) because only the
// Storage (from submit button) - this needs to be separate from (1) because only the
// submit button should bring user to next screen
case 4: {
if (grantResults.length > 0
case REQUEST_PERM_ON_SUBMIT_STORAGE: {
if (grantResults.length >= 1
&& 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
getFileMetadata(true);
performPreuploadProcessingOfFile();
//Uploading only begins if storage permission granted from arrow icon
uploadBegins();
@ -376,23 +366,112 @@ public class ShareActivity
}
}
/**
* Gets coordinates for category suggestions, either from EXIF data or user location
* @param gpsEnabled
*/
public void getFileMetadata(boolean gpsEnabled) {
String filePath = FileUtils.getPath(getApplicationContext(), mediaUri);
Timber.d("Filepath: %s", filePath);
Timber.d("Calling GPSExtractor");
if(imageObj == null) {
imageObj = new GPSExtractor(filePath);
private void performPreuploadProcessingOfFile() {
if (!useNewPermissions || storagePermitted) {
if (!duplicateCheckPassed) {
//Test SHA1 of image to see if it matches SHA1 of a file on Commons
try {
InputStream inputStream = getContentResolver().openInputStream(mediaUri);
Timber.d("Input stream created from %s", mediaUri.toString());
String fileSHA1 = Utils.getSHA1(inputStream);
Timber.d("File SHA1 is: %s", fileSHA1);
ExistingFileAsync fileAsyncTask =
new ExistingFileAsync(fileSHA1, this, new ExistingFileAsync.Callback() {
@Override
public void onResult(ExistingFileAsync.Result result) {
Timber.d("%s duplicate check: %s", mediaUri.toString(), result);
duplicateCheckPassed =
result == ExistingFileAsync.Result.DUPLICATE_PROCEED
|| result == ExistingFileAsync.Result.NO_DUPLICATE;
}
});
fileAsyncTask.execute();
} catch (IOException e) {
Timber.d(e, "IO Exception: ");
}
}
if (filePath != null && !filePath.equals("")) {
getFileMetadata(locationPermitted);
} else {
Timber.w("not ready for preprocessing: useNewPermissions=%s storage=%s location=%s",
useNewPermissions, storagePermitted, locationPermitted);
}
}
private Snackbar requestPermissionUsingSnackBar(
String rationale, final String[] perms, final int code) {
Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), rationale,
Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.ok, new View.OnClickListener() {
@Override
public void onClick(View view) {
ActivityCompat.requestPermissions(ShareActivity.this,
perms, code);
}
});
snackbar.show();
return snackbar;
}
@Nullable
private String getPathOfMediaOrCopy() {
String filePath = FileUtils.getPath(getApplicationContext(), mediaUri);
Timber.d("Filepath: " + filePath);
if (filePath == null) {
// in older devices getPath() may fail depending on the source URI
// creating and using a copy of the file seems to work instead.
// TODO: there might be a more proper solution than this
String copyPath = getApplicationContext().getCacheDir().getAbsolutePath()
+ "/" + new Date().getTime() + ".jpg";
try {
ParcelFileDescriptor descriptor
= getContentResolver().openFileDescriptor(mediaUri, "r");
if (descriptor != null) {
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 filePath;
}
/**
* Gets coordinates for category suggestions, either from EXIF data or user location
* @param gpsEnabled if true use GPS
*/
private void getFileMetadata(boolean gpsEnabled) {
Timber.d("Calling GPSExtractor");
try {
if (imageObj == null) {
ParcelFileDescriptor descriptor
= getContentResolver().openFileDescriptor(mediaUri, "r");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
if (descriptor != null) {
imageObj = new GPSExtractor(descriptor.getFileDescriptor());
}
} else {
String filePath = getPathOfMediaOrCopy();
if (filePath != null) {
imageObj = new GPSExtractor(filePath);
}
}
}
if (imageObj != null) {
// Gets image coords from exif data or user location
decimalCoords = imageObj.getCoords(gpsEnabled);
useImageCoords();
}
} catch (FileNotFoundException e) {
Timber.w("File not found: " + mediaUri, e);
}
}
/**

View file

@ -101,6 +101,12 @@ public class SingleUploadFragment extends Fragment {
prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
license = prefs.getString(Prefs.DEFAULT_LICENSE, Prefs.Licenses.CC_BY_SA_3);
// check if this is the first time we have uploaded
if (prefs.getString("Title", "").trim().length() == 0
&& prefs.getString("Desc", "").trim().length() == 0) {
titleDescButton.setVisibility(View.GONE);
}
Timber.d(license);
ArrayAdapter<String> adapter;

View file

@ -135,9 +135,10 @@ public class UploadController {
}
if (imagePrefix && contribution.getDateCreated() == null) {
Timber.d("local uri " + contribution.getLocalUri());
Cursor cursor = app.getContentResolver().query(contribution.getLocalUri(),
new String[]{MediaStore.Images.ImageColumns.DATE_TAKEN}, null, null, null);
if(cursor != null && cursor.getCount() != 0) {
if (cursor != null && cursor.getCount() != 0 && cursor.getColumnCount() != 0) {
cursor.moveToFirst();
Date dateCreated = new Date(cursor.getLong(0));
Date epochStart = new Date(0);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 864 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 398 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Before After
Before After

View file

@ -8,7 +8,7 @@
<string name="signup">أنشئ حسابًا</string>
<string name="logging_in_title">يجري الدخول</string>
<string name="logging_in_message">الرجاء الانتظار…</string>
<string name="login_success">تم الدخول بشكل صحيح</string>
<string name="login_success">تم الدخول بشكل صحيح!</string>
<string name="login_failed">فشل تسجيل الدخول</string>
<string name="upload_failed">الملف غير موجود. فضلا اختر ملفا آخر.</string>
<string name="authentication_failed">فشل الاستيقان!</string>

View file

@ -185,7 +185,8 @@
<string name="navigation_item_feedback">La to opinión</string>
<string name="navigation_item_logout">Salir</string>
<string name="navigation_item_info">Tutorial</string>
<string name="nearby_needs_permissions">Los sitios cercanos nun pueden amosase ensin los permisos d\'allugamientu</string>
<string name="no_description_found">nun s\'atoparon descripciones</string>
<string name="nearby_info_menu_commons_article">Artículu en Commons</string>
<string name="nearby_info_menu_wikidata_article" fuzzy="true">Artículu en WikiData</string>
<string name="nearby_info_menu_wikidata_article">Elementu de WikiData</string>
</resources>

View file

@ -89,5 +89,5 @@
<string name="navigation_item_settings">Настройки</string>
<string name="navigation_item_feedback">Обратна връзка</string>
<string name="navigation_item_logout">Излизане</string>
<string name="navigation_item_info" fuzzy="true">Въведение</string>
<string name="navigation_item_info">Ръководство</string>
</resources>

View file

@ -7,7 +7,7 @@
<string name="login">প্রবেশ</string>
<string name="signup">নিবন্ধন</string>
<string name="logging_in_title">প্রবেশ হচ্ছে</string>
<string name="logging_in_message">একটু অপেক্ষা করুন…</string>
<string name="logging_in_message">অনুগ্রহ করে অপেক্ষা করুন...</string>
<string name="login_success">প্রবেশ সফল!</string>
<string name="login_failed">প্রবেশ ব্যর্থ :(</string>
<string name="upload_failed">ফাইল পাওয়া যায়নি। আরেকটি ফাইল চেষ্টা করুন।</string>
@ -176,11 +176,12 @@
<string name="navigation_item_upload">আপলোড</string>
<string name="navigation_item_nearby">কাছাকাছি</string>
<string name="navigation_item_about">সম্পর্কে</string>
<string name="navigation_item_settings">সেটিং</string>
<string name="navigation_item_settings">সেটিং</string>
<string name="navigation_item_feedback">প্রতিক্রিয়া</string>
<string name="navigation_item_logout">প্রস্থান</string>
<string name="navigation_item_info" fuzzy="true">ভূমিকা</string>
<string name="navigation_item_info">ভূমিকা</string>
<string name="nearby_needs_permissions">অবস্থানের অনুমতি ছাড়া কাছাকাছি জায়গাগুলি প্রদর্শন করা যাবে না</string>
<string name="no_description_found">কোন বিবরণ পাওয়া যায়নি</string>
<string name="nearby_info_menu_commons_article">কমন্স নিবন্ধ</string>
<string name="nearby_info_menu_wikidata_article" fuzzy="true">উইকিউপাত্ত নিবন্ধ</string>
<string name="nearby_info_menu_wikidata_article">উইকিউপাত্ত পদ</string>
</resources>

View file

@ -185,7 +185,8 @@
<string name="navigation_item_feedback">Povratne informacije</string>
<string name="navigation_item_logout">Odjavi me</string>
<string name="navigation_item_info">Uputstva</string>
<string name="nearby_needs_permissions">Mjesta u blizini ne mogu se prikazati bez dozvole za lokaciju</string>
<string name="no_description_found">nema opisa</string>
<string name="nearby_info_menu_commons_article">Članak na Commonsu</string>
<string name="nearby_info_menu_wikidata_article" fuzzy="true">Članak na Wikipodacima</string>
<string name="nearby_info_menu_wikidata_article">Stavka na Wikipodacima</string>
</resources>

View file

@ -49,6 +49,8 @@
<string name="menu_upload_single">Carrega</string>
<string name="categories_search_text_hint">Categories de cerca</string>
<string name="menu_save_categories">Desa</string>
<string name="refresh_button">Refresca</string>
<string name="contributions_subtitle_zero">Encara no hi ha cap càrrega</string>
<plurals name="contributions_subtitle" fuzzy="true">
<item quantity="zero">No hi ha cap càrrega encara</item>
<item quantity="one">1 càrrega</item>
@ -76,13 +78,15 @@
<string name="title_activity_about">Quant a</string>
<string name="menu_feedback">Envia comentaris (per correu)</string>
<string name="provider_categories">Categories usades recentment</string>
<string name="waiting_first_sync" fuzzy="true">S\'està esperant la primera sincronització…</string>
<string name="waiting_first_sync">Sestà esperant la primera sincronització…</string>
<string name="no_uploads_yet">Encara no heu carregat cap foto.</string>
<string name="menu_retry_upload">Reintenta</string>
<string name="menu_cancel_upload">Cancel·la</string>
<string name="share_license_summary">Aquesta imatge es llicenciarà sota %1$s</string>
<string name="menu_download">Baixa</string>
<string name="preference_license">Llicència</string>
<string name="preference_theme">Mode nocturn</string>
<string name="preference_theme_summary">Utilitza el tema fosc</string>
<string name="license_name_cc_by_sa" fuzzy="true">CC Reconeixement-CompartirIgual 3.0</string>
<string name="license_name_cc_by" fuzzy="true">CC Reconeixement 3.0</string>
<string name="license_name_cc0">CC0</string>
@ -99,6 +103,7 @@
<string name="license_name_cc_by_sa_3_0_ro">CC BY-SA 3.0 (Romania)</string>
<string name="license_name_cc_by_3_0">CC BY 3.0</string>
<string name="license_name_cc_zero">CC Zero</string>
<string name="tutorial_4_text">Exemple de càrrega:</string>
<string name="welcome_wikipedia_text">Doneu les vostres imatges. Ajudeu a donar vida als articles de la Viquipèdia!</string>
<string name="welcome_wikipedia_subtext">Les imatges de la Viquipèdia vénen de la Wikimedia Commons.</string>
<string name="welcome_copyright_text">Les vostres imatges ajuden a educar gent d\'arreu del món.</string>
@ -116,4 +121,29 @@
<string name="warning">Avís</string>
<string name="yes"></string>
<string name="no">No</string>
<string name="media_detail_title">Títol</string>
<string name="media_detail_media_title">Títol del fitxer multimèdia</string>
<string name="media_detail_description">Descripció</string>
<string name="media_detail_uploaded_date">Data de càrrega</string>
<string name="use_wikidata">Utilitza Wikidata</string>
<string name="maximum_limit">Límit màxim</string>
<string name="logout_verification">Realment voleu finalitzar la sessió?</string>
<string name="commons_logo">Logo de Commons</string>
<string name="no_image_found">No sha trobat cap imatge</string>
<string name="upload_image">Carrega la imatge</string>
<string name="welcome_image_llamas">Llames</string>
<string name="welcome_image_proprietary">Imatge privativa</string>
<string name="cancel">Cancel·la</string>
<string name="navigation_drawer_open">Obre</string>
<string name="navigation_drawer_close">Tanca</string>
<string name="navigation_item_home">Inici</string>
<string name="navigation_item_upload">Carrega</string>
<string name="navigation_item_nearby">A prop</string>
<string name="navigation_item_about">Quant a</string>
<string name="navigation_item_settings">Paràmetres</string>
<string name="navigation_item_feedback">Comentaris</string>
<string name="navigation_item_logout">Finalitza la sessió</string>
<string name="no_description_found">no s\'ha trobat cap descripció</string>
<string name="nearby_info_menu_commons_article">Article al Commons</string>
<string name="nearby_info_menu_wikidata_article">Element del Wikidata</string>
</resources>

View file

@ -183,6 +183,9 @@
<string name="navigation_item_settings">Nastavení</string>
<string name="navigation_item_feedback">Zpětná vazba</string>
<string name="navigation_item_logout">Odhlášení</string>
<string name="navigation_item_info">Průvodce</string>
<string name="nearby_needs_permissions">Místa poblíž nebude možné zobrazit, neuvedete-li svojí polohu.</string>
<string name="no_description_found">nebyl nalezen žádný popisek</string>
<string name="nearby_info_menu_commons_article">Článek na Commons</string>
<string name="nearby_info_menu_wikidata_article" fuzzy="true">Článek na Wikidatech</string>
<string name="nearby_info_menu_wikidata_article">Položka Wikidat</string>
</resources>

View file

@ -185,7 +185,8 @@
<string name="navigation_item_feedback">Rückmeldungen</string>
<string name="navigation_item_logout">Abmelden</string>
<string name="navigation_item_info">Anleitung</string>
<string name="nearby_needs_permissions">Orte in der Nähe können ohne Berechtigung zur Standortbestimmung nicht ermittelt werden</string>
<string name="no_description_found">Keine Beschreibung gefunden</string>
<string name="nearby_info_menu_commons_article">Commons-Artikel</string>
<string name="nearby_info_menu_wikidata_article" fuzzy="true">Wikidata-Artikel</string>
<string name="nearby_info_menu_wikidata_article">Wikidata-Objekt</string>
</resources>

View file

@ -171,7 +171,7 @@
<string name="welcome_image_tulip">Tulipa</string>
<string name="welcome_image_no_selfies">Nada de autorretratos</string>
<string name="welcome_image_proprietary">Imagen privativa</string>
<string name="welcome_image_welcome_wikipedia">Wikipedia de bienvenida</string>
<string name="welcome_image_welcome_wikipedia">Bienvenida de Wikipedia</string>
<string name="welcome_image_welcome_copyright">Derechos de autor de bienvenida</string>
<string name="welcome_image_sydney_opera_house">Ópera de Sídney</string>
<string name="cancel">Cancelar</string>

View file

@ -7,7 +7,7 @@
<string name="login">ورود</string>
<string name="signup">ثبت نام</string>
<string name="logging_in_title">واردشدن</string>
<string name="logging_in_message">لطفاً صبر کنید…</string>
<string name="logging_in_message">شکیبا باشید...</string>
<string name="login_success">ورود موفق!</string>
<string name="login_failed">ورود ناموفق!</string>
<string name="upload_failed">پرونده یافت نشد لطفاً پرونده دیگری را امتحان کنید.</string>

View file

@ -83,7 +83,7 @@
<string name="menu_feedback">Lähetä palautetta (sähköpostitse)</string>
<string name="no_email_client">Sähköpostiohjelmaa ei ole asennettu</string>
<string name="provider_categories">Äskettäin käytetyt luokat</string>
<string name="waiting_first_sync" fuzzy="true">Odotetaan ensimmäistä synkronointia.</string>
<string name="waiting_first_sync">Odotetaan ensimmäistä synkronointia…</string>
<string name="no_uploads_yet">Et ole vielä tallentanut kuvia.</string>
<string name="menu_retry_upload">Yritä uudelleen</string>
<string name="menu_cancel_upload">Peruuta</string>
@ -129,7 +129,7 @@
<string name="welcome_final_text">Luuletko ymmärtäneesi tämän?</string>
<string name="welcome_final_button_text">Kyllä!</string>
<string name="detail_panel_cats_label">Luokat</string>
<string name="detail_panel_cats_loading" fuzzy="true">Ladataan…</string>
<string name="detail_panel_cats_loading">Ladataan…</string>
<string name="detail_panel_cats_none">Ei yhtään valittu</string>
<string name="detail_description_empty">Ei kuvausta</string>
<string name="detail_license_empty">Tuntematon lisenssi</string>
@ -161,5 +161,5 @@
<string name="navigation_item_feedback">Palaute</string>
<string name="navigation_item_logout">Kirjaudu ulos</string>
<string name="nearby_info_menu_commons_article">Commons-artikkeli</string>
<string name="nearby_info_menu_wikidata_article" fuzzy="true">WikiData-artikkeli</string>
<string name="nearby_info_menu_wikidata_article">Wikidata-kohde</string>
</resources>

View file

@ -185,7 +185,8 @@
<string name="navigation_item_feedback">Commentaire</string>
<string name="navigation_item_logout">Déconnexion</string>
<string name="navigation_item_info">Tutoriel</string>
<string name="nearby_needs_permissions">Les endroits proches ne peuvent pas être affichés si vous ne partagez pas votre position géographique.</string>
<string name="no_description_found">aucune description trouvée</string>
<string name="nearby_info_menu_commons_article">Article de Communs</string>
<string name="nearby_info_menu_wikidata_article" fuzzy="true">Article de WikiData</string>
<string name="nearby_info_menu_wikidata_article">Élément de Wikidata</string>
</resources>

View file

@ -185,7 +185,8 @@
<string name="navigation_item_feedback">Comentarios</string>
<string name="navigation_item_logout">Saír</string>
<string name="navigation_item_info">Titorial</string>
<string name="nearby_needs_permissions">Os sitios situados preto non poden visualizarse sen permisos de localización</string>
<string name="no_description_found">non se atopou descrición</string>
<string name="nearby_info_menu_commons_article">Artigo en Commons</string>
<string name="nearby_info_menu_wikidata_article" fuzzy="true">Artigo en WikiData</string>
<string name="nearby_info_menu_wikidata_article">Elemento en Wikidata</string>
</resources>

View file

@ -24,7 +24,7 @@
<item quantity="one">%d फ़ाइल अपलोड हो रहा</item>
<item quantity="other">%d फ़ाइलें अपलोड हो रहीं</item>
</plurals>
<string name="title_activity_contributions" fuzzy="true">मेरे अपलोड</string>
<string name="title_activity_contributions">मेरे ताज़ा अपलोड</string>
<string name="contribution_state_queued">प्रतीक्षा में</string>
<string name="contribution_state_failed">विफल</string>
<string name="contribution_state_in_progress">%1$d%% पूरा हुआ</string>

View file

@ -7,7 +7,7 @@
<string name="login">Bejelentkezés</string>
<string name="signup">Regisztráció</string>
<string name="logging_in_title">Belépés…</string>
<string name="logging_in_message" fuzzy="true">Kérlek várj…</string>
<string name="logging_in_message">Kérlek várj…</string>
<string name="login_success">Sikeres bejelentkezés</string>
<string name="login_failed">A bejelentkezés nem sikerült.</string>
<string name="upload_failed">A fájl nem található. Próbálkozz másik fájllal.</string>
@ -130,7 +130,7 @@
<string name="welcome_final_text">Megértetted?</string>
<string name="welcome_final_button_text">Igen!</string>
<string name="detail_panel_cats_label">Kategóriák</string>
<string name="detail_panel_cats_loading" fuzzy="true">Betöltés…</string>
<string name="detail_panel_cats_loading">Betöltés…</string>
<string name="detail_panel_cats_none">Nincs kijelölés</string>
<string name="detail_description_empty">Nincs leírás</string>
<string name="detail_license_empty">Ismeretlen licenc</string>
@ -159,6 +159,12 @@
<string name="maximum_limit_alert">Nem lehet 500-nál többet megjeleníteni</string>
<string name="set_limit">Legutóbbi feltöltési korlát beállítása</string>
<string name="login_failed_2fa_not_supported">A kétlépcsős hitelesítés jelenleg nem támogatott.</string>
<string name="logout_verification">Kilépsz?</string>
<string name="commons_logo">Commons Logo</string>
<string name="background_image">Háttérkép</string>
<string name="no_image_found">Nem található kép</string>
<string name="upload_image">Kép feltöltése</string>
<string name="welcome_image_sydney_opera_house">Sydney Operaház</string>
<string name="cancel">Mégse</string>
<string name="navigation_drawer_open">Megnyitás</string>
<string name="navigation_drawer_close">Bezárás</string>
@ -169,4 +175,8 @@
<string name="navigation_item_settings">Beállítások</string>
<string name="navigation_item_feedback">Visszajelzés</string>
<string name="navigation_item_logout">Kijelentkezés</string>
<string name="navigation_item_info">Bevezető</string>
<string name="no_description_found">nincs leírás</string>
<string name="nearby_info_menu_commons_article">Commons szócikk</string>
<string name="nearby_info_menu_wikidata_article">Wikidata tétel</string>
</resources>

View file

@ -164,4 +164,5 @@
<string name="navigation_item_logout">Esci</string>
<string name="navigation_item_info">Tutorial</string>
<string name="no_description_found">nessuna descrizione trovata</string>
<string name="nearby_info_menu_wikidata_article">Elemento Wikidata</string>
</resources>

View file

@ -181,5 +181,7 @@
<string name="navigation_item_feedback">משוב</string>
<string name="navigation_item_logout">יציאה</string>
<string name="navigation_item_info">מדריך</string>
<string name="nearby_needs_permissions">אי־אפשר להציג מקומות בסביבה ללא הרשאות מיקום</string>
<string name="no_description_found">לא נמצא תיאור</string>
<string name="nearby_info_menu_wikidata_article">פריט ויקינתונים</string>
</resources>

View file

@ -7,7 +7,7 @@
<string name="login">אַרײַנלאָגירן</string>
<string name="signup">אײַנשרייבן</string>
<string name="logging_in_title">ארײַנלאגירן</string>
<string name="logging_in_message" fuzzy="true">ביטע ווארטן</string>
<string name="logging_in_message">ביטע ווארטן</string>
<string name="login_success">אריינלאגירט מיט הצלחה!</string>
<string name="login_failed">ארײַנלאגירן אדורכגעפאלן!</string>
<string name="upload_failed">טעקע נישט געראפן. פרובירט אפשר אן אנדער טעקע.</string>
@ -24,7 +24,7 @@
<item quantity="one">%d טעקע לאדט אן</item>
<item quantity="other">%d טעקעס לאדן אן</item>
</plurals>
<string name="title_activity_contributions" fuzzy="true">מײַנע ארויפלאדן</string>
<string name="title_activity_contributions">מײַנע לעצטיקע ארויפֿלאדן</string>
<string name="contribution_state_queued">אין ריי</string>
<string name="contribution_state_failed">דורכגעפֿאַלן</string>
<string name="contribution_state_in_progress">%1$d%% דערגאנצט</string>
@ -37,6 +37,7 @@
<string name="menu_open_in_browser">באקוקן אין בלעטערער</string>
<string name="share_title_hint">טיטל</string>
<string name="share_description_hint">באַשרײַבונג</string>
<string name="login_failed_network">נישט מעגלעך אריינלאגירן נעצווערק פֿעלער</string>
<string name="login_failed_generic">ארײַנלאגירן אדורכגעפאלן!</string>
<string name="share_upload_button">אַרויפֿלאָדן</string>
<string name="provider_modifications">פֿארענדערונגען</string>
@ -44,8 +45,8 @@
<string name="categories_search_text_hint">זוכן קאטעגאריעס</string>
<string name="menu_save_categories">אויפֿהיטן</string>
<string name="refresh_button">דערפֿרישן</string>
<plurals name="contributions_subtitle" fuzzy="true">
<item quantity="zero">נאך נישט קיין ארויפֿלאדן </item>
<plurals name="contributions_subtitle">
<item quantity="zero">\@string/contributions_subtitle_zero </item>
<item quantity="one">איין ארויפֿלאד</item>
<item quantity="other">%d ארויפֿלאדן</item>
</plurals>
@ -83,16 +84,24 @@
<string name="license_name_cc_zero">CC Zero</string>
<string name="welcome_final_button_text">יא!</string>
<string name="detail_panel_cats_label">קאַטעגאריעס</string>
<string name="detail_panel_cats_loading" fuzzy="true">לאָדט…</string>
<string name="detail_panel_cats_loading">לאָדט…</string>
<string name="detail_panel_cats_none">גארנישט געקליבן</string>
<string name="detail_description_empty">קיין באַשרײַבונג</string>
<string name="detail_license_empty">אומבאקאנטער ליצענץ</string>
<string name="menu_refresh">דערפֿרישן</string>
<string name="ok">יאָ</string>
<string name="warning">ווארענונג</string>
<string name="yes">יא</string>
<string name="no">ניין</string>
<string name="welcome_image_tulip">טולפאן</string>
<string name="cancel">אַנולירן</string>
<string name="navigation_drawer_open">אפֿן</string>
<string name="navigation_drawer_close">שליסן</string>
<string name="navigation_item_home">היים</string>
<string name="navigation_item_upload">אַרויפֿלאָדן</string>
<string name="navigation_item_nearby">דערבײ</string>
<string name="navigation_item_about">וועגן</string>
<string name="navigation_item_settings">איינשטעלונגען</string>
<string name="navigation_item_feedback">פֿידבעק</string>
<string name="navigation_item_logout">אַרויסלאָגירן</string>
</resources>

View file

@ -14,7 +14,7 @@
<string name="authentication_failed">Wurung otèntifikasi!</string>
<string name="uploading_started">Wiwit ngunggah!</string>
<string name="upload_completed_notification_title">%1$s kaunggah!</string>
<string name="upload_completed_notification_text">Dudulana kanggo ndeleng sing kokunggah</string>
<string name="upload_completed_notification_text">Dudul saperlu ndeleng unggahané panjenengan</string>
<string name="upload_progress_notification_title_start">Wiwit nguggah %1$s</string>
<string name="upload_progress_notification_title_in_progress">Ngunggah %1$s</string>
<string name="upload_progress_notification_title_finishing">Rampung ngunggah %1$s</string>
@ -73,6 +73,9 @@
<string name="title_activity_settings">Setèlan</string>
<string name="title_activity_signup">Ndhaftar</string>
<string name="menu_about">Ngenani</string>
<string name="about_improve">&lt;a href=\"https://github.com/commons-app/apps-android-commons\"&gt;Sumber&lt;/a&gt; lan &lt;a href=\"https://commons-app.github.io/\"&gt;situs jaringan&lt;/a&gt; ing GitHub. Gawé anyar &lt;a href=\"https://github.com/commons-app/apps-android-commons/issues\"&gt;bab GitHub&lt;/a&gt; ngenani lapuran ama lan saran.</string>
<string name="about_privacy_policy">&lt;a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\"&gt;Pranatan priangga&lt;/a&gt;</string>
<string name="about_credits">&lt;a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\"&gt;Krèdhit&lt;/a&gt;</string>
<string name="title_activity_about">Ngenani</string>
<string name="menu_feedback">Kirim Pamrayoga (lumantar Layang-Èl)</string>
<string name="no_email_client">Ora ana klièn layang-èl sing dipasang</string>
@ -163,5 +166,5 @@
<string name="navigation_item_feedback">Pamrayoga</string>
<string name="navigation_item_logout">Metu log</string>
<string name="nearby_info_menu_commons_article">Artikel Commons</string>
<string name="nearby_info_menu_wikidata_article" fuzzy="true">Artikel WikiData</string>
<string name="nearby_info_menu_wikidata_article">Wiji Wikidata</string>
</resources>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="crash_dialog_title">ვიკისაწყობი გაითიშა</string>
<string name="crash_dialog_text">ვაი. რაღაც მოხდა!</string>
<string name="crash_dialog_comment_prompt">გვითხარით რას აკეთებდით და გამოგვიგზავნეთ ელექტრონული ფოსტით. ეს ჩვენ პრობლემის გამოსწორებაში დაგვეხმარება!</string>
<string name="crash_dialog_ok_toast">გმადლობთ!</string>
</resources>

View file

@ -20,31 +20,72 @@
<string name="upload_progress_notification_title_finishing">ატვირთვის დასრულება %1$</string>
<string name="upload_failed_notification_title">%1$ ატვირთვა ვერ მოხერხდა</string>
<string name="upload_failed_notification_subtitle">დააჭირეთ სანახავად</string>
<string name="title_activity_contributions" fuzzy="true">ჩემი ატვირთვები</string>
<plurals name="uploads_pending_notification_indicator">
<item quantity="one">%d ფაილი იტვირთება</item>
<item quantity="other">%d ფაილი იტვირთება</item>
</plurals>
<string name="title_activity_contributions">ჩემი ბოლო ატვირთვები</string>
<string name="contribution_state_queued">რიგი</string>
<string name="contribution_state_failed">ვერ მოხერხდა</string>
<string name="contribution_state_in_progress">%1$d%% დასრულდა</string>
<string name="contribution_state_starting">იტვირთება</string>
<string name="menu_from_gallery">გალერეიდან</string>
<string name="menu_from_camera">ფოტოს გადაღება</string>
<string name="menu_nearby">ახლოს</string>
<string name="provider_contributions">ჩემი ატვირთვები</string>
<string name="menu_share">გაზიარება</string>
<string name="menu_open_in_browser">ბრაუზერში გახსნა</string>
<string name="share_title_hint">სათაური</string>
<string name="share_description_hint">აღწერა</string>
<string name="login_failed_network">შესვლა ვერ ხერხდება - ქსელის შეცდომა</string>
<string name="login_failed_username">შესვლა ვერ ხერხდება - გთხოვთ შეამოწმოთ სახელი</string>
<string name="login_failed_password">შესვლა ვერ ხერხდება - გთხოვთ შეამოწმოთ პაროლი</string>
<string name="login_failed_throttled">ძალიან ბევრი წარუმატებელი მცდელობა. გთხოვთ, რამდენიმე წუთში სცადეთ კვლავ.</string>
<string name="login_failed_blocked">უკაცრავად, ეს მომხმარებელი დაბლოკილია ვიკისაწყობში</string>
<string name="login_failed_2fa_needed">თქვენ უნდა შეიყვანოთ ორფაქტორიანი ავტორიზაციის კოდი.</string>
<string name="login_failed_generic">შესვლა ვერ მოხერხდა</string>
<string name="share_upload_button">ატვირთვა</string>
<string name="multiple_share_base_title">სერიის სახელი</string>
<string name="provider_modifications">მოდიფიკაციები</string>
<string name="menu_upload_single">ატვირთვა</string>
<string name="categories_search_text_hint">კატეგორიის არჩევა</string>
<string name="menu_save_categories">შენახვა</string>
<string name="refresh_button">განახლება</string>
<string name="gps_disabled">თქვენ მოწყობილობაზე GPS გამორთულია. ნამდვილად გსურთ ჩართვა?</string>
<string name="enable_gps">GPS-ის ჩართვა</string>
<string name="contributions_subtitle_zero">ატვირთვები არ არის</string>
<plurals name="contributions_subtitle">
<item quantity="zero">\@string/contributions_subtitle_zero</item>
<item quantity="one">%d ატვირთვა</item>
<item quantity="other">%d ატვირთვა</item>
</plurals>
<plurals name="starting_multiple_uploads">
<item quantity="one">იწყება %d ატვირთვა</item>
<item quantity="other">იწყება %d ატვირთვა</item>
</plurals>
<plurals name="multiple_uploads_title">
<item quantity="one">%d ატვირთვა</item>
<item quantity="other">%d ატვირთვა</item>
</plurals>
<string name="categories_activity_title">კატეგორია</string>
<string name="title_activity_settings">კონფიგურაცია</string>
<string name="title_activity_signup">რეგისტრაცია</string>
<string name="menu_about">პროგრამის შესახებ</string>
<string name="about_license">ღია კოდის მქონე აპლიკაცია, ვრცელდება ლიცენზიით &lt;a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\"&gt;Apache License v2&lt;/a&gt;. ვიკისაწყობი და მისი ლოგო ფონდი ვიკიმედიის სავაჭრო ნიშნებია და ფონდი ვიკიმედიის ნებართვით გამოიყენება. ჩვენ არ ვართ დაკავშირებული ფონდ ვიკიმედიასთან.</string>
<string name="about_improve">&lt;a href=\"https://github.com/commons-app/apps-android-commons\"&gt;წყარო&lt;/a&gt; და &lt;a href=\"https://commons-app.github.io/\"&gt;საიტი&lt;/a&gt; GitHub-ზე. შეცდომის შესატყობინებლად ან წინადადებისათვის შექმენით ახალი &lt;a href=\"https://github.com/commons-app/apps-android-commons/issues\"&gt;მოთხოვნა GitHub-ზე&lt;/a&gt;.</string>
<string name="about_privacy_policy">&lt;a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\"&gt;კონფიდენციალურობის პოლიტიკა&lt;/a&gt;</string>
<string name="about_credits">&lt;a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\"&gt;მადლობები&lt;/a&gt;</string>
<string name="title_activity_about">პროგრამის შესახებ</string>
<string name="menu_feedback">გამოხმაურების გაგზავნა (ელ.ფოსტით)</string>
<string name="waiting_first_sync">პირველი სინქრონიზაციის მოლოდინი…</string>
<string name="no_uploads_yet">თქვენ ჯერ არცერთი ფოტო არ აგიტვირთავთ.</string>
<string name="menu_retry_upload">გამეორება</string>
<string name="menu_cancel_upload">გაუქმება</string>
<string name="share_license_summary">ეს სურათი გავრცელდება %1$s ლიცენზიით</string>
<string name="menu_download">ჩამოტვირთვა</string>
<string name="preference_license">ლიცენზია</string>
<string name="use_previous">წინა სათაურის/აღწერის გამოყენება</string>
<string name="allow_gps">ამჟამინდელი მდებარეობის ავტომატური მიღება</string>
<string name="preference_theme">ღამის რეჟიმი</string>
<string name="preference_theme_summary">მუქი თემის გამოყენება</string>
<string name="license_name_cc_by_sa_four"> Attribution-ShareAlike 4.0</string>
@ -67,20 +108,68 @@
<string name="license_name_cc_by_sa_4_0">CC BY-SA 4.0</string>
<string name="license_name_cc_by_4_0">CC BY 4.0</string>
<string name="license_name_cc_zero">CC Zero</string>
<string name="tutorial_2_text">გთხოვთ ატვირთოთ, მხოლოდ თქვენ მიერ გადაღებული ან შექმნილი სურათები:</string>
<string name="tutorial_2_subtext">- ბუნებრივი ობიექტები (ყვავილები, ცხოველები, მთები)\n- სასარგებლო ობიექტები (ველოსიპედები, მატარებლის სადგურები)\n- ცნობილი ადამიანები (თქვენი მერი, ოლიმპიელი სპორტსმენები რომელთაც შეხვედრიხართ)</string>
<string name="tutorial_3_text">გთხოვთ არ ატვირთოთ:</string>
<string name="tutorial_3_subtext">- სელფი ან მეგობრების სურათები\n- ინტერნეტიდან ჩამოტვირთული ფოტოები\n- არათავისუფალი აპლიკაციების სკრინშოტები</string>
<string name="tutorial_4_text">ატვირთვის ნიმუში:</string>
<string name="tutorial_4_subtext">- სათაური: სიდნეის ოპერის თეატრი\n- აღწერა: სიდნეის ოპერის თეატრის ხედი უბიდან\n- კატეგორიები: Sydney Opera House, Sydney Opera House from the west, Sydney Opera House remote views</string>
<string name="welcome_wikipedia_text">ატვირთეთ თქვენი ფოტოები. დაეხმარეთ ვიკიპედიის სტატიებს გაცოცხლებაში!</string>
<string name="welcome_wikipedia_subtext">ვიკიპედიის ფოტოები ვიკისაწყობში ინახება.</string>
<string name="welcome_copyright_text">თქვენი სურათები ხალხის განათლებას ეხმარება მთელ მსოფლიოში.</string>
<string name="welcome_final_button_text">დიახ!</string>
<string name="detail_panel_cats_label">კატეგორიები</string>
<string name="detail_panel_cats_loading">იტვირთება…</string>
<string name="detail_panel_cats_none">არჩეული არაფერია</string>
<string name="detail_description_empty">არ არის აღწერა</string>
<string name="detail_license_empty">უცნობი ლიცენზია</string>
<string name="menu_refresh">განახლება</string>
<string name="ok">კარგი</string>
<string name="title_activity_nearby">ახლომდებარე ადგილები</string>
<string name="no_nearby">ახლომდებარე ადგილები ვერ მოიძებნა</string>
<string name="warning">გაფრთხილება</string>
<string name="yes">დიახ</string>
<string name="no">არა</string>
<string name="media_detail_title">სათაური</string>
<string name="media_detail_media_title">მედიაფაილის სათაური</string>
<string name="media_detail_description">აღწერა</string>
<string name="media_detail_uploaded_date">ატვირთვის თარიღი</string>
<string name="become_a_tester_title">ბეტა ტესტირებაში მონაწილეობა</string>
<string name="use_wikidata">ვიკიმონაცემების გამოყენება</string>
<string name="_2fa_code">2ფა კოდი</string>
<string name="number_of_uploads">ჩემი ბოლო ატვირთვების ლიმიტი</string>
<string name="maximum_limit">მაქსიმალური ლიმიტი</string>
<string name="maximum_limit_alert">500-ზე მეტის ჩვენება შეუძლებელია</string>
<string name="set_limit">ბოლო ატვირთვების ლიმიტის დაყენება</string>
<string name="login_failed_2fa_not_supported">ორფაქტორიანი ავტორიზაცია ამჟამად მიუწვდომელია.</string>
<string name="logout_verification">ნამდვილად გსურთ გასვლა?</string>
<string name="commons_logo">ვიკისაწყობის ლოგო</string>
<string name="background_image">ფონური სურათი</string>
<string name="mediaimage_failed">მედიაგამოსახულების შეცდომა</string>
<string name="no_image_found">სურათი ვერ მოიძებნა</string>
<string name="upload_image">სურათის ატვირთვა</string>
<string name="welcome_image_mount_zao">ზაოს მთა</string>
<string name="welcome_image_llamas">ლამები</string>
<string name="welcome_image_rainbow_bridge">ცისარტყელის ხიდი</string>
<string name="welcome_image_tulip">ტიტა</string>
<string name="welcome_image_no_selfies">არა სელფი</string>
<string name="welcome_image_proprietary">არათავისუფალი სურათი</string>
<string name="welcome_image_welcome_wikipedia">მოგესალმებით ვიკიპედიაში</string>
<string name="welcome_image_welcome_copyright">მოგესალმებით — საავტორო უფლებები</string>
<string name="welcome_image_sydney_opera_house">სიდნეის ოპერის თეატრი</string>
<string name="cancel">გაუქმება</string>
<string name="navigation_drawer_open">გახსნა</string>
<string name="navigation_drawer_close">დახურვა</string>
<string name="navigation_item_home">მთავარი</string>
<string name="navigation_item_upload">ატვირთვა</string>
<string name="navigation_item_nearby">ახლოს</string>
<string name="navigation_item_about">პროგრამის შესახებ</string>
<string name="navigation_item_settings">კონფიგურაცია</string>
<string name="navigation_item_feedback">გამოხმაურება</string>
<string name="navigation_item_logout">გასვლა</string>
<string name="navigation_item_info">სახელმძღვანელო</string>
<string name="nearby_needs_permissions">ახლომდებარე ადგილების ჩვენება მდებარეობის განსაზღვრის ნებართვის გარეშე შეუძლებელია</string>
<string name="no_description_found">აღწერა ვერ მოიძებნა</string>
<string name="nearby_info_menu_commons_article">ვიკისაწყობის სტატია</string>
<string name="nearby_info_menu_wikidata_article">ვიკიმონაცემების ელემენტი</string>
</resources>

View file

@ -54,8 +54,8 @@
<string name="gps_disabled">장치에서 GPS가 꺼져 있습니다. 켜시겠습니까?</string>
<string name="enable_gps">GPS 사용</string>
<string name="contributions_subtitle_zero">아직 올린 항목이 없습니다</string>
<plurals name="contributions_subtitle" fuzzy="true">
<item quantity="zero">아직 업로드 없음</item>
<plurals name="contributions_subtitle">
<item quantity="zero">\@string/contributions_subtitle_zero</item>
<item quantity="one">1개 업로드</item>
<item quantity="other">%d개 업로드</item>
</plurals>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" fuzzy="true">Wikimedija Commons</string>
<string name="app_name">Commons</string>
<string name="menu_settings">Iestatījumi</string>
<string name="username">Lietotājvārds</string>
<string name="password">Parole</string>
@ -16,7 +16,7 @@
<string name="upload_progress_notification_title_start">Uzsāk %1$s augšupielādi</string>
<string name="upload_progress_notification_title_in_progress">%1$s augšupielādēti</string>
<string name="upload_progress_notification_title_finishing">Pabeidz %1$s augšupielādi</string>
<string name="title_activity_contributions" fuzzy="true">Manas augsupielades</string>
<string name="title_activity_contributions">Manas nesenās augšupielādes</string>
<string name="contribution_state_queued">Rindā iekļauts</string>
<string name="contribution_state_failed">Neizdevās</string>
<string name="contribution_state_in_progress">%1$d%% pabeigti</string>

View file

@ -185,7 +185,8 @@
<string name="navigation_item_feedback">Мислења</string>
<string name="navigation_item_logout">Одјава</string>
<string name="navigation_item_info">Упатства</string>
<string name="nearby_needs_permissions">Местата во близина не можат да се прикажат без дозволи за местоположба.</string>
<string name="no_description_found">не најдов описи</string>
<string name="nearby_info_menu_commons_article">Статија на Ризницата</string>
<string name="nearby_info_menu_wikidata_article" fuzzy="true">Статија на Википодатоците</string>
<string name="nearby_info_menu_wikidata_article">Предмет на Википодатоците</string>
</resources>

View file

@ -54,17 +54,17 @@
<string name="gps_disabled">GPS er slått av på denne enheten. Ønsker du å slå den på?</string>
<string name="enable_gps">Slå på GPS</string>
<string name="contributions_subtitle_zero">Ingen opplastinger ennå</string>
<plurals name="contributions_subtitle" fuzzy="true">
<item quantity="zero">Ingen opplastinger enda</item>
<item quantity="one">1 opplasting</item>
<plurals name="contributions_subtitle">
<item quantity="zero">\@string/contributions_subtitle_zero</item>
<item quantity="one">%d opplasting</item>
<item quantity="other">%d opplastinger</item>
</plurals>
<plurals name="starting_multiple_uploads" fuzzy="true">
<item quantity="one">Starter 1 opplasting</item>
<plurals name="starting_multiple_uploads">
<item quantity="one">Starter %d opplasting</item>
<item quantity="other">Starter %d opplastinger</item>
</plurals>
<plurals name="multiple_uploads_title" fuzzy="true">
<item quantity="one">1 opplasting</item>
<plurals name="multiple_uploads_title">
<item quantity="one">%d opplasting</item>
<item quantity="other">%d opplastinger</item>
</plurals>
<string name="categories_not_found">Ingen kategorier som stemte overens med %1$s funnet</string>
@ -78,7 +78,7 @@
<string name="about_license">Programvare med åpen kildekode sluppet under &lt;a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\"&gt;Apache License v2&lt;/a&gt;. Wikimedia Commons og dets logo er varemerker fra Wikimedia Foundation og brukes med tillatelse fra dem. Vi er verken støttet av eller koblet til Wikimedia Foundation.</string>
<string name="about_improve">&lt;a href=\"https://github.com/commons-app/apps-android-commons\"&gt;Kildekode&lt;/a&gt; og &lt;a href=\"https://commons-app.github.io/\"&gt;nettside&lt;/a&gt; på GitHub. Opprett en ny &lt;a href=\"https://github.com/commons-app/apps-android-commons/issues\"&gt;GitHub-sak&lt;/a&gt; for feilrapporter og forslag.</string>
<string name="about_privacy_policy">&lt;a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\"&gt;Personvernpolicy&lt;/a&gt;</string>
<string name="about_credits" fuzzy="true">&lt;a href=\"https://github.com/commons-app/apps-android-comons/blob/master/CREDITS\"&gt;CREDITS&lt;/a&gt;</string>
<string name="about_credits">&lt;a href=\"https://github.com/commons-app/apps-android-comons/blob/master/CREDITS\"&gt;Bidragsytere&lt;/a&gt;</string>
<string name="title_activity_about">Om</string>
<string name="menu_feedback">Send tilbakemelding (via Epost)</string>
<string name="no_email_client">Ingen epostklient installert</string>
@ -154,4 +154,39 @@
<string name="use_wikidata">Bruk Wikidata</string>
<string name="use_wikidata_summary">(Advarsel: Store mengder mobildata kan bli brukt om denne slås av)</string>
<string name="_2fa_code">2FA-kode</string>
<string name="number_of_uploads">Grense for mine seneste opplastinger</string>
<string name="maximum_limit">Maksimumsgrense</string>
<string name="maximum_limit_alert">Kan ikke vise mer enn 500</string>
<string name="set_limit">Sett grense for seneste opplastinger</string>
<string name="login_failed_2fa_not_supported">Tofaktorautentisering støttes ikke ennå.</string>
<string name="logout_verification">Ønsker du virkelig å logge ut?</string>
<string name="commons_logo">Commons-logo</string>
<string name="background_image">Bakgrunnsbilde</string>
<string name="mediaimage_failed">Mediebilde feilet</string>
<string name="no_image_found">Intet bilde funnet</string>
<string name="upload_image">Last opp bilde</string>
<string name="welcome_image_mount_zao">Zao</string>
<string name="welcome_image_llamas">Lamaer</string>
<string name="welcome_image_rainbow_bridge">Regnbuebrua</string>
<string name="welcome_image_tulip">Tulipan</string>
<string name="welcome_image_no_selfies">Ingen selfier</string>
<string name="welcome_image_proprietary">Proprietært bilde</string>
<string name="welcome_image_welcome_wikipedia">Velkommen til Wikipedia</string>
<string name="welcome_image_welcome_copyright">Velkommen opphavsrett</string>
<string name="welcome_image_sydney_opera_house">Operahuset i Sydney</string>
<string name="cancel">Avbryt</string>
<string name="navigation_drawer_open">Åpne</string>
<string name="navigation_drawer_close">Lukk</string>
<string name="navigation_item_home">Hjem</string>
<string name="navigation_item_upload">Last opp</string>
<string name="navigation_item_nearby">I nærheten</string>
<string name="navigation_item_about">Om</string>
<string name="navigation_item_settings">Innstillinger</string>
<string name="navigation_item_feedback">Tilbakemeldinger</string>
<string name="navigation_item_logout">Logg ut</string>
<string name="navigation_item_info">Veiviser</string>
<string name="nearby_needs_permissions">Steder i nærheten kan ikke vises uten tillatelse for stedsbestemmelse</string>
<string name="no_description_found">ingen beskrivelse funnet</string>
<string name="nearby_info_menu_commons_article">Commons-artikkel</string>
<string name="nearby_info_menu_wikidata_article">Wikidata-element</string>
</resources>

View file

@ -162,4 +162,5 @@
<string name="navigation_item_feedback">Opinie</string>
<string name="navigation_item_logout">Wyloguj</string>
<string name="navigation_item_info">Samouczek</string>
<string name="nearby_info_menu_wikidata_article">Element Wikidanych</string>
</resources>

View file

@ -185,7 +185,8 @@
<string name="navigation_item_feedback">Sugeriment</string>
<string name="navigation_item_logout">Seurte dal sistema</string>
<string name="navigation_item_info">Cors d\'antrodussion</string>
<string name="nearby_needs_permissions">Ij pòst ant j\'anviron a peulo nen esse smonù sensa ij përmess ëd localisassion</string>
<string name="no_description_found">gnun-a descrission trovà</string>
<string name="nearby_info_menu_commons_article">Artìcol ëd Comun</string>
<string name="nearby_info_menu_wikidata_article" fuzzy="true">Artìcol ëd WikiData</string>
<string name="nearby_info_menu_wikidata_article">Element ëd WikiData</string>
</resources>

View file

@ -7,7 +7,7 @@
<string name="login">Autentificare</string>
<string name="signup">Înregistrare</string>
<string name="logging_in_title">Se conectează</string>
<string name="logging_in_message">Așteptați…</string>
<string name="logging_in_message">Vă rugăm să așteptați ...</string>
<string name="login_success">Autentificare reușită!</string>
<string name="login_failed">Autentificare nereușită!</string>
<string name="upload_failed">Fișierul nu a fost găsit. Încercați cu un alt fișier.</string>

View file

@ -166,12 +166,17 @@
<string name="logout_verification">Вы действительно хотите выйти?</string>
<string name="commons_logo">Логотип Викисклада</string>
<string name="background_image">Фоновое изображение</string>
<string name="mediaimage_failed">Ошибка медиаизображения</string>
<string name="no_image_found">Изображение не найдено</string>
<string name="upload_image">Загрузить изображение</string>
<string name="welcome_image_mount_zao">Гора Зао</string>
<string name="welcome_image_llamas">Ламы</string>
<string name="welcome_image_rainbow_bridge">Радужный мост</string>
<string name="welcome_image_tulip">Тюльпан</string>
<string name="welcome_image_no_selfies">Нет сэлфи</string>
<string name="welcome_image_proprietary">Несвободное изображение</string>
<string name="welcome_image_welcome_wikipedia">Добро пожаловать в Википедию</string>
<string name="welcome_image_welcome_copyright">Добро пожаловать — авторские права</string>
<string name="welcome_image_sydney_opera_house">Сиднейский оперный театр</string>
<string name="cancel">Отмена</string>
<string name="navigation_drawer_open">Открыть</string>
@ -184,7 +189,8 @@
<string name="navigation_item_feedback">Обратная связь</string>
<string name="navigation_item_logout">Выйти</string>
<string name="navigation_item_info">Руководство</string>
<string name="nearby_needs_permissions">Ближайшие места не могут быть отображены без разрешения на геолокацию</string>
<string name="no_description_found">описание не найдено</string>
<string name="nearby_info_menu_commons_article">Статья на Викискладе</string>
<string name="nearby_info_menu_wikidata_article" fuzzy="true">Статья на Викиданных</string>
<string name="nearby_info_menu_wikidata_article">Элемент Викиданных</string>
</resources>

View file

@ -7,7 +7,7 @@
<string name="login">Asup log</string>
<string name="signup">Daptar</string>
<string name="logging_in_title">Asup log</string>
<string name="logging_in_message">Mangga diantos</string>
<string name="logging_in_message">Tungguan heula</string>
<string name="login_success">Asup log suksés!</string>
<string name="login_failed">Asup log Gagal!</string>
<string name="upload_failed">Berkas teu kapanggih. Coba berkas séjén.</string>
@ -20,11 +20,11 @@
<string name="upload_progress_notification_title_finishing">Méréskeun unjalan %1$s</string>
<string name="upload_failed_notification_title">Ngunjal %1$s gagal</string>
<string name="upload_failed_notification_subtitle">Toél pikeun nempo</string>
<plurals name="uploads_pending_notification_indicator" fuzzy="true">
<item quantity="one">ngunjal 1 berkas</item>
<plurals name="uploads_pending_notification_indicator">
<item quantity="one">ngunjal %d berkas</item>
<item quantity="other">ngunjal %d berkas</item>
</plurals>
<string name="title_activity_contributions" fuzzy="true">Unjalan kuring</string>
<string name="title_activity_contributions">Unjalan panungtung kuring</string>
<string name="contribution_state_queued">Antrian</string>
<string name="contribution_state_failed">Gagal</string>
<string name="contribution_state_in_progress">%1$d%% bérés</string>
@ -42,7 +42,7 @@
<string name="login_failed_password">Teu bisa login - pariksa kecap sandi</string>
<string name="login_failed_throttled">Loba teuing nu gagalna. Mangga cobian sababaraha menit deui mah</string>
<string name="login_failed_blocked">Punten, ieu kontributor geus diblokir di Commons</string>
<string name="login_failed_2fa_needed">Anjeun kudu nyadiakeun dua kode faktor asli</string>
<string name="login_failed_2fa_needed">Anjeun kudu nyayagakeun kodeu oténtikasi dua faktor.</string>
<string name="login_failed_generic">Gagal login</string>
<string name="share_upload_button">Unjal</string>
<string name="multiple_share_base_title">Ngaranan ieu sét</string>
@ -51,19 +51,20 @@
<string name="categories_search_text_hint">Paluruh kategori</string>
<string name="menu_save_categories">Simpen</string>
<string name="refresh_button">Segerkeun</string>
<string name="enable_gps">Teu bisa maké GPS</string>
<string name="gps_disabled">GPS dipareuman na parangkat anjeun. Rék dihurungkeun waé atuh?</string>
<string name="enable_gps">Hirupan GPS</string>
<string name="contributions_subtitle_zero">Can aya nu diunjal</string>
<plurals name="contributions_subtitle" fuzzy="true">
<item quantity="zero">Taya unjalan</item>
<item quantity="one">1 unjalan</item>
<plurals name="contributions_subtitle">
<item quantity="zero">\@string/contributions_subtitle_zero</item>
<item quantity="one">%d unjalan</item>
<item quantity="other">%d unjalan</item>
</plurals>
<plurals name="starting_multiple_uploads" fuzzy="true">
<item quantity="one">Ngamimitian 1 unjalan</item>
<item quantity="other">Ngamimitian %d unggahan</item>
<plurals name="starting_multiple_uploads">
<item quantity="one">Ngamimitian saunjalan</item>
<item quantity="other">Ngamimitian %d unjalan</item>
</plurals>
<plurals name="multiple_uploads_title" fuzzy="true">
<item quantity="one">1 unjalan</item>
<plurals name="multiple_uploads_title">
<item quantity="one">saunjalan</item>
<item quantity="other">%d unjalan</item>
</plurals>
<string name="categories_not_found">Teu mendak kategori anu cocog jeung %1$s</string>
@ -77,7 +78,7 @@
<string name="about_license">Pakakas lemes kodeu nembrak dirilis di handapeun &lt;a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\"&gt;Lisénsi Apache v2&lt;/a&gt;. Wikimedia Commons sarta logona téh mérk dagang anu Yayasan Wikimédia ogé dipakéna kudu meunang widi ti Yayasan Wikimédia. Kami teu disatujuan ku atawa digawé bareng jeung Yayasan Wikimédia.</string>
<string name="about_improve">&lt;a href=\"https://github.com/commons-app/apps-android-commons\"&gt;Sumber&lt;/a&gt; sarta &lt;a href=\"https://commons-app.github.io/\"&gt;situ wéb&lt;/a&gt; dina GitHub. Jieun anyar &lt;a href=\"https://github.com/commons-app/apps-android-commons/issues\"&gt;perkara GitHub&lt;/a&gt; pikeun saran jeung laporan kutu.</string>
<string name="about_privacy_policy">&lt;a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\"&gt;Kawijakan privasi&lt;/a&gt;</string>
<string name="about_credits" fuzzy="true">&lt;a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\"&gt;PANGAJÉN&lt;/a&gt;</string>
<string name="about_credits">&lt;a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\"&gt;Pangajén&lt;/a&gt;</string>
<string name="title_activity_about">Ngeunaan</string>
<string name="menu_feedback">Kirim eupan balik (via Surélék)</string>
<string name="no_email_client">Tanpa klayen surélék kapasang</string>
@ -129,7 +130,7 @@
<string name="welcome_final_text">Anjeun geus ngarti?</string>
<string name="welcome_final_button_text">Enya</string>
<string name="detail_panel_cats_label">Kategori</string>
<string name="detail_panel_cats_loading" fuzzy="true">Keur muat…</string>
<string name="detail_panel_cats_loading">Keur muat…</string>
<string name="detail_panel_cats_none">Taya nu dipilih</string>
<string name="detail_description_empty">Tanpa pedaran</string>
<string name="detail_license_empty">Lisénsi teu dipikanyaho</string>
@ -138,6 +139,7 @@
<string name="location_permission_rationale">Idin pilihan: Paké lokasi kiwari pikeun usulan kategori</string>
<string name="ok">Oké</string>
<string name="title_activity_nearby">Tempat Sabudeureun</string>
<string name="no_nearby">Teu kapanggih tempat sabudeureun</string>
<string name="warning">Mangkahadé</string>
<string name="file_exists">Ieu berkas geus aya di Commons. Rék diteruskeun baé ieu téh?</string>
<string name="yes">Nya</string>
@ -146,13 +148,32 @@
<string name="media_detail_media_title">Judul berkas</string>
<string name="media_detail_description">Déskripsi</string>
<string name="media_detail_description_explanation">Pedaran berkas nyangkaruk didieu. Bisa jadi matak ngalikakeun, sarta ngempladkeun kana sawatara baris. Sanajan kitu, muga bisa katémbong écés.</string>
<string name="media_detail_uploaded_date">Kaping ngunjal</string>
<string name="media_detail_uploaded_date">Tanggal ngunjal</string>
<string name="become_a_tester_title">Jadi tukang ngetés Béta</string>
<string name="become_a_tester_description">Pilihan asup kana saluran béta kami di Google Play sarta meunangkeun aksés munggaran pikeun fitur anyar jeung pameneran kutu</string>
<string name="use_wikidata">Paké Wikidata</string>
<string name="use_wikidata_summary">(Mankahadé: maéhan ieu bisa ngakibatkeun pamakéan data sélulér nu pohara gedéna)</string>
<string name="_2fa_code">Kode 2FA</string>
<string name="maximum_limit">Wates maksimum</string>
<string name="number_of_uploads">Water Unjal Panungtung Kuring</string>
<string name="maximum_limit">Wates Maksimum</string>
<string name="maximum_limit_alert">Teu bisa midangkeun leuwih ti 500</string>
<string name="set_limit">Atur Wates Unjal Panungtung</string>
<string name="login_failed_2fa_not_supported">Oténtikasi dua faktor kiwari teu dirojong.</string>
<string name="logout_verification">Yakin anjeun rék kaluar?</string>
<string name="commons_logo">Logo Commons</string>
<string name="background_image">Gambar Kasang Tukang</string>
<string name="mediaimage_failed">Gambar Média Gagal</string>
<string name="no_image_found">Gambar Teu Kapanggih</string>
<string name="upload_image">Unjal Gambar</string>
<string name="welcome_image_mount_zao">Mount Zao</string>
<string name="welcome_image_llamas">Llamas</string>
<string name="welcome_image_rainbow_bridge">Sasak Katumbiri</string>
<string name="welcome_image_tulip">Tulip</string>
<string name="welcome_image_no_selfies">Tanpa Sélpi</string>
<string name="welcome_image_proprietary">Gambar Komérsial</string>
<string name="welcome_image_welcome_wikipedia">Wilujeng Sumping Wikipédia</string>
<string name="welcome_image_welcome_copyright">Wilujeng Sumping Hak Cipta</string>
<string name="welcome_image_sydney_opera_house">Imah Opérét Sydney</string>
<string name="cancel">Bolay</string>
<string name="navigation_drawer_open">Buka</string>
<string name="navigation_drawer_close">Tutup</string>
@ -163,4 +184,9 @@
<string name="navigation_item_settings">Pangaturan</string>
<string name="navigation_item_feedback">Eupan balik</string>
<string name="navigation_item_logout">Kaluar</string>
<string name="navigation_item_info">Pituduh</string>
<string name="nearby_needs_permissions">Tempat sabudeureun teu bisa ditémbongkeun tanpa idin lokasi</string>
<string name="no_description_found">teu manggihan pedaran</string>
<string name="nearby_info_menu_commons_article">Artikel Common</string>
<string name="nearby_info_menu_wikidata_article">item Wikidata</string>
</resources>

View file

@ -184,6 +184,9 @@
<string name="navigation_item_settings">Inställningar</string>
<string name="navigation_item_feedback">Återkoppling</string>
<string name="navigation_item_logout">Logga ut</string>
<string name="navigation_item_info">Guide</string>
<string name="nearby_needs_permissions">Platser i närheten kan inte visas utan platsbehörigheter</string>
<string name="no_description_found">ingen beskrivning hittades</string>
<string name="nearby_info_menu_commons_article">Commons-artikel</string>
<string name="nearby_info_menu_wikidata_article" fuzzy="true">WikiData-artikel</string>
<string name="nearby_info_menu_wikidata_article">Wikidata-objekt</string>
</resources>

View file

@ -7,7 +7,7 @@
<string name="login">Увійти</string>
<string name="signup">Зареєструватися</string>
<string name="logging_in_title">Вхід до системи</string>
<string name="logging_in_message" fuzzy="true">Будь ласка, зачекайте…</string>
<string name="logging_in_message">Будь ласка, зачекайте…</string>
<string name="login_success">Ви успішно увійшли!</string>
<string name="login_failed">Не вдалося увійти</string>
<string name="upload_failed">Файл не знайдено. Будь ласка, спробуйте інший файл.</string>
@ -20,13 +20,13 @@
<string name="upload_progress_notification_title_finishing">Завершення завантаження %1$s</string>
<string name="upload_failed_notification_title">Не вдалося завантажити %1$s</string>
<string name="upload_failed_notification_subtitle">Торкніться, щоб переглянути</string>
<plurals name="uploads_pending_notification_indicator" fuzzy="true">
<plurals name="uploads_pending_notification_indicator">
<item quantity="one">Завантажується %d файл</item>
<item quantity="few">Завантажуються %d файли</item>
<item quantity="many">Завантажується %d файлів</item>
<item quantity="other">Завантажується %d файлів</item>
</plurals>
<string name="title_activity_contributions" fuzzy="true">Мої завантаження</string>
<string name="title_activity_contributions">Мої останні завантаження</string>
<string name="contribution_state_queued">У черзі</string>
<string name="contribution_state_failed">Не вдалося</string>
<string name="contribution_state_in_progress">%1$d%% завершено</string>
@ -44,6 +44,7 @@
<string name="login_failed_password">Неможливо увійти — будь ласка, перевірте свій пароль</string>
<string name="login_failed_throttled">Надто багато невдалих спроб. Будь ласка, спробуйте знову через кілька хвилин.</string>
<string name="login_failed_blocked">Вибачте, цього користувача було заблоковано на Вікісховищі</string>
<string name="login_failed_2fa_needed">Ви повинні надати код двофакторної автентифікації.</string>
<string name="login_failed_generic">Не вдалося увійти</string>
<string name="share_upload_button">Завантажити</string>
<string name="multiple_share_base_title">Назвіть цю серію</string>
@ -52,19 +53,26 @@
<string name="categories_search_text_hint">Пошук категорій</string>
<string name="menu_save_categories">Зберегти</string>
<string name="refresh_button">Оновити</string>
<plurals name="contributions_subtitle" fuzzy="true">
<item quantity="zero">Наразі нема завантажень</item>
<item quantity="one">1 завантаження</item>
<string name="gps_disabled">GPS вимкнено на Вашому пристрої. Чи хотіли б Ви його увімкнути?</string>
<string name="enable_gps">Увімкнути GPS</string>
<string name="contributions_subtitle_zero">Ще нема завантажень</string>
<plurals name="contributions_subtitle">
<item quantity="zero">\@string/contributions_subtitle_zero</item>
<item quantity="one">%d завантаження</item>
<item quantity="few">%d завантаження</item>
<item quantity="many">%d завантажень</item>
<item quantity="other">%d завантажень</item>
</plurals>
<plurals name="starting_multiple_uploads" fuzzy="true">
<item quantity="one">Розпочати 1 завантаження</item>
<item quantity="few">Розпочати %d завантаження</item>
<item quantity="other">Розпочати %d завантажень</item>
<plurals name="starting_multiple_uploads">
<item quantity="one">Починається %d завантаження</item>
<item quantity="few">Починаються %d завантаження</item>
<item quantity="many">Починаються %d завантажень</item>
<item quantity="other">Починаються %d завантажень</item>
</plurals>
<plurals name="multiple_uploads_title" fuzzy="true">
<item quantity="one">1 завантаження</item>
<plurals name="multiple_uploads_title">
<item quantity="one">%d завантаження</item>
<item quantity="few">%d завантаження</item>
<item quantity="many">%d завантажень</item>
<item quantity="other">%d завантажень</item>
</plurals>
<string name="categories_not_found">Категорій, відповідних %1$s, не знайдено</string>
@ -78,12 +86,12 @@
<string name="about_license">Програмне забезпечення з відкритим кодом випущено під &lt;a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\"&gt;ліцензією Apache в.2&lt;/a&gt;. Вікісховище і його логотип є товарними знаками Фонду Вікімедіа і використовуються за дозволом Фонду Вікімедіа. Ми не користуємось підтримкою Фонду Вікімедіа і не є його афіліатом.</string>
<string name="about_improve">&lt;a href=\"https://github.com/commons-app/apps-android-commons\"&gt;Вихідний код&lt;/a&gt; і &lt;a href=\"https://commons-app.github.io/\"&gt;веб-сайт&lt;/a&gt; на GitHub. Створіть нове &lt;a href=\"https://github.com/commons-app/apps-android-commons/issues\"&gt;завдання на GitHub&lt;/a&gt; для повідомлення про баги або для висловлення пропозицій.</string>
<string name="about_privacy_policy">&lt;a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\"&gt;Політика приватності&lt;/a&gt;</string>
<string name="about_credits" fuzzy="true">&lt;a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\"&gt;АВТОРИ&lt;/a&gt;</string>
<string name="about_credits">&lt;a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\"&gt;Автори&lt;/a&gt;</string>
<string name="title_activity_about">Про програму</string>
<string name="menu_feedback">Надіслати відгук (електронною поштою)</string>
<string name="no_email_client">Не встановлено програми електронної пошти</string>
<string name="provider_categories">Недавно використані категорії</string>
<string name="waiting_first_sync" fuzzy="true">Очікується перша синхронізація…</string>
<string name="waiting_first_sync">Очікується перша синхронізація…</string>
<string name="no_uploads_yet">Ви ще не завантажили жодної світлини.</string>
<string name="menu_retry_upload">Повторити</string>
<string name="menu_cancel_upload">Скасувати</string>
@ -130,7 +138,7 @@
<string name="welcome_final_text">Ви це зрозуміли?</string>
<string name="welcome_final_button_text">Так!</string>
<string name="detail_panel_cats_label">Категорії</string>
<string name="detail_panel_cats_loading" fuzzy="true">Вантажиться…</string>
<string name="detail_panel_cats_loading">Завантаження…</string>
<string name="detail_panel_cats_none">Нічого не обрано</string>
<string name="detail_description_empty">Немає опису</string>
<string name="detail_license_empty">Невідома ліцензія</string>
@ -139,6 +147,7 @@
<string name="location_permission_rationale">Додатковий дозвіл: отримувати поточне розташування для підказок категорій</string>
<string name="ok">Гаразд</string>
<string name="title_activity_nearby">Місця поблизу</string>
<string name="no_nearby">Не знайдено місць поблизу</string>
<string name="warning">Попередження</string>
<string name="file_exists">Цей файл вже існує на Вікісховищі. Ви впевнені, що хочете продовжити?</string>
<string name="yes">Так</string>
@ -147,8 +156,45 @@
<string name="media_detail_media_title">Назва медіафайлу</string>
<string name="media_detail_description">Опис</string>
<string name="media_detail_description_explanation">Сюди потрапляє опис медіафайлу. Він потенційно може бути досить довгим і розтягнутися на декілька рядків. Однак ми сподіваємось, що він виглядатиме гарно.</string>
<string name="media_detail_uploaded_date">Дата завантаження</string>
<string name="become_a_tester_title">Станьте бета-тестером</string>
<string name="become_a_tester_description">Увійдіть на наш бета-канал на Google Play і отримайте ранній доступ до нових функцій та виправлень багів</string>
<string name="use_wikidata">Використати Вікідані</string>
<string name="use_wikidata_summary">(Попередження: вимкнення цього може спричинити використання значного обсягу мобільних даних)</string>
<string name="_2fa_code">Код 2FA</string>
<string name="number_of_uploads">Ліміт моїх останніх завантажень</string>
<string name="maximum_limit">Максимальний ліміт</string>
<string name="maximum_limit_alert">Неможливо показати понад 500</string>
<string name="set_limit">Встановити ліміт останніх завантажень</string>
<string name="login_failed_2fa_not_supported">Двофакторна автентифікація наразі не підтримується.</string>
<string name="logout_verification">Ви справді хочете вийти із системи?</string>
<string name="commons_logo">Логотип Вікісховища</string>
<string name="background_image">Фонове зображення</string>
<string name="mediaimage_failed">Помилка медіазображення</string>
<string name="no_image_found">Не знайдено зображення</string>
<string name="upload_image">Завантажити зображення</string>
<string name="welcome_image_mount_zao">Гора Зао</string>
<string name="welcome_image_llamas">Лами</string>
<string name="welcome_image_rainbow_bridge">Веселка</string>
<string name="welcome_image_tulip">Тюльпан</string>
<string name="welcome_image_no_selfies">Жодних селфі</string>
<string name="welcome_image_proprietary">Невільне зображення</string>
<string name="welcome_image_welcome_wikipedia">Ласкаво просимо — Вікіпедія</string>
<string name="welcome_image_welcome_copyright">Ласкаво просимо — авторські права</string>
<string name="welcome_image_sydney_opera_house">Сіднейський оперний театр</string>
<string name="cancel">Скасувати</string>
<string name="navigation_drawer_open">Відкрити</string>
<string name="navigation_drawer_close">Закрити</string>
<string name="navigation_item_home">Головна</string>
<string name="navigation_item_upload">Завантажити</string>
<string name="navigation_item_nearby">Поблизу</string>
<string name="navigation_item_about">Опис</string>
<string name="navigation_item_settings">Налаштування</string>
<string name="navigation_item_feedback">Зворотний зв\'язок</string>
<string name="navigation_item_logout">Вийти</string>
<string name="navigation_item_info">Посібник</string>
<string name="nearby_needs_permissions">Місця поблизу неможливо показати без дозволу на визначення місця розташування.</string>
<string name="no_description_found">опис не знайдено</string>
<string name="nearby_info_menu_commons_article">Стаття на Вікісховищі</string>
<string name="nearby_info_menu_wikidata_article">Елемент Вікіданих</string>
</resources>

View file

@ -185,7 +185,8 @@
<string name="navigation_item_feedback">意見回饋</string>
<string name="navigation_item_logout">登出</string>
<string name="navigation_item_info">教程</string>
<string name="nearby_needs_permissions">附近地點需要位置權限才可顯示</string>
<string name="no_description_found">找不到描述</string>
<string name="nearby_info_menu_commons_article">共享資源條目</string>
<string name="nearby_info_menu_wikidata_article" fuzzy="true">維基數據條</string>
<string name="nearby_info_menu_wikidata_article">維基數據項</string>
</resources>

View file

@ -185,6 +185,7 @@
<string name="navigation_item_feedback">反馈</string>
<string name="navigation_item_logout">退出</string>
<string name="navigation_item_info">教程</string>
<string name="nearby_needs_permissions">附近地点不能在没有位置权限的情况下显示</string>
<string name="no_description_found">找不到描述</string>
<string name="nearby_info_menu_commons_article">共享资源条目</string>
<string name="nearby_info_menu_wikidata_article">维基数据项</string>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<cache-path name="images" path="images/" />
</paths>

View file

@ -0,0 +1,40 @@
package fr.free.nrw.commons;
import org.junit.Assert;
import org.junit.Test;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import fr.free.nrw.commons.upload.FileUtils;
import static org.hamcrest.CoreMatchers.is;
public class FileUtilsTest {
@Test public void copiedFileIsIdenticalToSource() throws IOException {
File source = File.createTempFile("temp", "");
File dest = File.createTempFile("temp", "");
writeToFile(source, "Hello, World");
FileUtils.copy(new FileInputStream(source), new FileOutputStream(dest));
Assert.assertThat(getString(dest), is(getString(source)));
}
private static void writeToFile(File file, String s) throws IOException {
BufferedOutputStream buf = new BufferedOutputStream(new FileOutputStream(file));
buf.write(s.getBytes());
buf.close();
}
private static String getString(File file) throws IOException {
int size = (int) file.length();
byte[] bytes = new byte[size];
BufferedInputStream buf = new BufferedInputStream(new FileInputStream(file));
buf.read(bytes, 0, bytes.length);
buf.close();
return new String(bytes);
}
}