Merge remote-tracking branch 'tuskyapp/develop' into master

This commit is contained in:
kyori19 2020-09-06 12:51:50 +09:00
commit bb5106a18d
65 changed files with 1588 additions and 1353 deletions

View File

@ -55,6 +55,9 @@
public static *** v(...);
public static *** i(...);
}
-assumenosideeffects class java.lang.String {
public static java.lang.String format(...);
}
# remove some kotlin overhead
-assumenosideeffects class kotlin.jvm.internal.Intrinsics {
@ -62,8 +65,3 @@
static void checkExpressionValueIsNotNull(java.lang.Object, java.lang.String);
static void throwUninitializedPropertyAccessException(java.lang.String);
}
# without this emoji font downloading fails with AbstractMethodError
-keep class * extends android.os.AsyncTask {
public *;
}

View File

@ -117,7 +117,7 @@
android:name=".AccountActivity"
android:configChanges="orientation|screenSize|keyboardHidden|screenLayout|smallestScreenSize" />
<activity android:name=".EditProfileActivity" />
<activity android:name=".PreferencesActivity" />
<activity android:name=".components.preference.PreferencesActivity" />
<activity android:name=".StatusListActivity" />
<activity android:name=".AccountListActivity" />
<activity android:name=".AboutActivity" />

View File

@ -1,291 +0,0 @@
package com.keylesspalace.tusky;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.preference.Preference;
import androidx.preference.PreferenceManager;
import com.keylesspalace.tusky.util.EmojiCompatFont;
import java.util.ArrayList;
/**
* This Preference lets the user select their preferred emoji font
*/
public class EmojiPreference extends Preference {
private static final String TAG = "EmojiPreference";
private EmojiCompatFont selected, original;
static final String FONT_PREFERENCE = "selected_emoji_font";
private static final EmojiCompatFont[] FONTS = EmojiCompatFont.FONTS;
// Please note that this array should be sorted in the same way as their fonts.
private static final int[] viewIds = {
R.id.item_nomoji,
R.id.item_blobmoji,
R.id.item_twemoji,
R.id.item_notoemoji};
private ArrayList<RadioButton> radioButtons = new ArrayList<>();
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);
// 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));
}
@Override
protected void onClick() {
View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_emojicompat, null);
for (int i = 0; i < viewIds.length; i++) {
setupItem(view.findViewById(viewIds[i]), FONTS[i]);
}
new AlertDialog.Builder(getContext())
.setView(view)
.setPositiveButton(android.R.string.ok, (dialog, which) -> onDialogOk())
.setNegativeButton(android.R.string.cancel, null)
.show();
}
private void setupItem(View container, EmojiCompatFont font) {
Context context = container.getContext();
TextView title = container.findViewById(R.id.emojicompat_name);
TextView caption = container.findViewById(R.id.emojicompat_caption);
ImageView thumb = container.findViewById(R.id.emojicompat_thumb);
ImageButton download = container.findViewById(R.id.emojicompat_download);
ImageButton cancel = container.findViewById(R.id.emojicompat_download_cancel);
RadioButton radio = container.findViewById(R.id.emojicompat_radio);
// Initialize all the views
title.setText(font.getDisplay(context));
caption.setText(font.getCaption(context));
thumb.setImageDrawable(font.getThumb(context));
// There needs to be a list of all the radio buttons in order to uncheck them when one is selected
radioButtons.add(radio);
updateItem(font, container);
// Set actions
download.setOnClickListener((downloadButton) ->
startDownload(font, container));
cancel.setOnClickListener((cancelButton) ->
cancelDownload(font, container));
radio.setOnClickListener((radioButton) ->
select(font, (RadioButton) radioButton));
container.setOnClickListener((containterView) ->
select(font,
containterView.findViewById(R.id.emojicompat_radio
)));
}
private void startDownload(EmojiCompatFont font, View container) {
ImageButton download = container.findViewById(R.id.emojicompat_download);
TextView caption = container.findViewById(R.id.emojicompat_caption);
ProgressBar progressBar = container.findViewById(R.id.emojicompat_progress);
ImageButton cancel = container.findViewById(R.id.emojicompat_download_cancel);
// Switch to downloading style
download.setVisibility(View.GONE);
caption.setVisibility(View.INVISIBLE);
progressBar.setVisibility(View.VISIBLE);
cancel.setVisibility(View.VISIBLE);
font.downloadFont(getContext(), new EmojiCompatFont.Downloader.EmojiDownloadListener() {
@Override
public void onDownloaded(EmojiCompatFont font) {
finishDownload(font, container);
}
@Override
public void onProgress(float progress) {
// The progress is returned as a float between 0 and 1
progress *= progressBar.getMax();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
progressBar.setProgress((int) progress, true);
} else {
progressBar.setProgress((int) progress);
}
}
@Override
public void onFailed() {
Toast.makeText(getContext(), R.string.download_failed, Toast.LENGTH_SHORT).show();
updateItem(font, container);
}
});
}
private void cancelDownload(EmojiCompatFont font, View container) {
font.cancelDownload();
updateItem(font, container);
}
private void finishDownload(EmojiCompatFont font, View container) {
select(font, container.findViewById(R.id.emojicompat_radio));
updateItem(font, container);
// Set the flag to restart the app (because an update has been downloaded)
if (selected == original && currentNeedsUpdate) {
updated = true;
currentNeedsUpdate = false;
}
}
/**
* Select a font both visually and logically
*
* @param font The font to be selected
* @param radio The radio button associated with it's visual item
*/
private void select(EmojiCompatFont font, RadioButton radio) {
selected = font;
// Uncheck all the other buttons
for (RadioButton other : radioButtons) {
if (other != radio) {
other.setChecked(false);
}
}
radio.setChecked(true);
}
/**
* Called when a "consistent" state is reached, i.e. it's not downloading the font
*
* @param font The font to be displayed
* @param container The ConstraintLayout containing the item
*/
private void updateItem(EmojiCompatFont font, View container) {
// Assignments
ImageButton download = container.findViewById(R.id.emojicompat_download);
TextView caption = container.findViewById(R.id.emojicompat_caption);
ProgressBar progress = container.findViewById(R.id.emojicompat_progress);
ImageButton cancel = container.findViewById(R.id.emojicompat_download_cancel);
RadioButton radio = container.findViewById(R.id.emojicompat_radio);
// There's no download going on
progress.setVisibility(View.GONE);
cancel.setVisibility(View.GONE);
caption.setVisibility(View.VISIBLE);
if (font.isDownloaded(getContext())) {
// Make it selectable
download.setVisibility(View.GONE);
radio.setVisibility(View.VISIBLE);
container.setClickable(true);
} else {
// Make it downloadable
download.setVisibility(View.VISIBLE);
radio.setVisibility(View.GONE);
container.setClickable(false);
}
// Select it if necessary
if (font == selected) {
radio.setChecked(true);
// Update available
if (!font.isDownloaded(getContext())) {
currentNeedsUpdate = true;
}
} else {
radio.setChecked(false);
}
}
/**
* In order to be able to use this font later on, it needs to be saved first.
*/
private void saveSelectedFont() {
int index = selected.getId();
Log.i(TAG, "saveSelectedFont: Font ID: " + index);
// It's saved using the key FONT_PREFERENCE
PreferenceManager
.getDefaultSharedPreferences(getContext())
.edit()
.putInt(FONT_PREFERENCE, index)
.apply();
setSummary(selected.getDisplay(getContext()));
}
/**
* That's it. The user doesn't want to switch between these amazing radio buttons anymore!
* That means, the selected font can be saved (if the user hit OK)
*/
private void onDialogOk() {
saveSelectedFont();
if (selected != original || updated) {
new AlertDialog.Builder(getContext())
.setTitle(R.string.restart_required)
.setMessage(R.string.restart_emoji)
.setNegativeButton(R.string.later, null)
.setPositiveButton(R.string.restart, ((dialog, which) -> {
// Restart the app
// From https://stackoverflow.com/a/17166729/5070653
Intent launchIntent = new Intent(getContext(), SplashActivity.class);
PendingIntent mPendingIntent = PendingIntent.getActivity(
getContext(),
// This is the codepoint of the party face emoji :D
0x1f973,
launchIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager mgr =
(AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
if (mgr != null) {
mgr.set(
AlarmManager.RTC,
System.currentTimeMillis() + 100,
mPendingIntent);
}
System.exit(0);
})).show();
}
}
}

View File

@ -20,7 +20,6 @@ import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.content.res.ColorStateList
import android.content.res.Configuration
import android.graphics.Color
import android.graphics.PorterDuff
import android.graphics.drawable.Drawable
@ -35,7 +34,6 @@ import android.view.MenuItem
import android.view.View
import android.view.WindowManager
import android.widget.ImageView
import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.view.menu.MenuBuilder
import androidx.appcompat.widget.PopupMenu
@ -49,6 +47,10 @@ import androidx.lifecycle.Lifecycle
import androidx.preference.PreferenceManager
import androidx.viewpager2.widget.MarginPageTransformer
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.target.FixedSizeDrawable
import com.bumptech.glide.request.transition.Transition
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayout.OnTabSelectedListener
@ -59,6 +61,7 @@ import com.keylesspalace.tusky.components.compose.ComposeActivity
import com.keylesspalace.tusky.components.compose.ComposeActivity.Companion.canHandleMimeType
import com.keylesspalace.tusky.components.conversation.ConversationsRepository
import com.keylesspalace.tusky.components.notifications.NotificationHelper
import com.keylesspalace.tusky.components.preference.PreferencesActivity
import com.keylesspalace.tusky.components.scheduled.ScheduledTootActivity
import com.keylesspalace.tusky.components.search.SearchActivity
import com.keylesspalace.tusky.db.AccountEntity
@ -108,7 +111,6 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
lateinit var conversationRepository: ConversationsRepository
private lateinit var header: AccountHeaderView
private lateinit var drawerToggle: ActionBarDrawerToggle
private var streamingTabsCount = 0
private var notificationTabPosition = 0
@ -188,6 +190,9 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
val hideTopToolbar = preferences.getBoolean(PrefKeys.HIDE_TOP_TOOLBAR, false)
mainToolbar.visible(!hideTopToolbar)
val navIconSize = resources.getDimensionPixelSize(R.dimen.avatar_toolbar_nav_icon_size)
mainToolbar.navigationIcon = FixedSizeDrawable(getDrawable(R.drawable.avatar_default), navIconSize, navIconSize)
mainToolbar.menu.add(R.string.action_search).apply {
setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
icon = IconicsDrawable(this@MainActivity, GoogleMaterial.Icon.gmd_search).apply {
@ -310,8 +315,6 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
public override fun onPostCreate(savedInstanceState: Bundle?) {
super.onPostCreate(savedInstanceState)
drawerToggle.syncState()
if (intent != null) {
val statusUrl = intent.getStringExtra(STATUS_URL)
if (statusUrl != null) {
@ -337,7 +340,9 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
private fun setupDrawer(savedInstanceState: Bundle?, addSearchButton: Boolean) {
drawerToggle = ActionBarDrawerToggle(this, mainDrawerLayout, mainToolbar, com.mikepenz.materialdrawer.R.string.material_drawer_open, com.mikepenz.materialdrawer.R.string.material_drawer_close)
mainToolbar.setNavigationOnClickListener {
mainDrawerLayout.open()
}
header = AccountHeaderView(this).apply {
headerBackgroundScaleType = ImageView.ScaleType.CENTER_CROP
@ -514,18 +519,6 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
EmojiCompat.get().registerInitCallback(emojiInitCallback)
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
drawerToggle.onConfigurationChanged(newConfig)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (drawerToggle.onOptionsItemSelected(item)) {
return true
}
return super.onOptionsItemSelected(item)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(mainDrawer.saveInstanceState(outState))
}
@ -800,6 +793,24 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
.load(me.header)
.into(header.accountHeaderBackground)
val navIconSize = resources.getDimensionPixelSize(R.dimen.avatar_toolbar_nav_icon_size)
Glide.with(this)
.asDrawable()
.override(navIconSize)
.load(me.avatar)
.transform(
RoundedCorners(resources.getDimensionPixelSize(R.dimen.avatar_radius_36dp))
)
.into(object : CustomTarget<Drawable>(){
override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {
mainToolbar.navigationIcon = resource
}
override fun onLoadCleared(placeholder: Drawable?) {
mainToolbar.navigationIcon = placeholder
}
})
accountManager.updateActiveAccount(me)
NotificationHelper.createNotificationChannelsForAccount(accountManager.activeAccount!!, this)

View File

@ -78,7 +78,7 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene
setDisplayShowHomeEnabled(true)
}
currentTabs = (accountManager.activeAccount?.tabPreferences ?: emptyList()).toMutableList()
currentTabs = accountManager.activeAccount?.tabPreferences.orEmpty().toMutableList()
currentTabsAdapter = TabAdapter(currentTabs, false, this, currentTabs.size <= MIN_TAB_COUNT)
currentTabsRecyclerView.adapter = currentTabsAdapter
currentTabsRecyclerView.layoutManager = LinearLayoutManager(this)
@ -175,20 +175,20 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene
saveTabs()
}
override fun onActionChipClicked(tab: TabData) {
showAddHashtagDialog(tab)
override fun onActionChipClicked(tab: TabData, tabPosition: Int) {
showAddHashtagDialog(tab, tabPosition)
}
override fun onChipClicked(tab: TabData, chipPosition: Int) {
override fun onChipClicked(tab: TabData, tabPosition: Int, chipPosition: Int) {
val newArguments = tab.arguments.filterIndexed { i, _ -> i != chipPosition }
val newTab = tab.copy(arguments = newArguments)
val position = currentTabs.indexOf(tab)
currentTabs[position] = newTab
currentTabs[tabPosition] = newTab
saveTabs()
currentTabsAdapter.notifyItemChanged(position)
currentTabsAdapter.notifyItemChanged(tabPosition)
}
private fun showAddHashtagDialog(tab: TabData? = null) {
private fun showAddHashtagDialog(tab: TabData? = null, tabPosition: Int = 0) {
val frameLayout = FrameLayout(this)
val padding = Utils.dpToPx(this, 8)
@ -211,10 +211,9 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene
currentTabsAdapter.notifyItemInserted(currentTabs.size - 1)
} else {
val newTab = tab.copy(arguments = tab.arguments + input)
val position = currentTabs.indexOf(tab)
currentTabs[position] = newTab
currentTabs[tabPosition] = newTab
currentTabsAdapter.notifyItemChanged(position)
currentTabsAdapter.notifyItemChanged(tabPosition)
}
updateAvailableTabs()

View File

@ -24,6 +24,7 @@ import androidx.preference.PreferenceManager
import androidx.work.WorkManager
import com.keylesspalace.tusky.components.notifications.NotificationWorkerFactory
import com.keylesspalace.tusky.di.AppInjector
import com.keylesspalace.tusky.settings.PrefKeys
import com.keylesspalace.tusky.util.*
import com.uber.autodispose.AutoDisposePlugins
import dagger.android.DispatchingAndroidInjector
@ -53,7 +54,7 @@ class TuskyApplication : Application(), HasAndroidInjector {
val preferences = PreferenceManager.getDefaultSharedPreferences(this)
// init the custom emoji fonts
val emojiSelection = preferences.getInt(EmojiPreference.FONT_PREFERENCE, 0)
val emojiSelection = preferences.getInt(PrefKeys.EMOJI, 0)
val emojiConfig = EmojiCompatFont.byId(emojiSelection)
.getConfig(this)
.setReplaceAll(true)

View File

@ -36,8 +36,8 @@ interface ItemInteractionListener {
fun onTabRemoved(position: Int)
fun onStartDelete(viewHolder: RecyclerView.ViewHolder)
fun onStartDrag(viewHolder: RecyclerView.ViewHolder)
fun onActionChipClicked(tab: TabData)
fun onChipClicked(tab: TabData, chipPosition: Int)
fun onActionChipClicked(tab: TabData, tabPosition: Int)
fun onChipClicked(tab: TabData, tabPosition: Int, chipPosition: Int)
}
class TabAdapter(private var data: List<TabData>,
@ -62,16 +62,17 @@ class TabAdapter(private var data: List<TabData>,
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val context = holder.itemView.context
if (!small && data[position].id == LIST) {
holder.itemView.textView.text = data[position].arguments.getOrNull(1).orEmpty()
val tab = data[position]
if (!small && tab.id == LIST) {
holder.itemView.textView.text = tab.arguments.getOrNull(1).orEmpty()
} else {
holder.itemView.textView.setText(data[position].text)
holder.itemView.textView.setText(tab.text)
}
val iconDrawable = ThemeUtils.getTintedDrawable(context, data[position].icon, android.R.attr.textColorSecondary)
val iconDrawable = ThemeUtils.getTintedDrawable(context, tab.icon, android.R.attr.textColorSecondary)
holder.itemView.textView.setCompoundDrawablesRelativeWithIntrinsicBounds(iconDrawable, null, null, null)
if (small) {
holder.itemView.textView.setOnClickListener {
listener.onTabAdded(data[position])
listener.onTabAdded(tab)
}
}
holder.itemView.imageView?.setOnTouchListener { _, event ->
@ -96,7 +97,7 @@ class TabAdapter(private var data: List<TabData>,
if (!small) {
if (data[position].id == HASHTAG) {
if (tab.id == HASHTAG) {
holder.itemView.chipGroup.show()
/*
@ -104,34 +105,33 @@ class TabAdapter(private var data: List<TabData>,
* The other dynamic chips are inserted in front of the actionChip.
* This code tries to reuse already added chips to reduce the number of Views created.
*/
data[position].arguments.forEachIndexed { i, arg ->
tab.arguments.forEachIndexed { i, arg ->
val chip = holder.itemView.chipGroup.getChildAt(i).takeUnless { it.id == R.id.actionChip } as Chip?
?: Chip(context).apply {
text = arg
holder.itemView.chipGroup.addView(this, holder.itemView.chipGroup.size - 1)
}
chip.text = arg
if(data[position].arguments.size <= 1) {
if(tab.arguments.size <= 1) {
chip.chipIcon = null
chip.setOnClickListener(null)
} else {
val cancelIcon = ThemeUtils.getTintedDrawable(context, R.drawable.ic_cancel_24dp, android.R.attr.textColorPrimary)
chip.chipIcon = cancelIcon
chip.setOnClickListener {
listener.onChipClicked(data[position], i)
listener.onChipClicked(tab, holder.adapterPosition, i)
}
}
}
while(holder.itemView.chipGroup.size - 1 > data[position].arguments.size) {
holder.itemView.chipGroup.removeViewAt(data[position].arguments.size - 1)
while(holder.itemView.chipGroup.size - 1 > tab.arguments.size) {
holder.itemView.chipGroup.removeViewAt(tab.arguments.size)
}
holder.itemView.actionChip.setOnClickListener {
listener.onActionChipClicked(data[position])
listener.onActionChipClicked(tab, holder.adapterPosition)
}
} else {
@ -140,9 +140,7 @@ class TabAdapter(private var data: List<TabData>,
}
}
override fun getItemCount(): Int {
return data.size
}
override fun getItemCount() = data.size
fun setRemoveButtonVisible(enabled: Boolean) {
if (removeButtonEnabled != enabled) {

View File

@ -13,7 +13,7 @@
* You should have received a copy of the GNU General Public License along with Tusky; if not,
* see <http://www.gnu.org/licenses>. */
package com.keylesspalace.tusky.fragment.preference
package com.keylesspalace.tusky.components.preference
import android.content.Intent
import android.graphics.drawable.Drawable

View File

@ -0,0 +1,258 @@
package com.keylesspalace.tusky.components.preference
import android.app.AlarmManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Build
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.widget.*
import androidx.appcompat.app.AlertDialog
import androidx.preference.Preference
import androidx.preference.PreferenceManager
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.SplashActivity
import com.keylesspalace.tusky.util.EmojiCompatFont
import com.keylesspalace.tusky.util.EmojiCompatFont.Companion.FONTS
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import okhttp3.OkHttpClient
import kotlin.system.exitProcess
/**
* This Preference lets the user select their preferred emoji font
*/
class EmojiPreference(
context: Context,
private val okHttpClient: OkHttpClient
) : Preference(context) {
private lateinit var selected: EmojiCompatFont
private lateinit var original: EmojiCompatFont
private val radioButtons = mutableListOf<RadioButton>()
private var updated = false
private var currentNeedsUpdate = false
private val downloadDisposables = MutableList<Disposable?>(FONTS.size) { null }
override fun onAttachedToHierarchy(preferenceManager: PreferenceManager) {
super.onAttachedToHierarchy(preferenceManager)
// Find out which font is currently active
selected = EmojiCompatFont.byId(
PreferenceManager.getDefaultSharedPreferences(context).getInt(key, 0)
)
// We'll use this later to determine if anything has changed
original = selected
summary = selected.getDisplay(context)
}
override fun onClick() {
val view = LayoutInflater.from(context).inflate(R.layout.dialog_emojicompat, null)
viewIds.forEachIndexed { index, viewId ->
setupItem(view.findViewById(viewId), FONTS[index])
}
AlertDialog.Builder(context)
.setView(view)
.setPositiveButton(android.R.string.ok) { _, _ -> onDialogOk() }
.setNegativeButton(android.R.string.cancel, null)
.show()
}
private fun setupItem(container: View, font: EmojiCompatFont) {
val title: TextView = container.findViewById(R.id.emojicompat_name)
val caption: TextView = container.findViewById(R.id.emojicompat_caption)
val thumb: ImageView = container.findViewById(R.id.emojicompat_thumb)
val download: ImageButton = container.findViewById(R.id.emojicompat_download)
val cancel: ImageButton = container.findViewById(R.id.emojicompat_download_cancel)
val radio: RadioButton = container.findViewById(R.id.emojicompat_radio)
// Initialize all the views
title.text = font.getDisplay(container.context)
caption.setText(font.caption)
thumb.setImageResource(font.img)
// There needs to be a list of all the radio buttons in order to uncheck them when one is selected
radioButtons.add(radio)
updateItem(font, container)
// Set actions
download.setOnClickListener { startDownload(font, container) }
cancel.setOnClickListener { cancelDownload(font, container) }
radio.setOnClickListener { radioButton: View -> select(font, radioButton as RadioButton) }
container.setOnClickListener { containerView: View ->
select(font, containerView.findViewById(R.id.emojicompat_radio))
}
}
private fun startDownload(font: EmojiCompatFont, container: View) {
val download: ImageButton = container.findViewById(R.id.emojicompat_download)
val caption: TextView = container.findViewById(R.id.emojicompat_caption)
val progressBar: ProgressBar = container.findViewById(R.id.emojicompat_progress)
val cancel: ImageButton = container.findViewById(R.id.emojicompat_download_cancel)
// Switch to downloading style
download.visibility = View.GONE
caption.visibility = View.INVISIBLE
progressBar.visibility = View.VISIBLE
progressBar.progress = 0
cancel.visibility = View.VISIBLE
font.downloadFontFile(context, okHttpClient)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ progress ->
// The progress is returned as a float between 0 and 1, or -1 if it could not determined
if (progress >= 0) {
progressBar.isIndeterminate = false
val max = progressBar.max.toFloat()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
progressBar.setProgress((max * progress).toInt(), true)
} else {
progressBar.progress = (max * progress).toInt()
}
} else {
progressBar.isIndeterminate = true
}
},
{
Toast.makeText(context, R.string.download_failed, Toast.LENGTH_SHORT).show()
updateItem(font, container)
},
{
finishDownload(font, container)
}
).also { downloadDisposables[font.id] = it }
}
private fun cancelDownload(font: EmojiCompatFont, container: View) {
font.deleteDownloadedFile(container.context)
downloadDisposables[font.id]?.dispose()
downloadDisposables[font.id] = null
updateItem(font, container)
}
private fun finishDownload(font: EmojiCompatFont, container: View) {
select(font, container.findViewById(R.id.emojicompat_radio))
updateItem(font, container)
// Set the flag to restart the app (because an update has been downloaded)
if (selected === original && currentNeedsUpdate) {
updated = true
currentNeedsUpdate = false
}
}
/**
* Select a font both visually and logically
*
* @param font The font to be selected
* @param radio The radio button associated with it's visual item
*/
private fun select(font: EmojiCompatFont, radio: RadioButton) {
selected = font
// Uncheck all the other buttons
for (other in radioButtons) {
if (other !== radio) {
other.isChecked = false
}
}
radio.isChecked = true
}
/**
* Called when a "consistent" state is reached, i.e. it's not downloading the font
*
* @param font The font to be displayed
* @param container The ConstraintLayout containing the item
*/
private fun updateItem(font: EmojiCompatFont, container: View) {
// Assignments
val download: ImageButton = container.findViewById(R.id.emojicompat_download)
val caption: TextView = container.findViewById(R.id.emojicompat_caption)
val progress: ProgressBar = container.findViewById(R.id.emojicompat_progress)
val cancel: ImageButton = container.findViewById(R.id.emojicompat_download_cancel)
val radio: RadioButton = container.findViewById(R.id.emojicompat_radio)
// There's no download going on
progress.visibility = View.GONE
cancel.visibility = View.GONE
caption.visibility = View.VISIBLE
if (font.isDownloaded(context)) {
// Make it selectable
download.visibility = View.GONE
radio.visibility = View.VISIBLE
container.isClickable = true
} else {
// Make it downloadable
download.visibility = View.VISIBLE
radio.visibility = View.GONE
container.isClickable = false
}
// Select it if necessary
if (font === selected) {
radio.isChecked = true
// Update available
if (!font.isDownloaded(context)) {
currentNeedsUpdate = true
}
} else {
radio.isChecked = false
}
}
private fun saveSelectedFont() {
val index = selected.id
Log.i(TAG, "saveSelectedFont: Font ID: $index")
PreferenceManager
.getDefaultSharedPreferences(context)
.edit()
.putInt(key, index)
.apply()
summary = selected.getDisplay(context)
}
/**
* User clicked ok -> save the selected font and offer to restart the app if something changed
*/
private fun onDialogOk() {
saveSelectedFont()
if (selected !== original || updated) {
AlertDialog.Builder(context)
.setTitle(R.string.restart_required)
.setMessage(R.string.restart_emoji)
.setNegativeButton(R.string.later, null)
.setPositiveButton(R.string.restart) { _, _ ->
// Restart the app
// From https://stackoverflow.com/a/17166729/5070653
val launchIntent = Intent(context, SplashActivity::class.java)
val mPendingIntent = PendingIntent.getActivity(
context,
0x1f973, // This is the codepoint of the party face emoji :D
launchIntent,
PendingIntent.FLAG_CANCEL_CURRENT)
val mgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
mgr.set(
AlarmManager.RTC,
System.currentTimeMillis() + 100,
mPendingIntent)
exitProcess(0)
}.show()
}
}
companion object {
private const val TAG = "EmojiPreference"
// Please note that this array must sorted in the same way as the fonts.
private val viewIds = intArrayOf(
R.id.item_nomoji,
R.id.item_blobmoji,
R.id.item_twemoji,
R.id.item_notoemoji
)
}
}

View File

@ -13,7 +13,7 @@
* You should have received a copy of the GNU General Public License along with Tusky; if not,
* see <http://www.gnu.org/licenses>. */
package com.keylesspalace.tusky.fragment.preference
package com.keylesspalace.tusky.components.preference
import android.os.Bundle
import androidx.preference.PreferenceFragmentCompat

View File

@ -13,7 +13,7 @@
* You should have received a copy of the GNU General Public License along with Tusky; if not,
* see <http://www.gnu.org/licenses>. */
package com.keylesspalace.tusky
package com.keylesspalace.tusky.components.preference
import android.content.Context
import android.content.Intent
@ -23,9 +23,11 @@ import android.util.Log
import android.view.MenuItem
import androidx.fragment.app.Fragment
import androidx.preference.PreferenceManager
import com.keylesspalace.tusky.BaseActivity
import com.keylesspalace.tusky.MainActivity
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.appstore.EventHub
import com.keylesspalace.tusky.appstore.PreferenceChangedEvent
import com.keylesspalace.tusky.fragment.preference.*
import com.keylesspalace.tusky.settings.PrefKeys
import com.keylesspalace.tusky.util.ThemeUtils
import com.keylesspalace.tusky.util.getNonNullString

View File

@ -13,14 +13,14 @@
* You should have received a copy of the GNU General Public License along with Tusky; if not,
* see <http://www.gnu.org/licenses>. */
package com.keylesspalace.tusky.fragment.preference
package com.keylesspalace.tusky.components.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.di.Injectable
import com.keylesspalace.tusky.components.compose.ComposeActivity
import com.keylesspalace.tusky.components.compose.ComposeActivity.ComposeOptions
import com.keylesspalace.tusky.settings.*
@ -30,8 +30,13 @@ import com.mikepenz.iconics.IconicsDrawable
import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial
import com.mikepenz.iconics.utils.colorInt
import com.mikepenz.iconics.utils.sizePx
import okhttp3.OkHttpClient
import javax.inject.Inject
class PreferencesFragment : PreferenceFragmentCompat() {
class PreferencesFragment : PreferenceFragmentCompat(), Injectable {
@Inject
lateinit var okhttpclient: OkHttpClient
private val iconSize by lazy { resources.getDimensionPixelSize(R.dimen.preference_icon_size) }
private var httpProxyPref: Preference? = null
@ -53,7 +58,7 @@ class PreferencesFragment : PreferenceFragmentCompat() {
icon = makeIcon(GoogleMaterial.Icon.gmd_palette)
}
emojiPreference {
emojiPreference(okhttpclient) {
setDefaultValue("system_default")
setIcon(R.drawable.ic_emoji_24dp)
key = PrefKeys.EMOJI

View File

@ -13,7 +13,7 @@
* You should have received a copy of the GNU General Public License along with Tusky; if not,
* see <http://www.gnu.org/licenses>. */
package com.keylesspalace.tusky.fragment.preference
package com.keylesspalace.tusky.components.preference
import android.os.Bundle
import androidx.preference.PreferenceFragmentCompat

View File

@ -13,7 +13,7 @@
* You should have received a copy of the GNU General Public License along with Tusky; if not,
* see <http://www.gnu.org/licenses>. */
package com.keylesspalace.tusky.fragment.preference
package com.keylesspalace.tusky.components.preference
import android.os.Bundle
import androidx.preference.PreferenceFragmentCompat

View File

@ -18,6 +18,7 @@ package com.keylesspalace.tusky.di
import com.keylesspalace.tusky.*
import com.keylesspalace.tusky.components.compose.ComposeActivity
import com.keylesspalace.tusky.components.instancemute.InstanceListActivity
import com.keylesspalace.tusky.components.preference.PreferencesActivity
import com.keylesspalace.tusky.components.report.ReportActivity
import com.keylesspalace.tusky.components.scheduled.ScheduledTootActivity
import com.keylesspalace.tusky.components.search.SearchActivity

View File

@ -19,6 +19,9 @@ package com.keylesspalace.tusky.di
import com.keylesspalace.tusky.AccountsInListFragment
import com.keylesspalace.tusky.components.conversation.ConversationsFragment
import com.keylesspalace.tusky.components.instancemute.fragment.InstanceListFragment
import com.keylesspalace.tusky.components.preference.AccountPreferencesFragment
import com.keylesspalace.tusky.components.preference.NotificationPreferencesFragment
import com.keylesspalace.tusky.components.preference.PreferencesFragment
import com.keylesspalace.tusky.components.report.fragments.ReportDoneFragment
import com.keylesspalace.tusky.components.report.fragments.ReportNoteFragment
import com.keylesspalace.tusky.components.report.fragments.ReportStatusesFragment
@ -27,8 +30,6 @@ import com.keylesspalace.tusky.components.search.fragments.SearchHashtagsFragmen
import com.keylesspalace.tusky.components.search.fragments.SearchNotestockFragment
import com.keylesspalace.tusky.components.search.fragments.SearchStatusesFragment
import com.keylesspalace.tusky.fragment.*
import com.keylesspalace.tusky.fragment.preference.AccountPreferencesFragment
import com.keylesspalace.tusky.fragment.preference.NotificationPreferencesFragment
import dagger.Module
import dagger.android.ContributesAndroidInjector
@ -86,6 +87,9 @@ abstract class FragmentBuildersModule {
@ContributesAndroidInjector
abstract fun searchHashtagsFragment(): SearchHashtagsFragment
@ContributesAndroidInjector
abstract fun preferencesFragment(): PreferencesFragment
@ContributesAndroidInjector
abstract fun searchNotestockFragment(): SearchNotestockFragment

View File

@ -189,7 +189,7 @@ class ViewVideoFragment : ViewMediaFragment() {
mediaDescription.animate().alpha(alpha)
.setListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator) {
mediaDescription.visible(isDescriptionVisible)
mediaDescription?.visible(isDescriptionVisible)
animation.removeListener(this)
}
})

View File

@ -17,7 +17,7 @@ object PrefKeys {
// each preference a key for it to work.
const val APP_THEME = "appTheme"
const val EMOJI = "emojiCompat"
const val EMOJI = "selected_emoji_font"
const val FAB_HIDE = "fabHide"
const val LANGUAGE = "language"
const val STATUS_TEXT_SIZE = "statusTextSize"

View File

@ -3,7 +3,8 @@ package com.keylesspalace.tusky.settings
import android.content.Context
import androidx.annotation.StringRes
import androidx.preference.*
import com.keylesspalace.tusky.EmojiPreference
import com.keylesspalace.tusky.components.preference.EmojiPreference
import okhttp3.OkHttpClient
class PreferenceParent(
val context: Context,
@ -24,8 +25,8 @@ inline fun PreferenceParent.listPreference(builder: ListPreference.() -> Unit):
return pref
}
inline fun PreferenceParent.emojiPreference(builder: EmojiPreference.() -> Unit): EmojiPreference {
val pref = EmojiPreference(context)
inline fun PreferenceParent.emojiPreference(okHttpClient: OkHttpClient, builder: EmojiPreference.() -> Unit): EmojiPreference {
val pref = EmojiPreference(context, okHttpClient)
builder(pref)
addPref(pref)
return pref

View File

@ -1,564 +0,0 @@
package com.keylesspalace.tusky.util;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.util.Log;
import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import com.keylesspalace.tusky.R;
import java.io.EOFException;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import de.c1710.filemojicompat.FileEmojiCompatConfig;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
import okio.BufferedSink;
import okio.Okio;
import okio.Source;
/**
* This class bundles information about an emoji font as well as many convenient actions.
*/
public class EmojiCompatFont {
private static final String TAG = "EmojiCompatFont";
/**
* This String represents the sub-directory the fonts are stored in.
*/
private static final String DIRECTORY = "emoji";
// These are the items which are also present in the JSON files
private final String name, display, url;
// The thumbnail image and the caption are provided as resource ids
private final int img, caption;
// The version is stored as a String in the x.xx.xx format (to be able to compare versions)
private final String version;
private final int[] versionCode;
private AsyncTask fontDownloader;
// The system font gets some special behavior...
private static final EmojiCompatFont SYSTEM_DEFAULT =
new EmojiCompatFont("system-default",
"System Default",
R.string.caption_systememoji,
R.drawable.ic_emoji_34dp,
"",
"0");
private static final EmojiCompatFont BLOBMOJI =
new EmojiCompatFont("Blobmoji",
"Blobmoji",
R.string.caption_blobmoji,
R.drawable.ic_blobmoji,
"https://tusky.app/hosted/emoji/BlobmojiCompat.ttf",
"12.0.0"
);
private static final EmojiCompatFont TWEMOJI =
new EmojiCompatFont("Twemoji",
"Twemoji",
R.string.caption_twemoji,
R.drawable.ic_twemoji,
"https://tusky.app/hosted/emoji/TwemojiCompat.ttf",
"12.0.0"
);
private static final EmojiCompatFont NOTOEMOJI =
new EmojiCompatFont("NotoEmoji",
"Noto Emoji",
R.string.caption_notoemoji,
R.drawable.ic_notoemoji,
"https://tusky.app/hosted/emoji/NotoEmojiCompat.ttf",
"11.0.0"
);
/**
* This array stores all available EmojiCompat fonts.
* References to them can simply be saved by saving their indices
*/
public static final EmojiCompatFont[] FONTS = {SYSTEM_DEFAULT, BLOBMOJI, TWEMOJI, NOTOEMOJI};
// A list of all available font files and whether they are older than the current version or not
// They are ordered by there version codes in ascending order
private ArrayList<Pair<File, int[]>> existingFontFiles;
private EmojiCompatFont(String name,
String display,
int caption,
int img,
String url,
String version) {
this.name = name;
this.display = display;
this.caption = caption;
this.img = img;
this.url = url;
this.version = version;
this.versionCode = getVersionCode(version);
}
/**
* Returns the Emoji font associated with this ID
*
* @param id the ID of this font
* @return the corresponding font. Will default to SYSTEM_DEFAULT if not in range.
*/
public static EmojiCompatFont byId(int id) {
if (id >= 0 && id < FONTS.length) {
return FONTS[id];
} else {
return SYSTEM_DEFAULT;
}
}
public int getId() {
return Arrays.asList(FONTS).indexOf(this);
}
public String getName() {
return name;
}
public String getDisplay(Context context) {
return this != SYSTEM_DEFAULT ? display : context.getString(R.string.system_default);
}
public String getCaption(Context context) {
return context.getResources().getString(caption);
}
public String getUrl() {
return url;
}
public Drawable getThumb(Context context) {
return ContextCompat.getDrawable(context, img);
}
public String getVersion() {
return version;
}
public int[] getVersionCode() {
return versionCode;
}
/**
* This method will return the actual font file (regardless of its existence) for
* the current version (not necessarily the latest!).
*
* @return The font (TTF) file or null if called on SYSTEM_FONT
*/
@Nullable
private File getFont(Context context) {
if (this != SYSTEM_DEFAULT) {
File directory = new File(context.getExternalFilesDir(null), DIRECTORY);
return new File(directory, this.getName() + this.getVersion() + ".ttf");
} else {
return null;
}
}
public FileEmojiCompatConfig getConfig(Context context) {
return new FileEmojiCompatConfig(context, getLatestFontFile(context));
}
public boolean isDownloaded(Context context) {
// The existence of the current version is actually checked twice, although the first method should
// be much faster and more common.
return this == SYSTEM_DEFAULT || getFont(context) != null
&& (getFont(context).exists() || newerFileExists(context));
}
/**
* Checks whether there is already a font version that satisfies the current version, i.e. it
* has a higher or equal version code.
*
* @param context The Context
* @return Whether there is a font file with a higher or equal version code to the current
*/
private boolean newerFileExists(Context context) {
loadExistingFontFiles(context);
if (!existingFontFiles.isEmpty())
// The last file is already the newest one...
return compareVersions(existingFontFiles.get(existingFontFiles.size() - 1).second,
getVersionCode()) >= 0;
return false;
}
/**
* Downloads the TTF file for this font
*
* @param listeners The listeners which will be notified when the download has been finished
*/
public void downloadFont(Context context, Downloader.EmojiDownloadListener... listeners) {
if (this != SYSTEM_DEFAULT) {
// Additionally run a cleanup process after the download has been successful.
Downloader.EmojiDownloadListener cleanup = font -> deleteOldVersions(context);
List<Downloader.EmojiDownloadListener> allListeners
= new ArrayList<>(Arrays.asList(listeners));
allListeners.add(cleanup);
Downloader.EmojiDownloadListener[] allListenersA =
new Downloader.EmojiDownloadListener[allListeners.size()];
fontDownloader = new Downloader(
this,
allListeners.toArray(allListenersA))
.execute(getFont(context));
} else {
for (Downloader.EmojiDownloadListener listener : listeners) {
// The system emoji font is always downloaded...
listener.onDownloaded(this);
}
}
}
/**
* Deletes any older version of a font
*
* @param context The current Context
*/
private void deleteOldVersions(Context context) {
loadExistingFontFiles(context);
Log.d(TAG, "deleting old versions...");
Log.d(TAG, String.format("deleteOldVersions: Found %d other font files", existingFontFiles.size()));
for (Pair<File, int[]> fileExists : existingFontFiles) {
if (compareVersions(fileExists.second, getVersionCode()) < 0) {
File file = fileExists.first;
// Uses side effects!
Log.d(TAG, String.format("Deleted %s successfully: %s", file.getAbsolutePath(),
file.delete()));
}
}
}
private static final Comparator<Pair<File, int[]>> pairComparator = (o1, o2) -> compareVersions(o1.second, o2.second);
/**
* Loads all font files that are inside the files directory into an ArrayList with the information
* on whether they are older than the currently available version or not.
*
* @param context The Context
*/
private void loadExistingFontFiles(Context context) {
// Only load it once
if (this.existingFontFiles == null) {
// If we call this on the system default font, just return nothing...
if (this == SYSTEM_DEFAULT) {
existingFontFiles = new ArrayList<>(0);
}
File directory = new File(context.getExternalFilesDir(null), DIRECTORY);
// It will search for old versions using a regex that matches the font's name plus
// (if present) a version code. No version code will be regarded as version 0.
Pattern fontRegex = Pattern.compile(getName() + "(\\d+(\\.\\d+)*)?" + "\\.ttf");
FilenameFilter ttfFilter = (dir, name) -> name.endsWith(".ttf");
File[] existingFontFiles = directory.isDirectory() ? directory.listFiles(ttfFilter) : new File[0];
Log.d(TAG, String.format("loadExistingFontFiles: %d other font files found",
existingFontFiles.length));
// This is actually the upper bound
this.existingFontFiles = new ArrayList<>(existingFontFiles.length);
for (File file : existingFontFiles) {
Matcher matcher = fontRegex.matcher(file.getName());
if (matcher.matches()) {
String version = matcher.group(1);
int[] versionCode = getVersionCode(version);
Pair<File, int[]> entry = new Pair<>(file, versionCode);
// https://stackoverflow.com/a/51893026
// Insert it in a sorted way
int index = Collections.binarySearch(this.existingFontFiles, entry, pairComparator);
if (index < 0) {
index = -index - 1;
}
this.existingFontFiles.add(index, entry);
}
}
}
}
/**
* Returns the current or latest version of this font file (if there is any)
*
* @param context The Context
* @return The file for this font with the current or (if not existent) highest version code or null if there is no file for this font.
*/
private File getLatestFontFile(@NonNull Context context) {
File current = getFont(context);
if (current != null && current.exists())
return current;
loadExistingFontFiles(context);
try {
return existingFontFiles.get(existingFontFiles.size() - 1).first;
} catch (IndexOutOfBoundsException e) {
return getFont(context);
}
}
private @Nullable
int[] getVersionCode(@Nullable String version) {
if (version == null)
return null;
String[] versions = version.split("\\.");
int[] versionCodes = new int[versions.length];
for (int i = 0; i < versions.length; i++)
versionCodes[i] = parseInt(versions[i], 0);
return versionCodes;
}
/**
* A small helper method to convert a String to an int with a default value
*
* @param value The String to be parsed
* @param def The default value
* @return Either the String parsed to an int or - if this is not possible - the default value
*/
private int parseInt(@Nullable String value, int def) {
try {
return Integer.parseInt(value);
} catch (NumberFormatException | NullPointerException e) {
e.printStackTrace();
return def;
}
}
/**
* Compares two version codes to each other
*
* @param versionA The first version
* @param versionB The second version
* @return -1 if versionA < versionB, 1 if versionA > versionB and 0 otherwise
*/
private static int compareVersions(int[] versionA, int[] versionB) {
// This saves us much headache about handling a null version
if (versionA == null)
versionA = new int[]{0};
int len = Math.max(versionB.length, versionA.length);
int vA, vB;
// Compare the versions
for (int i = 0; i < len; i++) {
// Just to make sure there is something specified here
if (versionA.length > i) {
vA = versionA[i];
} else {
vA = 0;
}
if (versionB.length > i) {
vB = versionB[i];
} else {
vB = 0;
}
// It needs to be decided on the next level
if (vB == vA)
continue;
// Okay, is version B newer or version A?
return Integer.compare(vA, vB);
}
// The versions are equal
return 0;
}
/**
* Stops downloading the font. If no one started a font download, nothing happens.
*/
public void cancelDownload() {
if (fontDownloader != null) {
fontDownloader.cancel(false);
fontDownloader = null;
}
}
/**
* This class is used to easily manage the download of a font
*/
public static class Downloader extends AsyncTask<File, Float, File> {
// All interested objects/methods
private final EmojiDownloadListener[] listeners;
// The MIME-Type which might be unnecessary
private static final String MIME = "application/woff";
// The font belonging to this download
private final EmojiCompatFont font;
private static final String TAG = "Emoji-Font Downloader";
private static long CHUNK_SIZE = 4096;
private boolean failed = false;
Downloader(EmojiCompatFont font, EmojiDownloadListener... listeners) {
super();
this.listeners = listeners;
this.font = font;
}
@Override
protected File doInBackground(File... files) {
// Only download to one file...
File downloadFile = files[0];
try {
// It is possible (and very likely) that the file does not exist yet
if (!downloadFile.exists()) {
downloadFile.getParentFile().mkdirs();
downloadFile.createNewFile();
}
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(font.getUrl())
.addHeader("Content-Type", MIME)
.build();
Response response = client.newCall(request).execute();
BufferedSink sink = Okio.buffer(Okio.sink(downloadFile));
Source source = null;
try {
long size;
// Download!
if (response.body() != null
&& response.isSuccessful()
&& (size = networkResponseLength(response)) > 0) {
float progress = 0;
source = response.body().source();
try {
while (!isCancelled()) {
sink.write(response.body().source(), CHUNK_SIZE);
progress += CHUNK_SIZE;
publishProgress(progress / size);
}
} catch (EOFException ex) {
/*
This means we've finished downloading the file since sink.write
will throw an EOFException when the file to be read is empty.
*/
}
} else {
Log.e(TAG, "downloading " + font.getUrl() + " failed. No content to download.");
Log.e(TAG, "Status code: " + response.code());
failed = true;
}
} finally {
if (source != null) {
source.close();
}
sink.close();
// This 'if' uses side effects to delete the File.
if (isCancelled() && !downloadFile.delete()) {
Log.e(TAG, "Could not delete file " + downloadFile);
}
}
} catch (IOException ex) {
ex.printStackTrace();
failed = true;
}
return downloadFile;
}
@Override
public void onProgressUpdate(Float... progress) {
for (EmojiDownloadListener listener : listeners) {
listener.onProgress(progress[0]);
}
}
@Override
public void onPostExecute(File downloadedFile) {
if (!failed && downloadedFile.exists()) {
for (EmojiDownloadListener listener : listeners) {
listener.onDownloaded(font);
}
} else {
fail(downloadedFile);
}
}
private void fail(File failedFile) {
if (failedFile.exists() && !failedFile.delete()) {
Log.e(TAG, "Could not delete file " + failedFile);
}
for (EmojiDownloadListener listener : listeners) {
listener.onFailed();
}
}
/**
* This interfaced is used to get notified when a download has been finished
*/
public interface EmojiDownloadListener {
/**
* Called after successfully finishing a download.
*
* @param font The font related to this download. This will help identifying the download
*/
void onDownloaded(EmojiCompatFont font);
// TODO: Add functionality
/**
* Called when something went wrong with the download.
* This one won't be called when the download has been cancelled though.
*/
default void onFailed() {
// Oh no! D:
}
/**
* Called whenever the progress changed
*
* @param Progress A value between 0 and 1 representing the current progress
*/
default void onProgress(float Progress) {
// ARE WE THERE YET?
}
}
/**
* This method is needed because when transparent compression is used OkHttp reports
* {@link ResponseBody#contentLength()} as -1. We try to get the header which server sent
* us manually here.
*
* @see <a href="https://github.com/square/okhttp/issues/259">OkHttp issue 259</a>
*/
private long networkResponseLength(Response response) {
Response networkResponse = response.networkResponse();
if (networkResponse == null) {
// In case it's a fully cached response
ResponseBody body = response.body();
return body == null ? -1 : body.contentLength();
}
String header = networkResponse.header("Content-Length");
if (header == null) {
return -1;
}
try {
return Integer.parseInt(header);
} catch (NumberFormatException e) {
return -1;
}
}
}
@Override
@NonNull
public String toString() {
return display;
}
}

View File

@ -0,0 +1,351 @@
package com.keylesspalace.tusky.util
import android.content.Context
import android.util.Log
import android.util.Pair
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import androidx.annotation.VisibleForTesting
import com.keylesspalace.tusky.R
import de.c1710.filemojicompat.FileEmojiCompatConfig
import io.reactivex.Observable
import io.reactivex.ObservableEmitter
import io.reactivex.schedulers.Schedulers
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import okhttp3.ResponseBody
import okhttp3.internal.toLongOrDefault
import okio.Source
import okio.buffer
import okio.sink
import java.io.EOFException
import java.io.File
import java.io.FilenameFilter
import java.io.IOException
import kotlin.math.max
/**
* This class bundles information about an emoji font as well as many convenient actions.
*/
class EmojiCompatFont(
val name: String,
private val display: String,
@StringRes val caption: Int,
@DrawableRes val img: Int,
val url: String,
// The version is stored as a String in the x.xx.xx format (to be able to compare versions)
val version: String) {
private val versionCode = getVersionCode(version)
// A list of all available font files and whether they are older than the current version or not
// They are ordered by their version codes in ascending order
private var existingFontFileCache: List<Pair<File, List<Int>>>? = null
val id: Int
get() = FONTS.indexOf(this)
fun getDisplay(context: Context): String {
return if (this !== SYSTEM_DEFAULT) display else context.getString(R.string.system_default)
}
/**
* This method will return the actual font file (regardless of its existence) for
* the current version (not necessarily the latest!).
*
* @return The font (TTF) file or null if called on SYSTEM_FONT
*/
private fun getFontFile(context: Context): File? {
return if (this !== SYSTEM_DEFAULT) {
val directory = File(context.getExternalFilesDir(null), DIRECTORY)
File(directory, "$name$version.ttf")
} else {
null
}
}
fun getConfig(context: Context): FileEmojiCompatConfig {
return FileEmojiCompatConfig(context, getLatestFontFile(context))
}
fun isDownloaded(context: Context): Boolean {
return this === SYSTEM_DEFAULT || getFontFile(context)?.exists() == true || fontFileExists(context)
}
/**
* Checks whether there is already a font version that satisfies the current version, i.e. it
* has a higher or equal version code.
*
* @param context The Context
* @return Whether there is a font file with a higher or equal version code to the current
*/
private fun fontFileExists(context: Context): Boolean {
val existingFontFiles = getExistingFontFiles(context)
return if (existingFontFiles.isNotEmpty()) {
compareVersions(existingFontFiles.last().second, versionCode) >= 0
} else {
false
}
}
/**
* Deletes any older version of a font
*
* @param context The current Context
*/
private fun deleteOldVersions(context: Context) {
val existingFontFiles = getExistingFontFiles(context)
Log.d(TAG, "deleting old versions...")
Log.d(TAG, String.format("deleteOldVersions: Found %d other font files", existingFontFiles.size))
for (fileExists in existingFontFiles) {
if (compareVersions(fileExists.second, versionCode) < 0) {
val file = fileExists.first
// Uses side effects!
Log.d(TAG, String.format("Deleted %s successfully: %s", file.absolutePath,
file.delete()))
}
}
}
/**
* Loads all font files that are inside the files directory into an ArrayList with the information
* on whether they are older than the currently available version or not.
*
* @param context The Context
*/
private fun getExistingFontFiles(context: Context): List<Pair<File, List<Int>>> {
// Only load it once
existingFontFileCache?.let {
return it
}
// If we call this on the system default font, just return nothing...
if (this === SYSTEM_DEFAULT) {
existingFontFileCache = emptyList()
return emptyList()
}
val directory = File(context.getExternalFilesDir(null), DIRECTORY)
// It will search for old versions using a regex that matches the font's name plus
// (if present) a version code. No version code will be regarded as version 0.
val fontRegex = "$name(\\d+(\\.\\d+)*)?\\.ttf".toPattern()
val ttfFilter = FilenameFilter { _, name: String -> name.endsWith(".ttf") }
val foundFontFiles = directory.listFiles(ttfFilter).orEmpty()
Log.d(TAG, String.format("loadExistingFontFiles: %d other font files found",
foundFontFiles.size))
return foundFontFiles.map { file ->
val matcher = fontRegex.matcher(file.name)
val versionCode = if (matcher.matches()) {
val version = matcher.group(1)
getVersionCode(version)
} else {
listOf(0)
}
Pair(file, versionCode)
}.sortedWith(
Comparator<Pair<File, List<Int>>> { a, b -> compareVersions(a.second, b.second) }
).also {
existingFontFileCache = it
}
}
/**
* Returns the current or latest version of this font file (if there is any)
*
* @param context The Context
* @return The file for this font with the current or (if not existent) highest version code or null if there is no file for this font.
*/
private fun getLatestFontFile(context: Context): File? {
val current = getFontFile(context)
if (current != null && current.exists()) return current
val existingFontFiles = getExistingFontFiles(context)
return existingFontFiles.firstOrNull()?.first
}
private fun getVersionCode(version: String?): List<Int> {
if (version == null) return listOf(0)
return version.split(".").map {
it.toIntOrNull() ?: 0
}
}
fun downloadFontFile(context: Context,
okHttpClient: OkHttpClient): Observable<Float> {
return Observable.create { emitter: ObservableEmitter<Float> ->
// It is possible (and very likely) that the file does not exist yet
val downloadFile = getFontFile(context)!!
if (!downloadFile.exists()) {
downloadFile.parentFile?.mkdirs()
downloadFile.createNewFile()
}
val request = Request.Builder().url(url)
.build()
val sink = downloadFile.sink().buffer()
var source: Source? = null
try {
// Download!
val response = okHttpClient.newCall(request).execute()
val responseBody = response.body
if (response.isSuccessful && responseBody != null) {
val size = response.length()
var progress = 0f
source = responseBody.source()
try {
while (!emitter.isDisposed) {
sink.write(source, CHUNK_SIZE)
progress += CHUNK_SIZE.toFloat()
if(size > 0) {
emitter.onNext(progress / size)
} else {
emitter.onNext(-1f)
}
}
} catch (ex: EOFException) {
/*
This means we've finished downloading the file since sink.write
will throw an EOFException when the file to be read is empty.
*/
}
} else {
Log.e(TAG, "Downloading $url failed. Status code: ${response.code}")
emitter.tryOnError(Exception())
}
} catch (ex: IOException) {
Log.e(TAG, "Downloading $url failed.", ex)
downloadFile.deleteIfExists()
emitter.tryOnError(ex)
} finally {
source?.close()
sink.close()
if (emitter.isDisposed) {
downloadFile.deleteIfExists()
} else {
deleteOldVersions(context)
emitter.onComplete()
}
}
}
.subscribeOn(Schedulers.io())
}
/**
* Deletes the downloaded file, if it exists. Should be called when a download gets cancelled.
*/
fun deleteDownloadedFile(context: Context) {
getFontFile(context)?.deleteIfExists()
}
override fun toString(): String {
return display
}
companion object {
private const val TAG = "EmojiCompatFont"
/**
* This String represents the sub-directory the fonts are stored in.
*/
private const val DIRECTORY = "emoji"
private const val CHUNK_SIZE = 4096L
// The system font gets some special behavior...
private val SYSTEM_DEFAULT = EmojiCompatFont("system-default",
"System Default",
R.string.caption_systememoji,
R.drawable.ic_emoji_34dp,
"",
"0")
private val BLOBMOJI = EmojiCompatFont("Blobmoji",
"Blobmoji",
R.string.caption_blobmoji,
R.drawable.ic_blobmoji,
"https://tusky.app/hosted/emoji/BlobmojiCompat.ttf",
"12.0.0"
)
private val TWEMOJI = EmojiCompatFont("Twemoji",
"Twemoji",
R.string.caption_twemoji,
R.drawable.ic_twemoji,
"https://tusky.app/hosted/emoji/TwemojiCompat.ttf",
"12.0.0"
)
private val NOTOEMOJI = EmojiCompatFont("NotoEmoji",
"Noto Emoji",
R.string.caption_notoemoji,
R.drawable.ic_notoemoji,
"https://tusky.app/hosted/emoji/NotoEmojiCompat.ttf",
"11.0.0"
)
/**
* This array stores all available EmojiCompat fonts.
* References to them can simply be saved by saving their indices
*/
val FONTS = listOf(SYSTEM_DEFAULT, BLOBMOJI, TWEMOJI, NOTOEMOJI)
/**
* Returns the Emoji font associated with this ID
*
* @param id the ID of this font
* @return the corresponding font. Will default to SYSTEM_DEFAULT if not in range.
*/
fun byId(id: Int): EmojiCompatFont = FONTS.getOrElse(id) { SYSTEM_DEFAULT }
/**
* Compares two version codes to each other
*
* @param versionA The first version
* @param versionB The second version
* @return -1 if versionA < versionB, 1 if versionA > versionB and 0 otherwise
*/
@VisibleForTesting
fun compareVersions(versionA: List<Int>, versionB: List<Int>): Int {
val len = max(versionB.size, versionA.size)
for (i in 0 until len) {
val vA = versionA.getOrElse(i) { 0 }
val vB = versionB.getOrElse(i) { 0 }
// It needs to be decided on the next level
if (vA == vB) continue
// Okay, is version B newer or version A?
return vA.compareTo(vB)
}
// The versions are equal
return 0
}
/**
* This method is needed because when transparent compression is used OkHttp reports
* [ResponseBody.contentLength] as -1. We try to get the header which server sent
* us manually here.
*
* @see [OkHttp issue 259](https://github.com/square/okhttp/issues/259)
*/
private fun Response.length(): Long {
networkResponse?.let {
val header = it.header("Content-Length") ?: return -1
return header.toLongOrDefault(-1)
}
// In case it's a fully cached response
return body?.contentLength() ?: -1
}
private fun File.deleteIfExists() {
if(exists() && !delete()) {
Log.e(TAG, "Could not delete file $this")
}
}
}
}

View File

@ -5,7 +5,7 @@
android:id="@+id/activity_view_thread"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.keylesspalace.tusky.PreferencesActivity">
tools:context="com.keylesspalace.tusky.components.preference.PreferencesActivity">
<include layout="@layout/toolbar_basic" />

View File

@ -1,33 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingTop="16dp">
<LinearLayout
android:id="@+id/emoji_font_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintTop_toTopOf="parent">
<include
android:id="@+id/item_blobmoji"
layout="@layout/item_emoji_pref" />
<include
android:id="@+id/item_blobmoji"
layout="@layout/item_emoji_pref" />
<include
android:id="@+id/item_twemoji"
layout="@layout/item_emoji_pref" />
<include
android:id="@+id/item_twemoji"
layout="@layout/item_emoji_pref" />
<include
android:id="@+id/item_notoemoji"
layout="@layout/item_emoji_pref" />
<include
android:id="@+id/item_notoemoji"
layout="@layout/item_emoji_pref" />
<include
android:id="@+id/item_nomoji"
layout="@layout/item_emoji_pref" />
</LinearLayout>
<include
android:id="@+id/item_nomoji"
layout="@layout/item_emoji_pref" />
<TextView
android:id="@+id/emoji_download_label"
@ -39,9 +31,6 @@
android:paddingEnd="24dp"
android:paddingBottom="8dp"
android:text="@string/download_fonts"
android:textColor="?android:attr/textColorSecondary"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/emoji_font_list" />
android:textColor="?android:attr/textColorSecondary" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>

View File

@ -10,7 +10,7 @@
<string name="action_close">ⵎⴷⴻⵍ</string>
<string name="error_generic">ⵝⴻⵍⵍⴰ ⴷ ⵝⵓⵛⴹⴰ.</string>
<string name="title_lists">ⵝⴰⴲⴸⴰⵔⵉⵏ</string>
<string name="action_lists">ⴲⴸⴰⵔⵉⵏ</string>
<string name="action_lists">ⴲⴸⴰⵔⵉⵏ</string>
<string name="about_title_activity">ⵖⴻⴼ</string>
<string name="action_reset_schedule">ⵡⴻⵏⵏⴻⵣ ⵝⵉⴽⴻⵍⵜ ⵏⵏⵉⴸⴻⵏ</string>
<string name="action_search">ⵏⴰⴸⵉ</string>
@ -22,12 +22,22 @@
<string name="button_continue">ⴽⴻⵎⵎⴻⵍ</string>
<string name="filter_dialog_update_button">ⵍⵇⴻⵎ</string>
<string name="filter_dialog_remove_button">ⴽⴽⴻⵙ</string>
<string name="action_send_public">ⵊⴻⵡⵡⴻⵇ</string>
<string name="action_send_public">ⵊⴻⵡⵡⴻⵇ!</string>
<string name="action_send">ⵊⴻⵡⵡⴻⵇ</string>
<string name="action_login">ⵇⵇⴻⵏ ⵖⴻⵔ ⵎⴰⵚⵟⵓⴷⵓⵏ</string>
<string name="link_whats_an_instance"> ⴰⵛⵓ ⵓ ⵜⵙⵓⵎⵎⴰⵏⵜ\?</string>
<string name="link_whats_an_instance"> ⴰⵛⵓ ⵓ ⵜⵜⵓⵎⵎⴰⵏⵜ\?</string>
<string name="notification_favourite_name">ⵉⵙⵎⴻⵏⵢⵉⴼⴻⵏ</string>
<string name="action_remove">ⴽⴽⴻⵙ</string>
<string name="action_access_saved_toot">ⵉⵔⴻⵡⵡⴰⵢⴻⵏ</string>
<string name="title_blocks">ⵉⵎⵙⴻⵇⴷⴰⵛⴻⵏ ⵜⵙⵡⴰⵃⵍⴻⵎ</string>
<string name="pref_title_status_tabs">ⵉⵛⵛⴰⵔⴻⵏ</string>
<string name="hint_domain">ⴰⵏⵜⴰ ⵝⵓⵎⵎⴰⵏⵜ\?</string>
<string name="add_account_description">ⵔⵏⵓ ⵢⵉⵡⴻⵏ ⵓⵎⵉⴹⴰⵏ ⴰⵎⴰⵢⵏⵓⵝ ⵎⴰⵚⵟⵓⴷⵓⵏ</string>
<string name="add_account_name">ⵔⵏⵓ ⴰⵎⵉⴹⴰⵏ</string>
<string name="hint_compose">ⴸⴰⵛⵓ ⵉⴳⴻⵍⵍⴰⵏ ⴰⵎⴰⵢⵏⵓⵝ\?</string>
<string name="action_schedule_toot">ⵙⵖⵉⵡⴻⵙ ⵝⵉⵊⴻⵡⵡⵉⵇⵝⴰ</string>
<string name="action_access_scheduled_toot">ⵝⵉⵊⴻⵡⵡⵉⵇⵉⵏ ⵢⴻⵜⵜⵖⴰⵙⵖⴰⵡⵙⴻⵏ</string>
<string name="title_scheduled_toot">ⵝⵉⵊⴻⵡⵡⵉⵇⵉⵏ ⵢⴻⵜⵜⵖⴰⵙⵖⴰⵡⵙⴻⵏ</string>
<string name="title_bookmarks">ⵝⵉⵛⵔⴰⴹ</string>
<string name="action_view_bookmarks">ⵝⵉⵛⵔⴰⴹ</string>
</resources>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="conversation_1_recipients">%1$s</string>
<string name="abbreviated_seconds_ago">%ds</string>
<string name="abbreviated_seconds_ago">%dসে</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>

View File

@ -470,4 +470,5 @@
<string name="no_scheduled_status">তোমার কোনো সময়সূচীত স্ট্যাটাস নেই।</string>
<string name="no_saved_status">তোমার কোনো খসড়া নেই।</string>
<string name="warning_scheduling_interval">মাস্টোডনের সর্বনিম্ন ৫ মিনিটের সময়সূচীর বিরতি আছে।</string>
<string name="pref_title_hide_top_toolbar">শীর্ষস্থানীয় সরঞ্জামদণ্ডের শিরোনামটি লুকান</string>
</resources>

View File

@ -330,12 +330,12 @@
<string name="pref_title_absolute_time">Utilitzar el temps absolut</string>
<string name="label_remote_account">La informació de sota pot mostrar el perfil incomplert de l\'usuari. Clica per obrir el perfil complert al navegador.</string>
<plurals name="favs">
<item quantity="one"></item>
<item quantity="other"></item>
<item quantity="one"><b>%1$s</b> Favorit</item>
<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">Impulsat per</string>
<string name="title_favourited_by">Marcat favorit per</string>

View File

@ -332,7 +332,7 @@
<plurals name="favs">
<item quantity="one"><b>%1$s</b> oblíbení</item>
<item quantity="few"><b>%1$s</b> oblíbení</item>
<item quantity="other"><b>%1$s</b> oblíbení</item>
<item quantity="other"/>
</plurals>
<plurals name="reblogs">
<item quantity="one"><b>%s</b> boost</item>
@ -388,24 +388,24 @@
<string name="poll_ended_voted">Anketa, ve které jste hlasoval/a, skončila</string>
<string name="poll_ended_created">Anketa, kterou jste vytvořil/a, skončila</string>
<plurals name="poll_timespan_days">
<item quantity="one"/>
<item quantity="few"/>
<item quantity="other"/>
<item quantity="one">%d den</item>
<item quantity="few">%d dny</item>
<item quantity="other">%d dní</item>
</plurals>
<plurals name="poll_timespan_hours">
<item quantity="one"/>
<item quantity="few"/>
<item quantity="other"/>
<item quantity="one"></item>
<item quantity="few"></item>
<item quantity="other"></item>
</plurals>
<plurals name="poll_timespan_minutes">
<item quantity="one">%d minuta</item>
<item quantity="few">%d minut</item>
<item quantity="other"/>
<item quantity="few">%d minuty</item>
<item quantity="other">%d minut</item>
</plurals>
<plurals name="poll_timespan_seconds">
<item quantity="one"/>
<item quantity="few"/>
<item quantity="other"/>
<item quantity="one">%d sekunda</item>
<item quantity="few">%d sekundy</item>
<item quantity="other">%d sekund</item>
</plurals>
<string name="pref_title_animate_gif_avatars">Animovat avatary GIF</string>
<string name="description_poll">Anketa s volbami: %1$s, %2$s, %3$s, %4$s; %5$s</string>
@ -482,9 +482,9 @@
<string name="action_unmute_desc">Odkrýt %s</string>
<string name="dialog_mute_warning">Ztišit @%s\?</string>
<plurals name="poll_info_people">
<item quantity="one">%s osoba</item>
<item quantity="few">%s osoby</item>
<item quantity="other">%s osob</item>
<item quantity="one"/>
<item quantity="few"/>
<item quantity="other"/>
</plurals>
<string name="notification_follow_request_format">%s požádal/a aby vás mohl/a sledovat</string>
<string name="pref_title_confirm_reblogs">Zobrazit dialogové okno s potvrzením při boostování</string>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="error_generic">Ein Fehler ist aufgetreten.</string>
<string name="error_network">Ein Netzwerkfehler ist aufgetreten! Bitte überprüfen deine Internetverbindung und versuche es erneut!</string>
<string name="error_network">Ein Netzwerkfehler ist aufgetreten! Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut!</string>
<string name="error_empty">Dies darf nicht leer sein.</string>
<string name="error_invalid_domain">Ungültige Domain angegeben</string>
<string name="error_failed_app_registration">Authentifizieren mit dieser Instanz fehlgeschlagen.</string>
@ -10,7 +10,7 @@
<string name="error_authorization_denied">Autorisierung fehlgeschlagen.</string>
<string name="error_retrieving_oauth_token">Es konnte kein Login-Token abgerufen werden.</string>
<string name="error_compose_character_limit">Der Beitrag ist zu lang!</string>
<string name="error_image_upload_size">Die Datei muss kleiner als 8MB sein.</string>
<string name="error_image_upload_size">Die Datei muss kleiner als 8 MB sein.</string>
<string name="error_video_upload_size">Videodateien müssen kleiner als 40 MB sein.</string>
<string name="error_media_upload_type">Dieser Dateityp darf nicht hochgeladen werden.</string>
<string name="error_media_upload_opening">Die Datei konnte nicht geöffnet werden.</string>
@ -18,7 +18,7 @@
<string name="error_media_download_permission">Eine Berechtigung wird zum Speichern des Mediums benötigt.</string>
<string name="error_media_upload_image_or_video">Bilder und Videos können nicht beide gleichzeitig an einen Beitrag angehängt werden.</string>
<string name="error_media_upload_sending">Die Mediendatei konnte nicht hochgeladen werden.</string>
<string name="error_sender_account_gone">Fehler beim Senden des Status</string>
<string name="error_sender_account_gone">Fehler beim Senden des Beitrags.</string>
<string name="title_home">Start</string>
<string name="title_notifications">Benachrichtigungen</string>
<string name="title_public_local">Lokal</string>
@ -36,7 +36,7 @@
<string name="title_blocks">Blockierte Profile</string>
<string name="title_follow_requests">Folgeanfragen</string>
<string name="title_edit_profile">Dein Profil bearbeiten</string>
<string name="title_saved_toot">Gespeicherte Beiträge</string>
<string name="title_saved_toot">Entwürfe</string>
<string name="title_licenses">Lizenzen</string>
<string name="status_username_format">\@%s</string>
<string name="status_boosted_format">%s teilte</string>
@ -59,7 +59,7 @@
<string name="action_reblog">Teilen</string>
<string name="action_unreblog">Boost entfernen</string>
<string name="action_favourite">Favorisieren</string>
<string name="action_unfavourite">Favoriten entfernen</string>
<string name="action_unfavourite">Favorisierung entfernen</string>
<string name="action_more">Mehr</string>
<string name="action_compose">Beitrag erstellen</string>
<string name="action_login">Anmelden mit Mastodon</string>
@ -92,7 +92,7 @@
<string name="action_mute">Stummschalten</string>
<string name="action_unmute">Lautschalten</string>
<string name="action_mention">Erwähnen</string>
<string name="action_hide_media">Verstecke Medien</string>
<string name="action_hide_media">Medien verstecken</string>
<string name="action_open_drawer">Drawer öffnen</string>
<string name="action_save">Speichern</string>
<string name="action_edit_profile">Profil bearbeiten</string>
@ -149,7 +149,7 @@
\n\nWeitere Informationen gibt es auf <a href="https://joinmastodon.org">joinmastodon.org</a>.
</string>
<string name="dialog_title_finishing_media_upload">Stelle Medienupload fertig</string>
<string name="dialog_message_uploading_media">Lade hoch…</string>
<string name="dialog_message_uploading_media">Lade hoch </string>
<string name="dialog_download_image">Herunterladen</string>
<string name="dialog_message_cancel_follow_request">Folgeanfrage zurückziehen?</string>
<string name="dialog_unfollow_warning">Willst du diesem Profil wirklich nicht mehr folgen?</string>
@ -159,7 +159,7 @@
<string name="visibility_private">Nur Folgende: Nur für Folgende sichtbar</string>
<string name="visibility_direct">Direkt: Nur für Erwähnte sichtbar</string>
<string name="pref_title_edit_notification_settings">Benachrichtigungen</string>
<string name="pref_title_notifications_enabled">Benachrichtigungseinstellungen</string>
<string name="pref_title_notifications_enabled">Benachrichtigungen</string>
<string name="pref_title_notification_alerts">Benachrichtigungen</string>
<string name="pref_title_notification_alert_sound">Benachrichtige mit Sound</string>
<string name="pref_title_notification_alert_vibrate">Benachrichtige mit Vibration</string>
@ -197,7 +197,7 @@
<string name="pref_publishing">Beiträge</string>
<string name="pref_failed_to_sync">Fehler beim Synchronisieren</string>
<string name="post_privacy_public">Öffentlich</string>
<string name="post_privacy_unlisted">Ungelistet</string>
<string name="post_privacy_unlisted">Nicht gelistet</string>
<string name="post_privacy_followers_only">Nur Folgende</string>
<string name="pref_status_text_size">Schriftgröße</string>
<string name="status_text_size_smallest">Kleiner</string>
@ -208,10 +208,10 @@
<string name="notification_mention_name">Neue Erwähnungen</string>
<string name="notification_mention_descriptions">Benachrichtigungen über neue Erwähnungen</string>
<string name="notification_follow_name">Neue Folgende</string>
<string name="notification_follow_description">Benachrichtigungen über neue Folgende</string>
<string name="notification_follow_description">Benachrichtigunen über neue Folgende</string>
<string name="notification_boost_name">Geteilte Beiträge</string>
<string name="notification_boost_description">Benachrichtigungen wenn deine Beiträge geteilt werden</string>
<string name="notification_favourite_name">Favoriten</string>
<string name="notification_favourite_name">Favorisierte Beiträge</string>
<string name="notification_favourite_description">Benachrichtigungen wenn deine Beiträge favorisiert werden</string>
<string name="notification_mention_format">%s hat dich erwähnt</string>
<string name="notification_summary_large">%1$s, %2$s, %3$s und %4$d andere</string>
@ -227,7 +227,7 @@
to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html
* the url can be changed to link to the localized version of the license.
-->
<string name="about_project_site">Webseite des Projekts:
<string name="about_project_site">Website des Projekts:
\n https://accelf.net/yuito</string>
<string name="about_bug_feature_request_site"> Fehlermeldungen &amp; Verbesserungsvorschläge:\n
https://github.com/accelforce/Yuito/issues
@ -286,10 +286,10 @@
<string name="later">Später</string>
<string name="restart">Neustarten</string>
<string name="caption_systememoji">Die Standard-Emojis deines Geräts</string>
<string name="caption_blobmoji">Die Blob-Emojis aus Android 4.4-7.1</string>
<string name="caption_blobmoji">Die BlobEmojis aus Android 4.47.1</string>
<string name="caption_twemoji">Die Standard-Emojis von Mastodon</string>
<string name="caption_notoemoji">Die aktuellen Emojis von Google</string>
<string name="download_failed">Download fehlgeschlagen</string>
<string name="download_failed">Download fehlgeschlagen.</string>
<string name="profile_badge_bot_text">Bot</string>
<string name="account_moved_description">%1$s ist umgezogen auf:</string>
<string name="reblog_private">An ursprüngliches Publikum teilen</string>
@ -359,7 +359,7 @@
<string name="poll_info_closed">Geschlossen</string>
<string name="poll_vote">Abstimmen</string>
<string name="poll_ended_voted">Eine Umfrage in der du abgestimmt hast ist vorbei</string>
<string name="poll_ended_created">Eine Umfrage, die du erstellt hast, ist vorbei</string>
<string name="poll_ended_created">Eine Umfrage die du erstellt hast ist vorbei</string>
<plurals name="poll_timespan_days">
<item quantity="one">%d Tag</item>
<item quantity="other">%d Tage</item>
@ -381,7 +381,7 @@
<string name="action_mute_domain">%s verstecken</string>
<string name="confirmation_domain_unmuted">%s nicht mehr versteckt</string>
<string name="mute_domain_warning">Bist du dir sicher, dass du die Domain %s blockieren willst\? Nach der Blockierung wirst du nichts mehr von dieser Domain in öffentlichen Zeitleisten oder Benachrichtigungen sehen. Deine Follower von dieser Domain werden entfernt.</string>
<string name="mute_domain_warning_dialog_ok">ganze Domain verbergen</string>
<string name="mute_domain_warning_dialog_ok">Ganze Domain verbergen</string>
<string name="pref_title_animate_gif_avatars">GIF-Avatare animieren</string>
<string name="filter_dialog_whole_word">Ganzes Wort</string>
<string name="filter_dialog_whole_word_description">Wenn das Schlagwort nur aus Buchstaben und Zahlen besteht, wird es nur angewendet, wenn es dem ganzen Wort entspricht</string>
@ -404,7 +404,7 @@
<string name="poll_duration_3_days">3 Tage</string>
<string name="poll_duration_7_days">7 Tage</string>
<string name="edit_poll">Editieren</string>
<string name="about_tusky_version">Tusky %s</string>
<string name="about_tusky_version">test %s</string>
<string name="action_add_poll">Umfrage hinzufügen</string>
<string name="pref_title_alway_open_spoiler">Beiträge mit Inhaltswarnungen immer ausklappen</string>
<string name="description_poll">Umfrage mit den Möglichkeiten: %1$s, %2$s, %3$s, %4$s; %5$s</string>
@ -420,7 +420,7 @@
<string name="action_access_scheduled_toot">Geplante Beiträge</string>
<string name="action_schedule_toot">Plane Beitrag</string>
<string name="action_reset_schedule">Zurücksetzen</string>
<string name="error_audio_upload_size">Audiodateien müssen kleiner als 40MB sein.</string>
<string name="error_audio_upload_size">Audiodateien müssen kleiner als 40 MB sein.</string>
<string name="title_bookmarks">Lesezeichen</string>
<string name="action_bookmark">Lesezeichen</string>
<string name="action_view_bookmarks">Lesezeichen</string>
@ -452,7 +452,7 @@
<string name="pref_title_gradient_for_media">Farbverlauf für versteckte Medien anzeigen</string>
<string name="pref_main_nav_position_option_bottom">Unten</string>
<string name="pref_main_nav_position_option_top">Oben</string>
<string name="action_unmute_domain">Ton einschalten %s</string>
<string name="action_unmute_domain">%s nicht mehr verstecken</string>
<plurals name="reblogs">
<item quantity="one"><b>%s</b> Boost</item>
<item quantity="other"><b>%s</b> Boosts</item>
@ -461,5 +461,9 @@
<string name="dialog_mute_hide_notifications">Benachrichtigungen ausblenden</string>
<string name="action_mute_notifications_desc">Benachrichtigungen stummschalten von %s</string>
<string name="action_unmute_notifications_desc">Benachrichtigungs-Ton einschalten von %s</string>
<string name="action_unmute_desc">Ton einschalten %s</string>
<string name="action_unmute_desc">%s nicht mehr verstecken</string>
<string name="abbreviated_seconds_ago">%dSek.</string>
<string name="abbreviated_hours_ago">%dSt.</string>
<string name="abbreviated_in_days">in %d T.</string>
<string name="abbreviated_years_ago">%dJ.</string>
</resources>

View File

@ -16,7 +16,7 @@
<string name="error_media_upload_opening">No pudo abrirse el fichero.</string>
<string name="error_media_upload_permission">Se requiere permiso para acceder al almacenamiento.</string>
<string name="error_media_download_permission">Se requiere permiso para descargar al almacenamiento.</string>
<string name="error_media_upload_image_or_video">No se pueden adjuntar imágenes y vídeos en el mismo estado</string>
<string name="error_media_upload_image_or_video">No se pueden adjuntar imágenes y vídeos en el mismo estado.</string>
<string name="error_media_upload_sending">La subida falló.</string>
<string name="error_sender_account_gone">Error al publicar.</string>
<string name="title_home">Inicio</string>
@ -330,8 +330,8 @@
<string name="pref_title_bot_overlay">Mostrar indicador de bots</string>
<string name="poll_vote">Votar</string>
<plurals name="poll_timespan_days">
<item quantity="one"/>
<item quantity="other"/>
<item quantity="one">%d día</item>
<item quantity="other">%d días</item>
</plurals>
<plurals name="poll_timespan_hours">
<item quantity="one"/>

View File

@ -383,8 +383,8 @@
<string name="compose_preview_image_description">%s irudiarentzako ekintzak</string>
<string name="poll_info_format"> <!-- 15 boto • Ordu 1 geratzen da --> %1$s • %2$s</string>
<plurals name="poll_info_votes">
<item quantity="one"/>
<item quantity="other"/>
<item quantity="one">Boto %s</item>
<item quantity="other">%s Boto</item>
</plurals>
<string name="poll_info_time_absolute">%s amaitzen da</string>
<string name="poll_info_closed">Itxita</string>
@ -400,8 +400,8 @@
<item quantity="other">%d ordu</item>
</plurals>
<plurals name="poll_timespan_minutes">
<item quantity="one">Minutu %d</item>
<item quantity="other">%d minutu</item>
<item quantity="one"/>
<item quantity="other"/>
</plurals>
<plurals name="poll_timespan_seconds">
<item quantity="one">Segundu %d</item>
@ -456,7 +456,7 @@
<string name="dialog_mute_hide_notifications">Ez erakutsi jakinarazpenak</string>
<string name="action_unmute_desc">Desmututu %s</string>
<plurals name="poll_info_people">
<item quantity="one">Pertsona %s</item>
<item quantity="other">%s pertsona</item>
<item quantity="one"/>
<item quantity="other"/>
</plurals>
</resources>

View File

@ -1,57 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="error_generic">خطایی رخ داد</string>
<string name="error_generic">خطایی رخ داد.</string>
<string name="error_empty">این نمی‌تواند خالی باشد.</string>
<string name="error_invalid_domain">دامنه وارد شده نامعتبر است</string>
<string name="error_failed_app_registration">اهراز هویت با نمونه شکست خورد.</string>
<string name="error_no_web_browser_found">مرورگری برای استفاده یافت نشد</string>
<string name="error_authorization_unknown">خطای احراز هویت ناشناس رخ داده است.</string>
<string name="error_authorization_denied">هویت احراز نشد</string>
<string name="error_retrieving_oauth_token">دریافت توکن ورود ناموفق بود</string>
<string name="error_invalid_domain">دامنهٔ نامعتبر وارد شده</string>
<string name="error_failed_app_registration">احراز هویت با این نمونه شکست خورد.</string>
<string name="error_no_web_browser_found">مرورگری برای استفاده پیدا نشد.</string>
<string name="error_authorization_unknown">خطای احراز هویت ناشناخته‌ای رخ داد.</string>
<string name="error_authorization_denied">احراز هویت رد شد.</string>
<string name="error_retrieving_oauth_token">دریافت ژتون ورود شکست خورد.</string>
<string name="error_compose_character_limit">وضعیت خیلی طولانی است!</string>
<string name="error_image_upload_size">پرونده باید کمتر از ۸ مگابایت باشد</string>
<string name="error_image_upload_size">پرونده باید کمتر از ۸ مگابایت باشد.</string>
<string name="error_video_upload_size">پرونده ویدئویی باید کمتر از ۴۰ مگابایت باشد.</string>
<string name="error_media_upload_type">این نوع از پرونده نمی‌تواند بارگذاری شود</string>
<string name="error_media_upload_opening">پرونده باز نشد</string>
<string name="error_media_upload_permission">مجوز برای خواندن رسانه نیاز است</string>
<string name="error_media_upload_type">این گونهٔ پرونده نمی‌تواند بارگذاری شود.</string>
<string name="error_media_upload_opening">این پرونده نتوانست گشوده شود.</string>
<string name="error_media_upload_permission">نیاز به اجازهٔ خواندن رسانه است.</string>
<string name="error_media_download_permission">نیاز به اجازهٔ ذخیرهٔ رسانه است.</string>
<string name="error_media_upload_image_or_video">تصاویر و فیلم‌ها هر دو نمی‌توانند به یک وضعیت ضمیمه شوند.</string>
<string name="error_media_upload_sending">بارگذاری ناموفق بود</string>
<string name="error_sender_account_gone">خطا در ارسال بوق</string>
<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_public_local">محلی</string>
<string name="title_notifications">آگاهیها</string>
<string name="title_public_local">محلّی</string>
<string name="title_public_federated">همگانی</string>
<string name="title_view_thread">بوق</string>
<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_favourites">پسندها</string>
<string name="title_mutes">کاربرهای بی‌صدا</string>
<string name="title_blocks">کاربرهای مسدود شده</string>
<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_favourites">برگزیده‌ها</string>
<string name="title_mutes">کاربران خموش</string>
<string name="title_blocks">کاربران مسدود</string>
<string name="title_follow_requests">درخواست‌های پی‌گیری</string>
<string name="title_edit_profile">ویرایش نمایه‌تان</string>
<string name="title_saved_toot">پیش‌نویس</string>
<string name="title_licenses">مجوزها</string>
<string name="status_boosted_format">%s تقویت شد</string>
<string name="title_saved_toot">پیش‌نویسها</string>
<string name="title_licenses">پروانه‌ها</string>
<string name="status_boosted_format">%s تقویت کرد</string>
<string name="status_sensitive_media_title">محتوای حسّاس</string>
<string name="status_media_hidden_title">پنهان کردن رسانه</string>
<string name="status_media_hidden_title">رسانهٔ نهفته</string>
<string name="status_sensitive_media_directions">کلیک برای نمایش</string>
<string name="status_content_warning_show_more">نمایش بیشتر</string>
<string name="status_content_warning_show_less">نمایش کمتر</string>
<string name="status_content_show_more">بازکردن</string>
<string name="status_content_warning_show_more">نمایش بیشتر</string>
<string name="status_content_warning_show_less">نمایش کمتر</string>
<string name="status_content_show_more">گسترش</string>
<string name="status_content_show_less">بستن</string>
<string name="footer_empty">چیزی اینجا نیست.برای تازه سازی، به پایین بکشید</string>
<string name="notification_reblog_format">%s بوق شما را تقویت کرد</string>
<string name="notification_favourite_format">%s بوق شما را پسندید</string>
<string name="notification_follow_format">%s شما را دنبال می‌کند</string>
<string name="footer_empty">این‌جا هیچ‌چیز نیست. برای تازه‌سازی، به پایین بکشید!</string>
<string name="notification_reblog_format">%s بوقتان را تقویت کرد</string>
<string name="notification_favourite_format">%s بوقتان را برگزید</string>
<string name="notification_follow_format">%s پی‌گیرتان شد</string>
<string name="report_username_format">گزارش @%s</string>
<string name="report_comment_hint">پیام‌های اضافی</string>
<string name="report_comment_hint">نظرهای اضافی؟</string>
<string name="action_quick_reply">پاسخ سریع</string>
<string name="action_reply">پاسخ</string>
<string name="action_reblog">تقویت</string>
<string name="action_favourite">مورد علاقه</string>
<string name="action_favourite">برگزیدن</string>
<string name="action_more">بیش‌تر</string>
<string name="action_compose">ایجاد</string>
<string name="action_login">ورود با ماستودون</string>
@ -72,17 +72,17 @@
<string name="action_view_profile">نمایه</string>
<string name="action_view_preferences">ترجیحات</string>
<string name="action_view_account_preferences">ترجیحات حساب</string>
<string name="action_view_favourites">علاقه‌مندیها</string>
<string name="action_view_favourites">برگزیدهها</string>
<string name="action_view_mutes">کاربران خموش</string>
<string name="action_view_blocks">کاربران مسدود شده</string>
<string name="action_view_blocks">کاربران مسدود</string>
<string name="action_view_follow_requests">درخواست‌های پی‌گیری</string>
<string name="action_view_media">رسانه</string>
<string name="action_open_in_web">گشودن در مرورگر</string>
<string name="action_add_media">افزودن رسانه</string>
<string name="action_photo_take">گرفتن عکس</string>
<string name="action_share">اشتراک</string>
<string name="action_mute">بی‌صدا</string>
<string name="action_unmute">لغو بی‌صدا</string>
<string name="action_share">هم‌رسانی</string>
<string name="action_mute">خموشی</string>
<string name="action_unmute">ناخموشی</string>
<string name="action_mention">اشاره</string>
<string name="action_hide_media">نهفتن رسانه</string>
<string name="action_open_drawer">گشودن کشو</string>
@ -92,33 +92,33 @@
<string name="action_undo">بازگشت</string>
<string name="action_accept">پذیرش</string>
<string name="action_reject">رد</string>
<string name="action_search">جستجو</string>
<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_emoji_keyboard">صفحه کلیک شکلک</string>
<string name="download_image">درحال دریافت %1$s</string>
<string name="action_copy_link">کپی لینک</string>
<string name="action_content_warning">هشدار محتوا</string>
<string name="action_emoji_keyboard">صفحه‌کلید اموجی</string>
<string name="download_image">درحال بارگیری %1$s</string>
<string name="action_copy_link">رونوشت از پیوند</string>
<string name="send_status_link_to">هم‌رسانی نشانی بوق با…</string>
<string name="send_status_content_to">هم‌رسانی بوق با…</string>
<string name="send_media_to">هم‌رسانی رسانه با…</string>
<string name="confirmation_reported">فرستاده شد!</string>
<string name="confirmation_unblocked">کاربر رفع انسداد شد</string>
<string name="confirmation_unmuted">کاربر رفع بی‌صدا شد</string>
<string name="confirmation_unblocked">کاربرنامسدود شد</string>
<string name="confirmation_unmuted">کاربر ناخموش شد</string>
<string name="status_sent">فرستاده شد!</string>
<string name="status_sent_long">پاسخ با موفق فرستاده شد‌.</string>
<string name="status_sent_long">پاسخ با موفّقیت فرستاده شد‌.</string>
<string name="hint_domain">کدام نمونه؟</string>
<string name="hint_compose">چه خبر؟</string>
<string name="hint_content_warning">هشدار محتوی</string>
<string name="hint_content_warning">هشدار محتوا</string>
<string name="hint_display_name">نام نمایشی</string>
<string name="hint_note">شرح حال</string>
<string name="hint_search">جستجو</string>
<string name="search_no_results">نتیجه‌ای نیست</string>
<string name="label_quick_reply">پاسخ </string>
<string name="hint_search">جست‌وجو</string>
<string name="search_no_results">بدون هیچ نتیجه‌ای</string>
<string name="label_quick_reply">پاسخ…</string>
<string name="label_avatar">آواتار</string>
<string name="label_header">سرتیتر</string>
<string name="link_whats_an_instance">یک نمونه چیست؟</string>
<string name="login_connection">در حال اتصال </string>
<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, و <a href="https://instances.social">بیش‌تر!</a>.
\n
\n اگر هنوز حسابی ندارید، می‌توانید نام نمونه مورد نظر را وارد کرده و در آن حسابی بسازید.
@ -130,23 +130,23 @@
<string name="dialog_message_uploading_media">در حال بارگذاری…</string>
<string name="dialog_download_image">بارگیری</string>
<string name="dialog_message_cancel_follow_request">درخواست دنبال کردن را لغو می‌کنید؟</string>
<string name="dialog_unfollow_warning">لغو دنبال کردن این حساب</string>
<string name="dialog_delete_toot_warning">حذف این بوق</string>
<string name="dialog_unfollow_warning">ناپیگیری این حساب؟</string>
<string name="dialog_delete_toot_warning">حذف این بوق؟</string>
<string name="visibility_public">عمومی: فرستادن به خط زمانی‌های عمومی</string>
<string name="visibility_unlisted">خارج از لیست: در خط زمانی عمومی نشان نده</string>
<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_notifications_enabled">اعلانها</string>
<string name="visibility_direct">مستقیم: فرستادن فقط برای کاربران اشاره‌شده</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>
<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_alert_light">آگاهی با چراغ</string>
<string name="pref_title_notification_filters">به من اطلاع بده زمانی که</string>
<string name="pref_title_notification_filter_mentions">اشاره شدن</string>
<string name="pref_title_notification_filter_follows">دنبال‌شده</string>
<string name="pref_title_notification_filter_reblogs">پست‌های تقویت شده من</string>
<string name="pref_title_notification_filter_favourites">پسند بوق‌هایم</string>
<string name="pref_title_notification_filter_reblogs">فرسته‌هایم تقویت شدند</string>
<string name="pref_title_notification_filter_favourites">فرسته‌هایم برگزیده شدند</string>
<string name="pref_title_appearance_settings">ظاهر</string>
<string name="pref_title_app_theme">تم برنامه</string>
<string name="pref_title_timelines">خط‌ زمانی‌ها</string>
@ -159,7 +159,7 @@
<string name="pref_title_hide_follow_button">پنهان کردن دکمه ایجاد هنگام پیمایش</string>
<string name="pref_title_status_filter">فیلتر کردن خط زمانی</string>
<string name="pref_title_status_tabs">زبانه‌ها</string>
<string name="pref_title_show_boosts">نمایش بازبوقها</string>
<string name="pref_title_show_boosts">نمایش تقویتها</string>
<string name="pref_title_show_replies">نمایش پاسخ‌ها</string>
<string name="pref_title_show_media_preview">بارگیری پیش‌نمایش رسانه</string>
<string name="pref_title_proxy_settings">پراکسی</string>
@ -172,7 +172,7 @@
<string name="pref_publishing">در حال انتشار (همگام با کارساز)</string>
<string name="pref_failed_to_sync">ناتوانی در هم‌گام‌سازی تنظیمات</string>
<string name="post_privacy_public">عمومی</string>
<string name="post_privacy_unlisted">لیست‌نشده</string>
<string name="post_privacy_unlisted">فهرست‌نشده</string>
<string name="post_privacy_followers_only">فقط پی‌گیران</string>
<string name="pref_status_text_size">اندازهٔ متن وضعیت</string>
<string name="status_text_size_smallest">کوچک‌ترین</string>
@ -180,20 +180,20 @@
<string name="status_text_size_medium">متوسط</string>
<string name="status_text_size_large">بزرگ</string>
<string name="status_text_size_largest">بزرگ‌ترین</string>
<string name="notification_mention_name">صدا زدن جدید</string>
<string name="notification_mention_descriptions">هشدار در مورد صدازدن جدید</string>
<string name="notification_follow_name">پیروان جدید</string>
<string name="notification_follow_description">هشدارها درمورد دنبال‌کنندگان جدید</string>
<string name="notification_boost_name">تقویت</string>
<string name="notification_boost_description">وقتی بوق‌های شما تقویت شد اعلان بده</string>
<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_medium">%1$s, %2$s, و %3$s</string>
<string name="notification_mention_name">اشاره‌های جدید</string>
<string name="notification_mention_descriptions">آگاهی‌ها دربارهٔ اشاره‌های جدید</string>
<string name="notification_follow_name">پی‌گیران جدید</string>
<string name="notification_follow_description">آگاهی‌ها دربارهٔ پی‌گیران جدید</string>
<string name="notification_boost_name">تقویتها</string>
<string name="notification_boost_description">آگاهی‌ها هنگام تقویت شدن بوق‌هایتان</string>
<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_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>
<string name="description_account_locked">حساب قفل شد</string>
<string name="description_account_locked">حساب قفل‌شده</string>
<string name="about_title_activity">درباره</string>
<string name="about_tusky_license">تاسکی نرم‌افزاری آزاد است که تحت نگارش ۳ از پروانهٔ جامع همگانی گنو منتشر شده است. پروانه را می‌توانید از این‌جا ببینید: https://www.gnu.org/licenses/gpl-3.0.en.html</string>
<!-- note to translators:
@ -202,178 +202,179 @@
to show we do not mean the software is gratis. Source: https://www.gnu.org/philosophy/free-sw.html
* the url can be changed to link to the localized version of the license.
-->
<string name="about_project_site">سایت پروژه
<string name="about_project_site">پایگاه وب پروژه :
\n https://tusky.app</string>
<string name="about_bug_feature_request_site">گزارش خطا و درخواست ویژگی:
<string name="about_bug_feature_request_site">گزارش مشکلات و درخواست ویژگی‌ها:
\n https://github.com/accelforce/Yuito/issues</string>
<string name="about_tusky_account">نمایه Yuito</string>
<string name="status_share_content">هم‌رسانی محتوی بوق</string>
<string name="status_share_link">هم‌رسانی لینک بوق</string>
<string name="about_tusky_account">نمایهٔ تاسکی</string>
<string name="status_share_content">هم‌رسانی محتوای بوق</string>
<string name="status_share_link">هم‌رسانی پیوند بوق</string>
<string name="status_media_images">تصویرها</string>
<string name="status_media_video">فیلم</string>
<string name="status_media_video">ویدیو</string>
<string name="state_follow_requested">تقاضای پیگیری شد</string>
<!--These are for timestamps on statuses. For example: "16s" or "2d"-->
<string name="abbreviated_in_years">در %dy</string>
<string name="abbreviated_in_days">در %dd</string>
<string name="abbreviated_in_hours">در % dh</string>
<string name="abbreviated_in_minutes">در %dm</string>
<string name="abbreviated_in_seconds">در %ds</string>
<string name="follows_you">شما را دنبال می‌کند</string>
<string name="pref_title_alway_show_sensitive_media">همیشه مطالب حساس را نشان بده</string>
<string name="abbreviated_in_years">در %d سال</string>
<string name="abbreviated_in_days">در %d روز</string>
<string name="abbreviated_in_hours">در %d ساعت</string>
<string name="abbreviated_in_minutes">در %d دقیقه</string>
<string name="abbreviated_in_seconds">در %d ثانیه</string>
<string name="follows_you">پیگیرتان است</string>
<string name="pref_title_alway_show_sensitive_media">نمایش همیشگی محتوای حساس</string>
<string name="title_media">رسانه</string>
<string name="replying_to">پاسخ دادن به @%s</string>
<string name="load_more_placeholder_text">بارگیری بیشتر</string>
<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>
<string name="compose_active_account_description">پست با حساب %1$s</string>
<string name="error_failed_set_caption">ناتوان در تنظیم عنوان</string>
<string name="hint_describe_for_visually_impaired">توصیف برای کم‌بینایان\n(محدودیت نویسه %d)</string>
<string name="title_lists">فهرست‌ها</string>
<string name="title_list_timeline">خط زمانی فهرست</string>
<string name="compose_active_account_description">در حال فرستادن با حساب %1$s</string>
<string name="error_failed_set_caption">شکست در تنظیم عنوان</string>
<string name="hint_describe_for_visually_impaired">توصیف برای کم‌بینایان
\n(کران %d نویسه)</string>
<string name="action_set_caption">تنظیم عنوان</string>
<string name="action_remove">حذف</string>
<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="lock_account_label_description">لازم است پی‌گیران را دستی تأیید کنید</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>
<string name="send_toot_notification_cancel_title">فرستادن لغو شد</string>
<string name="send_toot_notification_saved_content">رونوشتیی از بوق در پیش‌نویس‌هایتان ذخیره شد</string>
<string name="send_toot_notification_saved_content">رونوشتی از بوق در پیش‌نویس‌هایتان ذخیره شد</string>
<string name="action_compose_shortcut">ایجاد</string>
<string name="error_no_custom_emojis">سرور شما %s هیچ شکلک سفارشی ندارد</string>
<string name="copy_to_clipboard_success">به کلیپ بورد کپی شد</string>
<string name="emoji_style">قالب شکلک</string>
<string name="system_default">پیشفرض سیستم</string>
<string name="download_fonts">شما ابتدا باید این شکلک‌ها را دریافت کنید</string>
<string name="performing_lookup_title">اجرای جستجو</string>
<string name="expand_collapse_all_statuses">باز/بستن همه وضعیت‌ها</string>
<string name="action_open_toot">بوق را باز کن</string>
<string name="restart_required">برنامه به شروع مجدد نیاز دارد</string>
<string name="restart_emoji">شما برای اعمال این تغییرات به شروع مجدد برنامه نیاز دارید</string>
<string name="error_no_custom_emojis">نمونه‌تان %s هیچ اموجی سفارشی‌ای ندارد</string>
<string name="copy_to_clipboard_success">در تخته‌گیره رونوشت شد</string>
<string name="emoji_style">سبک اموجی</string>
<string name="system_default">پیش‌گزیدهٔ سامانه</string>
<string name="download_fonts">نخست باید این مجموعه‌های اموجی را بارگیری کنید</string>
<string name="performing_lookup_title">در حال جست‌وجو…</string>
<string name="expand_collapse_all_statuses">گسترده/جمع کردن تمام وضعیت‌ها</string>
<string name="action_open_toot">گشودن بوق</string>
<string name="restart_required">نیاز به آغاز دوبارهٔ کاره</string>
<string name="restart_emoji">برای اعمال این تغییرات، نیاز به شروع دوبارهٔ تاسکی دارید</string>
<string name="later">بعداً</string>
<string name="restart">شروع مجدد</string>
<string name="caption_systememoji">شکلک‌های پیش‌فرض دستگاه شما تنظیم شدند</string>
<string name="caption_blobmoji">شکلک‌های اندروید ۴.۴ تا ۷.۱</string>
<string name="caption_twemoji">شکلک‌های استاندارد ماستدون تنظیم شدند</string>
<string name="restart">آغاز دوباره</string>
<string name="caption_systememoji">مجموعه اموجی پیش‌گزیدهٔ افزاره‌تان</string>
<string name="caption_blobmoji">اموجی‌های اندروید ۴.۴ تا ۷.۱</string>
<string name="caption_twemoji">مجموعه اموجی استاندارد ماستودون</string>
<string name="download_failed">شکست در بارگیری</string>
<string name="profile_badge_bot_text">بات</string>
<string name="account_moved_description">%1$s منتقل شد به:</string>
<string name="reblog_private">تقویت برای مخاطب اصلی</string>
<string name="unreblog_private">لغو تقویت</string>
<string name="license_description">Yuito شامل کد و دارایی‌های پروژه‌های منبع‌باز زیر است:</string>
<string name="license_apache_2">تحت مجوز آپاچی (رونوشت در ادامه)</string>
<string name="profile_metadata_label">متاداده نمایه</string>
<string name="unreblog_private">ناتقویت</string>
<string name="license_description">تاسکی کد و دارایی‌هایی از پروژه‌های نرم‌افزار آزاد زیر دارد:</string>
<string name="license_apache_2">ذیل پروانهٔ آپاچی (رونوشت در ادامه)</string>
<string name="profile_metadata_label">فرادادهٔ نمایه</string>
<string name="profile_metadata_add">افزودن داده</string>
<string name="profile_metadata_label_label">برچسب</string>
<string name="profile_metadata_content_label">محتوا</string>
<string name="pref_title_absolute_time">استفاده از زمان مطلق</string>
<string name="label_remote_account">اطلاعات زیر ممکن است به طور ناقص نمایه کاربر را نشان دهد. برای دیدن نمایه کامل در مرورگر، لمس کنید.</string>
<string name="label_remote_account">ممکن است اطلاعات زیر نمایهٔ کاربر را ناقص نشان دهد. برای گشودن نمایهٔ کامل در مرورگر، لمس کنید.</string>
<string name="unpin_action">برداشتن سنجاق</string>
<string name="pin_action">سنجاق کردن</string>
<string name="error_network">یک خطای شبکه رخ داد! لطفا اتصال خود را بررسی و دوباره تلاش کنید!</string>
<string name="title_direct_messages">پیام‌های مستقیم</string>
<string name="title_tab_preferences">زبانه‌ها</string>
<string name="title_statuses_pinned">سنجاق‌شده</string>
<string name="title_domain_mutes">دامنه‌های پنهان</string>
<string name="title_domain_mutes">دامنه‌های نهفته</string>
<string name="status_username_format">\@%s</string>
<string name="message_empty">چیزی اینجا نیست.</string>
<string name="action_unreblog">حذف بازبوق</string>
<string name="action_unfavourite">برداشتن پسند</string>
<string name="action_delete_and_redraft">پاک کردن و بازنویسی</string>
<string name="action_view_domain_mutes">دامنه‌های پنهان</string>
<string name="message_empty">این‌حا هیچ‌چیزی نیست.</string>
<string name="action_unreblog">برداشتن تقویت</string>
<string name="action_unfavourite">برداشتن برگزیدگی</string>
<string name="action_delete_and_redraft">حذف و بازنویسی</string>
<string name="action_view_domain_mutes">دامنه‌های نهفته</string>
<string name="action_add_poll">افزودن نظرسنجی</string>
<string name="action_mute_domain">بی‌صدا کردن %s</string>
<string name="action_add_tab">افزوده زبانه</string>
<string name="action_mute_domain">خموشی %s</string>
<string name="action_add_tab">افزودن زبانه</string>
<string name="action_links">پیوندها</string>
<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_faved_by">نمایش پسندیده‌ها</string>
<string name="action_open_reblogger">گشودن تقویت‌کنندهٔ بوق</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>
<string name="title_links_dialog">پیوندها</string>
<string name="action_open_media_n">بازکردن رسانه #%d</string>
<string name="action_open_media_n">گشودن رسانه #%d</string>
<string name="action_open_as">گشودن به عنوان %s</string>
<string name="action_share_as">هم‌رسانی به عنوان …</string>
<string name="download_media">بارگیری رسانه</string>
<string name="downloading_media">در حال بارگیری رسانه</string>
<string name="confirmation_domain_unmuted">%s ناپنهان</string>
<string name="confirmation_domain_unmuted">%s نانهفته</string>
<string name="dialog_redraft_toot_warning">می‌خواهید این بوق را پاک و بازنویسی کنید؟</string>
<string name="mute_domain_warning_dialog_ok">نهفتن تمام دامنه</string>
<string name="pref_title_notification_filter_poll">پایان نظرسنجی‌ها</string>
<string name="pref_title_timeline_filters">صافی‌ها</string>
<string name="app_theme_system">استفاده از طرح سیستم</string>
<string name="pref_title_language">زبان</string>
<string name="pref_title_bot_overlay">نمایش نشان برای بات‌ها</string>
<string name="pref_title_bot_overlay">نمایش نشانگر برای بات‌ها</string>
<string name="pref_title_animate_gif_avatars">پویانمایی آواتار gif</string>
<string name="notification_poll_name">نظرسنجی‌ها</string>
<string name="notification_poll_description">اعلان‌ها درباره نظرسنجی‌هایی که پایان یافته‌اند</string>
<string name="about_tusky_version">Tusky (تاسکی) %s</string>
<string name="abbreviated_years_ago">%dy</string>
<string name="abbreviated_days_ago">%dd</string>
<string name="abbreviated_hours_ago">%dh</string>
<string name="abbreviated_minutes_ago">%dm</string>
<string name="abbreviated_seconds_ago">%dث</string>
<string name="pref_title_alway_open_spoiler">همواره بوق‌هایی که دارای محتوای حساس هستند را گسترش بده</string>
<string name="pref_title_public_filter_keywords">خط زمانی عمومی</string>
<string name="pref_title_thread_filter_keywords">گفتگوها</string>
<string name="filter_addition_dialog_title">افزودن صافی</string>
<string name="filter_edit_dialog_title">ویرایش صافی</string>
<string name="notification_poll_description">آگاهی‌ها دربارهٔ نظرسنجی‌های پایان‌یافته</string>
<string name="about_tusky_version">تاسکی %s</string>
<string name="abbreviated_years_ago">%d سال</string>
<string name="abbreviated_days_ago">%d روز</string>
<string name="abbreviated_hours_ago">%d ساعت</string>
<string name="abbreviated_minutes_ago">%d دقیقه</string>
<string name="abbreviated_seconds_ago">%d ثانیه</string>
<string name="pref_title_alway_open_spoiler">گسترش همیشگی بوق‌های علامت‌خورده با هشدار محتوا</string>
<string name="pref_title_public_filter_keywords">خط زمانی‌های عمومی</string>
<string name="pref_title_thread_filter_keywords">گفت‌وگوها</string>
<string name="filter_addition_dialog_title">افزودن پالایه</string>
<string name="filter_edit_dialog_title">ویرایش پالایه</string>
<string name="filter_dialog_remove_button">برداشتن</string>
<string name="filter_dialog_update_button">به‌روزرسانی</string>
<string name="filter_dialog_whole_word">تمام کلمه</string>
<string name="error_create_list">ناتوانی در ایجاد سیاهه</string>
<string name="error_rename_list">ناتوانی در تغییر نام سیاهه</string>
<string name="filter_dialog_update_button">به‌روز رسانی</string>
<string name="filter_dialog_whole_word">تمام واژه</string>
<string name="error_create_list">ناتوانی در ایجاد فهرست</string>
<string name="error_rename_list">ناتوانی در تغییر نام فهرست</string>
<string name="error_delete_list">ناتوانی در حذف فهرست</string>
<string name="action_create_list">ایجاد یک فهرست</string>
<string name="action_rename_list">تغییر نام فهرست</string>
<string name="action_delete_list">حذف فهرست</string>
<string name="action_edit_list">ویرایش سیاهه</string>
<string name="hint_search_people_list">جستجو بین افرادی که دنبال می‌کنید</string>
<string name="action_edit_list">ویرایش فهرست</string>
<string name="hint_search_people_list">جست‌وجوی افرادی که پی می‌گیرید</string>
<string name="action_add_to_list">افزودن حساب به فهرست</string>
<string name="action_remove_from_list">حذف حساب از سیاهه</string>
<string name="caption_notoemoji">مجموعه شکلک‌های جاری گوگل</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="action_remove_from_list">برداشتن حساب از فهرست</string>
<string name="caption_notoemoji">مجموعه اموجی کنونی گوگل</string>
<string name="license_cc_by_4">نگارش ۴٫۰ CC-BY</string>
<string name="license_cc_by_sa_4">نگارش ۴٫۰ CC-BY-SA</string>
<plurals name="favs">
<item quantity="one"><b>%1$s</b> پسند</item>
<item quantity="other"><b>%1$s</b> پسند</item>
<item quantity="one"><b>%1$s</b> برگزیدن</item>
<item quantity="other"><b>%1$s</b> برگزیدن</item>
</plurals>
<plurals name="reblogs">
<item quantity="one"><b>%s</b> بازبوق</item>
<item quantity="other"><b>%s</b> بازبوق</item>
<item quantity="one"><b>%s</b> تقویت</item>
<item quantity="other"><b>%s</b> تقویت</item>
</plurals>
<string name="title_reblogged_by">بازبوق توسط</string>
<string name="title_favourited_by">پسننده‌شده توسط</string>
<string name="title_reblogged_by">تقویت‌شده به دست</string>
<string name="title_favourited_by">برگزیده به دست</string>
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s و %2$s</string>
<string name="conversation_more_recipients">%1$s، %2$s و %3$d بیشتر</string>
<string name="conversation_more_recipients">%1$s، %2$s و %3$d بیشتر</string>
<string name="max_tab_number_reached">رسیده به بیشینهٔ %1$d زبانه</string>
<string name="description_status_media">رسانه: %s</string>
<string name="description_status_cw">هشدار محتوا: %s</string>
<string name="description_status_media_no_description_placeholder">بدون توضیحات</string>
<string name="description_status_media_no_description_placeholder">بدون هیچ توضیحی</string>
<string name="description_status_reblogged">بازبوقیده</string>
<string name="description_status_favourited">پسندیده</string>
<string name="description_status_favourited">برگزیده</string>
<string name="description_visiblity_public">عمومی</string>
<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="hint_list_name">نام سیاهه</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>
<string name="notifications_clear">پاک‌سازی</string>
<string name="notifications_apply_filter">پالایش</string>
<string name="filter_apply">اعمال</string>
<string name="compose_shortcut_long_label">ایجاد بوق</string>
<string name="compose_shortcut_short_label">ایجاد</string>
<string name="notification_clear_text">مطمئنید می‌خواهید تمام آگاهی‌هایتان را برای همیشه پاک کنید؟</string>
<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_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>
<plurals name="poll_timespan_days">
@ -389,16 +390,16 @@
<item quantity="other">%d دقیقه</item>
</plurals>
<string name="button_continue">ادامه</string>
<string name="button_back">قبل</string>
<string name="button_done">اتمام</string>
<string name="report_sent_success">با موفقیت گزارش شد @%s</string>
<string name="hint_additional_info">نظرات بیشتر</string>
<string name="button_back">بازگشت</string>
<string name="button_done">تمام</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>
<string name="failed_report">شکست در گزارش</string>
<string name="failed_fetch_statuses">شکست در واکشی وضعیت‌ها</string>
<string name="title_accounts">حساب‌ها</string>
<string name="failed_search">ناتوانی در جستجو</string>
<string name="pref_title_show_notifications_filter">نمایش فیلتر اعلانات</string>
<string name="failed_search">شکست در جست‌وجو</string>
<string name="pref_title_show_notifications_filter">نمایش پالایهٔ آگاهی‌ها</string>
<string name="create_poll_title">نظرسنجی</string>
<string name="poll_duration_5_min">۵ دقیقه</string>
<string name="poll_duration_30_min">۳۰ دقیقه</string>
@ -413,14 +414,14 @@
<string name="edit_poll">ویرایش</string>
<string name="title_scheduled_toot">بوق‌های زمان‌بسته</string>
<string name="action_edit">ویرایش</string>
<string name="action_access_scheduled_toot">بوق‌های زمان‌بندی‌شده</string>
<string name="action_access_scheduled_toot">بوق‌های زمان‌بسته</string>
<string name="action_schedule_toot">بوق زمان‌بسته</string>
<string name="action_reset_schedule">بازنشانی</string>
<string name="mute_domain_warning">مطمئنید می‌خواهید تمام %s را مسدود کنید؟ محتوای آن دامنه را در هیچ‌یک از خط زمانی‌ها یا در آگاهی‌هایتان نخواهید دید. پیروانتان از آن دامنه، برداشته خواهند شد.</string>
<string name="mute_domain_warning">مطمئنید می‌خواهید تمام %s را مسدود کنید؟ محتوای آن دامنه را در هیچ‌یک از خط زمانی‌ها یا در آگاهی‌هایتان نخواهید دید. پی‌گیرانتان از آن دامنه، برداشته خواهند شد.</string>
<string name="filter_dialog_whole_word_description">هنگامی که کلیدواژه یا عبارت، فقط حروف‌عددی باشد، فقط اگر با تمام واژه مطابق باشد، اعمال خواهد شد</string>
<string name="filter_add_description">عبارت پالایش</string>
<string name="poll_info_format">" %1$s • %2$s"</string>
<string name="report_description_1">گزارش به ناظم‌های کارسازتان ارسال خواهد شد. می‌توانید توضیحی در باب چرایی گزارش این حساب در زیر بنویسید:</string>
<string name="poll_info_format"> .<!-- ۱۵ رأی • ۱ ساعت مانده --> %1$s • %2$s</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>
@ -443,14 +444,14 @@
</plurals>
<string name="hashtags">هشتگ‌ها</string>
<string name="add_hashtag_title">افزودن هشتگ</string>
<string name="notification_follow_request_description">آگاهی‌ها در مورد درخواست‌های پی‌گیری</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>
<string name="notification_follow_request_format">%s می‌خواهد پی‌گیرتان شود</string>
<plurals name="poll_timespan_seconds">
<item quantity="one">%d ثانیه</item>
<item quantity="other">%d ثانیه</item>
@ -464,4 +465,10 @@
<string name="action_mute_notifications_desc">خموشی آگاهی‌ها از %s</string>
<string name="action_unmute_notifications_desc">ناخموشی آگاهی‌ها از %s</string>
<string name="action_unmute_desc">ناخموشی %s</string>
<plurals name="poll_info_votes">
<item quantity="one">%s رأی</item>
<item quantity="other">%s رأی</item>
</plurals>
<string name="pref_title_hide_top_toolbar">نهفتن عنوان نوارابزار بالایی</string>
<string name="compose_preview_image_description">کنش‌ها برای تصویر %s</string>
</resources>

View File

@ -415,7 +415,7 @@
<string name="failed_report">Échec du signalement</string>
<string name="failed_fetch_statuses">Échec de récupération des statuts</string>
<string name="report_description_1">Le rapport sera envoyé aux modérateur·rice·s de votre instance. Vous pouvez expliquer pourquoi vous signalez le compte ci-dessous :</string>
<string name="mute_domain_warning">Êtes-vous sûr⋅e de vouloir bloquer %s en entier? Vous ne verrez plus de contenu provenant de ce domaine, ni dans fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s.</string>
<string name="mute_domain_warning">Êtes-vous sûr⋅e de vouloir bloquer %s en entier \? Vous ne verrez plus de contenu provenant de ce domaine, ni dans les fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s.</string>
<string name="button_done">Terminé</string>
<string name="report_description_remote_instance">Le compte provient dun autre serveur. Envoyez également une copie anonyme du rapport\?</string>
<string name="pref_title_show_notifications_filter">Montrer le filtre des notifications</string>
@ -476,4 +476,13 @@
<string name="action_mute_notifications_desc">Silencier les notifications de %s</string>
<string name="action_unmute_notifications_desc">Ne plus silencier les notifications de %s</string>
<string name="action_unmute_desc">Ne plus masquer %s</string>
<plurals name="poll_info_people">
<item quantity="one">%s personne</item>
<item quantity="other">%s personnes</item>
</plurals>
<string name="pref_title_hide_top_toolbar">Cacher le titre de la barre doutils supérieure</string>
<plurals name="poll_info_votes">
<item quantity="one">%s voix</item>
<item quantity="other">%s voix</item>
</plurals>
</resources>

View File

@ -34,7 +34,7 @@
<string name="action_retry">Ath-ghairm</string>
<string name="action_close">Dùin</string>
<string name="action_send">TÙT</string>
<string name="action_delete">Sguab às</string>
<string name="action_delete">Cuir às</string>
<string name="action_delete_and_redraft">Cuir às agus ath-sgrìobhadh</string>
<string name="action_report">Thoir cunntas air</string>
<string name="action_unblock">Dì-bhac</string>
@ -50,4 +50,6 @@
<string name="action_access_saved_toot">Dreachdan</string>
<string name="action_view_favourites">Prìomhaich</string>
<string name="pref_title_notifications_enabled">Fiosan</string>
<string name="title_notifications">Fiosan</string>
<string name="notification_favourite_name">Prìomhaich</string>
</resources>

View File

@ -396,4 +396,16 @@
<string name="notification_follow_format">%s ने आपको फ़ॉलो किया</string>
<string name="pref_title_show_boosts">बूस्ट दिखाएं</string>
<string name="action_open_reblogged_by">बूस्ट दिखाएं</string>
<plurals name="favs">
<item quantity="one"><b>%1$s</b> ने पसंद किया</item>
<item quantity="other"><b>%1$s</b> ने पसंद किया</item>
</plurals>
<plurals name="poll_timespan_minutes">
<item quantity="one"></item>
<item quantity="other"></item>
</plurals>
<plurals name="poll_timespan_seconds">
<item quantity="one">%d सेकेंड</item>
<item quantity="other">%d सेकेंड</item>
</plurals>
</resources>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="error_generic">Hiba történt.</string>
<string name="error_network">Hálózati hiba történt! Kérjük, ellenőrizze a kapcsolatot, és próbálja meg újra!</string>
<string name="error_network">Hálózati hiba történt! Kérjük, ellenőrizd a kapcsolatot, és próbálja meg újra!</string>
<string name="error_empty">Ez nem lehet üres.</string>
<string name="error_invalid_domain">Helytelen domén</string>
<string name="error_failed_app_registration">Sikertelen bejelentkezés ezen a szerveren.</string>
@ -18,18 +18,18 @@
<string name="error_media_download_permission">Média tárolási engedély szükséges.</string>
<string name="error_media_upload_image_or_video">Képek és videók egyszerre nem csatolhatók ugyanazon tülköléshez.</string>
<string name="error_media_upload_sending">Feltöltés sikertelen.</string>
<string name="error_sender_account_gone">A tülk elküldése nem sikerult.</string>
<string name="error_sender_account_gone">Nem sikerült elküldeni a tülköt..</string>
<string name="title_home">Kezdőlap</string>
<string name="title_notifications">Értesítések</string>
<string name="title_public_local">Helyi</string>
<string name="title_public_federated">Egyesített</string>
<string name="title_public_federated">Föderáció</string>
<string name="title_direct_messages">Közvetlen üzenetek</string>
<string name="title_tab_preferences">Fülek</string>
<string name="title_view_thread">Tülk</string>
<string name="title_statuses">Posztok</string>
<string name="title_statuses_with_replies">Válaszokkal</string>
<string name="title_statuses_pinned">Rögzített</string>
<string name="title_follows">Követ</string>
<string name="title_follows">Követett</string>
<string name="title_followers">Követő</string>
<string name="title_favourites">Kedvencek</string>
<string name="title_mutes">Némított felhasználók</string>
@ -37,7 +37,7 @@
<string name="title_follow_requests">Követési kérelmek</string>
<string name="title_edit_profile">Profilod szerkesztése</string>
<string name="title_saved_toot">Piszkozatok</string>
<string name="title_licenses">Licencek</string>
<string name="title_licenses">Licenszek</string>
<string name="status_username_format">\@%s</string>
<string name="status_boosted_format">%s megtolta</string>
<string name="status_sensitive_media_title">Kényes tartalom</string>
@ -49,23 +49,23 @@
<string name="status_content_show_less">Összecsukás</string>
<string name="message_empty">Nincs itt semmi.</string>
<string name="footer_empty">Üres tartalom. Húzd le a frissítéshez!</string>
<string name="notification_reblog_format">%s megolta a tülkölésed</string>
<string name="notification_reblog_format">%s megtolta a tülködet</string>
<string name="notification_favourite_format">%s kedvencnek jelölte tülködet</string>
<string name="notification_follow_format">%s követett</string>
<string name="notification_follow_format">%s bekövetett</string>
<string name="report_username_format">\@%s jelentése</string>
<string name="report_comment_hint">Egyéb megjegyzés?</string>
<string name="action_quick_reply">Gyors válasz</string>
<string name="action_reply">Válasz</string>
<string name="action_reblog">Rebloggol</string>
<string name="action_favourite">Kedvenc</string>
<string name="action_reblog">Megtolás</string>
<string name="action_favourite">Kedvencnek jelölés</string>
<string name="action_more">Több</string>
<string name="action_compose">Szerkesztés</string>
<string name="action_login">Bejelentkezés Mastodon-al</string>
<string name="action_login">Bejelentkezés Mastodon-nal</string>
<string name="action_logout">Kijelentkezés</string>
<string name="action_logout_confirm">Biztosan ki szeretnél jelentkezni a következőből: %1$s?</string>
<string name="action_follow">Követés</string>
<string name="action_unfollow">Követés vége</string>
<string name="action_block">Blokkol</string>
<string name="action_block">Letiltás</string>
<string name="action_unblock">Letiltás feloldása</string>
<string name="action_hide_reblogs">Megtolások elrejtése</string>
<string name="action_show_reblogs">Megtolások mutatása</string>
@ -73,31 +73,31 @@
<string name="action_delete">Törlés</string>
<string name="action_send">TÜLK</string>
<string name="action_send_public">TÜLK!</string>
<string name="action_retry">Próbálja újra</string>
<string name="action_close">Bezár</string>
<string name="action_retry">Próbáld újra</string>
<string name="action_close">Bezárás</string>
<string name="action_view_profile">Profil</string>
<string name="action_view_preferences">Beállítások</string>
<string name="action_view_account_preferences">Fiókbeállítások</string>
<string name="action_view_favourites">Kedvencek</string>
<string name="action_view_mutes">Némított felhasználók</string>
<string name="action_view_blocks">Blokkolt felhasználók</string>
<string name="action_view_blocks">Letiltott felhasználók</string>
<string name="action_view_follow_requests">Követési kérelmek</string>
<string name="action_view_media">Média</string>
<string name="action_open_in_web">Megnyitás böngészőben</string>
<string name="action_add_media">Média csatolása</string>
<string name="action_photo_take">Kép készítése</string>
<string name="action_share">Megoszt</string>
<string name="action_mute">Némít</string>
<string name="action_share">Megosztás</string>
<string name="action_mute">Némítás</string>
<string name="action_unmute">Némítás feloldása</string>
<string name="action_mention">Megemlítés</string>
<string name="action_hide_media">Média elrejtése</string>
<string name="action_open_drawer">Drawer megnyitása</string>
<string name="action_open_drawer">Menü megnyitása</string>
<string name="action_save">Mentés</string>
<string name="action_edit_profile">Profil szerkesztése</string>
<string name="action_edit_own_profile">Szerkesztés</string>
<string name="action_undo">Visszavonás</string>
<string name="action_accept">Elfogad</string>
<string name="action_reject">Elutasít</string>
<string name="action_accept">Elfogadás</string>
<string name="action_reject">Elutasítás</string>
<string name="action_search">Keresés</string>
<string name="action_access_saved_toot">Piszkozatok</string>
<string name="action_toggle_visibility">Tülkök láthatósága</string>
@ -108,7 +108,7 @@
<string name="action_mentions">Említések</string>
<string name="action_hashtags">Hashtagek</string>
<string name="action_open_faved_by">Kedvencek megjelenítése</string>
<string name="title_hashtags_dialog">Címkék</string>
<string name="title_hashtags_dialog">Hashtagek</string>
<string name="title_mentions_dialog">Említések</string>
<string name="title_links_dialog">Linkek</string>
<string name="download_image">%1$s letöltése</string>
@ -122,15 +122,15 @@
<string name="confirmation_unmuted">Felhasználó némítása feloldva</string>
<string name="status_sent">Elküldve!</string>
<string name="status_sent_long">Válasz sikeresen elküldve.</string>
<string name="hint_domain">Mely szerver\?</string>
<string name="hint_compose">Mire gondolsz\?</string>
<string name="hint_content_warning">Tartalom Figyelmeztető</string>
<string name="hint_domain">Melyik szerver\?</string>
<string name="hint_compose">Mi jár a fejedben\?</string>
<string name="hint_content_warning">Tartalom figyelmeztetés</string>
<string name="hint_display_name">Megjelenítési név</string>
<string name="hint_note">Bemutatkozás</string>
<string name="hint_search">Keresés…</string>
<string name="search_no_results">Nincs találat</string>
<string name="label_quick_reply">Válasz…</string>
<string name="label_avatar">Avatár</string>
<string name="label_avatar">Profilkép</string>
<string name="label_header">Fejléc</string>
<string name="link_whats_an_instance">Mi az a szerver\?</string>
<string name="login_connection">Csatlakozás…</string>
@ -151,18 +151,18 @@
<string name="visibility_unlisted">Listázatlan: Nem jelenik meg a nyilvános idővonalon</string>
<string name="visibility_private">Csak követőknek: Tülkölés csak követőknek</string>
<string name="visibility_direct">Közvetlen: Tülkölés csak a megemlített felhasználóknak</string>
<string name="pref_title_edit_notification_settings">Értesítések szerkesztése</string>
<string name="pref_title_edit_notification_settings">Értesítések</string>
<string name="pref_title_notifications_enabled">Értesítések</string>
<string name="pref_title_notification_alerts">Figyelmeztetések</string>
<string name="pref_title_notification_alert_sound">Értesítés hanggal</string>
<string name="pref_title_notification_alert_vibrate">Értesítés rezgéssel</string>
<string name="pref_title_notification_alert_light">Értesítés fénnyel</string>
<string name="pref_title_notification_filters">Értesítsen, ha</string>
<string name="pref_title_notification_filter_mentions">említett</string>
<string name="pref_title_notification_filter_mentions">megemlítettek</string>
<string name="pref_title_notification_filter_follows">bekövettek</string>
<string name="pref_title_notification_filter_reblogs">tülkömet megtolták</string>
<string name="pref_title_notification_filter_favourites">tülkömet kedvenccé tették</string>
<string name="pref_title_appearance_settings">Kinézet</string>
<string name="pref_title_appearance_settings">Megjelenés</string>
<string name="pref_title_timelines">Idővonalak</string>
<string name="app_them_dark">Sötét</string>
<string name="app_theme_light">Világos</string>
@ -170,10 +170,10 @@
<string name="app_theme_auto">Automatikus naplementekor</string>
<string name="pref_title_browser_settings">Böngésző</string>
<string name="pref_title_custom_tabs">Linkek megnyitása applikáción belül</string>
<string name="pref_title_hide_follow_button">Szerkesztési gomb elérejtése görgetés közben</string>
<string name="pref_title_hide_follow_button">Szerkesztés gomb elrejtése görgetés közben</string>
<string name="pref_title_status_filter">Idővonal szűrése</string>
<string name="pref_title_status_tabs">Fülek</string>
<string name="pref_title_show_boosts">Rebloggolások mutatása</string>
<string name="pref_title_show_boosts">Megtolások mutatása</string>
<string name="pref_title_show_replies">Válaszok mutatása</string>
<string name="pref_title_show_media_preview">Média előnézet mutatása</string>
<string name="pref_title_proxy_settings">Proxy</string>
@ -181,13 +181,13 @@
<string name="pref_title_http_proxy_enable">HTTP proxy engedélyezése</string>
<string name="pref_title_http_proxy_server">HTTP proxy szerver</string>
<string name="pref_title_http_proxy_port">HTTP Proxy port</string>
<string name="pref_default_post_privacy">Alapértelmezett poszt láthatóság</string>
<string name="pref_default_media_sensitivity">Minden médiát jelölj meg érzékenynek</string>
<string name="pref_default_post_privacy">Tülkök alapértelmezett láthatósága</string>
<string name="pref_default_media_sensitivity">Minden média szenzitívnek jelölése</string>
<string name="pref_failed_to_sync">A beállítások szinkronizálása nem sikerült</string>
<string name="post_privacy_public">Nyilvános</string>
<string name="post_privacy_unlisted">Listázatlan</string>
<string name="post_privacy_followers_only">Csak követőknek</string>
<string name="pref_status_text_size">Státusz szöveg mérete</string>
<string name="pref_status_text_size">Tülkölés szöveg mérete</string>
<string name="status_text_size_smallest">Legkisebb</string>
<string name="status_text_size_small">Kicsi</string>
<string name="status_text_size_medium">Közepes</string>
@ -196,12 +196,12 @@
<string name="notification_mention_name">Új említések</string>
<string name="notification_mention_descriptions">Értesítések új említések esetén</string>
<string name="notification_follow_name">Új követők</string>
<string name="notification_follow_description">Értesítések az új követők esetén</string>
<string name="notification_boost_name">Rebloggok</string>
<string name="notification_boost_description">Értesítések posztjaid rebloggolása esetén</string>
<string name="notification_follow_description">Értesítések új követőkről</string>
<string name="notification_boost_name">Megtolások</string>
<string name="notification_boost_description">Értesítések posztjaid megtolása esetén</string>
<string name="notification_favourite_name">Kedvencek</string>
<string name="notification_favourite_description">Értesítések mikor tülkjeidet kedvencnek jelölik</string>
<string name="notification_mention_format">%s megemített téged</string>
<string name="notification_mention_format">%s megemlített téged</string>
<string name="notification_summary_large">%1$s, %2$s, %3$s és még %4$d</string>
<string name="notification_summary_medium">%1$s, %2$s meg %3$s</string>
<string name="notification_summary_small">%1$s és %2$s</string>
@ -220,7 +220,7 @@
</string>
<string name="about_bug_feature_request_site">Hibajelentés &amp; új funkciók igénylése:
\n https://github.com/accelforce/Yuito/issues</string>
<string name="about_tusky_account">Yuito Profilja</string>
<string name="about_tusky_account">Yuito profilja</string>
<string name="status_share_content">Tülk tartalmának megosztása</string>
<string name="status_share_link">Tülk linkjének megosztása</string>
<string name="status_media_images">Képek</string>
@ -247,7 +247,7 @@
<string name="error_no_custom_emojis">A %s szervernek nincsenek egyedi emoji-jai</string>
<string name="copy_to_clipboard_success">Vágólapra másolva</string>
<string name="emoji_style">Emoji stílus</string>
<string name="system_default">Rendszer alapértelmezett</string>
<string name="system_default">Rendszer alapértelmezés</string>
<string name="download_fonts">Először le kell töltened ezeket az emoji készleteket</string>
<string name="performing_lookup_title">Keresés…</string>
<string name="action_open_toot">Tülk megnyitása</string>
@ -255,9 +255,9 @@
<string name="restart_emoji">A beállítások érvényesítéséhez újra kell indítani a Tusky-t</string>
<string name="later">Később</string>
<string name="restart">Újraindítás</string>
<string name="caption_systememoji">Az eszközöd alap emoji készlete</string>
<string name="caption_systememoji">Az eszközöd alapértelmezett emoji készlete</string>
<string name="caption_blobmoji">Az Android 4.4-7.1 Blob emoji-jai</string>
<string name="caption_twemoji">Mastodon alap emoji készlet</string>
<string name="caption_twemoji">Mastodon alapértelmezett emoji készlet</string>
<string name="download_failed">Letöltés sikertelen</string>
<string name="profile_badge_bot_text">Bot</string>
<string name="account_moved_description">%1$s elköltözött:</string>
@ -269,7 +269,7 @@
<string name="profile_metadata_label_label">Címke</string>
<string name="profile_metadata_content_label">Tartalom</string>
<string name="pref_title_absolute_time">Abszolút idő használata</string>
<string name="label_remote_account">Az alábbi felhasználói profil adatok lehet, hogy hiányosak. Kattints ide a teljes profil böngészőben való megnyitásához.</string>
<string name="label_remote_account">Az alábbi felhasználói profil adatok hiányosak lehetnek. Kattints ide a teljes profil böngészőben való megnyitásához.</string>
<string name="title_reblogged_by">Megtolta</string>
<string name="title_favourited_by">Kedvencnek jelölte</string>
<string name="conversation_2_recipients">%1$s és %2$s</string>
@ -285,14 +285,14 @@
<string name="downloading_media">Média letöltése</string>
<string name="send_media_to">Média megosztása következővel…</string>
<string name="dialog_redraft_toot_warning">Törlöd és újraírod ezt a tülköt\?</string>
<string name="pref_title_notification_filter_poll">befejeződött a szavazás</string>
<string name="pref_title_notification_filter_poll">befejeződött egy szavazás</string>
<string name="pref_title_timeline_filters">Szűrők</string>
<string name="app_theme_system">Rendszer téma használata</string>
<string name="pref_title_language">Nyelv</string>
<string name="pref_publishing">Közzététel (szerverrel szinkronizált)</string>
<string name="notification_poll_name">Szavazások</string>
<string name="notification_poll_description">Értesítés a befejezett szavazásokról</string>
<string name="about_tusky_license">Yuito ingyenes és nyílt forráskódú szoftver. A GNU General Public License Version 3 érvényes rá, amit itt tekinthets meg: https://www.gnu.org/licenses/gpl-3.0.en.html</string>
<string name="notification_poll_description">Értesítés befejezett szavazásokról</string>
<string name="about_tusky_license">Yuito ingyenes és nyílt forráskódú szoftver. A GNU General Public License Version 3 érvényes rá, amit itt tekinthetsz meg: https://www.gnu.org/licenses/gpl-3.0.en.html</string>
<string name="abbreviated_in_years">%dé múlva</string>
<string name="abbreviated_in_days">%dn múlva</string>
<string name="abbreviated_in_hours">%dó múlva</string>
@ -301,7 +301,7 @@
<string name="abbreviated_days_ago">%dn</string>
<string name="abbreviated_hours_ago">%dó</string>
<string name="abbreviated_minutes_ago">%dp</string>
<string name="abbreviated_seconds_ago">%dm</string>
<string name="abbreviated_seconds_ago">%dmp</string>
<string name="replying_to">Válasz @%s részére</string>
<string name="pref_title_public_filter_keywords">Nyilvános idővonalak</string>
<string name="pref_title_thread_filter_keywords">Beszélgetések</string>
@ -309,7 +309,7 @@
<string name="filter_edit_dialog_title">Szűrő szerkesztése</string>
<string name="filter_dialog_remove_button">Eltávolítás</string>
<string name="filter_dialog_update_button">Frissítés</string>
<string name="filter_add_description">Szűrőkifejezés</string>
<string name="filter_add_description">Szűrendő kifejezés</string>
<string name="error_create_list">Nem sikerült a lista létrehozása</string>
<string name="error_rename_list">Nem sikerült a lista átnevezése</string>
<string name="error_delete_list">Nem sikerült a lista törlése</string>
@ -345,7 +345,7 @@
<string name="expand_collapse_all_statuses">Minden tülk kibontása/összecsukása</string>
<string name="caption_notoemoji">Google jelenlegi emoji készlete</string>
<string name="reblog_private">Megtolás az eredeti közönségnek</string>
<string name="unreblog_private">Megtolás törlése</string>
<string name="unreblog_private">Megtolás visszavonása</string>
<string name="license_apache_2">Apache licensz alatt</string>
<string name="unpin_action">Kitűzés eltávolítása</string>
<string name="pin_action">Kitűzés</string>
@ -372,7 +372,7 @@
<string name="notifications_apply_filter">Szűrés</string>
<string name="filter_apply">Alkalmaz</string>
<string name="compose_shortcut_long_label">Tülk Szerkesztése</string>
<string name="compose_shortcut_short_label">Szerkeszt</string>
<string name="compose_shortcut_short_label">Szerkesztés</string>
<string name="notification_clear_text">Biztos, hogy minden értesítésedet véglegesen törlöd\?</string>
<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>
@ -436,9 +436,9 @@
<string name="action_reset_schedule">Visszaállítás</string>
<string name="post_lookup_error_format">Nem találjuk ezt a posztot %s</string>
<string name="title_bookmarks">Könyvjelzők</string>
<string name="action_bookmark">Könyvjelző</string>
<string name="action_bookmark">Könyvjelzőzés</string>
<string name="action_view_bookmarks">Könyvjelzők</string>
<string name="about_powered_by_tusky">Tusky által hatjva</string>
<string name="about_powered_by_tusky">Tusky által hajtva</string>
<string name="description_status_bookmarked">Könyvjelzőzve</string>
<string name="select_list_title">Lista kiválasztása</string>
<string name="list">Lista</string>
@ -461,15 +461,16 @@
<string name="pref_main_nav_position_option_top">Fent</string>
<string name="pref_main_nav_position">Fő navigálási pozíció</string>
<string name="pref_title_gradient_for_media">Színes homály mutatása rejtett médiánál</string>
<string name="pref_title_notification_filter_follow_requests">követési kérelem</string>
<string name="pref_title_notification_filter_follow_requests">követni szeretnének</string>
<string name="dialog_mute_hide_notifications">Értesítések elrejtése</string>
<string name="dialog_block_warning">Letiltsuk @%s -t\?</string>
<string name="dialog_mute_warning">Elnémítsuk @%s fiókot\?</string>
<string name="action_unmute_conversation">Beszélgetés némításának feloldása</string>
<string name="action_mute_conversation">Beszélgetés némítása</string>
<string name="action_unmute_domain">Némítás vége %s</string>
<string name="action_unmute_domain">%s némításának feloldása</string>
<string name="action_mute_notifications_desc">Értesítések némítása tőle %s</string>
<string name="action_unmute_desc">Némítás vége %s</string>
<string name="action_unmute_desc">%s némításának feloldása</string>
<string name="action_unmute_notifications_desc">Értesítések némításának feloldása tőle %s</string>
<string name="notification_follow_request_format">%s kéri, hogy követhessen</string>
<string name="pref_title_hide_top_toolbar">Felső eszköztár címének elrejtése</string>
</resources>

View File

@ -153,7 +153,7 @@
<string name="hint_content_warning">Aðvörun vegna efnis</string>
<string name="hint_display_name">Birtingarnafn</string>
<string name="hint_note">Æviágrip</string>
<string name="hint_search">Leita...</string>
<string name="hint_search">Leita</string>
<string name="search_no_results">Engar niðurstöður</string>
<string name="label_quick_reply">Svara…</string>
<string name="label_avatar">Auðkennismynd</string>
@ -423,4 +423,20 @@
<item quantity="one"><b>%s</b> Endurbirting</item>
<item quantity="other"><b>%s</b> Endurbirtingar</item>
</plurals>
<plurals name="poll_timespan_seconds">
<item quantity="one">%d sekúnda</item>
<item quantity="other">%d sekúndur</item>
</plurals>
<plurals name="poll_timespan_minutes">
<item quantity="one">%d mínúta</item>
<item quantity="other">%d mínútur</item>
</plurals>
<plurals name="poll_timespan_hours">
<item quantity="one">%d klukkustund</item>
<item quantity="other">%d klukkustundir</item>
</plurals>
<plurals name="poll_timespan_days">
<item quantity="one">%d dagur</item>
<item quantity="other">%d dagar</item>
</plurals>
</resources>

View File

@ -141,12 +141,12 @@
<string name="link_whats_an_instance">Cos\'è un\'istanza?</string>
<string name="login_connection">Connessione…</string>
<string name="dialog_whats_an_instance">L\'indirizzo o il dominio di qualsiasi istanza può essere inserito qui, come mastodon.social, icosahedron.website, social.tchncs.de, e <a href="https://instances.social">altro!</a>
\n
\nSe non hai ancora un account, puoi inserire il nome di un\'istanza alla quale vuoi iscriverti e creare un account.
\n
\n
\nSe non hai ancora un account, puoi inserire il nome di un\'istanza alla quale vuoi iscriverti e creare un account.
\n
\nUn\'istanza è il luogo dove l\'account è custodito, ma puoi facilmente comunicare e seguire gente su altre istanze come se fossero sullo stesso sito.
\n
\nPiù info possono essere trovate su <a href="https://joinmastodon.org">joinmastodon.org</a>.</string>
\n
\nPiù info possono essere trovate su <a href="https://joinmastodon.org">joinmastodon.org</a>. </string>
<string name="dialog_title_finishing_media_upload">Terminando il caricamento dei media</string>
<string name="dialog_message_uploading_media">Caricamento…</string>
<string name="dialog_download_image">Scarica</string>
@ -379,7 +379,7 @@
<string name="action_view_domain_mutes">Domini nascosti</string>
<string name="action_mute_domain">Silenzia %s</string>
<string name="confirmation_domain_unmuted">%s mostrati</string>
<string name="mute_domain_warning">Sei sicuro di voler bloccare tutto %s\? Non vedrai nessun contenuto da quel dominio in nessuna timeline pubblica o nelle tue notifiche. I tuoi seguaci che stanno in quel dominio saranno rimossi</string>
<string name="mute_domain_warning">Sei sicuro di voler bloccare tutto %s\? Non vedrai nessun contenuto da quel dominio in nessuna timeline pubblica o nelle tue notifiche. I tuoi seguaci che stanno in quel dominio saranno rimossi.</string>
<string name="mute_domain_warning_dialog_ok">Nascondi l\'intero dominio</string>
<string name="pref_title_notification_filter_poll">Le votazioni sono finite</string>
<string name="pref_title_animate_gif_avatars">Mostra le animazioni delle GIF negli avatar</string>

View File

@ -34,7 +34,7 @@
<string name="action_send">Jewweq</string>
<string name="action_send_public">JEWWEQ!</string>
<string name="action_retry">Ɛreḍ tikkelt-nniḍen</string>
<string name="action_close">Derreɛ</string>
<string name="action_close">Mdel</string>
<string name="action_view_profile">Amaɣnu</string>
<string name="action_view_favourites">Ismenyifen</string>
<string name="action_open_in_web">Ldi deg uminig</string>

View File

@ -22,7 +22,7 @@
<string name="error_authorization_denied">ആധികാരികത ഉറപ്പുവരുത്താനായില്ല.</string>
<string name="error_retrieving_oauth_token">ഒരു പ്രവേശന ടോക്കൺ ലഭ്യമാക്കുന്നതിൽ പരാജയപ്പെട്ടു.</string>
<string name="error_compose_character_limit">ഈ സ്റ്റാറ്റസ് വളരെ നീളമേറിയതാണ്!</string>
<string name="error_image_upload_size">ഫയൽ 8എംബിയിലും ചെറുതായിരിക്കണം.</string>
<string name="error_image_upload_size">ഫയൽ 8 എംബിയേക്കാളും ചെറുതായിരിക്കണം.</string>
<string name="error_video_upload_size">ചലച്ചിത്ര ഫയലുകൾ 40എബിയിലു ചെറുതായിരിക്കണം.</string>
<string name="error_media_upload_type">ഇത്തരം ഫയൽ അപ്‌ലോഡ് ചെയ്യാൻ സാധിക്കില്ല.</string>
<string name="error_media_upload_opening">ഈ ഫയൽ തുറക്കാനായില്ല.</string>
@ -44,8 +44,8 @@
<string name="title_follows">പിന്തുടരലുകൾ</string>
<string name="title_followers">പിന്തുടരുന്നവർ</string>
<string name="title_mutes">നിശ്ശബ്ദരാക്കിയ ഉപയോക്താക്കൾ</string>
<string name="title_blocks">തടയപ്പെട്ട ഉപയോക്താക്കൾ</string>
<string name="title_follow_requests">പിന്തുടാരാനുള്ള അപേക്ഷകൾ</string>
<string name="title_blocks">നിരോധിച്ച ഉപയോഗതാക്കൾ</string>
<string name="title_follow_requests">പിന്തുടാനുള്ള അപേക്ഷകൾ</string>
<string name="title_edit_profile">പ്രൊഫൈൽ തിരുത്തുക</string>
<string name="action_reply">മറുപടി</string>
<string name="action_reblog">ബൂസ്റ്റ്</string>
@ -56,7 +56,7 @@
<string name="action_follow">പിന്തുടരുക</string>
<string name="action_unfollow">പിന്‍തുടരുന്നത് അവസാനിപ്പിക്കുക</string>
<string name="action_retry">വീണ്ടും ശ്രമിക്കുക</string>
<string name="action_view_follow_requests">പിന്തുടാനുള്ള അപേക്ഷകൾ</string>
<string name="action_view_follow_requests">പിന്‍തുടരുവാനുള്ള അഭ്യര്‍ത്ഥനകള്‍</string>
<string name="title_domain_mutes">മറച്ചുവെച്ച ഡൊമൈനുകൾ</string>
<string name="description_visiblity_private">പിന്തുടരുന്നവർ</string>
<string name="footer_empty">പുതിയത് ലഭിക്കാൻ താഴേക്ക് വലിക്കുക</string>
@ -74,9 +74,9 @@
<string name="action_reset_schedule">പുനഃക്രമീകരിക്കുക</string>
<string name="action_open_in_web">ബ്രൗസറിൽ തുറക്കുക</string>
<string name="action_view_media">മാധ്യമം</string>
<string name="action_view_domain_mutes">മറച്ചുവെച്ച ഡൊമൈനുകൾ</string>
<string name="action_view_blocks">തടയപ്പെട്ട ഉപയോക്താക്കൾ</string>
<string name="action_view_mutes">നിശ്ശബ്ദരാക്കിയ ഉപയോക്താക്കൾ</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>
@ -108,4 +108,7 @@
<string name="action_access_scheduled_toot">മുന്‍നിശ്ചയിച്ച ടൂറ്റ്‌സ്</string>
<string name="action_access_saved_toot">കരടുകൾ</string>
<string name="action_edit_own_profile">തിരുത്ത്</string>
<string name="pref_title_edit_notification_settings">അറിയിപ്പുകൾ</string>
<string name="pref_title_status_tabs">ടാബുകൾ</string>
<string name="pref_title_notifications_enabled">അറിയിപ്പുകൾ</string>
</resources>

View File

@ -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 quantity="other"/>
<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>
@ -403,8 +403,8 @@
<item quantity="other">%d minuten</item>
</plurals>
<plurals name="poll_timespan_seconds">
<item quantity="one"/>
<item quantity="other"/>
<item quantity="one">%d seconde</item>
<item quantity="other">%d seconden</item>
</plurals>
<string name="button_continue">Doorgaan</string>
<string name="button_back">Terug</string>

View File

@ -332,8 +332,8 @@
<item quantity="other"><b>3%1$s</b>4 Favorits</item>
</plurals>
<plurals name="reblogs">
<item quantity="one"/>
<item quantity="other"/>
<item quantity="one"><b>%s</b> partatge</item>
<item quantity="other"><b>%s</b> partatges</item>
</plurals>
<string name="title_reblogged_by">Partejat per</string>
<string name="title_favourited_by">Aimat per</string>
@ -363,8 +363,8 @@
<string name="pref_title_bot_overlay">Mostrar coma indicator pels robòts</string>
<string name="notification_clear_text">Netejar totas las notificacions dun biais permanent \?</string>
<plurals name="poll_info_votes">
<item quantity="one"/>
<item quantity="other"/>
<item quantity="one">%s vòte</item>
<item quantity="other">%s votes</item>
</plurals>
<string name="poll_info_time_relative">%s restant</string>
<string name="poll_info_time_absolute">Sacaba a %s</string>
@ -389,8 +389,8 @@
<item quantity="other">%d minutas</item>
</plurals>
<plurals name="poll_timespan_seconds">
<item quantity="one"/>
<item quantity="other"/>
<item quantity="one">%d segonda</item>
<item quantity="other">%d segondas</item>
</plurals>
<string name="compose_preview_image_description">Accions per limatge %s</string>
<string name="pref_title_animate_gif_avatars">Activar lanimacion dels avatars</string>
@ -450,4 +450,8 @@
<string name="warning_scheduling_interval">Linterval minimum de planificacion sus Mastodon e de 5 minutas.</string>
<string name="notification_follow_request_name">Demandas dabonament</string>
<string name="hashtags">Etiquetas</string>
<string name="action_mute_notifications_desc">Desactivar las notificacions per %s</string>
<string name="action_unmute_notifications_desc">Activar las notificacions per %s</string>
<string name="action_unmute_desc">Amagar pas mai a %s</string>
<string name="notification_follow_request_format">%s a demandat a vos seguir</string>
</resources>

View File

@ -289,7 +289,7 @@
<string name="action_view_domain_mutes">Ukryte domeny</string>
<string name="action_add_poll">Dodaj głosowanie</string>
<string name="action_mute_domain">Wycisz %s</string>
<string name="action_add_tab">Dodaj zakłądkę</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">Pokaż podbicia</string>
<string name="action_open_media_n">Otwórz media #%d</string>
@ -395,9 +395,9 @@
<string name="poll_ended_created">Ankieta, którą stworzyłeś(aś), zakończyła się</string>
<plurals name="poll_timespan_days">
<item quantity="one">%d dzień</item>
<item quantity="few"></item>
<item quantity="many"></item>
<item quantity="other"></item>
<item quantity="few">%d dni</item>
<item quantity="many">%d dni</item>
<item quantity="other">%d dni</item>
</plurals>
<plurals name="poll_timespan_hours">
<item quantity="one">%d godzina</item>
@ -407,9 +407,9 @@
</plurals>
<plurals name="poll_timespan_minutes">
<item quantity="one">%d minuta</item>
<item quantity="few"></item>
<item quantity="many"></item>
<item quantity="other"></item>
<item quantity="few">%d minuty</item>
<item quantity="many">%d minut</item>
<item quantity="other">%d minut</item>
</plurals>
<plurals name="poll_timespan_seconds">
<item quantity="one">%d sekunda</item>

View File

@ -67,7 +67,7 @@
<string name="action_show_reblogs">Mostrar boosts</string>
<string name="action_report">Denunciar</string>
<string name="action_delete">Excluir</string>
<string name="action_send">TOOT</string>
<string name="action_send">TOOT!</string>
<string name="action_send_public">TOOT!</string>
<string name="action_retry">Tentar novamente</string>
<string name="action_close">Fechar</string>

View File

@ -0,0 +1,316 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="title_public_local">स्थानीयाः</string>
<string name="title_notifications">सूचनाः</string>
<string name="title_home">गृहम्</string>
<string name="error_sender_account_gone">दौत्यप्रेषणं विफलं जातम् ।</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_compose_character_limit">भृशं दीर्घतमा स्थितिरियम् !</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">श्रव्यसञ्चिका ४MBतोऽल्पा स्थाप्या ।</string>
<string name="error_video_upload_size">चलचित्रसञ्चिका ४MBतोऽल्पा स्थाप्या ।</string>
<string name="error_image_upload_size">८ MBतोऽल्पा परिमिता सञ्चिका स्थाप्या ।</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_failed_app_registration">तया व्यक्त्या प्रमाणीकरणं विफलं जातम् ।</string>
<string name="error_invalid_domain">अवैधानिकप्रदेशः प्रविष्टः</string>
<string name="error_empty">नैतद्रिक्तं भवितुमर्हति ।</string>
<string name="error_network">दोषो जातः । कृपया भवतोऽन्तर्जालीयसम्पर्कं परीक्ष्य पुनश्च यतताम् !</string>
<string name="error_generic">दोषो जातः ।</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">कालबद्धदौत्यानि</string>
<string name="title_saved_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_favourites">प्रियाः</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="notification_follow_format">%s त्वामन्वसरत्</string>
<string name="notification_favourite_format">%s भवदीयदौत्याय रुचिमददात्</string>
<string name="notification_reblog_format">%s भवदीयं दौत्यं प्राकाशयत्</string>
<string name="action_send_public">प्रेष्यताम् !</string>
<string name="action_send">प्रेष्यताम्</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_logout">बहिर्गम्यताम्</string>
<string name="action_login">मास्टुडोनमाध्यमेन सम्प्रविश्यताम्</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="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_account_preferences">लेखाविन्यासाः</string>
<string name="action_view_preferences">विन्यासाः</string>
<string name="action_view_profile">व्यक्तिविवरणम्</string>
<string name="action_close">पिधीयताम्</string>
<string name="action_retry">पुनः यत्यताम्</string>
<string name="action_mute_notifications_desc">%s मित्रविषये मा सूच्यताम्</string>
<string name="action_unmute_notifications_desc">%s मित्रविषये सूच्यताम्</string>
<string name="action_unmute_desc">%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="send_media_to">सामग्र्यस्मै विभाज्यताम् …</string>
<string name="send_status_content_to">दौत्यमस्मै विभाज्यताम् …</string>
<string name="send_status_link_to">दौत्यजालस्थलमस्मै विभाज्यताम् …</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_reset_schedule">पुनरारम्भः</string>
<string name="action_schedule_toot">कालबद्धदौत्यं क्रियताम्</string>
<string name="action_emoji_keyboard">भावचिह्नटङ्कणफलकम्</string>
<string name="action_content_warning">विषयप्रत्यादेशः</string>
<string name="action_toggle_visibility">दौत्यसुदर्शता</string>
<string name="action_access_scheduled_toot">कालबद्धदौत्यानि</string>
<string name="action_access_saved_toot">पाण्डुलेखविकर्षाः</string>
<string name="action_search">अन्वेष्यताम्</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_edit_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_unmute_domain">%s सशब्दं क्रियताम्</string>
<string name="action_mute_domain">%s निःशब्दं क्रियताम्</string>
<string name="confirmation_unmuted">भोक्ता सशब्दः कृतः</string>
<string name="confirmation_unblocked">निषिद्धभोक्तोपकृतः</string>
<string name="confirmation_reported">प्रेषितम्!</string>
<string name="login_connection">सम्पर्कः क्रियते…</string>
<string name="link_whats_an_instance">किं नाम विशिष्टवस्तु \?</string>
<string name="label_header">शीर्षः</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">किं विशिष्टवस्तु \?</string>
<string name="status_sent_long">सफलं प्रत्युत्तरप्रेषणम् ।</string>
<string name="status_sent">प्रेषितम्!</string>
<string name="confirmation_domain_unmuted">%s विवृतः</string>
<string name="pref_title_notification_filters">सूच्यता मे यदा</string>
<string name="pref_title_notification_alert_light">ज्योत्या सूच्यताम्</string>
<string name="pref_title_notification_alert_vibrate">कम्पनेन सूच्यताम्</string>
<string name="pref_title_notification_alert_sound">ध्वनिना सूच्यताम्</string>
<string name="pref_title_notification_alerts">सतर्कताः</string>
<string name="pref_title_notifications_enabled">सूचनाः</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_hide_notifications">सूचनाः छाद्यन्ताम्</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">विनश्य पुनः लिख्यताम् \?</string>
<string name="dialog_delete_toot_warning">दौत्यमेतन्नश्यताम्\?</string>
<string name="dialog_unfollow_warning">अनुसरणं नश्यताम् \?</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">कस्याऽपि विशिष्टस्थलस्य सङ्केतसूत्रमत्र टङ्कयितुं शक्यते 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="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="dialog_message_cancel_follow_request">अनुसरणानुरोधो नश्यताम् \?</string>
<string name="title_list_timeline">सूचेः समयतालिका</string>
<string name="title_lists">आवल्यः</string>
<string name="action_lists">आवल्यः</string>
<string name="add_account_description">नवमास्टोडोनलेखा युज्यताम्</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">सर्वदा विषयसतर्कतयाऽङ्कितं दौत्यं विस्तार्यताम्</string>
<string name="pref_title_alway_show_sensitive_media">सर्वदा संवेदनशीलविषयो दृश्यताम्</string>
<string name="follows_you">त्वामनुसरति</string>
<string name="abbreviated_seconds_ago">%ds क्ष</string>
<string name="abbreviated_minutes_ago">%dm नि</string>
<string name="abbreviated_hours_ago">%dh घ</string>
<string name="abbreviated_years_ago">%dy वर्ष</string>
<string name="abbreviated_days_ago">%dd दि</string>
<string name="abbreviated_in_seconds">%ds क्षणेभ्यः</string>
<string name="abbreviated_in_minutes">%dm निमेषेभ्यः</string>
<string name="abbreviated_in_hours">%dh घण्टाभ्यः</string>
<string name="abbreviated_in_days">%dd दिनेभ्यः</string>
<string name="abbreviated_in_years">%dy वर्षेभ्यः</string>
<string name="state_follow_requested">अनुसरणं निवेदितम्</string>
<string name="status_media_video">चलचित्राणि</string>
<string name="status_media_images">चित्राणि</string>
<string name="status_share_link">दौत्याय जालस्थानं विभाज्यताम्</string>
<string name="status_share_content">दौत्यविषयो विभाज्यताम्</string>
<string name="about_tusky_account">टस्कीवर्यस्य व्यक्तिगतविवरणम्</string>
<string name="about_bug_feature_request_site">अशुद्धीनामावेदनं वैशिष्ट्यनिवेदनञ्च
\n https://github.com/tuskyapp/Tusky/issues</string>
<string name="about_project_site">प्रकल्पस्य जालसूत्रम् :
\n https://tusky.app</string>
<string name="about_tusky_license">"टस्कीत्यनावृतस्रोतो निःशुल्कतन्त्रांशः । GNU General Public License Version 3 इत्यनेनाऽनुज्ञापितः । अत्राऽनुज्ञापत्रं द्रष्टुं शक्यते :-
\nhttps://www.gnu.org/licenses/gpl-3.0.en.html"</string>
<string name="about_powered_by_tusky">टस्कीत्यनेनाऽऽश्रितः</string>
<string name="about_tusky_version">टस्की %s</string>
<string name="about_title_activity">विज्ञप्तिः</string>
<string name="description_account_locked">कपाटितव्यक्तिगतलेखाः</string>
<string name="notification_title_summary">%d नवपरस्परक्रियाः</string>
<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">प्रीतिः इत्यङ्किते सति सूचनाः</string>
<string name="notification_favourite_name">प्रियाः</string>
<string name="notification_boost_description">दौत्यप्रकाशने सति सूचनाः</string>
<string name="notification_boost_name">प्रकाशनानि</string>
<string name="notification_follow_request_description">अनुसरणानुरोधान्नधिकृत्य सूचनाः</string>
<string name="notification_follow_request_name">अनुसरणार्थमनुरोधाः</string>
<string name="notification_mention_descriptions">नवोल्लेखान्नधिकृत्य सूचनाः</string>
<string name="notification_follow_description">नवानुसर्तृृन्नधिकृत्य सूचनाः</string>
<string name="notification_follow_name">नवानुसर्तारः</string>
<string name="notification_mention_name">नवोल्लेखाः</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">दौत्यस्य / स्थितेरक्षराकारः</string>
<string name="post_privacy_followers_only">केवलमुसर्तृृभ्यः</string>
<string name="post_privacy_unlisted">अनिर्दिष्टम्</string>
<string name="post_privacy_public">सार्वजनिकम्</string>
<string name="pref_main_nav_position_option_bottom">नितलम्</string>
<string name="pref_main_nav_position_option_top">शिखरम्</string>
<string name="pref_main_nav_position">मुख्यमार्गणस्थितिः</string>
<string name="pref_failed_to_sync">विन्यासं समसामयिकं कर्तुं विफलता</string>
<string name="pref_publishing">प्रकाशनम् (जालवितरकेण सह सामयिकम्)</string>
<string name="pref_default_media_sensitivity">श्रव्यदृश्यसामग्रीः सदा संवेदनशीलाः इत्यङ्क्यताम्</string>
<string name="pref_default_post_privacy">पूर्वनिविष्टप्रकटनगुह्यता</string>
<string name="pref_title_http_proxy_port">HTTPS प्रतिनिधिद्वारिका</string>
<string name="pref_title_http_proxy_server">HTTPS प्रतिनिधिजालवितारकम्</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_gradient_for_media">छादितसामग्रीभ्यो बहुवर्णयुतचित्रं दृशयतु</string>
<string name="pref_title_animate_gif_avatars">सञ्जीवितावतारः क्रियताम्</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">क्रोमस्वीयानुकूलपीठिका प्रयुज्यताम्</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>
</resources>

View File

@ -437,4 +437,10 @@
<string name="status_boosted_format">%s spodbudil</string>
<string name="hashtags">Ključniki</string>
<string name="notification_follow_request_name">Zahteve za Sledenje</string>
<plurals name="favs">
<item quantity="one"><b>%1$s</b> Priljubljena</item>
<item quantity="two"><b>%1$s</b> Priljubljeni</item>
<item quantity="few"><b>%1$s</b> Priljubljene</item>
<item quantity="other"><b>%1$s</b> Priljubljenih</item>
</plurals>
</resources>

View File

@ -278,4 +278,5 @@
<string name="description_visiblity_private">பின்பற்றுபவர்கள்</string>
<string name="description_visiblity_unlisted">பட்டியலிடப்படாதவர்களுக்கு</string>
<string name="description_visiblity_public">அனைவருக்கும்</string>
<string name="compose_shortcut_short_label">எழுது</string>
</resources>

View File

@ -45,7 +45,7 @@
<string name="hint_search">Пошук…</string>
<string name="hint_note">Про себе</string>
<string name="hint_compose">Що відбувається\?</string>
<string name="status_sent">Надіслано!</string>
<string name="status_sent">Надіслати!</string>
<string name="confirmation_reported">Надіслано!</string>
<string name="action_share_as">Поділитися як …</string>
<string name="action_open_as">Відкрити як %s</string>
@ -116,4 +116,7 @@
<string name="title_media">Медіа</string>
<string name="pref_title_notifications_enabled">Сповіщення</string>
<string name="pref_title_edit_notification_settings">Сповіщення</string>
<string name="title_blocks">Заблоковані користувачі</string>
<string name="notification_favourite_name">Вподобане</string>
<string name="notification_follow_request_name">Запити на підписку</string>
</resources>

View File

@ -82,7 +82,7 @@
<string name="hint_note">Tiểu sử</string>
<string name="hint_display_name">Tên hiển thị</string>
<string name="hint_content_warning">Nội dung nhạy cảm</string>
<string name="hint_compose">Chuyện gì đang xảy ra\?</string>
<string name="hint_compose">Bạn đang nghĩ về điều gì\?</string>
<string name="hint_domain">Bạn ở máy chủ nào\?</string>
<string name="status_sent_long">Trả lời đã được gửi đi.</string>
<string name="status_sent">Đã đăng!</string>
@ -178,7 +178,7 @@
<string name="status_boosted_format">%s chia sẻ</string>
<string name="status_username_format">\@%s</string>
<string name="title_licenses">Giấy phép</string>
<string name="title_scheduled_toot">Tút đã lên lịch</string>
<string name="title_scheduled_toot">Lịch đăng</string>
<string name="title_edit_profile">Chỉnh sửa trang cá nhân</string>
<string name="title_follow_requests">Yêu cầu theo dõi</string>
<string name="title_domain_mutes">Máy chủ đã ẩn</string>
@ -191,7 +191,7 @@
<string name="title_statuses_with_replies">Tương tác</string>
<string name="title_statuses">Tút</string>
<string name="title_view_thread">Tút</string>
<string name="title_tab_preferences">Xếp Tab</string>
<string name="title_tab_preferences">Xếp tab</string>
<string name="title_direct_messages">Tin nhắn</string>
<string name="title_public_federated">Thế giới</string>
<string name="title_public_local">Cộng đồng</string>
@ -212,7 +212,7 @@
<string name="pref_title_hide_follow_button">Ẩn nút viết tút khi xem bảng tin</string>
<string name="pref_title_custom_tabs">Sử dụng tab Chrome</string>
<string name="pref_title_browser_settings">Trình duyệt</string>
<string name="app_theme_system">Sử dụng mặc định của thiết bị</string>
<string name="app_theme_system">Mặc định của thiết bị</string>
<string name="app_theme_auto">Tự động khi trời tối</string>
<string name="app_theme_black">Đen</string>
<string name="app_theme_light">Sáng</string>
@ -306,8 +306,8 @@
<string name="state_follow_requested">Yêu cầu theo dõi</string>
<string name="status_media_video">Video</string>
<string name="status_media_images">Hình ảnh</string>
<string name="status_share_link">Chia sẻ URL tút</string>
<string name="status_share_content">Chia sẻ nội dung tút</string>
<string name="status_share_link">URL tút</string>
<string name="status_share_content">Nội dung của tút</string>
<string name="about_tusky_account">Trang cá nhân Tusky</string>
<string name="pref_title_confirm_reblogs">Hiện xác nhận trước khi chia sẻ</string>
<string name="pref_title_show_cards_in_timelines">Hiện xem trước của link</string>
@ -455,4 +455,5 @@
<string name="action_unmute_notifications_desc">Bỏ ẩn thông báo từ %s</string>
<string name="action_unmute_desc">Bỏ ẩn %s</string>
<string name="action_unmute_domain">Bỏ ẩn %s</string>
<string name="pref_title_hide_top_toolbar">Ẩn tên tab</string>
</resources>

View File

@ -81,13 +81,13 @@
<string name="action_view_profile">个人资料</string>
<string name="action_view_preferences">设置</string>
<string name="action_view_account_preferences">帐户设置</string>
<string name="action_view_favourites">我的收藏</string>
<string name="action_view_favourites">收藏</string>
<string name="action_view_mutes">被隐藏的用户</string>
<string name="action_view_blocks">被屏蔽的用户</string>
<string name="action_view_follow_requests">关注请求</string>
<string name="action_view_media">媒体</string>
<string name="action_open_in_web">在浏览器中打开</string>
<string name="action_add_media">从相册中选择</string>
<string name="action_add_media">添加媒体</string>
<string name="action_photo_take">拍照</string>
<string name="action_share">分享</string>
<string name="action_mute">隐藏</string>
@ -164,7 +164,7 @@
<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>
<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_filters">事件</string>
@ -177,9 +177,9 @@
<string name="pref_title_app_theme">应用主题</string>
<string name="pref_title_timelines">时间轴</string>
<string name="pref_title_timeline_filters">过滤器</string>
<string name="app_them_dark">黑夜</string>
<string name="app_theme_light">白天</string>
<string name="app_theme_black"></string>
<string name="app_them_dark">暗色</string>
<string name="app_theme_light">亮色</string>
<string name="app_theme_black"></string>
<string name="app_theme_auto">自动切换</string>
<string name="app_theme_system">跟随系统设定</string>
<string name="pref_title_browser_settings">浏览器</string>
@ -215,13 +215,13 @@
<string name="notification_follow_description">当有用户关注我时</string>
<string name="notification_boost_name">转嘟</string>
<string name="notification_boost_description">当有用户转嘟了我的嘟文时</string>
<string name="notification_favourite_name">我的收藏</string>
<string name="notification_favourite_name">收藏</string>
<string name="notification_favourite_description">当有用户收藏了我的嘟文时</string>
<string name="notification_poll_name">投票</string>
<string name="notification_poll_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_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_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>
<string name="description_account_locked">锁嘟用户</string>
@ -245,7 +245,7 @@
<string name="about_tusky_account">Yuito 官方帐号</string>
<string name="status_share_content">分享嘟文内容</string>
<string name="status_share_link">分享嘟文链接</string>
<string name="status_media_images"></string>
<string name="status_media_images"></string>
<string name="status_media_video">视频</string>
<string name="state_follow_requested">已发送关注请求</string>
<!--These are for timestamps on statuses. For example: "16s" or "2d"-->
@ -288,7 +288,8 @@
<string name="action_remove_from_list">从列表中移除用户</string>
<string name="compose_active_account_description">以 %1$s 发布嘟文</string>
<string name="error_failed_set_caption">设置图片标题失败</string>
<string name="hint_describe_for_visually_impaired">为视觉障碍用户提供的描述\n(限制 %d 字)</string>
<string name="hint_describe_for_visually_impaired">为视觉障碍用户提供的描述
\n限制 %d 字)</string>
<string name="action_set_caption">设置图片标题</string>
<string name="action_remove">移除</string>
<string name="lock_account_label">保护你的帐户(锁嘟)</string>
@ -297,9 +298,9 @@
<string name="send_toot_notification_title">正在发送…</string>
<string name="send_toot_notification_error_title">发送失败</string>
<string name="send_toot_notification_channel_name">嘟文发送中</string>
<string name="send_toot_notification_cancel_title">发送取消</string>
<string name="send_toot_notification_cancel_title">已取消发送</string>
<string name="send_toot_notification_saved_content">嘟文已保存为草稿</string>
<string name="action_compose_shortcut">发表嘟文</string>
<string name="action_compose_shortcut">发表嘟文</string>
<string name="error_no_custom_emojis">当前实例 %s 没有自定义表情符号</string>
<string name="copy_to_clipboard_success">已复制到剪贴板</string>
<string name="emoji_style">表情符号风格</string>
@ -343,14 +344,10 @@
<string name="title_favourited_by">收藏</string>
<string name="conversation_1_recipients">%1$s</string>
<string name="conversation_2_recipients">%1$s 和 %2$s</string>
<string name="conversation_more_recipients">%1$s, %2$s 和 %3$d 等人</string>
<string name="conversation_more_recipients">%1$s%2$s 和 %3$d 等人</string>
<string name="max_tab_number_reached">标签页不能超过 %1$d 个</string>
<string name="description_status_media">
媒体: %s
</string>
<string name="description_status_cw">
内容提醒: %s
</string>
<string name="description_status_media">媒体:%s</string>
<string name="description_status_cw">内容提醒:%s</string>
<string name="description_status_media_no_description_placeholder">
没有媒体描述信息
</string>
@ -366,7 +363,7 @@
<string name="description_visiblity_unlisted">
不公开
</string>
<string name="description_visiblity_private">关注者</string>
<string name="description_visiblity_private">关注者</string>
<string name="description_visiblity_direct">
私信
</string>
@ -375,8 +372,8 @@
<string name="notifications_clear">清空</string>
<string name="notifications_apply_filter">分类</string>
<string name="filter_apply">应用</string>
<string name="compose_shortcut_long_label">发表嘟文</string>
<string name="compose_shortcut_short_label">发表嘟文</string>
<string name="compose_shortcut_long_label">发表嘟文</string>
<string name="compose_shortcut_short_label">发表嘟文</string>
<string name="pref_title_bot_overlay">显示机器人标志</string>
<string name="notification_clear_text">你确定要永久清空通知列表吗?</string>
<string name="poll_info_format">
@ -407,27 +404,27 @@
<string name="action_reset_schedule">重置</string>
<string name="error_audio_upload_size">音频文件大小必须小于40M。</string>
<string name="title_bookmarks">书签</string>
<string name="title_domain_mutes">隐藏域名</string>
<string name="title_domain_mutes">隐藏域名</string>
<string name="title_scheduled_toot">定时嘟文</string>
<string name="action_bookmark">书签</string>
<string name="action_edit">编辑</string>
<string name="action_view_bookmarks">书签</string>
<string name="action_view_domain_mutes">隐藏域名</string>
<string name="action_add_poll">新增意见调查</string>
<string name="action_view_domain_mutes">隐藏域名</string>
<string name="action_add_poll">新增投票</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_dialog_ok">隐藏整个域</string>
<string name="confirmation_domain_unmuted">%s 已取消隐藏</string>
<string name="mute_domain_warning_dialog_ok">隐藏来自该域名的所有嘟文</string>
<string name="pref_title_animate_gif_avatars">动画GIF头像</string>
<string name="about_powered_by_tusky">由Tusky提供支持</string>
<string name="pref_title_alway_open_spoiler">始终扩展标有内容警告的嘟文</string>
<string name="filter_dialog_whole_word">整个单词</string>
<string name="filter_dialog_whole_word_description">如果关键字或缩写只有字母或数字,则只有在匹配整个单词时才会应用</string>
<string name="caption_notoemoji">Google正在使用的Emoji符号集</string>
<string name="description_status_bookmarked">已收藏</string>
<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="caption_notoemoji">Google正在使用的表情符号</string>
<string name="description_status_bookmarked">被加入书签</string>
<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="button_continue">继续</string>
<string name="button_back">返回</string>
<string name="button_done">完成</string>
@ -439,7 +436,7 @@
<string name="report_description_1">该报告将发送给给您的服务器管理员。您可以在下面提供有关回报此帐户的原因的说明:</string>
<string name="report_description_remote_instance">该帐户来自其他服务器。向那里发送一份匿名的报告副本?</string>
<string name="title_accounts">账户</string>
<string name="failed_search">失败</string>
<string name="failed_search">失败</string>
<string name="pref_title_show_notifications_filter">显示通知过滤器</string>
<string name="create_poll_title">投票</string>
<string name="poll_duration_5_min">5 分钟</string>
@ -450,10 +447,10 @@
<string name="poll_duration_3_days">3 天</string>
<string name="poll_duration_7_days">7 天</string>
<string name="add_poll_choice">添加选择</string>
<string name="poll_allow_multiple_choices">选择</string>
<string name="poll_allow_multiple_choices">选择</string>
<string name="poll_new_choice_hint">选择 %d</string>
<string name="edit_poll">编辑</string>
<string name="post_lookup_error_format">查找帖子时出错 %s</string>
<string name="post_lookup_error_format">查找嘟文时出错 %s</string>
<string name="no_saved_status">您没有草稿。</string>
<string name="no_scheduled_status">您没有任何定时嘟文。</string>
<string name="warning_scheduling_interval">Mastodon的最小预订时间为5分钟。</string>
@ -473,14 +470,18 @@
<string name="dialog_mute_warning">确定隐藏 @%s</string>
<string name="dialog_block_warning">确定屏蔽 @%s</string>
<string name="mute_domain_warning">确定要完全屏蔽 %s 吗?您将不能在公共时间轴和通知内看见来自此域名的内容,且您在此域名上的关注者将会被移除。</string>
<string name="action_unmute_conversation">取消隐藏会话的通知</string>
<string name="action_mute_conversation">隐藏会话的通知</string>
<string name="action_unmute_conversation">取消隐藏会话</string>
<string name="action_mute_conversation">隐藏会话</string>
<string name="action_unmute_domain">取消隐藏 %s</string>
<string name="action_mute_domain">隐藏 %s</string>
<string name="action_mute_notifications_desc">隐藏来自 %s 的通知</string>
<string name="action_unmute_notifications_desc">取消隐藏来自 %s 的通知</string>
<string name="action_unmute_desc">取消隐藏 %s</string>
<string name="notification_follow_request_format">%s 请求关注你</string>
<string name="pref_main_nav_position">主导航位置</string>
<string name="pref_title_hide_top_toolbar">隐藏顶部工具栏的标题</string>
<string name="pref_main_nav_position">导航栏位置</string>
<string name="pref_title_hide_top_toolbar">隐藏顶部工具栏标题</string>
<plurals name="poll_info_people">
<item quantity="one">%s 人</item>
<item quantity="other"></item>
</plurals>
</resources>

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>
@ -61,7 +61,7 @@
<string name="action_favourite">收藏</string>
<string name="action_unfavourite">取消收藏</string>
<string name="action_more">更多</string>
<string name="action_compose">嘟文</string>
<string name="action_compose">撰寫嘟文</string>
<string name="action_login">登入 Mastodon 帳號</string>
<string name="action_logout">登出</string>
<string name="action_logout_confirm">確定要登出 %1$s 嗎?</string>
@ -133,7 +133,7 @@
<string name="status_sent_long">成功送出回覆</string>
<string name="hint_domain">域名</string>
<string name="hint_compose">有什麼新鮮事?</string>
<string name="hint_content_warning">設定敏感內容警告</string>
<string name="hint_content_warning">敏感內容警告</string>
<string name="hint_display_name">暱稱</string>
<string name="hint_note">簡介</string>
<string name="hint_search">搜尋…</string>
@ -143,7 +143,7 @@
<string name="label_header">標題</string>
<string name="link_whats_an_instance">什麼是站點?</string>
<string name="login_connection">正在連線…</string>
<string name="dialog_whats_an_instance">"請輸入你帳號所在的 Mastodon 站點的域名或地址 "</string>
<string name="dialog_whats_an_instance">請輸入你帳號所在的 Mastodon 站點的域名或地址</string>
<string name="dialog_title_finishing_media_upload">正在完成上傳…</string>
<string name="dialog_message_uploading_media">正在上傳…</string>
<string name="dialog_download_image">下載</string>
@ -155,7 +155,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>
@ -292,7 +292,7 @@
<string name="send_toot_notification_channel_name">嘟文發送中</string>
<string name="send_toot_notification_cancel_title">發送已被取消</string>
<string name="send_toot_notification_saved_content">嘟文已儲存為草稿</string>
<string name="action_compose_shortcut">撰寫嘟文</string>
<string name="action_compose_shortcut">嘟文</string>
<string name="error_no_custom_emojis">當前站點 %s 沒有自訂表情符號</string>
<string name="copy_to_clipboard_success">已複製到剪貼簿</string>
<string name="emoji_style">表情符號風格</string>
@ -402,4 +402,5 @@
<string name="edit_poll">編輯</string>
<string name="hashtags">話題</string>
<string name="notification_follow_request_name">關注請求</string>
<string name="action_edit">編輯</string>
</resources>

View File

@ -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>
@ -61,7 +61,7 @@
<string name="action_favourite">收藏</string>
<string name="action_unfavourite">取消收藏</string>
<string name="action_more">更多</string>
<string name="action_compose">發表新嘟文</string>
<string name="action_compose">新嘟文</string>
<string name="action_login">登入 Mastodon 帳號</string>
<string name="action_logout">登出</string>
<string name="action_logout_confirm">確定要登出 %1$s 嗎?</string>
@ -129,7 +129,7 @@
<string name="confirmation_reported">已發送!</string>
<string name="confirmation_unblocked">已解除封鎖</string>
<string name="confirmation_unmuted">已解除靜音</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>
@ -359,7 +359,7 @@
<string name="description_visiblity_unlisted">
不公開
</string>
<string name="description_visiblity_private">關注者</string>
<string name="description_visiblity_private">關注者</string>
<string name="description_visiblity_direct">
私信
</string>
@ -369,7 +369,7 @@
<string name="notifications_apply_filter">分類</string>
<string name="filter_apply">應用</string>
<string name="compose_shortcut_long_label">發表新嘟文</string>
<string name="compose_shortcut_short_label">新嘟文</string>
<string name="compose_shortcut_short_label">發表新嘟文</string>
<string name="pref_title_bot_overlay">顯示機器人標誌</string>
<string name="notification_clear_text">你確定要永久清空通知列表嗎?</string>
<string name="poll_info_format">
@ -400,4 +400,5 @@
<string name="notification_follow_request_name">關注請求</string>
<string name="hashtags">話題</string>
<string name="edit_poll">編輯</string>
<string name="action_edit">編輯</string>
</resources>

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>
@ -159,7 +159,7 @@
<string name="visibility_private">仅关注者:只有经过你确认后关注你的用户可见</string>
<string name="visibility_direct">私信:只有被提及的用户可见</string>
<string name="pref_title_edit_notification_settings">通知设置</string>
<string name="pref_title_notifications_enabled">通知设置</string>
<string name="pref_title_notifications_enabled">通知</string>
<string name="pref_title_notification_alerts">提醒</string>
<string name="pref_title_notification_alert_sound">通知铃声</string>
<string name="pref_title_notification_alert_vibrate">振动</string>
@ -404,4 +404,5 @@
<string name="hashtags">话题</string>
<string name="action_edit">编辑</string>
<string name="edit_poll">编辑</string>
<string name="notification_follow_request_name">关注请求</string>
</resources>

View File

@ -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>
@ -143,7 +143,7 @@
<string name="label_header">標題</string>
<string name="link_whats_an_instance">什麼是站點?</string>
<string name="login_connection">正在連線…</string>
<string name="dialog_whats_an_instance">"請輸入你帳號所在的 Mastodon 站點的域名或地址 "</string>
<string name="dialog_whats_an_instance">請輸入你帳號所在的 Mastodon 站點的域名或地址</string>
<string name="dialog_title_finishing_media_upload">正在完成上傳…</string>
<string name="dialog_message_uploading_media">正在上傳…</string>
<string name="dialog_download_image">下載</string>
@ -156,7 +156,7 @@
<string name="visibility_private">僅關注者:只有經過你確認後關注你的使用者可見</string>
<string name="visibility_direct">私信:只有被提及的使用者可見</string>
<string name="pref_title_edit_notification_settings">通知設定</string>
<string name="pref_title_notifications_enabled">通知設定</string>
<string name="pref_title_notifications_enabled">通知</string>
<string name="pref_title_notification_alerts">提醒</string>
<string name="pref_title_notification_alert_sound">通知鈴聲</string>
<string name="pref_title_notification_alert_vibrate">振動</string>
@ -292,7 +292,7 @@
<string name="send_toot_notification_channel_name">嘟文發送中</string>
<string name="send_toot_notification_cancel_title">發送已被取消</string>
<string name="send_toot_notification_saved_content">嘟文已儲存為草稿</string>
<string name="action_compose_shortcut">撰寫嘟文</string>
<string name="action_compose_shortcut">發表新嘟文</string>
<string name="error_no_custom_emojis">當前站點 %s 沒有自訂表情符號</string>
<string name="copy_to_clipboard_success">已複製到剪貼簿</string>
<string name="emoji_style">表情符號風格</string>
@ -407,7 +407,7 @@
<string name="mute_domain_warning_dialog_ok">隱藏整個域名</string>
<string name="pref_title_animate_gif_avatars">GIF 動畫大頭貼</string>
<string name="about_tusky_version">Tusky %s</string>
<string name="filter_dialog_whole_word">整個文字</string>
<string name="filter_dialog_whole_word">整個單詞</string>
<string name="filter_dialog_whole_word_description">如果關鍵字或短語僅為字母或數字,則只有在匹配整個單詞時才會應用</string>
<string name="caption_notoemoji">Google 正在使用的 Emoji 符號集</string>
<string name="description_poll">使用以下選項創建投票:%1$s, %2$s, %3$s, %4$s; %5$s</string>
@ -426,4 +426,5 @@
<string name="hashtags">話題</string>
<string name="notification_follow_request_name">關注請求</string>
<string name="edit_poll">編輯</string>
<string name="action_edit">編輯</string>
</resources>

View File

@ -50,4 +50,6 @@
<dimen name="adaptive_bitmap_outer_size">108dp</dimen>
<dimen name="fabMargin">16dp</dimen>
<dimen name="avatar_toolbar_nav_icon_size">36dp</dimen>
</resources>

View File

@ -0,0 +1,47 @@
package com.keylesspalace.tusky.util
import org.junit.Assert.*
import org.junit.Test
class EmojiCompatFontTest {
@Test
fun testCompareVersions() {
assertEquals(
-1,
EmojiCompatFont.compareVersions(
listOf(0),
listOf(1, 2, 3)
)
)
assertEquals(
1,
EmojiCompatFont.compareVersions(
listOf(1, 2, 3),
listOf(0, 0, 0)
)
)
assertEquals(
-1,
EmojiCompatFont.compareVersions(
listOf(1, 0, 1),
listOf(1, 1, 0)
)
)
assertEquals(
0,
EmojiCompatFont.compareVersions(
listOf(4, 5, 6),
listOf(4, 5, 6)
)
)
assertEquals(
0,
EmojiCompatFont.compareVersions(
listOf(0, 0),
listOf(0)
)
)
}
}

View File

@ -5,4 +5,4 @@ Tusky v10.0
- Vous pouvez maintenant ajouter des listes à l'écran principal.
- Vous pouvez désormais publier des pièces jointes audio avec Tusky.
Et beaucoup d'autres petites améliorations et corrections de bugs!
Et beaucoup d'autres petites améliorations et corrections de bugs !

View File

@ -5,4 +5,4 @@ Tusky v6.0
- Le liste possono ora essere modificate
- Sicurezza: rimosso il supporto per TLS 1.0 e TLS 1.1.1, e aggiunto il supporto per TLS 1.3 su Android 6+.
- La vista della composizione suggerirà ora le emojis personalizzate quando si inizia a digitare
- Nuova impostazione del tema "Segui il tema de
- Nuova impostazione del tema "Segui il tema del

View File

@ -1,3 +1,3 @@
Tusky v9.1
This release ensures compatibility with Mastodon 3 and improves performance and stability.
Deze versie garandeert compatibiliteit met Mastodon 3 en verbetert prestaties en stabiliteit.

View File

@ -0,0 +1,8 @@
टस्की v१२.
- संशोधितमुख्यमाध्यमः - पीठिकाः अधोऽपि स्थापयितुं शक्यते
- कस्मैचिन्मूकत्वप्रदानप्रक्रियायां, सूचनाश्च निःशब्दा भवेन्न वेति चेतुं शक्यते
- सम्प्रति नैकानि निश्रेणिचिह्नानि यथेच्छया एकस्यामेव पीठिकायां योक्तुं शक्यते
- सामग्रीविवरणविधिः संशोधितः येन दीर्घतरविवरणमपि योक्तुं शक्यते
सर्वाणि परिवर्तनपत्राणि https://github.com/tuskyapp/Tusky/releases

View File

@ -0,0 +1,12 @@
टस्कीति लघुग्राहिका मास्टोडन् इत्यस्य कृते, यदनावृतस्रोतो निःशुल्कसामाजिकजालवितारकम् ।
* वस्तुपरिकल्पना
* अधिकांशमास्टोडोनीयाः अनुप्रयोगविधिलेखनमाध्यमाः युक्ताः
* बहुव्यक्तित्वलेखासाहाय्यम्
* अन्धकारप्रबन्धः प्रदीप्तिप्रबन्धोऽपि समयानुसारेण स्वचालितविपरिवर्तनञ्च
* विकर्षाः - दौत्यं लिखित्वा भविष्यते रक्ष्यताम्
* नैका भावचिह्नशैल्योऽवचीयन्ताम्
* सर्वाकारयुक्तेभ्यः पटलेभ्यः सरलीकृतम्
* पूर्णत्वेनाऽनावृत्तस्रोतस्तथा च न सशुल्काधीनत्वं गुगलसेवासदृशम्
मास्टोडोन् इत्यस्य विषयेऽधिकं ज्ञातुमत्र गम्यताम् : https://joinmastodon.org/

View File

@ -0,0 +1 @@
एका बहुग्राहिका मास्टोडोन् इति सामाजिकलसञ्जालेभ्यः

View File

@ -0,0 +1 @@
टस्की

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

@ -9,4 +9,4 @@ Tusky, ücretsiz ve açık kaynaklı bir sosyal ağ sunucusu olan Mastodon için
• Tüm ekran boyutları için optimize edilmiş arayüz
• Tamamen açık kaynak - Google hizmet servisi gibi özgür olmayan bağımlılıklar yok
Mastodon hakkında daha fazla bilgi edinmek için https://joinmastodon.org/ adresini ziyaret edin
Mastodon hakkında daha fazla bilgi edinmek için https://joinmastodon.org/ adresini ziyaret edin.