Merge remote-tracking branch 'refs/remotes/origin/master' into directNearbyUploads

This commit is contained in:
misaochan 2017-12-31 17:22:55 +10:00
commit e979d88aef
42 changed files with 879 additions and 288 deletions

View file

@ -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

View file

@ -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

View file

@ -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);

View file

@ -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<? extends DaggerApplication> applicationInjector() {
protected AndroidInjector<? extends DaggerApplication> 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();
}

View file

@ -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;

View file

@ -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<String, License> 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<License> 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 {
}
}
}
}

View file

@ -47,16 +47,35 @@ public class Media implements Parcelable {
private HashMap<String, Object> 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<String, String> 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);

View file

@ -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);
}

View file

@ -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);

View file

@ -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) {

View file

@ -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
}
}

View file

@ -134,4 +134,4 @@ public class LatLng {
public Uri getGmmIntentUri() {
return Uri.parse("geo:0,0?q=" + latitude + "," + longitude);
}
}
}

View file

@ -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) {

View file

@ -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);
}

View file

@ -6,10 +6,20 @@ class LogTask extends AsyncTask<LogBuilder, Void, Boolean> {
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);

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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);
}
}
}

View file

@ -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();
}
}
}

View file

@ -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);
}
}
}

View file

@ -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;
}
}
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;
}
}

View file

@ -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;

View file

@ -68,7 +68,7 @@
<item quantity="other">%d cargues</item>
</plurals>
<string name="categories_not_found">Nun s\'alcontró denguna categoría que case con %1$s</string>
<string name="categories_skip_explanation" fuzzy="true">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.</string>
<string name="categories_skip_explanation">Amiesta categoríes pa facer les imaxes más fáciles d\'alcontrar en Wikimedia Commons.\nPrincipia a escribir p\'amestar categoríes.</string>
<string name="categories_activity_title">Categoríes</string>
<string name="title_activity_settings">Configuración</string>
<string name="title_activity_signup">Date d\'alta</string>
@ -203,4 +203,5 @@
<string name="login_to_your_account">Anicia sesión na to cuenta</string>
<string name="nearby_location_has_not_changed">L\'allugamientu nun camudó.</string>
<string name="nearby_location_not_available">L\'allugamientu nun ta disponible.</string>
<string name="location_permission_rationale_nearby">Ríquese permisu p\'amosar una llista de llugares cercanos</string>
</resources>

View file

@ -8,8 +8,8 @@
<string name="signup">Регистриране</string>
<string name="logging_in_title">Влизане в системата</string>
<string name="logging_in_message">Изчакайте…</string>
<string name="login_success">Успешно вписване.</string>
<string name="login_failed">Неуспешно вписване!</string>
<string name="login_success">Успешно влизане.</string>
<string name="login_failed">Неуспешно влизане!</string>
<string name="upload_failed">Файлът не е намерен. Моля, опитайте с друг файл.</string>
<string name="authentication_failed">Неуспешен опит за удостоверяване!</string>
<string name="uploading_started">Качването започна!</string>

View file

@ -68,7 +68,7 @@
<item quantity="other">%dটি আপলোড</item>
</plurals>
<string name="categories_not_found">%1$s-এর সাথে মিলে এমন কোন বিষয়শ্রেণী পাওয়া যায়নি</string>
<string name="categories_skip_explanation" fuzzy="true">উইকিমিডিয়া কমন্স থেকে আপনার মিডিয়া ফাইলটি সহজে খুঁজে পেতে বিষয়শ্রেণী যুক্ত করুন।\n\nবিষয়শ্রেণী যোগ করার জন্য টাইপিং শুরু করুন।\nএই ধাপটি বাতিল করতে এই বার্তাতে (বা ফিরে যান) টোকা দিন।</string>
<string name="categories_skip_explanation">উইকিমিডিয়া কমন্স থেকে আপনার মিডিয়া ফাইলটি সহজে খুঁজে পেতে বিষয়শ্রেণী যুক্ত করুন।\n\nবিষয়শ্রেণী যোগ করার জন্য টাইপিং শুরু করুন।</string>
<string name="categories_activity_title">বিষয়শ্রেণীসমূহ</string>
<string name="title_activity_settings">সেটিং</string>
<string name="title_activity_signup">নিবন্ধন করুন</string>

View file

@ -13,7 +13,7 @@
<string name="upload_failed">No s\'ha trobat el fitxer. Proveu-ho amb un altre fitxer.</string>
<string name="authentication_failed">L\'autenticació ha fallat!</string>
<string name="uploading_started">Ha començat la càrrega!</string>
<string name="upload_completed_notification_title">S\'ha carregat %1$s !</string>
<string name="upload_completed_notification_title">Sha pujat %1$s.</string>
<string name="upload_completed_notification_text">Prem per veure la teva càrrega</string>
<string name="upload_progress_notification_title_start">Començant la càrrega al servidor de %1$s</string>
<string name="upload_progress_notification_title_in_progress">Carregant %1$s</string>
@ -78,6 +78,7 @@
<string name="about_privacy_policy" fuzzy="true">Wikimedia:Commons-android-texts-sobre privacitat/ca</string>
<string name="title_activity_about">Quant a</string>
<string name="menu_feedback">Envia comentaris (per correu)</string>
<string name="no_email_client">No hi ha cap client de correu instal·lat</string>
<string name="provider_categories">Categories usades recentment</string>
<string name="waiting_first_sync">Sestà esperant la primera sincronització…</string>
<string name="no_uploads_yet">Encara no heu carregat cap foto.</string>

View file

@ -120,7 +120,7 @@
<string name="tutorial_3_text">Prosím NENAHRÁVEJTE:</string>
<string name="tutorial_3_subtext">- Selfie nebo obrázky vašich přátel\n- Obrázky stažené z Internetu\n- Screenshoty z proprietárních aplikací</string>
<string name="tutorial_4_text">Příklad nahraného souboru:</string>
<string name="tutorial_4_subtext">- 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</string>
<string name="tutorial_4_subtext">- 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</string>
<string name="welcome_wikipedia_text">Přispějte svými obrázky. Pomozte oživit články na Wikipedii.</string>
<string name="welcome_wikipedia_subtext">Obrázky na Wikipedii pochází \nz Wikimedia Commons.</string>
<string name="welcome_copyright_text">Vaše obrázky pomáhají vzdělávat lidi po celém světě.</string>

View file

@ -68,7 +68,7 @@
<item quantity="other">%d hochgeladene Dateien</item>
</plurals>
<string name="categories_not_found">Die Kategorie „%1$s“ wurde nicht gefunden</string>
<string name="categories_skip_explanation">Füge Kategorien hinzu, um deine Bilder auf Wikimedia Commons auffindbarer zu machen.\n\nBeginn zu schreiben, um Kategorien hinzuzufügen.</string>
<string name="categories_skip_explanation">Füge Kategorien hinzu, um deine Bilder auf Wikimedia Commons auffindbarer zu machen.\nBeginne mit der Eingabe, um Kategorien hinzuzufügen.</string>
<string name="categories_activity_title">Kategorien</string>
<string name="title_activity_settings">Einstellungen</string>
<string name="title_activity_signup">Registrieren</string>

View file

@ -13,7 +13,7 @@
<string name="upload_failed">No se encontró el archivo. Prueba con otro.</string>
<string name="authentication_failed">Falló la autenticación.</string>
<string name="uploading_started">Ha comenzado la carga.</string>
<string name="upload_completed_notification_title">¡Se subieron %1$s!</string>
<string name="upload_completed_notification_title">Se ha cargado %1$s.</string>
<string name="upload_completed_notification_text">Pulsa para ver tu subida</string>
<string name="upload_progress_notification_title_start">Empezando la subida de %1$s</string>
<string name="upload_progress_notification_title_in_progress">Cargando %1$s</string>
@ -68,7 +68,7 @@
<item quantity="other">%d subidas</item>
</plurals>
<string name="categories_not_found">No se encontraron categorías que coincidieran con %1$s</string>
<string name="categories_skip_explanation">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.</string>
<string name="categories_skip_explanation">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.</string>
<string name="categories_activity_title">Categorías</string>
<string name="title_activity_settings">Ajustes</string>
<string name="title_activity_signup">Regístrate</string>
@ -192,7 +192,7 @@
<string name="no_description_found">no se encontró ninguna descripción</string>
<string name="nearby_info_menu_commons_article">Página del archivo en Commons</string>
<string name="nearby_info_menu_wikidata_article">Elemento de Wikidata</string>
<string name="error_while_cache">Error mientras se guardaban imágenes en la caché</string>
<string name="error_while_cache">Error al almacenar imágenes en la antememoria</string>
<string name="title_info">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.</string>
<string name="description_info">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.</string>
<string name="give_permission">Otorgar permiso</string>

View file

@ -68,12 +68,12 @@
<item quantity="other">%d téléversements</item>
</plurals>
<string name="categories_not_found">Aucune catégorie correspondant à %1$s trouvée</string>
<string name="categories_skip_explanation" fuzzy="true">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.</string>
<string name="categories_skip_explanation">Ajoutez des catégories pour rendre vos images plus simples à trouver sur Wikimedia Commons. \nCommencer à ajouter des catégories.</string>
<string name="categories_activity_title">Catégories</string>
<string name="title_activity_settings">Paramètres</string>
<string name="title_activity_signup">Sinscrire</string>
<string name="menu_about">À propos</string>
<string name="about_license">Lapplication 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 nest pas associée à la création, le développement ou lentretien de lapplication.</string>
<string name="about_license">Lapplication 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 nest pas associée à la création, le développement ou lentretien de lapplication.</string>
<string name="about_improve">&lt;a href=\"https://github.com/commons-app/apps-android-commons\"&gt;Sources&lt;/a&gt; et &lt;a href=\"https://commons-app.github.io/\"&gt;site web&lt;/a&gt; sur GitHub. Créer un nouveau &lt;a href=\"https://github.com/commons-app/apps-android-commons/issues\"&gt;signalement GitHub&lt;/a&gt; pour signales des bogues ou des suggestions.</string>
<string name="about_privacy_policy">&lt;a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\"&gt;Politique de confidentialité&lt;/a&gt;</string>
<string name="about_credits">&lt;a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\"&gt;Remerciements&lt;/a&gt;</string>

View file

@ -67,7 +67,7 @@
<item quantity="other">%d अपलोड</item>
</plurals>
<string name="categories_not_found">%1$s से कोई श्रेणी मेल नहीं खाती</string>
<string name="categories_skip_explanation" fuzzy="true">अपने छवियों को विकिमीडिया कॉमन्स में अधिक ढूँढने लायक बनाने हेतु श्रेणियाँ लगायें। \n\nश्रेणी जोड़ने हेतु लिखना शुरू करें।\nइसे न करने हेतु इस संदेश को टैप करें या पीछे का बटन दबायें।</string>
<string name="categories_skip_explanation">विकिमीडिया कॉमन्स पर अपनी छवियों को अधिक खोजने योग्य बनाने के लिए श्रेणियां जोड़ें|\nश्रेणियां जोड़ने के लिए टाइप करना प्रारंभ करें|</string>
<string name="categories_activity_title">श्रेणियाँ</string>
<string name="title_activity_settings">पसंद</string>
<string name="title_activity_signup">खाता खोलें</string>

