Compare commits

...

11 Commits

Author SHA1 Message Date
Conny Duck fbf02444b8
Merge branch 'develop' into string-format-migration
# Conflicts:
#	app/src/main/res/values-tr/strings.xml
2024-04-25 17:59:11 +02:00
Konrad Pozniak 197a1f4eda
Translations update from Weblate (#4390)
Translations update from [Weblate](https://weblate.tusky.app) for
[Tusky/Tusky
description](https://weblate.tusky.app/projects/tusky/tusky-app/).



Current translation status:

![Weblate translation
status](https://weblate.tusky.app/widget/tusky/tusky-app/horizontal-auto.svg)
2024-04-25 17:55:22 +02:00
Konrad Pozniak e1904080b0
Translations update from Weblate (#4394)
Translations update from [Weblate](https://weblate.tusky.app) for
[Tusky/Tusky](https://weblate.tusky.app/projects/tusky/tusky/).



Current translation status:

![Weblate translation
status](https://weblate.tusky.app/widget/tusky/tusky/horizontal-auto.svg)
2024-04-25 17:55:04 +02:00
XoseM 85a27dea3e Translated using Weblate (Galician)
Currently translated at 100.0% (34 of 34 strings)

Translation: Tusky/Tusky description
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/gl/
2024-04-25 15:15:38 +00:00
Ümit Solmaz c4c391434f Translated using Weblate (Turkish)
Currently translated at 100.0% (34 of 34 strings)

Translation: Tusky/Tusky description
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/tr/
2024-04-25 15:15:38 +00:00
Hồ Nhất Duy d090222412 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (34 of 34 strings)

Translation: Tusky/Tusky description
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/vi/
2024-04-25 15:15:38 +00:00
fin-w 42df5f7c8a Translated using Weblate (Welsh)
Currently translated at 100.0% (34 of 34 strings)

Translation: Tusky/Tusky description
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/cy/
2024-04-25 15:15:38 +00:00
Luna Jernberg b8adc818c1 Translated using Weblate (Swedish)
Currently translated at 100.0% (34 of 34 strings)

Translation: Tusky/Tusky description
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky-app/sv/
2024-04-25 15:15:38 +00:00
Konrad Pozniak c55d79562c
fix scheduling posts (#4392)
Mastodon returns different reponses when posting normally and when
scheduling. This was previously ignored silently, but Moshi is more
correct than Gson and fails, which causes the `SendStatusService` to
retry sending forever and a lot of posts are scheduled.
Mastodon should actually ignore multiple attempts at scheduling the same
post, but doesn't so I filed this
https://github.com/mastodon/mastodon/issues/30039

cc @cbeyls
2024-04-25 17:08:57 +02:00
Konrad Pozniak f2ffba1679
never create more than the allowed number of shortcuts (#4389)
The only crash so far in the 25.0-beta1 crash reports. Probably not a
regression though as that code did not change in a while.

```
Exception java.lang.IllegalArgumentException: Max number of dynamic shortcuts exceeded
  at android.os.Parcel.createExceptionOrNull (Parcel.java:3032)
  at android.os.Parcel.createException (Parcel.java:3012)
  at android.os.Parcel.readException (Parcel.java:2995)
  at android.os.Parcel.readException (Parcel.java:2937)
  at android.content.pm.IShortcutService$Stub$Proxy.addDynamicShortcuts (IShortcutService.java:618)
  at android.content.pm.ShortcutManager.addDynamicShortcuts (ShortcutManager.java:240)
  at androidx.core.content.pm.ShortcutManagerCompat.addDynamicShortcuts (ShortcutManagerCompat.java:334)
  at com.keylesspalace.tusky.util.ShareShortcutHelper$updateShortcut$1.invokeSuspend (ShareShortcutHelper.kt:96)
  at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith (ContinuationImpl.kt:33)
  at kotlinx.coroutines.DispatchedTask.run (DispatchedTask.kt:104)
  at android.os.Handler.handleCallback (Handler.java:984)
  at android.os.Handler.dispatchMessage (Handler.java:104)
  at android.os.Looper.loopOnce (Looper.java:238)
  at android.os.Looper.loop (Looper.java:357)
  at android.app.ActivityThread.main (ActivityThread.java:8094)
  at java.lang.reflect.Method.invoke
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:548)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:957)
Caused by android.os.RemoteException: Remote stack trace:
  at com.android.server.pm.ShortcutService.enforceMaxActivityShortcuts (ShortcutService.java:1768)
  at com.android.server.pm.ShortcutPackage.enforceShortcutCountsBeforeOperation (ShortcutPackage.java:1551)
  at com.android.server.pm.ShortcutService.addDynamicShortcuts (ShortcutService.java:2161)
  at android.content.pm.IShortcutService$Stub.onTransact (IShortcutService.java:281)
  at android.os.Binder.execTransactInternal (Binder.java:1294)
```
2024-04-25 17:08:46 +02:00
Ümit Solmaz 7b2b4612c5 Translated using Weblate (Turkish)
Currently translated at 100.0% (639 of 639 strings)

Co-authored-by: Ümit Solmaz <usnotv@gmail.com>
Translate-URL: https://weblate.tusky.app/projects/tusky/tusky/tr/
Translation: Tusky/Tusky
2024-04-25 14:29:30 +00:00
18 changed files with 187 additions and 120 deletions

View File

@ -1066,7 +1066,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
} }
updateProfiles() updateProfiles()
shareShortcutHelper.updateShortcut(accountManager.activeAccount!!) shareShortcutHelper.updateShortcuts()
} }
@SuppressLint("CheckResult") @SuppressLint("CheckResult")

View File

@ -4,6 +4,7 @@ import com.keylesspalace.tusky.TabData
import com.keylesspalace.tusky.entity.Account import com.keylesspalace.tusky.entity.Account
import com.keylesspalace.tusky.entity.Notification import com.keylesspalace.tusky.entity.Notification
import com.keylesspalace.tusky.entity.Poll import com.keylesspalace.tusky.entity.Poll
import com.keylesspalace.tusky.entity.ScheduledStatus
import com.keylesspalace.tusky.entity.Status import com.keylesspalace.tusky.entity.Status
data class StatusChangedEvent(val status: Status) : Event data class StatusChangedEvent(val status: Status) : Event
@ -13,7 +14,7 @@ data class BlockEvent(val accountId: String) : Event
data class MuteEvent(val accountId: String) : Event data class MuteEvent(val accountId: String) : Event
data class StatusDeletedEvent(val statusId: String) : Event data class StatusDeletedEvent(val statusId: String) : Event
data class StatusComposedEvent(val status: Status) : Event data class StatusComposedEvent(val status: Status) : Event
data class StatusScheduledEvent(val status: Status) : Event data class StatusScheduledEvent(val scheduledStatus: ScheduledStatus) : Event
data class ProfileEditedEvent(val newProfileData: Account) : Event data class ProfileEditedEvent(val newProfileData: Account) : Event
data class PreferenceChangedEvent(val preferenceKey: String) : Event data class PreferenceChangedEvent(val preferenceKey: String) : Event
data class MainTabsChangedEvent(val newTabs: List<TabData>) : Event data class MainTabsChangedEvent(val newTabs: List<TabData>) : Event

View File

@ -199,6 +199,14 @@ interface MastodonApi {
@Body status: NewStatus @Body status: NewStatus
): NetworkResult<Status> ): NetworkResult<Status>
@POST("api/v1/statuses")
suspend fun createScheduledStatus(
@Header("Authorization") auth: String,
@Header(DOMAIN_HEADER) domain: String,
@Header("Idempotency-Key") idempotencyKey: String,
@Body status: NewStatus
): NetworkResult<ScheduledStatus>
@GET("api/v1/statuses/{id}") @GET("api/v1/statuses/{id}")
suspend fun status(@Path("id") statusId: String): NetworkResult<Status> suspend fun status(@Path("id") statusId: String): NetworkResult<Status>

View File

@ -49,6 +49,7 @@ import com.keylesspalace.tusky.entity.Attachment
import com.keylesspalace.tusky.entity.MediaAttribute import com.keylesspalace.tusky.entity.MediaAttribute
import com.keylesspalace.tusky.entity.NewPoll import com.keylesspalace.tusky.entity.NewPoll
import com.keylesspalace.tusky.entity.NewStatus import com.keylesspalace.tusky.entity.NewStatus
import com.keylesspalace.tusky.entity.ScheduledStatus
import com.keylesspalace.tusky.entity.Status import com.keylesspalace.tusky.entity.Status
import com.keylesspalace.tusky.network.MastodonApi import com.keylesspalace.tusky.network.MastodonApi
import com.keylesspalace.tusky.util.unsafeLazy import com.keylesspalace.tusky.util.unsafeLazy
@ -256,13 +257,24 @@ class SendStatusService : Service(), Injectable {
} }
) )
val scheduled = !statusToSend.scheduledAt.isNullOrEmpty()
val sendResult = if (isNew) { val sendResult = if (isNew) {
mastodonApi.createStatus( if (!scheduled) {
"Bearer " + account.accessToken, mastodonApi.createStatus(
account.domain, "Bearer " + account.accessToken,
statusToSend.idempotencyKey, account.domain,
newStatus statusToSend.idempotencyKey,
) newStatus
)
} else {
mastodonApi.createScheduledStatus(
"Bearer " + account.accessToken,
account.domain,
statusToSend.idempotencyKey,
newStatus
)
}
} else { } else {
mastodonApi.editStatus( mastodonApi.editStatus(
statusToSend.statusId!!, statusToSend.statusId!!,
@ -282,14 +294,12 @@ class SendStatusService : Service(), Injectable {
mediaUploader.cancelUploadScope(*statusToSend.media.map { it.localId }.toIntArray()) mediaUploader.cancelUploadScope(*statusToSend.media.map { it.localId }.toIntArray())
val scheduled = !statusToSend.scheduledAt.isNullOrEmpty()
if (scheduled) { if (scheduled) {
eventHub.dispatch(StatusScheduledEvent(sentStatus)) eventHub.dispatch(StatusScheduledEvent(sentStatus as ScheduledStatus))
} else if (!isNew) { } else if (!isNew) {
eventHub.dispatch(StatusChangedEvent(sentStatus)) eventHub.dispatch(StatusChangedEvent(sentStatus as Status))
} else { } else {
eventHub.dispatch(StatusComposedEvent(sentStatus)) eventHub.dispatch(StatusComposedEvent(sentStatus as Status))
} }
notificationManager.cancel(statusId) notificationManager.cancel(statusId)

View File

@ -21,7 +21,6 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.Canvas import android.graphics.Canvas
import android.text.TextUtils
import androidx.core.app.Person import androidx.core.app.Person
import androidx.core.content.pm.ShortcutInfoCompat import androidx.core.content.pm.ShortcutInfoCompat
import androidx.core.content.pm.ShortcutManagerCompat import androidx.core.content.pm.ShortcutManagerCompat
@ -30,70 +29,72 @@ import com.bumptech.glide.Glide
import com.keylesspalace.tusky.MainActivity import com.keylesspalace.tusky.MainActivity
import com.keylesspalace.tusky.R import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.db.AccountEntity import com.keylesspalace.tusky.db.AccountEntity
import com.keylesspalace.tusky.db.AccountManager
import com.keylesspalace.tusky.di.ApplicationScope import com.keylesspalace.tusky.di.ApplicationScope
import javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class ShareShortcutHelper @Inject constructor( class ShareShortcutHelper @Inject constructor(
private val context: Context, private val context: Context,
private val accountManager: AccountManager,
@ApplicationScope private val externalScope: CoroutineScope @ApplicationScope private val externalScope: CoroutineScope
) { ) {
fun updateShortcut(account: AccountEntity) { fun updateShortcuts() {
externalScope.launch { externalScope.launch(Dispatchers.IO) {
val innerSize = context.resources.getDimensionPixelSize(R.dimen.adaptive_bitmap_inner_size) val innerSize = context.resources.getDimensionPixelSize(R.dimen.adaptive_bitmap_inner_size)
val outerSize = context.resources.getDimensionPixelSize(R.dimen.adaptive_bitmap_outer_size) val outerSize = context.resources.getDimensionPixelSize(R.dimen.adaptive_bitmap_outer_size)
val bmp = if (TextUtils.isEmpty(account.profilePictureUrl)) { val maxNumberOfShortcuts = ShortcutManagerCompat.getMaxShortcutCountPerActivity(context)
Glide.with(context)
.asBitmap() val shortcuts = accountManager.accounts.take(maxNumberOfShortcuts).map { account ->
.load(R.drawable.avatar_default)
.submitAsync(innerSize, innerSize) val bmp = Glide.with(context)
} else {
Glide.with(context)
.asBitmap() .asBitmap()
.load(account.profilePictureUrl) .load(account.profilePictureUrl)
.placeholder(R.drawable.avatar_default)
.error(R.drawable.avatar_default) .error(R.drawable.avatar_default)
.submitAsync(innerSize, innerSize) .submitAsync(innerSize, innerSize)
// inset the loaded bitmap inside a 108dp transparent canvas so it looks good as adaptive icon
val outBmp = Bitmap.createBitmap(outerSize, outerSize, Bitmap.Config.ARGB_8888)
val canvas = Canvas(outBmp)
canvas.drawBitmap(
bmp,
(outerSize - innerSize).toFloat() / 2f,
(outerSize - innerSize).toFloat() / 2f,
null
)
val icon = IconCompat.createWithAdaptiveBitmap(outBmp)
val person = Person.Builder()
.setIcon(icon)
.setName(account.displayName)
.setKey(account.identifier)
.build()
// This intent will be sent when the user clicks on one of the launcher shortcuts. Intent from share sheet will be different
val intent = Intent(context, MainActivity::class.java).apply {
action = Intent.ACTION_SEND
type = "text/plain"
putExtra(ShortcutManagerCompat.EXTRA_SHORTCUT_ID, account.id.toString())
}
ShortcutInfoCompat.Builder(context, account.id.toString())
.setIntent(intent)
.setCategories(setOf("com.keylesspalace.tusky.Share"))
.setShortLabel(account.displayName)
.setPerson(person)
.setLongLived(true)
.setIcon(icon)
.build()
} }
// inset the loaded bitmap inside a 108dp transparent canvas so it looks good as adaptive icon ShortcutManagerCompat.addDynamicShortcuts(context, shortcuts)
val outBmp = Bitmap.createBitmap(outerSize, outerSize, Bitmap.Config.ARGB_8888)
val canvas = Canvas(outBmp)
canvas.drawBitmap(
bmp,
(outerSize - innerSize).toFloat() / 2f,
(outerSize - innerSize).toFloat() / 2f,
null
)
val icon = IconCompat.createWithAdaptiveBitmap(outBmp)
val person = Person.Builder()
.setIcon(icon)
.setName(account.displayName)
.setKey(account.identifier)
.build()
// This intent will be sent when the user clicks on one of the launcher shortcuts. Intent from share sheet will be different
val intent = Intent(context, MainActivity::class.java).apply {
action = Intent.ACTION_SEND
type = "text/plain"
putExtra(ShortcutManagerCompat.EXTRA_SHORTCUT_ID, account.id.toString())
}
val shortcutInfo = ShortcutInfoCompat.Builder(context, account.id.toString())
.setIntent(intent)
.setCategories(setOf("com.keylesspalace.tusky.Share"))
.setShortLabel(account.displayName)
.setPerson(person)
.setLongLived(true)
.setIcon(icon)
.build()
ShortcutManagerCompat.addDynamicShortcuts(context, listOf(shortcutInfo))
} }
} }

View File

@ -2,13 +2,13 @@
<resources> <resources>
<string name="error_generic">Bir hata oluştu.</string> <string name="error_generic">Bir hata oluştu.</string>
<string name="error_network">Bir ağ hatası oluştu. Lütfen bağlantını kontrol et ve tekrar dene.</string> <string name="error_network">Bir ağ hatası oluştu. Lütfen bağlantını kontrol et ve tekrar dene.</string>
<string name="error_empty">Bu alan boş bırakılmaz.</string> <string name="error_empty">Bu alan boş bırakılamaz.</string>
<string name="error_invalid_domain">Girilen alan adı geçersiz</string> <string name="error_invalid_domain">Girilen alan adı geçersiz</string>
<string name="error_failed_app_registration">Bu sunucu da kimlik doğrulama başarısız oldu. Sorun devam ederse menüde ki Tarayıcı ile Giriş Yap seçeneğini dene.</string> <string name="error_failed_app_registration">Bu sunucu da kimlik doğrulama başarısız oldu. Sorun devam ederse menüdeki Tarayıcıyla Giriş Yap seçeneğini deneyiniz.</string>
<string name="error_no_web_browser_found">Kullanılabilir web tarayıcısı bulunamadı.</string> <string name="error_no_web_browser_found">Kullanılabilir web tarayıcısı bulunamadı.</string>
<string name="error_authorization_unknown">Tanımlanamayan bir yetkilendirme hatası oluştu. Sorun devam ederse menüdeki Tarayıcı ile Giriş Yap seçeneğini dene.</string> <string name="error_authorization_unknown">Tanımlanamayan bir yetkilendirme hatası oluştu. Sorun devam ederse menüdeki Tarayıcı ile Giriş Yap seçeneğini deneyiniz.</string>
<string name="error_authorization_denied">Yetkilendirme reddedildi. Doğru hesap bilgilerini girdiğinizden eminseniz menüdeki Tarayıcı ile Giriş Yap seçeneğini deneyiniz.</string> <string name="error_authorization_denied">Yetkilendirme reddedildi. Doğru hesap bilgilerini girdiğinizden eminseniz menüdeki Tarayıcı ile Giriş Yap seçeneğini deneyiniz.</string>
<string name="error_retrieving_oauth_token">Giriş belirteci alınırken hata oluştu. Sorun devam ederse menüdeki Tarayıcı ile Giriş Yap seçeneğini dene.</string> <string name="error_retrieving_oauth_token">Giriş belirteci alınırken hata oluştu. Sorun devam ederse menüdeki Tarayıcı ile Giriş Yap seçeneğini deneyiniz.</string>
<string name="error_compose_character_limit">Gönderi çok uzun!</string> <string name="error_compose_character_limit">Gönderi çok uzun!</string>
<string name="error_media_upload_type">Bu tür bir dosya yüklenemez.</string> <string name="error_media_upload_type">Bu tür bir dosya yüklenemez.</string>
<string name="error_media_upload_opening">Dosya açılamadı.</string> <string name="error_media_upload_opening">Dosya açılamadı.</string>
@ -242,7 +242,7 @@
<string name="compose_active_account_description">%1$s hesabıyla gönderiliyor</string> <string name="compose_active_account_description">%1$s hesabıyla gönderiliyor</string>
<plurals name="hint_describe_for_visually_impaired"> <plurals name="hint_describe_for_visually_impaired">
<item quantity="one">İçeriği görme engelliler için açıkla (%1$d karakter limiti)</item> <item quantity="one">İçeriği görme engelliler için açıkla (%1$d karakter limiti)</item>
<item quantity="other">İçerikleri görme engelliler için açıklamalar (%1$d karakter limitleti)</item> <item quantity="other">İçerikleri görme engelliler için açıklamalar (%1$d karakter limitleri)</item>
</plurals> </plurals>
<string name="action_set_caption">Başlık belirle</string> <string name="action_set_caption">Başlık belirle</string>
<string name="action_remove">Kaldır</string> <string name="action_remove">Kaldır</string>
@ -250,8 +250,8 @@
<string name="lock_account_label_description">Takipçileri elle onaylamanız gerekir</string> <string name="lock_account_label_description">Takipçileri elle onaylamanız gerekir</string>
<string name="compose_save_draft">Taslaklara kaydedilsin mi\?</string> <string name="compose_save_draft">Taslaklara kaydedilsin mi\?</string>
<string name="send_post_notification_title">Gönderi gönderiliyor…</string> <string name="send_post_notification_title">Gönderi gönderiliyor…</string>
<string name="send_post_notification_error_title">Gönderi gönderilirken hata oluştu</string> <string name="send_post_notification_error_title">Gönderi yayınlanırken hata oluştu</string>
<string name="send_post_notification_channel_name">Gönderiler Gönderiliyor</string> <string name="send_post_notification_channel_name">Gönderiler Yayınlanıyor</string>
<string name="send_post_notification_cancel_title">Gönderme iptal edildi</string> <string name="send_post_notification_cancel_title">Gönderme iptal edildi</string>
<string name="send_post_notification_saved_content">Gönderinin bir kopyası taslaklara kaydedildi</string> <string name="send_post_notification_saved_content">Gönderinin bir kopyası taslaklara kaydedildi</string>
<string name="action_compose_shortcut">Oluştur</string> <string name="action_compose_shortcut">Oluştur</string>
@ -262,7 +262,7 @@
<string name="performing_lookup_title">Araştırılıyor…</string> <string name="performing_lookup_title">Araştırılıyor…</string>
<string name="expand_collapse_all_posts">Tüm durumları Genişlet/Küçült</string> <string name="expand_collapse_all_posts">Tüm durumları Genişlet/Küçült</string>
<string name="action_open_post">Gönderiyi aç</string> <string name="action_open_post">Gönderiyi aç</string>
<string name="restart_required">Uygulamayı yeniden başlatmanız lazım</string> <string name="restart_required">Uygulamayı yeniden başlatmanız gerekmekte</string>
<string name="restart_emoji">Bu değişiklikleri uygulamak için Tusky\'yi yeniden başlatmanız gerekecek</string> <string name="restart_emoji">Bu değişiklikleri uygulamak için Tusky\'yi yeniden başlatmanız gerekecek</string>
<string name="later">Sonra</string> <string name="later">Sonra</string>
<string name="restart">Yeniden başlat</string> <string name="restart">Yeniden başlat</string>
@ -280,7 +280,7 @@
<string name="profile_metadata_add">veri ekle</string> <string name="profile_metadata_add">veri ekle</string>
<string name="profile_metadata_label_label">Etiket</string> <string name="profile_metadata_label_label">Etiket</string>
<string name="profile_metadata_content_label">İçerik</string> <string name="profile_metadata_content_label">İçerik</string>
<string name="pref_title_absolute_time">Kesin zaman kullan</string> <string name="pref_title_absolute_time">Kesin tarih kullan</string>
<string name="label_remote_account">Aşağıdaki bilgiler değişken olabilir. Tüm profili tarayıcıda görmek için tuşlayın.</string> <string name="label_remote_account">Aşağıdaki bilgiler değişken olabilir. Tüm profili tarayıcıda görmek için tuşlayın.</string>
<string name="unpin_action">Sabitlemeyi kaldır</string> <string name="unpin_action">Sabitlemeyi kaldır</string>
<string name="pin_action">Sabitle</string> <string name="pin_action">Sabitle</string>
@ -387,19 +387,19 @@
<string name="hint_additional_info">Ek Yorumlar</string> <string name="hint_additional_info">Ek Yorumlar</string>
<string name="report_remote_instance">%1$s adresine ilet</string> <string name="report_remote_instance">%1$s adresine ilet</string>
<string name="failed_fetch_posts">Yayınlar getirilemedi</string> <string name="failed_fetch_posts">Yayınlar getirilemedi</string>
<string name="report_description_1">Bildirim sunucu yöneticinize gönderilecektir. Bu hesabı neden bildirdiğinizle ilgili açıklama yapabilirsiniz:</string> <string name="report_description_1">Bildirim sunucu yöneticinize gönderilecektir. Bu hesabı neden raporladığınızla ilgili açıklama yapabilirsiniz:</string>
<string name="report_description_remote_instance">Hesap başka bir sunucudan. Raporun anonim bir kopyasını da oraya gönderilsin mi\?</string> <string name="report_description_remote_instance">Hesap başka bir sunucudan. Raporun anonim bir kopyasını da oraya gönderilsin mi\?</string>
<string name="action_mentions">Bahsedenler</string> <string name="action_mentions">Bahsedenler</string>
<string name="action_open_reblogger">Gönderi yazanını</string> <string name="action_open_reblogger">Gönderi yazanını</string>
<string name="action_open_reblogged_by">Yeniden paylaşımları göster</string> <string name="action_open_reblogged_by">Yeniden paylaşımları göster</string>
<string name="title_mentions_dialog">Bahsedenler</string> <string name="title_mentions_dialog">Bahsedenler</string>
<string name="action_open_media_n">#%1$d medyayı</string> <string name="action_open_media_n">#%1$d medyayı</string>
<string name="title_bookmarks">Yer imleri</string> <string name="title_bookmarks">Yerimleri</string>
<string name="title_scheduled_posts">Zamanlanmış yayınlar</string> <string name="title_scheduled_posts">Zamanlanmış yayınlar</string>
<string name="action_bookmark">Yer imi</string> <string name="action_bookmark">Yerimi</string>
<string name="action_edit">Düzenle</string> <string name="action_edit">Düzenle</string>
<string name="action_delete_and_redraft">Sil ve düzenle</string> <string name="action_delete_and_redraft">Sil ve düzenle</string>
<string name="action_view_bookmarks">Yer imleri</string> <string name="action_view_bookmarks">Yerimleri</string>
<string name="action_add_poll">Anket ekle</string> <string name="action_add_poll">Anket ekle</string>
<string name="action_access_scheduled_posts">Zamanlanmış yayınlar</string> <string name="action_access_scheduled_posts">Zamanlanmış yayınlar</string>
<string name="action_schedule_post">Gönderi tarihini ayarla</string> <string name="action_schedule_post">Gönderi tarihini ayarla</string>
@ -429,7 +429,7 @@
<string name="mute_domain_warning_dialog_ok">Alan adından her şeyi gizle</string> <string name="mute_domain_warning_dialog_ok">Alan adından her şeyi gizle</string>
<string name="pref_title_alway_open_spoiler">Her zaman içerik uyarılarıyla işaretlenmiş alanları genişlet</string> <string name="pref_title_alway_open_spoiler">Her zaman içerik uyarılarıyla işaretlenmiş alanları genişlet</string>
<string name="poll_info_time_absolute">%1$s içinde sona erecek</string> <string name="poll_info_time_absolute">%1$s içinde sona erecek</string>
<string name="failed_report">Bildirilemedi</string> <string name="failed_report">Raporlanamadı</string>
<string name="poll_new_choice_hint">Seçenek %1$d</string> <string name="poll_new_choice_hint">Seçenek %1$d</string>
<string name="post_lookup_error_format">%1$s gönderisi aranırken hata oluştu</string> <string name="post_lookup_error_format">%1$s gönderisi aranırken hata oluştu</string>
<string name="no_drafts">Hiç taslağın yok.</string> <string name="no_drafts">Hiç taslağın yok.</string>
@ -471,7 +471,7 @@
<string name="error_could_not_load_login_page">Giriş ekranı yüklenemedi.</string> <string name="error_could_not_load_login_page">Giriş ekranı yüklenemedi.</string>
<string name="error_muting_hashtag_format">Sessize alma hatası #%1$s</string> <string name="error_muting_hashtag_format">Sessize alma hatası #%1$s</string>
<string name="action_unfollow_hashtag_format">Takibi bırak #%1$s\?</string> <string name="action_unfollow_hashtag_format">Takibi bırak #%1$s\?</string>
<string name="pref_title_wellbeing_mode">Huzur</string> <string name="pref_title_wellbeing_mode">İyilik</string>
<string name="account_note_saved">Kaydedildi!</string> <string name="account_note_saved">Kaydedildi!</string>
<string name="report_category_spam">İstenmeyen</string> <string name="report_category_spam">İstenmeyen</string>
<string name="report_category_other">Diğer</string> <string name="report_category_other">Diğer</string>
@ -518,7 +518,7 @@
<string name="duration_14_days">14 gün</string> <string name="duration_14_days">14 gün</string>
<string name="duration_365_days">365 gün</string> <string name="duration_365_days">365 gün</string>
<string name="review_notifications">Bildirimleri Gözden Geçir</string> <string name="review_notifications">Bildirimleri Gözden Geçir</string>
<string name="wellbeing_mode_notice">Huzurlu kullanım için bazı bilgiler gizlenebilir.. Bunlar: <string name="wellbeing_mode_notice">İyi kullanım için bazı bilgiler gizlenebilir.. Bunlar:
\n \n
\n - Gözde/Yeniden Paylaşım/Takip bildirimleri \n - Gözde/Yeniden Paylaşım/Takip bildirimleri
\n - Gözde/Yeniden Paylaşım sayacı \n - Gözde/Yeniden Paylaşım sayacı
@ -545,11 +545,11 @@
<string name="limit_notifications">Ağ akışı bildirimlerini sınırla</string> <string name="limit_notifications">Ağ akışı bildirimlerini sınırla</string>
<string name="wellbeing_hide_stats_posts">Yayınların niceliksel istatistikleri gizle</string> <string name="wellbeing_hide_stats_posts">Yayınların niceliksel istatistikleri gizle</string>
<string name="status_created_at_now">şimdi</string> <string name="status_created_at_now">şimdi</string>
<string name="drafts_post_reply_removed">Yanıt yazdığınız yayın kaldırıldı</string> <string name="drafts_post_reply_removed">Hazırladığınız yanıtınız yayından kaldırıldı</string>
<string name="language_display_name_format">%1$s (%2$s)</string> <string name="language_display_name_format">%1$s (%2$s)</string>
<string name="report_category_violation">Kural ihlali</string> <string name="report_category_violation">Kural ihlali</string>
<string name="description_post_language">Gönderi dili</string> <string name="description_post_language">Gönderi dili</string>
<string name="dialog_push_notification_migration">Birleşikİtme aracılığıyla itme bildirimlerini kullanmak için Tusky\'nin Mastodon sunucundaki bildirimlere abone olma iznine ihtiyacı var. Bu, Tusky\'ye verilen OAuth kapsamlarını değiştirmek için yeniden oturum açmayı gerektirir. Burada veya Hesap tercihleri bölümünde yeniden giriş yapma seçeneğini kullanman tüm yerel taslaklarını ve önbelleğini koruyacaktır.</string> <string name="dialog_push_notification_migration">Birleşik itme aracılığıyla, itme bildirimlerini kullanmak için Tusky\'nin Mastodon sunucundaki bildirimlere abone olma iznine ihtiyacı var. Bu, Tusky\'ye verilen OAuth kapsamlarını değiştirmek için yeniden oturum açmayı gerektirir. Burada veya Hesap tercihleri bölümünde yeniden giriş yapma seçeneğini kullanman tüm yerel taslaklarını ve önbelleğini koruyacaktır.</string>
<string name="confirmation_hashtag_unfollowed">#%1$s takip edilmeyenler</string> <string name="confirmation_hashtag_unfollowed">#%1$s takip edilmeyenler</string>
<string name="action_subscribe_account">Abone Ol</string> <string name="action_subscribe_account">Abone Ol</string>
<string name="follow_requests_info">Hesabınız kilitli olmasa da, %1$s kadro bu hesaplardan gelen takip isteklerini elle gözden geçirmek isteyebileceğinizi düşündü.</string> <string name="follow_requests_info">Hesabınız kilitli olmasa da, %1$s kadro bu hesaplardan gelen takip isteklerini elle gözden geçirmek isteyebileceğinizi düşündü.</string>
@ -614,7 +614,7 @@
<string name="notification_unknown_name">Bilinmeyen</string> <string name="notification_unknown_name">Bilinmeyen</string>
<string name="socket_timeout_exception">Sunucuyla bağlantı kurmak çok uzun sürdü</string> <string name="socket_timeout_exception">Sunucuyla bağlantı kurmak çok uzun sürdü</string>
<string name="ui_error_unknown">bilinmeyen sebep</string> <string name="ui_error_unknown">bilinmeyen sebep</string>
<string name="ui_error_bookmark">Yer imi gönderisi başarısız oldu: %1$s</string> <string name="ui_error_bookmark">Yerimi gönderisi başarısız oldu: %1$s</string>
<string name="ui_error_vote">Ankete oy gönderilemedi: %1$s</string> <string name="ui_error_vote">Ankete oy gönderilemedi: %1$s</string>
<string name="ui_error_clear_notifications">Bildirimler temizlenemedi: %1$s</string> <string name="ui_error_clear_notifications">Bildirimler temizlenemedi: %1$s</string>
<string name="ui_error_favourite">Gönderi gözdelere eklenemedi: %1$s</string> <string name="ui_error_favourite">Gönderi gözdelere eklenemedi: %1$s</string>
@ -646,7 +646,7 @@
<string name="status_filter_placeholder_label_format">Süzgeçlendi: %1$s</string> <string name="status_filter_placeholder_label_format">Süzgeçlendi: %1$s</string>
<string name="filter_edit_keyword_title">Anahtar kelimeyi düzenle</string> <string name="filter_edit_keyword_title">Anahtar kelimeyi düzenle</string>
<string name="filter_description_format">%1$s: %2$s</string> <string name="filter_description_format">%1$s: %2$s</string>
<string name="pref_title_show_stat_inline">Gönderi istatistiklerini sğ akışında göster</string> <string name="pref_title_show_stat_inline">Yayın istatistiklerini sağ akışında göster</string>
<string name="title_public_trending_hashtags">Öne çıkan etiketler</string> <string name="title_public_trending_hashtags">Öne çıkan etiketler</string>
<string name="total_usage">Toplam kullanım</string> <string name="total_usage">Toplam kullanım</string>
<string name="total_accounts">Toplam hesap</string> <string name="total_accounts">Toplam hesap</string>
@ -677,9 +677,9 @@
<string name="dialog_delete_filter_text">Süzgeci sil \'%1$s\'\?</string> <string name="dialog_delete_filter_text">Süzgeci sil \'%1$s\'\?</string>
<string name="dialog_delete_filter_positive_action">Sil</string> <string name="dialog_delete_filter_positive_action">Sil</string>
<string name="dialog_save_profile_changes_message">Profil değişikliklerinizi kaydetmek istiyor musunuz\?</string> <string name="dialog_save_profile_changes_message">Profil değişikliklerinizi kaydetmek istiyor musunuz\?</string>
<string name="help_empty_conversations">İşte <b>özel mesajlarınız</b>; bazen konuşmalar veya doğrudan mesajlar (DM) olarak da adlandırılır. <string name="help_empty_conversations">İşte <b>özel iletileriniz</b>; bazen konuşmalar veya doğrudan iletiler (Dİ) olarak da adlandırılır.
\n \n
\nÖzel mesajlar, bir gönderinin [iconics gmd_public] görünürlüğünü [iconics gmd_mail] <i>Doğrudan</i> olarak ayarlayarak ve metinde bir veya daha fazla kullanıcıdan bahsederek oluşturulur. \nÖzel iletiler, bir gönderinin [iconics gmd_public] görünürlüğünü [iconics gmd_mail] <i>Doğrudan</i> olarak ayarlayarak ve metinde bir veya daha fazla kullanıcıdan bahsederek oluşturulur.
\n \n
\nÖrneğin, bir hesabın profil görünümünde başlayabilir ve oluştur düğmesine [iconics gmd_edit] dokunabilir ve görünürlüğü değiştirebilirsiniz. </string> \nÖrneğin, bir hesabın profil görünümünde başlayabilir ve oluştur düğmesine [iconics gmd_edit] dokunabilir ve görünürlüğü değiştirebilirsiniz. </string>
<string name="help_empty_lists">Bu sizin <b>liste görünümünüzdür</b>. Bir dizi özel liste tanımlayabilir ve bunlara hesaplar ekleyebilirsiniz. <string name="help_empty_lists">Bu sizin <b>liste görünümünüzdür</b>. Bir dizi özel liste tanımlayabilir ve bunlara hesaplar ekleyebilirsiniz.
@ -693,8 +693,8 @@
<string name="following_hashtag_success_format">Şimdi etiketi takip edin #%1$s</string> <string name="following_hashtag_success_format">Şimdi etiketi takip edin #%1$s</string>
<string name="unfollowing_hashtag_success_format">Artık etiketi takip etmiyorum #%1$s</string> <string name="unfollowing_hashtag_success_format">Artık etiketi takip etmiyorum #%1$s</string>
<string name="error_unblocking_domain">Sesi açılamadı %1$s: %2$s</string> <string name="error_unblocking_domain">Sesi açılamadı %1$s: %2$s</string>
<string name="title_public_trending_statuses">Gündemdeki yayınlar</string> <string name="title_public_trending_statuses">Gündemdekiler</string>
<string name="label_image">Resim</string> <string name="label_image">Görsel</string>
<string name="app_theme_system_black">Sistem Tasarımını Kullanın (siyah)</string> <string name="app_theme_system_black">Sistem Tasarımını Kullanın (siyah)</string>
<string name="list_reply_policy_list">Liste üyeleri</string> <string name="list_reply_policy_list">Liste üyeleri</string>
<string name="list_reply_policy_followed">Takip edilen herhangi bir kullanıcı</string> <string name="list_reply_policy_followed">Takip edilen herhangi bir kullanıcı</string>

View File

@ -0,0 +1,8 @@
Tusky 25
- Cynnal API cyfieithu Mastodon
- Dangos iaith y neges
- Gwella trawsnewidiadau'r sgrin
- Mae gosodiadau hidlo wedi cael eu symud i osodiadau'r cyfrif
- Mae ystadegau'r neges bob amser yn dangos yn yr un lle
- Llawer o wella wedi'u cudd

View File

@ -1,10 +1,11 @@
Tusky 22.0 beta 2 Tusky 22.0 beta 2
Fixes including: Correccións que inclúen:
- Improved notification loading speed - Velocidade de carga de notificacións mellorada
- Restore showing 0/1/1+ for replies - Restaurar mostrando 0/1/1+ para as respostas
- Show filter titles, not filter keywords, on filtered posts - Mostra títulos de filtro, non palabras clave de filtro, nas publicacións filtradas
- Fixed a bug where opening a status could open an unrelated link - Corrixiuse un erro no que abrir un estado podía abrir unha ligazón non relacionada
- Show "Add" button in correct place when there are no filters - Mostrar o botón "Engadir" no lugar correcto cando non haxa filtros
- Fixed assorted crashes - Arranxáronse varios fallos
(trad. automática)

View File

@ -1,11 +1,12 @@
Tusky 22.0 beta 3 Tusky 22.0 beta 3
Fixes including: Correccións que inclúen:
- Fixed crash when viewing a thread - Arranxouse o fallo ao ver un fío
- Fixed crash processing Mastodon filters - Filtros Mastodon de procesamento de fallos corrixidos
- Links in bios of follow/follow request notifications are clickable - Pódense facer clic nas ligazóns da bios das notificacións de solicitude de seguimento/seguimento
- Android Notifications updates - Actualizacións de notificacións de Android
- Android notification for a Mastodon notification should only be shown once - A notificación de Android para unha notificación de Mastodon só debe mostrarse unha vez
- Android notifications are grouped by Mastodon notification type (follow, mention, boost, etc) - As notificacións de Android agrúpanse por tipo de notificación de Mastodon (seguir, mencionar, aumentar, etc.)
- Potential for missing notifications has been removed - Eliminouse o potencial de notificacións que faltan
(trad. auto)

View File

@ -1,5 +1,5 @@
Tusky 22.0 beta 4 Tusky 22.0 beta 4
Fixes: Arranxo:
- Fixed repeated fetch of notifications if configured with multiple accounts - das notificacións repetidas se hai varias contas

View File

@ -1,6 +1,7 @@
Tusky 22.0 beta 5 Tusky 22.0 beta 5
Fixes: Correccións:
- Rolled back APNG library to fix broken animated emojis - Retrocedeu a biblioteca APNG para corrixir emojis animados rotos
- Save local copy of notification marker in case server does not support the API - Garda a copia local do marcador de notificación no caso de que o servidor non admita a API
(trad. automática)

View File

@ -1,5 +1,5 @@
Tusky 22.0 beta 6 Tusky 22.0 beta 6
Fixes: Arranxos:
- Save reading position in the Notifications tab more frequently - gardar con maior frecuencia a posición de lectura na pestana de Notificacións

View File

@ -1,10 +1,12 @@
Tusky 22.0 beta 7 Tusky 22.0 beta 7
Fixes: Correccións:
### Significant bug fixes ### Correccións de erros importantes
- Fetch all outstanding Mastodon notifications when creating Android notifications - Obtén todas as notificacións pendentes de Mastodon ao crear notificacións de Android
- Clicking "Compose" from a notification would set the wrong account - Facendo clic en "Redactar" desde unha notificación, establecerase a conta incorrecta
- Ensure "last read notification ID" is saved to the correct account - Asegúrate de gardar o "ID de notificación da última lectura" na conta correcta
(trad. automática)

View File

@ -1,15 +1,17 @@
Tusky 23.0 beta 1 Tusky 23.0 beta 1
New features: Novas características:
- New preference to scale UI text - Nova preferencia para escalar o texto da IU
Fixes: Correccións:
- Save account information correctly - Garda a información da conta correctamente
- "pull" notifications on devices running Android versions <= 11 - notificacións "pull" en dispositivos con versións de Android <= 11
- Work around Android bug where text fields could "forget" they can copy/paste - Soluciona un erro de Android onde os campos de texto poden "esquecer" que poden copiar/pegar
- Viewing "diffs" in edit history will not extend off screen edge - A visualización de "diferencias" no historial de edicións non se estenderá fóra do bordo da pantalla
- Don't crash if your server has no post edit history - Non falla se o teu servidor non ten historial de edición posterior
- Add a "Delete" button when editing a filter - Engade un botón "Eliminar" ao editar un filtro
- Show non-square emoji correctly - Mostrar emoji non cadrados correctamente
(trad. automática)

View File

@ -0,0 +1,8 @@
Tusky 25
- soporte para a API de tradución de Mastodon
- mostra o idioma da publicación
- mellora nas transicións entre pantallas
- os axustes dos filtros agora están nas preferencias da conta
- as estatísticas da publicación están nunha posición estable
- moitos cambios internos para mellorar a estabilidade e rendemento

View File

@ -0,0 +1,8 @@
Tusky 25
- Stöd för Mastodon översättning API
- Visa språk för inlägg
- Förbättrade skärmövergångar
- Filter inställningar har flyttats till kontoinställningar
- Poststatistik har nu stabil position
- Mycket av stabilitet och prestandaförbättringar under huven

View File

@ -0,0 +1,8 @@
Tusky 25
- Mastodon çeviri API'sini destekleyin
- Gönderi dilini göster
- Geliştirilmiş ekran geçişleri
- Süzgeç ayarları hesap tercihlerine taşındı
- Gönderi istatistikleri artık sabit konuma sahip
- Kaputun altında birçok kararlılık ve performans iyileştirmesi

View File

@ -0,0 +1,8 @@
Tusky 25
- Hỗ trợ Mastodon Dịch API
- Hiện ngôn ngữ tút
- Cải thiện chuyển đổi màn hình
- Cài đặt bộ lọc được chuyển sang tùy chọn tài khoản
- Thống kê bài viết bây giờ đã có vị trí ổn định
- Rất nhiều cải tiến về độ ổn định và hiệu suất bên trong