Merge from commons-app/master

This commit is contained in:
misaochan 2018-05-25 19:17:55 +10:00
commit 7cbc2a674c
31 changed files with 683 additions and 181 deletions

View file

@ -19,12 +19,13 @@ android:
components: components:
- tools - tools
- platform-tools - platform-tools
- build-tools-26.0.2 - build-tools-27.0.0
- extra-google-m2repository - extra-google-m2repository
- extra-android-m2repository - extra-android-m2repository
- ${ANDROID_TARGET} - ${ANDROID_TARGET}
- android-25 - android-25
- android-26 - android-26
- android-27
- sys-img-${ANDROID_ABI}-${ANDROID_TARGET} - sys-img-${ANDROID_ABI}-${ANDROID_TARGET}
licenses: licenses:
- 'android-sdk-license-.+' - 'android-sdk-license-.+'

View file

@ -1,3 +1,7 @@
## Title (required)
Fixes #{GitHub issue number and title (Please do not forget adding title) }
## Description (required) ## Description (required)
Fixes #{GitHub issue number and title} Fixes #{GitHub issue number and title}

View file

@ -69,6 +69,10 @@ dependencies {
testImplementation 'com.nhaarman:mockito-kotlin:1.5.0' testImplementation 'com.nhaarman:mockito-kotlin:1.5.0'
testImplementation 'com.squareup.okhttp3:mockwebserver:3.8.1' testImplementation 'com.squareup.okhttp3:mockwebserver:3.8.1'
implementation 'com.caverock:androidsvg:1.2.1'
implementation 'com.github.bumptech.glide:glide:4.7.1'
kapt 'com.github.bumptech.glide:compiler:4.7.1'
androidTestImplementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" androidTestImplementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
androidTestImplementation 'com.squareup.okhttp3:mockwebserver:3.8.1' androidTestImplementation 'com.squareup.okhttp3:mockwebserver:3.8.1'
androidTestImplementation "com.android.support:support-annotations:$SUPPORT_LIB_VERSION" androidTestImplementation "com.android.support:support-annotations:$SUPPORT_LIB_VERSION"
@ -117,7 +121,7 @@ android {
buildTypes { buildTypes {
release { release {
minifyEnabled false // See https://stackoverflow.com/questions/40232404/google-play-apk-and-android-studio-apk-usb-debug-behaving-differently - proguard.cfg modification alone insufficient. minifyEnabled false // See https://stackoverflow.com/questions/40232404/google-play-apk-and-android-studio-apk-usb-debug-behaving-differently - proguard.cfg modification alone insufficient.
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt', 'proguard-glide.txt'
} }
debug { debug {
applicationIdSuffix ".debug" applicationIdSuffix ".debug"

9
app/proguard-glide.txt Normal file
View file

@ -0,0 +1,9 @@
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
# for DexGuard only
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule

View file

@ -18,7 +18,7 @@ task checkstyle(type: Checkstyle) {
reports { reports {
html { html {
enabled true enabled true
destination "${project.buildDir}/reports/checkstyle/checkstyle.html" destination file("${project.buildDir}/reports/checkstyle/checkstyle.html")
} }
} }
} }
@ -36,10 +36,10 @@ task pmd(type: Pmd) {
xml.enabled = false xml.enabled = false
html.enabled = true html.enabled = true
xml { xml {
destination "${project.buildDir}/reports/pmd/pmd.xml" destination file("${project.buildDir}/reports/pmd/pmd.xml")
} }
html { html {
destination "${project.buildDir}/reports/pmd/pmd.html" destination file("${project.buildDir}/reports/pmd/pmd.html")
} }
} }
} }

View file

@ -271,11 +271,11 @@ public class LoginActivity extends AccountAuthenticatorActivity {
showMessageAndCancelDialog(R.string.login_failed_network); showMessageAndCancelDialog(R.string.login_failed_network);
} else if (result.toLowerCase(Locale.getDefault()).contains("nosuchuser".toLowerCase()) || result.toLowerCase().contains("noname".toLowerCase())) { } else if (result.toLowerCase(Locale.getDefault()).contains("nosuchuser".toLowerCase()) || result.toLowerCase().contains("noname".toLowerCase())) {
// Matches nosuchuser, nosuchusershort, noname // Matches nosuchuser, nosuchusershort, noname
showMessageAndCancelDialog(R.string.login_failed_username); showMessageAndCancelDialog(R.string.login_failed_wrong_credentials);
emptySensitiveEditFields(); emptySensitiveEditFields();
} else if (result.toLowerCase(Locale.getDefault()).contains("wrongpassword".toLowerCase())) { } else if (result.toLowerCase(Locale.getDefault()).contains("wrongpassword".toLowerCase())) {
// Matches wrongpassword, wrongpasswordempty // Matches wrongpassword, wrongpasswordempty
showMessageAndCancelDialog(R.string.login_failed_password); showMessageAndCancelDialog(R.string.login_failed_wrong_credentials);
emptySensitiveEditFields(); emptySensitiveEditFields();
} else if (result.toLowerCase(Locale.getDefault()).contains("throttle".toLowerCase())) { } else if (result.toLowerCase(Locale.getDefault()).contains("throttle".toLowerCase())) {
// Matches unknown throttle error codes // Matches unknown throttle error codes

View file

@ -0,0 +1,36 @@
package fr.free.nrw.commons.glide;
import android.support.annotation.NonNull;
import com.bumptech.glide.load.Options;
import com.bumptech.glide.load.ResourceDecoder;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.resource.SimpleResource;
import com.caverock.androidsvg.SVG;
import com.caverock.androidsvg.SVGParseException;
import java.io.IOException;
import java.io.InputStream;
/**
* Decodes an SVG internal representation from an {@link InputStream}.
*/
public class SvgDecoder implements ResourceDecoder<InputStream, SVG> {
@Override
public boolean handles(@NonNull InputStream source, @NonNull Options options) {
// TODO: Can we tell?
return true;
}
public Resource<SVG> decode(@NonNull InputStream source, int width, int height,
@NonNull Options options)
throws IOException {
try {
SVG svg = SVG.getFromInputStream(source);
return new SimpleResource<>(svg);
} catch (SVGParseException ex) {
throw new IOException("Cannot load SVG from stream", ex);
}
}
}

View file

@ -0,0 +1,28 @@
package fr.free.nrw.commons.glide;
import android.graphics.Picture;
import android.graphics.drawable.PictureDrawable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.bumptech.glide.load.Options;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.resource.SimpleResource;
import com.bumptech.glide.load.resource.transcode.ResourceTranscoder;
import com.caverock.androidsvg.SVG;
/**
* Convert the {@link SVG}'s internal representation to an Android-compatible one
* ({@link Picture}).
*/
public class SvgDrawableTranscoder implements ResourceTranscoder<SVG, PictureDrawable> {
@Nullable
@Override
public Resource<PictureDrawable> transcode(@NonNull Resource<SVG> toTranscode,
@NonNull Options options) {
SVG svg = toTranscode.get();
Picture picture = svg.renderToPicture();
PictureDrawable drawable = new PictureDrawable(picture);
return new SimpleResource<>(drawable);
}
}

View file

@ -0,0 +1,51 @@
package fr.free.nrw.commons.glide;
import android.graphics.drawable.PictureDrawable;
import android.widget.ImageView;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.ImageViewTarget;
import com.bumptech.glide.request.target.Target;
/**
* Listener which updates the {@link ImageView} to be software rendered, because
* {@link com.caverock.androidsvg.SVG SVG}/{@link android.graphics.Picture Picture} can't render on
* a hardware backed {@link android.graphics.Canvas Canvas}.
*/
public class SvgSoftwareLayerSetter implements RequestListener<PictureDrawable> {
/**
* Sets the layer type to none if the load fails
* @param e
* @param model
* @param target
* @param isFirstResource
* @return
*/
@Override
public boolean onLoadFailed(GlideException e, Object model, Target<PictureDrawable> target,
boolean isFirstResource) {
ImageView view = ((ImageViewTarget<?>) target).getView();
view.setLayerType(ImageView.LAYER_TYPE_NONE, null);
return false;
}
/**
* Sets the layer type to software when the resource is ready
* @param resource
* @param model
* @param target
* @param dataSource
* @param isFirstResource
* @return
*/
@Override
public boolean onResourceReady(PictureDrawable resource, Object model,
Target<PictureDrawable> target, DataSource dataSource, boolean isFirstResource) {
ImageView view = ((ImageViewTarget<?>) target).getView();
view.setLayerType(ImageView.LAYER_TYPE_SOFTWARE, null);
return false;
}
}

View file

@ -23,9 +23,6 @@ import android.widget.ScrollView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import java.io.IOException; import java.io.IOException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
@ -35,6 +32,9 @@ import java.util.Locale;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Provider; import javax.inject.Provider;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import fr.free.nrw.commons.License; import fr.free.nrw.commons.License;
import fr.free.nrw.commons.LicenseList; import fr.free.nrw.commons.LicenseList;
import fr.free.nrw.commons.Media; import fr.free.nrw.commons.Media;
@ -56,16 +56,16 @@ import static android.widget.Toast.LENGTH_SHORT;
public class MediaDetailFragment extends CommonsDaggerSupportFragment { public class MediaDetailFragment extends CommonsDaggerSupportFragment {
private boolean editable; private boolean editable;
private boolean isFeaturedMedia; private boolean isCategoryImage;
private MediaDetailPagerFragment.MediaDetailProvider detailProvider; private MediaDetailPagerFragment.MediaDetailProvider detailProvider;
private int index; private int index;
public static MediaDetailFragment forMedia(int index, boolean editable, boolean isFeaturedMedia) { public static MediaDetailFragment forMedia(int index, boolean editable, boolean isCategoryImage) {
MediaDetailFragment mf = new MediaDetailFragment(); MediaDetailFragment mf = new MediaDetailFragment();
Bundle state = new Bundle(); Bundle state = new Bundle();
state.putBoolean("editable", editable); state.putBoolean("editable", editable);
state.putBoolean("isFeaturedMedia", isFeaturedMedia); state.putBoolean("isCategoryImage", isCategoryImage);
state.putInt("index", index); state.putInt("index", index);
state.putInt("listIndex", 0); state.putInt("listIndex", 0);
state.putInt("listTop", 0); state.putInt("listTop", 0);
@ -128,7 +128,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
outState.putInt("index", index); outState.putInt("index", index);
outState.putBoolean("editable", editable); outState.putBoolean("editable", editable);
outState.putBoolean("isFeaturedMedia", isFeaturedMedia); outState.putBoolean("isCategoryImage", isCategoryImage);
getScrollPosition(); getScrollPosition();
outState.putInt("listTop", initialListTop); outState.putInt("listTop", initialListTop);
@ -144,12 +144,12 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
if (savedInstanceState != null) { if (savedInstanceState != null) {
editable = savedInstanceState.getBoolean("editable"); editable = savedInstanceState.getBoolean("editable");
isFeaturedMedia = savedInstanceState.getBoolean("isFeaturedMedia"); isCategoryImage = savedInstanceState.getBoolean("isCategoryImage");
index = savedInstanceState.getInt("index"); index = savedInstanceState.getInt("index");
initialListTop = savedInstanceState.getInt("listTop"); initialListTop = savedInstanceState.getInt("listTop");
} else { } else {
editable = getArguments().getBoolean("editable"); editable = getArguments().getBoolean("editable");
isFeaturedMedia = getArguments().getBoolean("isFeaturedMedia"); isCategoryImage = getArguments().getBoolean("isCategoryImage");
index = getArguments().getInt("index"); index = getArguments().getInt("index");
initialListTop = 0; initialListTop = 0;
} }
@ -161,7 +161,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
ButterKnife.bind(this,view); ButterKnife.bind(this,view);
if (isFeaturedMedia){ if (isCategoryImage){
authorLayout.setVisibility(VISIBLE); authorLayout.setVisibility(VISIBLE);
} else { } else {
authorLayout.setVisibility(GONE); authorLayout.setVisibility(GONE);
@ -328,7 +328,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
if (!TextUtils.isEmpty(licenseLink(media))) { if (!TextUtils.isEmpty(licenseLink(media))) {
openWebBrowser(licenseLink(media)); openWebBrowser(licenseLink(media));
} else { } else {
if(isFeaturedMedia) { if(isCategoryImage) {
Timber.d("Unable to fetch license URL for %s", media.getLicense()); Timber.d("Unable to fetch license URL for %s", media.getLicense());
} else { } else {
Toast toast = Toast.makeText(getContext(), getString(R.string.null_url), Toast.LENGTH_SHORT); Toast toast = Toast.makeText(getContext(), getString(R.string.null_url), Toast.LENGTH_SHORT);
@ -503,8 +503,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
if (media.getRequestedDeletion()){ if (media.getRequestedDeletion()){
delete.setVisibility(GONE); delete.setVisibility(GONE);
nominatedForDeletion.setVisibility(VISIBLE); nominatedForDeletion.setVisibility(VISIBLE);
} } else if (!isCategoryImage) {
else{
delete.setVisibility(VISIBLE); delete.setVisibility(VISIBLE);
nominatedForDeletion.setVisibility(GONE); nominatedForDeletion.setVisibility(GONE);
} }

View file

@ -444,8 +444,8 @@ public class ApacheHttpClientMediaWikiApi implements MediaWikiApi {
.param("notprop", "list") .param("notprop", "list")
.param("format", "xml") .param("format", "xml")
.param("meta", "notifications") .param("meta", "notifications")
// .param("meta", "notifications")
.param("notformat", "model") .param("notformat", "model")
.param("notwikis", "wikidatawiki|commonswiki|enwiki")
.get() .get()
.getNode("/api/query/notifications/list"); .getNode("/api/query/notifications/list");
} catch (IOException e) { } catch (IOException e) {

View file

@ -1,6 +1,7 @@
package fr.free.nrw.commons.notification; package fr.free.nrw.commons.notification;
import android.util.Log; import android.graphics.drawable.PictureDrawable;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -8,17 +9,23 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.borjabravo.readmoretextview.ReadMoreTextView; import com.borjabravo.readmoretextview.ReadMoreTextView;
import com.bumptech.glide.RequestBuilder;
import com.pedrogomez.renderers.Renderer; import com.pedrogomez.renderers.Renderer;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
import fr.free.nrw.commons.glide.SvgSoftwareLayerSetter;
import static com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade;
/** /**
* Created by root on 19.12.2017. * Created by root on 19.12.2017.
*/ */
public class NotificationRenderer extends Renderer<Notification> { public class NotificationRenderer extends Renderer<Notification> {
private RequestBuilder<PictureDrawable> requestBuilder;
@BindView(R.id.title) ReadMoreTextView title; @BindView(R.id.title) ReadMoreTextView title;
@BindView(R.id.time) TextView time; @BindView(R.id.time) TextView time;
@BindView(R.id.icon) ImageView icon; @BindView(R.id.icon) ImageView icon;
@ -41,23 +48,32 @@ public class NotificationRenderer extends Renderer<Notification> {
protected View inflate(LayoutInflater layoutInflater, ViewGroup viewGroup) { protected View inflate(LayoutInflater layoutInflater, ViewGroup viewGroup) {
View inflatedView = layoutInflater.inflate(R.layout.item_notification, viewGroup, false); View inflatedView = layoutInflater.inflate(R.layout.item_notification, viewGroup, false);
ButterKnife.bind(this, inflatedView); ButterKnife.bind(this, inflatedView);
requestBuilder = GlideApp.with(inflatedView.getContext())
.as(PictureDrawable.class)
.error(R.drawable.round_icon_unknown)
.transition(withCrossFade())
.listener(new SvgSoftwareLayerSetter());
return inflatedView; return inflatedView;
} }
@Override @Override
public void render() { public void render() {
Notification notification = getContent(); Notification notification = getContent();
String str = notification.notificationText.trim(); setTitle(notification.notificationText);
str = str.concat(" ");
title.setText(str);
time.setText(notification.date); time.setText(notification.date);
switch (notification.notificationType) { requestBuilder.load(notification.iconUrl).into(icon);
case THANK_YOU_EDIT: }
icon.setImageResource(R.drawable.ic_edit_black_24dp);
break; /**
default: * Cleans up the notification text and sets it as the title
icon.setImageResource(R.drawable.round_icon_unknown); * Clean up is required to fix escaped HTML string and extra white spaces at the beginning of the notification
} * @param notificationText
*/
private void setTitle(String notificationText) {
notificationText = notificationText.trim().replaceAll("(^\\h*)|(\\h*$)", "");
notificationText = Html.fromHtml(notificationText).toString();
notificationText = notificationText.concat(" ");
title.setText(notificationText);
} }
public interface NotificationClicked{ public interface NotificationClicked{

View file

@ -16,12 +16,13 @@ import javax.annotation.Nullable;
import fr.free.nrw.commons.BuildConfig; import fr.free.nrw.commons.BuildConfig;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
import static fr.free.nrw.commons.notification.NotificationType.THANK_YOU_EDIT;
import static fr.free.nrw.commons.notification.NotificationType.UNKNOWN; import static fr.free.nrw.commons.notification.NotificationType.UNKNOWN;
public class NotificationUtils { public class NotificationUtils {
private static final String COMMONS_WIKI = "commonswiki"; private static final String COMMONS_WIKI = "commonswiki";
private static final String WIKIDATA_WIKI = "wikidatawiki";
private static final String WIKIPEDIA_WIKI = "enwiki";
public static boolean isCommonsNotification(Node document) { public static boolean isCommonsNotification(Node document) {
if (document == null || !document.hasAttributes()) { if (document == null || !document.hasAttributes()) {
@ -31,6 +32,32 @@ public class NotificationUtils {
return COMMONS_WIKI.equals(element.getAttribute("wiki")); return COMMONS_WIKI.equals(element.getAttribute("wiki"));
} }
/**
* Returns true if the wiki attribute corresponds to wikidatawiki
* @param document
* @return
*/
public static boolean isWikidataNotification(Node document) {
if (document == null || !document.hasAttributes()) {
return false;
}
Element element = (Element) document;
return WIKIDATA_WIKI.equals(element.getAttribute("wiki"));
}
/**
* Returns true if the wiki attribute corresponds to enwiki
* @param document
* @return
*/
public static boolean isWikipediaNotification(Node document) {
if (document == null || !document.hasAttributes()) {
return false;
}
Element element = (Element) document;
return WIKIPEDIA_WIKI.equals(element.getAttribute("wiki"));
}
public static NotificationType getNotificationType(Node document) { public static NotificationType getNotificationType(Node document) {
Element element = (Element) document; Element element = (Element) document;
String type = element.getAttribute("type"); String type = element.getAttribute("type");
@ -68,10 +95,17 @@ public class NotificationUtils {
return notifications; return notifications;
} }
/**
* Currently the app is interested in showing notifications just from the following three wikis: commons, wikidata, wikipedia
* This function returns true only if the notification belongs to any of the above wikis and is of a known notification type
* @param node
* @return
*/
private static boolean isUsefulNotification(Node node) { private static boolean isUsefulNotification(Node node) {
return isCommonsNotification(node) return (isCommonsNotification(node)
&& !getNotificationType(node).equals(UNKNOWN) || isWikidataNotification(node)
&& !getNotificationType(node).equals(THANK_YOU_EDIT); || isWikipediaNotification(node))
&& !getNotificationType(node).equals(UNKNOWN);
} }
public static boolean isBundledNotification(Node document) { public static boolean isBundledNotification(Node document) {
@ -97,7 +131,7 @@ public class NotificationUtils {
switch (type) { switch (type) {
case THANK_YOU_EDIT: case THANK_YOU_EDIT:
notificationText = context.getString(R.string.notifications_thank_you_edit); notificationText = getThankYouEditDescription(document);
break; break;
case EDIT_USER_TALK: case EDIT_USER_TALK:
notificationText = getNotificationText(document); notificationText = getNotificationText(document);
@ -146,6 +180,16 @@ public class NotificationUtils {
return body != null ? body.getTextContent() : ""; return body != null ? body.getTextContent() : "";
} }
/**
* Gets the header node returned in the XML document to form the description for thank you edits
* @param document
* @return
*/
private static String getThankYouEditDescription(Node document) {
Node body = getNode(getModel(document), "header");
return body != null ? body.getTextContent() : "";
}
private static String getNotificationIconUrl(Node document) { private static String getNotificationIconUrl(Node document) {
String format = "%s%s"; String format = "%s%s";
Node iconUrl = getNode(getModel(document), "iconUrl"); Node iconUrl = getNode(getModel(document), "iconUrl");

View file

@ -0,0 +1,35 @@
package fr.free.nrw.commons.notification;
import android.content.Context;
import android.graphics.drawable.PictureDrawable;
import android.support.annotation.NonNull;
import com.bumptech.glide.Glide;
import com.bumptech.glide.Registry;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;
import com.caverock.androidsvg.SVG;
import java.io.InputStream;
import fr.free.nrw.commons.glide.SvgDecoder;
import fr.free.nrw.commons.glide.SvgDrawableTranscoder;
/**
* Module for the SVG sample app.
*/
@GlideModule
public class SvgModule extends AppGlideModule {
@Override
public void registerComponents(@NonNull Context context, @NonNull Glide glide,
@NonNull Registry registry) {
registry.register(SVG.class, PictureDrawable.class, new SvgDrawableTranscoder())
.append(InputStream.class, SVG.class, new SvgDecoder());
}
// Disable manifest parsing to avoid adding similar modules twice.
@Override
public boolean isManifestParsingEnabled() {
return false;
}
}

View file

@ -26,6 +26,8 @@ import android.widget.GridView;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
import com.facebook.drawee.view.SimpleDraweeView; import com.facebook.drawee.view.SimpleDraweeView;
@ -41,9 +43,13 @@ public class MultipleUploadListFragment extends Fragment {
void OnMultipleUploadInitiated(); void OnMultipleUploadInitiated();
} }
private GridView photosGrid; @BindView(R.id.multipleShareBackground)
GridView photosGrid;
@BindView(R.id.multipleBaseTitle)
EditText baseTitle;
private PhotoDisplayAdapter photosAdapter; private PhotoDisplayAdapter photosAdapter;
private EditText baseTitle;
private TitleTextWatcher textWatcher = new TitleTextWatcher(); private TitleTextWatcher textWatcher = new TitleTextWatcher();
private Point photoSize; private Point photoSize;
@ -166,9 +172,7 @@ public class MultipleUploadListFragment extends Fragment {
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_multiple_uploads_list, container, false); View view = inflater.inflate(R.layout.fragment_multiple_uploads_list, container, false);
photosGrid = view.findViewById(R.id.multipleShareBackground); ButterKnife.bind(this,view);
baseTitle = view.findViewById(R.id.multipleBaseTitle);
photosAdapter = new PhotoDisplayAdapter(); photosAdapter = new PhotoDisplayAdapter();
photosGrid.setAdapter(photosAdapter); photosGrid.setAdapter(photosAdapter);
photosGrid.setOnItemClickListener((AdapterView.OnItemClickListener) getActivity()); photosGrid.setOnItemClickListener((AdapterView.OnItemClickListener) getActivity());

View file

@ -8,7 +8,6 @@ import android.animation.AnimatorSet;
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
@ -32,16 +31,16 @@ import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v4.content.ContextCompat; import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.BitmapCompat; import android.support.v4.graphics.BitmapCompat;
import android.support.v7.app.AlertDialog;
import android.util.Log; import android.util.Log;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.WindowManager;
import android.view.animation.DecelerateInterpolator; import android.view.animation.DecelerateInterpolator;
import android.view.inputmethod.InputMethodManager; import android.widget.FrameLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import butterknife.BindView;
import butterknife.OnClick;
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
import com.facebook.drawee.view.SimpleDraweeView; import com.facebook.drawee.view.SimpleDraweeView;
import com.github.chrisbanes.photoview.PhotoView; import com.github.chrisbanes.photoview.PhotoView;
@ -69,22 +68,18 @@ import fr.free.nrw.commons.caching.CacheController;
import fr.free.nrw.commons.category.CategorizationFragment; import fr.free.nrw.commons.category.CategorizationFragment;
import fr.free.nrw.commons.category.OnCategoriesSaveHandler; import fr.free.nrw.commons.category.OnCategoriesSaveHandler;
import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.contributions.Contribution;
import fr.free.nrw.commons.contributions.ContributionsActivity;
import fr.free.nrw.commons.modifications.CategoryModifier; import fr.free.nrw.commons.modifications.CategoryModifier;
import fr.free.nrw.commons.modifications.ModificationsContentProvider; import fr.free.nrw.commons.modifications.ModificationsContentProvider;
import fr.free.nrw.commons.modifications.ModifierSequence; import fr.free.nrw.commons.modifications.ModifierSequence;
import fr.free.nrw.commons.modifications.ModifierSequenceDao; import fr.free.nrw.commons.modifications.ModifierSequenceDao;
import fr.free.nrw.commons.modifications.TemplateRemoveModifier; import fr.free.nrw.commons.modifications.TemplateRemoveModifier;
import fr.free.nrw.commons.utils.ImageUtils;
import fr.free.nrw.commons.mwapi.MediaWikiApi; import fr.free.nrw.commons.mwapi.MediaWikiApi;
import fr.free.nrw.commons.utils.ViewUtil; import fr.free.nrw.commons.utils.ViewUtil;
import timber.log.Timber; import timber.log.Timber;
import android.support.design.widget.FloatingActionButton;
import static fr.free.nrw.commons.upload.ExistingFileAsync.Result.DUPLICATE_PROCEED; import static fr.free.nrw.commons.upload.ExistingFileAsync.Result.DUPLICATE_PROCEED;
import static fr.free.nrw.commons.upload.ExistingFileAsync.Result.NO_DUPLICATE; import static fr.free.nrw.commons.upload.ExistingFileAsync.Result.NO_DUPLICATE;
import static java.lang.Long.min;
/** /**
* Activity for the title/desc screen after image is selected. Also starts processing image * Activity for the title/desc screen after image is selected. Also starts processing image
@ -95,6 +90,22 @@ public class ShareActivity
implements SingleUploadFragment.OnUploadActionInitiated, implements SingleUploadFragment.OnUploadActionInitiated,
OnCategoriesSaveHandler,SimilarImageDialogFragment.onResponse { OnCategoriesSaveHandler,SimilarImageDialogFragment.onResponse {
@BindView(R.id.container)
FrameLayout flContainer;
@BindView(R.id.backgroundImage)
SimpleDraweeView backgroundImageView;
@BindView(R.id.media_map)
FloatingActionButton mapsFragment; //Lets stick to camelCase
@BindView(R.id.media_upload_zoom_in)
FloatingActionButton zoomInButton;
@BindView(R.id.media_upload_zoom_out)
FloatingActionButton zoomOutButton;
@BindView(R.id.main_fab)
FloatingActionButton mainFab;
@BindView(R.id.expanded_image)
PhotoView expandedImageView;
private static final int REQUEST_PERM_ON_CREATE_STORAGE = 1; private static final int REQUEST_PERM_ON_CREATE_STORAGE = 1;
private static final int REQUEST_PERM_ON_CREATE_LOCATION = 2; private static final int REQUEST_PERM_ON_CREATE_LOCATION = 2;
private static final int REQUEST_PERM_ON_CREATE_STORAGE_AND_LOCATION = 3; private static final int REQUEST_PERM_ON_CREATE_STORAGE_AND_LOCATION = 3;
@ -120,9 +131,6 @@ public class ShareActivity
private Uri mediaUri; private Uri mediaUri;
private Contribution contribution; private Contribution contribution;
private SimpleDraweeView backgroundImageView;
private FloatingActionButton maps_fragment;
private boolean cacheFound; private boolean cacheFound;
private GPSExtractor imageObj; private GPSExtractor imageObj;
@ -143,11 +151,14 @@ public class ShareActivity
private Animator CurrentAnimator; private Animator CurrentAnimator;
private long ShortAnimationDuration; private long ShortAnimationDuration;
private FloatingActionButton zoomInButton;
private FloatingActionButton zoomOutButton;
private FloatingActionButton mainFab;
private boolean isFABOpen = false; private boolean isFABOpen = false;
//Had to make them class variables, to extract out the click listeners, also I see no harm in this
final Rect startBounds = new Rect();
final Rect finalBounds = new Rect();
final Point globalOffset = new Point();
private float startScaleFinal;
/** /**
* Called when user taps the submit button. * Called when user taps the submit button.
* Requests Storage permission, if needed. * Requests Storage permission, if needed.
@ -264,7 +275,6 @@ public class ShareActivity
setContentView(R.layout.activity_share); setContentView(R.layout.activity_share);
ButterKnife.bind(this); ButterKnife.bind(this);
initBack(); initBack();
backgroundImageView = (SimpleDraweeView) findViewById(R.id.backgroundImage);
backgroundImageView.setHierarchy(GenericDraweeHierarchyBuilder backgroundImageView.setHierarchy(GenericDraweeHierarchyBuilder
.newInstance(getResources()) .newInstance(getResources())
.setPlaceholderImage(VectorDrawableCompat.create(getResources(), .setPlaceholderImage(VectorDrawableCompat.create(getResources(),
@ -337,6 +347,7 @@ public class ShareActivity
if (mediaUri != null) { if (mediaUri != null) {
backgroundImageView.setImageURI(mediaUri); backgroundImageView.setImageURI(mediaUri);
} }
<<<<<<< HEAD
} }
/** /**
@ -388,18 +399,94 @@ public class ShareActivity
}); });
} }
/**
=======
if (savedInstanceState != null) {
contribution = savedInstanceState.getParcelable("contribution");
}
requestAuthToken();
Timber.d("Uri: %s", mediaUri.toString());
Timber.d("Ext storage dir: %s", Environment.getExternalStorageDirectory());
useNewPermissions = false;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
useNewPermissions = true;
if (!needsToRequestStoragePermission()) {
storagePermitted = true;
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
locationPermitted = true;
}
}
// Check storage permissions if marshmallow or newer
if (useNewPermissions && (!storagePermitted || !locationPermitted)) {
if (!storagePermitted && !locationPermitted) {
String permissionRationales =
getResources().getString(R.string.read_storage_permission_rationale) + "\n"
+ getResources().getString(R.string.location_permission_rationale);
snackbar = requestPermissionUsingSnackBar(
permissionRationales,
new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION},
REQUEST_PERM_ON_CREATE_STORAGE_AND_LOCATION);
View snackbarView = snackbar.getView();
TextView textView = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
textView.setMaxLines(3);
} else if (!storagePermitted) {
requestPermissionUsingSnackBar(
getString(R.string.read_storage_permission_rationale),
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
REQUEST_PERM_ON_CREATE_STORAGE);
} else if (!locationPermitted) {
requestPermissionUsingSnackBar(
getString(R.string.location_permission_rationale),
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
REQUEST_PERM_ON_CREATE_LOCATION);
}
}
performPreUploadProcessingOfFile();
SingleUploadFragment shareView = (SingleUploadFragment) getSupportFragmentManager().findFragmentByTag("shareView");
categorizationFragment = (CategorizationFragment) getSupportFragmentManager().findFragmentByTag("categorization");
if (shareView == null && categorizationFragment == null) {
shareView = new SingleUploadFragment();
getSupportFragmentManager()
.beginTransaction()
.add(R.id.single_upload_fragment_container, shareView, "shareView")
.commitAllowingStateLoss();
}
uploadController.prepareService();
mapsFragment.setVisibility(View.VISIBLE);
if( imageObj == null || imageObj.imageCoordsExists != true){
mapsFragment.setVisibility(View.INVISIBLE);
}
}
/*
>>>>>>> refs/remotes/commons-app/master
* Function to display the zoom and map FAB * Function to display the zoom and map FAB
*/ */
private void showFABMenu() { private void showFABMenu() {
isFABOpen=true; isFABOpen=true;
<<<<<<< HEAD
if( imageObj != null && imageObj.imageCoordsExists) if( imageObj != null && imageObj.imageCoordsExists)
maps_fragment.setVisibility(View.VISIBLE); maps_fragment.setVisibility(View.VISIBLE);
=======
if( imageObj != null && imageObj.imageCoordsExists == true)
mapsFragment.setVisibility(View.VISIBLE);
>>>>>>> refs/remotes/commons-app/master
zoomInButton.setVisibility(View.VISIBLE); zoomInButton.setVisibility(View.VISIBLE);
mainFab.animate().rotationBy(180); mainFab.animate().rotationBy(180);
maps_fragment.animate().translationY(-getResources().getDimension(R.dimen.second_fab)); mapsFragment.animate().translationY(-getResources().getDimension(R.dimen.second_fab));
zoomInButton.animate().translationY(-getResources().getDimension(R.dimen.first_fab)); zoomInButton.animate().translationY(-getResources().getDimension(R.dimen.first_fab));
} }
@ -409,7 +496,7 @@ public class ShareActivity
private void closeFABMenu(){ private void closeFABMenu(){
isFABOpen=false; isFABOpen=false;
mainFab.animate().rotationBy(-180); mainFab.animate().rotationBy(-180);
maps_fragment.animate().translationY(0); mapsFragment.animate().translationY(0);
zoomInButton.animate().translationY(0).setListener(new Animator.AnimatorListener() { zoomInButton.animate().translationY(0).setListener(new Animator.AnimatorListener() {
@Override @Override
public void onAnimationStart(Animator animator) { public void onAnimationStart(Animator animator) {
@ -418,7 +505,7 @@ public class ShareActivity
@Override @Override
public void onAnimationEnd(Animator animator) { public void onAnimationEnd(Animator animator) {
if(!isFABOpen){ if(!isFABOpen){
maps_fragment.setVisibility(View.GONE); mapsFragment.setVisibility(View.GONE);
zoomInButton.setVisibility(View.GONE); zoomInButton.setVisibility(View.GONE);
} }
} }
@ -671,8 +758,9 @@ public class ShareActivity
return; return;
} }
//I might not be supposed to change it, but still, I saw it
@Override @Override
public void onPostiveResponse() { public void onPositiveResponse() {
imageObj = tempImageObj; imageObj = tempImageObj;
decimalCoords = imageObj.getCoords(false);// Not necessary to use gps as image already ha EXIF data decimalCoords = imageObj.getCoords(false);// Not necessary to use gps as image already ha EXIF data
Timber.d("EXIF from tempImageObj"); Timber.d("EXIF from tempImageObj");
@ -838,26 +926,19 @@ public class ShareActivity
scaled = bitmap; scaled = bitmap;
} }
// Load the high-resolution "zoomed-in" image. // Load the high-resolution "zoomed-in" image.
PhotoView expandedImageView = (PhotoView) findViewById(
R.id.expanded_image);
expandedImageView.setImageBitmap(scaled); expandedImageView.setImageBitmap(scaled);
// Calculate the starting and ending bounds for the zoomed-in image. // Calculate the starting and ending bounds for the zoomed-in image.
// This step involves lots of math. Yay, math. // This step involves lots of math. Yay, math.
final Rect startBounds = new Rect();
final Rect finalBounds = new Rect();
final Point globalOffset = new Point();
// The start bounds are the global visible rectangle of the thumbnail, // The start bounds are the global visible rectangle of the thumbnail,
// and the final bounds are the global visible rectangle of the container // and the final bounds are the global visible rectangle of the container
// view. Also set the container view's offset as the origin for the // view. Also set the container view's offset as the origin for the
// bounds, since that's the origin for the positioning animation // bounds, since that's the origin for the positioning animation
// properties (X, Y). // properties (X, Y).
thumbView.getGlobalVisibleRect(startBounds); thumbView.getGlobalVisibleRect(startBounds);
findViewById(R.id.container) flContainer.getGlobalVisibleRect(finalBounds, globalOffset);
.getGlobalVisibleRect(finalBounds, globalOffset);
startBounds.offset(-globalOffset.x, -globalOffset.y); startBounds.offset(-globalOffset.x, -globalOffset.y);
finalBounds.offset(-globalOffset.x, -globalOffset.y); finalBounds.offset(-globalOffset.x, -globalOffset.y);
@ -928,53 +1009,86 @@ public class ShareActivity
// Upon clicking the zoomed-in image, it should zoom back down // Upon clicking the zoomed-in image, it should zoom back down
// to the original bounds and show the thumbnail instead of // to the original bounds and show the thumbnail instead of
// the expanded image. // the expanded image.
final float startScaleFinal = startScale; startScaleFinal = startScale;
zoomOutButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (CurrentAnimator != null) {
CurrentAnimator.cancel();
}
zoomOutButton.setVisibility(View.GONE);
mainFab.setVisibility(View.VISIBLE);
// Animate the four positioning/sizing properties in parallel,
// back to their original values.
AnimatorSet set = new AnimatorSet();
set.play(ObjectAnimator
.ofFloat(expandedImageView, View.X, startBounds.left))
.with(ObjectAnimator
.ofFloat(expandedImageView,
View.Y,startBounds.top))
.with(ObjectAnimator
.ofFloat(expandedImageView,
View.SCALE_X, startScaleFinal))
.with(ObjectAnimator
.ofFloat(expandedImageView,
View.SCALE_Y, startScaleFinal));
set.setDuration(ShortAnimationDuration);
set.setInterpolator(new DecelerateInterpolator());
set.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
thumbView.setAlpha(1f);
expandedImageView.setVisibility(View.GONE);
CurrentAnimator = null;
}
@Override
public void onAnimationCancel(Animator animation) {
thumbView.setAlpha(1f);
expandedImageView.setVisibility(View.GONE);
CurrentAnimator = null;
}
});
set.start();
CurrentAnimator = set;
}
});
} }
/*
* called when upper arrow floating button
*/
@OnClick(R.id.main_fab)
public void onMainFabClicked() {
if (!isFABOpen) {
showFABMenu();
} else {
closeFABMenu();
}
}
@OnClick(R.id.media_upload_zoom_in)
public void onZoomInFabClicked() {
//This try catch block was originally holding the entire click listener on the fab button, I did not wanted to risk exceptions
try {
zoomImageFromThumb(backgroundImageView, mediaUri);
} catch (Exception e) {
Log.i("exception", e.toString());
}
}
@OnClick(R.id.media_upload_zoom_out)
public void onZoomOutFabClicked() {
if (CurrentAnimator != null) {
CurrentAnimator.cancel();
}
zoomOutButton.setVisibility(View.GONE);
mainFab.setVisibility(View.VISIBLE);
// Animate the four positioning/sizing properties in parallel,
// back to their original values.
AnimatorSet set = new AnimatorSet();
set.play(ObjectAnimator
.ofFloat(expandedImageView, View.X, startBounds.left))
.with(ObjectAnimator
.ofFloat(expandedImageView,
View.Y, startBounds.top))
.with(ObjectAnimator
.ofFloat(expandedImageView,
View.SCALE_X, startScaleFinal))
.with(ObjectAnimator
.ofFloat(expandedImageView,
View.SCALE_Y, startScaleFinal));
set.setDuration(ShortAnimationDuration);
set.setInterpolator(new DecelerateInterpolator());
set.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
//background image view is thumbView
backgroundImageView.setAlpha(1f);
expandedImageView.setVisibility(View.GONE);
CurrentAnimator = null;
}
@Override
public void onAnimationCancel(Animator animation) {
//background image view is thumbView
backgroundImageView.setAlpha(1f);
expandedImageView.setVisibility(View.GONE);
CurrentAnimator = null;
}
});
set.start();
CurrentAnimator = set;
}
@OnClick(R.id.media_map)
public void onFabShowMapsClicked() {
if (imageObj != null && imageObj.imageCoordsExists == true) {
Uri gmmIntentUri = Uri
.parse("google.streetview:cbll=" + imageObj.getDecLatitude() + "," + imageObj
.getDecLongitude());
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);
}
}
} }

View file

@ -13,6 +13,9 @@ import android.view.ViewGroup;
import android.view.Window; import android.view.Window;
import android.widget.Button; import android.widget.Button;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
import com.facebook.drawee.view.SimpleDraweeView; import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.listener.RequestListener; import com.facebook.imagepipeline.listener.RequestListener;
@ -29,29 +32,33 @@ import fr.free.nrw.commons.R;
*/ */
public class SimilarImageDialogFragment extends DialogFragment { public class SimilarImageDialogFragment extends DialogFragment {
@BindView(R.id.orginalImage)
SimpleDraweeView originalImage; SimpleDraweeView originalImage;
@BindView(R.id.possibleImage)
SimpleDraweeView possibleImage; SimpleDraweeView possibleImage;
@BindView(R.id.postive_button)
Button positiveButton; Button positiveButton;
@BindView(R.id.negative_button)
Button negativeButton; Button negativeButton;
onResponse mOnResponse;//Implemented interface from shareActivity onResponse mOnResponse;//Implemented interface from shareActivity
Boolean gotResponse = false; Boolean gotResponse = false;
public SimilarImageDialogFragment() { public SimilarImageDialogFragment() {
} }
public interface onResponse{ public interface onResponse{
public void onPostiveResponse(); public void onPositiveResponse();
public void onNegativeResponse(); public void onNegativeResponse();
} }
@Override @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_similar_image_dialog, container, false); View view = inflater.inflate(R.layout.fragment_similar_image_dialog, container, false);
ButterKnife.bind(this,view);
Set<RequestListener> requestListeners = new HashSet<>(); Set<RequestListener> requestListeners = new HashSet<>();
requestListeners.add(new RequestLoggingListener()); requestListeners.add(new RequestLoggingListener());
originalImage =(SimpleDraweeView) view.findViewById(R.id.orginalImage);
possibleImage =(SimpleDraweeView) view.findViewById(R.id.possibleImage);
positiveButton = (Button) view.findViewById(R.id.postive_button);
negativeButton = (Button) view.findViewById(R.id.negative_button);
originalImage.setHierarchy(GenericDraweeHierarchyBuilder originalImage.setHierarchy(GenericDraweeHierarchyBuilder
.newInstance(getResources()) .newInstance(getResources())
.setPlaceholderImage(VectorDrawableCompat.create(getResources(), .setPlaceholderImage(VectorDrawableCompat.create(getResources(),
@ -70,22 +77,6 @@ public class SimilarImageDialogFragment extends DialogFragment {
originalImage.setImageURI(Uri.fromFile(new File(getArguments().getString("originalImagePath")))); originalImage.setImageURI(Uri.fromFile(new File(getArguments().getString("originalImagePath"))));
possibleImage.setImageURI(Uri.fromFile(new File(getArguments().getString("possibleImagePath")))); possibleImage.setImageURI(Uri.fromFile(new File(getArguments().getString("possibleImagePath"))));
negativeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mOnResponse.onNegativeResponse();
gotResponse = true;
dismiss();
}
});
positiveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mOnResponse.onPostiveResponse();
gotResponse = true;
dismiss();
}
});
return view; return view;
} }
@ -105,8 +96,23 @@ public class SimilarImageDialogFragment extends DialogFragment {
@Override @Override
public void onDismiss(DialogInterface dialog) { public void onDismiss(DialogInterface dialog) {
// I user dismisses dialog by pressing outside the dialog. // I user dismisses dialog by pressing outside the dialog.
if(!gotResponse) if (!gotResponse) {
mOnResponse.onNegativeResponse(); mOnResponse.onNegativeResponse();
}
super.onDismiss(dialog); super.onDismiss(dialog);
} }
@OnClick(R.id.negative_button)
public void onNegativeButtonClicked() {
mOnResponse.onNegativeResponse();
gotResponse = true;
dismiss();
}
@OnClick(R.id.postive_button)
public void onPositiveButtonClicked() {
mOnResponse.onPositiveResponse();
gotResponse = true;
dismiss();
}
} }

View file

@ -84,6 +84,7 @@
<string name="categories_activity_title">Categoríes</string> <string name="categories_activity_title">Categoríes</string>
<string name="title_activity_settings">Configuración</string> <string name="title_activity_settings">Configuración</string>
<string name="title_activity_signup">Date d\'alta</string> <string name="title_activity_signup">Date d\'alta</string>
<string name="title_activity_featured_images">Imáxenes destacaes</string>
<string name="menu_about">Tocante a</string> <string name="menu_about">Tocante a</string>
<string name="about_license">La app de Wikimedia Commons ye software de códigu abiertu, creáu y calteníu por becaos y voluntarios de la comunidá de Wikimedia. La Fundación Wikimedia nun participa na creación, desendolcu nin caltenimientu de la app.</string> <string name="about_license">La app de Wikimedia Commons ye software de códigu abiertu, creáu y calteníu por becaos y voluntarios de la comunidá de Wikimedia. La Fundación Wikimedia nun participa na creación, desendolcu nin caltenimientu de la app.</string>
<string name="about_improve">Crea una nueva &lt;a href=\"https://github.com/commons-app/apps-android-commons/issues\"&gt;incidencia en GitHub&lt;/a&gt; pa informar de problemes y suxerencies.</string> <string name="about_improve">Crea una nueva &lt;a href=\"https://github.com/commons-app/apps-android-commons/issues\"&gt;incidencia en GitHub&lt;/a&gt; pa informar de problemes y suxerencies.</string>
@ -169,6 +170,8 @@
<string name="media_detail_media_title">Títulu del mediu</string> <string name="media_detail_media_title">Títulu del mediu</string>
<string name="media_detail_description">Descripción</string> <string name="media_detail_description">Descripción</string>
<string name="media_detail_description_explanation">Equí va la descripción del mediu. Esto pué ser llargo enforma, y necesitará espardese per delles llinies. Sicasí, esperamos que se vea bien.</string> <string name="media_detail_description_explanation">Equí va la descripción del mediu. Esto pué ser llargo enforma, y necesitará espardese per delles llinies. Sicasí, esperamos que se vea bien.</string>
<string name="media_detail_author">Autor</string>
<string name="media_detail_author_explanation">El nome d\'usuariu del autor de la imaxe destacada va equí.</string>
<string name="media_detail_uploaded_date">Data d\'unviu</string> <string name="media_detail_uploaded_date">Data d\'unviu</string>
<string name="media_detail_license">Llicencia</string> <string name="media_detail_license">Llicencia</string>
<string name="media_detail_coordinates">Coordenaes</string> <string name="media_detail_coordinates">Coordenaes</string>
@ -211,6 +214,7 @@
<string name="navigation_item_logout">Salir</string> <string name="navigation_item_logout">Salir</string>
<string name="navigation_item_info">Tutorial</string> <string name="navigation_item_info">Tutorial</string>
<string name="navigation_item_notification">Avisos</string> <string name="navigation_item_notification">Avisos</string>
<string name="navigation_item_featured_images">Destacada</string>
<string name="nearby_needs_permissions">Los sitios cercanos nun pueden amosase ensin los permisos d\'allugamientu</string> <string name="nearby_needs_permissions">Los sitios cercanos nun pueden amosase ensin los permisos d\'allugamientu</string>
<string name="no_description_found">nun s\'atoparon descripciones</string> <string name="no_description_found">nun s\'atoparon descripciones</string>
<string name="nearby_info_menu_commons_article">Páxina del ficheru en Commons</string> <string name="nearby_info_menu_commons_article">Páxina del ficheru en Commons</string>
@ -259,4 +263,14 @@
<string name="about_translate_proceed">Siguir</string> <string name="about_translate_proceed">Siguir</string>
<string name="about_translate_cancel">Encaboxar</string> <string name="about_translate_cancel">Encaboxar</string>
<string name="retry">Retentar</string> <string name="retry">Retentar</string>
<string name="showcase_view_got_it_button">Entendílo</string>
<string name="showcase_view_whole_nearby_activity">Estos son sitios cercanos a ti que precisen imaxes para ilustrar los sos artículos de Wikipedia</string>
<string name="showcase_view_list_icon">Tocando esti botón amuésase la llista d\'esos llugares</string>
<string name="showcase_view_plus_fab">Puedes xubir una imaxe pa cualquier sitiu dende la galería o la cámara</string>
<string name="no_images_found">Nun s\'alcontró nenguna imaxe</string>
<string name="error_loading_images">Asocedió un error al cargar les imáxenes.</string>
<string name="image_uploaded_by">Xubida por: %1$s</string>
<string name="share_app_title">Compartir app</string>
<string name="share_coordinates_not_present">Nun s\'especificaron les coordenaes al escoyer la imaxe</string>
<string name="error_fetching_nearby_places">Error al llograr los llugares cercanos.</string>
</resources> </resources>

View file

@ -13,6 +13,7 @@
<string name="preference_category_general">Bıngeh</string> <string name="preference_category_general">Bıngeh</string>
<string name="preference_category_location">Lokasyon</string> <string name="preference_category_location">Lokasyon</string>
<string name="app_name">Commons</string> <string name="app_name">Commons</string>
<string name="bullet"></string>
<string name="menu_settings">Eyari</string> <string name="menu_settings">Eyari</string>
<string name="username">Namey karberi</string> <string name="username">Namey karberi</string>
<string name="password">Parola</string> <string name="password">Parola</string>
@ -84,7 +85,8 @@
<string name="title_activity_signup">Qeyd be</string> <string name="title_activity_signup">Qeyd be</string>
<string name="menu_about">Heq te cı</string> <string name="menu_about">Heq te cı</string>
<string name="about_improve">Qandê yew &lt;a href=\"https://github.com/commons-app/apps-android-commons/issues\"&gt;GitHub-cıkewtış&lt;/a&gt;ê neweyi rê rapor û teklifan bıaferne.</string> <string name="about_improve">Qandê yew &lt;a href=\"https://github.com/commons-app/apps-android-commons/issues\"&gt;GitHub-cıkewtış&lt;/a&gt;ê neweyi rê rapor û teklifan bıaferne.</string>
<string name="about_privacy_policy" fuzzy="true">&lt;a href=\"https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\"&gt;Politikay nımıtışi&lt;/a&gt;</string> <string name="about_privacy_policy">&lt;u&gt;Politikaya nımıtışi&lt;/u&gt;</string>
<string name="about_credits">&lt;u&gt;İştırakkerdoği&lt;/u&gt;</string>
<string name="title_activity_about">Heq te cı</string> <string name="title_activity_about">Heq te cı</string>
<string name="menu_feedback">Peyd rışten bırış (E-posta ra)</string> <string name="menu_feedback">Peyd rışten bırış (E-posta ra)</string>
<string name="no_email_client">E-posta eyar nêbi</string> <string name="no_email_client">E-posta eyar nêbi</string>
@ -92,7 +94,7 @@
<string name="menu_retry_upload">Anciya bıcerrebne</string> <string name="menu_retry_upload">Anciya bıcerrebne</string>
<string name="menu_cancel_upload">Bıtexelne</string> <string name="menu_cancel_upload">Bıtexelne</string>
<string name="menu_download">Ron</string> <string name="menu_download">Ron</string>
<string name="preference_license" fuzzy="true">Lisans</string> <string name="preference_license">Lisanso hesebiyaye</string>
<string name="license_name_cc_by_sa"> Attribution-ShareAlike 3.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_cc_by">Attribution 3.0</string>
<string name="license_name_cc0">CC0</string> <string name="license_name_cc0">CC0</string>
@ -127,6 +129,8 @@
<string name="yes">E</string> <string name="yes">E</string>
<string name="no"></string> <string name="no"></string>
<string name="media_detail_title">Sername</string> <string name="media_detail_title">Sername</string>
<string name="media_detail_description">Şınasnayış</string>
<string name="media_detail_author">Nuştekar</string>
<string name="media_detail_license">Lisans</string> <string name="media_detail_license">Lisans</string>
<string name="media_detail_coordinates">Koordinati</string> <string name="media_detail_coordinates">Koordinati</string>
<string name="welcome_image_tulip">Korbıze</string> <string name="welcome_image_tulip">Korbıze</string>

View file

@ -162,8 +162,8 @@
<string name="detail_description_empty">Nincs leírás</string> <string name="detail_description_empty">Nincs leírás</string>
<string name="detail_license_empty">Ismeretlen licenc</string> <string name="detail_license_empty">Ismeretlen licenc</string>
<string name="menu_refresh">Frissítés</string> <string name="menu_refresh">Frissítés</string>
<string name="read_storage_permission_rationale" fuzzy="true">Szükséges engedély: Külső tárhely olvasása. Az alkalmazás nem működik enélkül.</string> <string name="read_storage_permission_rationale">Szükséges engedély: Külső tárhely olvasása. Az alkalmazás nem működik enélkül.</string>
<string name="write_storage_permission_rationale" fuzzy="true">Szükséges engedély: Külső tárhely írása. Az alkalmazás nem működik enélkül.</string> <string name="write_storage_permission_rationale">Szükséges engedély: Külső tárhely írása. Az alkalmazás nem tudja használni a kamerát enélkül.</string>
<string name="location_permission_rationale">Lehetséges engedély: Jelenlegi hely megszerzése, a kategóriajavaslatok lehetőségéért.</string> <string name="location_permission_rationale">Lehetséges engedély: Jelenlegi hely megszerzése, a kategóriajavaslatok lehetőségéért.</string>
<string name="ok">OK</string> <string name="ok">OK</string>
<string name="title_activity_nearby">Közeli helyek</string> <string name="title_activity_nearby">Közeli helyek</string>
@ -242,6 +242,7 @@
<string name="nearby_location_has_not_changed">A hely nem változott.</string> <string name="nearby_location_has_not_changed">A hely nem változott.</string>
<string name="nearby_location_not_available">A hely nem érhető el.</string> <string name="nearby_location_not_available">A hely nem érhető el.</string>
<string name="location_permission_rationale_nearby">Közeli helyek listájának megtekintéséhez engedély szükséges</string> <string name="location_permission_rationale_nearby">Közeli helyek listájának megtekintéséhez engedély szükséges</string>
<string name="read_article">SZÓCIKK OLVASÁSA</string>
<string name="notifications_welcome">Üdvözlünk a Wikimedia Commonson, %1$s! Örülünk, hogy itt vagy.</string> <string name="notifications_welcome">Üdvözlünk a Wikimedia Commonson, %1$s! Örülünk, hogy itt vagy.</string>
<string name="notifications_talk_page_message">%1$s üzenetet hagyott a vitalapodon</string> <string name="notifications_talk_page_message">%1$s üzenetet hagyott a vitalapodon</string>
<string name="notifications_thank_you_edit">Köszönjük a szerkesztésedet!</string> <string name="notifications_thank_you_edit">Köszönjük a szerkesztésedet!</string>
@ -258,5 +259,12 @@
<string name="about_translate_proceed">Folytatás</string> <string name="about_translate_proceed">Folytatás</string>
<string name="about_translate_cancel">Mégse</string> <string name="about_translate_cancel">Mégse</string>
<string name="retry">Újra</string> <string name="retry">Újra</string>
<string name="showcase_view_whole_nearby_activity">Ezek a helyek vannak a közeledben, amikről van Wikipédia szócikk és nincs bennük kép.</string>
<string name="showcase_view_list_icon">A gombra koppintva bejön egy lista, ami ezeket a helyeket mutatja.</string>
<string name="showcase_view_plus_fab">Bármelyik helyhez feltölthetsz képet a galériádból vagy készíthetsz újat a kamerával.</string>
<string name="no_images_found">Nem található kép!</string>
<string name="error_loading_images">Képbetöltés közben hiba történt</string>
<string name="share_app_title">Alkalmazás megosztása</string> <string name="share_app_title">Alkalmazás megosztása</string>
<string name="share_coordinates_not_present">A koordináták nem lettek megadva a kép kiválasztásakor.</string>
<string name="error_fetching_nearby_places">Hiba a közeli helyek elérésekor.</string>
</resources> </resources>

View file

@ -263,4 +263,14 @@
<string name="about_translate_proceed">Halda áfram</string> <string name="about_translate_proceed">Halda áfram</string>
<string name="about_translate_cancel">Hætta við</string> <string name="about_translate_cancel">Hætta við</string>
<string name="retry">Reyna aftur</string> <string name="retry">Reyna aftur</string>
<string name="showcase_view_got_it_button">Náði því!</string>
<string name="showcase_view_whole_nearby_activity">Þetta eru þeir staðir í næsta nágrenni við þig sem vantar myndir til að skýra með Wikipedia-greinar</string>
<string name="showcase_view_list_icon">Ef ýtt er á þennan hnapp birtist listi yfir þessa staði</string>
<string name="showcase_view_plus_fab">Þú getur sent inn mynd úr myndasafninu þínu eða myndavélinni</string>
<string name="no_images_found">Engir myndir fundust!</string>
<string name="error_loading_images">Villa kom upp við að hlaða inn myndum.</string>
<string name="image_uploaded_by">Sent inn af: %1$s</string>
<string name="share_app_title">Deila forriti</string>
<string name="share_coordinates_not_present">Hnit voru ekki tilgreind við val myndar</string>
<string name="error_fetching_nearby_places">Villa við að sækja nálæga staði.</string>
</resources> </resources>

View file

@ -40,7 +40,8 @@
<string name="upload_failed_notification_title">%1$s のアップロードに失敗しました</string> <string name="upload_failed_notification_title">%1$s のアップロードに失敗しました</string>
<string name="upload_failed_notification_subtitle">閲覧するにはタップしてください</string> <string name="upload_failed_notification_subtitle">閲覧するにはタップしてください</string>
<plurals name="uploads_pending_notification_indicator"> <plurals name="uploads_pending_notification_indicator">
<item quantity="other">%1$d 件のファイルをアップロード中</item> <item quantity="one">%1$d file uploading</item>
<item quantity="other">%1$d件のファイルをアップロード中</item>
</plurals> </plurals>
<string name="title_activity_contributions">自分の最近のアップロードファイル</string> <string name="title_activity_contributions">自分の最近のアップロードファイル</string>
<string name="contribution_state_queued">順番待ち中</string> <string name="contribution_state_queued">順番待ち中</string>
@ -59,9 +60,9 @@
<string name="login_failed_network">ログインできません - ネットワークのエラーです</string> <string name="login_failed_network">ログインできません - ネットワークのエラーです</string>
<string name="login_failed_username">ログインできません - 利用者名を確認してください</string> <string name="login_failed_username">ログインできません - 利用者名を確認してください</string>
<string name="login_failed_password">ログインできません - パスワードを確認してください</string> <string name="login_failed_password">ログインできません - パスワードを確認してください</string>
<string name="login_failed_throttled">失敗した回数が多すぎます。数分もう一度お試しください。</string> <string name="login_failed_throttled">失敗した回数が多すぎます。数分待ってからもう一度お試しください。</string>
<string name="login_failed_blocked">申し訳ありませんが、この利用者はコモンズでブロックされています。</string> <string name="login_failed_blocked">申し訳ありませんが、この利用者はコモンズでブロックされています。</string>
<string name="login_failed_2fa_needed">2 要素認証コードを提供する必要があります。</string> <string name="login_failed_2fa_needed">2要素認証コードを提供する必要があります。</string>
<string name="login_failed_generic">ログイン失敗</string> <string name="login_failed_generic">ログイン失敗</string>
<string name="share_upload_button">アップロード</string> <string name="share_upload_button">アップロード</string>
<string name="multiple_share_base_title">このセットに名前をつけてください</string> <string name="multiple_share_base_title">このセットに名前をつけてください</string>
@ -76,22 +77,24 @@
<string name="contributions_subtitle_zero">まだ何もアップロードされていません。</string> <string name="contributions_subtitle_zero">まだ何もアップロードされていません。</string>
<plurals name="contributions_subtitle"> <plurals name="contributions_subtitle">
<item quantity="zero">\@string/contributions_subtitle_zero</item> <item quantity="zero">\@string/contributions_subtitle_zero</item>
<item quantity="other">%1$d 件のアップロード</item> <item quantity="other">pne=%1$d upload</item>
</plurals> </plurals>
<plurals name="starting_multiple_uploads"> <plurals name="starting_multiple_uploads">
<item quantity="other">%1$d 件のアップロードを開始中</item> <item quantity="one">Starting %1$d upload</item>
<item quantity="other">%1$d件のアップロードを開始中</item>
</plurals> </plurals>
<plurals name="multiple_uploads_title"> <plurals name="multiple_uploads_title">
<item quantity="one">%1$d upload</item>
<item quantity="other">%1$d 件のアップロード</item> <item quantity="other">%1$d 件のアップロード</item>
</plurals> </plurals>
<string name="categories_not_found">%1$s に一致するカテゴリが見つかりません</string> <string name="categories_not_found">%1$s に一致するカテゴリが見つかりません</string>
<string name="categories_skip_explanation">あなたの画像をウィキメディア・コモンズで見つけやすくするためにカテゴリを追加してください。\n\nカテゴリ名の入力を開始してください。\nこの手順をスキップするにはこのメッセージをタップしてください(または戻るボタン)。</string> <string name="categories_skip_explanation">あなたの画像をウィキメディア・コモンズで見つけやすくするためにカテゴリを追加してください。\nカテゴリ名の入力を開始してください。</string>
<string name="categories_activity_title">カテゴリ</string> <string name="categories_activity_title">カテゴリ</string>
<string name="title_activity_settings">設定</string> <string name="title_activity_settings">設定</string>
<string name="title_activity_signup">利用者登録</string> <string name="title_activity_signup">利用者登録</string>
<string name="title_activity_featured_images">秀逸な画像</string> <string name="title_activity_featured_images">秀逸な画像</string>
<string name="menu_about">このアプリについて</string> <string name="menu_about">このアプリについて</string>
<string name="about_license">ウィキメディア・コモンズ・アプリはウィキメディア・コミュニティの助成金受給者とボランティアによって製作・メンテナンスされているオープンソースソフトウェアです。ウィキメディア財団はこのアプリの製作・開発・メンテナンスに関与していません。</string> <string name="about_license">ウィキメディア・コモンズ・アプリはウィキメディア・コミュニティの助成金受給者とボランティアが製作・管理しているオープンソースソフトウェアです。ウィキメディア財団はこのアプリの製作・開発・メンテナンスに関与していません。</string>
<string name="about_improve">バグとアイディアは &lt;a href=\"https://github.com/commons-app/apps-android-commons/issues\"&gt;Github&lt;/a&gt; へ。</string> <string name="about_improve">バグとアイディアは &lt;a href=\"https://github.com/commons-app/apps-android-commons/issues\"&gt;Github&lt;/a&gt; へ。</string>
<string name="about_privacy_policy">&lt;u&gt;プライバシー・ポリシー&lt;/u&gt;</string> <string name="about_privacy_policy">&lt;u&gt;プライバシー・ポリシー&lt;/u&gt;</string>
<string name="about_credits">&lt;u&gt;クレジット&lt;/u&gt;</string> <string name="about_credits">&lt;u&gt;クレジット&lt;/u&gt;</string>
@ -103,7 +106,7 @@
<string name="no_uploads_yet">まだ写真をアップロードしていません。</string> <string name="no_uploads_yet">まだ写真をアップロードしていません。</string>
<string name="menu_retry_upload">再試行</string> <string name="menu_retry_upload">再試行</string>
<string name="menu_cancel_upload">キャンセル</string> <string name="menu_cancel_upload">キャンセル</string>
<string name="share_license_summary">この画像が %1$s ライセンスでアップロードされます。</string> <string name="share_license_summary">この画像は%1$sライセンスのもとにアップロードされます。</string>
<string name="media_upload_policy">この画像の投稿に当たり、私はこれが自分自身の作品であり、著作権のあるコンテンツや自撮りは含まれていないと宣言します。</string> <string name="media_upload_policy">この画像の投稿に当たり、私はこれが自分自身の作品であり、著作権のあるコンテンツや自撮りは含まれていないと宣言します。</string>
<string name="menu_download">ダウンロード</string> <string name="menu_download">ダウンロード</string>
<string name="preference_license">既定のライセンス</string> <string name="preference_license">既定のライセンス</string>
@ -148,6 +151,7 @@
<string name="tutorial_4_subtext">- 題名: シドニー・オペラハウス\n- 説明: 湾の向こうから見たシドニー・オペラハウス\n- カテゴリ: 西側から見たシドニー・オペラハウス、遠くから見たシドニー・オペラハウス</string> <string name="tutorial_4_subtext">- 題名: シドニー・オペラハウス\n- 説明: 湾の向こうから見たシドニー・オペラハウス\n- カテゴリ: 西側から見たシドニー・オペラハウス、遠くから見たシドニー・オペラハウス</string>
<string name="tutorial_4_subtext_1">題名: シドニーのオペラハウス</string> <string name="tutorial_4_subtext_1">題名: シドニーのオペラハウス</string>
<string name="tutorial_4_subtext_2">説明: シドニーのオペラハウス。湾を挟んで撮影。</string> <string name="tutorial_4_subtext_2">説明: シドニーのオペラハウス。湾を挟んで撮影。</string>
<string name="tutorial_4_subtext_3">カテゴリ: シドニーオペラハウスの西面、シドニーオペラ遠景</string>
<string name="welcome_wikipedia_text">画像を投稿してください。ウィキペディアの記事に彩りを!</string> <string name="welcome_wikipedia_text">画像を投稿してください。ウィキペディアの記事に彩りを!</string>
<string name="welcome_wikipedia_subtext">ウィキペディアの画像はウィキメディア・コモンズに保管されています。</string> <string name="welcome_wikipedia_subtext">ウィキペディアの画像はウィキメディア・コモンズに保管されています。</string>
<string name="welcome_copyright_text">あなたの画像は世界中の人々が学習する助けになります</string> <string name="welcome_copyright_text">あなたの画像は世界中の人々が学習する助けになります</string>
@ -167,7 +171,7 @@
<string name="title_activity_nearby">近くの場所</string> <string name="title_activity_nearby">近くの場所</string>
<string name="no_nearby">付近の場所が見つかりません</string> <string name="no_nearby">付近の場所が見つかりません</string>
<string name="warning">警告</string> <string name="warning">警告</string>
<string name="file_exists">このファイル既にコモンズにあります。本当にアップロードしますか?</string> <string name="file_exists">このファイル既にコモンズにあります。本当にアップロードしますか?</string>
<string name="yes">はい</string> <string name="yes">はい</string>
<string name="no">いいえ</string> <string name="no">いいえ</string>
<string name="media_detail_title">タイトル</string> <string name="media_detail_title">タイトル</string>
@ -185,7 +189,7 @@
<string name="_2fa_code">2FA コード</string> <string name="_2fa_code">2FA コード</string>
<string name="number_of_uploads">最近のアップロードファイルに表示する最大件数</string> <string name="number_of_uploads">最近のアップロードファイルに表示する最大件数</string>
<string name="maximum_limit">最大限</string> <string name="maximum_limit">最大限</string>
<string name="maximum_limit_alert">500 以上の項目を表示できません</string> <string name="maximum_limit_alert">表示できるのは500件以下です</string>
<string name="set_limit">最近のアップロードファイルに表示する最大件数</string> <string name="set_limit">最近のアップロードファイルに表示する最大件数</string>
<string name="login_failed_2fa_not_supported">2段階認証は現在サポートされていません。</string> <string name="login_failed_2fa_not_supported">2段階認証は現在サポートされていません。</string>
<string name="logout_verification">ログアウトしてもよろしいですか?</string> <string name="logout_verification">ログアウトしてもよろしいですか?</string>
@ -226,7 +230,7 @@
<string name="nearby_info_menu_wikipedia_article">ウィキペディアの記事</string> <string name="nearby_info_menu_wikipedia_article">ウィキペディアの記事</string>
<string name="error_while_cache">画像をキャッシュする際のエラー</string> <string name="error_while_cache">画像をキャッシュする際のエラー</string>
<string name="title_info">ファイル固有の説明的な表題。ファイル名として使われます。平易な言葉を使い、空白を入れることができます。拡張子は含めないでください。</string> <string name="title_info">ファイル固有の説明的な表題。ファイル名として使われます。平易な言葉を使い、空白を入れることができます。拡張子は含めないでください。</string>
<string name="description_info">可能な限りメディアを説明してください:どこで撮られましたか?それは何を示していますか?文脈とは何ですか?物や人を説明してください。容易に推測できない情報、例えば風景の場合の時刻を明らかにする。メディアに珍しいことがある場合は、何が珍しいのかを説明してください。</string> <string name="description_info">可能な限りメディアを説明してください: 撮影地はどこですか? それは何を示していますか? どんな文脈がありますか? 被写体の物や人を説明してください。容易に推測できない情報、例えば風景であれば時刻を明示します。特筆すべき物事が映っている場合は、何が珍しいのかを説明してください。</string>
<string name="upload_image_too_dark">この画像は暗すぎますがアップロードしますか? ウィキメディア・コモンズは百科事典に適した画像のみ受け付けます。</string> <string name="upload_image_too_dark">この画像は暗すぎますがアップロードしますか? ウィキメディア・コモンズは百科事典に適した画像のみ受け付けます。</string>
<string name="upload_image_blurry">ピントが合っていませんが、アップロードしますか? ウィキメディア・コモンズは百科事典に適した画像のみ受け付けます。</string> <string name="upload_image_blurry">ピントが合っていませんが、アップロードしますか? ウィキメディア・コモンズは百科事典に適した画像のみ受け付けます。</string>
<string name="give_permission">権限を付与</string> <string name="give_permission">権限を付与</string>
@ -255,7 +259,7 @@
<string name="nearby_wikipedia">ウィキペディア</string> <string name="nearby_wikipedia">ウィキペディア</string>
<string name="nearby_commons">コモンズ</string> <string name="nearby_commons">コモンズ</string>
<string name="about_rate_us">&lt;u&gt;評価する&lt;/u&gt;</string> <string name="about_rate_us">&lt;u&gt;評価する&lt;/u&gt;</string>
<string name="about_faq">&lt;u&gt;FAQ&lt;/u&gt;</string> <string name="about_faq">&lt;u&gt;よくある質問&lt;/u&gt;</string>
<string name="welcome_skip_button">チュートリアルをスキップする</string> <string name="welcome_skip_button">チュートリアルをスキップする</string>
<string name="no_internet">インターネットに接続していません</string> <string name="no_internet">インターネットに接続していません</string>
<string name="internet_established">インターネットに接続しました</string> <string name="internet_established">インターネットに接続しました</string>
@ -276,4 +280,5 @@
<string name="image_uploaded_by">アップロードした人: %1$</string> <string name="image_uploaded_by">アップロードした人: %1$</string>
<string name="share_app_title">アプリをシェアする</string> <string name="share_app_title">アプリをシェアする</string>
<string name="share_coordinates_not_present">画像の選択中に位置情報を特定できませんでした</string> <string name="share_coordinates_not_present">画像の選択中に位置情報を特定できませんでした</string>
<string name="error_fetching_nearby_places">付近の場所を取得しようとしてエラーが発生しました。</string>
</resources> </resources>

View file

@ -0,0 +1,96 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Authors:
* ArslanX
-->
<resources>
<string name="preference_category_appearance">Гёрюнюш</string>
<string name="preference_category_general">Ортакъ</string>
<string name="bullet"></string>
<string name="menu_settings">Кюйлевлер</string>
<string name="username">Къоллавчу аты</string>
<string name="password">Чечил</string>
<string name="login">Гирмек</string>
<string name="forgot_password">Чечилни унутдунгму?</string>
<string name="signup">Къайытланмакъ</string>
<string name="upload_completed_notification_title">%1$s юкленген!</string>
<string name="upload_progress_notification_title_in_progress">%1$s юкленип тура</string>
<string name="upload_failed_notification_subtitle">Къарамакъ учун бас</string>
<string name="contribution_state_queued">Гезикде</string>
<string name="contribution_state_starting">Юклев</string>
<string name="menu_from_camera">Сурат алмакъ</string>
<string name="menu_nearby">Ювукъда</string>
<string name="provider_contributions">Юклевлерим</string>
<string name="menu_share">Пайлашмакъ</string>
<string name="share_title_hint">Ат</string>
<string name="share_description_hint">Тасвир</string>
<string name="share_upload_button">Юклев</string>
<string name="menu_upload_single">Юклев</string>
<string name="menu_save_categories">Сакъламакъ</string>
<string name="refresh_button">Янгыртмакъ</string>
<string name="display_list_button">Тизме</string>
<string name="enable_gps">GPS ишлетмек</string>
<string name="contributions_subtitle_zero">Юклевлер ёкъ гьали де</string>
<string name="categories_activity_title">Категориялар</string>
<string name="title_activity_settings">Кюйлевлер</string>
<string name="title_activity_signup">Къайытланмакъ</string>
<string name="menu_about">Тасвири</string>
<string name="about_credits">&lt;u&gt;Баракаллалар&lt;/u&gt;</string>
<string name="title_activity_about">Тасвири</string>
<string name="menu_retry_upload">Такрарламакъ</string>
<string name="menu_cancel_upload">Гери алмакъ</string>
<string name="menu_download">Юклемек</string>
<string name="license_name_cc0">CC0</string>
<string name="license_name_cc_by_sa_3_0">CC BY-SA 3.0</string>
<string name="license_name_cc_by_sa_3_0_de">CC BY-SA 3.0 (Алмания)</string>
<string name="license_name_cc_by_sa_3_0_ee">CC BY-SA 3.0 (Эстония)</string>
<string name="license_name_cc_by_3_0">CC BY 3.0</string>
<string name="license_name_cc_by_sa_4_0">CC BY-SA 4.0</string>
<string name="license_name_cc_by_4_0">CC BY 4.0</string>
<string name="license_name_cc_zero">CC Zero</string>
<string name="tutorial_4_text">Юклев уьлгю:</string>
<string name="welcome_final_button_text">Дюр!</string>
<string name="detail_panel_cats_label">Категориялар</string>
<string name="detail_panel_cats_loading">Юклев...</string>
<string name="detail_panel_cats_none">Бир зат сайланмагъан</string>
<string name="detail_description_empty">Тасвири ёкъ</string>
<string name="menu_refresh">Янгыртмакъ</string>
<string name="ok">OK</string>
<string name="warning">Буварыв</string>
<string name="yes">Дюр</string>
<string name="no">Ёкъ</string>
<string name="media_detail_title">Ат</string>
<string name="media_detail_description">Тасвир</string>
<string name="media_detail_author">Ясавчу</string>
<string name="media_detail_uploaded_date">Юклев тархы</string>
<string name="_2fa_code">2FA код</string>
<string name="welcome_image_tulip">Лале</string>
<string name="welcome_image_no_selfies">Оьзсуратсыз</string>
<string name="welcome_image_welcome_wikipedia">Хош гел Википедиягъа</string>
<string name="cancel">Гери алмакъ</string>
<string name="navigation_drawer_open">Ачмакъ</string>
<string name="navigation_drawer_close">Япмакъ</string>
<string name="navigation_item_home">Баш</string>
<string name="navigation_item_upload">Юклемек</string>
<string name="navigation_item_nearby">Ювукъда</string>
<string name="navigation_item_about">Тасвир</string>
<string name="navigation_item_settings">Кюйлевлер</string>
<string name="navigation_item_logout">Чыкъмакъ</string>
<string name="navigation_item_notification">Билдиривлер</string>
<string name="navigation_item_featured_images">Сайламлы</string>
<string name="no_description_found">тасвири табылмады</string>
<string name="nearby_info_menu_wikipedia_article">Википедия макъала</string>
<string name="null_url">Янгылыш! Байланыв табылмады</string>
<string name="nearby_directions">ЯКЪЛАР</string>
<string name="nearby_wikipedia">ВИКИПЕДИЯ</string>
<string name="about_rate_us">&lt;u&gt;Къыйматла бизин&lt;/u&gt;</string>
<string name="no_internet">Интернет гиришсиз</string>
<string name="internet_established">Интернет гиришли</string>
<string name="no_notifications">Билдиривлер ёкъ</string>
<string name="about_translate">&lt;u&gt;Таржума этмек&lt;/u&gt;</string>
<string name="about_translate_title">Тиллер</string>
<string name="about_translate_cancel">Гери алыв</string>
<string name="retry">Такрарламакъ</string>
<string name="showcase_view_got_it_button">Тюшюндюм!</string>
<string name="no_images_found">Гьеч сурат табылмады!</string>
<string name="share_app_title">Уьстевню пайлашмакъ</string>
</resources>

View file

@ -55,7 +55,7 @@
<string name="categories_activity_title">श्रेणीहरू</string> <string name="categories_activity_title">श्रेणीहरू</string>
<string name="title_activity_settings">सेटिङ्गहरू</string> <string name="title_activity_settings">सेटिङ्गहरू</string>
<string name="menu_about">बारेमा</string> <string name="menu_about">बारेमा</string>
<string name="about_license" fuzzy="true">&lt;a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\"&gt;अपाचे लाइसेन्स संस्करण२&lt;/a&gt; को अाधारमा खुला स्रोत सफ्टवेयर जारी</string> <string name="about_license">विकिमिडिया कमन्स याप एक स्वतन्त्र स्रोत याप हो। यो याप विकिमिडिया समुदायका अनुदानप्राप्तकर्ताहरू र स्वयंसेवकहरू द्वारा निर्मित एवं प्रबन्धित छ। विकिमीडिया फाउण्डेसन यस यापको निर्माण, विकास र प्रबन्धनमा कुनै पनि प्रकारले संलग्न छैन।</string>
<string name="about_improve" fuzzy="true">&lt;a href=\"https://github.com/commons-app/apps-android-commons\"&gt;गिटहब&lt;/a&gt; मा स्रोत। &lt;a href=\" https://github.com/commons-app/apps-android-commons/issues\"&gt;बगजिल्ला&lt;/a&gt; मा बग छ।</string> <string name="about_improve" fuzzy="true">&lt;a href=\"https://github.com/commons-app/apps-android-commons\"&gt;गिटहब&lt;/a&gt; मा स्रोत। &lt;a href=\" https://github.com/commons-app/apps-android-commons/issues\"&gt;बगजिल्ला&lt;/a&gt; मा बग छ।</string>
<string name="about_privacy_policy" fuzzy="true">&lt;a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\"&gt;गोपनीयता नीति&lt;/a&gt;</string> <string name="about_privacy_policy" fuzzy="true">&lt;a href=\"https://wikimediafoundation.org/wiki/Privacy_policy\"&gt;गोपनीयता नीति&lt;/a&gt;</string>
<string name="title_activity_about">बारेमा</string> <string name="title_activity_about">बारेमा</string>

View file

@ -46,11 +46,7 @@
<string name="upload_progress_notification_title_finishing">Завершение загрузки %1$s</string> <string name="upload_progress_notification_title_finishing">Завершение загрузки %1$s</string>
<string name="upload_failed_notification_title">Загрузка %1$s не удалась</string> <string name="upload_failed_notification_title">Загрузка %1$s не удалась</string>
<string name="upload_failed_notification_subtitle">Нажмите для просмотра</string> <string name="upload_failed_notification_subtitle">Нажмите для просмотра</string>
<plurals name="uploads_pending_notification_indicator"> <string name="uploads_pending_notification_indicator">%1$d {{PLURAL:%1$d|one=файл загружается|few=файла загружается|файлов загружается}}</string>
<item quantity="one">%1$d файл загружается</item>
<item quantity="few">%1$d файла загружается</item>
<item quantity="other">%1$d файлов загружается</item>
</plurals>
<string name="title_activity_contributions">Мои недавние загрузки</string> <string name="title_activity_contributions">Мои недавние загрузки</string>
<string name="contribution_state_queued">В очереди</string> <string name="contribution_state_queued">В очереди</string>
<string name="contribution_state_failed">Ошибка загрузки.</string> <string name="contribution_state_failed">Ошибка загрузки.</string>
@ -115,7 +111,7 @@
<string name="no_email_client">Почтовый клиент не установлен</string> <string name="no_email_client">Почтовый клиент не установлен</string>
<string name="provider_categories">Недавно использованные категории</string> <string name="provider_categories">Недавно использованные категории</string>
<string name="waiting_first_sync">Ожидание первой синхронизации…</string> <string name="waiting_first_sync">Ожидание первой синхронизации…</string>
<string name="no_uploads_yet">Вы ещё не загрузили ни одной фотографии.</string> <string name="no_uploads_yet">Вы ещё не загрузили ни одного изображения.</string>
<string name="menu_retry_upload">Повторить</string> <string name="menu_retry_upload">Повторить</string>
<string name="menu_cancel_upload">Отмена</string> <string name="menu_cancel_upload">Отмена</string>
<string name="share_license_summary">Это изображение будет лицензировано под %1$s</string> <string name="share_license_summary">Это изображение будет лицензировано под %1$s</string>
@ -123,7 +119,7 @@
<string name="menu_download">Скачать</string> <string name="menu_download">Скачать</string>
<string name="preference_license">Лицензия по умолчанию</string> <string name="preference_license">Лицензия по умолчанию</string>
<string name="use_previous">Использовать предыдущие название/описание</string> <string name="use_previous">Использовать предыдущие название/описание</string>
<string name="allow_gps">Автоматически получить текущее местоположение</string> <string name="allow_gps">Анализ местоположения</string>
<string name="allow_gps_summary">Получить текущее местоположение, чтобы были предложены категории, если изображение не содержит геотегов</string> <string name="allow_gps_summary">Получить текущее местоположение, чтобы были предложены категории, если изображение не содержит геотегов</string>
<string name="preference_theme">Ночной режим</string> <string name="preference_theme">Ночной режим</string>
<string name="preference_theme_summary">Использовать тёмную тему</string> <string name="preference_theme_summary">Использовать тёмную тему</string>
@ -148,7 +144,7 @@
<string name="license_name_cc_by_4_0">CC BY 4.0</string> <string name="license_name_cc_by_4_0">CC BY 4.0</string>
<string name="license_name_cc_zero">CC Zero</string> <string name="license_name_cc_zero">CC Zero</string>
<string name="tutorial_1_text">Викисклад содержит бо́льшую часть изображений, которые используются в Википедии.</string> <string name="tutorial_1_text">Викисклад содержит бо́льшую часть изображений, которые используются в Википедии.</string>
<string name="tutorial_1_subtext">Ваши изображения помогают образованию людей во всём мире!</string> <string name="tutorial_1_subtext">Ваши изображения могут помочь образованию людей во всём мире!</string>
<string name="tutorial_2_text">Пожалуйста, загрузите фотографии, которые были сняты или созданы исключительно вами:</string> <string name="tutorial_2_text">Пожалуйста, загрузите фотографии, которые были сняты или созданы исключительно вами:</string>
<string name="tutorial_2_subtext">Природные объекты (например, цветы, животные, горы)\n• Полезные предметы (например, велосипеды, вокзалы)\n• Известные люди (например, ваш мэр, спортсмены-олимпийцы, которых вы встретили)</string> <string name="tutorial_2_subtext">Природные объекты (например, цветы, животные, горы)\n• Полезные предметы (например, велосипеды, вокзалы)\n• Известные люди (например, ваш мэр, спортсмены-олимпийцы, которых вы встретили)</string>
<string name="tutorial_2_subtext_1">Природные объекты (например, цветы, животные, горы)</string> <string name="tutorial_2_subtext_1">Природные объекты (например, цветы, животные, горы)</string>
@ -166,7 +162,7 @@
<string name="tutorial_4_subtext_3">Категории: Sydney Opera House from the west, Sydney Opera House remote views</string> <string name="tutorial_4_subtext_3">Категории: Sydney Opera House from the west, Sydney Opera House remote views</string>
<string name="welcome_wikipedia_text">Загрузите свои изображения. Помогите Википедии оживить статьи!</string> <string name="welcome_wikipedia_text">Загрузите свои изображения. Помогите Википедии оживить статьи!</string>
<string name="welcome_wikipedia_subtext">Изображения в Википедии хранятся на Викискладе.</string> <string name="welcome_wikipedia_subtext">Изображения в Википедии хранятся на Викискладе.</string>
<string name="welcome_copyright_text">Ваши изображения помогают образованию людей во всём мире.</string> <string name="welcome_copyright_text">Ваши изображения могут помочь образованию людей во всём мире.</string>
<string name="welcome_copyright_subtext">Избегайте материалов, защищённых авторским правом, например, найденных в Интернете, изображений плакатов, книжных обложек и т.п.</string> <string name="welcome_copyright_subtext">Избегайте материалов, защищённых авторским правом, например, найденных в Интернете, изображений плакатов, книжных обложек и т.п.</string>
<string name="welcome_final_text">Вам это понятно?</string> <string name="welcome_final_text">Вам это понятно?</string>
<string name="welcome_final_button_text">Да!</string> <string name="welcome_final_button_text">Да!</string>
@ -211,7 +207,7 @@
<string name="commons_facebook">Facebook-страница Commons</string> <string name="commons_facebook">Facebook-страница Commons</string>
<string name="commons_github">Исходные коды Commons на гитхабе</string> <string name="commons_github">Исходные коды Commons на гитхабе</string>
<string name="background_image">Фоновое изображение</string> <string name="background_image">Фоновое изображение</string>
<string name="mediaimage_failed">Ошибка медиаизображения</string> <string name="mediaimage_failed">Ошибка медиафайла</string>
<string name="no_image_found">Изображение не найдено</string> <string name="no_image_found">Изображение не найдено</string>
<string name="upload_image">Загрузить изображение</string> <string name="upload_image">Загрузить изображение</string>
<string name="welcome_image_mount_zao">Гора Зао</string> <string name="welcome_image_mount_zao">Гора Зао</string>
@ -246,7 +242,7 @@
<string name="description_info">Пожалуйста, подробно опишите загружаемый файл: где он был снят? что на нём изображено? каков его контекст? Пожалуйста опишите изображённых персон или объекты. Добавьте информацию, о которой нельзя легко догадаться, например, время суток, когда снимался файл. Если снято что-то необычное, постарайтесь пояснить, что именно в этом необычного.</string> <string name="description_info">Пожалуйста, подробно опишите загружаемый файл: где он был снят? что на нём изображено? каков его контекст? Пожалуйста опишите изображённых персон или объекты. Добавьте информацию, о которой нельзя легко догадаться, например, время суток, когда снимался файл. Если снято что-то необычное, постарайтесь пояснить, что именно в этом необычного.</string>
<string name="upload_image_too_dark">Это изображение слишком тёмное. Вы уверены, что хотите его загрузить? Викисклад подходит только для фотографий, имеющих энциклопедическую ценность.</string> <string name="upload_image_too_dark">Это изображение слишком тёмное. Вы уверены, что хотите его загрузить? Викисклад подходит только для фотографий, имеющих энциклопедическую ценность.</string>
<string name="upload_image_blurry">Это изображение размыто. Вы уверены, что хотите его загрузить? Викисклад подходит только для фотографий, имеющих энциклопедическую ценность.</string> <string name="upload_image_blurry">Это изображение размыто. Вы уверены, что хотите его загрузить? Викисклад подходит только для фотографий, имеющих энциклопедическую ценность.</string>
<string name="give_permission">Дать разрешение</string> <string name="give_permission">Разрешить</string>
<string name="use_external_storage">Использовать внешнее хранилище</string> <string name="use_external_storage">Использовать внешнее хранилище</string>
<string name="use_external_storage_summary">Сохранять изображения, сделанные с помощью встроенной камеры на устройстве</string> <string name="use_external_storage_summary">Сохранять изображения, сделанные с помощью встроенной камеры на устройстве</string>
<string name="login_to_your_account">Войдите в свою учётную запись</string> <string name="login_to_your_account">Войдите в свою учётную запись</string>
@ -294,4 +290,5 @@
<string name="image_uploaded_by">Загружено участником %1$s</string> <string name="image_uploaded_by">Загружено участником %1$s</string>
<string name="share_app_title">Поделиться приложением</string> <string name="share_app_title">Поделиться приложением</string>
<string name="share_coordinates_not_present">Во время выбора изображения не были указаны координаты</string> <string name="share_coordinates_not_present">Во время выбора изображения не были указаны координаты</string>
<string name="error_fetching_nearby_places">Ошибка получения мест поблизости</string>
</resources> </resources>

View file

@ -280,4 +280,5 @@
<string name="image_uploaded_by">Uppladdad av: %1$s</string> <string name="image_uploaded_by">Uppladdad av: %1$s</string>
<string name="share_app_title">Dela app</string> <string name="share_app_title">Dela app</string>
<string name="share_coordinates_not_present">Koordinater specificerades inte vid bildvalet</string> <string name="share_coordinates_not_present">Koordinater specificerades inte vid bildvalet</string>
<string name="error_fetching_nearby_places">Fel uppstod när platser i närheten hämtades.</string>
</resources> </resources>

View file

@ -280,4 +280,5 @@
<string name="image_uploaded_by">Yükleyen: %1$s</string> <string name="image_uploaded_by">Yükleyen: %1$s</string>
<string name="share_app_title">Uygulamayı Paylaş</string> <string name="share_app_title">Uygulamayı Paylaş</string>
<string name="share_coordinates_not_present">Koordinatlar görüntü seçimi sırasında belirlenmedi</string> <string name="share_coordinates_not_present">Koordinatlar görüntü seçimi sırasında belirlenmedi</string>
<string name="error_fetching_nearby_places">Yakındaki yerler alınırken hata oluştu.</string>
</resources> </resources>

View file

@ -150,7 +150,7 @@
<string name="tutorial_2_subtext_2">Корисні об\'єкти (велосипеди, залізничні станції)</string> <string name="tutorial_2_subtext_2">Корисні об\'єкти (велосипеди, залізничні станції)</string>
<string name="tutorial_2_subtext_3">Відомі люди (ваш мер, спортсмен-олімпієць, якого ви зустріли)</string> <string name="tutorial_2_subtext_3">Відомі люди (ваш мер, спортсмен-олімпієць, якого ви зустріли)</string>
<string name="tutorial_3_text">Будь ласка, НЕ завантажуйте:</string> <string name="tutorial_3_text">Будь ласка, НЕ завантажуйте:</string>
<string name="tutorial_3_subtext">u2022 Селфі або фото своїх друзів \nu2022 Зображення, які Ви завантажили з інтернету \nu2022 Скріншоти патентованих програм</string> <string name="tutorial_3_subtext">- Селфі або фото своїх друзів \n- Зображення, які Ви завантажили з інтернету \n- Скріншоти патентованих програм</string>
<string name="tutorial_3_subtext_1">Селфі чи фото ваших друзів</string> <string name="tutorial_3_subtext_1">Селфі чи фото ваших друзів</string>
<string name="tutorial_3_subtext_2">Зображення, які ви завантажили з інтернету</string> <string name="tutorial_3_subtext_2">Зображення, які ви завантажили з інтернету</string>
<string name="tutorial_3_subtext_3">Знімки екрану пропрієтарних програм</string> <string name="tutorial_3_subtext_3">Знімки екрану пропрієтарних програм</string>
@ -165,6 +165,7 @@
<string name="welcome_copyright_subtext">Уникайте захищених авторським правом матеріалів, знайдених в Інтернеті, а також зображень плакатів, обкладинок книг і т. п.</string> <string name="welcome_copyright_subtext">Уникайте захищених авторським правом матеріалів, знайдених в Інтернеті, а також зображень плакатів, обкладинок книг і т. п.</string>
<string name="welcome_final_text">Ви це зрозуміли?</string> <string name="welcome_final_text">Ви це зрозуміли?</string>
<string name="welcome_final_button_text">Так!</string> <string name="welcome_final_button_text">Так!</string>
<string name="welcome_help_button_text"/>
<string name="detail_panel_cats_label">Категорії</string> <string name="detail_panel_cats_label">Категорії</string>
<string name="detail_panel_cats_loading">Завантаження…</string> <string name="detail_panel_cats_loading">Завантаження…</string>
<string name="detail_panel_cats_none">Нічого не обрано</string> <string name="detail_panel_cats_none">Нічого не обрано</string>
@ -186,7 +187,7 @@
<string name="media_detail_description">Опис</string> <string name="media_detail_description">Опис</string>
<string name="media_detail_description_explanation">Сюди потрапляє опис медіафайлу. Він потенційно може бути досить довгим і розтягнутися на декілька рядків. Однак ми сподіваємось, що він виглядатиме гарно.</string> <string name="media_detail_description_explanation">Сюди потрапляє опис медіафайлу. Він потенційно може бути досить довгим і розтягнутися на декілька рядків. Однак ми сподіваємось, що він виглядатиме гарно.</string>
<string name="media_detail_author">Автор</string> <string name="media_detail_author">Автор</string>
<string name="media_detail_author_explanation">Тут вказується ім\'я автора вибраного зображеня</string> <string name="media_detail_author_explanation">Тут вказується ім\'я автора вибраного зображення</string>
<string name="media_detail_uploaded_date">Дата завантаження</string> <string name="media_detail_uploaded_date">Дата завантаження</string>
<string name="media_detail_license">Ліцензія</string> <string name="media_detail_license">Ліцензія</string>
<string name="media_detail_coordinates">Координати</string> <string name="media_detail_coordinates">Координати</string>
@ -202,7 +203,7 @@
<string name="logout_verification">Ви справді хочете вийти із системи?</string> <string name="logout_verification">Ви справді хочете вийти із системи?</string>
<string name="commons_logo">Логотип Вікісховища</string> <string name="commons_logo">Логотип Вікісховища</string>
<string name="commons_website">Веб-сайт Commons</string> <string name="commons_website">Веб-сайт Commons</string>
<string name="commons_facebook">Фейсбук сторінка Commons</string> <string name="commons_facebook">Facebook-сторінка Commons</string>
<string name="commons_github">Програмний код Commons на GitHub</string> <string name="commons_github">Програмний код Commons на GitHub</string>
<string name="background_image">Фонове зображення</string> <string name="background_image">Фонове зображення</string>
<string name="mediaimage_failed">Помилка медіазображення</string> <string name="mediaimage_failed">Помилка медіазображення</string>
@ -237,15 +238,15 @@
<string name="nearby_info_menu_wikipedia_article">Стаття Вікіпедії</string> <string name="nearby_info_menu_wikipedia_article">Стаття Вікіпедії</string>
<string name="error_while_cache">Помилка кешування зображень</string> <string name="error_while_cache">Помилка кешування зображень</string>
<string name="title_info">Унікальна описова назва файлу. Ви можете використовувати простий текст з пробілами. Не вказуйте розширення файлу</string> <string name="title_info">Унікальна описова назва файлу. Ви можете використовувати простий текст з пробілами. Не вказуйте розширення файлу</string>
<string name="description_info">Будь ласка, докладно опишіть файл: де його було зроблено? що на ньому зображено? який контекст? Будь ласка, опишіть об\'єкти чи осіб. Додайте інформацію, яку не можна легко здогадатися, наприклад, пору доби для фотографії пейзажу. Якщо зображено щось незвичайне, постарайтеся пояснити, що робить його незвичайним.</string> <string name="description_info">Будь ласка, докладно опишіть файл: де його було зроблено? що на ньому зображено? який контекст? Будь ласка, опишіть об\'єкти чи осіб. Додайте інформацію, яку не можна легко здогадатися, наприклад, пору доби для фотографії пейзажу. Якщо зображено щось незвичайне, спробуйте пояснити, що робить його незвичайним.</string>
<string name="upload_image_too_dark">Це зображення надто темне. Ви упевнені, що хочете його завантажити? Вікісховище призначене лише для зображень, що мають енциклопедичну цінність.</string> <string name="upload_image_too_dark">Це зображення надто темне. Ви упевнені, що хочете його завантажити? Вікісховище призначене лише для зображень, що мають енциклопедичну цінність.</string>
<string name="upload_image_blurry">Це зображення розмите. Ви упевнені, що хочете його завантажити? Вікісховище призначене лише для зображень, що мають енциклопедичну цінність.</string> <string name="upload_image_blurry">Це зображення розмите. Ви упевнені, що хочете його завантажити? Вікісховище призначене лише для зображень, що мають енциклопедичну цінність.</string>
<string name="give_permission">Надати дозвіл</string> <string name="give_permission">Надати дозвіл</string>
<string name="use_external_storage">Використовувати зовнішнє сховище</string> <string name="use_external_storage">Використовувати зовнішнє сховище</string>
<string name="use_external_storage_summary">Зберігати зображення, виконані вбудованою камерою Вашого пристрою</string> <string name="use_external_storage_summary">Зберігати зображення, виконані вбудованою камерою Вашого пристрою</string>
<string name="login_to_your_account">Увійдіть у свій обліковий запис</string> <string name="login_to_your_account">Увійдіть у свій обліковий запис</string>
<string name="send_log_file">Надіслати лог-файл</string> <string name="send_log_file">Надіслати файл журналу</string>
<string name="send_log_file_description">Надіслати лог-файл розробникам електронною поштою</string> <string name="send_log_file_description">Надіслати файл журналу розробникам електронною поштою</string>
<string name="no_web_browser">Не знайдено браузера, щоб відкрити посилання</string> <string name="no_web_browser">Не знайдено браузера, щоб відкрити посилання</string>
<string name="null_url">Помилка! Посилання не знайдено</string> <string name="null_url">Помилка! Посилання не знайдено</string>
<string name="nominate_deletion">Номінувати на вилучення</string> <string name="nominate_deletion">Номінувати на вилучення</string>
@ -257,9 +258,9 @@
<string name="location_permission_rationale_nearby">Потрібний дозвіл для показу списку місць поблизу</string> <string name="location_permission_rationale_nearby">Потрібний дозвіл для показу списку місць поблизу</string>
<string name="get_directions">Показати на мапі у зовнішній програмі</string> <string name="get_directions">Показати на мапі у зовнішній програмі</string>
<string name="read_article">ЧИТАТИ СТАТТЮ</string> <string name="read_article">ЧИТАТИ СТАТТЮ</string>
<string name="notifications_welcome">Вітаємо у Wikimedia Commons, %1$s! Раді вас бачити.</string> <string name="notifications_welcome">Вітаємо у Вікісховищі, %1$s! Раді вас бачити.</string>
<string name="notifications_talk_page_message">%1$s залишив повідомлення на вашій сторінці обговорення</string> <string name="notifications_talk_page_message">%1$s залишив повідомлення на вашій сторінці обговорення</string>
<string name="notifications_thank_you_edit">Дякуємо за правку</string> <string name="notifications_thank_you_edit">Дякуємо за редагування</string>
<string name="notifications_mention">%1$s згадав вас на %2$s.</string> <string name="notifications_mention">%1$s згадав вас на %2$s.</string>
<string name="toggle_view_button">Перемкнути режим перегляду</string> <string name="toggle_view_button">Перемкнути режим перегляду</string>
<string name="nearby_directions">НАПРЯМКИ</string> <string name="nearby_directions">НАПРЯМКИ</string>
@ -279,4 +280,14 @@
<string name="about_translate_proceed">Виконується</string> <string name="about_translate_proceed">Виконується</string>
<string name="about_translate_cancel">Скасувати</string> <string name="about_translate_cancel">Скасувати</string>
<string name="retry">Повторити</string> <string name="retry">Повторити</string>
<string name="showcase_view_got_it_button">Зрозуміло</string>
<string name="showcase_view_whole_nearby_activity">Це місця поблизу, про які є статті Вікіпедії, але які потребують ілюстрацій</string>
<string name="showcase_view_list_icon">Натискання цієї кнопки згенерує список таких місць</string>
<string name="showcase_view_plus_fab">Ви можете завантажити зображення для любого з цих місць, зробивши знімок камерою або вибравши зображення з галереї</string>
<string name="no_images_found">Зображень не знайдено!</string>
<string name="error_loading_images">Сталася помилка при завантаженні зображень.</string>
<string name="image_uploaded_by">Завантажено: %1$s</string>
<string name="share_app_title">Поділитися програмою</string>
<string name="share_coordinates_not_present">Під час вибору зображення не були вказані координати</string>
<string name="error_fetching_nearby_places">Помилка отримання місць поблизу.</string>
</resources> </resources>

View file

@ -46,8 +46,7 @@
<string name="add_title_toast">Please provide a title for this file</string> <string name="add_title_toast">Please provide a title for this file</string>
<string name="share_description_hint">Description</string> <string name="share_description_hint">Description</string>
<string name="login_failed_network">Unable to login - network failure</string> <string name="login_failed_network">Unable to login - network failure</string>
<string name="login_failed_username">Unable to login - please check your username</string> <string name="login_failed_wrong_credentials">Unable to login - please check your username and password</string>
<string name="login_failed_password">Unable to login - please check your password</string>
<string name="login_failed_throttled">Too many unsuccessful attempts. Please try again in a few minutes.</string> <string name="login_failed_throttled">Too many unsuccessful attempts. Please try again in a few minutes.</string>
<string name="login_failed_blocked">Sorry, this user has been blocked on Commons</string> <string name="login_failed_blocked">Sorry, this user has been blocked on Commons</string>
<string name="login_failed_2fa_needed">You must provide your two factor authentication code.</string> <string name="login_failed_2fa_needed">You must provide your two factor authentication code.</string>

View file

@ -39,6 +39,11 @@ SELECT
# Get emoji # Get emoji
OPTIONAL { ?classId wdt:P487 ?emoji0. } OPTIONAL { ?classId wdt:P487 ?emoji0. }
OPTIONAL { ?classId wdt:P279*/wdt:P487 ?emoji1. } OPTIONAL { ?classId wdt:P279*/wdt:P487 ?emoji1. }
OPTIONAL {
?wikipediaArticle schema:about ?item ;
schema:isPartOf <https://${LANG}.wikipedia.org/> .
}
OPTIONAL { OPTIONAL {
?wikipediaArticle schema:about ?item ; ?wikipediaArticle schema:about ?item ;
schema:isPartOf <https://en.wikipedia.org/> . schema:isPartOf <https://en.wikipedia.org/> .

View file

@ -14,17 +14,17 @@
# org.gradle.parallel=true # org.gradle.parallel=true
#Thu Mar 01 15:28:48 IST 2018 #Thu Mar 01 15:28:48 IST 2018
systemProp.http.proxyPort=0 systemProp.http.proxyPort=0
compileSdkVersion=android-26 compileSdkVersion=android-27
android.useDeprecatedNdk=true android.useDeprecatedNdk=true
BUTTERKNIFE_VERSION=8.6.0 BUTTERKNIFE_VERSION=8.6.0
org.gradle.jvmargs=-Xmx1536M org.gradle.jvmargs=-Xmx1536M
buildToolsVersion=26.0.2 buildToolsVersion=27.0.0
targetSdkVersion=25 targetSdkVersion=27
#TODO: Temporary disabled. https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#aapt2 #TODO: Temporary disabled. https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#aapt2
#Refer to PR: https://github.com/commons-app/apps-android-commons/pull/932 #Refer to PR: https://github.com/commons-app/apps-android-commons/pull/932
android.enableAapt2=false android.enableAapt2=false
SUPPORT_LIB_VERSION=26.0.2 SUPPORT_LIB_VERSION=27.1.1
minSdkVersion=15 minSdkVersion=15
systemProp.http.proxyHost= systemProp.http.proxyHost=
LEAK_CANARY=1.5.4 LEAK_CANARY=1.5.4