View file

@ -68,7 +68,7 @@
<item quantity="other">%d caricamenti</item>
</plurals>
<string name="categories_not_found">Non è stata trovata alcuna categoria che contiene %1$s</string>
<string name="categories_skip_explanation">Aggiungi categorie per rendere le tue immagini più facilmente individuabili su Wikimedia Commons.\n -\n -Inizia a digitare per aggiungere categorie.</string>
<string name="categories_skip_explanation">Aggiungi categorie per rendere le tue immagini più facilmente individuabili su Wikimedia Commons.\nInizia a digitare per aggiungere categorie.</string>
<string name="categories_activity_title">Categorie</string>
<string name="title_activity_settings">Impostazioni</string>
<string name="title_activity_signup">Registrati</string>

View file

@ -49,6 +49,9 @@
<string name="categories_search_text_hint">検索するカテゴリ</string>
<string name="menu_save_categories">保存</string>
<string name="refresh_button">更新</string>
<string name="gps_disabled">お使いのデバイスではGPSが無効になっています。有効にしますか?</string>
<string name="enable_gps">GPSを有効にする</string>
<string name="contributions_subtitle_zero">まだ何もアップロードされていません。</string>
<plurals name="contributions_subtitle">
<item quantity="zero">\@string/contributions_subtitle_zero</item>
<item quantity="other">%d 件のアップロード</item>
@ -60,7 +63,7 @@
<item quantity="other">%d 件のアップロード</item>
</plurals>
<string name="categories_not_found">%1$s に一致するカテゴリが見つかりません</string>
<string name="categories_skip_explanation" fuzzy="true">あなたの画像をウィキメディア・コモンズで見つけやすくするためにカテゴリを追加してください。\n\nカテゴリ名の入力を開始してください。\nこの手順をスキップするにはこのメッセージをタップしてください(または戻るボタン)。</string>
<string name="categories_skip_explanation">あなたの画像をウィキメディア・コモンズで見つけやすくするためにカテゴリを追加してください。\n\nカテゴリ名の入力を開始してください。\nこの手順をスキップするにはこのメッセージをタップしてください(または戻るボタン)。</string>
<string name="categories_activity_title">カテゴリ</string>
<string name="title_activity_settings">設定</string>
<string name="title_activity_signup">利用者登録</string>
@ -126,9 +129,11 @@
<string name="detail_license_empty">不明なライセンス</string>
<string name="menu_refresh">更新</string>
<string name="read_storage_permission_rationale">必要な権限:外部ストレージを読み込みます。これがなければアプリは機能しません。</string>
<string name="write_storage_permission_rationale">必要な権限:外部ストレージを作成します。これがなければアプリは機能しません。</string>
<string name="location_permission_rationale">オプションの権限:カテゴリ候補の現在の位置を取得する</string>
<string name="ok">承認</string>
<string name="title_activity_nearby">周りの場所</string>
<string name="no_nearby">付近の場所が見つかりません</string>
<string name="warning">警告</string>
<string name="file_exists">このファイルが既にコモンズにあります。本当にアップロードしますか?</string>
<string name="yes">はい</string>
@ -146,6 +151,9 @@
<string name="use_wikidata">ウィキデータを使用してください</string>
<string name="use_wikidata_summary">(警告:これを無効にすると、モバイルデータを大量に消費する可能性があります)</string>
<string name="number_of_uploads">最近のアップロードファイルに表示する最大件数</string>
<string name="maximum_limit">最大限</string>
<string name="set_limit">最近のアップロードファイルに表示する最大件数</string>
<string name="login_failed_2fa_not_supported">2段階認証は現在サポートされていません。</string>
<string name="logout_verification">ログアウトしてもよろしいですか?</string>
<string name="background_image">背景画像</string>
<string name="no_image_found">画像がありません</string>
@ -155,18 +163,30 @@
<string name="welcome_image_rainbow_bridge">レインボーブリッジ</string>
<string name="welcome_image_tulip">チューリップ</string>
<string name="welcome_image_welcome_wikipedia">ウィキペディアへようこそ</string>
<string name="welcome_image_sydney_opera_house">シドニーオペラハウス</string>
<string name="cancel">キャンセル</string>
<string name="navigation_drawer_open">開く</string>
<string name="navigation_drawer_close">閉じる</string>
<string name="navigation_item_home">ホーム</string>
<string name="navigation_item_upload">アップロード</string>
<string name="navigation_item_nearby">付近</string>
<string name="navigation_item_about">このアプリについて</string>
<string name="navigation_item_settings">設定</string>
<string name="navigation_item_feedback">フィードバック</string>
<string name="navigation_item_logout">ログアウト</string>
<string name="navigation_item_info">チュートリアル</string>
<string name="nearby_needs_permissions">場所の権限がないと、近くの場所を表示できません</string>
<string name="no_description_found">説明がありません</string>
<string name="nearby_info_menu_wikidata_article">ウィキデータ項目</string>
<string name="error_while_cache">画像をキャッシュする際のエラー</string>
<string name="title_info">ファイル固有の説明的な表題。ファイル名として使われます。平易な言葉を使い、空白を入れることができます。拡張子は含めないでください。</string>
<string name="description_info">可能な限りメディアを説明してください:どこで撮られましたか?それは何を示していますか?文脈とは何ですか?物や人を説明してください。容易に推測できない情報、例えば風景の場合の時刻を明らかにする。メディアに珍しいことがある場合は、何が珍しいのかを説明してください。</string>
<string name="give_permission">権限を取得</string>
<string name="use_external_storage">外部ストレージを使用</string>
<string name="use_external_storage_summary">アプリ内のカメラで撮影した写真を端末に保存する</string>
<string name="send_log_file">ログファイルを送信する</string>
<string name="send_log_file_description">メールで開発者にログファイルを送信する</string>
<string name="login_to_your_account">自分のアカウントにログイン</string>
<string name="nearby_location_has_not_changed">場所は変更されていません。</string>
<string name="nearby_location_not_available">位置が無効です。</string>
</resources>

