mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-26 20:33:53 +01:00
Merge remote-tracking branch 'refs/remotes/commons-app/master'
This commit is contained in:
commit
284ee31644
55 changed files with 953 additions and 250 deletions
|
|
@ -22,9 +22,14 @@ before_script:
|
|||
- emulator -avd test -no-audio -no-window &
|
||||
- android-wait-for-emulator
|
||||
script:
|
||||
- ./gradlew test connectedAndroidTest -stacktrace
|
||||
- ./gradlew check connectedCheck jacocoTestReport -stacktrace
|
||||
after_success:
|
||||
- bash <(curl -s https://codecov.io/bash)
|
||||
after_failure:
|
||||
- echo '*** Connected Test Rsults ***'
|
||||
- w3m -dump ${TRAVIS_BUILD_DIR}/app/build/reports/androidTests/connected/*Test.html
|
||||
- echo '*** Lint Results ***'
|
||||
- cat ${TRAVIS_BUILD_DIR}/app/build/reports/lint-results.xml
|
||||
jdk:
|
||||
# - openjdk8 # not yet available
|
||||
- oraclejdk8
|
||||
|
|
|
|||
8
CREDITS
8
CREDITS
|
|
@ -19,9 +19,17 @@ their contribution to the product.
|
|||
* Veyndan Stuart
|
||||
* Vivek Maskara
|
||||
* Neslihan Turan
|
||||
* Wikimedia Czech Republic (host for the Prague pre-hackathon 2017)
|
||||
* Dinu Kumarasiri
|
||||
* Dmitry Brant
|
||||
* Adam Shorland
|
||||
* John Lubbock
|
||||
|
||||
3rd party open source libraries used:
|
||||
* Butterknife
|
||||
* GSON
|
||||
* Timber
|
||||
* MapBox
|
||||
|
||||
3rd party open source apps from which significant code has been reused:
|
||||
* Android Wikipedia app https://github.com/wikimedia/apps-android-wikipedia
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'jacoco-android'
|
||||
apply from: 'quality.gradle'
|
||||
|
||||
dependencies {
|
||||
|
|
@ -53,6 +54,9 @@ android {
|
|||
minifyEnabled false // See https://stackoverflow.com/questions/40232404/google-play-apk-and-android-studio-apk-usb-debug-behaving-differently - proguard.cfg modification alone insufficient.
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
|
||||
}
|
||||
debug {
|
||||
testCoverageEnabled true
|
||||
}
|
||||
}
|
||||
|
||||
lintOptions {
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ public class NearbyControllerTest {
|
|||
}
|
||||
|
||||
@Test public void testNullAttractions() {
|
||||
LatLng location = new LatLng(0, 0);
|
||||
LatLng location = new LatLng(0, 0, 0);
|
||||
|
||||
List<NearbyBaseMarker> options =
|
||||
NearbyController.loadAttractionsFromLocationToBaseMarkerOptions(
|
||||
|
|
@ -42,7 +42,7 @@ public class NearbyControllerTest {
|
|||
}
|
||||
|
||||
@Test public void testEmptyList() {
|
||||
LatLng location = new LatLng(0, 0);
|
||||
LatLng location = new LatLng(0, 0, 0);
|
||||
List<Place> emptyList = new ArrayList<>();
|
||||
|
||||
List<NearbyBaseMarker> options =
|
||||
|
|
|
|||
|
|
@ -262,7 +262,7 @@ public class MediaDataExtractor {
|
|||
NodeList childNodes = parentNode.getChildNodes();
|
||||
double latitudeText = Double.parseDouble(childNodes.item(1).getTextContent());
|
||||
double longitudeText = Double.parseDouble(childNodes.item(2).getTextContent());
|
||||
LatLng coordinates = new LatLng(latitudeText, longitudeText);
|
||||
LatLng coordinates = new LatLng(latitudeText, longitudeText, 0);
|
||||
|
||||
return coordinates.getPrettyCoordinateString();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,10 @@ package fr.free.nrw.commons;
|
|||
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.text.Html;
|
||||
import android.text.Spanned;
|
||||
|
||||
import fr.free.nrw.commons.settings.Prefs;
|
||||
import timber.log.Timber;
|
||||
|
|
@ -78,6 +81,19 @@ public class Utils {
|
|||
}
|
||||
}
|
||||
|
||||
/** Fix Html.fromHtml is deprecated problem
|
||||
* @param source provided Html string
|
||||
* @return returned Spanned of appropriate method according to version check
|
||||
* */
|
||||
public static Spanned fromHtml(String source) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
return Html.fromHtml(source, Html.FROM_HTML_MODE_LEGACY);
|
||||
} else {
|
||||
//noinspection deprecation
|
||||
return Html.fromHtml(source);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Strips localization symbols from a string.
|
||||
* Removes the suffix after "@" and quotes.
|
||||
|
|
|
|||
|
|
@ -30,9 +30,10 @@ public class LoginActivity extends AccountAuthenticatorActivity {
|
|||
|
||||
private Button loginButton;
|
||||
private EditText usernameEdit;
|
||||
EditText passwordEdit;
|
||||
EditText twoFactorEdit;
|
||||
private EditText passwordEdit;
|
||||
private EditText twoFactorEdit;
|
||||
ProgressDialog progressDialog;
|
||||
private LoginTextWatcher textWatcher = new LoginTextWatcher();
|
||||
|
||||
private CommonsApplication app;
|
||||
|
||||
|
|
@ -52,10 +53,9 @@ public class LoginActivity extends AccountAuthenticatorActivity {
|
|||
|
||||
prefs = getSharedPreferences("fr.free.nrw.commons", MODE_PRIVATE);
|
||||
|
||||
TextWatcher loginEnabler = newLoginTextWatcher();
|
||||
usernameEdit.addTextChangedListener(loginEnabler);
|
||||
passwordEdit.addTextChangedListener(loginEnabler);
|
||||
twoFactorEdit.addTextChangedListener(loginEnabler);
|
||||
usernameEdit.addTextChangedListener(textWatcher);
|
||||
passwordEdit.addTextChangedListener(textWatcher);
|
||||
twoFactorEdit.addTextChangedListener(textWatcher);
|
||||
passwordEdit.setOnEditorActionListener( newLoginInputActionListener() );
|
||||
|
||||
loginButton.setOnClickListener(new View.OnClickListener() {
|
||||
|
|
@ -72,27 +72,24 @@ public class LoginActivity extends AccountAuthenticatorActivity {
|
|||
});
|
||||
}
|
||||
|
||||
private TextWatcher newLoginTextWatcher() {
|
||||
return new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) { }
|
||||
private class LoginTextWatcher implements TextWatcher {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence charSequence, int start, int count, int after) { }
|
||||
@Override
|
||||
public void onTextChanged(CharSequence charSequence, int start, int count, int after) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable editable) {
|
||||
if(
|
||||
usernameEdit.getText().length() != 0 &&
|
||||
passwordEdit.getText().length() != 0 &&
|
||||
( BuildConfig.DEBUG || twoFactorEdit.getText().length() != 0 || twoFactorEdit.getVisibility() != View.VISIBLE )
|
||||
) {
|
||||
loginButton.setEnabled(true);
|
||||
} else {
|
||||
loginButton.setEnabled(false);
|
||||
}
|
||||
@Override
|
||||
public void afterTextChanged(Editable editable) {
|
||||
if (usernameEdit.getText().length() != 0 && passwordEdit.getText().length() != 0 &&
|
||||
(BuildConfig.DEBUG || twoFactorEdit.getText().length() != 0 || twoFactorEdit.getVisibility() != View.VISIBLE)) {
|
||||
loginButton.setEnabled(true);
|
||||
} else {
|
||||
loginButton.setEnabled(false);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
private TextView.OnEditorActionListener newLoginInputActionListener() {
|
||||
|
|
@ -139,6 +136,9 @@ public class LoginActivity extends AccountAuthenticatorActivity {
|
|||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
usernameEdit.removeTextChangedListener(textWatcher);
|
||||
passwordEdit.removeTextChangedListener(textWatcher);
|
||||
twoFactorEdit.removeTextChangedListener(textWatcher);
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
package fr.free.nrw.commons.category;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.ContentProviderClient;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.SharedPreferences;
|
||||
|
|
@ -58,6 +57,7 @@ public class CategorizationFragment extends Fragment {
|
|||
ProgressBar categoriesSearchInProgress;
|
||||
TextView categoriesNotFoundView;
|
||||
TextView categoriesSkip;
|
||||
private CategoryTextWatcher textWatcher = new CategoryTextWatcher();
|
||||
|
||||
CategoriesAdapter categoriesAdapter;
|
||||
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(2);
|
||||
|
|
@ -442,21 +442,7 @@ public class CategorizationFragment extends Fragment {
|
|||
}
|
||||
});
|
||||
|
||||
categoriesFilter.addTextChangedListener(new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
|
||||
startUpdatingCategoryList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable editable) {
|
||||
|
||||
}
|
||||
});
|
||||
categoriesFilter.addTextChangedListener(textWatcher);
|
||||
|
||||
startUpdatingCategoryList();
|
||||
|
||||
|
|
@ -469,14 +455,6 @@ public class CategorizationFragment extends Fragment {
|
|||
inflater.inflate(R.menu.fragment_categorization, menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setHasOptionsMenu(true);
|
||||
getActivity().setTitle(R.string.categories_activity_title);
|
||||
client = getActivity().getContentResolver().acquireContentProviderClient(CategoryContentProvider.AUTHORITY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
|
|
@ -498,6 +476,12 @@ public class CategorizationFragment extends Fragment {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
categoriesFilter.removeTextChangedListener(textWatcher);
|
||||
super.onDestroyView();
|
||||
}
|
||||
|
||||
public void backButtonDialog() {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||
|
||||
|
|
@ -581,8 +565,27 @@ public class CategorizationFragment extends Fragment {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(Activity activity) {
|
||||
super.onAttach(activity);
|
||||
onCategoriesSaveHandler = (OnCategoriesSaveHandler) activity;
|
||||
public void onActivityCreated(Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
setHasOptionsMenu(true);
|
||||
onCategoriesSaveHandler = (OnCategoriesSaveHandler) getActivity();
|
||||
getActivity().setTitle(R.string.categories_activity_title);
|
||||
client = getActivity().getContentResolver().acquireContentProviderClient(CategoryContentProvider.AUTHORITY);
|
||||
}
|
||||
|
||||
private class CategoryTextWatcher implements TextWatcher {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
|
||||
startUpdatingCategoryList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable editable) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,21 @@
|
|||
package fr.free.nrw.commons.concurrency;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
import fr.free.nrw.commons.BuildConfig;
|
||||
|
||||
public class BackgroundPoolExceptionHandler implements ExceptionHandler {
|
||||
@Override
|
||||
public void onException(@NonNull final Throwable t) {
|
||||
//Crash for debug build
|
||||
if (BuildConfig.DEBUG) {
|
||||
Thread thread = new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
throw new RuntimeException(t);
|
||||
}
|
||||
});
|
||||
thread.start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
package fr.free.nrw.commons.concurrency;
|
||||
|
||||
import java.util.concurrent.CancellationException;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
|
||||
|
||||
class ExceptionAwareThreadPoolExecutor extends ScheduledThreadPoolExecutor {
|
||||
|
||||
private final ExceptionHandler exceptionHandler;
|
||||
|
||||
public ExceptionAwareThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory,
|
||||
ExceptionHandler exceptionHandler) {
|
||||
super(corePoolSize, threadFactory);
|
||||
this.exceptionHandler = exceptionHandler;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void afterExecute(Runnable r, Throwable t) {
|
||||
super.afterExecute(r, t);
|
||||
if (t == null && r instanceof Future<?>) {
|
||||
try {
|
||||
Future<?> future = (Future<?>) r;
|
||||
if (future.isDone()) future.get();
|
||||
} catch (CancellationException | InterruptedException e) {
|
||||
//ignore
|
||||
} catch (ExecutionException e) {
|
||||
t = e.getCause() != null ? e.getCause() : e;
|
||||
} catch (Exception e) {
|
||||
t = e;
|
||||
}
|
||||
}
|
||||
|
||||
if (t != null) {
|
||||
exceptionHandler.onException(t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package fr.free.nrw.commons.concurrency;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
public interface ExceptionHandler {
|
||||
void onException(@NonNull Throwable t);
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
package fr.free.nrw.commons.concurrency;
|
||||
|
||||
import android.os.Process;
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
|
||||
class ThreadFactoryMaker {
|
||||
public static ThreadFactory get(@NonNull final String name, final int priority) {
|
||||
return new ThreadFactory() {
|
||||
private int count = 0;
|
||||
|
||||
@Override
|
||||
public Thread newThread(final Runnable runnable) {
|
||||
count++;
|
||||
Runnable wrapperRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Process.setThreadPriority(priority);
|
||||
runnable.run();
|
||||
}
|
||||
};
|
||||
Thread t = new Thread(wrapperRunnable, String.format("%s-%s", name, count));
|
||||
return t;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,101 @@
|
|||
package fr.free.nrw.commons.concurrency;
|
||||
|
||||
import android.os.Process;
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class ThreadPoolExecutorService implements Executor {
|
||||
private final ScheduledThreadPoolExecutor backgroundPool;
|
||||
|
||||
private ThreadPoolExecutorService(Builder b) {
|
||||
backgroundPool = new ExceptionAwareThreadPoolExecutor(b.poolSize,
|
||||
ThreadFactoryMaker.get(b.name, b.priority), b.exceptionHandler);
|
||||
}
|
||||
|
||||
public <V> ScheduledFuture<V> schedule(Callable<V> callable, long time, TimeUnit timeUnit) {
|
||||
return backgroundPool.schedule(callable, time, timeUnit);
|
||||
}
|
||||
|
||||
public ScheduledFuture<?> schedule(Runnable runnable) {
|
||||
return schedule(runnable, 0, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
public ScheduledFuture<?> schedule(Runnable runnable, long time, TimeUnit timeUnit) {
|
||||
return backgroundPool.schedule(runnable, time, timeUnit);
|
||||
}
|
||||
|
||||
public ScheduledFuture<?> scheduleAtFixedRate(final Runnable task, long initialDelay,
|
||||
long period, final TimeUnit timeUnit) {
|
||||
return backgroundPool.scheduleAtFixedRate(task, initialDelay, period, timeUnit);
|
||||
}
|
||||
|
||||
public void shutdown() {
|
||||
backgroundPool.shutdown();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(Runnable command) {
|
||||
backgroundPool.execute(command);
|
||||
}
|
||||
|
||||
/**
|
||||
* Builder class for {@link ThreadPoolExecutorService}
|
||||
*/
|
||||
public static class Builder {
|
||||
//Required
|
||||
private final String name;
|
||||
|
||||
//Optional
|
||||
private int poolSize = 1;
|
||||
private int priority = Process.THREAD_PRIORITY_BACKGROUND + Process.THREAD_PRIORITY_MORE_FAVORABLE;
|
||||
private ExceptionHandler exceptionHandler = null;
|
||||
|
||||
/**
|
||||
* @param name the name of the threads in the service. if there are N threads,
|
||||
* the thread names will be like name-1, name-2, name-3,...,name-N
|
||||
*/
|
||||
public Builder(@NonNull String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param poolSize the number of threads to keep in the pool
|
||||
* @throws IllegalArgumentException if size of pool <=0
|
||||
*/
|
||||
public Builder setPoolSize(int poolSize) throws IllegalArgumentException {
|
||||
if (poolSize <= 0) {
|
||||
throw new IllegalArgumentException("Pool size must be grater than 0");
|
||||
}
|
||||
this.poolSize = poolSize;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param priority Priority of the threads in the service. You can supply a constant from
|
||||
* {@link android.os.Process}
|
||||
* By default, the priority is set to a value slightly higher than the normal
|
||||
* background priority
|
||||
*/
|
||||
public Builder setPriority(int priority) {
|
||||
this.priority = priority;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param handler The handler to use to handle exceptions in the service
|
||||
*/
|
||||
public Builder setExceptionHandler(ExceptionHandler handler) {
|
||||
this.exceptionHandler = handler;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ThreadPoolExecutorService build() {
|
||||
return new ThreadPoolExecutorService(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -11,6 +11,7 @@ import android.database.DataSetObserver;
|
|||
import android.os.Bundle;
|
||||
import android.os.IBinder;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v4.app.LoaderManager;
|
||||
import android.support.v4.content.CursorLoader;
|
||||
|
|
@ -22,8 +23,11 @@ import android.view.View;
|
|||
import android.widget.Adapter;
|
||||
import android.widget.AdapterView;
|
||||
|
||||
import com.google.common.util.concurrent.FutureCallback;
|
||||
import com.google.common.util.concurrent.Futures;
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Locale;
|
||||
|
||||
import butterknife.ButterKnife;
|
||||
import fr.free.nrw.commons.CommonsApplication;
|
||||
|
|
@ -35,6 +39,7 @@ import fr.free.nrw.commons.hamburger.HamburgerMenuContainer;
|
|||
import fr.free.nrw.commons.media.MediaDetailPagerFragment;
|
||||
import fr.free.nrw.commons.settings.Prefs;
|
||||
import fr.free.nrw.commons.upload.UploadService;
|
||||
import fr.free.nrw.commons.utils.ExecutorUtils;
|
||||
import timber.log.Timber;
|
||||
|
||||
public class ContributionsActivity
|
||||
|
|
@ -234,18 +239,7 @@ public class ContributionsActivity
|
|||
((CursorAdapter)contributionsList.getAdapter()).swapCursor(cursor);
|
||||
}
|
||||
|
||||
if (cursor.getCount() == 0
|
||||
&& Locale.getDefault().getISO3Language().equals(Locale.ENGLISH.getISO3Language())) {
|
||||
//cursor count is zero and language is english -
|
||||
// we need to set the message for 0 case explicitly.
|
||||
getSupportActionBar().setSubtitle(getResources()
|
||||
.getString(R.string.contributions_subtitle_zero));
|
||||
} else {
|
||||
getSupportActionBar().setSubtitle(getResources()
|
||||
.getQuantityString(R.plurals.contributions_subtitle,
|
||||
cursor.getCount(),
|
||||
cursor.getCount()));
|
||||
}
|
||||
setUploadCount();
|
||||
|
||||
contributionsList.clearSyncMessage();
|
||||
notifyAndMigrateDataSetObservers();
|
||||
|
|
@ -275,6 +269,27 @@ public class ContributionsActivity
|
|||
return contributionsList.getAdapter().getCount();
|
||||
}
|
||||
|
||||
private void setUploadCount() {
|
||||
UploadCountClient uploadCountClient = new UploadCountClient();
|
||||
CommonsApplication application = CommonsApplication.getInstance();
|
||||
ListenableFuture<Integer> future = uploadCountClient
|
||||
.getUploadCount(application.getCurrentAccount().name);
|
||||
Futures.addCallback(future, new FutureCallback<Integer>() {
|
||||
@Override
|
||||
public void onSuccess(Integer uploadCount) {
|
||||
getSupportActionBar().setSubtitle(getResources()
|
||||
.getQuantityString(R.plurals.contributions_subtitle,
|
||||
uploadCount,
|
||||
uploadCount));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(@NonNull Throwable t) {
|
||||
Timber.e(t, "Fetching upload count failed");
|
||||
}
|
||||
}, ExecutorUtils.uiExecutor());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notifyDatasetChanged() {
|
||||
// Do nothing for now
|
||||
|
|
|
|||
|
|
@ -0,0 +1,56 @@
|
|||
package fr.free.nrw.commons.contributions;
|
||||
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
import com.google.common.util.concurrent.SettableFuture;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.util.Locale;
|
||||
|
||||
import fr.free.nrw.commons.CommonsApplication;
|
||||
import fr.free.nrw.commons.concurrency.BackgroundPoolExceptionHandler;
|
||||
import fr.free.nrw.commons.concurrency.ThreadPoolExecutorService;
|
||||
import timber.log.Timber;
|
||||
|
||||
public class UploadCountClient {
|
||||
private ThreadPoolExecutorService threadPoolExecutor;
|
||||
|
||||
public UploadCountClient() {
|
||||
threadPoolExecutor = new ThreadPoolExecutorService.Builder("bg-pool")
|
||||
.setPoolSize(Runtime.getRuntime().availableProcessors())
|
||||
.setExceptionHandler(new BackgroundPoolExceptionHandler())
|
||||
.build();
|
||||
}
|
||||
|
||||
private static final String UPLOAD_COUNT_URL_TEMPLATE =
|
||||
"https://tools.wmflabs.org/urbanecmbot/uploadsbyuser/uploadsbyuser.py?user=%s";
|
||||
|
||||
public ListenableFuture<Integer> getUploadCount(final String userName) {
|
||||
final SettableFuture<Integer> future = SettableFuture.create();
|
||||
threadPoolExecutor.schedule(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
URL url;
|
||||
try {
|
||||
url = new URL(String.format(Locale.ENGLISH, UPLOAD_COUNT_URL_TEMPLATE, userName));
|
||||
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
|
||||
try {
|
||||
BufferedReader bufferedReader = new BufferedReader(new
|
||||
InputStreamReader(urlConnection.getInputStream()));
|
||||
String uploadCount = bufferedReader.readLine();
|
||||
bufferedReader.close();
|
||||
future.set(Integer.parseInt(uploadCount));
|
||||
} finally {
|
||||
urlConnection.disconnect();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Timber.e("Error getting upload count Error", e);
|
||||
future.setException(e);
|
||||
}
|
||||
}
|
||||
});
|
||||
return future;
|
||||
}
|
||||
}
|
||||
|
|
@ -2,8 +2,9 @@ package fr.free.nrw.commons.location;
|
|||
|
||||
public class LatLng {
|
||||
|
||||
public final double latitude;
|
||||
public final double longitude;
|
||||
private final double latitude;
|
||||
private final double longitude;
|
||||
private final float accuracy;
|
||||
|
||||
/** Accepts latitude and longitude.
|
||||
* North and South values are cut off at 90°
|
||||
|
|
@ -11,13 +12,14 @@ public class LatLng {
|
|||
* @param latitude double value
|
||||
* @param longitude double value
|
||||
*/
|
||||
public LatLng(double latitude, double longitude) {
|
||||
public LatLng(double latitude, double longitude, float accuracy) {
|
||||
if(-180.0D <= longitude && longitude < 180.0D) {
|
||||
this.longitude = longitude;
|
||||
} else {
|
||||
this.longitude = ((longitude - 180.0D) % 360.0D + 360.0D) % 360.0D - 180.0D;
|
||||
}
|
||||
this.latitude = Math.max(-90.0D, Math.min(90.0D, latitude));
|
||||
this.accuracy = accuracy;
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
|
|
@ -93,4 +95,31 @@ public class LatLng {
|
|||
return formatCoordinate(this.latitude) + " " + this.getNorthSouth() + ", "
|
||||
+ formatCoordinate(this.longitude) + " " + this.getEastWest();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the location accuracy in meter.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public float getAccuracy() {
|
||||
return accuracy;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the longitude in degrees.
|
||||
*
|
||||
* @return double
|
||||
*/
|
||||
public double getLongitude() {
|
||||
return longitude;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the latitude in degrees.
|
||||
*
|
||||
* @return double
|
||||
*/
|
||||
public double getLatitude() {
|
||||
return latitude;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ public class LocationServiceManager implements LocationListener {
|
|||
private String provider;
|
||||
private LocationManager locationManager;
|
||||
private LatLng latestLocation;
|
||||
private Float latestLocationAccuracy;
|
||||
|
||||
public LocationServiceManager(Context context) {
|
||||
this.locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
|
||||
|
|
@ -24,6 +25,16 @@ public class LocationServiceManager implements LocationListener {
|
|||
return latestLocation;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the accuracy of the location. The measurement is
|
||||
* given as a radius in meter of 68 % confidence.
|
||||
*
|
||||
* @return Float
|
||||
*/
|
||||
public Float getLatestLocationAccuracy() {
|
||||
return latestLocationAccuracy;
|
||||
}
|
||||
|
||||
/** Registers a LocationManager to listen for current location.
|
||||
*/
|
||||
public void registerLocationManager() {
|
||||
|
|
@ -57,9 +68,11 @@ public class LocationServiceManager implements LocationListener {
|
|||
public void onLocationChanged(Location location) {
|
||||
double currentLatitude = location.getLatitude();
|
||||
double currentLongitude = location.getLongitude();
|
||||
Timber.d("Latitude: %f Longitude: %f", currentLatitude, currentLongitude);
|
||||
latestLocationAccuracy = location.getAccuracy();
|
||||
Timber.d("Latitude: %f Longitude: %f Accuracy %f",
|
||||
currentLatitude, currentLongitude, latestLocationAccuracy);
|
||||
|
||||
latestLocation = new LatLng(currentLatitude, currentLongitude);
|
||||
latestLocation = new LatLng(currentLatitude, currentLongitude, latestLocationAccuracy);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -109,8 +109,8 @@ public class NearbyController {
|
|||
nearbyBaseMarker.title(place.name);
|
||||
nearbyBaseMarker.position(
|
||||
new com.mapbox.mapboxsdk.geometry.LatLng(
|
||||
place.location.latitude,
|
||||
place.location.longitude));
|
||||
place.location.getLatitude(),
|
||||
place.location.getLongitude()));
|
||||
nearbyBaseMarker.place(place);
|
||||
nearbyBaseMarker.icon(icon);
|
||||
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ public class NearbyInfoDialog extends OverlayDialog {
|
|||
Bundle bundle = getArguments();
|
||||
placeTitle.setText(bundle.getString(ARG_TITLE));
|
||||
placeDescription.setText(bundle.getString(ARG_DESC));
|
||||
location = new LatLng(bundle.getDouble(ARG_LATITUDE), bundle.getDouble(ARG_LONGITUDE));
|
||||
location = new LatLng(bundle.getDouble(ARG_LATITUDE), bundle.getDouble(ARG_LONGITUDE), 0);
|
||||
getArticleLink(bundle);
|
||||
}
|
||||
|
||||
|
|
@ -122,8 +122,8 @@ public class NearbyInfoDialog extends OverlayDialog {
|
|||
Bundle bundle = new Bundle();
|
||||
bundle.putString(ARG_TITLE, place.name);
|
||||
bundle.putString(ARG_DESC, place.description);
|
||||
bundle.putDouble(ARG_LATITUDE, place.location.latitude);
|
||||
bundle.putDouble(ARG_LONGITUDE, place.location.longitude);
|
||||
bundle.putDouble(ARG_LATITUDE, place.location.getLatitude());
|
||||
bundle.putDouble(ARG_LONGITUDE, place.location.getLongitude());
|
||||
bundle.putParcelable(ARG_SITE_LINK, place.siteLinks);
|
||||
mDialog.setArguments(bundle);
|
||||
DialogUtil.showSafely(fragmentActivity, mDialog);
|
||||
|
|
@ -138,7 +138,8 @@ public class NearbyInfoDialog extends OverlayDialog {
|
|||
@OnClick(R.id.link_preview_directions_button)
|
||||
void onDirectionsClick() {
|
||||
//Open map app at given position
|
||||
Uri gmmIntentUri = Uri.parse("geo:0,0?q=" + location.latitude + "," + location.longitude);
|
||||
Uri gmmIntentUri = Uri.parse(
|
||||
"geo:0,0?q=" + location.getLatitude() + "," + location.getLongitude());
|
||||
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
|
||||
|
||||
if (mapIntent.resolveActivity(getActivity().getPackageManager()) != null) {
|
||||
|
|
|
|||
|
|
@ -85,8 +85,8 @@ public class NearbyListFragment extends ListFragment {
|
|||
Place place = (Place) listview.getItemAtPosition(position);
|
||||
LatLng placeLatLng = place.location;
|
||||
|
||||
double latitude = placeLatLng.latitude;
|
||||
double longitude = placeLatLng.longitude;
|
||||
double latitude = placeLatLng.getLatitude();
|
||||
double longitude = placeLatLng.getLongitude();
|
||||
|
||||
Timber.d("Item at position %d has coords: Lat: %f Long: %f", position, latitude, longitude);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package fr.free.nrw.commons.nearby;
|
||||
|
||||
import android.graphics.Color;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
|
|
@ -14,6 +15,8 @@ import com.google.gson.GsonBuilder;
|
|||
import com.google.gson.reflect.TypeToken;
|
||||
import com.mapbox.mapboxsdk.Mapbox;
|
||||
import com.mapbox.mapboxsdk.annotations.Marker;
|
||||
import com.mapbox.mapboxsdk.annotations.MarkerOptions;
|
||||
import com.mapbox.mapboxsdk.annotations.PolygonOptions;
|
||||
import com.mapbox.mapboxsdk.camera.CameraPosition;
|
||||
import com.mapbox.mapboxsdk.constants.Style;
|
||||
import com.mapbox.mapboxsdk.geometry.LatLng;
|
||||
|
|
@ -24,6 +27,7 @@ import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
|
|||
import com.mapbox.services.android.telemetry.MapboxTelemetry;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import fr.free.nrw.commons.R;
|
||||
|
|
@ -79,7 +83,7 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment {
|
|||
MapboxMapOptions options = new MapboxMapOptions()
|
||||
.styleUrl(Style.OUTDOORS)
|
||||
.camera(new CameraPosition.Builder()
|
||||
.target(new LatLng(curLatLng.latitude, curLatLng.longitude))
|
||||
.target(new LatLng(curLatLng.getLatitude(), curLatLng.getLongitude()))
|
||||
.zoom(11)
|
||||
.build());
|
||||
|
||||
|
|
@ -102,6 +106,8 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment {
|
|||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
addCurrentLocationMarker(mapboxMap);
|
||||
}
|
||||
});
|
||||
if (PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean("theme",true)) {
|
||||
|
|
@ -111,6 +117,53 @@ public class NearbyMapFragment extends android.support.v4.app.Fragment {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a marker for the user's current position. Adds a
|
||||
* circle which uses the accuracy * 2, to draw a circle
|
||||
* which represents the user's position with an accuracy
|
||||
* of 95%.
|
||||
*/
|
||||
public void addCurrentLocationMarker(MapboxMap mapboxMap) {
|
||||
MarkerOptions currentLocationMarker = new MarkerOptions()
|
||||
.position(new LatLng(curLatLng.getLatitude(), curLatLng.getLongitude()));
|
||||
mapboxMap.addMarker(currentLocationMarker);
|
||||
|
||||
List<LatLng> circle = createCircleArray(curLatLng.getLatitude(), curLatLng.getLongitude(),
|
||||
curLatLng.getAccuracy() * 2, 100);
|
||||
|
||||
mapboxMap.addPolygon(
|
||||
new PolygonOptions()
|
||||
.addAll(circle)
|
||||
.strokeColor(Color.parseColor("#55000000"))
|
||||
.fillColor(Color.parseColor("#11000000"))
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a series of points that create a circle on the map.
|
||||
* Takes the center latitude, center longitude of the circle,
|
||||
* the radius in meter and the number of nodes of the circle.
|
||||
*
|
||||
* @return List List of LatLng points of the circle.
|
||||
*/
|
||||
public List<LatLng> createCircleArray(
|
||||
double centerLat, double centerLong, float radius, int nodes) {
|
||||
List<LatLng> circle = new ArrayList<>();
|
||||
float radiusKilometer = radius / 1000;
|
||||
double radiusLong = radiusKilometer
|
||||
/ (111.320 * Math.cos(centerLat * Math.PI / 180));
|
||||
double radiusLat = radiusKilometer / 110.574;
|
||||
|
||||
for (int i = 0; i < nodes; i++) {
|
||||
double theta = ((double) i / (double) nodes) * (2 * Math.PI);
|
||||
double nodeLongitude = centerLong + radiusLong * Math.cos(theta);
|
||||
double nodeLatitude = centerLat + radiusLat * Math.sin(theta);
|
||||
circle.add(new LatLng(nodeLatitude, nodeLongitude));
|
||||
}
|
||||
|
||||
return circle;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
|
|
|
|||
|
|
@ -74,8 +74,8 @@ public class NearbyPlaces {
|
|||
|
||||
String query = wikidataQuery
|
||||
.replace("${RAD}", String.format(Locale.ROOT, "%.2f", radius))
|
||||
.replace("${LAT}", String.format(Locale.ROOT, "%.4f", cur.latitude))
|
||||
.replace("${LONG}", String.format(Locale.ROOT, "%.4f", cur.longitude))
|
||||
.replace("${LAT}", String.format(Locale.ROOT, "%.4f", cur.getLatitude()))
|
||||
.replace("${LONG}", String.format(Locale.ROOT, "%.4f", cur.getLongitude()))
|
||||
.replace("${LANG}", lang);
|
||||
|
||||
Timber.v("# Wikidata query: \n" + query);
|
||||
|
|
@ -125,7 +125,7 @@ public class NearbyPlaces {
|
|||
type, // list
|
||||
type, // details
|
||||
Uri.parse(icon),
|
||||
new LatLng(latitude, longitude),
|
||||
new LatLng(latitude, longitude, 0),
|
||||
new Sitelinks.Builder()
|
||||
.setWikipediaLink(wikipediaSitelink)
|
||||
.setCommonsLink(commonsSitelink)
|
||||
|
|
@ -187,7 +187,7 @@ public class NearbyPlaces {
|
|||
type, // list
|
||||
type, // details
|
||||
null,
|
||||
new LatLng(latitude, longitude),
|
||||
new LatLng(latitude, longitude, 0),
|
||||
new Sitelinks.Builder().build()
|
||||
));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,8 +12,6 @@ import fr.free.nrw.commons.R;
|
|||
import fr.free.nrw.commons.theme.NavigationBaseActivity;
|
||||
|
||||
public class SettingsActivity extends NavigationBaseActivity {
|
||||
private SettingsFragment settingsFragment;
|
||||
|
||||
private AppCompatDelegate settingsDelegate;
|
||||
|
||||
@Override
|
||||
|
|
@ -25,8 +23,6 @@ public class SettingsActivity extends NavigationBaseActivity {
|
|||
setTheme(R.style.LightAppTheme);
|
||||
}
|
||||
|
||||
settingsFragment = (SettingsFragment) getFragmentManager().findFragmentById(R.id.settingsFragment);
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_settings);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,10 +2,11 @@ package fr.free.nrw.commons.ui.widget;
|
|||
|
||||
import android.content.Context;
|
||||
import android.support.v7.widget.AppCompatTextView;
|
||||
import android.text.Html;
|
||||
import android.text.method.LinkMovementMethod;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
import fr.free.nrw.commons.Utils;
|
||||
|
||||
/**
|
||||
* An {@link AppCompatTextView} which formats the text to HTML displayable text and makes any
|
||||
* links clickable.
|
||||
|
|
@ -16,6 +17,6 @@ public class HtmlTextView extends AppCompatTextView {
|
|||
super(context, attrs);
|
||||
|
||||
setMovementMethod(LinkMovementMethod.getInstance());
|
||||
setText(Html.fromHtml(getText().toString()));
|
||||
setText(Utils.fromHtml(getText().toString()));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ public class MultipleUploadListFragment extends Fragment {
|
|||
private GridView photosGrid;
|
||||
private PhotoDisplayAdapter photosAdapter;
|
||||
private EditText baseTitle;
|
||||
private TitleTextWatcher textWatcher = new TitleTextWatcher();
|
||||
|
||||
private Point photoSize;
|
||||
private MediaDetailPagerFragment.MediaDetailProvider detailProvider;
|
||||
|
|
@ -97,7 +98,6 @@ public class MultipleUploadListFragment extends Fragment {
|
|||
holder = (UploadHolderView)view.getTag();
|
||||
}
|
||||
|
||||
|
||||
Contribution up = (Contribution)this.getItem(i);
|
||||
|
||||
if(holder.imageUri == null || !holder.imageUri.equals(up.getLocalUri())) {
|
||||
|
|
@ -170,37 +170,16 @@ public class MultipleUploadListFragment extends Fragment {
|
|||
photoSize = calculatePicDimension(detailProvider.getTotalMediaCount());
|
||||
photosGrid.setColumnWidth(photoSize.x);
|
||||
|
||||
baseTitle.addTextChangedListener(new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence charSequence, int i1, int i2, int i3) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence charSequence, int i1, int i2, int i3) {
|
||||
for(int i = 0; i < detailProvider.getTotalMediaCount(); i++) {
|
||||
Contribution up = (Contribution) detailProvider.getMediaAtPosition(i);
|
||||
Boolean isDirty = (Boolean)up.getTag("isDirty");
|
||||
if(isDirty == null || !isDirty) {
|
||||
if(!TextUtils.isEmpty(charSequence)) {
|
||||
up.setFilename(charSequence.toString() + " - " + ((Integer)up.getTag("sequence") + 1));
|
||||
} else {
|
||||
up.setFilename("");
|
||||
}
|
||||
}
|
||||
}
|
||||
detailProvider.notifyDatasetChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable editable) {
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
baseTitle.addTextChangedListener(textWatcher);
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
baseTitle.removeTextChangedListener(textWatcher);
|
||||
super.onDestroyView();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||
super.onCreateOptionsMenu(menu, inflater);
|
||||
|
|
@ -227,5 +206,30 @@ public class MultipleUploadListFragment extends Fragment {
|
|||
|
||||
setHasOptionsMenu(true);
|
||||
}
|
||||
|
||||
|
||||
private class TitleTextWatcher implements TextWatcher {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence charSequence, int i1, int i2, int i3) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence charSequence, int i1, int i2, int i3) {
|
||||
for(int i = 0; i < detailProvider.getTotalMediaCount(); i++) {
|
||||
Contribution up = (Contribution) detailProvider.getMediaAtPosition(i);
|
||||
Boolean isDirty = (Boolean)up.getTag("isDirty");
|
||||
if(isDirty == null || !isDirty) {
|
||||
if(!TextUtils.isEmpty(charSequence)) {
|
||||
up.setFilename(charSequence.toString() + " - " + ((Integer)up.getTag("sequence") + 1));
|
||||
} else {
|
||||
up.setFilename("");
|
||||
}
|
||||
}
|
||||
}
|
||||
detailProvider.notifyDatasetChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable editable) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
package fr.free.nrw.commons.upload;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
|
|
@ -53,6 +52,7 @@ public class SingleUploadFragment extends Fragment {
|
|||
@BindView(R.id.licenseSpinner) Spinner licenseSpinner;
|
||||
|
||||
private OnUploadActionInitiated uploadActionInitiatedHandler;
|
||||
private TitleTextWatcher textWatcher = new TitleTextWatcher();
|
||||
|
||||
@Override
|
||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||
|
|
@ -125,28 +125,19 @@ public class SingleUploadFragment extends Fragment {
|
|||
Timber.d("Position: %d %s", position, getString(Utils.licenseNameFor(license)));
|
||||
licenseSpinner.setSelection(position);
|
||||
|
||||
TextWatcher uploadEnabler = new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { }
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable editable) {
|
||||
if(getActivity() != null) {
|
||||
getActivity().invalidateOptionsMenu();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
titleEdit.addTextChangedListener(uploadEnabler);
|
||||
titleEdit.addTextChangedListener(textWatcher);
|
||||
|
||||
setLicenseSummary(license);
|
||||
|
||||
return rootView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
titleEdit.removeTextChangedListener(textWatcher);
|
||||
super.onDestroyView();
|
||||
}
|
||||
|
||||
@OnItemSelected(R.id.licenseSpinner) void onLicenseSelected(AdapterView<?> parent, View view, int position, long id) {
|
||||
String licenseName = parent.getItemAtPosition(position).toString();
|
||||
|
||||
|
|
@ -206,9 +197,10 @@ public class SingleUploadFragment extends Fragment {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(Activity activity) {
|
||||
super.onAttach(activity);
|
||||
uploadActionInitiatedHandler = (OnUploadActionInitiated) activity;
|
||||
public void onActivityCreated(Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
setHasOptionsMenu(true);
|
||||
uploadActionInitiatedHandler = (OnUploadActionInitiated) getActivity();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -223,9 +215,18 @@ public class SingleUploadFragment extends Fragment {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setHasOptionsMenu(true);
|
||||
private class TitleTextWatcher implements TextWatcher {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { }
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { }
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable editable) {
|
||||
if(getActivity() != null) {
|
||||
getActivity().invalidateOptionsMenu();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,23 @@
|
|||
package fr.free.nrw.commons.utils;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
public class ExecutorUtils {
|
||||
|
||||
private static final Executor uiExecutor = new Executor() {
|
||||
@Override
|
||||
public void execute(Runnable command) {
|
||||
if (Looper.myLooper() == Looper.getMainLooper()) {
|
||||
command.run();
|
||||
} else {
|
||||
new Handler(Looper.getMainLooper()).post(command);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public static Executor uiExecutor () { return uiExecutor;}
|
||||
|
||||
}
|
||||
|
|
@ -38,10 +38,10 @@ public class LengthUtils {
|
|||
}
|
||||
|
||||
private static double computeAngleBetween(LatLng from, LatLng to) {
|
||||
return distanceRadians(Math.toRadians(from.latitude),
|
||||
Math.toRadians(from.longitude),
|
||||
Math.toRadians(to.latitude),
|
||||
Math.toRadians(to.longitude));
|
||||
return distanceRadians(Math.toRadians(from.getLatitude()),
|
||||
Math.toRadians(from.getLongitude()),
|
||||
Math.toRadians(to.getLatitude()),
|
||||
Math.toRadians(to.getLongitude()));
|
||||
}
|
||||
|
||||
private static double distanceRadians(double lat1, double lng1, double lat2, double lng2) {
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
<string name="logging_in_message">الرجاء الانتظار…</string>
|
||||
<string name="login_success">تم الدخول بشكل صحيح</string>
|
||||
<string name="login_failed">فشل تسجيل الدخول</string>
|
||||
<string name="upload_failed">الملف غير موجود. فضلا اختر ملفا آخر.</string>
|
||||
<string name="authentication_failed">فشل الاستيقان!</string>
|
||||
<string name="uploading_started">بدأ الرفع!</string>
|
||||
<string name="upload_completed_notification_title">رُفع %1$s!</string>
|
||||
|
|
@ -20,7 +21,7 @@
|
|||
<string name="upload_failed_notification_title">فشل رفع %1$s</string>
|
||||
<string name="upload_failed_notification_subtitle">انقر لتشاهد</string>
|
||||
<string name="uploads_pending_notification_indicator" fuzzy="true">متبقى %d</string>
|
||||
<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>
|
||||
|
|
@ -76,7 +77,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>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<string name="login">Identificase</string>
|
||||
<string name="signup">Date d\'alta</string>
|
||||
<string name="logging_in_title">Aniciando sesión</string>
|
||||
<string name="logging_in_message" fuzzy="true">Aguarde, por favor…</string>
|
||||
<string name="logging_in_message">Espera…</string>
|
||||
<string name="login_success">¡Identificación correuta!</string>
|
||||
<string name="login_failed">¡Falló l\'aniciu de sesión!</string>
|
||||
<string name="upload_failed">Nun s\'alcontró\'l ficheru. Tenta con otru.</string>
|
||||
|
|
@ -20,11 +20,11 @@
|
|||
<string name="upload_progress_notification_title_finishing">Acabando de xubir %1$s</string>
|
||||
<string name="upload_failed_notification_title">Falló la xuba de %1$s</string>
|
||||
<string name="upload_failed_notification_subtitle">Toque pa velo</string>
|
||||
<plurals name="uploads_pending_notification_indicator" fuzzy="true">
|
||||
<item quantity="one">Xubiendo 1 ficheru</item>
|
||||
<plurals name="uploads_pending_notification_indicator">
|
||||
<item quantity="one">Xubiendo un ficheru</item>
|
||||
<item quantity="other">Xubiendo %d ficheros</item>
|
||||
</plurals>
|
||||
<string name="title_activity_contributions" fuzzy="true">Les mios xubes</string>
|
||||
<string name="title_activity_contributions">Les mios xubes recién</string>
|
||||
<string name="contribution_state_queued">En cola</string>
|
||||
<string name="contribution_state_failed">Falló</string>
|
||||
<string name="contribution_state_in_progress">%1$d%% completao</string>
|
||||
|
|
@ -42,6 +42,7 @@
|
|||
<string name="login_failed_password">Nun se pudo aniciar sesión – por favor compruebe la so contraseña</string>
|
||||
<string name="login_failed_throttled">Demasiaos intentos incorreutos. Téntalo otra vuelta n\'unos minutos.</string>
|
||||
<string name="login_failed_blocked">Sentímoslo, esti usuariu ta bloquiáu en Commons</string>
|
||||
<string name="login_failed_2fa_needed">Tienes de dar el códigu d\'identificación de dos factores.</string>
|
||||
<string name="login_failed_generic">Falló l\'aniciu de sesión</string>
|
||||
<string name="share_upload_button">Xubir</string>
|
||||
<string name="multiple_share_base_title">Da-y un nome al conxuntu</string>
|
||||
|
|
@ -50,16 +51,19 @@
|
|||
<string name="categories_search_text_hint">Guetar categoríes</string>
|
||||
<string name="menu_save_categories">Guardar</string>
|
||||
<string name="refresh_button">Refrescar</string>
|
||||
<plurals name="contributions_subtitle" fuzzy="true">
|
||||
<item quantity="zero">Inda nun hai cargues</item>
|
||||
<string name="gps_disabled">El GPS ta desactiváu nel preséu. ¿Quiés activalu?</string>
|
||||
<string name="enable_gps">Activar GPS</string>
|
||||
<string name="contributions_subtitle_zero">Inda nun hai xubes</string>
|
||||
<plurals name="contributions_subtitle">
|
||||
<item quantity="zero">\@string/contributions_subtitle_zero</item>
|
||||
<item quantity="one">1 carga</item>
|
||||
<item quantity="other">%d cargues</item>
|
||||
</plurals>
|
||||
<plurals name="starting_multiple_uploads" fuzzy="true">
|
||||
<plurals name="starting_multiple_uploads">
|
||||
<item quantity="one">Principiando 1 carga</item>
|
||||
<item quantity="other">Principiando %d cargues</item>
|
||||
</plurals>
|
||||
<plurals name="multiple_uploads_title" fuzzy="true">
|
||||
<plurals name="multiple_uploads_title">
|
||||
<item quantity="one">1 carga</item>
|
||||
<item quantity="other">%d cargues</item>
|
||||
</plurals>
|
||||
|
|
@ -74,7 +78,7 @@
|
|||
<string name="about_license">Software de códigu abiertu lliberáu baxo la <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Llicencia Apache v2</a>. Wikimedia Commons ya\'l so logotipu son marques rexistraes de la Fundación Wikimedia y utilícense col so permisu. Nun tamos acreditaos pola Fundación Wikimedia nin tamos afiliaos con ella.</string>
|
||||
<string name="about_improve">El <a href=\"https://github.com/commons-app/apps-android-commons\">códigu fonte</a> ya\'l <a href=\"https://commons-app.github.io/\">sitiu web</a> tán en GitHub. Crea una nueva <a href=\"https://github.com/commons-app/apps-android-commons/issues\">incidencia en GitHub</a> pa informar de problemes y suxerencies.</string>
|
||||
<string name="about_privacy_policy">Wikimedia:Commons-android-strings-about privacy policy/ast</string>
|
||||
<string name="about_credits" fuzzy="true"><a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">CRÉDITOS</a></string>
|
||||
<string name="about_credits"><a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Créditos</a></string>
|
||||
<string name="title_activity_about">Tocante a</string>
|
||||
<string name="menu_feedback">Unviar comentarios (per corréu)</string>
|
||||
<string name="no_email_client">Nun s\'instaló nengún veceru de corréu</string>
|
||||
|
|
@ -126,7 +130,7 @@
|
|||
<string name="welcome_final_text">¿Cree que yá sabe cómo va?</string>
|
||||
<string name="welcome_final_button_text">¡Si!</string>
|
||||
<string name="detail_panel_cats_label">Categoríes</string>
|
||||
<string name="detail_panel_cats_loading" fuzzy="true">Cargando…</string>
|
||||
<string name="detail_panel_cats_loading">Cargando…</string>
|
||||
<string name="detail_panel_cats_none">Nenguna seleicionada</string>
|
||||
<string name="detail_description_empty">Ensin descripción</string>
|
||||
<string name="detail_license_empty">Llicencia desconocida</string>
|
||||
|
|
@ -135,6 +139,7 @@
|
|||
<string name="location_permission_rationale">Permisu opcional: llograr l\'allugamientu actual pa suxerir categoríes</string>
|
||||
<string name="ok">Aceutar</string>
|
||||
<string name="title_activity_nearby">Llugares cercanos</string>
|
||||
<string name="no_nearby">Nun s\'alcontraron llugares cercanos</string>
|
||||
<string name="warning">Avisu</string>
|
||||
<string name="file_exists">Esti ficheru yá esiste\'n Commons. ¿Confirmes que quies siguir?</string>
|
||||
<string name="yes">Sí</string>
|
||||
|
|
@ -143,8 +148,42 @@
|
|||
<string name="media_detail_media_title">Títulu del mediu</string>
|
||||
<string name="media_detail_description">Descripción</string>
|
||||
<string name="media_detail_description_explanation">Equí va la descripción del mediu. Posiblemente pué ser llargo enforma, y necesitará espardese per delles llinies. Sicasí, esperamos que se vea guapo.</string>
|
||||
<string name="media_detail_uploaded_date">Data d\'unviu</string>
|
||||
<string name="become_a_tester_title">Faete probador beta</string>
|
||||
<string name="become_a_tester_description">Escueye\'l nuesu canal beta en Google Play y ten accesu tempranu a carauterístiques nueves ya igües de fallos</string>
|
||||
<string name="use_wikidata">Usar Wikidata</string>
|
||||
<string name="use_wikidata_summary">(Avisu: desactivar esto pue causar un gran consumu de datos nel móvil)</string>
|
||||
<string name="_2fa_code">Códigu I2F</string>
|
||||
<string name="number_of_uploads">Mio llende de xubes recién</string>
|
||||
<string name="maximum_limit">Llende máxima</string>
|
||||
<string name="maximum_limit_alert">Nun pueden vese más de 500</string>
|
||||
<string name="set_limit">Configurar la llende de xubíes recién</string>
|
||||
<string name="login_failed_2fa_not_supported">Anguaño nun hai encontu pa autenticación de dos factores.</string>
|
||||
<string name="logout_verification">¿Confirmes que quies salir?</string>
|
||||
<string name="commons_logo">Logo de Commons</string>
|
||||
<string name="background_image">Imaxe de fondu</string>
|
||||
<string name="mediaimage_failed">Falló la imaxe multimedia</string>
|
||||
<string name="no_image_found">Nun s\'atopó nenguna imaxe</string>
|
||||
<string name="upload_image">Xubir imaxe</string>
|
||||
<string name="welcome_image_mount_zao">Monte Zao</string>
|
||||
<string name="welcome_image_llamas">Llames</string>
|
||||
<string name="welcome_image_rainbow_bridge">Ponte del Arcu la Vieya</string>
|
||||
<string name="welcome_image_tulip">Tulipa</string>
|
||||
<string name="welcome_image_no_selfies">Non selfies</string>
|
||||
<string name="welcome_image_proprietary">Imaxe privativa</string>
|
||||
<string name="welcome_image_welcome_wikipedia">Bienvenida a Wikipedia</string>
|
||||
<string name="welcome_image_welcome_copyright">Bienvenida a Derechos d\'autor</string>
|
||||
<string name="welcome_image_sydney_opera_house">Ópera de Sidney</string>
|
||||
<string name="cancel">Encaboxar</string>
|
||||
<string name="navigation_drawer_open">Abrir</string>
|
||||
<string name="navigation_drawer_close">Zarrar</string>
|
||||
<string name="navigation_item_home">Entamu</string>
|
||||
<string name="navigation_item_upload">Xubir</string>
|
||||
<string name="navigation_item_nearby">Cercanu</string>
|
||||
<string name="navigation_item_about">Tocante a</string>
|
||||
<string name="navigation_item_settings">Configuración</string>
|
||||
<string name="navigation_item_feedback">La to opinión</string>
|
||||
<string name="navigation_item_logout">Salir</string>
|
||||
<string name="nearby_info_menu_commons_article">Artículu en Commons</string>
|
||||
<string name="nearby_info_menu_wikidata_article">Artículu en WikiData</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
<string name="logging_in_message">Изчакайте…</string>
|
||||
<string name="login_success">Успешно вписване.</string>
|
||||
<string name="login_failed">Неуспешно вписване!</string>
|
||||
<string name="upload_failed">Файлът не е намерен. Моля, опитайте друг файл.</string>
|
||||
<string name="upload_failed">Файлът не е намерен. Моля, опитайте с друг файл.</string>
|
||||
<string name="authentication_failed">Неуспешен опит за удостоверяване!</string>
|
||||
<string name="uploading_started">Качването започна!</string>
|
||||
<string name="upload_completed_notification_title">Файл %1$s е качен!</string>
|
||||
|
|
@ -24,9 +24,9 @@
|
|||
<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_network">Неуспешно влизане – проблем в мрежата</string>
|
||||
<string name="login_failed_username">Неуспешно влизане – моля проверете потребителското си име</string>
|
||||
<string name="login_failed_password">Неуспешно влизане – моля проверете паролата си</string>
|
||||
<string name="share_upload_button">Качване</string>
|
||||
<string name="provider_modifications">Изменения</string>
|
||||
<string name="menu_upload_single">Качване</string>
|
||||
|
|
@ -65,7 +65,7 @@
|
|||
<string name="tutorial_3_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_description_empty">Няма описание</string>
|
||||
<string name="detail_license_empty">Непознат лиценз</string>
|
||||
<string name="menu_refresh">Обновяване</string>
|
||||
|
|
@ -76,4 +76,17 @@
|
|||
<string name="no">Не</string>
|
||||
<string name="media_detail_title">Заглавие</string>
|
||||
<string name="media_detail_description">Описание</string>
|
||||
<string name="media_detail_uploaded_date">Дата на качване</string>
|
||||
<string name="welcome_image_llamas">Лами</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>
|
||||
|
|
|
|||
|
|
@ -128,7 +128,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>
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@
|
|||
<string name="welcome_final_text">Myslíte, že rozumíte?</string>
|
||||
<string name="welcome_final_button_text">Ano!</string>
|
||||
<string name="detail_panel_cats_label">Kategorie</string>
|
||||
<string name="detail_panel_cats_loading" fuzzy="true">Načítá se…</string>
|
||||
<string name="detail_panel_cats_loading">Načítá se…</string>
|
||||
<string name="detail_panel_cats_none">Nevybrány</string>
|
||||
<string name="detail_description_empty">Bez popisu</string>
|
||||
<string name="detail_license_empty">Neznámá licence</string>
|
||||
|
|
@ -160,6 +160,19 @@
|
|||
<string name="set_limit">Počet nahraných souborů, které se zobrazí</string>
|
||||
<string name="login_failed_2fa_not_supported">Tato aplikace zatím nepodporuje tzv. dvoufázové ověření.</string>
|
||||
<string name="logout_verification">Opravdu se chcete odhlásit?</string>
|
||||
<string name="commons_logo">Logo Wikimedia Commons</string>
|
||||
<string name="background_image">Obrázek na pozadí</string>
|
||||
<string name="no_image_found">Nebyl nalezen žádný obrázek</string>
|
||||
<string name="upload_image">Nahrát obrázek</string>
|
||||
<string name="welcome_image_mount_zao">Hora Zao</string>
|
||||
<string name="welcome_image_llamas">Lamy</string>
|
||||
<string name="welcome_image_rainbow_bridge">Duhový most</string>
|
||||
<string name="welcome_image_tulip">Tulipán</string>
|
||||
<string name="welcome_image_no_selfies">Žádná selfíčka</string>
|
||||
<string name="welcome_image_proprietary">Autorskoprávně chráněný obrázek</string>
|
||||
<string name="welcome_image_welcome_wikipedia">Vítejte na Wikipedii</string>
|
||||
<string name="welcome_image_welcome_copyright">Úvod k autorským právům</string>
|
||||
<string name="welcome_image_sydney_opera_house">Opera v Sydney</string>
|
||||
<string name="cancel">Zrušit</string>
|
||||
<string name="navigation_drawer_open">Otevřít</string>
|
||||
<string name="navigation_drawer_close">Zavřít</string>
|
||||
|
|
@ -170,4 +183,6 @@
|
|||
<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="nearby_info_menu_commons_article">Článek na Commons</string>
|
||||
<string name="nearby_info_menu_wikidata_article">Článek na Wikidatech</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@
|
|||
<string name="welcome_final_text">Verstanden?</string>
|
||||
<string name="welcome_final_button_text">Ja!</string>
|
||||
<string name="detail_panel_cats_label">Kategorien</string>
|
||||
<string name="detail_panel_cats_loading" fuzzy="true">Lade …</string>
|
||||
<string name="detail_panel_cats_loading">Lade …</string>
|
||||
<string name="detail_panel_cats_none">Keine ausgewählt</string>
|
||||
<string name="detail_description_empty">Keine Beschreibung</string>
|
||||
<string name="detail_license_empty">Unbekannte Lizenz</string>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<string name="login">Acceder</string>
|
||||
<string name="signup">Regístrate</string>
|
||||
<string name="logging_in_title">Accediendo</string>
|
||||
<string name="logging_in_message" fuzzy="true">Espera un momento…</string>
|
||||
<string name="logging_in_message">Espera un momento…</string>
|
||||
<string name="login_success">¡Inicio de sesión exitoso!</string>
|
||||
<string name="login_failed">¡Inicio de sesión fallido!</string>
|
||||
<string name="upload_failed">No se encontró el archivo. Prueba con otro.</string>
|
||||
|
|
@ -130,7 +130,7 @@
|
|||
<string name="welcome_final_text">¿Crees que ya lo tienes?</string>
|
||||
<string name="welcome_final_button_text">¡Sí!</string>
|
||||
<string name="detail_panel_cats_label">Categorías</string>
|
||||
<string name="detail_panel_cats_loading" fuzzy="true">Cargando…</string>
|
||||
<string name="detail_panel_cats_loading">Cargando…</string>
|
||||
<string name="detail_panel_cats_none">No hay nada seleccionado</string>
|
||||
<string name="detail_description_empty">Sin descripción</string>
|
||||
<string name="detail_license_empty">Licencia desconocida</string>
|
||||
|
|
@ -160,6 +160,20 @@
|
|||
<string name="set_limit">Establecer el límite de subidas recientes</string>
|
||||
<string name="login_failed_2fa_not_supported">Actualmente no se admite la auntenticación de dos factores.</string>
|
||||
<string name="logout_verification">¿Confirmas que quieres salir?</string>
|
||||
<string name="commons_logo">Logo de Commons</string>
|
||||
<string name="background_image">Imagen de fondo</string>
|
||||
<string name="mediaimage_failed">Falló la imagen de multimedia</string>
|
||||
<string name="no_image_found">No se encontró imagen</string>
|
||||
<string name="upload_image">Subir imagen</string>
|
||||
<string name="welcome_image_mount_zao">Monte Zao</string>
|
||||
<string name="welcome_image_llamas">Llamas</string>
|
||||
<string name="welcome_image_rainbow_bridge">Puente del Arco Iris</string>
|
||||
<string name="welcome_image_tulip">Tulipa</string>
|
||||
<string name="welcome_image_no_selfies">No selfies</string>
|
||||
<string name="welcome_image_proprietary">Imagen propietaria</string>
|
||||
<string name="welcome_image_welcome_wikipedia">Wikipedia de bienvenida</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>
|
||||
<string name="navigation_drawer_open">Abrir</string>
|
||||
<string name="navigation_drawer_close">Cerrar</string>
|
||||
|
|
@ -170,4 +184,6 @@
|
|||
<string name="navigation_item_settings">Configuración</string>
|
||||
<string name="navigation_item_feedback">Comentarios</string>
|
||||
<string name="navigation_item_logout">Salir</string>
|
||||
<string name="nearby_info_menu_commons_article">Artículo en Commons</string>
|
||||
<string name="nearby_info_menu_wikidata_article">Artículo en WikiData</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="crash_dialog_title">Commons s’est planté</string>
|
||||
<string name="crash_dialog_text">Oups! Quelque chose s’est mal passé!</string>
|
||||
<string name="crash_dialog_comment_prompt">Dites-nous ce que vous faisiez, puis partagez-le par courriel avec nous. Cela nous aidera à le corriger!</string>
|
||||
<string name="crash_dialog_ok_toast">Merci!</string>
|
||||
<string name="crash_dialog_title">Commons a planté</string>
|
||||
<string name="crash_dialog_text">Oups ! Quelque chose s’est mal passé !</string>
|
||||
<string name="crash_dialog_comment_prompt">Dites-nous ce que vous faisiez, puis partagez-le par courriel avec nous. Cela nous aidera à le corriger !</string>
|
||||
<string name="crash_dialog_ok_toast">Merci !</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -7,12 +7,12 @@
|
|||
<string name="login">Se connecter</string>
|
||||
<string name="signup">S’inscrire</string>
|
||||
<string name="logging_in_title">Connexion</string>
|
||||
<string name="logging_in_message" fuzzy="true">Veuillez patienter…</string>
|
||||
<string name="logging_in_message">Veuillez patienter…</string>
|
||||
<string name="login_success">Connexion réussie !</string>
|
||||
<string name="login_failed">Échec de la connexion !</string>
|
||||
<string name="upload_failed">Fichier non trouvé. Veuillez en essayer un autre.</string>
|
||||
<string name="authentication_failed">Échec de l’authentification !</string>
|
||||
<string name="uploading_started">Téléchargement démarré !</string>
|
||||
<string name="uploading_started">Téléversement démarré !</string>
|
||||
<string name="upload_completed_notification_title">%1$s téléversés !</string>
|
||||
<string name="upload_completed_notification_text">Appuyer pour voir votre téléversement</string>
|
||||
<string name="upload_progress_notification_title_start">Début de téléversement %1$s</string>
|
||||
|
|
@ -83,7 +83,7 @@
|
|||
<string name="menu_feedback">Envoyer vos commentaires (par courriel)</string>
|
||||
<string name="no_email_client">Aucun client de courriel installé</string>
|
||||
<string name="provider_categories">Catégories utilisées récemment</string>
|
||||
<string name="waiting_first_sync" fuzzy="true">Attente de première synchronisation…</string>
|
||||
<string name="waiting_first_sync">Attente de première synchronisation…</string>
|
||||
<string name="no_uploads_yet">Vous n’avez pas encore téléchargé de photo.</string>
|
||||
<string name="menu_retry_upload">Réessayer</string>
|
||||
<string name="menu_cancel_upload">Annuler</string>
|
||||
|
|
@ -117,11 +117,11 @@
|
|||
<string name="license_name_cc_zero">CC Zéro</string>
|
||||
<string name="tutorial_1_text">Wikimédia Communs héberge la plupart des images qui sont utilisées dans Wikipédia</string>
|
||||
<string name="tutorial_1_subtext">Vos images aident à éduquer les gens dans le monde entier !</string>
|
||||
<string name="tutorial_2_text">Veuillez télécharger les images qui sont prises ou créées entièrement par vous :</string>
|
||||
<string name="tutorial_2_text">Veuillez téléverser des images qui sont prises ou créées entièrement par vous :</string>
|
||||
<string name="tutorial_2_subtext">- Objets naturels (fleurs, animaux, montagnes) \n- Objets utiles (bicyclettes, gares ferroviaires) \n- Personnes célèbres (votre maire, les athlètes olympiques que vous avez rencontrés)</string>
|
||||
<string name="tutorial_3_text">Veuillez ne PAS télécharger :</string>
|
||||
<string name="tutorial_3_text">Veuillez ne PAS téléverser :</string>
|
||||
<string name="tutorial_3_subtext">- des selfies ou des images de vos amis \n- des images téléchargées sur Internet\n- des copies d’écran d’applications propriétaires</string>
|
||||
<string name="tutorial_4_text">Exemple de téléchargement :</string>
|
||||
<string name="tutorial_4_text">Exemple de téléversement :</string>
|
||||
<string name="tutorial_4_subtext">- Titre : L’opéra de Sydney\n- Description : L’opéra de Sydney vu à travers la baie\n- Catégories : Opéra de Sydney, Opéra de Sydney depuis l’ouest, vues à distance de l’Opéra de Sydney</string>
|
||||
<string name="welcome_wikipedia_text">Contribuez avec vos images. Aidez les articles de Wikipédia à prendre vie !</string>
|
||||
<string name="welcome_wikipedia_subtext">Les images sur Wikipédia viennent de Wikimedia Commons.</string>
|
||||
|
|
@ -130,7 +130,7 @@
|
|||
<string name="welcome_final_text">Vous pensez que c’est bon ?</string>
|
||||
<string name="welcome_final_button_text">Oui !</string>
|
||||
<string name="detail_panel_cats_label">Catégories</string>
|
||||
<string name="detail_panel_cats_loading" fuzzy="true">Chargement…</string>
|
||||
<string name="detail_panel_cats_loading">Chargement…</string>
|
||||
<string name="detail_panel_cats_none">Aucune catégorie sélectionnée</string>
|
||||
<string name="detail_description_empty">Aucune description</string>
|
||||
<string name="detail_license_empty">Licence inconnue</string>
|
||||
|
|
@ -148,7 +148,7 @@
|
|||
<string name="media_detail_media_title">Titre du média</string>
|
||||
<string name="media_detail_description">Description</string>
|
||||
<string name="media_detail_description_explanation">La description du média vient ici. Cela peut être potentiellement assez long, et devra être réparti sur plusieurs lignes. Nous espérons que cela restera joli néanmoins.</string>
|
||||
<string name="media_detail_uploaded_date">Date de téléchargement</string>
|
||||
<string name="media_detail_uploaded_date">Date de téléversement</string>
|
||||
<string name="become_a_tester_title">Devenir un bêta-testeur</string>
|
||||
<string name="become_a_tester_description">S’inscrire à notre canal bêta sur Google Play et obtenir un accès anticipé aux nouvelles fonctionnalités et corrections de bogue</string>
|
||||
<string name="use_wikidata">Utiliser Wikidata</string>
|
||||
|
|
@ -158,8 +158,22 @@
|
|||
<string name="maximum_limit">Limite maximale</string>
|
||||
<string name="maximum_limit_alert">Impossible d’afficher plus de 500</string>
|
||||
<string name="set_limit">Fixer la limite de téléversement récent</string>
|
||||
<string name="login_failed_2fa_not_supported">L’authentification à deux facteurs n’est pas supportée pour le moment.</string>
|
||||
<string name="login_failed_2fa_not_supported">L’authentification à deux facteurs n’est pas prise en charge pour le moment.</string>
|
||||
<string name="logout_verification">Voulez-vous vraiment vous déconnecter ?</string>
|
||||
<string name="commons_logo">Logo de Communs</string>
|
||||
<string name="background_image">Image de fond</string>
|
||||
<string name="mediaimage_failed">Échec de l’image du média</string>
|
||||
<string name="no_image_found">Aucune image trouvée</string>
|
||||
<string name="upload_image">Téléverser une image</string>
|
||||
<string name="welcome_image_mount_zao">Mont Zao</string>
|
||||
<string name="welcome_image_llamas">Lamas</string>
|
||||
<string name="welcome_image_rainbow_bridge">Pont Arc-en-ciel</string>
|
||||
<string name="welcome_image_tulip">Tulipe</string>
|
||||
<string name="welcome_image_no_selfies">Pas d’autoportrait</string>
|
||||
<string name="welcome_image_proprietary">Image privée</string>
|
||||
<string name="welcome_image_welcome_wikipedia">Bienvenue de Wikipédia</string>
|
||||
<string name="welcome_image_welcome_copyright">Droit d’auteur de bienvenue</string>
|
||||
<string name="welcome_image_sydney_opera_house">Maison de l’opéra de Sydney</string>
|
||||
<string name="cancel">Annuler</string>
|
||||
<string name="navigation_drawer_open">Ouvrir</string>
|
||||
<string name="navigation_drawer_close">Fermer</string>
|
||||
|
|
@ -170,4 +184,6 @@
|
|||
<string name="navigation_item_settings">Paramètres</string>
|
||||
<string name="navigation_item_feedback">Commentaire</string>
|
||||
<string name="navigation_item_logout">Déconnexion</string>
|
||||
<string name="nearby_info_menu_commons_article">Article de Communs</string>
|
||||
<string name="nearby_info_menu_wikidata_article">Article de WikiData</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@
|
|||
<string name="license_name_cc_by_sa_four"> Attribuzione-Condividi allo stesso modo 4.0</string>
|
||||
<string name="license_name_cc_by_four"> Attribuzione 4.0</string>
|
||||
<string name="license_name_cc_by_sa"> Attribuzione-Condividi allo stesso modo 3.0</string>
|
||||
<string name="license_name_cc_by">CC Attribuzione 3.0</string>
|
||||
<string name="license_name_cc_by"> Attribuzione 3.0</string>
|
||||
<string name="license_name_cc0">CC0</string>
|
||||
<string name="license_name_cc_by_sa_3_0">CC BY-SA 3.0</string>
|
||||
<string name="license_name_cc_by_sa_3_0_at">CC BY-SA 3.0 (Austria)</string>
|
||||
|
|
@ -124,7 +124,7 @@
|
|||
<string name="welcome_final_text">Pensi di aver capito?</string>
|
||||
<string name="welcome_final_button_text">Sì!</string>
|
||||
<string name="detail_panel_cats_label">Categorie</string>
|
||||
<string name="detail_panel_cats_loading" fuzzy="true">Caricamento…</string>
|
||||
<string name="detail_panel_cats_loading">Caricamento…</string>
|
||||
<string name="detail_panel_cats_none">Nessuna selezione</string>
|
||||
<string name="detail_description_empty">Nessuna descrizione</string>
|
||||
<string name="detail_license_empty">Licenza sconosciuta</string>
|
||||
|
|
@ -146,6 +146,12 @@
|
|||
<string name="maximum_limit_alert">Non è possibile mostrarne più di 500</string>
|
||||
<string name="login_failed_2fa_not_supported">L\'autenticazione a due fattori non è attualmente supportata.</string>
|
||||
<string name="logout_verification">Vuoi veramente uscire?</string>
|
||||
<string name="no_image_found">Nessuna immagine trovata</string>
|
||||
<string name="upload_image">Carica immagine</string>
|
||||
<string name="welcome_image_rainbow_bridge">Arcobaleno</string>
|
||||
<string name="welcome_image_tulip">Tulipano</string>
|
||||
<string name="welcome_image_no_selfies">No autoscatti (selfie)</string>
|
||||
<string name="welcome_image_sydney_opera_house">Teatro dell\'opera di Sydney</string>
|
||||
<string name="cancel">Annulla</string>
|
||||
<string name="navigation_drawer_open">Apri</string>
|
||||
<string name="navigation_drawer_close">Chiudi</string>
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@
|
|||
<string name="gps_disabled">ה־GPS במכשיר שלך אינו מופעל. האם להפעיל אותו?</string>
|
||||
<string name="enable_gps">הפעלת GPS</string>
|
||||
<string name="contributions_subtitle_zero">לא הועלה עדיין שום דבר</string>
|
||||
<plurals name="contributions_subtitle" fuzzy="true">
|
||||
<plurals name="contributions_subtitle">
|
||||
<item quantity="one">העלאה אחת</item>
|
||||
<item quantity="other">%d העלאות</item>
|
||||
</plurals>
|
||||
|
|
@ -129,7 +129,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>
|
||||
|
|
@ -159,6 +159,17 @@
|
|||
<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="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_sydney_opera_house">בית האופרה של סידני</string>
|
||||
<string name="cancel">ביטול</string>
|
||||
<string name="navigation_drawer_open">פתיחה</string>
|
||||
<string name="navigation_drawer_close">סגירה</string>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
<string name="menu_nearby">Cedhak kéné</string>
|
||||
<string name="provider_contributions">Unggahanku</string>
|
||||
<string name="menu_share">Dum</string>
|
||||
<string name="menu_open_in_browser">Delok ing Pangluru</string>
|
||||
<string name="menu_open_in_browser">Deleng ing Pangluru</string>
|
||||
<string name="share_title_hint">Sesirah</string>
|
||||
<string name="share_description_hint">Wedharan</string>
|
||||
<string name="login_failed_network">Ora bisa mlebu log - jaringané gagal</string>
|
||||
|
|
@ -41,6 +41,7 @@
|
|||
<string name="login_failed_password">Ora bisa mlebu log - tiliki tembung wadiné panjenengan</string>
|
||||
<string name="login_failed_throttled">Kakèhan upaya sing gagal. Jajalana manèh mengko.</string>
|
||||
<string name="login_failed_blocked">Ngapunten, panganggo iki wis diblokir ing Commons</string>
|
||||
<string name="login_failed_2fa_needed">Panjenengan kudu ngisi kodhe otèntifikasi rong faktoré panjenengan</string>
|
||||
<string name="login_failed_generic">Wurung mlebu log</string>
|
||||
<string name="share_upload_button">Unggah</string>
|
||||
<string name="multiple_share_base_title">Jenengi sèt iki</string>
|
||||
|
|
@ -49,6 +50,9 @@
|
|||
<string name="categories_search_text_hint">Golèk kategori</string>
|
||||
<string name="menu_save_categories">Simpen</string>
|
||||
<string name="refresh_button">Anyarana</string>
|
||||
<string name="gps_disabled">GPS dipatèni ing pirantiné panjenengan. Panjenengan arep ngurubaké?</string>
|
||||
<string name="enable_gps">Urubaké GPS</string>
|
||||
<string name="contributions_subtitle_zero">Durung ana unggahan</string>
|
||||
<plurals name="contributions_subtitle">
|
||||
<item quantity="zero">\@string/contributions_subtitle_zero</item>
|
||||
<item quantity="one">%d unggahan</item>
|
||||
|
|
@ -104,6 +108,8 @@
|
|||
<string name="license_name_cc_by_sa_4_0">CC BY-SA 3.0</string>
|
||||
<string name="license_name_cc_by_4_0">CC BY 4.0</string>
|
||||
<string name="license_name_cc_zero">CC Nul</string>
|
||||
<string name="tutorial_3_text">Tulung AJA ngunggah:</string>
|
||||
<string name="tutorial_4_text">Contoné unggahan:</string>
|
||||
<string name="welcome_final_text">Panjenengan sumerep, ta?</string>
|
||||
<string name="welcome_final_button_text">Iya!</string>
|
||||
<string name="detail_panel_cats_label">Kategori</string>
|
||||
|
|
@ -134,14 +140,28 @@
|
|||
<string name="set_limit">Setèl Watesan Unggahan Anyar</string>
|
||||
<string name="login_failed_2fa_not_supported">Otèntifikasi rong faktor saiki durung bisa.</string>
|
||||
<string name="logout_verification">Panjenengan yakin arep metu log?</string>
|
||||
<string name="commons_logo">Logo Commons</string>
|
||||
<string name="background_image">Gambar Latar Wuri</string>
|
||||
<string name="mediaimage_failed">Gambar Médhia Wurung</string>
|
||||
<string name="no_image_found">Gambar Ora Katemu</string>
|
||||
<string name="upload_image">Unggah Gambar</string>
|
||||
<string name="welcome_image_mount_zao">Gunung Zao</string>
|
||||
<string name="welcome_image_llamas">Llama</string>
|
||||
<string name="welcome_image_rainbow_bridge">Kreteg Kluwung</string>
|
||||
<string name="welcome_image_tulip">Tulip</string>
|
||||
<string name="welcome_image_no_selfies">Ora Ana Swafoto</string>
|
||||
<string name="welcome_image_welcome_wikipedia">Sugeng Rawuh ing Wikipédia</string>
|
||||
<string name="welcome_image_sydney_opera_house">Wisma Opera Sydney</string>
|
||||
<string name="cancel">Wurung</string>
|
||||
<string name="navigation_drawer_open">Bukak</string>
|
||||
<string name="navigation_drawer_close">Tutup</string>
|
||||
<string name="navigation_item_home">Tepas</string>
|
||||
<string name="navigation_item_upload">Unggah</string>
|
||||
<string name="navigation_item_nearby">Cedhak kéné</string>
|
||||
<string name="navigation_item_about">Bab</string>
|
||||
<string name="navigation_item_about">Ngenani</string>
|
||||
<string name="navigation_item_settings">Setèlan</string>
|
||||
<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">Artikel WikiData</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -1,39 +1,59 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">ವಿಕಿಮೀಡಿಯ ಕಾಮನ್ಸ್</string>
|
||||
<string name="app_name">ಕಾಮನ್ಸ್</string>
|
||||
<string name="menu_settings">ವ್ಯವಸ್ಥೆಗಳು</string>
|
||||
<string name="username">ಬಳಕೆದಾರ ಹೆಸರು</string>
|
||||
<string name="password">ಪ್ರವೇಶಪದ</string>
|
||||
<string name="login">ಲಾಗ್ ಇನ್</string>
|
||||
<string name="signup">ಸೈನ್ ಅಪ್</string>
|
||||
<string name="logging_in_title">ಲಾಗಿನ್ ಆಗುತ್ತಿದ್ದೀರಿ</string>
|
||||
<string name="logging_in_message">ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ…</string>
|
||||
<string name="login_success">ಲಾಗಿನ್ ಯಶಸ್ವಿ!</string>
|
||||
<string name="login_failed">ಲಾಗಿನ್ ಸಾಧ್ಯವಾಗಿಲ್ಲ!</string>
|
||||
<string name="upload_failed">ಈ ಕಡತ ಕಂಡುಬಂದಿಲ್ಲ. ದಯವಿಟ್ಟು ಇನ್ನೊಂದು ಕಡತ ಪ್ರಯತ್ನಿಸಿ.</string>
|
||||
<string name="authentication_failed">ದೃಢೀಕರಣ ವಿಫಲ!</string>
|
||||
<string name="uploading_started">ಅಪ್ಲೋಡ್ ಪ್ರಾರಂಭವಾಗಿದೆ!</string>
|
||||
<string name="upload_completed_notification_title">%1$s ಅಪ್ಲೋಡ್ ಆಗಿದೆ!</string>
|
||||
<string name="upload_completed_notification_text">ನಿಮ್ಮ ನಕಲೇರಿಕೆಯನ್ನು ನೋಡಲು ಮೆಲ್ಲಗೆ ತಟ್ಟಿ</string>
|
||||
<string name="upload_progress_notification_title_start">ನಕಲೇರಿಕೆಯ%1$s ಪ್ರಾರಂಭ</string>
|
||||
<string name="upload_progress_notification_title_in_progress">%1$s ನಕಲೇರಿಕೆ ಆಗಿದೆ!</string>
|
||||
<string name="upload_progress_notification_title_finishing">%1$s ಅಪ್ಲೋಡ್ ಮಾಡುವಿಕೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲಾಗುತ್ತಿದೆ</string>
|
||||
<string name="upload_failed_notification_title">%1$s ಅಪ್ಲೋಡ್ ಮಾಡುವಿಕೆ ವಿಫಲವಾಗಿದೆ</string>
|
||||
<string name="upload_failed_notification_subtitle">ನೋಡಲು ಮೆಲ್ಲಗೆ ತಟ್ಟಿ</string>
|
||||
<string name="title_activity_contributions">ನನ್ನ ನಕಲೇರಿಕೆಗಳು</string>
|
||||
<plurals name="uploads_pending_notification_indicator">
|
||||
<item quantity="one">%d file uploading\n%d ಕಡತ ಅಪ್ಲೋಡ್ ಅಗುತ್ತಿದೆ</item>
|
||||
<item quantity="other">%d files uploading\n%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">ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಜಿಪಿಎಸ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ನೀವು ಅದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ಬಯಸುವಿರಾ?</string>
|
||||
<string name="enable_gps">ಜಿಪಿಎಸ್ ಸಕ್ರಿಯಗೊಳಿಸು</string>
|
||||
<string name="contributions_subtitle_zero">ಇನ್ನೂ ಯಾವುದೆ ಅಪ್ಲೋಡ್ಗಳಿಲ್ಲ</string>
|
||||
<string name="categories_activity_title">ವರ್ಗಗಳು</string>
|
||||
<string name="preference_tracking">ಬಳಕೆಯ ವರದಿಗಳು</string>
|
||||
<string name="title_activity_settings">ವ್ಯವಸ್ಥೆಗಳು</string>
|
||||
|
|
|
|||
|
|
@ -20,9 +20,9 @@
|
|||
<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">
|
||||
<item quantity="one">1개 파일 올리는 중</item>
|
||||
<item quantity="other">파일 %d개 올리는 중</item>
|
||||
<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>
|
||||
|
|
@ -59,9 +59,9 @@
|
|||
<item quantity="one">1개 업로드</item>
|
||||
<item quantity="other">%d개 업로드</item>
|
||||
</plurals>
|
||||
<plurals name="starting_multiple_uploads" fuzzy="true">
|
||||
<item quantity="one">한 장 업로드 시작</item>
|
||||
<item quantity="other">%d 장 업로드 시작</item>
|
||||
<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>
|
||||
|
|
@ -124,7 +124,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>
|
||||
|
|
@ -152,6 +152,19 @@
|
|||
<string name="set_limit">최근 업로드 제한 설정</string>
|
||||
<string name="login_failed_2fa_not_supported">2요소 인증은 현재 지원하지 않습니다.</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_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>
|
||||
|
|
@ -162,4 +175,6 @@
|
|||
<string name="navigation_item_settings">설정</string>
|
||||
<string name="navigation_item_feedback">피드백</string>
|
||||
<string name="navigation_item_logout">로그아웃</string>
|
||||
<string name="nearby_info_menu_commons_article">공용 문서</string>
|
||||
<string name="nearby_info_menu_wikidata_article">위키데이터 문서</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<string name="login">Aloggen</string>
|
||||
<string name="signup">Schreift Iech an</string>
|
||||
<string name="logging_in_title">Aloggen</string>
|
||||
<string name="logging_in_message" fuzzy="true">Waart w.e.g. …</string>
|
||||
<string name="logging_in_message">Waart w.e.g. …</string>
|
||||
<string name="login_success">Umeldung huet geklappt!</string>
|
||||
<string name="login_failed">D\'Aloggen huet net funktionéiert</string>
|
||||
<string name="upload_failed">Fichier net fonnt. probéiert w.e.g. en anere Fichier.</string>
|
||||
|
|
@ -50,6 +50,7 @@
|
|||
<string name="categories_search_text_hint">Kategorie sichen</string>
|
||||
<string name="menu_save_categories">Späicheren</string>
|
||||
<string name="refresh_button">Aktualiséieren</string>
|
||||
<string name="gps_disabled">GPS ass op Ärem Apparat ausgeschalt. Wëllt Dir en aktivéieren?</string>
|
||||
<string name="enable_gps">GPS aktivéieren</string>
|
||||
<string name="contributions_subtitle_zero">Nach keng eropgeluede Fichieren</string>
|
||||
<plurals name="contributions_subtitle">
|
||||
|
|
@ -154,6 +155,20 @@
|
|||
<string name="_2fa_code">2FA-Code</string>
|
||||
<string name="maximum_limit">Maximal Limite</string>
|
||||
<string name="maximum_limit_alert">Et kënnen der net méi wéi 500 gewise ginn</string>
|
||||
<string name="logout_verification">Wëllt dir Iech wierklech ausloggen?</string>
|
||||
<string name="commons_logo">Commons-Logo</string>
|
||||
<string name="background_image">Hannergrondbild</string>
|
||||
<string name="no_image_found">Kee Bild fonnt</string>
|
||||
<string name="upload_image">Bild eroplueden</string>
|
||||
<string name="welcome_image_mount_zao">Bierg Zao</string>
|
||||
<string name="welcome_image_llamas">Lamaen</string>
|
||||
<string name="welcome_image_rainbow_bridge">Rainbow Bridge</string>
|
||||
<string name="welcome_image_tulip">Tulp</string>
|
||||
<string name="welcome_image_no_selfies">Keng Selfien</string>
|
||||
<string name="welcome_image_proprietary">Geschützt Bild</string>
|
||||
<string name="welcome_image_welcome_wikipedia">Wëllkomm Wikipedia</string>
|
||||
<string name="welcome_image_welcome_copyright">Wëllkomm Copyright</string>
|
||||
<string name="welcome_image_sydney_opera_house">Oper vu Sydney</string>
|
||||
<string name="cancel">Ofbriechen</string>
|
||||
<string name="navigation_drawer_open">Opmaachen</string>
|
||||
<string name="navigation_drawer_close">Zoumaachen</string>
|
||||
|
|
@ -164,4 +179,6 @@
|
|||
<string name="navigation_item_settings">Astellungen</string>
|
||||
<string name="navigation_item_feedback">Feedback</string>
|
||||
<string name="navigation_item_logout">Ausloggen</string>
|
||||
<string name="nearby_info_menu_commons_article">Commons-Artikel</string>
|
||||
<string name="nearby_info_menu_wikidata_article">Wikidata-Artikel</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@
|
|||
<string name="menu_download">Преземи</string>
|
||||
<string name="preference_license">Лиценца</string>
|
||||
<string name="use_previous">Користи претходен наслов/опис</string>
|
||||
<string name="allow_gps">Автоматски давај ја тековната местоположба</string>
|
||||
<string name="allow_gps">Автоматски давај тековна местоположба</string>
|
||||
<string name="allow_gps_summary">Добивање на тековната местоположба за да се дадат предлози за категории, доколку сликата нема геоознаки</string>
|
||||
<string name="preference_theme">Ноќен режим</string>
|
||||
<string name="preference_theme_summary">Користи темен изглед</string>
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@
|
|||
<string name="categories_search_text_hint">Categorieën zoeken</string>
|
||||
<string name="menu_save_categories">Opslaan</string>
|
||||
<string name="refresh_button">Vernieuwen</string>
|
||||
<string name="contributions_subtitle_zero">Nog geen uploads</string>
|
||||
<plurals name="contributions_subtitle" fuzzy="true">
|
||||
<item quantity="zero">Nog geen uploads</item>
|
||||
<item quantity="one">1 upload</item>
|
||||
|
|
@ -144,6 +145,7 @@
|
|||
<string name="media_detail_uploaded_date">Uploaddatum</string>
|
||||
<string name="use_wikidata">Wikidata gebruiken</string>
|
||||
<string name="_2fa_code">2FA-code</string>
|
||||
<string name="welcome_image_no_selfies">Geen selfies</string>
|
||||
<string name="cancel">Annuleren</string>
|
||||
<string name="navigation_drawer_open">Openen</string>
|
||||
<string name="navigation_drawer_close">Sluiten</string>
|
||||
|
|
|
|||
|
|
@ -50,6 +50,8 @@
|
|||
<string name="categories_search_text_hint">Szukaj kategorii</string>
|
||||
<string name="menu_save_categories">Zapisz</string>
|
||||
<string name="refresh_button">Odśwież</string>
|
||||
<string name="gps_disabled">GPS w twoim urządzeniu jest wyłączony. Czy chcesz go włączyć?</string>
|
||||
<string name="enable_gps">Włącz GPS</string>
|
||||
<plurals name="contributions_subtitle">
|
||||
<item quantity="zero">Przesłano @string/contributions_subtitle_zero</item>
|
||||
<item quantity="one">Przesłano %d plik</item>
|
||||
|
|
@ -74,7 +76,7 @@
|
|||
<string name="about_license">Oprogramowanie Open Source, wydane na licencji <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a>. Wikimedia Commons i jego logo są znakami towarowymi Wikimedia Foundation i są wykorzystywane za zgodą Wikimedia Foundation. Nie jesteśmy powiązani z Wikimedia Foundation.</string>
|
||||
<string name="about_improve"><a href=\"https://github.com/commons-app/apps-android-commons\">Kod źródłowy</a> oraz <a href=\"https://commons-app.github.io/\">strona internetowa</a> na GitHub. Aby zgłosić błąd lub sugestię, utwórz nowe <a href=\"https://github.com/commons-app/apps-android-commons/issues\">zgłoszenie na GitHub</a>.</string>
|
||||
<string name="about_privacy_policy"><a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Polityka prywatności</a></string>
|
||||
<string name="about_credits" fuzzy="true"><a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Twórcy</a></string>
|
||||
<string name="about_credits"><a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Twórcy</a></string>
|
||||
<string name="title_activity_about">O aplikacji</string>
|
||||
<string name="menu_feedback">Wyślij opinię (przez e-mail)</string>
|
||||
<string name="no_email_client">Klient e-mail nie jest zainstalowany</string>
|
||||
|
|
@ -126,7 +128,7 @@
|
|||
<string name="welcome_final_text">Czy wszystko jest jasne?</string>
|
||||
<string name="welcome_final_button_text">Tak!</string>
|
||||
<string name="detail_panel_cats_label">Kategorie</string>
|
||||
<string name="detail_panel_cats_loading" fuzzy="true">Ładowanie…</string>
|
||||
<string name="detail_panel_cats_loading">Ładowanie…</string>
|
||||
<string name="detail_panel_cats_none">Nic nie zaznaczono</string>
|
||||
<string name="detail_description_empty">Brak opisu</string>
|
||||
<string name="detail_license_empty">Nieznana licencja</string>
|
||||
|
|
@ -146,4 +148,12 @@
|
|||
<string name="become_a_tester_title">Zostań beta-testerem</string>
|
||||
<string name="become_a_tester_description">Dołącz do kanału bety w Google Play i dostań wczesny dostęp do nowych funkcji i łatek</string>
|
||||
<string name="use_wikidata">Użyj Wikidanych</string>
|
||||
<string name="_2fa_code">Kod 2FA</string>
|
||||
<string name="login_failed_2fa_not_supported">Uwierzytelnianie dwuskładnikowe obecnie nie jest obsługiwane.</string>
|
||||
<string name="cancel">Anuluj</string>
|
||||
<string name="navigation_drawer_open">Otwórz</string>
|
||||
<string name="navigation_drawer_close">Zamknij</string>
|
||||
<string name="navigation_item_upload">Prześlij</string>
|
||||
<string name="navigation_item_settings">Ustawienia</string>
|
||||
<string name="navigation_item_logout">Wyloguj</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -53,17 +53,18 @@
|
|||
<string name="refresh_button">Agiorné</string>
|
||||
<string name="gps_disabled">Ël GPS a l\'é disabilità su sò angign. Veul-lo ativelo?</string>
|
||||
<string name="enable_gps">Ativé ël GPS</string>
|
||||
<plurals name="contributions_subtitle" fuzzy="true">
|
||||
<item quantity="zero">Ancor gnun cariament</item>
|
||||
<item quantity="one">1 cariament</item>
|
||||
<string name="contributions_subtitle_zero">Ancor gnun cariament</string>
|
||||
<plurals name="contributions_subtitle">
|
||||
<item quantity="zero">\@string/contributions_subtitle_zero</item>
|
||||
<item quantity="one">%d cariament</item>
|
||||
<item quantity="other">%d cariament</item>
|
||||
</plurals>
|
||||
<plurals name="starting_multiple_uploads" fuzzy="true">
|
||||
<item quantity="one">1 cariament ancaminà</item>
|
||||
<plurals name="starting_multiple_uploads">
|
||||
<item quantity="one">%d cariament ancaminà</item>
|
||||
<item quantity="other">%d cariament ancaminà</item>
|
||||
</plurals>
|
||||
<plurals name="multiple_uploads_title" fuzzy="true">
|
||||
<item quantity="one">1 cariament</item>
|
||||
<plurals name="multiple_uploads_title">
|
||||
<item quantity="one">%d cariament</item>
|
||||
<item quantity="other">%d cariament</item>
|
||||
</plurals>
|
||||
<string name="categories_not_found">Gnun-e categorìe rëspondente a %1$s trovà</string>
|
||||
|
|
@ -77,7 +78,7 @@
|
|||
<string name="about_license">Ij programa Open Source a son publicà sota la <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">licensa Apache v2</a>. Wikimedia Commons e sò sìmbol a son dle marche argistrà dla Fondassion Wikimedia e a son dovrà con ël përmess ëd la Fondassion Wikimedia. Nojàutri i soma nen aprovà da o afilià a la Fondassion Wikimedia.</string>
|
||||
<string name="about_improve"><a href=\"https://github.com/commons-app/apps-android-commons\">Sorgiss</a> e <a href=\"https://commons-app.github.io/\">sit an sl\'aragnà</a> su GitHub. Creé na neuva <a href=\"https://github.com/commons-app/apps-android-commons/issues\">signalassion GitHub</a> për signalé dij givo e dij sugeriment.</string>
|
||||
<string name="about_privacy_policy"><a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Régole ëd confidensialità</a></string>
|
||||
<string name="about_credits" fuzzy="true"><a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">RINGRASSIAMENT</a></string>
|
||||
<string name="about_credits"><a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Ringrassiament</a></string>
|
||||
<string name="title_activity_about">A propòsit</string>
|
||||
<string name="menu_feedback">Mandé dij coment (për pòsta eletrònica)</string>
|
||||
<string name="no_email_client">Gnun clien ëd pòsta eletrònica anstalà</string>
|
||||
|
|
@ -138,6 +139,7 @@
|
|||
<string name="location_permission_rationale">Autorisassion facoltativa: Oten-e la posission atual për dij sugeriment ëd categorìa</string>
|
||||
<string name="ok">Va bin</string>
|
||||
<string name="title_activity_nearby">Pòst davzin</string>
|
||||
<string name="no_nearby">Trovà gnente ant ij parage</string>
|
||||
<string name="warning">Avertensa</string>
|
||||
<string name="file_exists">S\'archivi a esist già su Comun. É-lo sigur ëd vorèj andé anans?</string>
|
||||
<string name="yes">Bò</string>
|
||||
|
|
@ -146,8 +148,33 @@
|
|||
<string name="media_detail_media_title">Tìtol dël mojen</string>
|
||||
<string name="media_detail_description">Descrission</string>
|
||||
<string name="media_detail_description_explanation">La descrission dël mojen a va ambelessì. Sòn a podrìa esse potensialman longh, e a dovrà esse spantià su vàire linie. I speroma comsëssìa ch\'a ven-a grassios.</string>
|
||||
<string name="media_detail_uploaded_date">Dàita ëd cariament</string>
|
||||
<string name="become_a_tester_title">Dventé në sperimentador Beta</string>
|
||||
<string name="become_a_tester_description">Anscriv-se a nòstr canal beta su Google Play a oten-e n\'acess antissipà a le neuve fonsionalità e coression ëd givo</string>
|
||||
<string name="use_wikidata">Dovré Wikidàit</string>
|
||||
<string name="use_wikidata_summary">(Atension: disabilité sòn a podrìa provoché un gròss consum ëd dàit con ël sacociàbil)</string>
|
||||
<string name="_2fa_code">Còdes 2FA</string>
|
||||
<string name="number_of_uploads">Mè lìmit ëd cariament recent</string>
|
||||
<string name="maximum_limit">Lìmit màssim</string>
|
||||
<string name="maximum_limit_alert">Impossìbil ësmon-e pi che 500</string>
|
||||
<string name="set_limit">Fissé la limitassion ëd cariament recent</string>
|
||||
<string name="login_failed_2fa_not_supported">L\'autentificassion a doi fator për ël moment a l\'é nen sostnùa.</string>
|
||||
<string name="logout_verification">Veul-lo për da bon seurte dal sistema?</string>
|
||||
<string name="commons_logo">Marca ëd Comun</string>
|
||||
<string name="background_image">Plancia dë sfond</string>
|
||||
<string name="mediaimage_failed">Faliment ëd la plancia dël mojen</string>
|
||||
<string name="no_image_found">Gnun-a plancia trovà</string>
|
||||
<string name="upload_image">Carié na plancia</string>
|
||||
<string name="welcome_image_mount_zao">Mont Zao</string>
|
||||
<string name="welcome_image_llamas">Lama</string>
|
||||
<string name="welcome_image_rainbow_bridge">Pont Arcansiel</string>
|
||||
<string name="welcome_image_tulip">Tulipan</string>
|
||||
<string name="welcome_image_no_selfies">Gnun autoscat</string>
|
||||
<string name="welcome_image_proprietary">Plancia privà</string>
|
||||
<string name="welcome_image_welcome_wikipedia">Bin-ëvnù ëd Wikipedia</string>
|
||||
<string name="welcome_image_welcome_copyright">Drit d\'autor ëd bin-ëvnù</string>
|
||||
<string name="welcome_image_sydney_opera_house">Ca dl\'òpera ëd Sidney</string>
|
||||
<string name="cancel">Anulé</string>
|
||||
<string name="navigation_drawer_open">Duverté</string>
|
||||
<string name="navigation_drawer_close">Saré</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -98,6 +98,10 @@
|
|||
<string name="media_detail_title">{{Identical|Title}}</string>
|
||||
<string name="media_detail_description">{{Identical|Description}}</string>
|
||||
<string name="welcome_image_mount_zao">This is a mountain between Yamagata and Miyagi Prefectures in Japan, see [[d:Q167951]] for details.</string>
|
||||
<string name="welcome_image_llamas">An animal. See [[:d:Q42569|Wikidata item Q42569]] for a list of possible translations.</string>
|
||||
<string name="welcome_image_rainbow_bridge">A bridge in Japan. See [[:d:Q1046736|Wikidata item Q1046736]] for a list of possible translations.</string>
|
||||
<string name="welcome_image_tulip">A flower. See [[:d:Q93201|Wikidata item Q93201]] for a list of possible translations.</string>
|
||||
<string name="welcome_image_sydney_opera_house">A building in the city of Sydney. See [[:d:Q45178|Wikidata item Q45178]] for a list of possible translations.</string>
|
||||
<string name="cancel">{{Identical|Cancel}}</string>
|
||||
<string name="navigation_drawer_open">{{Identical|Open}}</string>
|
||||
<string name="navigation_drawer_close">{{Identical|Close}}</string>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -87,7 +87,7 @@
|
|||
<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>
|
||||
|
|
@ -134,7 +134,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>
|
||||
|
|
@ -165,6 +165,9 @@
|
|||
<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="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>
|
||||
|
|
@ -180,4 +183,5 @@
|
|||
<string name="navigation_item_settings">Настройки</string>
|
||||
<string name="navigation_item_feedback">Обратная связь</string>
|
||||
<string name="navigation_item_logout">Выйти</string>
|
||||
<string name="nearby_info_menu_commons_article">Статья на Викискладе</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -20,11 +20,11 @@
|
|||
<string name="upload_progress_notification_title_finishing">Avslutar uppladdning av %1$s</string>
|
||||
<string name="upload_failed_notification_title">Uppladdning av %1$s misslyckades</string>
|
||||
<string name="upload_failed_notification_subtitle">Tryck för att visa</string>
|
||||
<plurals name="uploads_pending_notification_indicator" fuzzy="true">
|
||||
<item quantity="one">1 filuppladdning</item>
|
||||
<item quantity="other">%d filuppladdningar</item>
|
||||
<plurals name="uploads_pending_notification_indicator">
|
||||
<item quantity="one">%d fil laddas upp</item>
|
||||
<item quantity="other">%d filer laddas upp</item>
|
||||
</plurals>
|
||||
<string name="title_activity_contributions" fuzzy="true">Mina uppladdningar</string>
|
||||
<string name="title_activity_contributions">Mina senaste uppladdningar</string>
|
||||
<string name="contribution_state_queued">Köade</string>
|
||||
<string name="contribution_state_failed">Misslyckades</string>
|
||||
<string name="contribution_state_in_progress">%1$d%% färdigt</string>
|
||||
|
|
@ -42,6 +42,7 @@
|
|||
<string name="login_failed_password">Det gick inte att logga in - var god kontrollera ditt lösenord</string>
|
||||
<string name="login_failed_throttled">För många misslyckade försök. Var god försök igen om några minuter.</string>
|
||||
<string name="login_failed_blocked">Tyvärr, denna användare har blockerats på Commons</string>
|
||||
<string name="login_failed_2fa_needed">Du måste ange din tvåstegsverifieringskod.</string>
|
||||
<string name="login_failed_generic">Inloggningen misslyckades</string>
|
||||
<string name="share_upload_button">Ladda upp</string>
|
||||
<string name="multiple_share_base_title">Namnge denna uppsättning</string>
|
||||
|
|
@ -50,17 +51,20 @@
|
|||
<string name="categories_search_text_hint">Sök kategorier</string>
|
||||
<string name="menu_save_categories">Spara</string>
|
||||
<string name="refresh_button">Uppdatera</string>
|
||||
<plurals name="contributions_subtitle" fuzzy="true">
|
||||
<item quantity="zero">Inga uppladdningar ännu</item>
|
||||
<item quantity="one">1 uppladdning</item>
|
||||
<string name="gps_disabled">GPS:en är inaktiverad på denna enhet. Vill du aktivera den?</string>
|
||||
<string name="enable_gps">Aktivera GPS</string>
|
||||
<string name="contributions_subtitle_zero">Inga uppladdningar ännu</string>
|
||||
<plurals name="contributions_subtitle">
|
||||
<item quantity="zero">\@string/contributions_subtitle_zero</item>
|
||||
<item quantity="one">%d uppladdning</item>
|
||||
<item quantity="other">%d uppladdningar</item>
|
||||
</plurals>
|
||||
<plurals name="starting_multiple_uploads" fuzzy="true">
|
||||
<item quantity="one">Startar 1 uppladdning</item>
|
||||
<plurals name="starting_multiple_uploads">
|
||||
<item quantity="one">Startar %d uppladdning</item>
|
||||
<item quantity="other">Startar %d uppladdningar</item>
|
||||
</plurals>
|
||||
<plurals name="multiple_uploads_title" fuzzy="true">
|
||||
<item quantity="one">1 uppladdning</item>
|
||||
<plurals name="multiple_uploads_title">
|
||||
<item quantity="one">%d uppladdning</item>
|
||||
<item quantity="other">%d uppladdningar</item>
|
||||
</plurals>
|
||||
<string name="categories_not_found">Inga kategorier som stämmer överens med %1$s hittades</string>
|
||||
|
|
@ -74,7 +78,7 @@
|
|||
<string name="about_license">Programvara med öppen källkod släppt under <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">licensen Apache v2</a>. Wikimedia Commons och dess logotyp är varumärken av Wikimedia Foundation och används med tillstånd från Wikimedia Foundation. Vi varken stöds eller är kopplade med Wikimedia Foundation.</string>
|
||||
<string name="about_improve"><a href=\"https://github.com/commons-app/apps-android-commons\">Källkoden</a> och <a href=\"https://commons-app.github.io/\">webbplatsen</a> på GitHub. Skapa ett nytt <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub-ärende</a> för att rapportera buggar och förslag.</string>
|
||||
<string name="about_privacy_policy"><a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Integritetspolicy</a></string>
|
||||
<string name="about_credits" fuzzy="true"><a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">ERKÄNNANDE</a></string>
|
||||
<string name="about_credits"><a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Erkännande</a></string>
|
||||
<string name="title_activity_about">Om</string>
|
||||
<string name="menu_feedback">Skicka feedback (via e-post)</string>
|
||||
<string name="no_email_client">Ingen e-postklient är installerad</string>
|
||||
|
|
@ -135,6 +139,7 @@
|
|||
<string name="location_permission_rationale">Valfri behörighet: Hämta aktuell plats för kategoriförslag</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="title_activity_nearby">Platser i närheten</string>
|
||||
<string name="no_nearby">Inga platser i närheten hittades</string>
|
||||
<string name="warning">Varning</string>
|
||||
<string name="file_exists">Denna fil finns redan på Commons. Är du säker på att du vill fortsätta?</string>
|
||||
<string name="yes">Ja</string>
|
||||
|
|
@ -143,8 +148,42 @@
|
|||
<string name="media_detail_media_title">Mediatitel</string>
|
||||
<string name="media_detail_description">Beskrivning</string>
|
||||
<string name="media_detail_description_explanation">Beskrivningen för mediafilen ska vara här. Den kan vara riktig lång och kommer att behöva sträcka sig över flera rader. Vi hoppas i alla fall att det kommer se bra ut.</string>
|
||||
<string name="media_detail_uploaded_date">Uppladdningsdatum</string>
|
||||
<string name="become_a_tester_title">Bli en betatestare</string>
|
||||
<string name="become_a_tester_description">Registrera dig på våra betakanal på Google Play och få tidig åtkomst till nya funktioner och buggfixar</string>
|
||||
<string name="use_wikidata">Använd Wikidata</string>
|
||||
<string name="use_wikidata_summary">(Varning: Stora mängder mobildata kan förekomma om detta inaktiveras)</string>
|
||||
<string name="_2fa_code">2-stegsverif.kod</string>
|
||||
<string name="number_of_uploads">Gräns för mina senaste uppladdningar</string>
|
||||
<string name="maximum_limit">Maxgräns</string>
|
||||
<string name="maximum_limit_alert">Kan inte visa fler än 500</string>
|
||||
<string name="set_limit">Ändra gräns för senaste uppladdningar</string>
|
||||
<string name="login_failed_2fa_not_supported">Tvåstegsverifiering stöds för tillfället inte.</string>
|
||||
<string name="logout_verification">Vill du verkligen logga ut?</string>
|
||||
<string name="commons_logo">Commons-logotyp</string>
|
||||
<string name="background_image">Bakgrundsbild</string>
|
||||
<string name="mediaimage_failed">Mediabild misslyckades</string>
|
||||
<string name="no_image_found">Ingen bild hittades</string>
|
||||
<string name="upload_image">Ladda upp bild</string>
|
||||
<string name="welcome_image_mount_zao">Zao</string>
|
||||
<string name="welcome_image_llamas">Lamor</string>
|
||||
<string name="welcome_image_rainbow_bridge">Regnbågsbro</string>
|
||||
<string name="welcome_image_tulip">Tulpan</string>
|
||||
<string name="welcome_image_no_selfies">Inga selfies</string>
|
||||
<string name="welcome_image_proprietary">Proprietär bild</string>
|
||||
<string name="welcome_image_welcome_wikipedia">Välkommen Wikipedia</string>
|
||||
<string name="welcome_image_welcome_copyright">Välkommen upphovsrätt</string>
|
||||
<string name="welcome_image_sydney_opera_house">Sydneys operahus</string>
|
||||
<string name="cancel">Avbryt</string>
|
||||
<string name="navigation_drawer_open">Öppna</string>
|
||||
<string name="navigation_drawer_close">Stäng</string>
|
||||
<string name="navigation_item_home">Hem</string>
|
||||
<string name="navigation_item_upload">Ladda upp</string>
|
||||
<string name="navigation_item_nearby">I närheten</string>
|
||||
<string name="navigation_item_about">Om</string>
|
||||
<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="nearby_info_menu_commons_article">Commons-artikel</string>
|
||||
<string name="nearby_info_menu_wikidata_article">WikiData-artikel</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@
|
|||
<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 +130,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>
|
||||
|
|
|
|||
|
|
@ -9,55 +9,55 @@ import org.junit.Test;
|
|||
|
||||
public class LatLngTests {
|
||||
@Test public void testZeroZero() {
|
||||
LatLng place = new LatLng(0, 0);
|
||||
LatLng place = new LatLng(0, 0, 0);
|
||||
String prettyString = place.getPrettyCoordinateString();
|
||||
Assert.assertThat(prettyString, is("0.0 N, 0.0 E"));
|
||||
}
|
||||
|
||||
@Test public void testAntipode() {
|
||||
LatLng place = new LatLng(0, 180);
|
||||
LatLng place = new LatLng(0, 180, 0);
|
||||
String prettyString = place.getPrettyCoordinateString();
|
||||
Assert.assertThat(prettyString, is("0.0 N, 180.0 W"));
|
||||
}
|
||||
|
||||
@Test public void testNorthPole() {
|
||||
LatLng place = new LatLng(90, 0);
|
||||
LatLng place = new LatLng(90, 0, 0);
|
||||
String prettyString = place.getPrettyCoordinateString();
|
||||
Assert.assertThat(prettyString, is("90.0 N, 0.0 E"));
|
||||
}
|
||||
|
||||
@Test public void testSouthPole() {
|
||||
LatLng place = new LatLng(-90, 0);
|
||||
LatLng place = new LatLng(-90, 0, 0);
|
||||
String prettyString = place.getPrettyCoordinateString();
|
||||
Assert.assertThat(prettyString, is("90.0 S, 0.0 E"));
|
||||
}
|
||||
|
||||
@Test public void testLargerNumbers() {
|
||||
LatLng place = new LatLng(120, 380);
|
||||
LatLng place = new LatLng(120, 380, 0);
|
||||
String prettyString = place.getPrettyCoordinateString();
|
||||
Assert.assertThat(prettyString, is("90.0 N, 20.0 E"));
|
||||
}
|
||||
|
||||
@Test public void testNegativeNumbers() {
|
||||
LatLng place = new LatLng(-120, -30);
|
||||
LatLng place = new LatLng(-120, -30, 0);
|
||||
String prettyString = place.getPrettyCoordinateString();
|
||||
Assert.assertThat(prettyString, is("90.0 S, 30.0 W"));
|
||||
}
|
||||
|
||||
@Test public void testTooBigWestValue() {
|
||||
LatLng place = new LatLng(20, -190);
|
||||
LatLng place = new LatLng(20, -190, 0);
|
||||
String prettyString = place.getPrettyCoordinateString();
|
||||
Assert.assertThat(prettyString, is("20.0 N, 170.0 E"));
|
||||
}
|
||||
|
||||
@Test public void testRounding() {
|
||||
LatLng place = new LatLng(0.1234567, -0.33333333);
|
||||
LatLng place = new LatLng(0.1234567, -0.33333333, 0);
|
||||
String prettyString = place.getPrettyCoordinateString();
|
||||
Assert.assertThat(prettyString, is("0.1235 N, 0.3333 W"));
|
||||
}
|
||||
|
||||
@Test public void testRoundingAgain() {
|
||||
LatLng place = new LatLng(-0.000001, -0.999999);
|
||||
LatLng place = new LatLng(-0.000001, -0.999999, 0);
|
||||
String prettyString = place.getPrettyCoordinateString();
|
||||
Assert.assertThat(prettyString, is("0.0 S, 1.0 W"));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,36 +10,36 @@ import org.junit.Test;
|
|||
|
||||
public class LengthUtilsTest {
|
||||
@Test public void testZeroDistance() {
|
||||
LatLng pointA = new LatLng(0, 0);
|
||||
LatLng pointB = new LatLng(0, 0);
|
||||
LatLng pointA = new LatLng(0, 0, 0);
|
||||
LatLng pointB = new LatLng(0, 0, 0);
|
||||
String distance = LengthUtils.formatDistanceBetween(pointA, pointB);
|
||||
Assert.assertThat(distance, is("0m"));
|
||||
}
|
||||
|
||||
@Test public void testOneDegreeOnEquator() {
|
||||
LatLng pointA = new LatLng(0, 0);
|
||||
LatLng pointB = new LatLng(0, 1);
|
||||
LatLng pointA = new LatLng(0, 0, 0);
|
||||
LatLng pointB = new LatLng(0, 1, 0);
|
||||
String distance = LengthUtils.formatDistanceBetween(pointA, pointB);
|
||||
Assert.assertThat(distance, is("111.2km"));
|
||||
}
|
||||
|
||||
@Test public void testOneDegreeFortyFiveDegrees() {
|
||||
LatLng pointA = new LatLng(45, 0);
|
||||
LatLng pointB = new LatLng(45, 1);
|
||||
LatLng pointA = new LatLng(45, 0, 0);
|
||||
LatLng pointB = new LatLng(45, 1, 0);
|
||||
String distance = LengthUtils.formatDistanceBetween(pointA, pointB);
|
||||
Assert.assertThat(distance, is("78.6km"));
|
||||
}
|
||||
|
||||
@Test public void testOneDegreeSouthPole() {
|
||||
LatLng pointA = new LatLng(-90, 0);
|
||||
LatLng pointB = new LatLng(-90, 1);
|
||||
LatLng pointA = new LatLng(-90, 0, 0);
|
||||
LatLng pointB = new LatLng(-90, 1, 0);
|
||||
String distance = LengthUtils.formatDistanceBetween(pointA, pointB);
|
||||
Assert.assertThat(distance, is("0m"));
|
||||
}
|
||||
|
||||
@Test public void testPoleToPole() {
|
||||
LatLng pointA = new LatLng(90, 0);
|
||||
LatLng pointB = new LatLng(-90, 0);
|
||||
LatLng pointA = new LatLng(90, 0, 0);
|
||||
LatLng pointB = new LatLng(-90, 0, 0);
|
||||
String distance = LengthUtils.formatDistanceBetween(pointA, pointB);
|
||||
Assert.assertThat(distance, is("20,015.1km"));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,8 @@ buildscript {
|
|||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath "com.android.tools.build:gradle:${project.gradleVersion}"
|
||||
classpath "com.android.tools.build:gradle:${project.gradleVersion}"
|
||||
classpath 'com.dicedmelon.gradle:jacoco-android:0.1.1'
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue