and though bugs are the bane of my existence, rest assured the wretched thing will get the best of care here

...
 
Commits (3)
......@@ -175,8 +175,8 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
}
})
}
} else if (accountRequested) {
// user clicked a notification, show notification tab and switch user if necessary
} else if (accountRequested && savedInstanceState == null) {
// user clicked a notification, show notification tab
showNotificationTab = true
}
}
......@@ -686,7 +686,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
glide.asDrawable()
.load(avatarUrl)
.transform(
RoundedCorners(resources.getDimensionPixelSize(R.dimen.avatar_radius_36dp))
RoundedCorners(resources.getDimensionPixelSize(R.dimen.avatar_radius_36dp))
)
.apply {
if (showPlaceholder) {
......@@ -700,6 +700,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
binding.mainToolbar.navigationIcon = FixedSizeDrawable(placeholder, navIconSize, navIconSize)
}
}
override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {
binding.mainToolbar.navigationIcon = FixedSizeDrawable(resource, navIconSize, navIconSize)
}
......
......@@ -144,7 +144,7 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene
toggleFab(false)
}
binding.maxTabsInfo.text = getString(R.string.max_tab_number_reached, MAX_TAB_COUNT)
binding.maxTabsInfo.text = resources.getQuantityString(R.plurals.max_tab_number_reached, MAX_TAB_COUNT, MAX_TAB_COUNT)
updateAvailableTabs()
}
......
......@@ -19,60 +19,57 @@ import android.text.method.LinkMovementMethod
import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater
import android.view.ViewGroup
import android.view.View
import android.widget.TextView
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.databinding.ItemAccountFieldBinding
import com.keylesspalace.tusky.entity.Emoji
import com.keylesspalace.tusky.entity.Field
import com.keylesspalace.tusky.entity.IdentityProof
import com.keylesspalace.tusky.interfaces.LinkListener
import com.keylesspalace.tusky.util.*
import kotlinx.android.synthetic.main.item_account_field.view.*
class AccountFieldAdapter(private val linkListener: LinkListener, private val animateEmojis: Boolean) : RecyclerView.Adapter<AccountFieldAdapter.ViewHolder>() {
class AccountFieldAdapter(
private val linkListener: LinkListener,
private val animateEmojis: Boolean
) : RecyclerView.Adapter<BindingHolder<ItemAccountFieldBinding>>() {
var emojis: List<Emoji> = emptyList()
var fields: List<Either<IdentityProof, Field>> = emptyList()
override fun getItemCount() = fields.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_account_field, parent, false)
return ViewHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemAccountFieldBinding> {
val binding = ItemAccountFieldBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return BindingHolder(binding)
}
override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
override fun onBindViewHolder(holder: BindingHolder<ItemAccountFieldBinding>, position: Int) {
val proofOrField = fields[position]
val nameTextView = holder.binding.accountFieldName
val valueTextView = holder.binding.accountFieldValue
if(proofOrField.isLeft()) {
val identityProof = proofOrField.asLeft()
viewHolder.nameTextView.text = identityProof.provider
viewHolder.valueTextView.text = LinkHelper.createClickableText(identityProof.username, identityProof.profileUrl)
nameTextView.text = identityProof.provider
valueTextView.text = LinkHelper.createClickableText(identityProof.username, identityProof.profileUrl)
viewHolder.valueTextView.movementMethod = LinkMovementMethod.getInstance()
valueTextView.movementMethod = LinkMovementMethod.getInstance()
viewHolder.valueTextView.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, R.drawable.ic_check_circle, 0)
valueTextView.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, R.drawable.ic_check_circle, 0)
} else {
val field = proofOrField.asRight()
val emojifiedName = field.name.emojify(emojis, viewHolder.nameTextView, animateEmojis)
viewHolder.nameTextView.text = emojifiedName
val emojifiedName = field.name.emojify(emojis, nameTextView, animateEmojis)
nameTextView.text = emojifiedName
val emojifiedValue = field.value.emojify(emojis, viewHolder.valueTextView, animateEmojis)
LinkHelper.setClickableText(viewHolder.valueTextView, emojifiedValue, null, linkListener)
val emojifiedValue = field.value.emojify(emojis, valueTextView, animateEmojis)
LinkHelper.setClickableText(valueTextView, emojifiedValue, null, linkListener)
if(field.verifiedAt != null) {
viewHolder.valueTextView.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, R.drawable.ic_check_circle, 0)
valueTextView.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, R.drawable.ic_check_circle, 0)
} else {
viewHolder.valueTextView.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, 0, 0 )
valueTextView.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, 0, 0 )
}
}
}
class ViewHolder(rootView: View) : RecyclerView.ViewHolder(rootView) {
val nameTextView: TextView = rootView.accountFieldName
val valueTextView: TextView = rootView.accountFieldValue
}
}
......@@ -15,18 +15,16 @@
package com.keylesspalace.tusky.adapter
import androidx.recyclerview.widget.RecyclerView
import android.text.Editable
import android.text.TextWatcher
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import com.keylesspalace.tusky.R
import androidx.recyclerview.widget.RecyclerView
import com.keylesspalace.tusky.databinding.ItemEditFieldBinding
import com.keylesspalace.tusky.entity.StringField
import kotlinx.android.synthetic.main.item_edit_field.view.*
import com.keylesspalace.tusky.util.BindingHolder
class AccountFieldEditAdapter : RecyclerView.Adapter<AccountFieldEditAdapter.ViewHolder>() {
class AccountFieldEditAdapter : RecyclerView.Adapter<BindingHolder<ItemEditFieldBinding>>() {
private val fieldData = mutableListOf<MutableStringPair>()
......@@ -54,20 +52,20 @@ class AccountFieldEditAdapter : RecyclerView.Adapter<AccountFieldEditAdapter.Vie
notifyItemInserted(fieldData.size - 1)
}
override fun getItemCount(): Int = fieldData.size
override fun getItemCount() = fieldData.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_edit_field, parent, false)
return ViewHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemEditFieldBinding> {
val binding = ItemEditFieldBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return BindingHolder(binding)
}
override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
viewHolder.nameTextView.setText(fieldData[position].first)
viewHolder.valueTextView.setText(fieldData[position].second)
override fun onBindViewHolder(holder: BindingHolder<ItemEditFieldBinding>, position: Int) {
holder.binding.accountFieldName.setText(fieldData[position].first)
holder.binding.accountFieldValue.setText(fieldData[position].second)
viewHolder.nameTextView.addTextChangedListener(object: TextWatcher {
holder.binding.accountFieldName.addTextChangedListener(object: TextWatcher {
override fun afterTextChanged(newText: Editable) {
fieldData[viewHolder.adapterPosition].first = newText.toString()
fieldData[holder.adapterPosition].first = newText.toString()
}
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
......@@ -75,9 +73,9 @@ class AccountFieldEditAdapter : RecyclerView.Adapter<AccountFieldEditAdapter.Vie
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
})
viewHolder.valueTextView.addTextChangedListener(object: TextWatcher {
holder.binding.accountFieldValue.addTextChangedListener(object: TextWatcher {
override fun afterTextChanged(newText: Editable) {
fieldData[viewHolder.adapterPosition].second = newText.toString()
fieldData[holder.adapterPosition].second = newText.toString()
}
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
......@@ -87,12 +85,6 @@ class AccountFieldEditAdapter : RecyclerView.Adapter<AccountFieldEditAdapter.Vie
}
class ViewHolder(rootView: View) : RecyclerView.ViewHolder(rootView) {
val nameTextView: EditText = rootView.accountFieldName
val valueTextView: EditText = rootView.accountFieldValue
}
class MutableStringPair (var first: String, var second: String)
}
......@@ -22,39 +22,35 @@ import android.view.ViewGroup
import android.widget.ArrayAdapter
import androidx.preference.PreferenceManager
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.databinding.ItemAutocompleteAccountBinding
import com.keylesspalace.tusky.db.AccountEntity
import com.keylesspalace.tusky.settings.PrefKeys
import com.keylesspalace.tusky.util.*
import kotlinx.android.synthetic.main.item_autocomplete_account.view.*
class AccountSelectionAdapter(context: Context) : ArrayAdapter<AccountEntity>(context, R.layout.item_autocomplete_account) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
var view = convertView
if (convertView == null) {
val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
view = layoutInflater.inflate(R.layout.item_autocomplete_account, parent, false)
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val binding = if (convertView == null) {
ItemAutocompleteAccountBinding.inflate(LayoutInflater.from(context), parent, false)
} else {
ItemAutocompleteAccountBinding.bind(convertView)
}
view!!
val account = getItem(position)
if (account != null) {
val username = view.username
val displayName = view.display_name
val avatar = view.avatar
val pm = PreferenceManager.getDefaultSharedPreferences(avatar.context)
val pm = PreferenceManager.getDefaultSharedPreferences(binding.avatar.context)
val animateEmojis = pm.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false)
username.text = account.fullName
displayName.text = account.displayName.emojify(account.emojis, displayName, animateEmojis)
binding.username.text = account.fullName
binding.displayName.text = account.displayName.emojify(account.emojis, binding.displayName, animateEmojis)
val avatarRadius = avatar.context.resources.getDimensionPixelSize(R.dimen.avatar_radius_42dp)
val avatarRadius = context.resources.getDimensionPixelSize(R.dimen.avatar_radius_42dp)
val animateAvatar = pm.getBoolean("animateGifAvatars", false)
loadAvatar(account.profilePictureUrl, avatar, avatarRadius, animateAvatar)
loadAvatar(account.profilePictureUrl, binding.avatar, avatarRadius, animateAvatar)
}
return view
return binding.root
}
}
\ No newline at end of file
......@@ -15,48 +15,44 @@
package com.keylesspalace.tusky.adapter
import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.ImageView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.databinding.ItemEmojiButtonBinding
import com.keylesspalace.tusky.entity.Emoji
import com.keylesspalace.tusky.util.BindingHolder
import java.util.*
class EmojiAdapter(emojiList: List<Emoji>, private val onEmojiSelectedListener: OnEmojiSelectedListener) : RecyclerView.Adapter<EmojiAdapter.EmojiHolder>() {
private val emojiList : List<Emoji>
class EmojiAdapter(
emojiList: List<Emoji>,
private val onEmojiSelectedListener: OnEmojiSelectedListener
) : RecyclerView.Adapter<BindingHolder<ItemEmojiButtonBinding>>() {
init {
this.emojiList = emojiList.filter { emoji -> emoji.visibleInPicker == null || emoji.visibleInPicker }
.sortedBy { it.shortcode.toLowerCase(Locale.ROOT) }
}
private val emojiList : List<Emoji> = emojiList.filter { emoji -> emoji.visibleInPicker == null || emoji.visibleInPicker }
.sortedBy { it.shortcode.toLowerCase(Locale.ROOT) }
override fun getItemCount(): Int {
return emojiList.size
}
override fun getItemCount() = emojiList.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): EmojiHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_emoji_button, parent, false) as ImageView
return EmojiHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemEmojiButtonBinding> {
val binding = ItemEmojiButtonBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return BindingHolder(binding)
}
override fun onBindViewHolder(viewHolder: EmojiHolder, position: Int) {
override fun onBindViewHolder(holder: BindingHolder<ItemEmojiButtonBinding>, position: Int) {
val emoji = emojiList[position]
val emojiImageView = holder.binding.root
Glide.with(viewHolder.emojiImageView)
Glide.with(emojiImageView)
.load(emoji.url)
.into(viewHolder.emojiImageView)
.into(emojiImageView)
viewHolder.emojiImageView.setOnClickListener {
emojiImageView.setOnClickListener {
onEmojiSelectedListener.onEmojiSelected(emoji.shortcode)
}
viewHolder.emojiImageView.contentDescription = emoji.shortcode
emojiImageView.contentDescription = emoji.shortcode
}
class EmojiHolder(val emojiImageView: ImageView) : RecyclerView.ViewHolder(emojiImageView)
}
interface OnEmojiSelectedListener {
......
/* Copyright 2021 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>. */
package com.keylesspalace.tusky.adapter
import android.graphics.Typeface
import android.text.SpannableStringBuilder
import android.text.Spanned
import android.text.style.StyleSpan
import android.view.View
import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.RecyclerView
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.databinding.ItemFollowRequestBinding
import com.keylesspalace.tusky.entity.Account
import com.keylesspalace.tusky.interfaces.AccountActionListener
import com.keylesspalace.tusky.util.*
import kotlinx.android.synthetic.main.item_follow_request_notification.view.*
internal class FollowRequestViewHolder(
itemView: View,
private val showHeader: Boolean) : RecyclerView.ViewHolder(itemView) {
private var id: String? = null
class FollowRequestViewHolder(
private val binding: ItemFollowRequestBinding,
private val showHeader: Boolean
) : RecyclerView.ViewHolder(binding.root) {
fun setupWithAccount(account: Account, animateAvatar: Boolean, animateEmojis: Boolean) {
id = account.id
val wrappedName = account.name.unicodeWrap()
val emojifiedName: CharSequence = wrappedName.emojify(account.emojis, itemView, animateEmojis)
itemView.displayNameTextView.text = emojifiedName
binding.displayNameTextView.text = emojifiedName
if (showHeader) {
val wholeMessage: String = itemView.context.getString(R.string.notification_follow_request_format, wrappedName)
itemView.notificationTextView?.text = SpannableStringBuilder(wholeMessage).apply {
binding.notificationTextView.text = SpannableStringBuilder(wholeMessage).apply {
setSpan(StyleSpan(Typeface.BOLD), 0, wrappedName.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}.emojify(account.emojis, itemView, animateEmojis)
}
itemView.notificationTextView?.visible(showHeader)
binding.notificationTextView.visible(showHeader)
val format = itemView.context.getString(R.string.status_username_format)
val formattedUsername = String.format(format, account.username)
itemView.usernameTextView.text = formattedUsername
val avatarRadius = itemView.avatar.context.resources.getDimensionPixelSize(R.dimen.avatar_radius_48dp)
loadAvatar(account.avatar, itemView.avatar, avatarRadius, animateAvatar)
binding.usernameTextView.text = formattedUsername
val avatarRadius = binding.avatar.context.resources.getDimensionPixelSize(R.dimen.avatar_radius_48dp)
loadAvatar(account.avatar, binding.avatar, avatarRadius, animateAvatar)
}
fun setupActionListener(listener: AccountActionListener) {
itemView.acceptButton.setOnClickListener {
fun setupActionListener(listener: AccountActionListener, accountId: String) {
binding.acceptButton.setOnClickListener {
val position = adapterPosition
if (position != RecyclerView.NO_POSITION) {
listener.onRespondToFollowRequest(true, id, position)
listener.onRespondToFollowRequest(true, accountId, position)
}
}
itemView.rejectButton.setOnClickListener {
binding.rejectButton.setOnClickListener {
val position = adapterPosition
if (position != RecyclerView.NO_POSITION) {
listener.onRespondToFollowRequest(false, id, position)
listener.onRespondToFollowRequest(false, accountId, position)
}
}
itemView.setOnClickListener { listener.onViewAccount(id) }
itemView.setOnClickListener { listener.onViewAccount(accountId) }
}
}
......@@ -23,6 +23,7 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.keylesspalace.tusky.R;
import com.keylesspalace.tusky.databinding.ItemFollowRequestBinding;
import com.keylesspalace.tusky.interfaces.AccountActionListener;
public class FollowRequestsAdapter extends AccountAdapter {
......@@ -37,9 +38,8 @@ public class FollowRequestsAdapter extends AccountAdapter {
switch (viewType) {
default:
case VIEW_TYPE_ACCOUNT: {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_follow_request, parent, false);
return new FollowRequestViewHolder(view, false);
ItemFollowRequestBinding binding = ItemFollowRequestBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
return new FollowRequestViewHolder(binding, false);
}
case VIEW_TYPE_FOOTER: {
View view = LayoutInflater.from(parent.getContext())
......@@ -54,7 +54,7 @@ public class FollowRequestsAdapter extends AccountAdapter {
if (getItemViewType(position) == VIEW_TYPE_ACCOUNT) {
FollowRequestViewHolder holder = (FollowRequestViewHolder) viewHolder;
holder.setupWithAccount(accountList.get(position), animateAvatar, animateEmojis);
holder.setupActionListener(accountActionListener);
holder.setupActionListener(accountActionListener, accountList.get(position).getId());
}
}
}
package com.keylesspalace.tusky.adapter
import android.view.View
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.interfaces.LinkListener
class HashtagViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val hashtag: TextView = itemView.findViewById(R.id.hashtag)
fun setup(tag: String, listener: LinkListener) {
hashtag.text = String.format("#%s", tag)
hashtag.setOnClickListener { listener.onViewTag(tag) }
}
}
\ No newline at end of file
......@@ -21,21 +21,22 @@ import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.databinding.ItemPickerListBinding
import com.keylesspalace.tusky.entity.MastoList
import kotlinx.android.synthetic.main.item_picker_list.view.*
class ListSelectionAdapter(context: Context) : ArrayAdapter<MastoList>(context, R.layout.item_autocomplete_hashtag) {
class ListSelectionAdapter(context: Context) : ArrayAdapter<MastoList>(context, R.layout.item_picker_list) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val view = convertView
?: layoutInflater.inflate(R.layout.item_picker_list, parent, false)
val binding = if (convertView == null) {
ItemPickerListBinding.inflate(LayoutInflater.from(context), parent, false)
} else {
ItemPickerListBinding.bind(convertView)
}
getItem(position)?.let { list ->
view.title.text = list.title
binding.root.text = list.title
}
return view
return binding.root
}
}
......@@ -9,7 +9,6 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.core.view.ViewCompat;
import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.RecyclerView;
import com.keylesspalace.tusky.R;
......
......@@ -16,29 +16,28 @@
package com.keylesspalace.tusky.adapter
import androidx.recyclerview.widget.RecyclerView
import android.view.View
import android.view.ViewGroup
import com.keylesspalace.tusky.databinding.ItemNetworkStateBinding
import com.keylesspalace.tusky.util.NetworkState
import com.keylesspalace.tusky.util.Status
import com.keylesspalace.tusky.util.visible
import kotlinx.android.synthetic.main.item_network_state.view.*
class NetworkStateViewHolder(itemView: View,
class NetworkStateViewHolder(private val binding: ItemNetworkStateBinding,
private val retryCallback: () -> Unit)
: RecyclerView.ViewHolder(itemView) {
: RecyclerView.ViewHolder(binding.root) {
fun setUpWithNetworkState(state: NetworkState?, fullScreen: Boolean) {
itemView.progressBar.visible(state?.status == Status.RUNNING)
itemView.retryButton.visible(state?.status == Status.FAILED)
itemView.errorMsg.visible(state?.msg != null)
itemView.errorMsg.text = state?.msg
itemView.retryButton.setOnClickListener {
binding.progressBar.visible(state?.status == Status.RUNNING)
binding.retryButton.visible(state?.status == Status.FAILED)
binding.errorMsg.visible(state?.msg != null)
binding.errorMsg.text = state?.msg
binding.retryButton.setOnClickListener {
retryCallback()
}
if(fullScreen) {
itemView.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
binding.root.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
} else {
itemView.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT
binding.root.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT
}
}
......
......@@ -39,6 +39,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.keylesspalace.tusky.R;
import com.keylesspalace.tusky.databinding.ItemFollowRequestBinding;
import com.keylesspalace.tusky.entity.Account;
import com.keylesspalace.tusky.entity.Emoji;
import com.keylesspalace.tusky.entity.Notification;
......@@ -125,9 +126,8 @@ public class NotificationsAdapter extends RecyclerView.Adapter {
return new FollowViewHolder(view, statusDisplayOptions);
}
case VIEW_TYPE_FOLLOW_REQUEST: {
View view = inflater
.inflate(R.layout.item_follow_request_notification, parent, false);
return new FollowRequestViewHolder(view, true);
ItemFollowRequestBinding binding = ItemFollowRequestBinding.inflate(inflater, parent, false);
return new FollowRequestViewHolder(binding, true);
}
case VIEW_TYPE_PLACEHOLDER: {
View view = inflater
......@@ -233,7 +233,7 @@ public class NotificationsAdapter extends RecyclerView.Adapter {
if (payloadForHolder == null) {
FollowRequestViewHolder holder = (FollowRequestViewHolder) viewHolder;
holder.setupWithAccount(concreteNotificaton.getAccount(), statusDisplayOptions.animateAvatars(), statusDisplayOptions.animateEmojis());
holder.setupActionListener(accountActionListener);
holder.setupActionListener(accountActionListener, concreteNotificaton.getAccount().getId());
}
}
default:
......
......@@ -18,19 +18,18 @@ package com.keylesspalace.tusky.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.CheckBox
import android.widget.RadioButton
import android.widget.TextView
import androidx.emoji.text.EmojiCompat
import androidx.recyclerview.widget.RecyclerView
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.databinding.ItemPollBinding
import com.keylesspalace.tusky.entity.Emoji
import com.keylesspalace.tusky.util.*
import com.keylesspalace.tusky.util.BindingHolder
import com.keylesspalace.tusky.util.emojify
import com.keylesspalace.tusky.util.visible
import com.keylesspalace.tusky.viewdata.PollOptionViewData
import com.keylesspalace.tusky.viewdata.buildDescription
import com.keylesspalace.tusky.viewdata.calculatePercent
class PollAdapter: RecyclerView.Adapter<PollViewHolder>() {
class PollAdapter: RecyclerView.Adapter<BindingHolder<ItemPollBinding>>() {
private var pollOptions: List<PollOptionViewData> = emptyList()
private var voteCount: Int = 0
......@@ -64,39 +63,42 @@ class PollAdapter: RecyclerView.Adapter<PollViewHolder>() {
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PollViewHolder {
return PollViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_poll, parent, false))
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemPollBinding> {
val binding = ItemPollBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return BindingHolder(binding)
}
override fun getItemCount(): Int {
return pollOptions.size
}
override fun getItemCount() = pollOptions.size
override fun onBindViewHolder(holder: PollViewHolder, position: Int) {
override fun onBindViewHolder(holder: BindingHolder<ItemPollBinding>, position: Int) {
val option = pollOptions[position]
holder.resultTextView.visible(mode == RESULT)
holder.radioButton.visible(mode == SINGLE)
holder.checkBox.visible(mode == MULTIPLE)
val resultTextView = holder.binding.statusPollOptionResult
val radioButton = holder.binding.statusPollRadioButton
val checkBox = holder.binding.statusPollCheckbox
resultTextView.visible(mode == RESULT)
radioButton.visible(mode == SINGLE)
checkBox.visible(mode == MULTIPLE)
when(mode) {
RESULT -> {
val percent = calculatePercent(option.votesCount, votersCount, voteCount)
val emojifiedPollOptionText = buildDescription(option.title, percent, holder.resultTextView.context)
.emojify(emojis, holder.resultTextView, animateEmojis)
holder.resultTextView.text = EmojiCompat.get().process(emojifiedPollOptionText)
val emojifiedPollOptionText = buildDescription(option.title, percent, resultTextView.context)
.emojify(emojis, resultTextView, animateEmojis)
resultTextView.text = EmojiCompat.get().process(emojifiedPollOptionText)
val level = percent * 100
holder.resultTextView.background.level = level
holder.resultTextView.setOnClickListener(resultClickListener)
resultTextView.background.level = level
resultTextView.setOnClickListener(resultClickListener)
}
SINGLE -> {
val emojifiedPollOptionText = option.title.emojify(emojis, holder.radioButton, animateEmojis)
holder.radioButton.text = EmojiCompat.get().process(emojifiedPollOptionText)
holder.radioButton.isChecked = option.selected
holder.radioButton.setOnClickListener {
val emojifiedPollOptionText = option.title.emojify(emojis, radioButton, animateEmojis)
radioButton.text = EmojiCompat.get().process(emojifiedPollOptionText)
radioButton.isChecked = option.selected
radioButton.setOnClickListener {
pollOptions.forEachIndexed { index, pollOption ->
pollOption.selected = index == holder.adapterPosition
notifyItemChanged(index)
......@@ -104,10 +106,10 @@ class PollAdapter: RecyclerView.Adapter<PollViewHolder>() {
}
}
MULTIPLE -> {
val emojifiedPollOptionText = option.title.emojify(emojis, holder.checkBox, animateEmojis)
holder.checkBox.text = EmojiCompat.get().process(emojifiedPollOptionText)
holder.checkBox.isChecked = option.selected
holder.checkBox.setOnCheckedChangeListener { _, isChecked ->
val emojifiedPollOptionText = option.title.emojify(emojis, checkBox, animateEmojis)
checkBox.text = EmojiCompat.get().process(emojifiedPollOptionText)
checkBox.isChecked = option.selected
checkBox.setOnCheckedChangeListener { _, isChecked ->
pollOptions[holder.adapterPosition].selected = isChecked
}
}
......@@ -121,13 +123,3 @@ class PollAdapter: RecyclerView.Adapter<PollViewHolder>() {
const val MULTIPLE = 2
}
}
class PollViewHolder(view: View): RecyclerView.ViewHolder(view) {
val resultTextView: TextView = view.findViewById(R.id.status_poll_option_result)
val radioButton: RadioButton = view.findViewById(R.id.status_poll_radio_button)
val checkBox: CheckBox = view.findViewById(R.id.status_poll_checkbox)
}
......@@ -63,5 +63,4 @@ class PreviewPollOptionsAdapter: RecyclerView.Adapter<PreviewViewHolder>() {
}
class PreviewViewHolder(itemView: View): RecyclerView.ViewHolder(itemView)
\ No newline at end of file
class PreviewViewHolder(itemView: View): RecyclerView.ViewHolder(itemView)
......@@ -18,19 +18,21 @@ package com.keylesspalace.tusky.adapter
import android.content.res.ColorStateList
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import androidx.core.view.size
import androidx.recyclerview.widget.RecyclerView
import androidx.viewbinding.ViewBinding
import com.google.android.material.chip.Chip
import com.keylesspalace.tusky.HASHTAG
import com.keylesspalace.tusky.LIST
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.TabData
import com.keylesspalace.tusky.databinding.ItemTabPreferenceBinding
import com.keylesspalace.tusky.databinding.ItemTabPreferenceSmallBinding
import com.keylesspalace.tusky.util.BindingHolder
import com.keylesspalace.tusky.util.ThemeUtils
import com.keylesspalace.tusky.util.hide
import com.keylesspalace.tusky.util.show
import kotlinx.android.synthetic.main.item_tab_preference.view.*
interface ItemInteractionListener {
fun onTabAdded(tab: TabData)
......@@ -44,61 +46,69 @@ interface ItemInteractionListener {
class TabAdapter(private var data: List<TabData>,
private val small: Boolean,
private val listener: ItemInteractionListener,
private var removeButtonEnabled: Boolean = false) : RecyclerView.Adapter<TabAdapter.ViewHolder>() {
private var removeButtonEnabled: Boolean = false
) : RecyclerView.Adapter<BindingHolder<ViewBinding>>() {
fun updateData(newData: List<TabData>) {
this.data = newData
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val layoutId = if (small) {
R.layout.item_tab_preference_small
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ViewBinding> {
val binding = if (small) {
ItemTabPreferenceSmallBinding.inflate(LayoutInflater.from(parent.context), parent, false)
} else {
R.layout.item_tab_preference
ItemTabPreferenceBinding.inflate(LayoutInflater.from(parent.context), parent, false)
}
val view = LayoutInflater.from(parent.context).inflate(layoutId, parent, false)
return ViewHolder(view)
return BindingHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
override fun onBindViewHolder(holder: BindingHolder<ViewBinding>, position: Int) {
val context = holder.itemView.context
val tab = data[position]
if (!small && tab.id == LIST) {
holder.itemView.textView.text = tab.arguments.getOrNull(1).orEmpty()
} else {
holder.itemView.textView.setText(tab.text)
}
holder.itemView.textView.setCompoundDrawablesRelativeWithIntrinsicBounds(tab.icon, 0, 0, 0)
if (small) {
holder.itemView.textView.setOnClickListener {
val binding = holder.binding as ItemTabPreferenceSmallBinding
binding.textView.setText(tab.text)
binding.textView.setCompoundDrawablesRelativeWithIntrinsicBounds(tab.icon, 0, 0, 0)
binding.textView.setOnClickListener {
listener.onTabAdded(tab)
}
}
holder.itemView.imageView?.setOnTouchListener { _, event ->
if (event.action == MotionEvent.ACTION_DOWN) {
listener.onStartDrag(holder)
true
} else {
val binding = holder.binding as ItemTabPreferenceBinding
if (tab.id == LIST) {
binding.textView.text = tab.arguments.getOrNull(1).orEmpty()
} else {
false
binding.textView.setText(tab.text)
}
}
holder.itemView.removeButton?.setOnClickListener {
listener.onTabRemoved(holder.adapterPosition)
}
if (holder.itemView.removeButton != null) {
holder.itemView.removeButton.isEnabled = removeButtonEnabled
binding.textView.setCompoundDrawablesRelativeWithIntrinsicBounds(tab.icon, 0, 0, 0)
binding.imageView.setOnTouchListener { _, event ->
if (event.action == MotionEvent.ACTION_DOWN) {
listener.onStartDrag(holder)
true
} else {
false
}
}
binding.removeButton.setOnClickListener {
listener.onTabRemoved(holder.adapterPosition)
}
binding.removeButton.isEnabled = removeButtonEnabled
ThemeUtils.setDrawableTint(
holder.itemView.context,
holder.itemView.removeButton.drawable,
binding.removeButton.drawable,
(if (removeButtonEnabled) android.R.attr.textColorTertiary else R.attr.textColorDisabled)
)
}
if (!small) {
if (tab.id == HASHTAG) {
holder.itemView.chipGroup.show()
binding.chipGroup.show()
/*
* The chip group will always contain the actionChip (it is defined in the xml layout).
......@@ -107,9 +117,9 @@ class TabAdapter(private var data: List<TabData>,
*/
tab.arguments.forEachIndexed { i, arg ->
val chip = holder.itemView.chipGroup.getChildAt(i).takeUnless { it.id == R.id.actionChip } as Chip?
val chip = binding.chipGroup.getChildAt(i).takeUnless { it.id == R.id.actionChip } as Chip?
?: Chip(context).apply {
holder.itemView.chipGroup.addView(this, holder.itemView.chipGroup.size - 1)
binding.chipGroup.addView(this, binding.chipGroup.size - 1)
chipIconTint = ColorStateList.valueOf(ThemeUtils.getColor(context, android.R.attr.textColorPrimary))
}
......@@ -126,16 +136,16 @@ class TabAdapter(private var data: List<TabData>,
}
}
while(holder.itemView.chipGroup.size - 1 > tab.arguments.size) {
holder.itemView.chipGroup.removeViewAt(tab.arguments.size)
while(binding.chipGroup.size - 1 > tab.arguments.size) {
binding.chipGroup.removeViewAt(tab.arguments.size)
}
holder.itemView.actionChip.setOnClickListener {
binding.actionChip.setOnClickListener {
listener.onActionChipClicked(tab, holder.adapterPosition)
}
} else {
holder.itemView.chipGroup.hide()
binding.chipGroup.hide()
}
}
}
......@@ -148,6 +158,4 @@ class TabAdapter(private var data: List<TabData>,
notifyDataSetChanged()
}
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
}
......@@ -19,19 +19,17 @@ import android.view.ContextThemeWrapper
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.core.view.size
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.chip.Chip
import com.google.android.material.chip.ChipGroup
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.databinding.ItemAnnouncementBinding
import com.keylesspalace.tusky.entity.Announcement
import com.keylesspalace.tusky.entity.Emoji
import com.keylesspalace.tusky.interfaces.LinkListener
import com.keylesspalace.tusky.util.BindingHolder
import com.keylesspalace.tusky.util.LinkHelper
import com.keylesspalace.tusky.util.emojify
import kotlinx.android.synthetic.main.item_announcement.view.*
interface AnnouncementActionListener: LinkListener {
fun openReactionPicker(announcementId: String, target: View)
......@@ -44,85 +42,80 @@ class AnnouncementAdapter(
private val listener: AnnouncementActionListener,
private val wellbeingEnabled: Boolean = false,
private val animateEmojis: Boolean = false
) : RecyclerView.Adapter<AnnouncementAdapter.AnnouncementViewHolder>() {
) : RecyclerView.Adapter<BindingHolder<ItemAnnouncementBinding>>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AnnouncementViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_announcement, parent, false)
return AnnouncementViewHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemAnnouncementBinding> {
val binding = ItemAnnouncementBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return BindingHolder(binding)
}
override fun onBindViewHolder(viewHolder: AnnouncementViewHolder, position: Int) {
viewHolder.bind(items[position])
}
override fun onBindViewHolder(holder: BindingHolder<ItemAnnouncementBinding>, position: Int) {
val item = items[position]
override fun getItemCount() = items.size
val text = holder.binding.text
val chips = holder.binding.chipGroup
val addReactionChip = holder.binding.addReactionChip
fun updateList(items: List<Announcement>) {
this.items = items
notifyDataSetChanged()
}
LinkHelper.setClickableText(text, item.content, null, listener)
inner class AnnouncementViewHolder(private val view: View) : RecyclerView.ViewHolder(view) {
private val text: TextView = view.text
private val chips: ChipGroup = view.chipGroup
private val addReactionChip: Chip = view.addReactionChip
fun bind(item: Announcement) {
LinkHelper.setClickableText(text, item.content, null, listener)
// If wellbeing mode is enabled, announcement badge counts should not be shown.
if (wellbeingEnabled) {
// Since reactions are not visible in wellbeing mode,
// we shouldn't be able to add any ourselves.
addReactionChip.visibility = View.GONE
return
}
item.reactions.forEachIndexed { i, reaction ->
(chips.getChildAt(i)?.takeUnless { it.id == R.id.addReactionChip } as Chip?
?: Chip(ContextThemeWrapper(view.context, R.style.Widget_MaterialComponents_Chip_Choice)).apply {
isCheckable = true
checkedIcon = null
chips.addView(this, i)
})
.apply {
val emojiText = if (reaction.url == null) {
reaction.name
// If wellbeing mode is enabled, announcement badge counts should not be shown.
if (wellbeingEnabled) {
// Since reactions are not visible in wellbeing mode,
// we shouldn't be able to add any ourselves.
addReactionChip.visibility = View.GONE
return
}
item.reactions.forEachIndexed { i, reaction ->
(chips.getChildAt(i)?.takeUnless { it.id == R.id.addReactionChip } as Chip?
?: Chip(ContextThemeWrapper(chips.context, R.style.Widget_MaterialComponents_Chip_Choice)).apply {
isCheckable = true
checkedIcon = null
chips.addView(this, i)
})
.apply {
val emojiText = if (reaction.url == null) {
reaction.name
} else {
context.getString(R.string.emoji_shortcode_format, reaction.name)
}
this.text = ("$emojiText ${reaction.count}")
.emojify(
listOf(Emoji(
reaction.name,
reaction.url ?: "",
reaction.staticUrl ?: "",
null
)),
this,
animateEmojis
)
isChecked = reaction.me
setOnClickListener {
if (reaction.me) {
listener.removeReaction(item.id, reaction.name)
} else {
view.context.getString(R.string.emoji_shortcode_format, reaction.name)
}
text = ("$emojiText ${reaction.count}")
.emojify(
listOf(Emoji(
reaction.name,
reaction.url ?: "",
reaction.staticUrl ?: "",
null
)),
this,
animateEmojis
)
isChecked = reaction.me
setOnClickListener {
if (reaction.me) {
listener.removeReaction(item.id, reaction.name)
} else {
listener.addReaction(item.id, reaction.name)
}
listener.addReaction(item.id, reaction.name)
}
}
}
}
}
while (chips.size - 1 > item.reactions.size) {
chips.removeViewAt(item.reactions.size)
}
while (chips.size - 1 > item.reactions.size) {
chips.removeViewAt(item.reactions.size)
}
addReactionChip.setOnClickListener {
listener.openReactionPicker(item.id, it)
}
addReactionChip.setOnClickListener {
listener.openReactionPicker(item.id, it)
}
}
override fun getItemCount() = items.size
fun updateList(items: List<Announcement>) {
this.items = items
notifyDataSetChanged()
}
}
......@@ -839,7 +839,7 @@ class ComposeActivity : BaseActivity(),
val count = clipData.itemCount
if (mediaCount + count > maxUploadMediaNumber) {
// check if exist media + upcoming media > 4, then prob error message.
Toast.makeText(this, getString(R.string.error_upload_max_media_reached, maxUploadMediaNumber), Toast.LENGTH_SHORT).show()
Toast.makeText(this, resources.getQuantityString(R.plurals.error_upload_max_media_reached, maxUploadMediaNumber, maxUploadMediaNumber), Toast.LENGTH_SHORT).show()
} else {
// if not grater then 4, upload all multiple media.
for (i in 0 until count) {
......
......@@ -22,7 +22,6 @@ import android.view.LayoutInflater
import android.view.WindowManager
import androidx.appcompat.app.AlertDialog
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.adapter.AddPollOptionsAdapter
import com.keylesspalace.tusky.databinding.DialogAddPollBinding
import com.keylesspalace.tusky.entity.NewPoll
......
......@@ -13,17 +13,16 @@
* You should have received a copy of the GNU General Public License along with Tusky; if not,
* see <http://www.gnu.org/licenses>. */
package com.keylesspalace.tusky.adapter
package com.keylesspalace.tusky.components.compose.dialog
import android.text.InputFilter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageButton
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.databinding.ItemAddPollOptionBinding
import com.keylesspalace.tusky.util.BindingHolder
import com.keylesspalace.tusky.util.onTextChanged
import com.keylesspalace.tusky.util.visible
......@@ -32,7 +31,7 @@ class AddPollOptionsAdapter(
private val maxOptionLength: Int,
private val onOptionRemoved: (Boolean) -> Unit,
private val onOptionChanged: (Boolean) -> Unit
): RecyclerView.Adapter<ViewHolder>() {
): RecyclerView.Adapter<BindingHolder<ItemAddPollOptionBinding>>() {
val pollOptions: List<String>
get() = options.toList()
......@@ -42,11 +41,12 @@ class AddPollOptionsAdapter(
notifyItemInserted(options.size - 1)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val holder = ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_add_poll_option, parent, false))
holder.editText.filters = arrayOf(InputFilter.LengthFilter(maxOptionLength))
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemAddPollOptionBinding> {
val binding = ItemAddPollOptionBinding.inflate(LayoutInflater.from(parent.context), parent, false)
val holder = BindingHolder(binding)
binding.optionEditText.filters = arrayOf(InputFilter.LengthFilter(maxOptionLength))
holder.editText.onTextChanged { s, _, _, _ ->
binding.optionEditText.onTextChanged { s, _, _, _ ->
val pos = holder.adapterPosition
if(pos != RecyclerView.NO_POSITION) {
options[pos] = s.toString()
......@@ -59,15 +59,15 @@ class AddPollOptionsAdapter(
override fun getItemCount() = options.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.editText.setText(options[position])
override fun onBindViewHolder(holder: BindingHolder<ItemAddPollOptionBinding>, position: Int) {
holder.binding.optionEditText.setText(options[position])
holder.textInputLayout.hint = holder.textInputLayout.context.getString(R.string.poll_new_choice_hint, position + 1)
holder.binding.optionTextInputLayout.hint = holder.binding.root.context.getString(R.string.poll_new_choice_hint, position + 1)
holder.deleteButton.visible(position > 1, View.INVISIBLE)
holder.binding.deleteButton.visible(position > 1, View.INVISIBLE)
holder.deleteButton.setOnClickListener {
holder.editText.clearFocus()
holder.binding.deleteButton.setOnClickListener {
holder.binding.optionEditText.clearFocus()
options.removeAt(holder.adapterPosition)
notifyItemRemoved(holder.adapterPosition)
onOptionRemoved(validateInput())
......@@ -81,12 +81,4 @@ class AddPollOptionsAdapter(
return true
}
}
class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
val textInputLayout: TextInputLayout = itemView.findViewById(R.id.optionTextInputLayout)
val editText: TextInputEditText = itemView.findViewById(R.id.optionEditText)
val deleteButton: ImageButton = itemView.findViewById(R.id.deleteButton)
}
\ No newline at end of file
......@@ -63,8 +63,8 @@ fun <T> T.makeCaptionDialog(existingDescription: String?,
(imageView.layoutParams as LinearLayout.LayoutParams).setMargins(0, margin, 0, 0)
val input = EditText(this)
input.hint = getString(R.string.hint_describe_for_visually_impaired,
MEDIA_DESCRIPTION_CHARACTER_LIMIT)
input.hint = resources.getQuantityString(R.plurals.hint_describe_for_visually_impaired,
MEDIA_DESCRIPTION_CHARACTER_LIMIT, MEDIA_DESCRIPTION_CHARACTER_LIMIT)
dialogLayout.addView(input)
(input.layoutParams as LinearLayout.LayoutParams).setMargins(margin, margin, margin, margin)
input.setLines(2)
......
/* Copyright 2021 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>. */
package com.keylesspalace.tusky.components.conversation
import android.view.LayoutInflater
......@@ -10,6 +25,7 @@ import androidx.recyclerview.widget.ListUpdateCallback
import androidx.recyclerview.widget.RecyclerView
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.adapter.NetworkStateViewHolder
import com.keylesspalace.tusky.databinding.ItemNetworkStateBinding
import com.keylesspalace.tusky.interfaces.StatusActionListener
import com.keylesspalace.tusky.util.NetworkState
import com.keylesspalace.tusky.util.StatusDisplayOptions
......@@ -49,11 +65,15 @@ class ConversationAdapter(
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(viewType, parent, false)
return when (viewType) {
R.layout.item_network_state -> NetworkStateViewHolder(view, retryCallback)
R.layout.item_conversation -> ConversationViewHolder(view, statusDisplayOptions,
listener)
R.layout.item_network_state -> {
val binding = ItemNetworkStateBinding.inflate(LayoutInflater.from(parent.context), parent, false)
NetworkStateViewHolder(binding, retryCallback)
}
R.layout.item_conversation -> {
val view = LayoutInflater.from(parent.context).inflate(viewType, parent, false)
ConversationViewHolder(view, statusDisplayOptions, listener)
}
else -> throw IllegalArgumentException("unknown view type $viewType")
}
}
......
......@@ -23,7 +23,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.keylesspalace.tusky.databinding.ItemDraftBinding
import com.keylesspalace.tusky.db.DraftEntity
import com.keylesspalace.tusky.util.BindingViewHolder
import com.keylesspalace.tusky.util.BindingHolder
import com.keylesspalace.tusky.util.hide
import com.keylesspalace.tusky.util.show
import com.keylesspalace.tusky.util.visible
......@@ -35,7 +35,7 @@ interface DraftActionListener {
class DraftsAdapter(
private val listener: DraftActionListener
) : PagedListAdapter<DraftEntity, BindingViewHolder<ItemDraftBinding>>(
) : PagedListAdapter<DraftEntity, BindingHolder<ItemDraftBinding>>(
object : DiffUtil.ItemCallback<DraftEntity>() {
override fun areItemsTheSame(oldItem: DraftEntity, newItem: DraftEntity): Boolean {
return oldItem.id == newItem.id
......@@ -47,11 +47,11 @@ class DraftsAdapter(
}
) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingViewHolder<ItemDraftBinding> {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemDraftBinding> {
val binding = ItemDraftBinding.inflate(LayoutInflater.from(parent.context), parent, false)
val viewHolder = BindingViewHolder(binding)
val viewHolder = BindingHolder(binding)
binding.draftMediaPreview.layoutManager = LinearLayoutManager(binding.root.context, RecyclerView.HORIZONTAL, false)
binding.draftMediaPreview.adapter = DraftMediaAdapter {
......@@ -63,7 +63,7 @@ class DraftsAdapter(
return viewHolder
}
override fun onBindViewHolder(holder: BindingViewHolder<ItemDraftBinding>, position: Int) {
override fun onBindViewHolder(holder: BindingHolder<ItemDraftBinding>, position: Int) {
getItem(position)?.let { draft ->
holder.binding.root.setOnClickListener {
listener.onOpenDraft(draft)
......
package com.keylesspalace.tusky.components.instancemute.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.components.instancemute.interfaces.InstanceActionListener
import kotlinx.android.synthetic.main.item_muted_domain.view.*
import com.keylesspalace.tusky.databinding.ItemMutedDomainBinding
import com.keylesspalace.tusky.util.BindingHolder
class DomainMutesAdapter(
private val actionListener: InstanceActionListener
): RecyclerView.Adapter<BindingHolder<ItemMutedDomainBinding>>() {
class DomainMutesAdapter(private val actionListener: InstanceActionListener): RecyclerView.Adapter<DomainMutesAdapter.ViewHolder>() {
var instances: MutableList<String> = mutableListOf()
var bottomLoading: Boolean = false
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_muted_domain, parent, false), actionListener)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemMutedDomainBinding> {
val binding = ItemMutedDomainBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return BindingHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.setupWithInstance(instances[position])
override fun onBindViewHolder(holder: BindingHolder<ItemMutedDomainBinding>, position: Int) {
val instance = instances[position]
holder.binding.mutedDomain.text = instance
holder.binding.mutedDomainUnmute.setOnClickListener {
actionListener.mute(false, instance, holder.adapterPosition)
}
}
override fun getItemCount(): Int {
......@@ -37,21 +46,10 @@ class DomainMutesAdapter(private val actionListener: InstanceActionListener): Re
notifyItemInserted(instances.size)
}
fun removeItem(position: Int)
{
fun removeItem(position: Int) {
if (position >= 0 && position < instances.size) {
instances.removeAt(position)
notifyItemRemoved(position)
}
}
class ViewHolder(rootView: View, private val actionListener: InstanceActionListener): RecyclerView.ViewHolder(rootView) {
fun setupWithInstance(instance: String) {
itemView.muted_domain.text = instance
itemView.muted_domain_unmute.setOnClickListener {
actionListener.mute(false, instance, adapterPosition)
}
}
}
}
\ No newline at end of file
}
......@@ -242,7 +242,7 @@ public class NotificationHelper {
if (currentNotifications.length() != 1) {
try {
String title = context.getString(R.string.notification_title_summary, currentNotifications.length());
String title = context.getResources().getQuantityString(R.plurals.notification_title_summary, currentNotifications.length(), currentNotifications.length());
String text = joinNames(context, currentNotifications);
summaryBuilder.setContentTitle(title)
.setContentText(text);
......
......@@ -18,13 +18,11 @@ package com.keylesspalace.tusky.components.scheduled
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageButton
import android.widget.TextView
import androidx.paging.PagedListAdapter
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.databinding.ItemScheduledTootBinding
import com.keylesspalace.tusky.entity.ScheduledStatus
import com.keylesspalace.tusky.util.BindingHolder
interface ScheduledTootActionListener {
fun edit(item: ScheduledStatus)
......@@ -33,7 +31,7 @@ interface ScheduledTootActionListener {
class ScheduledTootAdapter(
val listener: ScheduledTootActionListener
) : PagedListAdapter<ScheduledStatus, ScheduledTootAdapter.TootViewHolder>(
) : PagedListAdapter<ScheduledStatus, BindingHolder<ItemScheduledTootBinding>>(
object: DiffUtil.ItemCallback<ScheduledStatus>(){
override fun areItemsTheSame(oldItem: ScheduledStatus, newItem: ScheduledStatus): Boolean {
return oldItem.id == newItem.id
......@@ -46,40 +44,24 @@ class ScheduledTootAdapter(
}
) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TootViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_scheduled_toot, parent, false)
return TootViewHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemScheduledTootBinding> {
val binding = ItemScheduledTootBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return BindingHolder(binding)
}
override fun onBindViewHolder(viewHolder: TootViewHolder, position: Int) {
getItem(position)?.let{
viewHolder.bind(it)
}
}
inner class TootViewHolder(view: View) : RecyclerView.ViewHolder(view) {
private val text: TextView = view.findViewById(R.id.text)
private val edit: ImageButton = view.findViewById(R.id.edit)
private val delete: ImageButton = view.findViewById(R.id.delete)
fun bind(item: ScheduledStatus) {
edit.isEnabled = true
delete.isEnabled = true
text.text = item.params.text
edit.setOnClickListener { v: View ->
override fun onBindViewHolder(holder: BindingHolder<ItemScheduledTootBinding>, position: Int) {
getItem(position)?.let{ item ->
holder.binding.edit.isEnabled = true
holder.binding.delete.isEnabled = true
holder.binding.text.text = item.params.text
holder.binding.edit.setOnClickListener { v: View ->
v.isEnabled = false
listener.edit(item)
}
delete.setOnClickListener { v: View ->
holder.binding.delete.setOnClickListener { v: View ->
v.isEnabled = false
listener.delete(item)
}
}
}
}
\ No newline at end of file
}
......@@ -19,24 +19,23 @@ import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.paging.PagedListAdapter
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.adapter.HashtagViewHolder
import com.keylesspalace.tusky.databinding.ItemHashtagBinding
import com.keylesspalace.tusky.entity.HashTag
import com.keylesspalace.tusky.interfaces.LinkListener
import com.keylesspalace.tusky.util.BindingHolder
class SearchHashtagsAdapter(private val linkListener: LinkListener)
: PagedListAdapter<HashTag, RecyclerView.ViewHolder>(HASHTAG_COMPARATOR) {
: PagedListAdapter<HashTag, BindingHolder<ItemHashtagBinding>>(HASHTAG_COMPARATOR) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_hashtag, parent, false)
return HashtagViewHolder(view)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder<ItemHashtagBinding> {
val binding = ItemHashtagBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return BindingHolder(binding)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
override fun onBindViewHolder(holder: BindingHolder<ItemHashtagBinding>, position: Int) {
getItem(position)?.let { (name) ->
(holder as HashtagViewHolder).setup(name, linkListener)
holder.binding.root.text = String.format("#%s", name)
holder.binding.root.setOnClickListener { linkListener.onViewTag(name) }
}
}
......
......@@ -3,6 +3,6 @@ package com.keylesspalace.tusky.util
import androidx.recyclerview.widget.RecyclerView
import androidx.viewbinding.ViewBinding
class BindingViewHolder<T : ViewBinding>(
class BindingHolder<T : ViewBinding>(
val binding: T
) : RecyclerView.ViewHolder(binding.root)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="72dp"
android:gravity="center_vertical"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp">
android:paddingRight="16dp"
android:paddingBottom="10dp">
<androidx.emoji.widget.EmojiTextView
android:id="@+id/notificationTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:drawableStart="@drawable/ic_person_add_24dp"
android:drawablePadding="10dp"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
android:paddingStart="28dp"
android:textColor="?android:textColorSecondary"
android:textSize="?attr/status_text_medium"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Someone requested to follow you" />
<ImageView
android:id="@+id/avatar"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_marginEnd="24dp"
android:contentDescription="@string/action_view_profile" />
android:layout_marginTop="10dp"
android:contentDescription="@string/action_view_profile"
tools:src="@drawable/avatar_default"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/notificationTextView" />
<LinearLayout
<androidx.emoji.widget.EmojiTextView
android:id="@+id/displayNameTextView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_toEndOf="@id/avatar"
android:layout_toStartOf="@id/acceptButton"
android:gravity="center_vertical"
android:orientation="vertical">
android:layout_height="wrap_content"
android:layout_marginStart="14dp"
android:ellipsize="end"
android:maxLines="1"
android:textColor="?android:textColorPrimary"
android:textSize="?attr/status_text_large"
android:textStyle="normal|bold"
app:layout_constraintStart_toEndOf="@id/avatar"
app:layout_constraintTop_toTopOf="@id/avatar"
app:layout_constraintBottom_toTopOf="@id/usernameTextView"
tools:text="Display name" />
<androidx.emoji.widget.EmojiTextView
android:id="@+id/displayNameTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:textColor="?android:textColorPrimary"
android:textSize="?attr/status_text_large"
android:textStyle="normal|bold"
tools:text="Display name" />
<TextView
android:id="@+id/usernameTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:textColor="?android:textColorSecondary"
android:textSize="?attr/status_text_medium"
tools:text="\@username" />
</LinearLayout>
<TextView
android:id="@+id/usernameTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="14dp"
android:ellipsize="end"
android:maxLines="1"
android:textColor="?android:textColorSecondary"
android:textSize="?attr/status_text_medium"
app:layout_constraintStart_toEndOf="@id/avatar"
app:layout_constraintTop_toBottomOf="@id/displayNameTextView"
app:layout_constraintBottom_toBottomOf="@id/avatar"
tools:text="\@username" />
<ImageButton
android:id="@+id/acceptButton"
......@@ -55,10 +72,12 @@
android:layout_height="32dp"
android:layout_centerVertical="true"
android:layout_marginStart="12dp"
android:layout_toStartOf="@id/rejectButton"
android:layout_marginTop="14dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/action_accept"
android:padding="4dp"
app:layout_constraintEnd_toStartOf="@id/rejectButton"
app:layout_constraintTop_toBottomOf="@id/notificationTextView"
app:srcCompat="@drawable/ic_check_24dp" />
<ImageButton
......@@ -66,12 +85,14 @@
style="@style/TuskyImageButton"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginStart="12dp"
android:layout_marginTop="14dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/action_reject"
android:padding="4dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/notificationTextView"
app:srcCompat="@drawable/ic_reject_24dp" />
</RelativeLayout>
\ No newline at end of file
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingBottom="10dp">
<androidx.emoji.widget.EmojiTextView
android:id="@+id/notificationTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:drawableStart="@drawable/ic_person_add_24dp"
android:drawablePadding="10dp"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
android:paddingStart="28dp"
android:textColor="?android:textColorSecondary"
android:textSize="?attr/status_text_medium"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Someone requested to follow you" />
<ImageView
android:id="@+id/avatar"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_centerVertical="true"
android:layout_marginTop="10dp"
android:contentDescription="@string/action_view_profile"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/notificationTextView" />
<androidx.emoji.widget.EmojiTextView
android:id="@+id/displayNameTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="14dp"
android:layout_marginTop="6dp"
android:ellipsize="end"
android:maxLines="1"
android:textColor="?android:textColorPrimary"
android:textSize="?attr/status_text_large"
android:textStyle="normal|bold"
app:layout_constraintStart_toEndOf="@id/avatar"
app:layout_constraintTop_toBottomOf="@id/notificationTextView"
tools:text="Display name" />
<TextView
android:id="@+id/usernameTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="14dp"
android:ellipsize="end"
android:maxLines="1"
android:textColor="?android:textColorSecondary"
android:textSize="?attr/status_text_medium"
app:layout_constraintStart_toEndOf="@id/avatar"
app:layout_constraintTop_toBottomOf="@id/displayNameTextView"
tools:text="\@username" />
<ImageButton
android:id="@+id/acceptButton"
style="@style/TuskyImageButton"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_centerVertical="true"
android:layout_marginStart="12dp"
android:layout_marginTop="14dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/action_accept"
android:padding="4dp"
app:layout_constraintEnd_toStartOf="@id/rejectButton"
app:layout_constraintTop_toBottomOf="@id/notificationTextView"
app:srcCompat="@drawable/ic_check_24dp" />
<ImageButton
android:id="@+id/rejectButton"
style="@style/TuskyImageButton"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_centerVertical="true"
android:layout_marginStart="12dp"
android:layout_marginTop="14dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/action_reject"
android:padding="4dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/notificationTextView"
app:srcCompat="@drawable/ic_reject_24dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/hashtag"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
......
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
......
......@@ -214,7 +214,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s و %4$d آخرون</string>
<string name="notification_summary_medium">%1$s, %2$s, و %3$s</string>
<string name="notification_summary_small">%1$s و %2$s</string>
<string name="notification_title_summary">%d تفاعلات جديدة</string>
<plurals name="notification_title_summary">
<item quantity="other">%d تفاعلات جديدة</item>
</plurals>
<string name="description_account_locked">حساب مقفل</string>
<string name="about_title_activity">عن التطبيق</string>
<string name="about_tusky_version">توسكي %s</string>
......@@ -275,8 +277,10 @@
<string name="action_remove_from_list">إزالة الحساب مِن القائمة</string>
<string name="compose_active_account_description">النشر بواسطة حساب %1$s</string>
<string name="error_failed_set_caption">تعذرت عملية إضافة الشرح</string>
<string name="hint_describe_for_visually_impaired">وصف لضعاف البصر
\n(%d أحرف على أقصى تقدير)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">وصف لضعاف البصر
\n(%d أحرف على أقصى تقدير)</item>
</plurals>
<string name="action_set_caption">إضافة شرح</string>
<string name="action_remove">حذف</string>
<string name="lock_account_label">تجميد الحساب</string>
......@@ -325,7 +329,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s و %2$s</string>
<string name="conversation_more_recipients">%1$s و %2$s و %3$d آخَرون</string>
<string name="max_tab_number_reached">لقد بلغت الحد الأقصى مِن الألسنة %1$d</string>
<plurals name="max_tab_number_reached">
<item quantity="other">لقد بلغت الحد الأقصى مِن الألسنة %1$d</item>
</plurals>
<string name="description_status_media">الوسائط: %s </string>
<string name="description_status_cw">تحذير عن المحتوى: %s </string>
<string name="description_status_media_no_description_placeholder">مِن دون وصف </string>
......
......@@ -76,7 +76,9 @@
<string name="description_status_media_no_description_placeholder">Без описание</string>
<string name="description_status_cw">Предупреждение за съдържание: %s</string>
<string name="description_status_media">Мултимедия: %s</string>
<string name="max_tab_number_reached">достигнати са максималните %1$d раздела</string>
<plurals name="max_tab_number_reached">
<item quantity="other">достигнати са максималните %1$d раздела</item>
</plurals>
<string name="conversation_more_recipients">%1$s, %2$s и %3$d други</string>
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s и %2$s</string>
......@@ -134,8 +136,10 @@
<string name="lock_account_label">Заключване на акаунт</string>
<string name="action_remove">Премахване</string>
<string name="action_set_caption">Задаване на надпис</string>
<string name="hint_describe_for_visually_impaired">Опишете за хора със зрителни увреждания
\n(%d ограничение на знаците)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Опишете за хора със зрителни увреждания
\n(%d ограничение на знаците)</item>
</plurals>
<string name="error_failed_set_caption">Неуспешно задаване на надпис</string>
<string name="compose_active_account_description">Публикуване с акаунт %1$s</string>
<string name="action_remove_from_list">Премахване на акаунт от списъка</string>
......@@ -195,7 +199,9 @@
<string name="about_tusky_version">Tusky %s</string>
<string name="about_title_activity">Относно</string>
<string name="description_account_locked">Заключен акаунт</string>
<string name="notification_title_summary">%d нови взаимодействия</string>
<plurals name="notification_title_summary">
<item quantity="other">%d нови взаимодействия</item>
</plurals>
<string name="notification_summary_small">%1$s и %2$s</string>
<string name="notification_summary_medium">%1$s, %2$s, и %3$s</string>
<string name="notification_summary_large">%1$s, %2$s, %3$s и %4$d други</string>
......@@ -441,7 +447,9 @@
\n Все още можете да осъществите достъп до старите си чернови чрез бутон на екрана за нови чернови, но те ще бъдат премахнати при бъдеща актуализация!</string>
<string name="drafts_toot_failed_to_send">Тази публикация не успя да се изпрати!</string>
<string name="dialog_delete_list_warning">Наистина ли искате да изтриете списъка %s\?</string>
<string name="error_upload_max_media_reached">Не можете да качите повече от %1$d мултимедийни прикачени файлове.</string>
<plurals name="error_upload_max_media_reached">
<item quantity="other">Не можете да качите повече от %1$d мултимедийни прикачени файлове.</item>
</plurals>
<string name="wellbeing_hide_stats_profile">Скриване на количествена статистика на профили</string>
<string name="wellbeing_hide_stats_posts">Скриване на количествена статистика на публикации</string>
<string name="limit_notifications">Ограничаване на известия от емисия</string>
......
......@@ -12,7 +12,9 @@
<string name="description_status_media_no_description_placeholder">বর্ণনা নাই</string>
<string name="description_status_cw">সতর্কবার্তা: %s</string>
<string name="description_status_media">মিডিয়া: %s</string>
<string name="max_tab_number_reached">সর্বাধিক %1$d টি ট্যাব পৌঁছেছে</string>
<plurals name="max_tab_number_reached">
<item quantity="other">সর্বাধিক %1$d টি ট্যাব পৌঁছেছে</item>
</plurals>
<string name="title_favourited_by">দ্বারা পছন্দ</string>
<string name="title_reblogged_by">দ্বারা সর্মথন</string>
<string name="pin_action">পিন</string>
......@@ -57,8 +59,10 @@
<string name="lock_account_label_description">অনুসারী অনুমোদন করার জন্য আপনাকে প্রয়োজন</string>
<string name="lock_account_label">অ্যাকাউন্ট লক করুন</string>
<string name="action_set_caption">ক্যাপশন সেট করুন</string>
<string name="hint_describe_for_visually_impaired">দৃষ্টি প্রতিবন্ধী জন্য বর্ণনা করুন
\n(%d অক্ষর সীমা)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">দৃষ্টি প্রতিবন্ধী জন্য বর্ণনা করুন
\n(%d অক্ষর সীমা)</item>
</plurals>
<string name="error_failed_set_caption">ক্যাপশন সেট করতে ব্যর্থ</string>
<string name="compose_active_account_description">অ্যাকাউন্ট %1$s থেকে পোস্ট করা হচ্ছে</string>
<string name="action_remove_from_list">তালিকা থেকে অ্যাকাউন্ট সরান</string>
......
......@@ -225,7 +225,9 @@
<string name="notification_summary_large">%1$s,%2$s,%3$s এবং %4$d আরো অন্য জন</string>
<string name="notification_summary_medium">%1$s, %2$s, আর %3$s</string>
<string name="notification_summary_small">%1$s আর %2$s</string>
<string name="notification_title_summary">%d নতুন মিথস্ক্রিয়া</string>
<plurals name="notification_title_summary">
<item quantity="other">%d নতুন মিথস্ক্রিয়া</item>
</plurals>
<string name="description_account_locked">লক অ্যাকাউন্ট</string>
<string name="about_title_activity">সম্পর্কিত</string>
<string name="about_tusky_version">টাস্কি %s</string>
......@@ -286,8 +288,10 @@
<string name="action_remove_from_list">তালিকা থেকে অ্যাকাউন্ট সরান</string>
<string name="compose_active_account_description">অ্যাকাউন্ট %1$s থেকে পোস্ট করা হচ্ছে</string>
<string name="error_failed_set_caption">ক্যাপশন সেট করতে ব্যর্থ</string>
<string name="hint_describe_for_visually_impaired">দৃষ্টি প্রতিবন্ধী জন্য বর্ণনা করুন
\n(%d অক্ষর সীমা)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">দৃষ্টি প্রতিবন্ধী জন্য বর্ণনা করুন
\n(%d অক্ষর সীমা)</item>
</plurals>
<string name="action_set_caption">ক্যাপশন সেট করুন</string>
<string name="action_remove">সরান</string>
<string name="lock_account_label">অ্যাকাউন্ট লক করুন</string>
......@@ -345,7 +349,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s এবং %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s এবং %3$d আরো অন্য জন</string>
<string name="max_tab_number_reached">সর্বাধিক %1$d টি ট্যাব পৌঁছেছে</string>
<plurals name="max_tab_number_reached">
<item quantity="other">সর্বাধিক %1$d টি ট্যাব পৌঁছেছে</item>
</plurals>
<string name="description_status_media">মিডিয়া: %s</string>
<string name="description_status_cw">সতর্কবার্তা: %s</string>
<string name="description_status_media_no_description_placeholder">বর্ণনা নাই</string>
......
......@@ -153,7 +153,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s i %4$d més</string>
<string name="notification_summary_medium">%1$s, %2$s i %3$s</string>
<string name="notification_summary_small">%1$s i %2$s</string>
<string name="notification_title_summary">%d interaccions noves</string>
<plurals name="notification_title_summary">
<item quantity="other">%d interaccions noves</item>
</plurals>
<string name="description_account_locked">Compte blocat</string>
<string name="about_title_activity">Quant a</string>
<string name="about_tusky_version">Tusky %s</string>
......@@ -286,8 +288,10 @@
<string name="action_remove_from_list">Suprimir un compte de la llista</string>
<string name="compose_active_account_description">Publicar amb el compte %1$s</string>
<string name="error_failed_set_caption">Error al afegir la llegenda</string>
<string name="hint_describe_for_visually_impaired">Descriure per a invidentes
\n(%d character limit)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Descriure per a invidentes
\n(%d character limit)</item>
</plurals>
<string name="action_set_caption">Afegir una llegenda</string>
<string name="action_remove">Eliminar</string>
<string name="lock_account_label">Protegir el compte</string>
......@@ -342,7 +346,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s i %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s i %3$d més</string>
<string name="max_tab_number_reached">màxim de %1$d pestanyes aconseguides</string>
<plurals name="max_tab_number_reached">
<item quantity="other">màxim de %1$d pestanyes aconseguides</item>
</plurals>
<string name="description_status_media">Mèdia : %s</string>
<string name="description_status_media_no_description_placeholder">Sense descripció</string>
<string name="description_status_favourited">Favorits</string>
......@@ -493,7 +499,9 @@
<string name="old_drafts">Esborranys antics</string>
<string name="drafts_toot_failed_to_send">No s\'ha pogut enviar aquest tut!</string>
<string name="dialog_delete_list_warning">Segur que voleu esborrar la llista %s\?</string>
<string name="error_upload_max_media_reached">No podeu pujar més de %1$d adjunts multimèdia.</string>
<plurals name="error_upload_max_media_reached">
<item quantity="other">No podeu pujar més de %1$d adjunts multimèdia.</item>
</plurals>
<string name="wellbeing_hide_stats_profile">Amaga les estadístiques quantitatives dels perfils</string>
<string name="wellbeing_hide_stats_posts">Amaga les estadístiques quantitatives de les publicacions</string>
<string name="limit_notifications">Limita les notificacions de la cronologia</string>
......
......@@ -234,7 +234,9 @@
<item quantity="other">%d کاژێرماوە</item>
</plurals>
<string name="filter_dialog_whole_word_description">کاتێک وشەکە یان دەستەواژەکە تەنها ئەبجەدییە، تەنها ئەگەر لەگەڵ هەموو وشەکە یەکبێت کاری پێدەکرێت</string>
<string name="error_upload_max_media_reached">ناتوانیت زیاتر لە %1$d هاوپێچی میدیا باربکەیت.</string>
<plurals name="error_upload_max_media_reached">
<item quantity="other">ناتوانیت زیاتر لە %1$d هاوپێچی میدیا باربکەیت.</item>
</plurals>
<string name="wellbeing_hide_stats_profile">شاردنەوەی زانیاری چەندێتی لەسەر پرۆفایلەکان</string>
<string name="wellbeing_hide_stats_posts">شاردنەوەی زانیاری چەندێتی لە بابەتەکان</string>
<string name="limit_notifications">سنووردارکردنی ئاگانامەکانی تایم لاین</string>
......@@ -327,7 +329,9 @@
<string name="description_status_media_no_description_placeholder">هیچ وەسفێک</string>
<string name="description_status_cw">ئاگاداری ناوەڕۆک: %s</string>
<string name="description_status_media">میدیا: %s</string>
<string name="max_tab_number_reached">بەرزترین رێژەی خشتەبەندەکانی %1$d گەیشت</string>
<plurals name="max_tab_number_reached">
<item quantity="other">بەرزترین رێژەی خشتەبەندەکانی %1$d گەیشت</item>
</plurals>
<string name="conversation_more_recipients">%1$s, %2$s و %3$d زیاتر</string>
<string name="conversation_2_recipients">%1$s و %2$s</string>
<string name="conversation_1_recipients">%1$s</string>
......@@ -384,8 +388,10 @@
<string name="lock_account_label">داخستنی ئەژمێر</string>
<string name="action_remove">لابردن</string>
<string name="action_set_caption">دانانی سەردێڕ</string>
<string name="hint_describe_for_visually_impaired">وەسف بکە بۆ بینایی داڕماو
\n(%d سنوری کاراکتەر)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">وەسف بکە بۆ بینایی داڕماو
\n(%d سنوری کاراکتەر)</item>
</plurals>
<string name="error_failed_set_caption">دانانی سەردێڕ شکستی هێنا</string>
<string name="compose_active_account_description">بڵاوکردنەوە بە هەژماری %1$s</string>
<string name="action_remove_from_list">لابردنی ئەژمێر لە لیستەکە</string>
......@@ -442,7 +448,9 @@
<string name="about_tusky_version">توسکی %s</string>
<string name="about_title_activity">سەبارەت</string>
<string name="description_account_locked">هەژماری داخراو</string>
<string name="notification_title_summary">%d چالاکی نوێ</string>
<plurals name="notification_title_summary">
<item quantity="other">%d چالاکی نوێ</item>
</plurals>
<string name="notification_summary_small">%1$s و %2$s</string>
<string name="notification_summary_medium">%1$s و %2$s و %3$s</string>
<string name="notification_summary_large">%1$s, %2$s, %3$s و %4$d ئەوانی تر</string>
......
......@@ -220,7 +220,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s a dalších %4$d</string>
<string name="notification_summary_medium">%1$s, %2$s a %3$s</string>
<string name="notification_summary_small">%1$s a %2$s</string>
<string name="notification_title_summary">%d nových interakcí</string>
<plurals name="notification_title_summary">
<item quantity="other">%d nových interakcí</item>
</plurals>
<string name="description_account_locked">Uzamčený účet</string>
<string name="about_title_activity">O této aplikaci</string>
<string name="about_tusky_version">Tusky %s</string>
......@@ -285,7 +287,9 @@
<string name="action_remove_from_list">Odstranit účet ze seznamu</string>
<string name="compose_active_account_description">Píšete s účtem %1$s</string>
<string name="error_failed_set_caption">Nastavení popisku selhalo</string>
<string name="hint_describe_for_visually_impaired">Popis pro zrakově postižené\n(limit %d znaků)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Popis pro zrakově postižené\n(limit %d znaků)</item>
</plurals>
<string name="action_set_caption">Nastavit popisek</string>
<string name="action_remove">Odstranit</string>
<string name="lock_account_label">Uzamknout účet</string>
......@@ -344,7 +348,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s a %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s a %3$d další</string>
<string name="max_tab_number_reached">bylo dosaženo maxima %1$d panelů</string>
<plurals name="max_tab_number_reached">
<item quantity="other">bylo dosaženo maxima %1$d panelů</item>
</plurals>
<string name="description_status_media"> Média %s
</string>
<string name="description_status_cw"> Varování o obsahu: %s
......
......@@ -190,7 +190,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s a %4$d eraill</string>
<string name="notification_summary_medium">%1$s, %2$s, a %3$s</string>
<string name="notification_summary_small">%1$s a %2$s</string>
<string name="notification_title_summary">%d rhyngweithiad newydd</string>
<plurals name="notification_title_summary">
<item quantity="other">%d rhyngweithiad newydd</item>
</plurals>
<string name="description_account_locked">Cyfrif wedi\'i gloi </string>
<string name="about_title_activity">Amdano</string>
<string name="about_tusky_license">Mae Tusky yn feddalwedd ffynhonnell agored barn rydd.
......
......@@ -217,7 +217,10 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s und %4$d andere</string>
<string name="notification_summary_medium">%1$s, %2$s, und %3$s</string>
<string name="notification_summary_small">%1$s und %2$s</string>
<string name="notification_title_summary">%d neue Interaktionen</string>
<plurals name="notification_title_summary">
<item quantity="one">%d neue Interaktion</item>
<item quantity="other">%d neue Interaktionen</item>
</plurals>
<string name="description_account_locked">Gesperrtes Profil</string>
<string name="about_title_activity">Über</string>
<string name="about_tusky_license">Tusky ist freie und quelloffene Software. Es ist lizenziert unter der GNU General Public License Version 3. Du kannst dir die Lizenz hier anschauen: https://www.gnu.org/licenses/gpl-3.0.de.html</string>
......@@ -261,7 +264,9 @@
<string name="action_add_to_list">Ein Konto zu einer Liste hinzufügen</string>
<string name="compose_active_account_description">verfassen mit %1$s</string>
<string name="error_failed_set_caption">Fehler beim Speichern der Beschreibung</string>
<string name="hint_describe_for_visually_impaired">Für Menschen mit Sehbehinderung beschreiben\n(%d Zeichen)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Für Menschen mit Sehbehinderung beschreiben\n(%d Zeichen)</item>
</plurals>
<string name="action_set_caption">Beschreibung eingeben</string>
<string name="action_remove">Entfernen</string>
<string name="lock_account_label">Gesperrtes Profil</string>
......@@ -310,7 +315,10 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s und %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s und %3$d mehr</string>
<string name="max_tab_number_reached">Maximum von %1$d Tabs erreicht</string>
<plurals name="max_tab_number_reached">
<item quantity="one">Maximum von %1$d Tab erreicht</item>
<item quantity="other">Maximum von %1$d Tabs erreicht</item>
</plurals>
<string name="description_status_media_no_description_placeholder"> Keine Beschreibung </string>
<string name="description_status_favourited">Favorisiert </string>
<string name="description_visiblity_public">Öffentlich </string>
......@@ -477,7 +485,10 @@
\nDu kannst deine alten Entwürfe noch hinter einem Button bei den neuen Entwürfen finden, aber sie werden mit einem zukünftigen Update gelöscht!</string>
<string name="drafts_toot_failed_to_send">Dieser Beitrag konnte nicht gesendet werden!</string>
<string name="dialog_delete_list_warning">Willst du die Liste %s wirklich löschen\?</string>
<string name="error_upload_max_media_reached">Du kannst nicht mehr als %1$d Anhänge hochladen.</string>
<plurals name="error_upload_max_media_reached">
<item quantity="one">Du kannst nicht mehr als %1$d Anhang hochladen.</item>
<item quantity="other">Du kannst nicht mehr als %1$d Anhänge hochladen.</item>
</plurals>
<string name="pref_title_wellbeing_mode">Wohlbefinden</string>
<string name="label_duration">Dauer</string>
<string name="duration_indefinite">Für immer</string>
......
......@@ -216,7 +216,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s kaj %4$d aliaj</string>
<string name="notification_summary_medium">%1$s, %2$s, kaj %3$s</string>
<string name="notification_summary_small">%1$s kaj %2$s</string>
<string name="notification_title_summary">%d novaj interagoj</string>
<plurals name="notification_title_summary">
<item quantity="other">%d novaj interagoj</item>
</plurals>
<string name="description_account_locked">Ŝlosita konto</string>
<string name="about_title_activity">Pri</string>
<string name="about_tusky_version">Tusky %s</string>
......@@ -281,7 +283,9 @@
<string name="action_remove_from_list">Forigi konton el la listo</string>
<string name="compose_active_account_description">Afiŝi per konto %1$s</string>
<string name="error_failed_set_caption">Redakto de apudskribo malsukcesis</string>
<string name="hint_describe_for_visually_impaired">Priskribi por misvidantaj homoj\n(%d signoj maksimume)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Priskribi por misvidantaj homoj\n(%d signoj maksimume)</item>
</plurals>
<string name="action_set_caption">Redakti apudskribon</string>
<string name="action_remove">Forigi</string>
<string name="lock_account_label">Ŝlosi konton</string>
......@@ -338,7 +342,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s kaj %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s kaj %3$d aliaj</string>
<string name="max_tab_number_reached">maksimuma nombro %1$d da langetoj atingita</string>
<plurals name="max_tab_number_reached">
<item quantity="other">maksimuma nombro %1$d da langetoj atingita</item>
</plurals>
<string name="description_status_media"> Aŭdovidaĵo: %s
</string>
<string name="description_status_cw"> Enhava averto: %s
......
......@@ -203,7 +203,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s y %4$d otros</string>
<string name="notification_summary_medium">%1$s, %2$s, y %3$s</string>
<string name="notification_summary_small">%1$s y %2$s</string>
<string name="notification_title_summary">%d nuevas interacciones</string>
<plurals name="notification_title_summary">
<item quantity="other">%d nuevas interacciones</item>
</plurals>
<string name="description_account_locked">Cuenta protegida</string>
<string name="about_title_activity">Acerca de</string>
<string name="about_tusky_version">Tusky %s</string>
......@@ -251,7 +253,9 @@
<string name="title_list_timeline">Cronología de lista</string>
<string name="compose_active_account_description">Publicando con la cuenta %1$s</string>
<string name="error_failed_set_caption">Error al añadir leyenda</string>
<string name="hint_describe_for_visually_impaired">Describir para invidentes\n(límite de %d caracteres)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Describir para invidentes\n(límite de %d caracteres)</item>
</plurals>
<string name="action_set_caption">Añadir leyenda</string>
<string name="action_remove">Eliminar</string>
<string name="lock_account_label">Proteger cuenta</string>
......@@ -308,7 +312,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s y %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s y %3$d más</string>
<string name="max_tab_number_reached">máximo de %1$d pestañas alcanzadas</string>
<plurals name="max_tab_number_reached">
<item quantity="other">máximo de %1$d pestañas alcanzadas</item>
</plurals>
<string name="action_mentions">Menciones</string>
<string name="action_open_faved_by">Mostrar favoritos</string>
<string name="title_mentions_dialog">Menciones</string>
......@@ -480,7 +486,9 @@
<string name="no_announcements">No hay anuncios.</string>
<string name="title_announcements">Anuncios</string>
<string name="notification_subscription_format">%s recién publicado</string>
<string name="error_upload_max_media_reached">No puedes cargar más de %1$d archivos adjuntos multimedia.</string>
<plurals name="error_upload_max_media_reached">
<item quantity="other">No puedes cargar más de %1$d archivos adjuntos multimedia.</item>
</plurals>
<string name="wellbeing_hide_stats_profile">Esconder las estadísticas cuantitativas de los perfiles</string>
<string name="wellbeing_hide_stats_posts">Esconder las estadísticas cuantitativas de las publicaciones</string>
<string name="review_notifications">Revisar Notificaciones</string>
......
......@@ -192,7 +192,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s eta beste %4$d</string>
<string name="notification_summary_medium">%1$s, %2$s eta %3$s</string>
<string name="notification_summary_small">%1$s eta %2$s</string>
<string name="notification_title_summary">%d interakzio berri</string>
<plurals name="notification_title_summary">
<item quantity="other">%d interakzio berri</item>
</plurals>
<string name="description_account_locked">Kontu babestua</string>
<string name="about_title_activity">Honi buruz</string>
<string name="about_tusky_license">Tusky software libre eta kode askekoa da.
......@@ -235,7 +237,9 @@
<string name="title_list_timeline">Zerrenda denbora-lerroa</string>
<string name="compose_active_account_description">%1$s kontuarekin tut egiten</string>
<string name="error_failed_set_caption">Akatsa deskribapena eranstean</string>
<string name="hint_describe_for_visually_impaired">Ikusmen urritasuna dutenentzat deskribapena\n(%d karaktereko muga)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Ikusmen urritasuna dutenentzat deskribapena\n(%d karaktereko muga)</item>
</plurals>
<string name="action_set_caption">Deskribapena erantsi</string>
<string name="action_remove">Ezabatu</string>
<string name="lock_account_label">Kontua babestu</string>
......@@ -361,7 +365,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s eta %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s eta %3$d gehiago</string>
<string name="max_tab_number_reached">gehienezko %1$d fitxa iritsita</string>
<plurals name="max_tab_number_reached">
<item quantity="other">gehienezko %1$d fitxa iritsita</item>
</plurals>
<string name="description_status_media">Media: %s</string>
<string name="description_status_cw">Edukiaren abisua: %s</string>
<string name="description_status_media_no_description_placeholder">Deskribapenik ez</string>
......
......@@ -192,7 +192,9 @@
<string name="notification_summary_large">%1$s، %2$s، %3$s و %4$d دیگر</string>
<string name="notification_summary_medium">%1$s، %2$s و %3$s</string>
<string name="notification_summary_small">%1$s و %2$s</string>
<string name="notification_title_summary">%d برهم‌کنش جدید</string>
<plurals name="notification_title_summary">
<item quantity="other">%d برهم‌کنش جدید</item>
</plurals>
<string name="description_account_locked">حساب قفل‌شده</string>
<string name="about_title_activity">درباره</string>
<string name="about_tusky_license">تاسکی نرم‌افزاری آزاد است که تحت نگارش ۳ از پروانهٔ جامع همگانی گنو منتشر شده است. پروانه را می‌توانید از این‌جا ببینید: https://www.gnu.org/licenses/gpl-3.0.en.html</string>
......@@ -230,8 +232,10 @@
<string name="title_list_timeline">خط زمانی فهرست</string>
<string name="compose_active_account_description">در حال فرستادن با حساب %1$s</string>
<string name="error_failed_set_caption">شکست در تنظیم عنوان</string>
<string name="hint_describe_for_visually_impaired">توصیف برای کم‌بینایان
\n(کران %d نویسه)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">توصیف برای کم‌بینایان
\n(کران %d نویسه)</item>
</plurals>
<string name="action_set_caption">تنظیم عنوان</string>
<string name="action_remove">برداشتن</string>
<string name="lock_account_label">قفل حساب</string>
......@@ -352,7 +356,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s و %2$s</string>
<string name="conversation_more_recipients">%1$s، %2$s و %3$d بیش‌تر</string>
<string name="max_tab_number_reached">رسیده به بیشینهٔ %1$d زبانه</string>
<plurals name="max_tab_number_reached">
<item quantity="other">رسیده به بیشینهٔ %1$d زبانه</item>
</plurals>
<string name="description_status_media">رسانه: %s</string>
<string name="description_status_cw">هشدار محتوا: %s</string>
<string name="description_status_media_no_description_placeholder">بدون هیچ توضیحی</string>
......
......@@ -220,7 +220,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s et %4$d autres</string>
<string name="notification_summary_medium">%1$s, %2$s et %3$s</string>
<string name="notification_summary_small">%1$s et %2$s</string>
<string name="notification_title_summary">%d nouvelles interactions</string>
<plurals name="notification_title_summary">
<item quantity="other">%d nouvelles interactions</item>
</plurals>
<string name="description_account_locked">Compte verrouillé</string>
<string name="about_title_activity">À propos</string>
<string name="about_tusky_version">Tusky %s</string>
......@@ -285,8 +287,10 @@
<string name="action_remove_from_list">Supprimer un compte de la liste</string>
<string name="compose_active_account_description">Publier avec le compte %1$s</string>
<string name="error_failed_set_caption">Impossible de définir la légende</string>
<string name="hint_describe_for_visually_impaired">Décrire pour les malvoyants
\n(%d caractères maximum)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Décrire pour les malvoyants
\n(%d caractères maximum)</item>
</plurals>
<string name="action_set_caption">Mettre une légende</string>
<string name="action_remove">Supprimer le média</string>
<string name="lock_account_label">Verrouiller le compte</string>
......@@ -343,7 +347,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s et %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s et %3$d autres</string>
<string name="max_tab_number_reached">nombre maximum d\'onglets %1$d atteint</string>
<plurals name="max_tab_number_reached">
<item quantity="other">nombre maximum d\'onglets %1$d atteint</item>
</plurals>
<string name="description_status_media"> Média : %s
</string>
<string name="description_status_cw"> Avertissement : %s
......@@ -499,7 +505,9 @@
<string name="notification_subscription_format">%s vient de publier</string>
<string name="review_notifications">Examiner les notifications</string>
<string name="notification_subscription_name">Nouveau pouets</string>
<string name="error_upload_max_media_reached">Vous ne pouvez pas téléverser plus de %1$d pièces jointes.</string>
<plurals name="error_upload_max_media_reached">
<item quantity="other">Vous ne pouvez pas téléverser plus de %1$d pièces jointes.</item>
</plurals>
<string name="pref_title_wellbeing_mode">Bien-être</string>
<string name="notification_subscription_description">Notifications quand quelqu\'un que vous suivez publie un nouveau pouet</string>
<string name="limit_notifications">Limiter les notifications de la timeline</string>
......
......@@ -190,7 +190,9 @@
<string name="about_powered_by_tusky">Cumhachtaithe ag Tusky</string>
<string name="about_tusky_version">Tusky %s</string>
<string name="description_account_locked">Cuntas faoi Ghlas</string>
<string name="notification_title_summary">%d idirghníomhaíochtaí nua</string>
<plurals name="notification_title_summary">
<item quantity="other">%d idirghníomhaíochtaí nua</item>
</plurals>
<string name="notification_summary_small">%1$s agus %2$s</string>
<string name="notification_summary_medium">%1$s, %2$s, agus %3$s</string>
<string name="notification_summary_large">%1$s, %2$s, %3$s agus %4$d cinn eile</string>
......@@ -290,7 +292,9 @@
<string name="caption_notoemoji">Sraith emoji reatha Google</string>
<string name="license_description">Tá cód agus sócmhainní ó na tionscadail foinse oscailte seo a leanas i Tusky:</string>
<string name="label_remote_account">Féadfaidh an fhaisnéis thíos próifíl an úsáideora a léiriú go neamhiomlán. Brúigh chun próifíl iomlán a oscailt sa bhrabhsálaí.</string>
<string name="max_tab_number_reached">uasmhéid de chluaisíní %1$d sroichte</string>
<plurals name="max_tab_number_reached">
<item quantity="other">uasmhéid de chluaisíní %1$d sroichte</item>
</plurals>
<string name="description_poll">Vótaíocht le roghanna: %1$s, %2$s, %3$s, %4$s; %5$s</string>
<string name="list">Liosta</string>
<string name="compose_shortcut_long_label">Cumadh Tút</string>
......@@ -319,8 +323,10 @@
<string name="action_remove_from_list">Bain cuntas ón liosta</string>
<string name="compose_active_account_description">Postáil le cuntas %1$s</string>
<string name="error_failed_set_caption">Theip ar an bhfotheideal a shocrú</string>
<string name="hint_describe_for_visually_impaired">Déan cur síos ar dhaoine lagamhairc
\n(teorainn carachtar %d)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Déan cur síos ar dhaoine lagamhairc
\n(teorainn carachtar %d)</item>
</plurals>
<string name="action_set_caption">Socraigh fotheideal</string>
<string name="action_remove">Bain</string>
<string name="lock_account_label">Cuntas glasála</string>
......
......@@ -74,7 +74,9 @@
<string name="duration_5_min">5 mionaidean</string>
<string name="duration_indefinite">Gun chrìoch</string>
<string name="label_duration">Faide</string>
<string name="error_upload_max_media_reached">Chan urrainn dhut barrachd air %1$d ceanglacha(i)n meadhain a luchdadh suas.</string>
<plurals name="error_upload_max_media_reached">
<item quantity="other">Chan urrainn dhut barrachd air %1$d ceanglacha(i)n meadhain a luchdadh suas.</item>
</plurals>
<string name="wellbeing_hide_stats_profile">Falaich an stadastaireachd àireamhail air pròifilean</string>
<string name="wellbeing_hide_stats_posts">Falaich an stadastaireachd àireamhail air postaichean</string>
<string name="limit_notifications">Cuingich na brathan mun loidhne-ama</string>
......@@ -184,7 +186,9 @@
<string name="description_status_media_no_description_placeholder">Gun tuairisgeul</string>
<string name="description_status_cw">Rabhadh susbainte: %s</string>
<string name="description_status_media">Meadhan: %s</string>
<string name="max_tab_number_reached">ràinig thu na tha ceadaichte dhe %1$d taba(ichean)</string>
<plurals name="max_tab_number_reached">
<item quantity="other">ràinig thu na tha ceadaichte dhe %1$d taba(ichean)</item>
</plurals>
<string name="conversation_more_recipients">%1$s, %2$s ’s %3$d eile</string>
<string name="conversation_1_recipients">%1$s</string>
<string name="title_favourited_by">’Na annsachd aig</string>
......@@ -243,8 +247,10 @@
<string name="lock_account_label_description">Feumaidh tu gabhail ri luchd-leantainn ùr a làimh</string>
<string name="lock_account_label">Glais an cunntas</string>
<string name="action_set_caption">Suidhidh am fo-thiotal</string>
<string name="hint_describe_for_visually_impaired">Mìnich e dhan fheadhainn air a bheil cion-lèirsinn
\n(%d caractar(an) air a char as fhaide)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Mìnich e dhan fheadhainn air a bheil cion-lèirsinn
\n(%d caractar(an) air a char as fhaide)</item>
</plurals>
<string name="error_failed_set_caption">Cha deach leinn am fo-thiotal a shuidheachadh</string>
<string name="compose_active_account_description">A’ postadh leis a’ chunntas %1$s</string>
<string name="action_remove_from_list">Thoir an cunntas air falbh on liosta</string>
......@@ -325,7 +331,9 @@
<string name="about_powered_by_tusky">Le cumhachd Tusky</string>
<string name="about_tusky_version">Tusky %s</string>
<string name="description_account_locked">Cunntas glaiste</string>
<string name="notification_title_summary">%d eadar-ghabhail(ean) ùr(a)</string>
<plurals name="notification_title_summary">
<item quantity="other">%d eadar-ghabhail(ean) ùr(a)</item>
</plurals>
<string name="notification_summary_small">%1$s ’s %2$s</string>
<string name="notification_summary_medium">%1$s, %2$s ’s %3$s</string>
<string name="notification_summary_large">%1$s, %2$s, %3$s ’s %4$d eile</string>
......
......@@ -200,7 +200,9 @@
<string name="description_status_media_no_description_placeholder">Sen descrición</string>
<string name="description_status_cw">Aviso sobre o contido: %s</string>
<string name="description_status_media">Multimedia: %s</string>
<string name="max_tab_number_reached">acadouse o máximo de %1$d lapelas</string>
<plurals name="max_tab_number_reached">
<item quantity="other">acadouse o máximo de %1$d lapelas</item>
</plurals>
<string name="conversation_more_recipients">%1$s, %2$s e %3$d máis</string>
<string name="conversation_2_recipients">%1$s e %2$s</string>
<string name="title_favourited_by">Favorecido por</string>
......@@ -257,8 +259,10 @@
<string name="lock_account_label">Bloquear conta</string>
<string name="action_remove">Eliminar</string>
<string name="action_set_caption">Escribir descrición</string>
<string name="hint_describe_for_visually_impaired">Describe para persoas con problemas de visión
\n(%d caracteres como máximo)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Describe para persoas con problemas de visión
\n(%d caracteres como máximo)</item>
</plurals>
<string name="error_failed_set_caption">Fallou establecemento do texto</string>
<string name="compose_active_account_description">Publicar coa conta %1$s</string>
<string name="action_remove_from_list">Eliminar conta da listaxe</string>
......@@ -318,7 +322,9 @@
<string name="about_tusky_version">Tusky %s</string>
<string name="about_title_activity">Acerca de</string>
<string name="description_account_locked">Conta bloqueada</string>
<string name="notification_title_summary">%d novas interaccións</string>
<plurals name="notification_title_summary">
<item quantity="other">%d novas interaccións</item>
</plurals>
<string name="notification_summary_small">%1$s e %2$s</string>
<string name="notification_summary_medium">%1$s, %2$s, e %3$s</string>
<string name="notification_summary_large">%1$s, %2$s, %3$s e %4$d outras</string>
......@@ -435,7 +441,9 @@
\nAínda podes acceder aos antigos borradores a través do botón na pantalla de novos borradores, pero eliminarémolo en futuras actualizacións!</string>
<string name="drafts_toot_failed_to_send">Fallou o envío do toot!</string>
<string name="dialog_delete_list_warning">Tes a certeza de querer eliminar a listaxe %s\?</string>
<string name="error_upload_max_media_reached">Non podes subir máis de %1$d anexos multimedia.</string>
<plurals name="error_upload_max_media_reached">
<item quantity="other">Non podes subir máis de %1$d anexos multimedia.</item>
</plurals>
<string name="wellbeing_hide_stats_profile">Agochar estatísticas cuantitativas nos perfís</string>
<string name="wellbeing_hide_stats_posts">Agochar estatísticas cuantitativas nas publicacións</string>
<string name="limit_notifications">Limitar notificacións da cronoloxía</string>
......
......@@ -280,7 +280,9 @@
<string name="description_visiblity_unlisted">असूचीबद्ध</string>
<string name="description_visiblity_public">सार्वजनिक</string>
<string name="description_status_cw">विषय वस्तु चेतावनी: %s</string>
<string name="max_tab_number_reached">अधिकतम %1$d टैब तक पहुंच गऐ</string>
<plurals name="max_tab_number_reached">
<item quantity="other">अधिकतम %1$d टैब तक पहुंच गऐ</item>
</plurals>
<string name="conversation_more_recipients">%1$s, %2$s तथा %3$d अन्य लोग</string>
<string name="conversation_2_recipients">%1$s तथा %2$s</string>
<string name="conversation_1_recipients">%1$s</string>
......@@ -310,8 +312,10 @@
<string name="send_toot_notification_error_title">टूट भेजने में त्रुटि</string>
<string name="filter_dialog_remove_button">हटाएँ</string>
<string name="action_remove">हटा दें</string>
<string name="hint_describe_for_visually_impaired">दृष्टिहीन लोगों के लिए वर्णन करें
\n(%d वर्ण सीमा)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">दृष्टिहीन लोगों के लिए वर्णन करें
\n(%d वर्ण सीमा)</item>
</plurals>
<string name="error_failed_set_caption">कैप्शन सेट करने में विफल</string>
<string name="compose_active_account_description">%1$s खाते के साथ पोस्ट कर रहे</string>
<string name="action_remove_from_list">सूची से खाता निकालें</string>
......
......@@ -205,7 +205,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s és még %4$d</string>
<string name="notification_summary_medium">%1$s, %2$s meg %3$s</string>
<string name="notification_summary_small">%1$s és %2$s</string>
<string name="notification_title_summary">%d új interakció</string>
<plurals name="notification_title_summary">
<item quantity="other">%d új interakció</item>
</plurals>
<string name="description_account_locked">Zárolt fiók</string>
<string name="about_title_activity">Rólunk</string>
<string name="about_tusky_version">Tusky %s</string>
......@@ -273,7 +275,9 @@
<string name="title_reblogged_by">Megtolta</string>
<string name="title_favourited_by">Kedvencnek jelölte</string>
<string name="conversation_2_recipients">%1$s és %2$s</string>
<string name="max_tab_number_reached">elérted a fülek maximális számát (%1$d)</string>
<plurals name="max_tab_number_reached">
<item quantity="other">elérted a fülek maximális számát (%1$d)</item>
</plurals>
<string name="description_status_media_no_description_placeholder"> Nincs leírás
</string>
<string name="description_visiblity_public">Nyilvános </string>
......@@ -338,8 +342,10 @@
<string name="action_remove_from_list">Fiók eltávolítása a listából</string>
<string name="compose_active_account_description">Tülkölés %1$s fiókkal</string>
<string name="error_failed_set_caption">Cím beállítása nem sikerült</string>
<string name="hint_describe_for_visually_impaired">Leírás látássérülteknek
\n(%d karakter korlát)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Leírás látássérülteknek
\n(%d karakter korlát)</item>
</plurals>
<string name="action_set_caption">Cím beállítása</string>
<string name="lock_account_label_description">Minden követődet külön engedélyezned kell</string>
<string name="expand_collapse_all_statuses">Minden tülk kibontása/összecsukása</string>
......@@ -484,7 +490,9 @@
\nTovábbra is elérheted a régi piszkozataidat egy gombbal az új piszkozatok képernyőjén, de ezeket egy későbbi frissítésben el fogjuk törölni!</string>
<string name="drafts_toot_failed_to_send">Ez a tülk nem küldődött el!</string>
<string name="dialog_delete_list_warning">Tényleg le akarod törölni a %s listát\?</string>
<string name="error_upload_max_media_reached">Nem tölthetsz fel %1$d médiacsatolmányból többet.</string>
<plurals name="error_upload_max_media_reached">
<item quantity="other">Nem tölthetsz fel %1$d médiacsatolmányból többet.</item>
</plurals>
<string name="wellbeing_hide_stats_profile">Profilok mérőszámainak elrejtése</string>
<string name="wellbeing_hide_stats_posts">Tülkök mérőszámainak elrejtése</string>
<string name="limit_notifications">Idővonali értesítések korlátozása</string>
......
......@@ -243,7 +243,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s og %4$d til viðbótar</string>
<string name="notification_summary_medium">%1$s, %2$s og %3$s</string>
<string name="notification_summary_small">%1$s og %2$s</string>
<string name="notification_title_summary">%d nýjar aðgerðir</string>
<plurals name="notification_title_summary">
<item quantity="other">%d nýjar aðgerðir</item>
</plurals>
<string name="description_account_locked">Læstur notandaaðgangur</string>
<string name="about_tusky_version">Tusky %s</string>
<string name="about_powered_by_tusky">Keyrir á Tusky</string>
......@@ -298,8 +300,10 @@
<string name="action_remove_from_list">Fjarlægja notandaaðganginn af listanum</string>
<string name="compose_active_account_description">Sendi með notandaaðgangnum %1$s</string>
<string name="error_failed_set_caption">Ekki tókst að setja skýringatexta</string>
<string name="hint_describe_for_visually_impaired">Lýstu þessu fyrir sjónskerta
\n(hámark %d stafir)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Lýstu þessu fyrir sjónskerta
\n(hámark %d stafir)</item>
</plurals>
<string name="action_set_caption">Setja skýringatexta</string>
<string name="action_remove">Fjarlægja</string>
<string name="lock_account_label">Læsa notandaaðgangi</string>
......@@ -349,7 +353,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s og %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s og %3$d til viðbótar</string>
<string name="max_tab_number_reached">hámarksfjölda %1$d flipa náð</string>
<plurals name="max_tab_number_reached">
<item quantity="other">hámarksfjölda %1$d flipa náð</item>
</plurals>
<string name="description_status_media">Myndefni: %s</string>
<string name="description_status_cw">Aðvörun vegna efnis: %s</string>
<string name="description_status_media_no_description_placeholder">Engin lýsing</string>
......@@ -489,7 +495,9 @@
<string name="dialog_delete_list_warning">Ertu viss um að þú viljir eyða %s listanum\?</string>
<string name="duration_indefinite">Ótiltekið</string>
<string name="label_duration">Tímalengd</string>
<string name="error_upload_max_media_reached">Þú getur ekki sent inn fleiri en %1$d myndefnisviðhengi.</string>
<plurals name="error_upload_max_media_reached">
<item quantity="other">Þú getur ekki sent inn fleiri en %1$d myndefnisviðhengi.</item>
</plurals>
<string name="wellbeing_hide_stats_profile">Fela magntölfræði notendasniða</string>
<string name="wellbeing_hide_stats_posts">Fela magntölfræði færslna</string>
<string name="limit_notifications">Takmarka tilkynningar á tímalínu</string>
......
......@@ -216,7 +216,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s e %4$d altri</string>
<string name="notification_summary_medium">%1$s, %2$s e %3$s</string>
<string name="notification_summary_small">%1$s e %2$s</string>
<string name="notification_title_summary">%d nuove interazioni</string>
<plurals name="notification_title_summary">
<item quantity="other">%d nuove interazioni</item>
</plurals>
<string name="description_account_locked">Account bloccato</string>
<string name="about_title_activity">A proposito</string>
<string name="about_tusky_version">Tusky %s</string>
......@@ -279,7 +281,9 @@
<string name="action_remove_from_list">Rimuovi un account dalla lista</string>
<string name="compose_active_account_description">Pubblicando con l\'account %1$s</string>
<string name="error_failed_set_caption">Impostazione del sottotitolo non riuscita</string>
<string name="hint_describe_for_visually_impaired">Descrivi per ipovedenti\n(limite di %d caratteri)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Descrivi per ipovedenti\n(limite di %d caratteri)</item>
</plurals>
<string name="action_set_caption">Inserisci descrizione</string>
<string name="action_remove">Rimuovi</string>
<string name="lock_account_label">Blocca account</string>
......@@ -336,7 +340,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s e %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s ed altri %3$d</string>
<string name="max_tab_number_reached">limite massimo di %1$d tab raggiunto</string>
<plurals name="max_tab_number_reached">
<item quantity="other">limite massimo di %1$d tab raggiunto</item>
</plurals>
<string name="description_status_media"> Media: %s
</string>
<string name="description_status_cw"> Contenuto sensibile: %s
......@@ -492,5 +498,7 @@
<string name="notification_subscription_name">Nuovi toots</string>
<string name="pref_title_notification_filter_subscriptions">qualcuno a cui sono iscritto ha pubblicato un nuovo toot</string>
<string name="notification_subscription_format">%s appena pubblicato</string>
<string name="error_upload_max_media_reached">Non puoi caricare più di %1$d allegati multimediali.</string>
<plurals name="error_upload_max_media_reached">
<item quantity="other">Non puoi caricare più di %1$d allegati multimediali.</item>
</plurals>
</resources>
\ No newline at end of file
......@@ -206,7 +206,9 @@
<string name="notification_summary_large">%1$sさん、%2$sさん、%3$sさんと他%4$d人</string>
<string name="notification_summary_medium">%1$sさん、%2$sさん、%3$sさん</string>
<string name="notification_summary_small">%1$sさん、%2$sさん</string>
<string name="notification_title_summary">%d件の新しい通知</string>
<plurals name="notification_title_summary">
<item quantity="other">%d件の新しい通知</item>
</plurals>
<string name="description_account_locked">非公開アカウント</string>
<string name="about_title_activity">このアプリについて</string>
<string name="about_tusky_version">Tusky %s</string>
......@@ -258,7 +260,9 @@
<string name="action_rename_list">リスト名の変更</string>
<string name="compose_active_account_description">%1$sで投稿</string>
<string name="error_failed_set_caption">説明の設定に失敗しました</string>
<string name="hint_describe_for_visually_impaired">視覚障害者のための説明 (%d文字まで)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">視覚障害者のための説明 (%d文字まで)</item>
</plurals>
<string name="action_set_caption">説明を設定</string>
<string name="action_remove">消去</string>
<string name="lock_account_label">アカウントをロック</string>
......@@ -310,7 +314,9 @@
</plurals>
<string name="title_reblogged_by">ブーストした人物</string>
<string name="title_favourited_by">お気に入りした人物</string>
<string name="max_tab_number_reached">タブは %1$d 個が上限です</string>
<plurals name="max_tab_number_reached">
<item quantity="other">タブは %1$d 個が上限です</item>
</plurals>
<string name="description_visiblity_public"> 公開
</string>
<string name="description_visiblity_unlisted"> 未収載
......
......@@ -230,7 +230,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s, 그 외 %4$d개</string>
<string name="notification_summary_medium">%1$s님, %2$s님, %3$s님</string>
<string name="notification_summary_small">%1$s와 %2$s</string>
<string name="notification_title_summary">%d개의 새로운 알림이 있습니다</string>
<plurals name="notification_title_summary">
<item quantity="other">%d개의 새로운 알림이 있습니다</item>
</plurals>
<string name="description_account_locked">계정 잠김</string>
<string name="about_title_activity">이 앱에 관하여</string>
<string name="about_tusky_version">Tusky %s</string>
......@@ -293,8 +295,10 @@
<string name="action_remove_from_list">리스트에서 계정 삭제</string>
<string name="compose_active_account_description">%1$s로서 포스팅</string>
<string name="error_failed_set_caption">미디어에 대한 설명을 추가할 수 없습니다</string>
<string name="hint_describe_for_visually_impaired">시각 장애인을 위한 설명
\n(%d글자 작성 가능)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">시각 장애인을 위한 설명
\n(%d글자 작성 가능)</item>
</plurals>
<string name="action_set_caption">설명 추가</string>
<string name="action_remove">삭제</string>
<string name="lock_account_label">계정 잠금</string>
......@@ -350,7 +354,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s와 %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s 외 %3$d명</string>
<string name="max_tab_number_reached">최대 탭 수 %1$d에 도달했습니다</string>
<plurals name="max_tab_number_reached">
<item quantity="other">최대 탭 수 %1$d에 도달했습니다</item>
</plurals>
<string name="description_status_media">미디어: %s</string>
<string name="description_status_cw">열람주의: %s</string>
<string name="description_status_media_no_description_placeholder">설명 없음</string>
......
......@@ -215,7 +215,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s en %4$d anderen</string>
<string name="notification_summary_medium">%1$s, %2$s en %3$s</string>
<string name="notification_summary_small">%1$s en %2$s</string>
<string name="notification_title_summary">%d nieuwe interacties</string>
<plurals name="notification_title_summary">
<item quantity="other">%d nieuwe interacties</item>
</plurals>
<string name="description_account_locked">Besloten account</string>
<string name="about_title_activity">Over</string>
<string name="about_tusky_version">Tusky %s</string>
......@@ -259,7 +261,9 @@
<string name="title_list_timeline">Tijdlijn lijst</string>
<string name="compose_active_account_description">Aan het publiceren met account %1$s</string>
<string name="error_failed_set_caption">Toevoegen van beschrijving mislukt</string>
<string name="hint_describe_for_visually_impaired">Omschrijf dit voor mensen met een visuele beperking\n(tekenlimiet is %d)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Omschrijf dit voor mensen met een visuele beperking\n(tekenlimiet is %d)</item>
</plurals>
<string name="action_set_caption">Beschrijving toevoegen</string>
<string name="action_remove">Verwijderen</string>
<string name="lock_account_label">Account besloten maken</string>
......@@ -316,7 +320,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s en %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s en %3$d meer</string>
<string name="max_tab_number_reached">maximum van %1$d tabs bereikt</string>
<plurals name="max_tab_number_reached">
<item quantity="other">maximum van %1$d tabs bereikt</item>
</plurals>
<string name="description_status_media"> Media: %s
</string>
<string name="description_status_cw"> Inhoudswaarschuwing: %s
......
......@@ -202,7 +202,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s og %4$d anre</string>
<string name="notification_summary_medium">%1$s, %2$s, og %3$s</string>
<string name="notification_summary_small">%1$s og %2$s</string>
<string name="notification_title_summary">%d nye interaksjoner</string>
<plurals name="notification_title_summary">
<item quantity="other">%d nye interaksjoner</item>
</plurals>
<string name="description_account_locked">Låst konto</string>
<string name="about_title_activity">Om</string>
<string name="about_tusky_version">Tusky %s</string>
......@@ -259,8 +261,10 @@
<string name="abbreviated_in_years">om %dy</string>
<string name="compose_active_account_description">Poster med konto %1$s</string>
<string name="error_failed_set_caption">Klarte ikke å sette bildetekst</string>
<string name="hint_describe_for_visually_impaired">Beskriv for de med nedsatt synsevne
\n(maks %d tegn)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Beskriv for de med nedsatt synsevne
\n(maks %d tegn)</item>
</plurals>
<string name="action_set_caption">Sett bildetekst</string>
<string name="action_remove">Slett</string>
<string name="lock_account_label">Lås konto</string>
......@@ -317,7 +321,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s og %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s og %3$d fler</string>
<string name="max_tab_number_reached">grensen på %1$d faner er nådd</string>
<plurals name="max_tab_number_reached">
<item quantity="other">grensen på %1$d faner er nådd</item>
</plurals>
<string name="description_status_media">Media: %s</string>
<string name="description_status_cw">Innholdsadvarsel: %s</string>
<string name="description_status_media_no_description_placeholder">Ingen beskrivelse</string>
......@@ -483,7 +489,9 @@
<string name="notification_subscription_name">Nye toots</string>
<string name="pref_title_notification_filter_subscriptions">noen jeg følger publiserer en ny toot</string>
<string name="notification_subscription_format">%s tootet akkurat</string>
<string name="error_upload_max_media_reached">Du kan ikke laste opp flere enn %1$d mediavedlegg.</string>
<plurals name="error_upload_max_media_reached">
<item quantity="other">Du kan ikke laste opp flere enn %1$d mediavedlegg.</item>
</plurals>
<string name="duration_indefinite">Uendelig</string>
<string name="label_duration">Varighet</string>
<string name="dialog_delete_list_warning">Er du sikker på at du vil slette listen %s\?</string>
......
......@@ -185,7 +185,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s e %4$d mai</string>
<string name="notification_summary_medium">%1$s, %2$s e %3$s</string>
<string name="notification_summary_small">%1$s e %2$s</string>
<string name="notification_title_summary">%d interaccions nòvas</string>
<plurals name="notification_title_summary">
<item quantity="other">%d interaccions nòvas</item>
</plurals>
<string name="description_account_locked">Compte blocat</string>
<string name="about_title_activity">A prepaus</string>
<string name="about_tusky_license">Tusky es programa gratuït, liure e de còdi dobèrt.
......@@ -323,8 +325,10 @@
<string name="hint_search_people_list">Cercar lo monde que seguètz</string>
<string name="action_add_to_list">Ajustar un compte a la lista</string>
<string name="action_remove_from_list">Suprimir aqueste compte de la lista</string>
<string name="hint_describe_for_visually_impaired">Descriure pels mal vesents
\n(%d caractèrs maximum)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Descriure pels mal vesents
\n(%d caractèrs maximum)</item>
</plurals>
<string name="license_cc_by_4">CC-BY 4.0</string>
<string name="license_cc_by_sa_4">CC-BY-SA 4.0</string>
<plurals name="favs">
......@@ -340,7 +344,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s e %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s e %3$d mai</string>
<string name="max_tab_number_reached">nombre maximum d’onglets %1$d atengut</string>
<plurals name="max_tab_number_reached">
<item quantity="other">nombre maximum d’onglets %1$d atengut</item>
</plurals>
<string name="description_status_media">Mèdia : %s</string>
<string name="description_status_cw">Avertiment : %s</string>
<string name="description_status_media_no_description_placeholder">Cap de descripcion</string>
......
......@@ -182,7 +182,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s i %4$d innych</string>
<string name="notification_summary_medium">%1$s, %2$s, i %3$s</string>
<string name="notification_summary_small">%1$s i %2$s</string>
<string name="notification_title_summary">%d nowych powiadomień</string>
<plurals name="notification_title_summary">
<item quantity="other">%d nowych powiadomień</item>
</plurals>
<string name="description_account_locked">Konto zablokowane</string>
<string name="about_title_activity">O programie</string>
<string name="about_tusky_license">Tusky jest wolnym i otwartoźródłowym oprogramowaniem. Jest on dostępny na licencji GNU General Public License w wersji trzeciej. Możesz przeczytać przetłumaczoną treść licencji <a href="https://web.archive.org/web/20171024013739/http://itlaw.computerworld.pl/wp-content/uploads/2008/03/powszechna-licencja-publiczna-gnu_v2.pdf">tutaj</a></string>
......@@ -334,8 +336,10 @@
<string name="hint_search_people_list">Szukaj osób, które śledzisz</string>
<string name="action_add_to_list">Dodaj konto do listy</string>
<string name="action_remove_from_list">Usuń konto z listy</string>
<string name="hint_describe_for_visually_impaired">Wprowadź opis dla niewidomych i niedowidzących
\n(maksymalna długość: %d)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Wprowadź opis dla niewidomych i niedowidzących
\n(maksymalna długość: %d)</item>
</plurals>
<string name="caption_notoemoji">Aktualny zestaw emoji Google</string>
<string name="profile_badge_bot_text">Bot</string>
<string name="license_cc_by_4">CC-BY 4.0</string>
......@@ -360,7 +364,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s i %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s i %3$d innych</string>
<string name="max_tab_number_reached">maksymalna liczba zakładek (%1$d) osiągnięta</string>
<plurals name="max_tab_number_reached">
<item quantity="other">maksymalna liczba zakładek (%1$d) osiągnięta</item>
</plurals>
<string name="description_status_media">Media: %s</string>
<string name="description_status_cw">Ostrzeżenie o zawartości: %s</string>
<string name="description_status_media_no_description_placeholder">Brak opisu</string>
......
......@@ -202,7 +202,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s e %4$d outros</string>
<string name="notification_summary_medium">%1$s, %2$s, e %3$s</string>
<string name="notification_summary_small">%1$s e %2$s</string>
<string name="notification_title_summary">%d novas interações</string>
<plurals name="notification_title_summary">
<item quantity="other">%d novas interações</item>
</plurals>
<string name="description_account_locked">Conta trancada</string>
<string name="about_title_activity">Sobre</string>
<string name="about_tusky_version">Tusky %s</string>
......@@ -328,8 +330,10 @@
<string name="hint_search_people_list">Pesquisar pessoas que você segue</string>
<string name="action_add_to_list">Adicionar conta à lista</string>
<string name="action_remove_from_list">Remover conta da lista</string>
<string name="hint_describe_for_visually_impaired">Descrever para deficientes visuais
\n(até %d caracteres)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Descrever para deficientes visuais
\n(até %d caracteres)</item>
</plurals>
<string name="license_cc_by_4">CC-BY 4.0</string>
<string name="license_cc_by_sa_4">CC-BY-SA 4.0</string>
<string name="label_remote_account">As informações abaixo podem refletir incompletamente o perfil do usuário. Toque aqui para abrir o perfil completo no navegador.</string>
......@@ -346,7 +350,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s e %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s e %3$d outros</string>
<string name="max_tab_number_reached">excedeu o máximo de %1$d abas</string>
<plurals name="max_tab_number_reached">
<item quantity="other">excedeu o máximo de %1$d abas</item>
</plurals>
<string name="description_status_media">Mídia: %s</string>
<string name="description_status_cw">Aviso de Conteúdo: %s</string>
<string name="description_status_media_no_description_placeholder">Sem descrição</string>
......@@ -481,7 +487,9 @@
<string name="new_drafts_warning">A função de rascunhos no Tusky foi totalmente redesenhada para ser mais rápida, mais fácil e com menos erros.
\nÉ possível acessar rascunhos antigos através de um botão na tela de novos rascunhos, mas serão removidos numa futura atualização!</string>
<string name="old_drafts">Rascunhos antigos</string>
<string name="error_upload_max_media_reached">Não é possível anexar mais de %1$d arquivos de mídia.</string>
<plurals name="error_upload_max_media_reached">
<item quantity="other">Não é possível anexar mais de %1$d arquivos de mídia.</item>
</plurals>
<string name="wellbeing_hide_stats_profile">Ocultar status dos perfis</string>
<string name="wellbeing_hide_stats_posts">Ocultar status dos toots</string>
<string name="limit_notifications">Limitar notificações da linha do tempo</string>
......
......@@ -220,7 +220,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s и %4$d других</string>
<string name="notification_summary_medium">%1$s, %2$s, и %3$s</string>
<string name="notification_summary_small">%1$s и %2$s</string>
<string name="notification_title_summary">Новых событий: %d</string>
<plurals name="notification_title_summary">
<item quantity="other">Новых событий: %d</item>
</plurals>
<string name="description_account_locked">Закрытый аккаунт</string>
<string name="about_title_activity">О приложении</string>
<string name="about_tusky_version">Tusky %s</string>
......@@ -305,7 +307,9 @@
<string name="action_remove_from_list">Удалить аккаунт из списка</string>
<string name="compose_active_account_description">Отправка от имени %1$s</string>
<string name="error_failed_set_caption">Не удалось добавить подпись</string>
<string name="hint_describe_for_visually_impaired">Описание для слабовидящих\n(не более %d символов)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Описание для слабовидящих\n(не более %d символов)</item>
</plurals>
<string name="action_set_caption">Добавить подпись</string>
<string name="action_remove">Удалить</string>
<string name="lock_account_label">Закрыть аккаунт</string>
......@@ -366,7 +370,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s и %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s и ещё %3$d</string>
<string name="max_tab_number_reached">достигнут лимит в %1$d вкладок</string>
<plurals name="max_tab_number_reached">
<item quantity="other">достигнут лимит в %1$d вкладок</item>
</plurals>
<string name="description_status_media">
Медиафайл: %s
</string>
......
......@@ -247,7 +247,9 @@
<string name="about_tusky_version">टस्की %s</string>
<string name="about_title_activity">विज्ञप्तिः</string>
<string name="description_account_locked">कपाटितव्यक्तिविवरणलेखः</string>
<string name="notification_title_summary">%d नवपरस्परक्रियाः</string>
<plurals name="notification_title_summary">
<item quantity="other">%d नवपरस्परक्रियाः</item>
</plurals>
<string name="notification_summary_small">%1$s च %2$s च</string>
<string name="notification_summary_medium">%1$s, %2$s, तथैव %3$s</string>
<string name="notification_summary_large">%1$s, %2$s, %3$s तथा च %4$d अन्येऽपि</string>
......@@ -328,8 +330,10 @@
<string name="lock_account_label">लेखा अवरुध्यताम्</string>
<string name="action_remove">नश्यताम्</string>
<string name="action_set_caption">शीर्षकवाक्यं लिख्यताम्</string>
<string name="hint_describe_for_visually_impaired">दृष्ट्यां येषां समस्याऽस्ति तेषांं कृते विवरणम्
\n(%d परिमिता न्यूनाक्षरसङ्ख्या)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">दृष्ट्यां येषां समस्याऽस्ति तेषांं कृते विवरणम्
\n(%d परिमिता न्यूनाक्षरसङ्ख्या)</item>
</plurals>
<string name="error_failed_set_caption">शीर्षकवाक्यं लेखितुमशक्यम्</string>
<string name="compose_active_account_description">%1$s लेखया प्रकटनं क्रियते</string>
<string name="action_remove_from_list">सूच्याः लेखा नश्यताम्</string>
......@@ -449,7 +453,9 @@
<string name="description_status_media_no_description_placeholder">विवरणं नास्ति</string>
<string name="description_status_cw">विषयपूर्वसतर्कता: %s</string>
<string name="description_status_media">सामग्र्यः %s</string>
<string name="max_tab_number_reached">अधिकतमपीठिकासङ्ख्या %1$d भूता</string>
<plurals name="max_tab_number_reached">
<item quantity="other">अधिकतमपीठिकासङ्ख्या %1$d भूता</item>
</plurals>
<string name="conversation_more_recipients">%1$s, %2$s तथा %3$d अन्येऽपि</string>
<string name="conversation_2_recipients">%1$s तथैव %2$s</string>
<string name="title_favourited_by">निम्नमित्रस्य प्रीतिः</string>
......
......@@ -204,7 +204,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s in %4$d ostali</string>
<string name="notification_summary_medium">%1$s, %2$s in %3$s</string>
<string name="notification_summary_small">%1$s in %2$s</string>
<string name="notification_title_summary">%d novih interakcij</string>
<plurals name="notification_title_summary">
<item quantity="other">%d novih interakcij</item>
</plurals>
<string name="description_account_locked">Zaklenjen račun</string>
<string name="about_title_activity">O aplikaciji</string>
<string name="about_tusky_version">Tusky %s</string>
......@@ -258,8 +260,10 @@
<string name="action_remove_from_list">Odstrani račun iz seznama</string>
<string name="compose_active_account_description">Objavljanje z računom %1$s</string>
<string name="error_failed_set_caption">Opisa ni bilo mogoče nastaviti</string>
<string name="hint_describe_for_visually_impaired">Opišite za slabovidne
\n(omejitev znakov - %d)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Opišite za slabovidne
\n(omejitev znakov - %d)</item>
</plurals>
<string name="action_set_caption">Nastavi opis</string>
<string name="action_remove">Odstrani</string>
<string name="lock_account_label">Zakleni račun</string>
......@@ -314,7 +318,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s in %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s in %3$d več</string>
<string name="max_tab_number_reached">doseženih maksimalnih %1$d zavihkov</string>
<plurals name="max_tab_number_reached">
<item quantity="other">doseženih maksimalnih %1$d zavihkov</item>
</plurals>
<string name="description_status_media">Mediji: %s</string>
<string name="description_status_cw">Opozorila o vsebini: %s</string>
<string name="description_status_media_no_description_placeholder">Brez opisa</string>
......
......@@ -217,7 +217,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s och %4$d andra</string>
<string name="notification_summary_medium">%1$s, %2$s, och %3$s</string>
<string name="notification_summary_small">%1$s och %2$s</string>
<string name="notification_title_summary">%d nya interaktioner</string>
<plurals name="notification_title_summary">
<item quantity="other">%d nya interaktioner</item>
</plurals>
<string name="description_account_locked">Låst konto</string>
<string name="about_title_activity">Om</string>
<string name="about_tusky_version">Tusky %s</string>
......@@ -280,7 +282,9 @@
<string name="action_remove_from_list">Ta bort kontot från listan</string>
<string name="compose_active_account_description">Inlägg med kontot %1$s</string>
<string name="error_failed_set_caption">Misslyckades med att ange bildtext</string>
<string name="hint_describe_for_visually_impaired">Beskriv för synskadade\n(%d teckengräns)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Beskriv för synskadade\n(%d teckengräns)</item>
</plurals>
<string name="action_set_caption">Ange bildtext</string>
<string name="action_remove">Ta bort</string>
<string name="lock_account_label">Lås konto</string>
......@@ -337,7 +341,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s och %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s och %3$d mer</string>
<string name="max_tab_number_reached">max antal flikar %1$d uppnådd</string>
<plurals name="max_tab_number_reached">
<item quantity="other">max antal flikar %1$d uppnådd</item>
</plurals>
<string name="description_status_media"> Media: %s
</string>
<string name="description_status_cw">Innehållsvarning: %s</string>
......
......@@ -171,7 +171,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s மற்றும் %4$d மற்றவர்கள்</string>
<string name="notification_summary_medium">%1$s, %2$s, மற்றும் %3$s</string>
<string name="notification_summary_small">%1$s மற்றும் %2$s</string>
<string name="notification_title_summary">%d புதிய ஊடாடுதல்</string>
<plurals name="notification_title_summary">
<item quantity="other">%d புதிய ஊடாடுதல்</item>
</plurals>
<string name="description_account_locked">கணக்கு மூடப்பட்டது</string>
<string name="about_title_activity">பற்றி</string>
<string name="about_tusky_version">Tusky(டஸ்கி) %s</string>
......
......@@ -71,7 +71,9 @@
<string name="description_status_media_no_description_placeholder">ไม่มีคำอธิบาย</string>
<string name="description_status_cw">เตือนเนื้อหา : %s</string>
<string name="description_status_media">สื่อ: %s</string>
<string name="max_tab_number_reached">ถึงจำนวนแท็บสูงสุดคือ %1$d แล้ว</string>
<plurals name="max_tab_number_reached">
<item quantity="other">ถึงจำนวนแท็บสูงสุดคือ %1$d แล้ว</item>
</plurals>
<string name="conversation_more_recipients">%1$s, %2$s และอีก %3$d</string>
<string name="conversation_2_recipients">%1$s และ %2$s</string>
<string name="conversation_1_recipients">%1$s</string>
......@@ -128,8 +130,10 @@
<string name="action_remove">ลบ</string>
<string name="error_failed_set_caption">ตั้งคำอธิบายล้มเหลว</string>
<string name="action_set_caption">ตั้งคำอธิบาย</string>
<string name="hint_describe_for_visually_impaired">อธิบายเพื่อผู้บกพร่องทางสายตา
\n(จำกัด %d ตัวอักขระ)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">อธิบายเพื่อผู้บกพร่องทางสายตา
\n(จำกัด %d ตัวอักขระ)</item>
</plurals>
<string name="compose_active_account_description">โพสต์ด้วยบัญชี %1$s</string>
<string name="action_remove_from_list">ลบบัญชีออกจากรายการ</string>
<string name="action_add_to_list">เพิ่มบัญชีไปใส่รายการ</string>
......@@ -183,7 +187,9 @@
<string name="about_powered_by_tusky">ขับเคลื่อนด้วย Tusky</string>
<string name="about_tusky_version">Tusky %s</string>
<string name="description_account_locked">บัญชีไม่สาธารณะ</string>
<string name="notification_title_summary">การโต้ตอบใหม่จำนวน %d</string>
<plurals name="notification_title_summary">
<item quantity="other">การโต้ตอบใหม่จำนวน %d</item>
</plurals>
<string name="notification_summary_small">%1$s และ %2$s</string>
<string name="notification_summary_medium">%1$s, %2$s, และ %3$s</string>
<string name="notification_summary_large">%1$s, %2$s, %3$s และอีก %4$d คน</string>
......@@ -478,7 +484,9 @@
<string name="drafts_failed_loading_reply">ล้มเหลวในการโหลดข้อมูลตอบกลับ</string>
<string name="old_drafts">ฉบับร่างเก่า</string>
<string name="dialog_delete_list_warning">คุณต้องการลบลิสต์ %s ใช่ไหม\?</string>
<string name="error_upload_max_media_reached">คุณไม่สามารถอัปโหลดไฟล์แนบมากกว่า %1$d ได้</string>
<plurals name="error_upload_max_media_reached">
<item quantity="other">คุณไม่สามารถอัปโหลดไฟล์แนบมากกว่า %1$d ได้</item>
</plurals>
<string name="account_note_saved">บันทึกแล้ว!</string>
<string name="no_announcements">ไม่มีประกาศ</string>
<string name="duration_indefinite">ไม่มีกำหนด</string>
......
......@@ -201,7 +201,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s ve %4$d diğer</string>
<string name="notification_summary_medium">%1$s, %2$s ve %3$s</string>
<string name="notification_summary_small">%1$s ve %2$s</string>
<string name="notification_title_summary">%d yeni etkileşim</string>
<plurals name="notification_title_summary">
<item quantity="other">%d yeni etkileşim</item>
</plurals>
<string name="description_account_locked">Kitli Hesap</string>
<string name="about_title_activity">Hakkında</string>
<string name="about_tusky_version">Tusky %s</string>
......@@ -243,8 +245,10 @@
<string name="title_lists">Listeler</string>
<string name="title_list_timeline">Zaman çizelgesini listele</string>
<string name="compose_active_account_description">%1$s hesabıyla gönderiliyor</string>
<string name="hint_describe_for_visually_impaired">Görsel engelli için tanımla
\n(%d karakter limiti)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Görsel engelli için tanımla
\n(%d karakter limiti)</item>
</plurals>
<string name="action_set_caption">Başlık belirle</string>
<string name="action_remove">Kaldır</string>
<string name="lock_account_label">Hesabı Kilitle</string>
......@@ -299,7 +303,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s ve %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s ve %3$d daha fazlası</string>
<string name="max_tab_number_reached">%1$d maksimum sekme sayısına ulaşıldı</string>
<plurals name="max_tab_number_reached">
<item quantity="other">%1$d maksimum sekme sayısına ulaşıldı</item>
</plurals>
<string name="title_domain_mutes">Gizli alanadları</string>
<string name="action_unreblog">Boostu kaldır</string>
<string name="action_unfavourite">Favoriyi kaldır</string>
......
......@@ -186,8 +186,10 @@
<string name="compose_save_draft">Зберегти чернетку\?</string>
<string name="lock_account_label_description">Вимагає затвердження підписників власноруч</string>
<string name="action_set_caption">Додати підпис</string>
<string name="hint_describe_for_visually_impaired">Опис для людей з порушеннями зору
\n(до %d символів)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Опис для людей з порушеннями зору
\n(до %d символів)</item>
</plurals>
<string name="error_failed_set_caption">Не вдалося додати підпис</string>
<string name="action_unsubscribe_account">Відписатися</string>
<string name="action_subscribe_account">Підписатися</string>
......@@ -329,7 +331,9 @@
<string name="about_powered_by_tusky">Створено Tusky</string>
<string name="about_tusky_version">Tusky %s</string>
<string name="description_account_locked">Заблокований обліковий запис</string>
<string name="notification_title_summary">%d нових взаємодій</string>
<plurals name="notification_title_summary">
<item quantity="other">%d нових взаємодій</item>
</plurals>
<string name="conversation_more_recipients">%1$s, %2$s та ще %3$d</string>
<string name="conversation_2_recipients">%1$s та %2$s</string>
<string name="conversation_1_recipients">%1$s</string>
......@@ -456,7 +460,9 @@
\n Ви все ще можете отримати доступ до своїх старих чернеток за допомогою кнопки на екрані нових чернеток, але вони будуть вилучені в майбутньому оновленні!</string>
<string name="drafts_toot_failed_to_send">Не вдалося надіслати цей дмух!</string>
<string name="dialog_delete_list_warning">Ви дійсно хочете видалити список %s\?</string>
<string name="error_upload_max_media_reached">Ви не можете завантажити більше %1$d медіавкладень.</string>
<plurals name="error_upload_max_media_reached">
<item quantity="other">Ви не можете завантажити більше %1$d медіавкладень.</item>
</plurals>
<string name="wellbeing_hide_stats_profile">Приховати кількісну статистику профілів</string>
<string name="wellbeing_hide_stats_posts">Приховати кількісну статистику дописів</string>
<string name="limit_notifications">Обмеження сповіщень стрічки</string>
......@@ -493,7 +499,9 @@
<string name="description_visiblity_direct">Безпосередньо</string>
<string name="description_status_bookmarked">Додано до закладок</string>
<string name="description_status_reblogged">Просунуто</string>
<string name="max_tab_number_reached">досягнено обмеження %1$d вкладок</string>
<plurals name="max_tab_number_reached">
<item quantity="other">досягнено обмеження %1$d вкладок</item>
</plurals>
<plurals name="reblogs">
<item quantity="one"><b>%s</b> просування</item>
<item quantity="few"><b>%s</b> просування</item>
......
......@@ -5,7 +5,9 @@
<string name="send_toot_notification_cancel_title">Hủy đăng</string>
<string name="send_toot_notification_channel_name">Đăng Tút</string>
<string name="send_toot_notification_title">Đang đăng…</string>
<string name="notification_title_summary">%d tương tác mới</string>
<plurals name="notification_title_summary">
<item quantity="other">%d tương tác mới</item>
</plurals>
<string name="notification_summary_small">%1$s và %2$s</string>
<string name="notification_summary_medium">%1$s, %2$s, và %3$s</string>
<string name="notification_summary_large">%1$s, %2$s, %3$s và %4$d người khác</string>
......@@ -383,7 +385,9 @@
<string name="description_status_reblogged">Đã chia sẻ</string>
<string name="description_status_media_no_description_placeholder">Không có mô tả</string>
<string name="description_status_cw">Nội dung nhạy cảm: %s</string>
<string name="max_tab_number_reached">tối đa %1$d tab</string>
<plurals name="max_tab_number_reached">
<item quantity="other">tối đa %1$d tab</item>
</plurals>
<string name="conversation_more_recipients">%1$s, %2$s và %3$d người nữa</string>
<string name="conversation_2_recipients">%1$s và %2$s</string>
<string name="conversation_1_recipients">%1$s</string>
......@@ -433,8 +437,10 @@
<string name="lock_account_label">Tài khoản riêng tư</string>
<string name="action_remove">Hủy bỏ</string>
<string name="action_set_caption">Mô tả</string>
<string name="hint_describe_for_visually_impaired">Mô tả dành cho người khiếm thị
\n(giới hạn %d chữ)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Mô tả dành cho người khiếm thị
\n(giới hạn %d chữ)</item>
</plurals>
<string name="compose_active_account_description">Đăng bằng tài khoản %1$s</string>
<string name="action_add_to_list">Thêm tài khoản vào danh sách</string>
<string name="action_remove_from_list">Xóa tài khoản khỏi danh sách</string>
......@@ -475,7 +481,9 @@
<string name="notification_subscription_name">Tút mới</string>
<string name="pref_title_notification_filter_subscriptions">người tôi đăng ký theo dõi đăng tút mới</string>
<string name="notification_subscription_format">%s vừa đăng tút</string>
<string name="error_upload_max_media_reached">Bạn không thể đính kèm quá %1$d tệp.</string>
<plurals name="error_upload_max_media_reached">
<item quantity="other">Bạn không thể đính kèm quá %1$d tệp.</item>
</plurals>
<string name="duration_indefinite">Vĩnh viễn</string>
<string name="label_duration">Thời hạn</string>
<string name="dialog_delete_list_warning">Bạn thật sự muốn xóa danh sách %s\?</string>
......
......@@ -223,7 +223,9 @@
<string name="notification_summary_large">%1$s,%2$s,%3$s 和 %4$d 等人</string>
<string name="notification_summary_medium">%1$s,%2$s 和 %3$s</string>
<string name="notification_summary_small">%1$s 和 %2$s</string>
<string name="notification_title_summary">%d 个新互动</string>
<plurals name="notification_title_summary">
<item quantity="other">%d 个新互动</item>
</plurals>
<string name="description_account_locked">锁嘟用户</string>
<string name="about_title_activity">关于 Tusky</string>
<string name="about_tusky_version">Tusky %s</string>
......@@ -288,8 +290,10 @@
<string name="action_remove_from_list">从列表中移除用户</string>
<string name="compose_active_account_description">以 %1$s 发布嘟文</string>
<string name="error_failed_set_caption">设置图片标题失败</string>
<string name="hint_describe_for_visually_impaired">为视觉障碍用户提供的描述
\n(限制 %d 字)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">为视觉障碍用户提供的描述
\n(限制 %d 字)</item>
</plurals>
<string name="action_set_caption">设置图片标题</string>
<string name="action_remove">移除</string>
<string name="lock_account_label">保护你的帐户(锁嘟)</string>
......@@ -345,7 +349,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s 和 %2$s</string>
<string name="conversation_more_recipients">%1$s,%2$s 和 %3$d 等人</string>
<string name="max_tab_number_reached">标签页不能超过 %1$d 个</string>
<plurals name="max_tab_number_reached">
<item quantity="other">标签页不能超过 %1$d 个</item>
</plurals>
<string name="description_status_media">媒体:%s</string>
<string name="description_status_cw">内容提醒:%s</string>
<string name="description_status_media_no_description_placeholder">
......@@ -491,7 +497,9 @@
\n 旧草稿依然可以通过新草稿页面的按钮查看,但他们将在未来版本中移除!</string>
<string name="drafts_toot_failed_to_send">嘟文发送失败!</string>
<string name="dialog_delete_list_warning">确认删除列表 %s?</string>
<string name="error_upload_max_media_reached">最多只可上传 %1$d 个媒体附件</string>
<plurals name="error_upload_max_media_reached">
<item quantity="other">最多只可上传 %1$d 个媒体附件</item>
</plurals>
<string name="wellbeing_hide_stats_profile">隐藏账号的统计信息</string>
<string name="review_notifications">反馈通知</string>
<string name="wellbeing_hide_stats_posts">隐藏嘟文的统计信息</string>
......@@ -507,8 +515,7 @@
<string name="duration_indefinite">永久</string>
<string name="label_duration">持续时间</string>
<plurals name="poll_info_people">
<item quantity="one">%s 人</item>
<item quantity="other"></item>
<item quantity="other">%s 人</item>
</plurals>
<string name="status_media_attachments">附件</string>
<string name="status_media_audio">音频</string>
......
......@@ -223,7 +223,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s 和 %4$d 人</string>
<string name="notification_summary_medium">%1$s, %2$s, 和 %3$s</string>
<string name="notification_summary_small">%1$s 和 %2$s</string>
<string name="notification_title_summary">%d 個新互動</string>
<plurals name="notification_title_summary">
<item quantity="other">%d 個新互動</item>
</plurals>
<string name="description_account_locked">鎖嘟用戶</string>
<string name="about_title_activity">關於 Tusky</string>
<string name="about_tusky_license">Tusky 是基於 GNU General Public License Version 3 許可證開源的自由軟體完整的許可證協議:https://www.gnu.org/licenses/gpl-3.0.en.html</string>
......@@ -287,7 +289,9 @@
<string name="action_remove_from_list">從列表中移除用戶</string>
<string name="compose_active_account_description">以 %1$s 發嘟文</string>
<string name="error_failed_set_caption">設定圖片標題失敗</string>
<string name="hint_describe_for_visually_impaired">為視覺障礙用戶提供的描述\n(限制 %d 字)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">為視覺障礙用戶提供的描述\n(限制 %d 字)</item>
</plurals>
<string name="action_set_caption">設定圖片標題</string>
<string name="action_remove">移除</string>
<string name="lock_account_label">保護你的帳戶(鎖嘟)</string>
......@@ -343,7 +347,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s 和 %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s 和 %3$d 等人</string>
<string name="max_tab_number_reached">標籤頁不能超過 %1$d 個</string>
<plurals name="max_tab_number_reached">
<item quantity="other">標籤頁不能超過 %1$d 個</item>
</plurals>
<string name="description_status_media">
媒體: %s
</string>
......@@ -448,7 +454,9 @@
<string name="old_drafts">舊的草稿</string>
<string name="drafts_toot_failed_to_send">這條嘟文發送失敗!</string>
<string name="dialog_delete_list_warning">你確定要刪除列表 %s?</string>
<string name="error_upload_max_media_reached">你無法上傳超過 %1$d 媒體附件。</string>
<plurals name="error_upload_max_media_reached">
<item quantity="other">你無法上傳超過 %1$d 媒體附件。</item>
</plurals>
<string name="account_note_saved">已儲存!</string>
<string name="account_note_hint">你對此帳號的個人註記</string>
<string name="pref_title_hide_top_toolbar">隱藏頂端工具列的標題</string>
......@@ -485,8 +493,7 @@
<string name="button_back">返回</string>
<string name="button_continue">繼續</string>
<plurals name="poll_info_people">
<item quantity="one">%s 人</item>
<item quantity="other"></item>
<item quantity="other">%s 人</item>
</plurals>
<string name="list">列表</string>
<string name="select_list_title">選擇列表</string>
......
......@@ -217,7 +217,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s 和 %4$d 人</string>
<string name="notification_summary_medium">%1$s, %2$s, 和 %3$s</string>
<string name="notification_summary_small">%1$s 和 %2$s</string>
<string name="notification_title_summary">%d 個新互動</string>
<plurals name="notification_title_summary">
<item quantity="other">%d 個新互動</item>
</plurals>
<string name="description_account_locked">鎖嘟用戶</string>
<string name="about_title_activity">關於 Tusky</string>
<string name="about_tusky_license">Tusky 是基於 GNU General Public License Version 3 許可證開源的自由軟體完整的許可證協議:https://www.gnu.org/licenses/gpl-3.0.en.html</string>
......@@ -281,7 +283,9 @@
<string name="action_remove_from_list">從列表中移除用戶</string>
<string name="compose_active_account_description">以 %1$s 發嘟文</string>
<string name="error_failed_set_caption">設定圖片標題失敗</string>
<string name="hint_describe_for_visually_impaired">為視覺障礙用戶提供的描述\n(限制 %d 字)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">為視覺障礙用戶提供的描述\n(限制 %d 字)</item>
</plurals>
<string name="action_set_caption">設定圖片標題</string>
<string name="action_remove">移除</string>
<string name="lock_account_label">保護你的帳戶(鎖嘟)</string>
......@@ -337,7 +341,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s 和 %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s 和 %3$d 等人</string>
<string name="max_tab_number_reached">標籤頁不能超過 %1$d 個</string>
<plurals name="max_tab_number_reached">
<item quantity="other">標籤頁不能超過 %1$d 個</item>
</plurals>
<string name="description_status_media">
媒體: %s
</string>
......
......@@ -220,7 +220,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s 和 %4$d 人</string>
<string name="notification_summary_medium">%1$s, %2$s, 和 %3$s</string>
<string name="notification_summary_small">%1$s 和 %2$s</string>
<string name="notification_title_summary">%d 个新互动</string>
<plurals name="notification_title_summary">
<item quantity="other">%d 个新互动</item>
</plurals>
<string name="description_account_locked">锁嘟用户</string>
<string name="about_title_activity">关于 Tusky</string>
<string name="about_tusky_version">Tusky %s</string>
......@@ -285,7 +287,9 @@
<string name="action_remove_from_list">从列表中移除用户</string>
<string name="compose_active_account_description">以 %1$s 发布嘟文</string>
<string name="error_failed_set_caption">设置图片标题失败</string>
<string name="hint_describe_for_visually_impaired">为视觉障碍用户提供的描述\n(限制 %d 字)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">为视觉障碍用户提供的描述\n(限制 %d 字)</item>
</plurals>
<string name="action_set_caption">设置图片标题</string>
<string name="action_remove">移除</string>
<string name="lock_account_label">保护你的帐户(锁嘟)</string>
......@@ -341,7 +345,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s 和 %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s 和 %3$d 等人</string>
<string name="max_tab_number_reached">标签页不能超过 %1$d 个</string>
<plurals name="max_tab_number_reached">
<item quantity="other">标签页不能超过 %1$d 个</item>
</plurals>
<string name="description_status_media">
媒体: %s
</string>
......
......@@ -223,7 +223,9 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s 和 %4$d 人</string>
<string name="notification_summary_medium">%1$s, %2$s, 和 %3$s</string>
<string name="notification_summary_small">%1$s 和 %2$s</string>
<string name="notification_title_summary">%d 個新互動</string>
<plurals name="notification_title_summary">
<item quantity="other">%d 個新互動</item>
</plurals>
<string name="description_account_locked">鎖嘟用戶</string>
<string name="about_title_activity">關於 Tusky</string>
<string name="about_tusky_license">Tusky 是基於 GNU General Public License Version 3 許可證開源的自由軟體完整的許可證協議:https://www.gnu.org/licenses/gpl-3.0.en.html</string>
......@@ -287,7 +289,9 @@
<string name="action_remove_from_list">從列表中移除用戶</string>
<string name="compose_active_account_description">以 %1$s 發嘟文</string>
<string name="error_failed_set_caption">設定圖片標題失敗</string>
<string name="hint_describe_for_visually_impaired">為視覺障礙用戶提供的描述\n(限制 %d 字)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">為視覺障礙用戶提供的描述\n(限制 %d 字)</item>
</plurals>
<string name="action_set_caption">設定圖片標題</string>
<string name="action_remove">移除</string>
<string name="lock_account_label">保護你的帳戶(鎖嘟)</string>
......@@ -343,7 +347,9 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s 和 %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s 和 %3$d 等人</string>
<string name="max_tab_number_reached">標籤頁不能超過 %1$d 個</string>
<plurals name="max_tab_number_reached">
<item quantity="other">標籤頁不能超過 %1$d 個</item>
</plurals>
<string name="description_status_media">
媒體: %s
</string>
......@@ -449,8 +455,7 @@
\n推播通知不會受到影響,但你可以手動檢查你的通知設定。</string>
<string name="pref_title_wellbeing_mode">數位健康</string>
<plurals name="poll_info_people">
<item quantity="one">%s 人</item>
<item quantity="other"></item>
<item quantity="other">%s 人</item>
</plurals>
<string name="notification_subscription_format">%s 剛剛發了新嘟文</string>
<string name="notification_follow_request_format">%s 請求關注你</string>
......@@ -472,7 +477,9 @@
<string name="duration_5_min">5 分鐘</string>
<string name="duration_indefinite">無限期</string>
<string name="label_duration">期間</string>
<string name="error_upload_max_media_reached">你無法上傳超過 %1$d 媒體附件。</string>
<plurals name="error_upload_max_media_reached">
<item quantity="other">你無法上傳超過 %1$d 媒體附件。</item>
</plurals>
<string name="notification_subscription_description">當你關注的人發布新嘟文時通知</string>
<string name="notification_subscription_name">新嘟文</string>
<string name="pref_title_notification_filter_subscriptions">我關注的人有新嘟文</string>
......
......@@ -297,7 +297,10 @@
<string name="notification_summary_large">%1$s, %2$s, %3$s and %4$d others</string>
<string name="notification_summary_medium">%1$s, %2$s, and %3$s</string>
<string name="notification_summary_small">%1$s and %2$s</string>
<string name="notification_title_summary">%d new interactions</string>
<plurals name="notification_title_summary">
<item quantity="one">%d new interaction</item>
<item quantity="other">%d new interactions</item>
</plurals>
<string name="description_account_locked">Locked Account</string>
......@@ -381,7 +384,9 @@
<string name="compose_active_account_description">Posting with account %1$s</string>
<string name="error_failed_set_caption">Failed to set caption</string>
<string name="hint_describe_for_visually_impaired">Describe for visually impaired\n(%d character limit)</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="other">Describe for visually impaired\n(%d character limit)</item>
</plurals>
<string name="action_set_caption">Set caption</string>
<string name="action_remove">Remove</string>
<string name="lock_account_label">Lock account</string>
......@@ -452,8 +457,10 @@
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s and %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s and %3$d more</string>
<string name="max_tab_number_reached">maximum of %1$d tabs reached</string>
<plurals name="max_tab_number_reached">
<item quantity="one">maximum of %1$d tab reached</item>
<item quantity="other">maximum of %1$d tabs reached</item>
</plurals>
<string name="description_status_media">
Media: %s
......@@ -597,7 +604,10 @@
<string name="limit_notifications">Limit timeline notifications</string>
<string name="wellbeing_hide_stats_posts">Hide quantitative stats on posts</string>
<string name="wellbeing_hide_stats_profile">Hide quantitative stats on profiles</string>
<string name="error_upload_max_media_reached">You cannot upload more than %1$d media attachments.</string>
<plurals name="error_upload_max_media_reached">
<item quantity="one">You cannot upload more than %1$d media attachment.</item>
<item quantity="other">You cannot upload more than %1$d media attachments.</item>
</plurals>
<string name="dialog_delete_list_warning">Do you really want to delete the list %s?</string>
<string name="drafts_toot_failed_to_send">This toot failed to send!</string>
......