22 Commits
12.8 ... 13B

Author SHA1 Message Date
Michatec
6a74e64e87 Versionscode Bug Fixed 2025-06-11 17:52:16 +02:00
Michatec
efa03f7529 New version coming 13 2025-06-11 17:43:36 +02:00
Michatec
0a56971fa2 Some Bugfixes and Improvments
- Update the libary gson.
- Deleted some unuseful Code.
- added some locals to locales config.
2025-06-11 17:36:47 +02:00
Michachatz
5ecbede8b5 Update gradle-publish.yml 2025-06-09 14:51:51 +02:00
Michachatz
f99b1fc54b Update gradle-publish.yml 2025-06-09 14:37:46 +02:00
Michachatz
c2b28fd6ec Update build.gradle
- Deleted
2025-06-09 13:50:08 +02:00
Michachatz
b8fedbf832 Update build.gradle 2025-06-09 13:44:31 +02:00
Michachatz
890c91d4e3 Update gradle-publish.yml 2025-06-09 13:43:49 +02:00
Michachatz
41785d03f0 Update gradle-publish.yml 2025-06-09 13:38:22 +02:00
Michachatz
0c1f59d98d Update gradle-publish.yml 2025-06-09 13:28:17 +02:00
Michachatz
43adf31b6d Update gradle-publish.yml 2025-06-09 12:28:47 +02:00
Michachatz
4bb8df555c Update gradle-publish.yml 2025-06-09 12:26:34 +02:00
Michachatz
a649daf387 Update gradle-publish.yml 2025-06-09 12:19:29 +02:00
Michachatz
ed098aa8a7 Create gradle-publish.yml 2025-06-09 12:14:25 +02:00
Michatec
66943767ed Fix French Translation
Fix some bugs with the French Translation.
2025-05-22 19:46:01 +02:00
Michatec
9aeaae0127 Fix some Translation bugs 2025-05-22 19:39:51 +02:00
Michatec
97427f77ec Add French Tranlation
Add French Translation
2025-05-22 19:29:19 +02:00
Michatec
aff78032dd Add Danish Translation
Add Danish Translation.
2025-05-22 19:27:12 +02:00
Michatec
4367ef52ec Add japanese Translation
Add japanese Translation.
2025-05-22 19:22:58 +02:00
Michatec
88420b2cbf Update the libary
- Google Material
- Androidx ktx, media3, navigiation, work runtime
- Kotlin
- new version coming "Purple"
- some bug fixes
2025-05-22 19:08:24 +02:00
Michachatz
53b38cb986 Update Transistor Link 2025-04-27 23:52:41 +02:00
Michachatz
4cd17c5d2d Update README.md 2025-04-27 23:47:00 +02:00
20 changed files with 487 additions and 99 deletions

91
.github/workflows/gradle-publish.yml vendored Normal file
View File

@@ -0,0 +1,91 @@
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
name: Build and publish APK
on:
push:
tags:
- 'b*'
env:
ANDROID_HOME: /usr/local/lib/android/sdk/
APK_PATH: app/build/outputs/apk/release/Radio-release-unsigned.apk
APKSIGNER: /usr/local/lib/android/sdk/build-tools/34.0.0/apksigner
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup JDK
uses: actions/setup-java@v4
with:
java-version: 17
distribution: adopt
cache: gradle
- name: Cache Android SDK
#id: cache-android-sdk
uses: actions/cache@v4
with:
path: ${{ env.ANDROID_HOME }}
key: ${{ runner.os }}-android-sdk
- name: Setup Android SDK
## It is not necessary to check for cache hit as it
## will not download Android SDK again
#if: steps.cache-android-sdk.outputs.cache-hit != 'true'
uses: android-actions/setup-android@v3
with:
packages: ''
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
- name: Build unsigned APK
run: ./gradlew --no-daemon assembleRelease
- name: Check APK path
run: ls -R app/build/outputs/apk
- name: Sign APK
env:
SIGN_CERT: ${{ secrets.SIGN_CERT }}
SIGN_KEY: ${{ secrets.SIGN_KEY }}
run: |
echo "$SIGN_CERT" | base64 -d > cert.der
echo "$SIGN_KEY" | base64 -d > key.der
mv ${{ env.APK_PATH }} app-release.apk
${{ env.APKSIGNER }} sign --key key.der --cert cert.der app-release.apk
rm cert.der key.der
- name: Zipalign APK
run: |
/usr/local/lib/android/sdk/build-tools/34.0.0/zipalign -v -p 4 app-release.apk app-release-aligned.apk
mv app-release-aligned.apk app-release.apk
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: app-release
path: app-release.apk
publish:
runs-on: ubuntu-latest
needs: build
permissions:
contents: write
steps:
- name: Download artifact
uses: actions/download-artifact@v4
with:
name: app-release
path: app-release.apk
- name: Create release
uses: ncipollo/release-action@v1
with:
artifacts: "app-release.apk"
draft: true

View File

@@ -60,7 +60,7 @@ You can help out the radio-browser.info community by [adding the missing station
<details> <details>
<summary>📜️ Credit</summary> <summary>📜️ Credit</summary>
Base app Michatec. Base app Michatec & [TRANSISTOR](https://codeberg.org/y20k/transistor).
</details> </details>
<div align="right"> <div align="right">

View File

@@ -4,16 +4,17 @@ apply plugin: 'kotlin-parcelize'
android { android {
namespace 'com.michatec.radio' namespace 'com.michatec.radio'
compileSdk 34 compileSdk 35
defaultConfig { defaultConfig {
applicationId 'com.michatec.radio' applicationId 'com.michatec.radio'
minSdk 23 minSdk 28
targetSdk 34 //noinspection OldTargetApi
versionCode 128 targetSdk 35
versionName '12.8' versionCode 13
resourceConfigurations += ['en', 'de', 'el', 'nl', 'pl', 'ru','uk'] versionName '130'
setProperty('archivesBaseName', 'Radio_' + versionName) resourceConfigurations += ['en', 'de', 'el', 'nl', 'pl', 'ru','uk', 'ja', 'da', 'fr']
setProperty('archivesBaseName', 'Radio')
} }
compileOptions { compileOptions {
@@ -47,21 +48,21 @@ dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar']) implementation fileTree(dir: 'libs', include: ['*.jar'])
// Google Stuff // // Google Stuff //
implementation 'com.google.android.material:material:1.10.0' implementation 'com.google.android.material:material:1.12.0'
implementation 'com.google.code.gson:gson:2.10.1' implementation 'com.google.code.gson:gson:2.13.1'
// AndroidX Stuff // // AndroidX Stuff //
implementation 'androidx.activity:activity-ktx:1.8.1' implementation 'androidx.activity:activity-ktx:1.10.1'
implementation 'androidx.palette:palette-ktx:1.0.0' implementation 'androidx.palette:palette-ktx:1.0.0'
implementation 'androidx.preference:preference-ktx:1.2.1' implementation 'androidx.preference:preference-ktx:1.2.1'
implementation 'androidx.media:media:1.7.0' implementation 'androidx.media:media:1.7.0'
implementation 'androidx.media3:media3-exoplayer:1.2.0' implementation 'androidx.media3:media3-exoplayer:1.7.1'
implementation 'androidx.media3:media3-exoplayer-hls:1.2.0' implementation 'androidx.media3:media3-exoplayer-hls:1.7.1'
implementation 'androidx.media3:media3-session:1.2.0' implementation 'androidx.media3:media3-session:1.7.1'
implementation 'androidx.media3:media3-datasource-okhttp:1.2.0' implementation 'androidx.media3:media3-datasource-okhttp:1.7.1'
implementation 'androidx.navigation:navigation-fragment-ktx:2.7.5' implementation 'androidx.navigation:navigation-fragment-ktx:2.9.0'
implementation 'androidx.navigation:navigation-ui-ktx:2.7.5' implementation 'androidx.navigation:navigation-ui-ktx:2.9.0'
implementation 'androidx.work:work-runtime-ktx:2.9.0' implementation 'androidx.work:work-runtime-ktx:2.10.1'
// Volley HTTP request // // Volley HTTP request //
implementation 'com.android.volley:volley:1.2.1' implementation 'com.android.volley:volley:1.2.1'

View File

@@ -32,6 +32,7 @@ import androidx.activity.OnBackPressedCallback
import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.PickVisualMediaRequest
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.OptIn
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.net.toUri import androidx.core.net.toUri
@@ -40,6 +41,7 @@ import androidx.lifecycle.ViewModelProvider
import androidx.media3.common.MediaItem import androidx.media3.common.MediaItem
import androidx.media3.common.PlaybackException import androidx.media3.common.PlaybackException
import androidx.media3.common.Player import androidx.media3.common.Player
import androidx.media3.common.util.UnstableApi
import androidx.media3.session.MediaController import androidx.media3.session.MediaController
import androidx.media3.session.SessionResult import androidx.media3.session.SessionResult
import androidx.media3.session.SessionToken import androidx.media3.session.SessionToken
@@ -395,6 +397,7 @@ class PlayerFragment : Fragment(),
/* Initializes the MediaController - handles connection to PlayerService under the hood */ /* Initializes the MediaController - handles connection to PlayerService under the hood */
@OptIn(UnstableApi::class)
private fun initializeController() { private fun initializeController() {
controllerFuture = MediaController.Builder( controllerFuture = MediaController.Builder(
activity as Context, activity as Context,

View File

@@ -104,7 +104,7 @@ class PlayerService : MediaLibraryService() {
/* Overrides onTaskRemoved from Service */ /* Overrides onTaskRemoved from Service */
override fun onTaskRemoved(rootIntent: Intent) { override fun onTaskRemoved(rootIntent: Intent?) {
if (!player.playWhenReady) { if (!player.playWhenReady) {
stopSelf() stopSelf()
} }
@@ -636,22 +636,6 @@ class PlayerService : MediaLibraryService() {
} }
/*
* Defines the listener for changes in shared preferences
*/
private val sharedPreferenceChangeListener =
SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
when (key) {
Keys.PREF_LARGE_BUFFER_SIZE -> {
bufferSizeMultiplier = PreferencesHelper.loadBufferSizeMultiplier()
if (!player.isPlaying && !player.isLoading) {
initializePlayer()
}
}
}
}
/* /*
* Custom AnalyticsListener that enables AudioFX equalizer integration * Custom AnalyticsListener that enables AudioFX equalizer integration
*/ */

View File

@@ -25,8 +25,6 @@ import com.michatec.radio.helpers.PreferencesHelper.initPreferences
*/ */
class Radio : Application() { class Radio : Application() {
/* Define log tag */
private val TAG: String = Radio::class.java.simpleName
/* Implements onCreate */ /* Implements onCreate */
override fun onCreate() { override fun onCreate() {

View File

@@ -62,20 +62,7 @@ class SettingsFragment : PreferenceFragmentCompat(), YesNoDialog.YesNoDialogList
(activity as AppCompatActivity).supportActionBar?.show() (activity as AppCompatActivity).supportActionBar?.show()
(activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true) (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true)
(activity as AppCompatActivity).supportActionBar?.title = getString(R.string.fragment_settings_title) (activity as AppCompatActivity).supportActionBar?.title = getString(R.string.fragment_settings_title)
(activity as AppCompatActivity).window.navigationBarColor = getColor(requireContext(), android.R.attr.colorBackground)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// above Android Oreo
(activity as AppCompatActivity).window.navigationBarColor = getColor(requireContext(), android.R.attr.colorBackground)
} else {
val nightMode = AppCompatDelegate.getDefaultNightMode()
if (nightMode == AppCompatDelegate.MODE_NIGHT_YES) {
// night mode is active, set navigation bar color to a suitable color for night mode
(activity as AppCompatActivity).window.navigationBarColor = getColor(requireContext(), android.R.attr.colorBackground)
} else {
// night mode is not active, set navigation bar color to a suitable color for day mode
(activity as AppCompatActivity).window.navigationBarColor = ContextCompat.getColor(requireContext(), android.R.color.black)
}
}
} }
/* Overrides onCreatePreferences from PreferenceFragmentCompat */ /* Overrides onCreatePreferences from PreferenceFragmentCompat */
@@ -544,7 +531,7 @@ class SettingsFragment : PreferenceFragmentCompat(), YesNoDialog.YesNoDialogList
val dateFormat = SimpleDateFormat("_yyyy-MM-dd'T'HH_mm", Locale.US) val dateFormat = SimpleDateFormat("_yyyy-MM-dd'T'HH_mm", Locale.US)
timeStamp = dateFormat.format(Date()) timeStamp = dateFormat.format(Date())
putExtra(Intent.EXTRA_TITLE, "URL_Radio$timeStamp.zip") putExtra(Intent.EXTRA_TITLE, "Radio$timeStamp.zip")
} }
// file gets saved in the ActivityResult // file gets saved in the ActivityResult
try { try {

View File

@@ -296,6 +296,7 @@ class CollectionAdapter(
/* Shows / hides the edit view for a station */ /* Shows / hides the edit view for a station */
@SuppressLint("NotifyDataSetChanged")
private fun toggleEditViews(position: Int, stationUuid: String) { private fun toggleEditViews(position: Int, stationUuid: String) {
when (stationUuid) { when (stationUuid) {
// CASE: this station's edit view is already expanded // CASE: this station's edit view is already expanded

View File

@@ -42,10 +42,6 @@ class AddStationDialog (
} }
/* Define log tag */
private val TAG = AddStationDialog::class.java.simpleName
/* Main class variables */ /* Main class variables */
private lateinit var dialog: AlertDialog private lateinit var dialog: AlertDialog
private lateinit var stationSearchResultList: RecyclerView private lateinit var stationSearchResultList: RecyclerView

View File

@@ -46,9 +46,9 @@ class ErrorDialog {
// get views // get views
val inflater: LayoutInflater = LayoutInflater.from(context) val inflater: LayoutInflater = LayoutInflater.from(context)
val view: View = inflater.inflate(R.layout.dialog_generic_with_details, null) val view: View = inflater.inflate(R.layout.dialog_generic_with_details, null)
val errorMessageView: TextView = view.findViewById(R.id.dialog_message) as TextView val errorMessageView: TextView = view.findViewById(R.id.dialog_message)
val errorDetailsLinkView: TextView = view.findViewById(R.id.dialog_details_link) as TextView val errorDetailsLinkView: TextView = view.findViewById(R.id.dialog_details_link)
val errorDetailsView: TextView = view.findViewById(R.id.dialog_details) as TextView val errorDetailsView: TextView = view.findViewById(R.id.dialog_details)
// set dialog view // set dialog view
builder.setView(view) builder.setView(view)

View File

@@ -15,7 +15,9 @@
package com.michatec.radio.helpers package com.michatec.radio.helpers
import android.util.Log import android.util.Log
import androidx.annotation.OptIn
import androidx.media3.common.Metadata import androidx.media3.common.Metadata
import androidx.media3.common.util.UnstableApi
import androidx.media3.extractor.metadata.icy.IcyHeaders import androidx.media3.extractor.metadata.icy.IcyHeaders
import androidx.media3.extractor.metadata.icy.IcyInfo import androidx.media3.extractor.metadata.icy.IcyInfo
import com.michatec.radio.Keys import com.michatec.radio.Keys
@@ -33,6 +35,7 @@ object AudioHelper {
/* Extract audio stream metadata */ /* Extract audio stream metadata */
@OptIn(UnstableApi::class)
fun getMetadataString(metadata: Metadata): String { fun getMetadataString(metadata: Metadata): String {
var metadataString = String() var metadataString = String()
for (i in 0 until metadata.length()) { for (i in 0 until metadata.length()) {

View File

@@ -73,27 +73,15 @@ object ShortcutHelper {
): IconCompat { ): IconCompat {
val stationImageBitmap: Bitmap = val stationImageBitmap: Bitmap =
ImageHelper.getScaledStationImage(context, stationImage.toUri(), 192) ImageHelper.getScaledStationImage(context, stationImage.toUri(), 192)
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
IconCompat.createWithAdaptiveBitmap(
ImageHelper.createSquareImage(
context,
stationImageBitmap,
stationImageColor,
192,
true
)
)
} else {
IconCompat.createWithAdaptiveBitmap(
ImageHelper.createSquareImage(
context,
stationImageBitmap,
stationImageColor,
192,
false
)
)
}
}
return IconCompat.createWithAdaptiveBitmap(
ImageHelper.createSquareImage(
context,
stationImageBitmap,
stationImageColor,
192,
true
)
)
}
} }

View File

@@ -209,22 +209,16 @@ class SearchResultAdapter(
// stop radio playback when one is active // stop radio playback when one is active
val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val audioAttributes = AudioAttributes.Builder()
val audioAttributes = AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_MEDIA)
.setUsage(AudioAttributes.USAGE_MEDIA) .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build()
.build()
val focusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT) val focusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT)
.setAudioAttributes(audioAttributes) .setAudioAttributes(audioAttributes)
.build() .build()
audioManager.requestAudioFocus(focusRequest) audioManager.requestAudioFocus(focusRequest)
} else {
@Suppress("DEPRECATION")
// For older versions where AudioFocusRequest is not available
audioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT)
}
} }

View File

@@ -0,0 +1,113 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Appnavn -->
<!-- Tilgængelighedsbeskrivelser -->
<string name="descr_app_icon">App-ikon i form af en gammel radio</string>
<string name="descr_card_small_play_button">Afspil/Stop</string>
<string name="descr_card_starred_station">Favoritstation</string>
<string name="descr_card_station_image_change">Skift stationsbillede</string>
<string name="descr_card_station_image">Stationsbillede</string>
<string name="descr_expanded_player_metadata_copy_button">Kopiér oplysninger om den aktuelle afspilning</string>
<string name="descr_expanded_player_metadata_next_button">Næste metadataelement, der afspilles nu</string>
<string name="descr_expanded_player_metadata_previous_button">Forrige metadataelement, der afspilles</string>
<string name="descr_expanded_player_sleep_timer_cancel_button">Annuller soveur</string>
<string name="descr_expanded_player_sleep_timer_remaining_time">Resterende tid på soveuret</string>
<string name="descr_expanded_player_sleep_timer_start_button">Start soveur</string>
<string name="descr_player_playback_button">Afspil/Pause</string>
<string name="descr_player_station_image">Stationsbillede</string>
<!-- Dialoger -->
<string name="dialog_add_station_title">Tilføj station</string>
<string name="dialog_edit_station_name">Stationsnavn</string>
<string name="dialog_edit_stream_uri">Streamadresse</string>
<string name="dialog_error_message_default">Der opstod en fejl</string>
<string name="dialog_error_message_no_network">Opret forbindelse til internettet.</string>
<string name="dialog_error_title_no_network">Offline</string>
<string name="dialog_find_station_button_add">Tilføj</string>
<string name="dialog_find_station_hint">Navn eller streamadresse</string>
<string name="dialog_find_station_no_results">Ingen resultater fundet.</string>
<string name="dialog_find_station_title">Find station</string>
<string name="dialog_generic_button_cancel">Annuller</string>
<string name="dialog_generic_button_okay">OK</string>
<string name="dialog_generic_details_button">Vis detaljer</string>
<string name="dialog_opml_import_details_default">Ingen detaljer tilgængelige</string>
<string name="dialog_restore_collection_replace_existing">Vil du erstatte din nuværende stationssamling med den fra backup\'en?</string>
<string name="dialog_yes_no_message_remove_station">Fjern denne station?</string>
<string name="dialog_yes_no_message_update_station_images">Download den nyeste version af alle stationsbilleder?</string>
<string name="dialog_yes_no_positive_button_default">Ja</string>
<string name="dialog_yes_no_positive_button_remove_station">Fjern</string>
<string name="dialog_yes_no_positive_button_update_covers">Opdater</string>
<!-- Fragment -->
<string name="fragment_settings_title">Indstillinger</string>
<!-- Notifikation -->
<string name="notification_now_playing_channel_name">Afspilningskontrol</string>
<string name="notification_play">Afspil</string>
<string name="notification_stop">Stop</string>
<string name="notification_skip_to_previous">Forrige</string>
<string name="notification_skip_to_next">Næste</string>
<!-- Onboarding -->
<string name="onboarding_app_description">Fordyb dig i lyden du elsker!</string>
<string name="onboarding_app_get_started">Kom i gang</string>
<!-- Afspiller -->
<string name="player_sheet_h2_station_metadata">Spiller nu</string>
<string name="player_sheet_h2_stream_url">Streamadresse</string>
<!-- Indstillinger -->
<string name="pref_advanced_title">Avanceret</string>
<string name="pref_app_version_summary">Version</string>
<string name="pref_app_version_title">App-version</string>
<string name="pref_backup_import_export_title">Importer &amp; eksporter</string>
<string name="pref_buffer_size_summary_disabled">Standardbufferstørrelse bruges til at afspille radiostreams.</string>
<string name="pref_buffer_size_summary_enabled">Større buffer aktiveret. Det kan tage længere tid at starte afspilningen.</string>
<string name="pref_buffer_size_title">Brug større buffer</string>
<string name="pref_edit_station_stream_summary_disabled">Redigering af stream-links er deaktiveret.</string>
<string name="pref_edit_station_stream_summary_enabled">Redigering af stream-links er aktiveret. Sørg for at angive en korrekt streamadresse.</string>
<string name="pref_edit_station_summary_disabled">Redigering af stationsoplysninger er deaktiveret.</string>
<string name="pref_edit_station_summary_enabled">Redigering er aktiveret. Langt tryk for at redigere.</string>
<string name="pref_edit_station_title">Rediger station</string>
<string name="pref_general_title">Generelt</string>
<string name="pref_license_title">Denne app er open source</string>
<string name="pref_license_summary">Licenseret under MIT-licensen</string>
<string name="pref_links_title">Links</string>
<string name="pref_m3u_export_summary">Gem stationer som M3U-playlister til brug i andre afspillere.</string>
<string name="pref_m3u_export_title">Eksportér M3U-playliste</string>
<string name="pref_maintenance_title">Vedligeholdelse</string>
<string name="pref_pls_export_summary">Gem stationer som PLS-playlister til brug i andre afspillere.</string>
<string name="pref_pls_export_title">Eksportér PLS-playliste</string>
<string name="pref_station_export_summary">Gem hele stationssamlingen inkl. billeder på enheden.</string>
<string name="pref_station_export_title">Eksportér stationer</string>
<string name="pref_station_restore_summary">Gendan stationssamling fra backup. Eksisterende stationer erstattes.</string>
<string name="pref_station_restore_title">Importer stationer</string>
<string name="pref_theme_selection_mode_dark">Mørkt tema</string>
<string name="pref_theme_selection_mode_device_default">Systemstandard</string>
<string name="pref_theme_selection_mode_light">Lyst tema</string>
<string name="pref_theme_selection_summary">Aktuelt:</string>
<string name="pref_theme_selection_title">App-tema</string>
<string name="pref_update_station_images_summary">Download nyeste stationsbilleder.</string>
<string name="pref_update_station_images_title">Opdater stationsbilleder</string>
<!-- App-genveje -->
<string name="shortcut_last_station_disabled_message">Genvej til seneste station er deaktiveret.</string>
<string name="shortcut_last_station_long_label">Afspil seneste station</string>
<string name="shortcut_last_station_short_label">Seneste station</string>
<!-- Toasts -->
<string name="toastalert_failed_picking_media">Valg af billede mislykkedes.</string>
<string name="toastmessage_backed_up">blev sikkerhedskopieret.</string>
<string name="toastmessage_connection_failed">Forbindelse kunne ikke oprettes eller gendannes.</string>
<string name="toastmessage_copied_to_clipboard">Kopieret til udklipsholder</string>
<string name="toastmessage_error_download_error">Fejl under download</string>
<string name="toastmessage_error_restart_playback_failed">Kunne ikke starte eller genstarte afspilning</string>
<string name="toastmessage_install_file_helper">Installer en filhåndtering</string>
<string name="toastmessage_preview_playback_failed">Forhåndsvisning kunne ikke afspilles.</string>
<string name="toastmessage_preview_playback_started">Forhåndsvisning startet.</string>
<string name="toastmessage_restored">Stationer blev gendannet.</string>
<string name="toastmessage_save_m3u">Stationer gemt som M3U…</string>
<string name="toastmessage_save_pls">Stationer gemt som PLS…</string>
<string name="toastmessage_shortcut_created">Genvej tilføjet til startskærmen</string>
<string name="toastmessage_shortcut_not_created">Kunne ikke tilføje genvej. Enheden forhindrer det.</string>
<string name="toastmessage_sleep_timer_unable_to_start">Start afspilning først</string>
<string name="toastmessage_station_duplicate">Denne station findes allerede</string>
<string name="toastmessage_station_not_valid">Denne station findes ikke</string>
<string name="toastmessage_updating_collection">Opdaterer alle stationer</string>
<string name="toastmessage_updating_station_images">Opdaterer alle stationsbilleder</string>
<!-- Snackbars -->
<string name="snackbar_show">Vis</string>
<string name="snackbar_update_available">er tilgængelig!</string>
</resources>

View File

@@ -0,0 +1,113 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Nom de l'application -->
<!-- Descriptions d'accessibilité -->
<string name="descr_app_icon">Icône de lapplication en forme dancienne radio</string>
<string name="descr_card_small_play_button">Démarrer/Arrêter</string>
<string name="descr_card_starred_station">Station favorite</string>
<string name="descr_card_station_image_change">Changer limage de la station</string>
<string name="descr_card_station_image">Image de la station</string>
<string name="descr_expanded_player_metadata_copy_button">Copier les informations de lecture actuelles</string>
<string name="descr_expanded_player_metadata_next_button">Entrée suivante des métadonnées en cours de lecture</string>
<string name="descr_expanded_player_metadata_previous_button">Entrée précédente des métadonnées en cours de lecture</string>
<string name="descr_expanded_player_sleep_timer_cancel_button">Annuler la minuterie de sommeil</string>
<string name="descr_expanded_player_sleep_timer_remaining_time">Temps restant de la minuterie de sommeil</string>
<string name="descr_expanded_player_sleep_timer_start_button">Démarrer la minuterie de sommeil</string>
<string name="descr_player_playback_button">Lecture/Pause</string>
<string name="descr_player_station_image">Image de la station</string>
<!-- Dialogues -->
<string name="dialog_add_station_title">Ajouter une station</string>
<string name="dialog_edit_station_name">Nom de la station</string>
<string name="dialog_edit_stream_uri">Adresse du flux</string>
<string name="dialog_error_message_default">Une erreur est survenue</string>
<string name="dialog_error_message_no_network">Connectez-vous à Internet.</string>
<string name="dialog_error_title_no_network">Hors ligne</string>
<string name="dialog_find_station_button_add">Ajouter</string>
<string name="dialog_find_station_hint">Nom ou adresse du flux</string>
<string name="dialog_find_station_no_results">Aucun résultat trouvé.</string>
<string name="dialog_find_station_title">Trouver une station</string>
<string name="dialog_generic_button_cancel">Annuler</string>
<string name="dialog_generic_button_okay">OK</string>
<string name="dialog_generic_details_button">Afficher les détails</string>
<string name="dialog_opml_import_details_default">Aucun détail disponible</string>
<string name="dialog_restore_collection_replace_existing">Voulez-vous remplacer votre collection actuelle de stations par celle de la sauvegarde ?</string>
<string name="dialog_yes_no_message_remove_station">Supprimer cette station ?</string>
<string name="dialog_yes_no_message_update_station_images">Télécharger la dernière version de toutes les images des stations ?</string>
<string name="dialog_yes_no_positive_button_default">Oui</string>
<string name="dialog_yes_no_positive_button_remove_station">Supprimer</string>
<string name="dialog_yes_no_positive_button_update_covers">Mettre à jour</string>
<!-- Fragment -->
<string name="fragment_settings_title">Paramètres</string>
<!-- Notification -->
<string name="notification_now_playing_channel_name">Contrôle de lecture</string>
<string name="notification_play">Lecture</string>
<string name="notification_stop">Arrêt</string>
<string name="notification_skip_to_previous">Précédent</string>
<string name="notification_skip_to_next">Suivant</string>
<!-- Onboarding -->
<string name="onboarding_app_description">Plongez dans le son de votre choix !</string>
<string name="onboarding_app_get_started">Commencer maintenant</string>
<!-- Lecteur -->
<string name="player_sheet_h2_station_metadata">En cours de lecture</string>
<string name="player_sheet_h2_stream_url">Adresse du flux</string>
<!-- Paramètres -->
<string name="pref_advanced_title">Avancé</string>
<string name="pref_app_version_summary">Version</string>
<string name="pref_app_version_title">Version de lapplication</string>
<string name="pref_backup_import_export_title">Importer &amp; Exporter</string>
<string name="pref_buffer_size_summary_disabled">La taille de tampon standard est utilisée pour la lecture du flux radio.</string>
<string name="pref_buffer_size_summary_enabled">Taille de tampon plus grande activée. La lecture peut prendre plus de temps à démarrer.</string>
<string name="pref_buffer_size_title">Utiliser un tampon plus grand</string>
<string name="pref_edit_station_stream_summary_disabled">La modification des liens de streaming est désactivée.</string>
<string name="pref_edit_station_stream_summary_enabled">La modification des liens de streaming est activée. Assurez-vous dentrer une adresse de flux correcte.</string>
<string name="pref_edit_station_summary_disabled">La modification des informations de la station est désactivée.</string>
<string name="pref_edit_station_summary_enabled">La modification est activée. Maintenez appuyé pour éditer.</string>
<string name="pref_edit_station_title">Modifier la station</string>
<string name="pref_general_title">Général</string>
<string name="pref_license_title">Cette application est Open Source</string>
<string name="pref_license_summary">Sous licence MIT</string>
<string name="pref_links_title">Liens</string>
<string name="pref_m3u_export_summary">Enregistrez les stations dans un fichier de playlist M3U pouvant être importé dans dautres lecteurs.</string>
<string name="pref_m3u_export_title">Exporter la playlist M3U</string>
<string name="pref_maintenance_title">Maintenance</string>
<string name="pref_pls_export_summary">Enregistrez les stations dans un fichier de playlist PLS pouvant être importé dans dautres lecteurs.</string>
<string name="pref_pls_export_title">Exporter la playlist PLS</string>
<string name="pref_station_export_summary">Sauvegardez toute la collection de stations, y compris les images, sur lappareil.</string>
<string name="pref_station_export_title">Exporter les stations</string>
<string name="pref_station_restore_summary">Restaurer la collection de stations depuis la sauvegarde. Les stations existantes seront remplacées.</string>
<string name="pref_station_restore_title">Importer les stations</string>
<string name="pref_theme_selection_mode_dark">Thème sombre</string>
<string name="pref_theme_selection_mode_device_default">Par défaut du système</string>
<string name="pref_theme_selection_mode_light">Thème clair</string>
<string name="pref_theme_selection_summary">Actuel :</string>
<string name="pref_theme_selection_title">Thème de lapplication</string>
<string name="pref_update_station_images_summary">Télécharger la dernière version de toutes les images des stations.</string>
<string name="pref_update_station_images_title">Mettre à jour les images des stations</string>
<!-- Raccourcis de l'app -->
<string name="shortcut_last_station_disabled_message">Raccourci pour lire la dernière station désactivé.</string>
<string name="shortcut_last_station_long_label">Lire la dernière station</string>
<string name="shortcut_last_station_short_label">Dernière station</string>
<!-- Toasts -->
<string name="toastalert_failed_picking_media">Sélection dimage échouée.</string>
<string name="toastmessage_backed_up">a été sauvegardé avec succès.</string>
<string name="toastmessage_connection_failed">La connexion na pas pu être établie ou restaurée.</string>
<string name="toastmessage_copied_to_clipboard">Copié dans le presse-papiers</string>
<string name="toastmessage_error_download_error">Erreur lors du téléchargement</string>
<string name="toastmessage_error_restart_playback_failed">La lecture na pas pu être démarrée ou redémarrée</string>
<string name="toastmessage_install_file_helper">Veuillez installer un gestionnaire de fichiers</string>
<string name="toastmessage_preview_playback_failed">Lecture de prévisualisation impossible.</string>
<string name="toastmessage_preview_playback_started">Lecture de prévisualisation démarrée.</string>
<string name="toastmessage_restored">Stations restaurées avec succès.</string>
<string name="toastmessage_save_m3u">Stations enregistrées au format M3U…</string>
<string name="toastmessage_save_pls">Stations enregistrées au format PLS…</string>
<string name="toastmessage_shortcut_created">Raccourci ajouté à lécran daccueil</string>
<string name="toastmessage_shortcut_not_created">Impossible dajouter le raccourci. Lappareil lempêche.</string>
<string name="toastmessage_sleep_timer_unable_to_start">Veuillez démarrer la lecture dabord</string>
<string name="toastmessage_station_duplicate">Cette station existe déjà</string>
<string name="toastmessage_station_not_valid">Cette station nexiste pas</string>
<string name="toastmessage_updating_collection">Mise à jour de toutes les stations</string>
<string name="toastmessage_updating_station_images">Mise à jour de toutes les images des stations</string>
<!-- Snackbars -->
<string name="snackbar_show">Afficher</string>
<string name="snackbar_update_available">est disponible !</string>
</resources>

View File

@@ -0,0 +1,114 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- アプリ名 -->
<!-- アクセシビリティの説明 -->
<string name="descr_app_icon">昔のラジオの形をしたアプリアイコン</string>
<string name="descr_card_small_play_button">再生/停止</string>
<string name="descr_card_starred_station">お気に入りの局</string>
<string name="descr_card_station_image_change">局の画像を変更</string>
<string name="descr_card_station_image">局の画像</string>
<string name="descr_expanded_player_metadata_copy_button">現在再生中の情報をコピー</string>
<string name="descr_expanded_player_metadata_next_button">次の再生中のメタデータ項目</string>
<string name="descr_expanded_player_metadata_previous_button">前の再生中のメタデータ項目</string>
<string name="descr_expanded_player_sleep_timer_cancel_button">スリープタイマーをキャンセル</string>
<string name="descr_expanded_player_sleep_timer_remaining_time">スリープタイマーの残り時間</string>
<string name="descr_expanded_player_sleep_timer_start_button">スリープタイマーを開始</string>
<string name="descr_player_playback_button">再生/一時停止</string>
<string name="descr_player_station_image">局の画像</string>
<!-- ダイアログ -->
<string name="dialog_add_station_title">局を追加</string>
<string name="dialog_edit_station_name">局名</string>
<string name="dialog_edit_stream_uri">ストリームアドレス</string>
<string name="dialog_error_message_default">エラーが発生しました</string>
<string name="dialog_error_message_no_network">インターネットに接続してください。</string>
<string name="dialog_error_title_no_network">オフライン</string>
<string name="dialog_find_station_button_add">追加</string>
<string name="dialog_find_station_hint">名前またはストリームアドレス</string>
<string name="dialog_find_station_no_results">結果が見つかりませんでした。</string>
<string name="dialog_find_station_title">局を検索</string>
<string name="dialog_generic_button_cancel">キャンセル</string>
<string name="dialog_generic_button_okay">OK</string>
<string name="dialog_generic_details_button">詳細を表示</string>
<string name="dialog_opml_import_details_default">詳細情報はありません</string>
<string name="dialog_restore_collection_replace_existing">現在の局のコレクションをバックアップからのものに置き換えますか?</string>
<string name="dialog_yes_no_message_remove_station">この局を削除しますか?</string>
<string name="dialog_yes_no_message_update_station_images">すべての局の画像を最新に更新しますか?</string>
<string name="dialog_yes_no_positive_button_default">はい</string>
<string name="dialog_yes_no_positive_button_remove_station">削除</string>
<string name="dialog_yes_no_positive_button_update_covers">更新</string>
<!-- フラグメント -->
<string name="fragment_settings_title">設定</string>
<!-- 通知 -->
<string name="notification_now_playing_channel_name">再生コントロール</string>
<string name="notification_play">再生</string>
<string name="notification_stop">停止</string>
<string name="notification_skip_to_previous">前へ</string>
<string name="notification_skip_to_next">次へ</string>
<!-- オンボーディング -->
<string name="onboarding_app_description">お気に入りのサウンドの世界に飛び込もう!</string>
<string name="onboarding_app_get_started">今すぐ始める</string>
<!-- プレイヤー -->
<string name="player_sheet_h2_station_metadata">現在再生中</string>
<string name="player_sheet_h2_stream_url">ストリーミングアドレス</string>
<!-- 設定 -->
<string name="pref_advanced_title">詳細設定</string>
<string name="pref_app_version_summary">バージョン</string>
<string name="pref_app_version_title">アプリバージョン</string>
<string name="pref_backup_import_export_title">インポートとエクスポート</string>
<string name="pref_buffer_size_summary_disabled">ラジオストリーム再生には標準のバッファサイズが使用されます。</string>
<string name="pref_buffer_size_summary_enabled">大きなバッファを使用すると、再生の開始に時間がかかることがあります。</string>
<string name="pref_buffer_size_title">大きなバッファを使用</string>
<string name="pref_edit_station_stream_summary_disabled">ストリームリンクの編集は無効です。</string>
<string name="pref_edit_station_stream_summary_enabled">ストリームリンクの編集は有効です。正しいURLを入力してください。</string>
<string name="pref_edit_station_summary_disabled">局情報の編集は無効です。</string>
<string name="pref_edit_station_summary_enabled">局情報の編集は有効です。長押しで編集モードに入ります。</string>
<string name="pref_edit_station_title">局を編集</string>
<string name="pref_general_title">一般</string>
<string name="pref_license_title">このアプリはオープンソースです</string>
<string name="pref_license_summary">MITライセンスで提供されています</string>
<string name="pref_links_title">リンク</string>
<string name="pref_m3u_export_summary">ラジオ局をM3Uプレイリストとして保存し、他のプレイヤーにインポートできます。</string>
<string name="pref_m3u_export_title">M3Uプレイリストをエクスポート</string>
<string name="pref_maintenance_title">メンテナンス</string>
<string name="pref_pls_export_summary">ラジオ局をPLSプレイリストとして保存し、他のプレイヤーにインポートできます。</string>
<string name="pref_pls_export_title">PLSプレイリストをエクスポート</string>
<string name="pref_station_export_summary">局と画像を端末にバックアップとして保存します。</string>
<string name="pref_station_export_title">局をエクスポート</string>
<string name="pref_station_restore_summary">バックアップから局を復元します。現在の局は上書きされます。</string>
<string name="pref_station_restore_title">局をインポート</string>
<string name="pref_theme_selection_mode_dark">ダークテーマ</string>
<string name="pref_theme_selection_mode_device_default">システムデフォルト</string>
<string name="pref_theme_selection_mode_light">ライトテーマ</string>
<string name="pref_theme_selection_summary">現在:</string>
<string name="pref_theme_selection_title">アプリテーマ</string>
<string name="pref_update_station_images_summary">すべての局画像を最新に更新します。</string>
<string name="pref_update_station_images_title">局画像を更新</string>
<!-- ショートカット -->
<string name="shortcut_last_station_disabled_message">最後に再生した局のショートカットは無効になっています。</string>
<string name="shortcut_last_station_long_label">最後の局を再生</string>
<string name="shortcut_last_station_short_label">最後の局</string>
<!-- トーストアラート -->
<string name="toastalert_failed_picking_media">メディアの選択に失敗しました。</string>
<!-- トーストメッセージ -->
<string name="toastmessage_backed_up">正常にバックアップされました。</string>
<string name="toastmessage_connection_failed">接続に失敗しました。</string>
<string name="toastmessage_copied_to_clipboard">クリップボードにコピーしました</string>
<string name="toastmessage_error_download_error">ダウンロードエラー</string>
<string name="toastmessage_error_restart_playback_failed">再生の開始または再開に失敗しました</string>
<string name="toastmessage_install_file_helper">ファイルマネージャーをインストールしてください</string>
<string name="toastmessage_preview_playback_failed">プレビュー再生はできません。</string>
<string name="toastmessage_preview_playback_started">プレビュー再生を開始しました。</string>
<string name="toastmessage_restored">局が正常に復元されました。</string>
<string name="toastmessage_save_m3u">M3U形式で局を保存しました…</string>
<string name="toastmessage_save_pls">PLS形式で局を保存しました…</string>
<string name="toastmessage_shortcut_created">局をホーム画面に追加しました</string>
<string name="toastmessage_shortcut_not_created">局をホーム画面に追加できません。デバイスがショートカットの追加を制限しています。</string>
<string name="toastmessage_sleep_timer_unable_to_start">再生を開始してください</string>
<string name="toastmessage_station_duplicate">この局はすでに存在します</string>
<string name="toastmessage_station_not_valid">この局は存在しません</string>
<string name="toastmessage_updating_collection">すべての局を更新中</string>
<string name="toastmessage_updating_station_images">すべての局画像を更新中</string>
<!-- スナックバー -->
<string name="snackbar_show">表示</string>
<string name="snackbar_update_available">が利用可能です!</string>
</resources>

View File

@@ -98,7 +98,7 @@
<string name="toastmessage_preview_playback_started">Было запущено воспроизведение предварительного просмотра.</string> <string name="toastmessage_preview_playback_started">Было запущено воспроизведение предварительного просмотра.</string>
<string name="toastmessage_restored">Станции были успешно восстановлены.</string> <string name="toastmessage_restored">Станции были успешно восстановлены.</string>
<string name="toastmessage_save_m3u">Сохранение радиостанций как M3U…</string> <string name="toastmessage_save_m3u">Сохранение радиостанций как M3U…</string>
<string name="toastmessage_save_pls">Сохранение радиостанций в формате PLS...</string> <string name="toastmessage_save_pls">Сохранение радиостанций в формате PLS</string>
<string name="toastmessage_shortcut_created">Ярлык создан.</string> <string name="toastmessage_shortcut_created">Ярлык создан.</string>
<string name="toastmessage_shortcut_not_created">Ярлык не создан. Устройство не позволяет создавать ярлыки.</string> <string name="toastmessage_shortcut_not_created">Ярлык не создан. Устройство не позволяет создавать ярлыки.</string>
<string name="toastmessage_sleep_timer_unable_to_start">Пожалуйста, запустите сперва воспроизведение.</string> <string name="toastmessage_sleep_timer_unable_to_start">Пожалуйста, запустите сперва воспроизведение.</string>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<!-- App Name --> <!-- App Name -->
<string name="app_version_name" translatable="false">\"Sweet\"</string> <string name="app_version_name" translatable="false">\"Blue\"</string>
<!-- Accessibility Descriptions --> <!-- Accessibility Descriptions -->
<string name="descr_app_icon">App icon depicting an old radio</string> <string name="descr_app_icon">App icon depicting an old radio</string>

View File

@@ -17,4 +17,6 @@
<locale android:name="tr" /> <locale android:name="tr" />
<locale android:name="uk" /> <locale android:name="uk" />
<locale android:name="zh-rCN" /> <locale android:name="zh-rCN" />
<locale android:name="da" />
<locale android:name="ja" />
</locale-config> </locale-config>

View File

@@ -3,9 +3,9 @@
plugins { plugins {
id 'com.android.application' version '8.6.1' apply false id 'com.android.application' version '8.6.1' apply false
id 'com.android.library' version '8.6.1' apply false id 'com.android.library' version '8.6.1' apply false
id 'org.jetbrains.kotlin.android' version "1.9.21" apply false id 'org.jetbrains.kotlin.android' version "2.1.0" apply false
} }
tasks.register('clean', Delete) { tasks.register('clean', Delete) {
delete rootProject.buildDir delete rootProject.buildDir()
} }