Merge remote-tracking branch 'tuskyapp/develop'

This commit is contained in:
kyori19 2020-06-19 14:40:57 +09:00
commit 31c9debd5d
82 changed files with 1789 additions and 1056 deletions

View File

@ -104,11 +104,11 @@ project.tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
ext.lifecycleVersion = "2.2.0"
ext.roomVersion = '2.2.5'
ext.retrofitVersion = '2.8.1'
ext.okhttpVersion = '4.5.0'
ext.retrofitVersion = '2.9.0'
ext.okhttpVersion = '4.7.2'
ext.glideVersion = '4.11.0'
ext.daggerVersion = '2.27'
ext.materialdrawerVersion = '8.0.1'
ext.materialdrawerVersion = '8.0.3'
repositories {
maven {
@ -120,8 +120,8 @@ repositories {
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation "androidx.core:core-ktx:1.2.0"
implementation "androidx.appcompat:appcompat:1.2.0-beta01"
implementation "androidx.core:core-ktx:1.3.0"
implementation "androidx.appcompat:appcompat:1.2.0-rc01"
implementation "androidx.fragment:fragment-ktx:1.2.4"
implementation "androidx.browser:browser:1.2.0"
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
@ -129,7 +129,7 @@ dependencies {
implementation "androidx.exifinterface:exifinterface:1.2.0"
implementation "androidx.cardview:cardview:1.0.0"
implementation "androidx.preference:preference:1.1.1"
implementation "androidx.sharetarget:sharetarget:1.0.0-rc01"
implementation "androidx.sharetarget:sharetarget:1.0.0"
implementation "androidx.emoji:emoji:1.0.0"
implementation "androidx.emoji:emoji-appcompat:1.0.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion"
@ -157,7 +157,7 @@ dependencies {
implementation "com.github.bumptech.glide:glide:$glideVersion"
implementation "com.github.bumptech.glide:okhttp3-integration:$glideVersion"
implementation "io.reactivex.rxjava2:rxjava:2.2.17"
implementation "io.reactivex.rxjava2:rxjava:2.2.19"
implementation "io.reactivex.rxjava2:rxandroid:2.1.1"
implementation "io.reactivex.rxjava2:rxkotlin:2.4.0"

View File

@ -17,12 +17,12 @@
# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
void set*(***);
*** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
public void *(android.view.View);
}
# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
@ -30,43 +30,19 @@
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator CREATOR;
}
-keepclassmembers class **.R$* {
public static <fields>;
public static final ** CREATOR;
}
# TUSKY SPECIFIC OPTIONS
## for okhttp
-dontwarn javax.annotation.**
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
-dontwarn org.codehaus.mojo.animal_sniffer.*
-dontwarn okhttp3.internal.platform.ConscryptPlatform
##for keep
-dontwarn android.arch.util.paging.CountedDataSource
-dontwarn android.arch.persistence.room.paging.LimitOffsetDataSource
## for retrofit
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-keepattributes *Annotation*
-keepclasseswithmembers class * {
@retrofit2.http.* <methods>;
}
-keep class com.keylesspalace.tusky.entity.** { *; }
# keep members of our model classes, they are used in json de/serialization
-keepclassmembers class com.keylesspalace.tusky.entity.* { *; }
-keep public enum com.keylesspalace.tusky.entity.*$** {
**[] $VALUES;
public *;
}
# preserve line numbers for crash reporting
-keepattributes SourceFile,LineNumberTable
-renamesourcefileattribute SourceFile
@ -87,17 +63,7 @@
static void throwUninitializedPropertyAccessException(java.lang.String);
}
-dontwarn com.google.errorprone.annotations.*
# without this emoji font downloading fails with AbstractMethodError
-keep class * extends android.os.AsyncTask {
public *;
}
# Glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
**[] $VALUES;
public *;
}

View File

@ -43,6 +43,18 @@ public class EmojiPreference extends Preference {
private boolean updated, currentNeedsUpdate;
public EmojiPreference(Context context) {
super(context);
// Find out which font is currently active
this.selected = EmojiCompatFont.byId(PreferenceManager
.getDefaultSharedPreferences(context)
.getInt(FONT_PREFERENCE, 0));
// We'll use this later to determine if anything has changed
this.original = this.selected;
setSummary(selected.getDisplay(context));
}
public EmojiPreference(Context context, AttributeSet attrs) {
super(context, attrs);

View File

@ -40,6 +40,7 @@ import androidx.appcompat.app.AlertDialog
import androidx.appcompat.view.menu.MenuBuilder
import androidx.appcompat.widget.PopupMenu
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.content.ContextCompat
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.emoji.text.EmojiCompat
@ -70,7 +71,10 @@ import com.keylesspalace.tusky.interfaces.ActionButtonActivity
import com.keylesspalace.tusky.interfaces.ReselectableFragment
import com.keylesspalace.tusky.pager.MainPagerAdapter
import com.keylesspalace.tusky.util.*
import com.mikepenz.iconics.IconicsDrawable
import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial
import com.mikepenz.iconics.utils.colorInt
import com.mikepenz.iconics.utils.sizeDp
import com.mikepenz.materialdrawer.iconics.iconicsIcon
import com.mikepenz.materialdrawer.model.*
import com.mikepenz.materialdrawer.model.interfaces.*
@ -107,8 +111,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
private var streamingTabsCount = 0
private var notificationTabPosition = 0
private var adapter: MainPagerAdapter? = null
private var onTabSelectedListener: OnTabSelectedListener? = null
private val emojiInitCallback = object : InitCallback() {
override fun onInitialized() {
@ -178,7 +181,18 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
composeButton.setOnClickListener {
quickTootHelper.composeButton()
}
tabLayout.requestFocus()
mainToolbar.menu.add(R.string.action_search).apply {
setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
icon = IconicsDrawable(this@MainActivity, GoogleMaterial.Icon.gmd_search).apply {
sizeDp = 20
colorInt = ThemeUtils.getColor(this@MainActivity, android.R.attr.textColorPrimary)
}
setOnMenuItemClickListener {
startActivity(SearchActivity.getIntent(this@MainActivity))
true
}
}
setupDrawer(savedInstanceState)
@ -186,7 +200,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
* drawer, though, because its callback touches the header in the drawer. */
fetchUserInfo()
val popups = setupTabs(showNotificationTab)
setupTabs(showNotificationTab)
val pageMargin = resources.getDimensionPixelSize(R.dimen.tab_page_margin)
viewPager.setPageTransformer(MarginPageTransformer(pageMargin))
@ -199,20 +213,6 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
viewPager.offscreenPageLimit = 9
}
tabLayout.addOnTabSelectedListener(object : OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
if (tab.position == notificationTabPosition) {
NotificationHelper.clearNotificationsForActiveAccount(this@MainActivity, accountManager)
}
}
override fun onTabUnselected(tab: TabLayout.Tab) {}
override fun onTabReselected(tab: TabLayout.Tab) {
popups[tab.position].show()
}
})
// Setup push notifications
if (NotificationHelper.areNotificationsEnabled(this, accountManager)) {
NotificationHelper.enablePullNotifications(this)
@ -417,13 +417,6 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
startActivityWithSlideInAnimation(ListsActivity.newIntent(context))
}
},
primaryDrawerItem {
nameRes = R.string.action_search
iconicsIcon = GoogleMaterial.Icon.gmd_search
onClick = {
startActivityWithSlideInAnimation(SearchActivity.getIntent(context))
}
},
primaryDrawerItem {
nameRes = R.string.action_access_saved_toot
iconRes = R.drawable.ic_notebook
@ -530,21 +523,37 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
}
private fun setupTabs(selectNotificationTab: Boolean): ArrayList<PopupMenu> {
val preferences = PreferenceManager.getDefaultSharedPreferences(this)
val activeTabLayout = if(preferences.getString("mainNavPosition", "top") == "bottom") {
val actionBarSize = ThemeUtils.getDimension(this, R.attr.actionBarSize)
val fabMargin = resources.getDimensionPixelSize(R.dimen.fabMargin)
(composeButton.layoutParams as CoordinatorLayout.LayoutParams).bottomMargin = actionBarSize + fabMargin
tabLayout.hide()
bottomTabLayout
} else {
bottomNav.hide()
(viewPager.layoutParams as CoordinatorLayout.LayoutParams).bottomMargin = 0
(composeButton.layoutParams as CoordinatorLayout.LayoutParams).anchorId = R.id.viewPager
tabLayout
}
val tabs = accountManager.activeAccount!!.tabPreferences.toMutableList()
adapter = MainPagerAdapter(tabs, this)
val adapter = MainPagerAdapter(tabs, this)
viewPager.adapter = adapter
TabLayoutMediator(tabLayout, viewPager, TabConfigurationStrategy { _: TabLayout.Tab?, _: Int -> }).attach()
tabLayout.removeAllTabs()
TabLayoutMediator(activeTabLayout, viewPager, TabConfigurationStrategy { _: TabLayout.Tab?, _: Int -> }).attach()
activeTabLayout.removeAllTabs()
val popups = ArrayList<PopupMenu>()
for (i in tabs.indices) {
val tab = tabLayout.newTab()
val tab = activeTabLayout.newTab()
.setIcon(tabs[i].icon)
if (tabs[i].id == LIST) {
tab.contentDescription = tabs[i].arguments[1]
} else {
tab.setContentDescription(tabs[i].text)
}
tabLayout.addTab(tab)
activeTabLayout.addTab(tab)
val popup = PopupMenu(this, tab.view)
popup.menuInflater.inflate(R.menu.view_tab_action, popup.menu)
@ -584,7 +593,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
}
popup.setOnMenuItemClickListener { item ->
val fragment = adapter?.getFragment(tab.position)
val fragment = adapter.getFragment(tab.position)
when (item.itemId) {
R.id.tabJumpToTop -> {
if (fragment is ReselectableFragment) {
@ -647,6 +656,37 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
streamingTabsCount++
}
}
val pageMargin = resources.getDimensionPixelSize(R.dimen.tab_page_margin)
viewPager.setPageTransformer(MarginPageTransformer(pageMargin))
val uswSwipeForTabs = preferences.getBoolean("enableSwipeForTabs", true)
viewPager.isUserInputEnabled = uswSwipeForTabs
onTabSelectedListener?.let {
activeTabLayout.removeOnTabSelectedListener(it)
}
onTabSelectedListener = object : OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
if (tab.position == notificationTabPosition) {
NotificationHelper.clearNotificationsForActiveAccount(this@MainActivity, accountManager)
}
mainToolbar.title = tabs[tab.position].title(this@MainActivity)
}
override fun onTabUnselected(tab: TabLayout.Tab) {}
override fun onTabReselected(tab: TabLayout.Tab) {
popups[tab.position].show()
}
}.also {
activeTabLayout.addOnTabSelectedListener(it)
}
mainToolbar.title = tabs[0].title(this@MainActivity)
keepScreenOn()
return popups
}
@ -820,4 +860,4 @@ private var AbstractDrawerItem<*, *>.onClick: () -> Unit
value()
false
}
}
}

View File

@ -129,7 +129,7 @@ class PreferencesActivity : BaseActivity(), SharedPreferences.OnSharedPreference
}
"statusTextSize", "absoluteTimeView", "showBotOverlay", "animateGifAvatars",
"useBlurhash", "showCardsInTimelines", "confirmReblogs", "enableSwipeForTabs", "viewPagerOffScreenLimit" -> {
"useBlurhash", "showCardsInTimelines", "confirmReblogs", "enableSwipeForTabs", "mainNavPosition", "viewPagerOffScreenLimit" -> {
restartActivitiesOnExit = true
}
"language" -> {

View File

@ -15,6 +15,7 @@
package com.keylesspalace.tusky
import android.content.Context
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import androidx.fragment.app.Fragment
@ -39,18 +40,62 @@ data class TabData(val id: String,
@DrawableRes val icon: Int,
val fragment: (List<String>) -> Fragment,
val arguments: List<String> = emptyList(),
val title: (Context) -> String = { context -> context.getString(text)},
val enableStreaming: Boolean = false)
fun createTabDataFromId(id: String, arguments: List<String> = emptyList()): TabData {
val enableStreaming = id.endsWith(STREAMING)
return when (if (enableStreaming) id.slice(IntRange(0, id.length - 4)) else id) {
HOME -> TabData(HOME, R.string.title_home, R.drawable.ic_home_24dp, { TimelineFragment.newInstance(TimelineFragment.Kind.HOME, enableStreaming) }, enableStreaming = enableStreaming)
NOTIFICATIONS -> TabData(NOTIFICATIONS, R.string.title_notifications, R.drawable.ic_notifications_24dp, { NotificationsFragment.newInstance() })
LOCAL -> TabData(LOCAL, R.string.title_public_local, R.drawable.ic_local_24dp, { TimelineFragment.newInstance(TimelineFragment.Kind.PUBLIC_LOCAL, enableStreaming) }, enableStreaming = enableStreaming)
FEDERATED -> TabData(FEDERATED, R.string.title_public_federated, R.drawable.ic_public_24dp, { TimelineFragment.newInstance(TimelineFragment.Kind.PUBLIC_FEDERATED, enableStreaming) }, enableStreaming = enableStreaming)
DIRECT -> TabData(DIRECT, R.string.title_direct_messages, R.drawable.ic_reblog_direct_24dp, { ConversationsFragment.newInstance() })
HASHTAG -> TabData(HASHTAG, R.string.hashtags, R.drawable.ic_hashtag, { args -> TimelineFragment.newHashtagInstance(args) }, arguments)
LIST -> TabData(LIST, R.string.list, R.drawable.ic_list, { args -> TimelineFragment.newInstance(TimelineFragment.Kind.LIST, args.getOrNull(0).orEmpty(), true, enableStreaming) }, arguments, enableStreaming)
HOME -> TabData(
HOME,
R.string.title_home,
R.drawable.ic_home_24dp,
{ TimelineFragment.newInstance(TimelineFragment.Kind.HOME, enableStreaming) },
enableStreaming = enableStreaming
)
NOTIFICATIONS -> TabData(
NOTIFICATIONS,
R.string.title_notifications,
R.drawable.ic_notifications_24dp,
{ NotificationsFragment.newInstance() }
)
LOCAL -> TabData(
LOCAL,
R.string.title_public_local,
R.drawable.ic_local_24dp,
{ TimelineFragment.newInstance(TimelineFragment.Kind.PUBLIC_LOCAL, enableStreaming) },
enableStreaming = enableStreaming
)
FEDERATED -> TabData(
FEDERATED,
R.string.title_public_federated,
R.drawable.ic_public_24dp,
{ TimelineFragment.newInstance(TimelineFragment.Kind.PUBLIC_FEDERATED, enableStreaming) },
enableStreaming = enableStreaming
)
DIRECT -> TabData(
DIRECT,
R.string.title_direct_messages,
R.drawable.ic_reblog_direct_24dp,
{ ConversationsFragment.newInstance() }
)
HASHTAG -> TabData(
HASHTAG,
R.string.hashtags,
R.drawable.ic_hashtag,
{ args -> TimelineFragment.newHashtagInstance(args) },
arguments,
{ context -> arguments.joinToString(separator = " ") { context.getString(R.string.title_tag, it) }}
)
LIST -> TabData(
LIST,
R.string.list,
R.drawable.ic_list,
{ args -> TimelineFragment.newInstance(TimelineFragment.Kind.LIST, args.getOrNull(0).orEmpty(), true, enableStreaming) },
arguments,
{ arguments.getOrNull(1).orEmpty() },
enableStreaming
)
else -> throw IllegalArgumentException("unknown tab type")
}
}
@ -62,4 +107,4 @@ fun defaultTabs(): List<TabData> {
createTabDataFromId(LOCAL),
createTabDataFromId(FEDERATED)
)
}
}

View File

