Merge branch 'main' into Files-Usages-#6307

This commit is contained in:
Nicolas Raoul 2025-09-02 10:50:06 +09:00 committed by GitHub
commit a63b20d619
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
62 changed files with 840 additions and 164 deletions

View file

@ -1,5 +1,12 @@
# Wikimedia Commons for Android
## v6.0.1
### What's changed
* The app now supports Android 15 with an improved user interface
* Enhanced Nearby with robust and more reliable labels
* Bug fixes and stability improvements
## v5.6.1
### What's changed

View file

@ -18,14 +18,14 @@ if (isRunningOnTravisAndIsNotPRBuild) {
android {
namespace = "fr.free.nrw.commons"
compileSdk = 34
compileSdk = 35
defaultConfig {
applicationId = "fr.free.nrw.commons"
minSdk = 21
targetSdk = 34
versionCode = 1055
versionName = "5.6.1"
targetSdk = 35
versionCode = 1057
versionName = "6.0.1"
setProperty("archivesBaseName", "app-commons-v$versionName-" + getBranchName())
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

View file

@ -19,6 +19,7 @@ import fr.free.nrw.commons.utils.ConfigUtils.getVersionNameWithSha
import fr.free.nrw.commons.utils.DialogUtil.showAlertDialog
import java.util.Collections
import androidx.core.net.toUri
import fr.free.nrw.commons.utils.applyEdgeToEdgeTopInsets
import fr.free.nrw.commons.utils.handleWebUrl
import fr.free.nrw.commons.utils.setUnderlinedText
@ -47,6 +48,7 @@ class AboutActivity : BaseActivity() {
*/
binding = ActivityAboutBinding.inflate(layoutInflater)
val view: View = binding!!.root
applyEdgeToEdgeTopInsets(binding!!.toolbarLayout)
setContentView(view)
setSupportActionBar(binding!!.toolbarBinding.toolbar)

View file

@ -50,7 +50,7 @@ object OkHttpConnectionFactory {
}
}
private class CommonHeaderRequestInterceptor : Interceptor {
class CommonHeaderRequestInterceptor : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request().newBuilder()

View file

@ -9,6 +9,7 @@ import fr.free.nrw.commons.databinding.ActivityWelcomeBinding
import fr.free.nrw.commons.databinding.PopupForCopyrightBinding
import fr.free.nrw.commons.quiz.QuizActivity
import fr.free.nrw.commons.theme.BaseActivity
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
import fr.free.nrw.commons.utils.ConfigUtils.isBetaFlavour
class WelcomeActivity : BaseActivity() {
@ -23,6 +24,7 @@ class WelcomeActivity : BaseActivity() {
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityWelcomeBinding.inflate(layoutInflater)
applyEdgeToEdgeAllInsets(binding!!.welcomePager.rootView)
setContentView(binding!!.root)
isQuiz = intent?.extras?.getBoolean("isQuiz", false) ?: false

View file

@ -22,6 +22,7 @@ import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.app.NavUtils
import androidx.core.content.ContextCompat
import androidx.core.view.WindowCompat
import fr.free.nrw.commons.BuildConfig
import fr.free.nrw.commons.CommonsApplication
import fr.free.nrw.commons.R
@ -32,11 +33,13 @@ import fr.free.nrw.commons.contributions.MainActivity
import fr.free.nrw.commons.databinding.ActivityLoginBinding
import fr.free.nrw.commons.di.ApplicationlessInjection
import fr.free.nrw.commons.kvstore.JsonKvStore
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
import fr.free.nrw.commons.utils.AbstractTextWatcher
import fr.free.nrw.commons.utils.ActivityUtils.startActivityWithFlags
import fr.free.nrw.commons.utils.ConfigUtils.isBetaFlavour
import fr.free.nrw.commons.utils.SystemThemeUtils
import fr.free.nrw.commons.utils.ViewUtil.hideKeyboard
import fr.free.nrw.commons.utils.handleKeyboardInsets
import fr.free.nrw.commons.utils.handleWebUrl
import io.reactivex.disposables.CompositeDisposable
import timber.log.Timber
@ -79,7 +82,14 @@ class LoginActivity : AccountAuthenticatorActivity() {
delegate.installViewFactory()
delegate.onCreate(savedInstanceState)
WindowCompat.getInsetsController(window, window.decorView)
.isAppearanceLightStatusBars = !isDarkTheme
WindowCompat.setDecorFitsSystemWindows(window, false)
binding = ActivityLoginBinding.inflate(layoutInflater)
applyEdgeToEdgeAllInsets(binding!!.root)
binding?.aboutPrivacyPolicy?.handleKeyboardInsets()
with(binding!!) {
setContentView(root)

View file

@ -10,6 +10,7 @@ import android.widget.Toast
import fr.free.nrw.commons.BuildConfig
import fr.free.nrw.commons.R
import fr.free.nrw.commons.theme.BaseActivity
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
import timber.log.Timber
class SignupActivity : BaseActivity() {
@ -21,6 +22,7 @@ class SignupActivity : BaseActivity() {
Timber.d("Signup Activity started")
webView = WebView(this)
applyEdgeToEdgeAllInsets(webView!!)
with(webView!!) {
setContentView(this)
webViewClient = MyWebViewClient()

View file

@ -36,7 +36,7 @@ class BookmarkItemsContentProvider : CommonsDaggerContentProvider() {
requireDb(), projection, selection,
selectionArgs, null, null, sortOrder
).apply {
setNotificationUri(requireContext().contentResolver, uri)
setNotificationUri(context?.contentResolver, uri)
}
}
@ -66,7 +66,7 @@ class BookmarkItemsContentProvider : CommonsDaggerContentProvider() {
)
}
requireContext().contentResolver.notifyChange(uri, null)
context?.contentResolver?.notifyChange(uri, null)
return rowsUpdated
}
@ -75,7 +75,7 @@ class BookmarkItemsContentProvider : CommonsDaggerContentProvider() {
*/
override fun insert(uri: Uri, contentValues: ContentValues?): Uri? {
val id = requireDb().insert(TABLE_NAME, null, contentValues)
requireContext().contentResolver.notifyChange(uri, null)
context?.contentResolver?.notifyChange(uri, null)
return "$BASE_URI/$id".toUri()
}
@ -89,7 +89,7 @@ class BookmarkItemsContentProvider : CommonsDaggerContentProvider() {
"$COLUMN_ID = ?",
arrayOf(uri.lastPathSegment)
)
requireContext().contentResolver.notifyChange(uri, null)
context?.contentResolver?.notifyChange(uri, null)
return rows
}

View file

@ -36,7 +36,7 @@ class BookmarkPicturesContentProvider : CommonsDaggerContentProvider() {
requireDb(), projection, selection,
selectionArgs, null, null, sortOrder
)
cursor.setNotificationUri(requireContext().contentResolver, uri)
cursor.setNotificationUri(context?.contentResolver, uri)
return cursor
}
@ -66,7 +66,7 @@ class BookmarkPicturesContentProvider : CommonsDaggerContentProvider() {
"Parameter `selection` should be empty when updating an ID"
)
}
requireContext().contentResolver.notifyChange(uri, null)
context?.contentResolver?.notifyChange(uri, null)
return rowsUpdated
}
@ -75,7 +75,7 @@ class BookmarkPicturesContentProvider : CommonsDaggerContentProvider() {
*/
override fun insert(uri: Uri, contentValues: ContentValues?): Uri {
val id = requireDb().insert(TABLE_NAME, null, contentValues)
requireContext().contentResolver.notifyChange(uri, null)
context?.contentResolver?.notifyChange(uri, null)
return "$BASE_URI/$id".toUri()
}
@ -85,7 +85,7 @@ class BookmarkPicturesContentProvider : CommonsDaggerContentProvider() {
"media_name = ?",
arrayOf(uri.lastPathSegment)
)
requireContext().contentResolver.notifyChange(uri, null)
context?.contentResolver?.notifyChange(uri, null)
return rows
}

View file

@ -23,6 +23,7 @@ import fr.free.nrw.commons.explore.categories.sub.SubCategoriesFragment
import fr.free.nrw.commons.media.MediaDetailPagerFragment
import fr.free.nrw.commons.media.MediaDetailProvider
import fr.free.nrw.commons.theme.BaseActivity
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
import fr.free.nrw.commons.utils.handleWebUrl
import fr.free.nrw.commons.wikidata.model.WikiSite
import fr.free.nrw.commons.wikidata.model.page.PageTitle
@ -57,6 +58,7 @@ class CategoryDetailsActivity : BaseActivity(),
binding = ActivityCategoryDetailsBinding.inflate(layoutInflater)
val view = binding.root
applyEdgeToEdgeAllInsets(view)
setContentView(view)
supportFragmentManager = getSupportFragmentManager()
viewPagerAdapter = ViewPagerAdapter(this, supportFragmentManager)

View file

@ -34,6 +34,7 @@ import fr.free.nrw.commons.quiz.QuizChecker
import fr.free.nrw.commons.settings.SettingsFragment
import fr.free.nrw.commons.startWelcome
import fr.free.nrw.commons.theme.BaseActivity
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
import fr.free.nrw.commons.upload.UploadProgressActivity
import fr.free.nrw.commons.upload.worker.WorkRequestHelper.Companion.makeOneTimeWorkRequest
import fr.free.nrw.commons.utils.ViewUtilWrapper
@ -112,6 +113,7 @@ class MainActivity : BaseActivity(), FragmentManager.OnBackStackChangedListener
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = MainBinding.inflate(layoutInflater)
applyEdgeToEdgeAllInsets(binding!!.root)
setContentView(binding!!.root)
setSupportActionBar(binding!!.toolbarBinding.toolbar)
tabLayout = binding!!.fragmentMainNavTabLayout

View file

@ -40,6 +40,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import androidx.core.view.ViewGroupCompat
import androidx.lifecycle.ViewModelProvider
import fr.free.nrw.commons.R
import fr.free.nrw.commons.customselector.database.NotForUploadStatus
@ -56,6 +57,8 @@ import fr.free.nrw.commons.media.ZoomableActivity
import fr.free.nrw.commons.theme.BaseActivity
import fr.free.nrw.commons.upload.FileUtilsWrapper
import fr.free.nrw.commons.utils.CustomSelectorUtils
import fr.free.nrw.commons.utils.applyEdgeToEdgeBottomPaddingInsets
import fr.free.nrw.commons.utils.applyEdgeToEdgeTopInsets
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@ -198,6 +201,9 @@ class CustomSelectorActivity :
.fillMaxWidth(),
)
}
ViewGroupCompat.installCompatInsetsDispatch(binding.root)
applyEdgeToEdgeTopInsets(toolbarBinding.toolbarLayout)
bottomSheetBinding.bottomLayout.applyEdgeToEdgeBottomPaddingInsets()
val view = binding.root
setContentView(view)

View file

@ -18,6 +18,7 @@ import fr.free.nrw.commons.databinding.FragmentCustomSelectorBinding
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment
import fr.free.nrw.commons.media.MediaClient
import fr.free.nrw.commons.upload.FileProcessor
import fr.free.nrw.commons.utils.applyEdgeToEdgeBottomPaddingInsets
import javax.inject.Inject
/**
@ -99,6 +100,7 @@ class FolderFragment : CommonsDaggerSupportFragment() {
selectorRV = binding?.selectorRv
loader = binding?.loader
with(binding?.selectorRv) {
this?.applyEdgeToEdgeBottomPaddingInsets()
this?.layoutManager = gridLayoutManager
this?.setHasFixedSize(true)
this?.adapter = folderAdapter

View file

@ -41,6 +41,7 @@ import fr.free.nrw.commons.media.MediaClient
import fr.free.nrw.commons.theme.BaseActivity
import fr.free.nrw.commons.upload.FileProcessor
import fr.free.nrw.commons.upload.FileUtilsWrapper
import fr.free.nrw.commons.utils.applyEdgeToEdgeBottomPaddingInsets
import io.reactivex.schedulers.Schedulers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
@ -217,6 +218,7 @@ class ImageFragment :
imageAdapter.setSingleSelection(singleSelection)
gridLayoutManager = GridLayoutManager(context, getSpanCount())
with(binding?.selectorRv) {
this?.applyEdgeToEdgeBottomPaddingInsets()
this?.layoutManager = gridLayoutManager
this?.setHasFixedSize(true)
this?.adapter = imageAdapter

View file

@ -7,6 +7,7 @@ import android.speech.RecognizerIntent
import android.view.View
import androidx.activity.result.ActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.view.WindowCompat
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import fr.free.nrw.commons.CommonsApplication
@ -20,9 +21,11 @@ import fr.free.nrw.commons.description.EditDescriptionConstants.WIKITEXT
import fr.free.nrw.commons.recentlanguages.RecentLanguagesDao
import fr.free.nrw.commons.settings.Prefs
import fr.free.nrw.commons.theme.BaseActivity
import fr.free.nrw.commons.utils.applyEdgeToEdgeBottomInsets
import fr.free.nrw.commons.upload.UploadMediaDetail
import fr.free.nrw.commons.upload.UploadMediaDetailAdapter
import fr.free.nrw.commons.utils.DialogUtil.showAlertDialog
import fr.free.nrw.commons.utils.applyEdgeToEdgeTopPaddingInsets
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.Consumer
import io.reactivex.schedulers.Schedulers
@ -87,6 +90,10 @@ class DescriptionEditActivity :
super.onCreate(savedInstanceState)
binding = ActivityDescriptionEditBinding.inflate(layoutInflater)
applyEdgeToEdgeBottomInsets(binding.btnEditSubmit)
WindowCompat.getInsetsController(window, window.decorView)
.isAppearanceLightStatusBars = false
binding.toolbar.applyEdgeToEdgeTopPaddingInsets()
setContentView(binding.root)
val bundle = intent.extras

View file

@ -7,6 +7,7 @@ import dagger.Provides
import fr.free.nrw.commons.BetaConstants
import fr.free.nrw.commons.BuildConfig
import fr.free.nrw.commons.OkHttpConnectionFactory
import fr.free.nrw.commons.CommonHeaderRequestInterceptor
import fr.free.nrw.commons.actions.PageEditClient
import fr.free.nrw.commons.actions.PageEditInterface
import fr.free.nrw.commons.actions.ThanksInterface
@ -60,6 +61,7 @@ class NetworkingModule {
.connectTimeout(120, TimeUnit.SECONDS)
.writeTimeout(120, TimeUnit.SECONDS)
.addInterceptor(httpLoggingInterceptor)
.addInterceptor(CommonHeaderRequestInterceptor())
.readTimeout(120, TimeUnit.SECONDS)
.cache(Cache(File(context.cacheDir, "okHttpCache"), OK_HTTP_CACHE_SIZE))
.build()

View file

@ -22,6 +22,7 @@ import fr.free.nrw.commons.media.MediaDetailProvider
import fr.free.nrw.commons.theme.BaseActivity
import fr.free.nrw.commons.utils.FragmentUtils.isFragmentUIActive
import fr.free.nrw.commons.utils.ViewUtil.hideKeyboard
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
import io.reactivex.android.schedulers.AndroidSchedulers
import timber.log.Timber
import java.util.Date
@ -48,6 +49,7 @@ class SearchActivity : BaseActivity(), MediaDetailProvider, CategoryImagesCallba
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySearchBinding.inflate(layoutInflater)
applyEdgeToEdgeAllInsets(binding!!.root)
setContentView(binding!!.root)
title = getString(R.string.title_activity_search)

View file

@ -24,6 +24,7 @@ import fr.free.nrw.commons.media.MediaDetailProvider
import fr.free.nrw.commons.theme.BaseActivity
import fr.free.nrw.commons.upload.structure.depictions.DepictModel
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
import fr.free.nrw.commons.utils.handleWebUrl
import fr.free.nrw.commons.wikidata.WikidataConstants
import io.reactivex.android.schedulers.AndroidSchedulers
@ -55,6 +56,7 @@ class WikidataItemDetailsActivity : BaseActivity(), MediaDetailProvider, Categor
super.onCreate(savedInstanceState)
binding = ActivityWikidataItemDetailsBinding.inflate(layoutInflater)
applyEdgeToEdgeAllInsets(binding!!.root)
setContentView(binding!!.root)
supportFragmentManager = getSupportFragmentManager()
viewPagerAdapter = ViewPagerAdapter(this, getSupportFragmentManager())

View file

@ -50,7 +50,7 @@ class RecentSearchesContentProvider : CommonsDaggerContentProvider() {
else -> throw IllegalArgumentException("Unknown URI$uri")
}
cursor.setNotificationUri(requireContext().contentResolver, uri)
cursor.setNotificationUri(context?.contentResolver, uri)
return cursor
}
@ -67,7 +67,7 @@ class RecentSearchesContentProvider : CommonsDaggerContentProvider() {
else -> throw IllegalArgumentException("Unknown URI: $uri")
}
requireContext().contentResolver.notifyChange(uri, null)
context?.contentResolver?.notifyChange(uri, null)
return "$BASE_URI/$id".toUri()
}
@ -88,7 +88,7 @@ class RecentSearchesContentProvider : CommonsDaggerContentProvider() {
else -> throw IllegalArgumentException("Unknown URI - $uri")
}
requireContext().contentResolver.notifyChange(uri, null)
context?.contentResolver?.notifyChange(uri, null)
return rows
}
@ -108,7 +108,7 @@ class RecentSearchesContentProvider : CommonsDaggerContentProvider() {
}
sqlDB.setTransactionSuccessful()
sqlDB.endTransaction()
requireContext().contentResolver.notifyChange(uri, null)
context?.contentResolver?.notifyChange(uri, null)
return values.size
}
@ -147,7 +147,7 @@ class RecentSearchesContentProvider : CommonsDaggerContentProvider() {
else -> throw IllegalArgumentException("Unknown URI: $uri with type $uriType")
}
requireContext().contentResolver.notifyChange(uri, null)
context?.contentResolver?.notifyChange(uri, null)
return rowsUpdated
}

View file

@ -296,12 +296,21 @@ object FilePicker : Constants {
* https://github.com/commons-app/apps-android-commons/issues/6357
*/
private fun takePersistableUriPermissions(context: Context, result: ActivityResult) {
result.data?.data?.also { uri ->
val takeFlags: Int = (Intent.FLAG_GRANT_READ_URI_PERMISSION
or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
result.data?.let { intentData ->
val takeFlags: Int = (Intent.FLAG_GRANT_READ_URI_PERMISSION)
// Persist the URI permission for all URIs in the clip data
// if multiple images are selected,
// or for the single URI if only one image is selected
intentData.clipData?.let { clipData ->
for (i in 0 until clipData.itemCount) {
context.contentResolver.takePersistableUriPermission(
clipData.getItemAt(i).uri, takeFlags)
}
} ?: intentData.data?.let { uri ->
context.contentResolver.takePersistableUriPermission(uri, takeFlags)
}
}
}
/**
* onPictureReturnedFromCustomSelector.
@ -358,6 +367,7 @@ object FilePicker : Constants {
callbacks: Callbacks
) {
if (result.resultCode == Activity.RESULT_OK && !isPhoto(result.data)) {
takePersistableUriPermissions(activity, result)
try {
val files = getFilesFromGalleryPictures(result.data, activity)
callbacks.onImagesPicked(files, ImageSource.GALLERY, restoreType(activity))

View file

@ -25,6 +25,7 @@ import androidx.core.content.ContextCompat
import androidx.core.content.IntentCompat
import androidx.core.os.BundleCompat
import androidx.core.text.HtmlCompat
import androidx.core.view.WindowCompat
import com.google.android.material.floatingactionbutton.FloatingActionButton
import fr.free.nrw.commons.CameraPosition
import fr.free.nrw.commons.CommonsApplication
@ -44,6 +45,8 @@ import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.Compani
import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.Companion.LAST_ZOOM
import fr.free.nrw.commons.utils.DialogUtil
import fr.free.nrw.commons.utils.MapUtils.ZOOM_LEVEL
import fr.free.nrw.commons.utils.applyEdgeToEdgeBottomInsets
import fr.free.nrw.commons.utils.applyEdgeToEdgeTopPaddingInsets
import fr.free.nrw.commons.utils.handleGeoCoordinates
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
@ -330,6 +333,9 @@ class LocationPickerActivity : BaseActivity(), LocationPermissionCallback {
*/
private fun getToolbarUI() {
val toolbar: ConstraintLayout = findViewById(R.id.location_picker_toolbar)
WindowCompat.getInsetsController(window, window.decorView)
.isAppearanceLightStatusBars = false
toolbar.applyEdgeToEdgeTopPaddingInsets()
largeToolbarText = findViewById(R.id.location_picker_toolbar_primary_text_view)
smallToolbarText = findViewById(R.id.location_picker_toolbar_secondary_text_view)
toolbar.setBackgroundColor(ContextCompat.getColor(this, R.color.primaryColor))
@ -460,6 +466,7 @@ class LocationPickerActivity : BaseActivity(), LocationPermissionCallback {
*/
private fun addPlaceSelectedButton() {
placeSelectedButton = findViewById(R.id.location_chosen_button)
applyEdgeToEdgeBottomInsets(placeSelectedButton)
placeSelectedButton.setOnClickListener { placeSelected() }
}

View file

@ -7,7 +7,8 @@ class NearbyResultItem(
private val wikipediaArticle: ResultTuple?,
private val commonsArticle: ResultTuple?,
private val location: ResultTuple?,
private val label: ResultTuple?,
@field:SerializedName("label") private val label: ResultTuple?,
@field:SerializedName("itemLabel") private val itemLabel: ResultTuple?,
@field:SerializedName("streetAddress") private val address: ResultTuple?,
private val icon: ResultTuple?,
@field:SerializedName("class") private val className: ResultTuple?,
@ -29,7 +30,15 @@ class NearbyResultItem(
fun getLocation(): ResultTuple = location ?: ResultTuple()
fun getLabel(): ResultTuple = label ?: ResultTuple()
/**
* Returns label for display (pins, popup), using fallback to itemLabel if needed.
*/
fun getLabel(): ResultTuple = label ?: itemLabel ?: ResultTuple()
/**
* Returns only the original label field, for Wikidata edits.
*/
fun getOriginalLabel(): ResultTuple = label ?: ResultTuple()
fun getIcon(): ResultTuple = icon ?: ResultTuple()

View file

@ -8,6 +8,7 @@ import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.view.View
import androidx.core.view.ViewGroupCompat
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.Snackbar
@ -19,8 +20,10 @@ import fr.free.nrw.commons.databinding.ActivityNotificationBinding
import fr.free.nrw.commons.notification.models.Notification
import fr.free.nrw.commons.notification.models.NotificationType
import fr.free.nrw.commons.theme.BaseActivity
import fr.free.nrw.commons.utils.applyEdgeToEdgeTopInsets
import fr.free.nrw.commons.utils.NetworkUtils
import fr.free.nrw.commons.utils.ViewUtil
import fr.free.nrw.commons.utils.applyEdgeToEdgeBottomPaddingInsets
import fr.free.nrw.commons.utils.handleWebUrl
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
@ -56,6 +59,9 @@ class NotificationActivity : BaseActivity() {
super.onCreate(savedInstanceState)
isRead = intent.getStringExtra("title") == "read"
binding = ActivityNotificationBinding.inflate(layoutInflater)
ViewGroupCompat.installCompatInsetsDispatch(binding.root)
applyEdgeToEdgeTopInsets(binding.toolbar.toolbar)
binding.listView.applyEdgeToEdgeBottomPaddingInsets()
setContentView(binding.root)
mNotificationWorkerFragment = supportFragmentManager.findFragmentByTag(
tagNotificationWorkerFragment

View file

@ -21,6 +21,7 @@ import fr.free.nrw.commons.databinding.ActivityProfileBinding
import fr.free.nrw.commons.profile.achievements.AchievementsFragment
import fr.free.nrw.commons.profile.leaderboard.LeaderboardFragment
import fr.free.nrw.commons.theme.BaseActivity
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
import fr.free.nrw.commons.utils.DialogUtil
import java.io.File
import java.io.FileOutputStream
@ -61,6 +62,7 @@ class ProfileActivity : BaseActivity() {
super.onCreate(savedInstanceState)
binding = ActivityProfileBinding.inflate(layoutInflater)
applyEdgeToEdgeAllInsets(binding.root)
setContentView(binding.root)
setSupportActionBar(binding.toolbarBinding.toolbar)

View file

@ -311,7 +311,7 @@ class LeaderboardFragment : CommonsDaggerSupportFragment() {
}
private class SelectionListener(private val handler: () -> Unit): AdapterView.OnItemSelectedListener {
override fun onItemSelected(adapterView: AdapterView<*>?, view: View, i: Int, l: Long) =
override fun onItemSelected(adapterView: AdapterView<*>?, view: View?, i: Int, l: Long) =
handler()
override fun onNothingSelected(p0: AdapterView<*>?) = Unit

View file

@ -3,9 +3,11 @@ package fr.free.nrw.commons.quiz
import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.WindowCompat
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
import com.facebook.drawee.drawable.ProgressBarDrawable
@ -15,6 +17,7 @@ import fr.free.nrw.commons.databinding.ActivityQuizBinding
import java.util.ArrayList
import fr.free.nrw.commons.R
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
class QuizActivity : AppCompatActivity() {
@ -37,7 +40,11 @@ class QuizActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityQuizBinding.inflate(layoutInflater)
applyEdgeToEdgeAllInsets(binding.root)
WindowCompat.getInsetsController(window, window.decorView)
.isAppearanceLightStatusBars = true
setContentView(binding.root)
quizController.initialize(this)

View file

@ -12,9 +12,11 @@ import android.view.MenuItem
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.WindowCompat
import fr.free.nrw.commons.databinding.ActivityQuizResultBinding
import java.io.File
@ -22,6 +24,7 @@ import java.io.FileOutputStream
import fr.free.nrw.commons.R
import fr.free.nrw.commons.contributions.MainActivity
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
/**
@ -35,7 +38,11 @@ class QuizResultActivity : AppCompatActivity() {
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityQuizResultBinding.inflate(layoutInflater)
applyEdgeToEdgeAllInsets(binding!!.root)
WindowCompat.getInsetsController(window, window.decorView)
.isAppearanceLightStatusBars = true
setContentView(binding?.root)
setSupportActionBar(binding?.toolbar?.toolbar)

View file

@ -59,7 +59,7 @@ class RecentLanguagesContentProvider : CommonsDaggerContentProvider() {
null,
sortOrder
)
cursor.setNotificationUri(requireContext().contentResolver, uri)
cursor.setNotificationUri(context?.contentResolver, uri)
return cursor
}
@ -90,7 +90,7 @@ class RecentLanguagesContentProvider : CommonsDaggerContentProvider() {
throw IllegalArgumentException("Parameter `selection` should be empty when updating an ID")
}
requireContext().contentResolver?.notifyChange(uri, null)
context?.contentResolver?.notifyChange(uri, null)
return rowsUpdated
}
@ -105,7 +105,7 @@ class RecentLanguagesContentProvider : CommonsDaggerContentProvider() {
null,
contentValues
)
requireContext().contentResolver?.notifyChange(uri, null)
context?.contentResolver?.notifyChange(uri, null)
return "$BASE_URI/$id".toUri()
}
@ -119,7 +119,7 @@ class RecentLanguagesContentProvider : CommonsDaggerContentProvider() {
"language_code = ?",
arrayOf(uri.lastPathSegment)
)
requireContext().contentResolver?.notifyChange(uri, null)
context?.contentResolver?.notifyChange(uri, null)
return rows
}
}

View file

@ -16,6 +16,7 @@ import fr.free.nrw.commons.databinding.ActivityReviewBinding
import fr.free.nrw.commons.delete.DeleteHelper
import fr.free.nrw.commons.media.MediaDetailFragment
import fr.free.nrw.commons.theme.BaseActivity
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
import fr.free.nrw.commons.utils.DialogUtil
import fr.free.nrw.commons.utils.ViewUtil
import io.reactivex.android.schedulers.AndroidSchedulers
@ -73,6 +74,7 @@ class ReviewActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityReviewBinding.inflate(layoutInflater)
applyEdgeToEdgeAllInsets(binding.root)
setContentView(binding.root)
setSupportActionBar(binding.toolbarBinding?.toolbar)

View file

@ -4,6 +4,7 @@ import android.os.Bundle
import android.view.MenuItem
import fr.free.nrw.commons.databinding.ActivitySettingsBinding
import fr.free.nrw.commons.theme.BaseActivity
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
/**
@ -21,6 +22,7 @@ class SettingsActivity : BaseActivity() {
super.onCreate(savedInstanceState)
binding = ActivitySettingsBinding.inflate(layoutInflater)
val view = binding.root
applyEdgeToEdgeAllInsets(view)
setContentView(view)
setSupportActionBar(binding.toolbarBinding.toolbar)

View file

@ -4,6 +4,7 @@ import android.content.res.Configuration
import android.os.Bundle
import android.util.DisplayMetrics
import android.view.WindowManager
import androidx.activity.enableEdgeToEdge
import javax.inject.Inject
import javax.inject.Named
import fr.free.nrw.commons.R
@ -36,6 +37,7 @@ abstract class BaseActivity : CommonsDaggerAppCompatActivity() {
1f
)
adjustFontScale(resources.configuration, fontScale)
enableEdgeToEdge()
}
override fun onResume() {

View file

@ -38,6 +38,7 @@ import fr.free.nrw.commons.mwapi.UserClient
import fr.free.nrw.commons.nearby.Place
import fr.free.nrw.commons.settings.Prefs
import fr.free.nrw.commons.theme.BaseActivity
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
import fr.free.nrw.commons.upload.ThumbnailsAdapter.OnThumbnailDeletedListener
import fr.free.nrw.commons.upload.categories.UploadCategoriesFragment
import fr.free.nrw.commons.upload.depicts.DepictsFragment
@ -177,6 +178,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
presenter?.setupBasicKvStoreFactory { BasicKvStore(this@UploadActivity, it) }
_binding = ActivityUploadBinding.inflate(layoutInflater)
applyEdgeToEdgeAllInsets(_binding!!.root, false)
setContentView(binding.root)
// Overrides the back button to make sure the user is prepared to lose their progress

View file

@ -10,6 +10,7 @@ import fr.free.nrw.commons.ViewPagerAdapter
import fr.free.nrw.commons.contributions.ContributionDao
import fr.free.nrw.commons.databinding.ActivityUploadProgressBinding
import fr.free.nrw.commons.theme.BaseActivity
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
import javax.inject.Inject
/**
@ -35,6 +36,7 @@ class UploadProgressActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityUploadProgressBinding.inflate(layoutInflater)
applyEdgeToEdgeAllInsets(binding.root)
setContentView(binding.root)
viewPagerAdapter = ViewPagerAdapter(this, supportFragmentManager)
binding.uploadProgressViewPager.setAdapter(viewPagerAdapter)

View file

@ -50,6 +50,7 @@ import fr.free.nrw.commons.utils.ImageUtils.IMAGE_OK
import fr.free.nrw.commons.utils.ImageUtils.getErrorMessageForResult
import fr.free.nrw.commons.utils.NetworkUtils.isInternetConnectionEstablished
import fr.free.nrw.commons.utils.ViewUtil.showLongToast
import fr.free.nrw.commons.utils.handleKeyboardInsets
import timber.log.Timber
import java.io.File
import java.util.ArrayList
@ -153,6 +154,7 @@ class UploadMediaDetailFragment : UploadBaseFragment(), UploadMediaDetailsContra
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View {
_binding = FragmentUploadMediaDetailFragmentBinding.inflate(inflater, container, false)
_binding!!.mediaDetailCardView.handleKeyboardInsets()
return binding.root
}
@ -821,6 +823,7 @@ class UploadMediaDetailFragment : UploadBaseFragment(), UploadMediaDetailsContra
{
showProgress(false)
uploadItem.imageQuality = IMAGE_OK
uploadItem.hasInvalidLocation = false // Reset invalid location flag when user confirms upload
},
{
presenterCallback!!.deletePictureAtIndex(index)

View file

@ -393,6 +393,12 @@ class UploadWorker(
makeWikiDataEdit(uploadResult, contribution)
}
showSuccessNotification(contribution)
if (appContext.contentResolver.persistedUriPermissions.any {
it.uri == contribution.contentUri }) {
appContext.contentResolver.releasePersistableUriPermission(
contribution.contentUri!!, Intent.FLAG_GRANT_READ_URI_PERMISSION
)
}
} else {
Timber.e("Stash Upload failed")
showFailedNotification(contribution)

View file

@ -12,9 +12,9 @@ object ConfigUtils {
val isBetaFlavour: Boolean = BuildConfig.FLAVOR == "beta"
@JvmStatic
private fun Context.getVersionName(): String =
private fun Context.getVersionName(): String? =
try {
packageManager.getPackageInfo(packageName, 0).versionName
packageManager.getPackageInfo(packageName, 0).versionName ?: BuildConfig.VERSION_NAME
} catch (e: PackageManager.NameNotFoundException) {
BuildConfig.VERSION_NAME
}

View file

@ -0,0 +1,229 @@
package fr.free.nrw.commons.utils
import android.view.View
import android.view.ViewGroup.MarginLayoutParams
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsAnimationCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.marginBottom
import androidx.core.view.marginLeft
import androidx.core.view.marginRight
import androidx.core.view.marginTop
import androidx.core.view.updateLayoutParams
import androidx.core.view.updatePadding
import fr.free.nrw.commons.R
/**
* Applies edge-to-edge system bar insets to a [View]s margins using a custom adjustment block.
*
* Stores the initial margins to ensure inset calculations are additive, and applies the provided
* [block] with an [InsetsAccumulator] containing initial and system bar inset values.
*
* @param typeMask The type of window insets to apply. Defaults to [WindowInsetsCompat.Type.systemBars].
* @param shouldConsumeInsets If `true`, the insets are consumed and not propagated to child views.
* @param block Lambda applied to update [MarginLayoutParams] using the accumulated insets.
*/
fun View.applyEdgeToEdgeInsets(
typeMask: Int = WindowInsetsCompat.Type.systemBars(),
shouldConsumeInsets: Boolean = true,
block: MarginLayoutParams.(InsetsAccumulator) -> Unit
) {
ViewCompat.setOnApplyWindowInsetsListener(this) { view, windowInsets ->
val insets = windowInsets.getInsets(typeMask)
val initialTop = if (view.getTag(R.id.initial_margin_top) != null) {
view.getTag(R.id.initial_margin_top) as Int
} else {
view.setTag(R.id.initial_margin_top, view.marginTop)
view.marginTop
}
val initialBottom = if (view.getTag(R.id.initial_margin_bottom) != null) {
view.getTag(R.id.initial_margin_bottom) as Int
} else {
view.setTag(R.id.initial_margin_bottom, view.marginBottom)
view.marginBottom
}
val initialLeft = if (view.getTag(R.id.initial_margin_left) != null) {
view.getTag(R.id.initial_margin_left) as Int
} else {
view.setTag(R.id.initial_margin_left, view.marginLeft)
view.marginLeft
}
val initialRight = if (view.getTag(R.id.initial_margin_right) != null) {
view.getTag(R.id.initial_margin_right) as Int
} else {
view.setTag(R.id.initial_margin_right, view.marginRight)
view.marginRight
}
val accumulator = InsetsAccumulator(
initialTop,
insets.top,
initialBottom,
insets.bottom,
initialLeft,
insets.left,
initialRight,
insets.right
)
view.updateLayoutParams<MarginLayoutParams> {
apply { block(accumulator) }
}
if(shouldConsumeInsets) WindowInsetsCompat.CONSUMED else windowInsets
}
}
/**
* Applies edge-to-edge system bar insets to the top padding of the view.
*
* @param typeMask The type of window insets to apply. Defaults to [WindowInsetsCompat.Type.systemBars].
*/
fun View.applyEdgeToEdgeTopPaddingInsets(
typeMask: Int = WindowInsetsCompat.Type.systemBars(),
) {
ViewCompat.setOnApplyWindowInsetsListener(this) { view, windowInsets ->
val insets = windowInsets.getInsets(typeMask)
view.updatePadding(
left = insets.left,
right = insets.right,
top = insets.top
)
WindowInsetsCompat.CONSUMED
}
}
/**
* Applies edge-to-edge system bar insets to the bottom padding of the view.
*
* @param typeMask The type of window insets to apply. Defaults to [WindowInsetsCompat.Type.systemBars].
*/
fun View.applyEdgeToEdgeBottomPaddingInsets(
typeMask: Int = WindowInsetsCompat.Type.systemBars(),
) {
ViewCompat.setOnApplyWindowInsetsListener(this) { view, windowInsets ->
val insets = windowInsets.getInsets(typeMask)
view.updatePadding(
left = insets.left,
right = insets.right,
bottom = insets.bottom
)
WindowInsetsCompat.CONSUMED
}
}
/**
* Applies system bar insets to all margins (top, bottom, left, right) of the view.
*
* @param view The target view.
* @param shouldConsumeInsets If `true`, the insets are consumed and not propagated to child views.
*/
fun applyEdgeToEdgeAllInsets(
view: View,
shouldConsumeInsets: Boolean = true
) = view.applyEdgeToEdgeInsets(shouldConsumeInsets = shouldConsumeInsets) { insets ->
leftMargin = insets.left
rightMargin = insets.right
topMargin = insets.top
bottomMargin = insets.bottom
}
/**
* Applies system bar insets to the top and horizontal margins of the view.
*
* @param view The target view.
*/
fun applyEdgeToEdgeTopInsets(view: View) = view.applyEdgeToEdgeInsets { insets ->
leftMargin = insets.left
rightMargin = insets.right
topMargin = insets.top
}
/**
* Applies system bar insets to the bottom and horizontal margins of the view.
*
* @param view The target view.
*/
fun applyEdgeToEdgeBottomInsets(view: View) = view.applyEdgeToEdgeInsets { insets ->
leftMargin = insets.left
rightMargin = insets.right
bottomMargin = insets.bottom
}
/**
* Adjusts a [View]'s bottom margin dynamically to account for the on-screen keyboard (IME),
* ensuring the view remains visible above the keyboard during transitions.
*
* Preserves the initial margin, adjusts during IME visibility changes,
* and accounts for navigation bar insets to avoid double offsets.
*/
fun View.handleKeyboardInsets() {
var existingBottomMargin = 0
ViewCompat.setOnApplyWindowInsetsListener(this) { view, windowInsets ->
existingBottomMargin = if (view.getTag(R.id.initial_margin_bottom) != null) {
view.getTag(R.id.initial_margin_bottom) as Int
} else {
view.setTag(R.id.initial_margin_bottom, view.marginBottom)
view.marginBottom
}
WindowInsetsCompat.CONSUMED
}
// Animate during IME transition
ViewCompat.setWindowInsetsAnimationCallback(
this,
object : WindowInsetsAnimationCompat.Callback(
DISPATCH_MODE_CONTINUE_ON_SUBTREE
) {
override fun onProgress(
insets: WindowInsetsCompat,
runningAnimations: MutableList<WindowInsetsAnimationCompat>
): WindowInsetsCompat {
val lp = layoutParams as MarginLayoutParams
val navBarInsets = insets.getInsets(WindowInsetsCompat.Type.navigationBars())
val imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime())
val imeVisible = insets.isVisible(WindowInsetsCompat.Type.ime())
// Avoid extra space due to system nav bar when the keyboard is shown
val imeBottomMargin = imeInsets.bottom - navBarInsets.bottom
lp.bottomMargin = if(imeVisible && imeBottomMargin >= existingBottomMargin)
imeBottomMargin + existingBottomMargin
else existingBottomMargin
layoutParams = lp
return WindowInsetsCompat.CONSUMED
}
}
)
}
/**
* Holds both initial margin values and system bar insets, providing summed values
* for each side (top, bottom, left, right) to apply in layout updates.
*/
data class InsetsAccumulator(
private val initialTop: Int,
private val insetTop: Int,
private val initialBottom: Int,
private val insetBottom: Int,
private val initialLeft: Int,
private val insetLeft: Int,
private val initialRight: Int,
private val insetRight: Int
) {
val top = initialTop + insetTop
val bottom = initialBottom + insetBottom
val left = initialLeft + insetLeft
val right = initialRight + insetRight
}

View file

@ -24,6 +24,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.schedulers.Schedulers
import timber.log.Timber
import androidx.core.graphics.createBitmap
/**
* Created by blueSir9 on 3/10/17.
@ -307,17 +308,20 @@ object ImageUtils {
* * @return
*/
@JvmStatic
fun addRedBorder(bitmap: Bitmap, borderSize: Int, context: Context): Bitmap {
val bmpWithBorder = Bitmap.createBitmap(
bitmap.width + borderSize * 2,
bitmap.height + borderSize * 2,
bitmap.config
fun addRedBorder(bitmap: Bitmap, borderSize: Int, context: Context): Bitmap? {
return bitmap.config?.let { config ->
val bmpWithBorder =
createBitmap(
width = bitmap.width + borderSize * 2,
height = bitmap.height + borderSize * 2,
config = config
)
val canvas = Canvas(bmpWithBorder)
canvas.drawColor(ContextCompat.getColor(context, R.color.deleteRed))
canvas.drawBitmap(bitmap, borderSize.toFloat(), borderSize.toFloat(), null)
return bmpWithBorder
}
}
/**
* Result variable is a result of an or operation of all possible problems. Ie. if result

View file

@ -35,6 +35,7 @@
android:scrollbars="vertical"
android:fadeScrollbars="false"
android:scrollbarThumbVertical="@color/primaryColor"
android:clipToPadding="false"
android:scrollbarSize="@dimen/dimen_6"/>
</RelativeLayout>

View file

@ -34,6 +34,7 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/switchWidget"
android:clipToPadding="false"
/>
<TextView

View file

@ -14,6 +14,7 @@
app:actualImageScaleType="fitXY" />
<androidx.cardview.widget.CardView
android:id="@+id/media_detail_card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"

View file

@ -5,7 +5,8 @@
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/location_picker_toolbar"
android:layout_width="match_parent"
android:layout_height="78dp"
android:layout_height="wrap_content"
android:paddingVertical="@dimen/small_gap"
tools:background="@color/primaryColor">
<TextView

View file

@ -232,6 +232,7 @@
<string name="media_detail_description">Περιγραφή</string>
<string name="media_detail_discussion">Συζήτηση</string>
<string name="media_detail_author">Συγγραφέας</string>
<string name="media_detail_uploader">Ανεβαστής</string>
<string name="media_detail_uploaded_date">Ημερομηνία μεταφόρτωσης</string>
<string name="media_detail_license">Άδεια</string>
<string name="media_detail_coordinates">Συντεταγμένες</string>
@ -433,7 +434,7 @@
<string name="deletion_reason_bad_for_my_privacy">Συνειδητοποίησα ότι είναι κακό για την ιδιωτικότητά μου</string>
<string name="deletion_reason_no_longer_want_public">Άλλαξα γνώμη, δε θέλω να προβάλλεται πλέον δημόσια</string>
<string name="deletion_reason_not_interesting">Συγγνώμη, αυτή η φωτογραφία δεν είναι ενδιαφέρουσα για μια εγκυκλοπαίδεια</string>
<string name="uploaded_by_myself" fuzzy="true">Ανέβηκε από εμένα στο %1$s, χρησιμοποιήθηκε σε %2$d άρθρο/α</string>
<string name="uploaded_by_myself">Ανέβηκε από εμένα στο %1$s, χρησιμοποιήθηκε σε τουλάχιστον %2$d άρθρο/α.</string>
<string name="no_uploads">Καλώς ήρθατε στα Commons!\n\nΑνεβάστε τα πρώτα σας πολυμέσα πατώντας το κουμπί της προσθήκης.</string>
<string name="no_categories_selected">Δεν επιλέχθηκαν κατηγορίες</string>
<string name="no_categories_selected_warning_desc">Οι εικόνες χωρίς κατηγορίες χρησιμοποιούνται σπάνια. Θέλετε πράγματι να συνεχίσετε δίχως να επιλέξετε κατηγορίες;</string>
@ -773,7 +774,7 @@
<string name="permissions_are_required_for_functionality">Απαιτούνται δικαιώματα για τη λειτουργικότητα</string>
<string name="learn_how_to_write_a_useful_description">Μάθετε πώς να γράψετε μια χρήσιμη περιγραφή</string>
<string name="learn_how_to_write_a_useful_caption">Μάθετε πώς να γράψετε μια χρήσιμη λεζάντα</string>
<string name="see_your_achievements" fuzzy="true">Δείτε τα επιτεύγματά σας</string>
<string name="see_your_achievements">Δείτε τα επιτεύγματά σας</string>
<string name="edit_image">Επεξεργασία εικόνας</string>
<string name="edit_location">Επεξεργασία τοποθεσίας</string>
<string name="location_updated">Η τοποθεσία ενημερώθηκε!</string>
@ -834,4 +835,5 @@
<string name="show_in_nearby">Εμφάνιση στα Κοντινά</string>
<string name="image_tag_line_created_and_uploaded_by">Δημιουργήθηκε και μεταφορτώθηκε από: %1$s</string>
<string name="image_tag_line_created_by_and_uploaded_by">Δημιουργήθηκε από %1$s και μεταφορτώθηκε από %2$s</string>
<string name="nominated_for_deletion_btn">Προτάθηκε για Διαγραφή</string>
</resources>

View file

@ -30,6 +30,9 @@
<string name="exit_location_picker">Poistu sijainnin valitsimesta</string>
<string name="submit">Lähetä</string>
<string name="add_another_description">Lisää toinen kuvaus</string>
<string name="add_new_contribution">Lisää uusi tiedosto</string>
<string name="add_contribution_from_camera">Lisää uusi tiedosto kameralla</string>
<string name="add_contribution_from_photos">Lisää uusi tiedosto kuvista</string>
<string name="show_captions">Kuvatekstit</string>
<string name="row_item_language_description">Kielen kuvaus</string>
<string name="row_item_caption">Kuvateksti</string>
@ -45,7 +48,7 @@
<item quantity="one">(%1$d)</item>
<item quantity="other">(%1$d)</item>
</plurals>
<string name="starting_uploads">Aloitetaan latauksia</string>
<string name="starting_uploads">Aloitetaan tallennuksia</string>
<plurals name="starting_multiple_uploads">
<item quantity="one">Käsitellään %d tallennus</item>
<item quantity="other">Käsitellään %d tallennusta</item>
@ -87,7 +90,7 @@
<string name="unrestricted_battery_mode">Poistetaanko akun optimointi käytöstä?</string>
<string name="authentication_failed">Tunnistautuminen epäonnistui, kirjaudu uudelleen sisään</string>
<string name="uploading_started">Tallentaminen aloitettiin!</string>
<string name="uploading_queued">Lataus jonossa (rajoitettu yhteystila käytössä)</string>
<string name="uploading_queued">Tallennus on jonossa (rajoitettu yhteystila käytössä)</string>
<string name="upload_completed_notification_title">%1$s tallennettiin!</string>
<string name="upload_completed_notification_text">Napauta katsoaksesi tallennusta</string>
<string name="upload_progress_notification_title_start">Kopioidaan palvelimelle: %s</string>
@ -106,6 +109,8 @@
<string name="menu_from_camera">Ota kuva</string>
<string name="menu_nearby">Lähistöllä</string>
<string name="provider_contributions">Omat tallennukset</string>
<string name="menu_copy_link">Kopioi linkki</string>
<string name="menu_link_copied">Linkki on kopioitu leikepöydälle.</string>
<string name="menu_share">Jaa</string>
<string name="menu_view_file_page">Näytä tiedostosivu</string>
<string name="share_title_hint">Kuvateksti (vaaditaan)</string>
@ -122,13 +127,14 @@
<string name="provider_modifications">Muutokset</string>
<string name="menu_upload_single">Tallenna</string>
<string name="categories_search_text_hint">Etsi luokkia</string>
<string name="depicts_search_text_hint">Hae kohteita, joita mediasi kuvaa (vuori, Taj Mahal jne.)</string>
<string name="depicts_search_text_hint">Hae kohteita, joita mediasi esittää (vuori, Taj Mahal jne.)</string>
<string name="menu_save_categories">Tallenna</string>
<string name="menu_overflow_desc">Ylivuotovalikko</string>
<string name="refresh_button">Päivitä</string>
<string name="display_list_button">Lista</string>
<string name="contributions_subtitle_zero">(Ei vielä tallennuksia)</string>
<string name="categories_not_found">Luokkaa %1$s ei löytynyt</string>
<string name="depictions_not_found">Wikidata-kohteita ei löytynyt</string>
<string name="depictions_not_found">Hakusanaa %1$s vastaavia Wikidata-kohteita ei löytynyt</string>
<string name="no_child_classes">%1$s ei ole lapsiluokkia</string>
<string name="no_parent_classes">%1$s ei ole vanhempia luokkia</string>
<string name="categories_skip_explanation">Lisää luokkia tehdäksesi kuvistasi enemmän löydettäviä Wikimedia Commonssissa.\nAloita kirjoittaminen lisätäksesi luokkia.</string>
@ -136,6 +142,7 @@
<string name="title_activity_settings">Asetukset</string>
<string name="title_activity_signup">Rekisteröidy</string>
<string name="title_activity_featured_images">Suositellut kuvat</string>
<string name="title_activity_custom_selector">Mukautettu valitsin</string>
<string name="title_activity_category_details">Luokka</string>
<string name="title_activity_review">Vertaisarviointi</string>
<string name="menu_about">Tietoja</string>
@ -151,7 +158,7 @@
<string name="no_uploads_yet">Et ole vielä tallentanut kuvia.</string>
<string name="menu_retry_upload">Yritä uudelleen</string>
<string name="menu_cancel_upload">Peruuta</string>
<string name="media_upload_policy">Lisäämällä kuvan, ilmoitan tämän olevan oma työ ja että se ei sisällä tekijänoikeuden alaista materiaalia tai selfietä ja muuten noudattaa &lt;a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\"&gt;Wikimedia Commons policies&lt;/a&gt;.</string>
<string name="media_upload_policy">Lisäämällä kuvan, ilmoitan tämän olevan oma työ ja että se ei sisällä tekijänoikeuden alaista materiaalia tai selfietä ja muuten noudattaa &lt;a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\"&gt;Wikimedia Commonsin käytäntöjä&lt;/a&gt;.</string>
<string name="menu_download">Lataa</string>
<string name="preference_license">Oletuslisenssi</string>
<string name="use_previous">Käytä edellistä otsikkoa ja kuvausta</string>
@ -174,7 +181,7 @@
<string name="tutorial_3_text">ÄLÄ tallenna seuraavia:</string>
<string name="tutorial_3_subtext_1">Selfiet tai kuvat ystävistäsi</string>
<string name="tutorial_3_subtext_2">Kuvia, jotka olet ladannut Internetistä</string>
<string name="tutorial_3_subtext_3">Kuvakaappaukset omistamistasi sovelluksista</string>
<string name="tutorial_3_subtext_3">Kuvakaappaukset muiden omistamista sovelluksista</string>
<string name="tutorial_4_text">Tallennusesimerkki:</string>
<string name="tutorial_4_subtext_1">Otsikko: Sydneyn oopperatalo</string>
<string name="tutorial_4_subtext_2">Kuvaus: Sydneyn oopperatalo lahden toiselta puolelta katsottuna</string>
@ -200,15 +207,17 @@
<string name="location_permission_title">Pyydetään sijaintilupaa</string>
<string name="ok">OK</string>
<string name="warning">Varoitus</string>
<string name="duplicate_file_name">Vastaava tiedostonimi löytyi</string>
<string name="upload">Tallenna</string>
<string name="yes">Kyllä</string>
<string name="no">Ei</string>
<string name="media_detail_caption">Kuvateksti</string>
<string name="media_detail_title">Otsikko</string>
<string name="media_detail_depiction">Kuvaukset</string>
<string name="media_detail_depiction">Esittää-tunnisteet</string>
<string name="media_detail_description">Kuvaus</string>
<string name="media_detail_discussion">Keskustelu</string>
<string name="media_detail_author">Tekijä</string>
<string name="media_detail_uploader">Tallentaja</string>
<string name="media_detail_uploaded_date">Tallennuspäivämäärä</string>
<string name="media_detail_license">Lisenssi</string>
<string name="media_detail_coordinates">Koordinaatit</string>
@ -216,6 +225,7 @@
<string name="become_a_tester_title">Ryhdy beetatestaajaksi</string>
<string name="become_a_tester_description">Valitse beeta-kanavamme Google Playssa ja hanki varhainen pääsy uusiin ominaisuuksiin ja virheenkorjauksiin</string>
<string name="_2fa_code">Kaksivaiheisen tunnistautumisen koodi</string>
<string name="email_auth_code">Sähköpostivahvistuskoodi</string>
<string name="logout_verification">Haluatko varmasti kirjautua ulos?</string>
<string name="mediaimage_failed">Mediakuva epäonnistui</string>
<string name="no_subcategory_found">Alaluokkia ei löytynyt</string>
@ -236,6 +246,7 @@
<string name="navigation_item_about">Tietoja</string>
<string name="navigation_item_settings">Asetukset</string>
<string name="navigation_item_feedback">Palaute</string>
<string name="navigation_item_feedback_github">Palaute GitHubissa</string>
<string name="navigation_item_logout">Kirjaudu ulos</string>
<string name="navigation_item_info">Opas</string>
<string name="navigation_item_notification">Ilmoitukset</string>
@ -270,14 +281,14 @@
<string name="skip_login">Ohita</string>
<string name="navigation_item_login">Kirjaudu sisään</string>
<string name="skip_login_title">Haluatko todella ohittaa kirjautumisen?</string>
<string name="skip_login_message" fuzzy="true">Sinun täytyy kirjautua sisään tallentaaksesi kuvia tulevaisuudessa.</string>
<string name="skip_login_message">Sinun täytyy kirjautua sisään tallentaaksesi kuvia tulevaisuudessa.</string>
<string name="login_alert_message">Kirjaudu sisään käyttääksesi tätä ominaisuutta</string>
<string name="copy_wikicode">Kopioi wikiteksti leikepöydälle</string>
<string name="wikicode_copied">Wikiteksti kopioitiin leikepöydälle</string>
<string name="nearby_location_not_available">Nearby ei välttämättä toimi, sillä sijainti ei käytettävissä.</string>
<string name="nearby_location_not_available">Lähistöllä-toiminto ei välttämättä toimi kunnolla, sillä sijainti ei käytettävissä.</string>
<string name="upload_location_access_denied">Sijainnin käyttö kielletty. Aseta sijaintisi manuaalisesti käyttääksesi tätä ominaisuutta.</string>
<string name="location_permission_rationale_nearby">Lupa vaaditaan läheisten paikkojen luettelon näyttämiseen</string>
<string name="location_permission_rationale_explore">Lupa vaaditaan läheltä otettujen kuvien luettelon näyttämiseen</string>
<string name="location_permission_rationale_nearby">Lupa vaaditaan lähellä olevien paikkojen luettelon näyttämiseen</string>
<string name="location_permission_rationale_explore">Lupa vaaditaan lähellä otettujen kuvien luettelon näyttämiseen</string>
<string name="nearby_directions">Reitit</string>
<string name="nearby_wikidata">Wikidata</string>
<string name="nearby_wikipedia">Wikipedia</string>
@ -312,7 +323,7 @@
<string name="search_recent_header">Äskettäiset haut:</string>
<string name="provider_searches">Äskettäin haetut kyselyt</string>
<string name="error_loading_categories">Luokkia ladattaessa tapahtui virhe.</string>
<string name="error_loading_depictions">Virhe ladattaessa kuvauksia.</string>
<string name="error_loading_depictions">Virhe ladattaessa esittää-tunnisteita.</string>
<string name="search_tab_title_media">Media</string>
<string name="search_tab_title_categories">Luokat</string>
<string name="search_tab_title_depictions">Kohteet</string>
@ -327,8 +338,8 @@
<string name="quiz_question_string">Onko tämä kuva OK tallennettavaksi?</string>
<string name="question">Kysymys</string>
<string name="result">Tulos</string>
<string name="quiz_back_button">Jos jatkat poistettavien kuvien lataamista, tilisi todennäköisesti kielletään. Haluatko varmasti lopettaa tietokilpailun?</string>
<string name="quiz_alert_message">Yli %1$s tallentamistasi kuvista on poistettu. Mikäli jatkat poistamista vaativien kuvien lataamista, tilisi todennäköisesti estetään.\n\nHaluatko tutustua oppaaseen uudelleen ja tehdä sen jälkeen tietovisan oppiaksesi minkälaisia kuvia saa ja ei saa tallentaa?</string>
<string name="quiz_back_button">Jos jatkat poistettavien kuvien tallentamista, tunnuksesi tullaan todennäköisesti estämään. Haluatko varmasti lopettaa tietokilpailun?</string>
<string name="quiz_alert_message">Yli %1$s tallentamistasi kuvista on poistettu. Mikäli jatkat poistamista vaativien kuvien tallentamista, tunnuksesi tullaan todennäköisesti estämään.\n\nHaluatko tutustua oppaaseen uudelleen ja tehdä sen jälkeen tietovisan oppiaksesi, minkälaisia kuvia saa ja ei saa tallentaa?</string>
<string name="selfie_answer">Selfieillä ei ole paljoa arvoa tietosanakirjassa. Älä tallenna kuvaa itsestäsi, ellei sinusta jo ole Wikipedia-artikkelia.</string>
<string name="taj_mahal_answer">Monumenteista ja maisemista otetut kuvat ovat hyväksyttäviä tallennettavaksi useimmissa maissa. Huomaa kuitenkin että ulkotiloihin sijoitetut väliaikaiset tilataideteokset ovat usein suojattu tekijänoikeudella ja niistä otettuja kuvia ei usein saa tallentaa.</string>
<string name="screenshot_answer">Kuvakaappauksia sivustoista tulkitaan jäljennöksiksi ja ovat täten sivuston kopiosuojan piirissä. Kuvia voidaan käyttää asianmukaisella tekijältä saadulta luvalla. Ilman kyseistä lupaa, mitä tahansa heidän materiaalistaan tuottamaa tuotosta tulkitaan alkuperäisen tekijän näkökulmasta luvattomaksi kopioksi.</string>
@ -350,17 +361,18 @@
<string name="error_fetching_nearby_monuments">Virhe läheisiä monumentteja haettaessa.</string>
<string name="no_recent_searches">Ei viimeaikaisia hakuja</string>
<string name="delete_recent_searches_dialog">Haluatko varmasti tyhjentää hakuhistoriasi?</string>
<string name="cancel_upload_dialog">Haluatko varmasti peruuttaa tämän latauksen?</string>
<string name="cancel_upload_dialog">Haluatko varmasti peruuttaa tämän tallennuksen?</string>
<string name="delete_search_dialog">Haluatko poistaa tämän haun?</string>
<string name="search_history_deleted">Hakuhistoria poistettu</string>
<string name="nominate_delete">Ehdota poistettavaksi</string>
<string name="delete">Poista</string>
<string name="Achievements">Saavutukset</string>
<string name="Profile">Profiili</string>
<string name="badges">Merkit</string>
<string name="statistics">Tilastot</string>
<string name="statistics_thanks">Kiitos vastaanotettu</string>
<string name="statistics_featured">Suositellut kuvat</string>
<string name="statistics_wikidata_edits">Kuvia läheltä</string>
<string name="statistics_wikidata_edits">\"Lähistöllä\"-kuvat</string>
<string name="level">Taso %d</string>
<string name="profile_withLevel">%s (taso %s)</string>
<string name="images_uploaded">Kuvia tallennettu</string>
@ -369,9 +381,9 @@
<string name="achievements_share_message">Jaa saavutuksesi ystäviesi kanssa!</string>
<string name="achievements_info_message">Tasosi nousee, kun täytät nämä vaatimukset. Tilastot-osion kohteita ei lasketa tasoosi.</string>
<string name="achievements_revert_limit_message">vähimmäisvaatimus:</string>
<string name="images_uploaded_explanation">Lähetettyjen kuvien määrä Commonsiin minkä tahansa latausohjelmiston kautta</string>
<string name="images_uploaded_explanation">Lähetettyjen kuvien määrä Commonsiin minkä tahansa tallennusohjelmiston kautta</string>
<string name="images_reverted_explanation">Niiden kuvien prosenttiosuus, jotka olet ladannut Commonsiin ja joita ei poistettu</string>
<string name="images_used_explanation">Wikimedia-artikkeleissa käytettyjen Commonsiin lataamiesi kuvien määrä</string>
<string name="images_used_explanation">Wikimedia-artikkeleissa käytettyjen Commonsiin tallentamiesi kuvien määrä</string>
<string name="error_occurred">Tapahtui virhe!</string>
<string name="notifications_channel_name_all">Commons-ilmoitus</string>
<string name="preference_author_name_toggle">Käytä mukautettua tekijän nimeä</string>
@ -385,7 +397,7 @@
<string name="display_nearby_notification_summary">Näytä sovelluksen sisäinen ilmoitus lähinnä kuvia tarvitsevasta paikasta</string>
<string name="list_sheet">Lista</string>
<string name="storage_permission">Tallennuslupa</string>
<string name="write_storage_permission_rationale_for_image_share">Tarvitsemme luvan käyttääksesi laitteen ulkoista tallennustilaa kuvien lataamista varten.</string>
<string name="write_storage_permission_rationale_for_image_share">Tarvitsemme luvan käyttääksesi laitteen ulkoista tallennustilaa kuvien tallentamista varten.</string>
<string name="nearby_notification_dismiss_message">Et enää näe lähellä olevia paikkoja, jotka tarvitsevat kuvia. Voit kuitenkin halutessasi ottaa tämän ilmoituksen uudelleen käyttöön asetuksissa.</string>
<string name="step_count">Vaihe %1$d %2$d: %3$s</string>
<string name="next">Seuraava</string>
@ -394,6 +406,7 @@
<string name="map_application_missing">Laitteestasi ei löydy yhteensopivaa karttasovellusta. Asenna karttasovellus käyttääksesi tätä toimintoa.</string>
<string name="title_page_bookmarks_pictures">Kuvat</string>
<string name="title_page_bookmarks_locations">Sijainnit</string>
<string name="title_page_bookmarks_categories">Luokat</string>
<string name="menu_bookmark">Lisää kirjanmerkkeihin/Poista kirjanmerkeistä</string>
<string name="provider_bookmarks">Kirjanmerkit</string>
<string name="bookmark_empty">Et ole lisännyt yhtään kirjanmerkkejä</string>
@ -408,8 +421,8 @@
<string name="no_uploads">Tervetuloa Commonsiin!\n\nTallenna ensimmäinen mediasi koskettamalla lisäyspainiketta.</string>
<string name="no_categories_selected">Luokkia ei valittu</string>
<string name="no_categories_selected_warning_desc">Kuvat, jotka eivät ole luokissa, ovat harvoin käyttökelpoisia. Haluatko varmasti jatkaa valitsematta luokkia?</string>
<string name="no_depictions_selected">Kuvauksia ei valittu</string>
<string name="no_depictions_selected_warning_desc">Kuvat, joissa on kuvatekstejä, löytyvät helpommin ja todennäköisemmin niitä käytetään. Haluatko varmasti jatkaa valitsematta kuvatekstejä?</string>
<string name="no_depictions_selected">Esittää-tunnisteita ei valittu</string>
<string name="no_depictions_selected_warning_desc">Kuvat, joissa on esittää-tunnisteita, löytyvät helpommin ja niitä käytetään todennäköisemmin. Haluatko varmasti jatkaa valitsematta esittää-tunnisteita?</string>
<string name="back_button_warning">Peruuta tallennus</string>
<string name="back_button_warning_desc">Takaisin-napin painaminen peruuttaa tämän tallennuksen ja poistaa tallentamasi tiedot</string>
<string name="back_button_continue">Jatka tallennusta</string>
@ -467,6 +480,7 @@
<string name="no_notification">Sinulla ei ole lukemattomia ilmoituksia</string>
<string name="no_read_notification">Sinulla ei ole luettuja ilmoituksia</string>
<string name="share_logs_using">Jaa lokit käyttämällä</string>
<string name="check_your_email_inbox">Tarkista sähköpostilaatikkosi</string>
<string name="menu_option_read">Näytä luetut</string>
<string name="menu_option_unread">Näytä lukemattomat</string>
<string name="error_occurred_in_picking_images">Kuvien valinnassa tapahtui virhe</string>
@ -485,11 +499,11 @@
<string name="exif_tag_name_lensModel">Linssin malli</string>
<string name="exif_tag_name_serialNumbers">Sarjanumerot</string>
<string name="exif_tag_name_software">Ohjelmisto</string>
<string name="share_text">Lähetä valokuvia suoraan Wikimedia Commonsiin puhelimestasi. Lataa Commons-appi nyt: %1$s</string>
<string name="share_text">Tallenna kuvia Wikimedia Commonsiin suoraan puhelimeltasi. Lataa Commons-sovellus nyt: %1$s</string>
<string name="share_via">Jaa sovellus...</string>
<string name="image_info">Kuvan tiedot</string>
<string name="no_categories_found">Luokkia ei löytynyt</string>
<string name="no_depiction_found">Kuvauksia ei löytynyt</string>
<string name="no_depiction_found">Esittää-tunnisteita ei löytynyt</string>
<string name="upload_cancelled">Peruutettu tallennus</string>
<string name="dialog_box_text_nomination">Miksi %1$s tulisi poistaa?</string>
<string name="review_is_uploaded_by">%1$s oli lähettänyt: %2$s</string>
@ -505,6 +519,7 @@
<string name="delete_helper_ask_reason_copyright_press_photo">Lehdistökuva</string>
<string name="delete_helper_ask_reason_copyright_internet_photo">Satunnainen kuva internetistä</string>
<string name="delete_helper_ask_reason_copyright_logo">Logo</string>
<string name="delete_helper_ask_reason_copyright_no_freedom_of_panorama">Panoraamavapauden rikkomus</string>
<string name="delete_helper_ask_alert_set_positive_button_reason">Koska se on</string>
<string name="category_edit_helper_make_edit_toast">Yritetään päivittää luokkia.</string>
<string name="category_edit_helper_show_edit_title">Luokan päivitys</string>
@ -515,6 +530,9 @@
</plurals>
<string name="category_edit_helper_edit_message_else">Ei voitu lisätä luokkia.</string>
<string name="category_edit_button_text">Päivitetään luokkia</string>
<string name="depictions_edit_helper_make_edit_toast">Yritetään päivittää esittää-tunnisteita.</string>
<string name="depictions_edit_helper_show_edit_title">Muokkaa esittää-tunnisteita</string>
<string name="depictions_edit_helper_edit_message_else">Esittää-tunnisteita ei voitu lisätä.</string>
<string name="coordinates_edit_helper_make_edit_toast">Yritetään päivittää koordinaatit.</string>
<string name="coordinates_edit_helper_show_edit_title">Koordinaattien päivitys</string>
<string name="description_edit_helper_show_edit_title">Kuvaus päivitetty</string>
@ -526,7 +544,7 @@
<string name="coordinates_edit_helper_edit_message_else">Koordinaatteja ei voitu lisätä.</string>
<string name="description_edit_helper_edit_message_else">Kuvauksia ei voitu lisätä.</string>
<string name="caption_edit_helper_edit_message_else">Kuvatekstiä ei voitu lisätä.</string>
<string name="coordinates_picking_unsuccessful" fuzzy="true">Koordinaattien haku epäonnistui.</string>
<string name="coordinates_picking_unsuccessful">Kuvan koordinaatteja ei tallennettu</string>
<string name="descriptions_picking_unsuccessful">Kuvauksia ei voitu hakea.</string>
<string name="description_activity_title">Muokkaa kuvauksia ja kuvatekstejä</string>
<string name="share_image_via">Jaa kuva</string>
@ -543,8 +561,13 @@
<string name="nearby_search_hint">Silta, museo, hotelli jne.</string>
<string name="you_must_reset_your_passsword">Jokin meni pieleen kirjautumisessa. Sinun on nollattava salasanasi!</string>
<string name="title_for_media">MEDIA</string>
<string name="upload_nearby_place_found_title">Lähipaikka löytyi</string>
<string name="upload_nearby_place_found_description_singular" fuzzy="true">Onko tämä kuva paikasta %1$s?</string>
<string name="title_for_child_classes">ALALUOKAT</string>
<string name="title_for_parent_classes">YLÄLUOKAT</string>
<string name="title_for_subcategories">ALALUOKAT</string>
<string name="title_for_parent_categories">YLÄLUOKAT</string>
<string name="upload_nearby_place_found_title">Lähistöllä-paikka löytyi</string>
<string name="upload_nearby_place_found_description_plural">Ovatko nämä kuvia paikasta %1$s?</string>
<string name="upload_nearby_place_found_description_singular">Onko tämä kuva paikasta %1$s?</string>
<string name="title_app_shortcut_bookmark">Kirjanmerkit</string>
<string name="title_app_shortcut_setting">Asetukset</string>
<string name="remove_bookmark">Poistettu kirjanmerkeistä</string>
@ -592,7 +615,7 @@
<string name="leaderboard_weekly">Viikoittain</string>
<string name="leaderboard_all_time">Koko ajalta</string>
<string name="leaderboard_upload">Lähetä</string>
<string name="leaderboard_nearby">Lähistöltä</string>
<string name="leaderboard_nearby">Lähistöllä</string>
<string name="leaderboard_used">Käyttöjä</string>
<string name="leaderboard_my_rank_button_text">Sijani</string>
<string name="limited_connection_enabled">Rajoitettu yhteystila päällä!</string>
@ -605,9 +628,9 @@
<string name="cancel_upload">Peruuta tallennus</string>
<string name="limited_connection_is_on">Rajoitettu yhteystila on päällä.</string>
<string name="media_details_tooltip">Kirjoita lyhyt kuvateksti. Kerro miksi kuva on kiinnostava, tyypillinen tai harvinainen ja selitä asiayhteys, näkyy se kuvassa tai ei. Käytä mahdollisimman tarkkaa terminologiaa.</string>
<string name="depicts_tooltip">Etsi ja valitse kaikki tämän kuvan kuvaamat käsitteet. Ole mahdollisimman tarkka. Mikäli kuvattuna on monta kohdetta, valitse ne kaikki kohtuullisuuden rajoissa. Älä valitse yleisiä tunnisteita mikäli tarkempia on saatavilla.</string>
<string name="categories_tooltip">Valitse sopivat luokat. Toisin kuin kuvaukset, luokkien nimet ovat vain englanniksi.</string>
<string name="license_tooltip">Kuka tahansa saa käyttää ja muokata Commonsiin lataamiasi kuvia. Haluatko luovuttaa kuviesi kaikki oikeudet? Haluatko tulla nimetyksi kuvien tekijänä? Haluatko kuviesi muokattujen versioiden julkaistavan samalla lisenssillä?</string>
<string name="depicts_tooltip">Etsi ja valitse kaikki käsitteet, joita tämä kuva esittää. Ole mahdollisimman tarkka. Mikäli kuvattuna on monta kohdetta, valitse ne kaikki kohtuullisuuden rajoissa. Älä valitse yleisiä tunnisteita, mikäli tarkempia on saatavilla.</string>
<string name="categories_tooltip">Valitse sopivat luokat. Toisin kuin esittää-tunnisteet, luokkien nimet ovat vain englanniksi.</string>
<string name="license_tooltip">Kuka tahansa saa käyttää ja muokata Commonsiin tallentamiasi kuvia. Haluatko luovuttaa kuviesi kaikki oikeudet? Haluatko tulla nimetyksi kuvien tekijänä? Haluatko kuviesi muokattujen versioiden julkaistavan samalla lisenssillä?</string>
<string name="depicts_step_title">Esittää</string>
<string name="license_step_title">Median lisenssi</string>
<string name="media_detail_step_title">Median tiedot</string>
@ -629,18 +652,19 @@
<string name="custom_selector_empty_text">Ei kuvia</string>
<string name="done">Valmis</string>
<string name="back">Takaisin</string>
<string name="welcome_custom_selector_ok">Mahtava</string>
<string name="welcome_custom_selector_ok">Mahtavaa</string>
<string name="custom_selector_already_uploaded_image_text">Tämä kuva on jo ladattu Commonsiin.</string>
<string name="learn_more">LUE LISÄÄ</string>
<string name="need_permission">Tarvitaan käyttöoikeus</string>
<string name="contributions_of_user">Käyttäjän muokkaukset: %s</string>
<string name="achievements_of_user">Käyttäjän saavutukset: %s</string>
<string name="menu_view_user_page" fuzzy="true">Näytä käyttäjäsivu</string>
<string name="menu_view_user_page">Näytä käyttäjäprofiili</string>
<string name="edit_depictions">Muokkaa esittää-tunnisteita</string>
<string name="edit_categories">Muokkaa luokkia</string>
<string name="advanced_options">Lisäasetukset</string>
<string name="apply">Käytä</string>
<string name="reset">Nollaa</string>
<string name="location_message">Sijaintitiedot auttavat wikin muokkaajia löytämään kuvasi, mikä tekee siitä paljon hyödyllisemmän.\nViimeaikaisissa tallennuksissasi ei ole sijaintia.\nSuosittelemme, että otat sijainnin käyttöön kamerasovelluksesi asetuksista.\nKiitos latauksesta!</string>
<string name="location_message">Sijaintitiedot auttavat wikin muokkaajia löytämään kuvasi, mikä tekee siitä paljon hyödyllisemmän.\nViimeaikaisissa tallennuksissasi ei ole sijaintia.\nSuosittelemme, että otat sijainnin käyttöön kamerasovelluksesi asetuksista.\nKiitos kuvien tallentamista!</string>
<string name="no_location_found_title">Paikkaa ei löytynyt</string>
<string name="add_location">Lisää paikka</string>
<string name="explore_map_details">Tiedot</string>
@ -669,6 +693,7 @@
<string name="see_your_achievements" fuzzy="true">Näytä omat saavutukset</string>
<string name="edit_image">Muokkaa kuvaa</string>
<string name="edit_location">Muokkaa sijaintia</string>
<string name="location_updated">Sijainti päivitetty!</string>
<string name="remove_location">Poista sijainti</string>
<string name="location_removed">Sijainti poistettu!</string>
<string name="send_thanks_to_author">Kiitä tekijää</string>
@ -681,4 +706,34 @@
<item quantity="one">%d kuva valittu</item>
<item quantity="other">%d kuvaa valittu</item>
</plurals>
<string name="talk">Keskustelu</string>
<string name="are_you_sure_that_you_want_cancel_all_the_uploads">Oletko varma, että haluat peruuttaa kaikki tallennukset?</string>
<string name="cancelling_all_the_uploads">Peruutetaan kaikki tallennukset...</string>
<string name="uploads">Tallennukset</string>
<string name="pending">Odottavat</string>
<string name="failed">Epäonnistuneet</string>
<string name="custom_selector_delete_folder">Poista kansio</string>
<string name="custom_selector_confirm_deletion_title">Vahvista poisto</string>
<string name="custom_selector_confirm_deletion_message">Oletko varma, että haluat poistaa kansion %1$s, jossa on %2$d kohdetta?</string>
<string name="custom_selector_delete">Poista</string>
<string name="custom_selector_cancel">Peruuta</string>
<string name="custom_selector_folder_deleted_success">Kansio %1$s poistettu</string>
<string name="custom_selector_folder_deleted_failure">Kansion %1$s poistaminen epäonnistui</string>
<string name="red_pin">Tästä paikasta ei ole vielä kuvaa. Ota ihmeessä kuva!</string>
<string name="green_pin">Tästä paikasta on jo kuva.</string>
<string name="grey_pin">Tarkistetaan, onko tästä paikasta kuvaa.</string>
<string name="error_while_loading">Virhe ladattaessa</string>
<string name="usages_on_commons_heading">Commons</string>
<string name="usages_on_other_wikis_heading">Muut wikit</string>
<string name="file_usages_container_heading">Tiedoston käyttö</string>
<string name="account">Tunnus</string>
<string name="vanish_account">Hävitä käyttäjätunnus</string>
<string name="account_vanish_request_confirm_title">Varoitus hävittämisestä</string>
<string name="account_vanish_request_confirm">Hävittäminen on &lt;b&gt;viimeinen keino&lt;/b&gt; ja sitä tulee &lt;b&gt;käyttää vain, jos haluat lopettaa muokkaamisen lopullisesti&lt;/b&gt; ja samalla myös piilottaa mahdollisimman paljon aiemmista toimistasi.&lt;br/&gt;&lt;br/&gt;Käyttäjätunnuksen poistaminen Wikimedia Commonsissa tapahtuu muuttamalla tunnuksesi nimeä niin, etteivät muut pysty tunnistamaan muokkauksiasi. Tätä toimea kutsutaan käyttäjätunnuksen hävittämiseksi. &lt;b&gt;Hävittäminen ei takaa täyttä anonyymiyttä, eikä se poista hankkeisiin tekemiäsi muokkauksia&lt;/b&gt;.</string>
<string name="caption">Kuvateksti</string>
<string name="caption_copied_to_clipboard">Kuvateksti kopioitu leikepöydälle</string>
<string name="show_in_explore">Näytä Tutki-välilehdellä</string>
<string name="image_tag_line_created_and_uploaded_by">Luonut ja tallentanut: %1$s</string>
<string name="image_tag_line_created_by_and_uploaded_by">Luonut %1$s ja tallentanut %2$s</string>
<string name="nominated_for_deletion_btn">Ehdotettu poistettavaksi</string>
</resources>

View file

@ -271,7 +271,7 @@
<string name="wikicode_copied">Texto wiki copiado ó portapapeis</string>
<string name="nearby_location_not_available">A localización non está dispoñible. A identificación de sitios próximos pode non funcionar correctamente.</string>
<string name="location_permission_rationale_nearby">Precísase permiso para amosar unha lista de lugares preto de aquí</string>
<string name="nearby_directions">COMO CHEGAR</string>
<string name="nearby_directions">Indicacións</string>
<string name="nearby_wikidata">WIKIDATA</string>
<string name="nearby_wikipedia">Wikipedia</string>
<string name="nearby_commons">COMMONS</string>
@ -354,6 +354,7 @@
<string name="statistics_featured">Imaxes destacadas</string>
<string name="statistics_wikidata_edits">Imaxes vía \"Lugares próximos\"</string>
<string name="level">Nivel %d</string>
<string name="profile_withLevel">%s (nivel %s)</string>
<string name="images_uploaded">Imaxes cargadas</string>
<string name="image_reverts">Imaxes non revertidas</string>
<string name="images_used_by_wiki">Imaxes usadas</string>

View file

@ -649,13 +649,18 @@
<string name="pausing_upload">Pauzanta sendajo...</string>
<string name="cancelling_upload">Nuliganta sendajo...</string>
<string name="cancel_upload">Cesar kargajo</string>
<string name="limited_connection_explanation">Vu kapabligesis l\'uzo di limitizita konekto. Omna senduri pauzesis e durigos nur kande vu deskapabligos ta uzo.</string>
<string name="limited_connection_is_on">Kapabligesis por uzar limitizita konekti.</string>
<string name="media_details_tooltip">Voluntez skribar kurta titulo deskriptanta quon vua imajo montras. En la deskripto, explikez pro quo la fotografuro esas interesanta, tipala o rara, ed explikez la kuntexto, videbla o ne. Skriptez tan exakta kam posibla.</string>
<string name="depicts_tooltip">Voluntez trovar e selektar omna konceptaji quan ca imajo reprezentas. Esez plu preciza kam vu povas. Se ta imajo montras diversa kozi, selektez precize omna ek li. Ne uzez nepreciza deskripturi, se specifika deskripturi existas.</string>
<string name="categories_tooltip">Voluntez selektar la kategorii konvenanta. Diferante de deskripturi, kategorii nur existas en Angla linguo.</string>
<string name="license_tooltip">En Commons, vua imaji povos riuzesar ed adaptesar da omni. Ka vu deziras renuncar omna autoroyuri? Ka vu deziras ke l\'imajo atribuesos a vu? Ka vu deziras adapti por uzar la sama licenco?</string>
<string name="depicts_step_title">Montras</string>
<string name="license_step_title">Licencizo di \'\'media\'\'</string>
<string name="media_detail_step_title">Detali pri \'\'media\'\'</string>
<string name="menu_view_category_page">Vidar kategorio-pagino</string>
<string name="menu_view_item_page">Vidar pagino dil arkivo</string>
<string name="app_ui_language">Idiomo di vua interfacio</string>
<string name="remove">Removar titulo e deskripto</string>
<string name="read_help_link">Lektez pluse</string>
<string name="media_detail_in_all_languages">En omna idiomi</string>
@ -676,6 +681,7 @@
<string name="done">Facita</string>
<string name="back">Retroirar</string>
<string name="welcome_custom_picture_selector_text">Bonveno a personalizita selektilo di imaji</string>
<string name="custom_selector_info_text1">Ica selektilo montras quala imaji vu ja sendis a Commons.</string>
<string name="welcome_custom_selector_ok">Ecelanta</string>
<string name="custom_selector_already_uploaded_image_text">Ca imajo ja sendesis a Commons.</string>
<string name="custom_selector_over_limit_warning">Por teknikala motivi, l\'utensilo \'\'app\'\' ne povas fidinde sendar plua kam %1$d pikturi samatempe. La limito %1$d superesis per %2$d.</string>
@ -767,9 +773,13 @@
<item quantity="one">%d imajo selektita</item>
<item quantity="other">%d imaji selektita</item>
</plurals>
<string name="please_enter_some_comments">Voluntez facar kelka komenti</string>
<string name="talk">Diskuto</string>
<string name="write_something_about_the_item">Dicez irgu pri l\'arkivo \'%1$s\'. Ol esos videbla publike.</string>
<string name="does_not_exist_anymore_no_picture_can_ever_be_taken_of_it">\'%1$s\' ne pluse existas, nula imajo povos rekuperesar de ol.</string>
<string name="is_at_a_different_place_wikidata">\'%1$s\' esas en diferanta loko.</string>
<string name="is_at_a_different_place_please_specify_the_correct_place_below_if_possible_tell_us_the_correct_latitude_longitude">\'%1$s\' esas en diferanta loko. Voluntez mencionar la korekta loko adinfre e, se posibla, skribez la korekta latitudo e longitudo.</string>
<string name="other_problem_or_information_please_explain_below">Altra problemo od informo (voluntez explikar adinfre).</string>
<string name="cancelling_all_the_uploads">Extinganta la tota sendaji...</string>
<string name="uploads">Arkivi sendita</string>
<string name="pending">Vartanta</string>
@ -799,6 +809,8 @@
<string name="caption">Deskripto-texto</string>
<string name="caption_copied_to_clipboard">Deskripto-texto kopiita a \'\'clipboard\'\'</string>
<string name="congratulations_all_pictures_in_this_album_have_been_either_uploaded_or_marked_as_not_for_upload">Gratuli! Omna imaji en ca albumo sive sendesis, sive indikesis por ne sendar.</string>
<string name="show_in_nearby">Montrez en Proxima (\'\'Nearby\'\')</string>
<string name="image_tag_line_created_and_uploaded_by">Kreesis e sendesis da: %1$s</string>
<string name="image_tag_line_created_by_and_uploaded_by">Kreita da %1$s e sendita da %2$s</string>
<string name="nominated_for_deletion_btn">Indikita por Efaco</string>
</resources>

View file

@ -2,6 +2,7 @@
<!-- Authors:
* Anoop rao
* Anzx
* Gopala Krishna A
* Mahadevaiah Siddaiah
* Omshivaprakash
* VASANTH S.N.
@ -10,8 +11,23 @@
-->
<resources>
<string name="commons_facebook">ಕಾಮನ್ಸ್ ಫೇಸ್ಬುಕ್ ಪುಟ</string>
<string name="commons_github">ಕಾಮನ್ಸ್‌ನ ಗಿಟ್‍ಹಬ್ ಮೂಲ ಕೋಡ್</string>
<string name="commons_logo">ಕಾಮನ್ಸ್‌ ಲಾಂಛನ</string>
<string name="commons_website">ಕಾಮನ್ಸ್ ಜಾಲತಾಣ</string>
<string name="exit_location_picker">ಸ್ಥಳ ಆಯ್ಕೆಯಿಂದ ನಿರ್ಗಮಿಸಿ</string>
<string name="submit">ಸಲ್ಲಿಸಿ</string>
<string name="add_another_description">ಇನ್ನೊಂದು ವಿವರಣೆಯನ್ನು ಸೇರಿಸಿ</string>
<string name="add_new_contribution">ಹೊಸ ಕೊಡುಗೆಗಳನ್ನು ಸೇರಿಸಿ</string>
<string name="add_contribution_from_camera">ಕ್ಯಾಮೆರಾದಿಂದ ಕೊಡುಗೆಯನ್ನು ಸೇರಿಸಿ</string>
<string name="add_contribution_from_photos">ಫೋಟೋಗಳಿಂದ ಕೊಡುಗೆಯನ್ನು ಸೇರಿಸಿ</string>
<string name="add_contribution_from_contributions_gallery">ಹಿಂದಿನ ಕೊಡುಗೆಗಳ ಗ್ಯಾಲರಿಯಿಂದ ಕೊಡುಗೆಯನ್ನು ಸೇರಿಸಿ</string>
<string name="show_captions">ತಲೆಬರಹ</string>
<string name="row_item_language_description">ಭಾಷಾ ವಿವರಣೆ</string>
<string name="row_item_caption">ತಲೆಬರಹ</string>
<string name="show_captions_description">ವಿವರಣೆ</string>
<string name="nearby_row_image">ಚಿತ್ರ</string>
<string name="nearby_all">ಎಲ್ಲಾ</string>
<string name="nearby_filter_toggle">ಮೇಲಕ್ಕೆ ಟಾಗಲ್ ಮಾಡಿ</string>
<string name="appwidget_img">ದಿನದ ಚಿತ್ರ</string>
<plurals name="uploads_pending_notification_indicator">
<item quantity="one">%1$d ಕಡತ ಅಪ್ಲೋಡ್ ಅಗುತ್ತಿದೆ</item>

View file

@ -24,7 +24,7 @@
* 아라
-->
<resources>
<string name="commons_facebook">공용 페이스북 페이지</string>
<string name="commons_facebook">공용 페이스북 문서</string>
<string name="commons_github">공용 GitHub 소스 코드</string>
<string name="commons_logo">공용 로고</string>
<string name="commons_website">공용 웹사이트</string>
@ -35,11 +35,11 @@
<string name="add_contribution_from_camera">카메라에서 기여 참가</string>
<string name="add_contribution_from_photos">사진에서 기여 참가</string>
<string name="add_contribution_from_contributions_gallery">이전 기여 갤러리에서 기여 참가</string>
<string name="show_captions">캡션</string>
<string name="show_captions">설명</string>
<string name="row_item_language_description">언어 설명</string>
<string name="row_item_caption">캡션</string>
<string name="show_captions_description">설명</string>
<string name="nearby_row_image">이미지</string>
<string name="nearby_row_image">그림</string>
<string name="nearby_all">모두</string>
<string name="nearby_filter_toggle">위로 전환</string>
<string name="nearby_filter_search">검색 뷰</string>
@ -141,7 +141,7 @@
<string name="categories_not_found">%1$s와(과) 일치하는 분류를 찾을 수 없습니다</string>
<string name="depictions_not_found">%1$s에 대한 위키데이터 검색 결과가 없습니다</string>
<string name="no_child_classes">%1$s에 자식 클래스가 없습니다</string>
<string name="no_parent_classes">%1$s에 부모 클래스가 없습니다</string>
<string name="no_parent_classes">%1$s에 상위 클래스가 없습니다</string>
<string name="categories_skip_explanation">위키미디어 공용에서 그림을 더 찾기 쉽게 만들기 위해 분류를 추가합니다.\n분류를 추가하려면 입력을 시작하세요.</string>
<string name="categories_activity_title">분류</string>
<string name="title_activity_settings">설정</string>

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Authors:
* Adhmi
-->
<resources>
<string name="crash_dialog_title">Commons bamasalah</string>
<string name="crash_dialog_text">Ups. Ado nan salah!</string>
<string name="crash_dialog_comment_prompt">Caritokan apo nan sanak karajoan, sudah tu bagikan lewat email ka kami. Akan kami bantu mamelokannyo!</string>
<string name="crash_dialog_ok_toast">Tarimo kasih!</string>
</resources>

View file

@ -226,7 +226,7 @@
<string name="nearby_location_not_available">ဗဒင်ဏအ် ဟွံကၠောန်ကမၠောန် ဗွဲဓမ္မတာ၊ ဒၞာဲဒတန် ဟွံသၟဟ်အစောမ်။</string>
<string name="location_permission_rationale_nearby">အာတ်မိက်ဒၟံင် အခေါင် သွက်ဂွံထ္ၜး စရင်ဒၞာဲဒတန် ဗဒင်ဗဒင်</string>
<string name="nearby_directions">စမၞောန်ဂမၠိုင်</string>
<string name="nearby_wikidata">ဝဳကဳဒါတာ</string>
<string name="nearby_wikidata">ဝဳကဳတင်ဂၞင်</string>
<string name="nearby_wikipedia" fuzzy="true">ဝဳကဳပဳဒဳယာ</string>
<string name="nearby_commons">ခမ်မောန်</string>
<string name="about_rate_us">ကဵုင္ၚုဟ် ကုပိုယ်</string>

View file

@ -322,6 +322,7 @@
<string name="statistics_featured">ߖߌ߬ߦߊ߬ߓߍ߫ ߟߊߓߊ߯ߙߕߊ ߟߎ߬</string>
<string name="statistics_wikidata_edits">ߖߌ߬ߦߊ߬ߓߍ ߞߊߕߙߍ߬ \"ߛߌ߰ߢߐ߲߰ ߦߙߐ\" ߡߊ߬</string>
<string name="level" fuzzy="true">ߞߊߓߋ</string>
<string name="profile_withLevel">%s (ߞߊߓߋ %s)</string>
<string name="images_uploaded">ߖߌ߬ߦߊ߬ߓߍ ߓߘߊ߫ ߟߊߦߟߍ߬</string>
<string name="image_reverts">ߖߌ߬ߦߊ߬ߓߍ ߡߊ߫ ߖߏ߰ߛߌ߬</string>
<string name="images_used_by_wiki">ߖߌ߬ߦߊ߬ߓߍ߬ ߟߊߓߊ߯ߙߊߣߍ߲ ߠߎ߬</string>

View file

@ -227,12 +227,15 @@
<string name="navigation_item_info">لارښوونيزې</string>
<string name="navigation_item_notification">خبرتياوې</string>
<string name="navigation_item_review">بياکتنه</string>
<string name="no_description_found">هيڅ څرگنداوی ونهٔ موندل شو</string>
<string name="no_description_found">هېڅ څرگنداوی ونه موندل شو</string>
<string name="nearby_info_menu_commons_article">ټولگړې دوتنې مخ</string>
<string name="nearby_info_menu_wikidata_article">ويکي‌اومتوک توکی</string>
<string name="nearby_info_menu_wikipedia_article">ويکيپېډيا ليکنه</string>
<string name="upload_problem_image_dark">انځور ډېر تياره دی.</string>
<string name="upload_problem_image_blurry">انځور ډېر جړ دی.</string>
<string name="skip_login">تېرېدل</string>
<string name="navigation_item_login">ننوتل</string>
<string name="skip_login_title">آیا تاسو رښتیا غواړئ چې ننوتل پرېږدئ؟</string>
<string name="nearby_directions">تگلوري</string>
<string name="nearby_wikidata">ويکي‌اومتوک</string>
<string name="nearby_wikipedia">ويکيپېډيا</string>
@ -274,15 +277,54 @@
<string name="explore_tab_title_mobile">موبايل له لارې راپورته‌شوی</string>
<string name="explore_tab_title_map">نخشه</string>
<string name="successful_wikidata_edit">انځور په ویکي‌اومتوک کې %1$s ته ورگډ شو!</string>
<string name="question">پوښتنه</string>
<string name="result">پايله</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="cancel_upload_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="Achievements">لاسته‌راوړنې</string>
<string name="Profile">پېژنيال</string>
<string name="badges">مټ‌تړوني</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="profile_withLevel">%s (کچه %s)</string>
<string name="images_uploaded">انځورونه راپورته‌شول</string>
<string name="image_reverts">انځورونه په څټ‌گرځول‌شوي نه دي</string>
<string name="images_used_by_wiki">کارول‌شوي انځورونه</string>
<string name="error_occurred">تېروتنه رامنځته شوه!</string>
<string name="preference_author_name">د ليکوال نوم دوديزول</string>
<string name="contributions_fragment">ونډې</string>
<string name="nearby_fragment">څېرمه</string>
<string name="notifications">خبرتياوې</string>
<string name="read_notifications">خبرتیاوې (لوستل‌شوې)</string>
<string name="display_nearby_notification">څېرمه خبرتياوې ښکاره‌کول</string>
<string name="list_sheet">لړليک</string>
<string name="storage_permission">زخيره کولو اجازه</string>
<string name="next">راتلونکی</string>
<string name="previous">مخکنی</string>
<string name="title_page_bookmarks_pictures">انځورونه</string>
<string name="title_page_bookmarks_locations">ځايونه</string>
<string name="title_page_bookmarks_categories">وېشنيزې</string>
<string name="menu_bookmark">په کتاب‌نښو کې ورگډول/لرې‌کول</string>
<string name="provider_bookmarks">کتاب‌‌نښې</string>
<string name="bookmark_empty">تاسو هېڅ کتاب‌نښې نه دې ورگډې‌کړې</string>
<string name="provider_bookmarks_location">کتاب‌نښې</string>
<string name="deletion_reason_uploaded_by_mistake">په تېروتنې سره مې راپورته‌کړی دی</string>
<string name="deletion_reason_publicly_visible">زه نه پوهېدم چې دا به ټولو ته ښکاره شي</string>
<string name="deletion_reason_bad_for_my_privacy">زه پوه شوم چې دا زما د پټنتيا لپاره بد دی</string>
<string name="deletion_reason_no_longer_want_public">زما اند توپير وکړ، زه نه غواړم چې دا نور په ټوليزه توگه ښکاره شي</string>
<string name="deletion_reason_not_interesting">په بښنې سره دا انځور د يو پوهنغونډ لپاره خواپورې نه دی</string>
<string name="no_categories_selected">هېڅ وېشنيزې نه دې ټاکل شوې</string>
<string name="ends_on">پای ته رسېږي په:</string>
<string name="display_campaigns">ټاکنيزې‌سيالۍ ښکاره‌کول</string>
<string name="display_campaigns_explanation">روانې ټاکنيزې‌سيالۍ وگورئ</string>
@ -310,6 +352,113 @@
<string name="review_spam">ايا دا د منلو وړ دي؟</string>
<string name="review_thanks">ايا تاسو غواړئ له ونډه‌وال نه مننه وکړئ؟</string>
<string name="review_spam_explanation">که دا انځور ټولگټی نه وي؛ نو ړنگېدو ته د نوماندولو لپاره يې په نه کليک وکړئ.</string>
<string name="review_thanks_yes_button_text">بل انځور</string>
<string name="review_thanks_no_button_text">هو، ولې نه</string>
<string name="exif_tag_name_author">ليکوال</string>
<string name="exif_tag_name_copyright">لمېسل‌رېښتې</string>
<string name="exif_tag_name_location">ځای</string>
<string name="exif_tag_name_cameraModel">کامرې نمونه</string>
<string name="exif_tag_name_serialNumbers">د لړۍ شمېرې</string>
<string name="exif_tag_name_software">پوستغالی</string>
<string name="media_location_permission_denied">د رسنيو ځای ته لاسرسی رد شو</string>
<string name="share_via">کاريال د...لارې وېشل</string>
<string name="image_info">انځور مالومات</string>
<string name="no_categories_found">هېڅ وېشنيزې ونه موندل شوې</string>
<string name="delete_helper_ask_reason_copyright_logo">نښان</string>
<string name="delete_helper_ask_alert_set_positive_button_reason">ځکه چې دا</string>
<string name="category_edit_helper_make_edit_toast">د وېشنيزو هم‌‌مهالولو هڅه‌کول.</string>
<string name="category_edit_helper_show_edit_title">وېشنيزه هم‌مهالول</string>
<string name="category_edit_helper_show_edit_title_success">بریالیتوب</string>
<string name="category_edit_helper_edit_message_else">وېشنيزې نشي ورگډېدای.</string>
<string name="category_edit_button_text">وېشنيزې هم‌مهالول</string>
<string name="depictions_edit_helper_make_edit_toast">د ښودنو هم‌مهالولو هڅه‌کول.</string>
<string name="depictions_edit_helper_show_edit_title">ښودنې سمول</string>
<string name="description_edit_helper_show_edit_title">څرگنداوی هم‌مهالول</string>
<string name="caption_edit_helper_show_edit_title">نيونگ هم‌مهالول</string>
<string name="coordinates_edit_helper_show_edit_title_success">بریالیتوب</string>
<string name="coordinates_edit_helper_show_edit_message">همغږيتوبونه %1$s ورگډ شول.</string>
<string name="description_edit_helper_show_edit_message">څرگنداوي ورگډل شول.</string>
<string name="caption_edit_helper_show_edit_message">نيونگ ورگډ شو.</string>
<string name="coordinates_edit_helper_edit_message_else">همغږيتوبونه نشي ورگډېدای.</string>
<string name="description_edit_helper_edit_message_else">څرگنداوی نشي ورگډېدای.</string>
<string name="share_image_via">انځور وېشل په وسيله د</string>
<string name="theme_dark_name">تياره</string>
<string name="theme_light_name">روښانه</string>
<string name="ask_to_turn_location_on">ځای‌ښودنه بلول</string>
<string name="load_more">نور بارول</string>
<string name="confirm">تاييدول</string>
<string name="instructions_title">لارښوونې</string>
<string name="wikipedia_instructions_step_1">۱. لاندې ويکي‌ليک وکاروئ:</string>
<string name="pause">درول‌</string>
<string name="resume">بياپيلول</string>
<string name="paused">درول‌شوی</string>
<string name="more">نور</string>
<string name="bookmarks">کتاب‌‌نښې</string>
<string name="achievements_tab_title">لاسته‌راوړنې</string>
<string name="leaderboard_tab_title">سرمشريزه</string>
<string name="rank_prefix">درجه:</string>
<string name="count_prefix">شمېر:</string>
<string name="leaderboard_column_rank">درجه</string>
<string name="leaderboard_column_user">کارن</string>
<string name="leaderboard_column_count">شمېر</string>
<string name="setting_avatar_dialog_title">د سرمشريزې ځان‌بڼې په توگه اوڼل</string>
<string name="setting_avatar_dialog_message">ځان‌بڼې په توگه اوڼل کېږي، مهرباني وکړئ په تمه شئ</string>
<string name="avatar_set_successfully">ځان‌بڼې ټولگه</string>
<string name="menu_set_avatar">ځان‌بڼې په توگه اوڼل</string>
<string name="leaderboard_yearly">کلنی</string>
<string name="leaderboard_weekly">اوونيز</string>
<string name="leaderboard_all_time">هرمهاله</string>
<string name="leaderboard_upload">راپورته‌کول</string>
<string name="leaderboard_nearby">څېرمه</string>
<string name="leaderboard_used">کارول‌شوی</string>
<string name="leaderboard_my_rank_button_text">زما رتبه</string>
<string name="limited_connection_enabled">محدودې نښلېدا ونگ‌ډول چارن‌شوی!</string>
<string name="statistics_quality">ښه انځورونه</string>
<string name="image_location">انځور ځی</string>
<string name="label">نښکه</string>
<string name="description">څرگنداوی</string>
<string name="title_page_bookmarks_items">توکي</string>
<string name="custom_selector_title">دوديز ټاکونکی</string>
<string name="custom_selector_empty_text">انځورونه نشته</string>
<string name="done">وشو</string>
<string name="back">پر شا کېدل</string>
<string name="welcome_custom_picture_selector_text">دوديزه انځور پاکوونکي ته ښه راغلاست</string>
<string name="welcome_custom_selector_ok">په‌زړه‌پورې</string>
<string name="custom_selector_dismiss_limit_warning_button_text">تړل</string>
<string name="need_permission">اجازې ته اړتيا لري</string>
<string name="menu_view_user_page">کارن پېژنيال کتل</string>
<string name="edit_categories">وېشنيزې سمول</string>
<string name="apply">پلي‌کول</string>
<string name="reset">له‌سره‌اوڼل</string>
<string name="location_message">ځای اومتوکي له ويکي کارنانو سره مرسته کوي چې ستاسو انځور موندلو او لا ډېر گټور کولو کې مرسته کوي.\nستاسو وروستۍ راپورته‌کېدنې ځای نه لري.\nموږ تاسو ته سپارښته کوو چې خپل د ځای ښودنه د کامرې په کاريال په اوڼنو کې بل کړئ.\nله راپورته کولو مو مننه!</string>
<string name="no_location_found_title">هېڅ ځای ونه موندل شو</string>
<string name="add_location">ځای ورگډول</string>
<string name="explore_map_details">سپيناوی</string>
<string name="android_version">اندرويد بلبڼه</string>
<string name="device_name">وسيلې نوم</string>
<string name="thanks_feedback">له غبرگون ورکولو مو مننه</string>
<string name="edit_image">انځور سمول</string>
<string name="edit_location">ځای سمول</string>
<string name="location_updated">ځای هم‌مهاله‌شو</string>
<string name="remove_location">ځای لرې‌کول</string>
<string name="remove_location_warning_title">ځای گواښنه لرې‌کول</string>
<string name="uploads">راپورته‌کېدنې</string>
<string name="pending">په تمه</string>
<string name="failed">پاتې راغلی</string>
<string name="could_not_load_place_data">ځای اومتوکي نشي بارېدای</string>
<string name="custom_selector_confirm_deletion_title">ړنگول تایید کړئ</string>
<string name="custom_selector_delete">ړنگول</string>
<string name="custom_selector_cancel">ناگارل</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">يواړخيزه‌وېب‌کتنې‌چاره</string>
<string name="account">گڼون</string>
<string name="vanish_account">گڼون له منځه وړل</string>
<string name="account_vanish_request_confirm_title">د گڼون له منځه وړلو گواښنه</string>
<string name="caption">نيونگ</string>
<string name="caption_copied_to_clipboard">نيونگ ټينگدړې ته ولمېسل شو</string>
<string name="nominated_for_deletion_btn">ړنگولو ته نومول‌شوې</string>
</resources>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Authors:
* Albertoleoncio
* Athena in Wonderland
* B3rnas
* Caiofernandes
@ -44,29 +45,29 @@
<string name="nearby_filter_state">Estado do Local</string>
<string name="appwidget_img">Imagem do Dia</string>
<plurals name="uploads_pending_notification_indicator">
<item quantity="one">a carregar %1$d ficheiro</item>
<item quantity="other">a carregar %1$d ficheiros</item>
<item quantity="one">a enviar %1$d ficheiro</item>
<item quantity="other">a enviar %1$d ficheiros</item>
</plurals>
<plurals name="contributions_subtitle">
<item quantity="one">(%1$d)</item>
<item quantity="other">(%1$d)</item>
</plurals>
<string name="starting_uploads">A iniciar carregamentos</string>
<string name="starting_uploads">A iniciar envios</string>
<plurals name="starting_multiple_uploads">
<item quantity="one">A processar %d carregamento</item>
<item quantity="other">A processar %d carregamentos</item>
<item quantity="one">A processar %d envio</item>
<item quantity="other">A processar %d envios</item>
</plurals>
<plurals name="multiple_uploads_title">
<item quantity="one">%d carregamento</item>
<item quantity="other">%d carregamentos</item>
<item quantity="one">%d envio</item>
<item quantity="other">%d envios</item>
</plurals>
<plurals name="share_license_summary">
<item quantity="one">Esta imagem será licenciada com a %1$s</item>
<item quantity="other">Estas imagens serão licenciadas com a %1$s</item>
</plurals>
<plurals name="upload_count_title">
<item quantity="one">%1$d carregamento</item>
<item quantity="other">%1$d carregamentos</item>
<item quantity="one">%1$d envio</item>
<item quantity="other">%1$d envios</item>
</plurals>
<plurals name="receiving_shared_content">
<item quantity="one">A receber conteúdo partilhado. O processamento da imagem pode demorar algum tempo, dependendo do tamanho da mesma e do seu dispositivo</item>
@ -83,8 +84,8 @@
<string name="upload_in_progress">Envio em progresso</string>
<string name="username">Nome de utilizador</string>
<string name="password">Palavra-passe</string>
<string name="login_credential">Entrar na sua conta da wiki Commons Beta</string>
<string name="login">Entrar</string>
<string name="login_credential">Inicie a sessão na sua conta de Commons Beta</string>
<string name="login">Iniciar sessão</string>
<string name="forgot_password">Esqueceu-se da palavra-passe?</string>
<string name="signup">Registar-se</string>
<string name="logging_in_title">A iniciar sessão</string>
@ -99,27 +100,27 @@
<string name="suggest_unrestricted_mode">O carregamento de mais de três imagens funciona de maneira mais fiável quando a otimização da bateria está desligada. Desligue a otimização da bateria para a aplicação Commons nas configurações, de forma a ter uma experiência de carregamento mais fluida. \n\nPossíveis passos para desativar a otimização da bateria:\n\nEtapa 1: premir o botão \'Configurações\' abaixo.\n\nEtapa 2: mudar de \'Não otimizado\' para \'Todas as aplicações\'.\n\nEtapa 3: pesquisar \"Commons\" ou \"fr.free.nrw.commons\".\n\nEtapa 4: premir esta e selecionar \'Não otimizar\'.\n\nEtapa 5: pressionar \'Concluído\'.</string>
<string name="authentication_failed">Falha na autenticação. Por favor faça login novamente.</string>
<string name="uploading_started">Carregamento iniciado!</string>
<string name="uploading_queued">Fila de carregamento (modo de ligação limitada ativado)</string>
<string name="upload_completed_notification_title">%1$s carregado!</string>
<string name="upload_completed_notification_text">Toque para ver o seu carregamento</string>
<string name="upload_progress_notification_title_start">A carregar o ficheiro %s</string>
<string name="upload_progress_notification_title_in_progress">A carregar %1$s</string>
<string name="upload_progress_notification_title_finishing">A terminar o carregamento de %1$s</string>
<string name="upload_failed_notification_title">O carregamento de %1$s falhou</string>
<string name="upload_paused_notification_title">Carregamento de %1$s em pausa</string>
<string name="uploading_queued">Envio em fila (modo de ligação limitada ativado)</string>
<string name="upload_completed_notification_title">%1$s enviado!</string>
<string name="upload_completed_notification_text">Toque para ver o seu envio</string>
<string name="upload_progress_notification_title_start">A enviar o ficheiro %s</string>
<string name="upload_progress_notification_title_in_progress">A enviar %1$s</string>
<string name="upload_progress_notification_title_finishing">A terminar o envio de %1$s</string>
<string name="upload_failed_notification_title">O envio de %1$s falhou</string>
<string name="upload_paused_notification_title">Envio de %1$s pausado</string>
<string name="upload_failed_notification_subtitle">Tocar para ver</string>
<string name="upload_paused_notification_subtitle">Tocar para ver</string>
<string name="title_activity_contributions">Carregamentos recentes</string>
<string name="contribution_state_queued">Em espera</string>
<string name="contribution_state_failed">Falhado</string>
<string name="contribution_state_in_progress">%1$d%% transferido</string>
<string name="contribution_state_starting">A carregar</string>
<string name="title_activity_contributions">Meus Envios Recentes</string>
<string name="contribution_state_queued">Em fila</string>
<string name="contribution_state_failed">Falhou</string>
<string name="contribution_state_in_progress">%1$d%% concluído</string>
<string name="contribution_state_starting">A enviar</string>
<string name="menu_from_gallery">Da galeria</string>
<string name="menu_from_camera">Tirar foto</string>
<string name="menu_from_camera">Tirar fotografia</string>
<string name="menu_nearby">Nas redondezas</string>
<string name="provider_contributions">Carregamentos</string>
<string name="menu_copy_link">Copiar ligação</string>
<string name="menu_link_copied">A ligação foi copiada para a área de transferência</string>
<string name="provider_contributions">Meus envios</string>
<string name="menu_copy_link">Copiar hiperligação</string>
<string name="menu_link_copied">A hiperligação foi copiada para a área de transferência</string>
<string name="menu_share">Partilhar</string>
<string name="menu_view_file_page">Ver página do ficheiro</string>
<string name="share_title_hint">Legenda (obrigatória)</string>
@ -132,13 +133,14 @@
<string name="login_failed_2fa_needed">Tem de fornecer o seu código de autenticação de dois fatores.</string>
<string name="login_failed_email_auth_needed">Foi enviado um código de verificação de autenticação para o seu endereço de correio eletrónico. Por favor, forneça o código para iniciar a sessão.</string>
<string name="login_failed_generic">O início de sessão falhou</string>
<string name="share_upload_button">Carregar</string>
<string name="share_upload_button">Enviar</string>
<string name="multiple_share_base_title">Dê um nome a este conjunto</string>
<string name="provider_modifications">Modificações</string>
<string name="menu_upload_single">Carregar</string>
<string name="categories_search_text_hint">Pesquisar categorias</string>
<string name="depicts_search_text_hint">Procurar elementos que o seu conteúdo multimédia retrata (montanha, o Taj Mahal, etc.)</string>
<string name="menu_save_categories">Gravar</string>
<string name="menu_overflow_desc">Menu de fluxo</string>
<string name="refresh_button">Atualizar</string>
<string name="display_list_button">Lista</string>
<string name="contributions_subtitle_zero">(Ainda não foi carregado nenhum ficheiro)</string>
@ -148,7 +150,7 @@
<string name="no_parent_classes">%1$s não tem nenhuma classe progenitora</string>
<string name="categories_skip_explanation">Adicione categorias para tornar as suas imagens mais fáceis de encontrar na wiki Wikimedia Commons.\nComece a escrever para adicionar categorias.</string>
<string name="categories_activity_title">Categorias</string>
<string name="title_activity_settings">Configurações</string>
<string name="title_activity_settings">Definições</string>
<string name="title_activity_signup">Registar-se</string>
<string name="title_activity_featured_images">Imagens destacadas</string>
<string name="title_activity_custom_selector">Seletor personalizado</string>
@ -784,17 +786,21 @@
<string name="file_saved_successfully">Ficheiro guardado com sucesso</string>
<string name="do_you_want_to_open_gpx_file">Deseja abrir o ficheiro GPX?</string>
<string name="do_you_want_to_open_kml_file">Deseja abrir o ficheiro KML?</string>
<string name="failed_to_save_kml_file">Não foi possível guardar o ficheiro KML.</string>
<string name="failed_to_save_gpx_file">Não foi possível guardar o ficheiro GPX.</string>
<string name="saving_kml_file">Guardar Ficheiro KML</string>
<string name="saving_gpx_file">Guardar Ficheiro GPX</string>
<plurals name="custom_picker_images_selected_title_appendix">
<item quantity="one">%d imagem selecionada</item>
<item quantity="other">%d imagens selecionadas</item>
</plurals>
<string name="nearby_wikitalk">Reporte um problema sobre este item na Wikidados</string>
<string name="multiple_files_depiction_header">Nota sobre múltiplos envios</string>
<string name="nearby_wikitalk">Reporte um problema sobre este item no Wikidata</string>
<string name="please_enter_some_comments">Por favor, insira alguns comentários</string>
<string name="talk">Discussão</string>
<string name="other_problem_or_information_please_explain_below">Outro problema ou informação (por favor, explique em baixo).</string>
<string name="feedback_destination_note">O seu comentário é publicado na seguinte página da wiki: &lt;a href=\"https://commons.wikimedia.org/wiki/Commons:Mobile_app/Feedback\"&gt;Commons:Mobile app/Feedback&lt;/a&gt;</string>
<string name="cancelling_all_the_uploads">A cancelar todos os envios...</string>
<string name="uploads">Envios</string>
<string name="pending">Pendente</string>
<string name="failed">Falhou</string>
@ -803,6 +809,8 @@
<string name="custom_selector_confirm_deletion_title">Confirmar Eliminação</string>
<string name="custom_selector_delete">Eliminar</string>
<string name="custom_selector_cancel">Cancelar</string>
<string name="error_while_loading">Erro ao carregar</string>
<string name="no_usages_found">Não foram encontradas utilizações</string>
<string name="usages_on_commons_heading">Commons</string>
<string name="usages_on_other_wikis_heading">Outras wikis</string>
<string name="file_usages_container_heading">Utilização de ficheiro</string>

View file

@ -6,6 +6,7 @@
* Annick green
* Cabal
* Googology
* H78c67c
* LeGuyanaisPure
* Liuxinyu970226
* Madhurgupta10
@ -28,7 +29,7 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="all">
<string name="submit">{{Identical|Submit}}</string>
<string name="nearby_all">{{identical|All}}</string>
<string name="nearby_filter_search">Reba ishakiro</string>
<string name="nearby_filter_search"/>
<string name="uploads_pending_notification_indicator">Status text about number of uploads left.\n* %1$d represents number of uploads left, including current one</string>
<string name="contributions_subtitle">See the current issue [https://phabricator.wikimedia.org/T267142 T267142] tracked in Phabricator about the &lt;code&gt;&lt;nowiki&gt;|zero=&lt;/nowiki&gt;&lt;/code&gt; option currently not supported on Translatewiki.net with the custom &lt;code&gt;&lt;nowiki&gt;{{PLURAL}}&lt;/nowiki&gt;&lt;/code&gt; rules used by this project for Android, using a non-MediaWiki syntax.</string>
<string name="multiple_uploads_title">{{Identical|Upload}}</string>

View file

@ -94,7 +94,7 @@
<string name="menu_upload_single">Otpremi</string>
<string name="categories_search_text_hint">Pretraži kategorije</string>
<string name="menu_save_categories">Snimi</string>
<string name="refresh_button">Preučitaj</string>
<string name="refresh_button">Osvježi</string>
<string name="display_list_button">Lista</string>
<string name="contributions_subtitle_zero">(Još uvijek nema postavljenih datoteka)</string>
<string name="categories_not_found">Nema kategorija što odgovoraju %1$s</string>
@ -154,7 +154,7 @@
<string name="detail_description_empty">Nema opisa</string>
<string name="detail_discussion_empty">Nema razgovora</string>
<string name="detail_license_empty">Nepoznata licenca</string>
<string name="menu_refresh">Preučitaj</string>
<string name="menu_refresh">Osvježi</string>
<string name="read_storage_permission_rationale">Potrebno ovlaštenje: Čitanje vanjske memorije. Aplikacija ne može pristupiti galeriji bez toga.</string>
<string name="write_storage_permission_rationale">Potrebno ovlaštenje: Pisanje u vanjskoj memoriji. Aplikacija ne može pristupiti kameri/galeriji bez toga.</string>
<string name="ok">U redu</string>

View file

@ -243,6 +243,7 @@
<string name="media_detail_description">Опис</string>
<string name="media_detail_discussion">Обговорення</string>
<string name="media_detail_author">Автор</string>
<string name="media_detail_uploader">Завантажувач</string>
<string name="media_detail_uploaded_date">Дата завантаження</string>
<string name="media_detail_license">Ліцензія</string>
<string name="media_detail_coordinates">Координати</string>
@ -792,7 +793,7 @@
<string name="permissions_are_required_for_functionality">Для роботи потрібні дозволи</string>
<string name="learn_how_to_write_a_useful_description">Дізнайтеся, як написати корисний опис</string>
<string name="learn_how_to_write_a_useful_caption">Дізнайтеся, як написати корисний підпис</string>
<string name="see_your_achievements" fuzzy="true">Перегляньте свої досягнення</string>
<string name="see_your_achievements">Перегляньте свої досягнення</string>
<string name="edit_image">Редагувати зображення</string>
<string name="edit_location">Редагувати розташування</string>
<string name="location_updated">Розташування оновлено</string>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Authors:
* Bapham123
* Bluetpp
* Băng Tỏa
* Caden99
@ -26,6 +27,11 @@
<string name="commons_logo">Biểu trưng Commons</string>
<string name="commons_website">Trang Web Commons</string>
<string name="add_another_description">Thêm mô tả</string>
<string name="add_new_contribution">Thêm đóng góp mới</string>
<string name="add_contribution_from_camera">Thêm đóng góp từ máy ảnh</string>
<string name="show_captions_description">Miêu tả</string>
<string name="nearby_row_image">Hình ảnh</string>
<string name="nearby_all">Tất cả</string>
<plurals name="uploads_pending_notification_indicator">
<item quantity="one">%1$d tập tin đang được tải lên</item>
<item quantity="other">%1$d tập tin đang được tải lên</item>
@ -52,6 +58,7 @@
<string name="app_name">Commons</string>
<string name="menu_settings">Thiết lập</string>
<string name="intent_share_upload_label">Đăng tải lên Commons</string>
<string name="upload_in_progress">Đang tải lên</string>
<string name="username">Tên người dùng</string>
<string name="password">Mật khẩu</string>
<string name="login_credential">Đăng nhập vào tài khoản Commons Beta của bạn</string>
@ -64,6 +71,7 @@
<string name="login_success" fuzzy="true">Đã đăng nhập thành công!</string>
<string name="login_failed" fuzzy="true">Đăng nhập thất bại!</string>
<string name="upload_failed">Không tìm thấy tập tin. Xin vui lòng thử tập tin khác.</string>
<string name="unrestricted_battery_mode">Tắt tính năng tối ưu hóa pin?</string>
<string name="authentication_failed" fuzzy="true">Xác thực thất bại, vui lòng đăng nhập lại</string>
<string name="uploading_started">Đã bắt đầu tải lên!</string>
<string name="upload_completed_notification_title">Đã tải lên %1$s!</string>
@ -82,6 +90,7 @@
<string name="menu_from_camera">Chụp ảnh</string>
<string name="menu_nearby">Lân cận</string>
<string name="provider_contributions">Tập tin tôi tải lên</string>
<string name="menu_copy_link">Sao chép địa chỉ liên kết</string>
<string name="menu_share">Chia sẻ</string>
<string name="share_title_hint" fuzzy="true">Tựa đề (Yêu cầu)</string>
<string name="share_description_hint">Miêu tả</string>
@ -179,6 +188,7 @@
<string name="become_a_tester_title">Trở thành người dùng thử nghiệm</string>
<string name="become_a_tester_description">Tham gia kênh thử nghiệm của chúng tôi trên Google Play và nhận các tính năng mới cùng những bản sửa lỗi sớm hơn</string>
<string name="_2fa_code">Mã Hai Nhân tố</string>
<string name="email_auth_code">Mã xác minh email</string>
<string name="logout_verification">Bạn có chắc chắn muốn đăng xuất?</string>
<string name="mediaimage_failed">Hình ảnh bị Thất bại</string>
<string name="welcome_image_mount_zao">Núi Zaō</string>
@ -197,9 +207,11 @@
<string name="navigation_item_about">Giới thiệu</string>
<string name="navigation_item_settings">Thiết lập</string>
<string name="navigation_item_feedback">Phản hồi</string>
<string name="navigation_item_feedback_github">Phản hồi qua Github</string>
<string name="navigation_item_logout">Đăng xuất</string>
<string name="navigation_item_info">Hướng dẫn</string>
<string name="navigation_item_notification">Thông báo</string>
<string name="navigation_item_review">Duyệt</string>
<string name="no_description_found">không tìm thấy miêu tả</string>
<string name="nearby_info_menu_commons_article">Trang tập tin Commons</string>
<string name="nearby_info_menu_wikidata_article">Khoản mục Wikidata</string>
@ -211,6 +223,7 @@
<string name="upload_problem_different_geolocation">Bức ảnh này được chụp ở một địa điểm khác.</string>
<string name="upload_problem_fbmd">Vui lòng chỉ đăng tải hình ảnh bạn đã tự chụp. Xin đừng đăng tải hình ảnh bạn tìm thấy trên tài không Facebook của người khác.</string>
<string name="upload_problem_do_you_continue">Bạn vẫn muốn đăng tải bức ảnh này?</string>
<string name="upload_connection_error_alert_title">Lỗi kết nối</string>
<string name="use_external_storage" fuzzy="true">Sử dụng thiết bị lưu trữ bên ngoài</string>
<string name="use_external_storage_summary" fuzzy="true">Lưu các hình ảnh được chụp bằng máy chụp hình trong ứng dụng vào thiết bị của bạn</string>
<string name="login_to_your_account">Đăng nhập vào tài khoản của bạn</string>
@ -222,7 +235,12 @@
<string name="nominated_for_deletion">Có đề nghị xóa hình này.</string>
<string name="skip_login">Bỏ qua</string>
<string name="navigation_item_login">Đăng nhập</string>
<string name="nearby_location_not_available" fuzzy="true">Vị trí không có sẵn.</string>
<string name="login_alert_message">Vui lòng đăng nhập để sử dụng được tính năng này</string>
<string name="copy_wikicode">Sao chép wikitext vào bảng tạm</string>
<string name="wikicode_copied">Wikitext đã được sao chép vào bảng tạm</string>
<string name="nearby_location_not_available">Gần đó có thể hoạt động không đúng. Vị trí không có sẵn.</string>
<string name="nearby_showing_pins_offline">Không có kết nối mạng. Chỉ hiển thị các địa điểm được lưu trong bộ nhớ đệm.</string>
<string name="upload_location_access_denied">Quyền truy cập vị trí bị từ chối. Vui lòng thiết lập vị trí thủ công để sử dụng được tính năng này.</string>
<string name="location_permission_rationale_nearby">Bạn cần cho phép để hiển thị danh sách nơi lân cận</string>
<string name="nearby_directions">Hướng dẫn</string>
<string name="nearby_wikidata">Wikidata</string>
@ -243,11 +261,68 @@
<string name="no_images_found">Không tìm thấy hình ảnh!</string>
<string name="error_loading_images">Đã xuất hiện lỗi khi tải hình ảnh.</string>
<string name="image_uploaded_by">Tải lên bởi: %1$s</string>
<string name="block_notification_title">Đã bị cấm</string>
<string name="menu_search_button">Tìm kiếm</string>
<string name="title_activity_search">Tìm kiếm</string>
<string name="search_recent_header">Tìm kiếm gần đây:</string>
<string name="search_tab_title_media">Phương tiện</string>
<string name="search_tab_title_categories">Thể loại</string>
<string name="search_tab_title_depictions">Khoản mục</string>
<string name="explore_tab_title_featured">Chọn lọc</string>
<string name="explore_tab_title_mobile">Đã tải lên qua thiết bị di động</string>
<string name="explore_tab_title_map">Bản đồ</string>
<string name="successful_wikidata_edit">Hình ảnh đã được thêm vào %1$s trên Wikidata!</string>
<string name="menu_set_wallpaper">Đặt làm hình nền</string>
<string name="wallpaper_set_successfully">Đã thiết lập hình nền thành công!</string>
<string name="quiz">Thách đố</string>
<string name="question">Câu hỏi</string>
<string name="result">Kết quả</string>
<string name="taj_mahal_answer">Hình chứa di tích và cảnh vật thiên nhiên thường được chấp nhận tải lên ở hầu hết các quốc gia. Xin lưu ý rằng các công trình nghệ thuật được trưng bày tạm thời thường có bản quyền và không được chấp nhận tải lên.</string>
<string name="user_not_logged_in">Lượt đăng nhập đã hết hạn. Vui lòng đăng nhập lại</string>
<string name="continue_message">Tiếp tục</string>
<string name="correct">Câu trả lời chính xác</string>
<string name="wrong">Câu trả lời sai</string>
<string name="share_app_title">Chia sẻ Ứng dụng</string>
<string name="error_fetching_nearby_places" fuzzy="true">Lỗi khi lấy các nơi lân cận.</string>
<string name="no_recent_searches">Không có kết quả tìm kiếm gần đây</string>
<string name="delete_recent_searches_dialog">Bạn có chắc chắn muốn xóa lịch sử tìm kiếm của bạn không?</string>
<string name="delete_search_dialog">Bạn có muốn xóa kết quả tìm kiếm này không?</string>
<string name="search_history_deleted">Lịch sử tìm kiếm đã bị xóa</string>
<string name="delete">Xóa</string>
<string name="Profile">Hồ sơ</string>
<string name="badges">Huy chương</string>
<string name="statistics">Thống kê</string>
<string name="statistics_featured">Hình ảnh chọn lọc</string>
<string name="images_uploaded">Hình ảnh đã được tải lên</string>
<string name="images_used_by_wiki">Hình ảnh đã được sử dụng</string>
<string name="contributions_fragment">Đóng góp</string>
<string name="nearby_fragment">Lân cận</string>
<string name="notifications">Thông báo</string>
<string name="read_notifications">Thông báo (đọc)</string>
<string name="display_nearby_notification">Hiển thị thông báo gần đây</string>
<string name="list_sheet">Danh sách</string>
<string name="next">Tiếp</string>
<string name="previous">Trước</string>
<string name="title_page_bookmarks_categories">Thể loại</string>
<string name="back_button_continue">Tiếp tục tải lên</string>
<string name="search_this_area">Tìm kiếm khu vực này</string>
<string name="nearby_card_permission_title">Yêu cầu quyền</string>
<string name="option_allow">Cho phép</string>
<string name="option_dismiss">Bỏ qua</string>
<string name="nominate_for_deletion_done">Xong</string>
<string name="send_thank_success_title">Gửi lời cảm ơn: Thành công</string>
<string name="send_thank_failure_title">Gửi lời cảm ơn: Thất bại</string>
<string name="review_thanks_yes_button_text">Hình ảnh sau</string>
<string name="review_thanks_no_button_text">Vâng, tại sao không?</string>
<string name="please_wait">Vui lòng chờ...</string>
<string name="copied_successfully">Đã sao chép</string>
<string name="skip_image">Bỏ qua hình ảnh này</string>
<string name="exif_tag_name_author">Tác giả</string>
<string name="exif_tag_name_copyright">Bản quyền</string>
<string name="exif_tag_name_location">Vị trí</string>
<string name="exif_tag_name_cameraModel">Dòng máy ảnh</string>
<string name="delete_helper_show_deletion_title_success">Thành công</string>
<string name="delete_helper_show_deletion_title_failed">Thất bại</string>
<string name="category_edit_helper_make_edit_toast">Đang cố gắng cập nhật danh mục.</string>
<string name="category_edit_helper_show_edit_title">Cập nhật danh mục</string>
<string name="category_edit_helper_show_edit_title_success">Thành công</string>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="initial_margin_top" type="id" />
<item name="initial_margin_bottom" type="id" />
<item name="initial_margin_left" type="id" />
<item name="initial_margin_right" type="id" />
</resources>

View file

@ -123,6 +123,9 @@
<item name="custom_selector_back">@drawable/ic_arrow_back_black</item>
<item name="android:windowEnableSplitTouch">false</item>
<item name="android:splitMotionEvents">false</item>
<!--For edge to edge backward compatibility-->
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
</style>
<style name="LightMoreBottomSheetStyle" parent="LightAppTheme">

View file

@ -1,50 +1,32 @@
SELECT
?item
(SAMPLE(?label) AS ?label)
(SAMPLE(?class) AS ?class)
(SAMPLE(?description) AS ?description)
(SAMPLE(?classLabel) AS ?classLabel)
(SAMPLE(?pic) AS ?pic)
(SAMPLE(?destroyed) AS ?destroyed)
(SAMPLE(?endTime) AS ?endTime)
(SAMPLE(?wikipediaArticle) AS ?wikipediaArticle)
(SAMPLE(?commonsArticle) AS ?commonsArticle)
(SAMPLE(?commonsCategory) AS ?commonsCategory)
(SAMPLE(?dateOfOfficialClosure) AS ?dateOfOfficialClosure)
(SAMPLE(?pointInTime) AS ?pointInTime)
?itemLabel
?itemDescription
?class
?classLabel
?pic
?destroyed
?endTime
?wikipediaArticle
?commonsArticle
?commonsCategory
?dateOfOfficialClosure
?pointInTime
WHERE {
SERVICE <https://query.wikidata.org/sparql> {
values ?item {
${ENTITY}
}
VALUES ?item {${ENTITY}}
}
# Get the label in the preferred language of the user, or any other language if no label is available in that language.
OPTIONAL {?item rdfs:label ?itemLabelPreferredLanguage. FILTER (lang(?itemLabelPreferredLanguage) = "${LANG}")}
OPTIONAL {?item rdfs:label ?itemLabelAnyLanguage}
BIND(COALESCE(?itemLabelPreferredLanguage, ?itemLabelAnyLanguage, "?") as ?label)
# Get item label/class label/description in the preferred language of the user, or fallback.
SERVICE wikibase:label { bd:serviceParam wikibase:language "${LANG},en,aa,ab,ae,af,ak,am,an,ar,as,av,ay,az,ba,be,bg,bh,bi,bm,bn,bo,br,bs,ca,ce,ch,co,cr,cs,cu,cv,cy,da,de,dv,dz,ee,el,eo,es,et,eu,fa,ff,fi,fj,fo,fr,fy,ga,gd,gl,gn,gu,gv,ha,he,hi,ho,hr,ht,hu,hy,hz,ia,id,ie,ig,ii,ik,io,is,it,iu,ja,jv,ka,kg,ki,kj,kk,kl,km,kn,ko,kr,ks,ku,kv,kw,ky,la,lb,lg,li,ln,lo,lt,lu,lv,mg,mh,mi,mk,ml,mn,mo,mr,ms,mt,my,na,nb,nd,ne,ng,nl,nn,no,ny,oc,oj,om,or,os,pa,pi,pl,ps,pt,qu,rm,rn,ro,ru,rw,sa,sc,sd,se,sg,sh,si,sk,sl,sm,sn,so,sq,sr,ss,st,su,sv,sw,ta,te,tg,th,ti,tk,tl,tn,to,tr,ts,tt,tw,ty,ug,uk,ur,uz,ve,vi,vo,wa,wo,xh,yi,yo,za,zh,zu". }
# Get the description in the preferred language of the user, or any other language if no description is available in that language.
OPTIONAL {?item schema:description ?itemDescriptionPreferredLanguage. FILTER (lang(?itemDescriptionPreferredLanguage) = "${LANG}")}
OPTIONAL {?item schema:description ?itemDescriptionAnyLanguage}
BIND(COALESCE(?itemDescriptionPreferredLanguage, ?itemDescriptionAnyLanguage, "?") as ?description)
# Get class (such as forest or bridge)
OPTIONAL {?item p:P31/ps:P31 ?class}
# Get the class label in the preferred language of the user, or any other language if no label is available in that language.
OPTIONAL {
?item p:P31/ps:P31 ?class.
OPTIONAL {?class rdfs:label ?classLabelPreferredLanguage. FILTER (lang(?classLabelPreferredLanguage) = "${LANG}")}
OPTIONAL {?class rdfs:label ?classLabelAnyLanguage}
BIND(COALESCE(?classLabelPreferredLanguage, ?classLabelAnyLanguage, "?") as ?classLabel)
}
OPTIONAL {
?item p:P31/ps:P31 ?class.
}
# Get picture
# Get picture (items without a picture will be shown in red on the Nearby map)
OPTIONAL {?item wdt:P18 ?pic}
# Get existence
# Get existence (whether an item still exists or not)
OPTIONAL {?item wdt:P576 ?destroyed}
OPTIONAL {?item wdt:P582 ?endTime}
OPTIONAL {?item wdt:P3999 ?dateOfOfficialClosure}
@ -65,4 +47,3 @@ WHERE {
?commonsArticle schema:isPartOf <https://commons.wikimedia.org/>.
}
}
GROUP BY ?item

View file

@ -1,5 +1,5 @@
[versions]
agp = "8.9.1"
agp = "8.12.0"
acra = "5.8.4"
activityCompose = "1.9.3"
adapterdelegates = "4.3.0"
@ -19,7 +19,7 @@ githubTripletPlay = "2.7.2"
kotlinxCoroutinesRx2 = "1.8.0"
osmdroidAndroid = "6.1.17"
testCore = "1.4.0"
coreKtx = "1.9.0"
coreKtx = "1.16.0"
coreTesting = "2.2.0"
dagger = "2.23"
databindingCompiler = "8.0.2"
@ -57,7 +57,7 @@ preference = "1.2.1"
recyclerview = "1.2.0-alpha02"
recyclerviewFastscroll = "2.0.1"
retrofit = "2.8.1"
robolectric = "4.11.1"
robolectric = "4.14.1"
room = "2.6.1"
rules = "1.5.0"
runner = "1.5.2"

View file

@ -1,6 +1,6 @@
#Sun Apr 23 18:22:54 IST 2023
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists