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

This commit is contained in:
misaochan 2017-12-12 00:37:16 +10:00
commit 91bbb70240
41 changed files with 146 additions and 122 deletions

View file

@ -50,11 +50,6 @@ public class CommonsApplication extends DaggerApplication {
@Inject @Named("application_preferences") SharedPreferences applicationPrefs; @Inject @Named("application_preferences") SharedPreferences applicationPrefs;
@Inject @Named("prefs") SharedPreferences otherPrefs; @Inject @Named("prefs") SharedPreferences otherPrefs;
public static final Object[] EVENT_UPLOAD_ATTEMPT = {"MobileAppUploadAttempts", 5334329L};
public static final Object[] EVENT_LOGIN_ATTEMPT = {"MobileAppLoginAttempts", 5257721L};
public static final Object[] EVENT_SHARE_ATTEMPT = {"MobileAppShareAttempts", 5346170L};
public static final Object[] EVENT_CATEGORIZATION_ATTEMPT = {"MobileAppCategorizationAttempts", 5359208L};
public static final String DEFAULT_EDIT_SUMMARY = "Uploaded using Android Commons app"; public static final String DEFAULT_EDIT_SUMMARY = "Uploaded using Android Commons app";
public static final String FEEDBACK_EMAIL = "commons-app-android@googlegroups.com"; public static final String FEEDBACK_EMAIL = "commons-app-android@googlegroups.com";

View file

@ -8,6 +8,16 @@ public class License {
private String url; private String url;
private String name; private String name;
/**
* Constructs a new instance of License.
*
* @param key license key
* @param template license template
* @param url license URL
* @param name licence name
*
* @throws RuntimeException if License.key or Licence.template is null
*/
public License(String key, String template, String url, String name) { public License(String key, String template, String url, String name) {
if (key == null) { if (key == null) {
throw new RuntimeException("License.key must not be null"); throw new RuntimeException("License.key must not be null");
@ -21,10 +31,18 @@ public class License {
this.name = name; this.name = name;
} }
/**
* Gets the license key.
* @return license key as a String.
*/
public String getKey() { public String getKey() {
return key; return key;
} }
/**
* Gets the license template.
* @return license template as a String.
*/
public String getTemplate() { public String getTemplate() {
return template; return template;
} }

View file

@ -128,89 +128,177 @@ public class Media implements Parcelable {
return imageUrl; return imageUrl;
} }
/**
* Gets the name of the file.
* @return file name as a string
*/
public String getFilename() { public String getFilename() {
return filename; return filename;
} }
/**
* Sets the name of the file.
* @param filename the new name of the file
*/
public void setFilename(String filename) { public void setFilename(String filename) {
this.filename = filename; this.filename = filename;
} }
/**
* Gets the file description.
* @return file description as a string
*/
public String getDescription() { public String getDescription() {
return description; return description;
} }
/**
* Sets the file description.
* @param description the new description of the file
*/
public void setDescription(String description) { public void setDescription(String description) {
this.description = description; this.description = description;
} }
/**
* Gets the datalength of the file.
* @return file datalength as a long
*/
public long getDataLength() { public long getDataLength() {
return dataLength; return dataLength;
} }
/**
* Sets the datalength of the file.
* @param dataLength as a long
*/
public void setDataLength(long dataLength) { public void setDataLength(long dataLength) {
this.dataLength = dataLength; this.dataLength = dataLength;
} }
/**
* Gets the creation date of the file.
* @return creation date as a Date
*/
public Date getDateCreated() { public Date getDateCreated() {
return dateCreated; return dateCreated;
} }
/**
* Sets the creation date of the file.
* @param date creation date as a Date
*/
public void setDateCreated(Date date) { public void setDateCreated(Date date) {
this.dateCreated = date; this.dateCreated = date;
} }
/**
* Gets the upload date of the file.
* Can be null.
* @return upload date as a Date
*/
public @Nullable public @Nullable
Date getDateUploaded() { Date getDateUploaded() {
return dateUploaded; return dateUploaded;
} }
/**
* Gets the name of the creator of the file.
* @return creator name as a String
*/
public String getCreator() { public String getCreator() {
return creator; return creator;
} }
/**
* Sets the creator name of the file.
* @param creator creator name as a string
*/
public void setCreator(String creator) { public void setCreator(String creator) {
this.creator = creator; this.creator = creator;
} }
/**
* Gets the width of the media.
* @return file width as an int
*/
public int getWidth() { public int getWidth() {
return width; return width;
} }
/**
* Sets the width of the media.
* @param width file width as an int
*/
public void setWidth(int width) { public void setWidth(int width) {
this.width = width; this.width = width;
} }
/**
* Gets the height of the media.
* @return file height as an int
*/
public int getHeight() { public int getHeight() {
return height; return height;
} }
/**
* Sets the height of the media.
* @param height file height as an int
*/
public void setHeight(int height) { public void setHeight(int height) {
this.height = height; this.height = height;
} }
/**
* Gets the license name of the file.
* @return license as a String
*/
public String getLicense() { public String getLicense() {
return license; return license;
} }
/**
* Sets the license name of the file.
* @param license license name as a String
*/
public void setLicense(String license) { public void setLicense(String license) {
this.license = license; this.license = license;
} }
/**
* Gets the coordinates of where the file was created.
* @return file coordinates as a LatLng
*/
public @Nullable public @Nullable
LatLng getCoordinates() { LatLng getCoordinates() {
return coordinates; return coordinates;
} }
/**
* Sets the coordinates of where the file was created.
* @param coordinates file coordinates as a LatLng
*/
public void setCoordinates(@Nullable LatLng coordinates) { public void setCoordinates(@Nullable LatLng coordinates) {
this.coordinates = coordinates; this.coordinates = coordinates;
} }
/**
* Gets the categories the file falls under.
* @return file categories as an ArrayList of Strings
*/
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public ArrayList<String> getCategories() { public ArrayList<String> getCategories() {
return (ArrayList<String>) categories.clone(); // feels dirty return (ArrayList<String>) categories.clone(); // feels dirty
} }
/**
* Sets the categories the file falls under.
* </p>
* Does not append: i.e. will clear the current categories
* and then add the specified ones.
* @param categories file categories as a list of Strings
*/
public void setCategories(List<String> categories) { public void setCategories(List<String> categories) {
this.categories.clear(); this.categories.clear();
this.categories.addAll(categories); this.categories.addAll(categories);

View file

@ -84,6 +84,12 @@ public class PageTitle {
return titleKey; return titleKey;
} }
/**
* Gets the canonicalized title for displaying (such as "File:My example.jpg").
* </p>
* Essentially equivalent to getPrefixedText
* @return canonical title as a String
*/
@Override @Override
public String toString() { public String toString() {
return getPrefixedText(); return getPrefixedText();

View file

@ -51,6 +51,12 @@ public class Utils {
} }
} }
/**
* Capitalizes the first character of a string.
*
* @param string
* @return string with capitalized first character
*/
public static String capitalize(String string) { public static String capitalize(String string) {
return string.substring(0, 1).toUpperCase(Locale.getDefault()) + string.substring(1); return string.substring(0, 1).toUpperCase(Locale.getDefault()) + string.substring(1);
} }

View file

@ -8,9 +8,7 @@ import android.os.Bundle;
import java.io.IOException; import java.io.IOException;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
import fr.free.nrw.commons.mwapi.EventLog;
import fr.free.nrw.commons.mwapi.MediaWikiApi; import fr.free.nrw.commons.mwapi.MediaWikiApi;
import timber.log.Timber; import timber.log.Timber;
@ -27,7 +25,6 @@ class LoginTask extends AsyncTask<String, String, String> {
private String twoFactorCode = ""; private String twoFactorCode = "";
private AccountUtil accountUtil; private AccountUtil accountUtil;
private MediaWikiApi mwApi; private MediaWikiApi mwApi;
private SharedPreferences prefs;
public LoginTask(LoginActivity loginActivity, String username, String password, public LoginTask(LoginActivity loginActivity, String username, String password,
String twoFactorCode, AccountUtil accountUtil, String twoFactorCode, AccountUtil accountUtil,
@ -38,7 +35,6 @@ class LoginTask extends AsyncTask<String, String, String> {
this.twoFactorCode = twoFactorCode; this.twoFactorCode = twoFactorCode;
this.accountUtil = accountUtil; this.accountUtil = accountUtil;
this.mwApi = mwApi; this.mwApi = mwApi;
this.prefs = prefs;
} }
@Override @Override
@ -71,11 +67,6 @@ class LoginTask extends AsyncTask<String, String, String> {
super.onPostExecute(result); super.onPostExecute(result);
Timber.d("Login done!"); Timber.d("Login done!");
EventLog.schema(CommonsApplication.EVENT_LOGIN_ATTEMPT, mwApi, prefs)
.param("username", username)
.param("result", result)
.log();
if (result.equals("PASS")) { if (result.equals("PASS")) {
handlePassResult(); handlePassResult();
} else { } else {

View file

@ -29,20 +29,17 @@ import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import dagger.android.support.DaggerFragment; import dagger.android.support.DaggerFragment;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.Media; import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
import fr.free.nrw.commons.auth.SessionManager; import fr.free.nrw.commons.auth.SessionManager;
import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.contributions.Contribution;
import fr.free.nrw.commons.contributions.ContributionsActivity; import fr.free.nrw.commons.contributions.ContributionsActivity;
import fr.free.nrw.commons.mwapi.EventLog;
import fr.free.nrw.commons.mwapi.MediaWikiApi; import fr.free.nrw.commons.mwapi.MediaWikiApi;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE; import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.content.Context.DOWNLOAD_SERVICE; import static android.content.Context.DOWNLOAD_SERVICE;
import static android.content.Intent.ACTION_VIEW; import static android.content.Intent.ACTION_VIEW;
import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static fr.free.nrw.commons.CommonsApplication.EVENT_SHARE_ATTEMPT;
public class MediaDetailPagerFragment extends DaggerFragment implements ViewPager.OnPageChangeListener { public class MediaDetailPagerFragment extends DaggerFragment implements ViewPager.OnPageChangeListener {
@ -110,12 +107,7 @@ public class MediaDetailPagerFragment extends DaggerFragment implements ViewPage
Media m = provider.getMediaAtPosition(pager.getCurrentItem()); Media m = provider.getMediaAtPosition(pager.getCurrentItem());
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.menu_share_current_image: case R.id.menu_share_current_image:
// Share - this is just logs it, intent set in onCreateOptionsMenu, around line 252 // Share - intent set in onCreateOptionsMenu, around line 252
CommonsApplication app = (CommonsApplication) getActivity().getApplication();
EventLog.schema(EVENT_SHARE_ATTEMPT, mwApi, prefs)
.param("username", sessionManager.getCurrentAccount().name)
.param("filename", m.getFilename())
.log();
return true; return true;
case R.id.menu_browser_current_image: case R.id.menu_browser_current_image:
// View in browser // View in browser

View file

@ -29,7 +29,6 @@ import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.Media; import fr.free.nrw.commons.Media;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
import fr.free.nrw.commons.auth.AuthenticatedActivity; import fr.free.nrw.commons.auth.AuthenticatedActivity;
@ -42,7 +41,6 @@ import fr.free.nrw.commons.modifications.CategoryModifier;
import fr.free.nrw.commons.modifications.ModificationsContentProvider; import fr.free.nrw.commons.modifications.ModificationsContentProvider;
import fr.free.nrw.commons.modifications.ModifierSequence; import fr.free.nrw.commons.modifications.ModifierSequence;
import fr.free.nrw.commons.modifications.TemplateRemoveModifier; import fr.free.nrw.commons.modifications.TemplateRemoveModifier;
import fr.free.nrw.commons.mwapi.EventLog;
import fr.free.nrw.commons.mwapi.MediaWikiApi; import fr.free.nrw.commons.mwapi.MediaWikiApi;
import timber.log.Timber; import timber.log.Timber;
@ -181,13 +179,6 @@ public class MultipleShareActivity extends AuthenticatedActivity
// FIXME: Make sure that the content provider is up // FIXME: Make sure that the content provider is up
// This is the wrong place for it, but bleh - better than not having it turned on by default for people who don't go throughl ogin // This is the wrong place for it, but bleh - better than not having it turned on by default for people who don't go throughl ogin
ContentResolver.setSyncAutomatically(sessionManager.getCurrentAccount(), ModificationsContentProvider.AUTHORITY, true); // Enable sync by default! ContentResolver.setSyncAutomatically(sessionManager.getCurrentAccount(), ModificationsContentProvider.AUTHORITY, true); // Enable sync by default!
EventLog.schema(CommonsApplication.EVENT_CATEGORIZATION_ATTEMPT, mwApi, prefs)
.param("username", sessionManager.getCurrentAccount().name)
.param("categories-count", categories.size())
.param("files-count", photosList.size())
.param("source", Contribution.SOURCE_EXTERNAL)
.param("result", "queued")
.log();
finish(); finish();
} }
@ -286,27 +277,6 @@ public class MultipleShareActivity extends AuthenticatedActivity
finish(); finish();
} }
@Override
public void onBackPressed() {
super.onBackPressed();
if (categorizationFragment != null && categorizationFragment.isVisible()) {
EventLog.schema(CommonsApplication.EVENT_CATEGORIZATION_ATTEMPT, mwApi, prefs)
.param("username", sessionManager.getCurrentAccount().name)
.param("categories-count", categorizationFragment.getCurrentSelectedCount())
.param("files-count", photosList.size())
.param("source", Contribution.SOURCE_EXTERNAL)
.param("result", "cancelled")
.log();
} else {
EventLog.schema(CommonsApplication.EVENT_UPLOAD_ATTEMPT, mwApi, prefs)
.param("username", sessionManager.getCurrentAccount().name)
.param("source", getIntent().getStringExtra(UploadService.EXTRA_SOURCE))
.param("multiple", true)
.param("result", "cancelled")
.log();
}
}
@Override @Override
public void onBackStackChanged() { public void onBackStackChanged() {
getSupportActionBar().setDisplayHomeAsUpEnabled(mediaDetails != null && mediaDetails.isVisible()) ; getSupportActionBar().setDisplayHomeAsUpEnabled(mediaDetails != null && mediaDetails.isVisible()) ;

View file

@ -10,7 +10,6 @@ import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Environment; import android.os.Environment;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi; import android.support.annotation.RequiresApi;
@ -176,13 +175,6 @@ public class ShareActivity
// This is the wrong place for it, but bleh - better than not having it turned on by default for people who don't go throughl ogin // This is the wrong place for it, but bleh - better than not having it turned on by default for people who don't go throughl ogin
ContentResolver.setSyncAutomatically(sessionManager.getCurrentAccount(), ModificationsContentProvider.AUTHORITY, true); // Enable sync by default! ContentResolver.setSyncAutomatically(sessionManager.getCurrentAccount(), ModificationsContentProvider.AUTHORITY, true); // Enable sync by default!
EventLog.schema(CommonsApplication.EVENT_CATEGORIZATION_ATTEMPT, mwApi, prefs)
.param("username", sessionManager.getCurrentAccount().name)
.param("categories-count", categories.size())
.param("files-count", 1)
.param("source", contribution.getSource())
.param("result", "queued")
.log();
finish(); finish();
} }
@ -194,27 +186,6 @@ public class ShareActivity
} }
} }
@Override
public void onBackPressed() {
super.onBackPressed();
if (categorizationFragment != null && categorizationFragment.isVisible()) {
EventLog.schema(CommonsApplication.EVENT_CATEGORIZATION_ATTEMPT, mwApi, prefs)
.param("username", sessionManager.getCurrentAccount().name)
.param("categories-count", categorizationFragment.getCurrentSelectedCount())
.param("files-count", 1)
.param("source", contribution.getSource())
.param("result", "cancelled")
.log();
} else {
EventLog.schema(CommonsApplication.EVENT_UPLOAD_ATTEMPT, mwApi, prefs)
.param("username", sessionManager.getCurrentAccount().name)
.param("source", getIntent().getStringExtra(UploadService.EXTRA_SOURCE))
.param("multiple", true)
.param("result", "cancelled")
.log();
}
}
@Override @Override
protected void onAuthCookieAcquired(String authCookie) { protected void onAuthCookieAcquired(String authCookie) {
mwApi.setAuthCookie(authCookie); mwApi.setAuthCookie(authCookie);

View file

@ -26,7 +26,6 @@ import java.util.regex.Pattern;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import fr.free.nrw.commons.CommonsApplication;
import fr.free.nrw.commons.HandlerService; import fr.free.nrw.commons.HandlerService;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.Utils;
@ -35,7 +34,6 @@ import fr.free.nrw.commons.contributions.Contribution;
import fr.free.nrw.commons.contributions.ContributionsActivity; import fr.free.nrw.commons.contributions.ContributionsActivity;
import fr.free.nrw.commons.contributions.ContributionsContentProvider; import fr.free.nrw.commons.contributions.ContributionsContentProvider;
import fr.free.nrw.commons.modifications.ModificationsContentProvider; import fr.free.nrw.commons.modifications.ModificationsContentProvider;
import fr.free.nrw.commons.mwapi.EventLog;
import fr.free.nrw.commons.mwapi.MediaWikiApi; import fr.free.nrw.commons.mwapi.MediaWikiApi;
import fr.free.nrw.commons.mwapi.UploadResult; import fr.free.nrw.commons.mwapi.UploadResult;
import timber.log.Timber; import timber.log.Timber;
@ -258,27 +256,12 @@ public class UploadService extends HandlerService<Contribution> {
String resultStatus = uploadResult.getResultStatus(); String resultStatus = uploadResult.getResultStatus();
if (!resultStatus.equals("Success")) { if (!resultStatus.equals("Success")) {
showFailedNotification(contribution); showFailedNotification(contribution);
EventLog.schema(CommonsApplication.EVENT_UPLOAD_ATTEMPT, mwApi, prefs)
.param("username", sessionManager.getCurrentAccount().name)
.param("source", contribution.getSource())
.param("multiple", contribution.getMultiple())
.param("result", uploadResult.getErrorCode())
.param("filename", contribution.getFilename())
.log();
} else { } else {
contribution.setFilename(uploadResult.getCanonicalFilename()); contribution.setFilename(uploadResult.getCanonicalFilename());
contribution.setImageUrl(uploadResult.getImageUrl()); contribution.setImageUrl(uploadResult.getImageUrl());
contribution.setState(Contribution.STATE_COMPLETED); contribution.setState(Contribution.STATE_COMPLETED);
contribution.setDateUploaded(uploadResult.getDateUploaded()); contribution.setDateUploaded(uploadResult.getDateUploaded());
contribution.save(); contribution.save();
EventLog.schema(CommonsApplication.EVENT_UPLOAD_ATTEMPT, mwApi, prefs)
.param("username", sessionManager.getCurrentAccount().name)
.param("source", contribution.getSource()) //FIXME
.param("filename", contribution.getFilename())
.param("multiple", contribution.getMultiple())
.param("result", "success")
.log();
} }
} catch (IOException e) { } catch (IOException e) {
Timber.d("I have a network fuckup"); Timber.d("I have a network fuckup");

View file

@ -203,4 +203,5 @@
<string name="login_to_your_account">Log ind på din konto</string> <string name="login_to_your_account">Log ind på din konto</string>
<string name="nearby_location_has_not_changed">Sted er ikke ændret.</string> <string name="nearby_location_has_not_changed">Sted er ikke ændret.</string>
<string name="nearby_location_not_available">Sted ikke tilgængeligt.</string> <string name="nearby_location_not_available">Sted ikke tilgængeligt.</string>
<string name="location_permission_rationale_nearby">Tilladelse kræves for at vise en liste over steder i nærheden</string>
</resources> </resources>

View file

@ -203,4 +203,5 @@
<string name="login_to_your_account">Comezar sesión na súa conta</string> <string name="login_to_your_account">Comezar sesión na súa conta</string>
<string name="nearby_location_has_not_changed">A localización non cambiou.</string> <string name="nearby_location_has_not_changed">A localización non cambiou.</string>
<string name="nearby_location_not_available">A localización non está dispoñible.</string> <string name="nearby_location_not_available">A localización non está dispoñible.</string>
<string name="location_permission_rationale_nearby">Precísase permiso para amosar unha lista de lugares preto de aquí</string>
</resources> </resources>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name" fuzzy="true">विकिमीडिया कमन्स</string> <string name="app_name">कमन्स</string>
<string name="menu_settings">सेटिङ्गहरू</string> <string name="menu_settings">सेटिङ्गहरू</string>
<string name="username">प्रयोगकर्ता नाम</string> <string name="username">प्रयोगकर्ता नाम</string>
<string name="password">पासवर्ड</string> <string name="password">पासवर्ड</string>
@ -43,7 +43,7 @@
<string name="categories_search_text_hint">खोज श्रेणीहरू</string> <string name="categories_search_text_hint">खोज श्रेणीहरू</string>
<string name="menu_save_categories">संग्रह गर्ने</string> <string name="menu_save_categories">संग्रह गर्ने</string>
<string name="categories_not_found">मिल्दो वर्ग %1$s फेला परेन</string> <string name="categories_not_found">मिल्दो वर्ग %1$s फेला परेन</string>
<string name="categories_skip_explanation">विकिमडिया कमन्समा आफ्नो तस्वीरहरू थप भेट्टाउने बनाउन वर्नहरू थप्नुहोस।\n\nवर्गहरू थप्नको लागि टाइप गर्न सुरु गर्नुहोस्।\nयो चरण छोड्न यो सन्देशमा ट्याप गर्नुहोस् (वा पछाडि जाने थिच्नुहोस्)।</string> <string name="categories_skip_explanation">विकिमिडिया कमन्समा आफ्नो तस्वीरहरू थप भेट्टाउने बनाउन श्रेणीहरू थप्नुहोस।\n\nश्रेणीहरू थप्नको लागि टाइप गर्न सुरु गर्नुहोस्।\nयो चरण छोड्न यो सन्देशमा ट्याप गर्नुहोस् (वा पछाडि जानेमा थिच्नुहोस्)।</string>
<string name="categories_activity_title">श्रेणीहरू</string> <string name="categories_activity_title">श्रेणीहरू</string>
<string name="title_activity_settings">सेटिङ्गहरू</string> <string name="title_activity_settings">सेटिङ्गहरू</string>
<string name="menu_about">बारेमा</string> <string name="menu_about">बारेमा</string>
@ -76,8 +76,8 @@
<string name="license_name_cc_by_sa_3_0_ro">CC BY-SA ३. (रोमानिया)</string> <string name="license_name_cc_by_sa_3_0_ro">CC BY-SA ३. (रोमानिया)</string>
<string name="license_name_cc_by_3_0">CC BY-SA ३.</string> <string name="license_name_cc_by_3_0">CC BY-SA ३.</string>
<string name="license_name_cc_zero">CC शुन्य</string> <string name="license_name_cc_zero">CC शुन्य</string>
<string name="welcome_wikipedia_text">आफ्नो तस्वीरहरूको योगदान दिनुहोस्। विकिपीडिया लेखलाई जीवनमा आउन मद्दत गर्नुहोस्!</string> <string name="welcome_wikipedia_text">आफ्नो तस्वीरहरूको योगदान दिनुहोस्। विकिपिडियाका लेखलाई जीवनन्तता पाउन मद्दत गर्नुहोस्!</string>
<string name="welcome_wikipedia_subtext">विकिपीडियाका तस्वीरहरू विकिमीडिया कमन्सबाट आउँछन्।</string> <string name="welcome_wikipedia_subtext">विकिपिडियाका तस्विरहरू विकिमिडिया कमन्सबाट आउँछन्।</string>
<string name="welcome_copyright_text">तपाईंको तस्वीरहरूले संसारभरिका मानिसहरूलाई शिक्षित बनाउन मद्दत गर्छन्।</string> <string name="welcome_copyright_text">तपाईंको तस्वीरहरूले संसारभरिका मानिसहरूलाई शिक्षित बनाउन मद्दत गर्छन्।</string>
<string name="welcome_copyright_subtext">तपाईंले इन्टरनेटमा भेट्टाउनुभएका कपिराइट भएका सामग्रीहरू साथै पोस्टरहरू, पुस्तक आवरणहरू, आदिका तस्वीरहरू रोक्नुहोस्।</string> <string name="welcome_copyright_subtext">तपाईंले इन्टरनेटमा भेट्टाउनुभएका कपिराइट भएका सामग्रीहरू साथै पोस्टरहरू, पुस्तक आवरणहरू, आदिका तस्वीरहरू रोक्नुहोस्।</string>
<string name="welcome_final_text">के तपाईंले कुरा बुझ्नु भए जस्तो लाग्छ ?</string> <string name="welcome_final_text">के तपाईंले कुरा बुझ्नु भए जस्तो लाग्छ ?</string>

View file

@ -116,12 +116,12 @@
<string name="license_name_cc_zero">CC Zero</string> <string name="license_name_cc_zero">CC Zero</string>
<string name="tutorial_1_text">Wikimedia Commons armazena a maioria das imagens que são usadas na Wikipédia.</string> <string name="tutorial_1_text">Wikimedia Commons armazena a maioria das imagens que são usadas na Wikipédia.</string>
<string name="tutorial_1_subtext">As suas imagens ajudam a educar pessoas em todo o mundo!</string> <string name="tutorial_1_subtext">As suas imagens ajudam a educar pessoas em todo o mundo!</string>
<string name="tutorial_2_text">Por favor, carregue apenas as imagens tiradas ou criadas por ti:</string> <string name="tutorial_2_text">Por favor, carregue apenas imagens tiradas ou criadas exclusivamente por si:</string>
<string name="tutorial_2_subtext">- Objetos naturais (flores, animais, montanhas)\n- Objetos úteis (bicicletas, estações de comboio)\n- Pessoas famosas (o seu presidente da câmara, atletas olímpicos que conheça)</string> <string name="tutorial_2_subtext">- Objetos naturais (flores, animais, montanhas)\n- Objetos úteis (bicicletas, estações de comboio)\n- Pessoas famosas (o seu presidente da câmara, atletas olímpicos que conheça)</string>
<string name="tutorial_3_text">Por favor, NÃO carregue:</string> <string name="tutorial_3_text">Por favor, NÃO carregue:</string>
<string name="tutorial_3_subtext">- Autorretratos ou imagens dos seus amigos\n- Imagens descarregadas da internet\n- Capturas de ecrã de aplicações com direitos de autor</string> <string name="tutorial_3_subtext">- Autorretratos ou imagens dos seus amigos\n- Imagens descarregadas da Internet\n- Capturas de ecrã de aplicações com direitos de autor</string>
<string name="tutorial_4_text">Exemplo de carregamento:</string> <string name="tutorial_4_text">Exemplo de carregamento:</string>
<string name="tutorial_4_subtext">- Título: Ópera de Sydney\n- Descrição: A Ópera de Sydney vista em toda a baía\n- Categorias: Sydney Opera House, Sydney Opera House from the west, Sydney Opera House remote views</string> <string name="tutorial_4_subtext">- Título: Ópera de Sydney\n- Descrição: A Ópera de Sydney vista do outro lado da baía\n- Categorias: Ópera de Sydney, Ópera de Sydney vista de ocidente, Vistas à distância da Ópera de Sydney</string>
<string name="welcome_wikipedia_text">Contribua com as suas imagens. Ajude os artigos da Wikipédia a ganhar vida!</string> <string name="welcome_wikipedia_text">Contribua com as suas imagens. Ajude os artigos da Wikipédia a ganhar vida!</string>
<string name="welcome_wikipedia_subtext">As imagens na Wikipédia provêm do Wikimedia Commons.</string> <string name="welcome_wikipedia_subtext">As imagens na Wikipédia provêm do Wikimedia Commons.</string>
<string name="welcome_copyright_text">As suas imagens ajudam a educar as pessoas em todo o mundo.</string> <string name="welcome_copyright_text">As suas imagens ajudam a educar as pessoas em todo o mundo.</string>
@ -134,32 +134,32 @@
<string name="detail_description_empty">Sem descrição</string> <string name="detail_description_empty">Sem descrição</string>
<string name="detail_license_empty">Licença desconhecida</string> <string name="detail_license_empty">Licença desconhecida</string>
<string name="menu_refresh">Actualizar</string> <string name="menu_refresh">Actualizar</string>
<string name="read_storage_permission_rationale">Permissão necessária: Ler a armazenagem externa. A aplicação não pode funcionar sem isso.</string> <string name="read_storage_permission_rationale">Permissão necessária: Ler a armazenagem externa. A aplicação não pode funcionar sem isto.</string>
<string name="write_storage_permission_rationale">Permissão necessária: Escrever na armazenagem externa. A aplicação não pode funcionar sem isso.</string> <string name="write_storage_permission_rationale">Permissão necessária: Escrever na armazenagem externa. A aplicação não pode funcionar sem isto.</string>
<string name="location_permission_rationale">Permissão opcional: Obter a localização atual para sugerir categorias</string> <string name="location_permission_rationale">Permissão opcional: Obter a localização atual para sugestões de categoria</string>
<string name="ok">OK</string> <string name="ok">OK</string>
<string name="title_activity_nearby">Locais Próximos</string> <string name="title_activity_nearby">Locais Próximos</string>
<string name="no_nearby">Não foram encontrados locais próximos.</string> <string name="no_nearby">Não foram encontrados locais próximos.</string>
<string name="warning">Aviso</string> <string name="warning">Aviso</string>
<string name="file_exists">Este ficheiro já existe no Commons. Tem certeza de que deseja continuar?</string> <string name="file_exists">Este ficheiro já existe no Commons. Tem a certeza de que deseja continuar?</string>
<string name="yes">Sim</string> <string name="yes">Sim</string>
<string name="no">Não</string> <string name="no">Não</string>
<string name="media_detail_title">Título</string> <string name="media_detail_title">Título</string>
<string name="media_detail_media_title">Título do ficheiro multimédia</string> <string name="media_detail_media_title">Título do ficheiro multimédia</string>
<string name="media_detail_description">Descrição</string> <string name="media_detail_description">Descrição</string>
<string name="media_detail_description_explanation">Aqui vai a descrição do ficheiro multimédia. Potencialmente, pode ser demasiado longo, e precisará ser agrupado em várias linhas. Esperamos que seja agradável.</string> <string name="media_detail_description_explanation">A descrição do ficheiro multimédia é colocada aqui. Ela pode ser bastante longa e precisar de ser dividida em várias linhas. No entanto, esperamos que tenha bom aspeto.</string>
<string name="media_detail_uploaded_date">Data de carregamento</string> <string name="media_detail_uploaded_date">Data de carregamento</string>
<string name="media_detail_license">Licença</string> <string name="media_detail_license">Licença</string>
<string name="media_detail_coordinates">Coordenadas</string> <string name="media_detail_coordinates">Coordenadas</string>
<string name="media_detail_coordinates_empty">Não fornecido</string> <string name="media_detail_coordinates_empty">Não fornecido</string>
<string name="become_a_tester_title">Torne-se um Testador Beta</string> <string name="become_a_tester_title">Torne-se um Testador Beta</string>
<string name="become_a_tester_description">Entre no nosso canal beta na Google Play e obtenha acesso rápido a novas funcionalidades e correções de erros</string> <string name="become_a_tester_description">Opte pelo nosso canal beta no Google Play e obtenha acesso antecipado a novas funcionalidades e a correções de erros</string>
<string name="use_wikidata">Utilizar o Wikidata</string> <string name="use_wikidata">Utilizar o Wikidata</string>
<string name="use_wikidata_summary">(Aviso: desabilitar isso pode causar um grande consumo de dados móveis)</string> <string name="use_wikidata_summary">(Aviso: desativar isto pode causar um grande consumo de dados móveis)</string>
<string name="_2fa_code">Código de autenticação de dois fatores</string> <string name="_2fa_code">Código de autenticação de dois fatores</string>
<string name="number_of_uploads">Meu limite de carregamentos recentes</string> <string name="number_of_uploads">O meu limite de carregamentos recentes</string>
<string name="maximum_limit">Limite máximo</string> <string name="maximum_limit">Limite máximo</string>
<string name="maximum_limit_alert">Não é possível visualizar mais de 500.</string> <string name="maximum_limit_alert">Não é possível apresentar mais de 500</string>
<string name="set_limit">Definir o limite de carregamentos recentes</string> <string name="set_limit">Definir o limite de carregamentos recentes</string>
<string name="login_failed_2fa_not_supported">Atualmente, a autenticação de dois fatores não é suportada.</string> <string name="login_failed_2fa_not_supported">Atualmente, a autenticação de dois fatores não é suportada.</string>
<string name="logout_verification">Deseja realmente sair?</string> <string name="logout_verification">Deseja realmente sair?</string>
@ -188,19 +188,20 @@
<string name="navigation_item_feedback">Comentários</string> <string name="navigation_item_feedback">Comentários</string>
<string name="navigation_item_logout">Sair</string> <string name="navigation_item_logout">Sair</string>
<string name="navigation_item_info">Tutorial</string> <string name="navigation_item_info">Tutorial</string>
<string name="nearby_needs_permissions">Os sítios próximos não podem ser visualizados sem permissões de localização</string> <string name="nearby_needs_permissions">Os sítios aqui perto não podem ser apresentados sem permissões de localização</string>
<string name="no_description_found">descrição não encontrada</string> <string name="no_description_found">não foi encontrada nenhuma descrição</string>
<string name="nearby_info_menu_commons_article">Página do ficheiro no Commons</string> <string name="nearby_info_menu_commons_article">Página do ficheiro no Commons</string>
<string name="nearby_info_menu_wikidata_article">Item do Wikidata</string> <string name="nearby_info_menu_wikidata_article">Item do Wikidata</string>
<string name="error_while_cache">Erro durante a cache de imagens</string> <string name="error_while_cache">Erro ao colocar imagens na cache</string>
<string name="title_info">Um título descritivo exclusivo para o ficheiro, que servirá como um nome de ficheiro. Pode utilizar uma linguagem simples com espaços. Não inclua a extensão do ficheiro</string> <string name="title_info">Um título descritivo exclusivo para o ficheiro, que servirá como um nome de ficheiro. Pode utilizar uma linguagem simples com espaços. Não inclua a extensão do ficheiro</string>
<string name="description_info">Por favor, descreva o ficheiro da melhor forma possível: Onde foi tirado? O que isso mostra? Qual é o contexto? Por favor, descreva os objetos ou as pessoas. Indique as informações que não podem ser facilmente adivinhadas, por exemplo, a hora do dia, se for uma paisagem. Se o ficheiro mostrar algo incomum, explique o que torna incomum.</string> <string name="description_info">Por favor, descreva o ficheiro da melhor forma possível: Onde foi tirado? O que isso mostra? Qual é o contexto? Por favor, descreva os objetos ou as pessoas. Indique as informações que não podem ser facilmente adivinhadas, por exemplo, a hora do dia, se for uma paisagem. Se o ficheiro mostrar algo incomum, explique o que torna incomum.</string>
<string name="give_permission">Permitir</string> <string name="give_permission">Permitir</string>
<string name="use_external_storage">Utilizar a armazenagem externa</string> <string name="use_external_storage">Utilizar a armazenagem externa</string>
<string name="use_external_storage_summary">Gravar as fotografias tiradas com a câmara na aplicação do seu dispositivo</string> <string name="use_external_storage_summary">Gravar as fotografias tiradas com a câmara da aplicação no seu dispositivo</string>
<string name="send_log_file">Carregar ficheiro de registo</string> <string name="send_log_file">Enviar ficheiro de registo</string>
<string name="send_log_file_description">Carregar ficheiro de registo para programadores por correio eletrónico</string> <string name="send_log_file_description">Enviar o ficheiro de registo aos programadores por correio eletrónico</string>
<string name="login_to_your_account">Inicie sessão na sua conta</string> <string name="login_to_your_account">Inicie sessão na sua conta</string>
<string name="nearby_location_has_not_changed">A localização não foi alterada.</string> <string name="nearby_location_has_not_changed">A localização não foi alterada.</string>
<string name="nearby_location_not_available">A localização não está disponível.</string> <string name="nearby_location_not_available">A localização não está disponível.</string>
<string name="location_permission_rationale_nearby">É necessária a permissão para mostrar uma lista dos sítios aqui perto</string>
</resources> </resources>

View file

@ -53,7 +53,7 @@
<string name="categories_search_text_hint">Пошук категорій</string> <string name="categories_search_text_hint">Пошук категорій</string>
<string name="menu_save_categories">Зберегти</string> <string name="menu_save_categories">Зберегти</string>
<string name="refresh_button">Оновити</string> <string name="refresh_button">Оновити</string>
<string name="gps_disabled">GPS вимкнено на Вашому пристрої. Чи хотіли б Ви його увімкнути?</string> <string name="gps_disabled">GPS вимкнено на Вашому пристрої. Бажаєте увімкнути його?</string>
<string name="enable_gps">Увімкнути GPS</string> <string name="enable_gps">Увімкнути GPS</string>
<string name="contributions_subtitle_zero">Ще нема завантажень</string> <string name="contributions_subtitle_zero">Ще нема завантажень</string>
<plurals name="contributions_subtitle"> <plurals name="contributions_subtitle">
@ -209,4 +209,5 @@
<string name="send_log_file">Надіслати лог-файл</string> <string name="send_log_file">Надіслати лог-файл</string>
<string name="send_log_file_description">Надіслати лог-файл розробникам електронною поштою</string> <string name="send_log_file_description">Надіслати лог-файл розробникам електронною поштою</string>
<string name="login_to_your_account">Увійдіть у свій обліковий запис</string> <string name="login_to_your_account">Увійдіть у свій обліковий запис</string>
<string name="nearby_location_has_not_changed">Розташування не змінено</string>
</resources> </resources>

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 763 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 KiB