View file

@ -68,7 +68,7 @@
<item quantity="other">%d n usali</item>
</plurals>
<string name="categories_not_found">Ulac taggayin imenṭaḍen akked %1$s i yettwafen</string>
<string name="categories_skip_explanation" fuzzy="true">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.</string>
<string name="categories_skip_explanation">Rnu taggayin akken ad terreḍ tugniwin-ik sehlent i tifin di Wikimedia Commons.\n\nBdu timerna n taggayin.</string>
<string name="categories_activity_title">Taggayin</string>
<string name="title_activity_settings">Iɣewwaṛen</string>
<string name="title_activity_signup">Jerred</string>
@ -201,4 +201,7 @@
<string name="send_log_file">Azen afaylu n uɣmis</string>
<string name="send_log_file_description">Azen afaylu n uɣmis i yinermisen s yimayl</string>
<string name="login_to_your_account">Qqen ar umiḍan-ik</string>
<string name="nearby_location_has_not_changed">Adeg ur ibeddel ara.</string>
<string name="nearby_location_not_available">Ulac adeg</string>
<string name="location_permission_rationale_nearby">Ilaq usireg i uskan tabdart n wadigen iqerben</string>
</resources>

View file

@ -67,7 +67,7 @@
<item quantity="one">%d개 업로드</item>
</plurals>
<string name="categories_not_found">%1$s와(과) 일치하는 분류를 찾을 수 없습니다</string>
<string name="categories_skip_explanation">위키미디어 공용에서 그림을 더 찾기 쉽게 만들기 위해 분류를 추가합니다.\n -\n -분류를 추가하려면 입력을 시작하세요.</string>
<string name="categories_skip_explanation">위키미디어 공용에서 그림을 더 찾기 쉽게 만들기 위해 분류를 추가합니다.\n분류를 추가하려면 입력을 시작하세요.</string>
<string name="categories_activity_title">분류</string>
<string name="title_activity_settings">설정</string>
<string name="title_activity_signup">가입하기</string>

View file

@ -67,7 +67,7 @@
<item quantity="other">%d Fichieren eropgelueden</item>
</plurals>
<string name="categories_not_found">D\'Kategorie %1$s gouf net fonnt</string>
<string name="categories_skip_explanation">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.</string>
<string name="categories_skip_explanation" fuzzy="true">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.</string>
<string name="categories_activity_title">Kategorien</string>
<string name="title_activity_settings">Astellungen</string>
<string name="title_activity_signup">Mellt Iech un</string>

View file

