Merge remote-tracking branch 'refs/remotes/commons-app/master'
|
|
@ -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()));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 864 B |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 398 KiB After Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 28 KiB |
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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">S’està 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">Sí</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 s’ha 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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"><a href=\"https://github.com/commons-app/apps-android-commons\">Sumber</a> lan <a href=\"https://commons-app.github.io/\">situs jaringan</a> ing GitHub. Gawé anyar <a href=\"https://github.com/commons-app/apps-android-commons/issues\">bab GitHub</a> ngenani lapuran ama lan saran.</string>
|
||||
<string name="about_privacy_policy"><a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Pranatan priangga</a></string>
|
||||
<string name="about_credits"><a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Krèdhit</a></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>
|
||||
|
|
|
|||
7
app/src/main/res/values-ka/error.xml
Normal 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>
|
||||
|
|
@ -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">ღია კოდის მქონე აპლიკაცია, ვრცელდება ლიცენზიით <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. ვიკისაწყობი და მისი ლოგო ფონდი ვიკიმედიის სავაჭრო ნიშნებია და ფონდი ვიკიმედიის ნებართვით გამოიყენება. ჩვენ არ ვართ დაკავშირებული ფონდ ვიკიმედიასთან.</string>
|
||||
<string name="about_improve"><a href=\"https://github.com/commons-app/apps-android-commons\">წყარო</a> და <a href=\"https://commons-app.github.io/\">საიტი</a> GitHub-ზე. შეცდომის შესატყობინებლად ან წინადადებისათვის შექმენით ახალი <a href=\"https://github.com/commons-app/apps-android-commons/issues\">მოთხოვნა GitHub-ზე</a>.</string>
|
||||
<string name="about_privacy_policy"><a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">კონფიდენციალურობის პოლიტიკა</a></string>
|
||||
<string name="about_credits"><a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">მადლობები</a></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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. 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"><a href=\"https://github.com/commons-app/apps-android-commons\">Kildekode</a> og <a href=\"https://commons-app.github.io/\">nettside</a> på GitHub. Opprett en ny <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-sak</a> for feilrapporter og forslag.</string>
|
||||
<string name="about_privacy_policy"><a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Personvernpolicy</a></string>
|
||||
<string name="about_credits" fuzzy="true"><a href=\"https://github.com/commons-app/apps-android-comons/blob/master/CREDITS\">CREDITS</a></string>
|
||||
<string name="about_credits"><a href=\"https://github.com/commons-app/apps-android-comons/blob/master/CREDITS\">Bidragsytere</a></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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Lisénsi Apache v2</a>. 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"><a href=\"https://github.com/commons-app/apps-android-commons\">Sumber</a> sarta <a href=\"https://commons-app.github.io/\">situ wéb</a> dina GitHub. Jieun anyar <a href=\"https://github.com/commons-app/apps-android-commons/issues\">perkara GitHub</a> pikeun saran jeung laporan kutu.</string>
|
||||
<string name="about_privacy_policy"><a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Kawijakan privasi</a></string>
|
||||
<string name="about_credits" fuzzy="true"><a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">PANGAJÉN</a></string>
|
||||
<string name="about_credits"><a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Pangajén</a></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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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">Програмне забезпечення з відкритим кодом випущено під <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">ліцензією Apache в.2</a>. Вікісховище і його логотип є товарними знаками Фонду Вікімедіа і використовуються за дозволом Фонду Вікімедіа. Ми не користуємось підтримкою Фонду Вікімедіа і не є його афіліатом.</string>
|
||||
<string name="about_improve"><a href=\"https://github.com/commons-app/apps-android-commons\">Вихідний код</a> і <a href=\"https://commons-app.github.io/\">веб-сайт</a> на GitHub. Створіть нове <a href=\"https://github.com/commons-app/apps-android-commons/issues\">завдання на GitHub</a> для повідомлення про баги або для висловлення пропозицій.</string>
|
||||
<string name="about_privacy_policy"><a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Політика приватності</a></string>
|
||||
<string name="about_credits" fuzzy="true"><a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">АВТОРИ</a></string>
|
||||
<string name="about_credits"><a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Автори</a></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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
4
app/src/main/res/xml/provider_paths.xml
Normal 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>
|
||||
40
app/src/test/java/fr/free/nrw/commons/FileUtilsTest.java
Normal 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);
|
||||
}
|
||||
}
|
||||