mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-26 12:23:58 +01:00
Merge branch 'master' into wikidataEdits
This commit is contained in:
commit
0e86741cc4
126 changed files with 1634 additions and 665 deletions
|
|
@ -19,12 +19,13 @@ android:
|
|||
components:
|
||||
- tools
|
||||
- platform-tools
|
||||
- build-tools-26.0.2
|
||||
- build-tools-27.0.0
|
||||
- extra-google-m2repository
|
||||
- extra-android-m2repository
|
||||
- ${ANDROID_TARGET}
|
||||
- android-25
|
||||
- android-26
|
||||
- android-27
|
||||
- sys-img-${ANDROID_ABI}-${ANDROID_TARGET}
|
||||
licenses:
|
||||
- 'android-sdk-license-.+'
|
||||
|
|
|
|||
|
|
@ -1,3 +1,7 @@
|
|||
## Title (required)
|
||||
|
||||
Fixes #{GitHub issue number and title (Please do not forget adding title) }
|
||||
|
||||
## Description (required)
|
||||
|
||||
Fixes #{GitHub issue number and title}
|
||||
|
|
@ -12,4 +16,4 @@ Tested on {API level & name of device/emulator}, with {build variant, e.g. ProdD
|
|||
|
||||
{Only for user interface changes, otherwise remove this section. See [how to take a screenshot](https://android.stackexchange.com/questions/1759/how-to-take-a-screenshot-with-an-android-device)}
|
||||
|
||||
_Note: Please ensure that you have read CONTRIBUTING.md if this is your first pull request._
|
||||
_Note: Please ensure that you have read CONTRIBUTING.md if this is your first pull request._
|
||||
|
|
@ -11,7 +11,6 @@ dependencies {
|
|||
implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar'
|
||||
implementation 'in.yuvi:http.fluent:1.3'
|
||||
implementation 'com.github.chrisbanes:PhotoView:2.0.0'
|
||||
implementation 'com.android.volley:volley:1.0.0'
|
||||
implementation 'ch.acra:acra:4.9.2'
|
||||
implementation 'org.mediawiki:api:1.3'
|
||||
implementation 'commons-codec:commons-codec:1.10'
|
||||
|
|
@ -20,7 +19,7 @@ dependencies {
|
|||
implementation 'com.jakewharton.timber:timber:4.5.1'
|
||||
implementation 'info.debatty:java-string-similarity:0.24'
|
||||
implementation 'com.borjabravo:readmoretextview:2.1.0'
|
||||
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
|
||||
implementation 'com.android.support.constraint:constraint-layout:1.1.0'
|
||||
implementation ('com.mapbox.mapboxsdk:mapbox-android-sdk:5.4.1@aar'){
|
||||
transitive=true
|
||||
}
|
||||
|
|
@ -69,10 +68,14 @@ dependencies {
|
|||
testImplementation 'com.nhaarman:mockito-kotlin:1.5.0'
|
||||
testImplementation 'com.squareup.okhttp3:mockwebserver:3.8.1'
|
||||
|
||||
implementation 'com.caverock:androidsvg:1.2.1'
|
||||
implementation 'com.github.bumptech.glide:glide:4.7.1'
|
||||
kapt 'com.github.bumptech.glide:compiler:4.7.1'
|
||||
|
||||
androidTestImplementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
|
||||
androidTestImplementation 'com.squareup.okhttp3:mockwebserver:3.8.1'
|
||||
androidTestImplementation "com.android.support:support-annotations:$SUPPORT_LIB_VERSION"
|
||||
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2-alpha1'
|
||||
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
|
||||
|
||||
debugImplementation "com.squareup.leakcanary:leakcanary-android:$LEAK_CANARY"
|
||||
releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:$LEAK_CANARY"
|
||||
|
|
@ -117,7 +120,7 @@ android {
|
|||
buildTypes {
|
||||
release {
|
||||
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'
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt', 'proguard-glide.txt'
|
||||
}
|
||||
debug {
|
||||
applicationIdSuffix ".debug"
|
||||
|
|
|
|||
9
app/proguard-glide.txt
Normal file
9
app/proguard-glide.txt
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
-keep public class * implements com.bumptech.glide.module.GlideModule
|
||||
-keep public class * extends com.bumptech.glide.module.AppGlideModule
|
||||
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
|
||||
**[] $VALUES;
|
||||
public *;
|
||||
}
|
||||
|
||||
# for DexGuard only
|
||||
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
|
||||
|
|
@ -1,5 +1,4 @@
|
|||
-dontobfuscate
|
||||
-keep class org.apache.http.** { *; }
|
||||
-dontwarn org.apache.http.**
|
||||
-keep class fr.free.nrw.commons.upload.MwVolleyApi$Page {*;}
|
||||
-keep class android.support.v7.widget.ShareActionProvider { *; }
|
||||
|
|
@ -18,7 +18,7 @@ task checkstyle(type: Checkstyle) {
|
|||
reports {
|
||||
html {
|
||||
enabled true
|
||||
destination "${project.buildDir}/reports/checkstyle/checkstyle.html"
|
||||
destination file("${project.buildDir}/reports/checkstyle/checkstyle.html")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -36,10 +36,10 @@ task pmd(type: Pmd) {
|
|||
xml.enabled = false
|
||||
html.enabled = true
|
||||
xml {
|
||||
destination "${project.buildDir}/reports/pmd/pmd.xml"
|
||||
destination file("${project.buildDir}/reports/pmd/pmd.xml")
|
||||
}
|
||||
html {
|
||||
destination "${project.buildDir}/reports/pmd/pmd.html"
|
||||
destination file("${project.buildDir}/reports/pmd/pmd.html")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
|
||||
<uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS" />
|
||||
<uses-permission android:name="android.permission.READ_LOGS"/>
|
||||
<uses-permission android:name="android.permission.SET_WALLPAPER"/>
|
||||
|
||||
<!-- Needed only if your app targets Android 5.0 (API level 21) or higher. -->
|
||||
<uses-feature android:name="android.hardware.location.gps" />
|
||||
|
|
|
|||
|
|
@ -271,11 +271,11 @@ public class LoginActivity extends AccountAuthenticatorActivity {
|
|||
showMessageAndCancelDialog(R.string.login_failed_network);
|
||||
} else if (result.toLowerCase(Locale.getDefault()).contains("nosuchuser".toLowerCase()) || result.toLowerCase().contains("noname".toLowerCase())) {
|
||||
// Matches nosuchuser, nosuchusershort, noname
|
||||
showMessageAndCancelDialog(R.string.login_failed_username);
|
||||
showMessageAndCancelDialog(R.string.login_failed_wrong_credentials);
|
||||
emptySensitiveEditFields();
|
||||
} else if (result.toLowerCase(Locale.getDefault()).contains("wrongpassword".toLowerCase())) {
|
||||
// Matches wrongpassword, wrongpasswordempty
|
||||
showMessageAndCancelDialog(R.string.login_failed_password);
|
||||
showMessageAndCancelDialog(R.string.login_failed_wrong_credentials);
|
||||
emptySensitiveEditFields();
|
||||
} else if (result.toLowerCase(Locale.getDefault()).contains("throttle".toLowerCase())) {
|
||||
// Matches unknown throttle error codes
|
||||
|
|
|
|||
|
|
@ -7,18 +7,25 @@ import java.util.ArrayList;
|
|||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import fr.free.nrw.commons.upload.MwVolleyApi;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import fr.free.nrw.commons.upload.GpsCategoryModel;
|
||||
import timber.log.Timber;
|
||||
|
||||
@Singleton
|
||||
public class CacheController {
|
||||
|
||||
private final GpsCategoryModel gpsCategoryModel;
|
||||
private final QuadTree<List<String>> quadTree;
|
||||
private double x, y;
|
||||
private QuadTree<List<String>> quadTree;
|
||||
private double xMinus, xPlus, yMinus, yPlus;
|
||||
|
||||
private static final int EARTH_RADIUS = 6378137;
|
||||
|
||||
public CacheController() {
|
||||
@Inject
|
||||
CacheController(GpsCategoryModel gpsCategoryModel) {
|
||||
this.gpsCategoryModel = gpsCategoryModel;
|
||||
quadTree = new QuadTree<>(-180, -90, +180, +90);
|
||||
}
|
||||
|
||||
|
|
@ -31,8 +38,8 @@ public class CacheController {
|
|||
|
||||
public void cacheCategory() {
|
||||
List<String> pointCatList = new ArrayList<>();
|
||||
if (MwVolleyApi.GpsCatExists.getGpsCatExists()) {
|
||||
pointCatList.addAll(MwVolleyApi.getGpsCat());
|
||||
if (gpsCategoryModel.getGpsCatExists()) {
|
||||
pointCatList.addAll(gpsCategoryModel.getCategoryList());
|
||||
Timber.d("Categories being cached: %s", pointCatList);
|
||||
} else {
|
||||
Timber.d("No categories found, so no categories cached");
|
||||
|
|
@ -65,7 +72,7 @@ public class CacheController {
|
|||
}
|
||||
|
||||
//Based on algorithm at http://gis.stackexchange.com/questions/2951/algorithm-for-offsetting-a-latitude-longitude-by-some-amount-of-meters
|
||||
public void convertCoordRange() {
|
||||
private void convertCoordRange() {
|
||||
//Position, decimal degrees
|
||||
double lat = y;
|
||||
double lon = x;
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ import butterknife.ButterKnife;
|
|||
import fr.free.nrw.commons.R;
|
||||
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
|
||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
||||
import fr.free.nrw.commons.upload.MwVolleyApi;
|
||||
import fr.free.nrw.commons.upload.GpsCategoryModel;
|
||||
import fr.free.nrw.commons.utils.StringSortingUtils;
|
||||
import fr.free.nrw.commons.utils.ViewUtil;
|
||||
import io.reactivex.Observable;
|
||||
|
|
@ -73,6 +73,7 @@ public class CategorizationFragment extends CommonsDaggerSupportFragment {
|
|||
@Inject @Named("prefs") SharedPreferences prefsPrefs;
|
||||
@Inject @Named("direct_nearby_upload_prefs") SharedPreferences directPrefs;
|
||||
@Inject CategoryDao categoryDao;
|
||||
@Inject GpsCategoryModel gpsCategoryModel;
|
||||
|
||||
private RVRendererAdapter<CategoryItem> categoriesAdapter;
|
||||
private OnCategoriesSaveHandler onCategoriesSaveHandler;
|
||||
|
|
@ -253,7 +254,6 @@ public class CategorizationFragment extends CommonsDaggerSupportFragment {
|
|||
}
|
||||
|
||||
private Observable<CategoryItem> defaultCategories() {
|
||||
|
||||
Observable<CategoryItem> directCat = directCategories();
|
||||
if (hasDirectCategories) {
|
||||
Timber.d("Image has direct Cat");
|
||||
|
|
@ -287,9 +287,7 @@ public class CategorizationFragment extends CommonsDaggerSupportFragment {
|
|||
}
|
||||
|
||||
private Observable<CategoryItem> gpsCategories() {
|
||||
return Observable.fromIterable(
|
||||
MwVolleyApi.GpsCatExists.getGpsCatExists()
|
||||
? MwVolleyApi.getGpsCat() : new ArrayList<>())
|
||||
return Observable.fromIterable(gpsCategoryModel.getCategoryList())
|
||||
.map(name -> new CategoryItem(name, false));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -224,4 +224,14 @@ public class CategoryImagesListFragment extends DaggerFragment {
|
|||
public ListAdapter getAdapter() {
|
||||
return gridView.getAdapter();
|
||||
}
|
||||
|
||||
/**
|
||||
* This method will be called on back pressed of CategoryImagesActivity.
|
||||
* It initializes the grid view by setting adapter.
|
||||
*/
|
||||
@Override
|
||||
public void onResume() {
|
||||
gridView.setAdapter(gridAdapter);
|
||||
super.onResume();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,17 +9,16 @@ import dagger.android.support.AndroidSupportInjectionModule;
|
|||
import fr.free.nrw.commons.CommonsApplication;
|
||||
import fr.free.nrw.commons.MediaWikiImageView;
|
||||
import fr.free.nrw.commons.auth.LoginActivity;
|
||||
import fr.free.nrw.commons.contributions.Contribution;
|
||||
import fr.free.nrw.commons.contributions.ContributionsActivity;
|
||||
import fr.free.nrw.commons.contributions.ContributionsSyncAdapter;
|
||||
import fr.free.nrw.commons.delete.DeleteTask;
|
||||
import fr.free.nrw.commons.modifications.ModificationsSyncAdapter;
|
||||
import fr.free.nrw.commons.settings.SettingsFragment;
|
||||
import fr.free.nrw.commons.nearby.PlaceRenderer;
|
||||
import fr.free.nrw.commons.settings.SettingsFragment;
|
||||
|
||||
@Singleton
|
||||
@Component(modules = {
|
||||
CommonsApplicationModule.class,
|
||||
NetworkingModule.class,
|
||||
AndroidInjectionModule.class,
|
||||
AndroidSupportInjectionModule.class,
|
||||
ActivityBuilderModule.class,
|
||||
|
|
|
|||
|
|
@ -13,14 +13,10 @@ import javax.inject.Singleton;
|
|||
|
||||
import dagger.Module;
|
||||
import dagger.Provides;
|
||||
import fr.free.nrw.commons.BuildConfig;
|
||||
import fr.free.nrw.commons.CommonsApplication;
|
||||
import fr.free.nrw.commons.auth.AccountUtil;
|
||||
import fr.free.nrw.commons.auth.SessionManager;
|
||||
import fr.free.nrw.commons.caching.CacheController;
|
||||
import fr.free.nrw.commons.data.DBOpenHelper;
|
||||
import fr.free.nrw.commons.location.LocationServiceManager;
|
||||
import fr.free.nrw.commons.mwapi.ApacheHttpClientMediaWikiApi;
|
||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
||||
import fr.free.nrw.commons.nearby.NearbyPlaces;
|
||||
import fr.free.nrw.commons.upload.UploadController;
|
||||
|
|
@ -35,7 +31,6 @@ import static fr.free.nrw.commons.modifications.ModificationsContentProvider.MOD
|
|||
@SuppressWarnings({"WeakerAccess", "unused"})
|
||||
public class CommonsApplicationModule {
|
||||
public static final String CATEGORY_AUTHORITY = "fr.free.nrw.commons.categories.contentprovider";
|
||||
public static final long OK_HTTP_CACHE_SIZE = 10 * 1024 * 1024;
|
||||
|
||||
private Context applicationContext;
|
||||
|
||||
|
|
@ -144,12 +139,6 @@ public class CommonsApplicationModule {
|
|||
return new Gson();
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
public CacheController provideCacheController() {
|
||||
return new CacheController();
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
public DBOpenHelper provideDBOpenHelper(Context context) {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,59 @@
|
|||
package fr.free.nrw.commons.di;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import dagger.Module;
|
||||
import dagger.Provides;
|
||||
import fr.free.nrw.commons.BuildConfig;
|
||||
import fr.free.nrw.commons.mwapi.ApacheHttpClientMediaWikiApi;
|
||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
||||
import okhttp3.HttpUrl;
|
||||
import okhttp3.OkHttpClient;
|
||||
|
||||
@Module
|
||||
@SuppressWarnings({"WeakerAccess", "unused"})
|
||||
public class NetworkingModule {
|
||||
public static final long OK_HTTP_CACHE_SIZE = 10 * 1024 * 1024;
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
public OkHttpClient provideOkHttpClient() {
|
||||
return new OkHttpClient.Builder().build();
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
public MediaWikiApi provideMediaWikiApi(Context context,
|
||||
@Named("default_preferences") SharedPreferences defaultPreferences,
|
||||
@Named("category_prefs") SharedPreferences categoryPrefs,
|
||||
Gson gson) {
|
||||
return new ApacheHttpClientMediaWikiApi(context, BuildConfig.WIKIMEDIA_API_HOST, defaultPreferences, categoryPrefs, gson);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Named("commons_mediawiki_url")
|
||||
@NonNull
|
||||
@SuppressWarnings("ConstantConditions")
|
||||
public HttpUrl provideMwUrl() {
|
||||
return HttpUrl.parse(BuildConfig.COMMONS_URL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gson objects are very heavy. The app should ideally be using just one instance of it instead of creating new instances everywhere.
|
||||
* @return returns a singleton Gson instance
|
||||
*/
|
||||
@Provides
|
||||
@Singleton
|
||||
public Gson provideGson() {
|
||||
return new GsonBuilder().create();
|
||||
}
|
||||
|
||||
}
|
||||
36
app/src/main/java/fr/free/nrw/commons/glide/SvgDecoder.java
Normal file
36
app/src/main/java/fr/free/nrw/commons/glide/SvgDecoder.java
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
package fr.free.nrw.commons.glide;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import com.bumptech.glide.load.Options;
|
||||
import com.bumptech.glide.load.ResourceDecoder;
|
||||
import com.bumptech.glide.load.engine.Resource;
|
||||
import com.bumptech.glide.load.resource.SimpleResource;
|
||||
import com.caverock.androidsvg.SVG;
|
||||
import com.caverock.androidsvg.SVGParseException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
/**
|
||||
* Decodes an SVG internal representation from an {@link InputStream}.
|
||||
*/
|
||||
public class SvgDecoder implements ResourceDecoder<InputStream, SVG> {
|
||||
|
||||
@Override
|
||||
public boolean handles(@NonNull InputStream source, @NonNull Options options) {
|
||||
// TODO: Can we tell?
|
||||
return true;
|
||||
}
|
||||
|
||||
public Resource<SVG> decode(@NonNull InputStream source, int width, int height,
|
||||
@NonNull Options options)
|
||||
throws IOException {
|
||||
try {
|
||||
SVG svg = SVG.getFromInputStream(source);
|
||||
return new SimpleResource<>(svg);
|
||||
} catch (SVGParseException ex) {
|
||||
throw new IOException("Cannot load SVG from stream", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
package fr.free.nrw.commons.glide;
|
||||
|
||||
import android.graphics.Picture;
|
||||
import android.graphics.drawable.PictureDrawable;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import com.bumptech.glide.load.Options;
|
||||
import com.bumptech.glide.load.engine.Resource;
|
||||
import com.bumptech.glide.load.resource.SimpleResource;
|
||||
import com.bumptech.glide.load.resource.transcode.ResourceTranscoder;
|
||||
import com.caverock.androidsvg.SVG;
|
||||
|
||||
/**
|
||||
* Convert the {@link SVG}'s internal representation to an Android-compatible one
|
||||
* ({@link Picture}).
|
||||
*/
|
||||
public class SvgDrawableTranscoder implements ResourceTranscoder<SVG, PictureDrawable> {
|
||||
@Nullable
|
||||
@Override
|
||||
public Resource<PictureDrawable> transcode(@NonNull Resource<SVG> toTranscode,
|
||||
@NonNull Options options) {
|
||||
SVG svg = toTranscode.get();
|
||||
Picture picture = svg.renderToPicture();
|
||||
PictureDrawable drawable = new PictureDrawable(picture);
|
||||
return new SimpleResource<>(drawable);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
package fr.free.nrw.commons.glide;
|
||||
|
||||
import android.graphics.drawable.PictureDrawable;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import com.bumptech.glide.load.DataSource;
|
||||
import com.bumptech.glide.load.engine.GlideException;
|
||||
import com.bumptech.glide.request.RequestListener;
|
||||
import com.bumptech.glide.request.target.ImageViewTarget;
|
||||
import com.bumptech.glide.request.target.Target;
|
||||
|
||||
/**
|
||||
* Listener which updates the {@link ImageView} to be software rendered, because
|
||||
* {@link com.caverock.androidsvg.SVG SVG}/{@link android.graphics.Picture Picture} can't render on
|
||||
* a hardware backed {@link android.graphics.Canvas Canvas}.
|
||||
*/
|
||||
public class SvgSoftwareLayerSetter implements RequestListener<PictureDrawable> {
|
||||
|
||||
/**
|
||||
* Sets the layer type to none if the load fails
|
||||
* @param e
|
||||
* @param model
|
||||
* @param target
|
||||
* @param isFirstResource
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean onLoadFailed(GlideException e, Object model, Target<PictureDrawable> target,
|
||||
boolean isFirstResource) {
|
||||
ImageView view = ((ImageViewTarget<?>) target).getView();
|
||||
view.setLayerType(ImageView.LAYER_TYPE_NONE, null);
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the layer type to software when the resource is ready
|
||||
* @param resource
|
||||
* @param model
|
||||
* @param target
|
||||
* @param dataSource
|
||||
* @param isFirstResource
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean onResourceReady(PictureDrawable resource, Object model,
|
||||
Target<PictureDrawable> target, DataSource dataSource, boolean isFirstResource) {
|
||||
ImageView view = ((ImageViewTarget<?>) target).getView();
|
||||
view.setLayerType(ImageView.LAYER_TYPE_SOFTWARE, null);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -35,6 +35,9 @@ import java.util.Locale;
|
|||
import javax.inject.Inject;
|
||||
import javax.inject.Provider;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import butterknife.OnClick;
|
||||
import fr.free.nrw.commons.License;
|
||||
import fr.free.nrw.commons.LicenseList;
|
||||
import fr.free.nrw.commons.Media;
|
||||
|
|
@ -56,16 +59,16 @@ import static android.widget.Toast.LENGTH_SHORT;
|
|||
public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
||||
|
||||
private boolean editable;
|
||||
private boolean isFeaturedMedia;
|
||||
private boolean isCategoryImage;
|
||||
private MediaDetailPagerFragment.MediaDetailProvider detailProvider;
|
||||
private int index;
|
||||
|
||||
public static MediaDetailFragment forMedia(int index, boolean editable, boolean isFeaturedMedia) {
|
||||
public static MediaDetailFragment forMedia(int index, boolean editable, boolean isCategoryImage) {
|
||||
MediaDetailFragment mf = new MediaDetailFragment();
|
||||
|
||||
Bundle state = new Bundle();
|
||||
state.putBoolean("editable", editable);
|
||||
state.putBoolean("isFeaturedMedia", isFeaturedMedia);
|
||||
state.putBoolean("isCategoryImage", isCategoryImage);
|
||||
state.putInt("index", index);
|
||||
state.putInt("listIndex", 0);
|
||||
state.putInt("listTop", 0);
|
||||
|
|
@ -128,7 +131,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
|||
super.onSaveInstanceState(outState);
|
||||
outState.putInt("index", index);
|
||||
outState.putBoolean("editable", editable);
|
||||
outState.putBoolean("isFeaturedMedia", isFeaturedMedia);
|
||||
outState.putBoolean("isCategoryImage", isCategoryImage);
|
||||
|
||||
getScrollPosition();
|
||||
outState.putInt("listTop", initialListTop);
|
||||
|
|
@ -144,12 +147,12 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
|||
|
||||
if (savedInstanceState != null) {
|
||||
editable = savedInstanceState.getBoolean("editable");
|
||||
isFeaturedMedia = savedInstanceState.getBoolean("isFeaturedMedia");
|
||||
isCategoryImage = savedInstanceState.getBoolean("isCategoryImage");
|
||||
index = savedInstanceState.getInt("index");
|
||||
initialListTop = savedInstanceState.getInt("listTop");
|
||||
} else {
|
||||
editable = getArguments().getBoolean("editable");
|
||||
isFeaturedMedia = getArguments().getBoolean("isFeaturedMedia");
|
||||
isCategoryImage = getArguments().getBoolean("isCategoryImage");
|
||||
index = getArguments().getInt("index");
|
||||
initialListTop = 0;
|
||||
}
|
||||
|
|
@ -161,7 +164,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
|||
|
||||
ButterKnife.bind(this,view);
|
||||
|
||||
if (isFeaturedMedia){
|
||||
if (isCategoryImage){
|
||||
authorLayout.setVisibility(VISIBLE);
|
||||
} else {
|
||||
authorLayout.setVisibility(GONE);
|
||||
|
|
@ -328,7 +331,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
|||
if (!TextUtils.isEmpty(licenseLink(media))) {
|
||||
openWebBrowser(licenseLink(media));
|
||||
} else {
|
||||
if(isFeaturedMedia) {
|
||||
if(isCategoryImage) {
|
||||
Timber.d("Unable to fetch license URL for %s", media.getLicense());
|
||||
} else {
|
||||
Toast toast = Toast.makeText(getContext(), getString(R.string.null_url), Toast.LENGTH_SHORT);
|
||||
|
|
@ -503,8 +506,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
|||
if (media.getRequestedDeletion()){
|
||||
delete.setVisibility(GONE);
|
||||
nominatedForDeletion.setVisibility(VISIBLE);
|
||||
}
|
||||
else{
|
||||
} else if (!isCategoryImage) {
|
||||
delete.setVisibility(VISIBLE);
|
||||
nominatedForDeletion.setVisibility(GONE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,9 +2,11 @@ package fr.free.nrw.commons.media;
|
|||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.DownloadManager;
|
||||
import android.app.WallpaperManager;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.database.DataSetObserver;
|
||||
import android.graphics.Bitmap;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
|
|
@ -26,6 +28,8 @@ import android.view.View;
|
|||
import android.view.ViewGroup;
|
||||
import android.widget.Toast;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import javax.inject.Inject;
|
||||
|
|
@ -38,12 +42,15 @@ import fr.free.nrw.commons.contributions.Contribution;
|
|||
import fr.free.nrw.commons.contributions.ContributionsActivity;
|
||||
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
|
||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
||||
import fr.free.nrw.commons.utils.ImageUtils;
|
||||
import timber.log.Timber;
|
||||
|
||||
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
|
||||
import static android.content.Context.DOWNLOAD_SERVICE;
|
||||
import static android.content.Intent.ACTION_VIEW;
|
||||
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||
import static android.widget.Toast.LENGTH_SHORT;
|
||||
import static com.mapbox.mapboxsdk.Mapbox.getApplicationContext;
|
||||
|
||||
public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment implements ViewPager.OnPageChangeListener {
|
||||
|
||||
|
|
@ -140,6 +147,10 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple
|
|||
// Download
|
||||
downloadMedia(m);
|
||||
return true;
|
||||
case R.id.menu_set_as_wallpaper:
|
||||
// Set wallpaper
|
||||
setWallpaper(m);
|
||||
return true;
|
||||
case R.id.menu_retry_current_image:
|
||||
// Retry
|
||||
((ContributionsActivity) getActivity()).retryUpload(pager.getCurrentItem());
|
||||
|
|
@ -155,6 +166,19 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the media as the device's wallpaper if the imageUrl is not null
|
||||
* Fails silently if setting the wallpaper fails
|
||||
* @param media
|
||||
*/
|
||||
private void setWallpaper(Media media) {
|
||||
if(media.getImageUrl() == null || media.getImageUrl().isEmpty()) {
|
||||
Timber.d("Media URL not present");
|
||||
return;
|
||||
}
|
||||
ImageUtils.setWallpaperFromImageUrl(getActivity(), Uri.parse(media.getImageUrl()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Start the media file downloading to the local SD card/storage.
|
||||
* The file can then be opened in Gallery or other apps.
|
||||
|
|
|
|||
|
|
@ -517,8 +517,8 @@ public class ApacheHttpClientMediaWikiApi implements MediaWikiApi {
|
|||
.param("notprop", "list")
|
||||
.param("format", "xml")
|
||||
.param("meta", "notifications")
|
||||
// .param("meta", "notifications")
|
||||
.param("notformat", "model")
|
||||
.param("notwikis", "wikidatawiki|commonswiki|enwiki")
|
||||
.get()
|
||||
.getNode("/api/query/notifications/list");
|
||||
} catch (IOException e) {
|
||||
|
|
|
|||
101
app/src/main/java/fr/free/nrw/commons/mwapi/CategoryApi.java
Normal file
101
app/src/main/java/fr/free/nrw/commons/mwapi/CategoryApi.java
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
package fr.free.nrw.commons.mwapi;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
|
||||
import fr.free.nrw.commons.mwapi.model.ApiResponse;
|
||||
import fr.free.nrw.commons.mwapi.model.Page;
|
||||
import fr.free.nrw.commons.mwapi.model.PageCategory;
|
||||
import io.reactivex.Single;
|
||||
import okhttp3.HttpUrl;
|
||||
import okhttp3.OkHttpClient;
|
||||
import okhttp3.Request;
|
||||
import okhttp3.Response;
|
||||
import okhttp3.ResponseBody;
|
||||
import timber.log.Timber;
|
||||
|
||||
/**
|
||||
* Uses the OkHttp library to implement calls to the Commons MediaWiki API to match GPS coordinates
|
||||
* with nearby Commons categories. Parses the results using GSON to obtain a list of relevant
|
||||
* categories. Note: that caller is responsible for executing the request() method on a background
|
||||
* thread.
|
||||
*/
|
||||
public class CategoryApi {
|
||||
|
||||
private final OkHttpClient okHttpClient;
|
||||
private final HttpUrl mwUrl;
|
||||
private final Gson gson;
|
||||
|
||||
@Inject
|
||||
public CategoryApi(OkHttpClient okHttpClient, Gson gson,
|
||||
@Named("commons_mediawiki_url") HttpUrl mwUrl) {
|
||||
this.okHttpClient = okHttpClient;
|
||||
this.mwUrl = mwUrl;
|
||||
this.gson = gson;
|
||||
}
|
||||
|
||||
public Single<List<String>> request(String coords) {
|
||||
return Single.fromCallable(() -> {
|
||||
HttpUrl apiUrl = buildUrl(coords);
|
||||
Timber.d("URL: %s", apiUrl.toString());
|
||||
|
||||
Request request = new Request.Builder().get().url(apiUrl).build();
|
||||
Response response = okHttpClient.newCall(request).execute();
|
||||
ResponseBody body = response.body();
|
||||
if (body == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
ApiResponse apiResponse = gson.fromJson(body.charStream(), ApiResponse.class);
|
||||
Set<String> categories = new LinkedHashSet<>();
|
||||
if (apiResponse != null && apiResponse.hasPages()) {
|
||||
for (Page page : apiResponse.query.pages) {
|
||||
for (PageCategory category : page.getCategories()) {
|
||||
categories.add(category.withoutPrefix());
|
||||
}
|
||||
}
|
||||
}
|
||||
return new ArrayList<>(categories);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds URL with image coords for MediaWiki API calls
|
||||
* Example URL: https://commons.wikimedia.org/w/api.php?action=query&prop=categories|coordinates|pageprops&format=json&clshow=!hidden&coprop=type|name|dim|country|region|globe&codistancefrompoint=38.11386944444445|13.356263888888888&generator=geosearch&redirects=&ggscoord=38.11386944444445|1.356263888888888&ggsradius=100&ggslimit=10&ggsnamespace=6&ggsprop=type|name|dim|country|region|globe&ggsprimary=all&formatversion=2
|
||||
*
|
||||
* @param coords Coordinates to build query with
|
||||
* @return URL for API query
|
||||
*/
|
||||
private HttpUrl buildUrl(String coords) {
|
||||
return mwUrl.newBuilder()
|
||||
.addPathSegment("w")
|
||||
.addPathSegment("api.php")
|
||||
.addQueryParameter("action", "query")
|
||||
.addQueryParameter("prop", "categories|coordinates|pageprops")
|
||||
.addQueryParameter("format", "json")
|
||||
.addQueryParameter("clshow", "!hidden")
|
||||
.addQueryParameter("coprop", "type|name|dim|country|region|globe")
|
||||
.addQueryParameter("codistancefrompoint", coords)
|
||||
.addQueryParameter("generator", "geosearch")
|
||||
.addQueryParameter("ggscoord", coords)
|
||||
.addQueryParameter("ggsradius", "10000")
|
||||
.addQueryParameter("ggslimit", "10")
|
||||
.addQueryParameter("ggsnamespace", "6")
|
||||
.addQueryParameter("ggsprop", "type|name|dim|country|region|globe")
|
||||
.addQueryParameter("ggsprimary", "all")
|
||||
.addQueryParameter("formatversion", "2")
|
||||
.build();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
package fr.free.nrw.commons.mwapi.model;
|
||||
|
||||
public class ApiResponse {
|
||||
public Query query;
|
||||
|
||||
public ApiResponse() {
|
||||
}
|
||||
|
||||
public boolean hasPages() {
|
||||
return query != null && query.pages != null;
|
||||
}
|
||||
}
|
||||
17
app/src/main/java/fr/free/nrw/commons/mwapi/model/Page.java
Normal file
17
app/src/main/java/fr/free/nrw/commons/mwapi/model/Page.java
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
package fr.free.nrw.commons.mwapi.model;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
public class Page {
|
||||
public String title;
|
||||
public PageCategory[] categories;
|
||||
public PageCategory category;
|
||||
|
||||
public Page() {
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public PageCategory[] getCategories() {
|
||||
return categories != null ? categories : new PageCategory[0];
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
package fr.free.nrw.commons.mwapi.model;
|
||||
|
||||
public class PageCategory {
|
||||
public String title;
|
||||
|
||||
public PageCategory() {
|
||||
}
|
||||
|
||||
public String withoutPrefix() {
|
||||
return title != null ? title.replace("Category:", "") : "";
|
||||
}
|
||||
}
|
||||
10
app/src/main/java/fr/free/nrw/commons/mwapi/model/Query.java
Normal file
10
app/src/main/java/fr/free/nrw/commons/mwapi/model/Query.java
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
package fr.free.nrw.commons.mwapi.model;
|
||||
|
||||
public class Query {
|
||||
public Page[] pages;
|
||||
|
||||
public Query() {
|
||||
pages = new Page[0];
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
package fr.free.nrw.commons.notification;
|
||||
|
||||
import android.util.Log;
|
||||
import android.graphics.drawable.PictureDrawable;
|
||||
import android.text.Html;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
|
@ -8,17 +9,23 @@ import android.widget.ImageView;
|
|||
import android.widget.TextView;
|
||||
|
||||
import com.borjabravo.readmoretextview.ReadMoreTextView;
|
||||
import com.bumptech.glide.RequestBuilder;
|
||||
import com.pedrogomez.renderers.Renderer;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import fr.free.nrw.commons.R;
|
||||
import fr.free.nrw.commons.glide.SvgSoftwareLayerSetter;
|
||||
|
||||
import static com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade;
|
||||
|
||||
/**
|
||||
* Created by root on 19.12.2017.
|
||||
*/
|
||||
|
||||
public class NotificationRenderer extends Renderer<Notification> {
|
||||
private RequestBuilder<PictureDrawable> requestBuilder;
|
||||
|
||||
@BindView(R.id.title) ReadMoreTextView title;
|
||||
@BindView(R.id.time) TextView time;
|
||||
@BindView(R.id.icon) ImageView icon;
|
||||
|
|
@ -41,23 +48,32 @@ public class NotificationRenderer extends Renderer<Notification> {
|
|||
protected View inflate(LayoutInflater layoutInflater, ViewGroup viewGroup) {
|
||||
View inflatedView = layoutInflater.inflate(R.layout.item_notification, viewGroup, false);
|
||||
ButterKnife.bind(this, inflatedView);
|
||||
requestBuilder = GlideApp.with(inflatedView.getContext())
|
||||
.as(PictureDrawable.class)
|
||||
.error(R.drawable.round_icon_unknown)
|
||||
.transition(withCrossFade())
|
||||
.listener(new SvgSoftwareLayerSetter());
|
||||
return inflatedView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render() {
|
||||
Notification notification = getContent();
|
||||
String str = notification.notificationText.trim();
|
||||
str = str.concat(" ");
|
||||
title.setText(str);
|
||||
setTitle(notification.notificationText);
|
||||
time.setText(notification.date);
|
||||
switch (notification.notificationType) {
|
||||
case THANK_YOU_EDIT:
|
||||
icon.setImageResource(R.drawable.ic_edit_black_24dp);
|
||||
break;
|
||||
default:
|
||||
icon.setImageResource(R.drawable.round_icon_unknown);
|
||||
}
|
||||
requestBuilder.load(notification.iconUrl).into(icon);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleans up the notification text and sets it as the title
|
||||
* Clean up is required to fix escaped HTML string and extra white spaces at the beginning of the notification
|
||||
* @param notificationText
|
||||
*/
|
||||
private void setTitle(String notificationText) {
|
||||
notificationText = notificationText.trim().replaceAll("(^\\h*)|(\\h*$)", "");
|
||||
notificationText = Html.fromHtml(notificationText).toString();
|
||||
notificationText = notificationText.concat(" ");
|
||||
title.setText(notificationText);
|
||||
}
|
||||
|
||||
public interface NotificationClicked{
|
||||
|
|
|
|||
|
|
@ -16,12 +16,13 @@ import javax.annotation.Nullable;
|
|||
import fr.free.nrw.commons.BuildConfig;
|
||||
import fr.free.nrw.commons.R;
|
||||
|
||||
import static fr.free.nrw.commons.notification.NotificationType.THANK_YOU_EDIT;
|
||||
import static fr.free.nrw.commons.notification.NotificationType.UNKNOWN;
|
||||
|
||||
public class NotificationUtils {
|
||||
|
||||
private static final String COMMONS_WIKI = "commonswiki";
|
||||
private static final String WIKIDATA_WIKI = "wikidatawiki";
|
||||
private static final String WIKIPEDIA_WIKI = "enwiki";
|
||||
|
||||
public static boolean isCommonsNotification(Node document) {
|
||||
if (document == null || !document.hasAttributes()) {
|
||||
|
|
@ -31,6 +32,32 @@ public class NotificationUtils {
|
|||
return COMMONS_WIKI.equals(element.getAttribute("wiki"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the wiki attribute corresponds to wikidatawiki
|
||||
* @param document
|
||||
* @return
|
||||
*/
|
||||
public static boolean isWikidataNotification(Node document) {
|
||||
if (document == null || !document.hasAttributes()) {
|
||||
return false;
|
||||
}
|
||||
Element element = (Element) document;
|
||||
return WIKIDATA_WIKI.equals(element.getAttribute("wiki"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the wiki attribute corresponds to enwiki
|
||||
* @param document
|
||||
* @return
|
||||
*/
|
||||
public static boolean isWikipediaNotification(Node document) {
|
||||
if (document == null || !document.hasAttributes()) {
|
||||
return false;
|
||||
}
|
||||
Element element = (Element) document;
|
||||
return WIKIPEDIA_WIKI.equals(element.getAttribute("wiki"));
|
||||
}
|
||||
|
||||
public static NotificationType getNotificationType(Node document) {
|
||||
Element element = (Element) document;
|
||||
String type = element.getAttribute("type");
|
||||
|
|
@ -68,10 +95,17 @@ public class NotificationUtils {
|
|||
return notifications;
|
||||
}
|
||||
|
||||
/**
|
||||
* Currently the app is interested in showing notifications just from the following three wikis: commons, wikidata, wikipedia
|
||||
* This function returns true only if the notification belongs to any of the above wikis and is of a known notification type
|
||||
* @param node
|
||||
* @return
|
||||
*/
|
||||
private static boolean isUsefulNotification(Node node) {
|
||||
return isCommonsNotification(node)
|
||||
&& !getNotificationType(node).equals(UNKNOWN)
|
||||
&& !getNotificationType(node).equals(THANK_YOU_EDIT);
|
||||
return (isCommonsNotification(node)
|
||||
|| isWikidataNotification(node)
|
||||
|| isWikipediaNotification(node))
|
||||
&& !getNotificationType(node).equals(UNKNOWN);
|
||||
}
|
||||
|
||||
public static boolean isBundledNotification(Node document) {
|
||||
|
|
@ -97,7 +131,7 @@ public class NotificationUtils {
|
|||
|
||||
switch (type) {
|
||||
case THANK_YOU_EDIT:
|
||||
notificationText = context.getString(R.string.notifications_thank_you_edit);
|
||||
notificationText = getThankYouEditDescription(document);
|
||||
break;
|
||||
case EDIT_USER_TALK:
|
||||
notificationText = getNotificationText(document);
|
||||
|
|
@ -146,6 +180,16 @@ public class NotificationUtils {
|
|||
return body != null ? body.getTextContent() : "";
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the header node returned in the XML document to form the description for thank you edits
|
||||
* @param document
|
||||
* @return
|
||||
*/
|
||||
private static String getThankYouEditDescription(Node document) {
|
||||
Node body = getNode(getModel(document), "header");
|
||||
return body != null ? body.getTextContent() : "";
|
||||
}
|
||||
|
||||
private static String getNotificationIconUrl(Node document) {
|
||||
String format = "%s%s";
|
||||
Node iconUrl = getNode(getModel(document), "iconUrl");
|
||||
|
|
|
|||
|
|
@ -0,0 +1,35 @@
|
|||
package fr.free.nrw.commons.notification;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.drawable.PictureDrawable;
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.Registry;
|
||||
import com.bumptech.glide.annotation.GlideModule;
|
||||
import com.bumptech.glide.module.AppGlideModule;
|
||||
import com.caverock.androidsvg.SVG;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
import fr.free.nrw.commons.glide.SvgDecoder;
|
||||
import fr.free.nrw.commons.glide.SvgDrawableTranscoder;
|
||||
|
||||
/**
|
||||
* Module for the SVG sample app.
|
||||
*/
|
||||
@GlideModule
|
||||
public class SvgModule extends AppGlideModule {
|
||||
@Override
|
||||
public void registerComponents(@NonNull Context context, @NonNull Glide glide,
|
||||
@NonNull Registry registry) {
|
||||
registry.register(SVG.class, PictureDrawable.class, new SvgDrawableTranscoder())
|
||||
.append(InputStream.class, SVG.class, new SvgDecoder());
|
||||
}
|
||||
|
||||
// Disable manifest parsing to avoid adding similar modules twice.
|
||||
@Override
|
||||
public boolean isManifestParsingEnabled() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
package fr.free.nrw.commons.upload;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
@Singleton
|
||||
public class GpsCategoryModel {
|
||||
private Set<String> categorySet;
|
||||
|
||||
@Inject
|
||||
public GpsCategoryModel() {
|
||||
clear();
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
categorySet = new HashSet<>();
|
||||
}
|
||||
|
||||
public boolean getGpsCatExists() {
|
||||
return !categorySet.isEmpty();
|
||||
}
|
||||
|
||||
public List<String> getCategoryList() {
|
||||
return new ArrayList<>(categorySet);
|
||||
}
|
||||
|
||||
public void setCategoryList(List<String> categoryList) {
|
||||
clear();
|
||||
categorySet.addAll(categoryList != null ? categoryList : new ArrayList<>());
|
||||
}
|
||||
|
||||
public void add(String categoryString) {
|
||||
categorySet.add(categoryString);
|
||||
}
|
||||
}
|
||||
|
|
@ -26,6 +26,8 @@ import android.widget.GridView;
|
|||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
|
||||
import com.facebook.drawee.view.SimpleDraweeView;
|
||||
|
||||
|
|
@ -41,9 +43,13 @@ public class MultipleUploadListFragment extends Fragment {
|
|||
void OnMultipleUploadInitiated();
|
||||
}
|
||||
|
||||
private GridView photosGrid;
|
||||
@BindView(R.id.multipleShareBackground)
|
||||
GridView photosGrid;
|
||||
|
||||
@BindView(R.id.multipleBaseTitle)
|
||||
EditText baseTitle;
|
||||
|
||||
private PhotoDisplayAdapter photosAdapter;
|
||||
private EditText baseTitle;
|
||||
private TitleTextWatcher textWatcher = new TitleTextWatcher();
|
||||
|
||||
private Point photoSize;
|
||||
|
|
@ -166,9 +172,7 @@ public class MultipleUploadListFragment extends Fragment {
|
|||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
View view = inflater.inflate(R.layout.fragment_multiple_uploads_list, container, false);
|
||||
photosGrid = view.findViewById(R.id.multipleShareBackground);
|
||||
baseTitle = view.findViewById(R.id.multipleBaseTitle);
|
||||
|
||||
ButterKnife.bind(this,view);
|
||||
photosAdapter = new PhotoDisplayAdapter();
|
||||
photosGrid.setAdapter(photosAdapter);
|
||||
photosGrid.setOnItemClickListener((AdapterView.OnItemClickListener) getActivity());
|
||||
|
|
|
|||
|
|
@ -1,249 +0,0 @@
|
|||
package fr.free.nrw.commons.upload;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
|
||||
import com.android.volley.Cache;
|
||||
import com.android.volley.NetworkResponse;
|
||||
import com.android.volley.Request;
|
||||
import com.android.volley.RequestQueue;
|
||||
import com.android.volley.Response;
|
||||
import com.android.volley.VolleyError;
|
||||
import com.android.volley.toolbox.HttpHeaderParser;
|
||||
import com.android.volley.toolbox.JsonRequest;
|
||||
import com.android.volley.toolbox.Volley;
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import timber.log.Timber;
|
||||
|
||||
/**
|
||||
* Uses the Volley library to implement asynchronous calls to the Commons MediaWiki API to match
|
||||
* GPS coordinates with nearby Commons categories. Parses the results using GSON to obtain a list
|
||||
* of relevant categories.
|
||||
*/
|
||||
public class MwVolleyApi {
|
||||
|
||||
private static RequestQueue REQUEST_QUEUE;
|
||||
private static final Gson GSON = new GsonBuilder().create();
|
||||
|
||||
private static Set<String> categorySet;
|
||||
private static List<String> categoryList;
|
||||
|
||||
private static final String MWURL = "https://commons.wikimedia.org/";
|
||||
private final Context context;
|
||||
|
||||
public MwVolleyApi(Context context) {
|
||||
this.context = context;
|
||||
categorySet = new HashSet<>();
|
||||
}
|
||||
|
||||
public static List<String> getGpsCat() {
|
||||
return categoryList;
|
||||
}
|
||||
|
||||
public static void setGpsCat(List<String> cachedList) {
|
||||
categoryList = new ArrayList<>();
|
||||
categoryList.addAll(cachedList);
|
||||
Timber.d("Setting GPS cats from cache: %s", categoryList);
|
||||
}
|
||||
|
||||
public void request(String coords) {
|
||||
String apiUrl = buildUrl(coords);
|
||||
Timber.d("URL: %s", apiUrl);
|
||||
|
||||
JsonRequest<QueryResponse> request = new QueryRequest(apiUrl,
|
||||
new LogResponseListener<>(), new LogResponseErrorListener());
|
||||
getQueue().add(request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds URL with image coords for MediaWiki API calls
|
||||
* Example URL: https://commons.wikimedia.org/w/api.php?action=query&prop=categories|coordinates|pageprops&format=json&clshow=!hidden&coprop=type|name|dim|country|region|globe&codistancefrompoint=38.11386944444445|13.356263888888888&generator=geosearch&redirects=&ggscoord=38.11386944444445|1.356263888888888&ggsradius=100&ggslimit=10&ggsnamespace=6&ggsprop=type|name|dim|country|region|globe&ggsprimary=all&formatversion=2
|
||||
* @param coords Coordinates to build query with
|
||||
* @return URL for API query
|
||||
*/
|
||||
private String buildUrl(String coords) {
|
||||
|
||||
Uri.Builder builder = Uri.parse(MWURL).buildUpon();
|
||||
|
||||
builder.appendPath("w")
|
||||
.appendPath("api.php")
|
||||
.appendQueryParameter("action", "query")
|
||||
.appendQueryParameter("prop", "categories|coordinates|pageprops")
|
||||
.appendQueryParameter("format", "json")
|
||||
.appendQueryParameter("clshow", "!hidden")
|
||||
.appendQueryParameter("coprop", "type|name|dim|country|region|globe")
|
||||
.appendQueryParameter("codistancefrompoint", coords)
|
||||
.appendQueryParameter("generator", "geosearch")
|
||||
.appendQueryParameter("ggscoord", coords)
|
||||
.appendQueryParameter("ggsradius", "10000")
|
||||
.appendQueryParameter("ggslimit", "10")
|
||||
.appendQueryParameter("ggsnamespace", "6")
|
||||
.appendQueryParameter("ggsprop", "type|name|dim|country|region|globe")
|
||||
.appendQueryParameter("ggsprimary", "all")
|
||||
.appendQueryParameter("formatversion", "2");
|
||||
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
private synchronized RequestQueue getQueue() {
|
||||
if (REQUEST_QUEUE == null) {
|
||||
REQUEST_QUEUE = Volley.newRequestQueue(context);
|
||||
}
|
||||
return REQUEST_QUEUE;
|
||||
}
|
||||
|
||||
private static class LogResponseListener<T> implements Response.Listener<T> {
|
||||
|
||||
@Override
|
||||
public void onResponse(T response) {
|
||||
Timber.d(response.toString());
|
||||
}
|
||||
}
|
||||
|
||||
private static class LogResponseErrorListener implements Response.ErrorListener {
|
||||
|
||||
@Override
|
||||
public void onErrorResponse(VolleyError error) {
|
||||
Timber.e(error.toString());
|
||||
}
|
||||
}
|
||||
|
||||
private static class QueryRequest extends JsonRequest<QueryResponse> {
|
||||
|
||||
public QueryRequest(String url,
|
||||
Response.Listener<QueryResponse> listener,
|
||||
Response.ErrorListener errorListener) {
|
||||
super(Request.Method.GET, url, null, listener, errorListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Response<QueryResponse> parseNetworkResponse(NetworkResponse response) {
|
||||
String json = parseString(response);
|
||||
QueryResponse queryResponse = GSON.fromJson(json, QueryResponse.class);
|
||||
return Response.success(queryResponse, cacheEntry(response));
|
||||
}
|
||||
|
||||
private Cache.Entry cacheEntry(NetworkResponse response) {
|
||||
return HttpHeaderParser.parseCacheHeaders(response);
|
||||
}
|
||||
|
||||
private String parseString(NetworkResponse response) {
|
||||
try {
|
||||
return new String(response.data, HttpHeaderParser.parseCharset(response.headers));
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
return new String(response.data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class GpsCatExists {
|
||||
private static boolean gpsCatExists;
|
||||
|
||||
public static void setGpsCatExists(boolean gpsCat) {
|
||||
gpsCatExists = gpsCat;
|
||||
}
|
||||
|
||||
public static boolean getGpsCatExists() {
|
||||
return gpsCatExists;
|
||||
}
|
||||
}
|
||||
|
||||
private static class QueryResponse {
|
||||
private Query query = new Query();
|
||||
|
||||
private String printSet() {
|
||||
if (categorySet == null || categorySet.isEmpty()) {
|
||||
GpsCatExists.setGpsCatExists(false);
|
||||
Timber.d("gpsCatExists=%b", GpsCatExists.getGpsCatExists());
|
||||
return "No collection of categories";
|
||||
} else {
|
||||
GpsCatExists.setGpsCatExists(true);
|
||||
Timber.d("gpsCatExists=%b", GpsCatExists.getGpsCatExists());
|
||||
return "CATEGORIES FOUND" + categorySet.toString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
if (query != null) {
|
||||
return "query=" + query.toString() + "\n" + printSet();
|
||||
} else {
|
||||
return "No pages found";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static class Query {
|
||||
private Page [] pages;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder builder = new StringBuilder("pages=" + "\n");
|
||||
if (pages != null) {
|
||||
for (Page page : pages) {
|
||||
builder.append(page.toString());
|
||||
builder.append("\n");
|
||||
}
|
||||
builder.replace(builder.length() - 1, builder.length(), "");
|
||||
return builder.toString();
|
||||
} else {
|
||||
return "No pages found";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class Page {
|
||||
private int pageid;
|
||||
private int ns;
|
||||
private String title;
|
||||
private Category[] categories;
|
||||
private Category category;
|
||||
|
||||
public Page() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
|
||||
StringBuilder builder = new StringBuilder("PAGEID=" + pageid + " ns=" + ns + " title=" + title + "\n" + " CATEGORIES= ");
|
||||
|
||||
if (categories == null || categories.length == 0) {
|
||||
builder.append("no categories exist\n");
|
||||
} else {
|
||||
for (Category category : categories) {
|
||||
builder.append(category.toString());
|
||||
builder.append("\n");
|
||||
if (category != null) {
|
||||
String categoryString = category.toString().replace("Category:", "");
|
||||
categorySet.add(categoryString);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
categoryList = new ArrayList<>(categorySet);
|
||||
builder.replace(builder.length() - 1, builder.length(), "");
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
|
||||
private static class Category {
|
||||
private String title;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return title;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
package fr.free.nrw.commons.upload;
|
||||
|
||||
import android.Manifest;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
|
|
@ -31,16 +32,16 @@ import android.support.v4.app.ActivityCompat;
|
|||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.support.v4.graphics.BitmapCompat;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.util.Log;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.WindowManager;
|
||||
import android.view.animation.DecelerateInterpolator;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.OnClick;
|
||||
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
|
||||
import com.facebook.drawee.view.SimpleDraweeView;
|
||||
import com.github.chrisbanes.photoview.PhotoView;
|
||||
|
|
@ -73,14 +74,16 @@ import fr.free.nrw.commons.modifications.ModificationsContentProvider;
|
|||
import fr.free.nrw.commons.modifications.ModifierSequence;
|
||||
import fr.free.nrw.commons.modifications.ModifierSequenceDao;
|
||||
import fr.free.nrw.commons.modifications.TemplateRemoveModifier;
|
||||
import fr.free.nrw.commons.mwapi.CategoryApi;
|
||||
|
||||
import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
import fr.free.nrw.commons.utils.ViewUtil;
|
||||
import timber.log.Timber;
|
||||
|
||||
import android.support.design.widget.FloatingActionButton;
|
||||
import static fr.free.nrw.commons.upload.ExistingFileAsync.Result.DUPLICATE_PROCEED;
|
||||
import static fr.free.nrw.commons.upload.ExistingFileAsync.Result.NO_DUPLICATE;
|
||||
import static java.lang.Long.min;
|
||||
|
||||
/**
|
||||
* Activity for the title/desc screen after image is selected. Also starts processing image
|
||||
|
|
@ -91,6 +94,22 @@ public class ShareActivity
|
|||
implements SingleUploadFragment.OnUploadActionInitiated,
|
||||
OnCategoriesSaveHandler,SimilarImageDialogFragment.onResponse {
|
||||
|
||||
@BindView(R.id.container)
|
||||
FrameLayout flContainer;
|
||||
@BindView(R.id.backgroundImage)
|
||||
SimpleDraweeView backgroundImageView;
|
||||
@BindView(R.id.media_map)
|
||||
FloatingActionButton mapsFragment; //Lets stick to camelCase
|
||||
@BindView(R.id.media_upload_zoom_in)
|
||||
FloatingActionButton zoomInButton;
|
||||
@BindView(R.id.media_upload_zoom_out)
|
||||
FloatingActionButton zoomOutButton;
|
||||
@BindView(R.id.main_fab)
|
||||
FloatingActionButton mainFab;
|
||||
@BindView(R.id.expanded_image)
|
||||
PhotoView expandedImageView;
|
||||
|
||||
|
||||
private static final int REQUEST_PERM_ON_CREATE_STORAGE = 1;
|
||||
private static final int REQUEST_PERM_ON_CREATE_LOCATION = 2;
|
||||
private static final int REQUEST_PERM_ON_CREATE_STORAGE_AND_LOCATION = 3;
|
||||
|
|
@ -108,8 +127,12 @@ public class ShareActivity
|
|||
@Inject
|
||||
ModifierSequenceDao modifierSequenceDao;
|
||||
@Inject
|
||||
CategoryApi apiCall;
|
||||
@Inject
|
||||
@Named("default_preferences")
|
||||
SharedPreferences prefs;
|
||||
@Inject
|
||||
GpsCategoryModel gpsCategoryModel;
|
||||
|
||||
private String source;
|
||||
private String mimeType;
|
||||
|
|
@ -145,6 +168,12 @@ public class ShareActivity
|
|||
private FloatingActionButton mainFab;
|
||||
private boolean isFABOpen = false;
|
||||
|
||||
//Had to make them class variables, to extract out the click listeners, also I see no harm in this
|
||||
final Rect startBounds = new Rect();
|
||||
final Rect finalBounds = new Rect();
|
||||
final Point globalOffset = new Point();
|
||||
private float startScaleFinal;
|
||||
|
||||
|
||||
/**
|
||||
* Called when user taps the submit button.
|
||||
|
|
@ -254,7 +283,6 @@ public class ShareActivity
|
|||
setContentView(R.layout.activity_share);
|
||||
ButterKnife.bind(this);
|
||||
initBack();
|
||||
backgroundImageView = (SimpleDraweeView) findViewById(R.id.backgroundImage);
|
||||
backgroundImageView.setHierarchy(GenericDraweeHierarchyBuilder
|
||||
.newInstance(getResources())
|
||||
.setPlaceholderImage(VectorDrawableCompat.create(getResources(),
|
||||
|
|
@ -286,37 +314,6 @@ public class ShareActivity
|
|||
if (mediaUri != null) {
|
||||
backgroundImageView.setImageURI(mediaUri);
|
||||
}
|
||||
|
||||
mainFab = (FloatingActionButton) findViewById(R.id.main_fab);
|
||||
/*
|
||||
* called when upper arrow floating button
|
||||
*/
|
||||
mainFab.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if(!isFABOpen){
|
||||
showFABMenu();
|
||||
}else{
|
||||
closeFABMenu();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
zoomInButton = (FloatingActionButton) findViewById(R.id.media_upload_zoom_in);
|
||||
try {
|
||||
zoomInButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
zoomImageFromThumb(backgroundImageView, mediaUri);
|
||||
}
|
||||
});
|
||||
} catch (Exception e){
|
||||
Log.i("exception", e.toString());
|
||||
}
|
||||
zoomOutButton = (FloatingActionButton) findViewById(R.id.media_upload_zoom_out);
|
||||
|
||||
if (savedInstanceState != null) {
|
||||
contribution = savedInstanceState.getParcelable("contribution");
|
||||
}
|
||||
|
|
@ -378,25 +375,13 @@ public class ShareActivity
|
|||
.commitAllowingStateLoss();
|
||||
}
|
||||
uploadController.prepareService();
|
||||
maps_fragment = (FloatingActionButton) findViewById(R.id.media_map);
|
||||
maps_fragment.setVisibility(View.VISIBLE);
|
||||
mapsFragment.setVisibility(View.VISIBLE);
|
||||
if( imageObj == null || imageObj.imageCoordsExists != true){
|
||||
maps_fragment.setVisibility(View.INVISIBLE);
|
||||
mapsFragment.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
|
||||
|
||||
maps_fragment.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if( imageObj != null && imageObj.imageCoordsExists == true) {
|
||||
Uri gmmIntentUri = Uri.parse("google.streetview:cbll=" + imageObj.getDecLatitude() + "," + imageObj.getDecLongitude());
|
||||
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
|
||||
mapIntent.setPackage("com.google.android.apps.maps");
|
||||
startActivity(mapIntent);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
* Function to display the zoom and map FAB
|
||||
*/
|
||||
|
|
@ -404,11 +389,11 @@ public class ShareActivity
|
|||
isFABOpen=true;
|
||||
|
||||
if( imageObj != null && imageObj.imageCoordsExists == true)
|
||||
maps_fragment.setVisibility(View.VISIBLE);
|
||||
mapsFragment.setVisibility(View.VISIBLE);
|
||||
zoomInButton.setVisibility(View.VISIBLE);
|
||||
|
||||
mainFab.animate().rotationBy(180);
|
||||
maps_fragment.animate().translationY(-getResources().getDimension(R.dimen.second_fab));
|
||||
mapsFragment.animate().translationY(-getResources().getDimension(R.dimen.second_fab));
|
||||
zoomInButton.animate().translationY(-getResources().getDimension(R.dimen.first_fab));
|
||||
}
|
||||
|
||||
|
|
@ -418,7 +403,7 @@ public class ShareActivity
|
|||
private void closeFABMenu(){
|
||||
isFABOpen=false;
|
||||
mainFab.animate().rotationBy(-180);
|
||||
maps_fragment.animate().translationY(0);
|
||||
mapsFragment.animate().translationY(0);
|
||||
zoomInButton.animate().translationY(0).setListener(new Animator.AnimatorListener() {
|
||||
@Override
|
||||
public void onAnimationStart(Animator animator) {
|
||||
|
|
@ -428,7 +413,7 @@ public class ShareActivity
|
|||
@Override
|
||||
public void onAnimationEnd(Animator animator) {
|
||||
if(!isFABOpen){
|
||||
maps_fragment.setVisibility(View.GONE);
|
||||
mapsFragment.setVisibility(View.GONE);
|
||||
zoomInButton.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
|
|
@ -446,6 +431,7 @@ public class ShareActivity
|
|||
});
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode,
|
||||
@NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
|
|
@ -699,8 +685,9 @@ public class ShareActivity
|
|||
return;
|
||||
}
|
||||
|
||||
//I might not be supposed to change it, but still, I saw it
|
||||
@Override
|
||||
public void onPostiveResponse() {
|
||||
public void onPositiveResponse() {
|
||||
imageObj = tempImageObj;
|
||||
decimalCoords = imageObj.getCoords(false);// Not necessary to use gps as image already ha EXIF data
|
||||
Timber.d("EXIF from tempImageObj");
|
||||
|
|
@ -716,8 +703,9 @@ public class ShareActivity
|
|||
|
||||
/**
|
||||
* Initiates retrieval of image coordinates or user coordinates, and caching of coordinates.
|
||||
* Then initiates the calls to MediaWiki API through an instance of MwVolleyApi.
|
||||
* Then initiates the calls to MediaWiki API through an instance of CategpryApi.
|
||||
*/
|
||||
@SuppressLint("CheckResult")
|
||||
public void useImageCoords() {
|
||||
if (decimalCoords != null) {
|
||||
Timber.d("Decimal coords of image: %s", decimalCoords);
|
||||
|
|
@ -730,20 +718,27 @@ public class ShareActivity
|
|||
cacheController.setQtPoint(decLongitude, decLatitude);
|
||||
}
|
||||
|
||||
MwVolleyApi apiCall = new MwVolleyApi(this);
|
||||
|
||||
List<String> displayCatList = cacheController.findCategory();
|
||||
boolean catListEmpty = displayCatList.isEmpty();
|
||||
|
||||
// If no categories found in cache, call MediaWiki API to match image coords with nearby Commons categories
|
||||
if (catListEmpty) {
|
||||
cacheFound = false;
|
||||
apiCall.request(decimalCoords);
|
||||
apiCall.request(decimalCoords)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(Schedulers.io())
|
||||
.subscribe(
|
||||
gpsCategoryModel::setCategoryList,
|
||||
throwable -> {
|
||||
Timber.e(throwable);
|
||||
gpsCategoryModel.clear();
|
||||
}
|
||||
);
|
||||
Timber.d("displayCatList size 0, calling MWAPI %s", displayCatList);
|
||||
} else {
|
||||
cacheFound = true;
|
||||
Timber.d("Cache found, setting categoryList in MwVolleyApi to %s", displayCatList);
|
||||
MwVolleyApi.setGpsCat(displayCatList);
|
||||
Timber.d("Cache found, setting categoryList in model to %s", displayCatList);
|
||||
gpsCategoryModel.setCategoryList(displayCatList);
|
||||
}
|
||||
}else{
|
||||
Timber.d("EXIF: no coords");
|
||||
|
|
@ -864,26 +859,19 @@ public class ShareActivity
|
|||
scaled = bitmap;
|
||||
}
|
||||
// Load the high-resolution "zoomed-in" image.
|
||||
PhotoView expandedImageView = (PhotoView) findViewById(
|
||||
R.id.expanded_image);
|
||||
expandedImageView.setImageBitmap(scaled);
|
||||
|
||||
|
||||
|
||||
|
||||
// Calculate the starting and ending bounds for the zoomed-in image.
|
||||
// This step involves lots of math. Yay, math.
|
||||
final Rect startBounds = new Rect();
|
||||
final Rect finalBounds = new Rect();
|
||||
final Point globalOffset = new Point();
|
||||
|
||||
// The start bounds are the global visible rectangle of the thumbnail,
|
||||
// and the final bounds are the global visible rectangle of the container
|
||||
// view. Also set the container view's offset as the origin for the
|
||||
// bounds, since that's the origin for the positioning animation
|
||||
// properties (X, Y).
|
||||
thumbView.getGlobalVisibleRect(startBounds);
|
||||
findViewById(R.id.container)
|
||||
.getGlobalVisibleRect(finalBounds, globalOffset);
|
||||
flContainer.getGlobalVisibleRect(finalBounds, globalOffset);
|
||||
startBounds.offset(-globalOffset.x, -globalOffset.y);
|
||||
finalBounds.offset(-globalOffset.x, -globalOffset.y);
|
||||
|
||||
|
|
@ -954,53 +942,86 @@ public class ShareActivity
|
|||
// Upon clicking the zoomed-in image, it should zoom back down
|
||||
// to the original bounds and show the thumbnail instead of
|
||||
// the expanded image.
|
||||
final float startScaleFinal = startScale;
|
||||
zoomOutButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if (CurrentAnimator != null) {
|
||||
CurrentAnimator.cancel();
|
||||
}
|
||||
zoomOutButton.setVisibility(View.GONE);
|
||||
mainFab.setVisibility(View.VISIBLE);
|
||||
startScaleFinal = startScale;
|
||||
|
||||
// Animate the four positioning/sizing properties in parallel,
|
||||
// back to their original values.
|
||||
AnimatorSet set = new AnimatorSet();
|
||||
set.play(ObjectAnimator
|
||||
.ofFloat(expandedImageView, View.X, startBounds.left))
|
||||
.with(ObjectAnimator
|
||||
.ofFloat(expandedImageView,
|
||||
View.Y,startBounds.top))
|
||||
.with(ObjectAnimator
|
||||
.ofFloat(expandedImageView,
|
||||
View.SCALE_X, startScaleFinal))
|
||||
.with(ObjectAnimator
|
||||
.ofFloat(expandedImageView,
|
||||
View.SCALE_Y, startScaleFinal));
|
||||
set.setDuration(ShortAnimationDuration);
|
||||
set.setInterpolator(new DecelerateInterpolator());
|
||||
set.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
thumbView.setAlpha(1f);
|
||||
expandedImageView.setVisibility(View.GONE);
|
||||
CurrentAnimator = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationCancel(Animator animation) {
|
||||
thumbView.setAlpha(1f);
|
||||
expandedImageView.setVisibility(View.GONE);
|
||||
CurrentAnimator = null;
|
||||
}
|
||||
});
|
||||
set.start();
|
||||
CurrentAnimator = set;
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
* called when upper arrow floating button
|
||||
*/
|
||||
@OnClick(R.id.main_fab)
|
||||
public void onMainFabClicked() {
|
||||
if (!isFABOpen) {
|
||||
showFABMenu();
|
||||
} else {
|
||||
closeFABMenu();
|
||||
}
|
||||
}
|
||||
|
||||
@OnClick(R.id.media_upload_zoom_in)
|
||||
public void onZoomInFabClicked() {
|
||||
//This try catch block was originally holding the entire click listener on the fab button, I did not wanted to risk exceptions
|
||||
try {
|
||||
zoomImageFromThumb(backgroundImageView, mediaUri);
|
||||
} catch (Exception e) {
|
||||
Log.i("exception", e.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@OnClick(R.id.media_upload_zoom_out)
|
||||
public void onZoomOutFabClicked() {
|
||||
if (CurrentAnimator != null) {
|
||||
CurrentAnimator.cancel();
|
||||
}
|
||||
zoomOutButton.setVisibility(View.GONE);
|
||||
mainFab.setVisibility(View.VISIBLE);
|
||||
|
||||
// Animate the four positioning/sizing properties in parallel,
|
||||
// back to their original values.
|
||||
AnimatorSet set = new AnimatorSet();
|
||||
set.play(ObjectAnimator
|
||||
.ofFloat(expandedImageView, View.X, startBounds.left))
|
||||
.with(ObjectAnimator
|
||||
.ofFloat(expandedImageView,
|
||||
View.Y, startBounds.top))
|
||||
.with(ObjectAnimator
|
||||
.ofFloat(expandedImageView,
|
||||
View.SCALE_X, startScaleFinal))
|
||||
.with(ObjectAnimator
|
||||
.ofFloat(expandedImageView,
|
||||
View.SCALE_Y, startScaleFinal));
|
||||
set.setDuration(ShortAnimationDuration);
|
||||
set.setInterpolator(new DecelerateInterpolator());
|
||||
set.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
//background image view is thumbView
|
||||
backgroundImageView.setAlpha(1f);
|
||||
expandedImageView.setVisibility(View.GONE);
|
||||
CurrentAnimator = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationCancel(Animator animation) {
|
||||
//background image view is thumbView
|
||||
backgroundImageView.setAlpha(1f);
|
||||
expandedImageView.setVisibility(View.GONE);
|
||||
CurrentAnimator = null;
|
||||
}
|
||||
});
|
||||
set.start();
|
||||
CurrentAnimator = set;
|
||||
}
|
||||
|
||||
@OnClick(R.id.media_map)
|
||||
public void onFabShowMapsClicked() {
|
||||
if (imageObj != null && imageObj.imageCoordsExists == true) {
|
||||
Uri gmmIntentUri = Uri
|
||||
.parse("google.streetview:cbll=" + imageObj.getDecLatitude() + "," + imageObj
|
||||
.getDecLongitude());
|
||||
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
|
||||
mapIntent.setPackage("com.google.android.apps.maps");
|
||||
startActivity(mapIntent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,9 @@ import android.view.ViewGroup;
|
|||
import android.view.Window;
|
||||
import android.widget.Button;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import butterknife.OnClick;
|
||||
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
|
||||
import com.facebook.drawee.view.SimpleDraweeView;
|
||||
import com.facebook.imagepipeline.listener.RequestListener;
|
||||
|
|
@ -29,29 +32,33 @@ import fr.free.nrw.commons.R;
|
|||
*/
|
||||
|
||||
public class SimilarImageDialogFragment extends DialogFragment {
|
||||
|
||||
@BindView(R.id.orginalImage)
|
||||
SimpleDraweeView originalImage;
|
||||
@BindView(R.id.possibleImage)
|
||||
SimpleDraweeView possibleImage;
|
||||
@BindView(R.id.postive_button)
|
||||
Button positiveButton;
|
||||
@BindView(R.id.negative_button)
|
||||
Button negativeButton;
|
||||
onResponse mOnResponse;//Implemented interface from shareActivity
|
||||
Boolean gotResponse = false;
|
||||
|
||||
public SimilarImageDialogFragment() {
|
||||
}
|
||||
public interface onResponse{
|
||||
public void onPostiveResponse();
|
||||
public void onPositiveResponse();
|
||||
|
||||
public void onNegativeResponse();
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||
View view = inflater.inflate(R.layout.fragment_similar_image_dialog, container, false);
|
||||
ButterKnife.bind(this,view);
|
||||
Set<RequestListener> requestListeners = new HashSet<>();
|
||||
requestListeners.add(new RequestLoggingListener());
|
||||
|
||||
originalImage =(SimpleDraweeView) view.findViewById(R.id.orginalImage);
|
||||
possibleImage =(SimpleDraweeView) view.findViewById(R.id.possibleImage);
|
||||
positiveButton = (Button) view.findViewById(R.id.postive_button);
|
||||
negativeButton = (Button) view.findViewById(R.id.negative_button);
|
||||
|
||||
originalImage.setHierarchy(GenericDraweeHierarchyBuilder
|
||||
.newInstance(getResources())
|
||||
.setPlaceholderImage(VectorDrawableCompat.create(getResources(),
|
||||
|
|
@ -70,22 +77,6 @@ public class SimilarImageDialogFragment extends DialogFragment {
|
|||
originalImage.setImageURI(Uri.fromFile(new File(getArguments().getString("originalImagePath"))));
|
||||
possibleImage.setImageURI(Uri.fromFile(new File(getArguments().getString("possibleImagePath"))));
|
||||
|
||||
negativeButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
mOnResponse.onNegativeResponse();
|
||||
gotResponse = true;
|
||||
dismiss();
|
||||
}
|
||||
});
|
||||
positiveButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
mOnResponse.onPostiveResponse();
|
||||
gotResponse = true;
|
||||
dismiss();
|
||||
}
|
||||
});
|
||||
return view;
|
||||
}
|
||||
|
||||
|
|
@ -105,8 +96,23 @@ public class SimilarImageDialogFragment extends DialogFragment {
|
|||
@Override
|
||||
public void onDismiss(DialogInterface dialog) {
|
||||
// I user dismisses dialog by pressing outside the dialog.
|
||||
if(!gotResponse)
|
||||
if (!gotResponse) {
|
||||
mOnResponse.onNegativeResponse();
|
||||
}
|
||||
super.onDismiss(dialog);
|
||||
}
|
||||
|
||||
@OnClick(R.id.negative_button)
|
||||
public void onNegativeButtonClicked() {
|
||||
mOnResponse.onNegativeResponse();
|
||||
gotResponse = true;
|
||||
dismiss();
|
||||
}
|
||||
|
||||
@OnClick(R.id.postive_button)
|
||||
public void onPositiveButtonClicked() {
|
||||
mOnResponse.onPositiveResponse();
|
||||
gotResponse = true;
|
||||
dismiss();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,12 +1,34 @@
|
|||
package fr.free.nrw.commons.utils;
|
||||
|
||||
import android.app.WallpaperManager;
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.graphics.BitmapRegionDecoder;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Rect;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.annotation.RequiresApi;
|
||||
|
||||
import com.facebook.common.executors.CallerThreadExecutor;
|
||||
import com.facebook.common.references.CloseableReference;
|
||||
import com.facebook.datasource.DataSource;
|
||||
import com.facebook.drawee.backends.pipeline.Fresco;
|
||||
import com.facebook.imagepipeline.core.ImagePipeline;
|
||||
import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber;
|
||||
import com.facebook.imagepipeline.image.CloseableImage;
|
||||
import com.facebook.imagepipeline.request.ImageRequest;
|
||||
import com.facebook.imagepipeline.request.ImageRequestBuilder;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import fr.free.nrw.commons.R;
|
||||
import timber.log.Timber;
|
||||
|
||||
import static com.mapbox.mapboxsdk.Mapbox.getApplicationContext;
|
||||
|
||||
/**
|
||||
* Created by bluesir9 on 3/10/17.
|
||||
*/
|
||||
|
|
@ -132,4 +154,52 @@ public class ImageUtils {
|
|||
|
||||
return isImageDark;
|
||||
}
|
||||
|
||||
/**
|
||||
* Downloads the image from the URL and sets it as the phone's wallpaper
|
||||
* Fails silently if download or setting wallpaper fails.
|
||||
* @param context
|
||||
* @param imageUrl
|
||||
*/
|
||||
public static void setWallpaperFromImageUrl(Context context, Uri imageUrl) {
|
||||
Timber.d("Trying to set wallpaper from url %s", imageUrl.toString());
|
||||
ImageRequest imageRequest = ImageRequestBuilder
|
||||
.newBuilderWithSource(imageUrl)
|
||||
.setAutoRotateEnabled(true)
|
||||
.build();
|
||||
|
||||
ImagePipeline imagePipeline = Fresco.getImagePipeline();
|
||||
final DataSource<CloseableReference<CloseableImage>>
|
||||
dataSource = imagePipeline.fetchDecodedImage(imageRequest, context);
|
||||
|
||||
dataSource.subscribe(new BaseBitmapDataSubscriber() {
|
||||
|
||||
@Override
|
||||
public void onNewResultImpl(@Nullable Bitmap bitmap) {
|
||||
if (dataSource.isFinished() && bitmap != null){
|
||||
Timber.d("Bitmap loaded from url %s", imageUrl.toString());
|
||||
setWallpaper(context, Bitmap.createBitmap(bitmap));
|
||||
dataSource.close();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailureImpl(DataSource dataSource) {
|
||||
Timber.d("Error getting bitmap from image url %s", imageUrl.toString());
|
||||
if (dataSource != null) {
|
||||
dataSource.close();
|
||||
}
|
||||
}
|
||||
}, CallerThreadExecutor.getInstance());
|
||||
}
|
||||
|
||||
private static void setWallpaper(Context context, Bitmap bitmap) {
|
||||
WallpaperManager wallpaperManager = WallpaperManager.getInstance(context);
|
||||
try {
|
||||
wallpaperManager.setBitmap(bitmap);
|
||||
ViewUtil.showLongToast(context, context.getString(R.string.wallpaper_set_successfully));
|
||||
} catch (IOException e) {
|
||||
Timber.e(e,"Error setting wallpaper");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,6 +15,10 @@
|
|||
android:id="@+id/menu_download_current_image"
|
||||
android:title="@string/menu_download"
|
||||
app:showAsAction="never" />
|
||||
<item
|
||||
android:id="@+id/menu_set_as_wallpaper"
|
||||
android:title="@string/menu_set_wallpaper"
|
||||
app:showAsAction="never" />
|
||||
<item
|
||||
android:id="@+id/menu_retry_current_image"
|
||||
android:enabled="false"
|
||||
|
|
|
|||
|
|
@ -54,8 +54,6 @@
|
|||
<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>
|
||||
|
|
|
|||
|
|
@ -49,8 +49,6 @@
|
|||
<string name="add_title_toast">Apurre un títulu pa esti ficheru</string>
|
||||
<string name="share_description_hint">Descripción</string>
|
||||
<string name="login_failed_network">Nun se pudo aniciar sesión – error de rede</string>
|
||||
<string name="login_failed_username">Nun se pudo aniciar sesión – por favor compruebe\'l so nome d\'usuariu</string>
|
||||
<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>
|
||||
|
|
|
|||
|
|
@ -43,8 +43,6 @@
|
|||
<string name="share_title_hint">Naslov</string>
|
||||
<string name="share_description_hint">Opis</string>
|
||||
<string name="login_failed_network">Ne mogu da vas prijavim – mreža ne radi</string>
|
||||
<string name="login_failed_username">Ne mogu da vas prijavim – proverite svoje korisničko ime</string>
|
||||
<string name="login_failed_password">Ne mogu da vas prijavim – proverite svoju lozinku</string>
|
||||
<string name="login_failed_throttled">Previše neuspešnih pokušaja. Probajte ponovo za nekoliko minuta.</string>
|
||||
<string name="login_failed_blocked">Nažalost, korisnik je blokiran na Ostavi</string>
|
||||
<string name="login_failed_2fa_needed">Morate uneti svoj dvofaktorski kod za autentifikaciju.</string>
|
||||
|
|
|
|||
|
|
@ -50,8 +50,6 @@
|
|||
<string name="add_title_toast">Был файлдың атамаһын күрһәт</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>
|
||||
|
|
|
|||
|
|
@ -32,8 +32,6 @@
|
|||
<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="share_upload_button">Качване</string>
|
||||
<string name="provider_modifications">Изменения</string>
|
||||
<string name="menu_upload_single">Качване</string>
|
||||
|
|
|
|||
|
|
@ -57,8 +57,6 @@
|
|||
<string name="add_title_toast">এই ফাইলটির জন্য একটি শিরোনাম প্রদান করুন</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>
|
||||
|
|
|
|||
|
|
@ -52,8 +52,6 @@
|
|||
<string name="add_title_toast">Roit un titl d\'ar restr-mañ, mar plij</string>
|
||||
<string name="share_description_hint">Deskrivadur</string>
|
||||
<string name="login_failed_network">Ne c\'haller ket kevreañ - rouedad sac\'het</string>
|
||||
<string name="login_failed_username">Ne c\'haller ket kevreañ - Gwiriit hoc\'h anv implijer, mar plij</string>
|
||||
<string name="login_failed_password">Ne c\'haller ket kevreañ - Gwiriit ho ker tremen, mar plij</string>
|
||||
<string name="login_failed_throttled">Re a daolioù-esae. Klaskit en-dro a-benn ur pennadig amzer.</string>
|
||||
<string name="login_failed_blocked">Hon digarezit, prennet eo bet an implijer-mañ e Commons</string>
|
||||
<string name="login_failed_2fa_needed">Rankout a rit reiñ ho kod dilesa gant daou faktor.</string>
|
||||
|
|
|
|||
|
|
@ -43,8 +43,6 @@
|
|||
<string name="share_title_hint">Naslov</string>
|
||||
<string name="share_description_hint">Opis</string>
|
||||
<string name="login_failed_network">Ne mogu Vas prijaviti – mreža ne radi</string>
|
||||
<string name="login_failed_username">Ne mogu Vas prijaviti – provjerite svoje korisničko ime</string>
|
||||
<string name="login_failed_password">Ne mogu Vas prijaviti – provjerite svoje lozinku</string>
|
||||
<string name="login_failed_throttled">Napravili ste previše grešaka u prijavi. Pokušajte ponovo za nekoliko minuta.</string>
|
||||
<string name="login_failed_blocked">Žao nam je, korisnik je blokiran na Commonsu</string>
|
||||
<string name="login_failed_2fa_needed">Morate upisati kôd za potvrdu u 2 koraka.</string>
|
||||
|
|
|
|||
|
|
@ -50,8 +50,6 @@
|
|||
<string name="share_title_hint">Títol</string>
|
||||
<string name="share_description_hint">Descripció</string>
|
||||
<string name="login_failed_network">No s\'ha pogut iniciar la sessió – error de xarxa</string>
|
||||
<string name="login_failed_username">No s\'ha pogut iniciar la sessió – si et plau comprova el teu nom d\'usuari</string>
|
||||
<string name="login_failed_password">No s’ha pogut iniciar la sessió. Comproveu la vostra contrasenya</string>
|
||||
<string name="login_failed_throttled">Massa intents erronis – Proveu-ho de nou d\'aquí uns minuts.</string>
|
||||
<string name="login_failed_blocked">Ho sentim, aquest usuari ha estat blocat a Commons</string>
|
||||
<string name="login_failed_2fa_needed">Heu de proporcionar el vostre codi d\'autenticació de dos factors.</string>
|
||||
|
|
@ -192,4 +190,5 @@
|
|||
<string name="notifications_thank_you_edit">Gràcies per fer una modificació</string>
|
||||
<string name="notifications_mention" fuzzy="true">%1$s us ha mencionat a %2$s.</string>
|
||||
<string name="about_faq" fuzzy="true">Preguntes freqüents</string>
|
||||
<string name="no_images_found">No s’ha trobat cap imatge.</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -61,8 +61,6 @@
|
|||
<string name="add_title_toast">Vložte prosím název tohoto souboru</string>
|
||||
<string name="share_description_hint">Popis</string>
|
||||
<string name="login_failed_network">Nelze se přihlásit - selhání sítě</string>
|
||||
<string name="login_failed_username">Nelze se přihlásit - prosím zkontrolujte své uživatelské jméno</string>
|
||||
<string name="login_failed_password">Nelze se přihlásit - zkontrolujte prosím své heslo</string>
|
||||
<string name="login_failed_throttled">Příliš mnoho neúspěšných pokusů. Zkuste to prosím znovu za několik minut.</string>
|
||||
<string name="login_failed_blocked">Omlouváme se, tento uživatel byl na Commons zablokován</string>
|
||||
<string name="login_failed_2fa_needed">Prosím vložte kód pro své dvoufázové ověření.</string>
|
||||
|
|
|
|||
|
|
@ -41,8 +41,6 @@
|
|||
<string name="share_title_hint">Titel</string>
|
||||
<string name="share_description_hint">Òpisënk</string>
|
||||
<string name="login_failed_network">Ni mòże sã wlogòwac - fela sécë</string>
|
||||
<string name="login_failed_username">Ni mòże sã wlogòwac - sprôwdzë miono brëkòwnika</string>
|
||||
<string name="login_failed_password">Ni mòże sã wlogòwac - sprôwdzë parolã</string>
|
||||
<string name="login_failed_throttled">Za wiele nieùdałich prób wlogòwaniô. Spróbùjë znowa za czile minut.</string>
|
||||
<string name="login_failed_blocked">Nen brëkòwnik òstôł zablokòwóny na Commons</string>
|
||||
<string name="login_failed_2fa_needed">Mùszisz wpisac swój kòd dlô dwafaktorowi aùtorizacëji.</string>
|
||||
|
|
|
|||
|
|
@ -43,8 +43,6 @@
|
|||
<string name="share_title_hint">Teitl</string>
|
||||
<string name="share_description_hint">Disgrifiad</string>
|
||||
<string name="login_failed_network">Yn methu mewngofnodi - methodd y rhwydwaith</string>
|
||||
<string name="login_failed_username">Yn methu mewngofnodi - gwirwch eich enw defnyddiwr</string>
|
||||
<string name="login_failed_password">Yn methu mewngofnodi - gwirwch eich cyfrinair</string>
|
||||
<string name="login_failed_throttled">Cafwyd gormod o ymgeision aflwyddiannus. Oedwch ennyd cyn ceisio eto.</string>
|
||||
<string name="login_failed_blocked">Ymddiheurwn. Mae\'r defnyddiwr hwn wedi ei flocio ar Gomin Wikimedia</string>
|
||||
<string name="login_failed_2fa_needed">Mae\'n rhaid i chi roi eich cod adnabod 2 ffactor.</string>
|
||||
|
|
|
|||
|
|
@ -54,8 +54,6 @@
|
|||
<string name="add_title_toast">Angiv venligt en titel for denne fil</string>
|
||||
<string name="share_description_hint">Beskrivelse</string>
|
||||
<string name="login_failed_network">Kan ikke logge på - netværksfejl</string>
|
||||
<string name="login_failed_username">Ude af stand til at logge på - tjek venligst dit brugernavn</string>
|
||||
<string name="login_failed_password">Ude af stand til at logge på - tjek venligst din adgangskode</string>
|
||||
<string name="login_failed_throttled">Alt for mange mislykkede forsøg. Prøv igen om et par minutter.</string>
|
||||
<string name="login_failed_blocked">Beklager, denne bruger er blevet blokeret på Commons</string>
|
||||
<string name="login_failed_2fa_needed">Du skal angive din tofaktorgodkendelseskode.</string>
|
||||
|
|
|
|||
|
|
@ -53,8 +53,7 @@
|
|||
<string name="add_title_toast">Bitte gib einen Titel für diese Datei an</string>
|
||||
<string name="share_description_hint">Beschreibung</string>
|
||||
<string name="login_failed_network">Anmeldung fehlgeschlagen – Netzwerkfehler</string>
|
||||
<string name="login_failed_username">Anmeldung fehlgeschlagen – Bitte Benutzernamen überprüfen</string>
|
||||
<string name="login_failed_password">Anmeldung fehlgeschlagen – Bitte Passwort überprüfen</string>
|
||||
<string name="login_failed_wrong_credentials">Anmeldung fehlgeschlagen. Bitte Benutzernamen und Passwort überprüfen.</string>
|
||||
<string name="login_failed_throttled">Zu viele erfolglose Versuche. Bitte in einigen Minuten erneut versuchen.</string>
|
||||
<string name="login_failed_blocked">Dieser Benutzer wurde leider auf Commons gesperrt</string>
|
||||
<string name="login_failed_2fa_needed">Du musst deinen Code zur Zwei-Faktor-Authentifizierung angeben.</string>
|
||||
|
|
|
|||
|
|
@ -52,8 +52,6 @@
|
|||
<string name="share_title_hint">Sername</string>
|
||||
<string name="share_description_hint">Şınasnayış</string>
|
||||
<string name="login_failed_network">Xırabiya kewten-network xeta</string>
|
||||
<string name="login_failed_username">Ronıştışo abeno - Namey karberi ye xo kontrol kerë</string>
|
||||
<string name="login_failed_password">Ronıştışo nêabeno - Parolay xo kontrol kerë</string>
|
||||
<string name="login_failed_throttled">Şıma xeylê rayi kerd ke cı kewê, a ser nêvıst. Şıma rê zehmet 2-3 deqey ra tepeya reyna bıcerrebnên.</string>
|
||||
<string name="login_failed_blocked">Qısur mewni rê, Karber commons dı bloqe biyo.</string>
|
||||
<string name="login_failed_generic">Nidekeweya de</string>
|
||||
|
|
|
|||
|
|
@ -57,8 +57,7 @@
|
|||
<string name="add_title_toast">Παρακαλώ παρέχετε ένα τίτλο για αυτό το αρχείο</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_wrong_credentials">Αποτυχία σύνδεσης - παρακαλώ ελέγξτε το όνομα χρήστη και τον κωδικό σας</string>
|
||||
<string name="login_failed_throttled">Πάρα πολλές ανεπιτυχείς προσπάθειες. Παρακαλώ δοκιμάστε ξανά σε λίγα λεπτά.</string>
|
||||
<string name="login_failed_blocked">Συγνώμη, αυτός ο χρήστης έχει αποκλειστεί από τα Commons</string>
|
||||
<string name="login_failed_2fa_needed">Πρέπει να δώσετε τον κωδικό πιστοποίησης με δύο παράγοντες</string>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Authors:
|
||||
* 2axterix2
|
||||
* Adjen
|
||||
* Benfutbol10
|
||||
* Fitoschido
|
||||
* Jduranboger
|
||||
|
|
@ -57,8 +58,7 @@
|
|||
<string name="add_title_toast">Proporciona un título para este archivo</string>
|
||||
<string name="share_description_hint">Descripción</string>
|
||||
<string name="login_failed_network">No se pudo iniciar sesión: falla de red</string>
|
||||
<string name="login_failed_username">No se pudo iniciar sesión: revisa tu nombre de usuario</string>
|
||||
<string name="login_failed_password">No se pudo iniciar sesión: revisa tu contraseña</string>
|
||||
<string name="login_failed_wrong_credentials">No se puede acceder. Revisa el nombre de usuario y la contraseña</string>
|
||||
<string name="login_failed_throttled">Demasiados intentos fallidos. Inténtalo de nuevo en unos minutos.</string>
|
||||
<string name="login_failed_blocked">Lo sentimos, este usuario ha sido bloqueado en Commons</string>
|
||||
<string name="login_failed_2fa_needed">Debes proporcionar tu código de auntenticación de dos factores.</string>
|
||||
|
|
|
|||
|
|
@ -48,8 +48,6 @@
|
|||
<string name="share_title_hint">Izenburua</string>
|
||||
<string name="share_description_hint">Deskribapena</string>
|
||||
<string name="login_failed_network">Ezin izan da sartu - sarean akatsa</string>
|
||||
<string name="login_failed_username">Ezin izan da sartu - ziurtatu ezazu zure erabiltzaile izena</string>
|
||||
<string name="login_failed_password">Ezin izan da sartu - ziurta ezazu zure pasahitza</string>
|
||||
<string name="login_failed_throttled">Sartzeko saiakera txar gehiegi. Mesedez saiatu zaitez minutu batzuk barru.</string>
|
||||
<string name="login_failed_blocked">Barka, baina erabiltzaile hau blokeatuta dago Commonsen</string>
|
||||
<string name="login_failed_generic">Saio hasieran akatsa</string>
|
||||
|
|
|
|||
|
|
@ -56,8 +56,6 @@
|
|||
<string name="add_title_toast">لطفاً نامی را برای این پرونده انتخاب کنید</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>
|
||||
|
|
|
|||
|
|
@ -2,10 +2,11 @@
|
|||
<!-- Authors:
|
||||
* Nike
|
||||
* Olli
|
||||
* Pyscowicz
|
||||
* Silvonen
|
||||
-->
|
||||
<resources>
|
||||
<string name="crash_dialog_title">Commons app on kaatunut</string>
|
||||
<string name="crash_dialog_title">Commons on kaatunut</string>
|
||||
<string name="crash_dialog_text">Pahoittelemme, virhe tapahtui.</string>
|
||||
<string name="crash_dialog_comment_prompt">Kerro meille mitä teit äsken, sähköpostitse. Se auttaa meitä korjaamaan ongelman!</string>
|
||||
<string name="crash_dialog_ok_toast">Kiitos!</string>
|
||||
|
|
|
|||
|
|
@ -58,8 +58,6 @@
|
|||
<string name="add_title_toast">Anna tälle tiedostolle otsikko</string>
|
||||
<string name="share_description_hint">Kuvaus</string>
|
||||
<string name="login_failed_network">Kirjautuminen epäonnistui - verkkovirhe</string>
|
||||
<string name="login_failed_username">Kirjautuminen epäonnistui - tarkista käyttäjätunnus</string>
|
||||
<string name="login_failed_password">Kirjautuminen epäonnistui - tarkista salasanasi</string>
|
||||
<string name="login_failed_throttled">Liikaa epäonnistuneita yrityksiä. Yritä uudelleen parin minuutin kuluttua.</string>
|
||||
<string name="login_failed_blocked">Pahoittelut, tämä käyttäjä on estetty Commonsissa</string>
|
||||
<string name="login_failed_2fa_needed">Anna kaksivaiheisen tunnistuksen koodi.</string>
|
||||
|
|
@ -162,8 +160,8 @@
|
|||
<string name="detail_description_empty">Ei kuvausta</string>
|
||||
<string name="detail_license_empty">Tuntematon lisenssi</string>
|
||||
<string name="menu_refresh">Päivitä</string>
|
||||
<string name="read_storage_permission_rationale">Vaadittu oikeus: Ulkoisen tallennustilan luku. Appi ei voi päästä galleriaasi ilman tätä oikeutta.</string>
|
||||
<string name="write_storage_permission_rationale">Vaadittava lupa: Kirjoita ulkoiseen tallennustilaan. Appi ei voi päästä kameraasi ilman tätä oikeutta.</string>
|
||||
<string name="read_storage_permission_rationale">Vaadittu oikeus: Ulkoisen tallennustilan luku. Sovellus ei voi päästä galleriaasi ilman tätä oikeutta.</string>
|
||||
<string name="write_storage_permission_rationale">Vaadittu oikeus: Kirjoita ulkoiseen tallennustilaan. Sovellus ei voi päästä kameraasi ilman tätä oikeutta.</string>
|
||||
<string name="location_permission_rationale">Valinnainen lupa: Saada tämänhetkinen sijainti loukkasuosituksia varten.</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="title_activity_nearby">Lähellä olevat paikat</string>
|
||||
|
|
@ -262,4 +260,8 @@
|
|||
<string name="about_translate_proceed">Jatka</string>
|
||||
<string name="about_translate_cancel">Peruuta</string>
|
||||
<string name="retry">Yritä uudelleen</string>
|
||||
<string name="showcase_view_got_it_button">Selvä!</string>
|
||||
<string name="no_images_found">Kuvia ei löytynyt!</string>
|
||||
<string name="image_uploaded_by">Tallentanut: %1$s</string>
|
||||
<string name="share_app_title">Jaa sovellus</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -34,8 +34,6 @@
|
|||
<string name="share_title_hint">Heiti</string>
|
||||
<string name="share_description_hint">Frágreiðing</string>
|
||||
<string name="login_failed_network">Ómøguligt at rita inn - feilur í netsambandinum</string>
|
||||
<string name="login_failed_username">Ómøguligt at rita inn - vinarliga eftirkanna títt brúkaranavn</string>
|
||||
<string name="login_failed_password">Ómøguligt at rita inn - vinarliga kanna eftir, um títt loyniorð er rætt</string>
|
||||
<string name="login_failed_throttled" fuzzy="true">Ov nógv miseydnaðar royndir. Vinarliga royn aftur um fáir minuttir</string>
|
||||
<string name="login_failed_blocked">Haldið okkum tilgóðar, hesin brúkari er blivin sperraður á Commons</string>
|
||||
<string name="login_failed_generic">Login miseydnaðist</string>
|
||||
|
|
|
|||
|
|
@ -65,8 +65,7 @@
|
|||
<string name="add_title_toast">Veuillez donner un titre à ce fichier</string>
|
||||
<string name="share_description_hint">Description</string>
|
||||
<string name="login_failed_network">Impossible de se connecter — panne de réseau</string>
|
||||
<string name="login_failed_username">Impossible de se connecter — veuillez vérifier votre nom d’utilisateur</string>
|
||||
<string name="login_failed_password">Impossible de se connecter — veuillez vérifier votre mot de passe</string>
|
||||
<string name="login_failed_wrong_credentials">Impossible de se connecter — veuillez vérifier votre nom d’utilisateur et votre mot de passe</string>
|
||||
<string name="login_failed_throttled">Trop de tentatives infructueuses. Veuillez réessayer dans quelques minutes.</string>
|
||||
<string name="login_failed_blocked">Désolé, cet utilisateur a été bloqué dans Commons</string>
|
||||
<string name="login_failed_2fa_needed">Vous devez fournir votre code d’authentification à deux facteurs.</string>
|
||||
|
|
|
|||
|
|
@ -42,8 +42,6 @@
|
|||
<string name="share_title_hint">Tiitel</string>
|
||||
<string name="share_description_hint">Beskriiwang</string>
|
||||
<string name="login_failed_network">Bi\'t uunmeldin as wat skiaf gingen - näätwerk-feeler</string>
|
||||
<string name="login_failed_username">Bi\'t uunmeldin as wat skiaf gingen - luke ans efter di brükernööm</string>
|
||||
<string name="login_failed_password">Bi\'t uunmeldin as wat skiaf gingen - luke ans efter det paaswurd</string>
|
||||
<string name="login_failed_throttled">Tu fölsis fersoocht saner lok. Ferschük det uun hög minüüten noch ans nei.</string>
|
||||
<string name="login_failed_blocked">Didiar brüker as üüb Commons speret wurden.</string>
|
||||
<string name="login_failed_2fa_needed">Dü skel dan code för\'t tau-straal-gudkäänen (2FA) uundu.</string>
|
||||
|
|
|
|||
|
|
@ -55,8 +55,6 @@
|
|||
<string name="add_title_toast">Por favor, proporcione un título para este ficheiro</string>
|
||||
<string name="share_description_hint">Descrición</string>
|
||||
<string name="login_failed_network">Erro ao acceder ao sistema: Fallou a rede</string>
|
||||
<string name="login_failed_username">Erro ao acceder ao sistema: Comprobe o seu nome de usuario</string>
|
||||
<string name="login_failed_password">Erro ao acceder ao sistema: Comprobe o seu contrasinal</string>
|
||||
<string name="login_failed_throttled">Demasiados intentos incorrectos. Inténteo de novo nuns minutos.</string>
|
||||
<string name="login_failed_blocked">Sentímolo, este usuario está bloqueado en Commons</string>
|
||||
<string name="login_failed_2fa_needed">Debe proporcionar o seu código de autenticación de dous factores.</string>
|
||||
|
|
|
|||
|
|
@ -34,8 +34,6 @@
|
|||
<string name="share_title_hint">Poʻo Inoa</string>
|
||||
<string name="share_description_hint">Hōʻike ʻAno</string>
|
||||
<string name="login_failed_network">Hiki ʻole ke ʻeʻe - hāʻule pūnaewele</string>
|
||||
<string name="login_failed_username">Hiki ʻole ke ʻeʻe - hōʻoiaʻiʻo i kāu inoa mea hoʻohana ke ʻoluʻolu</string>
|
||||
<string name="login_failed_password">Hiki ʻole ke ʻeʻe - hōʻoiaʻiʻo i kāu ʻōlelo hūnā ke ʻoluʻolu</string>
|
||||
<string name="login_failed_throttled" fuzzy="true">Hoʻāʻo ʻeʻe ʻole he nui kā. E ʻoluʻolu, e hana hou i ka wā hou aku</string>
|
||||
<string name="login_failed_blocked">E kala mai, ua pale ʻia kēia mea hoʻohana ma ke Kahilehulehu</string>
|
||||
<string name="login_failed_generic">Hāʻule ka ʻeʻena</string>
|
||||
|
|
|
|||
|
|
@ -53,8 +53,6 @@
|
|||
<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>
|
||||
|
|
|
|||
10
app/src/main/res/values-hr/error.xml
Normal file
10
app/src/main/res/values-hr/error.xml
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Authors:
|
||||
* MaGa
|
||||
-->
|
||||
<resources>
|
||||
<string name="crash_dialog_title">Aplikacija Zajednički poslužitelj je prestala s radom</string>
|
||||
<string name="crash_dialog_text">Nešto je krenulo po krivu!</string>
|
||||
<string name="crash_dialog_comment_prompt">Napišite nam što radite i podijelite s nama putem elektroničke pošte. Pomoći će nam da to popravimo!</string>
|
||||
<string name="crash_dialog_ok_toast">Hvala Vam!</string>
|
||||
</resources>
|
||||
275
app/src/main/res/values-hr/strings.xml
Normal file
275
app/src/main/res/values-hr/strings.xml
Normal file
|
|
@ -0,0 +1,275 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Authors:
|
||||
* MaGa
|
||||
-->
|
||||
<resources>
|
||||
<string name="preference_category_appearance">Izgled</string>
|
||||
<string name="preference_category_general">Opće</string>
|
||||
<string name="preference_category_feedback">Povratna informacija</string>
|
||||
<string name="preference_category_location">Lokacija</string>
|
||||
<string name="app_name">Zajednički poslužitelj</string>
|
||||
<string name="bullet">•</string>
|
||||
<string name="menu_settings">Postavke</string>
|
||||
<string name="username">Suradničko ime</string>
|
||||
<string name="password">Zaporka</string>
|
||||
<string name="login_credential">Prijavite se na Commons beta račun</string>
|
||||
<string name="login">Prijavi se</string>
|
||||
<string name="forgot_password">Zaboravljena zaporka?</string>
|
||||
<string name="signup">Otvori račun</string>
|
||||
<string name="logging_in_title">Prijava</string>
|
||||
<string name="logging_in_message">Molimo pričekajte ...</string>
|
||||
<string name="login_success">Prijava uspješna!</string>
|
||||
<string name="login_failed">Prijava neuspješna!</string>
|
||||
<string name="upload_failed">Datoteka nije pronađena. Molimo probajte drugu.</string>
|
||||
<string name="authentication_failed">Autentifikacija neuspješna!</string>
|
||||
<string name="uploading_started">Postavljanje započeto!</string>
|
||||
<string name="upload_completed_notification_title">%1$s postavljeno!</string>
|
||||
<string name="upload_completed_notification_text">Dodirnite da biste vidjeli datoteku</string>
|
||||
<string name="upload_progress_notification_title_start">Počinje postavljanje %1$s</string>
|
||||
<string name="upload_progress_notification_title_in_progress">Postavljanje %1$s</string>
|
||||
<string name="upload_progress_notification_title_finishing">Završeno postavljanje %1$s</string>
|
||||
<string name="upload_failed_notification_title">Postavljanje %1$s neuspješno</string>
|
||||
<string name="upload_failed_notification_subtitle">Dodirnite da biste vidjeli</string>
|
||||
<plurals name="uploads_pending_notification_indicator">
|
||||
<item quantity="one">Postavlja se %1$d datoteka</item>
|
||||
<item quantity="other">Postavljaju se %1$d datoteke</item>
|
||||
</plurals>
|
||||
<string name="title_activity_contributions">Moja nedavja postavljanja</string>
|
||||
<string name="contribution_state_queued">U redu čekanja</string>
|
||||
<string name="contribution_state_failed">Neuspješno</string>
|
||||
<string name="contribution_state_in_progress">%1$d%% postavljeno</string>
|
||||
<string name="contribution_state_starting">Postavljanje</string>
|
||||
<string name="menu_from_gallery">Iz galerije</string>
|
||||
<string name="menu_from_camera">Napravi sliku</string>
|
||||
<string name="menu_nearby">U blizini</string>
|
||||
<string name="provider_contributions">Moja postavljanja</string>
|
||||
<string name="menu_share">Podijeli</string>
|
||||
<string name="menu_open_in_browser">Pogledaj u pregledniku</string>
|
||||
<string name="share_title_hint">Naziv</string>
|
||||
<string name="add_title_toast">Molimo imenujte ovu datoteku</string>
|
||||
<string name="share_description_hint">Opis</string>
|
||||
<string name="login_failed_network">Prijava nije moguća - mrežna pogrješka</string>
|
||||
<string name="login_failed_wrong_credentials">Prijava nije moguća - molimo provjerite suradničko ime i zaportku</string>
|
||||
<string name="login_failed_throttled">Previše neuspješnih pokušaja, molimo probajte opet za par minuta.</string>
|
||||
<string name="login_failed_blocked">Ispričavamo se, ovaj je suradnik blokiran na Zajendičkom poslužitelju</string>
|
||||
<string name="login_failed_2fa_needed">Morate upisati autetifikacijski kôd od dva faktora</string>
|
||||
<string name="login_failed_generic">Prijava neuspješna</string>
|
||||
<string name="share_upload_button">Postavljanje</string>
|
||||
<string name="multiple_share_base_title">Imenujte ovaj set</string>
|
||||
<string name="provider_modifications">Promjene</string>
|
||||
<string name="menu_upload_single">Postavljanje</string>
|
||||
<string name="categories_search_text_hint">Pretraži kategorije</string>
|
||||
<string name="menu_save_categories">Spremi</string>
|
||||
<string name="refresh_button">Osvježi</string>
|
||||
<string name="display_list_button">Popis</string>
|
||||
<string name="gps_disabled">GPS je onemogućen na Vašem uređaju. Želite li ga omogućiti?</string>
|
||||
<string name="enable_gps">Omogući GPS</string>
|
||||
<string name="contributions_subtitle_zero">Nemate još postavljenih datoteka</string>
|
||||
<plurals name="contributions_subtitle">
|
||||
<item quantity="zero">\@string/contributions_subtitle_zero</item>
|
||||
<item quantity="one">%1$d postavljena datoteka</item>
|
||||
<item quantity="other">%1$d postavljene datoteke</item>
|
||||
</plurals>
|
||||
<plurals name="starting_multiple_uploads">
|
||||
<item quantity="one">Započeto %1$d postavljanje</item>
|
||||
<item quantity="other">Započeta %1$d postavljanja</item>
|
||||
</plurals>
|
||||
<plurals name="multiple_uploads_title">
|
||||
<item quantity="one">%1$d postavljanje</item>
|
||||
<item quantity="other">%1$d postavljanja</item>
|
||||
</plurals>
|
||||
<string name="categories_not_found">Nema kategorija koje odgovoraju upitu %1$s</string>
|
||||
<string name="categories_skip_explanation">Dodajte slikama kategorije kako bi se lakše pronašle. Da biste ih dodali, započnite s upisivanjem.</string>
|
||||
<string name="categories_activity_title">Kategorije</string>
|
||||
<string name="title_activity_settings">Postavke</string>
|
||||
<string name="title_activity_signup">Otvori račun</string>
|
||||
<string name="title_activity_featured_images">Izabrane slike</string>
|
||||
<string name="menu_about">O</string>
|
||||
<string name="about_license">Aplikacija The Wikimedia Commons je aplikacija otvorenog kôda koju razvijaju i održavaju volonteri Wikimedijine zajednice. Zaklada Wikimedija nije uključena u stvaranje, razvoj ili održavanje ove aplikacije.</string>
|
||||
<string name="about_improve">Da biste prijavili poteškoću ili dali prijedlog, stvorite <a href=\"https://github.com/commons-app/apps-android-commons/issues\">novi zahtjev na GitHubu</a>.</string>
|
||||
<string name="about_privacy_policy"><u>Politika privatnosti</u></string>
|
||||
<string name="about_credits"><u>Zasluge</u></string>
|
||||
<string name="title_activity_about">O</string>
|
||||
<string name="menu_feedback">Pošaljite povratnu informaciju (putem elektroničke pošte)</string>
|
||||
<string name="no_email_client">Klijent za elektroničku poštu nije instaliran</string>
|
||||
<string name="provider_categories">Nedavno rabljene kategorije</string>
|
||||
<string name="waiting_first_sync">Pričekajte za prvu sinkronizaciju...</string>
|
||||
<string name="no_uploads_yet">Nemate još postavljenih slika.</string>
|
||||
<string name="menu_retry_upload">Pokušaj ponovo</string>
|
||||
<string name="menu_cancel_upload">Odustani</string>
|
||||
<string name="share_license_summary">Ova će slika biti licencirana pod %1$s</string>
|
||||
<string name="media_upload_policy">Slanjem ove slike izjavljujem da je ona moje djelo i ne sadrži materijale zaštićene autorskim pravom ili selfije, te da je u skladu sa <a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\">smjernicama Zajedničkog poslužitelja</a>.</string>
|
||||
<string name="menu_download">Preuzmi</string>
|
||||
<string name="preference_license">Podrazumijevana licencija</string>
|
||||
<string name="use_previous">Rabite prethodni naziv/opis</string>
|
||||
<string name="allow_gps">Automatski pribavi trenutačnu lokaciju</string>
|
||||
<string name="allow_gps_summary">Ako slika nema oznaku lokacije, pribavi trenutačnu lokaciju kako bi se mogle ponuditi kategorije</string>
|
||||
<string name="preference_theme">Noćni način</string>
|
||||
<string name="preference_theme_summary">Rabi tamnu temu</string>
|
||||
<string name="license_name_cc_by_sa_four"> Imenovanje-Dijeli pod istim uvjetima 4.0</string>
|
||||
<string name="license_name_cc_by_four"> Imenovanje 4.0</string>
|
||||
<string name="license_name_cc_by_sa"> Imenovanje-Dijeli pod istim uvjetima 3.0</string>
|
||||
<string name="license_name_cc_by"> Imenovanje 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 (Austrija)</string>
|
||||
<string name="license_name_cc_by_sa_3_0_de">CC BY-SA 3.0 (Njemačka)</string>
|
||||
<string name="license_name_cc_by_sa_3_0_ee">CC BY-SA 3.0 (Estonija)</string>
|
||||
<string name="license_name_cc_by_sa_3_0_es">CC BY-SA 3.0 (Španjolska)</string>
|
||||
<string name="license_name_cc_by_sa_3_0_hr">CC BY-SA 3.0 (Hrvatska)</string>
|
||||
<string name="license_name_cc_by_sa_3_0_lu">CC BY-SA 3.0 (Luksemburg)</string>
|
||||
<string name="license_name_cc_by_sa_3_0_nl">CC BY-SA 3.0 (Nizozemska)</string>
|
||||
<string name="license_name_cc_by_sa_3_0_no">CC BY-SA 3.0 (Norveška)</string>
|
||||
<string name="license_name_cc_by_sa_3_0_pl">CC BY-SA 3.0 (Poljska)</string>
|
||||
<string name="license_name_cc_by_sa_3_0_ro">CC BY-SA 3.0 (Rumunjska)</string>
|
||||
<string name="license_name_cc_by_3_0">CC BY 3.0</string>
|
||||
<string name="license_name_cc_by_sa_4_0">CC BY-SA 4.0</string>
|
||||
<string name="license_name_cc_by_4_0">CC BY 4.0</string>
|
||||
<string name="license_name_cc_zero">CC Zero</string>
|
||||
<string name="tutorial_1_text">Na Zajedničkom poslužitelju se nalazi većina slika rabljena na Wikipediji.</string>
|
||||
<string name="tutorial_1_subtext">Vaše slike pomažu u edukaciji ljudi diljem svijeta!</string>
|
||||
<string name="tutorial_2_text">Molimo postavite slike koje su u cijelosti Vaše djelo:</string>
|
||||
<string name="tutorial_2_subtext">Objekti iz prirode (cvijeće, životinje, planine)\n• Korisni objekti (bicikla, željezničke postaje)\n• Poznate osobe (Vaš gradonačelnik, olimpijski sportaš kojeg ste sreli)</string>
|
||||
<string name="tutorial_2_subtext_1">Objekti iz prirode (cvijeće, životinje, planine)</string>
|
||||
<string name="tutorial_2_subtext_2">Korisni objekti (bicikla, željezničke postaje)</string>
|
||||
<string name="tutorial_2_subtext_3">Poznate osobe (Vaš gradonačelnik, olimpijski sportaš kojeg ste sreli)</string>
|
||||
<string name="tutorial_3_text">Molimo NE postavljajte:</string>
|
||||
<string name="tutorial_3_subtext">- selfije ili slike Vaših prijatelja\n- slike koje ste preuzeli s interneta\n- snimke ekrana zaštićenih aplikacija</string>
|
||||
<string name="tutorial_3_subtext_1">Selfije ili slike Vaših prijatelja</string>
|
||||
<string name="tutorial_3_subtext_2">Slike koje ste preuzeli s interneta</string>
|
||||
<string name="tutorial_3_subtext_3">Snimke ekrana zaštićenih aplikacija</string>
|
||||
<string name="tutorial_4_text">Primjer postavljanja:</string>
|
||||
<string name="tutorial_4_subtext">- Naziv: Sydneyska opera\n- Opis: Sydneyska opera viđena iz zaljeva\n- Kategorije: Sydney Opera House from the west, Sydney Opera House remote views</string>
|
||||
<string name="tutorial_4_subtext_1">Naziv: Sydneyska opera</string>
|
||||
<string name="tutorial_4_subtext_2">Opis: Sydneyska opera viđena iz zaljeva</string>
|
||||
<string name="tutorial_4_subtext_3">Kategorije: Sydney Opera House from the west, Sydney Opera House remote views</string>
|
||||
<string name="welcome_wikipedia_text">Dijelite Vaše slike. Pomozite da članci na Wikipediji zažive!</string>
|
||||
<string name="welcome_wikipedia_subtext">Slike na wikipediji su sa Zajedničkog poslužitelja.</string>
|
||||
<string name="welcome_copyright_text">Vaše slike pomažu u edukaciji ljudi diljem svijeta.</string>
|
||||
<string name="welcome_copyright_subtext">Izbjegavajte materijale s autorskim pravima koje ste pronašli na internetu (slike plakata, naslovnice knjiga, i slično).</string>
|
||||
<string name="welcome_final_text">Jeste li razumjeli?</string>
|
||||
<string name="welcome_final_button_text">Da!</string>
|
||||
<string name="detail_panel_cats_label">Kategorije</string>
|
||||
<string name="detail_panel_cats_loading">Učitavanje...</string>
|
||||
<string name="detail_panel_cats_none">Ništa nije odabrano</string>
|
||||
<string name="detail_description_empty">Nema opisa</string>
|
||||
<string name="detail_license_empty">Nepoznata licencija</string>
|
||||
<string name="menu_refresh">Osvježi</string>
|
||||
<string name="read_storage_permission_rationale">Potrebno dopuštenje čitanja vanjske pohrane. Bez toga aplikacija ne može pristupiti Vašoj galeriji.</string>
|
||||
<string name="write_storage_permission_rationale">Potrebno dopuštenje spremanja na vanjsku pohranu. Bez toga aplikacija ne može pristupiti Vašoj kameri.</string>
|
||||
<string name="location_permission_rationale">Potrebno dopuštenje za određivanje trenutačne lokacije za prijedloge kategorija (nije obvezno)</string>
|
||||
<string name="ok">U redu</string>
|
||||
<string name="title_activity_nearby">Mjesta u blizini</string>
|
||||
<string name="no_nearby">Nisu pronađena mjesta u blizini</string>
|
||||
<string name="warning">Upozorenje</string>
|
||||
<string name="file_exists">Ova datoteka već postoji na Zajedničkom poslužitelju. Jeste li sigurni da želite nastaviti?</string>
|
||||
<string name="yes">Da</string>
|
||||
<string name="no">Ne</string>
|
||||
<string name="media_detail_title">Naslov</string>
|
||||
<string name="media_detail_media_title">Naslov medija</string>
|
||||
<string name="media_detail_description">Opis</string>
|
||||
<string name="media_detail_description_explanation">Ovdje ide opis datoteke. Mogao bi biti poprilično dug i trebat će se prelomiti u nekoliko redova. Nadamo se da će lijepo izgledati.</string>
|
||||
<string name="media_detail_author">Autor</string>
|
||||
<string name="media_detail_author_explanation">Ovdje ide suradničko ime autora izabrane slike.</string>
|
||||
<string name="media_detail_uploaded_date">Datum postavljanja</string>
|
||||
<string name="media_detail_license">Licencija</string>
|
||||
<string name="media_detail_coordinates">Koordinate</string>
|
||||
<string name="media_detail_coordinates_empty">Ništa nije navedeno</string>
|
||||
<string name="become_a_tester_title">Postani beta tester</string>
|
||||
<string name="become_a_tester_description">Prijavite se na naš beta-kanal na Google Playu i dobijte raniji pristup novim mogućnostima i ispravkama pogrješaka</string>
|
||||
<string name="_2fa_code">Kôd za provjeru u 2 koraka</string>
|
||||
<string name="number_of_uploads">Moje ograničenje nedavnih postavljanja</string>
|
||||
<string name="maximum_limit">Najviše moguće</string>
|
||||
<string name="maximum_limit_alert">Nije moguće prikazati više od 500</string>
|
||||
<string name="set_limit">Postavi ograničenje nedavnih postavljanja</string>
|
||||
<string name="login_failed_2fa_not_supported">Kôd za provjeru u 2 koraka nije podržan.</string>
|
||||
<string name="logout_verification">Zaista se želite odjaviti?</string>
|
||||
<string name="commons_logo">Logotip Zajedničkog poslužitelja</string>
|
||||
<string name="commons_website">Mrežno mjesto Zajedničkog poslužitelja</string>
|
||||
<string name="commons_facebook">Stranica Zajedničkog poslužitelja na Facebooku</string>
|
||||
<string name="commons_github">Izvorni kôd Zajedničkog poslužitelja na Githubu</string>
|
||||
<string name="background_image">Pozadinska slika</string>
|
||||
<string name="mediaimage_failed">Slika nije uspjela</string>
|
||||
<string name="no_image_found">Slika nije pronađena</string>
|
||||
<string name="upload_image">Postavi sliku</string>
|
||||
<string name="welcome_image_mount_zao">Planina Zao</string>
|
||||
<string name="welcome_image_llamas">Ljame</string>
|
||||
<string name="welcome_image_rainbow_bridge">Dugin most</string>
|
||||
<string name="welcome_image_tulip">Tulipan</string>
|
||||
<string name="welcome_image_no_selfies">Bez selfija</string>
|
||||
<string name="welcome_image_proprietary">Vlasnička slika</string>
|
||||
<string name="welcome_image_welcome_wikipedia">Welcome (Wikipedija)</string>
|
||||
<string name="welcome_image_welcome_copyright">Dobro došli (autorska prava)</string>
|
||||
<string name="welcome_image_sydney_opera_house">Sidnejska opera</string>
|
||||
<string name="cancel">Odustani</string>
|
||||
<string name="navigation_drawer_open">Otvori</string>
|
||||
<string name="navigation_drawer_close">Zatvori</string>
|
||||
<string name="navigation_item_home">Početna stranica</string>
|
||||
<string name="navigation_item_upload">Postavljanje</string>
|
||||
<string name="navigation_item_nearby">U blizini</string>
|
||||
<string name="navigation_item_about">O</string>
|
||||
<string name="navigation_item_settings">Postavke</string>
|
||||
<string name="navigation_item_feedback">Povratna informacija</string>
|
||||
<string name="navigation_item_logout">Odjava</string>
|
||||
<string name="navigation_item_info">Upute</string>
|
||||
<string name="navigation_item_notification">Obavijesti</string>
|
||||
<string name="navigation_item_featured_images">Izabrano</string>
|
||||
<string name="nearby_needs_permissions">Mjesta u blizini ne mogu biti prikazana bez dopuštenja određivanja lokacije</string>
|
||||
<string name="no_description_found">nema opisa</string>
|
||||
<string name="nearby_info_menu_commons_article">Stranica datoteke na Zajedničkom poslužitelju</string>
|
||||
<string name="nearby_info_menu_wikidata_article">Stavka na Wikidati</string>
|
||||
<string name="nearby_info_menu_wikipedia_article">Članak na Wikipediji</string>
|
||||
<string name="error_while_cache">Pogrješka predmemoriranja slika</string>
|
||||
<string name="title_info">Jedinstveni naziv datoteke koji će služiti kao njeno ime. Možete koristiti uobičajeni jezik s razmacima. Ne uključuje datotečni nastavak.</string>
|
||||
<string name="description_info">Opišite medij što je više moguće: gdje je napravljen, što prikazuje,... Opišite objekte ili osobe. Napišite informacije koje ne mogu biti lako okrivene, npr. doba dana ako je u pitanju pejzaž. Ako medij prikazuje nešto neobično, molimo objasnite što je neobično.</string>
|
||||
<string name="upload_image_too_dark">Slika je pretamna, želite ili je ipak ostaviti? Zajednički poslužitelj je namijenjen slikama od enciklopedijske vrijednosti.</string>
|
||||
<string name="upload_image_blurry">Slika je mutna, želite ili je ipak ostaviti? Zajednički poslužitelj je namijenjen slikama od enciklopedijske vrijednosti.</string>
|
||||
<string name="give_permission">Daj dopuštenje</string>
|
||||
<string name="use_external_storage">Rabi vanjsku pohranu</string>
|
||||
<string name="use_external_storage_summary">Spremite slike načinjene kamerom Vašeg uređaja</string>
|
||||
<string name="login_to_your_account">Prijavite se na Vaš račun</string>
|
||||
<string name="send_log_file">Pošalji zapisnik</string>
|
||||
<string name="send_log_file_description">Pošalji zapisnik elektroničkom poštom razvijateljima</string>
|
||||
<string name="no_web_browser">Preglednik nije pronađen</string>
|
||||
<string name="null_url">Pogrješka! URL nije pronađen</string>
|
||||
<string name="nominate_deletion">Predloži za brisanje</string>
|
||||
<string name="nominated_for_deletion">Slika je predložena za brisanje</string>
|
||||
<string name="view_browser">Pogledaj u pregledniku</string>
|
||||
<string name="nearby_location_has_not_changed">Lokacija nepromijenjena.</string>
|
||||
<string name="nearby_location_not_available">Lokacija nedostupna.</string>
|
||||
<string name="location_permission_rationale_nearby">Potrebno je dopuštenje za popis mjesta u blizini</string>
|
||||
<string name="get_directions">PRIBAVI UPUTE</string>
|
||||
<string name="read_article">PROČITAJ ČLANAK</string>
|
||||
<string name="notifications_welcome">%1$s, dobro došli na Zajednički poslužitelj! Drago nam je da ste tu.</string>
|
||||
<string name="notifications_talk_page_message">%1$s Vam je ostavio poruku na Vašoj razgovornoj stranici</string>
|
||||
<string name="notifications_thank_you_edit">Hvala Vam na uređivanju</string>
|
||||
<string name="notifications_mention">%1$s Vas je spomenuo na %2$s.</string>
|
||||
<string name="toggle_view_button">Prebaci prikaz</string>
|
||||
<string name="nearby_directions">UPUTE</string>
|
||||
<string name="nearby_wikidata">WIKIDATA</string>
|
||||
<string name="nearby_wikipedia">WIKIPEDIJA</string>
|
||||
<string name="nearby_commons">ZAJEDNIČKI POSLUŽITELJ</string>
|
||||
<string name="about_rate_us"><u>Ocijenite nas</u></string>
|
||||
<string name="about_faq"><u>ČPP</u></string>
|
||||
<string name="welcome_skip_button">Preskoči upute</string>
|
||||
<string name="no_internet">Internet nije dostupan</string>
|
||||
<string name="internet_established">Internet je dostupan</string>
|
||||
<string name="error_notifications">Pogrješka dohvaćanja obavijesti</string>
|
||||
<string name="no_notifications">Nema obavijesti</string>
|
||||
<string name="about_translate"><u>Prevedi</u></string>
|
||||
<string name="about_translate_title">Jezici</string>
|
||||
<string name="about_translate_message">Odaberite jezik na koji bi željeli prevoditi</string>
|
||||
<string name="about_translate_proceed">Nastavi</string>
|
||||
<string name="about_translate_cancel">Odustani</string>
|
||||
<string name="retry">Pokušaj ponovo</string>
|
||||
<string name="showcase_view_got_it_button">U redu!</string>
|
||||
<string name="showcase_view_whole_nearby_activity">Ovo su mjesta u blizini koja trebaju slike za ilustriranje članaka o njima na Wikipediji</string>
|
||||
<string name="showcase_view_list_icon">Dodirnite da biste dobili popis ovih mjesta</string>
|
||||
<string name="showcase_view_plus_fab">Možete postaviti sliku s bilo kojeg mjesta u Vašoj galeriji ili kameri</string>
|
||||
<string name="no_images_found">Slike nisu pronađene!</string>
|
||||
<string name="error_loading_images">Pogrješka prilikom učitavanja slika.</string>
|
||||
<string name="image_uploaded_by">Postavio: %1$s</string>
|
||||
<string name="share_app_title">Aplikacija za dijeljenje</string>
|
||||
<string name="share_coordinates_not_present">Prilikom označavanja slike koordinate nisu navedene</string>
|
||||
<string name="error_fetching_nearby_places">Pogrješka prilikom dohvaćanja mjesta u blizini.</string>
|
||||
</resources>
|
||||
|
|
@ -35,8 +35,6 @@
|
|||
<string name="share_title_hint">Titel</string>
|
||||
<string name="share_description_hint">Beschreibung</string>
|
||||
<string name="login_failed_network">Oonmeldung fehlgeschlooht – Netzwerrekfehler</string>
|
||||
<string name="login_failed_username">Oonmeldung fehlgeschlooht – Bittschön Benutzernoome üwerprüfe</string>
|
||||
<string name="login_failed_password">Oonmeldung fehlgeschlooht – Bittschön Passwort üwerprüfe</string>
|
||||
<string name="login_failed_throttled" fuzzy="true">Zu viele erfollichlose Versuche. Bittschön in en poor Minute wieder erneit versuche.</string>
|
||||
<string name="login_failed_blocked">Der Benutzer woard leider uff Commons gesperrt</string>
|
||||
<string name="login_failed_generic">Oonmeldung fehlgeschlooht</string>
|
||||
|
|
|
|||
|
|
@ -34,8 +34,6 @@
|
|||
<string name="share_title_hint">Titul</string>
|
||||
<string name="share_description_hint">Wopisanje</string>
|
||||
<string name="login_failed_network">Přizjewjenje je so njeporadźiło - syćowy zmylk</string>
|
||||
<string name="login_failed_username">Přizjewjenje je njemóžno - prošu přepruwuj swoje wužiwarske mjeno</string>
|
||||
<string name="login_failed_password">Přizjewjenje njeje móžno - prošu přepruwuj swoje hesło</string>
|
||||
<string name="login_failed_throttled" fuzzy="true">Přewjele njewuspěšnych pospytow. Prošu spytaj za něšto mjeńšin hišće raz.</string>
|
||||
<string name="login_failed_blocked">Tutoho wužiwarja su bohužel na Commons zablokowali</string>
|
||||
<string name="login_failed_generic">Přizjewjenje je so njeporadźiło</string>
|
||||
|
|
|
|||
|
|
@ -59,8 +59,6 @@
|
|||
<string name="add_title_toast">Kérlek, adj címet a fájlnak</string>
|
||||
<string name="share_description_hint">Leírás</string>
|
||||
<string name="login_failed_network">Nem lehet bejelentkezni - hálózati hiba</string>
|
||||
<string name="login_failed_username">Nem lehet bejelentkezni - ellenőrizd a felhasználóneved</string>
|
||||
<string name="login_failed_password">Nem lehet bejelentkezni - ellenőrizd a jelszavad</string>
|
||||
<string name="login_failed_throttled">Túl sok sikertelen próbálkozás. Próbálkozz újra pár perc múlva.</string>
|
||||
<string name="login_failed_blocked">Sajnáljuk, ezt a felhasználót blokkolták a Commonson</string>
|
||||
<string name="login_failed_2fa_needed">Meg kell adnia a kétlépcsős hitelesítő kódját.</string>
|
||||
|
|
|
|||
|
|
@ -46,8 +46,6 @@
|
|||
<string name="share_title_hint">Judul</string>
|
||||
<string name="share_description_hint">Deskripsi</string>
|
||||
<string name="login_failed_network">Tidak dapat login - kesalahan pada jaringan</string>
|
||||
<string name="login_failed_username">Tidak dapat masuk log - harap periksa nama pengguna Anda</string>
|
||||
<string name="login_failed_password">Tidak dapat masuk log - harap periksa kata sandi Anda</string>
|
||||
<string name="login_failed_throttled" fuzzy="true">Terlalu banyak usaha yang gagal. Harap coba lagi dalam beberapa menit</string>
|
||||
<string name="login_failed_blocked">Maaf, pengguna ini telah diblokir di Commons</string>
|
||||
<string name="login_failed_generic">Gagal masuk log</string>
|
||||
|
|
|
|||
|
|
@ -49,8 +49,6 @@
|
|||
<string name="add_title_toast">Gefðu þessari skrá einhvern titil</string>
|
||||
<string name="share_description_hint">Lýsing</string>
|
||||
<string name="login_failed_network">Innskráning mistókst - bilun í neti</string>
|
||||
<string name="login_failed_username">Innskráning mistókst. Athugaðu notandanafnið þitt</string>
|
||||
<string name="login_failed_password">Innskráning mistókst. Athugaðu lykilorðið þitt</string>
|
||||
<string name="login_failed_throttled">Of margar misteknar tilraunir. Reyndu aftur eftir nokkrar mínútur.</string>
|
||||
<string name="login_failed_blocked">Því miður, þessi notandi hefur verið bannaður á Commons</string>
|
||||
<string name="login_failed_2fa_needed">Þú verður að setja inn tveggja-þrepa auðkenningarkóðann þinn.</string>
|
||||
|
|
|
|||
|
|
@ -53,8 +53,6 @@
|
|||
<string name="share_title_hint">Titolo</string>
|
||||
<string name="share_description_hint">Descrizione</string>
|
||||
<string name="login_failed_network">Impossibile effettuare l\'accesso - errore di rete</string>
|
||||
<string name="login_failed_username">Impossibile effettuare l\'accesso - controlla il nome utente</string>
|
||||
<string name="login_failed_password">Impossibile effettuare l\'accesso - controlla la password</string>
|
||||
<string name="login_failed_throttled">Troppi tentativi falliti. Riprova tra alcuni minuti.</string>
|
||||
<string name="login_failed_blocked">Spiacente, questo utente è stato bloccato su Commons</string>
|
||||
<string name="login_failed_2fa_needed">Devi fornire il tuo codice di autenticazione a due fattori.</string>
|
||||
|
|
|
|||
|
|
@ -58,8 +58,7 @@
|
|||
<string name="add_title_toast">נא לתת כותרת לקובץ הזה</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_wrong_credentials">לא ניתן להיכנס לחשבון – נא לבדוק את שם המשתמש ואת הסיסמה</string>
|
||||
<string name="login_failed_throttled">יותר מדי ניסיונות כושלים להיכנס. נא לנסות שוב בעוד מספר דקות.</string>
|
||||
<string name="login_failed_blocked">סליחה, החשבון הזה חסום בוויקישיתוף</string>
|
||||
<string name="login_failed_2fa_needed">יש לספק את קוד האימות הדו־שלבי שלך.</string>
|
||||
|
|
|
|||
|
|
@ -40,7 +40,8 @@
|
|||
<string name="upload_failed_notification_title">%1$s のアップロードに失敗しました</string>
|
||||
<string name="upload_failed_notification_subtitle">閲覧するにはタップしてください</string>
|
||||
<plurals name="uploads_pending_notification_indicator">
|
||||
<item quantity="other">%1$d 件のファイルをアップロード中</item>
|
||||
<item quantity="one">%1$d file uploading</item>
|
||||
<item quantity="other">%1$d件のファイルをアップロード中</item>
|
||||
</plurals>
|
||||
<string name="title_activity_contributions">自分の最近のアップロードファイル</string>
|
||||
<string name="contribution_state_queued">順番待ち中</string>
|
||||
|
|
@ -57,11 +58,9 @@
|
|||
<string name="add_title_toast">ファイル名をつけてください</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_throttled">失敗した回数が多すぎます。数分待ってからもう一度お試しください。</string>
|
||||
<string name="login_failed_blocked">申し訳ありませんが、この利用者はコモンズでブロックされています。</string>
|
||||
<string name="login_failed_2fa_needed">2 要素認証コードを提供する必要があります。</string>
|
||||
<string name="login_failed_2fa_needed">2要素認証コードを提供する必要があります。</string>
|
||||
<string name="login_failed_generic">ログイン失敗</string>
|
||||
<string name="share_upload_button">アップロード</string>
|
||||
<string name="multiple_share_base_title">このセットに名前をつけてください</string>
|
||||
|
|
@ -76,22 +75,24 @@
|
|||
<string name="contributions_subtitle_zero">まだ何もアップロードされていません。</string>
|
||||
<plurals name="contributions_subtitle">
|
||||
<item quantity="zero">\@string/contributions_subtitle_zero</item>
|
||||
<item quantity="other">%1$d 件のアップロード</item>
|
||||
<item quantity="other">pne=%1$d upload</item>
|
||||
</plurals>
|
||||
<plurals name="starting_multiple_uploads">
|
||||
<item quantity="other">%1$d 件のアップロードを開始中</item>
|
||||
<item quantity="one">Starting %1$d upload</item>
|
||||
<item quantity="other">%1$d件のアップロードを開始中</item>
|
||||
</plurals>
|
||||
<plurals name="multiple_uploads_title">
|
||||
<item quantity="one">%1$d upload</item>
|
||||
<item quantity="other">%1$d 件のアップロード</item>
|
||||
</plurals>
|
||||
<string name="categories_not_found">%1$s に一致するカテゴリが見つかりません</string>
|
||||
<string name="categories_skip_explanation">あなたの画像をウィキメディア・コモンズで見つけやすくするためにカテゴリを追加してください。\n\nカテゴリ名の入力を開始してください。\nこの手順をスキップするにはこのメッセージをタップしてください(または戻るボタン)。</string>
|
||||
<string name="categories_skip_explanation">あなたの画像をウィキメディア・コモンズで見つけやすくするためにカテゴリを追加してください。\nカテゴリ名の入力を開始してください。</string>
|
||||
<string name="categories_activity_title">カテゴリ</string>
|
||||
<string name="title_activity_settings">設定</string>
|
||||
<string name="title_activity_signup">利用者登録</string>
|
||||
<string name="title_activity_featured_images">秀逸な画像</string>
|
||||
<string name="menu_about">このアプリについて</string>
|
||||
<string name="about_license">ウィキメディア・コモンズ・アプリはウィキメディア・コミュニティの助成金受給者とボランティアによって製作・メンテナンスされているオープンソースソフトウェアです。ウィキメディア財団はこのアプリの製作・開発・メンテナンスに関与していません。</string>
|
||||
<string name="about_license">ウィキメディア・コモンズ・アプリはウィキメディア・コミュニティの助成金受給者とボランティアが製作・管理しているオープンソースソフトウェアです。ウィキメディア財団はこのアプリの製作・開発・メンテナンスに関与していません。</string>
|
||||
<string name="about_improve">バグとアイディアは <a href=\"https://github.com/commons-app/apps-android-commons/issues\">Github</a> へ。</string>
|
||||
<string name="about_privacy_policy"><u>プライバシー・ポリシー</u></string>
|
||||
<string name="about_credits"><u>クレジット</u></string>
|
||||
|
|
@ -103,7 +104,7 @@
|
|||
<string name="no_uploads_yet">まだ写真をアップロードしていません。</string>
|
||||
<string name="menu_retry_upload">再試行</string>
|
||||
<string name="menu_cancel_upload">キャンセル</string>
|
||||
<string name="share_license_summary">この画像が %1$s ライセンスでアップロードされます。</string>
|
||||
<string name="share_license_summary">この画像は%1$sライセンスのもとにアップロードされます。</string>
|
||||
<string name="media_upload_policy">この画像の投稿に当たり、私はこれが自分自身の作品であり、著作権のあるコンテンツや自撮りは含まれていないと宣言します。</string>
|
||||
<string name="menu_download">ダウンロード</string>
|
||||
<string name="preference_license">既定のライセンス</string>
|
||||
|
|
@ -148,6 +149,7 @@
|
|||
<string name="tutorial_4_subtext">- 題名: シドニー・オペラハウス\n- 説明: 湾の向こうから見たシドニー・オペラハウス\n- カテゴリ: 西側から見たシドニー・オペラハウス、遠くから見たシドニー・オペラハウス</string>
|
||||
<string name="tutorial_4_subtext_1">題名: シドニーのオペラハウス</string>
|
||||
<string name="tutorial_4_subtext_2">説明: シドニーのオペラハウス。湾を挟んで撮影。</string>
|
||||
<string name="tutorial_4_subtext_3">カテゴリ: シドニーオペラハウスの西面、シドニーオペラ遠景</string>
|
||||
<string name="welcome_wikipedia_text">画像を投稿してください。ウィキペディアの記事に彩りを!</string>
|
||||
<string name="welcome_wikipedia_subtext">ウィキペディアの画像はウィキメディア・コモンズに保管されています。</string>
|
||||
<string name="welcome_copyright_text">あなたの画像は世界中の人々が学習する助けになります</string>
|
||||
|
|
@ -167,7 +169,7 @@
|
|||
<string name="title_activity_nearby">近くの場所</string>
|
||||
<string name="no_nearby">付近の場所が見つかりません</string>
|
||||
<string name="warning">警告</string>
|
||||
<string name="file_exists">このファイルが既にコモンズにあります。本当にアップロードしますか?</string>
|
||||
<string name="file_exists">このファイルは既にコモンズにあります。本当にアップロードしますか?</string>
|
||||
<string name="yes">はい</string>
|
||||
<string name="no">いいえ</string>
|
||||
<string name="media_detail_title">タイトル</string>
|
||||
|
|
@ -185,7 +187,7 @@
|
|||
<string name="_2fa_code">2FA コード</string>
|
||||
<string name="number_of_uploads">最近のアップロードファイルに表示する最大件数</string>
|
||||
<string name="maximum_limit">最大限</string>
|
||||
<string name="maximum_limit_alert">500 以上の項目を表示できません</string>
|
||||
<string name="maximum_limit_alert">表示できるのは500件以下です</string>
|
||||
<string name="set_limit">最近のアップロードファイルに表示する最大件数</string>
|
||||
<string name="login_failed_2fa_not_supported">2段階認証は現在サポートされていません。</string>
|
||||
<string name="logout_verification">ログアウトしてもよろしいですか?</string>
|
||||
|
|
@ -226,7 +228,7 @@
|
|||
<string name="nearby_info_menu_wikipedia_article">ウィキペディアの記事</string>
|
||||
<string name="error_while_cache">画像をキャッシュする際のエラー</string>
|
||||
<string name="title_info">ファイル固有の説明的な表題。ファイル名として使われます。平易な言葉を使い、空白を入れることができます。拡張子は含めないでください。</string>
|
||||
<string name="description_info">可能な限りメディアを説明してください:どこで撮られましたか?それは何を示していますか?文脈とは何ですか?物や人を説明してください。容易に推測できない情報、例えば風景の場合の時刻を明らかにする。メディアに珍しいことがある場合は、何が珍しいのかを説明してください。</string>
|
||||
<string name="description_info">可能な限りメディアを説明してください: 撮影地はどこですか? それは何を示していますか? どんな文脈がありますか? 被写体の物や人を説明してください。容易に推測できない情報、例えば風景であれば時刻を明示します。特筆すべき物事が映っている場合は、何が珍しいのかを説明してください。</string>
|
||||
<string name="upload_image_too_dark">この画像は暗すぎますがアップロードしますか? ウィキメディア・コモンズは百科事典に適した画像のみ受け付けます。</string>
|
||||
<string name="upload_image_blurry">ピントが合っていませんが、アップロードしますか? ウィキメディア・コモンズは百科事典に適した画像のみ受け付けます。</string>
|
||||
<string name="give_permission">権限を付与</string>
|
||||
|
|
@ -255,7 +257,7 @@
|
|||
<string name="nearby_wikipedia">ウィキペディア</string>
|
||||
<string name="nearby_commons">コモンズ</string>
|
||||
<string name="about_rate_us"><u>評価する</u></string>
|
||||
<string name="about_faq"><u>FAQ</u></string>
|
||||
<string name="about_faq"><u>よくある質問</u></string>
|
||||
<string name="welcome_skip_button">チュートリアルをスキップする</string>
|
||||
<string name="no_internet">インターネットに接続していません</string>
|
||||
<string name="internet_established">インターネットに接続しました</string>
|
||||
|
|
@ -276,4 +278,5 @@
|
|||
<string name="image_uploaded_by">アップロードした人: %1$</string>
|
||||
<string name="share_app_title">アプリをシェアする</string>
|
||||
<string name="share_coordinates_not_present">画像の選択中に位置情報を特定できませんでした</string>
|
||||
<string name="error_fetching_nearby_places">付近の場所を取得しようとしてエラーが発生しました。</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -40,8 +40,6 @@
|
|||
<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>
|
||||
<string name="login_failed_username">Ora bisa mlebu log - tiliki jeneng panganggoné panjenengan</string>
|
||||
<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>
|
||||
|
|
|
|||
|
|
@ -42,8 +42,6 @@
|
|||
<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>
|
||||
|
|
|
|||
|
|
@ -42,8 +42,6 @@
|
|||
<string name="share_title_hint">Azwel</string>
|
||||
<string name="share_description_hint">Aglam</string>
|
||||
<string name="login_failed_network">Ur izmir ara ad yeqqen - tuccḍa n uẓeṭṭa</string>
|
||||
<string name="login_failed_username">Ur izmir ara ad yeqqen - wali isem-ik n useqdac</string>
|
||||
<string name="login_failed_password">Ur izmir ara ad yeqqen - wali awal-ik uffir</string>
|
||||
<string name="login_failed_throttled">Ddeq n uɛraḍ ur yeddin ara. Ɛreḍ akka di kra n tisdatin</string>
|
||||
<string name="login_failed_blocked">Suref-aɣ, aseqdac-agi yewḥel di Commons</string>
|
||||
<string name="login_failed_2fa_needed">Yessefk ad d-muddeḍ tangalt n n usesbteb s snat n tarrayin.</string>
|
||||
|
|
|
|||
|
|
@ -35,8 +35,6 @@
|
|||
<string name="share_title_hint">ចំណងជើង</string>
|
||||
<string name="share_description_hint">បរិយាយ</string>
|
||||
<string name="login_failed_network">មិនអាចកត់ឈ្មោះចូល - បណ្តាញ network បរាជ័យ</string>
|
||||
<string name="login_failed_username">មិនអាចកត់ឈ្មោះចូល - សូមពិនិត្យឈ្មោះអ្នកប្រើប្រាស់របស់អ្នក</string>
|
||||
<string name="login_failed_password">មិនអាចកត់ឈ្មោះចូល - សូមពិនិត្យលេខសម្ងាត់របស់អ្នក</string>
|
||||
<string name="login_failed_throttled" fuzzy="true">ការព្យាយាមមិនបានសម្រេចមានចំនួនច្រើនដងពេក។ សូមព្យាយាមម្តងទៀតនៅប៉ុន្មាននាទីក្រោយ។</string>
|
||||
<string name="login_failed_blocked">សូមអភ័យទោស អ្នកប្រើប្រាស់រូបនេះត្រូវបានហាមឃាត់នៅ Commons</string>
|
||||
<string name="login_failed_generic">កត់ឈ្មោះចូលបរាជ័យ</string>
|
||||
|
|
|
|||
|
|
@ -42,8 +42,6 @@
|
|||
<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>
|
||||
|
|
|
|||
|
|
@ -58,8 +58,7 @@
|
|||
<string name="add_title_toast">이 파일의 제목을 지정해 주십시오</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_wrong_credentials">로그인할 수 없습니다 - 사용자 이름과 비밀번호를 확인해 주십시오</string>
|
||||
<string name="login_failed_throttled">실패한 시도가 너무 많습니다. 몇 분 후에 다시 시도하세요.</string>
|
||||
<string name="login_failed_blocked">죄송합니다, 이 사용자는 공용에서 차단되었습니다</string>
|
||||
<string name="login_failed_2fa_needed">2요소 인증 코드를 제공해야 합니다.</string>
|
||||
|
|
|
|||
97
app/src/main/res/values-kum/strings.xml
Normal file
97
app/src/main/res/values-kum/strings.xml
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Authors:
|
||||
* ArslanX
|
||||
-->
|
||||
<resources>
|
||||
<string name="preference_category_appearance">Гёрюнюш</string>
|
||||
<string name="preference_category_general">Ортакъ</string>
|
||||
<string name="bullet">•</string>
|
||||
<string name="menu_settings">Кюйлевлер</string>
|
||||
<string name="username">Къоллавчу аты</string>
|
||||
<string name="password">Чечил</string>
|
||||
<string name="login">Гирмек</string>
|
||||
<string name="forgot_password">Чечилни унутдунгму?</string>
|
||||
<string name="signup">Къайытланмакъ</string>
|
||||
<string name="upload_completed_notification_title">%1$s юкленген!</string>
|
||||
<string name="upload_progress_notification_title_in_progress">%1$s юкленип тура</string>
|
||||
<string name="upload_failed_notification_subtitle">Къарамакъ учун бас</string>
|
||||
<string name="contribution_state_queued">Гезикде</string>
|
||||
<string name="contribution_state_starting">Юклев</string>
|
||||
<string name="menu_from_camera">Сурат алмакъ</string>
|
||||
<string name="menu_nearby">Ювукъда</string>
|
||||
<string name="provider_contributions">Юклевлерим</string>
|
||||
<string name="menu_share">Пайлашмакъ</string>
|
||||
<string name="share_title_hint">Ат</string>
|
||||
<string name="share_description_hint">Тасвир</string>
|
||||
<string name="share_upload_button">Юклев</string>
|
||||
<string name="menu_upload_single">Юклев</string>
|
||||
<string name="menu_save_categories">Сакъламакъ</string>
|
||||
<string name="refresh_button">Янгыртмакъ</string>
|
||||
<string name="display_list_button">Тизме</string>
|
||||
<string name="enable_gps">GPS ишлетмек</string>
|
||||
<string name="contributions_subtitle_zero">Юклевлер ёкъ гьали де</string>
|
||||
<string name="categories_activity_title">Категориялар</string>
|
||||
<string name="title_activity_settings">Кюйлевлер</string>
|
||||
<string name="title_activity_signup">Къайытланмакъ</string>
|
||||
<string name="menu_about">Тасвири</string>
|
||||
<string name="about_credits"><u>Баракаллалар</u></string>
|
||||
<string name="title_activity_about">Тасвири</string>
|
||||
<string name="menu_retry_upload">Такрарламакъ</string>
|
||||
<string name="menu_cancel_upload">Гери алмакъ</string>
|
||||
<string name="menu_download">Эндирмек</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_de">CC BY-SA 3.0 (Алмания)</string>
|
||||
<string name="license_name_cc_by_sa_3_0_ee">CC BY-SA 3.0 (Эстония)</string>
|
||||
<string name="license_name_cc_by_3_0">CC BY 3.0</string>
|
||||
<string name="license_name_cc_by_sa_4_0">CC BY-SA 4.0</string>
|
||||
<string name="license_name_cc_by_4_0">CC BY 4.0</string>
|
||||
<string name="license_name_cc_zero">CC Zero</string>
|
||||
<string name="tutorial_3_subtext_2">Интернетден эндирген суратларынг</string>
|
||||
<string name="tutorial_4_text">Юклев уьлгю:</string>
|
||||
<string name="welcome_final_button_text">Дюр!</string>
|
||||
<string name="detail_panel_cats_label">Категориялар</string>
|
||||
<string name="detail_panel_cats_loading">Юклев...</string>
|
||||
<string name="detail_panel_cats_none">Бир зат сайланмагъан</string>
|
||||
<string name="detail_description_empty">Тасвири ёкъ</string>
|
||||
<string name="menu_refresh">Янгыртмакъ</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="warning">Буварыв</string>
|
||||
<string name="yes">Дюр</string>
|
||||
<string name="no">Ёкъ</string>
|
||||
<string name="media_detail_title">Ат</string>
|
||||
<string name="media_detail_description">Тасвир</string>
|
||||
<string name="media_detail_author">Ясавчу</string>
|
||||
<string name="media_detail_uploaded_date">Юклев тархы</string>
|
||||
<string name="_2fa_code">2FA код</string>
|
||||
<string name="welcome_image_tulip">Лале</string>
|
||||
<string name="welcome_image_no_selfies">Оьзсуратсыз</string>
|
||||
<string name="welcome_image_welcome_wikipedia">Хош гел Википедиягъа</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_logout">Чыкъмакъ</string>
|
||||
<string name="navigation_item_notification">Билдиривлер</string>
|
||||
<string name="navigation_item_featured_images">Сайламлы</string>
|
||||
<string name="no_description_found">тасвири табылмады</string>
|
||||
<string name="nearby_info_menu_wikipedia_article">Википедия макъала</string>
|
||||
<string name="null_url">Янгылыш! Байланыв табылмады</string>
|
||||
<string name="nearby_directions">ЯКЪЛАР</string>
|
||||
<string name="nearby_wikipedia">ВИКИПЕДИЯ</string>
|
||||
<string name="about_rate_us"><u>Къыйматла бизин</u></string>
|
||||
<string name="no_internet">Интернет гиришсиз</string>
|
||||
<string name="internet_established">Интернет гиришли</string>
|
||||
<string name="no_notifications">Билдиривлер ёкъ</string>
|
||||
<string name="about_translate"><u>Таржума этмек</u></string>
|
||||
<string name="about_translate_title">Тиллер</string>
|
||||
<string name="about_translate_cancel">Гери алыв</string>
|
||||
<string name="retry">Такрарламакъ</string>
|
||||
<string name="showcase_view_got_it_button">Тюшюндюм!</string>
|
||||
<string name="no_images_found">Гьеч сурат табылмады!</string>
|
||||
<string name="share_app_title">Уьстевню пайлашмакъ</string>
|
||||
</resources>
|
||||
|
|
@ -39,8 +39,6 @@
|
|||
<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" fuzzy="true">Өтө көп натыйжасыз иш аракет. Суранабыз, бир нече мүнөттөн кийин кайталаңыз</string>
|
||||
<string name="login_failed_blocked">Кечириңиз, бул кодонуучу Уикиказынада блокко алынган.</string>
|
||||
<string name="login_failed_generic">Системага кирүүдө катачылык бар!</string>
|
||||
|
|
|
|||
|
|
@ -50,8 +50,6 @@
|
|||
<string name="share_title_hint">Titel</string>
|
||||
<string name="share_description_hint">Beschreiwung</string>
|
||||
<string name="login_failed_network">Aloggen huet net funktionéiert - Feeler mam Reseau</string>
|
||||
<string name="login_failed_username">Login net méiglech - kuckt w.e.g. Äre Benotzernumm no</string>
|
||||
<string name="login_failed_password">Login net méiglech - kuckt w.e.g. Äert Passwuert no</string>
|
||||
<string name="login_failed_throttled">Ze dacks ouni Succès probéiert. Probéiert w.e.g. an e puer Minutten nach eng Kéier.</string>
|
||||
<string name="login_failed_blocked">Pardon, dëse Benotzer ass op Commons gespaart</string>
|
||||
<string name="login_failed_generic">Aloggen huet net funktionéiert</string>
|
||||
|
|
|
|||
|
|
@ -50,8 +50,6 @@
|
|||
<string name="add_title_toast">Gaef estebleef \'ne naam veur dit bestandj</string>
|
||||
<string name="share_description_hint">Besjrieving</string>
|
||||
<string name="login_failed_network">Kan zich neet aanmelde - netwirkfout</string>
|
||||
<string name="login_failed_username">Kan zich neet aanmelde - controleer de gebroekersnaam</string>
|
||||
<string name="login_failed_password">Kan zich neet aanmelde - controleer die wachwaord</string>
|
||||
<string name="login_failed_throttled">Te väöl mislökde kieëre geperbeerd. Perbeer estebleef oppernuuj euver e paar menuut.</string>
|
||||
<string name="login_failed_blocked">Deze gebroeker is geblokkeerd op Commons</string>
|
||||
<string name="login_failed_2fa_needed">Doe mós diene twieëfaktorische bevestigingscode opgaeve.</string>
|
||||
|
|
|
|||
|
|
@ -45,8 +45,6 @@
|
|||
<string name="share_title_hint">Pavadinimas</string>
|
||||
<string name="share_description_hint">Aprašymas</string>
|
||||
<string name="login_failed_network">Negalima prisijungti - tinklo klaida</string>
|
||||
<string name="login_failed_username">Negalima prisijungti - prašome patikrinti savo vartotojo vardą</string>
|
||||
<string name="login_failed_password">Negalima prisijungti - prašome patikrinti savo slaptažodį</string>
|
||||
<string name="login_failed_throttled">Per daug nesėkmingų bandymų. Pabandykite dar kartą po keleto minučių.</string>
|
||||
<string name="login_failed_blocked">Atsiprašome, šis vartotojas buvo užblokuotas Commons</string>
|
||||
<string name="login_failed_generic">Prisijungti nepavyko</string>
|
||||
|
|
|
|||
|
|
@ -49,8 +49,7 @@
|
|||
<string name="add_title_toast">Ставете ѝ наслов на податотеката</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_wrong_credentials">Не можев да ве најавам. Проверете ги корисничкото име и лозинката.</string>
|
||||
<string name="login_failed_throttled">Направени се премногу неуспешни обиди. Обидете се пак за некоја минута.</string>
|
||||
<string name="login_failed_blocked">Нажалост, корисникот е блокиран на Ризницата</string>
|
||||
<string name="login_failed_2fa_needed">Мора да го укажете вашиот код за двочинителска заверка.</string>
|
||||
|
|
|
|||
|
|
@ -50,8 +50,6 @@
|
|||
<string name="add_title_toast">ഈ പ്രമാണത്തിന് ഒരു തലക്കെട്ട് നൽകുക.</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>
|
||||
|
|
|
|||
|
|
@ -54,8 +54,6 @@
|
|||
<string name="add_title_toast">कृपया या फाईलसाठी शीर्षक प्रदान करा</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>
|
||||
|
|
|
|||
|
|
@ -37,8 +37,6 @@
|
|||
<string name="share_title_hint">Tajuk</string>
|
||||
<string name="share_description_hint">Keterangan</string>
|
||||
<string name="login_failed_network">Tidak boleh log masuk - kegagalan rangkaian</string>
|
||||
<string name="login_failed_username">Tidak dapat log masuk - Sila semak nama pengguna anda</string>
|
||||
<string name="login_failed_password">Tidak dapat log masuk - Sila semak kata laluan anda</string>
|
||||
<string name="login_failed_throttled" fuzzy="true">Terlalu banyak cubaan yang tidak berjaya. Sila cuba lagi dalam beberapa minit</string>
|
||||
<string name="login_failed_blocked">Maaf, pengguna ini telah disekat di Commons</string>
|
||||
<string name="login_failed_generic">Log masuk gagal</string>
|
||||
|
|
|
|||
|
|
@ -49,8 +49,6 @@
|
|||
<string name="share_title_hint">Tittel</string>
|
||||
<string name="share_description_hint">Beskrivelse</string>
|
||||
<string name="login_failed_network">Innlogging feilet - nettverksproblem</string>
|
||||
<string name="login_failed_username">Innlogging feilet - sjekk brukernavnet ditt</string>
|
||||
<string name="login_failed_password">Innlogging feilet - sjekk passordet ditt</string>
|
||||
<string name="login_failed_throttled">For mange misslykkede forsøk. Vennligst prøv igjen om noen få minutter.</string>
|
||||
<string name="login_failed_blocked">Beklager, denne brukeren har blitt blokkert på Commons</string>
|
||||
<string name="login_failed_2fa_needed">Du må oppgi tofaktorautentiseringskoden din.</string>
|
||||
|
|
|
|||
|
|
@ -39,8 +39,6 @@
|
|||
<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" fuzzy="true">धेरै असफल प्रयासहरू भए । कृपया केही मिनेट पछि पुन: प्रयास गर्नुहोस</string>
|
||||
<string name="login_failed_blocked">माफ गर्नुहोस, यो प्रयोगकर्तालाई कमोन्समा ब्लक गरिएको छ</string>
|
||||
<string name="login_failed_generic">प्रवेश सफल हुन सकेन</string>
|
||||
|
|
@ -55,7 +53,7 @@
|
|||
<string name="categories_activity_title">श्रेणीहरू</string>
|
||||
<string name="title_activity_settings">सेटिङ्गहरू</string>
|
||||
<string name="menu_about">बारेमा</string>
|
||||
<string name="about_license" fuzzy="true"><a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">अपाचे लाइसेन्स संस्करण२</a> को अाधारमा खुला स्रोत सफ्टवेयर जारी</string>
|
||||
<string name="about_license">विकिमिडिया कमन्स याप एक स्वतन्त्र स्रोत याप हो। यो याप विकिमिडिया समुदायका अनुदानप्राप्तकर्ताहरू र स्वयंसेवकहरू द्वारा निर्मित एवं प्रबन्धित छ। विकिमीडिया फाउण्डेसन यस यापको निर्माण, विकास र प्रबन्धनमा कुनै पनि प्रकारले संलग्न छैन।</string>
|
||||
<string name="about_improve" fuzzy="true"><a href=\"https://github.com/commons-app/apps-android-commons\">गिटहब</a> मा स्रोत। <a href=\" https://github.com/commons-app/apps-android-commons/issues\">बगजिल्ला</a> मा बग छ।</string>
|
||||
<string name="about_privacy_policy" fuzzy="true"><a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">गोपनीयता नीति</a></string>
|
||||
<string name="title_activity_about">बारेमा</string>
|
||||
|
|
|
|||
|
|
@ -47,8 +47,6 @@
|
|||
<string name="share_title_hint">Naam</string>
|
||||
<string name="share_description_hint">Beschrijving</string>
|
||||
<string name="login_failed_network">Aanmelden niet mogelijk. Er is een probleem met het netwerk</string>
|
||||
<string name="login_failed_username">Aanmelden niet mogelijk. Controleer uw gebruikersnaam</string>
|
||||
<string name="login_failed_password">Aanmelden niet mogelijk. Controleer uw wachtwoord</string>
|
||||
<string name="login_failed_throttled">U hebt te vaak geprobeerd aan te melden. Probeer het over een aantal minuten opnieuw.</string>
|
||||
<string name="login_failed_blocked">Deze gebruiker is helaas geblokkeerd op Wikimedia Commons</string>
|
||||
<string name="login_failed_generic">Aanmelden mislukt</string>
|
||||
|
|
|
|||
|
|
@ -43,8 +43,6 @@
|
|||
<string name="share_title_hint">Títol</string>
|
||||
<string name="share_description_hint">Descripcion</string>
|
||||
<string name="login_failed_network">Impossible de se connectar — pana de ret</string>
|
||||
<string name="login_failed_username">Impossible de se connectar — verificatz vòstre nom d’utilizaire</string>
|
||||
<string name="login_failed_password">Impossible de se connectar — verificatz vòstre senhal</string>
|
||||
<string name="login_failed_throttled">Tròp de temptativas infructuosas. Ensajatz tornarmai dins qualques minutas.</string>
|
||||
<string name="login_failed_blocked">O planhèm, aqueste utilizaire es estat blocat dins Commons</string>
|
||||
<string name="login_failed_generic">Error de connexion</string>
|
||||
|
|
|
|||
|
|
@ -35,8 +35,6 @@
|
|||
<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" fuzzy="true">ଖୁବ ଅଧିକ ଅସଫଳ ଚେଷ୍ଟା । ଦୟାକରି କେଇ ମିନିଟ ଛାଡ଼ି ଚେଷ୍ଟା କରନ୍ତୁ</string>
|
||||
<string name="login_failed_blocked">କ୍ଷମା ଘେନିବେ, ଏହି ସଭ୍ୟଙ୍କୁ କମନ୍ସରେ ଅଟକାଯାଇଛି</string>
|
||||
<string name="login_failed_generic">ଲଗଇନ ହେଲାନାହିଁ</string>
|
||||
|
|
|
|||
|
|
@ -43,8 +43,6 @@
|
|||
<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_generic">ਦਾਖ਼ਲਾ ਫੇਲ੍ਹ ਹੋਇਆ</string>
|
||||
|
|
|
|||
|
|
@ -60,8 +60,7 @@
|
|||
<string name="share_title_hint">Tytuł</string>
|
||||
<string name="share_description_hint">Opis</string>
|
||||
<string name="login_failed_network">Nie można zalogować - błąd sieci</string>
|
||||
<string name="login_failed_username">Nie można zalogować - sprawdź nazwę użytkownika</string>
|
||||
<string name="login_failed_password">Nie można zalogować - sprawdź hasło</string>
|
||||
<string name="login_failed_wrong_credentials">Nie można się zalogować - sprawdź swoją nazwę użytkownika i hasło</string>
|
||||
<string name="login_failed_throttled">Zbyt wiele nieudanych prób zalogowania. Spróbuj ponownie za kilka minut.</string>
|
||||
<string name="login_failed_blocked">Przepraszamy, ten użytkownik został zablokowany na Commons</string>
|
||||
<string name="login_failed_2fa_needed">Wprowadź swój kod dla dwuetapowej autoryzacji.</string>
|
||||
|
|
|
|||
|
|
@ -49,8 +49,7 @@
|
|||
<string name="add_title_toast">Për piasì, ch\'a-j buta \'n tìtol a s\'archivi</string>
|
||||
<string name="share_description_hint">Descrission</string>
|
||||
<string name="login_failed_network">Impossìbil rintré ant ël sistema - la rej a marcia nen</string>
|
||||
<string name="login_failed_username">Impossìbil rintré ant ël sistema - për piasì, ch\'a verìfica sò stranòm</string>
|
||||
<string name="login_failed_password">Impossìbil rintré ant ël sistema - për piasì, ch\'a contròla soa ciav</string>
|
||||
<string name="login_failed_wrong_credentials">Impossìbil rintré ant ël sistema - për piasì ch\'a contròla sò stranòm e soa ciav</string>
|
||||
<string name="login_failed_throttled">Tròpi tentativ falì. Për piasì, ch\'a preuva torna da-sì chèiche minute.</string>
|
||||
<string name="login_failed_blocked">An dëspias, s\'utent-sì a l\'é stàit blocà ansima a Commons</string>
|
||||
<string name="login_failed_2fa_needed">A dev fornì sò còdes d\'autentificassion a doi fator.</string>
|
||||
|
|
|
|||
|
|
@ -37,8 +37,6 @@
|
|||
<string name="add_title_toast">مهرباني وکړئ د دې دوتنې لپاره سرلیک چمتو کړئ</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_generic">غونډال کې ننوتنه نابريالې شوه</string>
|
||||
|
|
|
|||
|
|
@ -61,8 +61,7 @@
|
|||
<string name="add_title_toast">Forneça um título para este arquivo</string>
|
||||
<string name="share_description_hint">Descrição</string>
|
||||
<string name="login_failed_network">Erro ao efetuar o login - falha na rede</string>
|
||||
<string name="login_failed_username">Erro ao efetuar o login - confira seu nome de usuário</string>
|
||||
<string name="login_failed_password">Erro ao efetuar o login - confira sua senha</string>
|
||||
<string name="login_failed_wrong_credentials">Não é possível fazer o login - verifique seu nome de usuário e senha</string>
|
||||
<string name="login_failed_throttled">Muitas tentativas malsucedidas. Tente de novo daqui alguns minutos.</string>
|
||||
<string name="login_failed_blocked">Desculpe, esse usuário foi banido do Commons</string>
|
||||
<string name="login_failed_2fa_needed">Você precisa fornecer o seu código de ativação de dois fatores.</string>
|
||||
|
|
|
|||
|
|
@ -58,8 +58,7 @@
|
|||
<string name="add_title_toast">Forneça um título para este ficheiro, por favor</string>
|
||||
<string name="share_description_hint">Descrição</string>
|
||||
<string name="login_failed_network">Não foi possível iniciar sessão - falha de rede</string>
|
||||
<string name="login_failed_username">Não foi possível iniciar sessão - verifique o seu nome de utilizador(a)</string>
|
||||
<string name="login_failed_password">Não foi possível iniciar sessão - verifique a sua palavra-passe</string>
|
||||
<string name="login_failed_wrong_credentials">Não foi possível iniciar sessão - verifique o seu nome de utilizador e a palavra-passe</string>
|
||||
<string name="login_failed_throttled">Demasiadas tentativas malsucedidas. Por favor, tente de novo dentro de alguns minutos.</string>
|
||||
<string name="login_failed_blocked">Desculpe, este utilizador foi bloqueado no Commons</string>
|
||||
<string name="login_failed_2fa_needed">Precisa fornecer o seu código de ativação de dois fatores.</string>
|
||||
|
|
@ -222,7 +221,7 @@
|
|||
<string name="navigation_item_settings">Configurações</string>
|
||||
<string name="navigation_item_feedback">Comentários</string>
|
||||
<string name="navigation_item_logout">Sair</string>
|
||||
<string name="navigation_item_info">Tutorial</string>
|
||||
<string name="navigation_item_info">Explicação</string>
|
||||
<string name="navigation_item_notification">Notificações</string>
|
||||
<string name="navigation_item_featured_images">Destacadas</string>
|
||||
<string name="nearby_needs_permissions">Os sítios aqui perto não podem ser apresentados sem permissões de localização</string>
|
||||
|
|
|
|||
|
|
@ -50,8 +50,6 @@
|
|||
<string name="share_title_hint">{{Identical|Title}}</string>
|
||||
<string name="share_description_hint">{{Identical|Description}}</string>
|
||||
<string name="login_failed_network">Error message shown to user when login can not be completed due to network issues.</string>
|
||||
<string name="login_failed_username">Error message shown to user when login can not be completed because the user name is wrong.</string>
|
||||
<string name="login_failed_password">Error message shown to user when login can not be completed beause the password is wrong</string>
|
||||
<string name="login_failed_throttled">Error message shown to user when login can not be completed because the user has attempted to login too many times in a short period of time, and hence been throttled.</string>
|
||||
<string name="login_failed_blocked">Error message shown to user when login can not be completed because the user is blocked on Wikimedia Commons</string>
|
||||
<string name="login_failed_generic">{{Identical|Login failed}}</string>
|
||||
|
|
|
|||
|
|
@ -44,8 +44,6 @@
|
|||
<string name="share_title_hint">Titlu</string>
|
||||
<string name="share_description_hint">Descriere</string>
|
||||
<string name="login_failed_network">Autentificare nereușită – defecțiune de rețea</string>
|
||||
<string name="login_failed_username">Autentificare nereușită – verificați-vă numele de utilizator</string>
|
||||
<string name="login_failed_password">Autentificare nereușită – verificați-vă parola</string>
|
||||
<string name="login_failed_throttled">Prea multe încercări nereușite. Încercați din nou peste câteva minute.</string>
|
||||
<string name="login_failed_blocked">Ne pare rău, acest utilizator a fost blocat la Commons</string>
|
||||
<string name="login_failed_2fa_needed">Trebuie să introduceți tokenul de autentificare.</string>
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue