diff --git a/CHANGELOG.md b/CHANGELOG.md index df1c2d2af..a25d9fe2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Wikimedia Commons for Android +## v2.6.5 beta +- Changed "send log" feature to only send logs to private Google group forum +- Switched to using Wikimedia maps server instead of Mapbox for privacy reasons +- Removed event logging from app for privacy reasons +- Fixed crash caused by rapidly switching from Nearby map to list while loading + ## v2.6.4 beta - Excluded httpclient and commons-logging to fix release build errors - Fixed crashes caused by Fresco and Dagger diff --git a/app/build.gradle b/app/build.gradle index d9cd7a7c5..184e756ac 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -83,8 +83,8 @@ android { defaultConfig { applicationId 'fr.free.nrw.commons' - versionCode 79 - versionName '2.6.4' + versionCode 80 + versionName '2.6.5' setProperty("archivesBaseName", "app-commons-v$versionName-" + getBranchName()) minSdkVersion project.minSdkVersion diff --git a/app/src/main/java/fr/free/nrw/commons/AboutActivity.java b/app/src/main/java/fr/free/nrw/commons/AboutActivity.java index 0ef5fa171..6ed1bba1d 100644 --- a/app/src/main/java/fr/free/nrw/commons/AboutActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/AboutActivity.java @@ -8,10 +8,18 @@ import butterknife.ButterKnife; import fr.free.nrw.commons.theme.NavigationBaseActivity; import fr.free.nrw.commons.ui.widget.HtmlTextView; +/** + * Represents about screen of this app + */ public class AboutActivity extends NavigationBaseActivity { @BindView(R.id.about_version) TextView versionText; @BindView(R.id.about_license) HtmlTextView aboutLicenseText; + /** + * This method helps in the creation About screen + * + * @param savedInstanceState Data bundle + */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java index 9a7b94a99..ee0f10019 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -49,16 +49,21 @@ public class CommonsApplication extends DaggerApplication { @Inject @Named("default_preferences") SharedPreferences defaultPrefs; @Inject @Named("application_preferences") SharedPreferences applicationPrefs; @Inject @Named("prefs") SharedPreferences otherPrefs; - + 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 LOGS_PRIVATE_EMAIL = "commons-app-android-private@googlegroups.com"; + public static final String FEEDBACK_EMAIL_SUBJECT = "Commons Android App (%s) Feedback"; - + private CommonsApplicationComponent component; private RefWatcher refWatcher; + /** + * Used to declare and initialize various components and dependencies + */ @Override public void onCreate() { super.onCreate(); @@ -80,23 +85,41 @@ public class CommonsApplication extends DaggerApplication { System.setProperty("in.yuvi.http.fluent.PROGRESS_TRIGGER_THRESHOLD", "3.0"); } + /** + * Helps in setting up LeakCanary library + * @return instance of LeakCanary + */ protected RefWatcher setupLeakCanary() { if (LeakCanary.isInAnalyzerProcess(this)) { return RefWatcher.DISABLED; } return LeakCanary.install(this); } - + + /** + * Provides a way to get member refWatcher + * + * @param context Application context + * @return application member refWatcher + */ public static RefWatcher getRefWatcher(Context context) { CommonsApplication application = (CommonsApplication) context.getApplicationContext(); return application.refWatcher; } - + + /** + * Helps in injecting dependency library Dagger + * @return Dagger injector + */ @Override - protected AndroidInjector applicationInjector() { + protected AndroidInjector applicationInjector() { return injector(); } + /** + * used to create injector of application component + * @return Application component of Dagger + */ public CommonsApplicationComponent injector() { if (component == null) { component = DaggerCommonsApplicationComponent.builder() @@ -106,6 +129,11 @@ public class CommonsApplication extends DaggerApplication { return component; } + /** + * clears data of current application + * @param context Application context + * @param logoutListener Implementation of interface LogoutListener + */ public void clearApplicationData(Context context, LogoutListener logoutListener) { File cacheDirectory = context.getCacheDir(); File applicationDirectory = new File(cacheDirectory.getParent()); @@ -145,6 +173,9 @@ public class CommonsApplication extends DaggerApplication { Contribution.Table.onDelete(db); } + /** + * Interface used to get log-out events + */ public interface LogoutListener { void onLogoutComplete(); } diff --git a/app/src/main/java/fr/free/nrw/commons/License.java b/app/src/main/java/fr/free/nrw/commons/License.java index 7b75cfda8..db893de16 100644 --- a/app/src/main/java/fr/free/nrw/commons/License.java +++ b/app/src/main/java/fr/free/nrw/commons/License.java @@ -2,6 +2,9 @@ package fr.free.nrw.commons; import android.support.annotation.Nullable; +/** + * represents Licence object + */ public class License { private String key; private String template; @@ -56,6 +59,12 @@ public class License { } } + /** + * Gets the license URL + * + * @param language license language + * @return URL + */ public @Nullable String getUrl(String language) { if (url == null) { return null; diff --git a/app/src/main/java/fr/free/nrw/commons/LicenseList.java b/app/src/main/java/fr/free/nrw/commons/LicenseList.java index ab32f8815..d08e314cc 100644 --- a/app/src/main/java/fr/free/nrw/commons/LicenseList.java +++ b/app/src/main/java/fr/free/nrw/commons/LicenseList.java @@ -13,10 +13,18 @@ import java.util.HashMap; import java.util.Locale; import java.util.Map; +/** + * Represents a list of Licenses + */ public class LicenseList { private Map licenses = new HashMap<>(); private Resources res; + /** + * Constructs new instance of LicenceList + * + * @param activity License activity + */ public LicenseList(Activity activity) { res = activity.getResources(); XmlPullParser parser = res.getXml(R.xml.wikimedia_licenses); @@ -31,14 +39,28 @@ public class LicenseList { } } + /** + * Gets a collection of licenses + * @return License values + */ public Collection values() { return licenses.values(); } + /** + * Gets license + * @param key License key + * @return License that matches key + */ public License get(String key) { return licenses.get(key); } + /** + * Creates a license from template + * @param template License template + * @return null + */ @Nullable License licenseForTemplate(String template) { String ucTemplate = new PageTitle(template).getDisplayText(); @@ -50,6 +72,11 @@ public class LicenseList { return null; } + /** + * Gets template name id + * @param template License template + * @return name id of template + */ private String nameIdForTemplate(String template) { // hack :D (converts dashes and periods to underscores) // cc-by-sa-3.0 -> cc_by_sa_3_0 @@ -57,6 +84,11 @@ public class LicenseList { "_").replace(".", "_"); } + /** + * Gets name of given template + * @param template License template + * @return name of template + */ private String nameForTemplate(String template) { int nameId = res.getIdentifier("fr.free.nrw.commons:string/" + nameIdForTemplate(template), null, null); @@ -92,4 +124,4 @@ public class LicenseList { } } -} \ No newline at end of file +} diff --git a/app/src/main/java/fr/free/nrw/commons/Media.java b/app/src/main/java/fr/free/nrw/commons/Media.java index c75aae2a5..726d787f3 100644 --- a/app/src/main/java/fr/free/nrw/commons/Media.java +++ b/app/src/main/java/fr/free/nrw/commons/Media.java @@ -47,16 +47,35 @@ public class Media implements Parcelable { private HashMap tags = new HashMap<>(); private @Nullable LatLng coordinates; + /** + * Provides local constructor + */ protected Media() { this.categories = new ArrayList<>(); this.descriptions = new HashMap<>(); } + /** + * Provides a minimal constructor + * + * @param filename Media filename + */ public Media(String filename) { this(); this.filename = filename; } + /** + * Provide Media constructor + * @param localUri Media URI + * @param imageUrl Media image URL + * @param filename Media filename + * @param description Media description + * @param dataLength Media date length + * @param dateCreated Media creation date + * @param dateUploaded Media date uploaded + * @param creator Media creator + */ public Media(Uri localUri, String imageUrl, String filename, String description, long dataLength, Date dateCreated, @Nullable Date dateUploaded, String creator) { this(); @@ -90,19 +109,33 @@ public class Media implements Parcelable { descriptions = in.readHashMap(ClassLoader.getSystemClassLoader()); } + /** + * Gets tag of media + * @param key Media key + * @return Media tag + */ public Object getTag(String key) { return tags.get(key); } + /** + * Modifies( or creates a) tag of media + * @param key Media key + * @param value Media value + */ public void setTag(String key, Object value) { tags.put(key, value); } + /** + * Gets media display title + * @return Media title + */ public String getDisplayTitle() { if (filename == null) { return ""; } - // FIXME: Gross hack bercause my regex skills suck maybe or I am too lazy who knows + // FIXME: Gross hack because my regex skills suck maybe or I am too lazy who knows String title = getFilePageTitle().getDisplayText().replaceFirst("^File:", ""); Matcher matcher = displayTitlePattern.matcher(title); if (matcher.matches()) { @@ -112,14 +145,27 @@ public class Media implements Parcelable { } } + /** + * Gets file page title + * @return New media page title + */ public PageTitle getFilePageTitle() { return new PageTitle("File:" + getFilename().replaceFirst("^File:", "")); } + /** + * Gets local URI + * @return Media local URI + */ public Uri getLocalUri() { return localUri; } + /** + * Gets image URL + * can be null. + * @return Image URL + */ @Nullable public String getImageUrl() { if (imageUrl == null && this.getFilename() != null) { @@ -304,6 +350,10 @@ public class Media implements Parcelable { this.categories.addAll(categories); } + /** + * Modifies (or sets) media descriptions + * @param descriptions Media descriptions + */ void setDescriptions(Map descriptions) { for (String key : this.descriptions.keySet()) { this.descriptions.remove(key); @@ -313,6 +363,11 @@ public class Media implements Parcelable { } } + /** + * Gets media description in preferred language + * @param preferredLanguage Language preferred + * @return Description in preferred language + */ public String getDescription(String preferredLanguage) { if (descriptions.containsKey(preferredLanguage)) { // See if the requested language is there. @@ -329,11 +384,21 @@ public class Media implements Parcelable { } } + /** + * Method of Parcelable interface + * @return zero + */ @Override public int describeContents() { return 0; } + /** + * Creates a way to transfer information between two or more + * activities. + * @param parcel Instance of Parcel + * @param flags Parcel flag + */ @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeParcelable(localUri, flags); diff --git a/app/src/main/java/fr/free/nrw/commons/Utils.java b/app/src/main/java/fr/free/nrw/commons/Utils.java index 87dab7f68..967f2cf8e 100644 --- a/app/src/main/java/fr/free/nrw/commons/Utils.java +++ b/app/src/main/java/fr/free/nrw/commons/Utils.java @@ -37,12 +37,23 @@ public class Utils { } } + /** + * Creates an URL for thumbnail + * + * @param filename Thumbnail file name + * @return URL of thumbnail + */ public static String makeThumbBaseUrl(@NonNull String filename) { String name = new PageTitle(filename).getPrefixedText(); String sha = new String(Hex.encodeHex(DigestUtils.md5(name))); return String.format("%s/%s/%s/%s", BuildConfig.IMAGE_URL_BASE, sha.substring(0, 1), sha.substring(0, 2), urlEncode(name)); } + /** + * URL Encode an URL in UTF-8 format + * @param url Unformatted URL + * @return Encoded URL + */ public static String urlEncode(String url) { try { return URLEncoder.encode(url, "utf-8"); @@ -61,6 +72,11 @@ public class Utils { return string.substring(0, 1).toUpperCase(Locale.getDefault()) + string.substring(1); } + /** + * Generates licence name with given ID + * @param license License ID + * @return Name of license + */ public static int licenseNameFor(String license) { switch (license) { case Prefs.Licenses.CC_BY_3: @@ -81,6 +97,12 @@ public class Utils { throw new RuntimeException("Unrecognized license value: " + license); } + /** + * Fixing incorrect extension + * @param title File name + * @param extension Correct extension + * @return File with correct extension + */ public static String fixExtension(String title, String extension) { Pattern jpegPattern = Pattern.compile("\\.jpeg$", Pattern.CASE_INSENSITIVE); @@ -96,6 +118,11 @@ public class Utils { return title; } + /** + * Tells whether dark theme is active or not + * @param context Activity context + * @return The state of dark theme + */ public static boolean isDarkTheme(Context context) { return PreferenceManager.getDefaultSharedPreferences(context).getBoolean("theme", false); } diff --git a/app/src/main/java/fr/free/nrw/commons/WelcomeActivity.java b/app/src/main/java/fr/free/nrw/commons/WelcomeActivity.java index f6c5999e9..7bfb22890 100644 --- a/app/src/main/java/fr/free/nrw/commons/WelcomeActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/WelcomeActivity.java @@ -18,6 +18,11 @@ public class WelcomeActivity extends BaseActivity { private WelcomePagerAdapter adapter = new WelcomePagerAdapter(); + /** + * Initialises exiting fields and dependencies + * + * @param savedInstanceState WelcomeActivity bundled data + */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -30,12 +35,20 @@ public class WelcomeActivity extends BaseActivity { adapter.setCallback(this::finish); } + /** + * References WelcomePageAdapter to null before the activity is destroyed + */ @Override public void onDestroy() { adapter.setCallback(null); super.onDestroy(); } + /** + * Creates a way to change current activity to WelcomeActivity + * + * @param context Activity context + */ public static void startYourself(Context context) { Intent welcomeIntent = new Intent(context, WelcomeActivity.class); context.startActivity(welcomeIntent); diff --git a/app/src/main/java/fr/free/nrw/commons/WelcomePagerAdapter.java b/app/src/main/java/fr/free/nrw/commons/WelcomePagerAdapter.java index 9669196e9..a346655cf 100644 --- a/app/src/main/java/fr/free/nrw/commons/WelcomePagerAdapter.java +++ b/app/src/main/java/fr/free/nrw/commons/WelcomePagerAdapter.java @@ -10,13 +10,6 @@ import butterknife.ButterKnife; import butterknife.OnClick; public class WelcomePagerAdapter extends PagerAdapter { - private static final int PAGE_FINAL = 4; - private Callback callback; - - public interface Callback { - void onYesClicked(); - } - static final int[] PAGE_LAYOUTS = new int[]{ R.layout.welcome_wikipedia, R.layout.welcome_do_upload, @@ -24,16 +17,34 @@ public class WelcomePagerAdapter extends PagerAdapter { R.layout.welcome_image_details, R.layout.welcome_final }; + private static final int PAGE_FINAL = 4; + private Callback callback; + /** + * Changes callback to provided one + * + * @param callback New callback + * it can be null. + */ public void setCallback(@Nullable Callback callback) { this.callback = callback; } + /** + * Gets total number of layouts + * @return Number of layouts + */ @Override public int getCount() { return PAGE_LAYOUTS.length; } + /** + * Compares given view with provided object + * @param view Adapter view + * @param object Adapter object + * @return Equality between view and object + */ @Override public boolean isViewFromObject(View view, Object object) { return (view == object); @@ -52,16 +63,29 @@ public class WelcomePagerAdapter extends PagerAdapter { return layout; } + /** + * Provides a way to remove an item from container + * @param container Adapter view group container + * @param position Index of item + * @param obj Adapter object + */ @Override public void destroyItem(ViewGroup container, int position, Object obj) { container.removeView((View) obj); } + public interface Callback { + void onYesClicked(); + } + class ViewHolder { ViewHolder(View view) { ButterKnife.bind(this, view); } + /** + * Triggers on click callback on button click + */ @OnClick(R.id.welcomeYesButton) void onClicked() { if (callback != null) { diff --git a/app/src/main/java/fr/free/nrw/commons/data/Category.java b/app/src/main/java/fr/free/nrw/commons/data/Category.java index 757f6b691..be4a29846 100644 --- a/app/src/main/java/fr/free/nrw/commons/data/Category.java +++ b/app/src/main/java/fr/free/nrw/commons/data/Category.java @@ -14,6 +14,9 @@ import java.util.Date; import fr.free.nrw.commons.category.CategoryContentProvider; +/** + * Represents a category + */ public class Category { private Uri contentUri; @@ -22,36 +25,72 @@ public class Category { private int timesUsed; // Getters/setters + /** + * Gets name + * + * @return name + */ public String getName() { return name; } + /** + * Modifies name + * + * @param name Category name + */ public void setName(String name) { this.name = name; } + /** + * Gets last used date + * + * @return Last used date + */ private Date getLastUsed() { // warning: Date objects are mutable. return (Date)lastUsed.clone(); } + /** + * Modifies last used date + * + * @param lastUsed Category date + */ public void setLastUsed(Date lastUsed) { // warning: Date objects are mutable. this.lastUsed = (Date)lastUsed.clone(); } + /** + * Generates new last used date + */ private void touch() { lastUsed = new Date(); } + /** + * Gets no. of times the category is used + * + * @return no. of times used + */ private int getTimesUsed() { return timesUsed; } + /** + * Modifies no. of times used + * + * @param timesUsed Category used times + */ public void setTimesUsed(int timesUsed) { this.timesUsed = timesUsed; } + /** + * Increments timesUsed by 1 and sets last used date as now. + */ public void incTimesUsed() { timesUsed++; touch(); @@ -75,6 +114,11 @@ public class Category { } } + /** + * Gets content values + * + * @return Content values + */ private ContentValues toContentValues() { ContentValues cv = new ContentValues(); cv.put(Table.COLUMN_NAME, getName()); @@ -83,6 +127,11 @@ public class Category { return cv; } + /** + * Gets category from cursor + * @param cursor Category cursor + * @return Category from cursor + */ private static Category fromCursor(Cursor cursor) { // Hardcoding column positions! Category c = new Category(); @@ -175,15 +224,30 @@ public class Category { + COLUMN_TIMES_USED + " INTEGER" + ");"; + /** + * Creates new table with provided SQLite database + * + * @param db Category database + */ public static void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE_STATEMENT); } + /** + * Deletes existing table + * @param db Category database + */ public static void onDelete(SQLiteDatabase db) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); } + /** + * Updates given database + * @param db Category database + * @param from Exiting category id + * @param to New category id + */ public static void onUpdate(SQLiteDatabase db, int from, int to) { if (from == to) { return; @@ -209,4 +273,4 @@ public class Category { } } //endregion -} +} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/location/LatLng.java b/app/src/main/java/fr/free/nrw/commons/location/LatLng.java index 4bb5277c0..a4948c66f 100644 --- a/app/src/main/java/fr/free/nrw/commons/location/LatLng.java +++ b/app/src/main/java/fr/free/nrw/commons/location/LatLng.java @@ -134,4 +134,4 @@ public class LatLng { public Uri getGmmIntentUri() { return Uri.parse("geo:0,0?q=" + latitude + "," + longitude); } -} +} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java index 718ee4f58..75e366767 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java @@ -384,7 +384,7 @@ public class MediaDetailFragment extends DaggerFragment { private void openMap(LatLng coordinates) { //Open map app at given position Uri gmmIntentUri = Uri.parse( - "geo:0,0?q=" + coordinates.getLatitude() + "," + coordinates.getLatitude()); + "geo:0,0?q=" + coordinates.getLatitude() + "," + coordinates.getLongitude()); Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); if (mapIntent.resolveActivity(getActivity().getPackageManager()) != null) { diff --git a/app/src/main/java/fr/free/nrw/commons/mwapi/LogBuilder.java b/app/src/main/java/fr/free/nrw/commons/mwapi/LogBuilder.java index 7a4b294fa..2a2456cc3 100644 --- a/app/src/main/java/fr/free/nrw/commons/mwapi/LogBuilder.java +++ b/app/src/main/java/fr/free/nrw/commons/mwapi/LogBuilder.java @@ -22,6 +22,14 @@ public class LogBuilder { private final String schema; private final SharedPreferences prefs; + /** + * Main constructor of LogBuilder + * + * @param schema Log schema + * @param revision Log revision + * @param mwApi Wiki media API instance + * @param prefs Instance of SharedPreferences + */ LogBuilder(String schema, long revision, MediaWikiApi mwApi, SharedPreferences prefs) { this.prefs = prefs; this.data = new JSONObject(); @@ -30,6 +38,12 @@ public class LogBuilder { this.mwApi = mwApi; } + /** + * Adds data to preferences + * @param key Log key + * @param value Log object value + * @return LogBuilder + */ public LogBuilder param(String key, Object value) { try { data.put(key, value); @@ -39,6 +53,10 @@ public class LogBuilder { return this; } + /** + * Encodes JSON object to URL + * @return URL to JSON object + */ URL toUrl() { JSONObject fullData = new JSONObject(); try { @@ -65,7 +83,7 @@ public class LogBuilder { LogTask logTask = new LogTask(mwApi); logTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, this); } - + public void log() { log(false); } diff --git a/app/src/main/java/fr/free/nrw/commons/mwapi/LogTask.java b/app/src/main/java/fr/free/nrw/commons/mwapi/LogTask.java index 3fce8aaf1..e564a50ab 100644 --- a/app/src/main/java/fr/free/nrw/commons/mwapi/LogTask.java +++ b/app/src/main/java/fr/free/nrw/commons/mwapi/LogTask.java @@ -6,10 +6,20 @@ class LogTask extends AsyncTask { private final MediaWikiApi mwApi; + /** + * Main constructor of LogTask + * + * @param mwApi Media wiki API instance + */ public LogTask(MediaWikiApi mwApi) { this.mwApi = mwApi; } + /** + * Logs events in background + * @param logBuilders LogBuilder instance + * @return Background success state ( TRUE or FALSE ) + */ @Override protected Boolean doInBackground(LogBuilder... logBuilders) { return mwApi.logEvents(logBuilders); diff --git a/app/src/main/java/fr/free/nrw/commons/mwapi/MediaResult.java b/app/src/main/java/fr/free/nrw/commons/mwapi/MediaResult.java index cfddf8c15..f2f34ce6d 100644 --- a/app/src/main/java/fr/free/nrw/commons/mwapi/MediaResult.java +++ b/app/src/main/java/fr/free/nrw/commons/mwapi/MediaResult.java @@ -4,15 +4,29 @@ public class MediaResult { private final String wikiSource; private final String parseTreeXmlSource; + /** + * Full-fledged constructor of MediaResult + * + * @param wikiSource Media wiki source + * @param parseTreeXmlSource Media tree parsed in XML + */ MediaResult(String wikiSource, String parseTreeXmlSource) { this.wikiSource = wikiSource; this.parseTreeXmlSource = parseTreeXmlSource; } + /** + * Gets wiki source + * @return Wiki source + */ public String getWikiSource() { return wikiSource; } + /** + * Gets tree parsed in XML + * @return XML parsed tree + */ public String getParseTreeXmlSource() { return parseTreeXmlSource; } diff --git a/app/src/main/java/fr/free/nrw/commons/mwapi/UploadResult.java b/app/src/main/java/fr/free/nrw/commons/mwapi/UploadResult.java index 34d050b2c..9422497b3 100644 --- a/app/src/main/java/fr/free/nrw/commons/mwapi/UploadResult.java +++ b/app/src/main/java/fr/free/nrw/commons/mwapi/UploadResult.java @@ -9,11 +9,24 @@ public class UploadResult { private String imageUrl; private String canonicalFilename; + /** + * Minimal constructor + * + * @param resultStatus Upload result status + * @param errorCode Upload error code + */ UploadResult(String resultStatus, String errorCode) { this.resultStatus = resultStatus; this.errorCode = errorCode; } + /** + * Full-fledged constructor + * @param resultStatus Upload result status + * @param dateUploaded Uploaded date + * @param canonicalFilename Uploaded file name + * @param imageUrl Uploaded image file name + */ UploadResult(String resultStatus, Date dateUploaded, String canonicalFilename, String imageUrl) { this.resultStatus = resultStatus; this.dateUploaded = dateUploaded; @@ -21,22 +34,42 @@ public class UploadResult { this.imageUrl = imageUrl; } + /** + * Gets uploaded date + * @return Upload date + */ public Date getDateUploaded() { return dateUploaded; } + /** + * Gets image url + * @return Uploaded image url + */ public String getImageUrl() { return imageUrl; } + /** + * Gets canonical file name + * @return Uploaded file name + */ public String getCanonicalFilename() { return canonicalFilename; } + /** + * Gets upload error code + * @return Error code + */ public String getErrorCode() { return errorCode; } + /** + * Gets upload result status + * @return Upload result status + */ public String getResultStatus() { return resultStatus; } diff --git a/app/src/main/java/fr/free/nrw/commons/settings/SettingsActivity.java b/app/src/main/java/fr/free/nrw/commons/settings/SettingsActivity.java index d731c70d1..54b462097 100644 --- a/app/src/main/java/fr/free/nrw/commons/settings/SettingsActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/settings/SettingsActivity.java @@ -1,55 +1,70 @@ -package fr.free.nrw.commons.settings; - -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.support.v7.app.AppCompatDelegate; -import android.view.MenuItem; - -import butterknife.ButterKnife; -import fr.free.nrw.commons.R; -import fr.free.nrw.commons.theme.NavigationBaseActivity; - -public class SettingsActivity extends NavigationBaseActivity { - private AppCompatDelegate settingsDelegate; - - @Override - protected void onCreate(Bundle savedInstanceState) { - // Check prefs on every activity starts - if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("theme",false)) { - setTheme(R.style.DarkAppTheme); - } else { - setTheme(R.style.LightAppTheme); - } - - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_settings); - - ButterKnife.bind(this); - initDrawer(); - } - - // Get an action bar - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - if (settingsDelegate == null) { - settingsDelegate = AppCompatDelegate.create(this, null); - } - settingsDelegate.onPostCreate(savedInstanceState); - - //Get an up button - //settingsDelegate.getSupportActionBar().setDisplayHomeAsUpEnabled(true); - } - - //Handle action-bar clicks - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - finish(); - return true; - default: - return super.onOptionsItemSelected(item); - } - } +package fr.free.nrw.commons.settings; + +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.support.v7.app.AppCompatDelegate; +import android.view.MenuItem; + +import butterknife.ButterKnife; +import fr.free.nrw.commons.R; +import fr.free.nrw.commons.theme.NavigationBaseActivity; + +/** + * allows the user to change the settings + */ +public class SettingsActivity extends NavigationBaseActivity { + private AppCompatDelegate settingsDelegate; + + /** + * to be called when the activity starts + * @param savedInstanceState the previously saved state + */ + @Override + protected void onCreate(Bundle savedInstanceState) { + // Check prefs on every activity starts + if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("theme",false)) { + setTheme(R.style.DarkAppTheme); + } else { + setTheme(R.style.LightAppTheme); + } + + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_settings); + + ButterKnife.bind(this); + initDrawer(); + } + + // Get an action bar + /** + * takes care of actions taken after the creation has happened + * @param savedInstanceState the saved state + */ + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + if (settingsDelegate == null) { + settingsDelegate = AppCompatDelegate.create(this, null); + } + settingsDelegate.onPostCreate(savedInstanceState); + + //Get an up button + //settingsDelegate.getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + + /** + * Handle action-bar clicks + * @param item the selected item + * @return true on success, false on failure + */ + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } } \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/ui/widget/CompatTextView.java b/app/src/main/java/fr/free/nrw/commons/ui/widget/CompatTextView.java index 2508877ed..a04f7f8c8 100644 --- a/app/src/main/java/fr/free/nrw/commons/ui/widget/CompatTextView.java +++ b/app/src/main/java/fr/free/nrw/commons/ui/widget/CompatTextView.java @@ -1,73 +1,96 @@ -package fr.free.nrw.commons.ui.widget; - -/** - * Created by mikel on 07/08/2017. - */ - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.drawable.Drawable; -import android.support.annotation.Nullable; -import android.support.v4.view.ViewCompat; -import android.support.v7.widget.AppCompatDrawableManager; -import android.support.v7.widget.AppCompatTextView; -import android.util.AttributeSet; - -import fr.free.nrw.commons.R; -import fr.free.nrw.commons.utils.UiUtils; - -public class CompatTextView extends AppCompatTextView { - public CompatTextView(Context context) { - super(context); - init(null); - } - - public CompatTextView(Context context, AttributeSet attrs) { - super(context, attrs); - init(attrs); - } - - public CompatTextView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(attrs); - } - - private void init(@Nullable AttributeSet attrs) { - if (attrs != null) { - Context context = getContext(); - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CompatTextView); - - // Obtain DrawableManager used to pull Drawables safely, and check if we're in RTL - AppCompatDrawableManager dm = AppCompatDrawableManager.get(); - boolean rtl = ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL; - - // Grab the compat drawable padding from the XML - float drawablePadding = a.getDimension(R.styleable.CompatTextView_drawablePadding, 0); - - // Grab the compat drawable resources from the XML - int startDrawableRes = a.getResourceId(R.styleable.CompatTextView_drawableStart, 0); - int topDrawableRes = a.getResourceId(R.styleable.CompatTextView_drawableTop, 0); - int endDrawableRes = a.getResourceId(R.styleable.CompatTextView_drawableEnd, 0); - int bottomDrawableRes = a.getResourceId(R.styleable.CompatTextView_drawableBottom, 0); - - // Load the used drawables, fall back to whatever was set in an "android:" - Drawable[] currentDrawables = getCompoundDrawables(); - Drawable left = startDrawableRes != 0 - ? dm.getDrawable(context, startDrawableRes) : currentDrawables[0]; - Drawable right = endDrawableRes != 0 - ? dm.getDrawable(context, endDrawableRes) : currentDrawables[1]; - Drawable top = topDrawableRes != 0 - ? dm.getDrawable(context, topDrawableRes) : currentDrawables[2]; - Drawable bottom = bottomDrawableRes != 0 - ? dm.getDrawable(context, bottomDrawableRes) : currentDrawables[3]; - - // Account for RTL and apply the compound Drawables - Drawable start = rtl ? right : left; - Drawable end = rtl ? left : right; - setCompoundDrawablesWithIntrinsicBounds(start, top, end, bottom); - setCompoundDrawablePadding((int) UiUtils.convertDpToPixel(drawablePadding, getContext())); - - a.recycle(); - } - } -} +package fr.free.nrw.commons.ui.widget; + +/** + * Created by mikel on 07/08/2017. + */ + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.support.annotation.Nullable; +import android.support.v4.view.ViewCompat; +import android.support.v7.widget.AppCompatDrawableManager; +import android.support.v7.widget.AppCompatTextView; +import android.util.AttributeSet; + +import fr.free.nrw.commons.R; +import fr.free.nrw.commons.utils.UiUtils; + +/** + * a text view compatible with older versions of the platform + */ +public class CompatTextView extends AppCompatTextView { + + /** + * Constructs a new instance of CompatTextView + * @param context the view context + */ + public CompatTextView(Context context) { + super(context); + init(null); + } + + /** + * Constructs a new instance of CompatTextView + * @param context the view context + * @param attrs the set of attributes for the view + */ + public CompatTextView(Context context, AttributeSet attrs) { + super(context, attrs); + init(attrs); + } + + /** + * Constructs a new instance of CompatTextView + * @param context + * @param attrs + * @param defStyleAttr + */ + public CompatTextView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(attrs); + } + + /** + * initializes the view + * @param attrs the attribute set of the view, which can be null + */ + private void init(@Nullable AttributeSet attrs) { + if (attrs != null) { + Context context = getContext(); + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CompatTextView); + + // Obtain DrawableManager used to pull Drawables safely, and check if we're in RTL + AppCompatDrawableManager dm = AppCompatDrawableManager.get(); + boolean rtl = ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL; + + // Grab the compat drawable padding from the XML + float drawablePadding = a.getDimension(R.styleable.CompatTextView_drawablePadding, 0); + + // Grab the compat drawable resources from the XML + int startDrawableRes = a.getResourceId(R.styleable.CompatTextView_drawableStart, 0); + int topDrawableRes = a.getResourceId(R.styleable.CompatTextView_drawableTop, 0); + int endDrawableRes = a.getResourceId(R.styleable.CompatTextView_drawableEnd, 0); + int bottomDrawableRes = a.getResourceId(R.styleable.CompatTextView_drawableBottom, 0); + + // Load the used drawables, fall back to whatever was set in an "android:" + Drawable[] currentDrawables = getCompoundDrawables(); + Drawable left = startDrawableRes != 0 + ? dm.getDrawable(context, startDrawableRes) : currentDrawables[0]; + Drawable right = endDrawableRes != 0 + ? dm.getDrawable(context, endDrawableRes) : currentDrawables[1]; + Drawable top = topDrawableRes != 0 + ? dm.getDrawable(context, topDrawableRes) : currentDrawables[2]; + Drawable bottom = bottomDrawableRes != 0 + ? dm.getDrawable(context, bottomDrawableRes) : currentDrawables[3]; + + // Account for RTL and apply the compound Drawables + Drawable start = rtl ? right : left; + Drawable end = rtl ? left : right; + setCompoundDrawablesWithIntrinsicBounds(start, top, end, bottom); + setCompoundDrawablePadding((int) UiUtils.convertDpToPixel(drawablePadding, getContext())); + + a.recycle(); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/ui/widget/HtmlTextView.java b/app/src/main/java/fr/free/nrw/commons/ui/widget/HtmlTextView.java index e7f5eaeeb..4e73776c1 100644 --- a/app/src/main/java/fr/free/nrw/commons/ui/widget/HtmlTextView.java +++ b/app/src/main/java/fr/free/nrw/commons/ui/widget/HtmlTextView.java @@ -1,42 +1,51 @@ -package fr.free.nrw.commons.ui.widget; - -import android.content.Context; -import android.os.Build; -import android.support.v7.widget.AppCompatTextView; -import android.text.Html; -import android.text.Spanned; -import android.text.method.LinkMovementMethod; -import android.util.AttributeSet; - -/** - * An {@link AppCompatTextView} which formats the text to HTML displayable text and makes any - * links clickable. - */ -public class HtmlTextView extends AppCompatTextView { - - public HtmlTextView(Context context, AttributeSet attrs) { - super(context, attrs); - - setMovementMethod(LinkMovementMethod.getInstance()); - setText(fromHtml(getText().toString())); - } - - public void setHtmlText(String newText) { - setText(fromHtml(newText)); - } - - /** - * Fix Html.fromHtml is deprecated problem - * - * @param source provided Html string - * @return returned Spanned of appropriate method according to version check - */ - private static Spanned fromHtml(String source) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - return Html.fromHtml(source, Html.FROM_HTML_MODE_LEGACY); - } else { - //noinspection deprecation - return Html.fromHtml(source); - } - } -} +package fr.free.nrw.commons.ui.widget; + +import android.content.Context; +import android.os.Build; +import android.support.v7.widget.AppCompatTextView; +import android.text.Html; +import android.text.Spanned; +import android.text.method.LinkMovementMethod; +import android.util.AttributeSet; + +/** + * An {@link AppCompatTextView} which formats the text to HTML displayable text and makes any + * links clickable. + */ +public class HtmlTextView extends AppCompatTextView { + + /** + * Constructs a new instance of HtmlTextView + * @param context the context of the view + * @param attrs the set of attributes for the view + */ + public HtmlTextView(Context context, AttributeSet attrs) { + super(context, attrs); + + setMovementMethod(LinkMovementMethod.getInstance()); + setText(fromHtml(getText().toString())); + } + + /** + * Sets the text to be displayed + * @param newText the text to be displayed + */ + public void setHtmlText(String newText) { + setText(fromHtml(newText)); + } + + /** + * Fix Html.fromHtml is deprecated problem + * + * @param source provided Html string + * @return returned Spanned of appropriate method according to version check + */ + private static Spanned fromHtml(String source) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + return Html.fromHtml(source, Html.FROM_HTML_MODE_LEGACY); + } else { + //noinspection deprecation + return Html.fromHtml(source); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java b/app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java index 6b2913d6d..bf7742843 100644 --- a/app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java +++ b/app/src/main/java/fr/free/nrw/commons/ui/widget/OverlayDialog.java @@ -1,46 +1,69 @@ -package fr.free.nrw.commons.ui.widget; - -import android.app.Dialog; -import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.view.Gravity; -import android.view.View; -import android.view.Window; -import android.view.WindowManager; - -public abstract class OverlayDialog extends DialogFragment { - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setStyle(STYLE_NO_FRAME, android.R.style.Theme_Holo_Light); - } - - @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - setDialogLayoutToFullScreen(); - super.onViewCreated(view, savedInstanceState); - } - - private void setDialogLayoutToFullScreen() { - Window window = getDialog().getWindow(); - WindowManager.LayoutParams wlp = window.getAttributes(); - window.requestFeature(Window.FEATURE_NO_TITLE); - wlp.gravity = Gravity.BOTTOM; - wlp.width = WindowManager.LayoutParams.MATCH_PARENT; - wlp.height = WindowManager.LayoutParams.MATCH_PARENT; - window.setAttributes(wlp); - } - - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - Dialog dialog = super.onCreateDialog(savedInstanceState); - Window window = dialog.getWindow(); - window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); - return dialog; - } -} \ No newline at end of file +package fr.free.nrw.commons.ui.widget; + +import android.app.Dialog; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.DialogFragment; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +/** + * a formatted dialog fragment + * This class is used by NearbyInfoDialog + */ +public abstract class OverlayDialog extends DialogFragment { + + /** + * creates a DialogFragment with the correct style and theme + * @param savedInstanceState + */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setStyle(STYLE_NO_FRAME, android.R.style.Theme_Holo_Light); + } + + /** + * When the view is created, sets the dialog layout to full screen + * + * @param view the view being used + * @param savedInstanceState bundle re-constructed from a previous saved state + */ + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + setDialogLayoutToFullScreen(); + super.onViewCreated(view, savedInstanceState); + } + + /** + * sets the dialog layout to fullscreen + */ + private void setDialogLayoutToFullScreen() { + Window window = getDialog().getWindow(); + WindowManager.LayoutParams wlp = window.getAttributes(); + window.requestFeature(Window.FEATURE_NO_TITLE); + wlp.gravity = Gravity.BOTTOM; + wlp.width = WindowManager.LayoutParams.MATCH_PARENT; + wlp.height = WindowManager.LayoutParams.MATCH_PARENT; + window.setAttributes(wlp); + } + + /** + * builds custom dialog container + * + * @param savedInstanceState the previously saved state + * @return the dialog + */ + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + Dialog dialog = super.onCreateDialog(savedInstanceState); + Window window = dialog.getWindow(); + window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + return dialog; + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/utils/LengthUtils.java b/app/src/main/java/fr/free/nrw/commons/utils/LengthUtils.java index 6fd9f9612..8b687164b 100644 --- a/app/src/main/java/fr/free/nrw/commons/utils/LengthUtils.java +++ b/app/src/main/java/fr/free/nrw/commons/utils/LengthUtils.java @@ -37,6 +37,13 @@ public class LengthUtils { return computeAngleBetween(from, to) * 6371009.0D; // Earth's radius in meter } + /** + * Computes angle between two points + * + * @param from Point A + * @param to Point B + * @return Angle in radius + */ private static double computeAngleBetween(LatLng from, LatLng to) { return distanceRadians(Math.toRadians(from.getLatitude()), Math.toRadians(from.getLongitude()), @@ -44,18 +51,43 @@ public class LengthUtils { Math.toRadians(to.getLongitude())); } + /** + * Computes arc length between 2 points + * @param lat1 Latitude of point A + * @param lng1 Longitude of point A + * @param lat2 Latitude of point B + * @param lng2 Longitude of point B + * @return Arc length between the points + */ private static double distanceRadians(double lat1, double lng1, double lat2, double lng2) { return arcHav(havDistance(lat1, lat2, lng1 - lng2)); } + /** + * Computes inverse of haversine + * @param x Angle in radian + * @return Inverse of haversine + */ private static double arcHav(double x) { return 2.0D * Math.asin(Math.sqrt(x)); } + /** + * Computes distance between two points that are on same Longitude + * @param lat1 Latitude of point A + * @param lat2 Latitude of point B + * @param longitude Longitude on which they lie + * @return Arc length between points + */ private static double havDistance(double lat1, double lat2, double longitude) { return hav(lat1 - lat2) + hav(longitude) * Math.cos(lat1) * Math.cos(lat2); } + /** + * Computes haversine + * @param x Angle in radians + * @return Haversine of x + */ private static double hav(double x) { double sinHalf = Math.sin(x * 0.5D); return sinHalf * sinHalf; diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml index 13fb52168..af7db5bcd 100644 --- a/app/src/main/res/values-ast/strings.xml +++ b/app/src/main/res/values-ast/strings.xml @@ -68,7 +68,7 @@ %d cargues Nun s\'alcontró denguna categoría que case con %1$s - Amieste categoríes pa facer les imaxes más fáciles d\'alcontrar en Wikimedia Commons.\n\nPrincipie a escribir p\'amestar categoríes.\nToque nesti mensaxe (o calque atrás) pa saltar esti pasu. + Amiesta categoríes pa facer les imaxes más fáciles d\'alcontrar en Wikimedia Commons.\nPrincipia a escribir p\'amestar categoríes. Categoríes Configuración Date d\'alta @@ -203,4 +203,5 @@ Anicia sesión na to cuenta L\'allugamientu nun camudó. L\'allugamientu nun ta disponible. + Ríquese permisu p\'amosar una llista de llugares cercanos diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 2f874d462..4628ca951 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -8,8 +8,8 @@ Регистриране Влизане в системата Изчакайте… - Успешно вписване. - Неуспешно вписване! + Успешно влизане. + Неуспешно влизане! Файлът не е намерен. Моля, опитайте с друг файл. Неуспешен опит за удостоверяване! Качването започна! diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 50babcad9..e267c3a9a 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -68,7 +68,7 @@ %dটি আপলোড %1$s-এর সাথে মিলে এমন কোন বিষয়শ্রেণী পাওয়া যায়নি - উইকিমিডিয়া কমন্স থেকে আপনার মিডিয়া ফাইলটি সহজে খুঁজে পেতে বিষয়শ্রেণী যুক্ত করুন।\n\nবিষয়শ্রেণী যোগ করার জন্য টাইপিং শুরু করুন।\nএই ধাপটি বাতিল করতে এই বার্তাতে (বা ফিরে যান) টোকা দিন। + উইকিমিডিয়া কমন্স থেকে আপনার মিডিয়া ফাইলটি সহজে খুঁজে পেতে বিষয়শ্রেণী যুক্ত করুন।\n\nবিষয়শ্রেণী যোগ করার জন্য টাইপিং শুরু করুন। বিষয়শ্রেণীসমূহ সেটিং নিবন্ধন করুন diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 838e6938e..f0e946d90 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -13,7 +13,7 @@ No s\'ha trobat el fitxer. Proveu-ho amb un altre fitxer. L\'autenticació ha fallat! Ha començat la càrrega! - S\'ha carregat %1$s ! + S’ha pujat %1$s. Prem per veure la teva càrrega Començant la càrrega al servidor de %1$s Carregant %1$s @@ -78,6 +78,7 @@ Wikimedia:Commons-android-texts-sobre privacitat/ca Quant a Envia comentaris (per correu) + No hi ha cap client de correu instal·lat Categories usades recentment S’està esperant la primera sincronització… Encara no heu carregat cap foto. diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index efd2cd7e6..570afa99d 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -120,7 +120,7 @@ Prosím NENAHRÁVEJTE: - Selfie nebo obrázky vašich přátel\n- Obrázky stažené z Internetu\n- Screenshoty z proprietárních aplikací Příklad nahraného souboru: - - Název: Opera v Sydney\n- Popis: Opra v Sydney, pohled přes záliv\n- Kategorie: Sydney Opera House, Sydney Opera House from the west, Sydney Opera House remote views + - Název: Opera v Sydney\n- Popis: Opera v Sydney, pohled přes záliv\n- Kategorie: Sydney Opera House, Sydney Opera House from the west, Sydney Opera House remote views Přispějte svými obrázky. Pomozte oživit články na Wikipedii. Obrázky na Wikipedii pochází \nz Wikimedia Commons. Vaše obrázky pomáhají vzdělávat lidi po celém světě. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 202823455..d3c207184 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -68,7 +68,7 @@ %d hochgeladene Dateien Die Kategorie „%1$s“ wurde nicht gefunden - Füge Kategorien hinzu, um deine Bilder auf Wikimedia Commons auffindbarer zu machen.\n\nBeginn zu schreiben, um Kategorien hinzuzufügen. + Füge Kategorien hinzu, um deine Bilder auf Wikimedia Commons auffindbarer zu machen.\nBeginne mit der Eingabe, um Kategorien hinzuzufügen. Kategorien Einstellungen Registrieren diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 28ea9236e..c30e5c70d 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -13,7 +13,7 @@ No se encontró el archivo. Prueba con otro. Falló la autenticación. Ha comenzado la carga. - ¡Se subieron %1$s! + Se ha cargado %1$s. Pulsa para ver tu subida Empezando la subida de %1$s Cargando %1$s @@ -68,7 +68,7 @@ %d subidas No se encontraron categorías que coincidieran con %1$s - Añade categorías para hacer que tus imágenes sean más fáciles de encontrar en Wikimedia Commons.\n -\n -Comienza a escribir para añadir categorías. + Añade categorías para hacer que tus imágenes sean más fáciles de encontrar en Wikimedia Commons.\nComienza a escribir para añadir categorías. Categorías Ajustes Regístrate @@ -192,7 +192,7 @@ no se encontró ninguna descripción Página del archivo en Commons Elemento de Wikidata - Error mientras se guardaban imágenes en la caché + Error al almacenar imágenes en la antememoria Un título único descriptivo para el archivo, que servirá como un nombre de archivo. Puede usar un lenguaje claro con espacios. No incluya la extensión del archivo. Por favor, describa el elemento multimedia tanto como sea posible: ¿dónde fue tomado?, ¿qué muestra?, ¿cuál es el contexto? Por favor, describa los objetos o personas. Ofrezca la información que no puede ser inferida tan facilmente, por ejemplo el momento del día si es un paisaje. Si el medio muestra algo inusual, explique qué lo hace insual. Otorgar permiso diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 28293ebc8..18953d716 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -68,12 +68,12 @@ %d téléversements Aucune catégorie correspondant à %1$s trouvée - Ajoutez des catégories pour rendre vos images plus simple à trouver sur Wikimedia Commons. \n\nCommencer à ajouter des catégories. \nAppuyez sur ce message (ou retournez en arrière) pour sauter cette étape. + Ajoutez des catégories pour rendre vos images plus simples à trouver sur Wikimedia Commons. \nCommencer à ajouter des catégories. Catégories Paramètres S’inscrire À propos - L’application Wikimedia Commons est une application ouverte créée et tenue à jour par les bénéficiaires et volontaires de la communauté Wikimedia. La fondation Wikimedia n’est pas associée à la création, le développement ou l’entretien de l’application. + L’application Wikimedia Commons est une application open source créée et tenue à jour par les bénéficiaires et volontaires de la communauté Wikimedia. La fondation Wikimedia n’est pas associée à la création, le développement ou l’entretien de l’application. <a href=\"https://github.com/commons-app/apps-android-commons\">Sources</a> et <a href=\"https://commons-app.github.io/\">site web</a> sur GitHub. Créer un nouveau <a href=\"https://github.com/commons-app/apps-android-commons/issues\">signalement GitHub</a> pour signales des bogues ou des suggestions. <a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\">Politique de confidentialité</a> <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Remerciements</a> diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index f9989e41c..bc08a1f55 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -67,7 +67,7 @@ %d अपलोड %1$s से कोई श्रेणी मेल नहीं खाती - अपने छवियों को विकिमीडिया कॉमन्स में अधिक ढूँढने लायक बनाने हेतु श्रेणियाँ लगायें। \n\nश्रेणी जोड़ने हेतु लिखना शुरू करें।\nइसे न करने हेतु इस संदेश को टैप करें या पीछे का बटन दबायें। + विकिमीडिया कॉमन्स पर अपनी छवियों को अधिक खोजने योग्य बनाने के लिए श्रेणियां जोड़ें|\nश्रेणियां जोड़ने के लिए टाइप करना प्रारंभ करें| श्रेणियाँ पसंद खाता खोलें diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 87758c40e..b1106e25d 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -68,7 +68,7 @@ %d caricamenti Non è stata trovata alcuna categoria che contiene %1$s - Aggiungi categorie per rendere le tue immagini più facilmente individuabili su Wikimedia Commons.\n -\n -Inizia a digitare per aggiungere categorie. + Aggiungi categorie per rendere le tue immagini più facilmente individuabili su Wikimedia Commons.\nInizia a digitare per aggiungere categorie. Categorie Impostazioni Registrati diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index e6fe129e1..f2d2369cf 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -49,6 +49,9 @@ 検索するカテゴリ 保存 更新 + お使いのデバイスではGPSが無効になっています。有効にしますか? + GPSを有効にする + まだ何もアップロードされていません。 \@string/contributions_subtitle_zero %d 件のアップロード @@ -60,7 +63,7 @@ %d 件のアップロード %1$s に一致するカテゴリが見つかりません - あなたの画像をウィキメディア・コモンズで見つけやすくするためにカテゴリを追加してください。\n\nカテゴリ名の入力を開始してください。\nこの手順をスキップするにはこのメッセージをタップしてください(または戻るボタン)。 + あなたの画像をウィキメディア・コモンズで見つけやすくするためにカテゴリを追加してください。\n\nカテゴリ名の入力を開始してください。\nこの手順をスキップするにはこのメッセージをタップしてください(または戻るボタン)。 カテゴリ 設定 利用者登録 @@ -126,9 +129,11 @@ 不明なライセンス 更新 必要な権限:外部ストレージを読み込みます。これがなければアプリは機能しません。 + 必要な権限:外部ストレージを作成します。これがなければアプリは機能しません。 オプションの権限:カテゴリ候補の現在の位置を取得する 承認 周りの場所 + 付近の場所が見つかりません 警告 このファイルが既にコモンズにあります。本当にアップロードしますか? はい @@ -146,6 +151,9 @@ ウィキデータを使用してください (警告:これを無効にすると、モバイルデータを大量に消費する可能性があります) 最近のアップロードファイルに表示する最大件数 + 最大限 + 最近のアップロードファイルに表示する最大件数 + 2段階認証は現在サポートされていません。 ログアウトしてもよろしいですか? 背景画像 画像がありません @@ -155,18 +163,30 @@ レインボーブリッジ チューリップ ウィキペディアへようこそ + シドニーオペラハウス キャンセル 開く 閉じる ホーム アップロード + 付近 このアプリについて 設定 フィードバック ログアウト チュートリアル + 場所の権限がないと、近くの場所を表示できません 説明がありません ウィキデータ項目 + 画像をキャッシュする際のエラー + ファイル固有の説明的な表題。ファイル名として使われます。平易な言葉を使い、空白を入れることができます。拡張子は含めないでください。 + 可能な限りメディアを説明してください:どこで撮られましたか?それは何を示していますか?文脈とは何ですか?物や人を説明してください。容易に推測できない情報、例えば風景の場合の時刻を明らかにする。メディアに珍しいことがある場合は、何が珍しいのかを説明してください。 + 権限を取得 外部ストレージを使用 + アプリ内のカメラで撮影した写真を端末に保存する + ログファイルを送信する + メールで開発者にログファイルを送信する + 自分のアカウントにログイン + 場所は変更されていません。 位置が無効です。 diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index 724d4fa38..94f70c1ea 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -68,7 +68,7 @@ %d n usali Ulac taggayin imenṭaḍen akked %1$s i yettwafen - Rnu taggayin akken ad terreḍ tugniwin-ik fessus-it i tifin di Wikimedia Commons.\n\nBdu timerna n taggayin.\nSenneḍ ɣef yizen-agi (neɣ uɣal ar deffir) akken ad tnegzeḍ asebter-agi. + Rnu taggayin akken ad terreḍ tugniwin-ik sehlent i tifin di Wikimedia Commons.\n\nBdu timerna n taggayin. Taggayin Iɣewwaṛen Jerred @@ -201,4 +201,7 @@ Azen afaylu n uɣmis Azen afaylu n uɣmis i yinermisen s yimayl Qqen ar umiḍan-ik + Adeg ur ibeddel ara. + Ulac adeg + Ilaq usireg i uskan tabdart n wadigen iqerben diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 9177bdb25..5af2947a1 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -67,7 +67,7 @@ %d개 업로드 %1$s와(과) 일치하는 분류를 찾을 수 없습니다 - 위키미디어 공용에서 그림을 더 찾기 쉽게 만들기 위해 분류를 추가합니다.\n -\n -분류를 추가하려면 입력을 시작하세요. + 위키미디어 공용에서 그림을 더 찾기 쉽게 만들기 위해 분류를 추가합니다.\n분류를 추가하려면 입력을 시작하세요. 분류 설정 가입하기 diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index 911ba9dd7..46b927a23 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -67,7 +67,7 @@ %d Fichieren eropgelueden D\'Kategorie %1$s gouf net fonnt - Setzt Kategorien dobäi fir datt Är Biller méi einfach op Wikimedia Commons ze fanne sinn.\n\nFänkt u mat Tippe fir Kategorien dobäizesetzen. + Setzt Kategorien dobäi fir datt Är Biller méi einfach op Wikimedia Commons ze fanne sinn.\n\nFänkt u mat Tippe fir Kategorien dobäizesetzen. Kategorien Astellungen Mellt Iech un diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index eb1649236..ed9bcec38 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -20,11 +20,11 @@ Baigiamas įkelti %1$s Įkelti %1$s nepavyko Bakstelėkite norėdami Rodyti - - 1 keliamas failas + + %d keliamas failas %d keliamų failų - Mano įkėlimai + Naujausi mano įkėlimai Eilėje Nepavyko %1$d%% baigta @@ -50,21 +50,24 @@ Ieškoti kategorijas Išsaugoti Atnaujinti + GPS išjungta jūsų įrenginyje. Ar norite įjungti? + Išjungti GPS + Nėra įkėlimų kol kas Dar nėra įkėlimų 1 įkėlimas %d įkėlimai - - Pradedamas 1 įkėlimas + + Pradedamas %d įkėlimas Pradedami %d įkėlimai - - 1 įkėlimas + + %d įkėlimas %d įkėlimai Nerasta kategorijų, atitinkančiu %1$s - Pridėkite kategorijas, kad jūsų paveikslėliai būtų lengviau randami Vikimedija Commons.\n\nPradėkite rašyti, kad pridėtumėte kategorijas.\nPaspauskite šią žinutę (ar paspauskite atgal), kad praleistumėte šį žingsnį. + Pridėkite kategorijas, kad jūsų paveikslėliai būtų lengviau randami Vikimedija Commons.\n -\n -Pradėkite rašyti, kad pridėtumėte kategorijas. Kategorijos Nustatymai Užsiregistruoti @@ -74,7 +77,7 @@ Siųsti Atsiliepimą (El. paštu) Nėra įdiegtos el. pašto tvarkyklės Neseniai naudotos kategorijos - Laukiama pirmo sinchronizavimo + Laukiama pirmo sinchronizavimo… Dar neįkėlėte jokių nuotraukų. Bandykite dar kartą Atšaukti @@ -101,7 +104,7 @@ Ar viską supratote? Taip! Kategorijos - Įkeliama… + Kraunasi... Niekas nepasirinkta Nėra aprašymo Nežinoma licencija @@ -116,5 +119,21 @@ Ne Pavadinimas Aprašymas + Įkėlimo data + Licencija + Koordinatės + Ar tikrai norite atsijungti? + Įkelti paveikslėlį + Sveiki atvykę į Vikipediją + Atšaukti + Atidaryti + Uždaryti + Įkelti + Netoliese + Apie + Nustatymai + Atsiliepimai + Atsijungti Suteikti leidimą + Prisijunkite prie savo paskyros diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index f3d5d7a76..15a785f6d 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -68,7 +68,7 @@ %d opplastinger Ingen kategorier som stemte overens med %1$s funnet - Legg til kategorier for å gjøre bildene dine lettere å finne på Wikimedia Commons.\n\nBegynn å skrive navnet på kategoriene.\nTrykk på denne meldingen (eller trykk tilbake) for å hoppe over dette steget. + Legg til kategorier for å gjøre bildene dine lettere å finne på Wikimedia Commons.\n -\n -Begynn å skrive navnet på kategoriene. Kategorier Innstillinger Registrer deg diff --git a/app/src/main/res/values-ps/strings.xml b/app/src/main/res/values-ps/strings.xml index 406e8717f..800bb79ba 100644 --- a/app/src/main/res/values-ps/strings.xml +++ b/app/src/main/res/values-ps/strings.xml @@ -32,7 +32,7 @@ وېشنيزې پلټل خوندي کول بياتازه کول - + 1 پورته کول %d پورته کول @@ -40,7 +40,7 @@ امستنې نومليکنه په اړه - <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">د پټنتيا تگلاره</a> + <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">د پټنتيا تگلاره</a> په اړه وروستۍ کارېدلې وېشنيزې تاسې تر اوسه کوم انځور نه دی پورته کړی. @@ -68,6 +68,8 @@ هو نه سرليک + ويکيپېډياښه راغلئ + ناگارل پرانيستل تړل کور diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 22174857a..d7288a1e8 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1,6 +1,6 @@ - Wikimedia Commons + Commons Ayarlar Kullanıcı adı Parola @@ -31,6 +31,7 @@ Yükleniyor Galeri\'den Fotoğraf çek + Yakınındakiler Yüklemelerim Paylaş Tarayıcıda görüntüle @@ -41,6 +42,7 @@ Oturum açılamıyor - lütfen parolanızı kontrol edin Çok sayıda başarısız girişimde bulundunuz. Birkaç dakika sonra tekrar deneyin. Üzgünüz, bu kullanıcı Commons\'ta engellendi + İki faktörlü kimlik doğrulama kodunu sağlamalısınız. Oturum açma başarısız Yükle Bu grubun adı @@ -49,39 +51,53 @@ Kategorileri ara Kaydet Yenile - - Henüz yükleme yok - 1 yükleme + GPS, cihazınızda devre dışı bırakılmıştır. Etkinleştirmek ister misiniz? + GPS\'i etkinleştir + Henüz yüklenmedi + + \@string/contributions_subtitle_zero + %d yükleme %d yükleme - - 1 yüklemeye başlanıyor - %d yüklemeye başlanıyor + + %d yüklenmeye başlanıyor + %d yüklenmeye başlanıyor - - 1 yükleme + + %d yükleme %d yükleme %1$s ile eşleşen bir kategori bulunamadı - Resimlerinizi Wikimedia Commons\'ta daha bulunabilir duruma getirmek için kategoriler ekleyin.\n\nKategori eklemek için yazmaya başlayın. + Resimlerinizi Wikimedia Commons\'ta daha bulunabilir duruma getirmek için kategoriler ekleyin.\nKategori eklemek için yazmaya başlayın. Kategoriler Ayarlar + Kaydol Hakkında - <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache Lisansı s2</a> altında yayımlanan Açık Kaynak yazılımı - Kaynak: <a href=\"https://github.com/commons-app/apps-android-commons\">GitHub</a>\n\nYazılım hataları: <a href=\" https://github.com/commons-app/apps-android-commons/issues\">Github</a> - <a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\">Gizlilik Politikası</a> + Wikimedia Commons uygulaması, Wikimedia topluluğunun imtiyaz sahibi ve gönüllüleri tarafından oluşturulmuş ve sürdürülmüş açık kaynak kodlu bir uygulamadır. Vikipedi Vakfı, uygulamanın oluşturulması, geliştirilmesi veya bakımına dahil değildir. + GitHub üzerinde <a href=\"https://github.com/commons-app/apps-android-commons\">Kaynak</a> ve <a href=\"https://commons-app.github.io/\">website</a>. Hata raporları ve önerileri için yeni bir <a href=\"https://github.com/commons-app/apps-android-commons/issues\">GitHub sorunu</a> oluştur. + <a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\">Gizlilik Politikası</a> + <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\">Katkıda bulunanlar</a> Hakkında Geri Bildirim Gönder (E-posta ile) + Yüklü bir e-posta istemcisi yok Son kullanılan kategoriler İlk eşitleme için bekleniyor… Henüz yüklenmiş hiç fotoğrafınız yok. Tekrar dene İptal Bu resmi %1$s lisansı altında olacak. + Bu resmi göndererek bunun kendi eserim olduğumu, telif hakkıyla korunan materyal veya selfie içermediğini ve aksi takdirde <a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\">Wikimedia Commons politikalarına</a> uyduğunu beyan ederim. İndir Lisans - CC Attribution-ShareAlike 3.0 - CC Attribution 3.0 + Önceki başlığı/açıklamayı kullan + Otomatik olarak mevcut konumu al + Resim koordinat olarak etiketlendirilmemişse kategori önerileri için mevcut konum bulun + Gece modu + Koyu temayı kullanın + Attribution-ShareAlike 4.0 + Attribution 4.0 + Attribution-ShareAlike 3.0 + Attribution 3.0 CC0 CC BY-SA 3.0 CC BY-SA 3.0 (Avusturya) @@ -95,10 +111,17 @@ CC BY-SA 3.0 (Polonya) CC BY-SA 3.0 (Romanya) CC BY 3.0 + CC BY-SA 4.0 + CC BY 4.0 CC0 + Wikimedia Commons, Vikipedi\'de kullanılan resimlerin çoğunu barındırır. + Resimleriniz dünyanın dört bir yanındaki insanlara eğitim vermeye yardımcı olur! + Lütfen tamamen kendiniz çektiğiniz veya oluşturduğunuz resimleri yükleyin: + - Doğal nesneler (çiçekler, hayvanlar, dağlar)\n- Faydalı nesneler (bisiklet, tren istasyonları)\n- Ünlü insanlar (belediye başkanınız, tanıştığınız Olimpik atletler) Lütfen şunları YÜKLEMEYİN: - Öz çekimlerinizi ya da arkadaşlarınızın fotoğraflarını\n- İnternetten indirdiğiniz resimleri\n- Tescilli uygulamaların ekran görüntülerini Yüklenebileceklere örnekler: + - Başlık: Sydney Opera Binası\n- Tanım: Körfezin genelinden bakıldığında Sydney Opera Binası\n- Kategoriler: Sydney Opera Binası, batıdan Sydney Opera Binası Resimleriniz ile Vikipedi maddelerinin canlandırılmasına katkıda bulunabilirsiniz! Vikipedi\'ye Wikimedia Commons\'tan gelen görüntüler. Görüntüler dünya insanlarının eğitiminde yardımcı olur. @@ -106,11 +129,79 @@ Bunu anladınız mı? Evet! Kategoriler - Yükleniyor… + Yükleniyor... Hiçbir şey seçilmedi Açıklama yok Bilinmeyen lisans Yenile + Gerekli izinler: Harici depolama biriminin okunması. Uygulama buna izin verilmeden çalışmaz. + Gerekli izin: Harici depolama birimi üzerine yazma. Uygulama buna izin verilmeden çalışmaz. + İsteğe bağlı izin: Kategori önerileri için geçerli konum alma + Tamam + Yakındaki yerler + Yakınlardaki yer bulunamadı + Uyarı + Bu dosya zaten Commons\'da var. Devam etmek istediğinizden emin misiniz? + Evet + Hayır + Başlık + Medyanın başlığı + Açıklama + Medya için yapılan tanımı/açıklamayı buraya yazınız. Açıklamanız uzun olabilir ve birden fazla satıra sığabilir. Umuyoruz ki güzel ve bilgilendirici olacaktır. + Yükleme tarihi Lisans Koordinatlar + Sağlanmamış + Beta Deneycisi Olun + Google Play\'deki beta kanalımıza dahil olarak yeni özelliklere ve hata düzeltmelerine erken erişin + Vikiveri\'yi kullanın + (Uyarı: devre dışı bırakılması mobil veri tüketimine neden olabilir) + 2 Faktörlü Kimlik Doğrulama (2FA) Kodu + Son Yükleme Limitim + Maksimum Limit + 500\'den fazla görüntülenemiyor + Yeni Yükleme Sınırı Ayarla + İki faktörlü kimlik doğrulama şu anda desteklenmiyor. + Gerçekten çıkış yapmak istiyor musunuz? + Commons Logo + Arka plan görüntüsü + Medya Görüntüsü Başarısız Oldu + Resim Bulunamadı + Resim Yükle + Zao Dağı + Lamalar + Gökkuşağı Köprüsü + Lale + Selfie (\'\'özçekim\'\') göndermeyin + Tescilli Resim + Vikipedi\'ye Hoş Geldiniz + Telif Haklarına Hoş Geldiniz + Sidney Opera Binası + İptal + + Kapat + Anasayfa + Yükle + Yakınındakiler + Hakkında + Ayarlar + Geri bildirim + Çıkış + Eğitim + Yakındaki yerler, konum izinleri olmadan görüntülenemez + hiçbir açıklama bulunamadı + Commons dosya sayfası + Vikiveri ögesi + Resimler önbelleğe alınırken hata oluştu + Dosya için dosya adı olarak kullanılacak benzersiz açıklayıcı bir başlık olmalıdır. Boşluk bırakarak sade bir dil kullanabilirsiniz. Dosya uzantısını dahil etmeyin + Lütfen medyayı mümkün olduğunca açıklayın: Nerede çekildi? Ne gösteriyor? Bağlam nedir? Lütfen nesneleri veya kişileri tanımlayın. Kolay tahmin edilemeyen bilgileri açıklayın, örneğin bir manzara ise günün saatini belirtin. Medya alışılmadık bir şey gösteriyorsa lütfen olağandışı yapan şeyleri açıklayın. + İzin ver + Harici depolamayı kullanın + Uygulama kamerası kullanıldığında çekilen fotoğrafları cihazına kaydedin + Kayıt dosyasını gönder + Kayıt dosyasını, e-posta aracılığıyla geliştiricilere gönderin + Hesabınızda oturum açın + Konum değiştirilmedi + Konum kullanılamıyor. + Yakındaki yerler listesini görüntülemek için izin vermeniz gerekiyor diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index c66498b96..cba13eb68 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -68,7 +68,7 @@ %d次上传 没有找到匹配%1$s的分类 - 添加分类使您的图像更容易在维基共享资源被找到。\n -\n -开始输入以添加分类。 + 添加分类使您的图像更容易在维基共享资源被找到。开始输入以添加分类。 分类 设置 注册 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 45661ee28..40c65e384 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -70,9 +70,7 @@ %d uploads No categories matching %1$s found - - Add categories to make your images more discoverable on Wikimedia Commons. - - - -Start typing to add categories. + Add categories to make your images more discoverable on Wikimedia Commons.\nStart typing to add categories. Categories Settings Sign Up @@ -126,7 +124,7 @@ Please do NOT upload: - Selfies or pictures of your friends\n- Pictures you downloaded from the Internet\n- Screenshots of proprietary apps Example upload: - - Title: Sydney Opera House\n- Description: Sydney Opera House as viewed from across the bay\n- Categories: Sydney Opera House, Sydney Opera House from the west, Sydney Opera House remote views + - Title: Sydney Opera House\n- Description: Sydney Opera House as viewed from across the bay\n- Categories: Sydney Opera House from the west, Sydney Opera House remote views Contribute your images. Help Wikipedia articles come to life! Images on Wikipedia come from Wikimedia Commons. Your images help educate people around the world.