@ -1100,7 +1100,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
status.getAttachments().size() == 0 &&
status.getCard() != null &&
!TextUtils.isEmpty(status.getCard().getUrl()) &&
!status.isCollapsed()) {
(!status.isCollapsible() || !status.isCollapsed())) {
final Card card = status.getCard();
cardView.setVisibility(View.VISIBLE);
cardTitle.setText(card.getTitle());

View File

@ -291,7 +291,7 @@ public class NotificationsFragment extends SFragment implements
private void updateFilterVisibility() {
CoordinatorLayout.LayoutParams params =
(CoordinatorLayout.LayoutParams) swipeRefreshLayout.getLayoutParams();
if (showNotificationsFilter && !showingError && !notifications.isEmpty()) {
if (showNotificationsFilter && !showingError) {
appBarOptions.setExpanded(true, false);
appBarOptions.setVisibility(View.VISIBLE);
//Set content behaviour to hide filter on scroll

View File

@ -21,6 +21,7 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
@ -82,6 +83,7 @@ import com.keylesspalace.tusky.repository.TimelineRepository;
import com.keylesspalace.tusky.repository.TimelineRequestMode;
import com.keylesspalace.tusky.util.CardViewMode;
import com.keylesspalace.tusky.util.Either;
import com.keylesspalace.tusky.util.HttpHeaderLink;
import com.keylesspalace.tusky.util.LinkHelper;
import com.keylesspalace.tusky.util.ListStatusAccessibilityDelegate;
import com.keylesspalace.tusky.util.ListUtils;
@ -178,6 +180,10 @@ public class TimelineFragment extends SFragment implements
private Kind kind;
private String id;
private List<String> tags;
/**
* For some timeline kinds we must use LINK headers and not just status ids.
*/
private String nextId;
private LinearLayoutManager layoutManager;
private EndlessOnScrollListener scrollListener;
private boolean filterRemoveReplies;
@ -263,7 +269,7 @@ public class TimelineFragment extends SFragment implements
|| kind == Kind.LIST) {
id = arguments.getString(ID_ARG);
}
if(kind == Kind.TAG) {
if (kind == Kind.TAG) {
tags = arguments.getStringArrayList(HASHTAGS_ARG);
}
@ -1109,13 +1115,17 @@ public class TimelineFragment extends SFragment implements
updateAdapter();
String bottomId = null;
final ListIterator<Either<Placeholder, Status>> iterator =
this.statuses.listIterator(this.statuses.size());
while (iterator.hasPrevious()) {
Either<Placeholder, Status> previous = iterator.previous();
if (previous.isRight()) {
bottomId = previous.asRight().getId();
break;
if (kind == Kind.FAVOURITES || kind == Kind.BOOKMARKS) {
bottomId = this.nextId;
} else {
final ListIterator<Either<Placeholder, Status>> iterator =
this.statuses.listIterator(this.statuses.size());
while (iterator.hasPrevious()) {
Either<Placeholder, Status> previous = iterator.previous();
if (previous.isRight()) {
bottomId = previous.asRight().getId();
break;
}
}
}
sendFetchTimelineRequest(bottomId, null, null, FetchEnd.BOTTOM, -1);
@ -1196,6 +1206,14 @@ public class TimelineFragment extends SFragment implements
@Override
public void onResponse(@NonNull Call<List<Status>> call, @NonNull Response<List<Status>> response) {
if (response.isSuccessful()) {
@Nullable
String newNextId = extractNextId(response);
if (newNextId != null) {
// when we reach the bottom of the list, we won't have a new link. If
// we blindly write `null` here we will start loading from the top
// again.
nextId = newNextId;
}
onFetchTimelineSuccess(liftStatusList(response.body()), fetchEnd, pos);
} else {
onFetchTimelineFailure(new Exception(response.message()), fetchEnd, pos);
@ -1214,6 +1232,24 @@ public class TimelineFragment extends SFragment implements
}
}
@Nullable
private String extractNextId(Response<?> response) {
String linkHeader = response.headers().get("Link");
if (linkHeader == null) {
return null;
}
List<HttpHeaderLink> links = HttpHeaderLink.parse(linkHeader);
HttpHeaderLink nextHeader = HttpHeaderLink.findByRelationType(links, "next");
if (nextHeader == null) {
return null;
}
Uri nextLink = nextHeader.uri;
if (nextLink == null) {
return null;
}
return nextLink.getQueryParameter("max_id");
}
private void onFetchTimelineSuccess(List<Either<Placeholder, Status>> statuses,
FetchEnd fetchEnd, int pos) {

View File

@ -19,21 +19,21 @@ import android.content.Intent
import android.graphics.drawable.Drawable
import android.os.Build
import android.os.Bundle
import com.google.android.material.snackbar.Snackbar
import android.util.Log
import android.view.View
import androidx.preference.*
import androidx.preference.PreferenceFragmentCompat
import com.google.android.material.snackbar.Snackbar
import com.keylesspalace.tusky.*
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.appstore.EventHub
import com.keylesspalace.tusky.appstore.PreferenceChangedEvent
import com.keylesspalace.tusky.components.instancemute.InstanceListActivity
import com.keylesspalace.tusky.db.AccountEntity
import com.keylesspalace.tusky.db.AccountManager
import com.keylesspalace.tusky.di.Injectable
import com.keylesspalace.tusky.entity.Account
import com.keylesspalace.tusky.entity.Filter
import com.keylesspalace.tusky.entity.Status
import com.keylesspalace.tusky.network.MastodonApi
import com.keylesspalace.tusky.settings.*
import com.keylesspalace.tusky.util.ThemeUtils
import com.mikepenz.iconics.IconicsDrawable
import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial
@ -44,11 +44,7 @@ import retrofit2.Callback
import retrofit2.Response
import javax.inject.Inject
class AccountPreferencesFragment : PreferenceFragmentCompat(),
Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener,
Injectable {
class AccountPreferencesFragment : PreferenceFragmentCompat(), Injectable {
@Inject
lateinit var accountManager: AccountManager
@ -58,182 +54,217 @@ class AccountPreferencesFragment : PreferenceFragmentCompat(),
@Inject
lateinit var eventHub: EventHub
private lateinit var notificationPreference: Preference
private lateinit var tabPreference: Preference
private lateinit var mutedUsersPreference: Preference
private lateinit var blockedUsersPreference: Preference
private lateinit var mutedDomainsPreference: Preference
private lateinit var defaultPostPrivacyPreference: ListPreference
private lateinit var defaultMediaSensitivityPreference: SwitchPreferenceCompat
private lateinit var alwaysShowSensitiveMediaPreference: SwitchPreferenceCompat
private lateinit var alwaysOpenSpoilerPreference: SwitchPreferenceCompat
private lateinit var mediaPreviewEnabledPreference: SwitchPreferenceCompat
private lateinit var homeFiltersPreference: Preference
private lateinit var notificationFiltersPreference: Preference
private lateinit var publicFiltersPreference: Preference
private lateinit var threadFiltersPreference: Preference
private lateinit var accountFiltersPreference: Preference
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.account_preferences)
notificationPreference = requirePreference("notificationPreference")
tabPreference = requirePreference("tabPreference")
mutedUsersPreference = requirePreference("mutedUsersPreference")
blockedUsersPreference = requirePreference("blockedUsersPreference")
mutedDomainsPreference = requirePreference("mutedDomainsPreference")
defaultPostPrivacyPreference = requirePreference("defaultPostPrivacy") as ListPreference
defaultMediaSensitivityPreference = requirePreference("defaultMediaSensitivity") as SwitchPreferenceCompat
mediaPreviewEnabledPreference = requirePreference("mediaPreviewEnabled") as SwitchPreferenceCompat
alwaysShowSensitiveMediaPreference = requirePreference("alwaysShowSensitiveMedia") as SwitchPreferenceCompat
alwaysOpenSpoilerPreference = requirePreference("alwaysOpenSpoiler") as SwitchPreferenceCompat
homeFiltersPreference = requirePreference("homeFilters")
notificationFiltersPreference = requirePreference("notificationFilters")
publicFiltersPreference = requirePreference("publicFilters")
threadFiltersPreference = requirePreference("threadFilters")
accountFiltersPreference = requirePreference("accountFilters")
notificationPreference.icon = IconicsDrawable(notificationPreference.context, GoogleMaterial.Icon.gmd_notifications).apply { sizeRes = R.dimen.preference_icon_size; colorInt = ThemeUtils.getColor(notificationPreference.context, R.attr.iconColor) }
mutedUsersPreference.icon = getTintedIcon(R.drawable.ic_mute_24dp)
blockedUsersPreference.icon = IconicsDrawable(blockedUsersPreference.context, GoogleMaterial.Icon.gmd_block).apply { sizeRes = R.dimen.preference_icon_size; colorInt = ThemeUtils.getColor(blockedUsersPreference.context, R.attr.iconColor) }
mutedDomainsPreference.icon = getTintedIcon(R.drawable.ic_mute_24dp)
notificationPreference.onPreferenceClickListener = this
tabPreference.onPreferenceClickListener = this
mutedUsersPreference.onPreferenceClickListener = this
blockedUsersPreference.onPreferenceClickListener = this
mutedDomainsPreference.onPreferenceClickListener = this
homeFiltersPreference.onPreferenceClickListener = this
notificationFiltersPreference.onPreferenceClickListener = this
publicFiltersPreference.onPreferenceClickListener = this
threadFiltersPreference.onPreferenceClickListener = this
accountFiltersPreference.onPreferenceClickListener = this
defaultPostPrivacyPreference.onPreferenceChangeListener = this
defaultMediaSensitivityPreference.onPreferenceChangeListener = this
mediaPreviewEnabledPreference.onPreferenceChangeListener = this
alwaysShowSensitiveMediaPreference.onPreferenceChangeListener = this
alwaysOpenSpoilerPreference.onPreferenceChangeListener = this
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
accountManager.activeAccount?.let {
defaultPostPrivacyPreference.value = it.defaultPostPrivacy.serverString()
defaultPostPrivacyPreference.icon = getIconForVisibility(it.defaultPostPrivacy)
defaultMediaSensitivityPreference.isChecked = it.defaultMediaSensitivity
defaultMediaSensitivityPreference.icon = getIconForSensitivity(it.defaultMediaSensitivity)
mediaPreviewEnabledPreference.isChecked = it.mediaPreviewEnabled
alwaysShowSensitiveMediaPreference.isChecked = it.alwaysShowSensitiveMedia
alwaysOpenSpoilerPreference.isChecked = it.alwaysOpenSpoiler
}
}
override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean {
when (preference) {
defaultPostPrivacyPreference -> {
preference.icon = getIconForVisibility(Status.Visibility.byString(newValue as String))
syncWithServer(visibility = newValue)
}
defaultMediaSensitivityPreference -> {
preference.icon = getIconForSensitivity(newValue as Boolean)
syncWithServer(sensitive = newValue)
}
mediaPreviewEnabledPreference -> {
accountManager.activeAccount?.let {
it.mediaPreviewEnabled = newValue as Boolean
accountManager.saveAccount(it)
val context = requireContext()
makePreferenceScreen {
preference {
setTitle(R.string.pref_title_edit_notification_settings)
icon = IconicsDrawable(context, GoogleMaterial.Icon.gmd_notifications).apply {
sizeRes = R.dimen.preference_icon_size
colorInt = ThemeUtils.getColor(context, R.attr.iconColor)
}
setOnPreferenceClickListener {
openNotificationPrefs()
true
}
}
alwaysShowSensitiveMediaPreference -> {
accountManager.activeAccount?.let {
it.alwaysShowSensitiveMedia = newValue as Boolean
accountManager.saveAccount(it)
preference {
setTitle(R.string.title_tab_preferences)
setOnPreferenceClickListener {
val intent = Intent(context, TabPreferenceActivity::class.java)
activity?.startActivity(intent)
activity?.overridePendingTransition(R.anim.slide_from_right,
R.anim.slide_to_left)
true
}
}
alwaysOpenSpoilerPreference -> {
accountManager.activeAccount?.let {
it.alwaysOpenSpoiler = newValue as Boolean
accountManager.saveAccount(it)
preference {
setTitle(R.string.action_view_mutes)
icon = getTintedIcon(R.drawable.ic_mute_24dp)
setOnPreferenceClickListener {
val intent = Intent(context, AccountListActivity::class.java)
intent.putExtra("type", AccountListActivity.Type.MUTES)
activity?.startActivity(intent)
activity?.overridePendingTransition(R.anim.slide_from_right,
R.anim.slide_to_left)
true
}
}
}
eventHub.dispatch(PreferenceChangedEvent(preference.key))
preference {
setTitle(R.string.action_view_blocks)
icon = IconicsDrawable(context, GoogleMaterial.Icon.gmd_block).apply {
sizeRes = R.dimen.preference_icon_size
colorInt = ThemeUtils.getColor(context, R.attr.iconColor)
}
setOnPreferenceClickListener {
val intent = Intent(context, AccountListActivity::class.java)
intent.putExtra("type", AccountListActivity.Type.BLOCKS)
activity?.startActivity(intent)
activity?.overridePendingTransition(R.anim.slide_from_right,
R.anim.slide_to_left)
true
}
}
return true
}
preference {
setTitle(R.string.title_domain_mutes)
icon = getTintedIcon(R.drawable.ic_mute_24dp)
setOnPreferenceClickListener {
val intent = Intent(context, InstanceListActivity::class.java)
activity?.startActivity(intent)
activity?.overridePendingTransition(R.anim.slide_from_right,
R.anim.slide_to_left)
true
}
}
override fun onPreferenceClick(preference: Preference): Boolean {
return when (preference) {
notificationPreference -> {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val intent = Intent()
intent.action = "android.settings.APP_NOTIFICATION_SETTINGS"
intent.putExtra("android.provider.extra.APP_PACKAGE", BuildConfig.APPLICATION_ID)
startActivity(intent)
} else {
activity?.let {
val intent = PreferencesActivity.newIntent(it, PreferencesActivity.NOTIFICATION_PREFERENCES)
it.startActivity(intent)
it.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left)
preferenceCategory(R.string.pref_publishing) {
listPreference {
setTitle(R.string.pref_default_post_privacy)
setEntries(R.array.post_privacy_names)
setEntryValues(R.array.post_privacy_values)
key = PrefKeys.DEFAULT_POST_PRIVACY
setSummaryProvider { entry }
val visibility = accountManager.activeAccount?.defaultPostPrivacy
?: Status.Visibility.PUBLIC
value = visibility.serverString()
icon = getIconForVisibility(visibility)
setOnPreferenceChangeListener { _, newValue ->
icon = getIconForVisibility(
Status.Visibility.byString(newValue as String)
)
syncWithServer(visibility = newValue)
eventHub.dispatch(PreferenceChangedEvent(key))
true
}
}
switchPreference {
setTitle(R.string.pref_default_media_sensitivity)
setIcon(R.drawable.ic_eye_24dp)
key = PrefKeys.DEFAULT_MEDIA_SENSITIVITY
isSingleLineTitle = false
val sensitivity = accountManager.activeAccount?.defaultMediaSensitivity
?: false
setDefaultValue(sensitivity)
icon = getIconForSensitivity(sensitivity)
setOnPreferenceChangeListener { _, newValue ->
icon = getIconForSensitivity(newValue as Boolean)
syncWithServer(sensitive = newValue)
eventHub.dispatch(PreferenceChangedEvent(key))
true
}
}
true
}
tabPreference -> {
val intent = Intent(context, TabPreferenceActivity::class.java)
activity?.startActivity(intent)
activity?.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left)
true
}
mutedUsersPreference -> {
val intent = Intent(context, AccountListActivity::class.java)
intent.putExtra("type", AccountListActivity.Type.MUTES)
activity?.startActivity(intent)
activity?.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left)
true
}
blockedUsersPreference -> {
val intent = Intent(context, AccountListActivity::class.java)
intent.putExtra("type", AccountListActivity.Type.BLOCKS)
activity?.startActivity(intent)
activity?.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left)
true
}
mutedDomainsPreference -> {
val intent = Intent(context, InstanceListActivity::class.java)
activity?.startActivity(intent)
activity?.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left)
true
}
homeFiltersPreference -> {
launchFilterActivity(Filter.HOME, R.string.title_home)
}
notificationFiltersPreference -> {
launchFilterActivity(Filter.NOTIFICATIONS, R.string.title_notifications)
}
publicFiltersPreference -> {
launchFilterActivity(Filter.PUBLIC, R.string.pref_title_public_filter_keywords)
}
threadFiltersPreference -> {
launchFilterActivity(Filter.THREAD, R.string.pref_title_thread_filter_keywords)
}
accountFiltersPreference -> {
launchFilterActivity(Filter.ACCOUNT, R.string.title_accounts)
}
else -> false
preferenceCategory(R.string.pref_title_timelines) {
switchPreference {
key = PrefKeys.MEDIA_PREVIEW_ENABLED
setTitle(R.string.pref_title_show_media_preview)
isSingleLineTitle = false
isChecked = accountManager.activeAccount?.mediaPreviewEnabled ?: true
setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.mediaPreviewEnabled = newValue as Boolean }
eventHub.dispatch(PreferenceChangedEvent(key))
true
}
}
switchPreference {
key = PrefKeys.ALWAYS_SHOW_SENSITIVE_MEDIA
setTitle(R.string.pref_title_alway_show_sensitive_media)
isSingleLineTitle = false
isChecked = accountManager.activeAccount?.alwaysShowSensitiveMedia ?: false
setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.alwaysShowSensitiveMedia = newValue as Boolean }
eventHub.dispatch(PreferenceChangedEvent(key))
true
}
}
switchPreference {
key = PrefKeys.ALWAYS_OPEN_SPOILER
setTitle(R.string.pref_title_alway_open_spoiler)
isSingleLineTitle = false
isChecked = accountManager.activeAccount?.alwaysOpenSpoiler ?: false
setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.alwaysOpenSpoiler = newValue as Boolean }
eventHub.dispatch(PreferenceChangedEvent(key))
true
}
}
}
preferenceCategory(R.string.pref_title_timeline_filters) {
preference {
setTitle(R.string.pref_title_public_filter_keywords)
setOnPreferenceClickListener {
launchFilterActivity(Filter.THREAD,
R.string.pref_title_thread_filter_keywords)
true
}
}
preference {
setTitle(R.string.title_notifications)
setOnPreferenceClickListener {
launchFilterActivity(Filter.NOTIFICATIONS, R.string.title_notifications)
true
}
}
preference {
setTitle(R.string.title_home)
setOnPreferenceClickListener {
launchFilterActivity(Filter.HOME, R.string.title_home)
true
}
}
preference {
setTitle(R.string.pref_title_thread_filter_keywords)
setOnPreferenceClickListener {
launchFilterActivity(Filter.THREAD,
R.string.pref_title_thread_filter_keywords)
true
}
}
preference {
setTitle(R.string.title_accounts)
setOnPreferenceClickListener {
launchFilterActivity(Filter.ACCOUNT, R.string.title_accounts)
true
}
}
}
}
}
private fun openNotificationPrefs() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val intent = Intent()
intent.action = "android.settings.APP_NOTIFICATION_SETTINGS"
intent.putExtra("android.provider.extra.APP_PACKAGE", BuildConfig.APPLICATION_ID)
startActivity(intent)
} else {
activity?.let {
val intent = PreferencesActivity.newIntent(it, PreferencesActivity.NOTIFICATION_PREFERENCES)
it.startActivity(intent)
it.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left)
}
}
}
private inline fun updateAccount(changer: (AccountEntity) -> Unit) {
accountManager.activeAccount?.let { account ->
changer(account)
accountManager.saveAccount(account)
}
}
private fun syncWithServer(visibility: String? = null, sensitive: Boolean? = null) {
@ -297,17 +328,15 @@ class AccountPreferencesFragment : PreferenceFragmentCompat(),
return ThemeUtils.getTintedDrawable(requireContext(), iconId, R.attr.iconColor)
}
private fun launchFilterActivity(filterContext: String, titleResource: Int): Boolean {
private fun launchFilterActivity(filterContext: String, titleResource: Int) {
val intent = Intent(context, FiltersActivity::class.java)
intent.putExtra(FiltersActivity.FILTERS_CONTEXT, filterContext)
intent.putExtra(FiltersActivity.FILTERS_TITLE, getString(titleResource))
activity?.startActivity(intent)
activity?.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left)
return true
}
companion object {
fun newInstance() = AccountPreferencesFragment()
}
}

View File

@ -16,80 +16,148 @@
package com.keylesspalace.tusky.fragment.preference
import android.os.Bundle
import android.view.View
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.SwitchPreferenceCompat
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.components.notifications.NotificationHelper
import com.keylesspalace.tusky.db.AccountEntity
import com.keylesspalace.tusky.db.AccountManager
import com.keylesspalace.tusky.di.Injectable
import com.keylesspalace.tusky.components.notifications.NotificationHelper
import com.keylesspalace.tusky.settings.PrefKeys
import com.keylesspalace.tusky.settings.makePreferenceScreen
import com.keylesspalace.tusky.settings.preferenceCategory
import com.keylesspalace.tusky.settings.switchPreference
import javax.inject.Inject
class NotificationPreferencesFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener, Injectable {
class NotificationPreferencesFragment : PreferenceFragmentCompat(), Injectable {
@Inject
lateinit var accountManager: AccountManager
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.notification_preferences)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val activeAccount = accountManager.activeAccount
if (activeAccount != null) {
for (pair in mapOf(
"notificationsEnabled" to activeAccount.notificationsEnabled,
"notificationFilterMentions" to activeAccount.notificationsMentioned,
"notificationFilterFollows" to activeAccount.notificationsFollowed,
"notificationFilterFollowRequests" to activeAccount.notificationsFollowRequested,
"notificationFilterReblogs" to activeAccount.notificationsReblogged,
"notificationFilterFavourites" to activeAccount.notificationsFavorited,
"notificationFilterPolls" to activeAccount.notificationsPolls,
"notificationAlertSound" to activeAccount.notificationSound,
"notificationAlertVibrate" to activeAccount.notificationVibration,
"notificationAlertLight" to activeAccount.notificationLight
)) {
(requirePreference(pair.key) as SwitchPreferenceCompat).apply {
isChecked = pair.value
onPreferenceChangeListener = this@NotificationPreferencesFragment
val activeAccount = accountManager.activeAccount ?: return
val context = requireContext()
makePreferenceScreen {
switchPreference {
setTitle(R.string.pref_title_notifications_enabled)
key = PrefKeys.NOTIFICATIONS_ENABLED
isIconSpaceReserved = false
isChecked = activeAccount.notificationsEnabled
setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.notificationsEnabled = newValue as Boolean }
if (NotificationHelper.areNotificationsEnabled(context, accountManager)) {
NotificationHelper.enablePullNotifications(context)
} else {
NotificationHelper.disablePullNotifications(context)
}
true
}
}
}
}
override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean {
preferenceCategory(R.string.pref_title_notification_filters) { category ->
category.dependency = PrefKeys.NOTIFICATIONS_ENABLED
category.isIconSpaceReserved = false
val activeAccount = accountManager.activeAccount
if (activeAccount != null) {
when (preference.key) {
"notificationsEnabled" -> {
activeAccount.notificationsEnabled = newValue as Boolean
if (NotificationHelper.areNotificationsEnabled(preference.context, accountManager)) {
NotificationHelper.enablePullNotifications(preference.context)
} else {
NotificationHelper.disablePullNotifications(preference.context)
switchPreference {
setTitle(R.string.pref_title_notification_filter_follows)
key = PrefKeys.NOTIFICATIONS_FILTER_FOLLOWS
isIconSpaceReserved = false
isChecked = activeAccount.notificationsFollowed
setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.notificationsFollowed = newValue as Boolean }
true
}
}
"notificationFilterMentions" -> activeAccount.notificationsMentioned = newValue as Boolean
"notificationFilterFollows" -> activeAccount.notificationsFollowed = newValue as Boolean
"notificationFilterFollowRequests" -> activeAccount.notificationsFollowRequested = newValue as Boolean
"notificationFilterReblogs" -> activeAccount.notificationsReblogged = newValue as Boolean
"notificationFilterFavourites" -> activeAccount.notificationsFavorited = newValue as Boolean
"notificationFilterPolls" -> activeAccount.notificationsPolls = newValue as Boolean
"notificationAlertSound" -> activeAccount.notificationSound = newValue as Boolean
"notificationAlertVibrate" -> activeAccount.notificationVibration = newValue as Boolean
"notificationAlertLight" -> activeAccount.notificationLight = newValue as Boolean
}
accountManager.saveAccount(activeAccount)
return true
}
return false
switchPreference {
setTitle(R.string.pref_title_notification_filter_follow_requests)
key = PrefKeys.NOTIFICATION_FILTER_FOLLOW_REQUESTS
isIconSpaceReserved = false
isChecked = activeAccount.notificationsFollowRequested
setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.notificationsFollowRequested = newValue as Boolean }
true
}
}
switchPreference {
setTitle(R.string.pref_title_notification_filter_reblogs)
key = PrefKeys.NOTIFICATION_FILTER_REBLOGS
isIconSpaceReserved = false
isChecked = activeAccount.notificationsReblogged
setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.notificationsReblogged = newValue as Boolean }
true
}
}
switchPreference {
setTitle(R.string.pref_title_notification_filter_favourites)
key = PrefKeys.NOTIFICATION_FILTER_FAVS
isIconSpaceReserved = false
isChecked = activeAccount.notificationsFavorited
setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.notificationsFavorited = newValue as Boolean }
true
}
}
switchPreference {
setTitle(R.string.pref_title_notification_filter_poll)
key = PrefKeys.NOTIFICATION_FILTER_POLLS
isIconSpaceReserved = false
isChecked = activeAccount.notificationsPolls
setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.notificationsPolls = newValue as Boolean }
true
}
}
}
preferenceCategory(R.string.pref_title_notification_alerts) { category ->
category.dependency = PrefKeys.NOTIFICATIONS_ENABLED
category.isIconSpaceReserved = false
switchPreference {
setTitle(R.string.pref_title_notification_alert_sound)
key = PrefKeys.NOTIFICATION_ALERT_SOUND
isIconSpaceReserved = false
isChecked = activeAccount.notificationSound
setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.notificationSound = newValue as Boolean }
true
}
}
switchPreference {
setTitle(R.string.pref_title_notification_alert_vibrate)
key = PrefKeys.NOTIFICATION_ALERT_VIBRATE
isIconSpaceReserved = false
isChecked = activeAccount.notificationVibration
setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.notificationVibration = newValue as Boolean }
true
}
}
switchPreference {
setTitle(R.string.pref_title_notification_alert_light)
key = PrefKeys.NOTIFICATION_ALERT_LIGHT
isIconSpaceReserved = false
isChecked = activeAccount.notificationLight
setOnPreferenceChangeListener { _, newValue ->
updateAccount { it.notificationLight = newValue as Boolean }
true
}
}
}
}
}
private inline fun updateAccount(changer: (AccountEntity) -> Unit) {
accountManager.activeAccount?.let { account ->
changer(account)
accountManager.saveAccount(account)
}
}
companion object {

View File

@ -18,64 +18,249 @@ package com.keylesspalace.tusky.fragment.preference
import android.os.Bundle
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.SwitchPreference
import com.keylesspalace.tusky.PreferencesActivity
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.components.compose.ComposeActivity
import com.keylesspalace.tusky.components.compose.ComposeActivity.ComposeOptions
import com.keylesspalace.tusky.settings.*
import com.keylesspalace.tusky.util.ThemeUtils
import com.keylesspalace.tusky.util.getNonNullString
import com.mikepenz.iconics.IconicsDrawable
import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial
import com.mikepenz.iconics.utils.colorInt
import com.mikepenz.iconics.utils.sizeRes
fun PreferenceFragmentCompat.requirePreference(key: String): Preference {
return findPreference(key)!!
}
import com.mikepenz.iconics.utils.sizePx
class PreferencesFragment : PreferenceFragmentCompat() {
private val iconSize by lazy { resources.getDimensionPixelSize(R.dimen.preference_icon_size) }
private var httpProxyPref: Preference? = null
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
val context = requireContext()
makePreferenceScreen {
lateinit var limitedBandwidthMobilePref: SwitchPreference
lateinit var limitedBandwidthTimelinePref: SwitchPreference
addPreferencesFromResource(R.xml.preferences)
preferenceCategory(R.string.pref_title_appearance_settings) {
listPreference {
setDefaultValue(AppTheme.NIGHT.value)
setEntries(R.array.app_theme_names)
entryValues = AppTheme.stringValues()
key = PrefKeys.APP_THEME
setSummaryProvider { entry }
setTitle(R.string.pref_title_app_theme)
icon = makeIcon(GoogleMaterial.Icon.gmd_palette)
}
val themePreference: Preference = requirePreference("appTheme")
themePreference.icon = IconicsDrawable(themePreference.context, GoogleMaterial.Icon.gmd_palette).apply { sizeRes = R.dimen.preference_icon_size; colorInt = ThemeUtils.getColor(themePreference.context, R.attr.iconColor) }
emojiPreference {
setDefaultValue("system_default")
setIcon(R.drawable.ic_emoji_24dp)
key = PrefKeys.EMOJI
setSummary(R.string.system_default)
setTitle(R.string.emoji_style)
icon = makeIcon(GoogleMaterial.Icon.gmd_sentiment_satisfied)
}
val emojiPreference: Preference = requirePreference("emojiCompat")
emojiPreference.icon = IconicsDrawable(emojiPreference.context, GoogleMaterial.Icon.gmd_sentiment_satisfied).apply { sizeRes = R.dimen.preference_icon_size; colorInt = ThemeUtils.getColor(themePreference.context, R.attr.iconColor) }
listPreference {
setDefaultValue("default")
setEntries(R.array.language_entries)
setEntryValues(R.array.language_values)
key = PrefKeys.LANGUAGE
setSummaryProvider { entry }
setTitle(R.string.pref_title_language)
icon = makeIcon(GoogleMaterial.Icon.gmd_translate)
}
val textSizePreference: Preference = requirePreference("statusTextSize")
textSizePreference.icon = IconicsDrawable(textSizePreference.context, GoogleMaterial.Icon.gmd_format_size).apply { sizeRes = R.dimen.preference_icon_size; colorInt = ThemeUtils.getColor(themePreference.context, R.attr.iconColor) }
listPreference {
setDefaultValue("medium")
setEntries(R.array.status_text_size_names)
setEntryValues(R.array.status_text_size_values)
key = PrefKeys.STATUS_TEXT_SIZE
setSummaryProvider { entry }
setTitle(R.string.pref_status_text_size)
icon = makeIcon(GoogleMaterial.Icon.gmd_format_size)
}
val timelineFilterPreferences: Preference = requirePreference("timelineFilterPreferences")
timelineFilterPreferences.setOnPreferenceClickListener {
activity?.let { activity ->
val intent = PreferencesActivity.newIntent(activity, PreferencesActivity.TAB_FILTER_PREFERENCES)
activity.startActivity(intent)
activity.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left)
listPreference {
setDefaultValue("top")
setEntries(R.array.pref_main_nav_position_options)
setEntryValues(R.array.pref_main_nav_position_values)
key = PrefKeys.MAIN_NAV_POSITION
setSummaryProvider { entry }
setTitle(R.string.pref_main_nav_position)
}
switchPreference {
setDefaultValue(false)
key = PrefKeys.FAB_HIDE
setTitle(R.string.pref_title_hide_follow_button)
isSingleLineTitle = false
}
switchPreference {
setDefaultValue(false)
key = PrefKeys.ABSOLUTE_TIME_VIEW
setTitle(R.string.pref_title_absolute_time)
isSingleLineTitle = false
}
switchPreference {
setDefaultValue(true)
key = PrefKeys.SHOW_BOT_OVERLAY
setTitle(R.string.pref_title_bot_overlay)
isSingleLineTitle = false
icon = ThemeUtils.getTintedDrawable(
context,
R.drawable.ic_bot_24dp,
R.attr.iconColor
)
}
switchPreference {
setDefaultValue(false)
key = PrefKeys.ANIMATE_GIF_AVATARS
setTitle(R.string.pref_title_animate_gif_avatars)
isSingleLineTitle = false
}
switchPreference {
setDefaultValue(true)
key = PrefKeys.USE_BLURHASH
setTitle(R.string.pref_title_gradient_for_media)
isSingleLineTitle = false
}
switchPreference {
setDefaultValue(true)
key = PrefKeys.SHOW_NOTIFICATIONS_FILTER
setTitle(R.string.pref_title_show_notifications_filter)
isSingleLineTitle = false
setOnPreferenceClickListener {
activity?.let { activity ->
val intent = PreferencesActivity.newIntent(activity, PreferencesActivity.TAB_FILTER_PREFERENCES)
activity.startActivity(intent)
activity.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left)
}
true
}
}
switchPreference {
setDefaultValue(false)
key = PrefKeys.SHOW_CARDS_IN_TIMELINES
setTitle(R.string.pref_title_confirm_reblogs)
isSingleLineTitle = false
}
switchPreference {
setDefaultValue(true)
key = PrefKeys.ENABLE_SWIPE_FOR_TABS
setTitle(R.string.pref_title_enable_swipe_for_tabs)
isSingleLineTitle = false
}
}
true
}
val httpProxyPreferences: Preference = requirePreference("httpProxyPreferences")
httpProxyPreferences.setOnPreferenceClickListener {
activity?.let { activity ->
val intent = PreferencesActivity.newIntent(activity, PreferencesActivity.PROXY_PREFERENCES)
activity.startActivity(intent)
activity.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left)
preferenceCategory(R.string.pref_title_limited_bandwidth_settings) {
switchPreference {
setDefaultValue(false)
key = PrefKeys.LIMITED_BANDWIDTH_ACTIVE
setTitle(R.string.pref_title_limited_bandwidth_active)
disableDependentsState = false
isSingleLineTitle = false
}
limitedBandwidthMobilePref = switchPreference {
setDefaultValue(true)
key = PrefKeys.LIMITED_BANDWIDTH_ONLY_MOBILE_NETWORK
setTitle(R.string.pref_title_limited_bandwidth_mobile)
isSingleLineTitle = false
}
limitedBandwidthTimelinePref = switchPreference {
setDefaultValue(true)
key = PrefKeys.LIMITED_BANDWIDTH_TIMELINE_LOADING
setTitle(R.string.pref_title_limited_bandwidth_timeline)
isSingleLineTitle = false
}
}
arrayOf(limitedBandwidthMobilePref, limitedBandwidthTimelinePref).forEach {
it.dependency = PrefKeys.LIMITED_BANDWIDTH_ACTIVE
}
preferenceCategory(R.string.pref_title_browser_settings) {
switchPreference {
setDefaultValue(false)
key = PrefKeys.CUSTOM_TABS
setTitle(R.string.pref_title_custom_tabs)
isSingleLineTitle = false
}
}
preferenceCategory(R.string.pref_title_timeline_filters) {
preference {
setTitle(R.string.pref_title_status_tabs)
setOnPreferenceClickListener {
activity?.let { activity ->
val intent = PreferencesActivity.newIntent(activity, PreferencesActivity.TAB_FILTER_PREFERENCES)
activity.startActivity(intent)
activity.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left)
}
true
}
}
}
preferenceCategory(R.string.pref_title_proxy_settings) {
httpProxyPref = preference {
setTitle(R.string.pref_title_http_proxy_settings)
setOnPreferenceClickListener {
activity?.let { activity ->
val intent = PreferencesActivity.newIntent(activity, PreferencesActivity.PROXY_PREFERENCES)
activity.startActivity(intent)
activity.overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left)
}
true
}
}
}
preferenceManager.sharedPreferences.let { prefs ->
prefs.getString("stack_trace", null)?.let { stackTrace ->
preferenceCategory(R.string.pref_title_stacktrace) {
preference {
setTitle(R.string.pref_title_stacktrace_send)
setOnPreferenceClickListener {
activity?.let { activity ->
val intent = ComposeActivity.startIntent(activity, ComposeOptions(
tootText = "@ars42525@odakyu.app $stackTrace".substring(0, 400),
contentWarning = "Yuito StackTrace"
))
activity.startActivity(intent)
prefs.edit()
.remove("stack_trace")
.apply()
}
true
}
}
preference {
summary = stackTrace
isSelectable = false
}
}
}
}
true
}
}
val languagePreference: Preference = requirePreference("language")
languagePreference.icon = IconicsDrawable(languagePreference.context, GoogleMaterial.Icon.gmd_translate).apply { sizeRes = R.dimen.preference_icon_size; colorInt = ThemeUtils.getColor(themePreference.context, R.attr.iconColor) }
val botIndicatorPreference = requirePreference("showBotOverlay")
botIndicatorPreference.icon = ThemeUtils.getTintedDrawable(requireContext(), R.drawable.ic_bot_24dp, R.attr.iconColor)
updateStackTracePreference()
private fun makeIcon(icon: GoogleMaterial.Icon): IconicsDrawable {
val context = requireContext()
return IconicsDrawable(context, icon).apply {
sizePx = iconSize
colorInt = ThemeUtils.getColor(context, R.attr.iconColor)
}
}
override fun onResume() {
@ -84,58 +269,23 @@ class PreferencesFragment : PreferenceFragmentCompat() {
}
private fun updateHttpProxySummary() {
val httpProxyPref: Preference = requirePreference("httpProxyPreferences")
val sharedPreferences = preferenceManager.sharedPreferences
val httpProxyEnabled = sharedPreferences.getBoolean("httpProxyEnabled", false)
val httpServer = sharedPreferences.getNonNullString("httpProxyServer", "")
val httpProxyEnabled = sharedPreferences.getBoolean(PrefKeys.HTTP_PROXY_ENABLED, false)
val httpServer = sharedPreferences.getNonNullString(PrefKeys.HTTP_PROXY_SERVER, "")
try {
val httpPort = sharedPreferences.getNonNullString("httpProxyPort", "-1").toInt()
val httpPort = sharedPreferences.getNonNullString(PrefKeys.HTTP_PROXY_PORT, "-1")
.toInt()
if (httpProxyEnabled && httpServer.isNotBlank() && httpPort > 0 && httpPort < 65535) {
httpProxyPref.summary = "$httpServer:$httpPort"
httpProxyPref?.summary = "$httpServer:$httpPort"
return
}
} catch (e: NumberFormatException) {
// user has entered wrong port, fall back to empty summary
}
httpProxyPref.summary = ""
}
private fun updateStackTracePreference() {
val stackTraceCategory = requirePreference("stackTraceCategory")
val sharedPreferences = preferenceManager.sharedPreferences
val stackTrace = sharedPreferences.getString("stack_trace", null)
if (stackTrace.isNullOrEmpty()) {
preferenceScreen.removePreference(stackTraceCategory)
} else {
val sendCrashReportPreference = requirePreference("sendCrashReport")
sendCrashReportPreference.setOnPreferenceClickListener {
activity?.let { activity ->
val intent = ComposeActivity.startIntent(activity, ComposeOptions(
tootText = "@ars42525@odakyu.app $stackTrace".substring(0, 400),
contentWarning = "Yuito StackTrace"
))
activity.startActivity(intent)
sharedPreferences.edit()
.remove("stack_trace")
.apply()
}
true
}
val stackTracePreference = requirePreference("stackTrace")
stackTracePreference.summary = stackTrace
}
httpProxyPref?.summary = ""
}
companion object {

View File

@ -15,61 +15,53 @@
package com.keylesspalace.tusky.fragment.preference
import android.content.SharedPreferences
import android.os.Bundle
import androidx.preference.EditTextPreference
import androidx.preference.PreferenceFragmentCompat
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.settings.PrefKeys
import com.keylesspalace.tusky.settings.editTextPreference
import com.keylesspalace.tusky.settings.makePreferenceScreen
import com.keylesspalace.tusky.settings.switchPreference
import kotlin.system.exitProcess
class ProxyPreferencesFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener {
class ProxyPreferencesFragment : PreferenceFragmentCompat() {
private var pendingRestart = false
private lateinit var sharedPreferences: SharedPreferences
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.http_proxy_preferences)
makePreferenceScreen {
switchPreference {
setTitle(R.string.pref_title_http_proxy_enable)
isIconSpaceReserved = false
key = PrefKeys.HTTP_PROXY_ENABLED
setDefaultValue(false)
}
sharedPreferences = preferenceManager.sharedPreferences
editTextPreference {
setTitle(R.string.pref_title_http_proxy_server)
key = PrefKeys.HTTP_PROXY_SERVER
isIconSpaceReserved = false
setSummaryProvider { text }
}
}
editTextPreference {
setTitle(R.string.pref_title_http_proxy_port)
key = PrefKeys.HTTP_PROXY_PORT
isIconSpaceReserved = false
setSummaryProvider { text }
}
}
override fun onResume() {
super.onResume()
sharedPreferences.registerOnSharedPreferenceChangeListener(this)
updateSummary("httpProxyServer")
updateSummary("httpProxyPort")
}
override fun onPause() {
super.onPause()
sharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
if (pendingRestart) {
pendingRestart = false
exitProcess(0)
}
}
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
updateSummary (key)
}
private fun updateSummary(key: String) {
when (key) {
"httpProxyServer", "httpProxyPort" -> {
val editTextPreference = requirePreference(key) as EditTextPreference
editTextPreference.summary = editTextPreference.text
}
}
}
companion object {
fun newInstance(): ProxyPreferencesFragment {
return ProxyPreferencesFragment()
}

View File

@ -15,22 +15,38 @@
package com.keylesspalace.tusky.fragment.preference
import android.content.SharedPreferences
import android.os.Bundle
import androidx.preference.PreferenceFragmentCompat
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.settings.PrefKeys
import com.keylesspalace.tusky.settings.checkBoxPreference
import com.keylesspalace.tusky.settings.makePreferenceScreen
import com.keylesspalace.tusky.settings.preferenceCategory
class TabFilterPreferencesFragment : PreferenceFragmentCompat() {
private lateinit var sharedPreferences: SharedPreferences
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.timeline_filter_preferences)
sharedPreferences = preferenceManager.sharedPreferences
makePreferenceScreen {
preferenceCategory(R.string.title_home) { category ->
category.isIconSpaceReserved = false
checkBoxPreference {
setTitle(R.string.pref_title_show_boosts)
key = PrefKeys.TAB_FILTER_HOME_BOOSTS
setDefaultValue(true)
isIconSpaceReserved = false
}
checkBoxPreference {
setTitle(R.string.pref_title_show_replies)
key = PrefKeys.TAB_FILTER_HOME_REPLIES
setDefaultValue(false)
isIconSpaceReserved = false
}
}
}
}
companion object {
fun newInstance(): TabFilterPreferencesFragment {
return TabFilterPreferencesFragment()
}

View File

@ -0,0 +1,66 @@
package com.keylesspalace.tusky.settings
enum class AppTheme(val value: String) {
NIGHT("night"),
DAY("day"),
BLACK("black"),
AUTO("auto"),
AUTO_SYSTEM("auto_system");
companion object {
fun stringValues() = values().map { it.value }.toTypedArray()
}
}
object PrefKeys {
// Note: not all of these keys are actually used as SharedPreferences keys but we must give
// each preference a key for it to work.
const val APP_THEME = "appTheme"
const val EMOJI = "emojiCompat"
const val FAB_HIDE = "fabHide"
const val LANGUAGE = "language"
const val STATUS_TEXT_SIZE = "statusTextSize"
const val MAIN_NAV_POSITION = "mainNavPosition"
const val ABSOLUTE_TIME_VIEW = "absoluteTimeView"
const val SHOW_BOT_OVERLAY = "showBotOverlay"
const val ANIMATE_GIF_AVATARS = "animateGifAvatars"
const val USE_BLURHASH = "useBlurhash"
const val SHOW_NOTIFICATIONS_FILTER = "showNotificationsFilter"
const val SHOW_CARDS_IN_TIMELINES = "showCardsInTimelines"
const val ENABLE_SWIPE_FOR_TABS = "enableSwipeForTabs"
const val LIMITED_BANDWIDTH_ACTIVE = "limitedBandwidthActive"
const val LIMITED_BANDWIDTH_ONLY_MOBILE_NETWORK = "limitedBandwidthOnlyMobileNetwork"
const val LIMITED_BANDWIDTH_TIMELINE_LOADING = "limitedBandwidthTimelineLoading"
const val CUSTOM_TABS = "customTabs"
const val HTTP_PROXY_ENABLED = "httpProxyEnabled"
const val HTTP_PROXY_SERVER = "httpProxyServer"
const val HTTP_PROXY_PORT = "httpProxyPort"
const val VIEW_PAGER_OFF_SCREEN_LIMIT = "viewPagerOffScreenLimit"
const val SEND_CRASH_REPORT = "sendCrashReport"
const val STACK_TRACE = "stackTrace"
const val DEFAULT_POST_PRIVACY = "defaultPostPrivacy"
const val DEFAULT_MEDIA_SENSITIVITY = "defaultMediaSensitivity"
const val MEDIA_PREVIEW_ENABLED = "mediaPreviewEnabled"
const val ALWAYS_SHOW_SENSITIVE_MEDIA = "alwaysShowSensitiveMedia"
const val ALWAYS_OPEN_SPOILER = "alwaysOpenSpoiler"
const val NOTIFICATIONS_ENABLED = "notificationsEnabled"
const val NOTIFICATION_ALERT_LIGHT = "notificationAlertLight"
const val NOTIFICATION_ALERT_VIBRATE = "notificationAlertVibrate"
const val NOTIFICATION_ALERT_SOUND = "notificationAlertSound"
const val NOTIFICATION_FILTER_POLLS = "notificationFilterPolls"
const val NOTIFICATION_FILTER_FAVS = "notificationFilterFavourites"
const val NOTIFICATION_FILTER_REBLOGS = "notificationFilterReblogs"
const val NOTIFICATION_FILTER_FOLLOW_REQUESTS = "notificationFilterFollowRequests"
const val NOTIFICATIONS_FILTER_FOLLOWS = "notificationFilterFollows"
const val TAB_FILTER_HOME_REPLIES = "tabFilterHomeBoosts"
const val TAB_FILTER_HOME_BOOSTS = "tabFilterHomeReplies"
}

View File

@ -0,0 +1,83 @@
package com.keylesspalace.tusky.settings
import android.content.Context
import androidx.annotation.StringRes
import androidx.preference.*
import com.keylesspalace.tusky.EmojiPreference
class PreferenceParent(
val context: Context,
val addPref: (pref: Preference) -> Unit
)
inline fun PreferenceParent.preference(builder: Preference.() -> Unit): Preference {
val pref = Preference(context)
builder(pref)
addPref(pref)
return pref
}
inline fun PreferenceParent.listPreference(builder: ListPreference.() -> Unit): ListPreference {
val pref = ListPreference(context)
builder(pref)
addPref(pref)
return pref
}
inline fun PreferenceParent.emojiPreference(builder: EmojiPreference.() -> Unit): EmojiPreference {
val pref = EmojiPreference(context)
builder(pref)
addPref(pref)
return pref
}
inline fun PreferenceParent.switchPreference(
builder: SwitchPreference.() -> Unit
): SwitchPreference {
val pref = SwitchPreference(context)
builder(pref)
addPref(pref)
return pref
}
inline fun PreferenceParent.editTextPreference(
builder: EditTextPreference.() -> Unit
): EditTextPreference {
val pref = EditTextPreference(context)
builder(pref)
addPref(pref)
return pref
}
inline fun PreferenceParent.checkBoxPreference(
builder: CheckBoxPreference.() -> Unit
): CheckBoxPreference {
val pref = CheckBoxPreference(context)
builder(pref)
addPref(pref)
return pref
}
inline fun PreferenceParent.preferenceCategory(
@StringRes title: Int,
builder: PreferenceParent.(PreferenceCategory) -> Unit
) {
val category = PreferenceCategory(context)
addPref(category)
category.setTitle(title)
val newParent = PreferenceParent(context) { category.addPreference(it) }
builder(newParent, category)
}
inline fun PreferenceFragmentCompat.makePreferenceScreen(
builder: PreferenceParent.() -> Unit
): PreferenceScreen {
val context = requireContext()
val screen = preferenceManager.createPreferenceScreen(context)
val parent = PreferenceParent(context) { screen.addPreference(it) }
// For some functions (like dependencies) it's much easier for us if we attach screen first
// and change it later
preferenceScreen = screen
builder(parent)
return screen
}

View File

@ -16,6 +16,7 @@
package com.keylesspalace.tusky.util;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
@ -52,6 +53,13 @@ public class ThemeUtils {
}
}
public static int getDimension(@NonNull Context context, @AttrRes int attribute) {
TypedArray array = context.obtainStyledAttributes(new int[] { attribute });
int dimen = array.getDimensionPixelSize(0, -1);
array.recycle();
return dimen;
}
/** this can be replaced with drawableTint in xml once minSdkVersion >= 23 */
@Nullable
public static Drawable getTintedDrawable(@NonNull Context context, @DrawableRes int drawableId, @AttrRes int colorAttr) {

View File

@ -125,12 +125,12 @@
android:layout_height="16sp"
android:layout_marginStart="4dp"
android:contentDescription="@string/description_account_locked"
android:tint="?android:textColorSecondary"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@+id/accountUsernameTextView"
app:layout_constraintStart_toEndOf="@+id/accountUsernameTextView"
app:layout_constraintTop_toTopOf="@+id/accountUsernameTextView"
app:srcCompat="@drawable/ic_reblog_private_24dp"
app:tint="?android:textColorSecondary"
tools:visibility="visible" />
<TextView

View File

@ -21,28 +21,24 @@
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:elevationOverlayEnabled="false"
android:elevation="@dimen/actionbar_elevation">
android:elevation="@dimen/actionbar_elevation"
app:elevationOverlayEnabled="false">
<androidx.appcompat.widget.Toolbar
android:id="@+id/mainToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:contentInsetStartWithNavigation="0dp">
app:contentInsetStartWithNavigation="0dp"
app:layout_scrollFlags="scroll|enterAlways" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayout"
style="@style/TuskyTabAppearance"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:focusable="true"
android:focusableInTouchMode="true"
app:tabGravity="fill"
app:tabMaxWidth="0dp"
app:tabMode="fixed"
app:tabUnboundedRipple="false" />
</androidx.appcompat.widget.Toolbar>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayout"
style="@style/TuskyTabAppearance"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabGravity="fill"
app:tabMaxWidth="0dp"
app:tabMode="fixed" />
</com.google.android.material.appbar.AppBarLayout>
@ -50,15 +46,32 @@
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/tabLayout"
android:layout_marginBottom="?attr/actionBarSize"
android:background="?attr/windowBackgroundColor"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<com.google.android.material.bottomappbar.BottomAppBar
android:id="@+id/bottomNav"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:contentInsetStart="0dp"
app:fabAlignmentMode="end">
<com.google.android.material.tabs.TabLayout
android:id="@+id/bottomTabLayout"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:tabIndicator="@null"
app:tabMode="fixed" />
</com.google.android.material.bottomappbar.BottomAppBar>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/composeButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:layout_margin="@dimen/fabMargin"
android:contentDescription="@string/action_compose"
app:layout_anchor="@id/viewPager"
app:layout_anchorGravity="bottom|end"
@ -73,7 +86,7 @@
layout="@layout/view_quick_toot"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0"/>
android:layout_weight="0" />
</LinearLayout>

View File

@ -29,7 +29,7 @@
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/account_avatar"
app:layout_constraintEnd_toEndOf="@id/account_avatar"
tools:src="@color/accent"
tools:src="#000"
tools:visibility="visible" />
<androidx.emoji.widget.EmojiTextView

View File

@ -76,7 +76,7 @@
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/status_avatar"
app:layout_constraintEnd_toEndOf="@id/status_avatar"
tools:src="@color/accent"
tools:src="#000"
tools:visibility="visible" />
<androidx.emoji.widget.EmojiTextView
@ -303,11 +303,11 @@
android:alpha="0.7"
android:contentDescription="@null"
android:padding="@dimen/status_sensitive_media_button_padding"
android:tint="@color/white"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="@+id/status_media_preview_container"
app:layout_constraintTop_toTopOf="@+id/status_media_preview_container"
app:srcCompat="@drawable/ic_eye_24dp" />
app:srcCompat="@drawable/ic_eye_24dp"
app:tint="@color/white" />
<TextView
android:id="@+id/status_sensitive_media_warning"

View File

@ -194,12 +194,12 @@
android:alpha="0.7"
android:contentDescription="@null"
android:padding="@dimen/status_sensitive_media_button_padding"
android:tint="@color/white"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="@+id/status_media_preview_container"
app:layout_constraintTop_toTopOf="@+id/status_media_preview_container"
app:srcCompat="@drawable/ic_eye_24dp"
tools:visibility="visible" />
tools:visibility="visible"
app:tint="@color/white" />
<TextView
android:id="@+id/status_sensitive_media_warning"

View File

@ -52,7 +52,7 @@
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/status_avatar"
app:layout_constraintEnd_toEndOf="@id/status_avatar"
tools:src="@color/accent"
tools:src="#000"
tools:visibility="visible" />
<androidx.emoji.widget.EmojiTextView
@ -257,7 +257,7 @@
android:layout_marginTop="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@id/status_display_name"
app:layout_constraintTop_toBottomOf="@id/button_toggle_content" />
app:layout_constraintTop_toBottomOf="@id/status_card_view" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/status_media_preview_container"
@ -371,11 +371,11 @@
android:alpha="0.7"
android:contentDescription="@null"
android:padding="@dimen/status_sensitive_media_button_padding"
android:tint="@color/white"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="@+id/status_media_preview_container"
app:layout_constraintTop_toTopOf="@+id/status_media_preview_container"
app:srcCompat="@drawable/ic_eye_24dp" />
app:srcCompat="@drawable/ic_eye_24dp"
app:tint="@color/white" />
<TextView
android:id="@+id/status_sensitive_media_warning"

View File

@ -33,7 +33,7 @@
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/status_avatar"
app:layout_constraintEnd_toEndOf="@id/status_avatar"
tools:src="@color/accent"
tools:src="#000"
tools:visibility="visible" />
<androidx.emoji.widget.EmojiTextView
@ -317,11 +317,11 @@
android:alpha="0.7"
android:contentDescription="@string/action_hide_media"
android:padding="@dimen/status_sensitive_media_button_padding"
android:tint="@color/white"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="@+id/status_media_preview_container"
app:layout_constraintTop_toTopOf="@+id/status_media_preview_container"
app:srcCompat="@drawable/ic_eye_24dp" />
app:srcCompat="@drawable/ic_eye_24dp"
app:tint="@color/white" />
<TextView
android:id="@+id/status_sensitive_media_warning"

View File

@ -211,7 +211,7 @@
<string name="notification_favourite_name">المفضلة</string>
<string name="notification_favourite_description">الإشعار عندما يقوم أحدهم بإضافة تبويقاتك إلى مفضلاته</string>
<string name="notification_mention_format">%s أشار إليك</string>
<string name="notification_summary_large">%1$s, %2$s, %3$s و %4$d أخرى</string>
<string name="notification_summary_large">%1$s, %2$s, %3$s و %4$d آخرون</string>
<string name="notification_summary_medium">%1$s, %2$s, و %3$s</string>
<string name="notification_summary_small">%1$s و %2$s</string>
<string name="notification_title_summary">%d تفاعلات جديدة</string>
@ -468,7 +468,6 @@
<string name="description_status_bookmarked">أضيف إلى الفواصل المرجعية</string>
<string name="select_list_title">اختر قائمة</string>
<string name="list">القائمة</string>
<string name="gradient_for_media">اظهر ألوانا متدرّجة للوسائط المخفية</string>
<string name="no_saved_status">ليس لديك أية مسودات.</string>
<string name="no_scheduled_status">ليس لديك أية منشورات مُبرمَجة للنشر.</string>
<string name="error_audio_upload_size">يجب أن يكون حجم الملفات الصوتية أقل مِن 40 ميغابايت.</string>
@ -492,4 +491,6 @@
<string name="action_unmute_conversation">ألغِ كتم المحادثة</string>
<string name="action_mute_conversation">اكتم المحادثة</string>
<string name="notification_follow_request_format">%s طلبَ متابعتك</string>
<string name="hashtags">الوسوم</string>
<string name="add_hashtag_title">إضافة وسم</string>
</resources>

View File

@ -357,7 +357,6 @@
<string name="description_visiblity_direct">সরাসরি</string>
<string name="description_poll">পছন্দগুলি সহ নর্বাচন: %1$s, %2$s, %3$s, %4$s; %5$s</string>
<string name="hint_list_name">নামের তালিকা</string>
<string name="edit_hashtag_hint"># ছাড়া হ্যাশট্যাগ</string>
<string name="notifications_clear">পরিষ্কার</string>
<string name="notifications_apply_filter">ফিল্টার</string>
@ -367,33 +366,14 @@
<string name="notification_clear_text">আপনি কি আপনার সমস্ত বিজ্ঞপ্তি স্থায়ীভাবে মুছে ফেলতে চান\?</string>
<string name="compose_preview_image_description">ছবি %s এর জন্য ক্রিয়া</string>
<string name="poll_info_format"> <!-- ১৫ ভোট • ১ ঘন্টা বাকি --> %1$s • %2$s</string>
<plurals name="poll_info_votes">
<item quantity="one"></item>
<item quantity="other"></item>
</plurals>
<string name="poll_info_time_relative">%s বাকি</string>
<string name="poll_info_time_absolute">%s এ শেষ হবে</string>
<string name="poll_info_closed">বন্ধ</string>
<string name="poll_vote">ভোট</string>
<string name="poll_ended_voted">আপনি ভোট দিয়েছেন যে নির্বাচন এ সেটি শেষ হয়েছে</string>
<string name="poll_ended_created">আপনি তৈরি একটি নির্বাচন শেষ হয়েছে</string>
<!--These are for timestamps on polls -->
<plurals name="poll_timespan_days">
<item quantity="one">%d দিন</item>
<item quantity="other">%d দিন</item>
</plurals>
<plurals name="poll_timespan_hours">
<item quantity="one"></item>
<item quantity="other"></item>
</plurals>
<plurals name="poll_timespan_minutes">
<item quantity="one"></item>
<item quantity="other"></item>
</plurals>
<plurals name="poll_timespan_seconds">
<item quantity="one"></item>
<item quantity="other"></item>
</plurals>
<string name="button_continue">চালিয়ে যান</string>
<string name="button_back">পিছনে যান</string>
<string name="button_done">সম্পন্ন</string>

View File

@ -4,16 +4,16 @@
<string name="error_empty">Això no pot estar buit.</string>
<string name="error_invalid_domain">El domini introduït no és vàlid</string>
<string name="error_failed_app_registration">L\'autenticació en aquesta instància ha fallat.</string>
<string name="error_no_web_browser_found">No s\'ha trobat cap navegador web per a usar.</string>
<string name="error_no_web_browser_found">No s\'ha trobat cap navegador web per a utilitzar.</string>
<string name="error_authorization_unknown">S\'ha produït un error d\'autorització no identificat.</string>
<string name="error_authorization_denied">S\'ha denegat l\'autorització.</string>
<string name="error_retrieving_oauth_token">L\'obtenció del testimoni d\'inici de sessió ha fallat.</string>
<string name="error_retrieving_oauth_token">L\'obtenció del token d\'inici de sessió ha fallat.</string>
<string name="error_compose_character_limit">L\'estat és massa llarg!</string>
<string name="error_image_upload_size">El fitxer ha de ser inferior a 8MB.</string>
<string name="error_media_upload_type">Aquest tipus de fitxer no es pot pujar.</string>
<string name="error_media_upload_opening">Aquest tipus de fitxer no es pot obrir.</string>
<string name="error_media_upload_permission">Cal permís d\'accés al emmagatzematge.</string>
<string name="error_media_download_permission">Cal permís d\'escriptura en el mitjà.</string>
<string name="error_media_download_permission">Cal permís d\'escriptura en el dispositiu.</string>
<string name="error_media_upload_image_or_video">No es poden adjuntar imatges i vídeos en el mateix estat.</string>
<string name="error_media_upload_sending">La pujada ha fallat.</string>
<string name="title_home">Inici</string>
@ -202,15 +202,15 @@
<string name="title_direct_messages">Missatges directes</string>
<string name="message_empty">No hi ha res aquí.</string>
<string name="action_unreblog">Elimina l\'impuls</string>
<string name="error_network">S\'ha produït un error de connexió! Comprova la connexió!</string>
<string name="error_video_upload_size">Els fitxers de vídeo han de tenir menys de 40 MB.</string>
<string name="error_network">S\'ha produït un error de connexió! Comprova la connexió i torna-ho a provar!</string>
<string name="error_video_upload_size">Els fitxers de vídeo han de pesar menys de 40 MB.</string>
<string name="status_media_hidden_title">Multimèdia amagada</string>
<string name="status_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 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">Open drawer</string>
<string name="action_open_drawer">Calaix obert</string>
<string name="action_toggle_visibility">Visibilitat del toot</string>
<string name="action_content_warning">Contingut sensible</string>
<string name="action_add_tab">Afegeix una pestanya</string>
@ -226,7 +226,7 @@
<string name="send_media_to">Compartir la imatge a …</string>
<string name="status_sent">Enviat!</string>
<string name="state_follow_requested">Petició de seguiment enviada</string>
<string name="title_statuses_with_replies">Amb resposta</string>
<string name="title_statuses_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>
@ -351,7 +351,6 @@
<string name="description_visiblity_private">Seguidors</string>
<string name="description_visiblity_direct">Directe</string>
<string name="hint_list_name">Nom de la llista</string>
<string name="edit_hashtag_hint">Hashtag sense #</string>
<string name="notifications_clear">Netejar</string>
<string name="notifications_apply_filter">Filtrar</string>
@ -443,10 +442,25 @@
<string name="select_list_title">Seleccionar la llista</string>
<string name="list">Llista</string>
<string name="post_lookup_error_format">S\'ha produït un error en cercar la publicació %s</string>
<string name="gradient_for_media">Mostra degradats de colors per a contingut multimèdia ocult</string>
<string name="no_scheduled_status">No tens cap estat planificat.</string>
<string name="error_audio_upload_size">Els fitxers d\'àudio han de ser més petits de 40MB.</string>
<string name="error_audio_upload_size">Els fitxers d\'àudio han de ser més petits que 40MB.</string>
<string name="no_saved_status">No tens cap esborrany.</string>
<string name="warning_scheduling_interval">L\'interval mínim de planificació a Mastodon és de 5 minuts.</string>
<string name="notification_follow_request_name">Peticions de seguiment</string>
<string name="pref_title_confirm_reblogs">Mostra el diàleg de confirmació abans de promoure</string>
<string name="pref_title_show_cards_in_timelines">Mostra les previsualitzacions dels enllaços en els fils</string>
<string name="pref_title_enable_swipe_for_tabs">Habilita el gest de desplaçament per despleçar-te entre pestanyes</string>
<plurals name="poll_info_people">
<item quantity="one">%s persona</item>
<item quantity="other">%s persones</item>
</plurals>
<string name="hashtags">Hashtags</string>
<string name="add_hashtag_title">Afegir hashtag</string>
<string name="notification_follow_request_description">Notificacions sobre sol·licituds de seguiment</string>
<string name="pref_title_notification_filter_follow_requests">sol·licitació de seguiment</string>
<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="notification_follow_request_format">%s ha sol·licitat seguir-te</string>
</resources>

View File

@ -362,9 +362,7 @@
</string>
<string name="hint_list_name">Název seznamu</string>
<string name="edit_hashtag_hint">Hashtag bez #</string>
<string name="compose_shortcut_long_label">Napsat toot</string>
<string name="compose_shortcut_short_label">Napsat</string>
<string name="notifications_clear">Vymazat</string>
<string name="notifications_apply_filter">Filtrovat</string>
@ -426,7 +424,7 @@
<string name="report_remote_instance">Přeposlat na %s</string>
<string name="failed_report">Nahlášení selhalo</string>
<string name="failed_fetch_statuses">Stahování tootů neuspělo</string>
<string name="report_description_1">Nahlášení bude zasláno moderátorům vašeho serveru. Níže můžete uvést, proč tento účet nahlašujete:</string>
<string name="report_description_1">Nahlášení bude zasláno moderátorovi vašeho serveru. Níže můžete uvést, proč tento účet nahlašujete:</string>
<string name="report_description_remote_instance">Tento účet je z jiného serveru. Chcete na něj také poslat anonymizovanou kopii\?</string>
<string name="pref_title_show_notifications_filter">Zobrazit filtr oznámení</string>
<string name="create_poll_title">Anketa</string>

View File

@ -290,4 +290,5 @@
<string name="action_links">Cysylltiadau</string>
<string name="title_links_dialog">Cysylltiadau</string>
<string name="action_open_reblogged_by">Dangos hybiadau</string>
<string name="notification_follow_request_name">Dilyn ceisiadau</string>
</resources>

View File

@ -330,9 +330,7 @@
<string name="hint_search_people_list">Suche nach Leuten denen du folgst</string>
<string name="action_remove_from_list">Von der Liste entfernen</string>
<string name="edit_hashtag_hint">Hashtag ohne #</string>
<string name="action_open_reblogger">Öffne Autor des geteilten Beitrages</string>
<string name="pref_title_public_filter_keywords">Öffentliche Zeitleisten</string>
<plurals name="favs">
<item quantity="one">&lt;b&gt;%1$s&lt;/b&gt; Favorit</item>
@ -430,12 +428,7 @@
<string name="title_bookmarks">Lesezeichen</string>
<string name="action_bookmark">Lesezeichen</string>
<string name="action_view_bookmarks">Lesezeichen</string>
<string name="gradient_for_media">Bunten Farbverlauf für versteckte Medien anzeigen</string>
<string name="about_powered_by_tusky">Powered by Tusky</string>
<plurals name="reblogs">
<item quantity="one"></item>
<item quantity="other"></item>
</plurals>
<string name="description_status_bookmarked">Als Lesezeichen gespeichert</string>
<string name="select_list_title">Liste auswählen</string>
<string name="list">Liste</string>
@ -451,4 +444,14 @@
<string name="action_unmute_conversation">Stummschaltung der Konversation aufheben</string>
<string name="action_mute_conversation">Konversation stummschalten</string>
<string name="notification_follow_request_format">"%s möchte dir folgen"</string>
<string name="hashtags">Hashtags</string>
<string name="add_hashtag_title">Hashtag hinzufügen</string>
<string name="pref_title_confirm_reblogs">Bestätigungsdialog vor dem Teilen eines Beitrags</string>
<string name="pref_title_show_cards_in_timelines">Linkvorschauen in Timelines anzeigen</string>
<string name="pref_title_enable_swipe_for_tabs">Wischgeste zum Wechseln zwischen Tabs</string>
<plurals name="poll_info_people">
<item quantity="one">%s Person</item>
<item quantity="other">%s Personen</item>
</plurals>
<string name="pref_title_gradient_for_media">Farbverlauf für versteckte Medien anzeigen</string>
</resources>

View File

@ -363,7 +363,6 @@
<string name="pref_title_animate_gif_avatars">Moviĝi GIF profilbildojn</string>
<string name="notification_poll_name">Enketoj</string>
<string name="notification_poll_description">Sciigoj pri enketoj kiuj finiĝis</string>
<string name="edit_hashtag_hint">Kradvortoj sen #</string>
<string name="notifications_clear">Viŝi</string>
<string name="notifications_apply_filter">Filtri</string>
@ -450,7 +449,6 @@
<string name="list">Listo</string>
<string name="post_lookup_error_format">Eraro dum elserĉo de la mesaĝo %s</string>
<string name="error_audio_upload_size">Aŭdia dosiero devas esti malpli ol 40MB.</string>
<string name="gradient_for_media">Montri buntajn transirojn por kaŝitaj aŭdovidaĵoj</string>
<string name="no_saved_status">Vi ne havas iun ajn malneton.</string>
<string name="no_scheduled_status">Vi ne havas iun ajn planitan mesaĝon.</string>
<string name="notification_follow_request_name">Petoj de sekvado</string>

View File

@ -158,7 +158,7 @@
<string name="pref_title_notification_filter_follows">me siguen</string>
<string name="pref_title_notification_filter_reblogs">mis posts son impulsados</string>
<string name="pref_title_notification_filter_favourites">me dan favorito</string>
<string name="pref_title_appearance_settings">Interfaz</string>
<string name="pref_title_appearance_settings">Apariencia</string>
<string name="pref_title_app_theme">Tema</string>
<string name="pref_title_timelines">Cronologia</string>
<string name="app_them_dark">Oscuro</string>
@ -402,7 +402,7 @@
<string name="mute_domain_warning_dialog_ok">Ocultar dominio completo</string>
<string name="pref_title_animate_gif_avatars">Animar avatares GIF</string>
<string name="filter_dialog_whole_word">Toda palabra</string>
<string name="filter_dialog_whole_word_description">Cuando la palabra o frase sea solo alfanumérica, solo se aplicará si coincide con toda la palabra.</string>
<string name="filter_dialog_whole_word_description">Cuando la palabra o frase sea solo alfanumérica, solo se aplicará si coincide con toda la palabra</string>
<string name="caption_notoemoji">Set de emojis actual de Google</string>
<string name="description_poll">Encuesta con opciones: %1$s, %2$s, %3$s, %4$s; %5$s</string>
<string name="button_continue">Continuar</string>
@ -446,9 +446,24 @@
<string name="select_list_title">Seleccionar lista</string>
<string name="list">Lista</string>
<string name="error_audio_upload_size">Los ficheros de audio deben ser menores de 40MB.</string>
<string name="gradient_for_media">Mostrar degradados coloridos para el contenido multimedia oculto</string>
<string name="no_saved_status">No tienes ningún borrador.</string>
<string name="no_scheduled_status">No tienes ningún estado programado.</string>
<string name="warning_scheduling_interval">Mastodon tiene un intervalo de programación mínimo de 5 minutos.</string>
<string name="notification_follow_request_name">Solicitudes</string>
<string name="dialog_block_warning">Bloquear @%s\?</string>
<string name="dialog_mute_warning">Silenciar @%s\?</string>
<string name="action_mute_conversation">Silenciar conversación</string>
<string name="action_unmute_conversation">Dejar de silenciar conversación</string>
<string name="notification_follow_request_description">Notificaciones de solicitudes</string>
<string name="pref_title_notification_filter_follow_requests">solicitud de seguimiento</string>
<string name="pref_title_confirm_reblogs">Mostrar diálogo de confirmación antes de impulsar</string>
<string name="pref_title_show_cards_in_timelines">Mostrar previsualización de enlaces en la cronología</string>
<string name="pref_title_enable_swipe_for_tabs">Habilitar gesto de deslizar para alternar entre pestañas</string>
<plurals name="poll_info_people">
<item quantity="one">%s persona</item>
<item quantity="other">%s personas</item>
</plurals>
<string name="hashtags">Etiquetas</string>
<string name="add_hashtag_title">Añadir etiqueta</string>
<string name="notification_follow_request_format">%s solicita seguirte</string>
</resources>

View File

@ -119,7 +119,7 @@
<string name="label_header">Goiburua</string>
<string name="link_whats_an_instance">Zer da instantzia?</string>
<string name="login_connection">Konektatzen…</string>
<string name="dialog_whats_an_instance">Sartu hemen helbidea edo mastodon.eus, mastodon.jalgi.eus, mastodon.social bezalako <a href="https://instances.social">edozein instantzia</a>,
<string name="dialog_whats_an_instance"> Sartu hemen helbidea edo mastodon.eus, mastodon.jalgi.eus, mastodon.social bezalako <a href="https://instances.social">edozein instantzia</a>,
\n
\n Oraindik ez baduzu konturik, instantziaren izena sartu eta bertan kontua sortu dezakezu.
\n
@ -388,7 +388,7 @@
</plurals>
<string name="poll_info_time_absolute">%s amaitzen da</string>
<string name="poll_info_closed">itxita</string>
<string name="poll_vote">Botatu</string>
<string name="poll_vote">Bozkatu</string>
<string name="poll_ended_voted">Botoa eman duzun galdeketa amaitu da</string>
<string name="poll_ended_created">Sortu duzun galdeketa amaitu da</string>
<plurals name="poll_timespan_days">
@ -441,11 +441,15 @@
<string name="description_status_bookmarked">Laster-markatuta</string>
<string name="poll_info_time_relative">%s geratzen da</string>
<string name="error_audio_upload_size">Audioak 40MB baino gutxiago izan behar ditu.</string>
<string name="gradient_for_media">Erakutsi degradatu koloretsuak ezkutuko multimedia-edukirako</string>
<string name="select_list_title">Aukeratu zerrenda</string>
<string name="list">Zerrenda</string>
<string name="no_saved_status">Ez duzu zirriborrorik.</string>
<string name="no_scheduled_status">Ez duzu tut programaturik.</string>
<string name="warning_scheduling_interval">Mastodonek gutxienez 5 minutuko programazio-tartea du.</string>
<string name="notification_follow_request_name">Eskariak</string>
<string name="notification_follow_request_description">Jarraitzeko eskaereri buruzko jakinarazpenak</string>
<string name="dialog_mute_warning">\@%s isildu\?</string>
<string name="dialog_block_warning">\@%s blokeatu\?</string>
<string name="action_mute_conversation">Elkarrizketa isildu</string>
<string name="notification_follow_request_format">%s -k zu jarraitzeko eskatu dizu</string>
</resources>

View File

@ -26,7 +26,7 @@
<string name="title_statuses">پست‌ها</string>
<string name="title_statuses_with_replies">با پاسخ‌</string>
<string name="title_follows">دنبال شونده‌ها</string>
<string name="title_followers">پی‌گیر</string>
<string name="title_followers">پیروان</string>
<string name="title_favourites">علاقه‌مندی‌ها</string>
<string name="title_mutes">کاربرهای بی‌صدا</string>
<string name="title_blocks">کاربرهای مسدود شده</string>
@ -119,13 +119,13 @@
<string name="label_header">سرایند</string>
<string name="link_whats_an_instance">یک نمونه چیست؟</string>
<string name="login_connection">در حال اتصال …</string>
<string name="dialog_whats_an_instance">آدرس یا دامنه هر نمونه را می‌توانید وارد کنید، مثلا mastodon.social, icosahedron.website, social.tchncs.de, و &lt;a href=\"https://instances.social\" &gt;بیشتر!
\n
\n اگر شما هنوز حساب کاربری ندارید، می‌توانید نام نمونه مورد نظر را وارد کنید از اینجا بپیوندید و حساب کاربری ایجاد کنید.
\n
\n نمونه جایی است که حساب کاربری شما میزبان آن است اما شما به راحتی می‌توانید با افراد دیگر در نمونه‌های دیگر ارتباط برقرار کنید و آنها را دنبال کنید شما درست مثل اینکه در یکجا باشید.
\n
\n برای اطلاعات بیشتر به اینجا مراجعه کنید <a href="https://joinmastodon.org">joinmastodon.org</a>. </string>
<string name="dialog_whats_an_instance">نشانی یا دامنهٔ هر نمونه‌ای می‌تواند وارد شود، مثل mastodon.social, icosahedron.website, social.tchncs.de, و <a href="https://instances.social">بیش‌تر!</a>.
\n
\n اگر هنوز حسابی ندارید، می‌توانید نام نمونه مورد نظر را وارد کرده و در آن حسابی بسازید.
\n
\n نمونه، جاییست که حسابتان رویش میزبانی می‌شود، ولی به راحتی می‌توانید با دیگر افراد روی نمونه‌های دیگر ارتباط داشته و دنبالشان کنید؛ انگار که روی یک پایگاه باشید.
\n
\nاطّلاعات بیش‌تر می‌تواند در <a href="https://joinmastodon.org">joinmastodon.org</a> پیدا شود. </string>
<string name="dialog_title_finishing_media_upload">پایان بارگذاری رسانه</string>
<string name="dialog_message_uploading_media">در حال بارگذاری…</string>
<string name="dialog_download_image">بارگیری</string>
@ -195,9 +195,7 @@
<string name="notification_title_summary">%d برهم‌کنش جدید</string>
<string name="description_account_locked">حساب قفل‌شده</string>
<string name="about_title_activity">درباره</string>
<string name="about_tusky_license">Yuito یک برنامه آزاد و متن‌باز است که تحت مجوز GNU General Public License Version 3. منتشر شده است.
\n شما می‌توانید مجوز را از اینجا ببینید:
\n https://www.gnu.org/licenses/gpl-3.0.en.html</string>
<string name="about_tusky_license">تاسکی نرم‌افزاری آزاد است که تحت نگارش ۳ از پروانهٔ جامع همگانی گنو منتشر شده است. پروانه را می‌توانید از این‌جا ببینید: https://www.gnu.org/licenses/gpl-3.0.en.html</string>
<!-- note to translators:
* you should think of “free” as in “free speech,” not as in “free beer”.
We sometimes call it “libre software,” borrowing the French or Spanish word for “free” as in freedom,
@ -226,7 +224,7 @@
<string name="replying_to">در حال پاسخ به @%s</string>
<string name="load_more_placeholder_text">بارگیری بیش‌تر</string>
<string name="add_account_name">افزودن حساب</string>
<string name="add_account_description">افزودن حساب ماستودون جدید</string>
<string name="add_account_description">افزودن حساب جدید ماستودون</string>
<string name="action_lists">لیست‌ها</string>
<string name="title_lists">فهرست‌ها</string>
<string name="title_list_timeline">خط زمانی فهرست</string>
@ -237,7 +235,7 @@
<string name="action_remove">برداشتن</string>
<string name="lock_account_label">قفل حساب</string>
<string name="lock_account_label_description">نیاز دارد پی‌گیرانتان را به صورت دستی تأیید کنید</string>
<string name="compose_save_draft">ذخیره به عنوان پیش‌نویس</string>
<string name="compose_save_draft">ذخیرهٔ پیش‌نویس؟</string>
<string name="send_toot_notification_title">در حال فرستادن بوق…</string>
<string name="send_toot_notification_error_title">خطای فرستادن بوق</string>
<string name="send_toot_notification_channel_name">در حال فرستادن بوق‌ها</string>
@ -431,7 +429,7 @@
<string name="filter_dialog_whole_word_description">هنگامی که کلیدواژه یا عبارت، فقط حروف‌عددی باشد، فقط اگر با تمام واژه مطابق باشد، اعمال خواهد شد</string>
<string name="filter_add_description">عبارت پالایش</string>
<string name="poll_info_format"> <!-- 15 votes • 1 hour left --> %1$s • %2$s</string>
<string name="report_description_1">گزارش به ناظم‌های کارسازتان ارسال خواهد شد. می‌توانید توضیحی در باب چرایی گزارش این حساب در زیر بنویسید:</string>
<string name="report_description_1">گزارش به ناظر کارسازتان ارسال خواهد شد. می‌توانید توضیحی در باب چرایی گزارش این حساب در زیر بنویسید:</string>
<string name="report_description_remote_instance">این حساب از کارسازی دیگر است. رونوشتی ناشناس از گزارش، به آن‌جا نیز ارسال شود؟</string>
<string name="post_lookup_error_format">خطا در یافتن فرستهٔ %s</string>
<string name="about_powered_by_tusky">قدرت‌گرفته از تاسکی</string>
@ -439,11 +437,27 @@
<string name="title_bookmarks">نشانک‌ها</string>
<string name="action_bookmark">نشانک</string>
<string name="action_view_bookmarks">نشانک‌ها</string>
<string name="gradient_for_media">نمایش گرادیان رنگی برای رسانهٔ نهفته</string>
<string name="description_status_bookmarked">نشان‌شده</string>
<string name="select_list_title">گزینش فهرست</string>
<string name="list">فهرست</string>
<string name="no_saved_status">هیچ پیش‌نویسی ندارید.</string>
<string name="no_scheduled_status">هیچ وضعیت زمان‌بسته‌ای ندارید.</string>
<string name="warning_scheduling_interval">ماستودون، بازهٔ زمان‌بندی‌ای با کمینهٔ ۵ دقیقه دارد.</string>
</resources>
<string name="pref_title_confirm_reblogs">نمایش گفت‌وگوی تأیید پیش از تقویت</string>
<string name="pref_title_show_cards_in_timelines">پیش‌نمایش پیوندها در خط‌زمانی‌ها</string>
<string name="pref_title_enable_swipe_for_tabs">به کار انداختن اشارهٔ کشیدنی برای تعویض بین زبانه‌ها</string>
<plurals name="poll_info_people">
<item quantity="one">%s نفر</item>
<item quantity="other">%s نفر</item>
</plurals>
<string name="hashtags">هشتگ‌ها</string>
<string name="add_hashtag_title">افزودن هشتگ</string>
<string name="notification_follow_request_description">آگاهی‌ها در مورد درخواست‌های پی‌گیری</string>
<string name="notification_follow_request_name">درخواست‌های پی‌گیری</string>
<string name="pref_title_notification_filter_follow_requests">درخواست پی‌گیری</string>
<string name="dialog_mute_warning">خموشی @%s؟</string>
<string name="dialog_block_warning">انسداد @%s؟</string>
<string name="action_unmute_conversation">ناخموشی گفت‌وگو</string>
<string name="action_mute_conversation">خموشی گفت‌وگو</string>
<string name="notification_follow_request_format">%s می‌خواهد دنبالتان کند</string>
</resources>

View File

@ -69,7 +69,7 @@
<string name="action_unfollow">Ne plus suivre</string>
<string name="action_block">Bloquer</string>
<string name="action_unblock">Débloquer</string>
<string name="action_hide_reblogs">Cacher les boosts</string>
<string name="action_hide_reblogs">Cacher les partages</string>
<string name="action_show_reblogs">Montrer les boosts</string>
<string name="action_report">Signaler</string>
<string name="action_delete">Supprimer</string>
@ -369,7 +369,7 @@
<string name="compose_shortcut_long_label">Rédiger un pouet</string>
<string name="compose_shortcut_short_label">Écrire</string>
<string name="pref_title_bot_overlay">Afficher l\'indicateur de robots</string>
<string name="notification_clear_text">"Nettoyer toutes les notifications de façon permanente\? "</string>
<string name="notification_clear_text">Désirez-vous nettoyer toutes vos notifications de façon permanente \?</string>
<string name="action_delete_and_redraft">Effacer et ré-écrire</string>
<string name="dialog_redraft_toot_warning">Effacer et ré-écrire ce pouet \?</string>
<plurals name="poll_info_votes">
@ -404,7 +404,7 @@
<string name="compose_preview_image_description">Actions pour limage %s</string>
<string name="poll_info_format"> <!-- 15 votes • 1 heure restante --> %1$s • %2$s</string>
<string name="poll_ended_voted">Un sondage auquel vous avez participé vient de se terminer</string>
<string name="description_poll">Sondage avec des choix : %1$s, %2$s, %3$s, %4$s; %5$s</string>
<string name="description_poll">Sondage avec des choix: %1$s, %2$s, %3$s, %4$s; %5$s</string>
<string name="title_domain_mutes">Domaines cachés</string>
<string name="action_view_domain_mutes">Domaines cachés</string>
<string name="action_mute_domain">Masquer %s</string>
@ -449,13 +449,12 @@
<string name="post_lookup_error_format">Erreur lors de la récupération du message %s</string>
<string name="about_powered_by_tusky">Propulsé par Tusky</string>
<string name="title_bookmarks">Signets</string>
<string name="action_bookmark">Marquer comme signet</string>
<string name="action_bookmark">Ajouter aux marque-pages</string>
<string name="action_view_bookmarks">Marque-pages</string>
<string name="description_status_bookmarked">Ajouté aux marque-pages</string>
<string name="select_list_title">Sélectionner la liste</string>
<string name="list">Liste</string>
<string name="error_audio_upload_size">Les fichiers audio doivent être inférieurs à 40 Mo.</string>
<string name="gradient_for_media">Afficher des dégradés en couleur pour les médias cachés</string>
<string name="no_saved_status">Vous navez aucun brouillon.</string>
<string name="no_scheduled_status">Vous navez aucun pouet planifié.</string>
<string name="warning_scheduling_interval">Lintervalle minimum de planification sur Mastodon est de 5 minutes.</string>
@ -474,4 +473,7 @@
<string name="action_unmute_conversation">Enlever la sourdine à la conversation</string>
<string name="action_mute_conversation">Silencer la conversation</string>
<string name="pref_title_enable_swipe_for_tabs">Activer les gestes de glissement pour passer dun onglet à lautre</string>
<string name="hashtags">Hashtags</string>
<string name="add_hashtag_title">Ajouter hashtag</string>
<string name="pref_title_gradient_for_media">Afficher des dégradés en couleur pour les médias cachés</string>
</resources>

View File

@ -367,7 +367,6 @@
<string name="description_visiblity_direct">Közvetlen</string>
<string name="description_poll">Szavazás válaszokkal: %1$s, %2$s, %3$s, %4$s; %5$s</string>
<string name="hint_list_name">Lista neve</string>
<string name="edit_hashtag_hint">Hashtag # nélkül</string>
<string name="notifications_clear">Törlés</string>
<string name="notifications_apply_filter">Szűrés</string>
@ -378,8 +377,8 @@
<string name="compose_preview_image_description">Műveletek a %s képpel</string>
<string name="poll_info_format"> <!-- 15 szavazat • 1 óra maradt --> %1$s • %2$s</string>
<plurals name="poll_info_votes">
<item quantity="one"></item>
<item quantity="other"></item>
<item quantity="one"/>
<item quantity="other"/>
</plurals>
<string name="poll_info_time_relative">%s maradt</string>
<string name="poll_info_time_absolute">vége %s</string>
@ -444,7 +443,6 @@
<string name="select_list_title">Lista kiválasztása</string>
<string name="list">Lista</string>
<string name="error_audio_upload_size">A hangfájlok mérete 40MB-nál kisebb kell legyen.</string>
<string name="gradient_for_media">Színes átmenet mutatása rejtett médiánál</string>
<string name="no_saved_status">Nincs egy vázlatod sem.</string>
<string name="no_scheduled_status">Nincs egy ütemezett tülköd sem.</string>
<string name="warning_scheduling_interval">A Mastodonban a legrövidebb ütemezhető időintervallum 5 perc.</string>

View File

@ -206,7 +206,6 @@
<string name="pref_title_language">Tungumál</string>
<string name="pref_title_bot_overlay">Birta merki á róbótum</string>
<string name="pref_title_animate_gif_avatars">Sýna hreyfingar GIF-auðkennismynda</string>
<string name="gradient_for_media">Sýna skæra litstigla í stað falins myndefnis</string>
<string name="pref_title_status_filter">Síun tímalínu</string>
<string name="pref_title_status_tabs">Flipar</string>
<string name="pref_title_show_boosts">Sýna endurbirtingar</string>
@ -345,14 +344,6 @@
<string name="label_remote_account">Ekki er víst að upplýsingarnar hér að neðan endurspegli notandasniðið að fullu. Opnaðu fullt notandasnið í vafra.</string>
<string name="unpin_action">Losa</string>
<string name="pin_action">Festa</string>
<plurals name="favs">
<item quantity="one"></item>
<item quantity="other"></item>
</plurals>
<plurals name="reblogs">
<item quantity="one"></item>
<item quantity="other"></item>
</plurals>
<string name="title_reblogged_by">Endurbirt af</string>
<string name="title_favourited_by">Sett í eftirlæti af</string>
<string name="conversation_1_recipients">%1$s</string>
@ -371,7 +362,6 @@
<string name="description_visiblity_direct">Beint</string>
<string name="description_poll">Könnun með valkostunum: %1$s, %2$s, %3$s, %4$s; %5$s</string>
<string name="hint_list_name">Heiti á lista</string>
<string name="edit_hashtag_hint">Myllumerki án #</string>
<string name="select_list_title">Veldu lista</string>
<string name="list">Listi</string>

View File

@ -9,8 +9,8 @@
<string name="action_edit_profile">Ẓreg amaɣnu</string>
<string name="action_search">Nadi</string>
<string name="about_title_activity">Ɣef</string>
<string name="action_lists">Umuɣen</string>
<string name="title_lists">Umuɣen</string>
<string name="action_lists">Tabdart</string>
<string name="title_lists">Tabdarin</string>
<string name="error_compose_character_limit">Tijewwiqt-ik aṭas i ɣuzzifet!</string>
<string name="title_home">Agejdan</string>
<string name="title_tab_preferences">Iccaren</string>
@ -22,12 +22,12 @@
<string name="status_content_warning_show_more">Zeṛ ugar</string>
<string name="status_content_warning_show_less">Zeṛ kra kan</string>
<string name="message_empty">Ulac walu da.</string>
<string name="notification_follow_format">%s yeṭafar-ik-id</string>
<string name="notification_follow_format">%s yeṭafar-ik·ikem-id</string>
<string name="action_reply">Err</string>
<string name="action_more">Ugar</string>
<string name="action_compose">Azen</string>
<string name="action_follow">Ḍfeṛ</string>
<string name="action_unfollow">Ur ṭafaṛ ara</string>
<string name="action_unfollow">Ur ṭṭafar ara</string>
<string name="action_edit">Ẓreg</string>
<string name="action_delete">Kkes</string>
<string name="action_delete_and_redraft">Kkes tɛiwdeḍ tira</string>
@ -87,7 +87,7 @@
<string name="about_tusky_account">Amaɣnu n Tusky</string>
<string name="status_media_images">Tugniwin</string>
<string name="status_media_video">Tibidyutin</string>
<string name="follows_you">Yeṭafaṛ-ik-id</string>
<string name="follows_you">Yeṭṭafar-ik·ikem-id</string>
<string name="filter_dialog_remove_button">Kkes</string>
<string name="filter_dialog_update_button">Lqem</string>
<string name="add_account_name">Rnu amiḍan</string>
@ -123,21 +123,21 @@
<string name="status_share_link">Bḍu aseɣwen ɣer tijewwiqt</string>
<string name="filter_addition_dialog_title">Rnu amsizdeg</string>
<string name="filter_edit_dialog_title">Ẓreg amsizdeg</string>
<string name="action_create_list">Snulfu-d umuɣ</string>
<string name="action_rename_list">Snifel isem n wumuɣ</string>
<string name="action_delete_list">Kkes umuɣ-a</string>
<string name="action_edit_list">Ẓreg umuɣ-a</string>
<string name="action_add_to_list">Rnu yiwen umiḍan ɣer wummuɣ</string>
<string name="action_remove_from_list">Kkes amiḍan seg wumuɣ</string>
<string name="action_create_list">Snulfu-d tabdart</string>
<string name="action_rename_list">Snifel isem n tabdart</string>
<string name="action_delete_list">Kkes tabdart-a</string>
<string name="action_edit_list">Ẓreg tabdart-a</string>
<string name="action_add_to_list">Rnu yiwen umiḍan ɣer tabdart</string>
<string name="action_remove_from_list">Kkes amiḍan seg tabdart</string>
<string name="profile_metadata_add">Rnu isefka</string>
<string name="hint_list_name">Isem n wumuɣ</string>
<string name="hint_list_name">Isem n tebdart</string>
<string name="select_list_title">Fren tabdart</string>
<string name="list">Umuɣ</string>
<string name="list">Tabdart</string>
<string name="notifications_apply_filter">Sizdeg</string>
<string name="title_accounts">Imiḍanen</string>
<string name="add_poll_choice">Rnu yiwen wefran</string>
<string name="report_username_format">Ccetki ɣef @%s</string>
<string name="action_report">Ccetki fell-as</string>
<string name="report_username_format">Cetki ɣef @%s</string>
<string name="action_report">Cetki fell-as</string>
<string name="action_reject">Ggami</string>
<string name="download_image">Yessidired %1$s</string>
<string name="send_media_to">Bḍu tugna s…</string>
@ -194,7 +194,7 @@
</plurals>
<string name="button_continue">Kemmel</string>
<string name="button_back">Uɣal</string>
<string name="failed_report">Tella-d tuccḍa deg ccetki</string>
<string name="failed_report">Tella-d tuccḍa deg cetki</string>
<string name="failed_search">Tucḍa n unadi</string>
<string name="create_poll_title">Assenqed</string>
<string name="poll_duration_5_min">5 n tisdidin</string>
@ -205,15 +205,15 @@
<string name="poll_duration_3_days">3 n wussan</string>
<string name="poll_duration_7_days">7 n wussan</string>
<string name="poll_new_choice_hint">Tafrant %d</string>
<string name="title_follows">Ig ṭafaṛ</string>
<string name="title_follows">Ig ṭṭafar</string>
<string name="title_followers">Imeḍfaṛen</string>
<string name="hint_search_people_list">Nadi ɣef medden i teṭafareḍ</string>
<string name="hint_search_people_list">Nadi ɣef medden ar at ḍfereḍ</string>
<string name="description_visiblity_private">Imeḍfaṛen</string>
<string name="action_links">Iseɣwan</string>
<string name="action_mentions">Tibdarin</string>
<string name="title_mentions_dialog">Tibdarin</string>
<string name="title_links_dialog">Iseɣwan</string>
<string name="confirmation_reported">Yettwaceyyaɛ!</string>
<string name="confirmation_reported">Yettwaceyyeɛ!</string>
<string name="status_sent">Yettwaceyyaɛ!</string>
<string name="search_no_results">Ula d yiwen n ugmuḍ</string>
<string name="post_privacy_followers_only">I yimeḍfaṛen kan</string>
@ -263,4 +263,9 @@
<string name="action_block">Cekkel</string>
<string name="action_unblock">Kkes tacekkalt</string>
<string name="confirmation_unblocked">Tettwakkes tacekkalt ɣef umiḍan-nni</string>
<plurals name="poll_info_people">
<item quantity="one">%s n wemdan</item>
<item quantity="other">%s n yemdanen</item>
</plurals>
<string name="report_remote_instance">Bren-it ɣer %s</string>
</resources>

View File

@ -80,7 +80,7 @@
<string name="action_retry">다시 시도</string>
<string name="action_close">닫기</string>
<string name="action_view_profile">프로필</string>
<string name="action_view_preferences">환경설정</string>
<string name="action_view_preferences">설정</string>
<string name="action_view_account_preferences">계정 설정</string>
<string name="action_view_favourites">즐겨찾기</string>
<string name="action_view_mutes">뮤트한 유저</string>
@ -114,7 +114,7 @@
<string name="action_mentions">멘션</string>
<string name="action_hashtags">해시태그</string>
<string name="action_open_reblogger">부스트한 유저의 프로필로 이동</string>
<string name="action_open_reblogged_by">부스트 보이기</string>
<string name="action_open_reblogged_by">이 유저의 부스트 보이기</string>
<string name="action_open_faved_by">즐겨찾기한 유저 보이기</string>
<string name="title_hashtags_dialog">해시태그</string>
<string name="title_mentions_dialog">멘션</string>
@ -132,7 +132,7 @@
<string name="confirmation_unblocked">차단이 해제됨</string>
<string name="confirmation_unmuted">뮤트가 해제됨</string>
<string name="confirmation_domain_unmuted">%s 숨김 해제됨</string>
<string name="status_sent">보냈습니다!</string>
<string name="status_sent">신고를 보냈습니다!</string>
<string name="status_sent_long">답장을 보냈습니다.</string>
<string name="hint_domain">인스턴스 주소</string>
<string name="hint_compose">지금 무엇을 하고 있나요\?</string>
@ -240,7 +240,7 @@
<string name="notification_mention_format">%s님이 당신을 멘션했습니다</string>
<string name="notification_summary_large">%1$s님, %2$s님, %3$s님 외 %4$d명</string>
<string name="notification_summary_medium">%1$s님, %2$s님, %3$s님</string>
<string name="notification_summary_small">%1$s, %2$s</string>
<string name="notification_summary_small">%1$s, %2$s</string>
<string name="notification_title_summary">%d개의 새로운 알림이 있습니다</string>
<string name="description_account_locked">계정 잠김</string>
<string name="about_title_activity">이 앱에 관하여</string>
@ -371,7 +371,7 @@
<string name="description_visiblity_unlisted">타임라인에 비표시</string>
<string name="description_visiblity_private">비공개</string>
<string name="description_visiblity_direct">다이렉트</string>
<string name="description_poll">투표: %1$s, %2$s, %3$s, %4$s; %5$s</string>
<string name="description_poll">투표 선택지: %1$s, %2$s, %3$s, %4$s, %5$s</string>
<string name="hint_list_name">리스트 이름</string>
<string name="edit_hashtag_hint">#를 제외한 해시태그</string>
<string name="notifications_clear">알림 지우기</string>

View File

@ -58,4 +58,5 @@
<string name="action_retry">വീണ്ടും ശ്രമിക്കുക</string>
<string name="action_view_follow_requests">പിന്‍തുടരുവാനുള്ള അഭ്യര്‍ത്ഥനകള്‍</string>
<string name="title_domain_mutes">മറയ്ക്കപ്പെട്ട ഡൊമൈനുകൾ</string>
<string name="description_visiblity_private">പിന്തുടരുന്നവർ</string>
</resources>

View File

@ -53,7 +53,7 @@
<string name="notification_favourite_format">%s markeerde jouw toot als favoriet</string>
<string name="notification_follow_format">%s volgt jou</string>
<string name="report_username_format">Rapporteer @%s</string>
<string name="report_comment_hint">Extra opmerkingen</string>
<string name="report_comment_hint">Extra opmerkingen\?</string>
<string name="action_quick_reply">Snelle reactie</string>
<string name="action_reply">Reageren</string>
<string name="action_reblog">Boosten</string>
@ -120,8 +120,8 @@
<string name="action_copy_link">Link kopiëren</string>
<string name="action_open_as">Als %s openen</string>
<string name="action_share_as">Delen als …</string>
<string name="send_status_link_to">Link van de toot delen</string>
<string name="send_status_content_to">Inhoud van de toot delen</string>
<string name="send_status_link_to">Link van de toot delen met…</string>
<string name="send_status_content_to">Inhoud van de toot delen met…</string>
<string name="send_media_to">Media delen met …</string>
<string name="confirmation_reported">Verzonden!</string>
<string name="confirmation_unblocked">Gebruiker is gedeblokkeerd</string>
@ -133,7 +133,7 @@
<string name="hint_content_warning">Waarschuwingstekst</string>
<string name="hint_display_name">Weergavenaam</string>
<string name="hint_note">Bio</string>
<string name="hint_search">Zoeken</string>
<string name="hint_search">Zoeken</string>
<string name="search_no_results">Geen resultaten</string>
<string name="label_quick_reply">Reageren…</string>
<string name="label_avatar">Avatar</string>
@ -142,9 +142,9 @@
<string name="login_connection">Aan het verbinden</string>
<string name="dialog_whats_an_instance">Het adres of domein van elke Mastodonserver kan hier worden ingevoerd, zoals mastodon.social, mastodon.nl, octodon.social en <a href="https://instances.social">nog veel meer!</a>
\n
\n Wanneer je nog geen account hebt, kun je de naam van de Mastodonserver waar jij je graag wil registeren invoeren, waarna je daar een account kunt aanmaken.
\nWanneer je nog geen account hebt, kun je de naam van de Mastodonserver waar jij je graag wil registeren invoeren, waarna je daar een account kunt aanmaken.
\n
\n Een Mastodonserver (Engels: instance) is een computerserver waar jouw account zich bevindt (vergelijk het met een e-mailserver). Je kan eenvoudig mensen van andere servers volgen en met ze communiceren, alsof jullie met elkaar op dezelfde website zitten.
\nEen Mastodonserver (Engels: instance) is een computerserver waar jouw account zich bevindt (vergelijk het met een e-mailserver). Je kan eenvoudig mensen van andere servers volgen en met ze communiceren, alsof jullie met elkaar op dezelfde website zitten.
\n
\n Meer informatie kun je vinden op <a href="https://joinmastodon.org">joinmastodon.org</a>.</string>
<string name="dialog_title_finishing_media_upload">Uploaden media bijna voltooid</string>
@ -368,8 +368,8 @@
<string name="notification_clear_text">Weet je zeker dat je alle meldingen permanent wilt verwijderen\?</string>
<string name="poll_info_format"> <!-- 15 votes • 1 hour left --> %1$s • %2$s</string>
<plurals name="poll_info_votes">
<item quantity="one"></item>
<item quantity="other"></item>
<item quantity="one">%s stem</item>
<item quantity="other">%s stemmen</item>
</plurals>
<string name="poll_info_time_relative">%s over</string>
<string name="poll_info_time_absolute">eindigt op %s</string>
@ -391,16 +391,16 @@
<string name="description_poll">Poll met keuzes: %1$s, %2$s, %3$s, %4$s; %5$s</string>
<string name="compose_preview_image_description">Acties voor afbeelding %s</string>
<plurals name="poll_timespan_days">
<item quantity="one"></item>
<item quantity="other"></item>
<item quantity="one">%d dag</item>
<item quantity="other">%d dagen</item>
</plurals>
<plurals name="poll_timespan_hours">
<item quantity="one"></item>
<item quantity="other"></item>
<item quantity="one">%d uur</item>
<item quantity="other">%d uur</item>
</plurals>
<plurals name="poll_timespan_minutes">
<item quantity="one"></item>
<item quantity="other"></item>
<item quantity="one">%d minuut</item>
<item quantity="other">%d minuten</item>
</plurals>
<plurals name="poll_timespan_seconds">
<item quantity="one">"%d seconde"</item>
@ -440,7 +440,6 @@
<string name="action_access_scheduled_toot">Ingeplande toots</string>
<string name="action_schedule_toot">Ingeplande toot</string>
<string name="action_reset_schedule">Herstellen</string>
<string name="gradient_for_media">Wazige kleurovergangen voor verborgen media tonen</string>
<string name="about_powered_by_tusky">Powered by Tusky</string>
<string name="pref_title_alway_open_spoiler">Altijd toots met tekstwaarschuwingen uitklappen</string>
<string name="description_status_bookmarked">Als bladwijzer toegevoegd</string>

View File

@ -340,8 +340,8 @@
<string name="dialog_redraft_toot_warning">Vil du slette dette tottet og skrive det på nytt\?</string>
<string name="poll_info_format"> <!-- 15 votes • 1 hour left --> %1$s • %2$s</string>
<plurals name="poll_info_votes">
<item quantity="one"></item>
<item quantity="other"></item>
<item quantity="one">%s stemme</item>
<item quantity="other">%s stemmer</item>
</plurals>
<string name="poll_info_time_relative">%s igjen</string>
<string name="poll_info_time_absolute">avsluttes %s</string>
@ -433,7 +433,6 @@
<string name="description_status_bookmarked">Bokmerke lagt til</string>
<string name="select_list_title">Velg liste</string>
<string name="list">Liste</string>
<string name="gradient_for_media">Vis fargegradienter for skjult media</string>
<string name="no_scheduled_status">Du har ingen planlagte statuser.</string>
<string name="no_saved_status">Du har ikke lagret noen kladder.</string>
<string name="error_audio_upload_size">Lydfiler må være mindre enn 40MB.</string>
@ -452,5 +451,8 @@
<string name="dialog_block_warning">Blokkere @%s\?</string>
<string name="action_unmute_conversation">Fjern demping av samtale</string>
<string name="action_mute_conversation">Demp samtale</string>
<string name="notification_follow_request_format">% ba om å få følge deg</string>
<string name="hashtags">Stikkord</string>
<string name="add_hashtag_title">Legg til stikkord</string>
<string name="notification_follow_request_format">%s ønsker å følge deg</string>
<string name="pref_title_gradient_for_media">Vis fargerike gradienter for skjult media</string>
</resources>

View File

@ -164,7 +164,7 @@
<string name="pref_title_http_proxy_port">Pòrt del servidor proxy HTTP</string>
<string name="pref_default_post_privacy">Privacitat predeterminada dels tuts</string>
<string name="pref_publishing">Publicacion</string>
<string name="post_privacy_public">Publica</string>
<string name="post_privacy_public">Public</string>
<string name="post_privacy_unlisted">Pas listada</string>
<string name="post_privacy_followers_only">Seguidors solament</string>
<string name="pref_status_text_size">Talha de text de l\'estatut</string>
@ -332,8 +332,8 @@
<item quantity="other"><b>%1$s</b> Favorits</item>
</plurals>
<plurals name="reblogs">
<item quantity="one"></item>
<item quantity="other"></item>
<item quantity="one"/>
<item quantity="other"/>
</plurals>
<string name="title_reblogged_by">Partejat per</string>
<string name="title_favourited_by">Aimat per</string>
@ -445,7 +445,6 @@
<string name="select_list_title">Seleccionar la list</string>
<string name="list">Lista</string>
<string name="error_audio_upload_size">Los fichièrs àudio devon èsser inferiors a 40 Mo.</string>
<string name="gradient_for_media">Mostrar los degradats de colors pels contenguts resconduts</string>
<string name="no_saved_status">Avètz pas cap de borrolhon.</string>
<string name="no_scheduled_status">Avètz pas cap de tut planificat.</string>
<string name="warning_scheduling_interval">Linterval minimum de planificacion sus Mastodon e de 5 minutas.</string>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="error_generic">Wystąpił błąd.</string>
<string name="error_empty">To nie może pozostać puste.</string>
<string name="error_empty">To pole nie może być puste.</string>
<string name="error_invalid_domain">Wprowadzono nieprawidłową domenę</string>
<string name="error_failed_app_registration">Nie udało się uwierzytelnić z tą instancją.</string>
<string name="error_no_web_browser_found">Nie znaleziono przeglądarki internetowej.</string>
@ -293,7 +293,7 @@
<string name="action_mute_domain">Wycisz %s</string>
<string name="action_add_tab">Dodaj zakładkę</string>
<string name="action_open_reblogger">Otwórz konto osoby podbijającej</string>
<string name="action_open_reblogged_by">Pokazuj podbicia</string>
<string name="action_open_reblogged_by">Pokaż podbicia</string>
<string name="action_open_media_n">Otwórz media #%d</string>
<string name="download_media">Pobierz media</string>
<string name="downloading_media">Pobieranie mediów</string>
@ -368,7 +368,7 @@
<string name="description_status_reblogged">Podbity</string>
<string name="description_status_favourited">Polubiony</string>
<string name="description_visiblity_public">Publiczny</string>
<string name="description_visiblity_unlisted">Niewidoczny</string>
<string name="description_visiblity_unlisted">Niewidoczne</string>
<string name="description_visiblity_private">Śledzący</string>
<string name="description_visiblity_direct">Bezpośrednio</string>
<string name="description_poll">Głosowanie z opcjami: %1$s, %2$s, %3$s, %4$s; %5$s</string>
@ -452,9 +452,14 @@
<string name="select_list_title">Wybierz listę</string>
<string name="list">Lista</string>
<string name="error_audio_upload_size">Pliki audio muszą być mniejsze niż 40MB.</string>
<string name="gradient_for_media">Pokaż kolorowe gradienty dla ukrytych mediów</string>
<string name="no_saved_status">Nie masz żadnych szkiców.</string>
<string name="no_scheduled_status">Nie masz żadnych zaplanowanych wpisów.</string>
<string name="warning_scheduling_interval">Mastodon umożliwia wysłanie minimalnie 5 minut od zaplanowania</string>
<string name="notification_follow_request_name">Prośby o możliwość śledzenia</string>
<string name="pref_title_confirm_reblogs">Pytaj o potwierdzenie przed podbiciem</string>
<string name="add_hashtag_title">Dodaj hashtag</string>
<string name="dialog_mute_warning">Wyciszyć @%s\?</string>
<string name="dialog_block_warning">Zablokować @%s\?</string>
<string name="action_unmute_conversation">Cofnij wyciszenie rozmowy</string>
<string name="action_mute_conversation">Wycisz rozmowę</string>
</resources>

View File

@ -4,8 +4,8 @@
<string name="error_empty">Não pode estar vazio.</string>
<string name="error_invalid_domain">Instância inválida</string>
<string name="error_failed_app_registration">Falha ao autenticar com esta instância.</string>
<string name="error_no_web_browser_found">Navegador não foi encontrado.</string>
<string name="error_authorization_unknown">Ocorreu um erro não-identificado de autorização.</string>
<string name="error_no_web_browser_found">Nenhum navegador foi encontrado.</string>
<string name="error_authorization_unknown">Ocorreu um erro não identificado de autorização.</string>
<string name="error_authorization_denied">Autorização negada.</string>
<string name="error_retrieving_oauth_token">Falha ao adquirir token de entrada.</string>
<string name="error_compose_character_limit">O toot é muito longo!</string>
@ -32,25 +32,25 @@
<string name="title_favourites">Favoritos</string>
<string name="title_mutes">Usuários silenciados</string>
<string name="title_blocks">Usuários bloqueados</string>
<string name="title_follow_requests">Solicitações de seguidor</string>
<string name="title_follow_requests">Seguidores pendentes</string>
<string name="title_edit_profile">Editar seu perfil</string>
<string name="title_saved_toot">Rascunhos</string>
<string name="title_licenses">Licenças</string>
<string name="status_boosted_format">%s compartilhou</string>
<string name="status_sensitive_media_title">Conteúdo sensível</string>
<string name="status_boosted_format">%s deu boost</string>
<string name="status_sensitive_media_title">Mídia sensível</string>
<string name="status_media_hidden_title">Mídia oculta</string>
<string name="status_sensitive_media_directions">Clique para exibir</string>
<string name="status_sensitive_media_directions">Toque para ver</string>
<string name="status_content_warning_show_more">Mostrar mais</string>
<string name="status_content_warning_show_less">Mostrar menos</string>
<string name="footer_empty">Nada aqui. Arraste para atualizar!</string>
<string name="notification_reblog_format">%s compartilhou o seu toot</string>
<string name="notification_favourite_format">%s curtiu o seu toot</string>
<string name="notification_follow_format">%s seguiu você</string>
<string name="notification_favourite_format">%s favoritou seu toot</string>
<string name="notification_follow_format">%s te seguiu</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_reply">Responder</string>
<string name="action_reblog">Compartilhar</string>
<string name="action_reblog">Boost</string>
<string name="action_unreblog">Desfazer boost</string>
<string name="action_favourite">Favoritar</string>
<string name="action_unfavourite">Desfavoritar</string>
@ -76,7 +76,7 @@
<string name="action_view_favourites">Favoritos</string>
<string name="action_view_mutes">Usuários silenciados</string>
<string name="action_view_blocks">Usuários bloqueados</string>
<string name="action_view_follow_requests">Solicitações de seguidor</string>
<string name="action_view_follow_requests">Seguidores pendentes</string>
<string name="action_view_media">Mídia</string>
<string name="action_open_in_web">Abrir no navegador</string>
<string name="action_add_media">Adicionar mídia</string>
@ -170,7 +170,7 @@
<string name="pref_title_hide_follow_button">Esconder compositor ao rolar a página</string>
<string name="pref_title_status_filter">Filtro da linha do tempo</string>
<string name="pref_title_status_tabs">Abas</string>
<string name="pref_title_show_boosts">Mostrar compartilhamentos</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évias de mídia</string>
<string name="pref_title_proxy_settings">Proxy</string>
@ -178,7 +178,7 @@
<string name="pref_title_http_proxy_enable">Ativar proxy HTTP</string>
<string name="pref_title_http_proxy_server">Servidor do proxy HTTP</string>
<string name="pref_title_http_proxy_port">Porta do proxy HTTP</string>
<string name="pref_default_post_privacy">Privacidade padrão dos posts</string>
<string name="pref_default_post_privacy">Privacidade padrão dos toots</string>
<string name="pref_default_media_sensitivity">Sempre marcar mídia como sensível</string>
<string name="pref_publishing">Publicação</string>
<string name="pref_failed_to_sync">Falha ao sincronizar configurações</string>
@ -190,15 +190,15 @@
<string name="status_text_size_medium">Médio</string>
<string name="status_text_size_large">Grande</string>
<string name="status_text_size_largest">Maior</string>
<string name="notification_mention_name">Novas Menções</string>
<string name="notification_mention_descriptions">Notificações sobre novas menções</string>
<string name="notification_follow_name">Novos Seguidores</string>
<string name="notification_follow_description">Notificações sobre novos seguidores</string>
<string name="notification_mention_name">Menções</string>
<string name="notification_mention_descriptions">Notificar sobre novas menções</string>
<string name="notification_follow_name">Seguidores</string>
<string name="notification_follow_description">Notificar sobre novos seguidores</string>
<string name="notification_boost_name">Boosts</string>
<string name="notification_boost_description">Notificar quando derem boost nos seus toots</string>
<string name="notification_favourite_name">Favoritos</string>
<string name="notification_favourite_description">Notificar quando favoritarem seus toots</string>
<string name="notification_mention_format">%s mencionou você</string>
<string name="notification_mention_format">%s te mencionou</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="notification_summary_small">%1$s e %2$s</string>
@ -237,7 +237,7 @@
<string name="abbreviated_minutes_ago">%dm</string>
<string name="abbreviated_seconds_ago">%ds</string>
<string name="follows_you">Segue você</string>
<string name="pref_title_alway_show_sensitive_media">Sempre mostrar conteúdo sensível</string>
<string name="pref_title_alway_show_sensitive_media">Sempre mostrar mídia sensível</string>
<string name="title_media">Mídia</string>
<string name="replying_to">Respondendo a @%s</string>
<string name="load_more_placeholder_text">carregar mais</string>
@ -329,8 +329,8 @@
<string name="hint_search_people_list">Pesquisar pessoas que você segue</string>
<string name="action_add_to_list">Adicionar conta à lista</string>
<string name="action_remove_from_list">Remover conta da lista</string>
<string name="hint_describe_for_visually_impaired">Descrever para deficientes visuais
\n(limite de %d caracteres)</string>
<string name="hint_describe_for_visually_impaired">Descrever para deficientes visuais
\n(até %d caracteres)</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="label_remote_account">As informações abaixo podem refletir incompletamente o perfil do usuário. Toque aqui para abrir o perfil completo no navegador.</string>
@ -403,7 +403,7 @@
<string name="report_remote_instance">Encaminhar para %s</string>
<string name="failed_report">Falha na denúncia</string>
<string name="failed_fetch_statuses">Falha ao carregar toots</string>
<string name="report_description_1">A denúncia será enviada para o seu administrador da instância. Você pode explicar por que você denunciou a conta:</string>
<string name="report_description_1">A denúncia será enviada aos moderadores da instância. Você pode explicar por que você 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="title_domain_mutes">Instâncias bloqueadas</string>
<string name="action_view_domain_mutes">Instâncias bloqueadas</string>
@ -430,23 +430,38 @@
<string name="poll_allow_multiple_choices">Múltiplas opções</string>
<string name="poll_new_choice_hint">Opção %d</string>
<string name="edit_poll">Editar</string>
<string name="title_scheduled_toot">Toots agendados</string>
<string name="title_scheduled_toot">Agendados</string>
<string name="action_edit">Editar</string>
<string name="action_access_scheduled_toot">Toots agendados</string>
<string name="action_access_scheduled_toot">Agendados</string>
<string name="action_schedule_toot">Agendar toot</string>
<string name="action_reset_schedule">Cancelar</string>
<string name="post_lookup_error_format">Erro ao pesquisar %s</string>
<string name="title_bookmarks">Salvos</string>
<string name="action_bookmark">Salvo</string>
<string name="action_bookmark">Salvar</string>
<string name="action_view_bookmarks">Salvos</string>
<string name="about_powered_by_tusky">Desenvolvido por Tusky</string>
<string name="description_status_bookmarked">Salvo</string>
<string name="select_list_title">Selecionar lista</string>
<string name="list">Lista</string>
<string name="gradient_for_media">Mostrar blur em mídias ocultas</string>
<string name="no_scheduled_status">Sem toots agendados.</string>
<string name="error_audio_upload_size">Áudios devem ser menores que 40MB.</string>
<string name="no_saved_status">Sem rascunhos.</string>
<string name="warning_scheduling_interval">Mastodon possui um intervalo mínimo de agendamento de 5 minutos.</string>
<string name="notification_follow_request_name">Solicitações de seguidor</string>
</resources>
<string name="warning_scheduling_interval">Mastodon possui um intervalo mínimo de 5 minutos para agendar.</string>
<string name="notification_follow_request_name">Seguidores pendentes</string>
<string name="notification_follow_request_format">%s quer te seguir</string>
<string name="action_mute_conversation">Silenciar conversa</string>
<string name="action_unmute_conversation">Desfazer silêncio</string>
<string name="dialog_block_warning">Bloquear @%s\?</string>
<string name="dialog_mute_warning">Silenciar @%s\?</string>
<string name="pref_title_notification_filter_follow_requests">pedirem para me seguir</string>
<string name="notification_follow_request_description">Notificar sobre seguidores pendentes</string>
<plurals name="poll_info_people">
<item quantity="one">%s pessoa</item>
<item quantity="other">%s pessoas</item>
</plurals>
<string name="pref_title_enable_swipe_for_tabs">Ativar deslizar para alternar entre abas</string>
<string name="pref_title_show_cards_in_timelines">Mostrar prévias de links nas linhas</string>
<string name="pref_title_confirm_reblogs">Solicitar confirmação antes de dar boost</string>
<string name="hashtags">Hashtags</string>
<string name="add_hashtag_title">Adicionar hashtag</string>
</resources>

View File

@ -471,10 +471,9 @@
<string name="select_list_title">Выбрать список</string>
<string name="list">Список</string>
<string name="error_audio_upload_size">Аудиофайлы должны быть меньше 40МБ.</string>
<string name="gradient_for_media">Показывать цветные градиенты для скрытых медиа</string>
<string name="post_lookup_error_format">Ошибка поиска поста %s</string>
<string name="no_saved_status">У вас нет черновиков.</string>
<string name="no_scheduled_status">У вас нет запланированный постов.</string>
<string name="no_scheduled_status">У вас нет запланированных постов.</string>
<string name="warning_scheduling_interval">Минимальный интервал планирования в Mastodon составляет 5 минут.</string>
<string name="pref_title_confirm_reblogs">Показвать диалог подтверждения перед продвижением</string>
<string name="pref_title_show_cards_in_timelines">Показывать предосмотр ссылок в лентах</string>
@ -493,4 +492,7 @@
<string name="action_unmute_conversation">Показать обсуждение</string>
<string name="action_mute_conversation">Заглушить обсуждение</string>
<string name="notification_follow_request_format">запрос на подписку от %s</string>
<string name="hashtags">Тэги</string>
<string name="add_hashtag_title">Добавить тэг</string>
<string name="pref_title_gradient_for_media">Отображать цветные градиенты для скрытых изображений</string>
</resources>

View File

@ -37,7 +37,6 @@
<string name="title_saved_toot">Osnutki</string>
<string name="title_licenses">Licence</string>
<string name="status_username_format">\@%s</string>
<string name="status_boosted_format">% spodbudil</string>
<string name="status_sensitive_media_title">Občutljiva vsebina</string>
<string name="status_media_hidden_title">Medij je skrit</string>
<string name="status_sensitive_media_directions">Kliknite za ogled</string>
@ -284,7 +283,7 @@
<string name="restart_emoji">Če želite uveljaviti te spremembe, morate znova zagnati Yuito</string>
<string name="later">Kasneje</string>
<string name="restart">Znova zaženi</string>
<string name="caption_systememoji">Privzeti komplet emotikonov vaše naprave</string>
<string name="caption_systememoji">"Privzeti komplet emotikonov vaše naprave "</string>
<string name="caption_blobmoji">Blob emotikoni so znani od Android 4.4-7.1</string>
<string name="caption_twemoji">Mastodonov privzeti komplet emotikonov</string>
<string name="download_failed">Prenos ni uspel</string>
@ -304,12 +303,7 @@
<string name="label_remote_account">Spodnje informacije lahko nepopolno odražajo profil uporabnika. Pritisnite, da odprete polni profil v brskalniku.</string>
<string name="unpin_action">Odpni</string>
<string name="pin_action">Pripni</string>
<plurals name="favs">
<item quantity="one"></item>
<item quantity="two"></item>
<item quantity="few"></item>
<item quantity="other"></item>
</plurals>
<plurals name="reblogs">
<item quantity="one">&lt;b&gt;%s&lt;/b&gt; Spodbuda</item>
<item quantity="two">&lt;b&gt;%s&lt;/b&gt; Spodbudi</item>

View File

@ -450,7 +450,6 @@
<string name="description_status_bookmarked">Bokmärkt</string>
<string name="select_list_title">Välj lista</string>
<string name="list">Lista</string>
<string name="gradient_for_media">Visa färgglada gradienter för gömd media</string>
<string name="no_scheduled_status">Du har inga schemalagda statusar.</string>
<string name="error_audio_upload_size">Ljudfiler måste vara mindre än 40MB.</string>
<string name="no_saved_status">Du har inga utkast.</string>
@ -470,4 +469,6 @@
<string name="dialog_block_warning">Blockera @%s\?</string>
<string name="action_unmute_conversation">Aktivera ljud på konversation</string>
<string name="notification_follow_request_format">%s vill följa dig</string>
<string name="add_hashtag_title">Lägg till hashtag</string>
<string name="hashtags">Hashtaggar</string>
</resources>

View File

@ -123,7 +123,7 @@
<string name="visibility_unlisted">அனைவருக்கும் காட்டாதே</string>
<string name="visibility_private">பின்பற்றுபவர்களுக்கு மட்டும் காண்பி</string>
<string name="visibility_direct">குறிபிடபட்டுள்ள பயனர்களுக்கு மட்டும் காண்பி</string>
<string name="pref_title_edit_notification_settings">அறிவிப்புகளை திருத</string>
<string name="pref_title_edit_notification_settings">அறிவிப்புகள்</string>
<string name="pref_title_notifications_enabled">அறிவிப்புகள்</string>
<string name="pref_title_notification_alerts">எச்சரிக்கைகள்</string>
<string name="pref_title_notification_alert_sound">ஒலி மூலம் தெரிவிக்கவும்</string>
@ -259,7 +259,7 @@
<string name="unpin_action">விடுவி</string>
<string name="pin_action">பொருத்து</string>
<string name="action_view_account_preferences">கணக்கரின் முன்னுரிமைகள்</string>
<string name="error_network">பிணைய பிழை ஏற்பட்டது! உங்கள் இணைப்பைச் சரிபார்த்து மீண்டும் முயற்சிக்கவும்!</string>
<string name="error_network">"பிணைய பிழை ஏற்பட்டது! உங்கள் இணைப்பைச் சரிபார்த்து மீண்டும் முயற்சிக்கவும்!"</string>
<string name="error_video_upload_size">காணொளி 40MB க்கும் குறைவாக இருக்க வேண்டும்.</string>
<string name="error_sender_account_gone">டூத் அனுப்ப இயலவில்லை</string>
<string name="title_direct_messages">நேரடி தகவல்</string>

View File

@ -0,0 +1,456 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="add_poll_choice">เพิ่มตัวเลือก</string>
<string name="poll_duration_7_days">7 วัน</string>
<string name="poll_duration_3_days">3 วัน</string>
<string name="poll_duration_1_day">1 วัน</string>
<string name="poll_duration_6_hours">6 ชั่วโมง</string>
<string name="poll_duration_1_hour">1 ชั่วโมง</string>
<string name="poll_duration_30_min">30 นาที</string>
<string name="poll_duration_5_min">5 นาที</string>
<string name="create_poll_title">โพล</string>
<string name="pref_title_enable_swipe_for_tabs">เปิดใช้งานการเลื่อนนิ้วเพื่อสลับระหว่างแท็บ</string>
<string name="pref_title_show_notifications_filter">แสดงตัวกรองการแจ้งเตือน</string>
<string name="failed_search">ค้นหาล้มเหลว</string>
<string name="title_accounts">บัญชี</string>
<string name="report_description_remote_instance">บัญชีนี้มาจากเซิร์ฟเวอร์อื่น ส่งสำเนารายงานที่ไม่ระบุชื่อไปที่นั่นด้วยหรือไม่\?</string>
<string name="report_description_1">รายงานจะถูกส่งไปยังผู้ดูแลเซิร์ฟเวอร์ของคุณ สามารถให้คำอธิบายว่าทำไมจึงรายงานบัญชีนี้ด้านล่าง:</string>
<string name="failed_fetch_statuses">ดึงข้อมูลสถานะล้มเหลว</string>
<string name="failed_report">รายงานล้มเหลว</string>
<string name="report_remote_instance">ส่งต่อไปยัง %s</string>
<string name="hint_additional_info">ความคิดเห็นเพิ่มเติม</string>
<string name="report_sent_success">รายงาน @%s เรียบร้อยแล้ว</string>
<string name="button_done">ทำ</string>
<string name="button_back">ย้อนกลับ</string>
<string name="button_continue">ต่อไป</string>
<plurals name="poll_timespan_seconds">
<item quantity="other">%d วินาที</item>
</plurals>
<plurals name="poll_timespan_minutes">
<item quantity="other">%d นาที</item>
</plurals>
<plurals name="poll_timespan_hours">
<item quantity="other">%d ชั่วโมง</item>
</plurals>
<plurals name="poll_timespan_days">
<item quantity="other">%d วัน</item>
</plurals>
<string name="poll_ended_created">โพลที่คุณสร้างสิ้นสุดลงแล้ว</string>
<string name="poll_ended_voted">โพลที่คุณโหวตสิ้นสุดลงแล้ว</string>
<string name="poll_vote">โหวต</string>
<string name="poll_info_closed">สิ้นสุดแล้ว</string>
<string name="poll_info_time_absolute">จบที่ %s</string>
<string name="poll_info_time_relative">เหลืออีก %s</string>
<plurals name="poll_info_people">
<item quantity="other">%s คน</item>
</plurals>
<plurals name="poll_info_votes">
<item quantity="other">%s โหวต</item>
</plurals>
<string name="poll_info_format">" &lt;!-- 15 votes • 1 hour left --&gt; %1$s • %2$s"<!-- 15 votes • 1 hour left -->
%1$s • %2$s</string>
<string name="compose_preview_image_description">การกระทำสำหรับภาพ %s</string>
<string name="notification_clear_text">ต้องการลบการแจ้งเตือนทั้งหมดอย่างสมบูรณ์\?</string>
<string name="compose_shortcut_short_label">เขียน</string>
<string name="compose_shortcut_long_label">เขียน Toot</string>
<string name="filter_apply">ใช้งาน</string>
<string name="notifications_apply_filter">คัดกรอง</string>
<string name="notifications_clear">ล้างการแจ้งเตือน</string>
<string name="list">รายการ</string>
<string name="select_list_title">เลือกรายการ</string>
<string name="hashtags">แฮชแท็ก</string>
<string name="edit_hashtag_hint">แฮชแท็กโดยไม่มี #</string>
<string name="add_hashtag_title">เพิ่มแฮชแท็ก</string>
<string name="hint_list_name">ชื่อรายการ</string>
<string name="description_poll">โพลกับตัวเลือก: %1$s, %2$s, %3$s, %4$s; %5$s</string>
<string name="description_visiblity_direct">ไดเร็กต์</string>
<string name="description_visiblity_private">ผู้ติดตาม</string>
<string name="description_visiblity_unlisted">ไม่อยู่ในรายการ</string>
<string name="description_visiblity_public">สาธารณะ</string>
<string name="description_status_bookmarked">คั่นหน้า</string>
<string name="description_status_favourited">ชื่นชอบ</string>
<string name="description_status_reblogged">ได้ถูกเขียนใหม่</string>
<string name="description_status_media_no_description_placeholder">ไม่มีคำอธิบาย</string>
<string name="description_status_cw">เตือนเนื้อหา : %s</string>
<string name="description_status_media">สื่อ: %s</string>
<string name="max_tab_number_reached">ถึงจำนวนแท็บสูงสุดคือ %1$d แล้ว</string>
<string name="conversation_more_recipients">%1$s, %2$s และอีก %3$d</string>
<string name="conversation_2_recipients">%1$s และ %2$s</string>
<string name="conversation_1_recipients">%1$s</string>
<string name="title_favourited_by">ชื่นชอบโดย</string>
<string name="title_reblogged_by">บูสต์โดย</string>
<plurals name="reblogs">
<item quantity="other">&lt;b&gt;%1$s&lt;/b&gt; บูสต์</item>
</plurals>
<plurals name="favs">
<item quantity="other">&lt;b&gt;%1$s&lt;/b&gt; ชื่นชอบ</item>
</plurals>
<string name="pin_action">ปักหมุด</string>
<string name="unpin_action">เลิกปักหมุด</string>
<string name="label_remote_account">ข้อมูลต่อไปนี้อาจไม่ถูกต้อง แตะเพื่อเปิดโปรไฟล์ในเบราว์เซอร์</string>
<string name="pref_title_absolute_time">แสดงเวลาแบบเที่ยงตรง</string>
<string name="profile_metadata_content_label">เนื้อหา</string>
<string name="profile_metadata_label_label">ป้าย</string>
<string name="profile_metadata_add">เพิ่มข้อมูล</string>
<string name="profile_metadata_label">ข้อมูลอภิพันธุ์</string>
<string name="license_cc_by_sa_4">CC-BY-SA 4.0</string>
<string name="license_cc_by_4">CC-BY 4.0</string>
<string name="license_apache_2">ภายใต้สัญญาอนุญาต Apache License (คัดลอกด้านล่าง)</string>
<string name="license_description">Tusky มีโค้ดและสินทรัพย์จากโครงการโอเพนซอร์สต่อไปนี้:</string>
<string name="unreblog_private">ยกเลิกบูสต์</string>
<string name="reblog_private">บูสต์โพสต์ต้นฉบับ</string>
<string name="account_moved_description">%1$s ได้ย้ายไปที่ :</string>
<string name="profile_badge_bot_text">บอต</string>
<string name="download_failed">ดาวน์โหลดล้มเหลว</string>
<string name="caption_notoemoji">ชุดเอโมจิปัจจุบันจากกูเกิล</string>
<string name="caption_twemoji">ชุดเอโมจิจาก Mastodon</string>
<string name="caption_blobmoji">ที่รู้จักจาก Android 4.4 ถึง 7.1 ชุดเอโมจิ Blob</string>
<string name="caption_systememoji">ชุดเริ่มต้นในอุปกรณ์คุณ</string>
<string name="restart">เริ่มใหม่</string>
<string name="later">ภายหลัง</string>
<string name="restart_emoji">จำเป็นต้องเริ่ม Tusky ใหม่ เพื่อใช้การเปลี่ยนแปลงเหล่านี้</string>
<string name="restart_required">จำเป็นต้องเริ่มแอปใหม่</string>
<string name="action_open_toot">เปิด Toot</string>
<string name="expand_collapse_all_statuses">ขยาย/ย่อทั้งหมด</string>
<string name="performing_lookup_title">กำลังค้นหา…</string>
<string name="download_fonts">ต้องดาวน์โหลดชุดเอโมจิเหล่านี้ก่อน</string>
<string name="system_default">ค่าปริยายของระบบ</string>
<string name="emoji_style">รูปแบบเอโมจิ</string>
<string name="copy_to_clipboard_success">คัดลอกไปยังคลิบบอร์ดแล้ว</string>
<string name="error_no_custom_emojis">Instance %s ไม่มีเอโมจิแบบกำหนดเอง</string>
<string name="action_compose_shortcut">เขียน</string>
<string name="send_toot_notification_saved_content">สำเนา Toot บันทึกเป็นฉบับร่างแล้ว</string>
<string name="send_toot_notification_cancel_title">การส่งถูกยกเลิก</string>
<string name="send_toot_notification_channel_name">ส่ง Toot</string>
<string name="send_toot_notification_error_title">การส่ง Toot เกิดข้อผิดผลาด</string>
<string name="send_toot_notification_title">กำลังส่ง Toot…</string>
<string name="compose_save_draft">บันทึกฉบับร่าง\?</string>
<string name="lock_account_label_description">ต้องอนุมัติผู้ติดตามด้วยตัวเอง</string>
<string name="lock_account_label">ล็อกบัญชี</string>
<string name="action_remove">ลบ</string>
<string name="error_failed_set_caption">ตั้งคำอธิบายล้มเหลว</string>
<string name="action_set_caption">ตั้งคำอธิบาย</string>
<string name="hint_describe_for_visually_impaired">อธิบายเพื่อผู้บกพร่องทางสายตา
\n(จำกัด %d ตัวอักขระ)</string>
<string name="compose_active_account_description">โพสต์ด้วยบัญชี %1$s</string>
<string name="action_remove_from_list">ลบบัญชีออกจากรายการ</string>
<string name="action_add_to_list">เพิ่มบัญชีไปใส่รายการ</string>
<string name="hint_search_people_list">ค้นหาผู้ติดตาม</string>
<string name="action_edit_list">แก้ไขรายการ</string>
<string name="action_delete_list">ลบรายการ</string>
<string name="action_rename_list">เปลี่ยนชื่อรายการ</string>
<string name="action_create_list">สร้างรายการ</string>
<string name="error_delete_list">ไม่สามารถลบรายการได้</string>
<string name="error_rename_list">ไม่สามารถเปลี่ยนชื่อรายการได้</string>
<string name="error_create_list">ไม่สามารถสร้างรายการได้</string>
<string name="title_list_timeline">ไทม์ไลน์ในรายการ</string>
<string name="add_account_description">เพิ่มบัญชี Mastodon ใหม่</string>
<string name="add_account_name">เพิ่มบัญชี</string>
<string name="filter_add_description">วลีที่ต้องการกรอง</string>
<string name="filter_dialog_whole_word_description">ถ้าคำหลักหรือวลีเป็นอักษรผสมตัวเลข จะใช้ได้ผลเมื่อตรงทั้งคำเท่านั้น</string>
<string name="filter_dialog_whole_word">ทั้งคำ</string>
<string name="filter_dialog_update_button">อัปเดต</string>
<string name="filter_dialog_remove_button">ลบ</string>
<string name="filter_edit_dialog_title">แก้ไขตัวคัดกรอง</string>
<string name="filter_addition_dialog_title">เพิ่มตัวคัดกรอง</string>
<string name="pref_title_thread_filter_keywords">การสนทนา</string>
<string name="pref_title_public_filter_keywords">ไทม์ไลน์สาธารณะ</string>
<string name="load_more_placeholder_text">โหลดเพิ่ม</string>
<string name="replying_to">ตอบกลับไป @%s</string>
<string name="title_media">สื่อ</string>
<string name="pref_title_alway_open_spoiler">ขยาย Toot ที่มีเครื่องหมายเนื้อหาอ่อนไหวเสมอ</string>
<string name="pref_title_alway_show_sensitive_media">แสดงเนื้อหาอ่อนไหวเสมอ</string>
<string name="follows_you">กำลังติดตามคุณ</string>
<string name="abbreviated_seconds_ago">%d วินาทีที่แล้ว</string>
<string name="abbreviated_minutes_ago">%d นาทีที่แล้ว</string>
<string name="abbreviated_hours_ago">%d ชั่วโมงที่แล้ว</string>
<string name="abbreviated_days_ago">%d วันที่แล้ว</string>
<string name="abbreviated_years_ago">%d ปีที่แล้ว</string>
<string name="abbreviated_in_seconds">ใน %d วินาที</string>
<string name="abbreviated_in_minutes">ใน %d นาที</string>
<string name="abbreviated_in_hours">ใน %d ชั่วโมง</string>
<string name="abbreviated_in_days">ใน %d วัน</string>
<string name="abbreviated_in_years">ใน %d ปี</string>
<string name="state_follow_requested">กำลังขอติดตาม</string>
<string name="status_media_video">วิดีทัศน์</string>
<string name="status_media_images">ภาพ</string>
<string name="status_share_link">แบ่งปันลิงก์ Toot</string>
<string name="status_share_content">แบ่งปันเนื้อหา Toot</string>
<string name="about_tusky_account">บัญชีทางการของ Tusky</string>
<string name="about_bug_feature_request_site">รายงานช่องโหว่ และ ขอฟีเจอร์ (ภาษาอังกฤษ):
\nhttps://github.com/tuskyapp/Tusky/issues</string>
<string name="about_project_site">เว็บไซต์โปรเจกต์:
\nhttps://tusky.app</string>
<string name="about_tusky_license">Tusky คือซอฟต์แวร์เสรีและโอเพนซอร์ส &lt;!-- --&gt; ภายใต้สัญญาอนุญาต GNU General Public License Version 3 &lt;!-- --&gt;ดูสัญญาที่ : https://www.gnu.org/licenses/gpl-3.0.ja.html</string>
<string name="about_powered_by_tusky">ขับเคลื่อนด้วย Tusky</string>
<string name="about_tusky_version">Tusky %s</string>
<string name="description_account_locked">บัญชีไม่สาธารณะ</string>
<string name="notification_title_summary">การโต้ตอบใหม่จำนวน %d</string>
<string name="notification_summary_small">%1$s และ %2$s</string>
<string name="notification_summary_medium">%1$s, %2$s, และ %3$s</string>
<string name="notification_summary_large">%1$s, %2$s, %3$s และอีก %4$d คน</string>
<string name="notification_mention_format">%s ตอบกลับคุณ</string>
<string name="notification_poll_description">การแจ้งเตือนเมื่อโพลได้สิ้นสุดลงแล้ว</string>
<string name="notification_poll_name">โพล</string>
<string name="notification_favourite_description">การแจ้งเตือนเมื่อ Toot คุณถูกชื่นชอบ</string>
<string name="notification_favourite_name">ชื่นชอบ</string>
<string name="notification_boost_description">การแจ้งเตือนเมื่อ Toot คุณถูกบูสต์</string>
<string name="notification_boost_name">บูสต์</string>
<string name="notification_follow_request_description">การแจ้งเตือนคำขอติดตามใหม่</string>
<string name="notification_follow_request_name">คำขอติดตาม</string>
<string name="notification_follow_description">การแจ้งเตือนเกี่ยวกับผู้ติดตามใหม่</string>
<string name="notification_follow_name">ผู้ติดตามใหม่</string>
<string name="notification_mention_name">การกล่าวถึงใหม่</string>
<string name="notification_mention_descriptions">การแจ้งเตือนเกี่ยวกับการกล่าวถึงใหม่</string>
<string name="status_text_size_largest">ใหญ่มาก</string>
<string name="status_text_size_large">ใหญ่</string>
<string name="status_text_size_medium">กลาง</string>
<string name="status_text_size_small">เล็ก</string>
<string name="status_text_size_smallest">เล็กสุด</string>
<string name="pref_status_text_size">ขนาดอักษร Toot</string>
<string name="post_privacy_followers_only">เฉพาะผู้ติดตาม</string>
<string name="post_privacy_unlisted">ไม่อยู่ในรายการ</string>
<string name="post_privacy_public">สาธารณะ</string>
<string name="pref_failed_to_sync">ซิงค์การตั้งค่าล้มเหลว</string>
<string name="pref_publishing">กำลังเผยแพร่ (synced with server)</string>
<string name="pref_default_media_sensitivity">ใส่เครื่องหมายว่าเป็นสื่ออ่อนไหวเสมอ</string>
<string name="pref_default_post_privacy">ความเป็นส่วนตัวโพสต์ปริยาย</string>
<string name="pref_title_http_proxy_port">พอร์ตพร็อกซี่ HTTP</string>
<string name="pref_title_http_proxy_server">เซิร์ฟเวอร์พร็อกซี่ HTTP</string>
<string name="pref_title_http_proxy_enable">เปิดใช้งานพร็อกซี่ HTTP</string>
<string name="pref_title_http_proxy_settings">พร็อกซี่ HTTP</string>
<string name="pref_title_proxy_settings">พร็อกซี่</string>
<string name="pref_title_show_media_preview">ดาวน์โหลดตัวอย่างสื่อ</string>
<string name="pref_title_show_replies">แสดงการตอบกลับ</string>
<string name="pref_title_show_boosts">แสดงบูสต์</string>
<string name="pref_title_status_tabs">แท็บ</string>
<string name="pref_title_status_filter">คัดกรองไทม์ไลน์</string>
<string name="pref_title_animate_gif_avatars">อวตาร GIF เคลื่อนไหวได้</string>
<string name="pref_title_bot_overlay">แสดงสัญลักษณ์ว่าเป็นบอต</string>
<string name="pref_title_language">ภาษา</string>
<string name="pref_title_hide_follow_button">ซ่อนปุ่มเขียนเมื่อกำลังเลื่อนจอ</string>
<string name="pref_title_custom_tabs">ใช้ Chrome Custom Tabs</string>
<string name="pref_title_browser_settings">เบราว์เซอร์</string>
<string name="app_theme_system">ใช้ตามแบบระบบ</string>
<string name="app_theme_auto">ปรับตามเวลา</string>
<string name="app_theme_black">ดำ</string>
<string name="app_theme_light">สว่าง</string>
<string name="app_them_dark">มืด</string>
<string name="pref_title_timeline_filters">คัดกรอง</string>
<string name="pref_title_timelines">ไทม์ไลน์</string>
<string name="pref_title_app_theme">ธีมแอป</string>
<string name="pref_title_appearance_settings">ลักษณะ</string>
<string name="pref_title_notification_filter_poll">โพลสิ้นสุดแล้ว</string>
<string name="pref_title_notification_filter_favourites">โพสต์ถูกชื่นชอบ</string>
<string name="pref_title_notification_filter_reblogs">โพสต์ถูกบูสต์</string>
<string name="pref_title_notification_filter_follow_requests">คำขอติดตาม</string>
<string name="pref_title_notification_filter_follows">ติดตาม</string>
<string name="pref_title_notification_filter_mentions">กล่าวถึง</string>
<string name="pref_title_notification_filters">แจ้งฉันเมื่อ</string>
<string name="pref_title_notification_alert_sound">แจ้งด้วยเสียง</string>
<string name="pref_title_notification_alert_vibrate">แจ้งด้วยการสั่น</string>
<string name="pref_title_notification_alert_light">แจ้งด้วยแสง</string>
<string name="pref_title_notification_alerts">เตือน</string>
<string name="pref_title_notifications_enabled">การแจ้งเตือนแบบ Push</string>
<string name="pref_title_edit_notification_settings">ตั้งค่าการแจ้งเตือน</string>
<string name="visibility_direct">ไดเร็กต์:โพสต์ให้เฉพาะผู้ที่ถูกกล่าวถึงเห็น</string>
<string name="visibility_private">เฉพาะผู้ติดตาม:โพสต์ให้เฉพาะผู้ติดตามเห็น</string>
<string name="visibility_unlisted">ไม่อยู่ในรายการ:ไม่แสดงในไทม์ไลน์สาธารณะ</string>
<string name="visibility_public">สาธารณะ:โพสต์ในไทม์ไลน์สาธารณะ</string>
<string name="dialog_mute_warning">ปิดเสียง @%s\?</string>
<string name="dialog_block_warning">บล็อก @%s\?</string>
<string name="mute_domain_warning_dialog_ok">ซ่อนทั้งโดเมน</string>
<string name="mute_domain_warning">ต้องการบล็อกทุกอย่างจาก %s \? คุณจะไม่เห็นเนื้อหาจากโดเมนนั้นในไทม์ไลน์สาธารณะหรือในการแจ้งเตือน ผู้ติดตามของคุณจากโดเมนนั้นจะถูกลบออก</string>
<string name="dialog_redraft_toot_warning">ลบ แล้ว ร่าง Toot นี้ใหม่\?</string>
<string name="dialog_delete_toot_warning">ลบ Toot นี้\?</string>
<string name="dialog_unfollow_warning">เลิกติดตามผู้ใช้นี้\?</string>
<string name="dialog_message_cancel_follow_request">ยกเลิกคำขอติดตาม\?</string>
<string name="dialog_download_image">ดาวน์โหลด</string>
<string name="dialog_message_uploading_media">กำลังอัปโหลด…</string>
<string name="dialog_title_finishing_media_upload">กำลังอัปโหลดสื่อใกล้เสร็จ</string>
<string name="dialog_whats_an_instance">"ใส่ที่อยู่หรือโดเมนของ Instance ได้ที่นี่ เช่น mastodon.social icosahedron.website social.tchncs.de และ &lt;a href=\"https://instances.social\"&gt;อีกมากมาย!&lt;/a&gt;
\n
\nถ้ายังไม่มีบัญชี สามารถใส่ชื่อ Instance ที่ต้องการจะร่วมแล้วสร้างบัญชีที่นั่น
\n
\nInstance คือที่ที่หนึ่งไว้โฮสต์บัญชีคุณ แต่คุณยังสามารถสื่อสาร ติดตามบุคคลบน Instance อื่นได้เหมือนอยู่บนไซต์เดียวกัน
\n
\nพบข้อมูลเพิ่มเติมได้ที่ &lt;a href=\"https://joinmastodon.org\"&gt;joinmastodon.org&lt;/a&gt; "<a href="https://instances.social">more!</a>
\n\nIf you don\'t yet have an account, you can enter the name of the instance you\'d like to
join and create an account there.\n\nAn instance is a single place where your account is
hosted, but you can easily communicate with and follow folks on other instances as though
you were on the same site.
\n\nMore info can be found at <a href="https://joinmastodon.org">joinmastodon.org</a>.
</string>
<string name="label_header">ภาพหัวบน</string>
<string name="login_connection">กำลังเชื่อมต่อ…</string>
<string name="label_avatar">อวตาร</string>
<string name="label_quick_reply">ตอบกลับ…</string>
<string name="search_no_results">ไม่มีผลลัพธ์</string>
<string name="hint_search">ค้นหา…</string>
<string name="hint_note">ข้อมูลส่วนตัว</string>
<string name="hint_display_name">ชื่อที่ใช้แสดง</string>
<string name="hint_content_warning">คำเตือนเนื้อหา</string>
<string name="hint_compose">เกิดอะไรขึ้นเอย\?</string>
<string name="hint_domain">Instance ไหน\?</string>
<string name="status_sent_long">ตอบกลับสำเร็จ</string>
<string name="status_sent">ส่งแล้ว!</string>
<string name="confirmation_domain_unmuted">เลิกซ่อน %s แล้ว</string>
<string name="confirmation_unblocked">เลิกบล็อกผู้ใช้แล้ว</string>
<string name="confirmation_unmuted">เลิกปิดเสียงผู้ใช้นี้แล้ว</string>
<string name="confirmation_reported">ส่งแล้ว!</string>
<string name="send_media_to">แบ่งปันสื่อไป…</string>
<string name="send_status_content_to">แบ่งปัน Toot ไป…</string>
<string name="send_status_link_to">แชร์ URL Toot ไป…</string>
<string name="downloading_media">กำลังดาวน์โหลดสื่อ</string>
<string name="download_media">ดาวน์โหลดสื่อ</string>
<string name="action_share_as">แบ่งปันโดย…</string>
<string name="action_open_as">เปิดเป็น %s</string>
<string name="action_copy_link">คัดลอกลิงก์</string>
<string name="download_image">กำลังดาวน์โหลด %1$s</string>
<string name="action_open_media_n">เปิดสื่อ #%d</string>
<string name="title_links_dialog">ลิงก์</string>
<string name="title_mentions_dialog">โต้ตอบ</string>
<string name="title_hashtags_dialog">แฮชแท็ก</string>
<string name="action_open_faved_by">ดูชื่นชอบ</string>
<string name="action_open_reblogged_by">ดูบสต์</string>
<string name="action_open_reblogger">ดูต้นตอบูสต์</string>
<string name="action_hashtags">แฮชแท็ก</string>
<string name="action_mentions">โต้ตอบ</string>
<string name="action_links">ลิงก์</string>
<string name="action_add_tab">เพิ่มแท็บ</string>
<string name="action_schedule_toot">Toot แบบตั้งเวลา</string>
<string name="action_emoji_keyboard">คีย์บอร์ดเอโมจิ</string>
<string name="action_content_warning">เตือนเนื้อหา</string>
<string name="action_toggle_visibility">การมองเห็น Toot</string>
<string name="action_access_scheduled_toot">Toot แบบตั้งเวลา</string>
<string name="action_access_saved_toot">ฉบับร่าง</string>
<string name="action_reject">ปฏิเสธ</string>
<string name="action_accept">ยอมรับ</string>
<string name="action_undo">ย้อนการกระทำ</string>
<string name="action_edit_own_profile">แก้ไข</string>
<string name="action_save">บันทึก</string>
<string name="action_open_drawer">เปิดเมนู</string>
<string name="action_hide_media">ซ่อนสื่อ</string>
<string name="action_mention">กล่าวถึง</string>
<string name="action_unmute_conversation">เลิกปิดเสียงการสนทนา</string>
<string name="action_mute_conversation">ปิดเสียงการสนทนานี้</string>
<string name="action_mute_domain">ปิดเสียง %s</string>
<string name="action_unmute">เลิกปิดเสียง</string>
<string name="action_mute">ปิดเสียง</string>
<string name="action_share">แบ่งปัน</string>
<string name="action_photo_take">ถ่ายภาพ</string>
<string name="action_add_poll">เพิ่มโพล</string>
<string name="action_add_media">เพิ่มสื่อ</string>
<string name="action_open_in_web">เปิดในเบราว์เซอร์</string>
<string name="action_view_media">สื่อ</string>
<string name="action_view_follow_requests">คำขอติดตาม</string>
<string name="action_view_domain_mutes">โดเมนที่ซ่อนไว้</string>
<string name="action_view_blocks">ผู้ใช้ที่ถูกบล็อกไว้</string>
<string name="action_view_mutes">ผู้ใช้ที่ปิดเสียงไว้</string>
<string name="action_view_bookmarks">คั่นหน้า</string>
<string name="action_view_favourites">ชื่นชอบ</string>
<string name="action_view_profile">โปรไฟล์</string>
<string name="action_close">ปิด</string>
<string name="action_retry">ลองอีกครั้ง</string>
<string name="action_send_public">TOOT!</string>
<string name="action_send">TOOT</string>
<string name="action_delete_and_redraft">ลบ แล้ว ร่างใหม่</string>
<string name="action_delete">ลบ</string>
<string name="action_edit">แก้ไข</string>
<string name="action_report">รายงาน</string>
<string name="action_show_reblogs">แสดงบูสต์</string>
<string name="action_hide_reblogs">ซ่อนบูสต์</string>
<string name="action_unblock">เลิกบล็อก</string>
<string name="action_block">บล็อก</string>
<string name="action_unfollow">เลิกติดตาม</string>
<string name="action_follow">ติดตาม</string>
<string name="action_logout_confirm">ต้องการออกจากระบบของบัญชี %1$s \?</string>
<string name="action_compose">เขียนโพสต์ใหม่</string>
<string name="action_more">อื่น ๆ</string>
<string name="action_unfavourite">เลิกชื่นชอบ</string>
<string name="action_bookmark">คั่นหน้า</string>
<string name="action_favourite">ชื่นชอบ</string>
<string name="action_unreblog">ลบบูสต์</string>
<string name="action_reblog">บูสต์</string>
<string name="action_reply">ตอบกลับ</string>
<string name="action_quick_reply">ตอบกลับด่วน</string>
<string name="report_comment_hint">ความคิดเห็นเพิ่มเติม\?</string>
<string name="report_username_format">รายงาน @%s</string>
<string name="notification_follow_request_format">%s ต้องการติดตามคุณ</string>
<string name="notification_follow_format">%s ได้ติดตามคุณ</string>
<string name="notification_favourite_format">%s ได้ชื่นชอบ Toot คุณ</string>
<string name="notification_reblog_format">%s ได้บูสต์ Toot คุณ</string>
<string name="footer_empty">ไม่อะไรเลย ลากลงเพื่อรีเฟรช!</string>
<string name="message_empty">ไม่มีอะไร</string>
<string name="status_content_show_less">ย่อ</string>
<string name="status_content_show_more">ขยาย</string>
<string name="status_content_warning_show_less">แสดงน้อยลง</string>
<string name="status_content_warning_show_more">แสดงเพิ่มเติม</string>
<string name="status_sensitive_media_directions">แตะเพื่อดู</string>
<string name="status_media_hidden_title">สื่อที่ซ่อนไว้</string>
<string name="status_sensitive_media_title">เนื้อหาอ่อนไหว</string>
<string name="status_boosted_format">%s ได้บูสต์</string>
<string name="status_username_format">\@%s</string>
<string name="title_licenses">สัญญาอนุญาต</string>
<string name="title_scheduled_toot">Toot แบบกำหนดเวลา</string>
<string name="title_edit_profile">แก้ไขโปรไฟล์</string>
<string name="title_follow_requests">คำขอติดตาม</string>
<string name="title_domain_mutes">โดเมนที่ซ่อนไว้</string>
<string name="title_blocks">ผู้ใช้ที่ถูกบล็อก</string>
<string name="title_mutes">ผู้ใช้ที่ทำให้เป็นใบ้</string>
<string name="title_bookmarks">คั่นหน้า</string>
<string name="title_followers">ผู้ติดตาม</string>
<string name="title_follows">ติดตาม</string>
<string name="title_statuses_pinned">ปักหมุด</string>
<string name="title_statuses_with_replies">โพสต์และตอบกลับ</string>
<string name="title_statuses">โพสต์</string>
<string name="title_view_thread">เธรด</string>
<string name="title_tab_preferences">แท็บ</string>
<string name="title_direct_messages">ข้อความแบบไดเร็กต์</string>
<string name="title_public_federated">สหพันธ์</string>
<string name="title_public_local">ท้องถิ่น</string>
<string name="title_notifications">แจ้งเตือน</string>
<string name="title_home">หน้าหลัก</string>
<string name="error_sender_account_gone">การส่ง Toot เกิดความผิดพลาด</string>
<string name="error_media_upload_sending">อัปโหลดล้มเหลว</string>
<string name="error_media_upload_image_or_video">ไม่สามารถแนบรูปภาพและวิดีทัศน์ในโพสต์เดียวกันได้</string>
<string name="error_media_download_permission">ต้องมีสิทธิ์เขียนบนสื่อ</string>
<string name="error_media_upload_permission">ต้องมีสิทธิ์อ่านสื่อ</string>
<string name="error_media_upload_opening">ไม่สามารถเปิดไฟล์ได้</string>
<string name="error_media_upload_type">ไม่สามารถอัปโหลดไฟล์ประเภทนี้ได้</string>
<string name="error_audio_upload_size">ไฟล์เสียงต้องมีขนาดน้อยกว่า 40MB</string>
<string name="error_video_upload_size">ไฟล์วีดิทัศน์ต้องมีขนาดน้อยกว่า 40MB</string>
<string name="error_image_upload_size">ไฟล์ต้องมีขนาดน้อยกว่า 8MB</string>
<string name="error_compose_character_limit">ข้อความสถานะยาวเกินไป!</string>
<string name="error_retrieving_oauth_token">ไม่สามารถรับโทเค็นการเข้าสู่ระบบ</string>
<string name="error_authorization_denied">การขออนุญาตสิทธิถูกปฏิเสธ</string>
<string name="error_authorization_unknown">เกิดข้อผิดพลาดในการขออนุญาตสิทธิโดยไม่ทราบสาเหตุ</string>
<string name="error_no_web_browser_found">ไม่พบเว็บเบราว์เซอร์</string>
<string name="error_invalid_domain">โดเมนที่ป้อนไม่ถูกต้อง</string>
<string name="error_empty">ไม่สามารถโพสต์โดยไร้ข้อความได้</string>
<string name="error_network">เครือข่ายมีข้อผิดพลาดเกิดขึ้น! กรุณาตรวจสอบการเชื่อมต่อและลองอีกครั้ง!</string>
<string name="error_generic">เกิดข้อผิดพลาด</string>
<string name="title_lists">รายการ</string>
<string name="action_lists">รายการ</string>
<string name="about_title_activity">เกี่ยวกับแอปนี้</string>
<string name="action_reset_schedule">ล้างค่า</string>
<string name="action_search">ค้นหา</string>
<string name="action_edit_profile">แก้ไขโปรไฟล์</string>
<string name="action_view_account_preferences">ตั้งค่าบัญชี</string>
<string name="action_view_preferences">ตั้งค่า</string>
<string name="action_logout">ออกจากระบบ</string>
<string name="title_saved_toot">ฉบับร่าง</string>
<string name="title_favourites">ชื่นชอบ</string>
<string name="error_failed_app_registration">การยืนยันตัวตนทางอิเล็กทรอนิกส์กับ Instance นั้นล้มเหลว</string>
<string name="link_whats_an_instance">Instance คือ\?</string>
<string name="action_login">เข้าสู่ระบบด้วย Mastodon</string>
<string name="poll_allow_multiple_choices">เลือกได้หลายตัวเลือก</string>
<string name="pref_title_confirm_reblogs">แสดงข้อความยืนยันก่อนที่จะบูสต์</string>
<string name="pref_title_show_cards_in_timelines">แสดงตัวอย่างลิงก์ในไทม์ไลน์</string>
<string name="warning_scheduling_interval">Mastodon กำหนดเวลาขั้นต่ำ 5 นาที</string>
<string name="no_scheduled_status">ไม่มีสถานะแบบตั้งเวลาใด ๆ</string>
<string name="no_saved_status">ไม่มีฉบับร่างใด ๆ</string>
<string name="post_lookup_error_format">การค้นหาโพสต์ %s เกิดข้อผิดผลาด</string>
<string name="edit_poll">แก้ไข</string>
<string name="poll_new_choice_hint">ตัวเลือกที่ %d</string>
</resources>

View File

@ -184,7 +184,7 @@
<string name="post_privacy_unlisted">Liste dışı</string>
<string name="post_privacy_followers_only">Sadece takipçiler</string>
<string name="pref_status_text_size">Durum metin boyutu</string>
<string name="status_text_size_smallest">En küçük</string>
<string name="status_text_size_smallest">Çok küçük</string>
<string name="status_text_size_small">Küçük</string>
<string name="status_text_size_medium">Orta</string>
<string name="status_text_size_large">Büyük</string>
@ -392,7 +392,7 @@
<string name="hint_additional_info">Ek Yorumlar</string>
<string name="report_remote_instance">%s adresine ilet</string>
<string name="failed_fetch_statuses">Durumlar getirilemedi</string>
<string name="report_description_1">"Bildirim sunucu yöneticinize gönderilecektir. Bu hesabı neden bildirdiğinle ilgili açıklama yapabilirsin:"</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_remote_instance">Hesap başka bir sunucudan. Raporun anonim bir kopyasını da oraya gönderilsin mi\?</string>
<string name="pref_title_show_notifications_filter">Bildirim filtresini göster</string>
<string name="action_mentions">Bahsedenler</string>
@ -433,7 +433,6 @@
<string name="profile_badge_bot_text">Alt Metin</string>
<string name="confirmation_domain_unmuted">%s gizleme</string>
<string name="mute_domain_warning_dialog_ok">Alan adından herşeyi gizle</string>
<string name="gradient_for_media">Gizli medya için renkli degradeleri göster</string>
<string name="pref_title_alway_open_spoiler">Hassas içerikleri göster</string>
<string name="poll_info_time_absolute">bitiş %s</string>
<string name="failed_report">Bildirilemedi</string>

View File

@ -108,4 +108,6 @@
<string name="hint_content_warning">Попередження про контент</string>
<string name="edit_poll">Змінити</string>
<string name="compose_shortcut_short_label">Написати</string>
<string name="action_unmute_conversation">Скасувати приглушення бесіди</string>
<string name="action_mute_conversation">Приглушити бесіду</string>
</resources>

View File

@ -413,14 +413,11 @@
<string name="action_view_bookmarks">书签</string>
<string name="action_view_domain_mutes">隐藏域名</string>
<string name="action_add_poll">新增意见调查</string>
<string name="action_mute_domain">隐藏</string>
<string name="action_access_scheduled_toot">定时嘟文</string>
<string name="action_schedule_toot">定时嘟文</string>
<string name="confirmation_domain_unmuted">%s 已解除静音</string>
<string name="mute_domain_warning">您确定要封锁 s 域名吗?您将不会在任何联邦时间轴或通知中看到该域名中的内容,并且来自该域名的关注者将被删除。</string>
<string name="mute_domain_warning_dialog_ok">隐藏整个域</string>
<string name="pref_title_animate_gif_avatars">动画GIF头像</string>
<string name="gradient_for_media">显示隐藏媒体的彩色渐变</string>
<string name="about_powered_by_tusky">由Tusky提供支持</string>
<string name="pref_title_alway_open_spoiler">始终扩展标有内容警告的嘟文</string>
<string name="filter_dialog_whole_word">整个单词</string>
@ -430,11 +427,10 @@
<string name="description_poll">使用以下选项创建投票:%1$s, %2$s, %3$s, %4$s; %5$s</string>
<string name="select_list_title">选择清单</string>
<string name="list">清单</string>
<string name="compose_preview_image_description">图片 s 的动作</string>
<string name="button_continue">继续</string>
<string name="button_back">返回</string>
<string name="button_done">完成</string>
<string name="report_sent_success">成功回报 @%s</string>
<string name="report_sent_success">"成功回报 @%s"</string>
<string name="hint_additional_info">附加留言</string>
<string name="report_remote_instance">转发到 %s</string>
<string name="failed_report">回报失败</string>

View File

@ -20,7 +20,7 @@
<string name="error_media_upload_sending">媒體檔案上傳失敗</string>
<string name="error_sender_account_gone">嘟文發送時出錯</string>
<string name="title_home">主頁</string>
<string name="title_notifications">通知</string>
<string name="title_notifications">通知設定</string>
<string name="title_public_local">本站時間軸</string>
<string name="title_public_federated">跨站公開時間軸</string>
<string name="title_direct_messages">私信</string>
@ -30,7 +30,7 @@
<string name="title_statuses_with_replies">嘟文和回覆</string>
<string name="title_statuses_pinned">已置頂</string>
<string name="title_follows">正在關注</string>
<string name="title_followers">關注者</string>
<string name="title_followers">關注者</string>
<string name="title_favourites">我的收藏</string>
<string name="title_mutes">被靜音的使用者</string>
<string name="title_blocks">被封鎖的使用者</string>
@ -104,7 +104,7 @@
<string name="action_search">搜尋</string>
<string name="action_access_saved_toot">草稿</string>
<string name="action_toggle_visibility">設定嘟文可見範圍</string>
<string name="action_content_warning">設定敏感內容警告</string>
<string name="action_content_warning">敏感內容警告</string>
<string name="action_emoji_keyboard">插入表情符號</string>
<string name="action_add_tab">新增標籤頁</string>
<string name="action_links">連結</string>

View File

@ -48,4 +48,6 @@
<dimen name="adaptive_bitmap_inner_size">72dp</dimen>
<dimen name="adaptive_bitmap_outer_size">108dp</dimen>
<dimen name="fabMargin">16dp</dimen>
</resources>

View File

@ -110,6 +110,15 @@
<item>ja</item>
</string-array>
<string-array name="pref_main_nav_position_options">
<item>@string/pref_main_nav_position_option_top</item>
<item>@string/pref_main_nav_position_option_bottom</item>
</string-array>
<string-array name="pref_main_nav_position_values">
<item>top</item>
<item>bottom</item>
</string-array>
<string name="description_status" translatable="false">
<!-- Display name, cw?, content?, poll? relative date, reposted by?, reposted?, favorited?, bookmarked?, username, media?; visibility, fav number?, reblog number?-->

View File

@ -258,7 +258,7 @@
<string name="pref_title_language">Language</string>
<string name="pref_title_bot_overlay">Show indicator for bots</string>
<string name="pref_title_animate_gif_avatars">Animate GIF avatars</string>
<string name="gradient_for_media">Show colorful gradients for hidden media</string>
<string name="pref_title_gradient_for_media">Show colorful gradients for hidden media</string>
<string name="pref_title_status_filter">Timeline filtering</string>
<string name="pref_title_status_tabs">Tabs</string>
@ -276,6 +276,11 @@
<string name="pref_publishing">Publishing (synced with server)</string>
<string name="pref_failed_to_sync">Failed to sync settings</string>
<string name="pref_main_nav_position">Main navigation position</string>
<string name="pref_main_nav_position_option_top">Top</string>
<string name="pref_main_nav_position_option_bottom">Bottom</string>
<string name="post_privacy_public">Public</string>
<string name="post_privacy_unlisted">Unlisted</string>
<string name="post_privacy_followers_only">Followers-only</string>

View File

@ -1,81 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:key="@string/preferences_file_key">
<Preference
android:key="notificationPreference"
android:title="@string/pref_title_edit_notification_settings" />
<Preference
android:key="tabPreference"
android:title="@string/title_tab_preferences" />
<Preference
android:key="mutedUsersPreference"
android:title="@string/action_view_mutes" />
<Preference
android:key="blockedUsersPreference"
android:title="@string/action_view_blocks" />
<Preference
android:key="mutedDomainsPreference"
android:title="@string/action_view_domain_mutes" />
<PreferenceCategory android:title="@string/pref_publishing">
<ListPreference
android:defaultValue="public"
android:entries="@array/post_privacy_names"
android:entryValues="@array/post_privacy_values"
android:key="defaultPostPrivacy"
android:summary="%s"
android:title="@string/pref_default_post_privacy" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:icon="@drawable/ic_eye_24dp"
android:key="defaultMediaSensitivity"
android:title="@string/pref_default_media_sensitivity"
app:singleLineTitle="false" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/pref_title_timelines">
<SwitchPreferenceCompat
android:key="mediaPreviewEnabled"
android:title="@string/pref_title_show_media_preview"
app:singleLineTitle="false" />
<SwitchPreferenceCompat
android:key="alwaysShowSensitiveMedia"
android:title="@string/pref_title_alway_show_sensitive_media"
app:singleLineTitle="false" />
<SwitchPreferenceCompat
android:key="alwaysOpenSpoiler"
android:title="@string/pref_title_alway_open_spoiler"
app:singleLineTitle="false" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/pref_title_timeline_filters">
<Preference
android:key="publicFilters"
android:title="@string/pref_title_public_filter_keywords" />
<Preference
android:key="notificationFilters"
android:title="@string/title_notifications" />
<Preference
android:key="homeFilters"
android:title="@string/title_home" />
<Preference
android:key="threadFilters"
android:title="@string/pref_title_thread_filter_keywords" />
<Preference
android:key="accountFilters"
android:title="@string/title_accounts" />
</PreferenceCategory>
</androidx.preference.PreferenceScreen>

View File

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:title="@string/pref_title_http_proxy_settings">
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="httpProxyEnabled"
android:title="@string/pref_title_http_proxy_enable"
app:iconSpaceReserved="false" />
<EditTextPreference
android:key="httpProxyServer"
android:summary="%s"
android:title="@string/pref_title_http_proxy_server"
app:iconSpaceReserved="false" />
<EditTextPreference
android:key="httpProxyPort"
android:summary="%s"
android:title="@string/pref_title_http_proxy_port"
app:iconSpaceReserved="false" />
</androidx.preference.PreferenceScreen>

View File

@ -1,78 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:key="notificationSettings"
android:title="@string/pref_title_edit_notification_settings">
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="notificationsEnabled"
android:title="@string/pref_title_notifications_enabled"
app:iconSpaceReserved="false" />
<PreferenceCategory
android:dependency="notificationsEnabled"
android:title="@string/pref_title_notification_filters"
app:iconSpaceReserved="false">
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="notificationFilterMentions"
android:title="@string/pref_title_notification_filter_mentions"
app:iconSpaceReserved="false" />
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="notificationFilterFollows"
android:title="@string/pref_title_notification_filter_follows"
app:iconSpaceReserved="false" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="notificationFilterFollowRequests"
android:title="@string/pref_title_notification_filter_follow_requests"
app:iconSpaceReserved="false" />
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="notificationFilterReblogs"
android:title="@string/pref_title_notification_filter_reblogs"
app:iconSpaceReserved="false" />
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="notificationFilterFavourites"
android:title="@string/pref_title_notification_filter_favourites"
app:iconSpaceReserved="false" />
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="notificationFilterPolls"
android:title="@string/pref_title_notification_filter_poll"
app:iconSpaceReserved="false" />
</PreferenceCategory>
<PreferenceCategory
android:dependency="notificationsEnabled"
android:title="@string/pref_title_notification_alerts"
app:iconSpaceReserved="false">
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="notificationAlertSound"
android:title="@string/pref_title_notification_alert_sound"
app:iconSpaceReserved="false" />
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="notificationAlertVibrate"
android:title="@string/pref_title_notification_alert_vibrate"
app:iconSpaceReserved="false" />
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="notificationAlertLight"
android:title="@string/pref_title_notification_alert_light"
app:iconSpaceReserved="false" />
</PreferenceCategory>
</androidx.preference.PreferenceScreen>

View File

@ -1,165 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:key="@string/preferences_file_key">
<PreferenceCategory android:title="@string/pref_title_appearance_settings">
<ListPreference
android:defaultValue="night"
android:entries="@array/app_theme_names"
android:entryValues="@array/app_theme_values"
android:key="appTheme"
android:summary="%s"
android:title="@string/pref_title_app_theme" />
<com.keylesspalace.tusky.EmojiPreference
android:defaultValue="@string/system_default"
android:icon="@drawable/ic_emoji_24dp"
android:key="emojiCompat"
android:summary="@string/system_default"
android:title="@string/emoji_style" />
<ListPreference
android:defaultValue="default"
android:entries="@array/language_entries"
android:entryValues="@array/language_values"
android:key="language"
android:summary="%s"
android:title="@string/pref_title_language" />
<ListPreference
android:defaultValue="medium"
android:entries="@array/status_text_size_names"
android:entryValues="@array/status_text_size_values"
android:key="statusTextSize"
android:summary="%s"
android:title="@string/pref_status_text_size" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="fabHide"
android:title="@string/pref_title_hide_follow_button"
app:singleLineTitle="false" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="absoluteTimeView"
android:title="@string/pref_title_absolute_time"
app:singleLineTitle="false" />
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="showBotOverlay"
android:title="@string/pref_title_bot_overlay"
app:singleLineTitle="false" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="animateGifAvatars"
android:title="@string/pref_title_animate_gif_avatars"
app:singleLineTitle="false" />
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="useBlurhash"
android:title="@string/gradient_for_media"
app:singleLineTitle="false" />
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="showNotificationsFilter"
android:title="@string/pref_title_show_notifications_filter"
app:singleLineTitle="false" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="showCardsInTimelines"
android:title="@string/pref_title_show_cards_in_timelines"
app:singleLineTitle="false" />
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="confirmReblogs"
android:title="@string/pref_title_confirm_reblogs"
app:singleLineTitle="false" />
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="enableSwipeForTabs"
android:title="@string/pref_title_enable_swipe_for_tabs"
app:singleLineTitle="false" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/pref_title_limited_bandwidth_settings">
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="limitedBandwidthActive"
android:title="@string/pref_title_limited_bandwidth_active"
android:disableDependentsState="false"
app:singleLineTitle="false" />
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="limitedBandwidthOnlyMobileNetwork"
android:title="@string/pref_title_limited_bandwidth_mobile"
android:dependency="limitedBandwidthActive"
app:singleLineTitle="false" />
<SwitchPreferenceCompat
android:defaultValue="true"
android:key="limitedBandwidthTimelineLoading"
android:title="@string/pref_title_limited_bandwidth_timeline"
android:dependency="limitedBandwidthActive"
app:singleLineTitle="false" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/pref_title_browser_settings">
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="customTabs"
android:title="@string/pref_title_custom_tabs"
app:singleLineTitle="false" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/pref_title_status_filter">
<Preference
android:key="timelineFilterPreferences"
android:title="@string/pref_title_status_tabs" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/pref_title_proxy_settings">
<Preference
android:key="httpProxyPreferences"
android:summary="%s"
android:title="@string/pref_title_http_proxy_settings" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/pref_title_experimental">
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="viewPagerOffScreenLimit"
android:title="@string/pref_title_experimental_viewpager_offscreen"
app:singleLineTitle="false" />
</PreferenceCategory>
<PreferenceCategory
android:key="stackTraceCategory"
android:title="@string/pref_title_stacktrace">
<Preference
android:key="sendCrashReport"
android:title="@string/pref_title_stacktrace_send" />
<Preference
android:key="stackTrace"
android:selectable="false" />
</PreferenceCategory>
</androidx.preference.PreferenceScreen>

View File

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:title="@string/pref_title_status_tabs">
<PreferenceCategory
android:title="@string/title_home"
app:iconSpaceReserved="false">
<CheckBoxPreference
android:defaultValue="true"
android:key="tabFilterHomeBoosts"
android:title="@string/pref_title_show_boosts"
app:iconSpaceReserved="false" />
<CheckBoxPreference
android:defaultValue="true"
android:key="tabFilterHomeReplies"
android:title="@string/pref_title_show_replies"
app:iconSpaceReserved="false" />
</PreferenceCategory>
</androidx.preference.PreferenceScreen>

View File

@ -5,7 +5,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.3'
classpath 'com.android.tools.build:gradle:4.0.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}

View File

@ -0,0 +1,10 @@
Tusky v11.0
- Notificacions sobre les noves sol·licituds de seguiment quan el compte està bloquejat
- Noves funcions que es poden commutar a la pantalla de preferències:
- desactivar el desplaçament entre pestanyes
- mostrar un diàleg de confirmació abans d'incorporar un toot
- mostrar les previsualitzacions d'enllaços en els terminis
- Ara es poden silenciar les converses
- Els resultats de les enquestes ara es calcularan en funció del nombre de votants i no del nombre de vots
- ..

View File

@ -0,0 +1,9 @@
Tusky v11.0
- Notificaciones sobre nuevas solicitudes de seguimiento cuando su cuenta está bloqueada
- Nuevas funciones que se pueden alternar en la pantalla de Preferencias:
- deshabilitar deslizar entre pestañas
- muestra un diálogo de confirmación antes de dar un toque
- Mostrar vistas previas de enlaces en líneas de tiempo
- Las conversaciones ahora se pueden silenciar
- Los resultados de la encuesta ahora se calcularán en función de la cantidad de votantes y no de la cantidad t

View File

@ -0,0 +1,12 @@
Tusky es un cliente ligero para Mastodon, un servidor de red social gratuito y de código abierto.
• Material Design
• La mayoría de las API de Mastodon están implementadas
• Soporte de múltiples cuentas
• Tema oscuro y claro con la posibilidad de cambiar automáticamente según la hora del día
• Borradores - crear los toots y guárdalos para más adelante.
• Elige entre diferentes estilos de emojis
• Optimizado para todos los tamaños de pantalla.
• Completamente de código abierto: sin dependencias no libres como los servicios de Google
Para obtener más información sobre Mastodon, visite https://joinmastodon.org/

View File

@ -0,0 +1 @@
Un cliente multicuentas para la red social Mastodon

View File

@ -0,0 +1 @@
Turky

View File

@ -8,4 +8,3 @@
- سبک جدید «پیروی از سبک سیستم» در تنظیمات
- بهبود دسترس‌پذییری خط‌زمانی
- تاسکی اکنون اعلان‌های ناشناس را نادیده می‌گید و دیگر فرونمی‌پاشد
-

View File

@ -1,7 +1,7 @@
Tusky v7.0
- Supporte l'affichage, le vote et les notifications des sondages
- Nouveaux boutons pour filtrer l'onglet des notifications et effacer toutes les notifications
- "Effacer & réécrire" vos propres pouets
- Nouvel indicateur pour les profils robots (peut-être désactivé dans les préférences)
- Nouveaux boutons pour filtrer longlet des notifications et effacer toutes les notifications
- « Effacer & réécrire » vos propres pouets
- Nouvel indicateur qui montre si un compte est un robot sur limage de profil (peut être désactivé dans les préférences)
- Nouvelles traductions : Norvégien Bokmål et Slovène.

View File

@ -1,9 +1,9 @@
Tusky v9.0
- Vous pouvez désormais créer des sondages depuis Tusky
- Vous pouvez désormais créer des sondages dans Tusky
- Recherche améliorée
- Nouvelle option dans les préférences du compte pour toujours étendre les avertissements de contenu
- Les avatars dans le menu de navigation ont désormais une forme de
- Il est désormais possible de signaler des utilisateurs même si ils n'ont jamais posté de status
- Tusky refuse désormais de se connecté via les connections cleartext sur Android 6+
- Plein de petite corrections de bugs et d'améliorations
- Nouvelle option dans les Préférences du compte pour toujours déplier les avertissements
- Les avatars dans le menu de navigation ont désormais une forme de rectangle arrondi
- Il est désormais possible de signaler des utilisateurs même si ils n'ont jamais posté de statut
- Tusky refuse désormais de se connecter via une connexion non-sécurisée sur Android 6+
- Plein de petites améliorations et corrections

View File

@ -1,3 +1,3 @@
Tusky v9.1
Cette mise à jour assure la compatibilité avec Mastodon 3 et améliore les perfomances et la stabilité.
Cette mise à jour assure la compatibilité avec Mastodon 3 et améliore les performances et la stabilité.

View File

@ -2,11 +2,11 @@ Tusky est un client léger pour Mastodon, un serveur de réseau social libre et
• Design Material
• La plupart de l'API Mastodon est implémentée
• Support multi-comptes
• Thèmes sombre et clair disponibles avec possibilité de basculer automatiquement entre les thèmes en fonction de l'heure
• Brouillons - rédigez des pouets et enregistrez les sous forme de brouillons pour les publier plus tard
Possibilité de choisir différents styles d'émojis
• Support du multi-compte
• Thèmes sombre et clair avec possibilité de basculer automatiquement en fonction de l'heure
• Brouillons — rédigez des pouets et enregistrez-les pour plus tard
Choisissez parmi différents styles d'émojis
• Optimisé pour toutes les tailles d'écrans
• Entièrement ouvert, aucune dépendance des services Google
• Entièrement ouvert — aucune dépendance non libre comme les services Google
Pour en savoir plus à propos de Mastodon : https://joinmastodon.org/ (Anglais)
Pour en apprendre plus à propos de Mastodon, visitez https://joinmastodon.org/ (anglais)

View File

@ -1 +1 @@
Un client multi-comptes pour le réseau social Mastodon
Un client multi-compte pour le réseau social Mastodon

View File

@ -0,0 +1,11 @@
Tusky v11.0
- Powiadomienia o nowych prośbach o obserwowanie kiedy Twoje konto jest zablokowane
- Nowe funkcje, które mogą być zmienione w ekranie Ustawień:
- wyłącz przesuwanie pomiędzy kartami
- pokaż potwierdzenie przed podbiciem
- pokaż podgląd linku na osi czasu
- Rozmowy mogą być teraz wyciszone
- Wyniki ankiet są teraz przeliczane na podstawie liczby głosujących, a nie łącznej liczbie wszystkich głosów
- Dużo poprawek błędów, większość z nich dotyczy wpisów
- Poprawiono tłumaczenia

View File

@ -1 +1 @@
Odjemalec z več računi za socialno omrežje Mastodon
Odjemalec z več računi za socialno omrežje Mastodon.

View File

@ -0,0 +1,11 @@
Tusky v11.0
- การแจ้งเตือนเกี่ยวกับคำขอติดตามใหม่หากบัญชีของคุณไม่เป็นสาธารณะ(ล็อก)
- คุณสมบัติใหม่ที่สามารถ toggled ได้ในหน้าจอการตั้งค่า:
- ปิดการใช้งานการปัดระหว่างแท็บ
- แสดงข้อความยืนยันก่อนที่จะบูสต์ Toot
- แสดงตัวอย่างลิงก์ในไทม์ไลน์
- สามารถปิดเสียงการสนทนาได้ในขณะนี้ (ไม่สนใจการส)
- ผลลัพธ์โพลจะคำนวณตามจำนวนผู้โหวตและไม่ได้อยู่ในคะแนนรวม ทำให้โพลหลายตัวเลือกง่ายต่อการเข้าใจ
- แก้ไขบั๊กจำนวนมาก ส่วนใหญ่เกี่ยวข้องกับการเขียน Toot
- ปรับปรุงการแปล

View File

@ -0,0 +1,12 @@
Tusky เป็นไคลเอ็นต์ที่มีน้ำหนักเบาสำหรับ Mastodon ซึ่งเป็นเซิร์ฟเวอร์เครือข่ายโซเชียลที่ฟรีและโอเพนซอร์ส
• Material Design
• Most Mastodon APIs implemented
• รองรับการใช้งานแบบหลายบัญชี
• ชุดรูปแบบมืดและสว่าง สามารถสลับอัตโนมัติตามเวลาของวัน
• แบบร่าง - เขียน Toot และบันทึกไว้เพื่อใช้ในภายหลัง
• เลือกรูปแบบเอโมจิที่แตกต่างกันได้
• ปรับให้เหมาะสมสำหรับทุกขนาดหน้าจอ
• โอเพ่นซอร์สสมบูรณ์ - ไม่มีการขึ้นต่อกันอย่างไม่อิสระ เช่น บริการ Google ฯลฯ
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ Mastodon โปรดเยี่ยมชมที่ https://joinmastodon.org/

View File

@ -0,0 +1 @@
ไคลเอ็นต์แบบหลายบัญชีสำหรับเครือข่ายสังคม Mastodon

View File

@ -0,0 +1 @@
Tusky

Binary file not shown.

View File

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists