Compare commits

...

20 commits

Author SHA1 Message Date
Rohit Verma
3842ba952f refactor: avoid checking fragment is currentSelectedPosition is out of bounds 2025-04-02 17:07:46 +05:30
Rohit Verma
9002978292 fix: hide the thumbnail card on fragments other than MediaDetailFragment 2025-04-02 16:31:02 +05:30
Rohit Verma
e15d8b156d fix: remove if-condition to prevent hiding top card and refactor code 2025-04-02 15:16:57 +05:30
Rohit Verma
566a3c6ee3 refactor: resolve compilation issue by using correct property name 2025-04-02 15:16:57 +05:30
Rohit Verma
b5bee2628f replace notifyItemDeleted with notifyDatasetChanged 2025-04-02 15:16:17 +05:30
Rohit Verma
a6c9334e3e test: remove unit test as no longer needed 2025-04-02 15:16:17 +05:30
Rohit Verma
c07a6acd0b refactor: replace deprecated onBackPressed with onBackPressedCallback 2025-04-02 15:16:17 +05:30
Rohit Verma
d0b6ce5c52 refactor: resolve compiler warnings 2025-04-02 15:15:41 +05:30
Rohit Verma
6f75927432 fix IndexOutOfBounds error when removing thumbnails 2025-04-02 15:13:31 +05:30
translatewiki.net
fdfd7781e9
Localisation updates from https://translatewiki.net.
Some checks failed
Android CI / Run tests and generate APK (push) Has been cancelled
2025-03-31 14:01:52 +02:00
Jason-Whitmore
6e090c8d7a
ExploreMapFragment.java: fix marker labels in Explore map fragment to display the username (#6260)
Before this change, the labels that would appear on the marker when tapped did not include
the author or username. Instead, it displayed "Unknown".

After this change, the labels now display the author name. If the author name is not
available, the username will be displayed. If both are unavailable, the default value
of "Unknown" will be displayed. To improve the readability of the text, any HTML text
is removed from the username/author.
2025-03-31 17:49:06 +09:00
Ritika Pahwa
44966645ca
Add v5.2.0 to CHANGELOG.md 2025-03-29 13:21:03 +05:30
translatewiki.net
669f3043ae
Localisation updates from https://translatewiki.net. 2025-03-27 13:01:54 +01:00
translatewiki.net
5a5e660a43
Localisation updates from https://translatewiki.net. 2025-03-24 13:01:43 +01:00
Ritika Pahwa
2e05a58e8b
Bump up version code to 1049 2025-03-22 14:07:51 +05:30
translatewiki.net
f1f4e8baff
Localisation updates from https://translatewiki.net. 2025-03-20 13:01:41 +01:00
Sonal Yadav
828f69fc46
Update Privacy Policy Link to GitHub.io (#6255)
* "moved privacy policy"

* Update PRIVACY_POLICY_URL to https://commons-app.github.io/privacy-policy as suggested

* Use BuildConfig.PRIVACY_POLICY_URL in launchPrivacyPolicy function
2025-03-20 07:21:33 +09:00
Ritika Pahwa
954a7aee91
Bump up version code and name (#6250)
* Bump up version code and name

* Remove unintended change
2025-03-18 23:28:19 +09:00
translatewiki.net
fa0bdf5747
Localisation updates from https://translatewiki.net. 2025-03-17 13:01:37 +01:00
Sonal Yadav
67ac92ff57
Fix NullPointerException in onBackPressed() (#6249) 2025-03-17 07:53:58 +09:00
19 changed files with 320 additions and 140 deletions

View file

@ -1,5 +1,36 @@
# Wikimedia Commons for Android # Wikimedia Commons for Android
## v5.2.0
v5.2.0 boasts several new functionalities like:
* A new refresh button lets you quickly reload the Nearby map
* Bookmarks now support categories
* Improved feedback and consistency in the user interface
* Bug fixes and performance improvements
### What's changed
* Implement "Refresh" button to clear the cache and reload the Nearby map.
* `CommonsApplication` migrate to kotlin & some lint fixes.
* Revert back to MainScope for database and UI updates and make database operations thread safe.
* Hide edit options for logged-out users in Explore screen.
* Introduced a button to delete the current folder in custom selector.
* Improve Unique File Name Search.
* Migration of several modules from Java to Kotlin.
* Fix modification on bottom sheet's data when coming from Nearby Banner and clicked on other pins.
* Bug fixes and enhancement of Achievements screen.
* Show where file is being used on Commons and other wikis.
* Migrate android.media.ExifInterface to androidx.exifinterface.media.ExifInterface as android.media.ExifInterface had security flaws on older devices.
* Make dialogs modal and always show the upload icon.
* Fix unintentional deletion of subfolders and non-images by custom selector.
* Bookmark categories.
* Add pull down to refresh in the Contributions screen.
* Fix race condition and lag when loading pin details, faster overlay management.
* Show cached pins in Nearby even when internet is unavailable
Full changelog with the list of contributors: [`v5.1.2...v5.2.0`](https://github.com/commons-app/apps-android-commons/compare/v5.1.2...v5.2.0).
## v5.1.2 ## v5.1.2
### What's changed ### What's changed

View file

@ -212,8 +212,8 @@ android {
defaultConfig { defaultConfig {
//applicationId 'fr.free.nrw.commons' //applicationId 'fr.free.nrw.commons'
versionCode 1046 versionCode 1049
versionName '5.1.3' versionName '5.2.0'
setProperty("archivesBaseName", "app-commons-v$versionName-" + getBranchName()) setProperty("archivesBaseName", "app-commons-v$versionName-" + getBranchName())
minSdkVersion 21 minSdkVersion 21
@ -318,7 +318,7 @@ android {
buildConfigField "String", "SIGNUP_LANDING_URL", "\"https://commons.m.wikimedia.org/w/index.php?title=Special:CreateAccount&returnto=Main+Page&returntoquery=welcome%3Dyes\"" buildConfigField "String", "SIGNUP_LANDING_URL", "\"https://commons.m.wikimedia.org/w/index.php?title=Special:CreateAccount&returnto=Main+Page&returntoquery=welcome%3Dyes\""
buildConfigField "String", "SIGNUP_SUCCESS_REDIRECTION_URL", "\"https://commons.m.wikimedia.org/w/index.php?title=Main_Page&welcome=yes\"" buildConfigField "String", "SIGNUP_SUCCESS_REDIRECTION_URL", "\"https://commons.m.wikimedia.org/w/index.php?title=Main_Page&welcome=yes\""
buildConfigField "String", "FORGOT_PASSWORD_URL", "\"https://commons.wikimedia.org/wiki/Special:PasswordReset\"" buildConfigField "String", "FORGOT_PASSWORD_URL", "\"https://commons.wikimedia.org/wiki/Special:PasswordReset\""
buildConfigField "String", "PRIVACY_POLICY_URL", "\"https://github.com/commons-app/commons-app-documentation/blob/master/android/Privacy-policy.md\"" buildConfigField "String", "PRIVACY_POLICY_URL", "\"https://commons-app.github.io/privacy-policy\""
buildConfigField "String", "FILE_USAGES_BASE_URL", "\"https://commons.wikimedia.org/w/api.php?action=query&format=json&formatversion=2\"" buildConfigField "String", "FILE_USAGES_BASE_URL", "\"https://commons.wikimedia.org/w/api.php?action=query&format=json&formatversion=2\""
buildConfigField "String", "ACCOUNT_TYPE", "\"fr.free.nrw.commons\"" buildConfigField "String", "ACCOUNT_TYPE", "\"fr.free.nrw.commons\""
buildConfigField "String", "CONTRIBUTION_AUTHORITY", "\"fr.free.nrw.commons.contributions.contentprovider\"" buildConfigField "String", "CONTRIBUTION_AUTHORITY", "\"fr.free.nrw.commons.contributions.contentprovider\""
@ -355,7 +355,7 @@ android {
buildConfigField "String", "SIGNUP_LANDING_URL", "\"https://commons.m.wikimedia.beta.wmflabs.org/w/index.php?title=Special:CreateAccount&returnto=Main+Page&returntoquery=welcome%3Dyes\"" buildConfigField "String", "SIGNUP_LANDING_URL", "\"https://commons.m.wikimedia.beta.wmflabs.org/w/index.php?title=Special:CreateAccount&returnto=Main+Page&returntoquery=welcome%3Dyes\""
buildConfigField "String", "SIGNUP_SUCCESS_REDIRECTION_URL", "\"https://commons.m.wikimedia.beta.wmflabs.org/w/index.php?title=Main_Page&welcome=yes\"" buildConfigField "String", "SIGNUP_SUCCESS_REDIRECTION_URL", "\"https://commons.m.wikimedia.beta.wmflabs.org/w/index.php?title=Main_Page&welcome=yes\""
buildConfigField "String", "FORGOT_PASSWORD_URL", "\"https://commons.wikimedia.beta.wmflabs.org/wiki/Special:PasswordReset\"" buildConfigField "String", "FORGOT_PASSWORD_URL", "\"https://commons.wikimedia.beta.wmflabs.org/wiki/Special:PasswordReset\""
buildConfigField "String", "PRIVACY_POLICY_URL", "\"https://github.com/commons-app/commons-app-documentation/blob/master/android/Privacy-policy.md\"" buildConfigField "String", "PRIVACY_POLICY_URL", "\"https://commons-app.github.io/privacy-policy\""
buildConfigField "String", "FILE_USAGES_BASE_URL", "\"https://commons.wikimedia.org/w/api.php?action=query&format=json&formatversion=2\"" buildConfigField "String", "FILE_USAGES_BASE_URL", "\"https://commons.wikimedia.org/w/api.php?action=query&format=json&formatversion=2\""
buildConfigField "String", "ACCOUNT_TYPE", "\"fr.free.nrw.commons.beta\"" buildConfigField "String", "ACCOUNT_TYPE", "\"fr.free.nrw.commons.beta\""
buildConfigField "String", "CONTRIBUTION_AUTHORITY", "\"fr.free.nrw.commons.beta.contributions.contentprovider\"" buildConfigField "String", "CONTRIBUTION_AUTHORITY", "\"fr.free.nrw.commons.beta.contributions.contentprovider\""

View file

@ -387,35 +387,40 @@ after opening the app.
} }
override fun onBackPressed() { override fun onBackPressed() {
if (contributionsFragment != null && activeFragment == ActiveFragment.CONTRIBUTIONS) { when (activeFragment) {
ActiveFragment.CONTRIBUTIONS -> {
// Means that contribution fragment is visible // Means that contribution fragment is visible
if (!contributionsFragment!!.backButtonClicked()) { //If this one does not wan't to handle if (contributionsFragment?.backButtonClicked() != true) { //If this one does not want to handle
// the back press, let the activity do so // the back press, let the activity do so
super.onBackPressed() super.onBackPressed()
}
} }
} else if (nearbyParentFragment != null && activeFragment == ActiveFragment.NEARBY) { ActiveFragment.NEARBY -> {
// Means that nearby fragment is visible // Means that nearby fragment is visible
/* If function nearbyParentFragment.backButtonClick() returns false, it means that the bottomsheet is if (nearbyParentFragment?.backButtonClicked() != true) {
not expanded. So if the back button is pressed, then go back to the Contributions tab */ nearbyParentFragment?.let {
if (!nearbyParentFragment!!.backButtonClicked()) { supportFragmentManager.beginTransaction().remove(it).commit()
supportFragmentManager.beginTransaction().remove(nearbyParentFragment!!) }
.commit()
setSelectedItemId(NavTab.CONTRIBUTIONS.code()) setSelectedItemId(NavTab.CONTRIBUTIONS.code())
}
} }
} else if (exploreFragment != null && activeFragment == ActiveFragment.EXPLORE) { ActiveFragment.EXPLORE -> {
// Means that explore fragment is visible // Explore Fragment is visible
if (!exploreFragment!!.onBackPressed()) { if (exploreFragment?.onBackPressed() != true) {
if (applicationKvStore!!.getBoolean("login_skipped")) { if (applicationKvStore?.getBoolean("login_skipped") == true) {
super.onBackPressed() super.onBackPressed()
} else { } else {
setSelectedItemId(NavTab.CONTRIBUTIONS.code()) setSelectedItemId(NavTab.CONTRIBUTIONS.code())
}
} }
} }
} else if (bookmarkFragment != null && activeFragment == ActiveFragment.BOOKMARK) { ActiveFragment.BOOKMARK -> {
// Means that bookmark fragment is visible // Means that bookmark fragment is visible
bookmarkFragment!!.onBackPressed() bookmarkFragment?.onBackPressed()
} else { }
else -> {
super.onBackPressed() super.onBackPressed()
}
} }
} }

View file

@ -708,8 +708,17 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
GeoPoint point = new GeoPoint( GeoPoint point = new GeoPoint(
nearbyBaseMarker.getPlace().location.getLatitude(), nearbyBaseMarker.getPlace().location.getLatitude(),
nearbyBaseMarker.getPlace().location.getLongitude()); nearbyBaseMarker.getPlace().location.getLongitude());
OverlayItem item = new OverlayItem(nearbyBaseMarker.getPlace().name, null,
point); Media markerMedia = this.getMediaFromImageURL(nearbyBaseMarker.getPlace().pic);
String authorUser = null;
if (markerMedia != null) {
authorUser = markerMedia.getAuthorOrUser();
// HTML text is sometimes part of the author string and needs to be removed
authorUser = Html.fromHtml(authorUser, Html.FROM_HTML_MODE_LEGACY).toString();
}
OverlayItem item = new OverlayItem(nearbyBaseMarker.getPlace().name,
authorUser, point);
item.setMarker(d); item.setMarker(d);
items.add(item); items.add(item);
ItemizedOverlayWithFocus overlay = new ItemizedOverlayWithFocus(items, ItemizedOverlayWithFocus overlay = new ItemizedOverlayWithFocus(items,
@ -740,6 +749,26 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
} }
} }
/**
* Retrieves the specific Media object from the mediaList field.
* @param url The specific Media's image URL.
* @return The Media object that matches the URL or null if it could not be found.
*/
private Media getMediaFromImageURL(String url) {
if (mediaList == null || url == null) {
return null;
}
for (int i = 0; i < mediaList.size(); i++) {
if (mediaList.get(i) != null && mediaList.get(i).getImageUrl() != null
&& mediaList.get(i).getImageUrl().equals(url)) {
return mediaList.get(i);
}
}
return null;
}
/** /**
* Removes a marker from the map based on the specified NearbyBaseMarker. * Removes a marker from the map based on the specified NearbyBaseMarker.
* *

View file

@ -14,6 +14,7 @@ import android.os.Bundle
import android.provider.Settings import android.provider.Settings
import android.view.View import android.view.View
import android.widget.CheckBox import android.widget.CheckBox
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
@ -122,7 +123,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
/** /**
* Set the value of the showPermissionDialog variable. * Set the value of the showPermissionDialog variable.
* *
* @param showPermissionsDialog `true` to indicate to show * @property isShowPermissionsDialog `true` to indicate to show
* Permissions Dialog if permissions are missing, `false` otherwise. * Permissions Dialog if permissions are missing, `false` otherwise.
*/ */
/** /**
@ -166,6 +167,8 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
private var _binding: ActivityUploadBinding? = null private var _binding: ActivityUploadBinding? = null
private val binding: ActivityUploadBinding get() = _binding!! private val binding: ActivityUploadBinding get() = _binding!!
private lateinit var onBackPressedCallback: OnBackPressedCallback
@SuppressLint("CheckResult") @SuppressLint("CheckResult")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -173,6 +176,23 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
_binding = ActivityUploadBinding.inflate(layoutInflater) _binding = ActivityUploadBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
// Overrides the back button to make sure the user is prepared to lose their progress
onBackPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
showAlertDialog(
this@UploadActivity,
getString(R.string.back_button_warning),
getString(R.string.back_button_warning_desc),
getString(R.string.back_button_continue),
getString(R.string.back_button_warning),
null
) {
finish()
}
}
}
onBackPressedDispatcher.addCallback(this, onBackPressedCallback)
/* /*
If Configuration of device is changed then get the new fragments If Configuration of device is changed then get the new fragments
created by the system and populate the fragments ArrayList created by the system and populate the fragments ArrayList
@ -187,7 +207,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
} }
init() init()
binding.rlContainerTitle.setOnClickListener { v: View? -> onRlContainerTitleClicked() } binding.rlContainerTitle.setOnClickListener { _: View? -> onRlContainerTitleClicked() }
nearbyPopupAnswers = mutableMapOf() nearbyPopupAnswers = mutableMapOf()
//getting the current dpi of the device and if it is less than 320dp i.e. overlapping //getting the current dpi of the device and if it is less than 320dp i.e. overlapping
//threshold, thumbnails automatically minimizes //threshold, thumbnails automatically minimizes
@ -201,7 +221,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
} }
locationManager!!.requestLocationUpdatesFromProvider(LocationManager.GPS_PROVIDER) locationManager!!.requestLocationUpdatesFromProvider(LocationManager.GPS_PROVIDER)
locationManager!!.requestLocationUpdatesFromProvider(LocationManager.NETWORK_PROVIDER) locationManager!!.requestLocationUpdatesFromProvider(LocationManager.NETWORK_PROVIDER)
store = BasicKvStore(this, storeNameForCurrentUploadImagesSize).apply { store = BasicKvStore(this, STORE_NAME_FOR_CURRENT_UPLOAD_IMAGE_SIZE).apply {
clearAll() clearAll()
} }
checkStoragePermissions() checkStoragePermissions()
@ -241,7 +261,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
override fun onPageSelected(position: Int) { override fun onPageSelected(position: Int) {
currentSelectedPosition = position currentSelectedPosition = position
if (position >= uploadableFiles!!.size) { if (position >= uploadableFiles.size) {
binding.cvContainerTopCard.visibility = View.GONE binding.cvContainerTopCard.visibility = View.GONE
} else { } else {
thumbnailsAdapter!!.notifyDataSetChanged() thumbnailsAdapter!!.notifyDataSetChanged()
@ -274,7 +294,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.filter { result: Boolean? -> result!! } .filter { result: Boolean? -> result!! }
.subscribe { result: Boolean? -> .subscribe { _: Boolean? ->
showAlertDialog( showAlertDialog(
this, this,
getString(R.string.block_notification_title), getString(R.string.block_notification_title),
@ -284,7 +304,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
}) })
} }
fun checkStoragePermissions() { private fun checkStoragePermissions() {
// Check if all required permissions are granted // Check if all required permissions are granted
val hasAllPermissions = hasPermission(this, PERMISSIONS_STORAGE) val hasAllPermissions = hasPermission(this, PERMISSIONS_STORAGE)
val hasPartialAccess = hasPartialAccess(this) val hasPartialAccess = hasPartialAccess(this)
@ -355,7 +375,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
showLongToast(this, messageResourceId) showLongToast(this, messageResourceId)
} }
override fun getUploadableFiles(): List<UploadableFile>? { override fun getUploadableFiles(): List<UploadableFile> {
return uploadableFiles return uploadableFiles
} }
@ -367,6 +387,14 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
override fun onUploadMediaDeleted(index: Int) { override fun onUploadMediaDeleted(index: Int) {
fragments!!.removeAt(index) //Remove the corresponding fragment fragments!!.removeAt(index) //Remove the corresponding fragment
uploadableFiles.removeAt(index) //Remove the files from the list uploadableFiles.removeAt(index) //Remove the files from the list
val isMediaDetailFragment = fragments!!.getOrNull(currentSelectedPosition)?.let {
it is UploadMediaDetailFragment
} ?: false
if(!isMediaDetailFragment) {
// Should hide the top card current fragment is not the media detail fragment
showHideTopCard(false)
}
thumbnailsAdapter!!.notifyItemRemoved(index) //Notify the thumbnails adapter thumbnailsAdapter!!.notifyItemRemoved(index) //Notify the thumbnails adapter
uploadImagesAdapter!!.notifyDataSetChanged() //Notify the ViewPager uploadImagesAdapter!!.notifyDataSetChanged() //Notify the ViewPager
} }
@ -375,8 +403,8 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
binding.tvTopCardTitle.text = resources binding.tvTopCardTitle.text = resources
.getQuantityString( .getQuantityString(
R.plurals.upload_count_title, R.plurals.upload_count_title,
uploadableFiles!!.size, uploadableFiles.size,
uploadableFiles!!.size uploadableFiles.size
) )
} }
@ -444,15 +472,16 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
receiveInternalSharedItems() receiveInternalSharedItems()
} }
if (uploadableFiles == null || uploadableFiles!!.isEmpty()) { if (uploadableFiles.isEmpty()) {
handleNullMedia() handleNullMedia()
} else { } else {
//Show thumbnails //Show thumbnails
if (uploadableFiles!!.size > 1) { if (uploadableFiles.size > 1) {
if (!defaultKvStore.getBoolean("hasAlreadyLaunchedCategoriesDialog")) { //If there is only file, no need to show the image thumbnails if (!defaultKvStore.getBoolean("hasAlreadyLaunchedCategoriesDialog")) {
// If there is only file, no need to show the image thumbnails
showAlertDialogForCategories() showAlertDialogForCategories()
} }
if (uploadableFiles!!.size > 3 && if (uploadableFiles.size > 3 &&
!defaultKvStore.getBoolean("hasAlreadyLaunchedBigMultiupload") !defaultKvStore.getBoolean("hasAlreadyLaunchedBigMultiupload")
) { ) {
showAlertForBattery() showAlertForBattery()
@ -464,8 +493,8 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
binding.tvTopCardTitle.text = resources binding.tvTopCardTitle.text = resources
.getQuantityString( .getQuantityString(
R.plurals.upload_count_title, R.plurals.upload_count_title,
uploadableFiles!!.size, uploadableFiles.size,
uploadableFiles!!.size uploadableFiles.size
) )
@ -474,7 +503,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
} }
for (uploadableFile in uploadableFiles!!) { for (uploadableFile in uploadableFiles) {
val uploadMediaDetailFragment = UploadMediaDetailFragment() val uploadMediaDetailFragment = UploadMediaDetailFragment()
if (!uploadIsOfAPlace) { if (!uploadIsOfAPlace) {
@ -497,8 +526,8 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
object : UploadMediaDetailFragmentCallback { object : UploadMediaDetailFragmentCallback {
override fun deletePictureAtIndex(index: Int) { override fun deletePictureAtIndex(index: Int) {
store!!.putInt( store!!.putInt(
keyForCurrentUploadImagesSize, KEY_FOR_CURRENT_UPLOAD_IMAGE_SIZE,
(store!!.getInt(keyForCurrentUploadImagesSize) - 1) (store!!.getInt(KEY_FOR_CURRENT_UPLOAD_IMAGE_SIZE) - 1)
) )
presenter!!.deletePictureAtIndex(index) presenter!!.deletePictureAtIndex(index)
} }
@ -576,11 +605,11 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
fragments!!.add(mediaLicenseFragment!!) fragments!!.add(mediaLicenseFragment!!)
} else { } else {
for (i in 1 until fragments!!.size) { for (i in 1 until fragments!!.size) {
fragments!![i]!!.callback = object : UploadBaseFragment.Callback { fragments!![i].callback = object : UploadBaseFragment.Callback {
override fun onNextButtonClicked(index: Int) { override fun onNextButtonClicked(index: Int) {
if (index < fragments!!.size - 1) { if (index < fragments!!.size - 1) {
binding.vpUpload.setCurrentItem(index + 1, false) binding.vpUpload.setCurrentItem(index + 1, false)
fragments!![index + 1]!!.onBecameVisible() fragments!![index + 1].onBecameVisible()
(binding.rvThumbnails.layoutManager as LinearLayoutManager) (binding.rvThumbnails.layoutManager as LinearLayoutManager)
.scrollToPositionWithOffset( .scrollToPositionWithOffset(
if ((index > 0)) index - 1 else 0, if ((index > 0)) index - 1 else 0,
@ -594,7 +623,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
override fun onPreviousButtonClicked(index: Int) { override fun onPreviousButtonClicked(index: Int) {
if (index != 0) { if (index != 0) {
binding.vpUpload.setCurrentItem(index - 1, true) binding.vpUpload.setCurrentItem(index - 1, true)
fragments!![index - 1]!!.onBecameVisible() fragments!![index - 1].onBecameVisible()
(binding.rvThumbnails.layoutManager as LinearLayoutManager) (binding.rvThumbnails.layoutManager as LinearLayoutManager)
.scrollToPositionWithOffset( .scrollToPositionWithOffset(
if ((index > 3)) index - 2 else 0, if ((index > 3)) index - 2 else 0,
@ -632,11 +661,12 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
binding.vpUpload.offscreenPageLimit = fragments!!.size binding.vpUpload.offscreenPageLimit = fragments!!.size
} }
// Saving size of uploadableFiles // Saving size of uploadableFiles
store!!.putInt(keyForCurrentUploadImagesSize, uploadableFiles!!.size) store!!.putInt(KEY_FOR_CURRENT_UPLOAD_IMAGE_SIZE, uploadableFiles.size)
} }
/** /**
* Changes current image when one image upload is cancelled, to highlight next image in the top thumbnail. * Changes current image when one image upload is cancelled, to highlight next image in the top
* thumbnail.
* Fixes: [Issue](https://github.com/commons-app/apps-android-commons/issues/5511) * Fixes: [Issue](https://github.com/commons-app/apps-android-commons/issues/5511)
* *
* @param index Index of image to be removed * @param index Index of image to be removed
@ -771,7 +801,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
override fun onNextButtonClicked(index: Int) { override fun onNextButtonClicked(index: Int) {
if (index < fragments!!.size - 1) { if (index < fragments!!.size - 1) {
binding.vpUpload.setCurrentItem(index + 1, false) binding.vpUpload.setCurrentItem(index + 1, false)
fragments!![index + 1]!!.onBecameVisible() fragments!![index + 1].onBecameVisible()
(binding.rvThumbnails.layoutManager as LinearLayoutManager) (binding.rvThumbnails.layoutManager as LinearLayoutManager)
.scrollToPositionWithOffset(if ((index > 0)) index - 1 else 0, 0) .scrollToPositionWithOffset(if ((index > 0)) index - 1 else 0, 0)
if (index < fragments!!.size - 4) { if (index < fragments!!.size - 4) {
@ -786,10 +816,10 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
override fun onPreviousButtonClicked(index: Int) { override fun onPreviousButtonClicked(index: Int) {
if (index != 0) { if (index != 0) {
binding.vpUpload.setCurrentItem(index - 1, true) binding.vpUpload.setCurrentItem(index - 1, true)
fragments!![index - 1]!!.onBecameVisible() fragments!![index - 1].onBecameVisible()
(binding.rvThumbnails.layoutManager as LinearLayoutManager) (binding.rvThumbnails.layoutManager as LinearLayoutManager)
.scrollToPositionWithOffset(if ((index > 3)) index - 2 else 0, 0) .scrollToPositionWithOffset(if ((index > 3)) index - 2 else 0, 0)
if ((index != 1) && ((index - 1) < uploadableFiles!!.size)) { if ((index != 1) && ((index - 1) < uploadableFiles.size)) {
// Shows the top card if it was hidden because of the last image being deleted and // Shows the top card if it was hidden because of the last image being deleted and
// now the user has hit previous button to go back to the media details // now the user has hit previous button to go back to the media details
showHideTopCard(true) showHideTopCard(true)
@ -797,7 +827,10 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
} }
} }
override fun onThumbnailDeleted(position: Int) = presenter!!.deletePictureAtIndex(position) override fun onThumbnailDeleted(position: Int) {
presenter!!.deletePictureAtIndex(position)
thumbnailsAdapter?.notifyDataSetChanged()
}
/** /**
* The adapter used to show image upload intermediate fragments * The adapter used to show image upload intermediate fragments
@ -824,11 +857,11 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
} }
fun onRlContainerTitleClicked() { private fun onRlContainerTitleClicked() {
binding.rvThumbnails.visibility = binding.rvThumbnails.visibility =
if (isTitleExpanded) View.GONE else View.VISIBLE if (isTitleExpanded) View.GONE else View.VISIBLE
isTitleExpanded = !isTitleExpanded isTitleExpanded = !isTitleExpanded
binding.ibToggleTopCard.rotation = binding.ibToggleTopCard.rotation + 180 binding.ibToggleTopCard.rotation += 180
} }
override fun onDestroy() { override fun onDestroy() {
@ -845,21 +878,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
if (uploadCategoriesFragment != null) { if (uploadCategoriesFragment != null) {
uploadCategoriesFragment!!.callback = null uploadCategoriesFragment!!.callback = null
} }
} onBackPressedCallback.remove()
/**
* Overrides the back button to make sure the user is prepared to lose their progress
*/
@SuppressLint("MissingSuperCall")
override fun onBackPressed() {
showAlertDialog(
this,
getString(R.string.back_button_warning),
getString(R.string.back_button_warning_desc),
getString(R.string.back_button_continue),
getString(R.string.back_button_warning),
null
) { finish() }
} }
/** /**
@ -879,7 +898,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
.setView(view) .setView(view)
.setTitle(getString(R.string.multiple_files_depiction_header)) .setTitle(getString(R.string.multiple_files_depiction_header))
.setMessage(getString(R.string.multiple_files_depiction)) .setMessage(getString(R.string.multiple_files_depiction))
.setPositiveButton("OK") { dialog: DialogInterface?, which: Int -> .setPositiveButton("OK") { _: DialogInterface?, _: Int ->
if (checkBox.isChecked) { if (checkBox.isChecked) {
// Save the user's choice to not show the dialog again // Save the user's choice to not show the dialog again
defaultKvStore.putBoolean("hasAlreadyLaunchedCategoriesDialog", true) defaultKvStore.putBoolean("hasAlreadyLaunchedCategoriesDialog", true)
@ -913,14 +932,14 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
getString(R.string.cancel), getString(R.string.cancel),
{ {
/* Since opening the right settings page might be device dependent, using /* Since opening the right settings page might be device dependent, using
https://github.com/WaseemSabir/BatteryPermissionHelper https://github.com/WaseemSabir/BatteryPermissionHelper
directly appeared like a promising idea. directly appeared like a promising idea.
However, this simply closed the popup and did not make However, this simply closed the popup and did not make
the settings page appear on a Pixel as well as a Xiaomi device. the settings page appear on a Pixel as well as a Xiaomi device.
Used the standard intent instead of using this library as Used the standard intent instead of using this library as
it shows a list of all the apps on the device and allows users to it shows a list of all the apps on the device and allows users to
turn battery optimisation off. turn battery optimisation off.
*/ */
val batteryOptimisationSettingsIntent = Intent( val batteryOptimisationSettingsIntent = Intent(
Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
) )
@ -958,7 +977,8 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
Also, location information is discarded if the difference between Also, location information is discarded if the difference between
current location and location recorded just before capturing the image current location and location recorded just before capturing the image
is greater than 100 meters */ is greater than 100 meters */
if (isLocationTagUnchecked || locationDifference > 100 || !defaultKvStore.getBoolean("inAppCameraLocationPref") if (isLocationTagUnchecked || locationDifference > 100
|| !defaultKvStore.getBoolean("inAppCameraLocationPref")
|| !isInAppCameraUpload || !isInAppCameraUpload
) { ) {
currLocation = null currLocation = null
@ -979,8 +999,8 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
@JvmField @JvmField
var nearbyPopupAnswers: MutableMap<Place, Boolean>? = null var nearbyPopupAnswers: MutableMap<Place, Boolean>? = null
const val keyForCurrentUploadImagesSize: String = "CurrentUploadImagesSize" const val KEY_FOR_CURRENT_UPLOAD_IMAGE_SIZE: String = "CurrentUploadImagesSize"
const val storeNameForCurrentUploadImagesSize: String = "CurrentUploadImageQualities" const val STORE_NAME_FOR_CURRENT_UPLOAD_IMAGE_SIZE: String = "CurrentUploadImageQualities"
/** /**
* Sets the flag indicating whether the upload is of a specific place. * Sets the flag indicating whether the upload is of a specific place.

View file

@ -146,34 +146,31 @@ class UploadPresenter @Inject internal constructor(
override fun deletePictureAtIndex(index: Int) { override fun deletePictureAtIndex(index: Int) {
val uploadableFiles = view.getUploadableFiles() val uploadableFiles = view.getUploadableFiles()
if (index == uploadableFiles!!.size - 1) { uploadableFiles?.let {
// If the next fragment to be shown is not one of the MediaDetailsFragment view.setImageCancelled(true)
// lets hide the top card so that it doesn't appear on the other fragments repository.deletePicture(uploadableFiles[index].getFilePath())
view.showHideTopCard(false) if (uploadableFiles.size == 1) {
} view.showMessage(R.string.upload_cancelled)
view.setImageCancelled(true) view.finish()
repository.deletePicture(uploadableFiles[index].getFilePath()) return
if (uploadableFiles.size == 1) {
view.showMessage(R.string.upload_cancelled)
view.finish()
return
}
presenter.updateImageQualitiesJSON(uploadableFiles.size, index)
view.onUploadMediaDeleted(index)
if (index != uploadableFiles.size && index != 0) {
// if the deleted image was not the last item to be uploaded, check quality of next
repository.getUploadItem(index)?.let {
presenter.checkImageQuality(it, index)
} }
}
if (uploadableFiles.size < 2) { presenter.updateImageQualitiesJSON(uploadableFiles.size, index)
view.showHideTopCard(false) view.onUploadMediaDeleted(index)
} if (index != uploadableFiles.size && index != 0) {
// if the deleted image was not the last item to be uploaded, check quality of next
repository.getUploadItem(index)?.let {
presenter.checkImageQuality(it, index)
}
}
//In case lets update the number of uploadable media if (uploadableFiles.size < 2) {
view.updateTopCardTitle() view.showHideTopCard(false)
}
//In case lets update the number of uploadable media
view.updateTopCardTitle()
}
} }
override fun onAttachView(view: UploadContract.View) { override fun onAttachView(view: UploadContract.View) {

View file

@ -532,7 +532,7 @@ class UploadMediaDetailFragment : UploadBaseFragment(), UploadMediaDetailsContra
basicKvStore!!.putBoolean(keyForShowingAlertDialog, false) basicKvStore!!.putBoolean(keyForShowingAlertDialog, false)
if (isInternetConnectionEstablished(requireActivity())) { if (isInternetConnectionEstablished(requireActivity())) {
val sizeOfUploads = basicKvStore!!.getInt( val sizeOfUploads = basicKvStore!!.getInt(
UploadActivity.keyForCurrentUploadImagesSize UploadActivity.KEY_FOR_CURRENT_UPLOAD_IMAGE_SIZE
) )
for (i in indexOfFragment until sizeOfUploads) { for (i in indexOfFragment until sizeOfUploads) {
presenter.getImageQuality( presenter.getImageQuality(

View file

@ -310,7 +310,7 @@ class UploadMediaPresenter @Inject constructor(
private fun storeImageQuality( private fun storeImageQuality(
imageResult: Int, uploadItemIndex: Int, activity: Activity, uploadItem: UploadItem imageResult: Int, uploadItemIndex: Int, activity: Activity, uploadItem: UploadItem
) { ) {
val store = BasicKvStore(activity, UploadActivity.storeNameForCurrentUploadImagesSize) val store = BasicKvStore(activity, UploadActivity.STORE_NAME_FOR_CURRENT_UPLOAD_IMAGE_SIZE)
val value = store.getString(UPLOAD_QUALITIES_KEY, null) val value = store.getString(UPLOAD_QUALITIES_KEY, null)
try { try {
val jsonObject = value.asJsonObject().apply { val jsonObject = value.asJsonObject().apply {
@ -339,8 +339,10 @@ class UploadMediaPresenter @Inject constructor(
*/ */
override fun checkImageQuality(uploadItem: UploadItem, index: Int) { override fun checkImageQuality(uploadItem: UploadItem, index: Int) {
if ((uploadItem.imageQuality != IMAGE_OK) && (uploadItem.imageQuality != IMAGE_KEEP)) { if ((uploadItem.imageQuality != IMAGE_OK) && (uploadItem.imageQuality != IMAGE_KEEP)) {
val value = basicKvStoreFactory?.let { it(UploadActivity.storeNameForCurrentUploadImagesSize) }
val value = basicKvStoreFactory?.let { it(UploadActivity.STORE_NAME_FOR_CURRENT_UPLOAD_IMAGE_SIZE) }
?.getString(UPLOAD_QUALITIES_KEY, null) ?.getString(UPLOAD_QUALITIES_KEY, null)
try { try {
val imageQuality = value.asJsonObject()["UploadItem$index"] as Int val imageQuality = value.asJsonObject()["UploadItem$index"] as Int
view.showProgress(false) view.showProgress(false)
@ -363,8 +365,9 @@ class UploadMediaPresenter @Inject constructor(
* @param index Index of the UploadItem which was deleted * @param index Index of the UploadItem which was deleted
*/ */
override fun updateImageQualitiesJSON(size: Int, index: Int) { override fun updateImageQualitiesJSON(size: Int, index: Int) {
val value = basicKvStoreFactory?.let { it(UploadActivity.storeNameForCurrentUploadImagesSize) } val value = basicKvStoreFactory?.let { it(UploadActivity.STORE_NAME_FOR_CURRENT_UPLOAD_IMAGE_SIZE) }
?.getString(UPLOAD_QUALITIES_KEY, null) ?.getString(UPLOAD_QUALITIES_KEY, null)
try { try {
val jsonObject = value.asJsonObject().apply { val jsonObject = value.asJsonObject().apply {
for (i in index until (size - 1)) { for (i in index until (size - 1)) {
@ -372,7 +375,8 @@ class UploadMediaPresenter @Inject constructor(
} }
remove("UploadItem" + (size - 1)) remove("UploadItem" + (size - 1))
} }
basicKvStoreFactory?.let { it(UploadActivity.storeNameForCurrentUploadImagesSize) }
basicKvStoreFactory?.let { it(UploadActivity.STORE_NAME_FOR_CURRENT_UPLOAD_IMAGE_SIZE) }
?.putString(UPLOAD_QUALITIES_KEY, jsonObject.toString()) ?.putString(UPLOAD_QUALITIES_KEY, jsonObject.toString())
} catch (e: Exception) { } catch (e: Exception) {
Timber.e(e) Timber.e(e)

View file

@ -315,7 +315,7 @@
<string name="share_image_via">Resımi vıla kerê pê</string> <string name="share_image_via">Resımi vıla kerê pê</string>
<string name="no_achievements_yet" fuzzy="true">Hewna to iştirak nêkerdo</string> <string name="no_achievements_yet" fuzzy="true">Hewna to iştirak nêkerdo</string>
<string name="account_created">Hesab vıraziya!</string> <string name="account_created">Hesab vıraziya!</string>
<string name="text_copy">Metın kopyayê panoyi biyo</string> <string name="text_copy">Metın be panoyi ra kopya bi</string>
<string name="notification_mark_read">Pêhesnayışi wanaye nışan bıkerê</string> <string name="notification_mark_read">Pêhesnayışi wanaye nışan bıkerê</string>
<string name="some_error">Yew xeta biye!</string> <string name="some_error">Yew xeta biye!</string>
<string name="place_state">Weziyetê cayi:</string> <string name="place_state">Weziyetê cayi:</string>

View file

@ -853,8 +853,14 @@
<string name="usages_on_other_wikis_heading">Autres wikis</string> <string name="usages_on_other_wikis_heading">Autres wikis</string>
<string name="bullet_point"></string> <string name="bullet_point"></string>
<string name="file_usages_container_heading">Utilisations du fichier</string> <string name="file_usages_container_heading">Utilisations du fichier</string>
<string name="title_activity_single_web_view">SingleWebViewActivity</string>
<string name="account">Compte</string>
<string name="vanish_account">Faire disparaître le compte</string>
<string name="account_vanish_request_confirm_title">Avertissement de disparition du compte</string>
<string name="account_vanish_request_confirm">La disparition est un &lt;b&gt;dernier recours&lt;/b&gt; et ne devrait être &lt;b&gt;utilisée que quand vous voulez arrêter déditer pour toujours&lt;/b&gt; et aussi pour cacher autant que possible vos associations passées.&lt;br/&gt;&lt;br/&gt;La suppression de compte sur Wikimedia Commons se fait en changeant le nom de votre compte de sorte que les autres ne peuvent pas identifier vos contributions, lors dun processus appelé disparition du compte. &lt;b&gt;La disparition ne garantit pas lanonymat complet ni ne supprime les contributions de vos projets&lt;/b&gt;.</string>
<string name="caption">Légende</string> <string name="caption">Légende</string>
<string name="caption_copied_to_clipboard">Légende copiée dans le presse-papier</string> <string name="caption_copied_to_clipboard">Légende copiée dans le presse-papier</string>
<string name="congratulations_all_pictures_in_this_album_have_been_either_uploaded_or_marked_as_not_for_upload">Félicitations, toutes les images dans cet album ont été soit téléchargées soit marquées comme non téléchargeables.</string>
<string name="show_in_explore">Afficher dans Explorer</string> <string name="show_in_explore">Afficher dans Explorer</string>
<string name="show_in_nearby">Afficher à proximité</string> <string name="show_in_nearby">Afficher à proximité</string>
</resources> </resources>

View file

@ -40,13 +40,13 @@
<item quantity="one">(%1$d)</item> <item quantity="one">(%1$d)</item>
<item quantity="other">(%1$d)</item> <item quantity="other">(%1$d)</item>
</plurals> </plurals>
<plurals name="starting_multiple_uploads" fuzzy="true"> <plurals name="starting_multiple_uploads">
<item quantity="one">Iniciando %1$d carga</item> <item quantity="one">Procesando %d carga</item>
<item quantity="other">Iniciando %1$d cargas</item> <item quantity="other">Procesando %d cargas</item>
</plurals> </plurals>
<plurals name="multiple_uploads_title" fuzzy="true"> <plurals name="multiple_uploads_title">
<item quantity="one">%1$d carga</item> <item quantity="one">%d carga</item>
<item quantity="other">%1$d cargas</item> <item quantity="other">%d cargas</item>
</plurals> </plurals>
<plurals name="share_license_summary"> <plurals name="share_license_summary">
<item quantity="one">Esta imaxe quedará baixo a licenza %1$s</item> <item quantity="one">Esta imaxe quedará baixo a licenza %1$s</item>
@ -80,16 +80,16 @@
<string name="updating_caption_title">A actualizar lendas e descricións</string> <string name="updating_caption_title">A actualizar lendas e descricións</string>
<string name="updating_caption_message">Agarde un chisco…</string> <string name="updating_caption_message">Agarde un chisco…</string>
<string name="login_success">Accedeu correctamente!</string> <string name="login_success">Accedeu correctamente!</string>
<string name="login_failed">Erro durante o inició de sesión!</string> <string name="login_failed">Erro durante o inicio de sesión!</string>
<string name="upload_failed">Ficheiro non atopado. Por favor, probe con outro.</string> <string name="upload_failed">Ficheiro non atopado. Por favor, probe con outro.</string>
<string name="retry_limit_reached">Alcanzouse o límite máximo de reintentos! Cancele o envío e ténteo de novo</string> <string name="retry_limit_reached">Alcanzouse o límite máximo de reintentos! Cancele o envío e ténteo de novo</string>
<string name="unrestricted_battery_mode">Desactivar a optimización da batería?</string> <string name="unrestricted_battery_mode">Desactivar a optimización da batería?</string>
<string name="authentication_failed">Fallou a autenticación. Inicie sesión de novo.</string> <string name="authentication_failed">Fallou a autenticación. Inicie sesión de novo.</string>
<string name="uploading_started">A carga comezou!</string> <string name="uploading_started">A carga comezou!</string>
<string name="uploading_queued">Envío en cola (modo de conexión limitado activado)</string> <string name="uploading_queued">Envío en cola (modo de conexión limitado activado)</string>
<string name="upload_completed_notification_title">Cargouse \"%1$s\"!</string> <string name="upload_completed_notification_title">Subiuse \"%1$s\"!</string>
<string name="upload_completed_notification_text">Prema para ollar a súa carga</string> <string name="upload_completed_notification_text">Prema para ollar a súa carga</string>
<string name="upload_progress_notification_title_start">A enviar ficheiro: %s</string> <string name="upload_progress_notification_title_start">A subir o ficheiro: %s</string>
<string name="upload_progress_notification_title_in_progress">Cargando \"%1$s\"</string> <string name="upload_progress_notification_title_in_progress">Cargando \"%1$s\"</string>
<string name="upload_progress_notification_title_finishing">Rematando a carga de \"%1$s\"</string> <string name="upload_progress_notification_title_finishing">Rematando a carga de \"%1$s\"</string>
<string name="upload_failed_notification_title">Produciuse un erro ao enviar %1$s</string> <string name="upload_failed_notification_title">Produciuse un erro ao enviar %1$s</string>
@ -352,7 +352,7 @@
<string name="statistics_thanks">Agradecementos recibidos</string> <string name="statistics_thanks">Agradecementos recibidos</string>
<string name="statistics_featured">Imaxes destacadas</string> <string name="statistics_featured">Imaxes destacadas</string>
<string name="statistics_wikidata_edits">Imaxes vía \"Lugares próximos\"</string> <string name="statistics_wikidata_edits">Imaxes vía \"Lugares próximos\"</string>
<string name="level" fuzzy="true">Nivel</string> <string name="level">Nivel %d</string>
<string name="images_uploaded">Imaxes cargadas</string> <string name="images_uploaded">Imaxes cargadas</string>
<string name="image_reverts">Imaxes non revertidas</string> <string name="image_reverts">Imaxes non revertidas</string>
<string name="images_used_by_wiki">Imaxes usadas</string> <string name="images_used_by_wiki">Imaxes usadas</string>
@ -408,14 +408,14 @@
<string name="never_ask_again">Non volver a preguntar isto nunca</string> <string name="never_ask_again">Non volver a preguntar isto nunca</string>
<string name="display_location_permission_title">Solicitar permiso de localización</string> <string name="display_location_permission_title">Solicitar permiso de localización</string>
<string name="display_location_permission_explanation">Pedir permisos de localización cando sexa necesario para a funcionalidade de notificación de proximidade.</string> <string name="display_location_permission_explanation">Pedir permisos de localización cando sexa necesario para a funcionalidade de notificación de proximidade.</string>
<string name="achievements_fetch_failed" fuzzy="true">Algo foi mal, non puidemos obter as túas achegas</string> <string name="achievements_fetch_failed">Algo foi mal e non puidemos obter os logros</string>
<string name="ends_on">Finaliza o:</string> <string name="ends_on">Finaliza o:</string>
<string name="display_campaigns">Amosar campañas</string> <string name="display_campaigns">Amosar campañas</string>
<string name="display_campaigns_explanation">Ver as campañas en curso</string> <string name="display_campaigns_explanation">Ver as campañas en curso</string>
<string name="option_allow">Permitir</string> <string name="option_allow">Permitir</string>
<string name="option_dismiss">Descartar</string> <string name="option_dismiss">Descartar</string>
<string name="nearby_campaign_dismiss_message">Xa non verá as campañas. Porén, pode volver habilitar esta notificación na configuración.</string> <string name="nearby_campaign_dismiss_message">Xa non verá as campañas. Porén, pode volver habilitar esta notificación na configuración.</string>
<string name="this_function_needs_network_connection" fuzzy="true">Esta función require conexión de rede, verifique a súa configuración de conexión.</string> <string name="this_function_needs_network_connection">Esta función necesita conexión de rede. Verifique a súa configuración de conexión.</string>
<string name="error_processing_image">Houbo un erro ó procesar a imaxe. Por favor, ténteo de novoǃ</string> <string name="error_processing_image">Houbo un erro ó procesar a imaxe. Por favor, ténteo de novoǃ</string>
<string name="getting_edit_token">Obter un identificador para editar</string> <string name="getting_edit_token">Obter un identificador para editar</string>
<string name="check_category_adding_template">Engadir modelo para o control de categoría</string> <string name="check_category_adding_template">Engadir modelo para o control de categoría</string>
@ -462,8 +462,8 @@
<string name="delete_helper_show_deletion_title_failed">Fallou</string> <string name="delete_helper_show_deletion_title_failed">Fallou</string>
<string name="delete_helper_show_deletion_message_else">Non foi posíbel solicitar a eliminación.</string> <string name="delete_helper_show_deletion_message_else">Non foi posíbel solicitar a eliminación.</string>
<string name="delete_helper_ask_spam_selfie">Un autorretrato que non se emprega en ningún artigo</string> <string name="delete_helper_ask_spam_selfie">Un autorretrato que non se emprega en ningún artigo</string>
<string name="delete_helper_ask_spam_blurry" fuzzy="true">Borrosa</string> <string name="delete_helper_ask_spam_blurry">completamente borrosa</string>
<string name="delete_helper_ask_spam_nonsense" fuzzy="true">Sen sentido</string> <string name="delete_helper_ask_spam_nonsense">sen sentido, totalmente inusable en calquera artigo</string>
<string name="delete_helper_ask_reason_copyright_press_photo">Foto de prensa</string> <string name="delete_helper_ask_reason_copyright_press_photo">Foto de prensa</string>
<string name="delete_helper_ask_reason_copyright_internet_photo">Foto aleatoria de internet</string> <string name="delete_helper_ask_reason_copyright_internet_photo">Foto aleatoria de internet</string>
<string name="delete_helper_ask_reason_copyright_logo">Logo</string> <string name="delete_helper_ask_reason_copyright_logo">Logo</string>

View file

@ -385,8 +385,11 @@
<string name="notifications">Avizi</string> <string name="notifications">Avizi</string>
<string name="read_notifications">Avizi (lektita)</string> <string name="read_notifications">Avizi (lektita)</string>
<string name="display_nearby_notification">Montrez proxima avizo</string> <string name="display_nearby_notification">Montrez proxima avizo</string>
<string name="display_nearby_notification_summary">Montrar avizo en utensilo \'\'app\'\' pri la maxim proxima loko qua bezonas pikturi</string>
<string name="list_sheet">Listo</string> <string name="list_sheet">Listo</string>
<string name="storage_permission">Permiso pri enmagazinigo</string> <string name="storage_permission">Permiso pri enmagazinigo</string>
<string name="write_storage_permission_rationale_for_image_share">Ni bezonas vua permiso por acesar l\'extera enmagazinigado di vua utensilo, por sendar imaji.</string>
<string name="nearby_notification_dismiss_message">Vu ne pluse vidos la maxim proxima loko qua bezonas fotografuro. Tamen, vu povas kapabligar itere ca avizo en Ajusti (\'\'Settings\'\'), se vu deziros.</string>
<string name="step_count">Etapo %1$d de %2$d: %3$s</string> <string name="step_count">Etapo %1$d de %2$d: %3$s</string>
<string name="next">Sequanta</string> <string name="next">Sequanta</string>
<string name="previous">Antea</string> <string name="previous">Antea</string>
@ -411,17 +414,32 @@
<string name="no_depictions_selected">Nula deskripturo selektita</string> <string name="no_depictions_selected">Nula deskripturo selektita</string>
<string name="back_button_warning">Cesar kargajo</string> <string name="back_button_warning">Cesar kargajo</string>
<string name="back_button_continue">Durar kargajo</string> <string name="back_button_continue">Durar kargajo</string>
<string name="upload_flow_all_images_in_set">(Por omna imaji en la grupo)</string>
<string name="search_this_area">Serchez ca areo</string> <string name="search_this_area">Serchez ca areo</string>
<string name="nearby_card_permission_title">Permiso bezonata</string> <string name="nearby_card_permission_title">Permiso bezonata</string>
<string name="nearby_card_permission_explanation">Ka vu deziras ke ni uzez vua nuna lokizo por montrar vicina loki qui bezonas imaji?</string> <string name="nearby_card_permission_explanation">Ka vu deziras ke ni uzez vua nuna lokizo por montrar vicina loki qui bezonas imaji?</string>
<string name="unable_to_display_nearest_place">Ne esas posibla montrar la maxim proxima loko qua bezonas imajo, se vu ne montros vua lokizo</string>
<string name="never_ask_again">Ne pluse demandez to</string> <string name="never_ask_again">Ne pluse demandez to</string>
<string name="display_location_permission_title">Demandar lokala permiso</string> <string name="display_location_permission_title">Demandar lokala permiso</string>
<string name="display_location_permission_explanation">Demandez lokala permiso, kande bezonata por uzar karto montranta proximeso.</string> <string name="display_location_permission_explanation">Demandez lokala permiso, kande bezonata por uzar karto montranta proximeso.</string>
<string name="achievements_fetch_failed">Ulu faliis, ni ne povis montrar vua sucesi</string>
<string name="achievements_fetch_failed_ultimate_achievement">Vu facis plu multa kontributaji, e nia kalkulo-utensilo ne povis kalkular li. To esis la maxim importanta suceso.</string>
<string name="ends_on">Finas la:</string> <string name="ends_on">Finas la:</string>
<string name="display_campaigns">Montrez kampanii</string> <string name="display_campaigns">Montrez kampanii</string>
<string name="display_campaigns_explanation">Videz la kampanii duranta</string> <string name="display_campaigns_explanation">Videz la kampanii duranta</string>
<string name="in_app_camera_location_access_explanation">Permisez ke l\'utensilo (\'\'app\'\') lokizez, se la kamero ne enrejistros la lokizo. Kelka kameri ne havas utensilo por enrejistrar lokizo. Cakaze, vua kontributado divenos plu utila se vu permisos ke l\'\'\'app\'\' prenez ed enrejistrez lokizi. Vu povos abrogar ca permiso irgatempe en Ajusti (\'\'Settings\'\')</string>
<string name="option_allow">Permisar</string> <string name="option_allow">Permisar</string>
<string name="option_dismiss">Eskartar</string> <string name="option_dismiss">Eskartar</string>
<string name="in_app_camera_needs_location">Voluntez kapabligar registrago di lokizo en \'\'Settings\'\', e probez itere.\n\nNoto: l\'arkivo sendanta povas ne havar informo pri lokizo, se l\'\'\'app\'\' ne povas rekuperar l\'informo pri lokizo en kurta intervalo.</string>
<string name="getting_edit_token">Kaptanta \'\'token\'\' por redaktar.</string>
<string name="check_category_adding_template">Adjuntanta shablono por verifikar kategorio</string>
<string name="check_category_notification_title">Demandanta verifiko di kategorio por %1$s</string>
<string name="check_category_edit_summary">Demandanta verifiko di kategorio</string>
<string name="check_category_success_title">Verifiko di kategorio demandita</string>
<string name="check_category_failure_title">Demando pri verifiko di kategorio ne funcionis</string>
<string name="check_category_success_message">Dema%1$sndita verifiko di kategorio por %1$s</string>
<string name="check_category_failure_message">Ne povis demandar verifiko di kategorio por %1$s</string>
<string name="check_category_toast">Demandanta verifiko di kategorio por %1$s</string>
<string name="nominate_for_deletion_done">Facita</string> <string name="nominate_for_deletion_done">Facita</string>
<string name="send_thank_success_title">Sendanta danko: Suceso</string> <string name="send_thank_success_title">Sendanta danko: Suceso</string>
<string name="send_thank_success_message">Danko sendita sucese a %1$s</string> <string name="send_thank_success_message">Danko sendita sucese a %1$s</string>
@ -430,6 +448,7 @@
<string name="send_thank_toast">Sendanta danko a %1$s</string> <string name="send_thank_toast">Sendanta danko a %1$s</string>
<string name="review_copyright">Ka to obedias la reguli pri autoroyuro?</string> <string name="review_copyright">Ka to obedias la reguli pri autoroyuro?</string>
<string name="review_category">Ka lua kategorio esas korekta?</string> <string name="review_category">Ka lua kategorio esas korekta?</string>
<string name="review_spam">Ka to apartenas al skopo dil projeto?</string>
<string name="review_thanks">Ka vu deziras dankar la kontributero?</string> <string name="review_thanks">Ka vu deziras dankar la kontributero?</string>
<string name="review_spam_explanation">Kliktez NO por indikar ca imajo por efaco, se ol ne havas irga utileso.</string> <string name="review_spam_explanation">Kliktez NO por indikar ca imajo por efaco, se ol ne havas irga utileso.</string>
<string name="review_no_category">Ho, to ne mem havas kategorio!</string> <string name="review_no_category">Ho, to ne mem havas kategorio!</string>
@ -452,9 +471,11 @@
<string name="please_wait">Vartez...</string> <string name="please_wait">Vartez...</string>
<string name="copied_successfully">Kopiita</string> <string name="copied_successfully">Kopiita</string>
<string name="welcome_do_upload_content_description">Exempli pri bona imaji por sendar a Commons</string> <string name="welcome_do_upload_content_description">Exempli pri bona imaji por sendar a Commons</string>
<string name="welcome_dont_upload_content_description">Exempli pri imaji por NE SENDAR</string>
<string name="skip_image">Saltez ca imajo</string> <string name="skip_image">Saltez ca imajo</string>
<string name="download_failed_we_cannot_download_the_file_without_storage_permission">Descharjo faliis!! Ni ne povis descharjar l\'arkivo sen permiso pri extera konservo.</string> <string name="download_failed_we_cannot_download_the_file_without_storage_permission">Descharjo faliis!! Ni ne povis descharjar l\'arkivo sen permiso pri extera konservo.</string>
<string name="manage_exif_tags">Administrar etiketi EXIF</string> <string name="manage_exif_tags">Administrar etiketi EXIF</string>
<string name="manage_exif_tags_summary">Dum sendo di arkivi, selektez quala etiketi EXIF devas mantenesar</string>
<string name="exif_tag_name_author">Autoro</string> <string name="exif_tag_name_author">Autoro</string>
<string name="exif_tag_name_copyright">Autoroyuro</string> <string name="exif_tag_name_copyright">Autoroyuro</string>
<string name="exif_tag_name_location">Loko</string> <string name="exif_tag_name_location">Loko</string>
@ -465,10 +486,14 @@
<string name="image_info">Informo pri imajo</string> <string name="image_info">Informo pri imajo</string>
<string name="no_categories_found">Nula kategorio trovesis</string> <string name="no_categories_found">Nula kategorio trovesis</string>
<string name="default_description_language">implicita deskripto-linguo</string> <string name="default_description_language">implicita deskripto-linguo</string>
<string name="delete_helper_show_deletion_title">Indikita por efaco</string>
<string name="delete_helper_show_deletion_title_success">Suceso</string> <string name="delete_helper_show_deletion_title_success">Suceso</string>
<string name="delete_helper_show_deletion_message_if">Indikita %1$s por efaco.</string>
<string name="delete_helper_show_deletion_title_failed">Faliis</string> <string name="delete_helper_show_deletion_title_failed">Faliis</string>
<string name="delete_helper_show_deletion_message_else">Ne povis demandar efaco.</string> <string name="delete_helper_show_deletion_message_else">Ne povis demandar efaco.</string>
<string name="delete_helper_ask_spam_selfie">\'\'selfie\'\'-imajo qua ne uzesas en irga artiklo</string>
<string name="delete_helper_ask_spam_blurry">komplete neklara</string> <string name="delete_helper_ask_spam_blurry">komplete neklara</string>
<string name="delete_helper_ask_spam_nonsense">sensencajo, qua ne povas uzesar en irga artiklo</string>
<string name="delete_helper_ask_reason_copyright_press_photo">Fotografuro de komunikilaro</string> <string name="delete_helper_ask_reason_copyright_press_photo">Fotografuro de komunikilaro</string>
<string name="delete_helper_ask_reason_copyright_internet_photo">Hazarda imajo de Interreto</string> <string name="delete_helper_ask_reason_copyright_internet_photo">Hazarda imajo de Interreto</string>
<string name="delete_helper_ask_reason_copyright_logo">Emblemo</string> <string name="delete_helper_ask_reason_copyright_logo">Emblemo</string>
@ -534,9 +559,13 @@
<string name="theme_dark_name">Koloro obskura</string> <string name="theme_dark_name">Koloro obskura</string>
<string name="theme_light_name">Koloro klara</string> <string name="theme_light_name">Koloro klara</string>
<string name="load_more">Charjez pluse</string> <string name="load_more">Charjez pluse</string>
<string name="add_picture_to_wikipedia_article_title">Adjuntar imajo a Wikipedio</string>
<string name="add_picture_to_wikipedia_article_desc">Ka vu deziras adjuntar ca imajo al artiklo de Wikipedio en idiomo %1$s?</string>
<string name="confirm">Konfirmez</string> <string name="confirm">Konfirmez</string>
<string name="instructions_title">Instrucioni</string> <string name="instructions_title">Instrucioni</string>
<string name="wikipedia_instructions_step_1">1. Uzez la sequanta wikitexto:</string> <string name="wikipedia_instructions_step_1">1. Uzez la sequanta wikitexto:</string>
<string name="wikipedia_instructions_step_2">Kliktanta \"konfirmar\" (\'\'Confirm\'\') apertos l\'artiklo che Wikipedio</string>
<string name="wikipedia_instructions_step_3">3. Trovez adequata fako dil artiklo por inkluzar vua imajo</string>
<string name="pause">pauzar</string> <string name="pause">pauzar</string>
<string name="resume">durigar</string> <string name="resume">durigar</string>
<string name="paused">Pauzita</string> <string name="paused">Pauzita</string>

View file

@ -101,6 +101,8 @@
<string name="menu_from_camera">Суратха ал</string> <string name="menu_from_camera">Суратха ал</string>
<string name="menu_nearby">Джуўукъда</string> <string name="menu_nearby">Джуўукъда</string>
<string name="provider_contributions">Джюклегенлерим</string> <string name="provider_contributions">Джюклегенлерим</string>
<string name="menu_copy_link">Джибериуню копия эт</string>
<string name="menu_link_copied">Джибериу алмашдырыу буферге копия этилгенди</string>
<string name="menu_share">Юлюшле</string> <string name="menu_share">Юлюшле</string>
<string name="menu_view_file_page">Файлны бетине къара</string> <string name="menu_view_file_page">Файлны бетине къара</string>
<string name="share_title_hint">Тюб джазыу (Амалсыз)</string> <string name="share_title_hint">Тюб джазыу (Амалсыз)</string>
@ -274,6 +276,7 @@
<string name="copy_wikicode">Викитекстни алмашдырыу буферге копия эт</string> <string name="copy_wikicode">Викитекстни алмашдырыу буферге копия эт</string>
<string name="wikicode_copied">Викитекст алмашдырыу буферге копия этилди</string> <string name="wikicode_copied">Викитекст алмашдырыу буферге копия этилди</string>
<string name="nearby_location_not_available">Джууукъдагыла тюз ишлеялмайды, Локация хайырландырылалмайды.</string> <string name="nearby_location_not_available">Джууукъдагыла тюз ишлеялмайды, Локация хайырландырылалмайды.</string>
<string name="nearby_showing_pins_offline">Интернет джетишмейди. Къуру кэш этилген джерле кёргюзюледиле.</string>
<string name="upload_location_access_denied">Локациягъа джетишиу уналмады. Бу функцияны хайырланыр ючюн, тилейбиз, локациягъызны къолугъуз бла белгилегиз.</string> <string name="upload_location_access_denied">Локациягъа джетишиу уналмады. Бу функцияны хайырланыр ючюн, тилейбиз, локациягъызны къолугъуз бла белгилегиз.</string>
<string name="location_permission_rationale_nearby">Джууукъдагъы джерле тизмени кёргюзюр ючююн, эркинлик берирге керекди</string> <string name="location_permission_rationale_nearby">Джууукъдагъы джерле тизмени кёргюзюр ючююн, эркинлик берирге керекди</string>
<string name="location_permission_rationale_explore">Джууукъдагъы суратла тизмени кёргюзюр ючююн, эркинлик берирге керекди</string> <string name="location_permission_rationale_explore">Джууукъдагъы суратла тизмени кёргюзюр ючююн, эркинлик берирге керекди</string>
@ -357,11 +360,13 @@
<string name="delete">Кетер</string> <string name="delete">Кетер</string>
<string name="Achievements">Джетишимле</string> <string name="Achievements">Джетишимле</string>
<string name="Profile">Профиль</string> <string name="Profile">Профиль</string>
<string name="badges">Белгичикле</string>
<string name="statistics">Статистика</string> <string name="statistics">Статистика</string>
<string name="statistics_thanks">Бюсюреуле Алындыла</string> <string name="statistics_thanks">Бюсюреуле Алындыла</string>
<string name="statistics_featured">Сайланнган Суратла</string> <string name="statistics_featured">Сайланнган Суратла</string>
<string name="statistics_wikidata_edits">\"Джууукъдагъы Джерле\" юсю бла суратла</string> <string name="statistics_wikidata_edits">\"Джууукъдагъы Джерле\" юсю бла суратла</string>
<string name="level" fuzzy="true">Дараджа</string> <string name="level">Дараджа %d</string>
<string name="profileLevel">%s (Дараджа %s)</string>
<string name="images_uploaded">Суратла Джюклендиле</string> <string name="images_uploaded">Суратла Джюклендиле</string>
<string name="image_reverts">Суратла Кери Алынмадыла</string> <string name="image_reverts">Суратла Кери Алынмадыла</string>
<string name="images_used_by_wiki">Суратла Хайырландыла</string> <string name="images_used_by_wiki">Суратла Хайырландыла</string>
@ -393,6 +398,7 @@
<string name="map_application_missing">Девайсыгъызда келишген картография къошакъ табылмады. Тилейбиз, бу энчиликни хайырландырыр ючюн картография къошакъ джюклегиз.</string> <string name="map_application_missing">Девайсыгъызда келишген картография къошакъ табылмады. Тилейбиз, бу энчиликни хайырландырыр ючюн картография къошакъ джюклегиз.</string>
<string name="title_page_bookmarks_pictures">Суратла</string> <string name="title_page_bookmarks_pictures">Суратла</string>
<string name="title_page_bookmarks_locations">Локацияла</string> <string name="title_page_bookmarks_locations">Локацияла</string>
<string name="title_page_bookmarks_categories">Категорияла</string>
<string name="menu_bookmark">Китаб белгилени къош/къорат</string> <string name="menu_bookmark">Китаб белгилени къош/къорат</string>
<string name="provider_bookmarks">Китаб белгиле</string> <string name="provider_bookmarks">Китаб белгиле</string>
<string name="bookmark_empty">Алкъын чырт китаб белги къошмадыгъыз</string> <string name="bookmark_empty">Алкъын чырт китаб белги къошмадыгъыз</string>
@ -794,4 +800,19 @@
<string name="red_pin">Бу джерни сураты джокъду, хайда бирин эт!</string> <string name="red_pin">Бу джерни сураты джокъду, хайда бирин эт!</string>
<string name="green_pin">Бу джерни алайсыз да сураты барды.</string> <string name="green_pin">Бу джерни алайсыз да сураты барды.</string>
<string name="grey_pin">Бу джерни сураты болуб-болмагъанын тинте турама.</string> <string name="grey_pin">Бу джерни сураты болуб-болмагъанын тинте турама.</string>
<string name="error_while_loading">Джюкленнген заманда халат</string>
<string name="no_usages_found">Бир хайырланыучу да табылмады</string>
<string name="usages_on_commons_heading">Гёзен</string>
<string name="usages_on_other_wikis_heading">Башха викиле</string>
<string name="file_usages_container_heading">Файлны хайырланыулары</string>
<string name="title_activity_single_web_view">SingleWebViewActivity</string>
<string name="account">Хыйсаб</string>
<string name="vanish_account">Хыйсабны сюрт</string>
<string name="account_vanish_request_confirm_title">Хыйсаб сюртюуню эсгертиую</string>
<string name="account_vanish_request_confirm">Джокъ этиу — &lt;b&gt;ахыр амалды&lt;/b&gt;, эмда аны &lt;b&gt;тюзетиуню тамамы бла тохтатыргъа излегесиз хайырланыргъа керекди&lt;/b&gt;, неда эскиде ассоциацияланы бир мадар болуб аслам джашырыргъа излесегиз.&lt;br/&gt;&lt;br /&gt;Викигёзенде хыйсабны кетериу, башхала хыйсабны джокъ этиу атны джюрютген процессде сизни кошумугъузну танымазча, хыйсабыгъызны атын тюрлендириу бла этиледи.&lt;b&gt;Джокъ этиу толу анонимликни гарантия этмейди эмда проектде къошумларыгъызны къоратмайды&lt;/b&gt;.</string>
<string name="caption">Тюб джазыу</string>
<string name="caption_copied_to_clipboard">Тюб джазыу алмашдырыу буферге копия этилгенди</string>
<string name="congratulations_all_pictures_in_this_album_have_been_either_uploaded_or_marked_as_not_for_upload">Алгъышлайбыз, бу альбомна бютеу сратла не джюкленнгендиле, неда джюкленирге джораланмагъанлача белгиленнгендиле.</string>
<string name="show_in_explore">Explore-де кёргюз</string>
<string name="show_in_nearby">Nearby-да кёргюз</string>
</resources> </resources>

View file

@ -70,7 +70,7 @@
<string name="authentication_failed">D\'Authentifizéierung huet net funktionéiert. Loggt Iech wgl. nach eng Kéier an.</string> <string name="authentication_failed">D\'Authentifizéierung huet net funktionéiert. Loggt Iech wgl. nach eng Kéier an.</string>
<string name="uploading_started">D\'Eroplueden huet ugefaang!</string> <string name="uploading_started">D\'Eroplueden huet ugefaang!</string>
<string name="upload_completed_notification_title">%1$s eropgelueden!</string> <string name="upload_completed_notification_title">%1$s eropgelueden!</string>
<string name="upload_completed_notification_text">Dréckt fir de Fichier ze gesinn deen Dir eropgelueden hutt</string> <string name="upload_completed_notification_text">Tippt fir de Fichier ze gesinn, deen Dir eropgelueden hutt</string>
<string name="upload_progress_notification_title_start">Fichier eroplueden: %s</string> <string name="upload_progress_notification_title_start">Fichier eroplueden: %s</string>
<string name="upload_progress_notification_title_in_progress">%1$s gëtt eropgelueden</string> <string name="upload_progress_notification_title_in_progress">%1$s gëtt eropgelueden</string>
<string name="upload_progress_notification_title_finishing">Eropluede vu(n) %1$s ofschléissen</string> <string name="upload_progress_notification_title_finishing">Eropluede vu(n) %1$s ofschléissen</string>
@ -274,6 +274,7 @@
<string name="menu_search_button">Sichen</string> <string name="menu_search_button">Sichen</string>
<string name="search_commons">Op Commons sichen</string> <string name="search_commons">Op Commons sichen</string>
<string name="title_activity_search">Sichen</string> <string name="title_activity_search">Sichen</string>
<string name="search_recent_header">Rezent gesicht:</string>
<string name="search_tab_title_media">Medien</string> <string name="search_tab_title_media">Medien</string>
<string name="search_tab_title_categories">Kategorien</string> <string name="search_tab_title_categories">Kategorien</string>
<string name="search_tab_title_depictions">Elementer</string> <string name="search_tab_title_depictions">Elementer</string>

View file

@ -138,7 +138,7 @@
<string name="statistics_thanks">Mercejaments recebuts</string> <string name="statistics_thanks">Mercejaments recebuts</string>
<string name="title_app_shortcut_setting">Paramètres</string> <string name="title_app_shortcut_setting">Paramètres</string>
<string name="theme_default_name" fuzzy="true">Per defaut</string> <string name="theme_default_name" fuzzy="true">Per defaut</string>
<string name="theme_dark_name">Fosc</string> <string name="theme_dark_name">Escur</string>
<string name="theme_light_name">Clar</string> <string name="theme_light_name">Clar</string>
<string name="send_thanks_to_author">Mercejar l\'utilizator</string> <string name="send_thanks_to_author">Mercejar l\'utilizator</string>
</resources> </resources>

View file

@ -22,7 +22,7 @@
<string name="nearby_row_image">ਤਸਵੀਰ</string> <string name="nearby_row_image">ਤਸਵੀਰ</string>
<string name="nearby_all">ਸਾਰੇ</string> <string name="nearby_all">ਸਾਰੇ</string>
<string name="appwidget_img">ਦਿਨ ਦੀ ਤਸਵੀਰ</string> <string name="appwidget_img">ਦਿਨ ਦੀ ਤਸਵੀਰ</string>
<plurals name="uploads_pending_notification_indicator" fuzzy="true"> <plurals name="uploads_pending_notification_indicator">
<item quantity="one"> ਫ਼ਾਈਲ ਚੜ੍ਹਾਈ ਜਾ ਰਹੀ ਹੈ</item> <item quantity="one"> ਫ਼ਾਈਲ ਚੜ੍ਹਾਈ ਜਾ ਰਹੀ ਹੈ</item>
<item quantity="other">%1$d ਫ਼ਾਈਲਾਂ ਚੜ੍ਹਾਈਆਂ ਜਾ ਰਹੀਆਂ ਹਨ</item> <item quantity="other">%1$d ਫ਼ਾਈਲਾਂ ਚੜ੍ਹਾਈਆਂ ਜਾ ਰਹੀਆਂ ਹਨ</item>
</plurals> </plurals>
@ -45,7 +45,7 @@
<string name="preference_category_general">ਆਮ</string> <string name="preference_category_general">ਆਮ</string>
<string name="preference_category_feedback">ਸੁਝਾਅ</string> <string name="preference_category_feedback">ਸੁਝਾਅ</string>
<string name="preference_category_privacy">ਪਰਦੇਦਾਰੀ</string> <string name="preference_category_privacy">ਪਰਦੇਦਾਰੀ</string>
<string name="app_name" fuzzy="true">ਵਿਕੀਮੀਡੀਆ ਕਾਮਨਜ਼</string> <string name="app_name">ਵਿਕੀਮੀਡੀਆ ਸ਼ਾਮਲਾਟ</string>
<string name="menu_settings">ਪਸੰਦਾਂ</string> <string name="menu_settings">ਪਸੰਦਾਂ</string>
<string name="upload_in_progress">ਚੜ੍ਹਾਉਣਾ ਜਾਰੀ ਐ</string> <string name="upload_in_progress">ਚੜ੍ਹਾਉਣਾ ਜਾਰੀ ਐ</string>
<string name="username">ਵਰਤੋਂਕਾਰ ਨਾਂ</string> <string name="username">ਵਰਤੋਂਕਾਰ ਨਾਂ</string>
@ -180,8 +180,11 @@
<string name="media_detail_coordinates_empty">ਕੋਈ ਉਪਲਬਧ ਨਹੀਂ</string> <string name="media_detail_coordinates_empty">ਕੋਈ ਉਪਲਬਧ ਨਹੀਂ</string>
<string name="_2fa_code">2FA ਕੋਡ</string> <string name="_2fa_code">2FA ਕੋਡ</string>
<string name="logout_verification">ਕੀ ਤੁਸੀਂ ਸੱਚੀਂ ਬੰਦ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?</string> <string name="logout_verification">ਕੀ ਤੁਸੀਂ ਸੱਚੀਂ ਬੰਦ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?</string>
<string name="welcome_image_llamas">ਲਾਮਾ</string>
<string name="welcome_image_rainbow_bridge">ਸਤਰੰਗੀ ਪੁਲ</string>
<string name="welcome_image_welcome_wikipedia">ਵਿਕੀਪੀਡੀਆ \'ਤੇ ਜੀ ਆਇਆਂ ਨੂੰ</string> <string name="welcome_image_welcome_wikipedia">ਵਿਕੀਪੀਡੀਆ \'ਤੇ ਜੀ ਆਇਆਂ ਨੂੰ</string>
<string name="welcome_image_welcome_copyright">ਜੀ ਆਇਆਂ ਨੂੰ ਕਾਪੀਰਾਈਟ</string> <string name="welcome_image_welcome_copyright">ਜੀ ਆਇਆਂ ਨੂੰ ਕਾਪੀਰਾਈਟ</string>
<string name="welcome_image_sydney_opera_house">ਸਿਡਨੀ ਓਪੇਰਾ ਹਾਊਸ</string>
<string name="cancel">ਰੱਦ ਕਰੋ</string> <string name="cancel">ਰੱਦ ਕਰੋ</string>
<string name="navigation_drawer_open">ਖੋਲ੍ਹੋ</string> <string name="navigation_drawer_open">ਖੋਲ੍ਹੋ</string>
<string name="navigation_drawer_close">ਬੰਦ ਕਰੋ</string> <string name="navigation_drawer_close">ਬੰਦ ਕਰੋ</string>
@ -191,10 +194,13 @@
<string name="navigation_item_about">ਬਾਰੇ</string> <string name="navigation_item_about">ਬਾਰੇ</string>
<string name="navigation_item_settings">ਤਰਜੀਹਾਂ</string> <string name="navigation_item_settings">ਤਰਜੀਹਾਂ</string>
<string name="navigation_item_feedback">ਸੁਝਾਅ</string> <string name="navigation_item_feedback">ਸੁਝਾਅ</string>
<string name="navigation_item_feedback_github">ਗਿੱਟਹਬ (GitHub) ਰਾਹੀਂ ਸੁਝਾਅ</string>
<string name="navigation_item_logout">ਬਾਹਰ ਆਉ</string> <string name="navigation_item_logout">ਬਾਹਰ ਆਉ</string>
<string name="navigation_item_info">ਸਿਖਲਾਈ</string> <string name="navigation_item_info">ਸਿਖਲਾਈ</string>
<string name="navigation_item_notification">ਸੂਚਨਾਵਾਂ</string> <string name="navigation_item_notification">ਸੂਚਨਾਵਾਂ</string>
<string name="navigation_item_review">ਪਰਖੋ</string> <string name="navigation_item_review">ਪਰਖੋ</string>
<string name="no_description_found">ਕੋਈ ਵੇਰਵਾ ਨਹੀਂ ਮਿਲਿਆ</string>
<string name="nearby_info_menu_wikidata_article">ਵਿਕੀਡਾਟਾ ਵਸਤਾਂ</string>
<string name="nearby_info_menu_wikipedia_article">ਵਿਕੀਪੀਡੀਆ ਲੇਖ</string> <string name="nearby_info_menu_wikipedia_article">ਵਿਕੀਪੀਡੀਆ ਲੇਖ</string>
<string name="upload_problem_image_dark">ਤਸਵੀਰ ਬਹੁਤ ਗੂੜ੍ਹੀ ਹੈ।</string> <string name="upload_problem_image_dark">ਤਸਵੀਰ ਬਹੁਤ ਗੂੜ੍ਹੀ ਹੈ।</string>
<string name="upload_problem_image_blurry">ਤਸਵੀਰ ਧੁੰਦਲੀ ਹੈ।</string> <string name="upload_problem_image_blurry">ਤਸਵੀਰ ਧੁੰਦਲੀ ਹੈ।</string>
@ -203,35 +209,76 @@
<string name="navigation_item_login">ਦਾਖ਼ਲ ਹੋਵੋ</string> <string name="navigation_item_login">ਦਾਖ਼ਲ ਹੋਵੋ</string>
<string name="nearby_wikidata">ਵਿਕੀਡੇਟਾ</string> <string name="nearby_wikidata">ਵਿਕੀਡੇਟਾ</string>
<string name="nearby_wikipedia">ਵਿਕੀਪੀਡੀਆ</string> <string name="nearby_wikipedia">ਵਿਕੀਪੀਡੀਆ</string>
<string name="about_rate_us">ਸਾਨੂੰ ਦਰਜਾ ਦਿਓ</string>
<string name="about_faq">ਅਕਸਰ ਪੁੱਛੇ ਜਾਂਦੇ ਸੁਆਲ</string> <string name="about_faq">ਅਕਸਰ ਪੁੱਛੇ ਜਾਂਦੇ ਸੁਆਲ</string>
<string name="user_guide">ਵਰਤੋਂਕਾਰ ਦਸਤਿਆਂ</string>
<string name="welcome_skip_button">ਸਿਖਲਾਈ ਛੱਡੋ</string> <string name="welcome_skip_button">ਸਿਖਲਾਈ ਛੱਡੋ</string>
<string name="about_translate">ਤਰਜਮਾ ਕਰੋ</string> <string name="about_translate">ਤਰਜਮਾ ਕਰੋ</string>
<string name="about_translate_title">ਬੋਲੀਆਂ</string> <string name="about_translate_title">ਬੋਲੀਆਂ</string>
<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="showcase_view_needs_photo">ਇਸ ਜਗ੍ਹਾ ਨੂੰ ਇੱਕ ਤਸਵੀਰ ਦੀ ਲੋੜ ਏ।</string>
<string name="showcase_view_has_photo">ਇਸ ਜਗ੍ਹਾ \'ਤੇ ਪਹਿਲਾਂ ਹੀ ਇੱਕ ਤਸਵੀਰ ਏ।</string>
<string name="showcase_view_no_longer_exists">ਇਹ ਜਗ੍ਹਾ ਹੁਣ ਮੌਜੂਦ ਨਹੀਂ ਏ।</string>
<string name="no_images_found">ਕੋਈ ਤਸਵੀਰ ਨਹੀਂ ਲੱਭੀ!</string>
<string name="error_loading_images">ਤਸਵੀਰ ਚੜਾਉਨ ਵੇਲੇ ਗਲਤੀ ਆਈ ਏ।</string>
<string name="image_uploaded_by">%1$s: ਵੱਲੋਂ ਚੜ੍ਹਾਈ ਗਈ</string>
<string name="block_notification_title">ਰੋਕ ਲਾਈ ਗਈ</string>
<string name="app_widget_heading">ਦਿਨ ਦੀ ਤਸਵੀਰ</string>
<string name="menu_search_button">ਲੱਭੋ</string> <string name="menu_search_button">ਲੱਭੋ</string>
<string name="title_activity_search">ਲੱਭੋ</string> <string name="title_activity_search">ਲੱਭੋ</string>
<string name="search_recent_header">ਹਾਲੀਆ ਖੋਜਾਂ:</string> <string name="search_recent_header">ਹਾਲੀਆ ਖੋਜਾਂ:</string>
<string name="provider_searches">ਹਾਲ ਦੀਆਂ ਪੁੱਛਗਿੱਛ ਖੋਜਾਂ</string> <string name="provider_searches">ਹਾਲ ਦੀਆਂ ਪੁੱਛਗਿੱਛ ਖੋਜਾਂ</string>
<string name="provider_recent_languages">ਹਾਲ ਹੀ ਵਿੱਚ ਬੋਲੀਆਂ ਬਾਰੇ ਪੁੱਛਗਿੱਛ</string> <string name="provider_recent_languages">ਹਾਲ ਹੀ ਵਿੱਚ ਬੋਲੀਆਂ ਬਾਰੇ ਪੁੱਛਗਿੱਛ</string>
<string name="search_tab_title_categories">ਸ਼੍ਰੇਣੀਆਂ</string> <string name="search_tab_title_categories">ਸ਼੍ਰੇਣੀਆਂ</string>
<string name="search_tab_title_depictions">ਵਸਤਾਂ</string>
<string name="explore_tab_title_map">ਨਕਸ਼ਾ</string> <string name="explore_tab_title_map">ਨਕਸ਼ਾ</string>
<string name="question">ਸਵਾਲ</string> <string name="question">ਸਵਾਲ</string>
<string name="result">ਨਤੀਜਾ</string>
<string name="user_not_logged_in">ਤੁਹਾਡੇ ਦਾਖਲੇ ਦੀ ਮਿਆਦ ਪੁੱਗ ਗਈ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਮੁੜ ਦਾਖਲ ਹੋਵੋ।</string> <string name="user_not_logged_in">ਤੁਹਾਡੇ ਦਾਖਲੇ ਦੀ ਮਿਆਦ ਪੁੱਗ ਗਈ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਮੁੜ ਦਾਖਲ ਹੋਵੋ।</string>
<string name="continue_message">ਜਾਰੀ ਰੱਖੋ</string> <string name="continue_message">ਜਾਰੀ ਰੱਖੋ</string>
<string name="correct">ਸਹੀ ਜਵਾਬ</string>
<string name="wrong">ਗਲਤ ਜਵਾਬ</string>
<string name="share_app_title">ਐਪ ਸਾਂਝਾ ਕਰੋ</string>
<string name="rotate">ਘੁੰਮਾਓ</string>
<string name="error_fetching_nearby_places">ਨੇੜਲੀਆਂ ਥਾਵਾਂ ਲੋਡ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕੀਆਂ</string>
<string name="no_pictures_in_this_area">ਇਸ ਖੇਤਰ ਵਿੱਚ ਕੋਈ ਤਸਵੀਰਾਂ ਨਹੀਂ ਹਨ।</string>
<string name="no_nearby_places_around">ਆਲੇ-ਦੁਆਲੇ ਕੋਈ ਨੇੜਲੀ ਥਾਂ ਨਹੀਂ ਏ।</string>
<string name="error_fetching_nearby_monuments">ਨੇਡ਼ਲੇ ਸਮਾਰਕਾਂ ਨੂੰ ਲਿਆਉਣ ਵਿੱਚ ਗਲਤੀ।</string>
<string name="no_recent_searches">ਕੋਈ ਤਾਜ਼ਾ ਖੋਜ ਨਹੀਂ</string> <string name="no_recent_searches">ਕੋਈ ਤਾਜ਼ਾ ਖੋਜ ਨਹੀਂ</string>
<string name="delete_recent_searches_dialog">ਕੀ ਤੁਸੀਂ ਯਕੀਨੀ ਤੌਰ ਉੱਤੇ ਆਪਣੇ ਖੋਜ ਇਤਿਹਾਸ ਨੂੰ ਸਾਫ਼ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?</string>
<string name="delete_search_dialog">ਕੀ ਤੁਸੀਂ ਇਸ ਖੋਜ ਨੂੰ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?</string>
<string name="search_history_deleted">ਖੋਜ ਇਤਿਹਾਸ ਮਿਟਾਇਆ ਗਿਆ</string>
<string name="nominate_delete">ਮਿਟਾਉਣ ਲਈ ਨਾਮਜ਼ਦ ਕਰੋ</string>
<string name="delete">ਮਿਟਾਓ</string> <string name="delete">ਮਿਟਾਓ</string>
<string name="Achievements">ਪ੍ਰਾਪਤੀਆਂ</string> <string name="Achievements">ਪ੍ਰਾਪਤੀਆਂ</string>
<string name="Profile">ਪ੍ਰੋਫਾਈਲ</string>
<string name="statistics">ਅੰਕੜੇ</string> <string name="statistics">ਅੰਕੜੇ</string>
<string name="statistics_thanks">ਧੰਨਵਾਦ ਪ੍ਰਾਪਤ ਹੋਏ</string> <string name="statistics_thanks">ਧੰਨਵਾਦ ਪ੍ਰਾਪਤ ਹੋਏ</string>
<string name="statistics_featured">ਵਿਸ਼ੇਸ਼ ਤਸਵੀਰ</string>
<string name="statistics_wikidata_edits">\"ਨੇੜਲੀਆਂ ਥਾਵਾਂ\" ਰਾਹੀਂ ਤਸਵੀਰਾਂ</string>
<string name="level">ਪੱਧਰ %d</string> <string name="level">ਪੱਧਰ %d</string>
<string name="images_uploaded">ਤਸਵੀਰਾਂ ਚੜ੍ਹਾਇਆਂ ਗਈਆਂ</string>
<string name="image_reverts">ਤਸਵੀਰਾਂ ਵਾਪਸ ਨਹੀਂ ਕੀਤੀ ਗਈਆਂ</string>
<string name="images_used_by_wiki">ਵਰਤੀ ਗਈਆਂ ਤਸਵੀਰਾਂ</string>
<string name="achievements_share_message">ਆਪਣੀਆਂ ਪ੍ਰਾਪਤੀਆਂ ਨੂੰ ਆਪਣੇ ਦੋਸਤਾਂ ਨਾਲ ਸਾਂਝਾ ਕਰੋ!</string> <string name="achievements_share_message">ਆਪਣੀਆਂ ਪ੍ਰਾਪਤੀਆਂ ਨੂੰ ਆਪਣੇ ਦੋਸਤਾਂ ਨਾਲ ਸਾਂਝਾ ਕਰੋ!</string>
<string name="achievements_revert_limit_message">ਘੱਟੋ-ਘੱਟ ਲੋੜੀਂਦਾ:</string>
<string name="error_occurred">ਗਲਤੀ ਆਈ!</string>
<string name="contributions_fragment">ਯੋਗਦਾਨ</string>
<string name="nearby_fragment">ਨੇੜੇ-ਤੇੜੇ</string>
<string name="notifications">ਸੂਚਨਾਵਾਂ</string>
<string name="read_notifications">ਸੂਚਨਾਵਾਂ (ਪੜ੍ਹਿਆਂ)</string> <string name="read_notifications">ਸੂਚਨਾਵਾਂ (ਪੜ੍ਹਿਆਂ)</string>
<string name="list_sheet">ਸੂਚੀ</string> <string name="list_sheet">ਸੂਚੀ</string>
<string name="next">ਅੱਗੇ</string> <string name="next">ਅੱਗੇ</string>
<string name="previous">ਪਿਛਲਾ</string> <string name="previous">ਪਿਛਲਾ</string>
<string name="title_page_bookmarks_pictures">ਤਸਵੀਰਾਂ</string>
<string name="title_page_bookmarks_locations">ਟਿਕਾਣਾ</string> <string name="title_page_bookmarks_locations">ਟਿਕਾਣਾ</string>
<string name="title_page_bookmarks_categories">ਸ਼੍ਰੇਣੀਆਂ</string> <string name="title_page_bookmarks_categories">ਸ਼੍ਰੇਣੀਆਂ</string>
<string name="search_this_area">ਇਸ ਖੇਤਰ ਵਿੱਚ ਖੋਜ ਕਰੋ</string>
<string name="nearby_card_permission_title">ਇਜਾਜ਼ਤ ਦੀ ਬੇਨਤੀ</string>
<string name="never_ask_again">ਇਹ ਮੁੜ ਕਦੇ ਨਾ ਪੁੱਛੋ</string>
<string name="display_location_permission_title">ਟਿਕਾਣੇਂ ਦੀ ਆਗਿਆ ਮੰਗੋ</string>
<string name="ends_on">ਨੂੰ ਮਿਆਦ ਪੁਗਦੀ</string> <string name="ends_on">ਨੂੰ ਮਿਆਦ ਪੁਗਦੀ</string>
<string name="display_campaigns">ਮੁਹਿੰਮਾਂ ਵੇਖਾਓ</string> <string name="display_campaigns">ਮੁਹਿੰਮਾਂ ਵੇਖਾਓ</string>
<string name="option_allow">ਇਜਾਜ਼ਤ ਦਿਓ</string> <string name="option_allow">ਇਜਾਜ਼ਤ ਦਿਓ</string>

View file

@ -419,7 +419,7 @@
<string name="provider_bookmarks">Favoritos</string> <string name="provider_bookmarks">Favoritos</string>
<string name="bookmark_empty">Não adicionou nenhum favorito</string> <string name="bookmark_empty">Não adicionou nenhum favorito</string>
<string name="provider_bookmarks_location">Favoritos</string> <string name="provider_bookmarks_location">Favoritos</string>
<string name="log_collection_started">A recolha de registos foi iniciada. REINICIE a aplicação, execute a operação que pretende registar e prima outra vez \"Enviar ficheiro de registos\"</string> <string name="log_collection_started">A coleta de registros foi iniciada. REINICIE o aplicativo, execute a operação que pretende registrar e toque em Enviar arquivo de registros novamente</string>
<string name="deletion_reason_uploaded_by_mistake">Eu fiz o carregamento por engano</string> <string name="deletion_reason_uploaded_by_mistake">Eu fiz o carregamento por engano</string>
<string name="deletion_reason_publicly_visible">Eu não sabia que seria publicamente visível</string> <string name="deletion_reason_publicly_visible">Eu não sabia que seria publicamente visível</string>
<string name="deletion_reason_bad_for_my_privacy">Eu percebi que é ruim para minha privacidade</string> <string name="deletion_reason_bad_for_my_privacy">Eu percebi que é ruim para minha privacidade</string>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Authors: <!-- Authors:
* AguzulH
* Brahim-essaidi * Brahim-essaidi
* Hakim1bal * Hakim1bal
--> -->
@ -79,7 +80,7 @@
<string name="Profile">ⵉⴼⵔⵙ</string> <string name="Profile">ⵉⴼⵔⵙ</string>
<string name="statistics">ⵉⵙⵉⴹⵏⵏ</string> <string name="statistics">ⵉⵙⵉⴹⵏⵏ</string>
<string name="title_app_shortcut_setting">ⵜⵉⵙⵖⴰⵍ</string> <string name="title_app_shortcut_setting">ⵜⵉⵙⵖⴰⵍ</string>
<string name="leaderboard_column_user">ⴰⵏⵙⵎⵔⵙ</string> <string name="leaderboard_column_user">ⴰⵏⵙⵎⵔ</string>
<string name="leaderboard_column_count">ⵙⵙⵉⴹⵏ</string> <string name="leaderboard_column_count">ⵙⵙⵉⴹⵏ</string>
<string name="leaderboard_yearly">ⴰⵙⴳⵯⵙⴰⵏ</string> <string name="leaderboard_yearly">ⴰⵙⴳⵯⵙⴰⵏ</string>
<string name="leaderboard_weekly">ⴰⵏⵎⵍⴰⵙⵙ</string> <string name="leaderboard_weekly">ⴰⵏⵎⵍⴰⵙⵙ</string>

View file

@ -262,15 +262,4 @@ class UploadActivityUnitTests {
method.isAccessible = true method.isAccessible = true
method.invoke(activity) method.invoke(activity)
} }
@Test
@Throws(Exception::class)
fun testOnBackPressed() {
val method: Method =
UploadActivity::class.java.getDeclaredMethod(
"onBackPressed",
)
method.isAccessible = true
method.invoke(activity)
}
} }