Merge commit '0f1e95d0ca81d0254f8d1ae6b60a3130d51b15cf'

This commit is contained in:
kyori19 2022-05-19 00:15:17 +09:00
commit 0ef03e2bec
No known key found for this signature in database
GPG Key ID: CB37D0651E7F52AA
53 changed files with 817 additions and 423 deletions

View File

@ -2,7 +2,7 @@
"formatVersion": 1,
"database": {
"version": 35,
"identityHash": "60458dd94b60b1b86f7759420340f707",
"identityHash": "6714e8c4ae8f64bcd1e65ef6d8a3f958",
"entities": [
{
"tableName": "DraftEntity",
@ -359,7 +359,7 @@
},
{
"tableName": "TimelineStatusEntity",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `quote` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `url` TEXT, `timelineUserId` INTEGER NOT NULL, `authorServerId` TEXT, `inReplyToId` TEXT, `inReplyToAccountId` TEXT, `content` TEXT, `createdAt` INTEGER NOT NULL, `emojis` TEXT, `reblogsCount` INTEGER NOT NULL, `favouritesCount` INTEGER NOT NULL, `reblogged` INTEGER NOT NULL, `bookmarked` INTEGER NOT NULL, `favourited` INTEGER NOT NULL, `sensitive` INTEGER NOT NULL, `spoilerText` TEXT NOT NULL, `visibility` INTEGER NOT NULL, `attachments` TEXT, `mentions` TEXT, `tags` TEXT, `application` TEXT, `reblogServerId` TEXT, `reblogAccountId` TEXT, `poll` TEXT, `muted` INTEGER, `expanded` INTEGER NOT NULL, `contentCollapsed` INTEGER NOT NULL, `contentShowing` INTEGER NOT NULL, `pinned` INTEGER NOT NULL, `card` TEXT, `quote` TEXT, PRIMARY KEY(`serverId`, `timelineUserId`), FOREIGN KEY(`authorServerId`, `timelineUserId`) REFERENCES `TimelineAccountEntity`(`serverId`, `timelineUserId`) ON UPDATE NO ACTION ON DELETE NO ACTION )",
"fields": [
{
"fieldPath": "serverId",
@ -535,6 +535,12 @@
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "card",
"columnName": "card",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "quote",
"columnName": "quote",
@ -815,7 +821,7 @@
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '60458dd94b60b1b86f7759420340f707')"
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '6714e8c4ae8f64bcd1e65ef6d8a3f958')"
]
}
}

View File

