Merge branch 'master' into show-block-status

This commit is contained in:
seannemann21 2018-06-25 14:41:47 -04:00 committed by GitHub
commit c0d86b76e8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
144 changed files with 1867 additions and 1005 deletions

View file

@ -1,5 +1,8 @@
# Wikimedia Commons for Android
## v2.7.2
- Modified subtext for "automatically get current location" setting to emphasize that it will reveal user's location
## v2.7.1
- Fixed UI and permission issues with Nearby
- Fixed issue with My Recent Uploads being empty

View file

@ -16,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._

View file

@ -7,6 +7,8 @@ apply from: 'quality.gradle'
apply plugin: 'com.getkeepsafe.dexcount'
dependencies {
implementation 'com.squareup.picasso:picasso:2.71828'
implementation 'com.prof.rssparser:rssparser:1.1'
implementation 'com.github.nicolas-raoul:Quadtree:ac16ea8035bf07'
implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar'
implementation 'in.yuvi:http.fluent:1.3'
@ -19,48 +21,37 @@ 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.1.0'
implementation ('com.mapbox.mapboxsdk:mapbox-android-sdk:5.4.1@aar'){
transitive=true
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation('com.mapbox.mapboxsdk:mapbox-android-sdk:5.4.1@aar') {
transitive = true
}
implementation "com.github.deano2390:MaterialShowcaseView:1.2.0"
implementation 'com.github.deano2390:MaterialShowcaseView:1.2.0'
implementation "com.android.support:support-v4:$SUPPORT_LIB_VERSION"
implementation "com.android.support:appcompat-v7:$SUPPORT_LIB_VERSION"
implementation "com.android.support:design:$SUPPORT_LIB_VERSION"
implementation "com.android.support:customtabs:$SUPPORT_LIB_VERSION"
implementation "com.android.support:cardview-v7:$SUPPORT_LIB_VERSION"
implementation "com.jakewharton:butterknife:$BUTTERKNIFE_VERSION"
kapt "com.jakewharton:butterknife-compiler:$BUTTERKNIFE_VERSION"
implementation 'com.squareup.okhttp3:okhttp:3.9.1'
implementation 'com.squareup.okio:okio:1.13.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
// Because RxAndroid releases are few and far between, it is recommended you also
// explicitly depend on RxJava's latest version for bug fixes and new features.
implementation 'com.android.support:multidex:1.0.3'
implementation 'io.reactivex.rxjava2:rxjava:2.1.2'
implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
implementation 'com.jakewharton.rxbinding2:rxbinding-support-v4:2.0.0'
implementation 'com.jakewharton.rxbinding2:rxbinding-appcompat-v7:2.0.0'
implementation 'com.jakewharton.rxbinding2:rxbinding-design:2.0.0'
implementation 'org.jsoup:jsoup:1.11.3'
implementation 'com.facebook.fresco:fresco:1.5.0'
implementation 'com.facebook.stetho:stetho:1.5.0'
implementation "com.google.dagger:dagger:$DAGGER_VERSION"
implementation "com.google.dagger:dagger-android-support:$DAGGER_VERSION"
kapt "com.google.dagger:dagger-android-processor:$DAGGER_VERSION"
kapt "com.google.dagger:dagger-compiler:$DAGGER_VERSION"
testImplementation "org.robolectric:multidex:3.4.2"
testImplementation 'org.robolectric:multidex:3.4.2'
testImplementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
testImplementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
testImplementation 'junit:junit:4.12'
@ -92,8 +83,8 @@ android {
defaultConfig {
applicationId 'fr.free.nrw.commons'
versionCode 84
versionName '2.7.1'
versionCode 85
versionName '2.7.2'
setProperty("archivesBaseName", "app-commons-v$versionName-" + getBranchName())
minSdkVersion project.minSdkVersion
@ -134,7 +125,9 @@ android {
flavorDimensions 'tier'
productFlavors {
prod {
buildConfigField "String", "WIKIMEDIA_API_POTD", "\"https://commons.wikimedia.org/w/api.php?action=featuredfeed&feed=potd&feedformat=rss&language=en\""
buildConfigField "String", "WIKIMEDIA_API_HOST", "\"https://commons.wikimedia.org/w/api.php\""
buildConfigField "String", "WIKIDATA_API_HOST", "\"https://www.wikidata.org/w/api.php\""
buildConfigField "String", "WIKIMEDIA_FORGE_API_HOST", "\"https://tools.wmflabs.org/\""
buildConfigField "String", "IMAGE_URL_BASE", "\"https://upload.wikimedia.org/wikipedia/commons\""
buildConfigField "String", "HOME_URL", "\"https://commons.wikimedia.org/wiki/\""
@ -150,7 +143,9 @@ android {
beta {
// What values do we need to hit the BETA versions of the site / api ?
buildConfigField "String", "WIKIMEDIA_API_POTD", "\"https://commons.wikimedia.org/w/api.php?action=featuredfeed&feed=potd&feedformat=rss&language=en\""
buildConfigField "String", "WIKIMEDIA_API_HOST", "\"https://commons.wikimedia.beta.wmflabs.org/w/api.php\""
buildConfigField "String", "WIKIDATA_API_HOST", "\"https://www.wikidata.org/w/api.php\""
buildConfigField "String", "WIKIMEDIA_FORGE_API_HOST", "\"https://tools.wmflabs.org/\""
buildConfigField "String", "IMAGE_URL_BASE", "\"https://upload.beta.wmflabs.org/wikipedia/commons\""
buildConfigField "String", "HOME_URL", "\"https://commons.wikimedia.beta.wmflabs.org/wiki/\""

BIN
app/libs/java-json.jar Normal file

Binary file not shown.

View file

@ -27,10 +27,10 @@
android:theme="@style/LightAppTheme"
android:supportsRtl="true" >
<activity android:name="org.acra.CrashReportDialog"
android:theme="@android:style/Theme.Dialog"
android:launchMode="singleInstance"
android:excludeFromRecents="true"
android:finishOnTaskLaunch="true" />
android:theme="@android:style/Theme.Dialog"
android:launchMode="singleInstance"
android:excludeFromRecents="true"
android:finishOnTaskLaunch="true" />
<activity android:name=".auth.LoginActivity">
<intent-filter>
@ -165,6 +165,16 @@
android:label="@string/provider_categories"
android:syncable="false" />
<receiver android:name=".widget.PicOfDayAppWidget">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/pic_of_day_app_widget_info" />
</receiver>
</application>
</manifest>

View file

@ -9,9 +9,6 @@ import android.os.Bundle;
import android.text.Html;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
import android.util.Log;
import android.support.customtabs.CustomTabsIntent;
import android.support.v4.content.ContextCompat;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
@ -20,7 +17,6 @@ import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import butterknife.BindView;
import butterknife.ButterKnife;
@ -28,8 +24,6 @@ import butterknife.OnClick;
import fr.free.nrw.commons.theme.NavigationBaseActivity;
import fr.free.nrw.commons.ui.widget.HtmlTextView;
import static android.widget.Toast.LENGTH_SHORT;
/**
* Represents about screen of this app
*/

View file

@ -1,6 +1,5 @@
package fr.free.nrw.commons;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
@ -27,7 +26,7 @@ import fr.free.nrw.commons.contributions.ContributionDao;
import fr.free.nrw.commons.data.DBOpenHelper;
import fr.free.nrw.commons.di.ApplicationlessInjection;
import fr.free.nrw.commons.modifications.ModifierSequenceDao;
import fr.free.nrw.commons.utils.FileUtils;
import fr.free.nrw.commons.upload.FileUtils;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import timber.log.Timber;

View file

@ -178,6 +178,7 @@ public class Utils {
}
public static void handleWebUrl(Context context, Uri url) {
Timber.d("Launching web url %s", url.toString());
Intent browserIntent = new Intent(Intent.ACTION_VIEW, url);
if (browserIntent.resolveActivity(context.getPackageManager()) == null) {
Toast toast = Toast.makeText(context, context.getString(R.string.no_web_browser), LENGTH_SHORT);

View file

@ -4,8 +4,8 @@ import android.accounts.Account;
import android.accounts.AccountAuthenticatorActivity;
import android.accounts.AccountAuthenticatorResponse;
import android.accounts.AccountManager;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
@ -23,7 +23,6 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
@ -136,6 +135,11 @@ public class LoginActivity extends AccountAuthenticatorActivity {
}
}
public static void startYourself(Context context) {
Intent intent = new Intent(context, LoginActivity.class);
context.startActivity(intent);
}
private void forgotPassword() {
Utils.handleWebUrl(this, Uri.parse(BuildConfig.FORGOT_PASSWORD_URL));
}

View file

@ -81,6 +81,12 @@ public class SessionManager {
return sharedPreferences.getBoolean("isUserLoggedIn", false);
}
public void forceLogin(Context context) {
if (context != null) {
LoginActivity.startYourself(context);
}
}
public Completable clearAllAccounts() {
AccountManager accountManager = AccountManager.get(context);
Account[] allAccounts = accountManager.getAccountsByType(ACCOUNT_TYPE);

View file

@ -14,7 +14,6 @@ import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.auth.AuthenticatedActivity;
import fr.free.nrw.commons.media.MediaDetailPagerFragment;
import timber.log.Timber;
/**
* This activity displays pictures of a particular category

View file

@ -228,7 +228,7 @@ public class CategoryImagesListFragment extends DaggerFragment {
/**
* 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);

View file

@ -45,6 +45,7 @@ public class Contribution extends Media {
private long transferred;
private String decimalCoords;
private boolean isMultiple;
private String wikiDataEntityId;
public Contribution(Uri contentUri, String filename, Uri localUri, String imageUrl, Date timestamp,
int state, long dataLength, Date dateUploaded, long transferred,
@ -222,4 +223,17 @@ public class Contribution extends Media {
throw new RuntimeException("Unrecognized license value: " + license);
}
public String getWikiDataEntityId() {
return wikiDataEntityId;
}
/**
* When the corresponding wikidata entity is known as in case of nearby uploads, it can be set
* using the setter method
* @param wikiDataEntityId
*/
public void setWikiDataEntityId(String wikiDataEntityId) {
this.wikiDataEntityId = wikiDataEntityId;
}
}

View file

@ -90,7 +90,7 @@ public class ContributionController {
fragment.startActivityForResult(pickImageIntent, SELECT_FROM_GALLERY);
}
public void handleImagePicked(int requestCode, Intent data, boolean isDirectUpload) {
public void handleImagePicked(int requestCode, Intent data, boolean isDirectUpload, String wikiDataEntityId) {
FragmentActivity activity = fragment.getActivity();
Timber.d("handleImagePicked() called with onActivityResult()");
Intent shareIntent = new Intent(activity, ShareActivity.class);
@ -102,9 +102,6 @@ public class ContributionController {
shareIntent.setType(activity.getContentResolver().getType(imageData));
shareIntent.putExtra(EXTRA_STREAM, imageData);
shareIntent.putExtra(EXTRA_SOURCE, SOURCE_GALLERY);
if (isDirectUpload) {
shareIntent.putExtra("isDirectUpload", true);
}
break;
case SELECT_FROM_CAMERA:
//FIXME: Find out appropriate mime type
@ -113,9 +110,6 @@ public class ContributionController {
shareIntent.setType("image/jpeg");
shareIntent.putExtra(EXTRA_STREAM, lastGeneratedCaptureUri);
shareIntent.putExtra(EXTRA_SOURCE, SOURCE_CAMERA);
if (isDirectUpload) {
shareIntent.putExtra("isDirectUpload", true);
}
break;
default:
@ -123,6 +117,10 @@ public class ContributionController {
}
Timber.i("Image selected");
try {
shareIntent.putExtra("isDirectUpload", isDirectUpload);
if (wikiDataEntityId != null && !wikiDataEntityId.equals("")) {
shareIntent.putExtra("wikiDataEntityId", wikiDataEntityId);
}
activity.startActivity(shareIntent);
} catch (SecurityException e) {
Timber.e(e, "Security Exception");

View file

@ -8,7 +8,6 @@ import android.net.Uri;
import android.os.RemoteException;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
import java.util.Date;

View file

@ -276,17 +276,25 @@ public class ContributionsActivity
.getUploadCount(sessionManager.getCurrentAccount().name)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
uploadCount -> getSupportActionBar().setSubtitle(getResources()
.getQuantityString(R.plurals.contributions_subtitle,
uploadCount, uploadCount)),
.subscribe(this::displayUploadCount,
t -> Timber.e(t, "Fetching upload count failed")
));
}
public void betaSetUploadCount(int betaUploadCount){
private void displayUploadCount(Integer uploadCount) {
if (isFinishing()
|| getSupportActionBar() == null
|| getResources() == null) {
return;
}
getSupportActionBar().setSubtitle(getResources()
.getQuantityString(R.plurals.contributions_subtitle, betaUploadCount, betaUploadCount));
.getQuantityString(R.plurals.contributions_subtitle,
uploadCount, uploadCount));
}
public void betaSetUploadCount(int betaUploadCount) {
displayUploadCount(betaUploadCount);
}

View file

@ -117,7 +117,7 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment {
if (resultCode == RESULT_OK) {
Timber.d("OnActivityResult() parameters: Req code: %d Result code: %d Data: %s",
requestCode, resultCode, data);
controller.handleImagePicked(requestCode, data, false);
controller.handleImagePicked(requestCode, data, false, null);
} else {
Timber.e("OnActivityResult() parameters: Req code: %d Result code: %d Data: %s",
requestCode, resultCode, data);

View file

@ -13,8 +13,10 @@ 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.nearby.PlaceRenderer;
import fr.free.nrw.commons.upload.FileProcessor;
import fr.free.nrw.commons.settings.SettingsFragment;
@Singleton
@Component(modules = {
CommonsApplicationModule.class,
@ -46,6 +48,8 @@ public interface CommonsApplicationComponent extends AndroidInjector<Application
void inject(PlaceRenderer placeRenderer);
void inject(FileProcessor fileProcessor);
@Component.Builder
@SuppressWarnings({"WeakerAccess", "unused"})
interface Builder {

View file

@ -11,6 +11,7 @@ import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
import fr.free.nrw.commons.auth.AccountUtil;
import fr.free.nrw.commons.auth.SessionManager;
import fr.free.nrw.commons.data.DBOpenHelper;
@ -18,6 +19,8 @@ import fr.free.nrw.commons.location.LocationServiceManager;
import fr.free.nrw.commons.mwapi.MediaWikiApi;
import fr.free.nrw.commons.nearby.NearbyPlaces;
import fr.free.nrw.commons.upload.UploadController;
import fr.free.nrw.commons.wikidata.WikidataEditListener;
import fr.free.nrw.commons.wikidata.WikidataEditListenerImpl;
import static android.content.Context.MODE_PRIVATE;
import static fr.free.nrw.commons.contributions.ContributionsContentProvider.CONTRIBUTION_AUTHORITY;
@ -133,4 +136,10 @@ public class CommonsApplicationModule {
public LruCache<String, String> provideLruCache() {
return new LruCache<>(1024);
}
@Provides
@Singleton
public WikidataEditListener provideWikidataEditListener() {
return new WikidataEditListenerImpl();
}
}

View file

@ -35,7 +35,7 @@ public class NetworkingModule {
@Named("default_preferences") SharedPreferences defaultPreferences,
@Named("category_prefs") SharedPreferences categoryPrefs,
Gson gson) {
return new ApacheHttpClientMediaWikiApi(context, BuildConfig.WIKIMEDIA_API_HOST, defaultPreferences, categoryPrefs, gson);
return new ApacheHttpClientMediaWikiApi(context, BuildConfig.WIKIMEDIA_API_HOST, BuildConfig.WIKIDATA_API_HOST, defaultPreferences, categoryPrefs, gson);
}
@Provides

View file

@ -284,6 +284,7 @@ public class LocationServiceManager implements LocationListener {
LOCATION_SIGNIFICANTLY_CHANGED, //Went out of borders of nearby markers
LOCATION_SLIGHTLY_CHANGED, //User might be walking or driving
LOCATION_NOT_CHANGED,
PERMISSION_JUST_GRANTED
PERMISSION_JUST_GRANTED,
MAP_UPDATED
}
}

View file

@ -23,6 +23,9 @@ import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@ -32,9 +35,6 @@ 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;

View file

@ -2,11 +2,9 @@ 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;
@ -28,8 +26,6 @@ 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;
@ -50,7 +46,6 @@ 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 {

View file

@ -25,6 +25,8 @@ import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.util.EntityUtils;
import org.mediawiki.api.ApiResult;
import org.mediawiki.api.MWApi;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.io.IOException;
@ -63,6 +65,7 @@ public class ApacheHttpClientMediaWikiApi implements MediaWikiApi {
private static final String THUMB_SIZE = "640";
private AbstractHttpClient httpClient;
private MWApi api;
private MWApi wikidataApi;
private Context context;
private SharedPreferences defaultPreferences;
private SharedPreferences categoryPreferences;
@ -70,6 +73,7 @@ public class ApacheHttpClientMediaWikiApi implements MediaWikiApi {
public ApacheHttpClientMediaWikiApi(Context context,
String apiURL,
String wikidatApiURL,
SharedPreferences defaultPreferences,
SharedPreferences categoryPreferences,
Gson gson) {
@ -83,6 +87,7 @@ public class ApacheHttpClientMediaWikiApi implements MediaWikiApi {
params.setParameter(CoreProtocolPNames.USER_AGENT, getUserAgent());
httpClient = new DefaultHttpClient(cm, params);
api = new MWApi(apiURL, httpClient);
wikidataApi = new MWApi(wikidatApiURL, httpClient);
this.defaultPreferences = defaultPreferences;
this.categoryPreferences = categoryPreferences;
this.gson = gson;
@ -207,6 +212,15 @@ public class ApacheHttpClientMediaWikiApi implements MediaWikiApi {
return api.getEditToken();
}
@Override
public String getCentralAuthToken() throws IOException {
String centralAuthToken = api.action("centralauthtoken")
.get()
.getString("/api/centralauthtoken/@centralauthtoken");
Timber.d("MediaWiki Central auth token is %s", centralAuthToken);
return centralAuthToken;
}
@Override
public boolean fileExistsWithName(String fileName) throws IOException {
return api.action("query")
@ -352,6 +366,98 @@ public class ApacheHttpClientMediaWikiApi implements MediaWikiApi {
}).flatMapObservable(Observable::fromIterable);
}
/**
* Get the edit token for making wiki data edits
* https://www.mediawiki.org/wiki/API:Tokens
* @return
* @throws IOException
*/
private String getWikidataEditToken() throws IOException {
return wikidataApi.getEditToken();
}
@Override
public String getWikidataCsrfToken() throws IOException {
String wikidataCsrfToken = wikidataApi.action("query")
.param("action", "query")
.param("centralauthtoken", getCentralAuthToken())
.param("meta", "tokens")
.post()
.getString("/api/query/tokens/@csrftoken");
Timber.d("Wikidata csrf token is %s", wikidataCsrfToken);
return wikidataCsrfToken;
}
/**
* Creates a new claim using the wikidata API
* https://www.mediawiki.org/wiki/Wikibase/API
* @param entityId the wikidata entity to be edited
* @param property the property to be edited, for eg P18 for images
* @param snaktype the type of value stored for that property
* @param value the actual value to be stored for the property, for eg filename in case of P18
* @return returns revisionId if the claim is successfully created else returns null
* @throws IOException
*/
@Nullable
@Override
public String wikidatCreateClaim(String entityId, String property, String snaktype, String value) throws IOException {
Timber.d("Filename is %s", value);
ApiResult result = wikidataApi.action("wbcreateclaim")
.param("entity", entityId)
.param("centralauthtoken", getCentralAuthToken())
.param("token", getWikidataCsrfToken())
.param("snaktype", snaktype)
.param("property", property)
.param("value", value)
.post();
if (result == null || result.getNode("api") == null) {
return null;
}
Node node = result.getNode("api").getDocument();
Element element = (Element) node;
if (element != null && element.getAttribute("success").equals("1")) {
return result.getString("api/pageinfo/@lastrevid");
} else {
Timber.e(result.getString("api/error/@code") + " " + result.getString("api/error/@info"));
}
return null;
}
/**
* Adds the wikimedia-commons-app tag to the edits made on wikidata
* @param revisionId
* @return
* @throws IOException
*/
@Nullable
@Override
public boolean addWikidataEditTag(String revisionId) throws IOException {
ApiResult result = wikidataApi.action("tag")
.param("revid", revisionId)
.param("centralauthtoken", getCentralAuthToken())
.param("token", getWikidataCsrfToken())
.param("add", "wikimedia-commons-app")
.param("reason", "Add tag for edits made using Android Commons app")
.post();
if (result == null || result.getNode("api") == null) {
return false;
}
Node node = result.getNode("api").getDocument();
Element element = (Element) node;
if (element != null && element.getAttribute("status").equals("success")) {
return true;
} else {
Timber.e(result.getString("api/error/@code") + " " + result.getString("api/error/@info"));
}
return false;
}
@Override
@NonNull
public Observable<String> searchTitles(String title, int searchCatsLimit) {
@ -481,6 +587,8 @@ public class ApacheHttpClientMediaWikiApi implements MediaWikiApi {
.param("format", "xml")
.param("gcmtype", "file")
.param("gcmtitle", categoryName)
.param("gcmsort", "timestamp")//property to sort by;timestamp
.param("gcmdir", "desc")//in which direction to sort;descending
.param("prop", "imageinfo")
.param("gcmlimit", "10")
.param("iiprop", "url|extmetadata");
@ -587,6 +695,7 @@ public class ApacheHttpClientMediaWikiApi implements MediaWikiApi {
String resultStatus = result.getString("/api/upload/@result");
if (!resultStatus.equals("Success")) {
String errorCode = result.getString("/api/error/@code");
Timber.e(errorCode);
return new UploadResult(resultStatus, errorCode);
} else {
Date dateUploaded = parseMWDate(result.getString("/api/upload/imageinfo/@timestamp"));

View file

@ -27,6 +27,10 @@ public interface MediaWikiApi {
String getEditToken() throws IOException;
String getWikidataCsrfToken() throws IOException;
String getCentralAuthToken() throws IOException;
boolean fileExistsWithName(String fileName) throws IOException;
boolean pageExists(String pageName) throws IOException;
@ -49,6 +53,12 @@ public interface MediaWikiApi {
@Nullable
String appendEdit(String editToken, String processedPageContent, String filename, String summary) throws IOException;
@Nullable
String wikidatCreateClaim(String entityId, String property, String snaktype, String value) throws IOException;
@Nullable
boolean addWikidataEditTag(String revisionId) throws IOException;
@NonNull
MediaResult fetchMediaByFilename(String filename) throws IOException;

View file

@ -1,6 +1,5 @@
package fr.free.nrw.commons.nearby;
import android.content.SharedPreferences;
import android.os.Build;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;

View file

@ -16,7 +16,6 @@ import android.support.design.widget.BottomSheetBehavior;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AlertDialog;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
@ -24,14 +23,9 @@ import android.view.View;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import io.reactivex.functions.Consumer;
import java.io.IOException;
import java.net.ConnectException;
import java.net.UnknownHostException;
import java.util.List;
import javax.inject.Inject;
@ -42,11 +36,13 @@ import butterknife.ButterKnife;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.location.LatLng;
import fr.free.nrw.commons.location.LocationServiceManager;
import fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType;
import fr.free.nrw.commons.location.LocationUpdateListener;
import fr.free.nrw.commons.theme.NavigationBaseActivity;
import fr.free.nrw.commons.utils.NetworkUtils;
import fr.free.nrw.commons.utils.UriSerializer;
import fr.free.nrw.commons.utils.ViewUtil;
import fr.free.nrw.commons.wikidata.WikidataEditListener;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
@ -55,8 +51,12 @@ import timber.log.Timber;
import uk.co.deanwild.materialshowcaseview.IShowcaseListener;
import uk.co.deanwild.materialshowcaseview.MaterialShowcaseView;
import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.*;
import static fr.free.nrw.commons.location.LocationServiceManager.LocationChangeType.MAP_UPDATED;
public class NearbyActivity extends NavigationBaseActivity implements LocationUpdateListener {
public class NearbyActivity extends NavigationBaseActivity implements LocationUpdateListener,
WikidataEditListener.WikidataP18EditListener {
private static final int LOCATION_REQUEST = 1;
@ -76,6 +76,8 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp
LocationServiceManager locationManager;
@Inject
NearbyController nearbyController;
@Inject WikidataEditListener wikidataEditListener;
@Inject
@Named("application_preferences") SharedPreferences applicationPrefs;
private LatLng curLatLng;
@ -110,6 +112,7 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp
initBottomSheetBehaviour();
initDrawer();
wikidataEditListener.setAuthenticationStateListener(this);
}
private void resumeFragment() {
@ -219,7 +222,7 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp
//Still need to check if GPS is enabled
checkGps();
lastKnownLocation = locationManager.getLKL();
refreshView(LocationServiceManager.LocationChangeType.PERMISSION_JUST_GRANTED);
refreshView(PERMISSION_JUST_GRANTED);
} else {
//If permission not granted, go to page that says Nearby Places cannot be displayed
hideProgressBar();
@ -279,7 +282,7 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp
private void checkLocationPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (locationManager.isLocationPermissionGranted()) {
refreshView(LocationServiceManager.LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED);
refreshView(LOCATION_SIGNIFICANTLY_CHANGED);
} else {
// Should we show an explanation?
if (locationManager.isPermissionExplanationRequired(this)) {
@ -305,7 +308,7 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp
}
}
} else {
refreshView(LocationServiceManager.LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED);
refreshView(LOCATION_SIGNIFICANTLY_CHANGED);
}
}
@ -314,7 +317,7 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1) {
Timber.d("User is back from Settings page");
refreshView(LocationServiceManager.LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED);
refreshView(LOCATION_SIGNIFICANTLY_CHANGED);
}
}
@ -373,8 +376,7 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp
@Override
public void onReceive(Context context, Intent intent) {
if (NetworkUtils.isInternetConnectionEstablished(NearbyActivity.this)) {
refreshView(LocationServiceManager
.LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED);
refreshView(LOCATION_SIGNIFICANTLY_CHANGED);
} else {
ViewUtil.showLongToast(NearbyActivity.this, getString(R.string.no_internet));
}
@ -390,7 +392,7 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp
*
* @param locationChangeType defines if location shanged significantly or slightly
*/
private void refreshView(LocationServiceManager.LocationChangeType locationChangeType) {
private void refreshView(LocationChangeType locationChangeType) {
if (lockNearbyView) {
return;
}
@ -403,12 +405,13 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp
registerLocationUpdates();
LatLng lastLocation = locationManager.getLastLocation();
if (curLatLng != null && curLatLng.equals(lastLocation)) { //refresh view only if location has changed
if (curLatLng != null && curLatLng.equals(lastLocation)
&& !locationChangeType.equals(MAP_UPDATED)) { //refresh view only if location has changed
return;
}
curLatLng = lastLocation;
if (locationChangeType.equals(LocationServiceManager.LocationChangeType.PERMISSION_JUST_GRANTED)) {
if (locationChangeType.equals(PERMISSION_JUST_GRANTED)) {
curLatLng = lastKnownLocation;
}
@ -417,8 +420,9 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp
return;
}
if (locationChangeType.equals(LocationServiceManager.LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED)
|| locationChangeType.equals(LocationServiceManager.LocationChangeType.PERMISSION_JUST_GRANTED)) {
if (locationChangeType.equals(LOCATION_SIGNIFICANTLY_CHANGED)
|| locationChangeType.equals(PERMISSION_JUST_GRANTED)
|| locationChangeType.equals(MAP_UPDATED)) {
progressBar.setVisibility(View.VISIBLE);
//TODO: This hack inserts curLatLng before populatePlaces is called (see #1440). Ideally a proper fix should be found
@ -440,7 +444,7 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp
progressBar.setVisibility(View.GONE);
});
} else if (locationChangeType
.equals(LocationServiceManager.LocationChangeType.LOCATION_SLIGHTLY_CHANGED)) {
.equals(LOCATION_SLIGHTLY_CHANGED)) {
Gson gson = new GsonBuilder()
.registerTypeAdapter(Uri.class, new UriSerializer())
.create();
@ -685,12 +689,12 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp
@Override
public void onLocationChangedSignificantly(LatLng latLng) {
refreshView(LocationServiceManager.LocationChangeType.LOCATION_SIGNIFICANTLY_CHANGED);
refreshView(LOCATION_SIGNIFICANTLY_CHANGED);
}
@Override
public void onLocationChangedSlightly(LatLng latLng) {
refreshView(LocationServiceManager.LocationChangeType.LOCATION_SLIGHTLY_CHANGED);
refreshView(LOCATION_SLIGHTLY_CHANGED);
}
public void prepareViewsForSheetPosition(int bottomSheetState) {
@ -700,4 +704,9 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp
private void showErrorMessage(String message) {
ViewUtil.showLongToast(NearbyActivity.this, message);
}
@Override
public void onWikidataEditSuccessful() {
refreshView(MAP_UPDATED);
}
}

View file

@ -2,6 +2,7 @@ package fr.free.nrw.commons.nearby;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
@ -21,6 +22,9 @@ import java.lang.reflect.Type;
import java.util.Collections;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import dagger.android.support.AndroidSupportInjection;
import dagger.android.support.DaggerFragment;
import fr.free.nrw.commons.R;
@ -47,6 +51,11 @@ public class NearbyListFragment extends DaggerFragment {
private RecyclerView recyclerView;
private ContributionController controller;
@Inject
@Named("direct_nearby_upload_prefs")
SharedPreferences directPrefs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -137,7 +146,7 @@ public class NearbyListFragment extends DaggerFragment {
if (resultCode == RESULT_OK) {
Timber.d("OnActivityResult() parameters: Req code: %d Result code: %d Data: %s",
requestCode, resultCode, data);
controller.handleImagePicked(requestCode, data, true);
controller.handleImagePicked(requestCode, data, true, directPrefs.getString("WikiDataEntityId", null));
} else {
Timber.e("OnActivityResult() parameters: Req code: %d Result code: %d Data: %s",
requestCode, resultCode, data);

View file

@ -731,6 +731,7 @@ public class NearbyMapFragment extends DaggerFragment {
editor.putString("Title", place.getName());
editor.putString("Desc", place.getLongDescription());
editor.putString("Category", place.getCategory());
editor.putString("WikiDataEntityId", place.getWikiDataEntityId());
editor.apply();
}
@ -766,7 +767,7 @@ public class NearbyMapFragment extends DaggerFragment {
if (resultCode == RESULT_OK) {
Timber.d("OnActivityResult() parameters: Req code: %d Result code: %d Data: %s",
requestCode, resultCode, data);
controller.handleImagePicked(requestCode, data, true);
controller.handleImagePicked(requestCode, data, true, directPrefs.getString("WikiDataEntityId", null));
} else {
Timber.e("OnActivityResult() parameters: Req code: %d Result code: %d Data: %s",
requestCode, resultCode, data);

View file

@ -17,7 +17,7 @@ import java.util.regex.Pattern;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.location.LatLng;
import fr.free.nrw.commons.utils.FileUtils;
import fr.free.nrw.commons.upload.FileUtils;
import timber.log.Timber;
public class NearbyPlaces {

View file

@ -3,6 +3,7 @@ package fr.free.nrw.commons.nearby;
import android.graphics.Bitmap;
import android.net.Uri;
import android.support.annotation.DrawableRes;
import android.support.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
@ -50,6 +51,20 @@ public class Place {
this.distance = distance;
}
/**
* Extracts the entity id from the wikidata link
* @return returns the entity id if wikidata link exists
*/
@Nullable
public String getWikiDataEntityId() {
if (!hasWikidataLink()) {
return null;
}
String wikiDataLink = siteLinks.getWikidataLink().toString();
return wikiDataLink.replace("http://www.wikidata.org/entity/", "");
}
public boolean hasWikipediaLink() {
return !(siteLinks == null || Uri.EMPTY.equals(siteLinks.getWikipediaLink()));
}

View file

@ -25,7 +25,6 @@ import javax.inject.Named;
import butterknife.BindView;
import butterknife.ButterKnife;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.contributions.ContributionController;

View file

@ -16,7 +16,6 @@ import android.widget.RelativeLayout;
import com.pedrogomez.renderers.RVRendererAdapter;
import java.lang.ref.WeakReference;
import java.util.Collections;
import java.util.List;
@ -26,6 +25,7 @@ import butterknife.BindView;
import butterknife.ButterKnife;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.mwapi.MediaWikiApi;
import fr.free.nrw.commons.theme.NavigationBaseActivity;
import fr.free.nrw.commons.utils.NetworkUtils;
import fr.free.nrw.commons.utils.ViewUtil;
@ -46,6 +46,8 @@ public class NotificationActivity extends NavigationBaseActivity {
@BindView(R.id.container) RelativeLayout relativeLayout;
@Inject NotificationController controller;
@Inject
MediaWikiApi mediaWikiApi;
private static final String TAG_NOTIFICATION_WORKER_FRAGMENT = "NotificationWorkerFragment";
private NotificationWorkerFragment mNotificationWorkerFragment;
@ -81,7 +83,6 @@ public class NotificationActivity extends NavigationBaseActivity {
}
}
@SuppressLint("CheckResult")
private void addNotifications() {
Timber.d("Add notifications");

View file

@ -3,13 +3,10 @@ package fr.free.nrw.commons.settings;
import android.Manifest;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
@ -24,8 +21,6 @@ import android.support.v4.content.FileProvider;
import android.widget.Toast;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
@ -35,7 +30,7 @@ import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils;
import fr.free.nrw.commons.di.ApplicationlessInjection;
import fr.free.nrw.commons.utils.FileUtils;
import fr.free.nrw.commons.upload.FileUtils;
public class SettingsFragment extends PreferenceFragment {

View file

@ -1,10 +1,8 @@
package fr.free.nrw.commons.upload;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapRegionDecoder;
import android.net.Uri;
import android.os.AsyncTask;
import android.support.v7.app.AlertDialog;

View file

@ -0,0 +1,263 @@
package fr.free.nrw.commons.upload;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.Date;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import fr.free.nrw.commons.caching.CacheController;
import fr.free.nrw.commons.di.ApplicationlessInjection;
import fr.free.nrw.commons.mwapi.CategoryApi;
import io.reactivex.schedulers.Schedulers;
import timber.log.Timber;
import static com.mapbox.mapboxsdk.Mapbox.getApplicationContext;
/**
* Processing of the image file that is about to be uploaded via ShareActivity is done here
*/
public class FileProcessor implements SimilarImageDialogFragment.onResponse {
@Inject
CacheController cacheController;
@Inject
GpsCategoryModel gpsCategoryModel;
@Inject
CategoryApi apiCall;
@Inject
@Named("default_preferences")
SharedPreferences prefs;
private Uri mediaUri;
private ContentResolver contentResolver;
private GPSExtractor imageObj;
private Context context;
private String decimalCoords;
private boolean haveCheckedForOtherImages = false;
private String filePath;
private boolean useExtStorage;
private boolean cacheFound;
private GPSExtractor tempImageObj;
FileProcessor(Uri mediaUri, ContentResolver contentResolver, Context context) {
this.mediaUri = mediaUri;
this.contentResolver = contentResolver;
this.context = context;
ApplicationlessInjection.getInstance(context.getApplicationContext()).getCommonsApplicationComponent().inject(this);
useExtStorage = prefs.getBoolean("useExternalStorage", true);
}
/**
* Gets file path from media URI.
* In older devices getPath() may fail depending on the source URI, creating and using a copy of the file seems to work instead.
*
* @return file path of media
*/
@Nullable
private String getPathOfMediaOrCopy() {
filePath = FileUtils.getPath(context, mediaUri);
Timber.d("Filepath: " + filePath);
if (filePath == null) {
String copyPath = null;
try {
ParcelFileDescriptor descriptor = contentResolver.openFileDescriptor(mediaUri, "r");
if (descriptor != null) {
if (useExtStorage) {
copyPath = FileUtils.createCopyPath(descriptor);
return copyPath;
}
copyPath = getApplicationContext().getCacheDir().getAbsolutePath() + "/" + new Date().getTime() + ".jpg";
FileUtils.copy(descriptor.getFileDescriptor(), copyPath);
Timber.d("Filepath (copied): %s", copyPath);
return copyPath;
}
} catch (IOException e) {
Timber.w(e, "Error in file " + copyPath);
return null;
}
}
return filePath;
}
/**
* Processes file coordinates, either from EXIF data or user location
*
* @param gpsEnabled if true use GPS
*/
GPSExtractor processFileCoordinates(boolean gpsEnabled) {
Timber.d("Calling GPSExtractor");
try {
ParcelFileDescriptor descriptor = contentResolver.openFileDescriptor(mediaUri, "r");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
if (descriptor != null) {
imageObj = new GPSExtractor(descriptor.getFileDescriptor(), context, prefs);
}
} else {
String filePath = getPathOfMediaOrCopy();
if (filePath != null) {
imageObj = new GPSExtractor(filePath, context, prefs);
}
}
decimalCoords = imageObj.getCoords(gpsEnabled);
if (decimalCoords == null || !imageObj.imageCoordsExists) {
//Find other photos taken around the same time which has gps coordinates
if (!haveCheckedForOtherImages)
findOtherImages(gpsEnabled);// Do not do repeat the process
} else {
useImageCoords();
}
} catch (FileNotFoundException e) {
Timber.w("File not found: " + mediaUri, e);
}
return imageObj;
}
String getDecimalCoords() {
return decimalCoords;
}
/**
* Find other images around the same location that were taken within the last 20 sec
*
* @param gpsEnabled True if GPS is enabled
*/
private void findOtherImages(boolean gpsEnabled) {
Timber.d("filePath" + getPathOfMediaOrCopy());
long timeOfCreation = new File(filePath).lastModified();//Time when the original image was created
File folder = new File(filePath.substring(0, filePath.lastIndexOf('/')));
File[] files = folder.listFiles();
Timber.d("folderTime Number:" + files.length);
for (File file : files) {
if (file.lastModified() - timeOfCreation <= (120 * 1000) && file.lastModified() - timeOfCreation >= -(120 * 1000)) {
//Make sure the photos were taken within 20seconds
Timber.d("fild date:" + file.lastModified() + " time of creation" + timeOfCreation);
tempImageObj = null;//Temporary GPSExtractor to extract coords from these photos
ParcelFileDescriptor descriptor = null;
try {
descriptor = contentResolver.openFileDescriptor(Uri.parse(file.getAbsolutePath()), "r");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
if (descriptor != null) {
tempImageObj = new GPSExtractor(descriptor.getFileDescriptor(), context, prefs);
}
} else {
if (filePath != null) {
tempImageObj = new GPSExtractor(file.getAbsolutePath(), context, prefs);
}
}
if (tempImageObj != null) {
Timber.d("not null fild EXIF" + tempImageObj.imageCoordsExists + " coords" + tempImageObj.getCoords(gpsEnabled));
if (tempImageObj.getCoords(gpsEnabled) != null && tempImageObj.imageCoordsExists) {
// Current image has gps coordinates and it's not current gps locaiton
Timber.d("This file has image coords:" + file.getAbsolutePath());
SimilarImageDialogFragment newFragment = new SimilarImageDialogFragment();
Bundle args = new Bundle();
args.putString("originalImagePath", filePath);
args.putString("possibleImagePath", file.getAbsolutePath());
newFragment.setArguments(args);
newFragment.show(((AppCompatActivity) context).getSupportFragmentManager(), "dialog");
break;
}
}
}
}
haveCheckedForOtherImages = true; //Finished checking for other images
}
/**
* Initiates retrieval of image coordinates or user coordinates, and caching of coordinates.
* Then initiates the calls to MediaWiki API through an instance of CategoryApi.
*/
@SuppressLint("CheckResult")
public void useImageCoords() {
if (decimalCoords != null) {
Timber.d("Decimal coords of image: %s", decimalCoords);
Timber.d("is EXIF data present:" + imageObj.imageCoordsExists + " from findOther image");
// Only set cache for this point if image has coords
if (imageObj.imageCoordsExists) {
double decLongitude = imageObj.getDecLongitude();
double decLatitude = imageObj.getDecLatitude();
cacheController.setQtPoint(decLongitude, decLatitude);
}
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)
.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 model to %s", displayCatList);
gpsCategoryModel.setCategoryList(displayCatList);
}
} else {
Timber.d("EXIF: no coords");
}
}
boolean isCacheFound() {
return cacheFound;
}
/**
* Calls the async task that detects if image is fuzzy, too dark, etc
*/
void detectUnwantedPictures() {
String imageMediaFilePath = FileUtils.getPath(context, mediaUri);
DetectUnwantedPicturesAsync detectUnwantedPicturesAsync
= new DetectUnwantedPicturesAsync(new WeakReference<Activity>((Activity) context), imageMediaFilePath);
detectUnwantedPicturesAsync.execute();
}
@Override
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");
useImageCoords();
}
@Override
public void onNegativeResponse() {
Timber.d("EXIF from imageObj");
useImageCoords();
}
}

View file

@ -15,18 +15,84 @@ import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.math.BigInteger;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
import timber.log.Timber;
public class FileUtils {
/**
* Get SHA1 of file from input stream
*/
static String getSHA1(InputStream is) {
MessageDigest digest;
try {
digest = MessageDigest.getInstance("SHA1");
} catch (NoSuchAlgorithmException e) {
Timber.e(e, "Exception while getting Digest");
return "";
}
byte[] buffer = new byte[8192];
int read;
try {
while ((read = is.read(buffer)) > 0) {
digest.update(buffer, 0, read);
}
byte[] md5sum = digest.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
String output = bigInt.toString(16);
// Fill to 40 chars
output = String.format("%40s", output).replace(' ', '0');
Timber.i("File SHA1: %s", output);
return output;
} catch (IOException e) {
Timber.e(e, "IO Exception");
return "";
} finally {
try {
is.close();
} catch (IOException e) {
Timber.e(e, "Exception on closing MD5 input stream");
}
}
}
/**
* In older devices getPath() may fail depending on the source URI. Creating and using a copy of the file seems to work instead.
* @return path of copy
*/
@Nullable
static String createCopyPath(ParcelFileDescriptor descriptor) {
try {
String copyPath = Environment.getExternalStorageDirectory().toString() + "/CommonsApp/" + new Date().getTime() + ".jpg";
File newFile = new File(Environment.getExternalStorageDirectory().toString() + "/CommonsApp");
newFile.mkdir();
FileUtils.copy(descriptor.getFileDescriptor(), copyPath);
Timber.d("Filepath (copied): %s", copyPath);
return copyPath;
} catch (IOException e) {
Timber.e(e);
return null;
}
}
/**
* Get a file path from a Uri. This will get the the path for Storage Access
* Framework Documents, as well as the _data field for the MediaStore and
@ -235,4 +301,80 @@ public class FileUtils {
copy(new FileInputStream(source), new FileOutputStream(destination));
}
/**
* Read and return the content of a resource file as string.
* @param fileName asset file's path (e.g. "/queries/nearby_query.rq")
* @return the content of the file
*/
public static String readFromResource(String fileName) throws IOException {
StringBuilder buffer = new StringBuilder();
BufferedReader reader = null;
try {
InputStream inputStream = FileUtils.class.getResourceAsStream(fileName);
if (inputStream == null) {
throw new FileNotFoundException(fileName);
}
reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line).append("\n");
}
} finally {
if (reader != null) {
reader.close();
}
}
return buffer.toString();
}
/**
* Deletes files.
* @param file context
*/
public static boolean deleteFile(File file) {
boolean deletedAll = true;
if (file != null) {
if (file.isDirectory()) {
String[] children = file.list();
for (String child : children) {
deletedAll = deleteFile(new File(file, child)) && deletedAll;
}
} else {
deletedAll = file.delete();
}
}
return deletedAll;
}
public static File createAndGetAppLogsFile(String logs) {
try {
File commonsAppDirectory = new File(Environment.getExternalStorageDirectory().toString() + "/CommonsApp");
if (!commonsAppDirectory.exists()) {
commonsAppDirectory.mkdir();
}
File logsFile = new File(commonsAppDirectory,"logs.txt");
if (logsFile.exists()) {
//old logs file is useless
logsFile.delete();
}
logsFile.createNewFile();
FileOutputStream outputStream = new FileOutputStream(logsFile);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
outputStreamWriter.append(logs);
outputStreamWriter.close();
outputStream.flush();
outputStream.close();
return logsFile;
} catch (IOException ioe) {
Timber.e(ioe);
return null;
}
}
}

View file

@ -47,6 +47,8 @@ import fr.free.nrw.commons.modifications.TemplateRemoveModifier;
import fr.free.nrw.commons.mwapi.MediaWikiApi;
import timber.log.Timber;
//TODO: We should use this class to see how multiple uploads are handled, and then REMOVE it.
public class MultipleShareActivity extends AuthenticatedActivity
implements MediaDetailPagerFragment.MediaDetailProvider,
AdapterView.OnItemClickListener,

View file

@ -1,6 +1,5 @@
package fr.free.nrw.commons.upload;
import android.app.Activity;
import android.content.Context;
import android.graphics.Point;
import android.net.Uri;
@ -17,7 +16,6 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.EditText;

View file

@ -74,13 +74,13 @@ public class SingleUploadFragment extends CommonsDaggerSupportFragment {
//What happens when the 'submit' icon is tapped
case R.id.menu_upload_single:
if (titleEdit.getText().toString().isEmpty()) {
if (titleEdit.getText().toString().trim().isEmpty()) {
Toast.makeText(getContext(), R.string.add_title_toast, Toast.LENGTH_LONG).show();
return false;
}
String title = titleEdit.getText().toString();
String desc = descEdit.getText().toString();
String title = titleEdit.getText().toString().trim();
String desc = descEdit.getText().toString().trim();
//Save the title/desc in short-lived cache so next time this fragment is loaded, we can access these
prefs.edit()

View file

@ -91,7 +91,7 @@ public class UploadController {
* @param decimalCoords the coordinates in decimal. (e.g. "37.51136|-77.602615")
* @param onComplete the progress tracker
*/
public void startUpload(String title, Uri mediaUri, String description, String mimeType, String source, String decimalCoords, ContributionUploadProgress onComplete) {
public void startUpload(String title, Uri mediaUri, String description, String mimeType, String source, String decimalCoords, String wikiDataEntityId, ContributionUploadProgress onComplete) {
Contribution contribution;
//TODO: Modify this to include coords
@ -101,6 +101,7 @@ public class UploadController {
contribution.setTag("mimeType", mimeType);
contribution.setSource(source);
contribution.setWikiDataEntityId(wikiDataEntityId);
//Calls the next overloaded method
startUpload(contribution, onComplete);

View file

@ -7,7 +7,6 @@ import android.app.PendingIntent;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
@ -23,7 +22,6 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.inject.Inject;
import javax.inject.Named;
import fr.free.nrw.commons.HandlerService;
import fr.free.nrw.commons.R;
@ -36,6 +34,7 @@ import fr.free.nrw.commons.contributions.ContributionsContentProvider;
import fr.free.nrw.commons.modifications.ModificationsContentProvider;
import fr.free.nrw.commons.mwapi.MediaWikiApi;
import fr.free.nrw.commons.mwapi.UploadResult;
import fr.free.nrw.commons.wikidata.WikidataEditService;
import timber.log.Timber;
public class UploadService extends HandlerService<Contribution> {
@ -49,8 +48,8 @@ public class UploadService extends HandlerService<Contribution> {
public static final String EXTRA_CAMPAIGN = EXTRA_PREFIX + ".campaign";
@Inject MediaWikiApi mwApi;
@Inject WikidataEditService wikidataEditService;
@Inject SessionManager sessionManager;
@Inject @Named("default_preferences") SharedPreferences prefs;
@Inject ContributionDao contributionDao;
private NotificationManager notificationManager;
@ -137,6 +136,7 @@ public class UploadService extends HandlerService<Contribution> {
@Override
public void queue(int what, Contribution contribution) {
Timber.d("Upload service queue has contribution with wiki data entity id as %s", contribution.getWikiDataEntityId());
switch (what) {
case ACTION_UPLOAD_FILE:
@ -231,10 +231,10 @@ public class UploadService extends HandlerService<Contribution> {
Timber.d("Successfully revalidated token!");
} else {
Timber.d("Unable to revalidate :(");
// TODO: Put up a new notification, ask them to re-login
stopForeground(true);
Toast failureToast = Toast.makeText(this, R.string.authentication_failed, Toast.LENGTH_LONG);
failureToast.show();
sessionManager.forceLogin(this);
return;
}
}
@ -253,6 +253,7 @@ public class UploadService extends HandlerService<Contribution> {
if (!resultStatus.equals("Success")) {
showFailedNotification(contribution);
} else {
wikidataEditService.createClaimWithLogging(contribution.getWikiDataEntityId(), filename);
contribution.setFilename(uploadResult.getCanonicalFilename());
contribution.setImageUrl(uploadResult.getImageUrl());
contribution.setState(Contribution.STATE_COMPLETED);

View file

@ -0,0 +1,115 @@
package fr.free.nrw.commons.upload;
import android.content.ContentResolver;
import android.graphics.Bitmap;
import android.graphics.BitmapRegionDecoder;
import android.graphics.Point;
import android.graphics.Rect;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v4.graphics.BitmapCompat;
import android.view.View;
import android.widget.FrameLayout;
import java.io.IOException;
import java.io.InputStream;
import timber.log.Timber;
/**
* Contains utility methods for the Zoom function in ShareActivity.
*/
public class Zoom {
private View thumbView;
private ContentResolver contentResolver;
private FrameLayout flContainer;
Zoom(View thumbView, FrameLayout flContainer, ContentResolver contentResolver) {
this.thumbView = thumbView;
this.contentResolver = contentResolver;
this.flContainer = flContainer;
}
/**
* Create a scaled bitmap to display the zoomed-in image
* @param input the input stream corresponding to the uploaded image
* @param imageUri the uploaded image's URI
* @return a zoomable bitmap
*/
Bitmap createScaledImage(InputStream input, Uri imageUri) {
Bitmap scaled = null;
BitmapRegionDecoder decoder = null;
Bitmap bitmap = null;
try {
decoder = BitmapRegionDecoder.newInstance(input, false);
bitmap = decoder.decodeRegion(new Rect(10, 10, 50, 50), null);
} catch (IOException e) {
Timber.e(e);
} catch (NullPointerException e) {
Timber.e(e);
}
try {
//Compress the Image
System.gc();
Runtime rt = Runtime.getRuntime();
long maxMemory = rt.freeMemory();
bitmap = MediaStore.Images.Media.getBitmap(contentResolver, imageUri);
int bitmapByteCount = BitmapCompat.getAllocationByteCount(bitmap);
long height = bitmap.getHeight();
long width = bitmap.getWidth();
long calHeight = (long) ((height * maxMemory) / (bitmapByteCount * 1.1));
long calWidth = (long) ((width * maxMemory) / (bitmapByteCount * 1.1));
scaled = Bitmap.createScaledBitmap(bitmap, (int) Math.min(width, calWidth), (int) Math.min(height, calHeight), true);
} catch (IOException e) {
Timber.e(e);
} catch (NullPointerException e) {
Timber.e(e);
scaled = bitmap;
}
return scaled;
}
/**
* Calculate the starting and ending bounds for the zoomed-in image.
* 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).
* @param startBounds the global visible rectangle of the thumbnail
* @param finalBounds the global visible rectangle of the container view
* @param globalOffset the container view's offset
* @return scaled start bounds
*/
float adjustStartEndBounds(Rect startBounds, Rect finalBounds, Point globalOffset) {
thumbView.getGlobalVisibleRect(startBounds);
flContainer.getGlobalVisibleRect(finalBounds, globalOffset);
startBounds.offset(-globalOffset.x, -globalOffset.y);
finalBounds.offset(-globalOffset.x, -globalOffset.y);
// Adjust the start bounds to be the same aspect ratio as the final
// bounds using the "center crop" technique. This prevents undesirable
// stretching during the animation. Also calculate the start scaling
// factor (the end scaling factor is always 1.0).
float startScale;
if ((float) finalBounds.width() / finalBounds.height()
> (float) startBounds.width() / startBounds.height()) {
// Extend start bounds horizontally
startScale = (float) startBounds.height() / finalBounds.height();
float startWidth = startScale * finalBounds.width();
float deltaWidth = (startWidth - startBounds.width()) / 2;
startBounds.left -= deltaWidth;
startBounds.right += deltaWidth;
} else {
// Extend start bounds vertically
startScale = (float) startBounds.width() / finalBounds.width();
float startHeight = startScale * finalBounds.height();
float deltaHeight = (startHeight - startBounds.height()) / 2;
startBounds.top -= deltaHeight;
startBounds.bottom += deltaHeight;
}
return startScale;
}
}

View file

@ -1,92 +0,0 @@
package fr.free.nrw.commons.utils;
import android.os.Environment;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import timber.log.Timber;
public class FileUtils {
/**
* Read and return the content of a resource file as string.
*
* @param fileName asset file's path (e.g. "/queries/nearby_query.rq")
* @return the content of the file
*/
public static String readFromResource(String fileName) throws IOException {
StringBuilder buffer = new StringBuilder();
BufferedReader reader = null;
try {
InputStream inputStream = FileUtils.class.getResourceAsStream(fileName);
if (inputStream == null) {
throw new FileNotFoundException(fileName);
}
reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line).append("\n");
}
} finally {
if (reader != null) {
reader.close();
}
}
return buffer.toString();
}
/**
* Deletes files.
* @param file context
*/
public static boolean deleteFile(File file) {
boolean deletedAll = true;
if (file != null) {
if (file.isDirectory()) {
String[] children = file.list();
for (String child : children) {
deletedAll = deleteFile(new File(file, child)) && deletedAll;
}
} else {
deletedAll = file.delete();
}
}
return deletedAll;
}
public static File createAndGetAppLogsFile(String logs) {
try {
File commonsAppDirectory = new File(Environment.getExternalStorageDirectory().toString() + "/CommonsApp");
if (!commonsAppDirectory.exists()) {
commonsAppDirectory.mkdir();
}
File logsFile = new File(commonsAppDirectory,"logs.txt");
if (logsFile.exists()) {
//old logs file is useless
logsFile.delete();
}
logsFile.createNewFile();
FileOutputStream outputStream = new FileOutputStream(logsFile);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
outputStreamWriter.append(logs);
outputStreamWriter.close();
outputStream.flush();
outputStream.close();
return logsFile;
} catch (IOException ioe) {
Timber.e(ioe);
return null;
}
}
}

View file

@ -3,14 +3,11 @@ 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;
@ -27,8 +24,6 @@ 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.
*/

View file

@ -0,0 +1,80 @@
package fr.free.nrw.commons.widget;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.widget.RemoteViews;
import com.prof.rssparser.Article;
import com.prof.rssparser.Parser;
import com.squareup.picasso.Picasso;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.util.ArrayList;
import fr.free.nrw.commons.BuildConfig;
import fr.free.nrw.commons.R;
/**
* Implementation of App Widget functionality.
*/
public class PicOfDayAppWidget extends AppWidgetProvider {
static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId) {
// Construct the RemoteViews object
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.pic_of_day_app_widget);
String urlString = BuildConfig.WIKIMEDIA_API_POTD;
Parser parser = new Parser();
parser.execute(urlString);
parser.onFinish(new Parser.OnTaskCompleted() {
@Override
public void onTaskCompleted(ArrayList<Article> list) {
String desc = list.get(list.size() - 1).getDescription();
if (desc != null) {
Document document = Jsoup.parse(desc);
Elements elements = document.select("img");
String imageUrl = elements.get(0).attr("src");
if (imageUrl != null && imageUrl.length() > 0) {
Picasso.get().load(imageUrl).into(views, R.id.appwidget_image, new int[]{appWidgetId});
}
}
}
@Override
public void onError() {
}
});
// Instruct the widget manager to update the widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// There may be multiple widgets active, so update all of them
for (int appWidgetId : appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId);
}
}
@Override
public void onEnabled(Context context) {
// Enter relevant functionality for when the first widget is created
}
@Override
public void onDisabled(Context context) {
// Enter relevant functionality for when the last widget is disabled
}
}

View file

@ -0,0 +1,16 @@
package fr.free.nrw.commons.wikidata;
public abstract class WikidataEditListener {
protected WikidataP18EditListener wikidataP18EditListener;
public abstract void onSuccessfulWikidataEdit();
public void setAuthenticationStateListener(WikidataP18EditListener wikidataP18EditListener) {
this.wikidataP18EditListener = wikidataP18EditListener;
}
public interface WikidataP18EditListener {
void onWikidataEditSuccessful();
}
}

View file

@ -0,0 +1,20 @@
package fr.free.nrw.commons.wikidata;
/**
* Listener for wikidata edits
*/
public class WikidataEditListenerImpl extends WikidataEditListener {
public WikidataEditListenerImpl() {
}
/**
* Fired when wikidata P18 edit is successful. If there's an active listener, then it is fired
*/
@Override
public void onSuccessfulWikidataEdit() {
if (wikidataP18EditListener != null) {
wikidataP18EditListener.onWikidataEditSuccessful();
}
}
}

View file

@ -0,0 +1,134 @@
package fr.free.nrw.commons.wikidata;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import java.util.Locale;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.mwapi.MediaWikiApi;
import fr.free.nrw.commons.utils.ViewUtil;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import timber.log.Timber;
/**
* This class is meant to handle the Wikidata edits made through the app
* It will talk with MediaWikiApi to make necessary API calls, log the edits and fire listeners
* on successful edits
*/
@Singleton
public class WikidataEditService {
private final Context context;
private final MediaWikiApi mediaWikiApi;
private final WikidataEditListener wikidataEditListener;
private final SharedPreferences directPrefs;
@Inject
public WikidataEditService(Context context,
MediaWikiApi mediaWikiApi,
WikidataEditListener wikidataEditListener,
@Named("direct_nearby_upload_prefs") SharedPreferences directPrefs) {
this.context = context;
this.mediaWikiApi = mediaWikiApi;
this.wikidataEditListener = wikidataEditListener;
this.directPrefs = directPrefs;
}
/**
* Create a P18 claim and log the edit with custom tag
* @param wikidataEntityId
* @param fileName
*/
public void createClaimWithLogging(String wikidataEntityId, String fileName) {
if(wikidataEntityId == null
|| fileName == null) {
return;
}
editWikidataProperty(wikidataEntityId, fileName);
}
/**
* Edits the wikidata entity by adding the P18 property to it.
* Adding the P18 edit requires calling the wikidata API to create a claim against the entity
*
* @param wikidataEntityId
* @param fileName
*/
@SuppressLint("CheckResult")
private void editWikidataProperty(String wikidataEntityId, String fileName) {
Timber.d("Upload successful with wiki data entity id as %s", wikidataEntityId);
Timber.d("Attempting to edit Wikidata property %s", wikidataEntityId);
Observable.fromCallable(() -> {
String propertyValue = getFileName(fileName);
return mediaWikiApi.wikidatCreateClaim(wikidataEntityId, "P18", "value", propertyValue);
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(revisionId -> handleClaimResult(wikidataEntityId, revisionId), throwable -> {
Timber.e(throwable, "Error occurred while making claim");
ViewUtil.showLongToast(context, context.getString(R.string.wikidata_edit_failure));
});
}
private void handleClaimResult(String wikidataEntityId, String revisionId) {
if (revisionId != null) {
wikidataEditListener.onSuccessfulWikidataEdit();
showSuccessToast();
logEdit(revisionId);
} else {
Timber.d("Unable to make wiki data edit for entity %s", wikidataEntityId);
ViewUtil.showLongToast(context, context.getString(R.string.wikidata_edit_failure));
}
}
/**
* Log the Wikidata edit by adding Wikimedia Commons App tag to the edit
* @param revisionId
*/
@SuppressLint("CheckResult")
private void logEdit(String revisionId) {
Observable.fromCallable(() -> mediaWikiApi.addWikidataEditTag(revisionId))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> {
if (result) {
Timber.d("Wikidata edit was tagged successfully");
} else {
Timber.d("Wikidata edit couldn't be tagged");
}
}, throwable -> {
Timber.e(throwable, "Error occurred while adding tag to the edit");
});
}
/**
* Show a success toast when the edit is made successfully
*/
private void showSuccessToast() {
String title = directPrefs.getString("Title", "");
String successStringTemplate = context.getString(R.string.successful_wikidata_edit);
String successMessage = String.format(Locale.getDefault(), successStringTemplate, title);
ViewUtil.showLongToast(context, successMessage);
}
/**
* Formats and returns the filename as accepted by the wiki base API
* https://www.mediawiki.org/wiki/Wikibase/API#wbcreateclaim
*
* @param fileName
* @return
*/
private String getFileName(String fileName) {
fileName = String.format("\"%s\"", fileName.replace("File:", ""));
Timber.d("Wikidata property name is %s", fileName);
return fileName;
}
}

View file

@ -0,0 +1,25 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
android:padding="@dimen/widget_margin"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="20sp"
android:gravity="center"
android:layout_marginTop="10dp"
android:text="@string/app_widget_heading"/>
<ImageView
android:padding="15dp"
android:id="@+id/appwidget_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/appwidget_img" />
</LinearLayout>

View file

@ -14,7 +14,7 @@
<string name="login_success">Аҭалара қәҿиарала имҩаҧысит!</string>
<string name="login_failed">Асистемахь аҭалараан агха!</string>
<string name="upload_failed">Афаил ҧшаам. Даҽа фаилк шәахәаҧш.</string>
<string name="authentication_failed">Аутентификациа агха!</string>
<string name="authentication_failed" fuzzy="true">Аутентификациа агха!</string>
<string name="uploading_started">Аҭагалара иалагоуп!</string>
<string name="upload_completed_notification_title">%1$s иҭагалоуп!</string>
<string name="upload_completed_notification_text">Шәақәыӷәӷәа иҭагалоу афаил ахәаҧшраз</string>

View file

@ -27,7 +27,7 @@
<string name="login_success">تم الدخول بشكل صحيح!</string>
<string name="login_failed">فشل تسجيل الدخول</string>
<string name="upload_failed">الملف غير موجود. فضلا اختر ملفا آخر.</string>
<string name="authentication_failed">فشل الاستيقان!</string>
<string name="authentication_failed" fuzzy="true">فشل الاستيقان!</string>
<string name="uploading_started">بدأ الرفع!</string>
<string name="upload_completed_notification_title">رُفع %1$s!</string>
<string name="upload_completed_notification_text">انقر لعرض ملفك المرفوع</string>

View file

@ -21,7 +21,7 @@
<string name="login_success">¡Identificación correuta!</string>
<string name="login_failed">¡Falló l\'aniciu de sesión!</string>
<string name="upload_failed">Nun s\'alcontró\'l ficheru. Tenta con otru.</string>
<string name="authentication_failed">¡Falló la identificación!</string>
<string name="authentication_failed">Falló la identificación, anicia sesión nuevamente</string>
<string name="uploading_started">Principió la xuba</string>
<string name="upload_completed_notification_title">¡%1$s xubíu!</string>
<string name="upload_completed_notification_text">Toque pa ver la xuba</string>
@ -103,7 +103,7 @@
<string name="preference_license">Llicencia predeterminada</string>
<string name="use_previous">Usar un títulu/descripción anterior</string>
<string name="allow_gps">Llograr automáticamente l\'allugamientu actual</string>
<string name="allow_gps_summary">Recuperar l\'allugamientu actual pa ufiertar suxerencies de categoríes si la imaxe nun tien etiquetes xeográfiques</string>
<string name="allow_gps_summary">Recupera la posición actual si la imaxe nun tien etiquetes xeográfiques, y marca la imaxe con ella. Atención: Esto revelará\'l to allugamientu actual.</string>
<string name="preference_theme">Mou nocherniegu</string>
<string name="preference_theme_summary">Usar tema escuru</string>
<string name="license_name_cc_by_sa_four"> Reconocimientu-CompartirIgual 4.0</string>
@ -272,6 +272,10 @@
<string name="share_app_title">Compartir app</string>
<string name="share_coordinates_not_present">Nun s\'especificaron les coordenaes al escoyer la imaxe</string>
<string name="error_fetching_nearby_places">Error al llograr los llugares cercanos.</string>
<string name="appwidget_img">Semeya del día</string>
<string name="app_widget_heading">Semeya del día</string>
<string name="successful_wikidata_edit">Añadióse correutamente la imaxe a %1$s en Wikidata.</string>
<string name="wikidata_edit_failure">Nun pudo anovase la entidá de Wikidata correspondiente.</string>
<string name="menu_set_wallpaper">Definir fondu</string>
<string name="wallpaper_set_successfully">Fondu definíu correutamente</string>
</resources>

View file

@ -16,7 +16,7 @@
<string name="login_success">Uspešno ste prijavljeni.</string>
<string name="login_failed">Prijavljivanje nije uspelo.</string>
<string name="upload_failed">Datoteka nije pronađena. Pokušajte sa drugom datotekom.</string>
<string name="authentication_failed">Provera identiteta nije uspela.</string>
<string name="authentication_failed" fuzzy="true">Provera identiteta nije uspela.</string>
<string name="uploading_started">Otpremanje je započeto.</string>
<string name="upload_completed_notification_title">Datoteka „%1$s“ je otpremljena.</string>
<string name="upload_completed_notification_text">Tapnite da biste videli otpremanje</string>
@ -94,7 +94,7 @@
<string name="preference_license" fuzzy="true">Licenca</string>
<string name="use_previous">Koristi prethodan naslov/opis</string>
<string name="allow_gps">Automatski detektuj trenutnu lokaciju</string>
<string name="allow_gps_summary">Primi trenutnu lokaciju da bi predložili kategoriju ako slika nije geografski označena</string>
<string name="allow_gps_summary" fuzzy="true">Primi trenutnu lokaciju da bi predložili kategoriju ako slika nije geografski označena</string>
<string name="preference_theme">Noćni režim</string>
<string name="preference_theme_summary">Koristiti tamnu temu</string>
<string name="license_name_cc_by_sa_four">Autorstvo-Deliti pod istim uslovima 4.0</string>

View file

@ -23,7 +23,7 @@
<string name="login_success">Танышыу уңышлы үтте</string>
<string name="login_failed">Танылыу хатаһы</string>
<string name="upload_failed">Файл табылманы. Башҡа файлды эҙлә.</string>
<string name="authentication_failed">Кем икәнегеҙ танылманы!</string>
<string name="authentication_failed" fuzzy="true">Кем икәнегеҙ танылманы!</string>
<string name="uploading_started">Тейәү башланды!</string>
<string name="upload_completed_notification_title">%1$s тейәлде!</string>
<string name="upload_completed_notification_text">Ошонда баҫып тейәлгән файлды ҡара</string>
@ -100,7 +100,7 @@
<string name="preference_license">Нығытылған рөхсәтнамә</string>
<string name="use_previous">Алдағы атама/һәрәтләмәне ҡулланыу</string>
<string name="allow_gps">Автомат рәүешендә сираттағы урынды алыу</string>
<string name="allow_gps_summary">Әгәр рәсемдең геотегтары булмаһа, категориялар үҙенән-үҙе тәҡдим ителһен өсөн сираттағы урынды алырға</string>
<string name="allow_gps_summary" fuzzy="true">Әгәр рәсемдең геотегтары булмаһа, категориялар үҙенән-үҙе тәҡдим ителһен өсөн сираттағы урынды алырға</string>
<string name="preference_theme">Төнгө режим</string>
<string name="preference_theme_summary">Ҡараңғы теманы ҡулланыу</string>
<string name="license_name_cc_by_sa_four"> Attribution-ShareAlike 4.0</string>

View file

@ -18,7 +18,7 @@
<string name="login_success">Успешно влизане.</string>
<string name="login_failed">Неуспешно влизане!</string>
<string name="upload_failed">Файлът не е намерен. Моля, опитайте с друг файл.</string>
<string name="authentication_failed">Неуспешен опит за удостоверяване!</string>
<string name="authentication_failed" fuzzy="true">Неуспешен опит за удостоверяване!</string>
<string name="uploading_started">Качването започна!</string>
<string name="upload_completed_notification_title">Файл %1$s е качен!</string>
<string name="upload_completed_notification_text">Докоснете, за да видите качения файл</string>

View file

@ -29,7 +29,7 @@
<string name="login_success">প্রবেশ সফল!</string>
<string name="login_failed">প্রবেশ ব্যর্থ :(</string>
<string name="upload_failed">ফাইল পাওয়া যায়নি। আরেকটি ফাইল চেষ্টা করুন।</string>
<string name="authentication_failed">প্রমাণীকরণ ব্যর্থ হয়েছে!</string>
<string name="authentication_failed">প্রমাণীকরণ ব্যর্থ হয়েছে, আবার প্রবেশ করুন</string>
<string name="uploading_started"> আপলোড আরম্ভ হয়েছে!</string>
<string name="upload_completed_notification_title">%1$s আপলোড হয়েছে!</string>
<string name="upload_completed_notification_text">আপনার আপলোড দেখতে টোকা দিন</string>
@ -110,7 +110,7 @@
<string name="preference_license">পূর্বনির্ধারিত লাইসেন্স</string>
<string name="use_previous">পূর্ববর্তী শিরোনাম/বিবরণ ব্যবহার করুন</string>
<string name="allow_gps">স্বয়ংক্রিয়ভাবে বর্তমান অবস্থান পান</string>
<string name="allow_gps_summary">বিষয়শ্রেণীর পরামর্শ দিতে বর্তমান অবস্থান পান যদি ছবিতে ভূ-ট্যাগ না থেকে থাকে</string>
<string name="allow_gps_summary" fuzzy="true">বিষয়শ্রেণীর পরামর্শ দিতে বর্তমান অবস্থান পান যদি ছবিতে ভূ-ট্যাগ না থেকে থাকে</string>
<string name="preference_theme">রাত্রি মোড</string>
<string name="preference_theme_summary">কালো থিম ব্যবহার করুন</string>
<string name="license_name_cc_by_sa_four">অ্যাট্রিবিউশন-শেয়ারঅ্যালাইক .</string>

View file

@ -3,6 +3,7 @@
* Dishual
* Fohanno
* Fulup
* Gwendal
* Gwenn-Ael
* Y-M D
-->
@ -24,7 +25,7 @@
<string name="login_success">Kevreet oc\'h !</string>
<string name="login_failed">Kudenn gevreañ !</string>
<string name="upload_failed">N\'eo ket bet kavet ar restr. Klask gant unan all.</string>
<string name="authentication_failed">Dilesadur c\'hwitet!</string>
<string name="authentication_failed" fuzzy="true">Dilesadur c\'hwitet!</string>
<string name="uploading_started">Kroget da enporzhiañ!</string>
<string name="upload_completed_notification_title">%1$s bet enporzhiet !</string>
<string name="upload_completed_notification_text">Pouezit evit gwelet hoc\'h enporzhiadenn</string>
@ -102,7 +103,7 @@
<string name="preference_license">Aotre-implijout dre ziouer</string>
<string name="use_previous">Ober gant an titl/deskrivadur kent</string>
<string name="allow_gps">Tapout al lec\'hiadur red ent emgefre</string>
<string name="allow_gps_summary">Kavout al lec\'hiadur red evit pourchas kinnigoù rummadoù ma n\'eo ket douarlec\'hiet ar skeudenn.</string>
<string name="allow_gps_summary" fuzzy="true">Kavout al lec\'hiadur red evit pourchas kinnigoù rummadoù ma n\'eo ket douarlec\'hiet ar skeudenn.</string>
<string name="preference_theme">Mod noz</string>
<string name="preference_theme_summary">Ober gant an tem teñval</string>
<string name="license_name_cc_by_sa_four">Deroadur-RannañHeñvel 4.0</string>
@ -217,4 +218,5 @@
<string name="nearby_location_has_not_changed">N\'eo ket cheñchet al lec\'hiadur.</string>
<string name="get_directions">Kaout urzhioù</string>
<string name="read_article">Lenn ar pennad</string>
<string name="appwidget_img">Skeudenn an deiz</string>
</resources>

View file

@ -16,7 +16,7 @@
<string name="login_success">Prijavljivanje uspješno!</string>
<string name="login_failed">Prijavljivanje nije uspjelo!</string>
<string name="upload_failed">Datoteka nije pronađena. Pokušajte drugu.</string>
<string name="authentication_failed">Provjera identiteta nije uspjela!</string>
<string name="authentication_failed" fuzzy="true">Provjera identiteta nije uspjela!</string>
<string name="uploading_started">Postavljanje je započelo!</string>
<string name="upload_completed_notification_title">Datoteka %1$s je postavljena!</string>
<string name="upload_completed_notification_text">Dodirnite da biste vidjeli datoteku</string>
@ -93,7 +93,7 @@
<string name="preference_license" fuzzy="true">Licenca</string>
<string name="use_previous">Koristi prethodni naziv/opis</string>
<string name="allow_gps">Automatski dobavi trenutnu lokaciju</string>
<string name="allow_gps_summary">Dobavi trenutnu lokaciju za davanje prijedloga o kategorijama ako nema geooznaku</string>
<string name="allow_gps_summary" fuzzy="true">Dobavi trenutnu lokaciju za davanje prijedloga o kategorijama ako nema geooznaku</string>
<string name="preference_theme">Noćni režim</string>
<string name="preference_theme_summary">Koristi tamnu temu</string>
<string name="license_name_cc_by_sa_four">Autorstvo-Dijeliti pod istim uslovima 4.0</string>

View file

@ -23,7 +23,7 @@
<string name="login_success">S\'ha iniciat sessió correctament!</string>
<string name="login_failed">Error en iniciar la sessió!</string>
<string name="upload_failed">No s\'ha trobat el fitxer. Proveu-ho amb un altre fitxer.</string>
<string name="authentication_failed">L\'autenticació ha fallat!</string>
<string name="authentication_failed">Lautenticació ha fallat. Torneu a provar diniciar una sessió.</string>
<string name="uploading_started">Ha començat la càrrega!</string>
<string name="upload_completed_notification_title">Sha pujat %1$s.</string>
<string name="upload_completed_notification_text">Prem per veure la teva càrrega</string>

View file

@ -33,7 +33,7 @@
<string name="login_success">Přihlášení uspělo!</string>
<string name="login_failed">Přihlášení se nezdařilo!</string>
<string name="upload_failed">Soubor nebyl nalezen. Prosím, zkuste jiný soubor.</string>
<string name="authentication_failed">Ověření se nezdařilo!</string>
<string name="authentication_failed">Ověření se nezdařilo, prosím přihlaste se znovu</string>
<string name="uploading_started">Nahrávání začalo!</string>
<string name="upload_completed_notification_title">%1$s nahráno!</string>
<string name="upload_completed_notification_text">Klepnutím zobrazíte upload</string>
@ -113,7 +113,7 @@
<string name="preference_license">Výchozí licence</string>
<string name="use_previous">Použít předchozí název a popis</string>
<string name="allow_gps">Automaticky získat aktuální polohu</string>
<string name="allow_gps_summary">Nabídnout kategorie na základě aktuální polohy (pokud není obrázek opatřen souřadnicemi)</string>
<string name="allow_gps_summary" fuzzy="true">Nabídnout kategorie na základě aktuální polohy (pokud není obrázek opatřen souřadnicemi)</string>
<string name="preference_theme">Noční režim</string>
<string name="preference_theme_summary">Použít tmavý režim</string>
<string name="license_name_cc_by_sa_four">Uveďte autora-Zachovejte licenci 4.0</string>

View file

@ -14,7 +14,7 @@
<string name="login_success">Ùdałi logòwanié!</string>
<string name="login_failed">Logòwanié nie darzëło sã!</string>
<string name="upload_failed">Felënk lopka. Proszã spróbòwac znowa.</string>
<string name="authentication_failed">Fela ùdowierzaniô!</string>
<string name="authentication_failed" fuzzy="true">Fela ùdowierzaniô!</string>
<string name="uploading_started">Wladënk zrëszony!</string>
<string name="upload_completed_notification_title">%1$s wladowóné!</string>
<string name="upload_completed_notification_text">Tkni, abë òbôczëc ladowóny lopk</string>

View file

@ -5,18 +5,25 @@
* Robin Owain
-->
<resources>
<string name="preference_category_appearance">Ymddangosiad</string>
<string name="preference_category_general">Cyffredinol</string>
<string name="preference_category_feedback">Adborth</string>
<string name="preference_category_location">Lleoliad</string>
<string name="app_name">Comin Wicimedia</string>
<string name="bullet"></string>
<string name="menu_settings">Gosodiadau</string>
<string name="username">Enw defnyddiwr</string>
<string name="password">Cyfrinair</string>
<string name="login_credential">Mewngofnodwch i\'ch cyfri Comin Beta</string>
<string name="login">Mewngofnodi</string>
<string name="forgot_password">Anghofiwyd y Cyfrinair?</string>
<string name="signup">Cofrestru</string>
<string name="logging_in_title">Wrthi\'n mewngofnodi</string>
<string name="logging_in_message">Disgwyliwch…</string>
<string name="login_success">Llwyddodd y mewngofnodi!</string>
<string name="login_failed">Methodd y mewngofnodi!</string>
<string name="upload_failed">Ni chafwyd hyd i\'r ffeil. Ceisiwch un arall.</string>
<string name="authentication_failed">Methodd y dilysu!</string>
<string name="authentication_failed">Methodd y dilysu! Mewngofnodwch eto.</string>
<string name="uploading_started">Dechreuodd yr uwchlwytho!</string>
<string name="upload_completed_notification_title">Uwchlwythwyd %1$s!</string>
<string name="upload_completed_notification_text">Tapiwch i weld eich uwchlwythiad</string>
@ -41,8 +48,10 @@
<string name="menu_share">Rhannu</string>
<string name="menu_open_in_browser">Agor yn y Porwr</string>
<string name="share_title_hint">Teitl</string>
<string name="add_title_toast">Rhowch deitl i\'r ffeil</string>
<string name="share_description_hint">Disgrifiad</string>
<string name="login_failed_network">Yn methu mewngofnodi - methodd y rhwydwaith</string>
<string name="login_failed_wrong_credentials">Methwyd mewngofnodi - gwirwch eich enw defnyddiwr a\'ch 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,6 +63,7 @@
<string name="categories_search_text_hint">Archwilio\'r categorïau</string>
<string name="menu_save_categories">Cadw</string>
<string name="refresh_button">Ailgyrchu</string>
<string name="display_list_button">Rhestr</string>
<string name="gps_disabled">Ataliwyd GPS ar eich dyfais. Ydych chi am ei droi\'n weithredol?</string>
<string name="enable_gps">Gweithredu\'r GPS</string>
<string name="contributions_subtitle_zero">Heb uwchlwytho eto</string>
@ -75,11 +85,12 @@
<string name="categories_activity_title">Categorïau</string>
<string name="title_activity_settings">Gosodiadau</string>
<string name="title_activity_signup">Cofrestru</string>
<string name="title_activity_featured_images">Delweddau nodwedd</string>
<string name="menu_about">Amdanom</string>
<string name="about_license">Ap Cynnwys Agored a grewyd ac a gefnogir gan wirfoddolwyr cymuned Wicimedia yw ap Comin Wicimedia. Does a wnelo Sefydliad Wicimedia ddim byd ag e (ei greu, ei gynnal na\'i ddatblygu).</string>
<string name="about_improve">\n\nCrewch &lt;a href=\"https://github.com/commons-app/apps-android-commons/issues\"&gt;ymholiad GitHub&lt;/a&gt; os oes gennych fyg, broblem neu awgrym.</string>
<string name="about_privacy_policy" fuzzy="true">&lt;a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\"&gt;Polisi Preifatrwydd&lt;/a&gt;</string>
<string name="about_credits" fuzzy="true">&lt;a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\"&gt;Clod&lt;/a&gt;</string>
<string name="about_privacy_policy">&lt;u&gt;Polisi preifatrwydd&lt;/u&gt;</string>
<string name="about_credits">Clod a bri</string>
<string name="title_activity_about">Amdanom</string>
<string name="menu_feedback">Danfonwch Adborth (drwy Ebost)</string>
<string name="no_email_client">Dim ebost client wedi\'i ganfod</string>
@ -91,10 +102,10 @@
<string name="share_license_summary">Caiff y ddelwedd hon ei thrwyddedu yn ôl termau\'r drwydded %1$s.</string>
<string name="media_upload_policy">Wrth gynnig y llun yma, rwy\'n datgan mai fy ngwaith i ydyw ac nad yw\'n cynnwys unrhyw beth dan hawlfrain, na hunlun, a\'i fod yn cadw at &lt;a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\"&gt;Bolisiau Comin Wicimedia&lt;/a&gt;.</string>
<string name="menu_download">Lawrlwytho</string>
<string name="preference_license" fuzzy="true">Trwydded</string>
<string name="preference_license">Trwydded Ddiofyn (\'default\')</string>
<string name="use_previous">Defnydiwch y teitl/disgrifiad blaenorol</string>
<string name="allow_gps">Defnyddiwch y lleoliad cyfredol</string>
<string name="allow_gps_summary">Canfyddwch eich lleoliad, er mwyn i ni gynnig categori (os nad ydych wedi nodi\'r cyfesurynnau).</string>
<string name="allow_gps_summary">Adfer eich lleoliad presennol os nad yw\'r ddelwedd yn cynnwys cyfesurynnau. Bydd hyn yn datgelu eich lleoliad chi!</string>
<string name="preference_theme">Modd fin nos</string>
<string name="preference_theme_summary">Defnyddiwch thema tywyll</string>
<string name="license_name_cc_by_sa_four"> Attribution-ShareAlike 4.0</string>
@ -120,9 +131,19 @@
<string name="tutorial_1_text">Cyhelir llawer o luniau ar Gomin Wicimedia sy\'n cael eu defnyddio ar Wicipedia.</string>
<string name="tutorial_1_subtext">Mae eich lluniau\'n gymorth i addysgu pobl drwy\'r byd mawr crwn!</string>
<string name="tutorial_2_text">Uwchlwythwch lluniau a dynnoch eich hun:</string>
<string name="tutorial_2_subtext" fuzzy="true">- Natur (blodau, anifeiliaid, mynyddoedd)\n- Pethau defnyddiol (beic, tren, gorsaf drenau)\n- Enwogion (beirdd, athletwyr, blogwyr)</string>
<string name="tutorial_2_subtext">Gwrthrychau byd natur (blodau, anifeiliaid, mynyddoedd)\n- Gwrthrychau defnyddiol (beics, trenau, gorsafoedd trenau)\n- Enwogion (beirdd, athletwyr, blogwyr)</string>
<string name="tutorial_2_subtext_1">Gwrthrychau byd natur (blodau, anifeiliaid, mynyddoedd)</string>
<string name="tutorial_2_subtext_2">Gwrthrychau defnyddiol (beics, trenau, gorsafoedd trenau)</string>
<string name="tutorial_2_subtext_3">Enwogion (beirdd, athletwyr, blogwyr)</string>
<string name="tutorial_3_text">Peidiwch ag uwchlwytho:</string>
<string name="tutorial_3_subtext">- hunanluniau ohonoch chi na\'ch ffrindiau\n- lluniau a gawsoch o\'r we\n- sgrinluniau o apiau masnachol</string>
<string name="tutorial_3_subtext_1">Hunanluniau neu luniau o\'ch ffrindiau</string>
<string name="tutorial_3_subtext_2">Lluniau a lawrlwythwyd o\'r we gennych</string>
<string name="tutorial_3_subtext_3">Sgrinluniau o aps</string>
<string name="tutorial_4_text">Enghraifft o uwchlwythiad:</string>
<string name="tutorial_4_subtext_1">Teitl:Tŷ Opera Sydney</string>
<string name="tutorial_4_subtext_2">Disgrifiad: Golygfa o Dŷ Opera Sydney o ochr arall y bae</string>
<string name="tutorial_4_subtext_3">Categoriau: Tŷ Opera Sydney o\'r gorllewin</string>
<string name="welcome_wikipedia_text">Cyfranwch luniau. Cynorthwywch Wicipedia i roi bywyd yn yr erthyglau!</string>
<string name="welcome_wikipedia_subtext">Mae\'r delweddau ar Wicipedia\'n dod o\nGomin Wikimedia.</string>
<string name="welcome_copyright_text">Mae eich delweddau\'n cynorthwyo i addysgu pobl ledled y byd.</string>
@ -135,6 +156,32 @@
<string name="detail_description_empty">Dim disgrifiad</string>
<string name="detail_license_empty">Trwydded anhysbys</string>
<string name="menu_refresh">Adnewyddu</string>
<string name="ok">Iawn</string>
<string name="title_activity_nearby">Lleoedd Cyfagos</string>
<string name="no_nearby">Ni chafwyd hyd i leoedd cyfagos</string>
<string name="warning">Rhybudd</string>
<string name="yes">Ydw</string>
<string name="no">Nac ydw</string>
<string name="media_detail_title">Teitl</string>
<string name="media_detail_media_title">teitl y cyfrwng</string>
<string name="media_detail_description">Disgrifiad</string>
<string name="media_detail_author">Awdur</string>
<string name="media_detail_uploaded_date">Dyddiad yr uwchlwythiad</string>
<string name="media_detail_license">Trwydded</string>
<string name="media_detail_coordinates">Cyfesurynnau</string>
<string name="media_detail_coordinates_empty">Dim</string>
<string name="nearby_info_menu_wikidata_article">Eitem Wicidata</string>
<string name="nearby_info_menu_wikipedia_article">Erthygl Wicipedia</string>
<string name="login_to_your_account">Mewngofnodwch i\'ch cyfri</string>
<string name="send_log_file">Danfonwch y ffeil log</string>
<string name="view_browser">Gweld yn y porwr</string>
<string name="nearby_location_has_not_changed">Nid yw\'r lleoliad wedi newid.</string>
<string name="nearby_location_not_available">Nid yw\'r lleoliad ar gael.</string>
<string name="about_translate_proceed">Parhau</string>
<string name="about_translate_cancel">Canslo</string>
<string name="retry">Ailgeisio</string>
<string name="showcase_view_got_it_button">Gwnaed!</string>
<string name="appwidget_img">Llun y Dydd</string>
<string name="app_widget_heading">Llun y Dydd</string>
<string name="successful_wikidata_edit">Mae %1$s o luniau wedi\'u hychwanegu ar Wicidata!</string>
</resources>

View file

@ -26,7 +26,7 @@
<string name="login_success">Du er nu logget på!</string>
<string name="login_failed">Det mislykkedes at logge på!</string>
<string name="upload_failed">Filen blev ikke fundet. Forsøg med en anden fil.</string>
<string name="authentication_failed">Godkendelse mislykkedes!</string>
<string name="authentication_failed" fuzzy="true">Godkendelse mislykkedes!</string>
<string name="uploading_started">Overførsel begyndt!</string>
<string name="upload_completed_notification_title">%1$s overført!</string>
<string name="upload_completed_notification_text">Tryk for at få vist din upload</string>
@ -105,7 +105,7 @@
<string name="preference_license">Standardlicens</string>
<string name="use_previous">Brug forrige titel/beskrivelse</string>
<string name="allow_gps">Hent automatisk nuværende placering</string>
<string name="allow_gps_summary">Hent nuværende placering for at tilbyde kategoriforslag hvis billedet ikke er geografisk mærket</string>
<string name="allow_gps_summary" fuzzy="true">Hent nuværende placering for at tilbyde kategoriforslag hvis billedet ikke er geografisk mærket</string>
<string name="preference_theme">Nat-tilstand</string>
<string name="preference_theme_summary">Brug mørkt tema</string>
<string name="license_name_cc_by_sa_four"> Attribution-ShareAlike 4.0</string>

View file

@ -25,7 +25,7 @@
<string name="login_success">Anmeldung erfolgreich!</string>
<string name="login_failed">Anmeldung fehlgeschlagen!</string>
<string name="upload_failed">Datei nicht gefunden. Bitte versuche es mit einer anderen.</string>
<string name="authentication_failed">Authentifizierung fehlgeschlagen!</string>
<string name="authentication_failed">Authentifizierung fehlgeschlagen. Bitte erneut anmelden.</string>
<string name="uploading_started">Hochladen gestartet!</string>
<string name="upload_completed_notification_title">„%1$s“ hochgeladen!</string>
<string name="upload_completed_notification_text">Tippe, um deinen Upload anzusehen</string>
@ -107,7 +107,7 @@
<string name="preference_license">Standardlizenz</string>
<string name="use_previous">Vorherige(n) Titel/Beschreibung verwenden</string>
<string name="allow_gps">Aktuellen Standort automatisch abrufen</string>
<string name="allow_gps_summary">Ruft den aktuellen Standort ab, um Kategorievorschläge anzubieten, falls das Bild keine Geotags hat.</string>
<string name="allow_gps_summary">Ruft den aktuellen Standort ab, falls das Bild nicht georeferenziert ist und markiert es. Warnung: Diese Aktion verrät deinen aktuellen Standort.</string>
<string name="preference_theme">Nachtmodus</string>
<string name="preference_theme_summary">Dunkles Thema verwenden</string>
<string name="license_name_cc_by_sa_four">Attribution-ShareAlike 4.0</string>
@ -278,6 +278,10 @@
<string name="share_app_title">App teilen</string>
<string name="share_coordinates_not_present">Während der Bildauswahl wurden keine Koordinaten angegeben</string>
<string name="error_fetching_nearby_places">Fehler beim Abrufen der Orte in der Nähe.</string>
<string name="appwidget_img">Bild des Tages</string>
<string name="app_widget_heading">Bild des Tages</string>
<string name="successful_wikidata_edit">Bild erfolgreich nach %1$s auf Wikidata hinzugefügt!</string>
<string name="wikidata_edit_failure">Fehler bei der Aktualisierung des dazugehörigen Wikidata-Objekts!</string>
<string name="menu_set_wallpaper">Hintergrundbild festlegen</string>
<string name="wallpaper_set_successfully">Hintergrundbild erfolgreich festgelegt!</string>
</resources>

View file

@ -25,7 +25,7 @@
<string name="login_success">Cıkewtış hewl bi.</string>
<string name="login_failed">Nidekeweya de</string>
<string name="upload_failed">Dosya nêvineya. Dosyê da bine bıcerebnê.</string>
<string name="authentication_failed">Tesdiq kerdış nebı</string>
<string name="authentication_failed" fuzzy="true">Tesdiq kerdış nebı</string>
<string name="uploading_started">Barkerdış sertera!</string>
<string name="upload_completed_notification_title">%1$s bıbar!</string>
<string name="upload_completed_notification_text">Barkerdışê xo pıro bıde.</string>

View file

@ -29,7 +29,7 @@
<string name="login_success">Επιτυχής σύνδεση!</string>
<string name="login_failed">Η είσοδος απέτυχε!</string>
<string name="upload_failed">Το αρχείο δεν βρέθηκε. Παρακαλώ δοκιμάστε ένα άλλο αρχείο.</string>
<string name="authentication_failed">Απέτυχε ο έλεγχος ταυτότητας!</string>
<string name="authentication_failed">Απέτυχε ο έλεγχος ταυτότητας, παρακαλώ συνδεθείτε ξανά</string>
<string name="uploading_started">Η αποστολή ξεκίνησε!</string>
<string name="upload_completed_notification_title">%1$s επιφορτώθηκε!</string>
<string name="upload_completed_notification_text">Πατήστε για να προβάλλετε την αποστολή</string>
@ -111,7 +111,7 @@
<string name="preference_license">Προεπιλεγμένη άδεια</string>
<string name="use_previous">Χρήση προηγούμενου τίτλου/περιγραφής</string>
<string name="allow_gps">Αυτόματη ανάκτηση τρέχουσας θέσης</string>
<string name="allow_gps_summary">Ανάκτηση τρέχουσας τοποθεσία για να σας προσφέρουμε προτάσεις κατηγοριών αν η εικόνα δεν είναι γεωσεσημασμένη.</string>
<string name="allow_gps_summary">Ανακτά την τρέχουσα τοποθεσία εάν η εικόνα δεν είναι γεωσεσημασμένη, και τις γεωσημάνσεις με αυτή. Προειδοποίηση: Αυτό θα αποκαλύψει την τρέχουσα τοποθεσία σας.</string>
<string name="preference_theme">Νυχτερινή λειτουργία</string>
<string name="preference_theme_summary">Χρήση σκοτεινού θέματος</string>
<string name="license_name_cc_by_sa_four"> Attribution-ShareAlike 4.0</string>
@ -282,6 +282,10 @@
<string name="share_app_title">Κοινοποίηση εφαρμογής</string>
<string name="share_coordinates_not_present">Οι συντεταγμένες δεν ορίστηκαν κατά την διάρκεια της επιλογής εικόνας</string>
<string name="error_fetching_nearby_places">Σφάλμα κατά την εύρεση κοντινών μερών.</string>
<string name="appwidget_img">Φωτογραφία της Ημέρας</string>
<string name="app_widget_heading">Φωτογραφία της Ημέρας</string>
<string name="successful_wikidata_edit">Η εικόνα προστέθηκε επιτυχώς στο %1$s στο Wikidata!</string>
<string name="wikidata_edit_failure">Αποτυχία ενημέρωσης της αντιστοιχούσας οντότητας του Wikidata!</string>
<string name="menu_set_wallpaper">Ρύθμιση ταπετσαρίας</string>
<string name="wallpaper_set_successfully">Η ταπετσαρία ρυθμίστηκε επιτυχώς!</string>
</resources>

View file

@ -30,7 +30,7 @@
<string name="login_success">Acceso correcto.</string>
<string name="login_failed">Acceso fallido.</string>
<string name="upload_failed">No se encontró el archivo. Prueba con otro.</string>
<string name="authentication_failed">Falló la autenticación.</string>
<string name="authentication_failed">Falló la autenticación; prueba a acceder otra vez</string>
<string name="uploading_started">Ha comenzado la carga.</string>
<string name="upload_completed_notification_title">Se ha cargado %1$s.</string>
<string name="upload_completed_notification_text">Pulsa para ver tu subida</string>
@ -112,7 +112,7 @@
<string name="preference_license">Licencia predeterminada</string>
<string name="use_previous">Usar título/descripción anteriores</string>
<string name="allow_gps">Obtener ubicación actual automáticamente</string>
<string name="allow_gps_summary">Recuperar ubicación actual para ofrecer sugerencias de categorías si la imagen no tiene etiquetas geográficas</string>
<string name="allow_gps_summary" fuzzy="true">Recuperar ubicación actual para ofrecer sugerencias de categorías si la imagen no tiene etiquetas geográficas</string>
<string name="preference_theme">Modo nocturno</string>
<string name="preference_theme_summary">Usar tema oscuro</string>
<string name="license_name_cc_by_sa_four"> Atribución-CompartirIgual 4.0</string>
@ -276,4 +276,6 @@
<string name="share_app_title">Compartir aplicación</string>
<string name="share_coordinates_not_present">No se especificaron las coordenadas al seleccionar la imagen</string>
<string name="error_fetching_nearby_places">Error al recuperar los lugares cercanos.</string>
<string name="appwidget_img">Foto del día</string>
<string name="app_widget_heading">Foto del día</string>
</resources>

View file

@ -25,7 +25,7 @@
<string name="login_success">Saio hasiera egina</string>
<string name="login_failed">Saio hasieran akatsa!</string>
<string name="upload_failed">Fitxategia ez da aurkitu. Mesedez saiatu beste batekin.</string>
<string name="authentication_failed">Autentifikazioan akatsa!</string>
<string name="authentication_failed" fuzzy="true">Autentifikazioan akatsa!</string>
<string name="uploading_started">Igoera hasi da!</string>
<string name="upload_completed_notification_title">%1$s igotzen!</string>
<string name="upload_completed_notification_text">Ukitu igotakoa ikusteko</string>

View file

@ -28,7 +28,7 @@
<string name="login_success">ورود موفق!</string>
<string name="login_failed">ورود ناموفق!</string>
<string name="upload_failed">پرونده یافت نشد لطفاً پرونده دیگری را امتحان کنید.</string>
<string name="authentication_failed">تأیید اعتبار انجام نشد!</string>
<string name="authentication_failed" fuzzy="true">تأیید اعتبار انجام نشد!</string>
<string name="uploading_started">بارگذاری آغاز شد!</string>
<string name="upload_completed_notification_title">%1$s بارگذاری شد!</string>
<string name="upload_completed_notification_text">برای دیدن بارگذاریتان بر روی صفحه انگشت بزنید</string>
@ -104,7 +104,7 @@
<string name="preference_license">مجوز پیش‌فرض</string>
<string name="use_previous">از عنوان/توضیحات پیشین استفاده کنید</string>
<string name="allow_gps">دریافت خودکار موقعیت کنونی</string>
<string name="allow_gps_summary">درحال دریافت موقعیت برای پیشنهاد رده در صورتی که برچسب جغرافیایی وجود نداشته باشد.</string>
<string name="allow_gps_summary" fuzzy="true">درحال دریافت موقعیت برای پیشنهاد رده در صورتی که برچسب جغرافیایی وجود نداشته باشد.</string>
<string name="preference_theme">حالت شبانه</string>
<string name="preference_theme_summary">استفاده از حالت تیره</string>
<string name="license_name_cc_by_sa_four">CC Attribution-ShareAlike 4.0</string>

View file

@ -30,7 +30,7 @@
<string name="login_success">Kirjautuminen onnistui!</string>
<string name="login_failed">Kirjautuminen epäonnistui!</string>
<string name="upload_failed">Tiedostoa ei löytynyt. Yritä toista tiedostoa.</string>
<string name="authentication_failed">Tunnistautuminen epäonnistui!</string>
<string name="authentication_failed" fuzzy="true">Tunnistautuminen epäonnistui!</string>
<string name="uploading_started">Tallentaminen aloitettiin!</string>
<string name="upload_completed_notification_title">%1$s tallennettiin!</string>
<string name="upload_completed_notification_text">Napauta katsoaksesi tallennusta</string>
@ -110,7 +110,7 @@
<string name="preference_license">Oletuslisenssi</string>
<string name="use_previous">Käytä edellistä otsikkoa/kuvausta</string>
<string name="allow_gps">Hae tämänhetkinen sijainti automaattisesti</string>
<string name="allow_gps_summary">Nouda nykyinen sijainti asettaaksesi käyttöön luokkaehdotuksia jos kuva ei ole paikkamerkitty</string>
<string name="allow_gps_summary" fuzzy="true">Nouda nykyinen sijainti asettaaksesi käyttöön luokkaehdotuksia jos kuva ei ole paikkamerkitty</string>
<string name="preference_theme">Yötila</string>
<string name="preference_theme_summary">Käytä tummaa teemaa</string>
<string name="license_name_cc_by_sa_four">Nimeä-JaaSamoin 4.0</string>

View file

@ -12,7 +12,7 @@
<string name="logging_in_message" fuzzy="true">Vinarliga bíða…</string>
<string name="login_success">Innritan væleydnað!</string>
<string name="login_failed">Innritan miseydnaðist</string>
<string name="authentication_failed">Góðkenning miseydnaðist!</string>
<string name="authentication_failed" fuzzy="true">Góðkenning miseydnaðist!</string>
<string name="uploading_started">Upplóting er byrjað!</string>
<string name="upload_completed_notification_title">%1$s er lagt út!</string>
<string name="upload_completed_notification_text">Trýst fyri at síggja tað sum tú legði út</string>

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Authors:
* Fitoschido
* Friday83260
* Gomoko
* Happy13241
* Jean-Frédéric
@ -37,7 +38,7 @@
<string name="login_success">Connexion réussie !</string>
<string name="login_failed">Échec de la connexion !</string>
<string name="upload_failed">Fichier non trouvé. Veuillez en essayer un autre.</string>
<string name="authentication_failed">Échec de lauthentification !</string>
<string name="authentication_failed">Échec de l\'authentification, veuillez vous reconnecter s\'il vous plait</string>
<string name="uploading_started">Téléversement démarré !</string>
<string name="upload_completed_notification_title">%1$s téléversés !</string>
<string name="upload_completed_notification_text">Appuyer pour voir votre téléversement</string>
@ -119,7 +120,7 @@
<string name="preference_license">Licence par défaut</string>
<string name="use_previous">Utiliser le titre ou la description précédent</string>
<string name="allow_gps">Obtenir automatiquement lemplacement actuel</string>
<string name="allow_gps_summary">Récupérer lemplacement actuel pour proposer des suggestions de catégorie si limage nest pas marquée géographiquement</string>
<string name="allow_gps_summary">Récupère lemplacement actuel si limage nest pas marquée géographiquement, et marque géographiquement limage avec. Avertissement : Cela dévoilera votre emplacement actuel.</string>
<string name="preference_theme">Mode de nuit</string>
<string name="preference_theme_summary">Utiliser un thème sombre</string>
<string name="license_name_cc_by_sa_four"> Attribution-ShareAlike 4.0</string>
@ -289,6 +290,10 @@
<string name="share_app_title">Partager les applications</string>
<string name="share_coordinates_not_present">Les coordonnées n\'ont pas été spécifiées pendant la sélection de l\'image</string>
<string name="error_fetching_nearby_places">Erreur durant l\'exploration du voisinage.</string>
<string name="appwidget_img">Image du jour</string>
<string name="app_widget_heading">Image du jour</string>
<string name="successful_wikidata_edit">Image bien ajoutée à %1$s sur Wikidata!</string>
<string name="wikidata_edit_failure">Échec de la mise à jour de l\'entité Wikidata correspondante!</string>
<string name="menu_set_wallpaper">Définir le papier-peint</string>
<string name="wallpaper_set_successfully">Papier-peint configuré avec succès!</string>
</resources>

View file

@ -15,7 +15,7 @@
<string name="login_success">Uunmeldin hää loket!</string>
<string name="login_failed">Bi\'t uunmeldin as wat skiaf gingen.</string>
<string name="upload_failed">Datei ei fünjen. Ferschük det mä en ööder datei.</string>
<string name="authentication_failed">Dü küdst ei gudkäänd wurd!</string>
<string name="authentication_failed" fuzzy="true">Dü küdst ei gudkäänd wurd!</string>
<string name="uploading_started">Huuchschüüren hää begand!</string>
<string name="upload_completed_notification_title">%1$s huuchschüürd!</string>
<string name="upload_completed_notification_text">Tipe, am din huuchschüürd bil uuntulukin</string>
@ -92,7 +92,7 @@
<string name="preference_license" fuzzy="true">Lisens</string>
<string name="use_previous">Ual tiitel/beskriiwang brük</string>
<string name="allow_gps">Aktuel plak automaatisk ufrep</string>
<string name="allow_gps_summary">Rept di aktuel plak uf, am kategoriin föörtuslauen, wan det bil nian geotags hää.</string>
<string name="allow_gps_summary" fuzzy="true">Rept di aktuel plak uf, am kategoriin föörtuslauen, wan det bil nian geotags hää.</string>
<string name="preference_theme">Naacht muude</string>
<string name="preference_theme_summary">Jonk skak brük</string>
<string name="license_name_cc_by_sa_four">Attribution-ShareAlike 4.0</string>

View file

@ -27,7 +27,7 @@
<string name="login_success">Accedeu correctamente!</string>
<string name="login_failed">Erro durante o inición de sesión!</string>
<string name="upload_failed">Ficheiro non atopado. Por favor, probe con outro.</string>
<string name="authentication_failed">Erro durante a autenticación!</string>
<string name="authentication_failed" fuzzy="true">Erro durante a autenticación!</string>
<string name="uploading_started">A carga comezou!</string>
<string name="upload_completed_notification_title">Cargouse \"%1$s\"!</string>
<string name="upload_completed_notification_text">Prema para ollar a súa carga</string>
@ -55,6 +55,7 @@
<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_wrong_credentials">Non se pode acceder. Revise o nome de usuario e o 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>
@ -108,7 +109,7 @@
<string name="preference_license">Licenza por defecto</string>
<string name="use_previous">Usar o título ou a descrición anterior</string>
<string name="allow_gps">Obter automaticamente a localización actual</string>
<string name="allow_gps_summary">Obter a localización actual para ofrecer suxestións de categoría se a imaxe non está xeolocalizada</string>
<string name="allow_gps_summary" fuzzy="true">Obter a localización actual para ofrecer suxestións de categoría se a imaxe non está xeolocalizada</string>
<string name="preference_theme">Modo nocturno</string>
<string name="preference_theme_summary">Usar tema escuro</string>
<string name="license_name_cc_by_sa_four"> Recoñecemento-CompartirIgual 4.0</string>
@ -267,4 +268,16 @@
<string name="about_translate_proceed">Proceder</string>
<string name="about_translate_cancel">Cancelar</string>
<string name="retry">Reintentar</string>
<string name="showcase_view_got_it_button">Entendido!</string>
<string name="showcase_view_whole_nearby_activity">Hai sitios preto de vostede que precisan fotos para ilustrar os seus artigos de Wikipedia</string>
<string name="showcase_view_list_icon">Premendo neste botón aparecerá unha lista destes lugares</string>
<string name="showcase_view_plus_fab">Pode cargar unha imaxe de calquera lugar dende a galería ou a cámara</string>
<string name="no_images_found">Non se atopou ningunha imaxeǃ</string>
<string name="error_loading_images">Houbo un erro ó subir as imaxes.</string>
<string name="image_uploaded_by">Subida porː %1$s</string>
<string name="share_app_title">Compartir a aplicación</string>
<string name="share_coordinates_not_present">Non se indicaron as coordenadas ó seleccionar a imaxe</string>
<string name="error_fetching_nearby_places">Erro ó procurar os lugares próximos.</string>
<string name="menu_set_wallpaper">Definir imaxe de fondo</string>
<string name="wallpaper_set_successfully">A imaxe de fondo configurouse correctamenteǃ</string>
</resources>

View file

@ -12,7 +12,7 @@
<string name="logging_in_message">E kali ke ʻoluʻolu…</string>
<string name="login_success">ʻEʻe kūleʻa</string>
<string name="login_failed">ʻule ka ʻeʻena</string>
<string name="authentication_failed">ʻule ka hōʻoiaʻiʻo ʻike</string>
<string name="authentication_failed" fuzzy="true">ʻule ka hōʻoiaʻiʻo ʻike</string>
<string name="uploading_started">Ua hoʻomaka ka hoʻouka!</string>
<string name="upload_completed_notification_title">Ua hoʻouka ʻia ʻo %1$s</string>
<string name="upload_completed_notification_text">Kīkē no ka ʻike ʻana o kāu hoʻouka</string>

View file

@ -26,7 +26,7 @@
<string name="login_success">प्रवेश में सफल हुआ!</string>
<string name="login_failed">प्रवेश विफल हुआ!</string>
<string name="upload_failed">फ़ाइल नहीं मिली, कृपया अन्य फ़ाइल से प्रयास करें।</string>
<string name="authentication_failed">प्रमाणीकरण विफल!</string>
<string name="authentication_failed" fuzzy="true">प्रमाणीकरण विफल!</string>
<string name="uploading_started">अपलोड आरंभ!</string>
<string name="upload_completed_notification_title">%1$s अपलोड हुआ!</string>
<string name="upload_completed_notification_text">अपना अपलोड देखने के लिए टैप करें</string>
@ -104,7 +104,7 @@
<string name="preference_license" fuzzy="true">लाइसेन्स</string>
<string name="use_previous">पिछले शीर्षक/विवरण का उपयोग करें</string>
<string name="allow_gps">वर्तमान स्थान स्वतः ज्ञात करें</string>
<string name="allow_gps_summary">यदि छवि पर जियोटैग नहीं है तो श्रेणियों के सुझाव हेतु वर्तमान स्थान ज्ञात करें।</string>
<string name="allow_gps_summary" fuzzy="true">यदि छवि पर जियोटैग नहीं है तो श्रेणियों के सुझाव हेतु वर्तमान स्थान ज्ञात करें।</string>
<string name="preference_theme">रात्रि मोड</string>
<string name="preference_theme_summary">डार्क थीम का प्रयोग करें</string>
<string name="license_name_cc_by_sa_four">एट्रीब्यूशन-शेयरअलाइक 4.0</string>

View file

@ -21,7 +21,7 @@
<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="authentication_failed" fuzzy="true">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>
@ -103,7 +103,7 @@
<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="allow_gps_summary" fuzzy="true">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>

View file

@ -13,7 +13,7 @@
<string name="logging_in_message" fuzzy="true">Bittschön woorte …</string>
<string name="login_success">Oonmeldung erfollichreich!</string>
<string name="login_failed">Oonmeldung fehlgeschlooht!</string>
<string name="authentication_failed">Authentifizierung fehlgeschlooht!</string>
<string name="authentication_failed" fuzzy="true">Authentifizierung fehlgeschlooht!</string>
<string name="uploading_started">Hochloode oongefang!</string>
<string name="upload_completed_notification_title">„%1$s“ hochgelood!</string>
<string name="upload_completed_notification_text">Tippe mit dein Fingerspitze, um dein Upload (Ufflloodung) oonzusiehn</string>

View file

@ -12,7 +12,7 @@
<string name="logging_in_message">Prošu čakaj…</string>
<string name="login_success">Přizjewjenje wuspěšne!</string>
<string name="login_failed">Přizjewjenje je so njeporadźiło!</string>
<string name="authentication_failed">Awtentifikacija je so njeporadźiła!</string>
<string name="authentication_failed" fuzzy="true">Awtentifikacija je so njeporadźiła!</string>
<string name="uploading_started">Nahraće je so započało!</string>
<string name="upload_completed_notification_title">%1$s nahraty!</string>
<string name="upload_completed_notification_text">Dótkń so, zo by swoje nahraće widźał</string>

View file

@ -31,7 +31,7 @@
<string name="login_success">Sikeres bejelentkezés</string>
<string name="login_failed">A bejelentkezés nem sikerült.</string>
<string name="upload_failed">A fájl nem található. Próbálkozz másik fájllal.</string>
<string name="authentication_failed">Sikertelen hitelesítés.</string>
<string name="authentication_failed" fuzzy="true">Sikertelen hitelesítés.</string>
<string name="uploading_started">Feltöltés elindult.</string>
<string name="upload_completed_notification_title">%1$s feltöltve.</string>
<string name="upload_completed_notification_text">Feltöltés megtekintése</string>
@ -113,7 +113,7 @@
<string name="preference_license">Alapértelmezett licenc</string>
<string name="use_previous">Előző cím/leírás használata</string>
<string name="allow_gps">Automatikusan megkapja a jelenlegi helyet</string>
<string name="allow_gps_summary">Lekéri a jelenlegi helyet, hogy lehetőség legyen kategóriajavaslatokra a nem földrajzi címkézett képeknél.</string>
<string name="allow_gps_summary" fuzzy="true">Lekéri a jelenlegi helyet, hogy lehetőség legyen kategóriajavaslatokra a nem földrajzi címkézett képeknél.</string>
<string name="preference_theme">Éjszakai mód</string>
<string name="preference_theme_summary">Sötét téma használata</string>
<string name="license_name_cc_by_sa_four">Nevezd meg! Így add tovább! 4.0</string>

View file

@ -19,7 +19,7 @@
<string name="login_success">Berhasil masuk log!</string>
<string name="login_failed">Masuk log gagal!</string>
<string name="upload_failed" fuzzy="true">Berkas tidak ditemukan, silakan coba berkas lain</string>
<string name="authentication_failed">Autentikasi gagal!</string>
<string name="authentication_failed" fuzzy="true">Autentikasi gagal!</string>
<string name="uploading_started">Mulai unggah!</string>
<string name="upload_completed_notification_title">%1$s terunggah!</string>
<string name="upload_completed_notification_text">Tekan untuk melihat unggahan Anda</string>

View file

@ -21,7 +21,7 @@
<string name="login_success">Innskráning tókst!</string>
<string name="login_failed">Innskráning mistókst!</string>
<string name="upload_failed">Skráin fannst ekki. Prófaðu aðra skrá.</string>
<string name="authentication_failed">Auðkenning tókst ekki!</string>
<string name="authentication_failed" fuzzy="true">Auðkenning tókst ekki!</string>
<string name="uploading_started">Innsending í gangi!</string>
<string name="upload_completed_notification_title">%1$s var sent inn!</string>
<string name="upload_completed_notification_text">Bankaðu til að skoða sem þú ert að senda inn</string>
@ -102,7 +102,7 @@
<string name="preference_license">Sjálfgefið notkunarleyfi</string>
<string name="use_previous">Nota fyrri titil/lýsingu</string>
<string name="allow_gps">Ná sjálfvirkt í núverandi staðsetningu</string>
<string name="allow_gps_summary">Lesa núverandi staðsetningu til að geta stungið upp á flokkum ef myndin er ekki með hnattstaðsetningarhnitum</string>
<string name="allow_gps_summary" fuzzy="true">Lesa núverandi staðsetningu til að geta stungið upp á flokkum ef myndin er ekki með hnattstaðsetningarhnitum</string>
<string name="preference_theme">Næturhamur</string>
<string name="preference_theme_summary">Nota dökkt þema</string>
<string name="license_name_cc_by_sa_four"> Attribution-ShareAlike 4.0</string>

View file

@ -26,7 +26,7 @@
<string name="login_success">Accesso effettuato!</string>
<string name="login_failed">Accesso non riuscito!</string>
<string name="upload_failed">File non trovato. Prova con un altro file.</string>
<string name="authentication_failed">Autenticazione non riuscita!</string>
<string name="authentication_failed">Autenticazione non riuscita, si prega di riprovare</string>
<string name="uploading_started">Caricamento iniziato!</string>
<string name="upload_completed_notification_title">%1$s caricato!</string>
<string name="upload_completed_notification_text">Premi per vedere i tuoi caricamenti</string>
@ -228,4 +228,6 @@
<string name="error_loading_images">Si è verificato un errore durante il caricamento delle immagini.</string>
<string name="image_uploaded_by">Caricato da: %1$s</string>
<string name="share_app_title">Condividi applicazione</string>
<string name="appwidget_img">Foto del giorno</string>
<string name="app_widget_heading">Foto del giorno</string>
</resources>

View file

@ -30,7 +30,7 @@
<string name="login_success">הכניסה הצליחה</string>
<string name="login_failed">הכניסה נכשלה!</string>
<string name="upload_failed">הקובץ לא נמצא. נא לנסות קובץ אחר.</string>
<string name="authentication_failed">אימות הפרטים נכשל</string>
<string name="authentication_failed">אימות הפרטים נכשל, נא להיכנס מחדש</string>
<string name="uploading_started">ההעלאה התחילה!</string>
<string name="upload_completed_notification_title">הקובץ %1$s הועלה!</string>
<string name="upload_completed_notification_text">ללחוץ כאן כדי לצפות בהעלאה שלך</string>
@ -112,7 +112,7 @@
<string name="preference_license">רישיון ברירת מחדל</string>
<string name="use_previous">להשתמש בכותרת ובתיאור קודמים</string>
<string name="allow_gps">לקבל אוטומטית את המיקום הנוכחי</string>
<string name="allow_gps_summary">לאחזר את המיקום הנוכחי כדי להציע קטגוריות אם בתמונה אין תגי מיקום</string>
<string name="allow_gps_summary">אחזור המיקום הנוכחי אם אין בתמונה תגי מיקום, וכן הוספת תגי מיקום לתמונה. אזהרה: פעולה זו תחשוף את המיקום הנוכחי שלך.</string>
<string name="preference_theme">מצב לילה</string>
<string name="preference_theme_summary">שימוש במצב לילה</string>
<string name="license_name_cc_by_sa_four">ייחוס–שיתוף זהה 4.0</string>
@ -282,6 +282,10 @@
<string name="share_app_title">שיתוף היישום</string>
<string name="share_coordinates_not_present">לא צוינו קואורדינטות בעת בחירת התמונה</string>
<string name="error_fetching_nearby_places">שגיאה באחזור המקומות בסביבתך.</string>
<string name="appwidget_img">תמונת היום</string>
<string name="app_widget_heading">תמונת היום</string>
<string name="successful_wikidata_edit">התמונה נוספה בהצלחה ל־%1$s בוויקינתונים!</string>
<string name="wikidata_edit_failure">לא ניתן היה לעדכן הישות המתאימה בוויקינתונים!</string>
<string name="menu_set_wallpaper">הגדרת רקע</string>
<string name="wallpaper_set_successfully">הרקע הוגדר בהצלחה!</string>
</resources>

View file

@ -30,7 +30,7 @@
<string name="login_success">ログインしました!</string>
<string name="login_failed">ログインに失敗しました!</string>
<string name="upload_failed">ファイルが見つかりません。別のファイルでお試しください。</string>
<string name="authentication_failed">認証に失敗しました!</string>
<string name="authentication_failed">認証に失敗しました! もう一度ログインしてください</string>
<string name="uploading_started">アップロードを開始しました!</string>
<string name="upload_completed_notification_title">%1$s をアップロードしました!</string>
<string name="upload_completed_notification_text">アップロードしたものを表示するにはタップしてください</string>
@ -58,9 +58,10 @@
<string name="add_title_toast">ファイル名をつけてください</string>
<string name="share_description_hint">説明</string>
<string name="login_failed_network">ログインできません - ネットワークのエラーです</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>
<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>
@ -110,7 +111,7 @@
<string name="preference_license">既定のライセンス</string>
<string name="use_previous">前回のタイトルと記述を使用</string>
<string name="allow_gps">現在の位置を自動的に取得</string>
<string name="allow_gps_summary">画像にジオタグが付いていない場合、現在の位置を取得してカテゴリを提案</string>
<string name="allow_gps_summary">Retrieves current location if image is not geotagged, \n画像にジオタグが付いていない場合、現在の位置を取得して画像に添付。ご注意: 自分の現在地が明示されます。</string>
<string name="preference_theme">夜モード</string>
<string name="preference_theme_summary">暗いテーマを使う</string>
<string name="license_name_cc_by_sa_four">表示-継承 4.0</string>
@ -184,7 +185,7 @@
<string name="media_detail_coordinates_empty">情報なし</string>
<string name="become_a_tester_title">ベータ版を使ってみましょう!</string>
<string name="become_a_tester_description">Google Playのベータ版チャンネルにオプトインして、新機能やバグ修正プログラムに早期にアクセス</string>
<string name="_2fa_code">2FA コード</string>
<string name="_2fa_code">2段階認証コード</string>
<string name="number_of_uploads">最近のアップロードファイルに表示する最大件数</string>
<string name="maximum_limit">最大限</string>
<string name="maximum_limit_alert">表示できるのは500件以下です</string>
@ -279,4 +280,10 @@
<string name="share_app_title">アプリをシェアする</string>
<string name="share_coordinates_not_present">画像の選択中に位置情報を特定できませんでした</string>
<string name="error_fetching_nearby_places">付近の場所を取得しようとしてエラーが発生しました。</string>
<string name="appwidget_img">今日の一枚</string>
<string name="app_widget_heading">今日の一枚</string>
<string name="successful_wikidata_edit">ウィキデータの%1$sに画像を追加しました !</string>
<string name="wikidata_edit_failure">対応するウィキデータの更新に失敗しました!</string>
<string name="menu_set_wallpaper">壁紙の設定</string>
<string name="wallpaper_set_successfully">壁紙の設定ができました!</string>
</resources>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Authors:
* Har-wradim
* פוילישער
-->
<resources>
@ -17,7 +18,7 @@
<string name="login_success">אריינלאגירט מיט הצלחה!</string>
<string name="login_failed">ארײַנלאגירן אדורכגעפאלן!</string>
<string name="upload_failed">טעקע נישט געראפן. פרובירט אפשר אן אנדער טעקע.</string>
<string name="authentication_failed">אויטענטיפֿיצירן דורכגעפֿאלן!</string>
<string name="authentication_failed" fuzzy="true">אויטענטיפֿיצירן דורכגעפֿאלן!</string>
<string name="uploading_started">ארויפלאדן אנגעהויבן!</string>
<string name="upload_completed_notification_title">%1$s ארויפגעלאדן!!</string>
<string name="upload_completed_notification_text">דרוקט צו זען אײַער ארויפֿלאד</string>
@ -115,4 +116,7 @@
<string name="navigation_item_feedback">פֿידבעק</string>
<string name="navigation_item_logout">אַרויסלאָגירן</string>
<string name="navigation_item_featured_images">רעקאמנדירט</string>
<string name="appwidget_img">בילד פונעם טאָג</string>
<string name="app_widget_heading">בילד פונעם טאָג</string>
<string name="wikidata_edit_failure">ס׳איז ניט געלונגען צו דערהיינטיקן דעם אַנטשפּרעכנדיקן בלאַט אין וויקידאַטן.</string>
</resources>

View file

@ -14,7 +14,7 @@
<string name="login_success">Kasil mlebu log!</string>
<string name="login_failed">Wurung mlebu log!</string>
<string name="upload_failed">Barkas ora katemu. Jajalana barkas liyané.</string>
<string name="authentication_failed">Wurung otèntifikasi!</string>
<string name="authentication_failed" fuzzy="true">Wurung otèntifikasi!</string>
<string name="uploading_started">Wiwit ngunggah!</string>
<string name="upload_completed_notification_title">%1$s kaunggah!</string>
<string name="upload_completed_notification_text">Dudul saperlu ndeleng unggahané panjenengan</string>

View file

@ -15,7 +15,7 @@
<string name="login_success">სისტემაში შესვლა წარმატებით განხორციელდა!</string>
<string name="login_failed">სისტემაში შესვლა ვერ განხორციელდა!</string>
<string name="upload_failed">ფაილი არ მოიძებნა. გთხოვთ, სცადოთ სხვა ფაილი.</string>
<string name="authentication_failed">ავთენტიფიკაცია ვერ მოხერხდა!</string>
<string name="authentication_failed" fuzzy="true">ავთენტიფიკაცია ვერ მოხერხდა!</string>
<string name="uploading_started">ატვირთვა დაიწყო!</string>
<string name="upload_completed_notification_title">%1$ ატვირთულია!</string>
<string name="upload_completed_notification_text">დააჭირეთ თქვენი ატვირთვის სანახავად</string>

View file

@ -15,7 +15,7 @@
<string name="login_success">Tuqqna tedda!</string>
<string name="login_failed">Tqqna ur teddi ara!</string>
<string name="upload_failed">Ulac afaylu. Ɛreḍ wayeḍ ma ulac aɣilif.</string>
<string name="authentication_failed">Asesteb yecceḍ!</string>
<string name="authentication_failed" fuzzy="true">Asesteb yecceḍ!</string>
<string name="uploading_started">Asali yebda!</string>
<string name="upload_completed_notification_title">%1$s yuli!</string>
<string name="upload_completed_notification_text">Senned akken ad twaliḍ asali-ik</string>
@ -93,7 +93,7 @@
<string name="preference_license" fuzzy="true">Turagt</string>
<string name="use_previous">Seqdec azwel neɣ aglam yezrin</string>
<string name="allow_gps">Awi s wudem awurman adig amiran</string>
<string name="allow_gps_summary">Awi adig amiran akken ad tsumreḍ taggayt ma yella tugna ur tettwacreḍ ara di tirakalt</string>
<string name="allow_gps_summary" fuzzy="true">Awi adig amiran akken ad tsumreḍ taggayt ma yella tugna ur tettwacreḍ ara di tirakalt</string>
<string name="preference_theme">Askar n yiḍ</string>
<string name="preference_theme_summary">Seqdec asentel aberkan</string>
<string name="license_name_cc_by_sa_four"> Attribution-ShareAlike 4.0</string>

View file

@ -4,56 +4,75 @@
* វ័ណថារិទ្ធ
-->
<resources>
<string name="app_name" fuzzy="true">Wikimedia Commons</string>
<string name="menu_settings">ការកំណត់​នានា</string>
<string name="username">ឈ្មោះអ្នកប្រើប្រាស់</string>
<string name="password">លេខ​សម្ងាត់​</string>
<string name="login">ឡុកអ៊ីន​</string>
<string name="logging_in_title">កំពុងឡុកអ៊ីន​</string>
<string name="logging_in_message">សូមរង់ចាំ…</string>
<string name="login_success">កត់ឈ្មោះចូលបានសំរេច</string>
<string name="login_failed">កត់ឈ្មោះចូលបរាជ័យ</string>
<string name="authentication_failed">Authentication បានបរាជ័យ!</string>
<string name="uploading_started">បានចាប់ផ្តើមការផ្ទុកឡើង!</string>
<string name="upload_completed_notification_title">%1$s បានផ្ទូកឡើងហើយ!</string>
<string name="upload_completed_notification_text">Tap ដើម្បីមើលការផ្ទុកឡើងរបស់អ្នក</string>
<string name="upload_progress_notification_title_start">កំពុងចាប់ផ្តើម ផ្ទុកឡើង %1$s</string>
<string name="upload_progress_notification_title_in_progress">%1$s កំពុងផ្ទូកឡើង</string>
<string name="preference_category_appearance">ការ​រចនា</string>
<string name="preference_category_general">ទូទៅ​</string>
<string name="preference_category_feedback">មតិយោបល់</string>
<string name="preference_category_location">ទីកន្លែង</string>
<string name="app_name">វិគីមេឌារួម</string>
<string name="menu_settings">ការកំណត់​</string>
<string name="username">អត្តនាម</string>
<string name="password">ពាក្យ​សម្ងាត់</string>
<string name="login_credential">កត់ឈ្មោះចូលទៅក្នុងគណនីវិគីមេឌារួមបេតា</string>
<string name="login">កត់ឈ្មោះចូល</string>
<string name="forgot_password">ពេលភ្លេច​ពាក្យ​សម្ងាត់</string>
<string name="signup">ចុះ​ឈ្មោះ</string>
<string name="logging_in_title">កំពុងកត់ឈ្មោះចូល</string>
<string name="logging_in_message">សូមរង់ចាំបន្តិច…</string>
<string name="login_success">កត់ឈ្មោះចូលបានសម្រេច!</string>
<string name="login_failed">កត់ឈ្មោះចូលមិនបានសម្រេច!</string>
<string name="upload_failed">រកមិនឃើញឯកសារទេ។ សូមសាកល្បងជាមួយឯកសារផ្សេងមួយទៀត។</string>
<string name="authentication_failed">ការបញ្ជាក់ទទួលស្គាល់មិនបានសម្រេច។ សូមកត់ឈ្មោះចូលម្ដងទៀត។</string>
<string name="uploading_started">ការផ្ទុកឡើងបានចាប់ផ្តើមហើយ!</string>
<string name="upload_completed_notification_title">បានផ្ទុកឡើង %1$s ហើយ!</string>
<string name="upload_completed_notification_text">ចុចដើម្បីមើលអ្វីដែលអ្នកផ្ទុកឡើង</string>
<string name="upload_progress_notification_title_start">កំពុងចាប់ផ្តើមផ្ទុកឡើង %1$s</string>
<string name="upload_progress_notification_title_in_progress">កំពុងផ្ទុកឡើង %1$s</string>
<string name="upload_progress_notification_title_finishing">កំពុងបញ្ចប់ការផ្ទុកឡើង %1$s</string>
<string name="upload_failed_notification_title">ការផ្ទុកឡើង %1$s បានបរាជ័យ</string>
<string name="upload_failed_notification_subtitle">Tap ដើម្បីមើល</string>
<string name="title_activity_contributions" fuzzy="true">ការផ្ទុកឡើងរបស់ខ្ញុំ</string>
<string name="contribution_state_queued">បានដាក់ក្នុងជួររង់ចាំ</string>
<string name="contribution_state_failed">បានបរាជ័យ</string>
<string name="contribution_state_in_progress">%1$d%% រួចរាល់</string>
<string name="upload_failed_notification_title">ការផ្ទុកឡើង %1$s មិនបានសម្រេច</string>
<string name="upload_failed_notification_subtitle">ចុចដើម្បីមើល</string>
<string name="title_activity_contributions">អ្វីដែលខ្ញុំផ្ទុកឡើងថ្មីៗ</string>
<string name="contribution_state_queued">ក្នុងជួររង់ចាំ</string>
<string name="contribution_state_failed">មិនបានសម្រេច</string>
<string name="contribution_state_in_progress">រួចរាល់​បាន %1$d%%</string>
<string name="contribution_state_starting">កំពុង​ផ្ទុកឡើង​</string>
<string name="menu_from_gallery">ពីវិចិត្រសាល</string>
<string name="menu_from_camera">ថតរូប</string>
<string name="provider_contributions">ការផ្ទុកឡើងរបស់ខ្ញុំ</string>
<string name="menu_share">ចែករំលែក</string>
<string name="menu_open_in_browser">មើលក្នុង browser</string>
<string name="menu_nearby">ជិតខាង</string>
<string name="provider_contributions">អ្វីដែលខ្ញុំផ្ទុកឡើង</string>
<string name="menu_share">ចែកចាយ</string>
<string name="menu_open_in_browser">មើលក្នុងឧបករណ៍រាយរក</string>
<string name="share_title_hint">ចំណងជើង</string>
<string name="share_description_hint">បរិយាយ</string>
<string name="login_failed_network">មិនអាចកត់ឈ្មោះចូល - បណ្តាញ network បរាជ័យ</string>
<string name="login_failed_throttled" fuzzy="true">ការព្យាយាមមិនបានសម្រេចមានចំនួនច្រើនដងពេក។ សូមព្យាយាមម្តងទៀតនៅប៉ុន្មាននាទីក្រោយ។</string>
<string name="login_failed_blocked">សូមអភ័យទោស អ្នកប្រើប្រាស់រូបនេះត្រូវបានហាមឃាត់នៅ Commons</string>
<string name="login_failed_generic">កត់ឈ្មោះចូលបរាជ័យ</string>
<string name="add_title_toast">សូមដាក់ចំណងជើងអោយឯកសារនេះ</string>
<string name="share_description_hint">ការពិពណ៌នា</string>
<string name="login_failed_network">មិនអាចកត់ឈ្មោះចូលបានទេ ព្រោះបណ្ដាញកំពុងមានបញ្ហា។</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>
<string name="login_failed_generic">កត់ឈ្មោះចូលមិនបានសម្រេច</string>
<string name="share_upload_button">ផ្ទុកឡើង</string>
<string name="multiple_share_base_title">ដាក់ឈ្មោះឲ្យសំនុំនេះ</string>
<string name="provider_modifications">បម្រែបម្រួល</string>
<string name="menu_upload_single">ផ្ទុកឡើង</string>
<string name="categories_search_text_hint">ស្វែងរកចំណាត់ថ្នាក់ក្រុម</string>
<string name="menu_save_categories">រក្សាទុក</string>
<string name="refresh_button">ផ្ទុកឡើងវិញ</string>
<string name="display_list_button">បញ្ជី</string>
<string name="gps_disabled">ឧបករណ៍របស់អ្នកកំពុងបិទមិនប្រើGPS។ តើអ្នកចង់បើកវាប្រើទេ?</string>
<string name="enable_gps">បើកប្រើGPS</string>
<string name="contributions_subtitle_zero">គ្មានអ្វីដែលបានផ្ទុកឡើងទេ</string>
<string name="categories_not_found">រកមិនឃើញចំណាត់ថ្នាក់ក្រុមដែលត្រូវនឹង %1$s ទេ</string>
<string name="categories_skip_explanation" fuzzy="true">បន្ថែមចំណាត់ថ្នាក់ក្រុមអោយរូបភាពរបស់អ្នកដើម្បីអោយងាយស្រួលស្វែងរក្នុង Wikimedia Commons។\nចាប់ផ្ដើមវាយបញ្ចូលឈ្មោះចំណាត់ថ្នាក់ក្រុម។\nចុចលើសារនេះ (ឬចុចប៊ូតុងត្រលប់ក្រោយ)ដើម្បីរំលងជំហ៊ាននេះ។</string>
<string name="categories_skip_explanation">បន្ថែមចំណាត់ថ្នាក់ក្រុមអោយរូបភាពរបស់អ្នកដើម្បីអោយងាយស្រួលស្វែងរកក្នុងវិគីមេឌារួម។ ចាប់ផ្ដើមវាយបញ្ចូលឈ្មោះចំណាត់ថ្នាក់ក្រុម។</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" fuzzy="true">សូហ្វវែរប្រភពបើកទូលាយត្រូវបានចេញផ្សាយក្រោមអាជ្ញាបណ្ណ &lt;a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\"&gt;Apache License v2&lt;/a&gt;</string>
<string name="about_improve" fuzzy="true">ប្រភពកូដមាននៅ &lt;a href=\"https://github.com/commons-app/apps-android-commons\"&gt;GitHub&lt;/a&gt;. Bugs មាននៅ &lt;a href=\" https://github.com/commons-app/apps-android-commons/issues\"&gt;Github&lt;/a&gt;.</string>
<string name="about_privacy_policy" fuzzy="true">&lt;a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\"&gt;គោលការភាពជាឯកជន&lt;/a&gt;</string>
<string name="about_privacy_policy">&lt;a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\"&gt;គោលការភាពឯកជន&lt;/a&gt;</string>
<string name="title_activity_about">អំពី</string>
<string name="menu_feedback">ផ្ញើមតិកែលម្អ (តាមអ៊ីមែល)</string>
<string name="menu_feedback">ផ្ញើមតិយោបល់ (តាមអ៊ីមែល)</string>
<string name="provider_categories">ចំណាត់ថ្នាក់ក្រុមដែលត្រូវបានប្រើថ្មីៗ</string>
<string name="waiting_first_sync">កំពុងរង់ចាំ ធ្វើការ sync ជាលើកដំបូង…</string>
<string name="no_uploads_yet">អ្នកមិនទាន់បានផ្ទុករូបថតណាមួយឡើងនៅឡើយទេ។</string>
@ -90,4 +109,25 @@
<string name="detail_description_empty">គ្មាន​ការ​ពណ៌នា</string>
<string name="detail_license_empty">Unknown license</string>
<string name="menu_refresh">ធ្វើឱ្យស្រស់</string>
<string name="background_image">រូបភាពផ្ទៃខាងក្រោយ</string>
<string name="no_image_found">គ្មានរូបភាព</string>
<string name="upload_image">ផ្ទុករូបភាពឡើង</string>
<string name="welcome_image_mount_zao">ភ្នំហ្សាអូ</string>
<string name="welcome_image_rainbow_bridge">ស្ពានឥន្ទធនូ</string>
<string name="cancel">បោះបង់</string>
<string name="navigation_drawer_open">បើក</string>
<string name="navigation_drawer_close">បិទ</string>
<string name="navigation_item_home">ទំព័រដើម</string>
<string name="navigation_item_upload">ផ្ទុកឡើង​</string>
<string name="navigation_item_nearby">ជិតខាង</string>
<string name="navigation_item_about">អំពី</string>
<string name="navigation_item_settings">ការកំណត់​</string>
<string name="navigation_item_feedback">មតិយោបល់</string>
<string name="navigation_item_logout">កត់ឈ្មោះចេញ</string>
<string name="navigation_item_info">រៀនប្រើ</string>
<string name="navigation_item_notification">សារជូនដំណឹង</string>
<string name="navigation_item_featured_images">ឆ្នើម</string>
<string name="no_description_found">គ្មានការពិពណ៌នា</string>
<string name="nearby_info_menu_wikidata_article">វត្ថុក្នុងវិគីទិន្នន័យ</string>
<string name="nearby_info_menu_wikipedia_article">អត្ថបទវិគីភីឌា</string>
</resources>

View file

@ -15,7 +15,7 @@
<string name="login_success">가입 성공!</string>
<string name="login_failed">가입 실패!</string>
<string name="upload_failed">서류를 찾을수 없습니다. 다른 서류를 사용해주십시오.</string>
<string name="authentication_failed">인증 실패!</string>
<string name="authentication_failed" fuzzy="true">인증 실패!</string>
<string name="uploading_started">올리적재를 시작했습니다!</string>
<string name="upload_completed_notification_title">%1$s 서류를 올리적재하였습니다!</string>
<string name="upload_completed_notification_text">당신의 올리적재를 보려면 두드리세요</string>
@ -89,7 +89,7 @@
<string name="preference_license" fuzzy="true">허가권</string>
<string name="use_previous">이전의 제목/설명을 사용하기</string>
<string name="allow_gps">자동으로 현재 위치 얻기</string>
<string name="allow_gps_summary">화상에 지리정보꼬리표가 달려 있지 않다면, 현재 위치를 검색하여 분류를 제안해주십시오</string>
<string name="allow_gps_summary" fuzzy="true">화상에 지리정보꼬리표가 달려 있지 않다면, 현재 위치를 검색하여 분류를 제안해주십시오</string>
<string name="preference_theme">야간방식</string>
<string name="preference_theme_summary">어두운 주제 쓰기</string>
<string name="license_name_cc_by_sa_four">저작자표시-동일조건변경허락 4.0</string>

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Authors:
* CYAN
* Dlsrks1021
* Doyoon1995
* Garam
* Jerrykim306
@ -30,7 +31,7 @@
<string name="login_success">로그인 성공!</string>
<string name="login_failed">로그인 실패!</string>
<string name="upload_failed">파일을 찾을 수 없습니다. 다른 파일을 사용해 주십시오.</string>
<string name="authentication_failed">인증 실패!</string>
<string name="authentication_failed">인증을 실패했습니다. 다시 로그인해 주십시오</string>
<string name="uploading_started">올리기를 시작했습니다!</string>
<string name="upload_completed_notification_title">%1$s 파일을 올렸습니다!</string>
<string name="upload_completed_notification_text">올린 것을 보려면 탭하세요</string>
@ -110,7 +111,7 @@
<string name="preference_license">기본 라이선스</string>
<string name="use_previous">이전의 제목/설명을 사용하기</string>
<string name="allow_gps">자동으로 현재 위치 가져오기</string>
<string name="allow_gps_summary">이미지에 위치 정보가 태그되어 있지 않다면, 현재 위치를 검색하여 분류를 제안해 주십시오</string>
<string name="allow_gps_summary">영상의 위치 태그가 지정되지 않은 경우 현재 위치를 검색하여 영상에 현재 위치로 위치 태그를 지정하십시오. 경고: 당신의 현재 위치가 노출됩니다.</string>
<string name="preference_theme">야간 모드</string>
<string name="preference_theme_summary">어두운 테마 사용</string>
<string name="license_name_cc_by_sa_four"> 저작자표시-동일조건변경허락 4.0</string>
@ -228,6 +229,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="upload_image_too_dark">사진이 너무 어둡습니다. 정말 업로드하겠습니까? 위키미디어 공용은 사전적인 가치가 있는 사진을 위한 공간입니다.</string>
<string name="upload_image_blurry">사진이 흐릿합니다. 정말 업로드하겠습니까? 위키미디어 공용은 사전적인 가치가 있는 사진을 위한 공간입니다.</string>
<string name="give_permission">권한 부여</string>
@ -244,10 +246,13 @@
<string name="nearby_location_has_not_changed">위치가 변경되지 않았습니다.</string>
<string name="nearby_location_not_available">위치를 사용할 수 없습니다.</string>
<string name="location_permission_rationale_nearby">주변 장소의 목록을 표시하기 위한 권한이 필요합니다.</string>
<string name="get_directions">방향을 잡다</string>
<string name="read_article">문서를 읽으세요</string>
<string name="notifications_welcome">%1$s님, 위키미디어 공용에 오신 것을 환영합니다! 반갑습니다.</string>
<string name="notifications_talk_page_message">%1$s님이 당신의 사용자 토론 문서에 글을 남겼습니다</string>
<string name="notifications_thank_you_edit">편집해 주셔서 감사합니다</string>
<string name="notifications_mention">%1$s님이 %2$s에서 나를 언급했습니다.</string>
<string name="toggle_view_button">보기 전환</string>
<string name="nearby_directions">방향</string>
<string name="nearby_wikidata">위키데이터</string>
<string name="nearby_wikipedia">위키백과</string>
@ -275,6 +280,10 @@
<string name="share_app_title">앱 공유</string>
<string name="share_coordinates_not_present">그림 선택 중에 좌표가 지정되지 않았습니다</string>
<string name="error_fetching_nearby_places">주변 장소를 가져오는데 오류가 있습니다.</string>
<string name="appwidget_img">오늘의 사진</string>
<string name="app_widget_heading">오늘의 사진</string>
<string name="successful_wikidata_edit">위키데이터의 %1$s에 그림을 성공적으로 추가했습니다!</string>
<string name="wikidata_edit_failure">일치하는 위키데이터 엔티티의 업데이트를 실패했습니다!</string>
<string name="menu_set_wallpaper">배경화면 설정</string>
<string name="wallpaper_set_successfully">배경화면을 성공적으로 설정했습니다!</string>
</resources>

View file

@ -4,6 +4,7 @@
* Cûndûllah el-Kurdî
* George Animal
* Ghybu
* Kur
-->
<resources>
<string name="preference_category_appearance">Xuyabûn</string>
@ -79,4 +80,6 @@
<string name="give_permission">Destûr bide</string>
<string name="about_faq">&lt;u&gt;Pirsên ku pir têne pirsîn&lt;/u&gt;</string>
<string name="welcome_skip_button">Rênîşandanê derbas bike</string>
<string name="appwidget_img">Wêneya rojê</string>
<string name="app_widget_heading">Wêneya rojê</string>
</resources>

View file

@ -13,7 +13,7 @@
<string name="logging_in_message">Сураныч, күтө туруңуз…</string>
<string name="login_success">Сиз ийгиликтүү кирдиңиз</string>
<string name="login_failed">Системага кирүүдө катачылык бар!</string>
<string name="authentication_failed">Таану катачылыгы!</string>
<string name="authentication_failed" fuzzy="true">Таану катачылыгы!</string>
<string name="uploading_started">Жүктөө башталды!</string>
<string name="upload_completed_notification_title">%1$s жүктөлүүдө</string>
<string name="upload_completed_notification_text">Жүктөлгөн файлды көрүү үчүн басыңыз</string>

View file

@ -23,7 +23,7 @@
<string name="login_success">Umeldung huet geklappt!</string>
<string name="login_failed">D\'Aloggen huet net funktionéiert</string>
<string name="upload_failed">Fichier net fonnt. probéiert w.e.g. en anere Fichier.</string>
<string name="authentication_failed">Authentifizéierung huet net funktionéiert!</string>
<string name="authentication_failed">Authentifizéierung huet net funktionéiert, loggt Iech w.e.g. nach eng Kéier an.</string>
<string name="uploading_started">D\'Eroplueden huet ugefaang!</string>
<string name="upload_completed_notification_title">%1$s eropgelueden!</string>
<string name="upload_completed_notification_text">Dréckt fir de Fichier ze gesinn deen Dir eropgelueden hutt</string>
@ -101,7 +101,7 @@
<string name="preference_license">Standardlizenz</string>
<string name="use_previous">Viregen Titel/Beschreiwung benotzen</string>
<string name="allow_gps">Automatesch déi aktuell Plaz kréien</string>
<string name="allow_gps_summary">Aktuell Plaz ofruffe fir Propose fir Kategorien ze erméigleche wann d\'Bild keng Geotaggen huet</string>
<string name="allow_gps_summary" fuzzy="true">Aktuell Plaz ofruffe fir Propose fir Kategorien ze erméigleche wann d\'Bild keng Geotaggen huet</string>
<string name="preference_theme">Nuetsmodus</string>
<string name="preference_theme_summary">Donkele Layout benotzen</string>
<string name="license_name_cc_by_sa_four">Attribution-ShareAlike 4.0</string>
@ -242,6 +242,9 @@
<string name="no_images_found">Keng Biller fonnt!</string>
<string name="error_loading_images">Feeler beim Eropluede vu Biller.</string>
<string name="image_uploaded_by">Eropgeluede vum: %1$s</string>
<string name="appwidget_img">Bild vum Dag</string>
<string name="app_widget_heading">Bild vum Dag</string>
<string name="wikidata_edit_failure">Déi entspriechend Wikidata-Entitéit konnt net aktualiséiert ginn!</string>
<string name="menu_set_wallpaper">Hannergrondbild festleeën</string>
<string name="wallpaper_set_successfully">Hannergrondbild festgeluecht</string>
</resources>

View file

@ -22,7 +22,7 @@
<string name="login_success">Aanmelje gelök!</string>
<string name="login_failed">Aanmelje mislök!</string>
<string name="upload_failed">Bestandj neet gevónje. Perbeer \'n anger bestandj.</string>
<string name="authentication_failed">Verificatie mislök!</string>
<string name="authentication_failed" fuzzy="true">Verificatie mislök!</string>
<string name="uploading_started">Upload begós!</string>
<string name="upload_completed_notification_title">%1$s upgeloadj!</string>
<string name="upload_completed_notification_text">Wies aan veur dienen upload te betrachte</string>
@ -103,7 +103,7 @@
<string name="preference_license">Standerdlicentie</string>
<string name="use_previous">Gebroek veurige naam/besjrieving</string>
<string name="allow_gps">Haol autematis de hujige locatie op</string>
<string name="allow_gps_summary">Haol de hujige locatie op veur categorieveurstèlle te make wen \'t bild gein geotags haet</string>
<string name="allow_gps_summary" fuzzy="true">Haol de hujige locatie op veur categorieveurstèlle te make wen \'t bild gein geotags haet</string>
<string name="preference_theme">Nachmodus</string>
<string name="preference_theme_summary">Gebroeker duuster thema</string>
<string name="license_name_cc_by_sa_four"> Naamsvermeljing-GeliekDeile 4.0</string>

View file

@ -7,18 +7,25 @@
* Zygimantus
-->
<resources>
<string name="preference_category_appearance">Išvaizda</string>
<string name="preference_category_general">Bendra</string>
<string name="preference_category_feedback">Atsiliepimai</string>
<string name="preference_category_location">Vietovė</string>
<string name="app_name">Vikiteka</string>
<string name="bullet"></string>
<string name="menu_settings">Nustatymai</string>
<string name="username">Naudotojo vardas</string>
<string name="password">Slaptažodis</string>
<string name="login_credential">Prisijunkite prie savo Commons Beta paskyros</string>
<string name="login">Prisijungti</string>
<string name="forgot_password">Pamiršote Slaptažodį?</string>
<string name="signup">Užsiregistruoti</string>
<string name="logging_in_title">Jungiamasi</string>
<string name="logging_in_message">Prašome palaukti…</string>
<string name="login_success">Sėkmingai prisijungėte!</string>
<string name="login_failed">Prisijungti nepavyko!</string>
<string name="upload_failed">Failas nerastas. Prašome pabandyti kitą failą.</string>
<string name="authentication_failed">Autentifikavimas nepavyko!</string>
<string name="authentication_failed">Autentifikavimas nepavyko, prašome prisijungti dar kartą</string>
<string name="uploading_started">Įkėlimas prasidėjo!</string>
<string name="upload_completed_notification_title">%1$s įkelta!</string>
<string name="upload_completed_notification_text">Bakstelėkite norėdami peržiūrėti jūsų įkėlimą</string>
@ -43,10 +50,13 @@
<string name="menu_share">Dalintis</string>
<string name="menu_open_in_browser">Atidaryti naršyklėje</string>
<string name="share_title_hint">Pavadinimas</string>
<string name="add_title_toast">Prašome pateikti šiam failui pavadinimą</string>
<string name="share_description_hint">Aprašymas</string>
<string name="login_failed_network">Negalima prisijungti - tinklo klaida</string>
<string name="login_failed_wrong_credentials">Nepavyko prisijungti - prašome patikrinti savo naudotojo vardą ir 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_2fa_needed">Turite pateikti savo dviejų žingsnių patvirtinimo kodą.</string>
<string name="login_failed_generic">Prisijungti nepavyko</string>
<string name="share_upload_button">Įkelti</string>
<string name="multiple_share_base_title">Pavadinkite šį rinkinį</string>
@ -55,6 +65,7 @@
<string name="categories_search_text_hint">Ieškoti kategorijas</string>
<string name="menu_save_categories">Išsaugoti</string>
<string name="refresh_button">Atnaujinti</string>
<string name="display_list_button">Sąrašas</string>
<string name="gps_disabled">GPS išjungta jūsų įrenginyje. Ar norite įjungti?</string>
<string name="enable_gps">Išjungti GPS</string>
<string name="contributions_subtitle_zero">Nėra įkėlimų kol kas</string>
@ -76,8 +87,10 @@
<string name="categories_activity_title">Kategorijos</string>
<string name="title_activity_settings">Nustatymai</string>
<string name="title_activity_signup">Užsiregistruoti</string>
<string name="title_activity_featured_images">Rinktiniai Paveikslėliai</string>
<string name="menu_about">Apie</string>
<string name="about_privacy_policy" fuzzy="true">&lt;a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\"&gt;Privatumo politika&lt;/a&gt;</string>
<string name="about_privacy_policy">&lt;u&gt;Privatumo politika&lt;/u&gt;</string>
<string name="about_credits">&lt;u&gt;Kūrėjai&lt;/u&gt;</string>
<string name="title_activity_about">Apie</string>
<string name="menu_feedback">Siųsti Atsiliepimą (El. paštu)</string>
<string name="no_email_client">Nėra įdiegtos el. pašto tvarkyklės</string>
@ -88,10 +101,10 @@
<string name="menu_cancel_upload">Atšaukti</string>
<string name="share_license_summary">Šio paveikslėlio licencija bus %1$s</string>
<string name="menu_download">Parsisiųsti</string>
<string name="preference_license" fuzzy="true">Licencija</string>
<string name="preference_license">Numatytoji Licencija</string>
<string name="use_previous">Naudoti ankstesnį pavadinimą/aprašymą</string>
<string name="allow_gps">Automatiškai gauti dabartinę vietą</string>
<string name="allow_gps_summary">Gauti dabartinę vietove, kad būtų pasiūlytos kategorijos, jei paveikslėlis neturi geografinės žymės</string>
<string name="allow_gps_summary" fuzzy="true">Gauti dabartinę vietove, kad būtų pasiūlytos kategorijos, jei paveikslėlis neturi geografinės žymės</string>
<string name="preference_theme">Naktinis režimas</string>
<string name="preference_theme_summary">Naudoti tamsią temą</string>
<string name="license_name_cc_by_sa_4_0">CC BY-SA 4.0</string>
@ -99,8 +112,15 @@
<string name="tutorial_1_text">Vikimedija Commons talpina daugumą paveikslėlių, kurie yra naudojami Vikipedijoje.</string>
<string name="tutorial_1_subtext">Jūsų paveikslėliai padeda šviesti žmones visame pasaulyje!</string>
<string name="tutorial_2_text">Prašome kelti nuotraukos, kurios yra padarytos ar sukurtos tik jūsų:</string>
<string name="tutorial_2_subtext" fuzzy="true">- Gamtos objektai (gėlės, gyvūnai, kalnai)\n- Naudingi objektai (dviračiai, traukinių stotys)\n- Įžymūs žmonės (merai, Olimpiniai atletai)</string>
<string name="tutorial_2_subtext">Gamtos objektai (gėlės, gyvūnai, kalnai)\n• Naudingi objektai (dviračiai, traukinių stotys)\n• Įžymūs žmonės (jūsų meras, Olimpiniai atletai, kurios sutikote)</string>
<string name="tutorial_2_subtext_1">Gamtos objektai (gėlės, gyvūnai, kalnai)</string>
<string name="tutorial_2_subtext_2">Naudingi objektai (dviračiai, traukinių stotys)</string>
<string name="tutorial_2_subtext_3">Įžymūs žmonės (jūsų meras, Olimpiniai atletai, kurios sutikote)</string>
<string name="tutorial_3_text">Prašome NEkelti:</string>
<string name="tutorial_3_subtext">- Asmenukės ar jūsų draugų nuotraukos\n- Nuotraukos, kurias atsisiuntėte iš interneto\n- Patentuotų programėlių nuotraukos</string>
<string name="tutorial_3_subtext_1">Asmenukės ar jūsų draugų nuotraukos</string>
<string name="tutorial_3_subtext_2">Nuotraukos, kurias atsisiuntėte iš interneto</string>
<string name="tutorial_3_subtext_3">Patentuotų programėlių nuotraukos</string>
<string name="tutorial_4_text">Pavyzdinis įkėlimas:</string>
<string name="welcome_wikipedia_text">Įkelkite savo paveikslėlius. Padėkite Vikipedijos straipsniams būti spalvingesniems!</string>
<string name="welcome_wikipedia_subtext">Paveikslėliai Vikipedijoje yra iš Vikimedija Commons.</string>

View file

@ -16,7 +16,7 @@
<string name="logging_in_message">Lūdzu, uzgaidiet…</string>
<string name="login_success">Ieiešana veiksmīga</string>
<string name="login_failed">Pieteikšanās neizdevās.</string>
<string name="authentication_failed">Autentifikācija neizdevās!</string>
<string name="authentication_failed" fuzzy="true">Autentifikācija neizdevās!</string>
<string name="uploading_started">Augšupielāde sākās!</string>
<string name="upload_completed_notification_title">%1$s augšupielādēti!</string>
<string name="upload_progress_notification_title_start">Uzsāk %1$s augšupielādi</string>

Some files were not shown because too many files have changed in this diff Show more