@ -20,11 +20,11 @@
<string name="upload_progress_notification_title_finishing">Baigiamas įkelti %1$s</string>
<string name="upload_failed_notification_title">Įkelti %1$s nepavyko</string>
<string name="upload_failed_notification_subtitle">Bakstelėkite norėdami Rodyti</string>
<plurals name="uploads_pending_notification_indicator" fuzzy="true">
<item quantity="one">1 keliamas failas</item>
<plurals name="uploads_pending_notification_indicator">
<item quantity="one">%d keliamas failas</item>
<item quantity="other">%d keliamų failų</item>
</plurals>
<string name="title_activity_contributions" fuzzy="true">Mano įkėlimai</string>
<string name="title_activity_contributions">Naujausi mano įkėlimai</string>
<string name="contribution_state_queued">Eilėje</string>
<string name="contribution_state_failed">Nepavyko</string>
<string name="contribution_state_in_progress">%1$d%% baigta</string>
@ -50,21 +50,24 @@
<string name="categories_search_text_hint">Ieškoti kategorijas</string>
<string name="menu_save_categories">Išsaugoti</string>
<string name="refresh_button">Atnaujinti</string>
<string name="gps_disabled">GPS išjungta jūsų įrenginyje. Ar norite įjungti?</string>
<string name="enable_gps">Išjungti GPS</string>
<string name="contributions_subtitle_zero">Nėra įkėlimų kol kas</string>
<plurals name="contributions_subtitle" fuzzy="true">
<item quantity="zero">Dar nėra įkėlimų</item>
<item quantity="one">1 įkėlimas</item>
<item quantity="other">%d įkėlimai</item>
</plurals>
<plurals name="starting_multiple_uploads" fuzzy="true">
<item quantity="one">Pradedamas 1 įkėlimas</item>
<plurals name="starting_multiple_uploads">
<item quantity="one">Pradedamas %d įkėlimas</item>
<item quantity="other">Pradedami %d įkėlimai</item>
</plurals>
<plurals name="multiple_uploads_title" fuzzy="true">
<item quantity="one">1 įkėlimas</item>
<plurals name="multiple_uploads_title">
<item quantity="one">%d įkėlimas</item>
<item quantity="other">%d įkėlimai</item>
</plurals>
<string name="categories_not_found">Nerasta kategorijų, atitinkančiu %1$s</string>
<string name="categories_skip_explanation" fuzzy="true">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į.</string>
<string name="categories_skip_explanation" fuzzy="true">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.</string>
<string name="categories_activity_title">Kategorijos</string>
<string name="title_activity_settings">Nustatymai</string>
<string name="title_activity_signup">Užsiregistruoti</string>
@ -74,7 +77,7 @@
<string name="menu_feedback">Siųsti Atsiliepimą (El. paštu)</string>
<string name="no_email_client">Nėra įdiegtos el. pašto tvarkyklės</string>
<string name="provider_categories">Neseniai naudotos kategorijos</string>
<string name="waiting_first_sync" fuzzy="true">Laukiama pirmo sinchronizavimo</string>
<string name="waiting_first_sync">Laukiama pirmo sinchronizavimo</string>
<string name="no_uploads_yet">Dar neįkėlėte jokių nuotraukų.</string>
<string name="menu_retry_upload">Bandykite dar kartą</string>
<string name="menu_cancel_upload">Atšaukti</string>
@ -101,7 +104,7 @@
<string name="welcome_final_text">Ar viską supratote?</string>
<string name="welcome_final_button_text">Taip!</string>
<string name="detail_panel_cats_label">Kategorijos</string>
<string name="detail_panel_cats_loading" fuzzy="true">Įkeliama…</string>
<string name="detail_panel_cats_loading">Kraunasi...</string>
<string name="detail_panel_cats_none">Niekas nepasirinkta</string>
<string name="detail_description_empty">Nėra aprašymo</string>
<string name="detail_license_empty">Nežinoma licencija</string>
@ -116,5 +119,21 @@
<string name="no">Ne</string>
<string name="media_detail_title">Pavadinimas</string>
<string name="media_detail_description">Aprašymas</string>
<string name="media_detail_uploaded_date">Įkėlimo data</string>
<string name="media_detail_license">Licencija</string>
<string name="media_detail_coordinates">Koordinatės</string>
<string name="logout_verification">Ar tikrai norite atsijungti?</string>
<string name="upload_image">Įkelti paveikslėlį</string>
<string name="welcome_image_welcome_wikipedia">Sveiki atvykę į Vikipediją</string>
<string name="cancel">Atšaukti</string>
<string name="navigation_drawer_open">Atidaryti</string>
<string name="navigation_drawer_close">Uždaryti</string>
<string name="navigation_item_upload">Įkelti</string>
<string name="navigation_item_nearby">Netoliese</string>
<string name="navigation_item_about">Apie</string>
<string name="navigation_item_settings">Nustatymai</string>
<string name="navigation_item_feedback">Atsiliepimai</string>
<string name="navigation_item_logout">Atsijungti</string>
<string name="give_permission">Suteikti leidimą</string>
<string name="login_to_your_account">Prisijunkite prie savo paskyros</string>
</resources>

View file

@ -68,7 +68,7 @@
<item quantity="other">%d opplastinger</item>
</plurals>
<string name="categories_not_found">Ingen kategorier som stemte overens med %1$s funnet</string>
<string name="categories_skip_explanation" fuzzy="true">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.</string>
<string name="categories_skip_explanation" fuzzy="true">Legg til kategorier for å gjøre bildene dine lettere å finne på Wikimedia Commons.\n -\n -Begynn å skrive navnet på kategoriene.</string>
<string name="categories_activity_title">Kategorier</string>
<string name="title_activity_settings">Innstillinger</string>
<string name="title_activity_signup">Registrer deg</string>

View file

@ -32,7 +32,7 @@
<string name="categories_search_text_hint">وېشنيزې پلټل</string>
<string name="menu_save_categories">خوندي کول</string>
<string name="refresh_button">بياتازه کول</string>
<plurals name="multiple_uploads_title" fuzzy="true">
<plurals name="multiple_uploads_title">
<item quantity="one">1 پورته کول</item>
<item quantity="other">%d پورته کول</item>
</plurals>
@ -40,7 +40,7 @@
<string name="title_activity_settings">امستنې</string>
<string name="title_activity_signup">نومليکنه</string>
<string name="menu_about">په اړه</string>
<string name="about_privacy_policy" fuzzy="true">&lt;a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\"&gt;د پټنتيا تگلاره&lt;/a&gt;</string>
<string name="about_privacy_policy">&lt;a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\"&gt;د پټنتيا تگلاره&lt;/a&gt;</string>
<string name="title_activity_about">په اړه</string>
<string name="provider_categories">وروستۍ کارېدلې وېشنيزې</string>
<string name="no_uploads_yet">تاسې تر اوسه کوم انځور نه دی پورته کړی.</string>
@ -68,6 +68,8 @@
<string name="yes">هو</string>
<string name="no">نه</string>
<string name="media_detail_title">سرليک</string>
<string name="welcome_image_welcome_wikipedia">ويکيپېډياښه راغلئ</string>
<string name="cancel">ناگارل</string>
<string name="navigation_drawer_open">پرانيستل</string>
<string name="navigation_drawer_close">تړل</string>
<string name="navigation_item_home">کور</string>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" fuzzy="true">Wikimedia Commons</string>
<string name="app_name">Commons</string>
<string name="menu_settings">Ayarlar</string>
<string name="username">Kullanıcı adı</string>
<string name="password">Parola</string>
@ -31,6 +31,7 @@
<string name="contribution_state_starting">Yükleniyor</string>
<string name="menu_from_gallery">Galeri\'den</string>
<string name="menu_from_camera">Fotoğraf çek</string>
<string name="menu_nearby">Yakınındakiler</string>
<string name="provider_contributions">Yüklemelerim</string>
<string name="menu_share">Paylaş</string>
<string name="menu_open_in_browser">Tarayıcıda görüntüle</string>
@ -41,6 +42,7 @@
<string name="login_failed_password">Oturum açılamıyor - lütfen parolanızı kontrol edin</string>
<string name="login_failed_throttled">Çok sayıda başarısız girişimde bulundunuz. Birkaç dakika sonra tekrar deneyin.</string>
<string name="login_failed_blocked">Üzgünüz, bu kullanıcı Commons\'ta engellendi</string>
<string name="login_failed_2fa_needed">İki faktörlü kimlik doğrulama kodunu sağlamalısınız.</string>
<string name="login_failed_generic">Oturum açma başarısız</string>
<string name="share_upload_button">Yükle</string>
<string name="multiple_share_base_title">Bu grubun adı</string>
@ -49,39 +51,53 @@
<string name="categories_search_text_hint">Kategorileri ara</string>
<string name="menu_save_categories">Kaydet</string>
<string name="refresh_button">Yenile</string>
<plurals name="contributions_subtitle" fuzzy="true">
<item quantity="zero">Henüz yükleme yok</item>
<item quantity="one">1 yükleme</item>
<string name="gps_disabled">GPS, cihazınızda devre dışı bırakılmıştır. Etkinleştirmek ister misiniz?</string>
<string name="enable_gps">GPS\'i etkinleştir</string>
<string name="contributions_subtitle_zero">Henüz yüklenmedi</string>
<plurals name="contributions_subtitle">
<item quantity="zero">\@string/contributions_subtitle_zero</item>
<item quantity="one">%d yükleme</item>
<item quantity="other">%d yükleme</item>
</plurals>
<plurals name="starting_multiple_uploads" fuzzy="true">
<item quantity="one">1 yüklemeye başlanıyor</item>
<item quantity="other">%d yüklemeye başlanıyor</item>
<plurals name="starting_multiple_uploads">
<item quantity="one">%d yüklenmeye başlanıyor</item>
<item quantity="other">%d yüklenmeye başlanıyor</item>
</plurals>
<plurals name="multiple_uploads_title" fuzzy="true">
<item quantity="one">1 yükleme</item>
<plurals name="multiple_uploads_title">
<item quantity="one">%d yükleme</item>
<item quantity="other">%d yükleme</item>
</plurals>
<string name="categories_not_found">%1$s ile eşleşen bir kategori bulunamadı</string>
<string name="categories_skip_explanation">Resimlerinizi Wikimedia Commons\'ta daha bulunabilir duruma getirmek için kategoriler ekleyin.\n\nKategori eklemek için yazmaya başlayın.</string>
<string name="categories_skip_explanation">Resimlerinizi Wikimedia Commons\'ta daha bulunabilir duruma getirmek için kategoriler ekleyin.\nKategori eklemek için yazmaya başlayın.</string>
<string name="categories_activity_title">Kategoriler</string>
<string name="title_activity_settings">Ayarlar</string>
<string name="title_activity_signup">Kaydol</string>
<string name="menu_about">Hakkında</string>
<string name="about_license" fuzzy="true">&lt;a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\"&gt;Apache Lisansı s2&lt;/a&gt; altında yayımlanan Açık Kaynak yazılımı</string>
<string name="about_improve" fuzzy="true">Kaynak: &lt;a href=\"https://github.com/commons-app/apps-android-commons\"&gt;GitHub&lt;/a&gt;\n\nYazılım hataları: &lt;a href=\" https://github.com/commons-app/apps-android-commons/issues\"&gt;Github&lt;/a&gt;</string>
<string name="about_privacy_policy" fuzzy="true">&lt;a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\"&gt;Gizlilik Politikası&lt;/a&gt;</string>
<string name="about_license">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.</string>
<string name="about_improve">GitHub üzerinde &lt;a href=\"https://github.com/commons-app/apps-android-commons\"&gt;Kaynak&lt;/a&gt; ve &lt;a href=\"https://commons-app.github.io/\"&gt;website&lt;/a&gt;. Hata raporları ve önerileri için yeni bir &lt;a href=\"https://github.com/commons-app/apps-android-commons/issues\"&gt;GitHub sorunu&lt;/a&gt; oluştur.</string>
<string name="about_privacy_policy">&lt;a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\"&gt;Gizlilik Politikası&lt;/a&gt;</string>
<string name="about_credits">&lt;a href=\"https://github.com/commons-app/apps-android-commons/blob/master/CREDITS\"&gt;Katkıda bulunanlar&lt;/a&gt;</string>
<string name="title_activity_about">Hakkında</string>
<string name="menu_feedback">Geri Bildirim Gönder (E-posta ile)</string>
<string name="no_email_client">Yüklü bir e-posta istemcisi yok</string>
<string name="provider_categories">Son kullanılan kategoriler</string>
<string name="waiting_first_sync">İlk eşitleme için bekleniyor…</string>
<string name="no_uploads_yet">Henüz yüklenmiş hiç fotoğrafınız yok.</string>
<string name="menu_retry_upload">Tekrar dene</string>
<string name="menu_cancel_upload">İptal</string>
<string name="share_license_summary">Bu resmi %1$s lisansı altında olacak.</string>
<string name="media_upload_policy">Bu resmi göndererek bunun kendi eserim olduğumu, telif hakkıyla korunan materyal veya selfie içermediğini ve aksi takdirde &lt;a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\"&gt;Wikimedia Commons politikalarına&lt;/a&gt; uyduğunu beyan ederim.</string>
<string name="menu_download">İndir</string>
<string name="preference_license">Lisans</string>
<string name="license_name_cc_by_sa" fuzzy="true">CC Attribution-ShareAlike 3.0</string>
<string name="license_name_cc_by" fuzzy="true">CC Attribution 3.0</string>
<string name="use_previous">Önceki başlığı/açıklamayı kullan</string>
<string name="allow_gps">Otomatik olarak mevcut konumu al</string>
<string name="allow_gps_summary">Resim koordinat olarak etiketlendirilmemişse kategori önerileri için mevcut konum bulun</string>
<string name="preference_theme">Gece modu</string>
<string name="preference_theme_summary">Koyu temayı kullanın</string>
<string name="license_name_cc_by_sa_four"> Attribution-ShareAlike 4.0</string>
<string name="license_name_cc_by_four"> Attribution 4.0</string>
<string name="license_name_cc_by_sa"> Attribution-ShareAlike 3.0</string>
<string name="license_name_cc_by"> Attribution 3.0</string>
<string name="license_name_cc0">CC0</string>
<string name="license_name_cc_by_sa_3_0">CC BY-SA 3.0</string>
<string name="license_name_cc_by_sa_3_0_at">CC BY-SA 3.0 (Avusturya)</string>
@ -95,10 +111,17 @@
<string name="license_name_cc_by_sa_3_0_pl">CC BY-SA 3.0 (Polonya)</string>
<string name="license_name_cc_by_sa_3_0_ro">CC BY-SA 3.0 (Romanya)</string>
<string name="license_name_cc_by_3_0">CC BY 3.0</string>
<string name="license_name_cc_by_sa_4_0">CC BY-SA 4.0</string>
<string name="license_name_cc_by_4_0">CC BY 4.0</string>
<string name="license_name_cc_zero">CC0</string>
<string name="tutorial_1_text">Wikimedia Commons, Vikipedi\'de kullanılan resimlerin çoğunu barındırır.</string>
<string name="tutorial_1_subtext">Resimleriniz dünyanın dört bir yanındaki insanlara eğitim vermeye yardımcı olur!</string>
<string name="tutorial_2_text">Lütfen tamamen kendiniz çektiğiniz veya oluşturduğunuz resimleri yükleyin:</string>
<string name="tutorial_2_subtext">- 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)</string>
<string name="tutorial_3_text">Lütfen şunları YÜKLEMEYİN:</string>
<string name="tutorial_3_subtext">- Ö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</string>
<string name="tutorial_4_text">Yüklenebileceklere örnekler:</string>
<string name="tutorial_4_subtext">- 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ı</string>
<string name="welcome_wikipedia_text">Resimleriniz ile Vikipedi maddelerinin canlandırılmasına katkıda bulunabilirsiniz!</string>
<string name="welcome_wikipedia_subtext">Vikipedi\'ye Wikimedia Commons\'tan gelen görüntüler.</string>
<string name="welcome_copyright_text">Görüntüler dünya insanlarının eğitiminde yardımcı olur.</string>
@ -106,11 +129,79 @@
<string name="welcome_final_text">Bunu anladınız mı?</string>
<string name="welcome_final_button_text">Evet!</string>
<string name="detail_panel_cats_label">Kategoriler</string>
<string name="detail_panel_cats_loading" fuzzy="true">Yükleniyor…</string>
<string name="detail_panel_cats_loading">Yükleniyor...</string>
<string name="detail_panel_cats_none">Hiçbir şey seçilmedi</string>
<string name="detail_description_empty">ıklama yok</string>
<string name="detail_license_empty">Bilinmeyen lisans</string>
<string name="menu_refresh">Yenile</string>
<string name="read_storage_permission_rationale">Gerekli izinler: Harici depolama biriminin okunması. Uygulama buna izin verilmeden çalışmaz.</string>
<string name="write_storage_permission_rationale">Gerekli izin: Harici depolama birimi üzerine yazma. Uygulama buna izin verilmeden çalışmaz.</string>
<string name="location_permission_rationale">İsteğe bağlı izin: Kategori önerileri için geçerli konum alma</string>
<string name="ok">Tamam</string>
<string name="title_activity_nearby">Yakındaki yerler</string>
<string name="no_nearby">Yakınlardaki yer bulunamadı</string>
<string name="warning">Uyarı</string>
<string name="file_exists">Bu dosya zaten Commons\'da var. Devam etmek istediğinizden emin misiniz?</string>
<string name="yes">Evet</string>
<string name="no">Hayır</string>
<string name="media_detail_title">Başlık</string>
<string name="media_detail_media_title">Medyanın başlığı</string>
<string name="media_detail_description">ıklama</string>
<string name="media_detail_description_explanation">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.</string>
<string name="media_detail_uploaded_date">Yükleme tarihi</string>
<string name="media_detail_license">Lisans</string>
<string name="media_detail_coordinates">Koordinatlar</string>
<string name="media_detail_coordinates_empty">Sağlanmamış</string>
<string name="become_a_tester_title">Beta Deneycisi Olun</string>
<string name="become_a_tester_description">Google Play\'deki beta kanalımıza dahil olarak yeni özelliklere ve hata düzeltmelerine erken erişin</string>
<string name="use_wikidata">Vikiveri\'yi kullanın</string>
<string name="use_wikidata_summary">(Uyarı: devre dışı bırakılması mobil veri tüketimine neden olabilir)</string>
<string name="_2fa_code">2 Faktörlü Kimlik Doğrulama (2FA) Kodu</string>
<string name="number_of_uploads">Son Yükleme Limitim</string>
<string name="maximum_limit">Maksimum Limit</string>
<string name="maximum_limit_alert">500\'den fazla görüntülenemiyor</string>
<string name="set_limit">Yeni Yükleme Sınırı Ayarla</string>
<string name="login_failed_2fa_not_supported">İki faktörlü kimlik doğrulama şu anda desteklenmiyor.</string>
<string name="logout_verification">Gerçekten çıkış yapmak istiyor musunuz?</string>
<string name="commons_logo">Commons Logo</string>
<string name="background_image">Arka plan görüntüsü</string>
<string name="mediaimage_failed">Medya Görüntüsü Başarısız Oldu</string>
<string name="no_image_found">Resim Bulunamadı</string>
<string name="upload_image">Resim Yükle</string>
<string name="welcome_image_mount_zao">Zao Dağı</string>
<string name="welcome_image_llamas">Lamalar</string>
<string name="welcome_image_rainbow_bridge">Gökkuşağı Köprüsü</string>
<string name="welcome_image_tulip">Lale</string>
<string name="welcome_image_no_selfies">Selfie (\'\'özçekim\'\') göndermeyin</string>
<string name="welcome_image_proprietary">Tescilli Resim</string>
<string name="welcome_image_welcome_wikipedia">Vikipedi\'ye Hoş Geldiniz</string>
<string name="welcome_image_welcome_copyright">Telif Haklarına Hoş Geldiniz</string>
<string name="welcome_image_sydney_opera_house">Sidney Opera Binası</string>
<string name="cancel">İptal</string>
<string name="navigation_drawer_open"></string>
<string name="navigation_drawer_close">Kapat</string>
<string name="navigation_item_home">Anasayfa</string>
<string name="navigation_item_upload">Yükle</string>
<string name="navigation_item_nearby">Yakınındakiler</string>
<string name="navigation_item_about">Hakkında</string>
<string name="navigation_item_settings">Ayarlar</string>
<string name="navigation_item_feedback">Geri bildirim</string>
<string name="navigation_item_logout">Çıkış</string>
<string name="navigation_item_info">Eğitim</string>
<string name="nearby_needs_permissions">Yakındaki yerler, konum izinleri olmadan görüntülenemez</string>
<string name="no_description_found">hiçbir açıklama bulunamadı</string>
<string name="nearby_info_menu_commons_article">Commons dosya sayfası</string>
<string name="nearby_info_menu_wikidata_article">Vikiveri ögesi</string>
<string name="error_while_cache">Resimler önbelleğe alınırken hata oluştu</string>
<string name="title_info">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</string>
<string name="description_info">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.</string>
<string name="give_permission">İzin ver</string>
<string name="use_external_storage">Harici depolamayı kullanın</string>
<string name="use_external_storage_summary">Uygulama kamerası kullanıldığında çekilen fotoğrafları cihazına kaydedin</string>
<string name="send_log_file">Kayıt dosyasını gönder</string>
<string name="send_log_file_description">Kayıt dosyasını, e-posta aracılığıyla geliştiricilere gönderin</string>
<string name="login_to_your_account">Hesabınızda oturum açın</string>
<string name="nearby_location_has_not_changed">Konum değiştirilmedi</string>
<string name="nearby_location_not_available">Konum kullanılamıyor.</string>
<string name="location_permission_rationale_nearby">Yakındaki yerler listesini görüntülemek için izin vermeniz gerekiyor</string>
</resources>

View file

@ -68,7 +68,7 @@
<item quantity="other">%d次上传</item>
</plurals>
<string name="categories_not_found">没有找到匹配%1$s的分类</string>
<string name="categories_skip_explanation">添加分类使您的图像更容易在维基共享资源被找到。\n -\n -开始输入以添加分类。</string>
<string name="categories_skip_explanation">添加分类使您的图像更容易在维基共享资源被找到。开始输入以添加分类。</string>
<string name="categories_activity_title">分类</string>
<string name="title_activity_settings">设置</string>
<string name="title_activity_signup">注册</string>

View file

@ -70,9 +70,7 @@
<item quantity="other">%d uploads</item>
</plurals>
<string name="categories_not_found">No categories matching %1$s found</string>
- <string name="categories_skip_explanation">Add categories to make your images more discoverable on Wikimedia Commons.
-
-Start typing to add categories.</string>
<string name="categories_skip_explanation">Add categories to make your images more discoverable on Wikimedia Commons.\nStart typing to add categories.</string>
<string name="categories_activity_title">Categories</string>
<string name="title_activity_settings">Settings</string>
<string name="title_activity_signup">Sign Up</string>
@ -126,7 +124,7 @@
<string name="tutorial_3_text">Please do NOT upload:</string>
<string name="tutorial_3_subtext">- Selfies or pictures of your friends\n- Pictures you downloaded from the Internet\n- Screenshots of proprietary apps</string>
<string name="tutorial_4_text">Example upload:</string>
<string name="tutorial_4_subtext">- 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</string>
<string name="tutorial_4_subtext">- 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</string>
<string name="welcome_wikipedia_text">Contribute your images. Help Wikipedia articles come to life!</string>
<string name="welcome_wikipedia_subtext">Images on Wikipedia come from Wikimedia Commons.</string>
<string name="welcome_copyright_text">Your images help educate people around the world.</string>