@ -19,7 +19,6 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.emoji2.text.EmojiCompat
import androidx.recyclerview.widget.RecyclerView
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.databinding.ItemPollBinding
@ -87,9 +86,8 @@ class PollAdapter : RecyclerView.Adapter<BindingHolder<ItemPollBinding>>() {
when (mode) {
RESULT -> {
val percent = calculatePercent(option.votesCount, votersCount, voteCount)
val emojifiedPollOptionText = buildDescription(option.title, percent, option.voted, resultTextView.context)
resultTextView.text = buildDescription(option.title, percent, option.voted, resultTextView.context)
.emojify(emojis, resultTextView, animateEmojis)
resultTextView.text = EmojiCompat.get().process(emojifiedPollOptionText)
val level = percent * 100
val optionColor = if (option.voted) {
@ -103,8 +101,7 @@ class PollAdapter : RecyclerView.Adapter<BindingHolder<ItemPollBinding>>() {
resultTextView.setOnClickListener(resultClickListener)
}
SINGLE -> {
val emojifiedPollOptionText = option.title.emojify(emojis, radioButton, animateEmojis)
radioButton.text = EmojiCompat.get().process(emojifiedPollOptionText)
radioButton.text = option.title.emojify(emojis, radioButton, animateEmojis)
radioButton.isChecked = option.selected
radioButton.setOnClickListener {
pollOptions.forEachIndexed { index, pollOption ->
@ -114,8 +111,7 @@ class PollAdapter : RecyclerView.Adapter<BindingHolder<ItemPollBinding>>() {
}
}
MULTIPLE -> {
val emojifiedPollOptionText = option.title.emojify(emojis, checkBox, animateEmojis)
checkBox.text = EmojiCompat.get().process(emojifiedPollOptionText)
checkBox.text = option.title.emojify(emojis, checkBox, animateEmojis)
checkBox.isChecked = option.selected
checkBox.setOnCheckedChangeListener { _, isChecked ->
pollOptions[holder.bindingAdapterPosition].selected = isChecked

View File

@ -37,7 +37,6 @@ import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsCompat.Type.systemBars
import androidx.core.view.updatePadding
import androidx.emoji2.text.EmojiCompat
import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.viewpager2.widget.MarginPageTransformer
@ -464,14 +463,7 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI
*/
private fun updateToolbar() {
loadedAccount?.let { account ->
val emojifiedName = account.name.emojify(account.emojis, binding.accountToolbar, animateEmojis)
try {
supportActionBar?.title = EmojiCompat.get().process(emojifiedName)
} catch (e: IllegalStateException) {
supportActionBar?.title = emojifiedName
}
supportActionBar?.title = account.name.emojify(account.emojis, binding.accountToolbar, animateEmojis)
supportActionBar?.subtitle = String.format(getString(R.string.post_username_format), account.username)
}
}

View File

@ -53,6 +53,7 @@ import androidx.core.view.OnReceiveContentListener
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.core.widget.doAfterTextChanged
import androidx.lifecycle.asLiveData
import androidx.lifecycle.lifecycleScope
import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.LinearLayoutManager
@ -398,14 +399,17 @@ class ComposeActivity :
viewModel.statusVisibility.observe { visibility ->
setStatusVisibility(visibility)
}
viewModel.media.observe { media ->
mediaAdapter.submitList(media)
if (media.size != mediaCount) {
mediaCount = media.size
binding.composeMediaPreviewBar.visible(media.isNotEmpty())
updateSensitiveMediaToggle(viewModel.markMediaAsSensitive.value != false, viewModel.showContentWarning.value != false)
lifecycleScope.launch {
viewModel.media.collect { media ->
mediaAdapter.submitList(media)
if (media.size != mediaCount) {
mediaCount = media.size
binding.composeMediaPreviewBar.visible(media.isNotEmpty())
updateSensitiveMediaToggle(viewModel.markMediaAsSensitive.value != false, viewModel.showContentWarning.value != false)
}
}
}
viewModel.poll.observe { poll ->
binding.pollPreview.visible(poll != null)
poll?.let(binding.pollPreview::setPoll)
@ -418,7 +422,7 @@ class ComposeActivity :
}
updateScheduleButton()
}
combineOptionalLiveData(viewModel.media, viewModel.poll) { media, poll ->
combineOptionalLiveData(viewModel.media.asLiveData(), viewModel.poll) { media, poll ->
val active = poll == null &&
media!!.size != 4 &&
(media.isEmpty() || media.first().type == QueuedMedia.Type.IMAGE)
@ -858,7 +862,7 @@ class ComposeActivity :
spoilerText = binding.composeContentWarningField.text.toString()
}
val characterCount = calculateTextLength()
if ((characterCount <= 0 || contentText.isBlank()) && viewModel.media.value!!.isEmpty()) {
if ((characterCount <= 0 || contentText.isBlank()) && viewModel.media.value.isEmpty()) {
binding.composeEditField.error = getString(R.string.error_empty)
enableButtons(true)
} else if (characterCount <= maximumTootCharacters) {
@ -866,7 +870,7 @@ class ComposeActivity :
contentText += " ${binding.editTextDefaultText.text}"
}
if (viewModel.media.value!!.isNotEmpty()) {
if (viewModel.media.value.isNotEmpty()) {
finishingUploadDialog = ProgressDialog.show(
this, getString(R.string.dialog_title_finishing_media_upload),
getString(R.string.dialog_message_uploading_media), true, true
@ -1044,8 +1048,19 @@ class ComposeActivity :
}
private fun saveDraftAndFinish(contentText: String, contentWarning: String) {
viewModel.saveDraft(contentText, contentWarning)
finishWithoutSlideOutAnimation()
lifecycleScope.launch {
val dialog = if (viewModel.shouldShowSaveDraftDialog()) {
ProgressDialog.show(
this@ComposeActivity, null,
getString(R.string.saving_draft), true, false
)
} else {
null
}
viewModel.saveDraft(contentText, contentWarning)
dialog?.cancel()
finishWithoutSlideOutAnimation()
}
}
override fun search(token: String): List<ComposeAutoCompleteAdapter.AutocompleteResult> {
@ -1064,7 +1079,7 @@ class ComposeActivity :
}
data class QueuedMedia(
val localId: Long,
val localId: Int,
val uri: Uri,
val type: Type,
val mediaSize: Long,

View File

@ -21,6 +21,7 @@ import androidx.core.net.toUri
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import com.keylesspalace.tusky.components.compose.ComposeActivity.QueuedMedia
import com.keylesspalace.tusky.components.drafts.DraftHelper
@ -36,15 +37,17 @@ import com.keylesspalace.tusky.network.MastodonApi
import com.keylesspalace.tusky.service.ServiceClient
import com.keylesspalace.tusky.service.StatusToSend
import com.keylesspalace.tusky.util.combineLiveData
import com.keylesspalace.tusky.util.filter
import com.keylesspalace.tusky.util.map
import com.keylesspalace.tusky.util.randomAlphanumericString
import com.keylesspalace.tusky.util.toLiveData
import com.keylesspalace.tusky.util.withoutFirstWhich
import io.reactivex.rxjava3.core.Observable
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.flow.updateAndGet
import kotlinx.coroutines.launch
import kotlinx.coroutines.rx3.rxSingle
import kotlinx.coroutines.withContext
@ -87,12 +90,12 @@ class ComposeViewModel @Inject constructor(
val poll: MutableLiveData<NewPoll?> = mutableLiveData(null)
val scheduledAt: MutableLiveData<String?> = mutableLiveData(null)
val media = mutableLiveData<List<QueuedMedia>>(listOf())
val media: MutableStateFlow<List<QueuedMedia>> = MutableStateFlow(emptyList())
val uploadError = MutableLiveData<Throwable>()
val domain = accountManager.activeAccount?.domain!!
private val mediaToJob = mutableMapOf<Long, Job>()
private val mediaToJob = mutableMapOf<Int, Job>()
private val isEditingScheduledToot get() = !scheduledTootId.isNullOrEmpty()
@ -114,7 +117,7 @@ class ComposeViewModel @Inject constructor(
suspend fun pickMedia(mediaUri: Uri, description: String? = null): Result<QueuedMedia> = withContext(Dispatchers.IO) {
try {
val (type, uri, size) = mediaUploader.prepareMedia(mediaUri)
val mediaItems = media.value!!
val mediaItems = media.value
if (type != QueuedMedia.Type.IMAGE &&
mediaItems.isNotEmpty() &&
mediaItems[0].type == QueuedMedia.Type.IMAGE
@ -129,29 +132,31 @@ class ComposeViewModel @Inject constructor(
}
}
private fun addMediaToQueue(
private suspend fun addMediaToQueue(
type: QueuedMedia.Type,
uri: Uri,
mediaSize: Long,
description: String? = null
): QueuedMedia {
val mediaItem = QueuedMedia(
localId = System.currentTimeMillis(),
uri = uri,
type = type,
mediaSize = mediaSize,
description = description
)
media.postValue(media.value!! + mediaItem)
val mediaItem = media.updateAndGet { mediaValue ->
val mediaItem = QueuedMedia(
localId = (mediaValue.maxOfOrNull { it.localId } ?: 0) + 1,
uri = uri,
type = type,
mediaSize = mediaSize,
description = description
)
mediaValue + mediaItem
}.last()
mediaToJob[mediaItem.localId] = viewModelScope.launch {
mediaUploader
.uploadMedia(mediaItem)
.catch { error ->
media.postValue(media.value?.filter { it.localId != mediaItem.localId } ?: emptyList())
media.update { mediaValue -> mediaValue.filter { it.localId != mediaItem.localId } }
uploadError.postValue(error)
}
.collect { event ->
val item = media.value?.find { it.localId == mediaItem.localId }
val item = media.value.find { it.localId == mediaItem.localId }
?: return@collect
val newMediaItem = when (event) {
is UploadEvent.ProgressEvent ->
@ -159,16 +164,14 @@ class ComposeViewModel @Inject constructor(
is UploadEvent.FinishedEvent ->
item.copy(id = event.mediaId, uploadPercent = -1)
}
synchronized(media) {
val mediaValue = media.value!!
val index = mediaValue.indexOfFirst { it.localId == newMediaItem.localId }
media.postValue(
if (index == -1) {
mediaValue + newMediaItem
media.update { mediaValue ->
mediaValue.map { mediaItem ->
if (mediaItem.localId == newMediaItem.localId) {
newMediaItem
} else {
mediaValue.toMutableList().also { it[index] = newMediaItem }
mediaItem
}
)
}
}
}
}
@ -176,13 +179,23 @@ class ComposeViewModel @Inject constructor(
}
private fun addUploadedMedia(id: String, type: QueuedMedia.Type, uri: Uri, description: String?) {
val mediaItem = QueuedMedia(System.currentTimeMillis(), uri, type, 0, -1, id, description)
media.value = media.value!! + mediaItem
media.update { mediaValue ->
val mediaItem = QueuedMedia(
localId = (mediaValue.maxOfOrNull { it.localId } ?: 0) + 1,
uri = uri,
type = type,
mediaSize = 0,
uploadPercent = -1,
id = id,
description = description
)
mediaValue + mediaItem
}
}
fun removeMediaFromQueue(item: QueuedMedia) {
mediaToJob[item.localId]?.cancel()
media.value = media.value!!.withoutFirstWhich { it.localId == item.localId }
media.update { mediaValue -> mediaValue.filter { it.localId == item.localId } }
}
fun toggleMarkSensitive() {
@ -218,31 +231,36 @@ class ComposeViewModel @Inject constructor(
}
}
fun saveDraft(content: String, contentWarning: String) {
viewModelScope.launch {
val mediaUris: MutableList<String> = mutableListOf()
val mediaDescriptions: MutableList<String?> = mutableListOf()
media.value?.forEach { item ->
mediaUris.add(item.uri.toString())
mediaDescriptions.add(item.description)
}
draftHelper.saveDraft(
draftId = draftId,
accountId = accountManager.activeAccount?.id!!,
inReplyToId = inReplyToId,
content = content,
contentWarning = contentWarning,
sensitive = markMediaAsSensitive.value!!,
visibility = statusVisibility.value!!,
mediaUris = mediaUris,
mediaDescriptions = mediaDescriptions,
poll = poll.value,
failedToSend = false
)
fun shouldShowSaveDraftDialog(): Boolean {
// if any of the media files need to be downloaded first it could take a while, so show a loading dialog
return media.value.any { mediaValue ->
mediaValue.uri.scheme == "https"
}
}
suspend fun saveDraft(content: String, contentWarning: String) {
val mediaUris: MutableList<String> = mutableListOf()
val mediaDescriptions: MutableList<String?> = mutableListOf()
media.value.forEach { item ->
mediaUris.add(item.uri.toString())
mediaDescriptions.add(item.description)
}
draftHelper.saveDraft(
draftId = draftId,
accountId = accountManager.activeAccount?.id!!,
inReplyToId = inReplyToId,
content = content,
contentWarning = contentWarning,
sensitive = markMediaAsSensitive.value!!,
visibility = statusVisibility.value!!,
mediaUris = mediaUris,
mediaDescriptions = mediaDescriptions,
poll = poll.value,
failedToSend = false
)
}
/**
* Send status to the server.
* Uses current state plus provided arguments.
@ -259,14 +277,14 @@ class ComposeViewModel @Inject constructor(
Observable.just(Unit)
}.toLiveData()
val sendObservable = media
val sendFlow = media
.filter { items -> items.all { it.uploadPercent == -1 } }
.map {
val mediaIds: MutableList<String> = mutableListOf()
val mediaUris: MutableList<Uri> = mutableListOf()
val mediaDescriptions: MutableList<String> = mutableListOf()
val mediaProcessed: MutableList<Boolean> = mutableListOf()
for (item in media.value!!) {
for (item in media.value) {
mediaIds.add(item.id!!)
mediaUris.add(item.uri)
mediaDescriptions.add(item.description ?: "")
@ -297,17 +315,21 @@ class ComposeViewModel @Inject constructor(
serviceClient.sendToot(tootToSend)
}
return combineLiveData(deletionObservable, sendObservable) { _, _ -> }
return combineLiveData(deletionObservable, sendFlow.asLiveData()) { _, _ -> }
}
suspend fun updateDescription(localId: Long, description: String): Boolean {
val newList = media.value!!.toMutableList()
val index = newList.indexOfFirst { it.localId == localId }
if (index != -1) {
newList[index] = newList[index].copy(description = description)
suspend fun updateDescription(localId: Int, description: String): Boolean {
val newMediaList = media.updateAndGet { mediaValue ->
mediaValue.map { mediaItem ->
if (mediaItem.localId == localId) {
mediaItem.copy(description = description)
} else {
mediaItem
}
}
}
media.value = newList
val updatedItem = newList.find { it.localId == localId }
val updatedItem = newMediaList.find { it.localId == localId }
if (updatedItem?.id != null) {
return api.updateMedia(updatedItem.id, description)
.fold({
@ -403,8 +425,8 @@ class ComposeViewModel @Inject constructor(
val draftAttachments = composeOptions?.draftAttachments
if (draftAttachments != null) {
// when coming from DraftActivity
draftAttachments.forEach { attachment ->
viewModelScope.launch {
viewModelScope.launch {
draftAttachments.forEach { attachment ->
pickMedia(attachment.uri, attachment.description)
}
}

View File

@ -26,7 +26,7 @@ import androidx.core.net.toUri
import com.keylesspalace.tusky.BuildConfig
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.components.compose.ComposeActivity.QueuedMedia
import com.keylesspalace.tusky.network.MastodonApi
import com.keylesspalace.tusky.network.MediaUploadApi
import com.keylesspalace.tusky.network.ProgressRequestBody
import com.keylesspalace.tusky.util.MEDIA_SIZE_UNKNOWN
import com.keylesspalace.tusky.util.getImageSquarePixels
@ -75,7 +75,7 @@ class CouldNotOpenFileException : Exception()
class MediaUploader @Inject constructor(
private val context: Context,
private val mastodonApi: MastodonApi
private val mediaUploadApi: MediaUploadApi
) {
@OptIn(ExperimentalCoroutinesApi::class)
@ -222,7 +222,7 @@ class MediaUploader @Inject constructor(
null
}
val result = mastodonApi.uploadMedia(body, description).getOrThrow()
val result = mediaUploadApi.uploadMedia(body, description).getOrThrow()
if (media.uri.scheme == "file") {
media.uri.path?.let {
File(it).delete()

View File

@ -30,7 +30,12 @@ import com.keylesspalace.tusky.entity.Status
import com.keylesspalace.tusky.util.IOUtils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import okhttp3.OkHttpClient
import okhttp3.Request
import okio.buffer
import okio.sink
import java.io.File
import java.io.IOException
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
@ -38,6 +43,7 @@ import javax.inject.Inject
class DraftHelper @Inject constructor(
val context: Context,
val okHttpClient: OkHttpClient,
db: AppDatabase
) {
@ -71,11 +77,11 @@ class DraftHelper @Inject constructor(
val uris = mediaUris.map { uriString ->
uriString.toUri()
}.map { uri ->
if (uri.isNotInFolder(draftDirectory)) {
uri.copyToFolder(draftDirectory)
} else {
}.mapNotNull { uri ->
if (uri.isInFolder(draftDirectory)) {
uri
} else {
uri.copyToFolder(draftDirectory)
}
}
@ -114,6 +120,7 @@ class DraftHelper @Inject constructor(
)
draftDao.insertOrReplace(draft)
Log.d("DraftHelper", "saved draft to db")
}
suspend fun deleteDraftAndAttachments(draftId: Int) {
@ -133,33 +140,55 @@ class DraftHelper @Inject constructor(
}
}
suspend fun deleteAttachments(draft: DraftEntity) {
withContext(Dispatchers.IO) {
draft.attachments.forEach { attachment ->
if (context.contentResolver.delete(attachment.uri, null, null) == 0) {
Log.e("DraftHelper", "Did not delete file ${attachment.uriString}")
}
suspend fun deleteAttachments(draft: DraftEntity) = withContext(Dispatchers.IO) {
draft.attachments.forEach { attachment ->
if (context.contentResolver.delete(attachment.uri, null, null) == 0) {
Log.e("DraftHelper", "Did not delete file ${attachment.uriString}")
}
}
}
private fun Uri.isNotInFolder(folder: File): Boolean {
private fun Uri.isInFolder(folder: File): Boolean {
val filePath = path ?: return true
return File(filePath).parentFile == folder
}
private fun Uri.copyToFolder(folder: File): Uri {
private fun Uri.copyToFolder(folder: File): Uri? {
val contentResolver = context.contentResolver
val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(Date())
val mimeType = contentResolver.getType(this)
val map = MimeTypeMap.getSingleton()
val fileExtension = map.getExtensionFromMimeType(mimeType)
val fileExtension = if (scheme == "https") {
lastPathSegment?.substringAfterLast('.', "tmp")
} else {
val mimeType = contentResolver.getType(this)
val map = MimeTypeMap.getSingleton()
map.getExtensionFromMimeType(mimeType)
}
val filename = String.format("Tusky_Draft_Media_%s.%s", timeStamp, fileExtension)
val file = File(folder, filename)
IOUtils.copyToFile(contentResolver, this, file)
if (scheme == "https") {
// saving redrafted media
try {
val request = Request.Builder().url(toString()).build()
val response = okHttpClient.newCall(request).execute()
val sink = file.sink().buffer()
response.body?.source()?.use { input ->
sink.use { output ->
output.writeAll(input)
}
}
} catch (ex: IOException) {
Log.w("DraftHelper", "failed to save media", ex)
return null
}
} else {
IOUtils.copyToFile(contentResolver, this, file)
}
return FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", file)
}
}

View File

@ -66,7 +66,9 @@ class LoginActivity : BaseActivity(), Injectable {
// Authorization failed. Put the error response where the user can read it and they
// can try again.
setLoading(false)
binding.domainTextInputLayout.error = getString(R.string.error_authorization_denied)
// Use error returned by the server or fall back to the generic message
binding.domainTextInputLayout.error =
result.errorMessage.ifBlank { getString(R.string.error_authorization_denied) }
Log.e(
TAG,
"%s %s".format(

View File

@ -20,7 +20,7 @@ import androidx.core.net.toUri
import com.keylesspalace.tusky.BaseActivity
import com.keylesspalace.tusky.BuildConfig
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.databinding.LoginWebviewBinding
import com.keylesspalace.tusky.databinding.ActivityLoginWebviewBinding
import com.keylesspalace.tusky.di.Injectable
import com.keylesspalace.tusky.util.hide
import com.keylesspalace.tusky.util.viewBinding
@ -78,7 +78,7 @@ sealed class LoginResult : Parcelable {
/** Activity to do Oauth process using WebView. */
class LoginWebViewActivity : BaseActivity(), Injectable {
private val binding by viewBinding(LoginWebviewBinding::inflate)
private val binding by viewBinding(ActivityLoginWebviewBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -117,7 +117,7 @@ class LoginWebViewActivity : BaseActivity(), Injectable {
error: WebResourceError
) {
Log.d("LoginWeb", "Failed to load ${data.url}: $error")
finishWithoutSlideOutAnimation()
sendResult(LoginResult.Err(getString(R.string.error_could_not_load_login_page)))
}
override fun shouldOverrideUrlLoading(

View File

@ -21,6 +21,7 @@ import com.keylesspalace.tusky.db.TimelineAccountEntity
import com.keylesspalace.tusky.db.TimelineStatusEntity
import com.keylesspalace.tusky.db.TimelineStatusWithAccount
import com.keylesspalace.tusky.entity.Attachment
import com.keylesspalace.tusky.entity.Card
import com.keylesspalace.tusky.entity.Emoji
import com.keylesspalace.tusky.entity.HashTag
import com.keylesspalace.tusky.entity.Poll
@ -97,6 +98,7 @@ fun Placeholder.toEntity(timelineUserId: Long): TimelineStatusEntity {
contentCollapsed = false,
contentShowing = false,
pinned = false,
card = null,
quote = null,
)
}
@ -138,6 +140,7 @@ fun Status.toEntity(
contentShowing = contentShowing,
contentCollapsed = contentCollapsed,
pinned = actionableStatus.pinned == true,
card = actionableStatus.card?.let(gson::toJson),
quote = actionableStatus.quote?.let(gson::toJson),
)
}
@ -153,6 +156,7 @@ fun TimelineStatusWithAccount.toViewData(gson: Gson): StatusViewData {
val application = gson.fromJson(status.application, Status.Application::class.java)
val emojis: List<Emoji> = gson.fromJson(status.emojis, emojisListType) ?: emptyList()
val poll: Poll? = gson.fromJson(status.poll, Poll::class.java)
val card: Card? = gson.fromJson(status.card, Card::class.java)
val quote: Status? = gson.fromJson(status.quote, Status::class.java)
val reblog = status.reblogServerId?.let { id ->
@ -181,7 +185,7 @@ fun TimelineStatusWithAccount.toViewData(gson: Gson): StatusViewData {
pinned = false,
muted = status.muted,
poll = poll,
card = null,
card = card,
quote = quote,
)
}
@ -240,7 +244,7 @@ fun TimelineStatusWithAccount.toViewData(gson: Gson): StatusViewData {
pinned = status.pinned,
muted = status.muted,
poll = poll,
card = null,
card = card,
quote = quote,
)
}

View File

@ -539,6 +539,7 @@ public abstract class AppDatabase extends RoomDatabase {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE `TimelineStatusEntity` ADD COLUMN `quote` TEXT DEFAULT ''");
database.execSQL("ALTER TABLE `TimelineStatusEntity` ADD COLUMN `card` TEXT");
}
};
}

View File

@ -36,7 +36,7 @@ SELECT s.serverId, s.url, s.timelineUserId,
s.authorServerId, s.inReplyToId, s.inReplyToAccountId, s.createdAt,
s.emojis, s.reblogsCount, s.favouritesCount, s.reblogged, s.favourited, s.bookmarked, s.sensitive,
s.spoilerText, s.visibility, s.mentions, s.tags, s.application, s.reblogServerId,s.reblogAccountId,
s.content, s.attachments, s.poll, s.muted, s.expanded, s.contentShowing, s.contentCollapsed, s.pinned,
s.content, s.attachments, s.poll, s.card, s.muted, s.expanded, s.contentShowing, s.contentCollapsed, s.pinned,
s.quote,
a.serverId as 'a_serverId', a.timelineUserId as 'a_timelineUserId',
a.localUsername as 'a_localUsername', a.username as 'a_username',

View File

@ -79,6 +79,7 @@ data class TimelineStatusEntity(
val contentCollapsed: Boolean,
val contentShowing: Boolean,
val pinned: Boolean,
val card: String?,
val quote: String?,
)

View File

@ -24,6 +24,7 @@ import com.keylesspalace.tusky.BuildConfig
import com.keylesspalace.tusky.db.AccountManager
import com.keylesspalace.tusky.network.InstanceSwitchAuthInterceptor
import com.keylesspalace.tusky.network.MastodonApi
import com.keylesspalace.tusky.network.MediaUploadApi
import com.keylesspalace.tusky.network.NotestockApi
import com.keylesspalace.tusky.util.getNonNullString
import dagger.Module
@ -116,6 +117,20 @@ class NetworkModule {
@Singleton
fun providesApi(retrofit: Retrofit): MastodonApi = retrofit.create()
@Provides
@Singleton
fun providesMediaUploadApi(retrofit: Retrofit, okHttpClient: OkHttpClient): MediaUploadApi {
val longTimeOutOkHttpClient = okHttpClient.newBuilder()
.readTimeout(100, TimeUnit.SECONDS)
.writeTimeout(100, TimeUnit.SECONDS)
.build()
return retrofit.newBuilder()
.client(longTimeOutOkHttpClient)
.build()
.create()
}
@Provides
@Singleton
fun providesNotestockApi(

View File

@ -58,6 +58,7 @@ import com.keylesspalace.tusky.entity.Status;
import com.keylesspalace.tusky.network.MastodonApi;
import com.keylesspalace.tusky.network.TimelineCases;
import com.keylesspalace.tusky.util.LinkHelper;
import com.keylesspalace.tusky.util.StatusParsingHelper;
import com.keylesspalace.tusky.view.MuteAccountDialog;
import com.keylesspalace.tusky.viewdata.AttachmentViewData;
@ -255,7 +256,7 @@ public abstract class SFragment extends Fragment implements Injectable {
String stringToShare = statusToShare.getAccount().getUsername() +
" - " +
statusToShare.getContent().toString();
StatusParsingHelper.parseAsMastodonHtml(statusToShare.getContent()).toString();
sendIntent.putExtra(Intent.EXTRA_TEXT, stringToShare);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, statusUrl);
sendIntent.setType("text/plain");

View File

@ -142,13 +142,6 @@ interface MastodonApi {
@POST("api/v1/notifications/clear")
fun clearNotifications(): Single<ResponseBody>
@Multipart
@POST("api/v2/media")
suspend fun uploadMedia(
@Part file: MultipartBody.Part,
@Part description: MultipartBody.Part? = null
): Result<MediaUploadResult>
@FormUrlEncoded
@PUT("api/v1/media/{mediaId}")
suspend fun updateMedia(

View File

@ -0,0 +1,19 @@
package com.keylesspalace.tusky.network
import com.keylesspalace.tusky.entity.MediaUploadResult
import okhttp3.MultipartBody
import retrofit2.http.Multipart
import retrofit2.http.POST
import retrofit2.http.Part
/** endpoints defined in this interface will be called with a higher timeout than usual
* which is necessary for media uploads to succeed on some servers
*/
interface MediaUploadApi {
@Multipart
@POST("api/v2/media")
suspend fun uploadMedia(
@Part file: MultipartBody.Part,
@Part description: MultipartBody.Part? = null
): Result<MediaUploadResult>
}

View File

@ -11,8 +11,7 @@
<androidx.appcompat.widget.Toolbar
android:id="@+id/loginToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:titleTextColor="#fff" />
android:layout_height="wrap_content" />
</com.google.android.material.appbar.AppBarLayout>

View File

@ -551,4 +551,10 @@
<string name="duration_180_days">180 يومًا</string>
<string name="duration_365_days">365 يومًا</string>
<string name="tusky_compose_post_quicksetting_label">تحرير منشور</string>
<string name="notification_sign_up_name">حسابات جديدة</string>
<string name="title_login">لِج</string>
<string name="notification_sign_up_format">قام %s بإنشاء حساب</string>
<string name="pref_title_notification_filter_sign_ups">أحدهم أنشأ حسابا جديدا</string>
<string name="notification_update_name">منشورات تم تعديلها</string>
<string name="notification_update_format">قام %s بتعديل منشوره</string>
</resources>

View File

@ -20,8 +20,8 @@
<string name="title_notifications">Notificacions</string>
<string name="title_public_local">Local</string>
<string name="title_public_federated">Federació</string>
<string name="title_view_thread">Toot</string>
<string name="title_posts">Posts</string>
<string name="title_view_thread">Fil</string>
<string name="title_posts">Publicacions</string>
<string name="title_follows">Seguits</string>
<string name="title_followers">Seguidors</string>
<string name="title_favourites">Preferits</string>
@ -31,19 +31,19 @@
<string name="title_edit_profile">Edita el perfil</string>
<string name="title_drafts">Esborranys</string>
<string name="post_username_format">\@%s</string>
<string name="post_boosted_format">%s tootejat</string>
<string name="post_boosted_format">%s ha impulsat</string>
<string name="post_sensitive_media_title">Contingut sensible</string>
<string name="post_sensitive_media_directions">Fes clic per a visualitzar-lo</string>
<string name="post_content_warning_show_more">Mostra\'n més</string>
<string name="post_content_warning_show_less">Mostra\'n menys</string>
<string name="footer_empty">No hi res aquí. Llisca avall per a actualitzar!</string>
<string name="notification_reblog_format">%s ha impulsat el teu toot</string>
<string name="notification_favourite_format">%s ha marcat com a preferit el teu toot</string>
<string name="notification_reblog_format">%s ha impulsat la teva publicació</string>
<string name="notification_favourite_format">%s ha marcat com a preferida la teva publicació</string>
<string name="notification_follow_format">%s et segueix</string>
<string name="report_username_format">Denuncia @%s</string>
<string name="report_comment_hint">Cap comentari addicional?</string>
<string name="action_reply">Respon</string>
<string name="action_reblog">Retooteja</string>
<string name="action_reblog">Impulsa</string>
<string name="action_favourite">Preferit</string>
<string name="action_more">Més</string>
<string name="action_compose">Escriure</string>
@ -55,8 +55,8 @@
<string name="action_unblock">Deixa de blocar</string>
<string name="action_report">Denuncia</string>
<string name="action_delete">Elimina</string>
<string name="action_send">TOOT</string>
<string name="action_send_public">TOOT!</string>
<string name="action_send">PUBLICA</string>
<string name="action_send_public">PUBLICA!</string>
<string name="action_retry">Torna a intentar-ho</string>
<string name="action_close">Tanca</string>
<string name="action_view_profile">Perfil</string>
@ -83,8 +83,8 @@
<string name="action_access_drafts">Esborranys</string>
<string name="download_image">S\'està baixant %1$s</string>
<string name="action_copy_link">Copia l\'enllaç</string>
<string name="send_post_link_to">Comparteix l\'URL del toot a…</string>
<string name="send_post_content_to">Comparteix el toot a…</string>
<string name="send_post_link_to">Comparteix l\'URL de la publicació a…</string>
<string name="send_post_content_to">Comparteix la publicació a…</string>
<string name="confirmation_reported">Enviat!</string>
<string name="confirmation_unblocked">Usuari desblocat</string>
<string name="confirmation_unmuted">Usuari sense silenciar</string>
@ -132,10 +132,10 @@
<string name="pref_title_hide_follow_button">Amaga el botó de redacció en desplaçament</string>
<string name="pref_title_post_filter">Filtre de la cronologia</string>
<string name="pref_title_post_tabs">Pestanyes</string>
<string name="pref_title_show_boosts">Mostra els retoots</string>
<string name="pref_title_show_boosts">Mostra els impulsos</string>
<string name="pref_title_show_replies">Mostra les respostes</string>
<string name="pref_title_show_media_preview">Mostra les previsualitzacions</string>
<string name="pref_default_post_privacy">Privacitat predeterminada dels toots</string>
<string name="pref_default_post_privacy">Privacitat per defecte de les publicacions</string>
<string name="pref_publishing">Publicació</string>
<string name="post_privacy_public">Pública</string>
<string name="post_privacy_unlisted">Sense llistar</string>
@ -145,7 +145,7 @@
<string name="notification_mention_descriptions">Notificacions sobre mencions noves</string>
<string name="notification_follow_name">Seguidors nous</string>
<string name="notification_follow_description">Notificacions sobre nous seguidors</string>
<string name="notification_boost_name">Retoots</string>
<string name="notification_boost_name">Impulsos</string>
<string name="notification_boost_description">Notificacions si retootejents els teus toots</string>
<string name="notification_favourite_name">Preferits</string>
<string name="notification_favourite_description">Notificacions si marquen com a preferits els teus toots</string>
@ -172,8 +172,8 @@
https://github.com/accelforce/Yuito/issues
</string>
<string name="about_tusky_account">Perfil del Yuito</string>
<string name="post_share_content">Comparteix el contingut del toot</string>
<string name="post_share_link">Comparteix l\'enllaç al toot</string>
<string name="post_share_content">Comparteix el contingut de la publicació</string>
<string name="post_share_link">Comparteix l\'enllaç a la publicació</string>
<string name="post_media_images">Imatges</string>
<string name="post_media_video">Vídeo</string>
<!--These are for timestamps on statuses. For example: "16s" or "2d"-->
@ -193,7 +193,7 @@
<string name="replying_to">En resposta a @%s</string>
<string name="load_more_placeholder_text">carrega\'n més</string>
<string name="poll_vote">Vota</string>
<string name="error_sender_account_gone">S\'ha produït un error en enviar el tut.</string>
<string name="error_sender_account_gone">S\'ha produït un error en publicar.</string>
<string name="title_tab_preferences">Pestanyes</string>
<string name="title_licenses">Llicències</string>
<string name="post_content_show_more">Amplia</string>
@ -209,11 +209,11 @@
<string name="post_media_hidden_title">Multimèdia amagada</string>
<string name="post_content_show_less">Amaga</string>
<string name="action_logout_confirm">Estàs segur de tancar la sessió de %1$s\?</string>
<string name="action_hide_reblogs">Amaga els retoots</string>
<string name="action_hide_reblogs">Amaga els impulsos</string>
<string name="action_show_reblogs">Mostra els impulsos</string>
<string name="action_delete_and_redraft">Elimina i reecririu</string>
<string name="action_open_drawer">Obre el menú</string>
<string name="action_toggle_visibility">Visibilitat del toot</string>
<string name="action_toggle_visibility">Visibilitat de la publicació</string>
<string name="action_content_warning">Contingut sensible</string>
<string name="action_add_tab">Afegir una pestanya</string>
<string name="action_links">Enllaços</string>
@ -227,17 +227,17 @@
<string name="download_media">Baixa el fitxer</string>
<string name="send_media_to">Compartir la imatge a …</string>
<string name="post_sent">Enviat!</string>
<string name="state_follow_requested">S\'ha enviat la petició de seguiment</string>
<string name="state_follow_requested">Petició enviada</string>
<string name="title_posts_with_replies">Amb respostes</string>
<string name="action_emoji_keyboard">Teclat d\'emojis</string>
<string name="action_open_media_n">Obrir el media #%d</string>
<string name="action_open_as">Obrir com %s</string>
<string name="action_open_as">Obre com a %s</string>
<string name="downloading_media">S\'està Descarregant media</string>
<string name="post_sent_long">Resposta enviada correctament.</string>
<string name="label_quick_reply">Resposta …</string>
<string name="dialog_message_cancel_follow_request">Revocar la petició de seguiment\?</string>
<string name="dialog_delete_post_warning">Vols eliminar aquest toot\?</string>
<string name="dialog_redraft_post_warning">Esborrar i reescriure aquest toot\?</string>
<string name="dialog_redraft_post_warning">Vols eliminar i reescriure aquesta publicació\?</string>
<string name="pref_title_notification_filter_poll">Finalització de les enquetes</string>
<string name="pref_title_app_theme">Tema</string>
<string name="pref_title_timelines">Cronologia</string>
@ -267,7 +267,7 @@
<string name="filter_dialog_remove_button">Eliminar</string>
<string name="add_account_name">Afegir un compte</string>
<string name="action_open_reblogger">Obre l\'autor de l\'impuls</string>
<string name="action_open_reblogged_by">Mostra els retoots</string>
<string name="action_open_reblogged_by">Mostra els impulsos</string>
<string name="notification_poll_description">Notificacions d\'enquestes que han finalitzat</string>
<string name="pref_title_public_filter_keywords">Línia de temps públiques</string>
<string name="filter_dialog_update_button">Actualització</string>
@ -297,11 +297,11 @@
<string name="lock_account_label">Protegir el compte</string>
<string name="lock_account_label_description">S\'haurà d\'admetre els seguidors manualment</string>
<string name="compose_save_draft">Guardar l\'esborrany\?</string>
<string name="send_post_notification_title">Enviant toot…</string>
<string name="send_post_notification_error_title">Error enviant el toot</string>
<string name="send_post_notification_channel_name">Enviant toots</string>
<string name="send_post_notification_title">S\'està publicant…</string>
<string name="send_post_notification_error_title">Error en publicar</string>
<string name="send_post_notification_channel_name">S\'esatan enviant les publicacions</string>
<string name="send_post_notification_cancel_title">Envio anul·lat</string>
<string name="send_post_notification_saved_content">Una copia del toot s\'ha guardat a esborranys</string>
<string name="send_post_notification_saved_content">S\'ha guardat una còpia de la publicació als esborranys</string>
<string name="action_compose_shortcut">Escriure</string>
<string name="error_no_custom_emojis">La teva instància %s no te emojis personalitzats</string>
<string name="emoji_style">Estil dels emojis</string>
@ -309,7 +309,7 @@
<string name="download_fonts">Hauràs de descarregar el joc d\'emojis</string>
<string name="performing_lookup_title">Cercant…</string>
<string name="expand_collapse_all_posts">Expandir/ocultar tots els estats</string>
<string name="action_open_post">Obrir toot</string>
<string name="action_open_post">Obre la publicació</string>
<string name="restart_required">Cal reiniciar l\'aplicació</string>
<string name="restart_emoji">Has de reiniciar l\'aplicació per tal d\'aplicar aquests canvis</string>
<string name="later">Més tard</string>
@ -360,7 +360,7 @@
<string name="notifications_clear">Netejar</string>
<string name="notifications_apply_filter">Filtrar</string>
<string name="filter_apply">Aplicar</string>
<string name="compose_shortcut_long_label">Escriure un toot</string>
<string name="compose_shortcut_long_label">Escriure una publicació</string>
<string name="compose_shortcut_short_label">Escriure</string>
<string name="pref_title_bot_overlay">Mostra l\'indicador dels bots</string>
<string name="notification_clear_text">Vols netejar totes les notificacions permanentment\?</string>
@ -374,8 +374,8 @@
<string name="poll_ended_voted">L\'enquesta on has votat està tancada</string>
<string name="poll_ended_created">La enquesta que heu creat ha finalitzat</string>
<string name="description_post_cw">Advertència: %s</string>
<string name="title_posts_pinned">Toot fixat</string>
<string name="unpin_action">Toot no fixat</string>
<string name="title_posts_pinned">Fixat</string>
<string name="unpin_action">No fixis</string>
<string name="pin_action">Fixar</string>
<string name="description_post_reblogged">Respost</string>
<string name="compose_preview_image_description">Accions per a la imatge %s</string>
@ -385,7 +385,7 @@
<string name="action_mute_domain">Silenciar %s</string>
<string name="confirmation_domain_unmuted">%s visible</string>
<string name="mute_domain_warning_dialog_ok">Amagar el domini sencer</string>
<string name="pref_title_alway_open_spoiler">Obrir sempre els toots marcats amb contingut sensible</string>
<string name="pref_title_alway_open_spoiler">Mostra sempre obertes les publicacions marcades amb avisos de contingut</string>
<string name="filter_dialog_whole_word">Paraula sencera</string>
<string name="caption_notoemoji">Ventall actual d\'emojis de Google</string>
<string name="description_poll">Enquesta amb opcions: %1$s, %2$s, %3$s, %4$s; %5$s</string>
@ -418,12 +418,12 @@
<string name="poll_allow_multiple_choices">Múltiples tries</string>
<string name="poll_new_choice_hint">Tria %d</string>
<string name="title_bookmarks">Preferits</string>
<string name="title_scheduled_posts">Toots programats</string>
<string name="title_scheduled_posts">Publicacions programades</string>
<string name="action_bookmark">Preferit</string>
<string name="action_edit">Edita</string>
<string name="action_view_bookmarks">Preferits</string>
<string name="action_access_scheduled_posts">Toots programats</string>
<string name="action_schedule_post">Programar el toot</string>
<string name="action_access_scheduled_posts">Publicacions programades</string>
<string name="action_schedule_post">Programa la publicació</string>
<string name="action_reset_schedule">Reiniciar</string>
<string name="about_powered_by_tusky">Desenvolupat per Tusky</string>
<string name="description_post_bookmarked">S\'ha afegit a les adreces d\'interès</string>
@ -449,7 +449,7 @@
<string name="dialog_mute_warning">Silenciar @%s\?</string>
<string name="dialog_block_warning">Bloquejar @%s\?</string>
<string name="action_unmute_conversation">No silenciar la conversació</string>
<string name="action_mute_conversation">Conversació muda</string>
<string name="action_mute_conversation">Silencia la conversa</string>
<string name="notification_follow_request_format">%s ha sol·licitat seguir-te</string>
<string name="pref_main_nav_position_option_bottom">A baix</string>
<string name="pref_main_nav_position_option_top">A dalt</string>
@ -487,15 +487,15 @@
<string name="post_media_attachments">Adjuncions</string>
<string name="post_media_audio">Àudio</string>
<string name="notification_subscription_description">Notificacions quan algú a qui esteu subscrit publica un tut nou</string>
<string name="notification_subscription_name">Tuts nous</string>
<string name="notification_subscription_name">Publicacions noves</string>
<string name="pref_title_animate_custom_emojis">emojis personalitzats animats</string>
<string name="pref_title_notification_filter_subscriptions">algú a qui estic subscrit acaba de publicar un tut nou</string>
<string name="notification_subscription_format">%s acaba de fer una publicació</string>
<string name="title_announcements">Avisos</string>
<string name="drafts_post_reply_removed">S\'ha esborrat el tut del qual en vau fer un esborrany de resposta</string>
<string name="drafts_post_reply_removed">S\'ha eliminat la publicació a la qual vau fer un esborrany de resposta</string>
<string name="draft_deleted">S\'ha eliminat l\'esborrany</string>
<string name="drafts_failed_loading_reply">No s\'ha pogut carregar la informació de la resposta</string>
<string name="drafts_post_failed_to_send">No s\'ha pogut enviar aquest tut!</string>
<string name="drafts_post_failed_to_send">No s\'ha pogut publicar!</string>
<string name="dialog_delete_list_warning">Segur que voleu esborrar la llista %s\?</string>
<plurals name="error_upload_max_media_reached">
<item quantity="other">No podeu pujar més de %1$d adjunts multimèdia.</item>

View File

@ -25,7 +25,7 @@
<string name="title_public_federated">Föderiert</string>
<string name="title_direct_messages">Direktnachrichten</string>
<string name="title_tab_preferences">Tabs</string>
<string name="title_view_thread">Beitrag</string>
<string name="title_view_thread">Konversation</string>
<string name="title_posts">Beiträge</string>
<string name="title_posts_with_replies">mit Antworten</string>
<string name="title_posts_pinned">Angeheftet</string>
@ -490,7 +490,7 @@
<string name="duration_indefinite">Für immer</string>
<string name="post_media_attachments">Anhänge</string>
<string name="post_media_audio">Audio</string>
<string name="notification_subscription_description">Benachrichtigungen, wenn jemand, den ich abonniert habe, etwas Neues veröffentlicht</string>
<string name="notification_subscription_description">Benachrichtigungen, wenn jemand, den ich abonniert habe, eine neue Nachricht veröffentlicht</string>
<string name="notification_subscription_name">Neue Beiträge</string>
<string name="pref_title_animate_custom_emojis">GIF-Emojis animieren</string>
<string name="pref_title_notification_filter_subscriptions">Jemand, den ich abonniert habe, hat etwas Neues veröffentlicht</string>
@ -534,4 +534,7 @@
<string name="notification_sign_up_format">%s hat sich registriert</string>
<string name="pref_title_notification_filter_sign_ups">Jemand hat sich registriert</string>
<string name="notification_update_description">Benachrichtigungen, wenn Beiträge bearbeitet werden, mit denen du interagiert hast</string>
<string name="title_login">Anmelden</string>
<string name="error_could_not_load_login_page">Die Anmeldeseite konnte nicht geladen werden.</string>
<string name="notification_update_name">Beitragsbearbeitungen</string>
</resources>

View File

@ -3,4 +3,106 @@
<string name="error_empty">Αυτό δεν μπορεί να είναι κενό.</string>
<string name="error_network">Προέκυψε σφάλμα δικτύου! Παρακαλώ ελέγξτε τη σύνδεσή σας και προσπαθήστε ξανά!</string>
<string name="error_generic">Προέκυψε ένα σφάλμα.</string>
<string name="action_view_blocks">Αποκλεισμένοι χρήστες</string>
<string name="dialog_message_cancel_follow_request">Ακύρωση αιτήματος ακολούθησης;</string>
<string name="dialog_delete_conversation_warning">Διαγραφή αυτής της συζήτησης;</string>
<string name="search_no_results">Δεν υπάρχουν αποτελέσματα</string>
<string name="title_edit_profile">Επεργασία προφίλ</string>
<string name="title_follows">Ακολουθεί</string>
<string name="action_reset_schedule">Επαναφορά</string>
<string name="notification_follow_format">ο/η %s σας ακολούθησε</string>
<string name="action_view_mutes">Χρήστες σε σίγαση</string>
<string name="action_logout">Αποσύνδεση</string>
<string name="action_unfollow">Μην ακολουθείτε</string>
<string name="action_unmute_domain">Άρση σίγασης του %s</string>
<string name="action_delete_and_redraft">Διαγραφή και αναδιατύπωση</string>
<string name="action_edit_profile">Επεξεργασία προφίλ</string>
<string name="action_share">Κοινοποίηση</string>
<string name="title_licenses">Άδειες</string>
<string name="action_open_in_web">Ανοίξτε σε browser</string>
<string name="action_view_follow_requests">Αιτήματα ακολούθησης</string>
<string name="action_bookmark">Προσθήκη σελιδοδείκτη</string>
<string name="action_more">Περισσότερα</string>
<string name="action_view_bookmarks">Σελιδοδείκτες</string>
<string name="title_bookmarks">Σελιδοδείκτες</string>
<string name="title_followers">Ακόλουθοι</string>
<string name="action_unblock">Άρση αποκλεισμού</string>
<string name="title_favourites">Αγαπημένα</string>
<string name="error_compose_character_limit">Η δημοσίευση είναι πολύ μεγάλη!</string>
<string name="action_emoji_keyboard">Πληκτρολόγιο emoji</string>
<string name="action_logout_confirm">Είστε σίγουροι ότι θέλετε να αποσυνδεθείτε από τον λογαριασμό %1$s;</string>
<string name="title_drafts">Προσχέδια</string>
<string name="action_view_favourites">Αγαπημένα</string>
<string name="label_quick_reply">Απάντηση…</string>
<string name="action_reject">Απόρριψη</string>
<string name="title_blocks">Αποκλεισμένοι χρήστες</string>
<string name="action_unreblog">Αφαίρεση προώθησης</string>
<string name="action_edit">Επεξεργασία</string>
<string name="action_mute_domain">Σίγαση του %s</string>
<string name="action_block">Αποκλεισμός</string>
<string name="action_undo">Αναίρεση</string>
<string name="notification_follow_request_format">ο/η %s ζήτησε να σας ακολουθήσει</string>
<string name="action_reply">Απάντηση</string>
<string name="title_tab_preferences">Καρτέλες</string>
<string name="notification_reblog_format">ο/η %s προώθησε τη δημοσίευσή σας</string>
<string name="notification_favourite_format">στον/στην %s άρεσε η δημοσίευσή σας</string>
<string name="action_follow">Ακολουθήστε</string>
<string name="action_report">Αναφορά</string>
<string name="action_mute">Σίγαση</string>
<string name="error_audio_upload_size">Τα μουσικά αρχεία πρέπει να είναι μικρότερα από 40MB.</string>
<string name="action_unfavourite">Αφαίρεση αγαπημένου</string>
<string name="report_username_format">Αναφορά του/της %s</string>
<string name="action_view_account_preferences">Προτιμήσεις Λογαριασμού</string>
<string name="action_add_tab">Προσθήκη καρτέλας</string>
<string name="action_copy_link">Αντιγραφή συνδέσμου</string>
<string name="hint_search">Αναζήτηση…</string>
<string name="action_accept">Αποδοχή</string>
<string name="action_show_reblogs">Εμφάνιση προωθήσεων</string>
<string name="action_view_profile">Προφίλ</string>
<string name="title_follow_requests">Αιτήματα ακολούθησης</string>
<string name="action_search">Αναζήτηση</string>
<string name="action_delete_conversation">Διαγραφή συζήτησης</string>
<string name="action_delete">Διαγραφή</string>
<string name="notification_subscription_format">ο/η %s μόλις δημοσίευσε</string>
<string name="action_save">Αποθήκευση</string>
<string name="action_quick_reply">Γρήγορη Απάντηση</string>
<string name="title_mutes">Χρήστες σε σίγαση</string>
<string name="error_image_upload_size">Το αρχείο πρέπει να είναι μικρότερο από 8MB.</string>
<string name="action_hide_reblogs">Απόκρυψη προωθήσεων</string>
<string name="action_view_preferences">Προτιμήσεις</string>
<string name="title_login">Σύνδεση</string>
<string name="title_announcements">Ανακοινώσεις</string>
<string name="action_access_drafts">Προσχέδια</string>
<string name="notification_sign_up_format">ο/η %s έκανε εγγραφή</string>
<string name="action_retry">Προσπαθήστε ξανά</string>
<string name="dialog_delete_post_warning">Διαγραφή αυτής της δημοσίευσης;</string>
<string name="action_unmute">Άρση σίγασης</string>
<string name="action_favourite">Αγαπημένο</string>
<string name="title_links_dialog">Σύνδεσμοι</string>
<string name="action_close">Κλείσιμο</string>
<string name="title_notifications">Ειδοποιήσεις</string>
<string name="action_compose">Γράψτε</string>
<string name="action_login">Σύνδεση με Mastodon</string>
<string name="action_edit_own_profile">Επεξεργασία</string>
<string name="action_reblog">Προώθηση</string>
<string name="dialog_unfollow_warning">Άρση ακολούθησης αυτού του λογαριασμού;</string>
<string name="dialog_mute_hide_notifications">Απόκρυψη ειδοποιήσεων</string>
<string name="action_unbookmark">Αφαίρεση σελιδοδείκτη</string>
<string name="action_content_warning">Προειδοποίηση περιεχομένου</string>
<string name="action_links">Σύνδεσμοι</string>
<string name="login_connection">Σύνδεση…</string>
<string name="action_access_scheduled_posts">Προγραμματισμένες δημοσιεύσεις</string>
<string name="action_schedule_post">Προγραμματισμός δημοσίευσης</string>
<string name="title_scheduled_posts">Προγραμματισμένες δημοσιεύσεις</string>
<string name="title_posts">Δημοσιεύσεις</string>
<string name="title_posts_pinned">Καρφιτσωμένο</string>
<string name="post_sensitive_media_title">Ευαίσθητο περιεχόμενο</string>
<string name="post_media_hidden_title">Κρυμμένα μέσα</string>
<string name="post_boosted_format">ο/η %s το προώθησε</string>
<string name="title_posts_with_replies">Με απαντήσεις</string>
<string name="post_content_warning_show_more">Δείτε περισσότερα</string>
<string name="post_content_warning_show_less">Δείτε λιγότερα</string>
<string name="post_sensitive_media_directions">Κλικ για να δείτε</string>
<string name="notification_update_format">ο/η %s επεξεργάστηκε τη δημοσίευσή του/της</string>
<string name="dialog_redraft_post_warning">Διαγραφή και αναδιατύπωση αυτής της δημοσίευσης;</string>
</resources>

View File

@ -547,4 +547,5 @@
<string name="pref_title_notification_filter_updates">un message avec lequel j\'ai interagi est modifié</string>
<string name="notification_update_name">Messages modifiés</string>
<string name="notification_update_description">Notifications quand un post avec lequel vous avez interagi est modifié</string>
<string name="title_login">Se connecter</string>
</resources>

View File

@ -555,4 +555,5 @@
<string name="notification_update_description">Brathan nuair a thèid postaichean a rinn thu conaltradh leotha a dheasachadh</string>
<string name="pref_title_notification_filter_updates">chaidh post a rinn mi conaltradh leis a deasachadh</string>
<string name="title_login">Clàraich a-steach</string>
<string name="error_could_not_load_login_page">Cha b urrainn dhuinn duilleag a chlàraidh a-steach fhosgladh.</string>
</resources>

View File

@ -2,33 +2,33 @@
<resources>
<string name="error_generic">Si è verificato un errore.</string>
<string name="error_network">Si è verificato un errore di rete! Per favore controlla la tua connessione e riprova!</string>
<string name="error_empty">Questo non può esser vuoto.</string>
<string name="error_invalid_domain">Inserito un dominio non valido</string>
<string name="error_failed_app_registration">Autenticazione fallita con quell\'istanza.</string>
<string name="error_no_web_browser_found">Non riesco a trovare un browser web da usare.</string>
<string name="error_empty">Questo non può essere vuoto.</string>
<string name="error_invalid_domain">Inserito dominio non valido</string>
<string name="error_failed_app_registration">Autenticazione con quell\'istanza fallita.</string>
<string name="error_no_web_browser_found">Nessun browser web utilizzabile trovato.</string>
<string name="error_authorization_unknown">Si è verificato un errore di autenticazione non identificato.</string>
<string name="error_authorization_denied">L\'autorizzazione è stata negata.</string>
<string name="error_retrieving_oauth_token">Errore nell\'acquisizione del token di accesso.</string>
<string name="error_compose_character_limit">Lo stato è troppo lungo!</string>
<string name="error_image_upload_size">La dimensione dei file immagine deve essere inferiore a 8 MB.</string>
<string name="error_video_upload_size">La dimensione dei file video deve essere inferiore a 40 MB.</string>
<string name="error_media_upload_type">Questo tipo di file non può essere caricato.</string>
<string name="error_media_upload_opening">Questo file non può essere aperto.</string>
<string name="error_media_upload_permission">Il permesso di lettura della scheda sd è richiesto.</string>
<string name="error_media_download_permission">È richiesta l\'autorizzazione di archiviazione.</string>
<string name="error_media_upload_image_or_video">Immagini e video non possono essere allegati allo stesso stato.</string>
<string name="error_media_upload_sending">Il caricamento non è riuscito.</string>
<string name="error_sender_account_gone">Errore nell\'invio del toot.</string>
<string name="error_authorization_denied">Autorizzazione negata.</string>
<string name="error_retrieving_oauth_token">Acquisizione token di accesso fallita.</string>
<string name="error_compose_character_limit">Il post è troppo lungo!</string>
<string name="error_image_upload_size">Il file deve essere più piccolo di 8 MB.</string>
<string name="error_video_upload_size">I video devono essere più piccoli di 40 MB.</string>
<string name="error_media_upload_type">Quel tipo di file non può essere caricato.</string>
<string name="error_media_upload_opening">Non è stato possibile aprire quel file.</string>
<string name="error_media_upload_permission">È richiesto il permesso di leggere file.</string>
<string name="error_media_download_permission">È richiesto il permesso di salvare file.</string>
<string name="error_media_upload_image_or_video">Non è possibile allegare allo stesso post immagini e video.</string>
<string name="error_media_upload_sending">Il caricamento è fallito.</string>
<string name="error_sender_account_gone">Errore nell\'invio del post.</string>
<string name="title_home">Home</string>
<string name="title_notifications">Notifiche</string>
<string name="title_public_local">Locale</string>
<string name="title_public_federated">Federata</string>
<string name="title_direct_messages">Messaggi Diretti</string>
<string name="title_direct_messages">Messaggi diretti</string>
<string name="title_tab_preferences">Schede</string>
<string name="title_view_thread">Toot</string>
<string name="title_view_thread">Conversazione</string>
<string name="title_posts">Post</string>
<string name="title_posts_with_replies">Con risposte</string>
<string name="title_posts_pinned">Fissati in alto</string>
<string name="title_posts_pinned">Fissati</string>
<string name="title_follows">Seguiti</string>
<string name="title_followers">Seguono</string>
<string name="title_favourites">Preferiti</string>
@ -43,15 +43,15 @@
<string name="post_sensitive_media_title">Contenuto sensibile</string>
<string name="post_media_hidden_title">Media nascosto</string>
<string name="post_sensitive_media_directions">Clicca per visualizzare</string>
<string name="post_content_warning_show_more">Mostra di P</string>
<string name="post_content_warning_show_less">Mostra Meno</string>
<string name="post_content_warning_show_more">Mostra di p</string>
<string name="post_content_warning_show_less">Mostra di meno</string>
<string name="post_content_show_more">Espandi</string>
<string name="post_content_show_less">Riduci</string>
<string name="message_empty">Qui non c\'è niente.</string>
<string name="footer_empty">Qui non c\'è niente. Trascina verso il basso per aggiornare!</string>
<string name="notification_reblog_format">%s ha boostato il tuo toot</string>
<string name="notification_favourite_format">%s ha messo il tuo toot nei preferiti</string>
<string name="notification_follow_format">%s ti segue</string>
<string name="message_empty">Qui non c\'è nulla.</string>
<string name="footer_empty">Qui non c\'è nulla. Trascina verso il basso per aggiornare!</string>
<string name="notification_reblog_format">%s ha boostato il tuo post</string>
<string name="notification_favourite_format">%s ha messo il tuo post nei preferiti</string>
<string name="notification_follow_format">%s ti ha seguito</string>
<string name="report_username_format">Segnala @%s</string>
<string name="report_comment_hint">Commenti aggiuntivi?</string>
<string name="action_quick_reply">Risposta veloce</string>
@ -79,7 +79,7 @@
<string name="action_close">Chiudi</string>
<string name="action_view_profile">Profilo</string>
<string name="action_view_preferences">Preferenze</string>
<string name="action_view_account_preferences">Preferenze Account</string>
<string name="action_view_account_preferences">Preferenze account</string>
<string name="action_view_favourites">Preferiti</string>
<string name="action_view_mutes">Utenti silenziati</string>
<string name="action_view_blocks">Utenti bloccati</string>
@ -102,14 +102,14 @@
<string name="action_reject">Rifiuta</string>
<string name="action_search">Cerca</string>
<string name="action_access_drafts">Bozze</string>
<string name="action_toggle_visibility">Visibilità dei toot</string>
<string name="action_content_warning">Avviso per il contenuto</string>
<string name="action_toggle_visibility">Visibilità dei post</string>
<string name="action_content_warning">Avviso di contenuto sensibile</string>
<string name="action_emoji_keyboard">Tastiera emoji</string>
<string name="action_add_tab">Aggiungi Scheda</string>
<string name="action_add_tab">Aggiungi scheda</string>
<string name="action_links">Collegamenti</string>
<string name="action_mentions">Menzioni</string>
<string name="action_hashtags">Hashtag</string>
<string name="action_open_reblogger">Apri autore del boost</string>
<string name="action_open_reblogger">Vai all\'autore del boost</string>
<string name="action_open_reblogged_by">Mostra boost</string>
<string name="action_open_faved_by">Mostra preferiti</string>
<string name="title_hashtags_dialog">Hashtag</string>
@ -117,11 +117,11 @@
<string name="title_links_dialog">Collegamenti</string>
<string name="action_open_media_n">Apri media #%d</string>
<string name="download_image">Scaricando %1$s</string>
<string name="action_copy_link">Copia il link</string>
<string name="action_copy_link">Copia link</string>
<string name="action_open_as">Apri come %s</string>
<string name="action_share_as">Condividi come …</string>
<string name="send_post_link_to">Condividi URL del toot su…</string>
<string name="send_post_content_to">Condividi toot su…</string>
<string name="send_post_link_to">Condividi URL del post su…</string>
<string name="send_post_content_to">Condividi post su…</string>
<string name="send_media_to">Condividi media su…</string>
<string name="confirmation_reported">Inviato!</string>
<string name="confirmation_unblocked">Utente sbloccato</string>
@ -132,7 +132,7 @@
<string name="hint_compose">Cosa succede?</string>
<string name="hint_content_warning">Avviso di contenuto sensibile</string>
<string name="hint_display_name">Mostra nome</string>
<string name="hint_note">Bio</string>
<string name="hint_note">Biografia</string>
<string name="hint_search">Cerca…</string>
<string name="search_no_results">Nessun risultato</string>
<string name="label_quick_reply">Rispondi…</string>
@ -152,22 +152,22 @@
<string name="dialog_download_image">Scarica</string>
<string name="dialog_message_cancel_follow_request">Revocare la richiesta di seguire?</string>
<string name="dialog_unfollow_warning">Smettere di seguire questo account?</string>
<string name="dialog_delete_post_warning">Eliminare questo toot?</string>
<string name="dialog_delete_post_warning">Eliminare questo post\?</string>
<string name="visibility_public">Pubblico: visibile sulla timeline pubblica</string>
<string name="visibility_unlisted">Non Elencato: non visibile sulla timeline pubblica e locale</string>
<string name="visibility_private">Solo Follower: visibile solo dai tuoi follower</string>
<string name="visibility_unlisted">Non in elenco: non visibile sulla timeline pubblica e locale</string>
<string name="visibility_private">Solo follower: visibile solo dai tuoi follower</string>
<string name="visibility_direct">Diretto: visibile solo agli utenti menzionati</string>
<string name="pref_title_edit_notification_settings">Modifica Notifiche</string>
<string name="pref_title_edit_notification_settings">Notifiche</string>
<string name="pref_title_notifications_enabled">Notifiche</string>
<string name="pref_title_notification_alerts">Allarmi</string>
<string name="pref_title_notification_alert_sound">Notifica con suoneria</string>
<string name="pref_title_notification_alert_vibrate">Notifica con vibrazione</string>
<string name="pref_title_notification_alert_light">Notifica con luce</string>
<string name="pref_title_notification_filters">Notificami quando</string>
<string name="pref_title_notification_filter_mentions">sono stato menzionato</string>
<string name="pref_title_notification_filter_follows">sono stato seguito</string>
<string name="pref_title_notification_filter_reblogs">i miei post sono boostati</string>
<string name="pref_title_notification_filter_favourites">i miei post sono messi nei preferiti</string>
<string name="pref_title_notification_filter_mentions">vengo menzionato</string>
<string name="pref_title_notification_filter_follows">vengo seguito</string>
<string name="pref_title_notification_filter_reblogs">i miei post vengono boostati</string>
<string name="pref_title_notification_filter_favourites">i miei post vengono messi nei preferiti</string>
<string name="pref_title_appearance_settings">Aspetto</string>
<string name="pref_title_app_theme">Tema dell\'app</string>
<string name="pref_title_timelines">Timeline</string>
@ -176,10 +176,10 @@
<string name="app_theme_light">Chiaro</string>
<string name="app_theme_black">Nero</string>
<string name="app_theme_auto">Automatico al tramonto</string>
<string name="app_theme_system">Usa Tema di Sistema</string>
<string name="app_theme_system">Usa tema di sistema</string>
<string name="pref_title_browser_settings">Browser</string>
<string name="pref_title_custom_tabs">Usa Tab Personalizzate di Chrome</string>
<string name="pref_title_hide_follow_button">Nascondi il pulsante componi mentre scorri</string>
<string name="pref_title_custom_tabs">Usa Custom Tabs di Chrome</string>
<string name="pref_title_hide_follow_button">Nascondi il pulsante Componi mentre scorri</string>
<string name="pref_title_language">Lingua</string>
<string name="pref_title_post_filter">Filtraggio della timeline</string>
<string name="pref_title_post_tabs">Schede</string>
@ -193,25 +193,25 @@
<string name="pref_title_http_proxy_port">Porta proxy HTTP</string>
<string name="pref_default_post_privacy">Privacy di default dei post</string>
<string name="pref_default_media_sensitivity">Segna sempre media come contenuto sensibile</string>
<string name="pref_publishing">Pubblicando (sincronizzato con il server)</string>
<string name="pref_publishing">Pubblicazione (sincronizzato con il server)</string>
<string name="pref_failed_to_sync">Sincronizzazione delle impostazioni fallita</string>
<string name="post_privacy_public">Pubblico</string>
<string name="post_privacy_unlisted">Non elencato</string>
<string name="post_privacy_followers_only">Solo per chi ti segue</string>
<string name="pref_post_text_size">Dimensione del testo degli stati</string>
<string name="post_privacy_unlisted">Non in elenco</string>
<string name="post_privacy_followers_only">Solo follower</string>
<string name="pref_post_text_size">Dimensione del testo dei post</string>
<string name="post_text_size_smallest">Piccolissimo</string>
<string name="post_text_size_small">Piccolo</string>
<string name="post_text_size_medium">Normale</string>
<string name="post_text_size_large">Grande</string>
<string name="post_text_size_largest">Grandissimo</string>
<string name="notification_mention_name">Nuove Menzioni</string>
<string name="notification_mention_descriptions">Notifiche quando qualcuno ti menziona</string>
<string name="notification_follow_name">Nuove persone che ti seguono</string>
<string name="notification_follow_description">Notifiche su nuove persone che ti seguono</string>
<string name="notification_mention_name">Nuove menzioni</string>
<string name="notification_mention_descriptions">Notifiche di quando vieni menzionato da qualcuno</string>
<string name="notification_follow_name">Nuovi follower</string>
<string name="notification_follow_description">Notifiche su nuovi follower</string>
<string name="notification_boost_name">Boost</string>
<string name="notification_boost_description">Notifiche quando i tuoi toot vengono boostati</string>
<string name="notification_boost_description">Notifiche sui tuoi post che vengono boostati</string>
<string name="notification_favourite_name">Preferiti</string>
<string name="notification_favourite_description">Notifiche quando i tuoi toot vengono segnati come preferiti</string>
<string name="notification_favourite_description">Notifiche sui tuoi post che vengono segnati come preferiti</string>
<string name="notification_mention_format">%s ti ha menzionato</string>
<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>
@ -234,14 +234,14 @@
-->
<string name="about_project_site">Sito web del progetto:\n
https://accelf.net/yuito</string>
<string name="about_bug_feature_request_site">Segnala problemi &amp; richiedi funzionalità:\n
https://github.com/accelforce/Yuito/issues</string>
<string name="about_bug_feature_request_site">Segnala problemi e richiedi funzionalità:
\n https://github.com/accelforce/Yuito/issues</string>
<string name="about_tusky_account">Profilo di Yuito</string>
<string name="post_share_content">Condividi contenuto del toot</string>
<string name="post_share_link">Condividi link al toot</string>
<string name="post_share_content">Condividi contenuto del post</string>
<string name="post_share_link">Condividi link al post</string>
<string name="post_media_images">Immagini</string>
<string name="post_media_video">Video</string>
<string name="state_follow_requested">In attesa di approvazione</string>
<string name="state_follow_requested">Richiesta inviata</string>
<!--These are for timestamps on statuses. For example: "16s" or "2d"-->
<string name="abbreviated_in_years">in %da</string>
<string name="abbreviated_in_days">in %dg</string>
@ -250,14 +250,14 @@
<string name="abbreviated_in_seconds">in %ds</string>
<string name="abbreviated_years_ago">%da</string>
<string name="abbreviated_days_ago">%dg</string>
<string name="abbreviated_hours_ago">%do</string>
<string name="abbreviated_minutes_ago">%dmin</string>
<string name="abbreviated_seconds_ago">%ds</string>
<string name="follows_you">Seguono te</string>
<string name="pref_title_alway_show_sensitive_media">Mostra sempre tutto il contenuto sensibile</string>
<string name="abbreviated_hours_ago">%do</string>
<string name="abbreviated_minutes_ago">%dmin</string>
<string name="abbreviated_seconds_ago">%ds</string>
<string name="follows_you">Ti segue</string>
<string name="pref_title_alway_show_sensitive_media">Mostra sempre tutti i contenuti sensibili</string>
<string name="title_media">Media</string>
<string name="replying_to">Rispondendo a @%s</string>
<string name="load_more_placeholder_text">carica di più</string>
<string name="load_more_placeholder_text">carica altri</string>
<string name="pref_title_public_filter_keywords">Timeline pubbliche</string>
<string name="pref_title_thread_filter_keywords">Conversazioni</string>
<string name="filter_addition_dialog_title">Aggiungi filtro</string>
@ -265,7 +265,7 @@
<string name="filter_dialog_remove_button">Rimuovi</string>
<string name="filter_dialog_update_button">Aggiorna</string>
<string name="filter_add_description">Frase da filtrare</string>
<string name="add_account_name">Aggiungi Account</string>
<string name="add_account_name">Aggiungi account</string>
<string name="add_account_description">Aggiungi un nuovo Account Mastodon</string>
<string name="action_lists">Liste</string>
<string name="title_lists">Liste</string>
@ -288,29 +288,29 @@
<string name="action_set_caption">Inserisci descrizione</string>
<string name="action_remove">Rimuovi</string>
<string name="lock_account_label">Blocca account</string>
<string name="lock_account_label_description">Richiede la tua approvazione manuale di chi ti segue</string>
<string name="lock_account_label_description">Richiedi una tua approvazione manuale per seguirti</string>
<string name="compose_save_draft">Salvare bozza?</string>
<string name="send_post_notification_title">Inviando il Toot…</string>
<string name="send_post_notification_title">Inviando il post…</string>
<string name="send_post_notification_error_title">Errore durante l\'invio</string>
<string name="send_post_notification_channel_name">Invio Toot</string>
<string name="send_post_notification_channel_name">Invio post</string>
<string name="send_post_notification_cancel_title">Invio annullato</string>
<string name="send_post_notification_saved_content">Una copia del toot è stata salvata nelle tue bozze</string>
<string name="send_post_notification_saved_content">Una copia del post è stata salvata nelle tue bozze</string>
<string name="action_compose_shortcut">Componi</string>
<string name="error_no_custom_emojis">La tua istanza %s non ha nessuna emoji personalizzata</string>
<string name="emoji_style">Stile di emoji</string>
<string name="system_default">Predefiniti del sistema</string>
<string name="emoji_style">Stile delle emoji</string>
<string name="system_default">Predefinite del sistema</string>
<string name="download_fonts">Dovrai prima scaricare questo pacchetto di emoji</string>
<string name="performing_lookup_title">Eseguendo una ricerca</string>
<string name="expand_collapse_all_posts">Espandi/Riduci tutti gli stati</string>
<string name="action_open_post">Apri toot</string>
<string name="performing_lookup_title">Ricerca in corso</string>
<string name="expand_collapse_all_posts">Espandi/riduci tutti i post</string>
<string name="action_open_post">Apri post</string>
<string name="restart_required">Riavvio dell\'app richiesto</string>
<string name="restart_emoji">Devi riavviare Yuito per applicare queste modifiche</string>
<string name="later">Più tardi</string>
<string name="restart">Riavvia</string>
<string name="caption_systememoji">Le emoji predefinite del tuo dispositivo</string>
<string name="caption_blobmoji">Le emoji Blob conosciute da Android 4.4-7.1</string>
<string name="caption_blobmoji">Le emoji Blob di Android 4.4-7.1</string>
<string name="caption_twemoji">Le emoji standard di Mastodon</string>
<string name="download_failed">Scaricamento fallito</string>
<string name="download_failed">Download fallito</string>
<string name="profile_badge_bot_text">Bot</string>
<string name="account_moved_description">%1$s si è spostato su:</string>
<string name="reblog_private">Boost con la visibilità del post di origine</string>
@ -323,63 +323,60 @@
<string name="profile_metadata_add">aggiungi dati</string>
<string name="profile_metadata_label_label">Etichetta</string>
<string name="profile_metadata_content_label">Contenuto</string>
<string name="pref_title_absolute_time">Usa tempo assoluto</string>
<string name="pref_title_absolute_time">Usa ora assoluta</string>
<string name="label_remote_account">Il profilo dell\'utente mostrato qui sotto potrebbe essere incompleto. Premi per aprire il profilo completo nel browser.</string>
<string name="unpin_action">Non fissare</string>
<string name="unpin_action">Smetti di fissare</string>
<string name="pin_action">Fissa</string>
<plurals name="favs">
<item quantity="one"><b>%1$s</b> Mi piace</item>
<item quantity="other"><b>%1$s</b> Mi piace</item>
<item quantity="one"><b>%1$s</b> Preferito</item>
<item quantity="other"><b>%1$s</b> Preferiti</item>
</plurals>
<plurals name="reblogs">
<item quantity="one">&lt;b&gt;%s&lt;/b&gt; Boost</item>
<item quantity="other">&lt;b&gt;%s&lt;/b&gt; Boost</item>
</plurals>
<string name="title_reblogged_by">Boostato da</string>
<string name="title_favourited_by">Preferito da</string>
<string name="title_favourited_by">Aggiunto ai preferiti da</string>
<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>
<plurals name="max_tab_number_reached">
<item quantity="one">limite massimo di %1$d tab raggiunto</item>
<item quantity="other">limite massimo di %1$d tab raggiunto</item>
<item quantity="one">limite massimo di %1$d scheda raggiunto</item>
<item quantity="other">limite massimo di %1$d schede raggiunto</item>
</plurals>
<string name="description_post_media"> Media: %s
</string>
<string name="description_post_media">Media: %s</string>
<string name="description_post_cw"> Contenuto sensibile: %s
</string>
<string name="description_post_media_no_description_placeholder"> Nessuna descrizione
</string>
<string name="description_post_reblogged"> Ribloggato
</string>
<string name="description_post_favourited"> Apprezzato
</string>
<string name="description_post_favourited">Messo nei preferiti</string>
<string name="description_visiblity_public"> Pubblico
</string>
<string name="description_visiblity_unlisted"> Non elencato
</string>
<string name="description_visiblity_private">Seguaci</string>
<string name="description_visiblity_unlisted">Non in elenco</string>
<string name="description_visiblity_private">Solo follower</string>
<string name="description_visiblity_direct"> Diretti
</string>
<string name="hint_list_name">Nome della lista</string>
<string name="download_media">Scarica media</string>
<string name="downloading_media">Scaricando media</string>
<string name="compose_shortcut_long_label">Componi Toot</string>
<string name="compose_shortcut_long_label">Componi post</string>
<string name="edit_hashtag_hint">Hashtag senza #</string>
<string name="compose_shortcut_short_label">Componi</string>
<string name="notifications_clear">Pulisci</string>
<string name="notifications_clear">Svuota</string>
<string name="notifications_apply_filter">Filtra</string>
<string name="filter_apply">Applica</string>
<string name="pref_title_bot_overlay">Mostra indicatore per bot</string>
<string name="pref_title_bot_overlay">Mostra indicatore bot</string>
<string name="notification_clear_text">Sei sicuro di voler permanentemente eliminare tutte le tue notifiche\?</string>
<string name="action_delete_and_redraft">Cancella e riscrivi</string>
<string name="dialog_redraft_post_warning">Cancellare e riscrivere questo toot\?</string>
<string name="dialog_redraft_post_warning">Cancellare e riscrivere questo post\?</string>
<plurals name="poll_info_votes">
<item quantity="one">%s voto</item>
<item quantity="other">%s voti</item>
</plurals>
<string name="poll_info_time_absolute">termina alle %s</string>
<string name="poll_info_closed">terminato</string>
<string name="poll_info_time_absolute">si conclude alle %s</string>
<string name="poll_info_closed">concluso</string>
<string name="poll_vote">Vota</string>
<string name="title_domain_mutes">Domini nascosti</string>
<string name="action_view_domain_mutes">Domini nascosti</string>
@ -387,37 +384,37 @@
<string name="confirmation_domain_unmuted">%s mostrati</string>
<string name="mute_domain_warning">Sei sicuro di voler bloccare tutto %s\? Non vedrai nessun contenuto da quel dominio in nessuna timeline pubblica o nelle tue notifiche. I tuoi seguaci che stanno in quel dominio saranno rimossi.</string>
<string name="mute_domain_warning_dialog_ok">Nascondi l\'intero dominio</string>
<string name="pref_title_notification_filter_poll">Le votazioni sono finite</string>
<string name="pref_title_animate_gif_avatars">Mostra le animazioni delle GIF negli avatar</string>
<string name="pref_title_notification_filter_poll">dei sondaggi si sono conclusi</string>
<string name="pref_title_animate_gif_avatars">Riproduci animazioni avatar</string>
<string name="notification_poll_name">Votazioni</string>
<string name="notification_poll_description">Notifiche sulle votazioni che sono concluse</string>
<string name="notification_poll_description">Notifiche sulle votazioni che si sono concluse</string>
<string name="filter_dialog_whole_word">Parola intera</string>
<string name="filter_dialog_whole_word_description">Quando la parola chiave o la frase sono composte da soli caratteri alfanumerici, sarà applicata solo se corrisponde alla parola completa</string>
<string name="caption_notoemoji">Insieme di emoji di Google</string>
<string name="caption_notoemoji">Set di emoji di Google</string>
<string name="title_bookmarks">Segnalibri</string>
<string name="action_bookmark">Segnalibro</string>
<string name="action_edit">Modifica</string>
<string name="action_view_bookmarks">Segnalibri</string>
<string name="action_add_poll">Aggiungi sondaggio</string>
<string name="about_powered_by_tusky">Fatto con Tusky</string>
<string name="pref_title_alway_open_spoiler">Espandi sempre i toot segnalati come contenuto sensibile</string>
<string name="description_post_bookmarked">Messo nei segalibri</string>
<string name="about_powered_by_tusky">Fatto usando Tusky</string>
<string name="pref_title_alway_open_spoiler">Espandi sempre i post segnalati come contenuto sensibile</string>
<string name="description_post_bookmarked">Messo nei segnalibri</string>
<string name="description_poll">Sondaggio con scelte: %1$s, %2$s, %3$s, %4$s; %5$s</string>
<string name="select_list_title">Scegli lista</string>
<string name="list">Lista</string>
<string name="compose_preview_image_description">Azioni per l\'immagine %s</string>
<string name="poll_ended_voted">Un sondaggio che hai votato è terminato</string>
<string name="poll_ended_created">Un sondaggio che hai creato è terminato</string>
<string name="poll_ended_voted">Un sondaggio che hai votato si è concluso</string>
<string name="poll_ended_created">Un sondaggio che hai creato si è concluso</string>
<plurals name="poll_timespan_days">
<item quantity="one">%d giorno rimasti</item>
<item quantity="one">%d giorno rimasto</item>
<item quantity="other">%d giorni rimasti</item>
</plurals>
<plurals name="poll_timespan_hours">
<item quantity="one">%d ora rimasti</item>
<item quantity="one">%d ora rimasta</item>
<item quantity="other">%d ore rimasti</item>
</plurals>
<plurals name="poll_timespan_minutes">
<item quantity="one">%d minuto rimasti</item>
<item quantity="one">%d minuto rimasto</item>
<item quantity="other">%d minuti rimasti</item>
</plurals>
<plurals name="poll_timespan_seconds">
@ -427,12 +424,12 @@
<string name="button_continue">Continua</string>
<string name="button_back">Indietro</string>
<string name="button_done">Fatto</string>
<string name="report_sent_success">Inviato con successo @%s</string>
<string name="report_sent_success">Segnalato @%s con successo</string>
<string name="hint_additional_info">Altri commenti</string>
<string name="report_remote_instance">Inoltra a %s</string>
<string name="failed_report">Errore durante l\'invio</string>
<string name="failed_fetch_posts">Errore durante lo scaricamento degli aggiornamenti</string>
<string name="report_description_1">La segnalazione sarà inviata al moderatore del tuo server. Puoi spiegare perchè vuoi segnalare questo utente qui sotto:</string>
<string name="failed_report">Segnalazione fallita</string>
<string name="failed_fetch_posts">Scaricamento dei post fallito</string>
<string name="report_description_1">La segnalazione sarà inviata al moderatore del tuo server. Puoi spiegare perchè stai segnalando questo utente qui sotto:</string>
<string name="report_description_remote_instance">L\'utente è su un altro server. Mandare una copia della segnalazione anche lì\?</string>
<string name="title_accounts">Utenti</string>
<string name="failed_search">Errore durante la ricerca</string>
@ -450,10 +447,10 @@
<string name="poll_new_choice_hint">Scelta %d</string>
<string name="edit_poll">Modifica</string>
<string name="post_lookup_error_format">Errore nella ricerca del post %s</string>
<string name="title_scheduled_posts">Toot programmati</string>
<string name="action_access_scheduled_posts">Toot programmati</string>
<string name="action_schedule_post">Programma un toot</string>
<string name="action_reset_schedule">RIpristina</string>
<string name="title_scheduled_posts">Post programmati</string>
<string name="action_access_scheduled_posts">Post programmati</string>
<string name="action_schedule_post">Programma un post</string>
<string name="action_reset_schedule">Ripristina</string>
<string name="poll_info_format"> <!-- 15 votes • 1 hour left --> %1$s • %2$s</string>
<string name="no_drafts">Non hai bozze.</string>
<plurals name="poll_info_people">
@ -464,66 +461,66 @@
<string name="add_hashtag_title">Aggiungi hashtag</string>
<string name="dialog_mute_warning">Silenziare @%s\?</string>
<string name="dialog_block_warning">Bloccare @%s\?</string>
<string name="action_unmute_domain">Non silenziare più %s</string>
<string name="action_unmute_conversation">Smetti di silenziare conversazione</string>
<string name="action_unmute_domain">Smetti di silenziare %s</string>
<string name="action_unmute_conversation">Smetti di silenziare la conversazione</string>
<string name="action_mute_conversation">Silenzia conversazione</string>
<string name="notification_follow_request_format">%s ha chiesto di seguirti</string>
<string name="error_audio_upload_size">La dimensione dei file audio deve essere inferiore a 40 MB.</string>
<string name="error_audio_upload_size">I file audio devono essere più piccoli di 40 MB.</string>
<string name="action_unmute_desc">Smetti di silenziare %s</string>
<string name="notification_follow_request_name">Richieste di seguirti</string>
<string name="account_note_saved">Salvato!</string>
<string name="account_note_hint">La tua nota privata su questo account</string>
<string name="pref_title_hide_top_toolbar">Nascondi il titolo della barra degli strumenti in alto</string>
<string name="pref_title_confirm_reblogs">Mostra la finestra di dialogo di conferma prima del boosting</string>
<string name="pref_title_confirm_reblogs">Mostra la finestra di conferma prima di boostare</string>
<string name="pref_title_show_cards_in_timelines">Mostra le anteprime dei collegamenti nelle timelines</string>
<string name="warning_scheduling_interval">Mastodon ha un intervallo minimo di programmazione di 5 minuti.</string>
<string name="warning_scheduling_interval">Mastodon ha un intervallo di programmazione minimo di 5 minuti.</string>
<string name="no_announcements">Non ci sono annunci.</string>
<string name="no_scheduled_posts">Non hai stati pianificati.</string>
<string name="no_scheduled_posts">Non hai post pianificati.</string>
<string name="pref_title_enable_swipe_for_tabs">Abilita il gesto di scorrimento per passare da una scheda all\'altra</string>
<string name="notification_follow_request_description">Notifiche sulle richieste di essere seguiti</string>
<string name="pref_main_nav_position_option_bottom">Parte inferiore</string>
<string name="pref_main_nav_position_option_bottom">In fondo</string>
<string name="pref_main_nav_position_option_top">In cima</string>
<string name="pref_main_nav_position">Posizione di navigazione principale</string>
<string name="pref_title_gradient_for_media">Mostra sfumature colorate per i media nascosti</string>
<string name="pref_main_nav_position">Posizione barra di navigazione principale</string>
<string name="pref_title_gradient_for_media">Mostra gradienti colorati per i media nascosti</string>
<string name="dialog_mute_hide_notifications">Nascondi notifiche</string>
<string name="action_mute_notifications_desc">Disattiva le notifiche da %s</string>
<string name="action_unmute_notifications_desc">Riattiva le notifiche da %s</string>
<string name="title_announcements">Annunci</string>
<string name="pref_title_notification_filter_follow_requests">Richieste di seguirti</string>
<string name="pref_title_notification_filter_follow_requests">mi viene richiesto di seguirmi</string>
<string name="wellbeing_hide_stats_profile">Nascondi statistiche quantitative sui profili</string>
<string name="wellbeing_hide_stats_posts">Nascondi le statistiche quantitative sui post</string>
<string name="limit_notifications">Limita le notifiche della timeline</string>
<string name="review_notifications">Revisiona le notifiche</string>
<string name="limit_notifications">Limita le notifiche dalla timeline</string>
<string name="review_notifications">Rivedi le notifiche</string>
<string name="pref_title_wellbeing_mode">Benessere</string>
<string name="notification_subscription_description">Notifiche di quando qualcuno a cui sei iscritto ha pubblicato un nuovo toot</string>
<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="notification_subscription_description">Notifiche di nuovi post di qualcuno a cui sei iscritto</string>
<string name="notification_subscription_name">Nuovi post</string>
<string name="pref_title_notification_filter_subscriptions">qualcuno che seguo ha pubblicato un nuovo post</string>
<string name="notification_subscription_format">%s ha appena pubblicato</string>
<plurals name="error_upload_max_media_reached">
<item quantity="one">Non puoi caricare più di %1$d allegato multimediale.</item>
<item quantity="other">Non puoi caricare più di %1$d allegati multimediali.</item>
</plurals>
<string name="drafts_post_reply_removed">Il toot a cui hai scritto una risposta è stato rimosso</string>
<string name="draft_deleted">Bozza cancellata</string>
<string name="drafts_post_failed_to_send">L\'invio di questo toot è fallito!</string>
<string name="drafts_post_reply_removed">Il post a cui hai scritto una risposta è stato rimosso</string>
<string name="draft_deleted">Bozza eliminata</string>
<string name="drafts_post_failed_to_send">L\'invio di questo post è fallito!</string>
<string name="dialog_delete_list_warning">Sei sicuro di voler cancellare la lista %s\?</string>
<string name="duration_indefinite">Indefinita</string>
<string name="label_duration">Durata</string>
<string name="post_media_attachments">Allegati</string>
<string name="post_media_audio">Audio</string>
<string name="pref_title_animate_custom_emojis">Mostra le animazioni delle emojis personalizzate</string>
<string name="pref_title_animate_custom_emojis">Riproduci emoji animate</string>
<string name="action_subscribe_account">Iscriviti</string>
<string name="dialog_delete_conversation_warning">Rimuovere questa conversazione\?</string>
<string name="drafts_failed_loading_reply">Errore nel recuperare le informazioni sulla risposta</string>
<string name="drafts_failed_loading_reply">Errore nel recupero delle informazioni sulla risposta</string>
<string name="action_unsubscribe_account">Disiscriviti</string>
<string name="action_delete_conversation">Rimuovi conversazione</string>
<string name="action_delete_conversation">Elimina conversazione</string>
<string name="wellbeing_mode_notice">Alcune informazioni che potrebbero influenzare il tuo benessere mentale saranno nascoste. Questo include:
\n
\n - Notifiche riguardo a Preferiti/Boost/Following
\n - Conteggio dei Preferiti/Boost nei toot
\n - Statistiche riguardo a Preferiti e Post nei profili
\n - Conteggio dei Preferiti/Boost nei post
\n - Statistiche riguardo a Preferiti/Post nei profili
\n
\n Le notifiche push non saranno influenzate, ma puoi rivedere le tue impostazioni delle notifiche manualmente.</string>
\n Le notifiche push non saranno influenzate, ma puoi modificare le tue impostazioni delle notifiche manualmente.</string>
<string name="action_unbookmark">Rimuovi segnalibro</string>
<string name="pref_title_confirm_favourites">Chiedi conferma prima di boostare</string>
<string name="duration_14_days">14 giorni</string>
@ -532,5 +529,16 @@
<string name="duration_90_days">90 giorni</string>
<string name="duration_180_days">180 giorni</string>
<string name="duration_365_days">365 giorni</string>
<string name="follow_requests_info">Anche se il tuo account non è bloccato, lo staff di %1$s ha pensato che potresti voler controllare queste richieste di following da parte questi account manualmente.</string>
<string name="follow_requests_info">Anche se il tuo account non è bloccato, lo staff di %1$s ha pensato che potresti voler verificare le richieste di seguirti da parte questi account manualmente.</string>
<string name="notification_sign_up_format">%s si è registrato</string>
<string name="pref_title_notification_filter_sign_ups">qualcuno si è registrato</string>
<string name="title_login">Login</string>
<string name="notification_update_format">%s ha modificato il suo post</string>
<string name="pref_title_notification_filter_updates">un post con cui ho interagito è stato modificato</string>
<string name="tusky_compose_post_quicksetting_label">Componi post</string>
<string name="notification_sign_up_name">Registrazioni</string>
<string name="notification_sign_up_description">Notifiche di quando qualcuno si è registrato</string>
<string name="notification_update_name">Modifiche ai post</string>
<string name="notification_update_description">Notifiche di quando i post con cui hai interagito vengono modificati</string>
<string name="error_could_not_load_login_page">Non è stato possibile caricare la pagina di login.</string>
</resources>

View File

@ -527,4 +527,5 @@
<string name="notification_update_name">Redigerte innlegg</string>
<string name="notification_update_description">Varslinger når et innlegg du har hatt en interaksjon med er redigert</string>
<string name="title_login">Innlogging</string>
<string name="error_could_not_load_login_page">Klarte ikke å laste innloggingssiden.</string>
</resources>

View File

@ -10,20 +10,20 @@
</plurals>
<string name="replying_to">A responder a @%s</string>
<string name="action_edit_list">Editar a lista</string>
<string name="lock_account_label_description">Exige a aprovação manual de seguidores</string>
<string name="lock_account_label_description">Necessita de aprovar manualmente os seguidores</string>
<string name="compose_save_draft">Guardar rascunho\?</string>
<string name="later">Depois</string>
<string name="unpin_action">Desafixar</string>
<string name="conversation_2_recipients">%1$s e %2$s</string>
<string name="pref_title_wellbeing_mode">Bem-estar</string>
<string name="tusky_compose_post_quicksetting_label">Escrever Toot</string>
<string name="dialog_delete_list_warning">Deseja excluir a lista %s\?</string>
<string name="follow_requests_info">Apesar do seu perfil não ser trancado, %1$s exige que você revise a solicitação para te seguir destes perfis manualmente.</string>
<string name="action_subscribe_account">Notificar</string>
<string name="action_unsubscribe_account">Cancelar</string>
<string name="dialog_delete_list_warning">Pretende remover a lista %s\?</string>
<string name="follow_requests_info">Apesar do seu perfil não ser privado, %1$s exige que você reveja manualmente as solicitações para te seguir destes perfis.</string>
<string name="action_subscribe_account">Subscrever</string>
<string name="action_unsubscribe_account">Remover subscrição</string>
<string name="error_authorization_denied">Autorização negada.</string>
<string name="error_retrieving_oauth_token">Erro ao adquirir token de login.</string>
<string name="error_compose_character_limit">O toot é muito longo!</string>
<string name="error_compose_character_limit">O toot é muito extenso!</string>
<string name="error_image_upload_size">O ficheiro deve ter menor de 8MB.</string>
<string name="error_video_upload_size">Os ficheiros de vídeo devem ter menor de 40MB.</string>
<string name="error_audio_upload_size">Os ficheiros de áudio devem ter menor de 40MB.</string>
@ -48,13 +48,13 @@
<string name="title_followers">Seguidores</string>
<string name="title_favourites">Favoritos</string>
<string name="title_bookmarks">Itens guardados</string>
<string name="title_mutes">Utilizadors silenciados</string>
<string name="title_blocks">Utilizadors bloqueados</string>
<string name="title_mutes">Utilizadores silenciados</string>
<string name="title_blocks">Utilizadores bloqueados</string>
<string name="title_domain_mutes">Instâncias bloqueadas</string>
<string name="title_follow_requests">Seguidores Pendentes</string>
<string name="post_sensitive_media_title">Conteúdo sensível</string>
<string name="title_edit_profile">Editar perfil</string>
<string name="post_media_hidden_title">Conteúdo ocultado</string>
<string name="post_media_hidden_title">Conteúdo multimédia ocultado</string>
<string name="title_drafts">Rascunhos</string>
<string name="post_sensitive_media_directions">Toque para ver</string>
<string name="post_content_warning_show_more">Mostrar Mais</string>
@ -67,7 +67,7 @@
<string name="post_username_format">\@%s</string>
<string name="post_boosted_format">%s fez boost</string>
<string name="message_empty">Nada aqui.</string>
<string name="footer_empty">Nada aqui. Arraste para baixo para atualizar!</string>
<string name="footer_empty">Nada para ver aqui. Arraste para baixo para atualizar!</string>
<string name="notification_reblog_format">%s fez boost ao seu toot</string>
<string name="notification_favourite_format">%s adicionou o seu toot aos favoritos</string>
<string name="notification_follow_format">%s está a seguir-te</string>
@ -77,7 +77,7 @@
<string name="notification_update_format">%s editou um toot</string>
<string name="report_username_format">Denunciar @%s</string>
<string name="report_comment_hint">Comentários adicionais\?</string>
<string name="action_quick_reply">Resposta rápida</string>
<string name="action_quick_reply">Resposta Rápida</string>
<string name="action_reply">Responder</string>
<string name="action_reblog">Fazer boost</string>
<string name="action_unreblog">Desfazer boost</string>
@ -89,7 +89,7 @@
<string name="action_compose">Escrever</string>
<string name="action_login">Entrar com Mastodon</string>
<string name="action_logout">Sair</string>
<string name="action_logout_confirm">Tem certeza de que deseja sair da conta %1$s\?</string>
<string name="action_logout_confirm">Tem a certeza que deseja sair da conta %1$s\?</string>
<string name="action_follow">Seguir</string>
<string name="action_unfollow">Deixar de seguir</string>
<string name="action_block">Bloquear</string>
@ -106,12 +106,12 @@
<string name="action_retry">Tentar novamente</string>
<string name="action_close">Fechar</string>
<string name="action_view_profile">Perfil</string>
<string name="action_view_preferences">Preferências</string>
<string name="action_view_account_preferences">Preferências da Conta</string>
<string name="action_view_preferences">Configurações</string>
<string name="action_view_account_preferences">Configurações da Conta</string>
<string name="action_view_favourites">Favoritos</string>
<string name="action_view_bookmarks">Guardados</string>
<string name="action_view_mutes">utilizadors silenciados</string>
<string name="action_view_blocks">utilizadors bloqueados</string>
<string name="action_view_bookmarks">Itens Guardados</string>
<string name="action_view_mutes">Utilizadores silenciados</string>
<string name="action_view_blocks">Utilizadores bloqueados</string>
<string name="action_view_domain_mutes">Instâncias bloqueadas</string>
<string name="action_view_follow_requests">Seguidores Pendentes</string>
<string name="action_view_media">Conteúdo multimédia</string>
@ -138,13 +138,13 @@
<string name="action_toggle_visibility">Privacidade do toot</string>
<string name="action_content_warning">Aviso de conteúdo</string>
<string name="action_emoji_keyboard">Teclado de emojis</string>
<string name="action_schedule_post">Agendar toot</string>
<string name="action_schedule_post">Agendar Toot</string>
<string name="action_reset_schedule">Redefinir</string>
<string name="action_add_tab">Adicionar Separador</string>
<string name="action_links">Hiperligações</string>
<string name="action_mentions">Menções</string>
<string name="action_hashtags">Hashtags</string>
<string name="action_open_reblogger">Ver quem fez boost</string>
<string name="action_open_reblogger">Ver autor do boost</string>
<string name="action_open_reblogged_by">Mostrar boosts</string>
<string name="action_open_faved_by">Mostrar favoritos</string>
<string name="title_hashtags_dialog">Hashtags</string>
@ -152,7 +152,7 @@
<string name="title_links_dialog">Hiperligações</string>
<string name="action_open_media_n">Abrir conteúdo multimédia #%d</string>
<string name="download_image">A descarregar %1$s</string>
<string name="action_copy_link">Copiar hiperligação</string>
<string name="action_copy_link">Copiar a hiperligação</string>
<string name="action_open_as">Abrir como %s</string>
<string name="action_share_as">Partilhar como…</string>
<string name="download_media">Descarregar conteúdo multimédia</string>
@ -178,22 +178,22 @@
<string name="label_header">Cabeçalho</string>
<string name="link_whats_an_instance">O que é uma instância\?</string>
<string name="login_connection">A ligar…</string>
<string name="dialog_whats_an_instance">O endereço IP ou domínio de qualquer instância pode ser inserido aqui, como por exemplo mastodon.social, masto.donte.com.br, colorid.es ou qualquer <a href="https://instances.social">outro!</a>
<string name="dialog_whats_an_instance">O endereço IP ou domínio de qualquer instância pode ser inserido aqui, como por exemplo mastodon.social, masto.pt, pleroma.pt ou qualquer <a href="https://instances.social">outro!</a>
\n
\n Se ainda não tem uma conta, insira o nome da instância onde pretende participar e crie uma conta lá.
\nSe ainda não tem uma conta, insira o nome da instância onde pretende participar e crie uma conta lá.
\n
\n Uma instância é um lugar onde sua conta é hospedada, mas pode facilmente seguir e comunicar com pessoas de outras instâncias como se todos estivessem no mesmo site.
\nUma instância é o local onde sua conta é criada, mas pode facilmente seguir e comunicar com pessoas de outras instâncias como se estivessem todos no mesmo site.
\n
\nMais informações disponíveis em <a href="https://joinmastodon.org">joinmastodon.org</a>. </string>
<string name="dialog_title_finishing_media_upload">Envio de Conteúdo Multimédia Terminando</string>
<string name="dialog_title_finishing_media_upload">A Terminar Envio de Conteúdo Multimédia</string>
<string name="dialog_message_uploading_media">A enviar…</string>
<string name="dialog_download_image">Descarregar</string>
<string name="dialog_message_cancel_follow_request">Cancelar pedido para seguir\?</string>
<string name="dialog_message_cancel_follow_request">Cancelar o pedido para seguir\?</string>
<string name="dialog_unfollow_warning">Deixar de seguir esta conta\?</string>
<string name="dialog_delete_post_warning">Apagar este toot\?</string>
<string name="dialog_redraft_post_warning">Apagar e criar novo rascunho\?</string>
<string name="dialog_redraft_post_warning">Apagar e rescrever este toot\?</string>
<string name="dialog_delete_conversation_warning">Apagar esta conversa\?</string>
<string name="mute_domain_warning">Tem certeza que pretende bloquear a instância %s\? Deixará de poder ver quaisquer conteúdos dessa instância em qualquer timeline pública ou nas suas notificações. Os seus seguidores dessa instância serão removidos.</string>
<string name="mute_domain_warning">Tem a certeza que pretende bloquear a instância %s\? Deixará de poder ver quaisquer conteúdos dessa instância em qualquer timeline pública ou nas suas notificações. Os seus seguidores dessa instância serão removidos.</string>
<string name="mute_domain_warning_dialog_ok">Bloquear instância</string>
<string name="dialog_block_warning">Bloquear @%s\?</string>
<string name="dialog_mute_warning">Silenciar @%s\?</string>
@ -202,7 +202,7 @@
<string name="visibility_unlisted">Não listado: Não publicar em timelines públicas</string>
<string name="visibility_private">Privado: Publicar apenas para os seguidores</string>
<string name="visibility_direct">Direto: Publicar apenas para os utilizadores mencionados</string>
<string name="pref_title_edit_notification_settings">Editar notificações</string>
<string name="pref_title_edit_notification_settings">Notificações</string>
<string name="pref_title_notifications_enabled">Notificações</string>
<string name="pref_title_notification_alerts">Alertas</string>
<string name="pref_title_notification_alert_sound">Notificar com som</string>
@ -213,17 +213,17 @@
<string name="pref_title_notification_filter_follows">for seguido</string>
<string name="pref_title_notification_filter_subscriptions">alguém para quem ativei os alertas publicar um toot novo</string>
<string name="pref_title_notification_filter_follow_requests">fizerem pedido para me seguir</string>
<string name="pref_title_notification_filter_reblogs">derem boosts nos meus toots</string>
<string name="pref_title_notification_filter_reblogs">fizerem boosts aos meus toots</string>
<string name="pref_title_notification_filter_favourites">adicionarem os meus toots aos favoritos</string>
<string name="pref_title_notification_filter_poll">votações terminarem</string>
<string name="pref_title_notification_filter_sign_ups">alguém criar conta</string>
<string name="pref_title_notification_filter_updates">um toot com o qual interagi for editado</string>
<string name="pref_title_appearance_settings">Aparência</string>
<string name="pref_title_app_theme">Temas</string>
<string name="pref_title_app_theme">Tema da Aplicação</string>
<string name="pref_title_timelines">Timelines</string>
<string name="pref_title_timeline_filters">Filtros</string>
<string name="app_them_dark">Noturno</string>
<string name="app_theme_light">Diurno</string>
<string name="app_them_dark">Escuro</string>
<string name="app_theme_light">Claro</string>
<string name="app_theme_black">AMOLED</string>
<string name="app_theme_auto">Automático ao pôr-do-sol</string>
<string name="app_theme_system">Usar o Tema do Sistema</string>
@ -232,11 +232,11 @@
<string name="pref_title_hide_follow_button">Esconder o botão de criação de toots ao fazer scroll</string>
<string name="pref_title_language">Idioma</string>
<string name="pref_title_bot_overlay">Mostrar indicador para bots</string>
<string name="pref_title_animate_gif_avatars">Reproduzir avatares em GIFs</string>
<string name="pref_title_animate_gif_avatars">Reproduzir avatars em GIF</string>
<string name="pref_title_gradient_for_media">Mostrar desfocagem em conteúdo multimédia sensível</string>
<string name="pref_title_animate_custom_emojis">Animar emojis personalizados</string>
<string name="pref_title_post_filter">Filtro da timeline</string>
<string name="pref_title_post_tabs">Separadors</string>
<string name="pref_title_post_tabs">Separadores</string>
<string name="pref_title_show_boosts">Mostrar boosts</string>
<string name="pref_title_show_replies">Mostrar respostas</string>
<string name="pref_title_show_media_preview">Mostrar pré-visualização de conteúdo multimédia</string>
@ -268,23 +268,23 @@
<string name="notification_follow_request_description">Notificações para seguidores pendentes</string>
<string name="notification_boost_name">Boosts</string>
<string name="notification_poll_name">Votações</string>
<string name="notification_poll_description">Notificações para votações que terminaram</string>
<string name="notification_subscription_description">Notificações quando alguém para quem ativei os alertas publicar um toot novo</string>
<string name="notification_poll_description">Notificações para votações terminadas</string>
<string name="notification_subscription_description">Notificações quando alguém para quem ativou os alertas publicar um toot novo</string>
<string name="notification_sign_up_description">Notificações para novos utilizadores</string>
<string name="notification_update_name">Edições a toots</string>
<string name="notification_update_name">Edições de toots</string>
<string name="notification_boost_description">Notificações para boosts recebidos</string>
<string name="notification_favourite_name">Favoritos</string>
<string name="notification_favourite_description">Notificações quando os teus toots são adicionados aos favoritos</string>
<string name="notification_update_description">Notificações quando toots com os quais interagi foram editados</string>
<string name="notification_favourite_description">Notificações quando os seus toots são adicionados aos favoritos</string>
<string name="notification_update_description">Notificações quando toots com os quais interagiu forem editados</string>
<string name="notification_mention_format">%s mencionou-te</string>
<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="description_account_locked">Perfil Bloqueado</string>
<string name="description_account_locked">Perfil Privado</string>
<string name="about_title_activity">Sobre</string>
<string name="about_tusky_version">Tusky %s</string>
<string name="about_powered_by_tusky">A correr o Tusky</string>
<string name="filter_dialog_update_button">Atualizar</string>
<string name="about_tusky_license">Tusky é um software livre e de código aberto e é ljcenciado com a versão 3 da GNU General Public License. Leia a licença aqui: https://www.gnu.org/licenses/gpl-3.0.pt-br.html</string>
<string name="about_tusky_license">Tusky é um software livre e de código aberto, licenciado com a versão 3 da GNU General Public License. Pode ler a licença aqui: https://www.gnu.org/licenses/gpl-3.0.pt-br.html</string>
<string name="about_project_site">Página do projeto:
\n https://tusky.app</string>
<string name="about_bug_feature_request_site">Reporte de erros e pedidos de funcionalidades:
@ -296,13 +296,13 @@
<string name="post_media_video">Vídeo</string>
<string name="post_media_audio">Áudio</string>
<string name="post_media_attachments">Anexos</string>
<string name="state_follow_requested">Pedido enviado</string>
<string name="state_follow_requested">Pedido para seguir enviado</string>
<string name="abbreviated_in_years">em %dy</string>
<string name="abbreviated_in_days">em %dd</string>
<string name="abbreviated_in_hours">em %dh</string>
<string name="abbreviated_in_minutes">em %dm</string>
<string name="abbreviated_in_seconds">em %ds</string>
<string name="abbreviated_years_ago">%da</string>
<string name="abbreviated_years_ago">%dy</string>
<string name="abbreviated_days_ago">%dd</string>
<string name="abbreviated_hours_ago">%dh</string>
<string name="abbreviated_minutes_ago">%dm</string>
@ -325,7 +325,7 @@
<string name="action_lists">Listas</string>
<string name="error_rename_list">Não foi possível renomear a lista</string>
<string name="title_lists">Listas</string>
<string name="title_list_timeline">Lista da timeline</string>
<string name="title_list_timeline">Cronologia da timeline</string>
<string name="error_create_list">Não foi possível criar a lista</string>
<string name="error_delete_list">Não foi possível apagar a lista</string>
<string name="action_create_list">Criar uma lista</string>
@ -338,10 +338,11 @@
<string name="error_failed_set_caption">Erro ao incluir descrição</string>
<plurals name="hint_describe_for_visually_impaired">
<item quantity="one">Descrição para deficientes visuais
\n(até %d letra)</item>
<item quantity="other">Descrição para deficientes visuais
\n(até %d caracteres)</item>
<item quantity="other"></item>
</plurals>
<string name="action_set_caption">Descrever</string>
<string name="action_set_caption">Escrever descrição</string>
<string name="action_remove">Remover</string>
<string name="lock_account_label">Bloquear perfil</string>
<string name="send_post_notification_title">A enviar o toot…</string>
@ -351,34 +352,34 @@
<string name="send_post_notification_saved_content">Uma cópia do toot foi guardada nos seus rascunhos</string>
<string name="action_compose_shortcut">Escrever</string>
<string name="error_no_custom_emojis">A sua instância, %s, não tem emojis personalizados</string>
<string name="emoji_style">Estilo de emoji</string>
<string name="emoji_style">Estilo dos emojis</string>
<string name="system_default">Padrão do sistema</string>
<string name="download_fonts">É necessário descarregar estes pacotes de emojis primeiro</string>
<string name="performing_lookup_title">A fazer pesquisa…</string>
<string name="expand_collapse_all_posts">Expandir/Contrair todos os toots</string>
<string name="action_open_post">Abrir toot</string>
<string name="restart_required">É necessário reiniciar a aplicação</string>
<string name="restart_emoji">É necessário reiniciar o aplicativo para aplicar as alterações</string>
<string name="restart_emoji">É necessário reiniciar o Tusky para aplicar as alterações</string>
<string name="restart">Reiniciar</string>
<string name="caption_systememoji">Pacote de emojis padrão do seu dispositivo</string>
<string name="caption_blobmoji">Emojis padrão do Android da versão 4.4 até 7.1</string>
<string name="caption_blobmoji">Emojis padrão do Android 4.4 até ao 7.1</string>
<string name="caption_twemoji">Pacote de emojis padrão do Mastodon</string>
<string name="caption_notoemoji">Pacote de emojis atual do Google</string>
<string name="download_failed">Erro ao baixar</string>
<string name="caption_notoemoji">Pacote de emojis atuais da Google</string>
<string name="download_failed">Erro ao descarregar</string>
<string name="profile_badge_bot_text">Robô</string>
<string name="account_moved_description">%1$s mudou-se para:</string>
<string name="reblog_private">Dar boost para o mesmo público</string>
<string name="reblog_private">Dar boost para o público inicial</string>
<string name="unreblog_private">Desfazer boost</string>
<string name="license_description">O Tusky contém código e recursos dos seguintes projetos de código aberto:</string>
<string name="license_apache_2">Licenciado sob a licença Apache (cópia separadorixo)</string>
<string name="license_apache_2">Licenciado sob a licença Apache (cópia abaixo)</string>
<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="profile_metadata_label">Metadados do perfil</string>
<string name="profile_metadata_add">Adicionar</string>
<string name="profile_metadata_add">adicionar dados</string>
<string name="profile_metadata_label_label">Rótulo</string>
<string name="profile_metadata_content_label">Conteúdo</string>
<string name="pref_title_absolute_time">Usar tempo absoluto</string>
<string name="label_remote_account">As informações separadorixo podem refletir incompletamente o perfil do utilizador. Toque aqui para abrir o perfil completo no navegador.</string>
<string name="pref_title_absolute_time">Usar data absoluta</string>
<string name="label_remote_account">As informações abaixo podem refletir, de forma incompleta, o perfil do utilizador. Toque aqui para abrir o perfil completo no navegador.</string>
<string name="pin_action">Fixar</string>
<plurals name="favs">
<item quantity="one"><b>%1$s</b> Favorito</item>
@ -388,25 +389,25 @@
<item quantity="one"><b>%s</b> Boost</item>
<item quantity="other"><b>%s</b> Boosts</item>
</plurals>
<string name="title_reblogged_by">Levou boost de</string>
<string name="title_favourited_by">Favoritado por</string>
<string name="title_reblogged_by">Boost dado por</string>
<string name="title_favourited_by">Adicionado aos favoritos por</string>
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_more_recipients">%1$s, %2$s e %3$d outros</string>
<string name="conversation_more_recipients">%1$s, %2$s e %3$d mais</string>
<plurals name="max_tab_number_reached">
<item quantity="one">excedeu o máximo de %1$d separador</item>
<item quantity="other">excedeu o máximo de %1$d separadors</item>
<item quantity="one">atingiu o máximo de %1$d separador</item>
<item quantity="other">atingiu o máximo de %1$d separadores</item>
</plurals>
<string name="description_post_media">conteúdo multimédia: %s</string>
<string name="description_post_media">Conteúdo multimédia: %s</string>
<string name="description_post_cw">Aviso de Conteúdo: %s</string>
<string name="description_post_media_no_description_placeholder">Sem descrição</string>
<string name="description_post_reblogged">Você fez boost</string>
<string name="description_post_favourited">Favoritado</string>
<string name="description_post_bookmarked">Salvo</string>
<string name="description_post_reblogged">Replicado</string>
<string name="description_post_favourited">Adicionado aos favoritos</string>
<string name="description_post_bookmarked">Guardado</string>
<string name="description_visiblity_public">Público</string>
<string name="description_visiblity_unlisted">Não-listado</string>
<string name="description_visiblity_private">Privado</string>
<string name="description_visiblity_direct">Direto</string>
<string name="description_poll">Enquete com as opções: %1$s, %2$s, %3$s, %4$s; %5$s</string>
<string name="description_poll">Votação com as opções: %1$s, %2$s, %3$s, %4$s; %5$s</string>
<string name="hint_list_name">Nome da lista</string>
<string name="add_hashtag_title">Adicionar hashtag</string>
<string name="edit_hashtag_hint">Hashtag sem #</string>
@ -414,11 +415,11 @@
<string name="select_list_title">Selecionar lista</string>
<string name="list">Lista</string>
<string name="notifications_clear">Limpar</string>
<string name="notifications_apply_filter">Filtro</string>
<string name="filter_apply">Salvar</string>
<string name="compose_shortcut_long_label">Compor toot</string>
<string name="compose_shortcut_short_label">Compor</string>
<string name="notification_clear_text">Tem certeza de que deseja limpar permanentemente todas as suas notificações\?</string>
<string name="notifications_apply_filter">Filtrar</string>
<string name="filter_apply">Aplicar</string>
<string name="compose_shortcut_long_label">Escrever toot</string>
<string name="compose_shortcut_short_label">Escrever</string>
<string name="notification_clear_text">Tem certeza que pretende limpar permanentemente todas as suas notificações\?</string>
<string name="compose_preview_image_description">Opções para imagem %s</string>
<string name="poll_info_format"> <!-- 15 votos • 1 hora restante --> %1$s • %2$s</string>
<plurals name="poll_info_votes">
@ -430,10 +431,10 @@
<item quantity="other">%s pessoas</item>
</plurals>
<string name="poll_info_time_absolute">termina em %s</string>
<string name="poll_info_closed">Terminou</string>
<string name="poll_info_closed">terminada</string>
<string name="poll_vote">Votar</string>
<string name="poll_ended_voted">Uma enquete que você votou terminou</string>
<string name="poll_ended_created">Sua enquete terminou</string>
<string name="poll_ended_voted">Uma votação em que votou terminou</string>
<string name="poll_ended_created">A sua votação terminou</string>
<plurals name="poll_timespan_days">
<item quantity="one">%d dia restante</item>
<item quantity="other">%d dias restantes</item>
@ -451,20 +452,20 @@
<item quantity="other">%d segundos restantes</item>
</plurals>
<string name="button_continue">Continuar</string>
<string name="button_back">Voltar</string>
<string name="button_done">Ok</string>
<string name="button_back">Retroceder</string>
<string name="button_done">Feito</string>
<string name="report_sent_success">\@%s denunciado com sucesso</string>
<string name="hint_additional_info">Comentários adicionais</string>
<string name="report_remote_instance">Encaminhar para %s</string>
<string name="failed_report">Erro ao denunciar</string>
<string name="failed_fetch_posts">Erro ao carregar toots</string>
<string name="report_description_1">A denúncia será enviada aos moderadores da instância. Explique por que denunciou a conta:</string>
<string name="report_description_remote_instance">A conta está em outra instância. Enviar uma cópia anônima da denúncia para lá\?</string>
<string name="report_description_1">A denúncia será enviada aos moderadores da instância. Pode adicionar abaixo uma explicação para a sua denúncia:</string>
<string name="report_description_remote_instance">A conta está noutra instância. Quer enviar uma cópia anónima da denúncia para lá\?</string>
<string name="title_accounts">Contas</string>
<string name="failed_search">Erro ao pesquisar</string>
<string name="pref_title_show_notifications_filter">Mostrar filtro de notificações</string>
<string name="pref_title_enable_swipe_for_tabs">Ativar deslizar para alternar entre separadors</string>
<string name="create_poll_title">Enquete</string>
<string name="pref_title_show_notifications_filter">Mostrar Filtro das Notificações</string>
<string name="pref_title_enable_swipe_for_tabs">Ativar gesto de deslizar para alternar entre separadores</string>
<string name="create_poll_title">Votação</string>
<string name="label_duration">Duração</string>
<string name="duration_indefinite">Indefinido</string>
<string name="duration_5_min">5 minutos</string>
@ -481,46 +482,46 @@
<string name="duration_180_days">180 dias</string>
<string name="duration_365_days">365 dias</string>
<string name="add_poll_choice">Adicionar opção</string>
<string name="poll_allow_multiple_choices">Múltiplas opções</string>
<string name="poll_allow_multiple_choices">Escolha múltipla</string>
<string name="poll_new_choice_hint">Opção %d</string>
<string name="edit_poll">Editar</string>
<string name="post_lookup_error_format">Erro ao pesquisar %s</string>
<string name="no_drafts">Sem rascunhos.</string>
<string name="no_scheduled_posts">Sem toots agendados.</string>
<string name="account_note_saved">Salvo!</string>
<string name="post_lookup_error_format">Erro ao pesquisar toot %s</string>
<string name="no_drafts">Não tem rascunhos.</string>
<string name="no_scheduled_posts">Não tem toots agendados.</string>
<string name="account_note_saved">Guardado!</string>
<string name="wellbeing_mode_notice">Algumas informações que podem afetar seu bem-estar serão ocultadas. Isso inclui:
\n
\n- Notificações de favoritos, boosts e seguidores
\n- Número de favoritos e boosts nos toots
\n- Status de toots e seguidores nos perfis
\n
\nNotificações push não serão afetadas, mas é possível revisar sua preferência manualmente.</string>
<string name="review_notifications">Revisar notificações</string>
\nNotificações push não serão afetadas, mas é possível rever as configurações das notificações manualmente.</string>
<string name="review_notifications">Rever Notificações</string>
<string name="limit_notifications">Limitar notificações da timeline</string>
<string name="no_announcements">Sem comunicados.</string>
<string name="warning_scheduling_interval">Mastodon possui um intervalo mínimo de 5 minutos para agendar.</string>
<string name="pref_title_show_cards_in_timelines">Mostrar prévias de Hiperligações nas linhas</string>
<string name="pref_title_confirm_reblogs">Solicitar confirmação antes de dar boost</string>
<string name="pref_title_confirm_favourites">Solicitar confirmação antes de favoritar</string>
<string name="pref_title_hide_top_toolbar">Esconder o título da barra superior de tarefas</string>
<string name="account_note_hint">Nota pessoal sobre este perfil aqui</string>
<string name="wellbeing_hide_stats_posts">Esconder status dos toots</string>
<string name="wellbeing_hide_stats_profile">Esconder status dos perfis</string>
<string name="no_announcements">Sem anúncios.</string>
<string name="warning_scheduling_interval">O Mastodon tem um intervalo mínimo de agendamento de 5 minutos.</string>
<string name="pref_title_show_cards_in_timelines">Mostrar pré-visualização de hiperligações nas timelines</string>
<string name="pref_title_confirm_reblogs">Mostrar janela de confirmação antes de dar boost</string>
<string name="pref_title_confirm_favourites">Mostrar janela de confirmação antes de adicionar aos favoritos</string>
<string name="pref_title_hide_top_toolbar">Esconder o título da barra superior</string>
<string name="account_note_hint">Nota pessoal sobre este perfil</string>
<string name="wellbeing_hide_stats_posts">Esconder estatísticas quantitativas nos toots</string>
<string name="wellbeing_hide_stats_profile">Esconder estatísticas quantitativas nos perfis</string>
<plurals name="error_upload_max_media_reached">
<item quantity="one">Não é possível anexar mais de %1$d arquivo de conteúdo multimédia.</item>
<item quantity="other">Não é possível anexar mais de %1$d arquivos de conteúdo multimédia.</item>
<item quantity="one">Não é possível enviar mais de %1$d arquivo de conteúdo multimédia.</item>
<item quantity="other">Não é possível enviar mais de %1$d arquivos de conteúdo multimédia.</item>
</plurals>
<string name="drafts_post_failed_to_send">Erro ao enviar o toot!</string>
<string name="drafts_failed_loading_reply">Erro ao carregar toot para responder</string>
<string name="draft_deleted">Rascunho excluído</string>
<string name="drafts_post_reply_removed">O toot em que se rascunhou uma resposta foi excluído</string>
<string name="drafts_failed_loading_reply">Erro ao carregar informação de resposta</string>
<string name="draft_deleted">Rascunho apagado</string>
<string name="drafts_post_reply_removed">O toot para o qual escreveu um rascunho foi apagado</string>
<string name="error_generic">Ocorreu um erro.</string>
<string name="error_network">Ocorreu um erro de conetividade! Por favor, verifique a sua ligação e tente novamente!</string>
<string name="error_empty">Isto não pode estar vazio.</string>
<string name="error_invalid_domain">Instância inválida inserida</string>
<string name="error_invalid_domain">A instância inserida é inválida</string>
<string name="error_failed_app_registration">Erro ao autenticar com esta instância.</string>
<string name="error_no_web_browser_found">Nao foi possível encontrar um navegador.</string>
<string name="error_authorization_unknown">Ocorreu um erro não identificado de autorização.</string>
<string name="error_no_web_browser_found">Não foi possível encontrar um navegador.</string>
<string name="error_authorization_unknown">Ocorreu um erro de autorização não identificado.</string>
<string name="title_login">Entrar</string>
<string name="action_save">Guardar</string>
<string name="action_edit_profile">Editar perfil</string>
@ -528,4 +529,5 @@
<string name="action_undo">Desfazer</string>
<string name="action_accept">Aceitar</string>
<string name="action_reject">Rejeitar</string>
<string name="error_could_not_load_login_page">Não foi possível carregar a página de login</string>
</resources>

View File

@ -100,7 +100,7 @@
<string name="notification_follow_request_format">%s надсилає запит на підписку</string>
<string name="notification_follow_format">%s підписується на вас</string>
<string name="footer_empty">Тут нічого немає. Потягніть вниз, щоб оновити!</string>
<string name="message_empty">Тут нічого немає.</string>
<string name="message_empty">Тут порожньо.</string>
<string name="post_content_warning_show_less">Згорнути</string>
<string name="post_content_warning_show_more">Розгорнути</string>
<string name="post_sensitive_media_directions">Натисніть для перегляду</string>
@ -549,4 +549,5 @@
<string name="notification_update_description">Сповіщення, коли редагується повідомлення, з яким ви взаємодіяли</string>
<string name="notification_update_name">Редакції допису</string>
<string name="title_login">Вхід</string>
<string name="error_could_not_load_login_page">Не вдалося завантажити сторінку входу.</string>
</resources>

View File

@ -515,4 +515,6 @@
<string name="pref_title_notification_filter_updates">khi một tút mà tôi tương tác bị sửa</string>
<string name="notification_update_name">Sửa tút</string>
<string name="notification_update_description">Thông báo khi tút mà tôi tương tác bị sửa</string>
<string name="title_login">Đăng nhập</string>
<string name="error_could_not_load_login_page">Không thể tải trang đăng nhập.</string>
</resources>

View File

@ -535,4 +535,5 @@
<string name="pref_title_notification_filter_updates">我进行过互动的嘟文被编辑了</string>
<string name="notification_update_name">嘟文编辑</string>
<string name="notification_update_description">当你进行过互动的嘟文被编辑时发出通知</string>
<string name="error_could_not_load_login_page">无法加载登录页。</string>
</resources>

View File

@ -57,6 +57,7 @@
<item>Occitan</item>
<item>Polski</item>
<item>Português (Brasil)</item>
<item>Português (Portugal)</item>
<item>Slovenščina</item>
<item>Svenska</item>
<item>Taqbaylit</item>
@ -106,6 +107,7 @@
<item>oc</item>
<item>pl</item>
<item>pt-BR</item>
<item>pt-PT</item>
<item>sl</item>
<item>sv</item>
<item>kab</item>

View File

@ -9,6 +9,7 @@
<string name="error_authorization_unknown">An unidentified authorization error occurred.</string>
<string name="error_authorization_denied">Authorization was denied.</string>
<string name="error_retrieving_oauth_token">Failed getting a login token.</string>
<string name="error_could_not_load_login_page">Could not load the login page.</string>
<string name="error_compose_character_limit">The post is too long!</string>
<string name="error_image_upload_size">The file must be less than 8MB.</string>
<string name="error_video_upload_size">Video files must be less than 40MB.</string>
@ -671,5 +672,6 @@
<string name="action_unsubscribe_account">Unsubscribe</string>
<string name="tusky_compose_post_quicksetting_label">Compose Post</string>
<string name="saving_draft">Saving draft…</string>
</resources>

View File

@ -369,13 +369,36 @@ class TimelineDaoTest {
assertEquals("99", timelineDao.getTopPlaceholderId(1))
}
@Test
fun `preview card survives roundtrip`() = runBlocking {
val setOne = makeStatus(statusId = 3, cardUrl = "https://foo.bar")
for ((status, author, reblogger) in listOf(setOne)) {
timelineDao.insertAccount(author)
reblogger?.let {
timelineDao.insertAccount(it)
}
timelineDao.insertStatus(status)
}
val pagingSource = timelineDao.getStatuses(setOne.first.timelineUserId)
val loadResult = pagingSource.load(PagingSource.LoadParams.Refresh(null, 2, false))
val loadedStatuses = (loadResult as PagingSource.LoadResult.Page).data
assertEquals(1, loadedStatuses.size)
assertStatuses(listOf(setOne), loadedStatuses)
}
private fun makeStatus(
accountId: Long = 1,
statusId: Long = 10,
reblog: Boolean = false,
createdAt: Long = statusId,
authorServerId: String = "20",
domain: String = "mastodon.example"
domain: String = "mastodon.example",
cardUrl: String? = null,
): Triple<TimelineStatusEntity, TimelineAccountEntity, TimelineAccountEntity?> {
val author = TimelineAccountEntity(
serverId = authorServerId,
@ -403,6 +426,10 @@ class TimelineDaoTest {
)
} else null
val card = when (cardUrl) {
null -> null
else -> "{ url: \"$cardUrl\" }"
}
val even = accountId % 2 == 0L
val status = TimelineStatusEntity(
serverId = statusId.toString(),
@ -433,7 +460,8 @@ class TimelineDaoTest {
expanded = false,
contentCollapsed = false,
contentShowing = true,
pinned = false
pinned = false,
card = card,
)
return Triple(status, author, reblogAuthor)
}

View File

@ -0,0 +1,7 @@
Tusky v17.0
- "Öffnen als..." ist jetzt im Menü in Konto Profilen auch verfügbar, wenn mehrere Konten genutzt werden
- Die Anmeldung wird jetzt über die WebView innerhalb der App abgewickelt
- Unterstützung für Android 12
- Unterstützung für die neue Mastodon instance configuration API
- und einige andere kleine Fehlerbehebungen und Verbesserungen

View File

@ -0,0 +1,6 @@
Tusky v18.0
- Support for new Mastodon 3.5 notification types
- The bot badge now looks better and adjusts to the selected theme
- Text can now be selected on the post detail view
- Fixed a lot of bugs, including one that prevented logins on Android 6 and lower

View File

@ -0,0 +1,7 @@
Tusky útg.17.0
- "Opna sem..." er núna líka á valmyndinni í notendasniðum þegar verið er að nota marga aðganga
- Innskráning er núna meðhöndluð í WebView innan forritsins
- Stuðningur við Android 12
- Stuðningur við API-kerfisviðmót fyrir nýja uppsetningu Mastodon-tilvika
- og mökkur af smærri endurbótum og lagfæringum

View File

@ -0,0 +1,7 @@
Tusky v17.0
- "Otwórz jako..." teraz jest także dostępne w menu na profilach kont gdy używane jest kilka kont
- Login teraz jest obsługiwany w WebView w aplikacji
- Wsparcie dla Androida 12
- Wsparcie nowego API konfiguracji instancji Mastodon
- i wiele innych małych poprawek i ulepszeń

View File

@ -0,0 +1,12 @@
Tusky v6.0
- Os filtros de timeline passaram para "Preferências da Conta" e sincronizam com servidor
- Pode ter uma hashtag personalizada como separador
- Suporte a edição de listas
- O editor sugere emojis personalizados ao escrever
- Nova configuração: "seguir tema do sistema"
- Melhor acessibilidade da timeline
- O Tusky ignora notificações desconhecidas, deixando de crashar
- Nova opção: trocar o idioma do sistema por outro
- Novas traduções
- Muitas outras melhorias e correções

View File

@ -0,0 +1,7 @@
Tusky v7.0
- Suporte para mostragem de votações, para votação e notificação de votações
- Botões novos para filtrar notificações e excluí-las
- Exclua e rascunhe os seus toots
- Novo indicador que mostra, na foto de perfil, se uma conta é um bot (pode ser desativado nas preferências)
- Novas traduções: Norueguês, Bokmål e Esloveno.

View File

@ -0,0 +1,9 @@
Tusky v9.0
- Agora pode criar votações no Tusky
- Pesquisa melhorada
- Nova opção em "Preferências da Conta": "Expandir sempre os toots com Aviso de Conteúdo"
- Avatars em formato quadrado com cantos arredondados
- Agora é possível denunciar utilizadores, mesmo que não tenham toots
- O Tusky vai recusar a ligação através de ligações simples (não encriptadas) em Android 6+
- Muitas outras pequenas melhorias e correções de bugs

View File

@ -0,0 +1,3 @@
Tusky v9.1
Esta atualização garante compatibilidade com Mastodon 3 e melhora a performance e estabilidade.

View File

@ -0,0 +1,8 @@
Tusky v10.0
- Agora é possível adicionar toots aos favoritos e ver a lista de favoritos no Tusky.
- Já pode agendar toots, no entanto é necessário agendá-los para pelo menos 5 minutos depois do momento da escrita.
- Já pode adicionar listas na barra lateral do Tusky!
- Já pode partilhar ficheiros de som nos teus toots!
E muitas outras pequenas melhorias e correções de bugs!

View File

@ -0,0 +1,11 @@
Tusky v11.0
- Notificações de seguidores pendentes quando a conta está trancada!
- Novas funcionalidades nas "Preferências":
* desativação do gesto que alterna entre separadores
* diálogo de confirmação antes de dar boost
* mostragem da pré-visualização de links nas timelines
- As conversas agora podem ser silenciadas
- As votações passam a ser calculadas pelo número de votantes e não pelo número de votos
- Várias correções relacionadas com a escrita de toots
- Traduções melhoradas

View File

@ -0,0 +1,8 @@
Tusky v.12.0
- Interface principal melhorada - passa a ser possível mover os separadores para baixo!
- Ao silenciar um utilizador, pode também escolher se também pretende silenciar as notificações
- Agora dá para seguir quantas hashtags quiser num único separador!
- A exibição da descrição dos conteúdos multimédia foi melhorada para suportar descrições super longas
Registo completo de alterações: https://github.com/tuskyapp/Tusky/releases

View File

@ -0,0 +1,10 @@
Tusky v13.0
- Suporte para anotações em perfis (novidade do Mastodon 3.2.0)
- Suporte para anúncios do(s) administrador(es) de instâncias (novidade do Mastodon 3.1.0)
- O avatar da sua conta selecionada passa a ficar visível na barra de ferramentas principal (canto superior esquerdo)
- Tocar no nome de utilizador na timeline abrirá o perfil em questão
- Várias pequenas melhorias e correções
- Traduções melhoradas

View File

@ -0,0 +1,7 @@
Tusky v14.0
- Receba notificações quando um utilizador que segue publicar um toot - basta clicar no ícone do sino (novidade do Mastodon 3.3.0)
- O suporte para rascunhos do Tusky foi reescrito para ser mais rápido, simples e menos propenso a erros.
- Foi adicionado uma funcionalidade de bem-estar, que permite limitar algumas funcionalidades no Tusky.
- O Tusky já consegue animar os emojis personalizados
Registo completo de alterações: https://github.com/tuskyapp/Tusky/releases

View File

@ -0,0 +1,5 @@
Tusky v15.0
- O menu principal passa a mostrar uma opção para ver os utilizadores que pediram para o seguir!
- O relógio para agendar toots ganhou um aspeto mais consistente com o resto do Tusky
Registo completo de alterações: https://github.com/tuskyapp/Tusky/releases

View File

@ -0,0 +1,3 @@
Tusky v15.1
O Tusky já não crasha ao adicionar descrição às imagens

View File

@ -0,0 +1,8 @@
Tusky v16.0
- O algoritmo de carregamento da timeline foi completamente reescrito para ser mais rápida, mais estável e mais fácil de manter.
- O Tusky passa a poder animar emojis personalizados no formato APNG & WebP Animated.
- Muitas correções de bugs
- Suporte para Android 11
- Novas traduções: gaélico escocês, galego, ucraniano
- Traduções melhoradas

View File

@ -0,0 +1,7 @@
Tusky v17.0
- "Abrir como..." está disponível no menu de perfis de contas quando estão várias contas configuradas
- O login passa a ser feito numa WebView dentro da aplicação
- Suporte para Android 12
- Suporte para a nova API de configuração de instâncias do Mastodon
- Várias pequenas melhorias e correções

View File

@ -0,0 +1,12 @@
Tusky é um cliente leve para Mastodon, um servidor de rede social de código aberto e livre.
• Design Material
• Maioria das APIs do Mastodon implementadas
• Suporte para várias contas
• Temas diurno e noturno, com possibilidade de troca automática de acordo com o horário
• Rascunhos - Escreva os seus toots e guarde-os para mais tarde
• Escolha entre estilos diferentes de emoji
• Otimizado para todos os tamanhos de ecrã
• Código totalmente aberto, sem dependências não-livres como Google Play Services
Para ler mais sobre o Mastodon, visite o endereço https://joinmastodon.org/

View File

@ -0,0 +1 @@
Um cliente multi-contas para a rede social Mastodon

View File

@ -0,0 +1 @@
Tusky