From fd8936125498463e165d72781dadf72b62e46801 Mon Sep 17 00:00:00 2001 From: Rino Russo Date: Fri, 5 Jan 2024 17:25:36 +0100 Subject: [PATCH] Added new translation Chinese Simplified and Traditional Visualizer improvements New version 0.6.16 release --- README.md | 15 +- app/build.gradle.kts | 4 +- .../it/vfsfitvnm/vimusic/enums/Locales.kt | 6 + .../vfsfitvnm/vimusic/equalizer/Equalizer.kt | 7 +- .../equalizer/audio/VisualizerComputer.kt | 28 +-- .../service/PlayerMediaBrowserService.kt | 3 + .../vimusic/service/PlayerService.kt | 163 +++++++++++----- .../vimusic/ui/screens/settings/About.kt | 11 +- .../vimusic/ui/screens/settings/UiSettings.kt | 29 +-- app/src/main/res/values-fr/strings.xml | 184 +++++++++--------- app/src/main/res/values-ro/strings.xml | 132 ++++++------- .../metadata/android/en-US/changelogs/11.txt | 3 + updatedVersion/updatedVersion.ver | 2 +- 13 files changed, 343 insertions(+), 244 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/11.txt diff --git a/README.md b/README.md index 59839e94ab..8ea75d478a 100644 --- a/README.md +++ b/README.md @@ -45,24 +45,27 @@ ## 🌐 Languages available +- **Arabic:** thanks to [Ahmad Al Juwaisri](https://crowdin.com/profile/juwaisri) - **Bashkir:** thanks to [Shilave malay](https://crowdin.com/profile/Bash.boy) - **Catalan:** thanks to [EMC_Translator](https://crowdin.com/profile/EMC_Translator) -- **Czech:** thanks to [@ikanakova](https://github.com/ikanakova) +- **Chinese Simplified:** thanks to [@SharkChan0622](https://github.com/SharkChan0622) +- **Chinese Traditional:** thanks to [@SharkChan0622](https://github.com/SharkChan0622) +- **Czech:** thanks to [@ikanakova](https://github.com/ikanakova) and [@JZITNIK-github](https://github.com/JZITNIK-github) and [Adam Kop](https://crowdin.com/profile/damianadam000) - **English:** thanks to [@fast4x](https://github.com/fast4x) - **Esperanto:** thanks to [@kjev666](https://github.com/kjev666) - **French:** thanks to [@NEVARLeVrai](https://github.com/NEVARLeVrai) -- **German:** thanks to [@siggi1984](https://github.com/siggi1984) +- **German:** thanks to [Conk](https://crowdin.com/profile/conk) and [@siggi1984](https://github.com/siggi1984) - **Greek:** thanks to [@Marinkas](https://github.com/Marinkas) - **Italian:** thanks to [@fast4x](https://github.com/fast4x) - **Indonesian:** thanks to [@teddysulaimanGL](https://github.com/teddysulaimanGL) - **Odia:** thanks to [@Get100percent](https://github.com/Get100percent) -- **Polish:** thanks to [@roklc](https://github.com/roklc) and [@damianadam000](https://github.com/damianadam000) +- **Polish:** thanks to [@roklc](https://github.com/roklc) and [Fabian Urra](https://crowdin.com/profile/nsagcl) - **Portuguese:** thanks to [@NEVARLeVrai](https://github.com/NEVARLeVrai) - **Portuguese, Brazilian:** thanks to [@NEVARLeVrai](https://github.com/NEVARLeVrai) - **Romanian:** thanks to [@OrangeZXZ](https://github.com/OrangeZxZ) -- **Russian:** thanks to [@siggi1984](https://github.com/siggi1984) -- **Spanish:** thanks to [@DanielSevillano](https://github.com/DanielSevillano) -- **Turkish:** thanks to [@abfreeman](https://github.com/abfreeman) and [@2010furs](https://github.com/2010furs) +- **Russian:** thanks to [Vladimir](https://crowdin.com/profile/vladimir15426) and [@siggi1984](https://github.com/siggi1984) +- **Spanish:** thanks to [@DanielSevillano](https://github.com/DanielSevillano) and [@DanielSevillano](https://github.com/DanielSevillano) +- **Turkish:** thanks to [@abfreeman](https://github.com/abfreeman) and [@2010furs](https://github.com/2010furs) and [Muha Aliss](https://crowdin.com/profile/muhaaliss) ## 🔤 Translations diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c121fca3b7..25b4580143 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -12,8 +12,8 @@ android { applicationId = "it.fast4x.rimusic" minSdk = 21 targetSdk = 33 - versionCode = 10 - versionName = "0.6.15.1" + versionCode = 11 + versionName = "0.6.16" buildConfigField("String", "VERSION_NAME", "\"$versionName\"") } diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/enums/Locales.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/enums/Locales.kt index 0b81fd6185..fe112c4103 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/enums/Locales.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/enums/Locales.kt @@ -2,10 +2,13 @@ package it.vfsfitvnm.vimusic.enums enum class Languages { System, + Arabic, Bashkir, Catalan, English, Esperanto, + ChineseSimplified, + ChineseTraditional, Czech, French, FrenchEmo, @@ -26,8 +29,11 @@ enum class Languages { var code: String = "en" get() = when (this) { System -> "system" + Arabic -> "ar" Bashkir -> "ba" Catalan -> "ca" + ChineseSimplified -> "zh-CN" + ChineseTraditional -> "zh-TW" English -> "en" Esperanto -> "eo" Italian -> "it" diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/equalizer/Equalizer.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/equalizer/Equalizer.kt index 2ce0b40ece..3a7d537418 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/equalizer/Equalizer.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/equalizer/Equalizer.kt @@ -243,10 +243,11 @@ fun ContentType( VisualizerComputer.setupPermissions( LocalContext.current as Activity ) val audioComputer = VisualizerComputer() - + Log.d("mediaItemEqualizer","EXTERNAL audioSession ${binder?.player?.audioSessionId}") binder?.player?.audioSessionId?.let { - + Log.d("mediaItemEqualizer","internal audioSession ${it}") audioComputer.start(audioSessionId = it, onData = { data -> + Log.d("mediaItemEqualizer","onData amplitude ${data.amplitude} captureSize ${data.captureSize} rawWaveform ${data.rawWaveform} samplingRate ${data.samplingRate}") visualizerData.value = data }) } @@ -278,7 +279,7 @@ fun ContentType( //.background(colorPalette.overlay), .background(Color.Black.copy(0.8f)), data = visualizerData.value, - barCount = 16, + barCount = 32, maxStackCount = 16 ) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/equalizer/audio/VisualizerComputer.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/equalizer/audio/VisualizerComputer.kt index 806542e3c7..440f0fed82 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/equalizer/audio/VisualizerComputer.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/equalizer/audio/VisualizerComputer.kt @@ -86,19 +86,21 @@ class VisualizerComputer { } fun start(audioSessionId: Int = 0, onData: (VisualizerData) -> Unit) { - stop() - visualizer = Visualizer(audioSessionId).apply { - enabled = false // All configuration have to be done in a disabled state - captureSize = CAPTURE_SIZE - scalingMode = Visualizer.SCALING_MODE_NORMALIZED //Check - measurementMode = Visualizer.MEASUREMENT_MODE_NONE // Check - setDataCaptureListener( - visualizerCallback(onData), - Visualizer.getMaxCaptureRate(), - true, - true - ) - enabled = true // Configuration is done, can enable now... + //stop() + if (visualizer == null) { + visualizer = Visualizer(audioSessionId).apply { + enabled = false // All configuration have to be done in a disabled state + captureSize = CAPTURE_SIZE + scalingMode = Visualizer.SCALING_MODE_NORMALIZED //Check + measurementMode = Visualizer.MEASUREMENT_MODE_NONE // Check + setDataCaptureListener( + visualizerCallback(onData), + Visualizer.getMaxCaptureRate(), + true, + true + ) + enabled = true // Configuration is done, can enable now... + } } } diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/service/PlayerMediaBrowserService.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/service/PlayerMediaBrowserService.kt index c97cdcf265..8d94d6040a 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/service/PlayerMediaBrowserService.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/service/PlayerMediaBrowserService.kt @@ -16,6 +16,7 @@ import androidx.annotation.DrawableRes import androidx.core.net.toUri import androidx.core.os.bundleOf import androidx.media3.common.Player +import androidx.media3.common.util.UnstableApi import androidx.media3.datasource.cache.Cache import it.vfsfitvnm.vimusic.Database import it.vfsfitvnm.vimusic.R @@ -48,6 +49,7 @@ class PlayerMediaBrowserService : MediaBrowserService(), ServiceConnection { super.onDestroy() } + @UnstableApi override fun onServiceConnected(className: ComponentName, service: IBinder) { if (service is PlayerService.Binder) { bound = true @@ -230,6 +232,7 @@ class PlayerMediaBrowserService : MediaBrowserService(), ServiceConnection { override fun onSeekTo(pos: Long) = player.seekTo(pos) override fun onSkipToQueueItem(id: Long) = player.seekToDefaultPosition(id.toInt()) + @UnstableApi override fun onPlayFromMediaId(mediaId: String?, extras: Bundle?) { val data = mediaId?.split('/') ?: return var index = 0 diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/service/PlayerService.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/service/PlayerService.kt index 381ea4a79f..b55c252e6d 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/service/PlayerService.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/service/PlayerService.kt @@ -29,6 +29,7 @@ import android.os.Handler import android.text.format.DateUtils import android.util.Log import androidx.annotation.OptIn +import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue @@ -84,6 +85,7 @@ import it.vfsfitvnm.vimusic.models.Event import it.vfsfitvnm.vimusic.models.QueuedMediaItem import it.vfsfitvnm.vimusic.models.Song import it.vfsfitvnm.vimusic.query +import it.vfsfitvnm.vimusic.transaction import it.vfsfitvnm.vimusic.utils.ConditionalCacheDataSourceFactory import it.vfsfitvnm.vimusic.utils.InvincibleService import it.vfsfitvnm.vimusic.utils.RingBuffer @@ -119,6 +121,7 @@ import it.vfsfitvnm.vimusic.utils.trackLoopEnabledKey import it.vfsfitvnm.vimusic.utils.volumeNormalizationKey import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow @@ -127,6 +130,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.cancellable import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flatMapMerge import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map @@ -161,7 +165,7 @@ class PlayerService : InvincibleService(), Player.Listener, PlaybackStatsListene private lateinit var player: ExoPlayer private lateinit var downloadCache: SimpleCache - private val playbackStateMutex = Mutex() + //private val playbackStateMutex = Mutex() private val metadataBuilder = MediaMetadata.Builder() @@ -194,21 +198,24 @@ class PlayerService : InvincibleService(), Player.Listener, PlaybackStatsListene override val notificationId: Int get() = NotificationId - private var isLiked = 0 - private lateinit var notificationActionReceiver: NotificationActionReceiver + private lateinit var audioQualityFormat: AudioQualityFormat + private val mediaItemState = MutableStateFlow(null) - private lateinit var audioQualityFormat: AudioQualityFormat + private var isLiked = MutableStateFlow(false) + + /* + @ExperimentalCoroutinesApi private val isLikedState = mediaItemState - .flatMapMerge { item -> + .flatMapLatest { item -> item?.mediaId?.let { Database.likedAt(it).distinctUntilChanged() } ?: flowOf(null) } .map { it != null } - .stateIn(coroutineScope, SharingStarted.Eagerly, false) - + .stateIn(coroutineScope, SharingStarted.Lazily, false) +*/ private val stateBuilder = PlaybackState.Builder() .setActions( @@ -222,19 +229,20 @@ class PlayerService : InvincibleService(), Player.Listener, PlaybackStatsListene or PlaybackState.ACTION_SEEK_TO or PlaybackState.ACTION_REWIND ) - /* + /* .addCustomAction( "it.fast4x.rimusic.like", "Like", - if (isLikedState.value) R.drawable.heart else R.drawable.heart_outline + if (isLiked.value) R.drawable.heart else R.drawable.heart_outline ) .addCustomAction( "it.fast4x.rimusic.download", "Download", R.drawable.arrow_down //if () R.drawable.heart else R.drawable.heart_outline ) + */ + - */ override fun onBind(intent: Intent?): AndroidBinder { super.onBind(intent) @@ -356,16 +364,27 @@ class PlayerService : InvincibleService(), Player.Listener, PlaybackStatsListene maybeRestorePlayerQueue() + + mediaSession = MediaSession(baseContext, "PlayerService") mediaSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS or MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS) mediaSession.setCallback(SessionCallback(player)) - mediaSession.setPlaybackState(stateBuilder.build()) + //mediaSession.setPlaybackState(stateBuilder.build()) + //updateCustomInfos() + + /* +val mediaId = player.currentMediaItem?.mediaId +coroutineScope.launch { + isLiked = if (mediaId?.let { Database.songliked(it) } == 1) MutableStateFlow(true) else MutableStateFlow(false) + Log.d("mediaItemOnCreate","mediaId $mediaId isLiked ${isLiked.value}") +} + */ - mediaSession.isActive = true + //mediaSession.isActive = true notificationActionReceiver = NotificationActionReceiver(player) - /* +/* coroutineScope.launch { var first = true mediaItemState.zip(isLikedState) { mediaItem, _ -> @@ -387,7 +406,10 @@ class PlayerService : InvincibleService(), Player.Listener, PlaybackStatsListene } } } - */ +*/ + + + val filter = IntentFilter().apply { addAction(Action.play.value) @@ -717,17 +739,47 @@ class PlayerService : InvincibleService(), Player.Listener, PlaybackStatsListene ) } + + private fun updateCustomInfos() { + val mediaId = player.currentMediaItem!!.mediaId + coroutineScope.launch { + isLiked = if (mediaId.let { Database.songliked(it) } == 1) MutableStateFlow(true) else MutableStateFlow(false) + Log.d("mediaItemOnCustInfo","mediaId $mediaId isLiked ${isLiked.value}") + } + updatePlaybackState() + } + + private fun updatePlaybackState() = coroutineScope.launch { - playbackStateMutex.withLock { + //updateCustomInfos() + Log.d("mediaItemOnUpdate","after isLiked ${isLiked.value}") + //playbackStateMutex.withLock { withContext(Dispatchers.Main) { + Log.d("mediaItemOnUpdateCont","after isLiked ${isLiked.value}") + mediaSession.isActive = false mediaSession.setPlaybackState( stateBuilder + + //From Android 11 + /* + .addCustomAction( + "it.fast4x.rimusic.like", + "Like", + if (isLiked.value) R.drawable.heart else R.drawable.heart_outline + ) + .addCustomAction( + "it.fast4x.rimusic.download", + "Download", + R.drawable.arrow_down + ) + */ .setState(player.androidPlaybackState, player.currentPosition, 1f) .setBufferedPosition(player.bufferedPosition) .build() ) + mediaSession.isActive = true } - } + //} } @@ -763,11 +815,16 @@ class PlayerService : InvincibleService(), Player.Listener, PlaybackStatsListene ) } + + /* stateBuilder .setState(player.androidPlaybackState, player.currentPosition, 1f) .setBufferedPosition(player.bufferedPosition) + + mediaSession.setPlaybackState(stateBuilder.build()) + */ if (events.containsAny( Player.EVENT_PLAYBACK_STATE_CHANGED, @@ -803,12 +860,7 @@ class PlayerService : InvincibleService(), Player.Listener, PlaybackStatsListene notificationManager?.notify(NotificationId, notification) } } - /* - val currentMediaItem = player.currentMediaItem - coroutineScope.launch { - isLiked = currentMediaItem?.let { Database.songliked(it.mediaId) }!! - } - */ + updatePlaybackState() // Important for update background player status } @@ -870,13 +922,19 @@ class PlayerService : InvincibleService(), Player.Listener, PlaybackStatsListene val downloadIntent = Action.download.pendingIntent val mediaMetadata = player.mediaMetadata -/* - val currentMediaItem = player.currentMediaItem + + val mediaId = player.currentMediaItem!!.mediaId + updateCustomInfos() + + /* + val mediaId = player.currentMediaItem!!.mediaId coroutineScope.launch { - isLiked = currentMediaItem?.let { Database.songliked(it.mediaId) }!! + isLiked = if (mediaId.let { Database.songliked(it) } == 1) MutableStateFlow(true) else MutableStateFlow(false) + Log.d("mediaItemOnNotif","mediaId $mediaId isLiked ${isLiked.value}") } + */ + - */ val builder = if (isAtLeastAndroid8) { Notification.Builder(applicationContext, NotificationChannelId) } else { @@ -912,13 +970,17 @@ class PlayerService : InvincibleService(), Player.Listener, PlaybackStatsListene if (player.shouldBePlaying) pauseIntent else playIntent ) .addAction(R.drawable.play_skip_forward, "Skip forward", nextIntent) + + //Prior Android 11 /* .addAction( - if (isLikedState.value) R.drawable.heart else R.drawable.heart_outline, + if (isLiked.value) R.drawable.heart else R.drawable.heart_outline, "Like", likeIntent) - .addAction(R.drawable.download, "Download", downloadIntent) - */ + */ + //.addAction(R.drawable.download, "Download", downloadIntent) + + Log.d("mediaItemOnNotif","after mediaId $mediaId isLiked ${isLiked.value}") bitmapProvider.load(mediaMetadata.artworkUri) { bitmap -> @@ -1330,17 +1392,21 @@ class PlayerService : InvincibleService(), Player.Listener, PlaybackStatsListene radio = null } } -/* + + /* private fun likeMediaItemAction() = mediaItemState.value?.let { mediaItem -> transaction { Database.like( mediaItem.mediaId, - if (isLikedState.value) null else System.currentTimeMillis() + if (isLiked.value) null else System.currentTimeMillis() ) } + updateCustomInfos() + updatePlaybackState() }.let { } + */ + - */ /* private fun likeMediaItemAction() { val currentMediaItem = player.currentMediaItem @@ -1366,25 +1432,24 @@ class PlayerService : InvincibleService(), Player.Listener, PlaybackStatsListene } */ + private fun likeMediaItemAction() { val currentMediaItem = player.currentMediaItem - + Log.d("plserviceOnLikeAction", "BeforeLikeAction mediaId ${currentMediaItem?.mediaId} liked ${isLiked.value}") coroutineScope.launch { - isLiked = currentMediaItem?.let { Database.songliked(it.mediaId) }!! - //Log.d("plserviceOnCustomAction", "pre currentMediaItem ${currentMediaItem?.mediaId} liked $isLiked") if (currentMediaItem != null) { - //Log.d("plserviceOnCustomAction", "into currentMediaItem ${currentMediaItem?.mediaId} liked $isLiked") - Database.like( - currentMediaItem.mediaId, - if (isLiked == 1) null else System.currentTimeMillis() - ) + Database.like( + currentMediaItem.mediaId, + if (isLiked.value) null else System.currentTimeMillis() + ) } - //isLiked = currentMediaItem?.let { Database.songliked(it.mediaId) }!! - //Log.d("plserviceOnCustomAction", "post currentMediaItem ${currentMediaItem?.mediaId} liked $isLiked") } - + updatePlaybackState() + Log.d("plserviceOnLikeAction", "AfterLikeAction mediaId ${currentMediaItem?.mediaId} liked ${isLiked.value}") } + + private inner class SessionCallback(private val player: Player) : MediaSession.Callback() { override fun onPlay() = player.play() override fun onPause() = player.pause() @@ -1398,21 +1463,27 @@ private fun likeMediaItemAction() { override fun onCustomAction(action: String, extras: Bundle?) { super.onCustomAction(action, extras) - if (action == "it.fast4x.rimusic.like") likeMediaItemAction() + //From Android 11 + if (action == "it.fast4x.rimusic.like") Log.d("plserviceOnCustomAction", Action.like.value) //likeMediaItemAction() if (action == "it.fast4x.rimusic.download") Log.d("plserviceOnCustomAction", Action.download.value) } } inner class NotificationActionReceiver(private val player: Player) : BroadcastReceiver() { + + // Prior Android 11 override fun onReceive(context: Context, intent: Intent) { when (intent.action) { Action.pause.value -> player.pause() Action.play.value -> player.play() Action.next.value -> player.forceSeekToNext() Action.previous.value -> player.forceSeekToPrevious() - Action.like.value -> likeMediaItemAction() //Log.d("plserviceAction", Action.like.value) - Action.download.value -> Log.d("plserviceAction", Action.download.value) + Action.like.value -> { + Log.d("plserviceActionA10", Action.like.value) + likeMediaItemAction() + } + Action.download.value -> Log.d("plserviceActionA10", Action.download.value) } } } diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/settings/About.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/settings/About.kt index 95cb4907b7..56237f7a0a 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/settings/About.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/settings/About.kt @@ -156,20 +156,27 @@ fun About() { "2010furs \n" + "25huizengek1 \n" + "abfreeman \n" + + "Adam Kop \n" + "Bash.boy \n" + + "Conk \n" + "DanielSevillano \n" + "dainvincible1 \n" + "damianadam000 \n" + + "Fabian Urra \n" + "Get100percent \n" + "ikanakova \n" + + "Jakub Žitník \n" + "mapkaps \n" + + "Muha Aliss \n" + "NEVARLeVrai \n" + "OrangeZXZ \n" + "roklc \n" + "r.t.redreovic \n" + - "Bash.boy \n" + + "SharkChan0622 \n" + "siggi1984 \n" + - "teddysulaimanGL \n" + "teddysulaimanGL \n" + + "kyev666 \n" + ) } } diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/settings/UiSettings.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/settings/UiSettings.kt index 92dca041c4..a62a960dbf 100644 --- a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/settings/UiSettings.kt +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/settings/UiSettings.kt @@ -156,26 +156,29 @@ fun UiSettings() { valueText = { when (it){ Languages.System -> stringResource(R.string.system_language) - Languages.English -> stringResource(R.string.english) - Languages.Italian -> stringResource(R.string.italian) + Languages.Arabic -> "Arabic" + Languages.Bashkir -> stringResource(R.string.bashkir) + Languages.Catalan -> stringResource(R.string.catalan) + Languages.ChineseSimplified -> "Chinese Simplified" + Languages.ChineseTraditional -> "Chinese Traditional" Languages.Czech -> stringResource(R.string.czech) - Languages.German -> stringResource(R.string.german) - Languages.Greek -> stringResource(R.string.greek) - Languages.Spanish -> stringResource(R.string.spanish) + Languages.English -> stringResource(R.string.english) + Languages.Esperanto -> stringResource(R.string.esperanto) Languages.French -> stringResource(R.string.french) Languages.FrenchEmo -> stringResource(R.string.french_emoticons_fran_ais) + Languages.German -> stringResource(R.string.german) + Languages.Greek -> stringResource(R.string.greek) + Languages.Indonesian -> stringResource(R.string.indonesian) + Languages.Italian -> stringResource(R.string.italian) + Languages.Odia -> stringResource(R.string.odia) + Languages.Polish -> stringResource(R.string.polish) + Languages.PortugueseBrazilian -> stringResource(R.string.portuguese_brazilian) + Languages.Portuguese -> stringResource(R.string.portuguese) Languages.Romanian -> stringResource(R.string.romanian) Languages.RomanianEmo -> stringResource(R.string.romanian_emoticons_rom_n) Languages.Russian -> stringResource(R.string.russian) + Languages.Spanish -> stringResource(R.string.spanish) Languages.Turkish -> stringResource(R.string.turkish) - Languages.Polish -> stringResource(R.string.polish) - Languages.PortugueseBrazilian -> stringResource(R.string.portuguese_brazilian) - Languages.Portuguese -> stringResource(R.string.portuguese) - Languages.Indonesian -> stringResource(R.string.indonesian) - Languages.Odia -> stringResource(R.string.odia) - Languages.Bashkir -> stringResource(R.string.bashkir) - Languages.Esperanto -> stringResource(R.string.esperanto) - Languages.Catalan -> stringResource(R.string.catalan) } } ) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c94a7535a5..564ab622be 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -14,26 +14,26 @@ Supprimer de la liste de lecture Cacher Cacher de la \"Sélections rapides\" - 💿 Albums associés - 👥 Artistes similaires - 💜 Listes de lecture que vous pourriez aimer - ❌ Une erreur est survenue - 💿 Albums - 👥 Artistes + Albums associés + Artistes similaires + Listes de lecture que vous pourriez aimer + Une erreur est survenue + Albums + Artistes Entrez le nom de la playlist - 🔀 Playlists - ❤ Favoris - ✨ Sélections rapides - 🎶 Chansons - 💿 Autres versions - 💿 Cet album n\'a pas de version alternative + Playlists + Favoris + Sélections rapides + Chansons + Autres versions + Cet album n\'a pas de version alternative Mettre en file d\'attente Aléatoire Voir tout De Wikipedia sous license Creative Commons Attribution CC-BY-SA 3.0 - ✨ Aperçu - 📀 Titres - 🗃 Bibliothèque + Aperçu + Titres + Bibliothèque Cet artiste n’a sorti aucun album Cet artiste n’a sorti aucun titre Voulez-vous vraiment supprimer cette playlist ? @@ -45,63 +45,63 @@ Rechercher les paroles en ligne Récupérer les paroles "Lecture continue" - 📡 Id - 🔗 Tag - 🔢 Débit - 🗃 Taille - 📂 En cache - 🔊 Volume - 🖍 Effacer - ❌ Une erreur est survenue - 🔎 Rechercher - 🌐 En ligne - 🔍 Aucun résultat trouvé.\nVeuillez essayer une autre recherche ou une autre catégorie - 🎞 Vidéos - 📡 En vedette + Id + Tag + Débit + Taille + En cache + Volume + Effacer + Une erreur est survenue + Rechercher + En ligne + Aucun résultat trouvé.\nVeuillez essayer une autre recherche ou une autre catégorie + Vidéos + En vedette Afficher le code source Signaler un problème Vous allez être redirigé vers GitHub Demander une fonctionnalité ou nous suggérer une idée - 🎨 Apparence - 🖌️ Thèmes + Apparence + Thèmes Thème Thème Système - 📐 Forme + Forme Aspect - 🔤 Texte + Texte Utiliser la police du système Utiliser la police appliquée par le système Appliquer un remplissage Ajouter un espace autour des textes - 🔐 ÉCRAN DE VERROUILLAGE + ÉCRAN DE VERROUILLAGE Afficher la pochette d\'album Afficher la pochette d\'album sur le fond d\'écran de l\'écran de verrouillage - 🗃 Cache + Cache Lorsque le cache manque d\'espace, les ressources en cache les moins récemment consultées seront effacées - 🖼️ CACHE D\'IMAGE + CACHE D\'IMAGE Taille max - 🎶 CACHE DES CHANSONS - 🗄 Base de données + CACHE DES CHANSONS + Base de données Réinitialiser la sélections rapides Les sélections rapides ont été effacées avec succès - 🔄 SAUVEGARDE + SAUVEGARDE Les préférences personnelles (c.-à-d. le mode du thème) et le cache sont exclus. Sauvegarde Exporter la base de données vers le stockage - ⏪ RESTAURER + RESTAURER Restaurer Importer la base de données à partir du stockage - 💠 Autre - 🚘 ANDROID AUTO + Autre + ANDROID AUTO N’oubliez pas d’activer \"Sources inconnues\" dans les paramètres développeur d’Android Auto. Android Auto Activer le support pour Android Auto - 🔎 HISTORIQUE DE RECHERCHES + HISTORIQUE DE RECHERCHES Suspendre l’historique des recherches Ne pas enregistrer de nouvelles recherches ainsi que l’historique Effacer l’historique de recherche L’historique est vide - 🔋 SERVICE SUPPLEMENTAIRE D\'OPTIMISATION + SERVICE SUPPLEMENTAIRE D\'OPTIMISATION Si des optimisations de la batterie sont appliquées, la notification de lecture peut soudainement disparaître en cas de pause. Depuis Android 12, la désactivation des optimisations de la batterie est nécessaire pour que l’option \"Service protégé\" prenne effet. Ignorer les optimisations de la batterie @@ -110,7 +110,7 @@ Service protégé Quand \"désactiver les optimisations de la batterie\" ne suffit pas - 🎵 Lecteur + Lecteur Playlist persistante Enregistrer et restaurer la lecture des chansons Reprendre la lecture @@ -121,7 +121,7 @@ Normalisation du volume Régler le volume à un niveau fixe Paramètre de l\'égaliseur du système - 👨‍💻 À propos + À propos Plus de Minuteur de veille %1$s restantes @@ -131,28 +131,28 @@ les paroles non synchronisées les paroles synchronisées Fournies par - 🧹 NETTOYAGE + NETTOYAGE Supprimer %1$s événements de la lecture Les données existantes seront écrasées,\n%1$s se fermera automatiquement après la restauration de la base de données. en file d\'attente - 📂 CACHE DU DOSSIERS + CACHE DU DOSSIERS Attention en cliquant sur le bouton ci-dessous, le dossier d\'emplacement du cache sera réinitialisé au paramètre par défaut Emplacement du dossier À partir d\'Android 10, cette fonctionnalité peut ne plus être disponible - 🔙 RÉINITIALISER LE CACHE + RÉINITIALISER LE CACHE "utilisé" Effacer le lecteur en arrière plan Lorsque vous faites glisser en dehors du gestionnaire des applications récentes est entrain de charger... - 🗣 Une erreur est apparue lors de la récupération des paroles + Une erreur est apparue lors de la récupération des paroles n\'est pas disponibles pour cette chanson - 📶 Une erreur réseau est apparue - 🔊 Ne peut pas trouver un format audio jouable - 🌍 La source vidéo originale de cette chanson a été supprimée - 🎶 Cette chanson ne peut pas être lue en raison de restrictions du serveur - 🎥 L\'identifiant vidéo retourné ne correspond pas à celui demandé - ❌ Une erreur de lecture inconnue s\'est produite, si le problème persiste signalé le problème - ✨ Recommandations + Une erreur réseau est apparue + Ne peut pas trouver un format audio jouable + La source vidéo originale de cette chanson a été supprimée + Cette chanson ne peut pas être lue en raison de restrictions du serveur + L\'identifiant vidéo retourné ne correspond pas à celui demandé + Une erreur de lecture inconnue s\'est produite, si le problème persiste signalé le problème + Recommandations Sélection rapide et recommandations C\'est la durée d\'écoute minimale pour inclure la chanson comme une suggestion possible pour la sélection rapide et les recommandations Durée d\'écoute minimale @@ -167,27 +167,27 @@ Aucun Légé Énorme - 🌟 EFFETS + EFFETS Boutons rotatifs Autorise la rotation des boutons lorsqu\'ils sont cliqués - 📊 Statistiques - 📊 Aujourd\'hui - 📊 1 Semaine - 📊 1 Mois - 📊 3 Mois - 📊 6 Mois - 📊 1 an - 📂 Tout - 🎶 Chansons les plus écoutées - 👥 Artistes les plus écoutés - 💿 Albums les plus écoutés - 🔀 Playlists les plus écoutées - 🌍 Langues + Statistiques + Aujourd\'hui + 1 Semaine + 1 Mois + 3 Mois + 6 Mois + 1 an + Tout + Chansons les plus écoutées + Artistes les plus écoutés + Albums les plus écoutés + Playlists les plus écoutées + Langues Langues de l\'application Dans l\'ordre alphabétique : - 💞 CONTRIBUTEURS - 🔧 DÉPANNAGE - 💬 SOCIAL + CONTRIBUTEURS + DÉPANNAGE + SOCIAL Anglais (English) Italien (Italiano) Tchèque (Čeština) @@ -202,33 +202,33 @@ Système Illimité Clair - ✈️ Téléchargé + Téléchargé Desactivé - ⬇️ Télécharger + Télécharger Par défaut Dynamique - 🌍 Découvrir + Découvrir Humeur - 🆕 Nouveaux albums - 😃 Humeurs et genres + Nouveaux albums + Humeurs et genres " requêtes de recherche" - 🔋 Impossible de trouver les paramètres d\'optimisation de la batterie, veuillez les ajouter manuellement à la liste blanche - 🔎 Rechercher + Impossible de trouver les paramètres d\'optimisation de la batterie, veuillez les ajouter manuellement à la liste blanche + Rechercher Non Arrêter - 👀 PRÉFÉRENCES - ❌ Il semblerait que YouTube Music ne soit pas installé ! + PRÉFÉRENCES + Il semblerait que YouTube Music ne soit pas installé ! Écouter sur YouTube Écouter sur YouTube Music - 📲 Sur l\'appareil + Sur l\'appareil Ouvrir les paramètres - 🎥 Autorisation refusée, veuillez accorder les autorisations multimédias dans les paramètres de votre appareil. + Autorisation refusée, veuillez accorder les autorisations multimédias dans les paramètres de votre appareil. Ondulée Active la barre de navigation ondulée Musique suivante Afficher les paroles En appuyant sur la pochette d\'album - 🎤 Le visualiser nécessite l\'autorisation du micro. + Le visualiser nécessite l\'autorisation du micro. Circulaire 3D Circulaire Désactivé @@ -239,25 +239,25 @@ Complet Nouveaux albums de vos artistes Barre de navigation - 🎧 CACHE DE CHANSON (Pour le lecteur) - ✈️ CACHE DE CHANSON (Pour le télechargement) + CACHE DE CHANSON (Pour le lecteur) + CACHE DE CHANSON (Pour le télechargement) Visualiseur Visualiseur exige L\'AUTORISATION DU MICRO - 🔃 Redémarrez l\'application + Redémarrez l\'application Écouter sur Piped Écouter sur Invidious Désactiver le glissement horizontal Désactiver le changement de chanson par balayage Interface en cours d\'utilisation Interface utilisateur - 💡 IU + IU Langue du système - 👉 Français avec Émojis (Français) + Français avec Émojis (Français) Roumain avec Émojis (Română) Très gros Définir un cache personnalisé Entrez la valeur en Mo - 🔢 La valeur ne peut pas être vide + La valeur ne peut pas être vide "La valeur doit être supérieure à " Personnalisé Taille du cache personnalisée @@ -281,7 +281,7 @@ Moyen Bas Inconnu - 🗑️ Vous voulez vraiment supprimer les téléchargements ? + Vous voulez vraiment supprimer les téléchargements ? Tout supprimer Supprimer la sélection Effacer la file d’attente diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 7b11229896..e5381c57e1 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -14,14 +14,14 @@ Elimină din lista de ascultare Ascunde Ascunde din selecțiile rapide - 💿 Albume similare - 👥 Artiști similari - 💖 Liste de ascultare recomandate + Albume similare + Artiști similari + Liste de ascultare recomandate A apărut o eroare! Albume Artiști Introdu numele listei de ascultare - 🔁 Liste de ascultare + Liste de ascultare Favorite Selecții rapide Muzici @@ -63,12 +63,12 @@ Vei fi redirecționat către GitHub Solicită o funcție sau sugerează o idee Aspect - 🎨 TEMURI + TEMURI Temă Culoare temă - 📐 FORME + FORME Rotunjimea miniaturilor - 🔤 TEXT + TEXT Folosește fontul sistemului Folosește fontul aplicat in sistem Aplică spațierea între fonturi @@ -78,30 +78,30 @@ Utilizează coperta muzicii ca fundal pentru ecranul de blocare Cache Când memoria cache rămâne fără spațiu, resursele care nu au fost accesate de mult timp sunt șterse - 🖼️ CACHE IMAGINI + CACHE IMAGINI Dimensiune maximă - 🎵 CACHE MUZICI + CACHE MUZICI Bază de date Resetează selecțiile rapide Selecțiile rapide au fost resetate - 💾 COPIE DE REZERVĂ + COPIE DE REZERVĂ Preferințele personale (ex: culorile de temă) si memoria cache sunt excluse. Copie de rezervă Exportă baza de date pe stocarea externă - ⏬ RESTABILIRE + RESTABILIRE Restabilește Importă baza de date din stocarea externă Altele - 🚘 ANDROID AUTO + ANDROID AUTO Amintiți-vă să activați sursele necunoscute din setările dezvoltator în android auto. Android auto Activează suportul pentru android auto - 🔎 ISTORICUL CĂUTĂRILOR + ISTORICUL CĂUTĂRILOR Întrerupe istoricul căutărilor Nu salva noile căutări și nu se va afișa istoricul Șterge istoricul căutărilor Istoricul este gol - 🕗 DURATA SERVICILOR + DURATA SERVICILOR Dacă sunt aplicate optimizările ale bateriei, notificarea de ascultare poate dispărea brusc. Începând cu android 12, dezactivarea optimizărilor ale bateriei este necesară pentru ca serviciu invincibil să aibă efect. Ignoră optimizările ale bateriei @@ -131,11 +131,11 @@ versurile nesincronizate versurile sincronizate Furnizat de - 🧹 CURĂȚENIE + CURĂȚENIE Ștergeți %1$s evenimente de ascultare Datele existente vor fi suprascrise.\n%1$s se va închide automat după restabilirea bazei de date. în coadă - 📁 CACHE FOLDER + CACHE FOLDER Atenție! Făcând clic pe butonul de mai jos, folderul cache va fi resetat! Locație folder Începând cu Android 10, această funcție poate să nu fie disponibilă @@ -152,7 +152,7 @@ Această melodie nu poate fi redată din cauza restricțiilor serverilor ID-ul videoclipului întors nu se potrivește cu cel solicitat A apărut o eroare de ascultare necunoscută - ✨ Recomandări + Recomandări Recomandări și Selecții rapide Este timpul minim de ascultat pentru a include melodia ca Sfat sau Selecție rapidă Timp minim de ascultare @@ -161,13 +161,13 @@ Dimensiune "Dimensiunea curentă " Formă curentă - Mic ◾ - Mediu ◼️ - Mare ⬛ - Nici unul ❌ - Leger ◾ - Mare ⬛ - ✨ EFECTE + Mic + Mediu + Mare + Nici unul + Leger + Mare + EFECTE Butoane rotative Activați rotația butoanelor când se face clic pe ele Statistici @@ -178,69 +178,69 @@ 6 Luni Un An Total - 🎵 Melodiile cele mai ascultate - 👥 Artiști cei mai ascultați - 💿 Albumurile cele mai ascultate - 🔁 Listele cele mai ascultate - 🌍 LIMBĂ + Melodiile cele mai ascultate + Artiști cei mai ascultați + Albumurile cele mai ascultate + Listele cele mai ascultate + LIMBĂ Limba aplicației In ordinea alfabetică: - 🤝 CONTRIBUITORI - 🔧 DEPANARE - 💬 SOCIAL - Engleză (English) 🇺🇸 - Italiană (Italiano) 🇮🇹 - Cehă (Čeština) 🇨🇿 - Germană (Deutsch) 🇩🇪 - Spaniolă (Español) 🇪🇸 - Franceză (Français) 🇫🇷 - Română (Română) 🇷🇴 - Rusă (Русский) 🇷🇺 - Turcă (Türkçe) 🇹🇷 - Poloneză (Polski) 🇵🇱 - Intunecat ⚫ - Sistem ⚙️ + CONTRIBUITORI + DEPANARE + SOCIAL + Engleză (English) + Italiană (Italiano) + Cehă (Čeština) + Germană (Deutsch) + Spaniolă (Español) + Franceză (Français) + Română (SELECȚIONAT) + Rusă (Русский) + Turcă (Türkçe) + Poloneză (Polski) + Intunecat + Sistem Nelimitat - Luminos ⚪ + Luminos Descărcate Opriți Descarcă - Implicit ➖ - Dinamic 🎵 + Implicit + Dinamic Descoperiri Stare - 🆕 Albumuri noi - 😁 Stare și Genuri + Albumuri noi + Stare și Genuri " căutare" Nu s-au putut găsi setările de optimizare al bateriei, vă rugăm să adăugați manual în lista albă Caută... Nu Oprește - 💖 PREFERINȚE + PREFERINȚE YouTube Music nu este instalat! Ascultă pe YouTube Ascultă pe YouTube Music În dispozitiv Deschide setările Permisiune refuzată, vă rugăm să acordați permisiunile media în setările dispozitivului dvs. - Bară de progres ondulată 〰️ + Bară de progres ondulată Utilizează bară de progres ondulată Ascultă după Arată versurile Atingând miniatura Visualisatorul necesită permisiunea microfonului, acordațil vă rog. - Frumos ✨ - Circular ⭕ - Dezactivat ❌ - Stivuite 📚 - O față ➡️ - Față dublă ↔️ - Circular cu două fețe 🔄️ - Plin ⬛ - 🆕 Albume noi ale artiștilor tăi + Frumos + Circular + Dezactivat + Stivuite + O față + Față dublă + Circular cu două fețe + Plin + Albume noi ale artiștilor tăi Bara de navigare - ▶️ CACHE Musici (Automatic) - ⬇️ CACHE Musici (Instalate) + CACHE Musici (Automatic) + CACHE Musici (Instalate) Visualizator Visualizatorul necesita permisiunea microfonului Reporniți aplicația vă rog. @@ -252,8 +252,8 @@ Interfață utilizator Interfață Limba sistemului - Franceză cu Emoticoane (Français) 🇫🇷 - Română cu Emoticoane (SELECȚIONAT) 🇷🇴 + Franceză cu Emoticoane (Français) + Română cu Emoticoane (Română) Gigantic Setează cache personalizat Introdu valoarea în MB @@ -263,8 +263,8 @@ Dimensiune cache personalizată Ascultă pe Muzica locală nu a fost găsită - Bară grasă ➖ - Bară plin gras ➖ + Bară grasă + Bară plin gras Dreptunghi Pătrat Cerc ondulat diff --git a/fastlane/metadata/android/en-US/changelogs/11.txt b/fastlane/metadata/android/en-US/changelogs/11.txt new file mode 100644 index 0000000000..10bbf7bc3a --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/11.txt @@ -0,0 +1,3 @@ + +Log completed at +https://github.com/fast4x/RiMusic/releases/tag/v0.6.16 \ No newline at end of file diff --git a/updatedVersion/updatedVersion.ver b/updatedVersion/updatedVersion.ver index a550daf20e..c4c2d2b110 100644 --- a/updatedVersion/updatedVersion.ver +++ b/updatedVersion/updatedVersion.ver @@ -1 +1 @@ -0.6.15.1 +0.6.16