merge hashtag dialogs into one (#4861)
A hashtag picker dialog was implemented twice, with slight differences. Now there is only one - with hashtag validation - no more api errors when following an invalid one - The dialog can now be closed with the keyboard, for extra fast hashtag selection - with autocomplete I also added a new snackbar when following a hashtag was succesfull. Although I'm not sure about the auto complete, it can be very annoying as the drop down covers the buttons. I found no way to make it size to its content: https://chaos.social/@ConnyDuck/113803457147888844 Should we get rid of it?
This commit is contained in:
parent
f8829bc47c
commit
9735683df4
54 changed files with 233 additions and 210 deletions
|
|
@ -18,17 +18,13 @@ package com.keylesspalace.tusky
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.WindowManager
|
|
||||||
import androidx.activity.OnBackPressedCallback
|
import androidx.activity.OnBackPressedCallback
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.core.widget.doOnTextChanged
|
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.recyclerview.widget.DividerItemDecoration
|
import androidx.recyclerview.widget.DividerItemDecoration
|
||||||
import androidx.recyclerview.widget.ItemTouchHelper
|
import androidx.recyclerview.widget.ItemTouchHelper
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import androidx.transition.TransitionManager
|
import androidx.transition.TransitionManager
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
|
||||||
import com.google.android.material.transition.MaterialArcMotion
|
import com.google.android.material.transition.MaterialArcMotion
|
||||||
import com.google.android.material.transition.MaterialContainerTransform
|
import com.google.android.material.transition.MaterialContainerTransform
|
||||||
import com.keylesspalace.tusky.adapter.ItemInteractionListener
|
import com.keylesspalace.tusky.adapter.ItemInteractionListener
|
||||||
|
|
@ -37,13 +33,13 @@ import com.keylesspalace.tusky.appstore.EventHub
|
||||||
import com.keylesspalace.tusky.appstore.MainTabsChangedEvent
|
import com.keylesspalace.tusky.appstore.MainTabsChangedEvent
|
||||||
import com.keylesspalace.tusky.components.account.list.ListSelectionFragment
|
import com.keylesspalace.tusky.components.account.list.ListSelectionFragment
|
||||||
import com.keylesspalace.tusky.databinding.ActivityTabPreferenceBinding
|
import com.keylesspalace.tusky.databinding.ActivityTabPreferenceBinding
|
||||||
import com.keylesspalace.tusky.databinding.DialogAddHashtagBinding
|
|
||||||
import com.keylesspalace.tusky.entity.MastoList
|
import com.keylesspalace.tusky.entity.MastoList
|
||||||
import com.keylesspalace.tusky.network.MastodonApi
|
import com.keylesspalace.tusky.network.MastodonApi
|
||||||
import com.keylesspalace.tusky.util.hashtagPattern
|
import com.keylesspalace.tusky.util.hashtagPattern
|
||||||
import com.keylesspalace.tusky.util.unsafeLazy
|
import com.keylesspalace.tusky.util.unsafeLazy
|
||||||
import com.keylesspalace.tusky.util.viewBinding
|
import com.keylesspalace.tusky.util.viewBinding
|
||||||
import com.keylesspalace.tusky.util.visible
|
import com.keylesspalace.tusky.util.visible
|
||||||
|
import com.keylesspalace.tusky.view.showHashtagPickerDialog
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
|
@ -224,39 +220,21 @@ class TabPreferenceActivity : BaseActivity(), ItemInteractionListener, ListSelec
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showAddHashtagDialog(tab: TabData? = null, tabPosition: Int = 0) {
|
private fun showAddHashtagDialog(tab: TabData? = null, tabPosition: Int = 0) {
|
||||||
val dialogBinding = DialogAddHashtagBinding.inflate(layoutInflater)
|
showHashtagPickerDialog(mastodonApi, R.string.add_hashtag_title) { hashtag ->
|
||||||
val editText = dialogBinding.addHashtagEditText
|
if (tab == null) {
|
||||||
|
val newTab = createTabDataFromId(HASHTAG, listOf(hashtag))
|
||||||
|
currentTabs.add(newTab)
|
||||||
|
currentTabsAdapter.notifyItemInserted(currentTabs.size - 1)
|
||||||
|
} else {
|
||||||
|
val newTab = tab.copy(arguments = tab.arguments + hashtag)
|
||||||
|
currentTabs[tabPosition] = newTab
|
||||||
|
|
||||||
val dialog = MaterialAlertDialogBuilder(this)
|
currentTabsAdapter.notifyItemChanged(tabPosition)
|
||||||
.setTitle(R.string.add_hashtag_title)
|
|
||||||
.setView(dialogBinding.root)
|
|
||||||
.setNegativeButton(android.R.string.cancel, null)
|
|
||||||
.setPositiveButton(R.string.action_save) { _, _ ->
|
|
||||||
val input = editText.text.toString().trim()
|
|
||||||
if (tab == null) {
|
|
||||||
val newTab = createTabDataFromId(HASHTAG, listOf(input))
|
|
||||||
currentTabs.add(newTab)
|
|
||||||
currentTabsAdapter.notifyItemInserted(currentTabs.size - 1)
|
|
||||||
} else {
|
|
||||||
val newTab = tab.copy(arguments = tab.arguments + input)
|
|
||||||
currentTabs[tabPosition] = newTab
|
|
||||||
|
|
||||||
currentTabsAdapter.notifyItemChanged(tabPosition)
|
|
||||||
}
|
|
||||||
|
|
||||||
updateAvailableTabs()
|
|
||||||
saveTabs()
|
|
||||||
}
|
}
|
||||||
.create()
|
|
||||||
|
|
||||||
editText.doOnTextChanged { s, _, _, _ ->
|
updateAvailableTabs()
|
||||||
dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = validateHashtag(s)
|
saveTabs()
|
||||||
}
|
}
|
||||||
|
|
||||||
dialog.show()
|
|
||||||
dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = validateHashtag(editText.text)
|
|
||||||
dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
|
|
||||||
editText.requestFocus()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private var listSelectDialog: ListSelectionFragment? = null
|
private var listSelectDialog: ListSelectionFragment? = null
|
||||||
|
|
|
||||||
|
|
@ -464,9 +464,9 @@ class ComposeActivity :
|
||||||
binding.composeEditField.setAdapter(
|
binding.composeEditField.setAdapter(
|
||||||
ComposeAutoCompleteAdapter(
|
ComposeAutoCompleteAdapter(
|
||||||
this,
|
this,
|
||||||
preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false),
|
animateAvatar = preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false),
|
||||||
preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false),
|
animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false),
|
||||||
preferences.getBoolean(PrefKeys.SHOW_BOT_OVERLAY, true)
|
showBotBadge = preferences.getBoolean(PrefKeys.SHOW_BOT_OVERLAY, true)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
binding.composeEditField.setTokenizer(ComposeTokenizer())
|
binding.composeEditField.setTokenizer(ComposeTokenizer())
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,9 @@ class ComposeAutoCompleteAdapter(
|
||||||
private val autocompletionProvider: AutocompletionProvider,
|
private val autocompletionProvider: AutocompletionProvider,
|
||||||
private val animateAvatar: Boolean,
|
private val animateAvatar: Boolean,
|
||||||
private val animateEmojis: Boolean,
|
private val animateEmojis: Boolean,
|
||||||
private val showBotBadge: Boolean
|
private val showBotBadge: Boolean,
|
||||||
|
// if true, @ # : are returned in the result, otherwise only the raw value
|
||||||
|
private val withDecoration: Boolean = true,
|
||||||
) : BaseAdapter(), Filterable {
|
) : BaseAdapter(), Filterable {
|
||||||
|
|
||||||
private var resultList: List<AutocompleteResult> = emptyList()
|
private var resultList: List<AutocompleteResult> = emptyList()
|
||||||
|
|
@ -52,37 +54,35 @@ class ComposeAutoCompleteAdapter(
|
||||||
return position.toLong()
|
return position.toLong()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getFilter(): Filter {
|
override fun getFilter() = object : Filter() {
|
||||||
return object : Filter() {
|
|
||||||
|
|
||||||
override fun convertResultToString(resultValue: Any): CharSequence {
|
override fun convertResultToString(resultValue: Any): CharSequence {
|
||||||
return when (resultValue) {
|
return when (resultValue) {
|
||||||
is AutocompleteResult.AccountResult -> "@${resultValue.account.username}"
|
is AutocompleteResult.AccountResult -> if (withDecoration) "@${resultValue.account.username}" else resultValue.account.username
|
||||||
is AutocompleteResult.HashtagResult -> "#${resultValue.hashtag}"
|
is AutocompleteResult.HashtagResult -> if (withDecoration) "#${resultValue.hashtag}" else resultValue.hashtag
|
||||||
is AutocompleteResult.EmojiResult -> ":${resultValue.emoji.shortcode}:"
|
is AutocompleteResult.EmojiResult -> if (withDecoration) ":${resultValue.emoji.shortcode}:" else resultValue.emoji.shortcode
|
||||||
else -> ""
|
else -> ""
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
override fun performFiltering(constraint: CharSequence?): FilterResults {
|
override fun performFiltering(constraint: CharSequence?): FilterResults {
|
||||||
val filterResults = FilterResults()
|
val filterResults = FilterResults()
|
||||||
if (constraint != null) {
|
if (constraint != null) {
|
||||||
val results = autocompletionProvider.search(constraint.toString())
|
val results = autocompletionProvider.search(constraint.toString())
|
||||||
filterResults.values = results
|
filterResults.values = results
|
||||||
filterResults.count = results.size
|
filterResults.count = results.size
|
||||||
}
|
|
||||||
return filterResults
|
|
||||||
}
|
}
|
||||||
|
return filterResults
|
||||||
|
}
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
override fun publishResults(constraint: CharSequence?, results: FilterResults) {
|
override fun publishResults(constraint: CharSequence?, results: FilterResults) {
|
||||||
if (results.count > 0) {
|
if (results.count > 0) {
|
||||||
resultList = results.values as List<AutocompleteResult>
|
resultList = results.values as List<AutocompleteResult>
|
||||||
notifyDataSetChanged()
|
notifyDataSetChanged()
|
||||||
} else {
|
} else {
|
||||||
notifyDataSetInvalidated()
|
notifyDataSetInvalidated()
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ package com.keylesspalace.tusky.components.followedtags
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.view.WindowManager
|
|
||||||
import androidx.activity.viewModels
|
import androidx.activity.viewModels
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.paging.LoadState
|
import androidx.paging.LoadState
|
||||||
|
|
@ -11,14 +10,11 @@ import androidx.recyclerview.widget.DividerItemDecoration
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.SimpleItemAnimator
|
import androidx.recyclerview.widget.SimpleItemAnimator
|
||||||
import at.connyduck.calladapter.networkresult.fold
|
import at.connyduck.calladapter.networkresult.fold
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import com.keylesspalace.tusky.BaseActivity
|
import com.keylesspalace.tusky.BaseActivity
|
||||||
import com.keylesspalace.tusky.R
|
import com.keylesspalace.tusky.R
|
||||||
import com.keylesspalace.tusky.StatusListActivity
|
import com.keylesspalace.tusky.StatusListActivity
|
||||||
import com.keylesspalace.tusky.components.compose.ComposeAutoCompleteAdapter
|
|
||||||
import com.keylesspalace.tusky.databinding.ActivityFollowedTagsBinding
|
import com.keylesspalace.tusky.databinding.ActivityFollowedTagsBinding
|
||||||
import com.keylesspalace.tusky.databinding.DialogFollowHashtagBinding
|
|
||||||
import com.keylesspalace.tusky.interfaces.HashtagActionListener
|
import com.keylesspalace.tusky.interfaces.HashtagActionListener
|
||||||
import com.keylesspalace.tusky.network.MastodonApi
|
import com.keylesspalace.tusky.network.MastodonApi
|
||||||
import com.keylesspalace.tusky.util.copyToClipboard
|
import com.keylesspalace.tusky.util.copyToClipboard
|
||||||
|
|
@ -26,6 +22,7 @@ import com.keylesspalace.tusky.util.hide
|
||||||
import com.keylesspalace.tusky.util.show
|
import com.keylesspalace.tusky.util.show
|
||||||
import com.keylesspalace.tusky.util.viewBinding
|
import com.keylesspalace.tusky.util.viewBinding
|
||||||
import com.keylesspalace.tusky.util.visible
|
import com.keylesspalace.tusky.util.visible
|
||||||
|
import com.keylesspalace.tusky.view.showHashtagPickerDialog
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlinx.coroutines.flow.collectLatest
|
import kotlinx.coroutines.flow.collectLatest
|
||||||
|
|
@ -34,8 +31,8 @@ import kotlinx.coroutines.launch
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class FollowedTagsActivity :
|
class FollowedTagsActivity :
|
||||||
BaseActivity(),
|
BaseActivity(),
|
||||||
HashtagActionListener,
|
HashtagActionListener {
|
||||||
ComposeAutoCompleteAdapter.AutocompletionProvider {
|
|
||||||
@Inject
|
@Inject
|
||||||
lateinit var api: MastodonApi
|
lateinit var api: MastodonApi
|
||||||
|
|
||||||
|
|
@ -105,7 +102,7 @@ class FollowedTagsActivity :
|
||||||
|
|
||||||
private fun follow(tagName: String, position: Int = -1) {
|
private fun follow(tagName: String, position: Int = -1) {
|
||||||
lifecycleScope.launch {
|
lifecycleScope.launch {
|
||||||
api.followTag(tagName).fold(
|
val snackbarText = api.followTag(tagName).fold(
|
||||||
{
|
{
|
||||||
if (position == -1) {
|
if (position == -1) {
|
||||||
viewModel.tags.add(it)
|
viewModel.tags.add(it)
|
||||||
|
|
@ -113,17 +110,20 @@ class FollowedTagsActivity :
|
||||||
viewModel.tags.add(position, it)
|
viewModel.tags.add(position, it)
|
||||||
}
|
}
|
||||||
viewModel.currentSource?.invalidate()
|
viewModel.currentSource?.invalidate()
|
||||||
|
getString(R.string.follow_hashtag_success, tagName)
|
||||||
},
|
},
|
||||||
{
|
{ t ->
|
||||||
Snackbar.make(
|
Log.w(TAG, "failed to follow hashtag $tagName", t)
|
||||||
this@FollowedTagsActivity,
|
getString(R.string.error_following_hashtag_format, tagName)
|
||||||
binding.followedTagsView,
|
|
||||||
getString(R.string.error_following_hashtag_format, tagName),
|
|
||||||
Snackbar.LENGTH_SHORT
|
|
||||||
)
|
|
||||||
.show()
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
Snackbar.make(
|
||||||
|
this@FollowedTagsActivity,
|
||||||
|
binding.followedTagsView,
|
||||||
|
snackbarText,
|
||||||
|
Snackbar.LENGTH_SHORT
|
||||||
|
)
|
||||||
|
.show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -160,10 +160,6 @@ class FollowedTagsActivity :
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun search(token: String): List<ComposeAutoCompleteAdapter.AutocompleteResult> {
|
|
||||||
return viewModel.searchAutocompleteSuggestions(token)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun viewTag(tagName: String) {
|
override fun viewTag(tagName: String) {
|
||||||
startActivity(StatusListActivity.newHashtagIntent(this, tagName))
|
startActivity(StatusListActivity.newHashtagIntent(this, tagName))
|
||||||
}
|
}
|
||||||
|
|
@ -176,30 +172,9 @@ class FollowedTagsActivity :
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showDialog() {
|
private fun showDialog() {
|
||||||
val dialogBinding = DialogFollowHashtagBinding.inflate(layoutInflater)
|
showHashtagPickerDialog(api, R.string.dialog_follow_hashtag_title) { hashtag ->
|
||||||
dialogBinding.hashtagAutoCompleteTextView.setAdapter(
|
follow(hashtag)
|
||||||
ComposeAutoCompleteAdapter(
|
}
|
||||||
this,
|
|
||||||
animateAvatar = false,
|
|
||||||
animateEmojis = false,
|
|
||||||
showBotBadge = false
|
|
||||||
)
|
|
||||||
)
|
|
||||||
dialogBinding.hashtagAutoCompleteTextView.requestFocus()
|
|
||||||
dialogBinding.hashtagAutoCompleteTextView.setSelection(dialogBinding.hashtagAutoCompleteTextView.length())
|
|
||||||
|
|
||||||
val dialog = MaterialAlertDialogBuilder(this)
|
|
||||||
.setTitle(R.string.dialog_follow_hashtag_title)
|
|
||||||
.setView(dialogBinding.root)
|
|
||||||
.setPositiveButton(android.R.string.ok) { _, _ ->
|
|
||||||
follow(
|
|
||||||
dialogBinding.hashtagAutoCompleteTextView.text.toString().removePrefix("#")
|
|
||||||
)
|
|
||||||
}
|
|
||||||
.setNegativeButton(android.R.string.cancel, null)
|
|
||||||
.create()
|
|
||||||
dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
|
|
||||||
dialog.show()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
|
||||||
|
|
@ -1,24 +1,19 @@
|
||||||
package com.keylesspalace.tusky.components.followedtags
|
package com.keylesspalace.tusky.components.followedtags
|
||||||
|
|
||||||
import android.util.Log
|
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import androidx.paging.ExperimentalPagingApi
|
import androidx.paging.ExperimentalPagingApi
|
||||||
import androidx.paging.Pager
|
import androidx.paging.Pager
|
||||||
import androidx.paging.PagingConfig
|
import androidx.paging.PagingConfig
|
||||||
import androidx.paging.cachedIn
|
import androidx.paging.cachedIn
|
||||||
import at.connyduck.calladapter.networkresult.fold
|
|
||||||
import com.keylesspalace.tusky.components.compose.ComposeAutoCompleteAdapter
|
|
||||||
import com.keylesspalace.tusky.components.search.SearchType
|
|
||||||
import com.keylesspalace.tusky.entity.HashTag
|
import com.keylesspalace.tusky.entity.HashTag
|
||||||
import com.keylesspalace.tusky.network.MastodonApi
|
import com.keylesspalace.tusky.network.MastodonApi
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
class FollowedTagsViewModel @Inject constructor(
|
class FollowedTagsViewModel @Inject constructor(
|
||||||
private val api: MastodonApi
|
val api: MastodonApi
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
val tags: MutableList<HashTag> = mutableListOf()
|
val tags: MutableList<HashTag> = mutableListOf()
|
||||||
var nextKey: String? = null
|
var nextKey: String? = null
|
||||||
|
|
@ -39,24 +34,6 @@ class FollowedTagsViewModel @Inject constructor(
|
||||||
}
|
}
|
||||||
).flow.cachedIn(viewModelScope)
|
).flow.cachedIn(viewModelScope)
|
||||||
|
|
||||||
fun searchAutocompleteSuggestions(
|
|
||||||
token: String
|
|
||||||
): List<ComposeAutoCompleteAdapter.AutocompleteResult> {
|
|
||||||
return runBlocking {
|
|
||||||
api.search(query = token, type = SearchType.Hashtag.apiParameter, limit = 10)
|
|
||||||
.fold({ searchResult ->
|
|
||||||
searchResult.hashtags.map {
|
|
||||||
ComposeAutoCompleteAdapter.AutocompleteResult.HashtagResult(
|
|
||||||
it.name
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}, { e ->
|
|
||||||
Log.e(TAG, "Autocomplete search for $token failed.", e)
|
|
||||||
emptyList()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val TAG = "FollowedTagsViewModel"
|
private const val TAG = "FollowedTagsViewModel"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,118 @@
|
||||||
|
/* Copyright 2025 Tusky Contributors
|
||||||
|
*
|
||||||
|
* This file is a part of Tusky.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it under the terms of the
|
||||||
|
* GNU General Public License as published by the Free Software Foundation; either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
|
||||||
|
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||||||
|
* Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with Tusky; if not,
|
||||||
|
* see <http://www.gnu.org/licenses>. */
|
||||||
|
|
||||||
|
@file:JvmName("HashTagPickerDialog")
|
||||||
|
|
||||||
|
package com.keylesspalace.tusky.view
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.Log
|
||||||
|
import android.view.KeyEvent
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.WindowManager
|
||||||
|
import android.view.inputmethod.EditorInfo
|
||||||
|
import android.widget.TextView
|
||||||
|
import android.widget.TextView.OnEditorActionListener
|
||||||
|
import androidx.annotation.StringRes
|
||||||
|
import androidx.appcompat.app.AlertDialog
|
||||||
|
import androidx.core.widget.doOnTextChanged
|
||||||
|
import at.connyduck.calladapter.networkresult.fold
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
|
import com.keylesspalace.tusky.components.compose.ComposeAutoCompleteAdapter
|
||||||
|
import com.keylesspalace.tusky.components.search.SearchType
|
||||||
|
import com.keylesspalace.tusky.databinding.DialogPickHashtagBinding
|
||||||
|
import com.keylesspalace.tusky.network.MastodonApi
|
||||||
|
import com.keylesspalace.tusky.util.hashtagPattern
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.cancel
|
||||||
|
import kotlinx.coroutines.runBlocking
|
||||||
|
|
||||||
|
fun Context.showHashtagPickerDialog(
|
||||||
|
api: MastodonApi,
|
||||||
|
@StringRes title: Int,
|
||||||
|
onHashtagSelected: (String) -> Unit
|
||||||
|
) {
|
||||||
|
val dialogScope = CoroutineScope(Dispatchers.Main)
|
||||||
|
val dialogBinding = DialogPickHashtagBinding.inflate(LayoutInflater.from(this))
|
||||||
|
val autocompleteTextView = dialogBinding.pickHashtagEditText
|
||||||
|
|
||||||
|
val autoCompleteProvider = object : ComposeAutoCompleteAdapter.AutocompletionProvider {
|
||||||
|
override fun search(token: String): List<ComposeAutoCompleteAdapter.AutocompleteResult> {
|
||||||
|
return runBlocking {
|
||||||
|
api.search(query = token, type = SearchType.Hashtag.apiParameter, limit = 5)
|
||||||
|
.fold({ searchResult ->
|
||||||
|
searchResult.hashtags.map {
|
||||||
|
ComposeAutoCompleteAdapter.AutocompleteResult.HashtagResult(
|
||||||
|
it.name
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}, { e ->
|
||||||
|
Log.e("HashtagPickerDialog", "Autocomplete search for $token failed", e)
|
||||||
|
emptyList()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
autocompleteTextView.setAdapter(
|
||||||
|
ComposeAutoCompleteAdapter(
|
||||||
|
autoCompleteProvider,
|
||||||
|
animateAvatar = false,
|
||||||
|
animateEmojis = false,
|
||||||
|
showBotBadge = false,
|
||||||
|
withDecoration = false
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
autocompleteTextView.setSelection(autocompleteTextView.length())
|
||||||
|
|
||||||
|
val dialog = MaterialAlertDialogBuilder(this)
|
||||||
|
.setTitle(title)
|
||||||
|
.setView(dialogBinding.root)
|
||||||
|
.setPositiveButton(android.R.string.ok) { _, _ ->
|
||||||
|
onHashtagSelected(autocompleteTextView.text.toString())
|
||||||
|
}
|
||||||
|
.setNegativeButton(android.R.string.cancel, null)
|
||||||
|
.setOnDismissListener {
|
||||||
|
dialogScope.cancel()
|
||||||
|
}
|
||||||
|
.create()
|
||||||
|
|
||||||
|
autocompleteTextView.doOnTextChanged { s, _, _, _ ->
|
||||||
|
dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = validateHashtag(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
autocompleteTextView.setOnEditorActionListener(object : OnEditorActionListener {
|
||||||
|
override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean {
|
||||||
|
if (actionId == EditorInfo.IME_ACTION_DONE && validateHashtag(autocompleteTextView.text)) {
|
||||||
|
onHashtagSelected(autocompleteTextView.text.toString())
|
||||||
|
dialog.dismiss()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
|
||||||
|
dialog.show()
|
||||||
|
dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = validateHashtag(autocompleteTextView.text)
|
||||||
|
autocompleteTextView.requestFocus()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun validateHashtag(input: CharSequence?): Boolean {
|
||||||
|
val trimmedInput = input?.trim() ?: ""
|
||||||
|
return trimmedInput.isNotEmpty() && hashtagPattern.matcher(trimmedInput).matches()
|
||||||
|
}
|
||||||
|
|
@ -1,27 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:paddingLeft="20dp"
|
|
||||||
android:paddingTop="16dp"
|
|
||||||
android:paddingRight="20dp">
|
|
||||||
|
|
||||||
<com.google.android.material.textfield.TextInputLayout
|
|
||||||
android:id="@+id/addHashtagInputLayout"
|
|
||||||
style="@style/Widget.Material3.TextInputLayout.OutlinedBox.Dense"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:hint="@string/edit_hashtag_hint"
|
|
||||||
app:endIconMode="none">
|
|
||||||
|
|
||||||
<com.google.android.material.textfield.TextInputEditText
|
|
||||||
android:id="@+id/addHashtagEditText"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:inputType="textNoSuggestions"
|
|
||||||
android:lines="1" />
|
|
||||||
|
|
||||||
</com.google.android.material.textfield.TextInputLayout>
|
|
||||||
|
|
||||||
</FrameLayout>
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
|
@ -8,21 +8,23 @@
|
||||||
android:paddingRight="20dp">
|
android:paddingRight="20dp">
|
||||||
|
|
||||||
<com.google.android.material.textfield.TextInputLayout
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
android:id="@+id/hashtagAutoCompleteInputLayout"
|
android:id="@+id/pickHashtagInputLayout"
|
||||||
style="@style/Widget.Material3.TextInputLayout.OutlinedBox.Dense.ExposedDropdownMenu"
|
style="@style/Widget.Material3.TextInputLayout.OutlinedBox.Dense.ExposedDropdownMenu"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:hint="@string/dialog_follow_hashtag_hint"
|
android:hint="@string/pick_hashtag_hint"
|
||||||
app:endIconMode="none">
|
app:endIconMode="none">
|
||||||
|
|
||||||
<!-- textNoSuggestions is to disable spell check, it will auto-complete -->
|
<!-- textNoSuggestions is to disable spell check, it will auto-complete -->
|
||||||
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
||||||
android:id="@+id/hashtagAutoCompleteTextView"
|
android:id="@+id/pickHashtagEditText"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:completionThreshold="2"
|
||||||
|
android:imeOptions="actionDone"
|
||||||
android:inputType="textNoSuggestions"
|
android:inputType="textNoSuggestions"
|
||||||
android:lines="1" />
|
android:lines="1" />
|
||||||
|
|
||||||
</com.google.android.material.textfield.TextInputLayout>
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</FrameLayout>
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/hashtag"
|
android:id="@+id/hashtag"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:ellipsize="end"
|
android:ellipsize="end"
|
||||||
android:maxLines="1"
|
android:maxLines="1"
|
||||||
|
|
|
||||||
|
|
@ -350,7 +350,7 @@
|
||||||
<string name="downloading_media">جارٍ تنزيل الوسائط</string>
|
<string name="downloading_media">جارٍ تنزيل الوسائط</string>
|
||||||
<string name="dialog_redraft_post_warning">هل تريد حذف وإعادة صياغة هذا التبويق؟</string>
|
<string name="dialog_redraft_post_warning">هل تريد حذف وإعادة صياغة هذا التبويق؟</string>
|
||||||
<string name="description_post_favourited">تم تفضيله</string>
|
<string name="description_post_favourited">تم تفضيله</string>
|
||||||
<string name="edit_hashtag_hint">وسم بدون #</string>
|
<string name="pick_hashtag_hint">وسم بدون #</string>
|
||||||
<string name="notifications_clear">مسح</string>
|
<string name="notifications_clear">مسح</string>
|
||||||
<string name="notifications_apply_filter">عامل تصفية</string>
|
<string name="notifications_apply_filter">عامل تصفية</string>
|
||||||
<string name="filter_apply">طَبِّق</string>
|
<string name="filter_apply">طَبِّق</string>
|
||||||
|
|
|
||||||
|
|
@ -453,7 +453,7 @@
|
||||||
<string name="add_hashtag_title">Дадаць хэштэг</string>
|
<string name="add_hashtag_title">Дадаць хэштэг</string>
|
||||||
<string name="description_post_reblogged">Пашырана</string>
|
<string name="description_post_reblogged">Пашырана</string>
|
||||||
<string name="description_poll">Апытанне з варыянтамі: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
<string name="description_poll">Апытанне з варыянтамі: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
||||||
<string name="edit_hashtag_hint">Хэштэг без #</string>
|
<string name="pick_hashtag_hint">Хэштэг без #</string>
|
||||||
<string name="description_post_edited">Зменена</string>
|
<string name="description_post_edited">Зменена</string>
|
||||||
<string name="description_post_bookmarked">Дададзена ў закладкі</string>
|
<string name="description_post_bookmarked">Дададзена ў закладкі</string>
|
||||||
<string name="description_post_favourited">Упадабана</string>
|
<string name="description_post_favourited">Упадабана</string>
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@
|
||||||
<string name="list">Списък</string>
|
<string name="list">Списък</string>
|
||||||
<string name="select_list_title">Избиране на списък</string>
|
<string name="select_list_title">Избиране на списък</string>
|
||||||
<string name="hashtags">Хаштагове</string>
|
<string name="hashtags">Хаштагове</string>
|
||||||
<string name="edit_hashtag_hint">Хаштаг без #</string>
|
<string name="pick_hashtag_hint">Хаштаг без #</string>
|
||||||
<string name="add_hashtag_title">Добавяне на хаштаг</string>
|
<string name="add_hashtag_title">Добавяне на хаштаг</string>
|
||||||
<string name="hint_list_name">Име на списък</string>
|
<string name="hint_list_name">Име на списък</string>
|
||||||
<string name="description_poll">Анкета с избори: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
<string name="description_poll">Анкета с избори: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
||||||
|
|
|
||||||
|
|
@ -383,7 +383,7 @@
|
||||||
<string name="filter_apply">প্রয়োগ</string>
|
<string name="filter_apply">প্রয়োগ</string>
|
||||||
<string name="notifications_apply_filter">ফিল্টার</string>
|
<string name="notifications_apply_filter">ফিল্টার</string>
|
||||||
<string name="notifications_clear">পরিষ্কার</string>
|
<string name="notifications_clear">পরিষ্কার</string>
|
||||||
<string name="edit_hashtag_hint"># ছাড়া হ্যাশট্যাগ</string>
|
<string name="pick_hashtag_hint"># ছাড়া হ্যাশট্যাগ</string>
|
||||||
<string name="hint_list_name">নামের তালিকা</string>
|
<string name="hint_list_name">নামের তালিকা</string>
|
||||||
<string name="title_favourites">প্রিয়গুলো</string>
|
<string name="title_favourites">প্রিয়গুলো</string>
|
||||||
<string name="title_followers">অনুগামিবৃন্দ</string>
|
<string name="title_followers">অনুগামিবৃন্দ</string>
|
||||||
|
|
|
||||||
|
|
@ -351,7 +351,7 @@
|
||||||
<string name="description_visibility_direct">সরাসরি</string>
|
<string name="description_visibility_direct">সরাসরি</string>
|
||||||
<string name="description_poll">পছন্দগুলি সহ নর্বাচন: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
<string name="description_poll">পছন্দগুলি সহ নর্বাচন: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
||||||
<string name="hint_list_name">নামের তালিকা</string>
|
<string name="hint_list_name">নামের তালিকা</string>
|
||||||
<string name="edit_hashtag_hint"># ছাড়া হ্যাশট্যাগ</string>
|
<string name="pick_hashtag_hint"># ছাড়া হ্যাশট্যাগ</string>
|
||||||
<string name="notifications_clear">পরিষ্কার</string>
|
<string name="notifications_clear">পরিষ্কার</string>
|
||||||
<string name="notifications_apply_filter">ফিল্টার</string>
|
<string name="notifications_apply_filter">ফিল্টার</string>
|
||||||
<string name="filter_apply">প্রয়োগ</string>
|
<string name="filter_apply">প্রয়োগ</string>
|
||||||
|
|
|
||||||
|
|
@ -347,7 +347,7 @@
|
||||||
<string name="description_visibility_private">Seguidors</string>
|
<string name="description_visibility_private">Seguidors</string>
|
||||||
<string name="description_visibility_direct">Directe</string>
|
<string name="description_visibility_direct">Directe</string>
|
||||||
<string name="hint_list_name">Nom de la llista</string>
|
<string name="hint_list_name">Nom de la llista</string>
|
||||||
<string name="edit_hashtag_hint">Hashtag sense #</string>
|
<string name="pick_hashtag_hint">Hashtag sense #</string>
|
||||||
<string name="notifications_clear">Netejar</string>
|
<string name="notifications_clear">Netejar</string>
|
||||||
<string name="notifications_apply_filter">Filtrar</string>
|
<string name="notifications_apply_filter">Filtrar</string>
|
||||||
<string name="filter_apply">Aplicar</string>
|
<string name="filter_apply">Aplicar</string>
|
||||||
|
|
|
||||||
|
|
@ -306,7 +306,7 @@
|
||||||
<string name="list">لیست</string>
|
<string name="list">لیست</string>
|
||||||
<string name="select_list_title">دیاریکردنی لیست</string>
|
<string name="select_list_title">دیاریکردنی لیست</string>
|
||||||
<string name="hashtags">هاشتاگی</string>
|
<string name="hashtags">هاشتاگی</string>
|
||||||
<string name="edit_hashtag_hint">هاشتاگی بێ #</string>
|
<string name="pick_hashtag_hint">هاشتاگی بێ #</string>
|
||||||
<string name="add_hashtag_title">هاشتاگی زیاد بکە</string>
|
<string name="add_hashtag_title">هاشتاگی زیاد بکە</string>
|
||||||
<string name="hint_list_name">ناوی لیست</string>
|
<string name="hint_list_name">ناوی لیست</string>
|
||||||
<string name="description_poll">ڕاپرسی لەگەڵ هەڵبژاردنەکان: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
<string name="description_poll">ڕاپرسی لەگەڵ هەڵبژاردنەکان: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
||||||
|
|
|
||||||
|
|
@ -351,7 +351,7 @@
|
||||||
<string name="description_visibility_private">Pro sledující</string>
|
<string name="description_visibility_private">Pro sledující</string>
|
||||||
<string name="description_visibility_direct">Přímý</string>
|
<string name="description_visibility_direct">Přímý</string>
|
||||||
<string name="hint_list_name">Název seznamu</string>
|
<string name="hint_list_name">Název seznamu</string>
|
||||||
<string name="edit_hashtag_hint">Hashtag bez #</string>
|
<string name="pick_hashtag_hint">Hashtag bez #</string>
|
||||||
<string name="compose_shortcut_long_label">Napsat příspěvek</string>
|
<string name="compose_shortcut_long_label">Napsat příspěvek</string>
|
||||||
<string name="compose_shortcut_short_label">Napsat</string>
|
<string name="compose_shortcut_short_label">Napsat</string>
|
||||||
<string name="notifications_clear">Vyčistit</string>
|
<string name="notifications_clear">Vyčistit</string>
|
||||||
|
|
|
||||||
|
|
@ -379,7 +379,7 @@
|
||||||
<string name="delete_scheduled_post_warning">Dileu\'r neges wedi\'u hamserlennu hon\?</string>
|
<string name="delete_scheduled_post_warning">Dileu\'r neges wedi\'u hamserlennu hon\?</string>
|
||||||
<string name="description_post_media_no_description_placeholder">Dim disgrifiad</string>
|
<string name="description_post_media_no_description_placeholder">Dim disgrifiad</string>
|
||||||
<string name="hint_list_name">Enw\'r rhestr</string>
|
<string name="hint_list_name">Enw\'r rhestr</string>
|
||||||
<string name="edit_hashtag_hint">Hashnod heb #</string>
|
<string name="pick_hashtag_hint">Hashnod heb #</string>
|
||||||
<string name="report_remote_instance">Anfon ymlaen at %1$s</string>
|
<string name="report_remote_instance">Anfon ymlaen at %1$s</string>
|
||||||
<string name="report_description_remote_instance">Daw\'r cyfrif o weinydd arall. Ydych chi am anfon copi dienw o\'r adroddiad i\'r gweinydd hwnnw hefyd\?</string>
|
<string name="report_description_remote_instance">Daw\'r cyfrif o weinydd arall. Ydych chi am anfon copi dienw o\'r adroddiad i\'r gweinydd hwnnw hefyd\?</string>
|
||||||
<string name="duration_1_hour">Awr</string>
|
<string name="duration_1_hour">Awr</string>
|
||||||
|
|
|
||||||
|
|
@ -319,7 +319,7 @@
|
||||||
<string name="error_delete_list">Liste konnte nicht gelöscht werden</string>
|
<string name="error_delete_list">Liste konnte nicht gelöscht werden</string>
|
||||||
<string name="hint_search_people_list">Suche nach Leuten, denen du folgst</string>
|
<string name="hint_search_people_list">Suche nach Leuten, denen du folgst</string>
|
||||||
<string name="action_remove_from_list">Konto aus der Liste entfernen</string>
|
<string name="action_remove_from_list">Konto aus der Liste entfernen</string>
|
||||||
<string name="edit_hashtag_hint">Hashtag ohne #</string>
|
<string name="pick_hashtag_hint">Hashtag ohne #</string>
|
||||||
<string name="action_open_reblogger">Autor*in des geteilten Beitrags öffnen</string>
|
<string name="action_open_reblogger">Autor*in des geteilten Beitrags öffnen</string>
|
||||||
<string name="pref_title_public_filter_keywords">Öffentliche Timelines</string>
|
<string name="pref_title_public_filter_keywords">Öffentliche Timelines</string>
|
||||||
<plurals name="favs">
|
<plurals name="favs">
|
||||||
|
|
|
||||||
|
|
@ -360,7 +360,7 @@
|
||||||
<string name="pref_title_animate_gif_avatars">Ebligi GIF-profilbildojn</string>
|
<string name="pref_title_animate_gif_avatars">Ebligi GIF-profilbildojn</string>
|
||||||
<string name="notification_poll_name">Enketoj</string>
|
<string name="notification_poll_name">Enketoj</string>
|
||||||
<string name="notification_poll_description">Sciigoj pri enketoj, kiuj finiĝis</string>
|
<string name="notification_poll_description">Sciigoj pri enketoj, kiuj finiĝis</string>
|
||||||
<string name="edit_hashtag_hint">Kradvorto sen #</string>
|
<string name="pick_hashtag_hint">Kradvorto sen #</string>
|
||||||
<string name="notifications_clear">Viŝi</string>
|
<string name="notifications_clear">Viŝi</string>
|
||||||
<string name="notifications_apply_filter">Filtri</string>
|
<string name="notifications_apply_filter">Filtri</string>
|
||||||
<string name="filter_apply">Apliki</string>
|
<string name="filter_apply">Apliki</string>
|
||||||
|
|
|
||||||
|
|
@ -382,7 +382,7 @@
|
||||||
<string name="description_visibility_unlisted">Sin listar</string>
|
<string name="description_visibility_unlisted">Sin listar</string>
|
||||||
<string name="description_visibility_direct">Directo</string>
|
<string name="description_visibility_direct">Directo</string>
|
||||||
<string name="hint_list_name">Nombre de la lista</string>
|
<string name="hint_list_name">Nombre de la lista</string>
|
||||||
<string name="edit_hashtag_hint">Etiqueta sin #</string>
|
<string name="pick_hashtag_hint">Etiqueta sin #</string>
|
||||||
<string name="notifications_clear">Limpiar</string>
|
<string name="notifications_clear">Limpiar</string>
|
||||||
<string name="notifications_apply_filter">Filtro</string>
|
<string name="notifications_apply_filter">Filtro</string>
|
||||||
<string name="compose_shortcut_long_label">Escribir publicación</string>
|
<string name="compose_shortcut_long_label">Escribir publicación</string>
|
||||||
|
|
|
||||||
|
|
@ -367,7 +367,7 @@
|
||||||
<string name="description_visibility_direct">Zuzena</string>
|
<string name="description_visibility_direct">Zuzena</string>
|
||||||
<string name="description_poll">Inkesta aukerekin: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
<string name="description_poll">Inkesta aukerekin: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
||||||
<string name="hint_list_name">Zerrendaren izena</string>
|
<string name="hint_list_name">Zerrendaren izena</string>
|
||||||
<string name="edit_hashtag_hint">Traola # gabe</string>
|
<string name="pick_hashtag_hint">Traola # gabe</string>
|
||||||
<string name="notifications_clear">Garbitu</string>
|
<string name="notifications_clear">Garbitu</string>
|
||||||
<string name="notifications_apply_filter">Iragazi</string>
|
<string name="notifications_apply_filter">Iragazi</string>
|
||||||
<string name="filter_apply">Aplikatu</string>
|
<string name="filter_apply">Aplikatu</string>
|
||||||
|
|
|
||||||
|
|
@ -357,7 +357,7 @@
|
||||||
<string name="description_visibility_direct">مستقیم</string>
|
<string name="description_visibility_direct">مستقیم</string>
|
||||||
<string name="description_poll">نظرسنجی با گزینهها: %1$s، %2$s، %3$s، %4$s؛ %5$s</string>
|
<string name="description_poll">نظرسنجی با گزینهها: %1$s، %2$s، %3$s، %4$s؛ %5$s</string>
|
||||||
<string name="hint_list_name">نام سیاهه</string>
|
<string name="hint_list_name">نام سیاهه</string>
|
||||||
<string name="edit_hashtag_hint">برچسب بدون #</string>
|
<string name="pick_hashtag_hint">برچسب بدون #</string>
|
||||||
<string name="notifications_clear">حذف</string>
|
<string name="notifications_clear">حذف</string>
|
||||||
<string name="notifications_apply_filter">پالایش</string>
|
<string name="notifications_apply_filter">پالایش</string>
|
||||||
<string name="filter_apply">اعمال</string>
|
<string name="filter_apply">اعمال</string>
|
||||||
|
|
|
||||||
|
|
@ -217,7 +217,7 @@
|
||||||
\n(enintään %1$d merkkiä)</item>
|
\n(enintään %1$d merkkiä)</item>
|
||||||
<item quantity="other"/>
|
<item quantity="other"/>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="edit_hashtag_hint">Aihetunniste ilman #-merkkiä</string>
|
<string name="pick_hashtag_hint">Aihetunniste ilman #-merkkiä</string>
|
||||||
<string name="title_domain_mutes">Piilotetus verkkonimet</string>
|
<string name="title_domain_mutes">Piilotetus verkkonimet</string>
|
||||||
<string name="action_share_as">Jaa…</string>
|
<string name="action_share_as">Jaa…</string>
|
||||||
<string name="error_no_web_browser_found">Verkkoselainta ei löytynyt.</string>
|
<string name="error_no_web_browser_found">Verkkoselainta ei löytynyt.</string>
|
||||||
|
|
|
||||||
|
|
@ -350,7 +350,7 @@
|
||||||
</string>
|
</string>
|
||||||
<string name="description_visibility_direct">Direct</string>
|
<string name="description_visibility_direct">Direct</string>
|
||||||
<string name="hint_list_name">Nom de la liste</string>
|
<string name="hint_list_name">Nom de la liste</string>
|
||||||
<string name="edit_hashtag_hint">Hashtag sans #</string>
|
<string name="pick_hashtag_hint">Hashtag sans #</string>
|
||||||
<string name="notifications_clear">Supprimer</string>
|
<string name="notifications_clear">Supprimer</string>
|
||||||
<string name="notifications_apply_filter">Filtrer</string>
|
<string name="notifications_apply_filter">Filtrer</string>
|
||||||
<string name="filter_apply">Appliquer</string>
|
<string name="filter_apply">Appliquer</string>
|
||||||
|
|
|
||||||
|
|
@ -376,7 +376,7 @@
|
||||||
<string name="description_visibility_direct">Díreach</string>
|
<string name="description_visibility_direct">Díreach</string>
|
||||||
<string name="hint_list_name">Ainm liosta</string>
|
<string name="hint_list_name">Ainm liosta</string>
|
||||||
<string name="add_hashtag_title">Cuir hashtag leis</string>
|
<string name="add_hashtag_title">Cuir hashtag leis</string>
|
||||||
<string name="edit_hashtag_hint">Hashtag gan #</string>
|
<string name="pick_hashtag_hint">Hashtag gan #</string>
|
||||||
<string name="select_list_title">Roghnaigh liosta</string>
|
<string name="select_list_title">Roghnaigh liosta</string>
|
||||||
<string name="notifications_clear">Glan</string>
|
<string name="notifications_clear">Glan</string>
|
||||||
<string name="notifications_apply_filter">Scagaire</string>
|
<string name="notifications_apply_filter">Scagaire</string>
|
||||||
|
|
|
||||||
|
|
@ -171,7 +171,7 @@
|
||||||
<string name="notifications_clear">Sguab às</string>
|
<string name="notifications_clear">Sguab às</string>
|
||||||
<string name="list">Liosta</string>
|
<string name="list">Liosta</string>
|
||||||
<string name="select_list_title">Tagh liosta</string>
|
<string name="select_list_title">Tagh liosta</string>
|
||||||
<string name="edit_hashtag_hint">Taga hais gun #</string>
|
<string name="pick_hashtag_hint">Taga hais gun #</string>
|
||||||
<string name="add_hashtag_title">Cuir taga hais ris</string>
|
<string name="add_hashtag_title">Cuir taga hais ris</string>
|
||||||
<string name="hint_list_name">Ainm na liosta</string>
|
<string name="hint_list_name">Ainm na liosta</string>
|
||||||
<string name="description_poll">Cunntas-bheachd le roghainnean: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
<string name="description_poll">Cunntas-bheachd le roghainnean: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
||||||
|
|
|
||||||
|
|
@ -180,7 +180,7 @@
|
||||||
<string name="list">Lista</string>
|
<string name="list">Lista</string>
|
||||||
<string name="select_list_title">Escoller lista</string>
|
<string name="select_list_title">Escoller lista</string>
|
||||||
<string name="hashtags">Cancelos</string>
|
<string name="hashtags">Cancelos</string>
|
||||||
<string name="edit_hashtag_hint">Cancelo sen #</string>
|
<string name="pick_hashtag_hint">Cancelo sen #</string>
|
||||||
<string name="add_hashtag_title">Engadir cancelo</string>
|
<string name="add_hashtag_title">Engadir cancelo</string>
|
||||||
<string name="hint_list_name">Nome da lista</string>
|
<string name="hint_list_name">Nome da lista</string>
|
||||||
<string name="description_poll">Enquisa con opcións: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
<string name="description_poll">Enquisa con opcións: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
||||||
|
|
|
||||||
|
|
@ -359,7 +359,7 @@
|
||||||
<string name="description_visibility_direct">Közvetlen</string>
|
<string name="description_visibility_direct">Közvetlen</string>
|
||||||
<string name="description_poll">Szavazás válaszokkal: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
<string name="description_poll">Szavazás válaszokkal: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
||||||
<string name="hint_list_name">Lista neve</string>
|
<string name="hint_list_name">Lista neve</string>
|
||||||
<string name="edit_hashtag_hint">Hashtag # nélkül</string>
|
<string name="pick_hashtag_hint">Hashtag # nélkül</string>
|
||||||
<string name="notifications_clear">Törlés</string>
|
<string name="notifications_clear">Törlés</string>
|
||||||
<string name="notifications_apply_filter">Szűrés</string>
|
<string name="notifications_apply_filter">Szűrés</string>
|
||||||
<string name="filter_apply">Alkalmaz</string>
|
<string name="filter_apply">Alkalmaz</string>
|
||||||
|
|
|
||||||
|
|
@ -356,7 +356,7 @@
|
||||||
<string name="description_visibility_direct">Beint</string>
|
<string name="description_visibility_direct">Beint</string>
|
||||||
<string name="description_poll">Könnun með valkostunum: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
<string name="description_poll">Könnun með valkostunum: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
||||||
<string name="hint_list_name">Heiti á lista</string>
|
<string name="hint_list_name">Heiti á lista</string>
|
||||||
<string name="edit_hashtag_hint">Myllumerki án #</string>
|
<string name="pick_hashtag_hint">Myllumerki án #</string>
|
||||||
<string name="select_list_title">Veldu lista</string>
|
<string name="select_list_title">Veldu lista</string>
|
||||||
<string name="list">Listi</string>
|
<string name="list">Listi</string>
|
||||||
<string name="notifications_clear">Eyða</string>
|
<string name="notifications_clear">Eyða</string>
|
||||||
|
|
|
||||||
|
|
@ -351,7 +351,7 @@
|
||||||
<string name="download_media">Scarica media</string>
|
<string name="download_media">Scarica media</string>
|
||||||
<string name="downloading_media">Scaricando media</string>
|
<string name="downloading_media">Scaricando media</string>
|
||||||
<string name="compose_shortcut_long_label">Componi post</string>
|
<string name="compose_shortcut_long_label">Componi post</string>
|
||||||
<string name="edit_hashtag_hint">Hashtag senza #</string>
|
<string name="pick_hashtag_hint">Hashtag senza #</string>
|
||||||
<string name="compose_shortcut_short_label">Componi</string>
|
<string name="compose_shortcut_short_label">Componi</string>
|
||||||
<string name="notifications_clear">Cancella</string>
|
<string name="notifications_clear">Cancella</string>
|
||||||
<string name="notifications_apply_filter">Filtra</string>
|
<string name="notifications_apply_filter">Filtra</string>
|
||||||
|
|
|
||||||
|
|
@ -432,7 +432,7 @@
|
||||||
<string name="pref_title_enable_swipe_for_tabs">タブ間の切り替えにスワイプのジェスチャーを有効化</string>
|
<string name="pref_title_enable_swipe_for_tabs">タブ間の切り替えにスワイプのジェスチャーを有効化</string>
|
||||||
<string name="pref_title_show_cards_in_timelines">リンクのプレビューをタイムラインに表示</string>
|
<string name="pref_title_show_cards_in_timelines">リンクのプレビューをタイムラインに表示</string>
|
||||||
<string name="pref_title_confirm_reblogs">ブーストする前に確認を表示</string>
|
<string name="pref_title_confirm_reblogs">ブーストする前に確認を表示</string>
|
||||||
<string name="edit_hashtag_hint">ハッシュタグ (#をつけない)</string>
|
<string name="pick_hashtag_hint">ハッシュタグ (#をつけない)</string>
|
||||||
<string name="select_list_title">リストを選択</string>
|
<string name="select_list_title">リストを選択</string>
|
||||||
<string name="poll_info_format"> <!-- 15 votes • 1 hour left --> %1$s • %2$s</string>
|
<string name="poll_info_format"> <!-- 15 votes • 1 hour left --> %1$s • %2$s</string>
|
||||||
<string name="poll_info_time_absolute">%1$sに終了</string>
|
<string name="poll_info_time_absolute">%1$sに終了</string>
|
||||||
|
|
|
||||||
|
|
@ -356,7 +356,7 @@
|
||||||
<string name="description_visibility_direct">다이렉트</string>
|
<string name="description_visibility_direct">다이렉트</string>
|
||||||
<string name="description_poll">투표 선택지: %1$s, %2$s, %3$s, %4$s, %5$s</string>
|
<string name="description_poll">투표 선택지: %1$s, %2$s, %3$s, %4$s, %5$s</string>
|
||||||
<string name="hint_list_name">리스트 이름</string>
|
<string name="hint_list_name">리스트 이름</string>
|
||||||
<string name="edit_hashtag_hint">#를 제외한 해시태그</string>
|
<string name="pick_hashtag_hint">#를 제외한 해시태그</string>
|
||||||
<string name="notifications_clear">알림 지우기</string>
|
<string name="notifications_clear">알림 지우기</string>
|
||||||
<string name="notifications_apply_filter">필터</string>
|
<string name="notifications_apply_filter">필터</string>
|
||||||
<string name="filter_apply">적용</string>
|
<string name="filter_apply">적용</string>
|
||||||
|
|
|
||||||
|
|
@ -531,7 +531,7 @@
|
||||||
<string name="action_post_failed">Augšupielāde neizdevās</string>
|
<string name="action_post_failed">Augšupielāde neizdevās</string>
|
||||||
<string name="action_post_failed_show_drafts">Rādīt melnrakstus</string>
|
<string name="action_post_failed_show_drafts">Rādīt melnrakstus</string>
|
||||||
<string name="action_post_failed_do_nothing">Aizvākt</string>
|
<string name="action_post_failed_do_nothing">Aizvākt</string>
|
||||||
<string name="edit_hashtag_hint">Tēmturis bez #</string>
|
<string name="pick_hashtag_hint">Tēmturis bez #</string>
|
||||||
<string name="status_edit_info">%1$s laboja</string>
|
<string name="status_edit_info">%1$s laboja</string>
|
||||||
<string name="action_browser_login">Pieslēgties ar pārlūku</string>
|
<string name="action_browser_login">Pieslēgties ar pārlūku</string>
|
||||||
<string name="description_login">Strādā vairumā gadījumu. Dati netiek nopludināti uz citām lietotnēm.</string>
|
<string name="description_login">Strādā vairumā gadījumu. Dati netiek nopludināti uz citām lietotnēm.</string>
|
||||||
|
|
|
||||||
|
|
@ -325,7 +325,7 @@
|
||||||
<string name="description_visibility_private">Følgere</string>
|
<string name="description_visibility_private">Følgere</string>
|
||||||
<string name="description_visibility_direct">Direkte</string>
|
<string name="description_visibility_direct">Direkte</string>
|
||||||
<string name="hint_list_name">Listenavn</string>
|
<string name="hint_list_name">Listenavn</string>
|
||||||
<string name="edit_hashtag_hint">Emneord uten #</string>
|
<string name="pick_hashtag_hint">Emneord uten #</string>
|
||||||
<string name="notifications_clear">Fjern</string>
|
<string name="notifications_clear">Fjern</string>
|
||||||
<string name="notifications_apply_filter">Filter</string>
|
<string name="notifications_apply_filter">Filter</string>
|
||||||
<string name="filter_apply">Bruk</string>
|
<string name="filter_apply">Bruk</string>
|
||||||
|
|
|
||||||
|
|
@ -342,7 +342,7 @@
|
||||||
<string name="action_add_to_list">Account aan de lijst toevoegen</string>
|
<string name="action_add_to_list">Account aan de lijst toevoegen</string>
|
||||||
<string name="action_remove_from_list">Account uit de lijst verwijderen</string>
|
<string name="action_remove_from_list">Account uit de lijst verwijderen</string>
|
||||||
<string name="hint_list_name">Naam van lijst</string>
|
<string name="hint_list_name">Naam van lijst</string>
|
||||||
<string name="edit_hashtag_hint">Hashtag zonder #</string>
|
<string name="pick_hashtag_hint">Hashtag zonder #</string>
|
||||||
<string name="action_delete_and_redraft">Verwijderen en herschrijven</string>
|
<string name="action_delete_and_redraft">Verwijderen en herschrijven</string>
|
||||||
<string name="dialog_redraft_post_warning">Dit bericht verwijderen en herschrijven\?</string>
|
<string name="dialog_redraft_post_warning">Dit bericht verwijderen en herschrijven\?</string>
|
||||||
<string name="notifications_clear">Verwijderen</string>
|
<string name="notifications_clear">Verwijderen</string>
|
||||||
|
|
|
||||||
|
|
@ -342,7 +342,7 @@
|
||||||
<string name="description_visibility_private">Seguidors</string>
|
<string name="description_visibility_private">Seguidors</string>
|
||||||
<string name="description_visibility_direct">Dirècte</string>
|
<string name="description_visibility_direct">Dirècte</string>
|
||||||
<string name="hint_list_name">Nom de la lista</string>
|
<string name="hint_list_name">Nom de la lista</string>
|
||||||
<string name="edit_hashtag_hint">Etiquetas sens #</string>
|
<string name="pick_hashtag_hint">Etiquetas sens #</string>
|
||||||
<string name="compose_shortcut_long_label">Escriure una publicacion</string>
|
<string name="compose_shortcut_long_label">Escriure una publicacion</string>
|
||||||
<string name="compose_shortcut_short_label">Redactar</string>
|
<string name="compose_shortcut_short_label">Redactar</string>
|
||||||
<string name="action_delete_and_redraft">Suprimir e reformular</string>
|
<string name="action_delete_and_redraft">Suprimir e reformular</string>
|
||||||
|
|
|
||||||
|
|
@ -375,7 +375,7 @@
|
||||||
<string name="description_visibility_direct">Bezpośrednio</string>
|
<string name="description_visibility_direct">Bezpośrednio</string>
|
||||||
<string name="description_poll">Głosowanie z opcjami: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
<string name="description_poll">Głosowanie z opcjami: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
||||||
<string name="hint_list_name">Nazwa listy</string>
|
<string name="hint_list_name">Nazwa listy</string>
|
||||||
<string name="edit_hashtag_hint">Hashtag bez #</string>
|
<string name="pick_hashtag_hint">Hashtag bez #</string>
|
||||||
<string name="notifications_clear">Wyczyść</string>
|
<string name="notifications_clear">Wyczyść</string>
|
||||||
<string name="notifications_apply_filter">Filtr</string>
|
<string name="notifications_apply_filter">Filtr</string>
|
||||||
<string name="filter_apply">Zastosuj</string>
|
<string name="filter_apply">Zastosuj</string>
|
||||||
|
|
|
||||||
|
|
@ -351,7 +351,7 @@
|
||||||
<string name="description_visibility_unlisted">Não-listado</string>
|
<string name="description_visibility_unlisted">Não-listado</string>
|
||||||
<string name="description_visibility_direct">Direto</string>
|
<string name="description_visibility_direct">Direto</string>
|
||||||
<string name="hint_list_name">Nome da lista</string>
|
<string name="hint_list_name">Nome da lista</string>
|
||||||
<string name="edit_hashtag_hint">Hashtag sem #</string>
|
<string name="pick_hashtag_hint">Hashtag sem #</string>
|
||||||
<string name="notifications_clear">Excluir notificações</string>
|
<string name="notifications_clear">Excluir notificações</string>
|
||||||
<string name="notifications_apply_filter">Filtrar notificações</string>
|
<string name="notifications_apply_filter">Filtrar notificações</string>
|
||||||
<string name="filter_apply">Salvar</string>
|
<string name="filter_apply">Salvar</string>
|
||||||
|
|
|
||||||
|
|
@ -396,7 +396,7 @@
|
||||||
<string name="description_poll">Votação com as opções: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
<string name="description_poll">Votação com as opções: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
||||||
<string name="hint_list_name">Nome da lista</string>
|
<string name="hint_list_name">Nome da lista</string>
|
||||||
<string name="add_hashtag_title">Adicionar hashtag</string>
|
<string name="add_hashtag_title">Adicionar hashtag</string>
|
||||||
<string name="edit_hashtag_hint">Hashtag sem #</string>
|
<string name="pick_hashtag_hint">Hashtag sem #</string>
|
||||||
<string name="hashtags">Hashtags</string>
|
<string name="hashtags">Hashtags</string>
|
||||||
<string name="select_list_title">Selecionar lista</string>
|
<string name="select_list_title">Selecionar lista</string>
|
||||||
<string name="list">Lista</string>
|
<string name="list">Lista</string>
|
||||||
|
|
|
||||||
|
|
@ -374,7 +374,7 @@
|
||||||
<string name="description_visibility_private">Подписчики</string>
|
<string name="description_visibility_private">Подписчики</string>
|
||||||
<string name="description_visibility_direct">Личное упоминание</string>
|
<string name="description_visibility_direct">Личное упоминание</string>
|
||||||
<string name="hint_list_name">Название списка</string>
|
<string name="hint_list_name">Название списка</string>
|
||||||
<string name="edit_hashtag_hint">Хэштег без #</string>
|
<string name="pick_hashtag_hint">Хэштег без #</string>
|
||||||
<string name="notifications_clear">Очистить</string>
|
<string name="notifications_clear">Очистить</string>
|
||||||
<string name="notifications_apply_filter">Фильтр</string>
|
<string name="notifications_apply_filter">Фильтр</string>
|
||||||
<string name="filter_apply">Применить</string>
|
<string name="filter_apply">Применить</string>
|
||||||
|
|
|
||||||
|
|
@ -427,7 +427,7 @@
|
||||||
<string name="list">सूचिः</string>
|
<string name="list">सूचिः</string>
|
||||||
<string name="select_list_title">सूचिरवचीयताम्</string>
|
<string name="select_list_title">सूचिरवचीयताम्</string>
|
||||||
<string name="hashtags">निश्रेणिचिह्नशीर्षकाः</string>
|
<string name="hashtags">निश्रेणिचिह्नशीर्षकाः</string>
|
||||||
<string name="edit_hashtag_hint"># चिह्नं विना प्रचलितम्</string>
|
<string name="pick_hashtag_hint"># चिह्नं विना प्रचलितम्</string>
|
||||||
<string name="add_hashtag_title">प्रचलितं युज्यताम्</string>
|
<string name="add_hashtag_title">प्रचलितं युज्यताम्</string>
|
||||||
<string name="hint_list_name">सूचिनाम</string>
|
<string name="hint_list_name">सूचिनाम</string>
|
||||||
<string name="description_poll">मतदाने मतानि- %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
<string name="description_poll">मतदाने मतानि- %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
||||||
|
|
|
||||||
|
|
@ -319,7 +319,7 @@
|
||||||
<string name="description_visibility_private">Sledilci</string>
|
<string name="description_visibility_private">Sledilci</string>
|
||||||
<string name="description_visibility_direct">Neposredno</string>
|
<string name="description_visibility_direct">Neposredno</string>
|
||||||
<string name="hint_list_name">Ime seznama</string>
|
<string name="hint_list_name">Ime seznama</string>
|
||||||
<string name="edit_hashtag_hint">Ključnik brez #</string>
|
<string name="pick_hashtag_hint">Ključnik brez #</string>
|
||||||
<string name="notifications_clear">Počisti</string>
|
<string name="notifications_clear">Počisti</string>
|
||||||
<string name="notifications_apply_filter">Filter</string>
|
<string name="notifications_apply_filter">Filter</string>
|
||||||
<string name="filter_apply">Uporabi</string>
|
<string name="filter_apply">Uporabi</string>
|
||||||
|
|
|
||||||
|
|
@ -348,7 +348,7 @@
|
||||||
<string name="hint_list_name">Listnamn</string>
|
<string name="hint_list_name">Listnamn</string>
|
||||||
<string name="download_media">Ladda ned media</string>
|
<string name="download_media">Ladda ned media</string>
|
||||||
<string name="downloading_media">Laddar ned media</string>
|
<string name="downloading_media">Laddar ned media</string>
|
||||||
<string name="edit_hashtag_hint">Hashtag utan #</string>
|
<string name="pick_hashtag_hint">Hashtag utan #</string>
|
||||||
<string name="compose_shortcut_long_label">Skriv inlägg</string>
|
<string name="compose_shortcut_long_label">Skriv inlägg</string>
|
||||||
<string name="compose_shortcut_short_label">Skriv</string>
|
<string name="compose_shortcut_short_label">Skriv</string>
|
||||||
<string name="notifications_clear">Radera</string>
|
<string name="notifications_clear">Radera</string>
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@
|
||||||
<string name="list">รายการ</string>
|
<string name="list">รายการ</string>
|
||||||
<string name="select_list_title">เลือกรายการ</string>
|
<string name="select_list_title">เลือกรายการ</string>
|
||||||
<string name="hashtags">แฮชแท็ก</string>
|
<string name="hashtags">แฮชแท็ก</string>
|
||||||
<string name="edit_hashtag_hint">แฮชแท็กโดยไม่มี #</string>
|
<string name="pick_hashtag_hint">แฮชแท็กโดยไม่มี #</string>
|
||||||
<string name="add_hashtag_title">เพิ่มแฮชแท็ก</string>
|
<string name="add_hashtag_title">เพิ่มแฮชแท็ก</string>
|
||||||
<string name="hint_list_name">ชื่อรายการ</string>
|
<string name="hint_list_name">ชื่อรายการ</string>
|
||||||
<string name="description_poll">โพลกับตัวเลือก: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
<string name="description_poll">โพลกับตัวเลือก: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
||||||
|
|
|
||||||
|
|
@ -346,7 +346,7 @@
|
||||||
<string name="description_visibility_direct">Doğrudan</string>
|
<string name="description_visibility_direct">Doğrudan</string>
|
||||||
<string name="description_poll">Seçenekli anket: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
<string name="description_poll">Seçenekli anket: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
||||||
<string name="hint_list_name">Liste adı</string>
|
<string name="hint_list_name">Liste adı</string>
|
||||||
<string name="edit_hashtag_hint"># Etiket olmadan</string>
|
<string name="pick_hashtag_hint"># Etiket olmadan</string>
|
||||||
<string name="notifications_clear">Sil</string>
|
<string name="notifications_clear">Sil</string>
|
||||||
<string name="notifications_apply_filter">Süzgeçle</string>
|
<string name="notifications_apply_filter">Süzgeçle</string>
|
||||||
<string name="filter_apply">Uygula</string>
|
<string name="filter_apply">Uygula</string>
|
||||||
|
|
|
||||||
|
|
@ -483,7 +483,7 @@
|
||||||
<string name="notifications_clear">Видалити</string>
|
<string name="notifications_clear">Видалити</string>
|
||||||
<string name="list">Список</string>
|
<string name="list">Список</string>
|
||||||
<string name="select_list_title">Вибрати список</string>
|
<string name="select_list_title">Вибрати список</string>
|
||||||
<string name="edit_hashtag_hint">Хештег без #</string>
|
<string name="pick_hashtag_hint">Хештег без #</string>
|
||||||
<string name="add_hashtag_title">Додати хештег</string>
|
<string name="add_hashtag_title">Додати хештег</string>
|
||||||
<string name="hint_list_name">Назва списку</string>
|
<string name="hint_list_name">Назва списку</string>
|
||||||
<string name="description_poll">Опитування з варіантами: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
<string name="description_poll">Опитування з варіантами: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
||||||
|
|
|
||||||
|
|
@ -363,7 +363,7 @@
|
||||||
<string name="list">Danh sách</string>
|
<string name="list">Danh sách</string>
|
||||||
<string name="select_list_title">Chọn danh sách</string>
|
<string name="select_list_title">Chọn danh sách</string>
|
||||||
<string name="hashtags">Hashtag</string>
|
<string name="hashtags">Hashtag</string>
|
||||||
<string name="edit_hashtag_hint">Không cần dấu #</string>
|
<string name="pick_hashtag_hint">Không cần dấu #</string>
|
||||||
<string name="add_hashtag_title">Thêm hashtag</string>
|
<string name="add_hashtag_title">Thêm hashtag</string>
|
||||||
<string name="hint_list_name">Tên danh sách</string>
|
<string name="hint_list_name">Tên danh sách</string>
|
||||||
<string name="description_poll">Lượt bình chọn: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
<string name="description_poll">Lượt bình chọn: %1$s, %2$s, %3$s, %4$s; %5$s</string>
|
||||||
|
|
|
||||||
|
|
@ -350,7 +350,7 @@
|
||||||
私信
|
私信
|
||||||
</string>
|
</string>
|
||||||
<string name="hint_list_name">列表名</string>
|
<string name="hint_list_name">列表名</string>
|
||||||
<string name="edit_hashtag_hint">话题名(不含前面的 # 号)</string>
|
<string name="pick_hashtag_hint">话题名(不含前面的 # 号)</string>
|
||||||
<string name="notifications_clear">删除</string>
|
<string name="notifications_clear">删除</string>
|
||||||
<string name="notifications_apply_filter">筛选</string>
|
<string name="notifications_apply_filter">筛选</string>
|
||||||
<string name="filter_apply">应用</string>
|
<string name="filter_apply">应用</string>
|
||||||
|
|
|
||||||
|
|
@ -366,7 +366,7 @@
|
||||||
私信
|
私信
|
||||||
</string>
|
</string>
|
||||||
<string name="hint_list_name">列表名</string>
|
<string name="hint_list_name">列表名</string>
|
||||||
<string name="edit_hashtag_hint">話題名(不含前面的 # 號)</string>
|
<string name="pick_hashtag_hint">話題名(不含前面的 # 號)</string>
|
||||||
<string name="notifications_clear">清空</string>
|
<string name="notifications_clear">清空</string>
|
||||||
<string name="notifications_apply_filter">分類</string>
|
<string name="notifications_apply_filter">分類</string>
|
||||||
<string name="filter_apply">應用</string>
|
<string name="filter_apply">應用</string>
|
||||||
|
|
|
||||||
|
|
@ -358,7 +358,7 @@
|
||||||
私信
|
私信
|
||||||
</string>
|
</string>
|
||||||
<string name="hint_list_name">列表名</string>
|
<string name="hint_list_name">列表名</string>
|
||||||
<string name="edit_hashtag_hint">話題名(不含前面的 # 號)</string>
|
<string name="pick_hashtag_hint">話題名(不含前面的 # 號)</string>
|
||||||
<string name="notifications_clear">清空</string>
|
<string name="notifications_clear">清空</string>
|
||||||
<string name="notifications_apply_filter">分類</string>
|
<string name="notifications_apply_filter">分類</string>
|
||||||
<string name="filter_apply">應用</string>
|
<string name="filter_apply">應用</string>
|
||||||
|
|
|
||||||
|
|
@ -361,7 +361,7 @@
|
||||||
私信
|
私信
|
||||||
</string>
|
</string>
|
||||||
<string name="hint_list_name">列表名</string>
|
<string name="hint_list_name">列表名</string>
|
||||||
<string name="edit_hashtag_hint">话题名(不含前面的 # 号)</string>
|
<string name="pick_hashtag_hint">话题名(不含前面的 # 号)</string>
|
||||||
<string name="notifications_clear">清空</string>
|
<string name="notifications_clear">清空</string>
|
||||||
<string name="notifications_apply_filter">分类</string>
|
<string name="notifications_apply_filter">分类</string>
|
||||||
<string name="filter_apply">应用</string>
|
<string name="filter_apply">应用</string>
|
||||||
|
|
|
||||||
|
|
@ -365,7 +365,7 @@
|
||||||
私信
|
私信
|
||||||
</string>
|
</string>
|
||||||
<string name="hint_list_name">列表名</string>
|
<string name="hint_list_name">列表名</string>
|
||||||
<string name="edit_hashtag_hint">話題名(不含前面的 # 號)</string>
|
<string name="pick_hashtag_hint">話題名(不含前面的 # 號)</string>
|
||||||
<string name="notifications_clear">清空</string>
|
<string name="notifications_clear">清空</string>
|
||||||
<string name="notifications_apply_filter">分類</string>
|
<string name="notifications_apply_filter">分類</string>
|
||||||
<string name="filter_apply">應用</string>
|
<string name="filter_apply">應用</string>
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,7 @@
|
||||||
<string name="title_edits">Edits</string>
|
<string name="title_edits">Edits</string>
|
||||||
|
|
||||||
<string name="dialog_follow_hashtag_title">Follow hashtag</string>
|
<string name="dialog_follow_hashtag_title">Follow hashtag</string>
|
||||||
<string name="dialog_follow_hashtag_hint">#hashtag</string>
|
<string name="follow_hashtag_success">Followed hashtag %1$s</string>
|
||||||
|
|
||||||
<string name="post_username_format">\@%1$s</string>
|
<string name="post_username_format">\@%1$s</string>
|
||||||
<string name="post_boosted_format">%1$s boosted</string>
|
<string name="post_boosted_format">%1$s boosted</string>
|
||||||
|
|
@ -616,7 +616,7 @@
|
||||||
<string name="hint_list_name">List name</string>
|
<string name="hint_list_name">List name</string>
|
||||||
|
|
||||||
<string name="add_hashtag_title">Add hashtag</string>
|
<string name="add_hashtag_title">Add hashtag</string>
|
||||||
<string name="edit_hashtag_hint">Hashtag without #</string>
|
<string name="pick_hashtag_hint">Hashtag without #</string>
|
||||||
<string name="hashtags">Hashtags</string>
|
<string name="hashtags">Hashtags</string>
|
||||||
<string name="select_list_title">Select list</string>
|
<string name="select_list_title">Select list</string>
|
||||||
<string name="select_list_manage">Manage lists</string>
|
<string name="select_list_manage">Manage lists</string>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue