diff --git a/.github/workflows/android-ci-comment.yml b/.github/workflows/android-ci-comment.yml deleted file mode 100644 index b200c9a70..000000000 --- a/.github/workflows/android-ci-comment.yml +++ /dev/null @@ -1,96 +0,0 @@ -name: Android CI Comment - -on: - workflow_run: - workflows: ["Android CI"] - types: [completed] - branches: [main] - -permissions: - issues: write - -jobs: - comment: - name: Comment on PR with APK links - runs-on: ubuntu-latest - if: github.event.workflow_run.conclusion == 'success' - steps: - - name: Checkout base branch - uses: actions/checkout@v3 - with: - ref: ${{ github.event.workflow_run.head_branch }} - - name: Download Run ID Artifact - uses: actions/download-artifact@v4 - with: - name: run-id - run-id: ${{ github.event.workflow_run.id }} - - - name: Read Run ID - id: read-run-id - run: echo "RUN_ID=$(cat run_id.txt)" >> $GITHUB_ENV - - - name: Comment on PR with APK download links - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - uses: actions/github-script@v6 - with: - script: | - try { - const token = process.env.GH_TOKEN; - if (!token) { - throw new Error('GITHUB_TOKEN is not set.'); - } - - const runId = "${{ env.RUN_ID }}"; - if (!runId) { - throw new Error('Run ID not found.'); - } - - // Get the PR number from the workflow_run event - const prNumber = ${{ github.event.workflow_run.pull_requests[0].number }}; - if (!prNumber) { - console.log('No PR number found in workflow_run event.'); - return; - } - - const { data: { artifacts } } = await github.rest.actions.listWorkflowRunArtifacts({ - owner: context.repo.owner, - repo: context.repo.repo, - run_id: runId - }); - - if (!artifacts || artifacts.length === 0) { - console.log('No artifacts found for this workflow run.'); - return; - } - - const betaArtifact = artifacts.find(artifact => artifact.name === "betaDebugAPK"); - const prodArtifact = artifacts.find(artifact => artifact.name === "prodDebugAPK"); - - if (!betaArtifact || !prodArtifact) { - console.log('Could not find both Beta and Prod APK artifacts.'); - console.log('Available artifacts:', artifacts.map(a => a.name).join(', ')); - return; - } - - const betaDownloadUrl = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/suites/${runId}/artifacts/${betaArtifact.id}`; - const prodDownloadUrl = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/suites/${runId}/artifacts/${prodArtifact.id}`; - - const commentBody = ` - ๐Ÿ“ฑ **APK for pull request is ready to see the changes** ๐Ÿ“ฑ - - [Download Beta APK](${betaDownloadUrl}) - - [Download Prod APK](${prodDownloadUrl}) - `; - - await github.rest.issues.createComment({ - issue_number: prNumber, - owner: context.repo.owner, - repo: context.repo.repo, - body: commentBody - }); - - console.log('Successfully posted comment with APK download links'); - } catch (error) { - console.error('Error in PR comment creation:', error); - core.setFailed(`Workflow failed: ${error.message}`); - } diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 8a744bc0a..bc8b03c9e 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -1,10 +1,6 @@ name: Android CI -on: [push, pull_request, workflow_dispatch] - -permissions: - contents: read - actions: read +on: [push, pull_request, workflow_dispatch] concurrency: group: build-${{ github.event.pull_request.number || github.ref }} @@ -16,17 +12,17 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up JDK - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '17' - name: Cache packages id: cache-packages - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.gradle/caches @@ -41,7 +37,7 @@ jobs: - name: AVD cache if: github.event_name != 'pull_request' - uses: actions/cache@v3 + uses: actions/cache@v4 id: avd-cache with: path: | @@ -106,14 +102,13 @@ jobs: with: name: prodDebugAPK path: app/build/outputs/apk/prod/debug/app-*.apk - - - name: Store Workflow Run ID - if: github.event_name == 'pull_request' - run: echo "${{ github.run_id }}" > run_id.txt - - name: Upload Run ID as Artifact - if: github.event_name == 'pull_request' + - name: Create and PR number artifact + run: | + echo "{\"pr_number\": ${{ github.event.pull_request.number || 'null' }}}" > pr_number.json + + - name: Upload PR number artifact uses: actions/upload-artifact@v4 with: - name: run-id - path: run_id.txt + name: pr_number + path: ./pr_number.json diff --git a/.github/workflows/build-beta.yml b/.github/workflows/build-beta.yml index 933d08e3e..8e1a26e15 100644 --- a/.github/workflows/build-beta.yml +++ b/.github/workflows/build-beta.yml @@ -8,9 +8,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' diff --git a/.github/workflows/comment_artifacts_on_PR.yml b/.github/workflows/comment_artifacts_on_PR.yml new file mode 100644 index 000000000..ee4ae7c46 --- /dev/null +++ b/.github/workflows/comment_artifacts_on_PR.yml @@ -0,0 +1,96 @@ +name: Comment Artifacts on PR + +on: + workflow_run: + workflows: [ "Android CI" ] + types: [ completed ] + +permissions: + pull-requests: write + contents: read + +concurrency: + group: comment-${{ github.event.workflow_run.id }} + cancel-in-progress: true + +jobs: + comment: + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'pull_request' }} + steps: + - name: Download and process artifacts + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const fs = require('fs'); + const runId = context.payload.workflow_run.id; + + const allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: runId, + }); + + const prNumberArtifact = allArtifacts.data.artifacts.find(artifact => artifact.name === "pr_number"); + if (!prNumberArtifact) { + console.log("pr_number artifact not found."); + return; + } + + const download = await github.rest.actions.downloadArtifact({ + owner: context.repo.owner, + repo: context.repo.repo, + artifact_id: prNumberArtifact.id, + archive_format: 'zip', + }); + + fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/pr_number.zip`, Buffer.from(download.data)); + const { execSync } = require('child_process'); + execSync('unzip -q pr_number.zip -d ./pr_number/'); + fs.unlinkSync('pr_number.zip'); + + const prData = JSON.parse(fs.readFileSync('./pr_number/pr_number.json', 'utf8')); + const prNumber = prData.pr_number; + + if (!prNumber || prNumber === 'null') { + console.log("No valid PR number found in pr_number.json. Skipping."); + return; + } + + const artifactsToLink = allArtifacts.data.artifacts.filter(artifact => artifact.name !== "pr_number"); + if (artifactsToLink.length === 0) { + console.log("No artifacts to link found."); + return; + } + + const comments = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: Number(prNumber), + }); + + const oldComments = comments.data.filter(comment => + comment.body.startsWith("โœ… Generated APK variants!") + ); + for (const comment of oldComments) { + await github.rest.issues.deleteComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: comment.id, + }); + console.log(`Deleted old comment ID: ${comment.id}`); + }; + + const commentBody = `โœ… Generated APK variants!\n` + + artifactsToLink.map(artifact => { + const artifactUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}/artifacts/${artifact.id}`; + return `- ๐Ÿค– [Download ${artifact.name}](${artifactUrl})`; + }).join('\n'); + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: Number(prNumber), + body: commentBody + }); diff --git a/app/build.gradle b/app/build.gradle index dbb5458bd..6890177e8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -212,8 +212,8 @@ android { defaultConfig { //applicationId 'fr.free.nrw.commons' - versionCode 1043 - versionName '5.1.2' + versionCode 1046 + versionName '5.1.3' setProperty("archivesBaseName", "app-commons-v$versionName-" + getBranchName()) minSdkVersion 21 diff --git a/app/src/main/java/fr/free/nrw/commons/Media.kt b/app/src/main/java/fr/free/nrw/commons/Media.kt index 293321c27..1222cd8b0 100644 --- a/app/src/main/java/fr/free/nrw/commons/Media.kt +++ b/app/src/main/java/fr/free/nrw/commons/Media.kt @@ -125,6 +125,19 @@ class Media constructor( categoriesHiddenStatus = categoriesHiddenStatus ) + /** + * Returns Author if it's not null or empty, otherwise + * returns user + * @return Author or User + */ + fun getAuthorOrUser(): String? { + return if (!author.isNullOrEmpty()) { + author + } else{ + user + } + } + /** * Gets media display title * @return Media title diff --git a/app/src/main/java/fr/free/nrw/commons/category/GridViewAdapter.kt b/app/src/main/java/fr/free/nrw/commons/category/GridViewAdapter.kt index 5dbcc59fd..0198c61a5 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/GridViewAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/category/GridViewAdapter.kt @@ -98,14 +98,9 @@ class GridViewAdapter( */ @SuppressLint("StringFormatInvalid") private fun setUploaderView(item: Media, uploader: TextView) { - if (!item.author.isNullOrEmpty()) { - uploader.visibility = View.VISIBLE - uploader.text = context.getString( - R.string.image_uploaded_by, - item.user - ) - } else { - uploader.visibility = View.GONE - } + uploader.text = context.getString( + R.string.image_uploaded_by, + item.getAuthorOrUser() + ) } } diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.kt b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.kt index d1dbf4509..32028cfd2 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.kt +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.kt @@ -54,7 +54,7 @@ an upload might take a dozen seconds. */ this.contribution = contribution this.position = position binding.contributionTitle.text = contribution.media.mostRelevantCaption - binding.authorView.text = contribution.media.author + binding.authorView.text = contribution.media.getAuthorOrUser() //Removes flicker of loading image. binding.contributionImage.hierarchy.fadeDuration = 0 diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContract.kt b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContract.kt index 269536428..7027950e3 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContract.kt +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsContract.kt @@ -10,7 +10,7 @@ interface ContributionsContract { interface View { fun showMessage(localizedMessage: String) - fun getContext(): Context + fun getContext(): Context? } interface UserActionListener : BasePresenter { diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.kt b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.kt index 58bc68a52..6d25db39a 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.kt @@ -74,12 +74,9 @@ import java.util.Date import javax.inject.Inject import javax.inject.Named -class ContributionsFragment - - : CommonsDaggerSupportFragment(), FragmentManager.OnBackStackChangedListener, +class ContributionsFragment : CommonsDaggerSupportFragment(), FragmentManager.OnBackStackChangedListener, LocationUpdateListener, MediaDetailProvider, SensorEventListener, ICampaignsView, - ContributionsContract.View, - ContributionsListFragment.Callback { + ContributionsContract.View, ContributionsListFragment.Callback { @JvmField @Inject @Named("default_preferences") @@ -307,9 +304,11 @@ class ContributionsFragment } } notification.setOnClickListener { view: View? -> - startYourself( - context, "unread" - ) + context?.let { + startYourself( + it, "unread" + ) + } } } @@ -500,7 +499,7 @@ class ContributionsFragment private fun setUploadCount() { okHttpJsonApiClient - ?.getUploadCount((activity as MainActivity).sessionManager?.currentAccount!!.name) + ?.getUploadCount(sessionManager?.currentAccount!!.name) ?.subscribeOn(Schedulers.io()) ?.observeOn(AndroidSchedulers.mainThread())?.let { compositeDisposable.add( @@ -889,14 +888,16 @@ class ContributionsFragment * this function updates the number of contributions */ fun upDateUploadCount() { - WorkManager.getInstance(context) - .getWorkInfosForUniqueWorkLiveData(UploadWorker::class.java.simpleName).observe( - viewLifecycleOwner - ) { workInfos: List -> - if (workInfos.size > 0) { - setUploadCount() + context?.let { + WorkManager.getInstance(it) + .getWorkInfosForUniqueWorkLiveData(UploadWorker::class.java.simpleName).observe( + viewLifecycleOwner + ) { workInfos: List -> + if (workInfos.size > 0) { + setUploadCount() + } } - } + } } @@ -953,7 +954,7 @@ class ContributionsFragment Timber.d("Skipping re-upload for non-failed %s", contribution.toString()) } } else { - showLongToast(context, R.string.this_function_needs_network_connection) + context?.let { showLongToast(it, R.string.this_function_needs_network_connection) } } } diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsPresenter.kt b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsPresenter.kt index 617051e52..2a36101b9 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsPresenter.kt +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsPresenter.kt @@ -80,9 +80,11 @@ class ContributionsPresenter @Inject internal constructor( .save(contribution) .subscribeOn(ioThreadScheduler) .subscribe { - makeOneTimeWorkRequest( - view!!.getContext().applicationContext, ExistingWorkPolicy.KEEP - ) + view!!.getContext()?.applicationContext?.let { + makeOneTimeWorkRequest( + it, ExistingWorkPolicy.KEEP + ) + } }) } } diff --git a/app/src/main/java/fr/free/nrw/commons/delete/DeleteHelper.kt b/app/src/main/java/fr/free/nrw/commons/delete/DeleteHelper.kt index be0b2bd79..09959d0ef 100644 --- a/app/src/main/java/fr/free/nrw/commons/delete/DeleteHelper.kt +++ b/app/src/main/java/fr/free/nrw/commons/delete/DeleteHelper.kt @@ -111,7 +111,7 @@ class DeleteHelper @Inject constructor( val userPageString = "\n{{subst:idw|${media.filename}}} ~~~~" - val creator = media.author + val creator = media.getAuthorOrUser() ?: throw RuntimeException("Failed to nominate for deletion") return pageEditClient.prependEdit( diff --git a/app/src/main/java/fr/free/nrw/commons/di/CommonsDaggerSupportFragment.kt b/app/src/main/java/fr/free/nrw/commons/di/CommonsDaggerSupportFragment.kt index 5468cfa10..eb0ce83f3 100644 --- a/app/src/main/java/fr/free/nrw/commons/di/CommonsDaggerSupportFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/di/CommonsDaggerSupportFragment.kt @@ -63,9 +63,4 @@ abstract class CommonsDaggerSupportFragment : Fragment(), HasSupportFragmentInje return getInstance(activity.applicationContext) } - - // Ensure getContext() returns a non-null Context - override fun getContext(): Context { - return super.getContext() ?: throw IllegalStateException("Context is null") - } } diff --git a/app/src/main/java/fr/free/nrw/commons/explore/media/MediaConverter.kt b/app/src/main/java/fr/free/nrw/commons/explore/media/MediaConverter.kt index de084ba50..0cfb270a3 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/media/MediaConverter.kt +++ b/app/src/main/java/fr/free/nrw/commons/explore/media/MediaConverter.kt @@ -39,7 +39,7 @@ class MediaConverter metadata.licenseShortName(), metadata.prefixedLicenseUrl, getAuthor(metadata), - getAuthor(metadata), + imageInfo.getUser(), MediaDataExtractorUtil.extractCategoriesFromList(metadata.categories()), metadata.latLng, entity.labels().mapValues { it.value.value() }, diff --git a/app/src/main/java/fr/free/nrw/commons/explore/media/PagedMediaAdapter.kt b/app/src/main/java/fr/free/nrw/commons/explore/media/PagedMediaAdapter.kt index c987b76c2..364b5d363 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/media/PagedMediaAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/explore/media/PagedMediaAdapter.kt @@ -52,12 +52,7 @@ class SearchImagesViewHolder( binding.categoryImageView.setOnClickListener { onImageClicked(item.second) } binding.categoryImageTitle.text = media.mostRelevantCaption binding.categoryImageView.setImageURI(media.thumbUrl) - if (media.author?.isNotEmpty() == true) { - binding.categoryImageAuthor.visibility = View.VISIBLE - binding.categoryImageAuthor.text = - containerView.context.getString(R.string.image_uploaded_by, media.user) - } else { - binding.categoryImageAuthor.visibility = View.GONE - } + binding.categoryImageAuthor.text = + containerView.context.getString(R.string.image_uploaded_by, media.getAuthorOrUser()) } } diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java index b4b4e9c57..cba582a35 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java @@ -328,7 +328,7 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple .append("\n\n"); builder.append("User that you want to report: ") - .append(media.getAuthor()) + .append(media.getUser()) .append("\n\n"); if (sessionManager.getUserName() != null) { @@ -423,7 +423,7 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple // Initialize bookmark object bookmark = new Bookmark( m.getFilename(), - m.getAuthor(), + m.getAuthorOrUser(), BookmarkPicturesContentProvider.uriForName(m.getFilename()) ); updateBookmarkState(menu.findItem(R.id.menu_bookmark_current_image)); diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.kt b/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.kt index 7627bd24a..62ef04bad 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.kt @@ -223,7 +223,7 @@ class NearbyParentFragment : CommonsDaggerSupportFragment(), private var view: View? = null private var scope: LifecycleCoroutineScope? = null private var presenter: NearbyParentFragmentPresenter? = null - private var isDarkTheme = false + private var _isDarkTheme = false private var isFABsExpanded = false private var selectedPlace: Place? = null private var clickedMarker: Marker? = null @@ -461,7 +461,7 @@ class NearbyParentFragment : CommonsDaggerSupportFragment(), } } } - isDarkTheme = systemThemeUtils?.isDeviceInNightMode() == true + _isDarkTheme = systemThemeUtils?.isDeviceInNightMode() == true if (Utils.isMonumentsEnabled(Date())) { binding?.rlContainerWlmMonthMessage?.visibility = View.VISIBLE } else { @@ -631,7 +631,7 @@ class NearbyParentFragment : CommonsDaggerSupportFragment(), * another refactor */ private fun initThemePreferences() { - if (isDarkTheme) { + if (_isDarkTheme) { binding!!.bottomSheetNearby.rvNearbyList.setBackgroundColor( requireContext().resources.getColor(fr.free.nrw.commons.R.color.contributionListDarkBackground) ) @@ -915,7 +915,7 @@ class NearbyParentFragment : CommonsDaggerSupportFragment(), } override fun isDarkTheme(): Boolean { - return isDarkTheme + return _isDarkTheme } }) binding!!.nearbyFilterList.root diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailAdapter.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailAdapter.kt index 05ed5f665..b19da15e6 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadMediaDetailAdapter.kt @@ -16,6 +16,7 @@ import android.view.View import android.view.ViewGroup import android.widget.AdapterView import android.widget.AdapterView.OnItemClickListener +import android.widget.Button import android.widget.EditText import android.widget.FrameLayout import android.widget.ImageView @@ -330,6 +331,9 @@ class UploadMediaDetailAdapter : RecyclerView.Adapter(R.id.cancel_button) + .setOnClickListener { v: View? -> dialog.dismiss() } + editText.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) = hideRecentLanguagesSection() diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 91f9652c4..7f742a319 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -136,8 +136,8 @@ เคชเคฐเคฟเคšเคฏ เคตเคฟเค•เคฟเคฎเฅ€เคกเคฟเคฏเคพ เค•เฅ‰เคฎเคจเฅเคธ เคเคชเฅเคช เคเค• เคฎเฅเค•เฅเคค เคธเฅเคฐเฅ‹เคค เคเคชเฅเคช เคนเฅˆ เคœเฅ‹ เค•เคฟ เคตเคฟเค•เคฟเคฎเฅ€เคกเคฟเคฏเคพ เคธเคฎเฅเคฆเคพเคฏ เค•เฅ‡ เค…เคจเฅเคฆเคพเคจเคชเฅเคฐเคพเคชเฅเคคเค•เคฐเฅเคคเคพเค“เค‚ เคต เคธเฅเคตเคฏเค‚เคธเฅ‡เคตเค•เฅ‹เค‚ เคฆเฅเคตเคพเคฐเคพ เคจเคฟเคฐเฅเคฎเคฟเคค เคเคตเค‚ เคชเฅเคฐเคฌเค‚เคงเคฟเคค เคนเฅˆเฅค เคตเคฟเค•เคฟเคฎเฅ€เคกเคฟเคฏเคพ เคซเฅ‰เคŠเคฃเฅเคกเฅ‡เคถเคจ เค‡เคธ เคเคชเฅเคช เค•เฅ‡ เคจเคฟเคฐเฅเคฎเคพเคฃ, เคตเคฟเค•เคพเคธ เคต เคชเฅเคฐเคฌเค‚เคงเคจ เคฎเฅ‡เค‚ เค•เคฟเคธเฅ€ เคชเฅเคฐเค•เคพเคฐ เคธเฅ‡ เคญเฅ€ เคธเค‚เคฒเค—เฅเคจ เคจเคนเฅ€เค‚ เคนเฅˆเฅค เคคเฅเคฐเฅเคŸเคฟ เค•เฅ€ เคธเฅ‚เคšเคจเคพ เค”เคฐ เคธเฅเคเคพเคตเฅ‹เค‚ เค•เฅ‡ เคฒเคฟเค <a href=\"%1$s\"> GitHub เคธเคฎเคธเฅเคฏเคพ </a> เคฌเคจเคพเคเค‚ - <u>เค—เฅ‹เคชเคจเฅ€เคฏเคคเคพ เคจเฅ€เคคเคฟ</u> - <u>เคถเฅเคฐเฅ‡เคฏ</u> + เค—เฅ‹เคชเคจเฅ€เคฏเคคเคพ เคจเฅ€เคคเคฟ + เคถเฅเคฐเฅ‡เคฏ เคชเคฐเคฟเคšเคฏ เคชเฅเคฐเคคเคฟเค•เฅเคฐเคฟเคฏเคพ เคฆเฅ‡เค‚ (เคˆเคฎเฅ‡เคฒ เคฆเฅเคตเคพเคฐเคพ) เค•เฅ‹เคˆ เคˆเคฎเฅ‡เคฒ เคธเคพเคงเคจ เคธเฅเคฅเคพเคชเคฟเคค เคจเคนเฅ€เค‚ @@ -150,7 +150,7 @@ เคกเคพเค‰เคจเคฒเฅ‹เคก เคกเคฟเคซเฅ‰เคฒเฅเคŸ เคฒเคพเค‡เคธเฅ‡เคจเฅเคธ เคชเคฟเค›เคฒเฅ‡ เคถเฅ€เคฐเฅเคทเค•/เคตเคฟเคตเคฐเคฃ เค•เคพ เค‰เคชเคฏเฅ‹เค— เค•เคฐเฅ‡เค‚ - เคฐเคพเคคเฅเคฐเคฟ เคฎเฅ‹เคก + เคฅเฅ€เคฎ เคเคŸเฅเคฐเฅ€เคฌเฅเคฏเฅ‚เคถเคจ-เคถเฅ‡เคฏเคฐเค…เคฒเคพเค‡เค• 4.0 เคเคŸเฅเคฐเคฟเคฌเฅเคฏเฅ‚เคถเคจ 4.0 เคเคŸเฅเคฐเฅ€เคฌเฅเคฏเฅ‚เคถเคจ-เคถเฅ‡เคฏเคฐเค…เคฒเคพเค‡เค• 3.0 @@ -263,12 +263,12 @@ เคตเคฟเค•เฅ€เคชเฅ€เคกเคฟเคฏเคพ เค•เฅ‰เคฎเคจเฅเคธ <u>เคนเคฎเฅ‡เค‚ เคฐเฅ‡เคŸ เค•เคฐเฅ‡เค‚</u> - <u>เค…เค•เฅเคธเคฐ เคชเฅ‚เค›เฅ‡ เคœเคพเคจเฅ‡ เคตเคพเคฒเฅ‡ เคชเฅเคฐเคถเฅเคจ</u> + เค…เค•เฅเคธเคฐ เคชเฅ‚เค›เฅ‡ เคœเคพเคจเฅ‡ เคตเคพเคฒเฅ‡ เคชเฅเคฐเคถเฅเคจ เคชเฅเคฐเคถเคฟเค•เฅเคทเคฃ เค›เฅ‹เคกเคผเฅ‡เค‚ เค‡เค‚เคŸเคฐเคจเฅ‡เคŸ เค‰เคชเคฒเคฌเฅเคง เคจเคนเฅ€เค‚ เคธเฅ‚เคšเคจเคพเคเค‚ เคฒเคพเคจเฅ‡ เคฎเฅ‡เค‚ เคคเฅเคฐเฅเคŸเคฟ เค•เฅ‹เคˆ เคธเฅ‚เคšเคจเคพเคเค เคจเคนเฅ€เค‚ เคฎเคฟเคฒเฅ€เค‚ - <u>เค…เคจเฅเคตเคพเคฆ</u> + เค…เคจเฅเคตเคพเคฆ เคญเคพเคทเคพเคเค เค†เค—เฅ‡ เคฌเคขเคผเฅ‡เค‚ เคฐเคฆเฅเคฆ เค•เคฐเฅ‡เค‚ @@ -284,7 +284,7 @@ เคนเคพเคฒ เค•เฅ€ เค–เฅ‹เคœเฅ‡เค‚ เคนเคพเคฒ เคฎเฅ‡เค‚ เค–เฅ‹เคœเฅ‡ เค—เคฏเฅ‡ เคชเฅเคฐเคถเฅเคจ เคถเฅเคฐเฅ‡เคฃเฅ€ เคฒเฅ‹เคก เค•เคฐเคคเฅ‡ เคธเคฎเคฏ เคคเฅเคฐเฅเคŸเคฟ เค‰เคคเฅเคชเคจเฅเคจ เคนเฅเคˆเฅค - เคฎเฅ€เคกเคฟเคฏเคพ + เคฎเฅ€เคกเคฟเคฏเคพ เคถเฅเคฐเฅ‡เคฃเคฟเคฏเคพเค เคจเคฟเคฐเฅเคตเคพเคšเคฟเคค เคจเค•เฅเคถเคพ @@ -315,7 +315,7 @@ เคธเคพเค‚เค–เฅเคฏเคฟเค•เฅ€ เคงเคจเฅเคฏเคตเคพเคฆ เคชเฅเคฐเคพเคชเฅเคค เค•เคฟเคฏเคพ เคจเคฟเคฐเฅเคตเคพเคšเคฟเคค เคšเคฟเคคเฅเคฐ - เคธเฅเคคเคฐ + เคธเฅเคคเคฐ %d เคšเคฟเคคเฅเคฐ เค…เคชเคฒเฅ‹เคก เคนเฅเค† เคšเคฟเคคเฅเคฐเฅ‹เค‚ เค•เฅ‹ เคตเคพเคชเคธ เคจเคนเฅ€เค‚ เค•เคฟเคฏเคพ เค—เคฏเคพ เค‰เคชเคฏเฅ‹เค— เคนเฅเค เคšเคฟเคคเฅเคฐ diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 79f266d8b..e977e56d5 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -4,6 +4,7 @@ * Akmaie Ajam * Arifin.wijaya * Birusian +* Boesenbergia * DARMAS BUDI SANTOSO * Daud I.F. Argana * Fafau06 @@ -295,7 +296,7 @@ Galat penyampaian pemberitahuan Galat mengambil gambar untuk ditinjau. Tekan segarkan untuk coba lagi. Pemberitahuan tidak ditemukan - Terjemahkan + Pertalaghi Bahasa Pilih bahasa untuk terjemahan yang ingin Anda kirimkan Lanjutkan diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index a0be9be25..2ef0b7c0a 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -181,6 +181,7 @@ Neen Beschrรซftung Titel + Motiven Beschreiwung Diskussioun Auteur diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 1aaee6e9c..731ac6a32 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -406,10 +406,10 @@ Gebruik een aangepaste auteursnaam in plaats van uw gebruikersnaam tijdens het uploaden van foto\'s Aangepaste auteursnaam Bijdragen - Dichtbij + In de buurt Meldingen Meldingen (gelezen) - Meldingen dichtbij weergeven + Melding in de buurt weergeven Toon in-app-melding voor de dichtstbijzijnde plaats die foto\'s nodig heeft Lijst Toestemming om op te slaan @@ -615,7 +615,7 @@ Kies voor de beste resultaten de modus van hoge nauwkeurigheid. Locatie inschakelen? Schakel locatiediensten in zodat de app uw huidige locatie toont - In de Buurt heeft locatie nodig om correct te werken + โ€˜In de buurtโ€™ heeft locatietoegang nodig om correct te werken Voor de verkenningskaart is locatietoestemming nodig om afbeeldingen in de buurt weer te geven U moet locatietoestemming geven om de locatie automatisch in te stellen. Heeft u deze twee foto\'s op dezelfde plek gemaakt? Wilt u de breedtegraad/lengtegraad van de afbeelding rechts gebruiken? @@ -657,7 +657,7 @@ Wekelijks Alle tijden Uploaden - In de Buurt + In de buurt Gebruikt Mijn ranking Beperkte verbindingsmodus ingeschakeld! @@ -724,7 +724,7 @@ Wijzig items Categorieรซn bewerken Geavanceerde opties - U kunt de zoekopdracht Dichtbij aanpassen. Als u fouten krijgt, kunt u opnieuw instellen en toepassen. + U kunt de zoekopdracht โ€˜In de buurtโ€™ aanpassen. Als u fouten krijgt, kunt u opnieuw instellen en toepassen. Toepassen Opnieuw instellen Locatiegegevens helpen wiki-bewerkers om uw foto te vinden, waardoor deze veel nuttiger wordt.\nUw recente uploads hebben geen locatie.\nWe raden u aan om de locatie in de instellingen van uw camera-app in te schakelen.\nBedankt voor het uploaden! @@ -835,4 +835,10 @@ Account Account laten verdwijnen Waarschuwing verwijdering account + Verdwijnen is een <b>laatste redmiddel</b> en moet <b>alleen worden gebruikt als u voor altijd wilt stoppen met bewerken</b> en om zoveel mogelijk van uw voorgaande relaties te verbergen.<br/><br/>Accountverwijdering op Wikipedia gebeurt door uw accountnaam te wijzigen opdat anderen uw bijdragen niet meer kunnen herkennen. De procedure wordt accountverdwijning genoemd. <b>Door verdwijnen wordt geen volledige anonimiteit gegarandeerd en worden geen bijdragen aan de projecten verwijderd.</b> + Bijschrift + Bijschrift gekopieerd naar klembord + Gefeliciteerd, alle fotoโ€™s in dit album zijn ofwel geรผpload ofwel gemarkeerd als โ€˜niet om te uploadenโ€™. + Weergeven in Verkennen + Weergeven in โ€˜In de buurtโ€™ diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 11f917c3f..a017d11e0 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -10,8 +10,14 @@ --> เจ•เจพเจฎเจจเจœเจผ เจฎเจพเจฐเจ•เจพ + เจนเจตเจพเจฒเฉ‡ เจ•เจฐเฉ‹ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจตเฉ‡เจฐเจตเจพ เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹ เจจเจตเจพเจ‚ เจฏเฉ‹เจ—เจฆเจพเจจ เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹ + เจ•เฉˆเจฎเจฐเฉ‡ เจฐเจพเจนเฉ€เจ‚ เจฏเฉ‹เจ—เจฆเจพเจจ เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹ + เจคเจธเจตเฉ€เจฐเจพเจ‚ เจฐเจพเจนเฉ€เจ‚ เจฏเฉ‹เจ—เจฆเจพเจจ เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹ + เจธเฉเจฐเจ–เฉ€ + เจญเจพเจธเจผเจพ เจฆเจพ เจตเฉ‡เจฐเจตเจพ + เจธเฉเจฐเจ–เฉ€ เจตเฉ‡เจฐเจตเจพ เจคเจธเจตเฉ€เจฐ เจธเจพเจฐเฉ‡ @@ -37,14 +43,19 @@ เจชเฉœเจšเฉ‹เจฒ เจ•เจฐเฉ‹ เจฆเจฟเฉฑเจ– เจ†เจฎ + เจธเฉเจเจพเจ… + เจชเจฐเจฆเฉ‡เจฆเจพเจฐเฉ€ เจตเจฟเจ•เฉ€เจฎเฉ€เจกเฉ€เจ† เจ•เจพเจฎเจจเจœเจผ เจชเจธเฉฐเจฆเจพเจ‚ + เจšเฉœเฉเจนเจพเจ‰เจฃเจพ เจœเจพเจฐเฉ€ เจ เจตเจฐเจคเฉ‹เจ‚เจ•เจพเจฐ เจจเจพเจ‚ เจฒเฉฐเจ˜-เจธเจผเจฌเจฆ เจฆเจพเจ–เจผเจฒ เจนเฉ‹เจตเฉ‹ เจชเจพเจฐเจธเจผเจฌเจฆ เจญเฉเฉฑเจฒ เจ—เจ? + เจ–เจพเจคเจพ เจฌเจฃเจพเจ“ เจฆเจพเจ–เจผเจฒเจพ เจนเฉ‹ เจฐเจฟเจนเจพ เจนเฉˆ เจ‰เจกเฉ€เจ•เฉ‹ เจœเฉ€โ€ฆ + เจธเฉเจฐเจ–เฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจตเฉ‡เจฐเจตเฉ‡ เจจเจตเจฟเจ†เจ เจœเจพ เจฐเจนเฉ‡ เจนเจจ เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจ‰เจกเฉ€เจ•เฉ‹... เจฆเจพเจ–เจผเจฒ เจนเฉ‹เจฃเจพ เจธเจซเจผเจฒ! เจฆเจพเจ–เจผเจฒ เจนเฉ‹เจฃเจพ เจ…เจธเจซเจผเจฒ! @@ -53,11 +64,13 @@ เจ…เฉฑเจชเจฒเฉ‹เจก เจธเจผเฉเจฐเฉ‚ เจนเฉ‹เจ‡เจ†! %1$s เจ…เฉฑเจชเจฒเฉ‹เจก เจนเฉ‹ เจ—เจ! เจ†เจชเจฃเจพ เจ…เฉฑเจชเจฒเฉ‹เจก เจตเฉ‡เจ–เจฃ เจฒเจˆ เจฅเจชเฉ‡เฉœเฉ‹ - %1$s เจ…เฉฑเจชเจฒเฉ‹เจก เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเฉ‡ เจœเจพ เจฐเจนเฉ‡ เจนเจจ + เจซเจพเจˆเจฒ เจšเฉœเฉเจนเจพเจˆ เจœเจพ เจฐเจนเฉ€ เจ: %s %1$s เจ…เฉฑเจชเจฒเฉ‹เจก เจ•เฉ€เจคเฉ‡ เจœเจพ เจฐเจนเฉ‡ เจนเจจ %1$s เจฆเจพ เจ…เฉฑเจชเจฒเฉ‹เจก เจ–เจผเจคเจฎ เจนเฉ‹ เจฐเจฟเจนเจพ เจนเฉˆ - %1$s เจฆเจพ เจ…เฉฑเจชเจฒเฉ‹เจก เจซเฉ‡เจฒเฉเจน เจนเฉ‹เจ‡เจ† + %1$s เจจเฉ‚เฉฐ เจšเฉœเฉเจนเจพเจ‰เจฃ เจตเจฟเฉฑเจš เจจเจพเจ•เจพเจฎ + %1$s เจšเฉœเฉเจนเจพเจ‰เจฃเจพ เจฐเฉ‹เจ•เจฟเจ† เจ—เจฟเจ† เจตเฉ‡เจ–เจฃ เจฒเจˆ เจฅเจชเฉ‡เฉœเฉ‹ + เจตเฉ‡เจ–เจฃ เจฒเจˆ เจฅเจชเฉ‡เฉœเฉ‹ เจฎเฉ‡เจฐเฉ‡ เจ…เฉฑเจชเจฒเฉ‹เจก เจ•เจคเจพเจฐ เจตเจฟเจš เจซเฉ‡เจฒเฉเจน เจนเฉ‹เจ‡เจ† @@ -68,12 +81,17 @@ เจจเฉ‡เฉœเฉ‡-เจคเฉ‡เฉœเฉ‡ เจฎเฉ‡เจฐเฉ‡ เจ…เฉฑเจชเจฒเฉ‹เจก เจ•เฉœเฉ€ เจฆเฉ€ เจจเจ•เจฒ เจ•เจฐเฉ‹ + เจ•เฉœเฉ€ เจจเฉ‚เฉฐ เจšเฉ‚เฉฐเจขเฉ€-เจคเจ–เจคเฉ€ เจ‰เฉฑเจคเฉ‡ เจจเจ•เจฒ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจ เจธเจพเจ‚เจเจพ เจ•เจฐเฉ‹ + เจซเจพเจ‡เจฒ เจธเจซเจผเจพ เจตเฉ‡เจ–เฉ‹ เจธเฉเจฐเจ–เฉ€ (เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€) + เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจ‡เจธ เจซเจพเจˆเจฒ เจฒเจˆ เจ‡เฉฑเจ• เจธเฉเจฐเจ–เฉ€ เจฆเจฟเจ“ เจตเฉ‡เจฐเจตเจพ + เจธเฉเจฐเจ–เฉ€ เจฆเจพเจ–เจผเจฒ เจนเฉ‹เจฃ เจตเจฟเฉฑเจš เจ…เจธเจฎเจฐเฉฑเจฅ - เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจซเฉ‡เจฒเฉเจน เจนเฉ‹เจ‡เจ† เจนเฉˆ เจฌเจนเฉเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจ…เจธเจซเจผเจฒ เจ•เฉ‹เจธเจผเจฟเจธเจผเจพเจ‚เฅค เจฅเฉ‹เฉœเฉเจนเฉ€ เจฆเฉ‡เจฐ เจฌเจพเจ…เจฆ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ‹ เจœเฉ€เฅค เจ…เจซเจผเจธเฉ‹เจธ, เจ‡เจน เจตเจฐเจคเฉ‹เจ‚เจ•เจพเจฐ เจจเฉ‚เฉฐ เจ•เจพเจฎเจจเจœเจผ เจคเฉ‡ เจฐเฉ‹เจ• เจฒเจพเจˆ เจ—เจˆ เจนเฉˆเฅค + เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ†เจชเจฃเจพ เจฆเฉ‹-เจ•เจพเจฐเจ• เจชเฉเจฐเจฎเจพเจฃเฉ€เจ•เจฐเจจ เจ•เฉ‹เจก เจฆเฉ‡เจฃเจพ เจชเจตเฉ‡เจ—เจพเฅค เจฆเจพเจ–เจผเจฒ เจนเฉ‹เจฃเจพ เจ…เจธเจซเจผเจฒ! เจšเฉœเฉเจนเจพเจ‰ เจ‡เจธ เจธเฉˆเฉฑเจŸ เจจเฉ‚เฉฐ เจจเจพเจ‚ เจฆเจฟเจ“ @@ -85,10 +103,12 @@ เจธเฉ‚เจšเฉ€ เจซเจผเจฟเจฒเจนเจพเจฒ เจ•เฉ‹เจˆ เจ…เฉฑเจชเจฒเฉ‹เจก เจจเจนเฉ€เจ‚ %1$s เจจเจพเจฒเจผ เจฎเฉ‡เจฒ เจ–เจพเจ‚เจฆเฉ€ เจ•เฉ‹เจˆ เจธเจผเฉเจฐเฉ‡เจฃเฉ€ เจจเจนเฉ€เจ‚ เจฒเฉฑเจญเฉ€ + %1$s เจจเจพเจฒ เจฎเฉ‡เจฒ เจ–เจพเจ‚เจฆเฉ€เจ†เจ‚ เจ•เฉ‹เจˆ เจตเจฟเจ•เฉ€เจกเจพเจŸเจพ เจšเฉ€เจœเจผเจพเจ‚ เจจเจนเฉ€เจ‚ เจฒเฉฑเจญเจฟเจ†เจ‚เฅค เจ†เจชเจฃเฉ€เจ†เจ‚ เจคเจธเจตเฉ€เจฐเจพเจ‚ เจจเฉ‚เฉฐ เจตเจฟเจ•เฉ€เจฎเฉ€เจกเฉ€เจ† เจ•เจพเจฎเจจเจœเจผ เจตเจฟเจš เจœเจผเจฟเจ†เจฆเจพ เจฒเฉฑเจญเจฃเจฏเฉ‹เจ— เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจธเจผเฉเจฐเฉ‡เจฃเฉ€เจ†เจ‚ เจœเฉ‹เฉœเฉ‹เฅค\n\nเจธเจผเฉเจฐเฉ‡เจฃเฉ€เจ†เจ‚ เจœเฉ‹เฉœเจจ เจฒเจˆ เจŸเจพเจˆเจช เจ•เจฐเจจ เจ…เจฐเฉฐเจญ เจ•เจฐเฉ‹เฅค\nเจ‡เจธ เจ•เจพเจฐเจœ เจจเฉ‚เฉฐ เจ…เจฃเจกเจฟเฉฑเจ เจพ เจ•เจฐเจจ เจฒเจˆ เจ‡เจน เจธเฉเจจเฉ‡เจนเจพ เจฅเจชเฉ‡เฉœเฉ‹ (เจœเจพเจ‚ เจตเจพเจชเจธเฉ€ เจฌเจŸเจจ เจฆเจฌเจพเจ“)เฅค เจธเจผเฉเจฐเฉ‡เจฃเฉ€เจ†เจ‚ เจชเจธเฉฐเจฆเจพเจ‚ เจ–เจพเจคเจพ เจฌเจฃเจพเจ“ + เจตเจฟเจธเจผเฉ‡เจธเจผ เจคเจธเจตเฉ€เจฐ เจธเจผเฉเจฐเฉ‡เจฃเฉ€ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจ…เจœเจผเจพเจฆ เจธเจฐเฉ‹เจค เจธเจพเจซเจผเจŸเจตเฉ‡เจ…เจฐ เจจเฉ‚เฉฐ <a href=\"https://github.com/commons-app/apps-android-commons/blob/master/COPYING\">Apache License v2</a> เจ…เจงเฉ€เจจ เจœเจพเจฐเฉ€ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ @@ -105,9 +125,9 @@ เจฐเฉฑเจฆ เจ•เจฐเฉ‹ เจ‡เจน เจคเจธเจตเฉ€เจฐ เจ…เฉฑเจชเจฒเฉ‹เจก เจ•เจฐเจจ เจจเจพเจฒ เจนเฉ€ เจฎเฉˆเจ‚ เจฆเจพเจ…เจตเจพ เจ•เจฐเจฆเจพ เจนเจพเจ‚/เจ•เจฐเจฆเฉ€ เจนเจพเจ‚ เจ•เจฟ เจ‡เจน เจฎเฉ‡เจฐเจพ เจ†เจชเจฃเจพ เจ•เจพเจฐเจœ เจนเฉˆ, เจ•เจฟ เจ‡เจธ เจคเจนเจฟเจค เจ•เฉ‹เจˆ เจ•เจพเจชเฉ€เจฐเจพเจˆเจŸ เจ‰เจฒเฉฐเจ˜เจฃเจพ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจ…เจคเฉ‡ <a href=\"https://commons.wikimedia.org/wiki/Commons:Policies_and_guidelines\">เจตเจฟเจ•เฉ€เจฎเฉ€เจกเฉ€เจ† เจ•เจพเจฎเจจเจœเจผ เจจเฉ€เจคเฉ€เจ†เจ‚</a> เจฎเฉเจคเจพเจฌเจฟเจ• เจ‡เจน เจ เฉ€เจ• เจนเฉˆเฅค เจกเจพเจŠเจจเจฒเฉ‹เจก - เจฒเจธเฉฐเจธ - เจชเจนเจฟเจฒเจพเจ‚ เจตเจพเจฒเจพ เจธเจฟเจฐเจฒเฉ‡เจ–/เจœเจพเจฃเจ•เจพเจฐเฉ€ เจตเจฐเจคเฉ‹ - เจฐเจพเจค เจฆเจพ เจ…เฉฐเจฆเจพเจœเจผ + เจฎเฉ‚เจฒ เจฒเจธเฉฐเจธ + เจชเจฟเจ›เจฒเฉ‡ เจธเจฟเจฐเจฒเฉ‡เจ– เจ…เจคเฉ‡ เจตเฉ‡เจฐเจตเฉ‡ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹ + เจตเจฟเจธเจผเจพ-เจตเจธเจคเฉ‚ Attribution-ShareAlike 4.0 Attribution 4.0 CC Attribution-ShareAlike 3.0 @@ -120,8 +140,14 @@ เจตเจฟเจ•เฉ€เจฎเฉ€เจกเฉ€เจ† เจ•เจพเจฎเจจเจœเจผ เจœเจผเจฟเจ†เจฆเจพเจคเจฐ เจ‰เจน เจคเจธเจตเฉ€เจฐเจพเจ‚ เจฆเจพ เจญเฉฐเจกเจพเจฐ เจนเฉˆ เจœเฉ‹ เจตเจฟเจ•เฉ€เจชเฉ€เจกเฉ€เจ† \'เจคเฉ‡ เจตเจฐเจคเฉ€เจ†เจ‚ เจœเจพเจ‚เจฆเฉ€เจ†เจ‚ เจนเจจเฅค เจคเฉเจนเจพเจกเฉ€เจ†เจ‚ เจคเจธเจตเฉ€เจฐเจพเจ‚ เจตเจฟเจธเจผเจต เจฆเฉ‡ เจฌเจพเจ•เฉ€ เจฒเฉ‹เจ•เจพเจ‚ เจจเฉ‚เฉฐ เจธเจฟเฉฑเจ–เจฟเจ…เจค เจ•เจฐเจจ เจฒเจˆ เจธเจนเจพเจˆ เจนเจจ! เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจ‰เจน เจคเจธเจตเฉ€เจฐเจพเจ‚ เจจเฉ‚เฉฐ เจšเฉœเฉเจนเจพเจ‰ เจœเฉ‹ เจคเฉเจนเจพเจกเฉ‡ เจตเฉฑเจฒเฉ‹เจ‚ เจฒเจˆเจ†เจ‚ เจ—เจˆเจ†เจ‚ เจนเจจ เจœเจพเจ‚ เจฌเจฃเจพเจˆเจ†เจ‚ เจ—เจˆเจ†เจ‚ เจนเจจ: + เจ•เฉเจฆเจฐเจคเฉ€ เจตเจธเจคเฉ‚เจ†เจ‚ (เจซเฉเฉฑเจฒ, เจœเจพเจจเจตเจฐ, เจชเจนเจพเฉœ) + เจฒเจพเจนเฉ‡เจตเฉฐเจฆ เจตเจธเจคเฉ‚เจ†เจ‚ (เจธเฉˆเจ•เจฒ, เจฐเฉ‡เจฒ เจ…เฉฑเจกเจพ) + เจฎเจธเจผเจนเฉ‚เจฐ เจฒเฉ‹เจ• (เจคเฉเจนเจพเจกเฉ‡ mayor, เจ“เจฒเฉฐเจชเจฟเจ• เจ–เจฟเจกเจพเจฐเฉ€ เจœเจฟเจจเฉเจนเจพเจ‚ เจจเฉ‚เฉฐ เจคเฉเจธเฉ€เจ‚ เจฎเจฟเจฒเฉ‡ เจธเฉ€) เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจ…เจชเจฒเฉ‹เจก เจจเจพ เจ•เจฐเฉ‹: + เจคเฉเจนเจพเจกเฉ‡ เจฆเฉ‹เจธเจคเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจธเฉˆเจฒเจซเจผเฉ€เจ†เจ‚ เจœเจพเจ‚ เจคเจธเจตเฉ€เจฐเจพเจ‚ เจ‰เจฆเจพเจนเจฐเจฃ เจตเจœเฉ‹เจ‚ เจ‡เจน เจ…เจชเจฒเฉ‹เจก: + เจธเจฟเจฐเจฒเฉ‡เจ–: เจธเจฟเจกเจจเฉ€ เจ“เจชเฉ‡เจฐเจพ เจนเจพเจŠเจธ + เจตเฉ‡เจฐเจตเจพ: เจธเจฟเจกเจจเฉ€ เจ“เจชเฉ‡เจฐเจพ เจนเจพเจŠเจธ เจœเจฟเจตเฉ‡เจ‚ เจ–เจพเฉœเฉ€ เจฆเฉ‡ เจชเจพเจฐ เจคเฉ‹เจ‚ เจฆเจฟเจ–เจฆเจพ เจ เจ†เจชเจฃเฉ€เจ†เจ‚ เจคเจธเจตเฉ€เจฐเจพเจ‚ เจฆเจพ เจฏเฉ‹เจ—เจฆเจพเจจ เจชเจพเจ“เฅค เจตเจฟเจ•เฉ€เจชเฉ€เจกเฉ€เจ† เจฒเฉ‡เจ–เจพเจ‚ เจจเฉ‚เฉฐ เจธเฉเจฐเจœเฉ€เจค เจ•เจฐ เจฆเจฟเจ“! เจตเจฟเจ•เฉ€เจชเฉ€เจกเฉ€เจ† เจ‰เจคเจฒเฉ€เจ†เจ‚ เจคเจธเจตเฉ€เจฐเจพเจ‚ เจตเจฟเจ•เฉ€เจฎเฉ€เจกเฉ€เจ† เจ•เจพเจฎเจจเจœเจผ เจคเฉ‹เจ‚ เจ†เจ‰เจ‚เจฆเฉ€เจ†เจ‚ เจนเจจ เจคเฉเจนเจพเจกเฉ€เจ†เจ‚ เจคเจธเจตเฉ€เจฐเจพเจ‚ เจฆเฉเจจเฉ€เจ†เจ‚ เจญเจฐ เจฆเฉ‡ เจฒเฉ‹เจ•เจพเจ‚ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจ เจตเจฟเจš เจฎเจฆเจฆ เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจเฅค @@ -132,6 +158,7 @@ เจธเจผเฉเจฐเฉ‡เจฃเฉ€เจ†เจ‚ เจฒเฉฑเจฆ เจฐเจฟเจนเจพ เจนเฉˆ... เจ•เฉ‹เจˆ เจตเฉ€ เจจเจนเฉ€เจ‚ เจšเฉเจฃเจฟเจ† + เจ•เฉ‹เจˆ เจธเฉเจฐเจ–เฉ€ เจจเจนเฉ€เจ‚ เจ•เฉ‹เจˆ เจตเฉ‡เจฐเจตเจพ เจจเจนเฉ€เจ‚ เจ•เฉ‹เจˆ เจ—เฉฑเจฒเจฌเจพเจค เจจเจนเฉ€เจ‚ เจ…เจฃเจœเจพเจฃ เจฒเจธเฉฐเจธ @@ -139,8 +166,10 @@ เจ†เจ—เจฟเจ† เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆ: เจฌเจพเจนเจฐเฉ€ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจฌเจพเจฐเฉ‡เฅค เจ‡เจธ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจเจช เจ•เจพเจฐเจœ เจจเจนเฉ€เจ‚ เจ•เจฐ เจธเจ•เฉ‡เจ—เฉ€เฅค เจ เฉ€เจ• เจนเฉˆ เจ–เจผเจฌเจฐเจฆเจพเจฐ + เจšเฉœเฉเจนเจพเจ‰ เจนเจพเจ‚ เจจเจนเฉ€เจ‚ + เจธเฉเจฐเจ–เฉ€ เจธเจฟเจฐเจฒเฉ‡เจ– เจตเฉ‡เจฐเจตเจพ เจ—เฉฑเจฒเจฌเจพเจค diff --git a/app/src/main/res/values-qq/strings.xml b/app/src/main/res/values-qq/strings.xml index 9417f90ec..7b521a8ac 100644 --- a/app/src/main/res/values-qq/strings.xml +++ b/app/src/main/res/values-qq/strings.xml @@ -3,6 +3,7 @@ * A100Star * Ajeje Brazorf * Amire80 +* Annick green * Cabal * Googology * LeGuyanaisPure @@ -27,6 +28,7 @@ {{Identical|Submit}} {{identical|All}} + Reba ishakiro Status text about number of uploads left.\n* %1$d represents number of uploads left, including current one See the current issue [https://phabricator.wikimedia.org/T267142 T267142] tracked in Phabricator about the <code><nowiki>|zero=</nowiki></code> option currently not supported on Translatewiki.net with the custom <code><nowiki>{{PLURAL}}</nowiki></code> rules used by this project for Android, using a non-MediaWiki syntax. {{Identical|Upload}} @@ -190,6 +192,7 @@ {{Doc-commons-app-depicts}} {{identical|Bookmark}} Option to make the app\'s theme follow the global system setting. + โ€˜Nearbyโ€™ should be translated as in {{msg-wm|Commons-android-strings-navigation item nearby}} {{Identical|More}} {{Optional}}\n<code>&amp;#169;</code> is the copyright symbol (ยฉ). {{Doc-commons-app-depicts}} @@ -202,9 +205,12 @@ {{identical|Done}} {{Doc-commons-app-depicts}} {{Identical|Advanced options}} + โ€˜Nearbyโ€™ should be translated as in {{msg-wm|Commons-android-strings-navigation item nearby}} {{Identical|Detail}} \"Set as avatar\" should be translated the same as {{msg-wm|Commons-android-strings-menu set avatar}}. {{Doc-commons-app-depicts}} An answer to the question in {{msg-wm|Commons-android-strings-custom selector confirm deletion message}}. {{optional}} + โ€œExploreโ€ should be translated as in {{msg-wm|Commons-android-strings-navigation item explore}} + โ€˜Nearbyโ€™ should be translated as in {{msg-wm|Commons-android-strings-navigation item nearby}} diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 371744b44..2fde6f007 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -821,4 +821,6 @@ Bildtext Bildtext kopierades till urklipp Grattis! Alla bilder i detta album har antingen laddats upp eller markerats fรถr att inte laddas upp. + Visa i \"Utforska\" + Visa i \"I nรคrheten\" diff --git a/app/src/main/res/values-tcy/strings.xml b/app/src/main/res/values-tcy/strings.xml index fbbe499d2..f3eb3562f 100644 --- a/app/src/main/res/values-tcy/strings.xml +++ b/app/src/main/res/values-tcy/strings.xml @@ -66,7 +66,7 @@ %s เฒ…เฒชเณเฒฒเณ‹เฒกเณ เฒธเณเฒฐเณ เฒ†เฒตเณŠเฒ‚เฒฆเณเฒ‚เฒกเณ %1$s เฒ…เฒชเณเฒฒเณ‹เฒกเณ เฒ†เฒตเณŠเฒ‚เฒฆเณเฒ‚เฒกเณ %1$s เฒ…เฒชเณเฒฒเณ‹เฒกเณ เฒ•เณˆเฒฆเณ เฒ†เฒตเณŠเฒ‚เฒฆเณเฒ‚เฒกเณ. - %1$s เฒ…เฒชเณเฒฒเณ‹เฒกเณ เฒธเฒฐเฒฟ เฒ†เฒคเฒฟเฒœเฒฟ + %1$s เฒ…เฒชเณเฒฒเณ‹เฒกเณ เฒ†เฒคเฒฟเฒœเฒฟ เฒคเณเฒฏเฒพเฒฐ เฒฎเณ†เฒฒเณเฒฒ เฒ’เฒคเณเฒคเณเฒฒเณ† เฒŽเฒจเณเฒจ เฒฆเฒฟเฒ‚เฒœเฒฏเณ€เฒจเฒพ เฒตเฒฟเฒšเฒพเฒฐเณŠเฒณเณ เฒฆเฒฟเฒ‚เฒœเณŠเฒ‚เฒคเณเฒ‚เฒกเณ diff --git a/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt index 80cced5c9..230099810 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt @@ -96,7 +96,7 @@ class DeleteHelperTest { ).thenReturn("Media successfully deleted: Test Media Title") val creatorName = "Creator" - whenever(media.author).thenReturn("$creatorName") + whenever(media.getAuthorOrUser()).thenReturn("$creatorName") whenever(media.filename).thenReturn("Test file.jpg") val makeDeletion = deleteHelper.makeDeletion( context, @@ -133,7 +133,7 @@ class DeleteHelperTest { whenever(media.displayTitle).thenReturn("Test file") whenever(media.filename).thenReturn("Test file.jpg") - whenever(media.author).thenReturn("Creator (page does not exist)") + whenever(media.getAuthorOrUser()).thenReturn("Creator (page does not exist)") deleteHelper.makeDeletion(context, media, "Test reason")?.blockingGet() } @@ -148,7 +148,7 @@ class DeleteHelperTest { .thenReturn(Observable.just(false)) whenever(media.displayTitle).thenReturn("Test file") whenever(media.filename).thenReturn("Test file.jpg") - whenever(media.author).thenReturn("Creator (page does not exist)") + whenever(media.getAuthorOrUser()).thenReturn("Creator (page does not exist)") deleteHelper.makeDeletion(context, media, "Test reason")?.blockingGet() } @@ -163,7 +163,7 @@ class DeleteHelperTest { .thenReturn(Observable.just(true)) whenever(media.displayTitle).thenReturn("Test file") whenever(media.filename).thenReturn("Test file.jpg") - whenever(media.author).thenReturn("Creator (page does not exist)") + whenever(media.getAuthorOrUser()).thenReturn("Creator (page does not exist)") deleteHelper.makeDeletion(context, media, "Test reason")?.blockingGet() } @@ -221,7 +221,7 @@ class DeleteHelperTest { whenever(media.displayTitle).thenReturn("Test file") whenever(media.filename).thenReturn("Test file.jpg") - whenever(media.author).thenReturn(null) + whenever(media.getAuthorOrUser()).thenReturn(null) deleteHelper.makeDeletion(context, media, "Test reason")?.blockingGet() }