Merge remote-tracking branch 'tuskyapp/develop' into master
This commit is contained in:
commit
bb5106a18d
|
@ -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 *;
|
||||
}
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
)
|
||||
}
|
||||
}
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
})
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -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" />
|
||||
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 & 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 Blob–Emojis aus Android 4.4–7.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">%d Sek.</string>
|
||||
<string name="abbreviated_hours_ago">%d St.</string>
|
||||
<string name="abbreviated_in_days">in %d T.</string>
|
||||
<string name="abbreviated_years_ago">%d J.</string>
|
||||
</resources>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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 d’un 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 d’outils supérieure</string>
|
||||
<plurals name="poll_info_votes">
|
||||
<item quantity="one">%s voix</item>
|
||||
<item quantity="other">%s voix</item>
|
||||
</plurals>
|
||||
</resources>
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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 & ú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>
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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 d’un 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">S’acaba 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 l’imatge %s</string>
|
||||
<string name="pref_title_animate_gif_avatars">Activar l’animacion dels avatars</string>
|
||||
|
@ -450,4 +450,8 @@
|
|||
<string name="warning_scheduling_interval">L’interval minimum de planificacion sus Mastodon e de 5 minutas.</string>
|
||||
<string name="notification_follow_request_name">Demandas d’abonament</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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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)
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
|
@ -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 !
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
टस्की v१२.०
|
||||
|
||||
- संशोधितमुख्यमाध्यमः - पीठिकाः अधोऽपि स्थापयितुं शक्यते
|
||||
- कस्मैचिन्मूकत्वप्रदानप्रक्रियायां, सूचनाश्च निःशब्दा भवेन्न वेति चेतुं शक्यते
|
||||
- सम्प्रति नैकानि निश्रेणिचिह्नानि यथेच्छया एकस्यामेव पीठिकायां योक्तुं शक्यते
|
||||
- सामग्रीविवरणविधिः संशोधितः येन दीर्घतरविवरणमपि योक्तुं शक्यते
|
||||
|
||||
सर्वाणि परिवर्तनपत्राणि https://github.com/tuskyapp/Tusky/releases
|
|
@ -0,0 +1,12 @@
|
|||
टस्कीति लघुग्राहिका मास्टोडन् इत्यस्य कृते, यदनावृतस्रोतो निःशुल्कसामाजिकजालवितारकम् ।
|
||||
|
||||
* वस्तुपरिकल्पना
|
||||
* अधिकांशमास्टोडोनीयाः अनुप्रयोगविधिलेखनमाध्यमाः युक्ताः
|
||||
* बहुव्यक्तित्वलेखासाहाय्यम्
|
||||
* अन्धकारप्रबन्धः प्रदीप्तिप्रबन्धोऽपि समयानुसारेण स्वचालितविपरिवर्तनञ्च
|
||||
* विकर्षाः - दौत्यं लिखित्वा भविष्यते रक्ष्यताम्
|
||||
* नैका भावचिह्नशैल्योऽवचीयन्ताम्
|
||||
* सर्वाकारयुक्तेभ्यः पटलेभ्यः सरलीकृतम्
|
||||
* पूर्णत्वेनाऽनावृत्तस्रोतस्तथा च न सशुल्काधीनत्वं गुगलसेवासदृशम्
|
||||
|
||||
मास्टोडोन् इत्यस्य विषयेऽधिकं ज्ञातुमत्र गम्यताम् : https://joinmastodon.org/
|
|
@ -0,0 +1 @@
|
|||
एका बहुग्राहिका मास्टोडोन् इति सामाजिकलसञ्जालेभ्यः
|
|
@ -0,0 +1 @@
|
|||
टस्की
|
|
@ -1 +1 @@
|
|||
Odjemalec z več računi za socialno omrežje Mastodon
|
||||
Odjemalec z več računi za socialno omrežje Mastodon.
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue