Translations update from Hosted Weblate (#524)
* weather: introduce display precipitation Introduce a new datatype called DisplayPrecipitation that optimizes the precipitation level for UI display. This is primarily meant to fix improper precipitation displays when values lower than 0.1 in are shown, albiet that may need to change eventually. * Translated using Weblate (Hindi) Currently translated at 100.0% (283 of 283 strings) Translation: Auxio/Strings Translate-URL: https://hosted.weblate.org/projects/auxio/strings/hi/ * Translated using Weblate (Lithuanian) Currently translated at 100.0% (283 of 283 strings) Translation: Auxio/Strings Translate-URL: https://hosted.weblate.org/projects/auxio/strings/lt/ * Translated using Weblate (Punjabi) Currently translated at 100.0% (283 of 283 strings) Translation: Auxio/Strings Translate-URL: https://hosted.weblate.org/projects/auxio/strings/pa/ * Translated using Weblate (Punjabi) Currently translated at 100.0% (36 of 36 strings) Translation: Auxio/Metadata Translate-URL: https://hosted.weblate.org/projects/auxio/metadata/pa/ * Translated using Weblate (Hindi) Currently translated at 100.0% (36 of 36 strings) Translation: Auxio/Metadata Translate-URL: https://hosted.weblate.org/projects/auxio/metadata/hi/ * Translated using Weblate (Spanish) Currently translated at 100.0% (283 of 283 strings) Translation: Auxio/Strings Translate-URL: https://hosted.weblate.org/projects/auxio/strings/es/ * Translated using Weblate (Polish) Currently translated at 100.0% (283 of 283 strings) Translation: Auxio/Strings Translate-URL: https://hosted.weblate.org/projects/auxio/strings/pl/ * Translated using Weblate (Finnish) Currently translated at 93.2% (264 of 283 strings) Translation: Auxio/Strings Translate-URL: https://hosted.weblate.org/projects/auxio/strings/fi/ --------- Co-authored-by: Alexander Capehart <alex@oxycblt.org> Co-authored-by: ShareASmile <aapshergill@gmail.com> Co-authored-by: Vaclovas Intas <vaclovas1999@gmail.com> Co-authored-by: gallegonovato <fran-carro@hotmail.es> Co-authored-by: Eryk Michalak <gnu.ewm@protonmail.com> Co-authored-by: Jiri Grönroos <jiri.gronroos@iki.fi>
This commit is contained in:
parent
a1947c4102
commit
816ab04252
12 changed files with 223 additions and 65 deletions
|
@ -192,7 +192,7 @@ class AlbumDetailFragment :
|
|||
override fun onShuffle() {
|
||||
playbackModel.shuffle(unlikelyToBeNull(detailModel.currentAlbum.value))
|
||||
}
|
||||
|
||||
|
||||
override fun onOpenSortMenu() {
|
||||
findNavController().navigateSafe(AlbumDetailFragmentDirections.sort())
|
||||
}
|
||||
|
|
88
app/src/main/java/org/oxycblt/auxio/list/sort/SortAdapter.kt
Normal file
88
app/src/main/java/org/oxycblt/auxio/list/sort/SortAdapter.kt
Normal file
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
* Copyright (c) 2023 Auxio Project
|
||||
* SortAdapter.kt is part of Auxio.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.oxycblt.auxio.list.sort
|
||||
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.DiffUtil
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import org.oxycblt.auxio.databinding.ItemSortModeBinding
|
||||
import org.oxycblt.auxio.list.Sort
|
||||
import org.oxycblt.auxio.list.adapter.FlexibleListAdapter
|
||||
import org.oxycblt.auxio.util.inflater
|
||||
|
||||
class SortAdapter(var selectedMode: Sort.Mode) :
|
||||
FlexibleListAdapter<Sort.Mode, SortModeViewHolder>(SortModeViewHolder.DIFF_CALLBACK) {
|
||||
var currentlySelected = selectedMode
|
||||
private set
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
|
||||
SortModeViewHolder.from(parent)
|
||||
|
||||
override fun onBindViewHolder(holder: SortModeViewHolder, position: Int) {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: SortModeViewHolder, position: Int, payload: List<Any>) {
|
||||
val mode = getItem(position)
|
||||
if (payload.isEmpty()) {
|
||||
holder.bind(mode)
|
||||
}
|
||||
holder.setSelected(mode == currentlySelected)
|
||||
}
|
||||
|
||||
fun setSelected(mode: Sort.Mode) {
|
||||
if (mode == currentlySelected) return
|
||||
val oldMode = currentList.indexOf(currentlySelected)
|
||||
val newMode = currentList.indexOf(mode)
|
||||
currentlySelected = selectedMode
|
||||
notifyItemChanged(oldMode, PAYLOAD_SELECTION_CHANGED)
|
||||
notifyItemChanged(newMode, PAYLOAD_SELECTION_CHANGED)
|
||||
}
|
||||
|
||||
private companion object {
|
||||
val PAYLOAD_SELECTION_CHANGED = Any()
|
||||
}
|
||||
}
|
||||
|
||||
class SortModeViewHolder private constructor(private val binding: ItemSortModeBinding) :
|
||||
RecyclerView.ViewHolder(binding.root) {
|
||||
fun bind(mode: Sort.Mode) {
|
||||
// TODO: Add names to sort.mode
|
||||
binding.sortRadio.text = mode.toString()
|
||||
}
|
||||
|
||||
fun setSelected(selected: Boolean) {
|
||||
binding.sortRadio.isChecked = selected
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun from(parent: View) =
|
||||
SortModeViewHolder(ItemSortModeBinding.inflate(parent.context.inflater))
|
||||
|
||||
val DIFF_CALLBACK =
|
||||
object : DiffUtil.ItemCallback<Sort.Mode>() {
|
||||
override fun areItemsTheSame(oldItem: Sort.Mode, newItem: Sort.Mode) =
|
||||
oldItem == newItem
|
||||
|
||||
override fun areContentsTheSame(oldItem: Sort.Mode, newItem: Sort.Mode) =
|
||||
oldItem == newItem
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2023 Auxio Project
|
||||
* SortDialog.kt is part of Auxio.
|
||||
* MenuDialogFragment.kt is part of Auxio.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -16,74 +16,126 @@
|
|||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.oxycblt.auxio.list.sort
|
||||
package org.oxycblt.auxio.list.menu
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import androidx.core.view.updatePadding
|
||||
import android.view.MenuInflater
|
||||
import android.view.MenuItem
|
||||
import androidx.appcompat.view.menu.MenuBuilder
|
||||
import androidx.core.view.children
|
||||
import androidx.navigation.fragment.findNavController
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import org.oxycblt.auxio.R
|
||||
import org.oxycblt.auxio.databinding.DialogSortBinding
|
||||
import org.oxycblt.auxio.databinding.DialogMenuBinding
|
||||
import org.oxycblt.auxio.list.ClickableListListener
|
||||
import org.oxycblt.auxio.list.Sort
|
||||
import org.oxycblt.auxio.list.ListViewModel
|
||||
import org.oxycblt.auxio.list.Menu
|
||||
import org.oxycblt.auxio.list.adapter.UpdateInstructions
|
||||
import org.oxycblt.auxio.ui.ViewBindingBottomSheetDialogFragment
|
||||
import org.oxycblt.auxio.util.systemBarInsetsCompat
|
||||
import org.oxycblt.auxio.util.collectImmediately
|
||||
import org.oxycblt.auxio.util.logD
|
||||
|
||||
abstract class SortDialog :
|
||||
ViewBindingBottomSheetDialogFragment<DialogSortBinding>(), ClickableListListener<Sort.Mode> {
|
||||
private val modeAdapter = SortModeAdapter(this)
|
||||
/**
|
||||
* A [ViewBindingBottomSheetDialogFragment] that displays basic music information and a series of
|
||||
* options.
|
||||
*
|
||||
* @author Alexander Capehart (OxygenCobalt)
|
||||
*
|
||||
* TODO: Extend the amount of music info shown in the dialog
|
||||
*/
|
||||
abstract class MenuDialogFragment<M : Menu> :
|
||||
ViewBindingBottomSheetDialogFragment<DialogMenuBinding>(), ClickableListListener<MenuItem> {
|
||||
protected abstract val menuModel: MenuViewModel
|
||||
protected abstract val listModel: ListViewModel
|
||||
private val menuAdapter = MenuItemAdapter(@Suppress("LeakingThis") this)
|
||||
|
||||
abstract fun getInitialSort(): Sort
|
||||
abstract val parcel: Menu.Parcel
|
||||
|
||||
abstract fun applyChosenSort(sort: Sort)
|
||||
/**
|
||||
* Get the options to disable in the context of the currently shown [M].
|
||||
*
|
||||
* @param menu The currently-shown menu [M].
|
||||
*/
|
||||
abstract fun getDisabledItemIds(menu: M): Set<Int>
|
||||
|
||||
abstract fun getModeChoices(): List<Sort.Mode>
|
||||
/**
|
||||
* Update the displayed information about the currently shown [M].
|
||||
*
|
||||
* @param binding The [DialogMenuBinding] to bind information to.
|
||||
* @param menu The currently-shown menu [M].
|
||||
*/
|
||||
abstract fun updateMenu(binding: DialogMenuBinding, menu: M)
|
||||
|
||||
override fun onCreateBinding(inflater: LayoutInflater) = DialogSortBinding.inflate(inflater)
|
||||
/**
|
||||
* Forward the clicked [MenuItem] to it's corresponding handler in another module.
|
||||
*
|
||||
* @param item The [MenuItem] that was clicked.
|
||||
* @param menu The currently-shown menu [M].
|
||||
*/
|
||||
abstract fun onClick(item: MenuItem, menu: M)
|
||||
|
||||
override fun onBindingCreated(binding: DialogSortBinding, savedInstanceState: Bundle?) {
|
||||
override fun onCreateBinding(inflater: LayoutInflater) = DialogMenuBinding.inflate(inflater)
|
||||
|
||||
override fun onBindingCreated(binding: DialogMenuBinding, savedInstanceState: Bundle?) {
|
||||
super.onBindingCreated(binding, savedInstanceState)
|
||||
|
||||
// --- UI SETUP ---
|
||||
binding.root.setOnApplyWindowInsetsListener { v, insets ->
|
||||
v.updatePadding(bottom = insets.systemBarInsetsCompat.bottom)
|
||||
insets
|
||||
binding.menuName.isSelected = true
|
||||
binding.menuInfo.isSelected = true
|
||||
binding.menuOptionRecycler.apply {
|
||||
adapter = menuAdapter
|
||||
itemAnimator = null
|
||||
}
|
||||
|
||||
binding.sortModeRecycler.adapter = modeAdapter
|
||||
// --- VIEWMODEL SETUP ---
|
||||
listModel.menu.consume()
|
||||
menuModel.setMenu(parcel)
|
||||
collectImmediately(menuModel.currentMenu, this::updateMenu)
|
||||
}
|
||||
|
||||
binding.sortCancel.setOnClickListener { dismiss() }
|
||||
override fun onDestroyBinding(binding: DialogMenuBinding) {
|
||||
super.onDestroyBinding(binding)
|
||||
binding.menuName.isSelected = false
|
||||
binding.menuInfo.isSelected = false
|
||||
binding.menuOptionRecycler.adapter = null
|
||||
}
|
||||
|
||||
binding.sortSave.setOnClickListener {
|
||||
val initial = getInitialSort()
|
||||
// FIXME: This won't work for the playlist sort dialog.
|
||||
val mode = modeAdapter.currentMode ?: initial.mode
|
||||
val direction =
|
||||
when (binding.sortDirectionGroup.checkedButtonId) {
|
||||
R.id.sort_direction_asc -> Sort.Direction.ASCENDING
|
||||
R.id.sort_direction_dsc -> Sort.Direction.DESCENDING
|
||||
else -> initial.direction
|
||||
}
|
||||
applyChosenSort(Sort(mode, direction))
|
||||
dismiss()
|
||||
private fun updateMenu(menu: Menu?) {
|
||||
if (menu == null) {
|
||||
logD("No menu to show, navigating away")
|
||||
findNavController().navigateUp()
|
||||
return
|
||||
}
|
||||
|
||||
// --- STATE SETUP ---
|
||||
val initial = getInitialSort()
|
||||
@Suppress("UNCHECKED_CAST") val casted = menu as? M
|
||||
check(casted != null) { "Unexpected menu instance ${menu::class.simpleName}" }
|
||||
|
||||
modeAdapter.update(getModeChoices(), UpdateInstructions.Diff)
|
||||
modeAdapter.setSelected(initial.mode)
|
||||
// We need to inflate the menu on every menu update since it might have changed
|
||||
// what options are available (ex. if an artist with no songs has had new songs added).
|
||||
// Since we don't have (and don't want) a dummy view to inflate this menu, just
|
||||
// depend on the AndroidX Toolbar internal API and hope for the best.
|
||||
@SuppressLint("RestrictedApi") val builder = MenuBuilder(requireContext())
|
||||
MenuInflater(requireContext()).inflate(casted.res, builder)
|
||||
|
||||
val directionId =
|
||||
when (initial.direction) {
|
||||
Sort.Direction.ASCENDING -> R.id.sort_direction_asc
|
||||
Sort.Direction.DESCENDING -> R.id.sort_direction_dsc
|
||||
// Disable any menu options as specified by the impl
|
||||
val disabledIds = getDisabledItemIds(casted)
|
||||
val visible =
|
||||
builder.children.mapTo(mutableListOf()) {
|
||||
it.isEnabled = !disabledIds.contains(it.itemId)
|
||||
it
|
||||
}
|
||||
binding.sortDirectionGroup.check(directionId)
|
||||
menuAdapter.update(visible, UpdateInstructions.Diff)
|
||||
|
||||
// Delegate to impl how to show music
|
||||
updateMenu(requireBinding(), casted)
|
||||
}
|
||||
|
||||
override fun onClick(item: Sort.Mode, viewHolder: RecyclerView.ViewHolder) {
|
||||
modeAdapter.setSelected(item)
|
||||
final override fun onClick(item: MenuItem, viewHolder: RecyclerView.ViewHolder) {
|
||||
// All option selections close the dialog currently.
|
||||
// TODO: This should change if the app is 100% migrated to menu dialogs
|
||||
findNavController().navigateUp()
|
||||
// Delegate to impl on how to handle items
|
||||
@Suppress("UNCHECKED_CAST") onClick(item, menuModel.currentMenu.value as M)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -210,6 +210,9 @@
|
|||
<action
|
||||
android:id="@+id/play_from_genre"
|
||||
app:destination="@id/play_from_genre_dialog" />
|
||||
<action
|
||||
android:id="@+id/sort"
|
||||
app:destination="@id/sort_dialog" />
|
||||
</fragment>
|
||||
|
||||
<dialog
|
||||
|
@ -460,4 +463,10 @@
|
|||
android:name="parcel"
|
||||
app:argType="org.oxycblt.auxio.list.Menu$ForPlaylist$Parcel" />
|
||||
</dialog>
|
||||
|
||||
<dialog
|
||||
android:id="@+id/sort_dialog"
|
||||
android:name="org.oxycblt.auxio.list.sort.SortDialog"
|
||||
android:label="sort_dialog"
|
||||
tools:layout="@layout/dialog_sort" />
|
||||
</navigation>
|
|
@ -303,4 +303,5 @@
|
|||
<string name="set_square_covers_desc">Recorta todas las portadas de los álbumes a una relación de aspecto 1:1</string>
|
||||
<string name="lbl_song">Canción</string>
|
||||
<string name="lbl_parent_detail">Vista</string>
|
||||
<string name="set_play_song_by_itself">Reproducir la canción por tí mismo</string>
|
||||
</resources>
|
|
@ -271,4 +271,6 @@
|
|||
<string name="set_reindex_desc">Lataa musiikkikirjasto uudelleen, käytä välimuistissa olevia tunnisteita kun mahdollista</string>
|
||||
<string name="set_square_covers_desc">Rajaa kaikki albumikannet 1:1-suhteeseen</string>
|
||||
<string name="set_rescan_desc">Tyhjennä tunnistevälimuisti ja lataa musiikkikirjasto kokonaan uudelleen (hitaampi mutta kattavampi)</string>
|
||||
<string name="lbl_song">Kappale</string>
|
||||
<string name="lbl_parent_detail">Näytä</string>
|
||||
</resources>
|
|
@ -187,7 +187,7 @@
|
|||
<string name="set_separators_slash">स्लैश (/)</string>
|
||||
<string name="fmt_db_neg">-%.1f dB</string>
|
||||
<string name="fmt_editing">संपादन %s</string>
|
||||
<string name="set_separators_plus">Plus (+)</string>
|
||||
<string name="set_separators_plus">पलॅस (+)</string>
|
||||
<string name="set_separators_and">ऐंपरसैंड (&)</string>
|
||||
<string name="set_dirs_mode">मोड</string>
|
||||
<string name="desc_no_cover">एल्बम कवर</string>
|
||||
|
@ -298,4 +298,5 @@
|
|||
<string name="clr_pink">गुलाबी</string>
|
||||
<string name="set_intelligent_sorting">बुद्धिमान छंटाई</string>
|
||||
<string name="set_intelligent_sorting_desc">संख्याओं या \"the\" जैसे शब्दों से शुरू होने वाले नामों को सही ढंग से क्रमबद्ध करें (अंग्रेजी भाषा के संगीत के साथ सबसे अच्छा काम करता है)</string>
|
||||
<string name="set_play_song_by_itself">इसी गीत को चलाएं</string>
|
||||
</resources>
|
|
@ -9,7 +9,7 @@
|
|||
<string name="lbl_name">Pavadinimas</string>
|
||||
<string name="lbl_date">Metai</string>
|
||||
<string name="lbl_duration">Trukmė</string>
|
||||
<string name="lbl_song_count">Dainų skaičius</string>
|
||||
<string name="lbl_song_count">Dainos skaičius</string>
|
||||
<string name="lbl_disc">Diskas</string>
|
||||
<string name="lbl_date_added">Pridėta data</string>
|
||||
<string name="lbl_sort_asc">Didėjantis</string>
|
||||
|
@ -48,7 +48,7 @@
|
|||
<string name="set_black_mode_desc">Naudoti grynai juodą tamsią temą</string>
|
||||
<string name="info_app_desc">Paprastas, racionalus Android muzikos grotuvas.</string>
|
||||
<string name="lbl_indexer">Muzika kraunama</string>
|
||||
<string name="lng_widget">Peržiūrėti ir valdyti muzikos grojimą</string>
|
||||
<string name="lng_widget">Peržiūrėk ir valdyk muzikos grojimą</string>
|
||||
<string name="lbl_genres">Žanrai</string>
|
||||
<string name="lbl_retry">Pakartoti</string>
|
||||
<string name="lbl_grant">Suteikti</string>
|
||||
|
@ -74,8 +74,8 @@
|
|||
<string name="lbl_observing">Stebėjimas muzikos biblioteka</string>
|
||||
<string name="lng_observing">Stebima tavo muzikos biblioteko dėl pakeitimų…</string>
|
||||
<string name="lbl_shuffle_shortcut_short">Maišyti</string>
|
||||
<string name="lbl_shuffle_shortcut_long">Išmaišyti viską</string>
|
||||
<string name="lbl_state_restored">Būsena atkurta</string>
|
||||
<string name="lbl_shuffle_shortcut_long">Maišyti viską</string>
|
||||
<string name="lbl_state_restored">Atkurta būsena</string>
|
||||
<string name="lbl_state_saved">Išsaugota būsena</string>
|
||||
<string name="lbl_cancel">Atšaukti</string>
|
||||
<string name="lbl_code">Šaltinio kodas</string>
|
||||
|
@ -203,7 +203,7 @@
|
|||
<string name="err_did_not_restore">Nepavyko atkurti būsenos</string>
|
||||
<string name="set_pre_amp">ReplayGain išankstinis stiprintuvas</string>
|
||||
<string name="set_save_state">Išsaugoti grojimo būseną</string>
|
||||
<string name="set_dirs_desc">Tvarkyk, kur muzika turėtų būti įkeliama iš</string>
|
||||
<string name="set_dirs_desc">Tvarkyti, kur muzika turėtų būti įkeliama iš</string>
|
||||
<string name="desc_genre_image">Žanro vaizdas %s</string>
|
||||
<string name="desc_shuffle">Įjungti maišymą arba išjungti</string>
|
||||
<string name="desc_track_number">Takelis %d</string>
|
||||
|
@ -257,10 +257,10 @@
|
|||
<string name="lbl_reset">Nustatyti iš naujo</string>
|
||||
<string name="set_library">Biblioteka</string>
|
||||
<string name="set_behavior">Elgesys</string>
|
||||
<string name="set_ui_desc">Pakeisti programos temą ir spalvas</string>
|
||||
<string name="set_ui_desc">Pakeisk programos temą ir spalvas</string>
|
||||
<string name="set_content_desc">Valdyk, kaip muzika ir vaizdai įkeliami</string>
|
||||
<string name="set_audio_desc">Konfigūruok garso ir grojimo elgesį</string>
|
||||
<string name="set_personalize_desc">Pritaikyti UI valdiklius ir elgseną</string>
|
||||
<string name="set_personalize_desc">Pritaikyk UI valdiklius ir elgseną</string>
|
||||
<string name="set_music">Muzika</string>
|
||||
<string name="set_images">Vaizdai</string>
|
||||
<string name="set_playback">Grojimas</string>
|
||||
|
@ -275,10 +275,10 @@
|
|||
<string name="desc_playlist_image">Grojaraščio vaizdas %s</string>
|
||||
<string name="desc_new_playlist">Sukurti naują grojaraštį</string>
|
||||
<string name="lbl_new_playlist">Naujas grojaraštis</string>
|
||||
<string name="lbl_playlist_add">Įtraukti į grojaraštį</string>
|
||||
<string name="lbl_playlist_add">Pridėti į grojaraštį</string>
|
||||
<string name="lng_playlist_added">Pridėta į grojaraštį</string>
|
||||
<string name="lbl_delete">Ištrinti</string>
|
||||
<string name="fmt_deletion_info">Ištrinti %s\? To negalima atšaukti.</string>
|
||||
<string name="fmt_deletion_info">Ištrinti %s\? To negalima atkurti.</string>
|
||||
<string name="lbl_rename">Pervadinti</string>
|
||||
<string name="lbl_rename_playlist">Pervadinti grojaraštį</string>
|
||||
<string name="lbl_confirm_delete_playlist">Ištrinti grojaraštį\?</string>
|
||||
|
|
|
@ -291,4 +291,5 @@
|
|||
<string name="set_square_covers_desc">ਸਾਰੇ ਐਲਬਮ ਕਵਰਾਂ ਨੂੰ 1:1 ਦੇ ਆਕਾਰ ਅਨੁਪਾਤ ਤੱਕ ਕਾਂਟ-ਛਾਂਟ ਕਰੋ</string>
|
||||
<string name="lbl_song">ਗੀਤ</string>
|
||||
<string name="lbl_parent_detail">ਵੇਖੋ</string>
|
||||
<string name="set_play_song_by_itself">ਇਸੇ ਗੀਤ ਨੂੰ ਚਲਾਓ</string>
|
||||
</resources>
|
|
@ -302,4 +302,7 @@
|
|||
<string name="fmt_editing">Edytowanie %s</string>
|
||||
<string name="set_square_covers_desc">Przytnij okładki do formatu 1:1</string>
|
||||
<string name="set_square_covers">Wymuś kwadratowe okładki</string>
|
||||
<string name="lbl_song">Piosenka</string>
|
||||
<string name="set_play_song_by_itself">Odtwarzanie utworu samodzielnie</string>
|
||||
<string name="lbl_parent_detail">Widok</string>
|
||||
</resources>
|
|
@ -1,9 +1,9 @@
|
|||
Auxio एक तेज़, विश्वसनीय UI/UX वाला एक स्थानीय संगीत प्लेयर है, जिसमें अन्य संगीत प्लेयर में मौजूद कई बेकार सुविधाएँ नहीं हैं। एक्सोप्लेयर से निर्मित, औक्सियो में पुराने एंड्रॉइड कार्यक्षमता का उपयोग करने वाले अन्य ऐप्स की तुलना में बेहतर पुस्तकालय समर्थन और सुनने की गुणवत्ता है। संक्षेप में,
|
||||
Auxio एक तेज़, विश्वसनीय UI/UX वाला एक स्थानीय संगीत प्लेयर है, जिसमें अन्य संगीत प्लेयर में मौजूद कई बेकार सुविधाएँ नहीं हैं। आधुनिक मीडिया प्लेबैक लाइब्रेरीओं से निर्मित, औक्सियो में पुराने एंड्रॉइड कार्यक्षमता का उपयोग करने वाले अन्य ऐप्स की तुलना में बेहतर पुस्तकालय समर्थन और सुनने की गुणवत्ता है। संक्षेप में,
|
||||
<b>यह संगीत बजाता है</b>.
|
||||
|
||||
<b>विशेषताएं</b>
|
||||
|
||||
- ExoPlayer-आधारित प्लेबैक
|
||||
- मीडिया3 एक्सोप्लेयर आधारित प्लेबैक
|
||||
- नवीनतम मटीरियल डिज़ाइन दिशानिर्देशों से प्राप्त स्नैपी UI
|
||||
- ओपिनियनेटेड UX जो ओवर एज केस के उपयोग को प्राथमिकता देता है
|
||||
- अनुकूलन योग्य व्यवहार
|
||||
|
@ -13,7 +13,7 @@ Auxio एक तेज़, विश्वसनीय UI/UX वाला एक
|
|||
- विश्वसनीय प्लेलिस्टिंग कार्यक्षमता
|
||||
- प्लेबैक अवस्था दृढ़ता
|
||||
- पूर्ण रीप्लेगैन समर्थन (MP3, FLAC, OGG, OPUS और MP4 फ़ाइलों पर)
|
||||
- बाहरी तुल्यकारक समर्थन (उदा। वेवलेट)
|
||||
- बाहरी तुल्यकारक समर्थन (उदा: वेवलेट)
|
||||
- एज-टू-एज
|
||||
- एंबेडेड कवर समर्थन
|
||||
- खोज कार्यक्षमता
|
||||
|
|
|
@ -1,22 +1,23 @@
|
|||
Auxio ਇੱਕ ਤੇਜ਼, ਭਰੋਸੇਮੰਦ UI/UX ਵਾਲਾ ਇੱਕ ਸਥਾਨਕ ਸੰਗੀਤ ਪਲੇਅਰ ਹੈ ਜੋ ਦੂਜੇ ਸੰਗੀਤ ਪਲੇਅਰਾਂ ਵਿੱਚ ਮੌਜੂਦ ਬਹੁਤ ਸਾਰੀਆਂ ਬੇਕਾਰ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਤੋਂ ਬਿਨਾਂ ਹੈ। Exoplayer ਤੋਂ ਬਣਿਆ, Auxio ਕੋਲ ਪੁਰਾਣੀ ਐਂਡਰੌਇਡ ਕਾਰਜਕੁਸ਼ਲਤਾ ਦੀ ਵਰਤੋਂ ਕਰਨ ਵਾਲੀਆਂ ਹੋਰ ਐਪਾਂ ਦੇ ਮੁਕਾਬਲੇ ਵਧੀਆ ਲਾਇਬ੍ਰੇਰੀ ਸਹਾਇਤਾ ਅਤੇ ਸੁਣਨ ਦੀ ਗੁਣਵੱਤਾ ਹੈ। ਸੰਖੇਪ ਵਿੱਚ, <b>ਇਹ ਸੰਗੀਤ ਚਲਾਉਂਦਾ ਹੈ</b>.
|
||||
Auxio ਇੱਕ ਤੇਜ਼, ਭਰੋਸੇਮੰਦ UI/UX ਵਾਲਾ ਇੱਕ ਸਥਾਨਕ ਸੰਗੀਤ ਪਲੇਅਰ ਹੈ ਜੋ ਦੂਜੇ ਸੰਗੀਤ ਪਲੇਅਰਾਂ ਵਿੱਚ ਮੌਜੂਦ ਬਹੁਤ ਸਾਰੀਆਂ ਬੇਕਾਰ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਤੋਂ ਬਿਨਾਂ ਹੈ। ਆਧੁਨਿਕ ਮੀਡੀਆ ਪਲੇਬੈਕ ਲਾਇਬ੍ਰੇਰੀਆਂ ਤੋਂ ਬਣਿਆ, Auxio ਕੋਲ ਪੁਰਾਣੀ ਐਂਡਰੌਇਡ ਕਾਰਜਕੁਸ਼ਲਤਾ ਦੀ ਵਰਤੋਂ ਕਰਨ ਵਾਲੀਆਂ ਹੋਰ ਐਪਾਂ ਦੇ ਮੁਕਾਬਲੇ ਵਧੀਆ ਲਾਇਬ੍ਰੇਰੀ ਸਹਾਇਤਾ ਅਤੇ ਸੁਣਨ ਦੀ ਗੁਣਵੱਤਾ ਹੈ। ਸੰਖੇਪ ਵਿੱਚ, <b>ਇਹ ਸੰਗੀਤ ਚਲਾਉਂਦਾ ਹੈ</b>.
|
||||
|
||||
<b>ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ</b>
|
||||
|
||||
- ExoPlayer-ਅਧਾਰਿਤ ਪਲੇਬੈਕ
|
||||
- ਨਵੀਨਤਮ ਸਮੱਗਰੀ ਡਿਜ਼ਾਈਨ ਦਿਸ਼ਾ-ਨਿਰਦੇਸ਼ਾਂ ਤੋਂ ਲਿਆ ਗਿਆ Snappy UI
|
||||
- ਮੀਡੀਆ 3 ਐਕਸੋਪਲੇਅਰ ਅਧਾਰਿਤ ਪਲੇਬੈਕ
|
||||
- ਨਵੀਨਤਮ ਸਮੱਗਰੀ ਡਿਜ਼ਾਈਨ ਦਿਸ਼ਾ-ਨਿਰਦੇਸ਼ਾਂ ਤੋਂ ਲਿਆ ਗਿਆ ਚੁਸਤ-ਦਰੁਸਤ UI
|
||||
- ਓਪੀਨੀਏਟਿਡ UX ਜੋ ਕਿ ਕਿਨਾਰੇ ਕੇਸਾਂ 'ਤੇ ਵਰਤੋਂ ਵਿੱਚ ਆਸਾਨੀ ਨੂੰ ਤਰਜੀਹ ਦਿੰਦਾ ਹੈ
|
||||
- ਅਨੁਕੂਲਿਤ ਵਿਵਹਾਰ
|
||||
- ਡਿਸਕ ਨੰਬਰਾਂ, ਮਲਟੀਪਲ ਕਲਾਕਾਰਾਂ, ਰੀਲੀਜ਼ ਕਿਸਮਾਂ, ਸਟੀਕ ਲਈ ਸਮਰਥਨ /ਮੂਲ ਤਾਰੀਖਾਂ, ਕ੍ਰਮਬੱਧ ਟੈਗਸ, ਅਤੇ ਹੋਰ
|
||||
- ਉੱਨਤ ਕਲਾਕਾਰ ਪ੍ਰਣਾਲੀ ਜੋ ਕਲਾਕਾਰਾਂ ਅਤੇ ਐਲਬਮ ਕਲਾਕਾਰਾਂ ਨੂੰ ਇਕਜੁੱਟ ਕਰਦੀ ਹੈ
|
||||
- SD ਕਾਰਡ-ਜਾਣੂ ਫੋਲਡਰ ਪ੍ਰਬੰਧਨ
|
||||
|
||||
- ਭਰੋਸੇਯੋਗ ਪਲੇਅਲਿਸਟਿੰਗ ਕਾਰਜਕੁਸ਼ਲਤਾ
|
||||
- ਭਰੋਸੇਯੋਗ ਪਲੇਅਬੈਕ ਸਥਿਤੀ ਸਥਿਰਤਾ
|
||||
- ਪੂਰਾ ਰੀਪਲੇਗੇਨ ਸਮਰਥਨ (MP3, FLAC, OGG, OPUS, ਅਤੇ MP4 ਫਾਈਲਾਂ 'ਤੇ)
|
||||
- ਪੂਰਾ ਰੀਪਲੇਅ-ਗੇਨ ਸਮਰਥਨ (MP3, FLAC, OGG, OPUS, ਅਤੇ MP4 ਫਾਈਲਾਂ 'ਤੇ)
|
||||
- ਬਾਹਰੀ ਈਕੋਲਾਈਜ਼ਰ ਦਾ ਸਮਰਥਨ (ਉਦਾਹਰਨ. ਵੇਵਲੇਟ)
|
||||
- ਕਿਨਾਰੇ-ਤੋਂ-ਕਿਨਾਰੇ
|
||||
- ਏਮਬੈਡਡ ਕਵਰ ਸਪੋਰਟ
|
||||
- ਏਮਬੈੱਡਡ ਕਵਰ ਸਪੋਰਟ
|
||||
- ਖੋਜ ਕਾਰਜਸ਼ੀਲਤਾ
|
||||
- ਹੈੱਡਸੈੱਟ ਆਟੋਪਲੇ
|
||||
- ਸਟਾਈਲਿਸ਼ ਵਿਜੇਟਸ ਜੋ ਆਪਣੇ ਆਪ ਉਹਨਾਂ ਦੇ ਆਕਾਰ ਦੇ ਅਨੁਕੂਲ ਬਣਦੇ ਹਨ
|
||||
- ਪੂਰੀ ਤਰ੍ਹਾਂ ਨਿੱਜੀ ਅਤੇ ਔਫਲਾਈਨ
|
||||
- ਕੋਈ ਗੋਲ ਐਲਬਮ ਕਵਰ ਨਹੀਂ (ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਉਹਨਾਂ ਨੂੰ ਨਹੀਂ ਚਾਹੁੰਦੇ ਹੋ। ਤੁਸੀਂ ਕਰ ਸੱਕਦੇ ਹੋ।)
|
||||
- ਪੂਰੀ ਤਰ੍ਹਾਂ ਨਿੱਜੀ ਅਤੇ ਆਫਲਾਈਨ
|
||||
- ਕੋਈ ਗੋਲ ਐਲਬਮ ਕਵਰ ਨਹੀਂ (ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਉਹਨਾਂ ਨੂੰ ਨਹੀਂ ਚਾਹੁੰਦੇ ਹੋ। ਤੁਸੀਂ ਕਰ ਸਕਦੇ ਹੋ।)
|
||||
|
|
Loading…
Reference in a new issue