🚀 Remove network permission

* Removed network permission along with notifications
* Removed check for updates feature (no longer makes sense without network access)

Resolves: #172
This commit is contained in:
Acclorite 2025-02-13 16:26:03 +02:00
parent e9b83072f3
commit ec19a5e455
61 changed files with 38 additions and 1123 deletions

View file

@ -7,10 +7,6 @@
android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<!-- Send notification about new app version -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.INTERNET" />
<!-- Removing DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION, which is not used -->
<uses-permission
android:name="ua.acclorite.book_story.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION"
@ -19,24 +15,24 @@
<application
android:name=".Application"
android:allowBackup="false"
android:enableOnBackInvokedCallback="true"
android:icon="@mipmap/app_icon"
android:roundIcon="@mipmap/app_icon_round"
android:label="@string/app_name"
android:largeHeap="true"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/app_icon_round"
android:supportsRtl="true"
android:theme="@style/Splash"
android:requestLegacyExternalStorage="true"
android:enableOnBackInvokedCallback="true"
android:usesCleartextTraffic="false"
android:largeHeap="true"
tools:targetApi="tiramisu"
tools:ignore="DataExtractionRules">
tools:ignore="DataExtractionRules"
tools:targetApi="tiramisu">
<activity
android:name=".ui.main.MainActivity"
android:windowSoftInputMode="adjustResize"
android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize|locale|density|uiMode"
android:exported="true"
android:theme="@style/Splash">
android:theme="@style/Splash"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
@ -52,7 +48,5 @@
android:name="autoStoreLocales"
android:value="true" />
</service>
</application>
</manifest>

View file

@ -7,35 +7,7 @@
package ua.acclorite.book_story
import android.app.Application
import android.app.NotificationChannel
import android.app.NotificationManager
import dagger.hilt.android.HiltAndroidApp
import ua.acclorite.book_story.data.local.notification.UpdatesNotificationService
@HiltAndroidApp
class Application : Application() {
override fun onCreate() {
super.onCreate()
createNotificationChannel()
}
private fun createNotificationChannel() {
val channel = NotificationChannel(
UpdatesNotificationService.CHANNEL_ID,
getString(R.string.updates_notification_channel),
NotificationManager.IMPORTANCE_HIGH
)
val notificationManager = getSystemService(
NOTIFICATION_SERVICE
) as NotificationManager
notificationManager.createNotificationChannel(channel)
}
}
class Application : Application()

View file

@ -8,8 +8,6 @@ package ua.acclorite.book_story.data.di
import android.app.Application
import androidx.room.Room
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
@ -21,31 +19,14 @@ import org.commonmark.node.HtmlBlock
import org.commonmark.node.IndentedCodeBlock
import org.commonmark.node.ThematicBreak
import org.commonmark.parser.Parser
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import ua.acclorite.book_story.data.local.room.BookDao
import ua.acclorite.book_story.data.local.room.BookDatabase
import ua.acclorite.book_story.data.local.room.DatabaseHelper
import ua.acclorite.book_story.data.remote.GithubAPI
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides
@Singleton
fun provideGithubApi(): GithubAPI {
val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
return Retrofit.Builder()
.baseUrl(GithubAPI.BASE_URL)
.addConverterFactory(MoshiConverterFactory.create(moshi))
.build()
.create(GithubAPI::class.java)
}
@Provides
@Singleton
fun provideCommonmarkParser(): Parser {

View file

@ -12,8 +12,6 @@ import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import ua.acclorite.book_story.data.local.data_store.DataStore
import ua.acclorite.book_story.data.local.data_store.DataStoreImpl
import ua.acclorite.book_story.data.local.notification.UpdatesNotificationService
import ua.acclorite.book_story.data.local.notification.UpdatesNotificationServiceImpl
import ua.acclorite.book_story.data.mapper.book.BookMapper
import ua.acclorite.book_story.data.mapper.book.BookMapperImpl
import ua.acclorite.book_story.data.mapper.color_preset.ColorPresetMapper
@ -30,14 +28,12 @@ import ua.acclorite.book_story.data.repository.DataStoreRepositoryImpl
import ua.acclorite.book_story.data.repository.FileSystemRepositoryImpl
import ua.acclorite.book_story.data.repository.HistoryRepositoryImpl
import ua.acclorite.book_story.data.repository.PermissionRepositoryImpl
import ua.acclorite.book_story.data.repository.RemoteRepositoryImpl
import ua.acclorite.book_story.domain.repository.BookRepository
import ua.acclorite.book_story.domain.repository.ColorPresetRepository
import ua.acclorite.book_story.domain.repository.DataStoreRepository
import ua.acclorite.book_story.domain.repository.FileSystemRepository
import ua.acclorite.book_story.domain.repository.HistoryRepository
import ua.acclorite.book_story.domain.repository.PermissionRepository
import ua.acclorite.book_story.domain.repository.RemoteRepository
import javax.inject.Singleton
@Module
@ -79,12 +75,6 @@ abstract class RepositoryModule {
fileSystemRepositoryImpl: FileSystemRepositoryImpl
): FileSystemRepository
@Binds
@Singleton
abstract fun bindRemoteRepository(
remoteRepositoryImpl: RemoteRepositoryImpl
): RemoteRepository
@Binds
@Singleton
abstract fun bindPermissionRepository(
@ -120,10 +110,4 @@ abstract class RepositoryModule {
abstract fun bindTextParser(
textParserImpl: TextParserImpl
): TextParser
@Binds
@Singleton
abstract fun bindNotificationService(
updatesNotificationServiceImpl: UpdatesNotificationServiceImpl
): UpdatesNotificationService
}

View file

@ -1,18 +0,0 @@
/*
* Book's Story free and open-source Material You eBook reader.
* Copyright (C) 2024-2025 Acclorite
* SPDX-License-Identifier: GPL-3.0-only
*/
package ua.acclorite.book_story.data.local.notification
import ua.acclorite.book_story.data.remote.dto.LatestReleaseInfo
interface UpdatesNotificationService {
fun postNotification(releaseInfo: LatestReleaseInfo)
companion object {
const val CHANNEL_ID = "updates_channel"
}
}

View file

@ -1,86 +0,0 @@
/*
* Book's Story free and open-source Material You eBook reader.
* Copyright (C) 2024-2025 Acclorite
* SPDX-License-Identifier: GPL-3.0-only
*/
package ua.acclorite.book_story.data.local.notification
import android.app.Application
import android.app.Notification
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.graphics.drawable.Icon
import android.net.Uri
import ua.acclorite.book_story.R
import ua.acclorite.book_story.data.remote.dto.LatestReleaseInfo
import ua.acclorite.book_story.presentation.core.constants.Constants
import ua.acclorite.book_story.presentation.core.constants.provideDownloadLatestReleasePage
import ua.acclorite.book_story.presentation.core.constants.provideReleasesPage
import javax.inject.Inject
class UpdatesNotificationServiceImpl @Inject constructor(
private val application: Application
) : UpdatesNotificationService {
private val notificationManager = application.getSystemService(Context.NOTIFICATION_SERVICE)
as NotificationManager
/**
* Sends notification about new update.
*
* @param releaseInfo [LatestReleaseInfo].
*/
override fun postNotification(releaseInfo: LatestReleaseInfo) {
val downloadLatestVersionIntent = Intent(
Intent.ACTION_VIEW,
Uri.parse(Constants.provideDownloadLatestReleasePage())
)
val latestReleaseIntent = Intent(
Intent.ACTION_VIEW,
Uri.parse(Constants.provideReleasesPage())
)
val downloadLatestVersionPendingIntent = PendingIntent.getActivity(
application,
1,
downloadLatestVersionIntent,
PendingIntent.FLAG_IMMUTABLE
)
val latestReleasePendingIntent = PendingIntent.getActivity(
application,
1,
latestReleaseIntent,
PendingIntent.FLAG_IMMUTABLE
)
val notification = Notification.Builder(
application,
UpdatesNotificationService.CHANNEL_ID
)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle(application.getString(R.string.updates_notification_title))
.setContentText(
application.getString(
R.string.updates_notification_desc,
releaseInfo.name
)
)
.setContentIntent(latestReleasePendingIntent)
.addAction(
Notification.Action.Builder(
Icon.createWithResource(application, R.drawable.notification_icon),
application.getString(R.string.updates_notification_action),
downloadLatestVersionPendingIntent
).build()
)
.build()
notificationManager.notify(
0,
notification
)
}
}

View file

@ -1,19 +0,0 @@
/*
* Book's Story free and open-source Material You eBook reader.
* Copyright (C) 2024-2025 Acclorite
* SPDX-License-Identifier: GPL-3.0-only
*/
package ua.acclorite.book_story.data.remote
import retrofit2.http.GET
import ua.acclorite.book_story.data.remote.dto.LatestReleaseInfo
interface GithubAPI {
@GET("repos/Acclorite/book-story/releases/latest")
suspend fun getLatestRelease(): LatestReleaseInfo
companion object {
const val BASE_URL = "https://api.github.com/"
}
}

View file

@ -1,20 +0,0 @@
/*
* Book's Story free and open-source Material You eBook reader.
* Copyright (C) 2024-2025 Acclorite
* SPDX-License-Identifier: GPL-3.0-only
*/
package ua.acclorite.book_story.data.remote.dto
import androidx.annotation.Keep
import androidx.compose.runtime.Immutable
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@Keep
@JsonClass(generateAdapter = true)
@Immutable
data class LatestReleaseInfo(
@Json(name = "name") val name: String,
@Json(name = "tag_name") val tagName: String
)

View file

@ -26,7 +26,6 @@ import javax.inject.Inject
import javax.inject.Singleton
private const val STORAGE_PERMISSION = "STORAGE PERM, REPO"
private const val NOTIFICATIONS_PERMISSION = "NOTIFIC PERM, REPO"
@Singleton
class PermissionRepositoryImpl @Inject constructor() : PermissionRepository {
@ -102,53 +101,4 @@ class PermissionRepositoryImpl @Inject constructor() : PermissionRepository {
Log.e(STORAGE_PERMISSION, "Not granted: Timeout")
return false
}
@OptIn(ExperimentalPermissionsApi::class)
override suspend fun grantNotificationsPermission(
activity: ComponentActivity,
notificationsPermissionState: PermissionState
): Boolean {
Log.i(NOTIFICATIONS_PERMISSION, "Requested notifications permission")
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
Log.w(NOTIFICATIONS_PERMISSION, "Granted: API is below 33")
return true
}
if (notificationsPermissionState.status.isGranted) {
Log.i(NOTIFICATIONS_PERMISSION, "Granted: Notifications Permission is already granted")
return true
}
if (!notificationsPermissionState.status.shouldShowRationale) {
notificationsPermissionState.launchPermissionRequest()
} else {
val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
intent.putExtra(Settings.EXTRA_APP_PACKAGE, activity.packageName)
intent.launchActivity(activity) {
Log.e(
NOTIFICATIONS_PERMISSION,
"Could not launch \"APP_NOTIFICATION_SETTINGS\" activity"
)
return false
}
}
for (i in 1..20) {
if (!notificationsPermissionState.status.isGranted) {
delay(1000)
yield()
continue
}
yield()
Log.i(NOTIFICATIONS_PERMISSION, "Successfully granted")
return true
break
}
Log.e(NOTIFICATIONS_PERMISSION, "Not granted: Timeout")
return false
}
}

View file

@ -1,65 +0,0 @@
/*
* Book's Story free and open-source Material You eBook reader.
* Copyright (C) 2024-2025 Acclorite
* SPDX-License-Identifier: GPL-3.0-only
*/
package ua.acclorite.book_story.data.repository
import android.app.Application
import android.util.Log
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import ua.acclorite.book_story.R
import ua.acclorite.book_story.data.local.notification.UpdatesNotificationService
import ua.acclorite.book_story.data.remote.GithubAPI
import ua.acclorite.book_story.data.remote.dto.LatestReleaseInfo
import ua.acclorite.book_story.domain.repository.RemoteRepository
import javax.inject.Inject
import javax.inject.Singleton
private const val CHECK_FOR_UPDATES = "CHECK FOR UPD, REPO"
/**
* Remote repository.
* Manages all API(online) related work.
*/
@Singleton
class RemoteRepositoryImpl @Inject constructor(
private val application: Application,
private val githubAPI: GithubAPI,
private val updatesNotificationService: UpdatesNotificationService,
) : RemoteRepository {
/**
* Check for updates from GitHub.
*
* @param postNotification Whether notification should be send.
*/
override suspend fun checkForUpdates(postNotification: Boolean): LatestReleaseInfo? {
Log.i(CHECK_FOR_UPDATES, "Checking for updates. Post notification: $postNotification")
return withContext(Dispatchers.IO) {
try {
val result = githubAPI.getLatestRelease()
val version = result.tagName.substringAfter("v")
val currentVersion = application.getString(R.string.app_version)
if (version != currentVersion && postNotification) {
Log.i(CHECK_FOR_UPDATES, "Posting notification.")
updatesNotificationService.postNotification(
result
)
}
result
} catch (e: Exception) {
Log.e(CHECK_FOR_UPDATES, "Could not get latest release information.")
e.printStackTrace()
null
}
}
}
}

View file

@ -17,10 +17,4 @@ interface PermissionRepository {
activity: ComponentActivity,
storagePermissionState: PermissionState
): Boolean
@OptIn(ExperimentalPermissionsApi::class)
suspend fun grantNotificationsPermission(
activity: ComponentActivity,
notificationsPermissionState: PermissionState
): Boolean
}

View file

@ -1,16 +0,0 @@
/*
* Book's Story free and open-source Material You eBook reader.
* Copyright (C) 2024-2025 Acclorite
* SPDX-License-Identifier: GPL-3.0-only
*/
package ua.acclorite.book_story.domain.repository
import ua.acclorite.book_story.data.remote.dto.LatestReleaseInfo
interface RemoteRepository {
suspend fun checkForUpdates(
postNotification: Boolean
): LatestReleaseInfo?
}

View file

@ -1,29 +0,0 @@
/*
* Book's Story free and open-source Material You eBook reader.
* Copyright (C) 2024-2025 Acclorite
* SPDX-License-Identifier: GPL-3.0-only
*/
package ua.acclorite.book_story.domain.use_case.permission
import androidx.activity.ComponentActivity
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.PermissionState
import ua.acclorite.book_story.domain.repository.PermissionRepository
import javax.inject.Inject
class GrantNotificationsPermission @Inject constructor(
private val repository: PermissionRepository
) {
@OptIn(ExperimentalPermissionsApi::class)
suspend fun execute(
activity: ComponentActivity,
notificationsPermissionState: PermissionState
): Boolean {
return repository.grantNotificationsPermission(
activity = activity,
notificationsPermissionState = notificationsPermissionState
)
}
}

View file

@ -1,20 +0,0 @@
/*
* Book's Story free and open-source Material You eBook reader.
* Copyright (C) 2024-2025 Acclorite
* SPDX-License-Identifier: GPL-3.0-only
*/
package ua.acclorite.book_story.domain.use_case.remote
import ua.acclorite.book_story.data.remote.dto.LatestReleaseInfo
import ua.acclorite.book_story.domain.repository.RemoteRepository
import javax.inject.Inject
class CheckForUpdates @Inject constructor(
private val repository: RemoteRepository
) {
suspend fun execute(postNotification: Boolean): LatestReleaseInfo? {
return repository.checkForUpdates(postNotification)
}
}

View file

@ -10,37 +10,21 @@ import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.TopAppBarScrollBehavior
import androidx.compose.runtime.Composable
import ua.acclorite.book_story.data.remote.dto.LatestReleaseInfo
import ua.acclorite.book_story.domain.util.Dialog
import ua.acclorite.book_story.ui.about.AboutEvent
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun AboutContent(
scrollBehavior: TopAppBarScrollBehavior,
dialog: Dialog? = null,
updateLoading: Boolean,
updateInfo: LatestReleaseInfo?,
listState: LazyListState,
checkForUpdate: (AboutEvent.OnCheckForUpdate) -> Unit,
navigateToBrowserPage: (AboutEvent.OnNavigateToBrowserPage) -> Unit,
dismissDialog: (AboutEvent.OnDismissDialog) -> Unit,
navigateToLicenses: () -> Unit,
navigateToCredits: () -> Unit,
navigateBack: () -> Unit
) {
AboutDialog(
dialog = dialog,
updateInfo = updateInfo,
navigateToBrowserPage = navigateToBrowserPage,
dismissDialog = dismissDialog
)
AboutScaffold(
scrollBehavior = scrollBehavior,
updateLoading = updateLoading,
listState = listState,
checkForUpdate = checkForUpdate,
navigateToBrowserPage = navigateToBrowserPage,
navigateToLicenses = navigateToLicenses,
navigateToCredits = navigateToCredits,

View file

@ -1,31 +0,0 @@
/*
* Book's Story free and open-source Material You eBook reader.
* Copyright (C) 2024-2025 Acclorite
* SPDX-License-Identifier: GPL-3.0-only
*/
package ua.acclorite.book_story.presentation.about
import androidx.compose.runtime.Composable
import ua.acclorite.book_story.data.remote.dto.LatestReleaseInfo
import ua.acclorite.book_story.domain.util.Dialog
import ua.acclorite.book_story.ui.about.AboutEvent
import ua.acclorite.book_story.ui.about.AboutScreen
@Composable
fun AboutDialog(
dialog: Dialog? = null,
updateInfo: LatestReleaseInfo?,
navigateToBrowserPage: (AboutEvent.OnNavigateToBrowserPage) -> Unit,
dismissDialog: (AboutEvent.OnDismissDialog) -> Unit
) {
when (dialog) {
AboutScreen.UPDATE_DIALOG -> {
AboutUpdateDialog(
updateInfo = updateInfo,
navigateToBrowserPage = navigateToBrowserPage,
dismissDialog = dismissDialog
)
}
}
}

View file

@ -42,10 +42,8 @@ import ua.acclorite.book_story.ui.about.AboutEvent
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun AboutLayout(
updateLoading: Boolean,
paddingValues: PaddingValues,
listState: LazyListState,
checkForUpdate: (AboutEvent.OnCheckForUpdate) -> Unit,
navigateToBrowserPage: (AboutEvent.OnNavigateToBrowserPage) -> Unit,
navigateToLicenses: () -> Unit,
navigateToCredits: () -> Unit
@ -102,17 +100,9 @@ fun AboutLayout(
context.getString(R.string.app_version)
)
)
append("\n")
append(stringResource(id = R.string.app_version_option_desc_2))
},
showLoading = updateLoading
) {
checkForUpdate(
AboutEvent.OnCheckForUpdate(
context = context
)
)
}
isOnClickEnabled = false
)
AboutItem(
title = stringResource(id = R.string.report_bug_option),

View file

@ -21,9 +21,7 @@ import ua.acclorite.book_story.ui.about.AboutEvent
@Composable
fun AboutScaffold(
scrollBehavior: TopAppBarScrollBehavior,
updateLoading: Boolean,
listState: LazyListState,
checkForUpdate: (AboutEvent.OnCheckForUpdate) -> Unit,
navigateToBrowserPage: (AboutEvent.OnNavigateToBrowserPage) -> Unit,
navigateToLicenses: () -> Unit,
navigateToCredits: () -> Unit,
@ -42,10 +40,8 @@ fun AboutScaffold(
}
) { paddingValues ->
AboutLayout(
updateLoading = updateLoading,
paddingValues = paddingValues,
listState = listState,
checkForUpdate = checkForUpdate,
navigateToBrowserPage = navigateToBrowserPage,
navigateToLicenses = navigateToLicenses,
navigateToCredits = navigateToCredits

View file

@ -1,49 +0,0 @@
/*
* Book's Story free and open-source Material You eBook reader.
* Copyright (C) 2024-2025 Acclorite
* SPDX-License-Identifier: GPL-3.0-only
*/
package ua.acclorite.book_story.presentation.about
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Update
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import ua.acclorite.book_story.R
import ua.acclorite.book_story.data.remote.dto.LatestReleaseInfo
import ua.acclorite.book_story.presentation.core.components.dialog.Dialog
import ua.acclorite.book_story.presentation.core.constants.Constants
import ua.acclorite.book_story.presentation.core.constants.provideReleasesPage
import ua.acclorite.book_story.ui.about.AboutEvent
@Composable
fun AboutUpdateDialog(
updateInfo: LatestReleaseInfo?,
navigateToBrowserPage: (AboutEvent.OnNavigateToBrowserPage) -> Unit,
dismissDialog: (AboutEvent.OnDismissDialog) -> Unit
) {
val context = LocalContext.current
Dialog(
title = stringResource(id = R.string.update_query, updateInfo?.tagName ?: ""),
icon = Icons.Default.Update,
description = stringResource(
id = R.string.update_app_description
),
actionEnabled = true,
disableOnClick = false,
onDismiss = { dismissDialog(AboutEvent.OnDismissDialog) },
onAction = {
navigateToBrowserPage(
AboutEvent.OnNavigateToBrowserPage(
page = Constants.provideReleasesPage(),
context = context
)
)
dismissDialog(AboutEvent.OnDismissDialog)
},
withContent = false
)
}

View file

@ -21,7 +21,6 @@ object DataStoreConstants {
val ABSOLUTE_DARK = booleanPreferencesKey("absolute_dark")
val THEME_CONTRAST = stringPreferencesKey("theme_contrast")
val SHOW_START_SCREEN = booleanPreferencesKey("guide")
val CHECK_FOR_UPDATES = booleanPreferencesKey("check_for_updates")
val DOUBLE_PRESS_EXIT = booleanPreferencesKey("double_press_exit")
// Reader settings

View file

@ -8,9 +8,6 @@
package ua.acclorite.book_story.presentation.core.constants
fun Constants.provideDownloadLatestReleasePage() =
"https://www.github.com/Acclorite/book-story/releases/latest/download/book-story.apk"
fun Constants.provideReleasesPage() =
"https://www.github.com/Acclorite/book-story/releases/latest"

View file

@ -16,7 +16,6 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.coerceAtLeast
import androidx.compose.ui.unit.dp
import ua.acclorite.book_story.presentation.settings.general.components.AppLanguageOption
import ua.acclorite.book_story.presentation.settings.general.components.CheckForUpdatesOption
import ua.acclorite.book_story.presentation.settings.general.components.DoublePressExitOption
fun LazyListScope.GeneralSettingsCategory(
@ -31,10 +30,6 @@ fun LazyListScope.GeneralSettingsCategory(
AppLanguageOption()
}
item {
CheckForUpdatesOption()
}
item {
DoublePressExitOption()
}

View file

@ -1,78 +0,0 @@
/*
* Book's Story free and open-source Material You eBook reader.
* Copyright (C) 2024-2025 Acclorite
* SPDX-License-Identifier: GPL-3.0-only
*/
package ua.acclorite.book_story.presentation.settings.general.components
import android.Manifest
import android.annotation.SuppressLint
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Security
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.rememberPermissionState
import ua.acclorite.book_story.R
import ua.acclorite.book_story.presentation.core.components.dialog.Dialog
import ua.acclorite.book_story.presentation.core.components.settings.SwitchWithTitle
import ua.acclorite.book_story.presentation.core.util.LocalActivity
import ua.acclorite.book_story.ui.main.MainEvent
import ua.acclorite.book_story.ui.main.MainModel
import ua.acclorite.book_story.ui.settings.SettingsEvent
import ua.acclorite.book_story.ui.settings.SettingsModel
@OptIn(ExperimentalPermissionsApi::class)
@SuppressLint("InlinedApi")
@Composable
fun CheckForUpdatesOption() {
val mainModel = hiltViewModel<MainModel>()
val settingsModel = hiltViewModel<SettingsModel>()
val state = mainModel.state.collectAsStateWithLifecycle()
val activity = LocalActivity.current
val notificationsPermissionState = rememberPermissionState(
permission = Manifest.permission.POST_NOTIFICATIONS
)
val showConfirmation = remember { mutableStateOf(false) }
if (showConfirmation.value) {
Dialog(
title = stringResource(id = R.string.enable_check_for_updates),
description = stringResource(id = R.string.enable_check_for_updates_description),
icon = Icons.Default.Security,
actionEnabled = true,
onDismiss = { showConfirmation.value = false },
onAction = {
mainModel.onEvent(MainEvent.OnChangeCheckForUpdates(true))
showConfirmation.value = false
},
withContent = false
)
}
SwitchWithTitle(
selected = state.value.checkForUpdates,
title = stringResource(id = R.string.check_for_updates_option),
description = stringResource(id = R.string.check_for_updates_option_desc)
) {
settingsModel.onEvent(
SettingsEvent.OnChangeCheckForUpdates(
enable = !state.value.checkForUpdates,
activity = activity,
notificationsPermissionState = notificationsPermissionState,
onChangeCheckForUpdates = {
when (it) {
true -> showConfirmation.value = true
false -> mainModel.onEvent(MainEvent.OnChangeCheckForUpdates(false))
}
}
)
)
}
}

View file

@ -24,13 +24,10 @@ fun StartContent(
currentPage: Int,
stackEvent: StackEvent,
storagePermissionGranted: Boolean,
notificationsPermissionGranted: Boolean,
storagePermissionState: PermissionState,
notificationsPermissionState: PermissionState,
languages: List<ButtonItem>,
changeLanguage: (MainEvent.OnChangeLanguage) -> Unit,
storagePermissionRequest: (StartEvent.OnStoragePermissionRequest) -> Unit,
notificationsPermissionRequest: (StartEvent.OnNotificationsPermissionRequest) -> Unit,
navigateForward: () -> Unit,
navigateBack: () -> Unit,
navigateToBrowse: () -> Unit,
@ -50,13 +47,10 @@ fun StartContent(
currentPage = currentPage,
stackEvent = stackEvent,
storagePermissionGranted = storagePermissionGranted,
notificationsPermissionGranted = notificationsPermissionGranted,
storagePermissionState = storagePermissionState,
notificationsPermissionState = notificationsPermissionState,
languages = languages,
changeLanguage = changeLanguage,
storagePermissionRequest = storagePermissionRequest,
notificationsPermissionRequest = notificationsPermissionRequest,
navigateForward = navigateForward
)
}

View file

@ -22,13 +22,10 @@ fun StartSettings(
currentPage: Int,
stackEvent: StackEvent,
storagePermissionGranted: Boolean,
notificationsPermissionGranted: Boolean,
storagePermissionState: PermissionState,
notificationsPermissionState: PermissionState,
languages: List<ButtonItem>,
changeLanguage: (MainEvent.OnChangeLanguage) -> Unit,
storagePermissionRequest: (StartEvent.OnStoragePermissionRequest) -> Unit,
notificationsPermissionRequest: (StartEvent.OnNotificationsPermissionRequest) -> Unit,
navigateForward: () -> Unit
) {
val activity = LocalActivity.current
@ -63,11 +60,8 @@ fun StartSettings(
StartSettingsLayoutPermissions(
activity = activity,
storagePermissionGranted = storagePermissionGranted,
notificationsPermissionGranted = notificationsPermissionGranted,
storagePermissionState = storagePermissionState,
notificationsPermissionState = notificationsPermissionState,
storagePermissionRequest = storagePermissionRequest,
notificationsPermissionRequest = notificationsPermissionRequest
storagePermissionRequest = storagePermissionRequest
)
}
}

View file

@ -26,11 +26,8 @@ import ua.acclorite.book_story.ui.start.StartEvent
fun LazyListScope.StartSettingsLayoutPermissions(
activity: ComponentActivity,
storagePermissionGranted: Boolean,
notificationsPermissionGranted: Boolean,
storagePermissionState: PermissionState,
notificationsPermissionState: PermissionState,
storagePermissionRequest: (StartEvent.OnStoragePermissionRequest) -> Unit,
notificationsPermissionRequest: (StartEvent.OnNotificationsPermissionRequest) -> Unit
) {
item {
Spacer(modifier = Modifier.height(16.dp))
@ -65,23 +62,6 @@ fun LazyListScope.StartSettingsLayoutPermissions(
)
}
item {
StartSettingsLayoutPermissionsItem(
title = stringResource(id = R.string.start_permissions_notifications),
description = stringResource(id = R.string.start_permissions_notifications_desc),
isOptional = true,
isGranted = notificationsPermissionGranted,
onGrantClick = {
notificationsPermissionRequest(
StartEvent.OnNotificationsPermissionRequest(
activity = activity,
notificationsPermissionState = notificationsPermissionState
)
)
}
)
}
item {
Spacer(modifier = Modifier.height(8.dp))
}

View file

@ -15,10 +15,4 @@ sealed class AboutEvent {
val page: String,
val context: Context
) : AboutEvent()
data class OnCheckForUpdate(
val context: Context
) : AboutEvent()
data object OnDismissDialog : AboutEvent()
}

View file

@ -14,29 +14,16 @@ import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
import kotlinx.coroutines.yield
import ua.acclorite.book_story.R
import ua.acclorite.book_story.domain.use_case.remote.CheckForUpdates
import ua.acclorite.book_story.presentation.core.util.launchActivity
import ua.acclorite.book_story.presentation.core.util.showToast
import javax.inject.Inject
@OptIn(FlowPreview::class)
@HiltViewModel
class AboutModel @Inject constructor(
private val checkForUpdates: CheckForUpdates
) : ViewModel() {
private val mutex = Mutex()
private val _state = MutableStateFlow(AboutState())
val state = _state.asStateFlow()
class AboutModel @Inject constructor() : ViewModel() {
fun onEvent(event: AboutEvent) {
when (event) {
@ -55,74 +42,6 @@ class AboutModel @Inject constructor(
}
}
}
is AboutEvent.OnCheckForUpdate -> {
viewModelScope.launch {
if (_state.value.updateChecked) {
withContext(Dispatchers.Main) {
event.context.getString(R.string.no_updates)
.showToast(context = event.context)
}
return@launch
}
_state.update {
it.copy(updateLoading = true)
}
val result = checkForUpdates.execute(false)
if (result == null) {
_state.update {
it.copy(updateLoading = false)
}
withContext(Dispatchers.Main) {
event.context.getString(R.string.error_check_internet)
.showToast(context = event.context)
}
return@launch
}
val version = result.tagName.substringAfterLast("v")
val currentVersion = event.context.getString(R.string.app_version)
if (version == currentVersion) {
withContext(Dispatchers.Main) {
event.context.getString(R.string.no_updates)
.showToast(context = event.context)
}
_state.update {
it.copy(
updateLoading = false,
updateChecked = true
)
}
return@launch
}
_state.update {
it.copy(
dialog = AboutScreen.UPDATE_DIALOG,
updateLoading = false,
updateInfo = result
)
}
}
}
is AboutEvent.OnDismissDialog -> {
viewModelScope.launch {
_state.update {
it.copy(dialog = null)
}
}
}
}
}
private suspend inline fun <T> MutableStateFlow<T>.update(function: (T) -> T) {
mutex.withLock {
yield()
this.value = function(this.value)
}
}
}

View file

@ -11,8 +11,6 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
import ua.acclorite.book_story.domain.navigator.Screen
import ua.acclorite.book_story.presentation.about.AboutContent
@ -24,27 +22,18 @@ import ua.acclorite.book_story.ui.licenses.LicensesScreen
@Parcelize
object AboutScreen : Screen, Parcelable {
@IgnoredOnParcel
const val UPDATE_DIALOG = "update_dialog"
@OptIn(ExperimentalMaterial3Api::class)
@Composable
override fun Content() {
val navigator = LocalNavigator.current
val screenModel = hiltViewModel<AboutModel>()
val state = screenModel.state.collectAsStateWithLifecycle()
val (scrollBehavior, listState) = TopAppBarDefaults.collapsibleTopAppBarScrollBehavior()
AboutContent(
scrollBehavior = scrollBehavior,
dialog = state.value.dialog,
updateLoading = state.value.updateLoading,
updateInfo = state.value.updateInfo,
listState = listState,
checkForUpdate = screenModel::onEvent,
navigateToBrowserPage = screenModel::onEvent,
dismissDialog = screenModel::onEvent,
navigateToLicenses = {
navigator.push(LicensesScreen)
},

View file

@ -1,19 +0,0 @@
/*
* Book's Story free and open-source Material You eBook reader.
* Copyright (C) 2024-2025 Acclorite
* SPDX-License-Identifier: GPL-3.0-only
*/
package ua.acclorite.book_story.ui.about
import androidx.compose.runtime.Immutable
import ua.acclorite.book_story.data.remote.dto.LatestReleaseInfo
import ua.acclorite.book_story.domain.util.Dialog
@Immutable
data class AboutState(
val dialog: Dialog? = null,
val updateChecked: Boolean = false,
val updateLoading: Boolean = false,
val updateInfo: LatestReleaseInfo? = null
)

View file

@ -22,7 +22,6 @@ sealed class MainEvent {
data class OnChangeParagraphHeight(val value: Int) : MainEvent()
data class OnChangeParagraphIndentation(val value: Int) : MainEvent()
data class OnChangeShowStartScreen(val value: Boolean) : MainEvent()
data class OnChangeCheckForUpdates(val value: Boolean) : MainEvent()
data class OnChangeSidePadding(val value: Int) : MainEvent()
data class OnChangeDoubleClickTranslation(val value: Boolean) : MainEvent()
data class OnChangeFastColorPresetChange(val value: Boolean) : MainEvent()

View file

@ -33,7 +33,6 @@ import ua.acclorite.book_story.domain.reader.toTextAlignment
import ua.acclorite.book_story.domain.use_case.data_store.ChangeLanguage
import ua.acclorite.book_story.domain.use_case.data_store.GetAllSettings
import ua.acclorite.book_story.domain.use_case.data_store.SetDatastore
import ua.acclorite.book_story.domain.use_case.remote.CheckForUpdates
import ua.acclorite.book_story.domain.util.toHorizontalAlignment
import ua.acclorite.book_story.presentation.core.constants.Constants
import ua.acclorite.book_story.presentation.core.constants.DataStoreConstants
@ -52,7 +51,6 @@ class MainModel @Inject constructor(
private val setDatastore: SetDatastore,
private val changeLanguage: ChangeLanguage,
private val checkForUpdates: CheckForUpdates,
private val getAllSettings: GetAllSettings
) : ViewModel() {
@ -166,14 +164,6 @@ class MainModel @Inject constructor(
}
)
is MainEvent.OnChangeCheckForUpdates -> handleDatastoreUpdate(
key = DataStoreConstants.CHECK_FOR_UPDATES,
value = event.value,
updateState = {
it.copy(checkForUpdates = this)
}
)
is MainEvent.OnChangeSidePadding -> handleDatastoreUpdate(
key = DataStoreConstants.SIDE_PADDING,
value = event.value,
@ -516,18 +506,9 @@ class MainModel @Inject constructor(
viewModelScope.launch(Dispatchers.Main) {
val settings = getAllSettings.execute()
// All additional execution
/* All additional execution */
changeLanguage.execute(settings.language)
if (settings.checkForUpdates) {
viewModelScope.launch(Dispatchers.IO) {
checkForUpdates.execute(
postNotification = true
)
}
}
/* - - - - - - - - - - - */
updateStateWithSavedHandle { settings }
mainModelReady.update { true }
}

View file

@ -68,7 +68,6 @@ data class MainState(
val absoluteDark: Boolean = provideDefaultValue { false },
val themeContrast: ThemeContrast = provideDefaultValue { ThemeContrast.STANDARD },
val showStartScreen: Boolean = provideDefaultValue { true },
val checkForUpdates: Boolean = provideDefaultValue { false },
val doublePressExit: Boolean = provideDefaultValue { false },
// Reader Settings
@ -199,10 +198,6 @@ data class MainState(
PARAGRAPH_INDENTATION
) { paragraphIndentation },
checkForUpdates = provideValue(
CHECK_FOR_UPDATES
) { checkForUpdates },
sidePadding = provideValue(
SIDE_PADDING
) { sidePadding },

View file

@ -9,23 +9,13 @@
package ua.acclorite.book_story.ui.settings
import android.content.Context
import androidx.activity.ComponentActivity
import androidx.compose.runtime.Immutable
import androidx.compose.ui.graphics.Color
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.PermissionState
import ua.acclorite.book_story.domain.util.ID
@Immutable
sealed class SettingsEvent {
data class OnChangeCheckForUpdates(
val enable: Boolean,
val activity: ComponentActivity,
val notificationsPermissionState: PermissionState,
val onChangeCheckForUpdates: (Boolean) -> Unit
) : SettingsEvent()
data class OnSelectColorPreset(
val id: ID
) : SettingsEvent()

View file

@ -27,7 +27,6 @@ import ua.acclorite.book_story.domain.use_case.color_preset.GetColorPresets
import ua.acclorite.book_story.domain.use_case.color_preset.ReorderColorPresets
import ua.acclorite.book_story.domain.use_case.color_preset.SelectColorPreset
import ua.acclorite.book_story.domain.use_case.color_preset.UpdateColorPreset
import ua.acclorite.book_story.domain.use_case.permission.GrantNotificationsPermission
import ua.acclorite.book_story.presentation.core.constants.Constants
import ua.acclorite.book_story.presentation.core.constants.provideDefaultColorPreset
import ua.acclorite.book_story.presentation.core.util.showToast
@ -36,7 +35,6 @@ import kotlin.random.Random
@HiltViewModel
class SettingsModel @Inject constructor(
private val grantNotificationsPermission: GrantNotificationsPermission,
private val getColorPresets: GetColorPresets,
private val updateColorPreset: UpdateColorPreset,
private val selectColorPreset: SelectColorPreset,
@ -52,7 +50,6 @@ class SettingsModel @Inject constructor(
private val _isReady = MutableStateFlow(false)
val isReady = _isReady.asStateFlow()
private var notificationsPermissionJob: Job? = null
private var selectColorPresetJob: Job? = null
private var addColorPresetJob: Job? = null
private var deleteColorPresetJob: Job? = null
@ -98,25 +95,6 @@ class SettingsModel @Inject constructor(
@OptIn(ExperimentalPermissionsApi::class)
fun onEvent(event: SettingsEvent) {
when (event) {
is SettingsEvent.OnChangeCheckForUpdates -> {
notificationsPermissionJob?.cancel()
notificationsPermissionJob = viewModelScope.launch(Dispatchers.IO) {
if (!event.enable) {
event.onChangeCheckForUpdates(false)
return@launch
}
grantNotificationsPermission.execute(
activity = event.activity,
notificationsPermissionState = event.notificationsPermissionState
).apply {
if (this) {
event.onChangeCheckForUpdates(true)
}
}
}
}
is SettingsEvent.OnSelectColorPreset -> {
viewModelScope.launch {
cancelColorPresetJobs()

View file

@ -16,17 +16,11 @@ import com.google.accompanist.permissions.PermissionState
@Immutable
sealed class StartEvent {
data class OnCheckPermissions(
val storagePermissionState: PermissionState,
val notificationsPermissionState: PermissionState
val storagePermissionState: PermissionState
) : StartEvent()
data class OnStoragePermissionRequest(
val activity: ComponentActivity,
val storagePermissionState: PermissionState
) : StartEvent()
data class OnNotificationsPermissionRequest(
val activity: ComponentActivity,
val notificationsPermissionState: PermissionState
) : StartEvent()
}

View file

@ -21,14 +21,12 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.yield
import ua.acclorite.book_story.domain.use_case.permission.GrantNotificationsPermission
import ua.acclorite.book_story.domain.use_case.permission.GrantStoragePermission
import javax.inject.Inject
@HiltViewModel
class StartModel @Inject constructor(
private val grantStoragePermission: GrantStoragePermission,
private val grantNotificationsPermission: GrantNotificationsPermission
private val grantStoragePermission: GrantStoragePermission
) : ViewModel() {
private val mutex = Mutex()
@ -37,7 +35,6 @@ class StartModel @Inject constructor(
val state = _state.asStateFlow()
private var storagePermissionJob: Job? = null
private var notificationsPermissionJob: Job? = null
@OptIn(ExperimentalPermissionsApi::class)
fun onEvent(event: StartEvent) {
@ -45,20 +42,13 @@ class StartModel @Inject constructor(
is StartEvent.OnCheckPermissions -> {
viewModelScope.launch(Dispatchers.IO) {
val legacyStoragePermission = Build.VERSION.SDK_INT < Build.VERSION_CODES.R
val legacyNotificationPermission =
Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU
val storagePermissionGranted = if (!legacyStoragePermission) {
Environment.isExternalStorageManager()
} else event.storagePermissionState.status.isGranted
val notificationPermissionGranted = if (!legacyNotificationPermission) {
event.notificationsPermissionState.status.isGranted
} else true
_state.update {
it.copy(
storagePermissionGranted = storagePermissionGranted,
notificationsPermissionGranted = notificationPermissionGranted
storagePermissionGranted = storagePermissionGranted
)
}
}
@ -81,24 +71,6 @@ class StartModel @Inject constructor(
}
}
}
is StartEvent.OnNotificationsPermissionRequest -> {
notificationsPermissionJob?.cancel()
notificationsPermissionJob = viewModelScope.launch(Dispatchers.IO) {
grantNotificationsPermission.execute(
activity = event.activity,
notificationsPermissionState = event.notificationsPermissionState
).apply {
if (this) {
_state.update {
it.copy(
notificationsPermissionGranted = true
)
}
}
}
}
}
}
}
@ -106,8 +78,6 @@ class StartModel @Inject constructor(
viewModelScope.launch {
_state.update {
storagePermissionJob?.cancel()
notificationsPermissionJob?.cancel()
StartState()
}
}

View file

@ -70,9 +70,6 @@ object StartScreen : Screen, Parcelable {
val storagePermissionState = rememberPermissionState(
permission = Manifest.permission.READ_EXTERNAL_STORAGE
)
val notificationsPermissionState = rememberPermissionState(
permission = Manifest.permission.POST_NOTIFICATIONS
)
val currentPage = remember { mutableIntStateOf(0) }
val stackEvent = remember { mutableStateOf(StackEvent.Default) }
@ -91,8 +88,7 @@ object StartScreen : Screen, Parcelable {
LaunchedEffect(Unit) {
screenModel.onEvent(
StartEvent.OnCheckPermissions(
storagePermissionState = storagePermissionState,
notificationsPermissionState = notificationsPermissionState
storagePermissionState = storagePermissionState
)
)
}
@ -104,13 +100,10 @@ object StartScreen : Screen, Parcelable {
currentPage = currentPage.intValue,
stackEvent = stackEvent.value,
storagePermissionGranted = state.value.storagePermissionGranted,
notificationsPermissionGranted = state.value.notificationsPermissionGranted,
storagePermissionState = storagePermissionState,
notificationsPermissionState = notificationsPermissionState,
languages = languages,
changeLanguage = mainModel::onEvent,
storagePermissionRequest = screenModel::onEvent,
notificationsPermissionRequest = screenModel::onEvent,
navigateForward = {
if ((currentPage.intValue + 1 == 3) && !state.value.storagePermissionGranted) {
return@StartContent

View file

@ -10,6 +10,5 @@ import androidx.compose.runtime.Immutable
@Immutable
data class StartState(
val storagePermissionGranted: Boolean = false,
val notificationsPermissionGranted: Boolean = false
val storagePermissionGranted: Boolean = false
)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 360 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 251 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 433 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 715 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 932 B

View file

@ -1,18 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Book's Story — free and open-source Material You eBook reader.
~ Copyright (C) 2024-2025 Acclorite
~ SPDX-License-Identifier: GPL-3.0-only
--><resources>
-->
<resources>
<string name="history_screen">التاريخ</string>
<string name="add_books_description">يمكنك اختيار أي الكُتب تريد إضافتها. يمكنك تعديل العنوان و صورة غلاف الكتاب لاحقا. عملية التحميل يمكن أن تستغرق حتى بضع دقائق.</string>
<string name="storage_permission_description">نحتاج إذن التخزين لفحص جهازك من أجل الكُتب. من دون هذا الإذن، لن تكون قادرا على إضافة كتاب.</string>
<string name="updates_notification_desc">التحديث %1$s تم نشره للتو! انقر للذهاب الى صفحة الإصدار.</string>
<string name="move_book_description">اختر الفئة التي تريد نقل هذا الكتاب إليها. سيتم نقل هذا الكتاب إلى الفئة المُحدّدة.</string>
<string name="update_app_description">تم العثور على إصدار جديد من Book\'s Story. هل تريد الإنتقال الى صفحة الاصدار ؟</string>
<string name="updates_notification_channel">التحديثات الجديدة</string>
<string name="updates_notification_title">تحديث جديد ل Book\'s Story!</string>
<string name="updates_notification_action">تحميل</string>
<string name="library_screen">المكتبة</string>
<string name="browse_screen">تصفح</string>
<string name="settings_screen">الإعدادات</string>
@ -25,22 +23,18 @@
<string name="delete_book">حذف الكتاب؟</string>
<string name="move_book">نقل الكتاب؟</string>
<string name="delete_history">حذف تاريخ القراءة؟</string>
<string name="enable_check_for_updates">تفعيل التحقق من التنبيهات؟</string>
<string name="move_books_description">اختر الفئة التي تريد نقل جميع الكُتب (%1$s) المُحدّدة. جميع الكُتب المُحدّدة سيتم نقلها إلى الفئة المُحدّدة.</string>
<string name="delete_books_description">هذا سيحذف جميع الكُتب (%1$s) المُحدّدة من قاعدة البيانات. هذا لن يحذف الكُتب المُحدّدة مِن جهازك.</string>
<string name="delete_book_description">هذا سيحذف هذا الكتاب من قاعدة البيانات. هذا لن يحذف الكتاب من جهازك.</string>
<string name="delete_history_description">هذا سيحذف التاريخ بأكمله من قاعدة البيانات. بعد حذف التاريخ بأكمله، سيتم إعادة ضبط ترتيب الكُتب.</string>
<string name="enable_check_for_updates_description">بتفعيل «البحث عن التحديثات» سيستخرج التطبيق معلومات اخر اصدار من «api.github.com» في كل مرة عند تشغيل التطبيق. هل تريد المضي قدما و تفعيل «البحث عن تحديثات»؟</string>
<string name="error_something_went_wrong">حدث خطأ ما.</string>
<string name="error_no_translator">لم يتم العثور على تطبيق ترجمة.</string>
<string name="error_no_browser">لم يتم العثور على متصفح.</string>
<string name="error_could_not_get_text">الملف فارغ أو فاسد أو مفقود. يرجى التحقق من الملف أو تحديث المسار و المحاولة مرة أخرى.</string>
<string name="error_check_internet">حدث خطأ ما. حاول مرة أخرى لاحقا.</string>
<string name="error_closed_source">مغلق المصدر</string>
<string name="library_empty">اقرأ كُتبك المُفضلة و رتبهم باستخدام الفئات</string>
<string name="history_empty">دع آخر كتاب قرأته يفتح صفحات قصة جديدة عظيمة من رحلة قرائتك</string>
<string name="error_could_not_reset_cover">غير قادر على إعادة ضبط صورة الغلاف.</string>
<string name="update_query">تحديث %1$s</string>
<string name="cancel">إلغاء</string>
<string name="grant">امنح</string>
<string name="grant_permission">امنح الإذن</string>
@ -93,7 +87,6 @@
<string name="font_family_option">نوع الخط</string>
<string name="font_size_option">حجم الخط</string>
<string name="paragraph_height_option">تباعد الفقرة</string>
<string name="check_for_updates_option_desc">التحقق من التحديثات الجديدة للتطبيق عند بدء التطبيق</string>
<string name="general_settings">عام</string>
<string name="paragraph_indentation_option">إزاحة الفقرة</string>
<string name="pure_dark_on">مفعل</string>
@ -113,7 +106,6 @@
<string name="line_height_option">ارتفاع الخط</string>
<string name="background_color_option">لون الخلفية</string>
<string name="font_color_option">لون الخط</string>
<string name="check_for_updates_option">التحقق من وجود تحديثات</string>
<string name="double_click_translation_option">النقر المزدوج للترجمة</string>
<string name="double_click_translation_option_desc">النقر المزدوج على فقرة لترجمتها</string>
<string name="browse_layout_list">قائمة</string>
@ -135,7 +127,6 @@
<string name="books_deleted">حُذفت جميع الكُتب المُحدّدة بنجاح.</string>
<string name="copied">تم النسخ</string>
<string name="cover_image_deleted">تم حذف صورة الغلاف بنجاح.</string>
<string name="no_updates">أحدث إصدار من التطبيق مثبت بالفعل.</string>
<string name="history_deleted">حُذف التاريخ بنجاح.</string>
<string name="cover_reset">تم إعادة تعيين صورة الغلاف بنجاح.</string>
<string name="theme_contrast_high">عالي</string>
@ -165,7 +156,6 @@
<string name="alignment_start">ابدأ</string>
<string name="alignment_center">المركز</string>
<string name="file_path">المسار</string>
<string name="app_version_option_desc_2">انقر للتحقق من وجود تحديثات</string>
<string name="report_bug_option">الإبلاغ عن خطأ</string>
<string name="whats_new_option">ما الجديد</string>
<string name="alignment_end">النهاية</string>
@ -344,7 +334,6 @@
<string name="open_reader_settings_content_desc">إعدادات القارئ</string>
<string name="cutout_padding_option_desc">تطبيق الهامش على منطقة القطع</string>
<string name="required_content_desc">مطلوب</string>
<string name="start_permissions_notifications_desc">مطلوب للتحقق من إصدار تطبيق أحدث</string>
<string name="error_content_desc">خطأ</string>
<string name="cover_image_not_found_content_desc">لم يتم العثور غلاف صورة</string>
<string name="more_content_desc">المزيد</string>
@ -354,7 +343,6 @@
<string name="arrow_content_desc">سهم</string>
<string name="start_permissions_granted">منحت</string>
<string name="start_permissions_storage">إذن التخزين</string>
<string name="start_permissions_notifications">إذن الإشعارات</string>
<string name="yesterday">أمس</string>
<string name="sort_order_content_desc">ترتيب الفرز</string>
<string name="start_permissions_preferences">الأذونات</string>

View file

@ -7,7 +7,6 @@
<resources>
<string name="book_deleted">Tato kniha byla úspěšně smazána.</string>
<string name="blue_theme">Neptun</string>
<string name="update_app_description">Nová verze aplikace byla nalezena. Chcete přejít na stránku verzí?</string>
<string name="background_color_option">Barva pozadí</string>
<string name="font_color_option">Barva fontu</string>
<string name="dark_theme_follow_system">Podle systému</string>
@ -25,7 +24,6 @@
<string name="aqua_theme">Uran</string>
<string name="marsh_theme">Pluto</string>
<string name="library_empty">Čtěte vaše oblíbené knihy a třiďte je do kategorií</string>
<string name="updates_notification_action">Stáhnout</string>
<string name="language_option">Jazyk aplikace</string>
<string name="pink_theme">Saturn</string>
<string name="yes_go_to_help">Ano, přejít na pomoc</string>
@ -51,7 +49,6 @@
<string name="credits_icon">Ikony</string>
<string name="credits_ideas">Nápady</string>
<string name="delete_history">Smazat historii čtení?</string>
<string name="no_updates">Nejnovější verze aplikace už je nainstalována.</string>
<string name="unknown">Neznámý</string>
<string name="credits_fonts">Fonty</string>
<string name="theme_contrast_standard">Standardní</string>
@ -64,7 +61,6 @@
<string name="help_translate_option">Pomozte překládat</string>
<string name="filter_tab">Filtr</string>
<string name="reader_tab">Čtečka</string>
<string name="update_query">Aktualizace %1$s</string>
<string name="get_help">Potřebuji pomoc</string>
<string name="browse_layout_list">List</string>
<string name="absolute_dark_option">Úplně tmavé</string>
@ -72,7 +68,6 @@
<string name="misc_reader_settings">Různé</string>
<string name="add_books_description">Můžete si vybrat, které knihy chcete přidat. Název i obálku knihy si můžete změnit později. Načítání knih může trvat i několik minut.</string>
<string name="reader_settings">Čtečka</string>
<string name="error_check_internet">Něco se pokazilo. Zkuste to znovu později.</string>
<string name="whats_new_option">Co je nového</string>
<string name="appearance_settings_desc">Témata, barvy</string>
<string name="reader_settings_desc">Font, texty, překladač</string>
@ -88,7 +83,6 @@
<string name="grant_permission">Povolit oprávnění</string>
<string name="browse_grid_size_option">Velikost mřížky</string>
<string name="delete_books">Smazat knihy?</string>
<string name="enable_check_for_updates_description">Zapnutím «Zkontrolovat aktualizace» bude aplikace získávat informace o nových verzích z «api.github.com» při každém spuštění. Chcete pokračovat a zapnout «Zkontrolovat aktualizace»?</string>
<string name="font_style_normal">Normální</string>
<string name="error_no_translator">Žádná aplikace pro překladač nebyla nalezena.</string>
<string name="reset_cover_desc">Resetovat obálku knihy na výchozí</string>
@ -115,7 +109,6 @@
<string name="green_color">Zelená</string>
<string name="copied">Zkopírováno</string>
<string name="fullscreen_option">Celá obrazovka</string>
<string name="check_for_updates_option">Hledat aktualizace</string>
<string name="double_click_translation_option">Překlad na dvojité kliknutí</string>
<string name="keep_screen_on_option">Nechat obrazovku zapnutou</string>
<string name="browse_sort_order_file_format">Formát souboru</string>
@ -140,7 +133,6 @@
<string name="undo">Vrátit</string>
<string name="perception_expander_thickness_option">Tloušťka řádku</string>
<string name="error_no_browser">Žádná aplikace pro prohlížeč nebyla nalezena.</string>
<string name="updates_notification_title">Nová aktualizace Book\'s Story!</string>
<string name="browse_settings">Procházet</string>
<string name="about_screen">O aplikaci</string>
<string name="add_books">Přidat knihy?</string>
@ -181,7 +173,6 @@
<string name="reading_speed_reader_settings">Rychlost čtení</string>
<string name="system_reader_settings">Systém</string>
<string name="reset_cover">Resetovat obálku</string>
<string name="app_version_option_desc_2">Klepněte pro zkontrolování aktualizací</string>
<string name="help_desc_how_to_customize_app_1">Přejít na</string>
<string name="dark_theme_on">Zapnutý</string>
<string name="pure_dark_power_saver">Spořič</string>
@ -199,11 +190,9 @@
<string name="credits_translation">Překlad</string>
<string name="screen_brightness_option">Jas obrazovky</string>
<string name="help_title_how_to_add_books">Jak přidám knihy do Knihovny?</string>
<string name="updates_notification_channel">Nové aktualizace</string>
<string name="cover_image_deleted">Obálka byla úspěšně smazána.</string>
<string name="help_desc_how_to_add_books_3">Pokud nevidíte stažené knihy, zkuste obnovit stránku. Zkontrolujte, jestli mají vaše knihy podporované formáty souborů. Potom klepněte na knihu pro vybrání nebo ji podržte pro zjištění její lokace. Potom co vyberete všechny knihy které chcete, klepněte na ikonu zaškrtnutí v pravém horním rohu, počkejte než se všechny knihy načtou a klepněte na «Přidat». Teď by jste měli vidět všechny knihy přidané v</string>
<string name="custom_screen_brightness_option">Vlastní jas obrazovky</string>
<string name="check_for_updates_option_desc">Hledat nové verze aplikace při spuštění</string>
<string name="horizontal_gesture_sensitivity_option">Citlivost</string>
<string name="help_desc_how_to_customize_app_2">Nastavení</string>
<string name="start_permissions_storage_desc">Vyžadováno, abychom mohli skenoval Vaše úložiště a hledat knihy</string>
@ -220,14 +209,11 @@
<string name="help_title_how_to_move_or_delete_books">Jak přesunu nebo smažu knihy?</string>
<string name="add_files_content_desc">Přidat soubory</string>
<string name="error_closed_source">Uzavřený zdroj</string>
<string name="updates_notification_desc">Aktualizace %1$s byla vydána! Klepněte pro přejití na stránku verzí.</string>
<string name="selected_content_desc">Vybrané</string>
<string name="cover_image_not_found_content_desc">Obálka nebyla nalezena</string>
<string name="search_content_desc">Hledat</string>
<string name="open_in_web_content_desc">Otevřít na webu</string>
<string name="start_permissions_notifications">Oprávnění oznámení</string>
<string name="help_desc_how_to_move_or_delete_books_1">Přejít na</string>
<string name="start_permissions_notifications_desc">Vyžadováno pro kontrolu novějších verzí aplikace</string>
<string name="start_done_desc">Právě jste dokončili základní nastavení aplikace! Chcete se naučit jak aplikaci ovládat, tím že přejděte do Pomocí?</string>
<string name="yesterday">Včera</string>
<string name="go_back_content_desc">Jít zpět</string>

View file

@ -5,9 +5,6 @@
-->
<resources>
<string name="updates_notification_channel">Neue Updates</string>
<string name="updates_notification_desc">Update %1$s wurde gerade veröffentlicht! Klicken Sie hier, um zur Veröffentlichungsseite zu gelangen.</string>
<string name="updates_notification_action">Download</string>
<string name="library_screen">Bibliothek</string>
<string name="history_screen">Verlauf</string>
<string name="browse_screen">Durchsuchen</string>
@ -18,21 +15,17 @@
<string name="delete_book">Buch löschen?</string>
<string name="move_book">Buch verschieben?</string>
<string name="delete_history">Leseverlauf löschen?</string>
<string name="enable_check_for_updates">Überprüfen von Updates aktivieren?</string>
<string name="add_books_description">Sie können auswählen, welche Bücher Sie hinzufügen möchten. Titel und Coverbild des Buches können Sie später bearbeiten. Der Ladevorgang kann mehrere Minuten dauern.</string>
<string name="move_books_description">Wählen Sie die Kategorie, in die Sie alle ausgewählten Bücher verschieben möchten (%1$s). Alle ausgewählten Bücher werden in die ausgewählte Kategorie verschoben.</string>
<string name="delete_book_description">Dadurch wird das Buch aus der Datenbank gelöscht. Von Ihrem Gerät wird das Buch jedoch nicht gelöscht.</string>
<string name="move_book_description">Wählen Sie die Kategorie aus, in die Sie dieses Buch verschieben möchten. Dieses Buch wird in die ausgewählte Kategorie verschoben.</string>
<string name="enable_check_for_updates_description">Durch Aktivieren von „Nach Updates suchen“ ruft die App bei jedem Start der App die neuesten Versionsinformationen von „api.github.com“ ab. Möchten Sie fortfahren und „Nach Updates suchen“ aktivieren?</string>
<string name="error_no_description">Keine Beschreibung.</string>
<string name="error_could_not_get_text">Der Buchinhalt ist leer. Bitte stellen Sie sicher, dass der Buchinhalt nicht leer ist und aktualisieren Sie ihn.</string>
<string name="error_check_internet">Etwas ist schiefgelaufen. Versuche es später erneut.</string>
<string name="error_could_not_reset_cover">Titelbild konnte nicht zurückgesetzt werden.</string>
<string name="error_closed_source">Geschlossene Quelle</string>
<string name="library_empty">Lesen Sie Ihre Lieblingsbücher und sortieren Sie sie nach Kategorien</string>
<string name="history_empty">Lassen Sie Ihr letztes gelesenes Buch die Seiten einer neuen großartigen Geschichte Ihrer Lesereise öffnen</string>
<string name="selected_items_count_query">%1$s ausgewählt</string>
<string name="update_query">%1$s aktualisieren</string>
<string name="color_preset_selected_query">Ausgewählt «%1$s»</string>
<string name="cancel">Abbrechen</string>
<string name="grant">Gewähren</string>
@ -70,8 +63,6 @@
<string name="color_preset_option">Farbvorgabe</string>
<string name="background_color_option">Hintergrundfarbe</string>
<string name="font_color_option">Schriftfarbe</string>
<string name="check_for_updates_option">Nach Updates suchen</string>
<string name="check_for_updates_option_desc">Beim Start nach einer neueren App-Version suchen</string>
<string name="side_padding_option">Seitenränder</string>
<string name="double_click_translation_option">Doppelklicken Sie auf die Übersetzung</string>
<string name="double_click_translation_option_desc">Doppelklicken Sie auf den Absatz, um ihn zu übersetzen</string>
@ -103,7 +94,6 @@
<string name="book_moved">Dieses Buch wurde erfolgreich verschoben.</string>
<string name="copied">Kopieren</string>
<string name="history_deleted">Dieses Buch wurde erfolgreich gelöscht.</string>
<string name="no_updates">Die neuste Version der App ist bereits installiert.</string>
<string name="cover_reset">Das Titelbild wurde erfolgreich zurückgesetzt.</string>
<string name="history_element_deleted">Das Verlaufselement wurde erfolgreich gelöscht.</string>
<string name="dynamic_theme">Quecksilber</string>
@ -133,8 +123,6 @@
<string name="start_permissions_granted">Gewährt</string>
<string name="start_permissions_storage">Speicherberechtigung</string>
<string name="start_permissions_storage_desc">Erforderlich, um Ihr Gerät zu scannen und Bücher zu finden</string>
<string name="start_permissions_notifications">Benachrichtigungsberechtigung</string>
<string name="start_permissions_notifications_desc">Erforderlich, um nach einer neueren App-Version zu suchen</string>
<string name="start_done">Alles ist erledigt!</string>
<string name="start_done_desc">Sie haben die Grundeinstellungen der App erfolgreich abgeschlossen. Möchten Sie anhand des Hilfebildschirms erfahren, wie Sie die App verwenden?</string>
<string name="today">Heute</string>
@ -157,8 +145,6 @@
<string name="revert_content_desc">Zurücksetzen</string>
<string name="selected_content_desc">Ausgewählt</string>
<string name="app_icon_content_desc">App-Symbol</string>
<string name="updates_notification_title">Neues Update von Book\'s Story!</string>
<string name="update_app_description">Es wurde eine neue App-Version gefunden. Möchten Sie fortfahren und zur Veröffentlichungsseite gehen?</string>
<string name="help_desc_how_to_add_books_3">Wenn Sie die heruntergeladenen Bücher nicht sehen, versuchen Sie, die Liste zu aktualisieren, indem Sie sie nach unten ziehen. Stellen Sie sicher, dass Ihre Bücher das unterstützte Dateiformat haben. Klicken Sie dann auf das Buch, um es auszuwählen, oder halten Sie gedrückt, um seinen Speicherort anzuzeigen. Nachdem Sie alle gewünschten Bücher ausgewählt haben, klicken Sie auf das Häkchensymbol in der oberen rechten Ecke, warten Sie, bis alle Bücher geladen sind, und klicken Sie auf «Hinzufügen». Jetzt sollten Sie alle Bücher sehen, die Sie in der Liste hinzugefügt haben</string>
<string name="help_screen">Hilfe</string>
<string name="storage_permission">Berechtigung erteilen?</string>
@ -197,7 +183,6 @@
<string name="font_style_normal">Normal</string>
<string name="font_style_italic">Kursiv</string>
<string name="unknown">Unbekannt</string>
<string name="app_version_option_desc_2">Klicken Sie hier, um nach Updates zu suchen</string>
<string name="whats_new_option">Was ist neu</string>
<string name="licenses_option">Open Source-Lizenzen</string>
<string name="credits_option">Credits</string>

View file

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Book's Story — free and open-source Material You eBook reader.
~ Copyright (C) 2024-2025 Acclorite
~ SPDX-License-Identifier: GPL-3.0-only
--><resources>
<string name="updates_notification_channel">Nuevas actualizaciones</string>
<string name="updates_notification_desc">¡Actualización %1$s recién lanzada! Haz clic para ir a la página de lanzamiento.</string>
<string name="updates_notification_action">Descargar</string>
-->
<resources>
<string name="library_screen">Biblioteca</string>
<string name="history_screen">Historial</string>
<string name="browse_screen">Navegar</string>
@ -18,10 +18,8 @@
<string name="move_books">¿Mover libros?</string>
<string name="delete_books">¿Borrar libros?</string>
<string name="delete_book">¿Borrar libro?</string>
<string name="updates_notification_title">¡Nueva actualización de Book\'s Story!</string>
<string name="move_book">¿Mover libro?</string>
<string name="delete_history">¿Borrar el historial de lectura?</string>
<string name="enable_check_for_updates">¿Comprobar actualizaciones?</string>
<string name="move_books_description">Elija la categoría a la que desea mover todos los libros seleccionados (%1$s). Todos los libros seleccionados serán trasladados a la categoría seleccionada.</string>
<string name="move_book_description">Elija la categoría a la que quiere mover este libro. Este libro será trasladado a la categoría seleccionada.</string>
<string name="delete_history_description">Eliminará todo el historial de la base de datos. Después de borrar todo el historial, el orden de los libros se restablecerá.</string>
@ -57,8 +55,6 @@
<string name="paragraph_indentation_option">Indentación del párrafo</string>
<string name="background_color_option">Color de fondo</string>
<string name="font_color_option">Color de fuente</string>
<string name="check_for_updates_option">Buscar actualizaciones</string>
<string name="check_for_updates_option_desc">Buscar nueva versión de la aplicación al abrirla</string>
<string name="side_padding_option">Relleno lateral</string>
<string name="double_click_translation_option">Traducción de doble clic</string>
<string name="red_color">Rojo</string>
@ -83,22 +79,17 @@
<string name="start_welcome">¡Bienvenid@ a Book\'s Story!</string>
<string name="drag_content_desc">Arrastrar</string>
<string name="delete">Borrar</string>
<string name="start_permissions_notifications">Permisos de notificación</string>
<string name="storage_permission_description">Necesitamos permiso de almacenamiento para escanear su dispositivo en busca de libros. Sin este permino, no podrá añadir libros.</string>
<string name="delete_books_description">Eliminará todos los libros seleccionados(%1$s) de la base de datos. No eliminará los libros seleccionados de su dispositivo.</string>
<string name="add_books_description">Puede escoger qué libros desea añadir. Puede editar el título y la portada del libro más adelante. El proceso de carga puede durar varios minutos.</string>
<string name="delete_book_description">Eliminará este libro de la base de datos. No eliminará este libro de su dispositivo.</string>
<string name="update_app_description">Se encontró una nueva versión de la aplicación. ¿Quieres continuar e ir a la página de actualizaciones?</string>
<string name="error_no_translator">No se ha encontrado ninguna aplicación de traducción.</string>
<string name="error_could_not_get_text">El contenido del libro está vacío. Por favor, asegúrate de que el contenido del libro no está vacío y actualizado.</string>
<string name="error_check_internet">Algo salió mal. Inténtelo de nuevo más tarde.</string>
<string name="enable_check_for_updates_description">Al habilitar «Comprobar actualizaciones» la aplicación conseguirá la última información de lanzamiento de «api.github.com» cada vez que comience la aplicación. ¿Quieres continuar y habilitar «Comprobar actualizaciones»?</string>
<string name="error_could_not_reset_cover">No se pudo reiniciar la portada.</string>
<string name="browse_empty">Expanda la colección de libros de la biblioteca con sus descargas</string>
<string name="library_empty">Lea sus libros favoritos y ordénelos en categorías</string>
<string name="history_empty">Deje que su último libro leído abra las páginas de una nueva gran historia en su viaje de lectura</string>
<string name="translate">Traducir</string>
<string name="update_query">Actualizar %1$s</string>
<string name="grant_permission">Conceder permiso</string>
<string name="never">Nunca</string>
<string name="copy">Copiar</string>
@ -139,7 +130,6 @@
<string name="press_again_toast">Presione atrás de nuevo para salir</string>
<string name="cover_image_deleted">La portada fue eliminada.</string>
<string name="help_desc_how_to_read_book_3">Para empezar a leer el libro haga clic en el botón en la esquina inferior derecha del libro que desea leer. También puede comenzar a leer el libro haciendo clic en la portada para ver los detalles del libro y luego haga clic en el botón en la esquina inferior derecha. El progreso será guardado y restaurado automáticamente. Puede traer barras superiores e inferiores haciendo clic en cualquier lugar de la pantalla. Al hacer clic en el título del libro será transferido a los detalles del libro. Al hacer clic en el icono de engranaje verá los ajustes del lector. Puedes usar el control deslizante de la barra inferior para cambiar el progreso.</string>
<string name="no_updates">La última versión de la aplicación ya está instalada.</string>
<string name="cover_reset">La imagen de la portada se restableció correctamente.</string>
<string name="book_deleted">El libro fue eliminado.</string>
<string name="purple_theme">Júpiter</string>
@ -159,7 +149,6 @@
<string name="unknown">Desconocido</string>
<string name="app_version_option">Versión de la aplicación</string>
<string name="app_version_option_desc_1">Book\'s Story v%1$s</string>
<string name="app_version_option_desc_2">Haz clic para comprobar si hay actualizaciones</string>
<string name="slava_ukraini">¡Gloria a Ucrania!</string>
<string name="credits_design">Diseño</string>
<string name="help_desc_how_to_add_books_1">Ir a la</string>
@ -191,7 +180,6 @@
<string name="help_title_how_to_use_double_click_translation">¿Cómo utilizo la traducción de doble clic?</string>
<string name="start_welcome_desc">¡Hacia un mundo donde las palabras cautivan, enseñan y conducen a increíbles aventuras! ¡Vamos a preparar algunas cosas!</string>
<string name="start_permissions_granted">Concedido</string>
<string name="start_permissions_notifications_desc">Requerido para buscar si hay una versión más reciente de la aplicación</string>
<string name="start_done">¡Todo está listo!</string>
<string name="start_permissions_storage">Permiso de almacenamiento</string>
<string name="help_desc_how_to_use_double_click_translation_1">En primer lugar, vaya a los ajustes del lector (ver: ¿Cómo personalizo el lector?), luego encienda el ajuste correspondiente. Después de eso, comienza a leer el libro (ver: ¿Cómo leo un libro?). Ahora si hace doble clic en el párrafo deseado, el traductor externo se abrirá con el texto del párrafo.</string>

View file

@ -5,7 +5,6 @@
-->
<resources>
<string name="updates_notification_action">Télécharger</string>
<string name="library_screen">Bibliothèque</string>
<string name="history_screen">Historique</string>
<string name="browse_screen">Naviguer</string>
@ -18,23 +17,19 @@
<string name="delete_book">Supprimer le livre ?</string>
<string name="move_book">Déplacer le livre ?</string>
<string name="delete_history">Effacer l\'historique de lecture ?</string>
<string name="enable_check_for_updates">Activer la vérification des mises à jour ?</string>
<string name="add_books_description">Vous pouvez choisir les livres que vous souhaitez ajouter. Vous pouvez modifier le titre et l\'image de couverture du livre par la suite. Le chargement peut prendre plusieurs minutes.</string>
<string name="delete_books_description">Cela supprimera tous les livres sélectionnés (%1$s) de la base de données. Ceci ne supprimera pas les livres sélectionnés de votre appareil.</string>
<string name="delete_book_description">Cela supprimera ce livre de la base de données. Ceci ne le supprimera pas de votre appareil.</string>
<string name="move_book_description">Choisissez la catégorie dans laquelle vous souhaitez déplacer ce livre. Ce dernier sera déplacé vers la catégorie choisie.</string>
<string name="enable_check_for_updates_description">En activant la fonction “Vérifier les mises à jour”, l\'application récupérera les informations de la dernière version de “api.github.com” à chaque fois que l\'application démarrera. Voulez-vous continuer et activer “Vérifier les mises à jour” ?</string>
<string name="error_permission">Nous avons besoin de l\'autorisation de stockage pour scanner votre appareil à la recherche de livres</string>
<string name="error_no_translator">Aucune application de traduction n\'a été trouvée.</string>
<string name="error_no_dictionary">Aucune application de dictionnaire n\'a été trouvée.</string>
<string name="error_no_share_app">Aucune application pour partager n\'a été trouvée.</string>
<string name="error_check_internet">Quelque chose s\'est mal passé. Réessayez plus tard.</string>
<string name="error_could_not_reset_cover">L\'image de couverture n\'a pas pu être réinitialisée.</string>
<string name="error_closed_source">Source fermée</string>
<string name="browse_empty">Élargissez la collection de livres de la bibliothèque par vos téléchargements</string>
<string name="library_empty">Lisez vos livres préférés et classez-les par catégories</string>
<string name="selected_items_count_query">%1$s sélectionné</string>
<string name="update_query">Mise à jour %1$s</string>
<string name="color_preset_query">Préréglage %1$s</string>
<string name="color_preset_selected_query">Sélectionné « %1$s »</string>
<string name="move">Déplacer</string>
@ -134,7 +129,6 @@
<string name="book_moved">Ce livre a été déplacé avec succès.</string>
<string name="copied">Copié</string>
<string name="history_deleted">L\'historique a été supprimé avec succès.</string>
<string name="no_updates">La dernière version de l\'application est déjà installée.</string>
<string name="cover_reset">L\'image de couverture a été réinitialisée avec succès.</string>
<string name="history_element_deleted">Cet élément de l\'historique a été supprimé avec succès.</string>
<string name="file_path">Chemin du fichier</string>
@ -142,7 +136,6 @@
<string name="file_size">Taille du fichier</string>
<string name="unknown">Inconnu</string>
<string name="app_version_option_desc_1">Book\'s Story v%1$s</string>
<string name="app_version_option_desc_2">Cliquez pour vérifier les mises à jour</string>
<string name="report_bug_option">Signaler un bug</string>
<string name="whats_new_option">Nouveautés</string>
<string name="licenses_option">Licences Open source</string>
@ -189,8 +182,6 @@
<string name="start_permissions_granted">Autorisé</string>
<string name="start_permissions_storage">Permission de Stockage</string>
<string name="start_permissions_storage_desc">Nécessaire pour scanner votre appareil et trouver des livres</string>
<string name="start_permissions_notifications">Permission de notifications</string>
<string name="start_permissions_notifications_desc">Nécessaire pour vérifier si une nouvelle version de l\'application est disponible</string>
<string name="start_done">Tout est prêt!</string>
<string name="yesterday">Hier</string>
<string name="continue_reading_content_desc">Poursuivre la lecture</string>
@ -223,16 +214,12 @@
<string name="tryzub_content_desc">Tryzub</string>
<string name="github_profile_content_desc">Profile Github</string>
<string name="drag_content_desc">Glisser</string>
<string name="updates_notification_channel">Nouvelles mises à jour</string>
<string name="storage_permission_description">Nous avons besoin de l\'autorisation de stockage pour scanner votre appareil et trouver des livres. Sans cette autorisation, vous ne pourrez pas ajouter de livre.</string>
<string name="move_books_description">Choisissez la catégorie dans laquelle vous souhaitez déplacer tous les livres sélectionnés (%1$s). Tous les livres sélectionnés seront déplacés vers la catégorie choisie.</string>
<string name="updates_notification_desc">La mise à jour %1$s vient d\'être réalisée! Cliquez pour accéder à la page de publication.</string>
<string name="updates_notification_title">Nouvelle mise à jour de Book\'s Story!</string>
<string name="add_books">Ajouter des livres ?</string>
<string name="error_no_description">Pas de description.</string>
<string name="error_something_went_wrong">Quelque chose s\'est mal passé.</string>
<string name="delete_history_description">L\'historique complet sera supprimé de la base de données. Après la suppression de tout l\'historique, l\'ordre des livres sera réinitialisé.</string>
<string name="update_app_description">Une nouvelle version de l\'application a été trouvée. Voulez-vous continuer et aller à la page de publication ?</string>
<string name="error_no_browser">Aucune application de navigation n\'a été trouvée.</string>
<string name="error_could_not_get_text">Le contenu du livre est vide. Veuillez vous assurer que le contenu du livre n\'est pas vide et de le mettre à jour.</string>
<string name="history_empty">Laissez le dernier livre que vous avez lu ouvrir les pages d\'une grande et nouvelle histoire dans votre aventure de lecture</string>
@ -249,11 +236,9 @@
<string name="dark_theme_option">Thème sombre</string>
<string name="pure_dark_option">Noir pur (OLED)</string>
<string name="app_theme_option">Thème de l\'application</string>
<string name="check_for_updates_option">Vérifier les mises à jours</string>
<string name="double_press_exit_option">Double retour en arrière pour sortir</string>
<string name="paragraph_height_option">Hauteur du paragraphe</string>
<string name="theme_contrast_option">Contraste du thème</string>
<string name="check_for_updates_option_desc">Vérifier les nouvelles versions de l\'application lors du démarrage</string>
<string name="double_press_exit_option_desc">Appuyer deux fois sur retour pour quitter l\'application</string>
<string name="font_family_option">Famille de police</string>
<string name="font_style_option">Style de police</string>

View file

@ -5,9 +5,6 @@
-->
<resources>
<string name="updates_notification_channel">नये अपडेट</string>
<string name="updates_notification_title">बुक्स स्टोरी का नया अपडेट!</string>
<string name="updates_notification_action">डाउनलोड करें</string>
<string name="library_screen">पुस्तकालय</string>
<string name="history_screen">इतिहास</string>
<string name="settings_screen">सेटिंग्स</string>
@ -18,13 +15,10 @@
<string name="add_books">किताबें शामिल करें ?</string>
<string name="move_books">किताबें स्थानांतरित करें?</string>
<string name="delete_book">किताब हटाएं?</string>
<string name="enable_check_for_updates">अपडेट्स की जाँच चालू करें?</string>
<string name="move_books_description">वह श्रेणी चुनें जिसमें आप सभी चयनित पुस्तकों को ले जाना चाहते हैं(%1$s)। सभी चयनित पुस्तकें चयनित श्रेणी में ले जाई जाएँगी।</string>
<string name="update_app_description">नया ऐप वर्शन मिला। क्या आप आगे बढ़ना चाहते हैं और रिलीज़ पेज पर जाना चाहते हैं?</string>
<string name="error_something_went_wrong">कुछ गड़बड़ हुआ है ।</string>
<string name="error_no_translator">कोई अनुवादक ऐप नहीं मिला ।</string>
<string name="error_no_share_app">शेर करने के लिए कोई ऐप नहीं मिला ।</string>
<string name="error_check_internet">कुछ ग़लत हुआ। बाद में पुनः प्रयास करें।</string>
<string name="error_closed_source">बंद स्रोत कोड</string>
<string name="library_empty">अपनी पसंदीदा पुस्तकें पढ़ें और उन्हें श्रेणियों के बीच क्रमित करें</string>
<string name="history_empty">अपनी आखिरी पढ़ी हुई किताब से अपनी पढ़ने की यात्रा की एक नई महान कहानी के पन्ने खोलिए</string>
@ -76,7 +70,6 @@
<string name="general_browse_settings">सामान्य</string>
<string name="sort_browse_settings">क्रमबद्ध करना</string>
<string name="language_option">ऐप भाषा</string>
<string name="updates_notification_desc">अपडेट %1$s अभी जारी हुआ! रिलीज़ पेज पर जाने के लिए क्लिक करें।</string>
<string name="delete_books">किताबें हटाएँ?</string>
<string name="move_book">किताब को स्थानांतरित करें ?</string>
<string name="browse_screen">और देखें</string>
@ -94,14 +87,12 @@
<string name="move_book_description">वह श्रेणी चुनें जिसमें आप इस पुस्तक को ले जाना चाहते हैं। यह पुस्तक चयनित श्रेणी में ले जाई जाएगी।</string>
<string name="delete_history_description">यह डेटाबेस से पूरा इतिहास मिटा देगा। पूरा इतिहास मिटाने के बाद, किताबों का क्रम फिर से सेट हो जाएगा।</string>
<string name="error_permission">हमें किताबों के लिए आपके डिवाइस को स्कैन करने के लिए भंडारण अनुमति की आवश्यकता है</string>
<string name="enable_check_for_updates_description">«अपडेट की जाँच करें» को सक्षम करके, ऐप हर बार ऐप शुरू होने पर «api.github.com» से नवीनतम रिलीज़ जानकारी प्राप्त करेगा। क्या आप आगे बढ़ना चाहते हैं और «अपडेट की जाँच करें» को सक्षम करना चाहते हैं?</string>
<string name="error_no_description">कोई वर्णन नहीं।</string>
<string name="error_no_dictionary">कोई शब्दकोश ऐप नहीं मिला ।</string>
<string name="error_no_browser">कोई ब्राउज़र ऐप नहीं मिला ।</string>
<string name="error_could_not_get_text">पुस्तक की सामग्री रिक्त है। कृपया जाँच करें कि पुस्तक की सामग्री रिक्त न हो और उसे अपडेट करें।</string>
<string name="error_could_not_reset_cover">कवर छवि रीसेट नहीं की जा सकी ।</string>
<string name="browse_empty">अपने डाउनलोड के साथ पुस्तकालय के पुस्तक संग्रह का विस्तार करें</string>
<string name="update_query">%1$s अपडेट करें</string>
<string name="color_preset_query">प्रीसेट %1$s</string>
<string name="move">हटाना</string>
<string name="delete">मिटाना</string>
@ -113,8 +104,6 @@
<string name="absolute_dark_option_desc">पृष्ठभूमि का रंग पूरी तरह से काला करें</string>
<string name="theme_contrast_option">थीम कंट्रास्ट</string>
<string name="app_theme_option">ऐप थीम</string>
<string name="check_for_updates_option">अद्यतनों के लिए जाँच करें</string>
<string name="check_for_updates_option_desc">स्टार्टअप पर ऐप के नए संस्करण की जाँच करें</string>
<string name="double_press_exit_option">बाहर निकलने के लिए दो बार पीछे जाने की बटन दबाएँ</string>
<string name="double_press_exit_option_desc">बाहर निकलने के लिए दो बार पीछे जाने की बटन दबाएँ</string>
<string name="font_family_option">फ़ॉन्ट परिवार</string>
@ -199,7 +188,6 @@
<string name="perception_expander_thickness_option">धारणा विस्तारक लाइन मोटाई</string>
<string name="screen_orientation_option">स्क्रीन अनुकूलन</string>
<string name="red_color">लाल</string>
<string name="no_updates">ऐप का नवीनतम संस्करण पहले से इंस्टॉल है।</string>
<string name="cover_reset">कवर छवि सफलतापूर्वक रीसेट कर दी गई।</string>
<string name="file_path">दस्तावेज पथ</string>
<string name="file_last_opened">फ़ाइल अंतिम बार खोली गई</string>
@ -216,7 +204,6 @@
<string name="help_title_how_to_customize_app">मैं ऐप को कैसे अनुकूलित करूं?</string>
<string name="help_desc_how_to_customize_app_1">के पास जाओ</string>
<string name="app_version_option_desc_1">किताब की कहानी v%1$s</string>
<string name="app_version_option_desc_2">अपडेट जांचने के लिए क्लिक करें</string>
<string name="whats_new_option">नया क्या है</string>
<string name="licenses_option">ओपन सोर्स लाइसेंस</string>
<string name="credits_icon">माउस</string>

View file

@ -1,2 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Book's Story — free and open-source Material You eBook reader.
~ Copyright (C) 2024-2025 Acclorite
~ SPDX-License-Identifier: GPL-3.0-only
-->
<resources></resources>

View file

@ -1,13 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Book's Story — free and open-source Material You eBook reader.
~ Copyright (C) 2024-2025 Acclorite
~ SPDX-License-Identifier: GPL-3.0-only
--><resources>
<string name="updates_notification_channel">Nuovi aggiornamenti</string>
<string name="updates_notification_title">Nuovo aggiornamento di Book\'s Story!</string>
<string name="updates_notification_desc">Aggiornamento %1$s appena rilasciato! Clicca per andare alla pagina del rilascio.</string>
<string name="updates_notification_action">Scarica</string>
-->
<resources>
<string name="library_screen">Biblioteca</string>
<string name="history_screen">Cronologia</string>
<string name="default_string">Predefinito</string>
@ -49,7 +48,6 @@
<string name="delete">Elimina</string>
<string name="web_search">Ricerca web</string>
<string name="dark_theme_on">Abilitato</string>
<string name="start_permissions_notifications">Permesso per le notifiche</string>
<string name="credits_icon">Icone</string>
<string name="theme_appearance_settings">Preferenze tema</string>
<string name="go_back_content_desc">Indietro</string>
@ -64,7 +62,6 @@
<string name="books_moved">Tutti i libri selezionati sono stati spostati correttamente.</string>
<string name="error_no_browser">Nessuna app browser trovata.</string>
<string name="delete_history">Cancellare la cronologia di lettura?</string>
<string name="enable_check_for_updates">Abilita controlli degli aggiornamenti?</string>
<string name="error_no_dictionary">Nessuna app dizionario trovata.</string>
<string name="storage_permission_description">Abbiamo bisogno del permesso di archiviazione per la scansione del Tuo Dispositivo per i libri. Senza questo permesso, non sarai in grado di aggiungere i libri.</string>
<string name="done">Fatto</string>
@ -86,7 +83,6 @@
<string name="colors_appearance_settings">Colori</string>
<string name="change_cover_desc">Scegli la nuova copertina dalle tue foto</string>
<string name="system_reader_settings">Sistema</string>
<string name="check_for_updates_option">Controlla aggiornamenti</string>
<string name="color_preset_option">Preset colori</string>
<string name="paragraph_indentation_option">Indentazione paragrafo</string>
<string name="red_color">Rosso</string>
@ -100,13 +96,10 @@
<string name="add_books_description">Puoi scegliere quali libri vuoi aggiungere. È possibile modificare il titolo e l\'immagine di copertina in seguito. Il processo di caricamento può richiedere fino a diversi minuti.</string>
<string name="delete_history_description">Elimina l\'intera cronologia dal database. Dopo avere eliminato la cronologia, l\'ordine dei libri sarà reimpostato.</string>
<string name="delete_books_description">Eliminerà tutti i libri selezionati (%1$s) dal database. Non eliminerà i libri selezionati dal tuo dispositivo.</string>
<string name="update_app_description">Nuova versione dell\'app trovata. Vuoi procedere alla pagina di rilascio?</string>
<string name="enable_check_for_updates_description">Abilitando il controllo degli aggiornamenti l\'app cercherà all\'avvio le informazioni sulla versione più recente da «api.github.com». Vuoi procedere e abilitare il controllo degli aggiornamenti?</string>
<string name="error_no_description">Nessuna descrizione.</string>
<string name="error_something_went_wrong">Qualcosa è andato storto.</string>
<string name="error_permission">Abbiamo bisogno del permesso di archiviazione per cercare i libri nel tuo dispositivo</string>
<string name="library_empty">Leggi i tuoi libri preferiti e ordinali per categoria</string>
<string name="update_query">Aggiorna %1$s</string>
<string name="sort_tab">Ordina</string>
<string name="color_tab">Colori</string>
<string name="filter_tab">Filtri</string>
@ -156,7 +149,6 @@
<string name="credits_fonts">Caratteri</string>
<string name="start_language_preferences">Preferenze lingua</string>
<string name="create_color_preset_content_desc">Crea nuovo preset di colori</string>
<string name="error_check_internet">Qualcosa è andato storto. Riprova più tardi.</string>
<string name="error_could_not_get_text">Il file è vuoto, danneggiato o mancante. Verifica il file o aggiorna il percorso e riprova.</string>
<string name="help_title_how_to_add_books">Come aggiungo libri alla Libreria?</string>
<string name="help_desc_how_to_add_books_1">Vai a</string>
@ -193,7 +185,6 @@
<string name="screen_brightness_option">Luminosità</string>
<string name="sort_browse_settings">Ordinamento</string>
<string name="font_family_option">Famiglia di font</string>
<string name="no_updates">L\'ultima versione dell\'app è già installata.</string>
<string name="help_desc_how_to_read_book_2">Libreria</string>
<string name="start_welcome">Benvenuti in Book\'s Story!</string>
<string name="browse_grid_size_per_row">per riga</string>
@ -213,7 +204,6 @@
<string name="help_desc_how_to_move_or_delete_books_2">Libreria</string>
<string name="book_moved">Questo libro è stato spostato con successo.</string>
<string name="copied">Copiato</string>
<string name="app_version_option_desc_2">Clicca per controllare gli aggiornamenti</string>
<string name="help_desc_how_to_use_tooltip_1">La maggior parte dei pulsanti icona hanno dei suggerimenti, che possono aiutarti se non sai cosa fa un pulsante icona. Per mostrare il tooltip puoi tenere premuto su un pulsante icona.</string>
<string name="help_desc_how_to_read_book_1">Vai alla</string>
<string name="help_desc_how_to_use_double_click_translation_1">Per prima cosa, vai alle impostazioni del Lettore(vedi: Come personalizzare il Lettore?), quindi attiva l\'impostazione corrispondente. Dopodiché, inizia a leggere il libro (vedi: Come leggere un libro?). Ora, se fai doppio clic sul paragrafo desiderato, verrà aperto un traduttore esterno con il testo del paragrafo.</string>
@ -276,7 +266,6 @@
<string name="help_desc_how_to_customize_reader_2">Impostazioni</string>
<string name="reset_cover">Ripristina immagine di copertina</string>
<string name="reset_cover_desc">Ripristina l\'immagine di copertina del libro al valore predefinito</string>
<string name="check_for_updates_option_desc">Controlla la versione più recente dell\'app all\'avvio</string>
<string name="double_press_exit_option">Premere due volte indietro per uscire</string>
<string name="font_style_option">Stile del font</string>
<string name="side_padding_option">Margini laterali</string>
@ -301,7 +290,6 @@
<string name="start_permissions_granted">Concesso</string>
<string name="start_permissions_storage">Autorizzazione di archiviazione</string>
<string name="start_permissions_storage_desc">Necessario per scansionare il tuo dispositivo e trovare i libri</string>
<string name="start_permissions_notifications_desc">Necessario per verificare la presenza di una versione più recente dell\'app</string>
<string name="start_done_desc">Hai completato con successo le impostazioni di base dell\'app. Vuoi imparare a usare l\'app leggendo la schermata di Aiuto?</string>
<string name="add_files_content_desc">Aggiungi file</string>
<string name="library_content_desc">La tua libreria</string>

View file

@ -5,7 +5,6 @@
-->
<resources>
<string name="updates_notification_action">Pobierz</string>
<string name="history_screen">Historia</string>
<string name="help_screen">Pomoc</string>
<string name="move">Przenieś</string>
@ -30,8 +29,6 @@
<string name="green_color">Zielony</string>
<string name="blue_color">Niebieski</string>
<string name="dark_theme_off">Wyłączono</string>
<string name="updates_notification_channel">Nowe aktualizacje</string>
<string name="updates_notification_title">Nowa aktualizacja Book\'s Story!</string>
<string name="settings_screen">Ustawienia</string>
<string name="library_screen">Biblioteka</string>
<string name="browse_screen">Przeglądaj</string>
@ -55,13 +52,10 @@
<string name="font_style_option">Styl czcionki</string>
<string name="letter_spacing_option">Odstępy między literami</string>
<string name="language_option">Język aplikacji</string>
<string name="check_for_updates_option">Sprawdź dostępność aktualizacji</string>
<string name="yes_go_to_help">Tak, przejdź do Pomoc</string>
<string name="delete_cover">Usuń obraz okładki</string>
<string name="error_check_internet">Coś poszło nie tak. Spróbuj ponownie później.</string>
<string name="marsh_theme">Pluton</string>
<string name="planning_tab">Planowanie</string>
<string name="enable_check_for_updates">Włączyć sprawdzanie aktualizacji?</string>
<string name="fast_color_preset_change_option">Szybka zmiana ustawienia koloru</string>
<string name="about_screen">O aplikacji</string>
<string name="storage_permission">Przyznać dostęp?</string>
@ -73,7 +67,6 @@
<string name="move_books_description">Wybierz kategorię, do której chcesz przenieść wszystkie wybrane książki (%1$s). Wszystkie wybrane książki zostaną przeniesione do wybranej kategorii.</string>
<string name="delete_book_description">To spowoduje usunięcie tej książki z bazy danych, ale nie usunie jej z twojego urządzenia.</string>
<string name="delete_history_description">To spowoduje usuniecie całej historii z bazy danych. Po usunięciu całej historii kolejność książek zostanie zresetowana.</string>
<string name="enable_check_for_updates_description">Włączając « Sprawdź aktualizacje », aplikacja pobierze najnowsze informacje o wersji z « api.github.com » za każdym razem, gdy aplikacja się uruchomi. Czy chcesz kontynuować i włączyć «Sprawdź aktualizacje»?</string>
<string name="error_permission">Potrzebujemy uprawnień do przechowywania, aby przeskanować Twoje urządzenie w poszukiwaniu książek</string>
<string name="error_no_description">Brak opisu.</string>
<string name="error_something_went_wrong">Coś poszło nie tak.</string>
@ -84,7 +77,6 @@
<string name="library_empty">Przeczytaj swoje ulubione książki i posortuj je między kategoriami</string>
<string name="history_empty">Niech ostatnia czytana książka otworzy strony nowej wspaniałej historii twojej czytelniczej podróży</string>
<string name="selected_items_count_query">Wybrano %1$s</string>
<string name="update_query">Zaktualizuj %1$s</string>
<string name="web_search">Wyszukiwanie w sieci</string>
<string name="change_cover">Zmień obraz okładki</string>
<string name="reading_tab">Czytanie</string>
@ -97,7 +89,6 @@
<string name="absolute_dark_option_desc">Zmień kolor tła na całkowicie czarny</string>
<string name="theme_contrast_option">Kontrast motywu</string>
<string name="app_theme_option">Motyw aplikacji</string>
<string name="check_for_updates_option_desc">Sprawdź przy uruchomieniu, czy jest dostępna nowsza wersja aplikacji</string>
<string name="double_press_exit_option_desc">Naciśnij dwukrotnie wstecz, aby wyjść z aplikacji</string>
<string name="font_family_option">Rodzina czcionek</string>
<string name="font_size_option">Rozmiar czcionki</string>
@ -127,7 +118,6 @@
<string name="fast_color_preset_change_option_desc">Przesuń w lewo lub w prawo, aby zmienić ustawienie koloru</string>
<string name="error_could_not_get_text">Treść książki jest pusta. Upewnij się, że zawartość książki nie jest pusta i zaktualizuj ją.</string>
<string name="error_no_translator">Nie znaleziono aplikacji tłumacza.</string>
<string name="update_app_description">Znaleziono nową wersję Book\'s Story. Chcesz ją pobrać? Klikając przycisk « Pobierz », zostaniesz przeniesiony do przeglądarki i automatycznie pobierzesz najnowszą aktualizację.</string>
<string name="browse_layout_grid">Siatka</string>
<string name="theme_contrast_standard">Standardowy</string>
<string name="reset_cover">Zresetuj obraz okładki</string>
@ -156,7 +146,6 @@
<string name="browse_settings_desc">Ogólne, filtr, sortowanie</string>
<string name="translator_reader_settings">Tłumacz</string>
<string name="dark_theme_follow_system">System</string>
<string name="updates_notification_desc">Aktualizacja%1$s właśnie została wydana! Kliknij, aby przejść do strony.</string>
<string name="change_cover_desc">Wybierz nową okładkę ze swoich zdjęć</string>
<string name="color_preset_query">Preset %1$s</string>
<string name="delete_cover_desc">Usuń bieżący obraz okładki książki</string>
@ -188,7 +177,6 @@
<string name="help_desc_how_to_customize_reader_1">Zacznij czytać książkę (patrz: Jak mogę przeczytać książkę?), A następnie przynieś górne i dolne paski, klikając w dowolnym miejscu na ekranie. Następnie kliknij ikonę zębatki w prawym górnym rogu. Spowoduje to wyświetlenie wszystkich ustawień Czytnika. Drugim sposobem jest przejście do</string>
<string name="color_preset_placeholder">Nazwij ustawienie…</string>
<string name="browse_grid_size_option">Rozmiar siatki</string>
<string name="start_permissions_notifications">Zezwolenie na powiadomienia</string>
<string name="sort_order_content_desc">Kolejność sortowania</string>
<string name="cover_image_not_found_content_desc">Nie znaleziono obrazu okładki</string>
<string name="credits_contribution">Wnieśli wkład</string>
@ -199,7 +187,6 @@
<string name="theme_contrast_high">Wysoki</string>
<string name="cover_image_changed">Obraz okładki został pomyślnie zmieniony.</string>
<string name="book_moved">Ta książka została pomyślnie przeniesiona.</string>
<string name="no_updates">Najnowsza wersja aplikacji jest już zainstalowana.</string>
<string name="cover_reset">Obraz okładki został pomyślnie zresetowany.</string>
<string name="history_element_deleted">Element historii został pomyślnie usunięty.</string>
<string name="file_last_opened">Plik ostatnio otwarty</string>
@ -223,7 +210,6 @@
<string name="help_title_how_to_create_color_presets">Jak mogę tworzyć i modyfikować ustawienia kolorów?</string>
<string name="start_language_preferences">Preferencje języka</string>
<string name="start_permissions_storage">Uprawnienie do przechowywania</string>
<string name="start_permissions_notifications_desc">Wymagane, aby sprawdzić nowszą wersję aplikacji</string>
<string name="today">Dzisiaj</string>
<string name="go_back_content_desc">Wróć</string>
<string name="cover_image_content_desc">Obraz okładki</string>
@ -255,7 +241,6 @@
<string name="chapters_content_desc">Rozdziały</string>
<string name="no_chapters">Brak rozdziałów</string>
<string name="chapters">Rozdziały</string>
<string name="app_version_option_desc_2">Kliknij, aby sprawdzić aktualizacje</string>
<string name="help_desc_how_to_add_books_3">Jeśli nie widzisz pobranych książek, spróbuj odświeżyć listę, przeciągając ją w dół. Upewnij się, że Twoje książki posiadają obsługiwany format pliku. Następnie kliknij książkę, aby ją wybrać lub przytrzymaj, aby pokazać jej lokalizację. Po wybraniu wszystkich książek, które chcesz, kliknij ikonę znacznika wyboru w prawym górnym rogu, poczekaj na załadowanie wszystkich książek i kliknij « Dodaj ». Teraz powinieneś zobaczyć wszystkie książki, które dodałeś do</string>
<string name="history_content_desc">Historia czytania</string>
<string name="exit_search_content_desc">Opuść wyszukiwanie</string>

View file

@ -9,7 +9,6 @@
<string name="move_book">Mover livro?</string>
<string name="delete_book">Apagar livro?</string>
<string name="default_string">Padrão</string>
<string name="enable_check_for_updates">Habilitar verificação de atualizações?</string>
<string name="cancel">Cancelar</string>
<string name="move">Mover</string>
<string name="never">Nunca</string>
@ -28,7 +27,6 @@
<string name="grant">Permitir</string>
<string name="done">Feito</string>
<string name="dark_theme_off">Desabilitado</string>
<string name="updates_notification_action">Baixar</string>
<string name="delete_books">Apagar livros?</string>
<string name="library_screen">Biblioteca</string>
<string name="settings_screen">Configurações</string>
@ -57,9 +55,6 @@
<string name="text_reader_settings">Texto</string>
<string name="misc_reader_settings">Miscelânea</string>
<string name="pure_dark_off">Desabilitado</string>
<string name="updates_notification_channel">Novas Atualizações</string>
<string name="updates_notification_desc">A atualização %1$s acabou de lançar! Clique para ir à página de lançamento.</string>
<string name="updates_notification_title">Novo update do Book\'s Story!</string>
<string name="add_books">Adicionar livros?</string>
<string name="storage_permission_description">Precisamos de permissão de acesso ao armazenamento para procurar livros no seu dispositivo. Sem essa permissão, você não será capaz de adicionar um livro.</string>
<string name="delete">Apagar</string>
@ -166,8 +161,6 @@
<string name="already_read_tab">Lido</string>
<string name="browse_grid_size_option">Tamanho da grade</string>
<string name="grant_permission">Dar permissão</string>
<string name="update_query">Atualizar %1$s</string>
<string name="update_app_description">Nova versão do aplicativo disponível. Deseja seguir para a página de lançamentos?</string>
<string name="error_no_description">Sem descrição.</string>
<string name="selected_items_count_query">%1$s selecionado</string>
<string name="error_closed_source">Código fechado</string>
@ -185,7 +178,6 @@
<string name="more_content_desc">Mais</string>
<string name="file_path">Caminho</string>
<string name="tryzub_content_desc">Tryzub</string>
<string name="enable_check_for_updates_description">Ativando «Verificação de atualizações» o aplicativo receberá as informações mais recentes de «api.github.com» toda vez que ele for iniciado. Deseja prosseguir e ativar «Verificação de atualizações»?</string>
<string name="start_theme_preferences">Prefêrencia de temas</string>
<string name="sort_order_content_desc">Ordem de classificação</string>
<string name="continue_reading_content_desc">Continuar a ler</string>
@ -194,7 +186,6 @@
<string name="start_permissions_storage">Permissão de armazenamento</string>
<string name="whats_new_option">O que há de novo</string>
<string name="help_translate_option">Ajude a traduzir</string>
<string name="start_permissions_notifications">Permissão de notificações</string>
<string name="start_done">Está tudo feito!</string>
<string name="cover_image_content_desc">Imagem da capa</string>
<string name="open_reader_settings_content_desc">Configurações do leitor</string>
@ -213,7 +204,6 @@
<string name="change_cover">Trocar imagem da capa</string>
<string name="reader_settings_desc">Fonte, texto, tradutor</string>
<string name="browse_settings_desc">Geral, filtro, ordem</string>
<string name="check_for_updates_option">Procurar atualizações</string>
<string name="keep_screen_on_option">Manter a tela ligada</string>
<string name="add_files_content_desc">Adicionar arquivos</string>
<string name="library_content_desc">Sua biblioteca</string>
@ -243,7 +233,6 @@
<string name="library_empty">Leia seus livros favoritos e organize-os em categorias</string>
<string name="error_could_not_reset_cover">Não foi possível restaurar a imagem da capa.</string>
<string name="perception_expander_thickness_option">Espessura da linha</string>
<string name="error_check_internet">Algo deu errado. Tente novamente.</string>
<string name="perception_expander_option_desc">Aumente sua velocidade de leitura focando no centro</string>
<string name="double_click_translation_option_desc">Clique duas vezes no parágrafo para traduzi-lo</string>
<string name="fast_color_preset_change_option">Troca rápida do padrão de cores</string>
@ -252,7 +241,6 @@
<string name="reset_cover_desc">Restaure a imagem do livro de volta para o padrão</string>
<string name="change_cover_desc">Escolha a nova capa das suas fotos</string>
<string name="delete_cover_desc">Apagar a imagem atual da capa do livro</string>
<string name="check_for_updates_option_desc">Procurar por uma atualização do app ao abrir</string>
<string name="double_click_translation_option">Traduzir com toque duplo</string>
<string name="double_press_exit_option">Volte duas vezes para sair</string>
<string name="cutout_padding_option_desc">Aplique uma margem para área de recorte</string>
@ -280,7 +268,6 @@
<string name="highlighted_reading_option_desc">Destaque o início de cada palavra</string>
<string name="help_title_how_to_move_or_delete_books">Como faço para mover ou excluir livros?</string>
<string name="help_title_how_to_edit_book">Como faço para editar um livro?</string>
<string name="app_version_option_desc_2">Clique para verificar se há atualizações</string>
<string name="help_title_how_to_manage_history">Como faço para gerenciar o histórico?</string>
<string name="open_in_web_content_desc">Abrir no navegador</string>
<string name="color_preset_placeholder">Nomeie o padrão…</string>
@ -291,7 +278,6 @@
<string name="help_desc_how_to_create_color_presets_1">Vá para as configurações de Aparência (veja: Como personalizar o Reader?). Você pode modificar todas as configurações de predefinições de cores na caixa em «Predefinição de cores» na subcategoria «Cores». Para criar uma nova predefinição de cores, clique no botão de ícone «Adicionar». Existem várias maneiras de modificar uma predefinição de cores: clicando no campo de texto, você pode alterar o nome da predefinição de cores, movendo os controles deslizantes, você pode alterar as cores da predefinição de cores, clicando no botão de ícone «Aleatório», você pode embaralhar todas as cores. Se quiser excluir a predefinição de cores, clique no botão de ícone «Excluir».</string>
<string name="highlighted_reading_level">nível</string>
<string name="delete_history_element_content_desc">Apagar elemento do histórico</string>
<string name="start_permissions_notifications_desc">Necessário verificar se há uma versão mais recente do aplicativo</string>
<string name="help_title_how_to_use_perception_expander">O que é e como usar o Expansor de Percepção?</string>
<string name="checkpoint_back_content_desc">Voltar ao ponto-salvo</string>
<string name="highlighted_reading_thickness_option">Espessura da marcação</string>
@ -355,7 +341,6 @@
<string name="help_desc_how_to_use_double_click_translation_1">Primeiro, vá para as configurações do Reader (veja: Como personalizar o Leitor?), então ative a configuração correspondente. Depois disso, comece a ler o livro (veja: Como ler um livro?). Agora, se você clicar duas vezes no parágrafo desejado, o tradutor externo será aberto com o texto do parágrafo.</string>
<string name="horizontal_gesture_inverse">Ligado (Inverso)</string>
<string name="delete_whole_history_content_desc">Apagar o histórico inteiro</string>
<string name="no_updates">A última versão do aplicativo já está instalada.</string>
<string name="yellow2_theme">Makemake</string>
<string name="pin_content_desc">Fixar</string>
<string name="error_no_file">Arquivo não existe</string>

View file

@ -5,6 +5,5 @@
-->
<resources>
<string name="updates_notification_channel">Update nou</string>
<string name="default_string">Standard</string>
</resources>

View file

@ -10,9 +10,7 @@
<string name="library_screen">நூலகம்</string>
<string name="history_screen">வரலாறு</string>
<string name="add_books">புத்தகங்களைச் சேர்க்கவா?</string>
<string name="enable_check_for_updates">புதுப்பிப்புகளை சரிபார்க்கவா?</string>
<string name="move_book_description">இந்த புத்தகத்தை நீங்கள் நகர்த்த விரும்பும் வகையைத் தேர்வுசெய்க. இந்த நூல் தேர்ந்தெடுக்கப்பட்ட வகைக்கு மாற்றப்படும்.</string>
<string name="update_app_description">புதிய பயன்பாட்டு பதிப்பு கண்டறியப்பட்டது. நீங்கள் தொடர விரும்புகிறீர்களா?</string>
<string name="error_something_went_wrong">ஏதோ தவறு நடந்தது.</string>
<string name="error_closed_source">மூடிய மூல</string>
<string name="browse_empty">உங்கள் பதிவிறக்கங்களுடன் நூலகத்தின் புத்தக சேகரிப்பை விரிவாக்குங்கள்</string>
@ -105,11 +103,9 @@
<string name="browse_sort_order_file_format">கோப்பு வடிவம்</string>
<string name="default_string">இயல்புநிலை</string>
<string name="delete_history">வாசிப்பு வரலாற்றை நீக்கவா?</string>
<string name="enable_check_for_updates_description">செயல்படுத்துவதன் மூலம் «புதுப்பிப்புகளைச் சரிபார்க்கவும்» பயன்பாடு தொடங்கும் ஒவ்வொரு முறையும் «api.github.com இருந்து இலிருந்து அண்மைக் கால வெளியீட்டு தகவல்களை மீட்டெடுக்கும். நீங்கள் தொடர விரும்புகிறீர்களா «புதுப்பிப்புகளை சரிபார்க்கவும்»?</string>
<string name="error_permission">புத்தகங்களுக்காக உங்கள் சாதனத்தை ச்கேன் செய்ய எங்களுக்கு சேமிப்பக இசைவு தேவை</string>
<string name="error_no_description">விளக்கம் இல்லை.</string>
<string name="selected_items_count_query">%1$s தேர்ந்தெடுக்கப்பட்டன</string>
<string name="update_query">புதுப்பிப்பு %1$s</string>
<string name="undo">செயல்தவிர்</string>
<string name="copy">நகலெடு</string>
<string name="translate">மொழிபெயர்த்திடு</string>
@ -161,7 +157,6 @@
<string name="help_desc_how_to_use_color_presets_1">தோற்ற அமைப்புகளுக்குச் செல்லுங்கள் (பார்க்க: வாசகரை எவ்வாறு தனிப்பயனாக்குவது?). «வண்ண முன்னமைக்கப்பட்ட» அமைப்பில் எந்த வண்ண முன்னமைவைப் பயன்படுத்த வேண்டும் என்பதை நீங்கள் தேர்வு செய்யலாம். அதைத் தேர்ந்தெடுக்க விரும்பிய வண்ண முன்னமைவைக் சொடுக்கு செய்க, இது உங்கள் வண்ணங்களை வாசகரில் மாற்றும். வண்ண முன்னமைவை மறுவரிசைப்படுத்த விரும்பினால், அதைத் தேர்ந்தெடுத்து «கைப்பிடி» ஐகான்-பொன்ட்டைப் பிடித்துக் கொள்ளுங்கள், பின்னர் அதை விரும்பிய நிலைக்கு நகர்த்தவும். வண்ண முன்னமைவை வேகமாக மாற்ற, தோற்ற அமைப்பின் «வண்ணங்கள்» துணைப்பிரிவில் தொடர்புடைய அமைப்பை இயக்குவதன் மூலம் வண்ண முன்னமைவுகளை விரைவாக மாற்றலாம்.</string>
<string name="help_title_how_to_use_perception_expander">புலனுணர்வு விரிவாக்கியை நான் எவ்வாறு பயன்படுத்துவது?</string>
<string name="start_welcome_desc">நம்பமுடியாத சாகசங்களை கவர்ச்சியாக, கற்பித்தல் மற்றும் வழிநடத்தும் ஒரு உலகத்திற்கு! சில விசயங்களை அமைப்போம்!</string>
<string name="start_permissions_notifications_desc">புதிய பயன்பாட்டு பதிப்பை சரிபார்க்க வேண்டும்</string>
<string name="start_done">எல்லாம் முடிந்தது!</string>
<string name="today">இன்று</string>
<string name="error_content_desc">பிழை</string>
@ -180,10 +175,6 @@
<string name="search_field_empty">தேடுங்கள்…</string>
<string name="custom_screen_brightness_option">தனிப்பயன் ஒளி</string>
<string name="screen_brightness_option">ஒளி</string>
<string name="updates_notification_channel">புதிய புதுப்பிப்புகள்</string>
<string name="updates_notification_title">புத்தகத்தின் கதையின் புதிய புதுப்பிப்பு!</string>
<string name="updates_notification_desc">புதுப்பிப்பு %1$s இப்போது வெளியிடப்பட்டது! வெளியீட்டு பக்கத்திற்கு செல்ல சொடுக்கு செய்க.</string>
<string name="updates_notification_action">பதிவிறக்கம்</string>
<string name="browse_screen">உலாவு</string>
<string name="settings_screen">அமைப்புகள்</string>
<string name="about_screen">பயன்பாடு பற்றி</string>
@ -202,7 +193,6 @@
<string name="error_no_translator">மொழிபெயர்ப்பாளர் பயன்பாடு எதுவும் கிடைக்கவில்லை.</string>
<string name="error_no_share_app">பகிர்வதற்கு பயன்பாடு இல்லை.</string>
<string name="error_could_not_get_text">புத்தக உள்ளடக்கம் காலியாக உள்ளது. தயவுசெய்து, புத்தக உள்ளடக்கம் காலியாக இல்லை என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள்.</string>
<string name="error_check_internet">ஏதோ தவறு நடந்தது. பின்னர் மீண்டும் முயற்சிக்கவும்.</string>
<string name="error_no_dictionary">அகராதி பயன்பாடு எதுவும் கிடைக்கவில்லை.</string>
<string name="error_no_browser">உலாவி பயன்பாடு எதுவும் கிடைக்கவில்லை.</string>
<string name="error_could_not_reset_cover">கவர் படத்தை மீட்டமைக்க முடியவில்லை.</string>
@ -222,8 +212,6 @@
<string name="absolute_dark_option">முழுமையான இருண்ட</string>
<string name="theme_contrast_option">கருப்பொருள் மாறுபாடு</string>
<string name="app_theme_option">பயன்பாட்டு கருப்பொருள்</string>
<string name="check_for_updates_option">புதுப்பிப்புகளை சரிபார்க்கவும்</string>
<string name="check_for_updates_option_desc">தொடக்கத்தில் புதிய பயன்பாட்டு பதிப்பை சரிபார்க்கவும்</string>
<string name="font_size_option">எழுத்துரு அளவு</string>
<string name="line_height_option">வரி உயரம்</string>
<string name="paragraph_height_option">பத்தி உயரம்</string>
@ -264,7 +252,6 @@
<string name="press_again_toast">வெளியேற மீண்டும் அழுத்தவும்</string>
<string name="books_added">தேர்ந்தெடுக்கப்பட்ட அனைத்து புத்தகங்களும் வெற்றிகரமாக சேர்க்கப்பட்டன.</string>
<string name="history_deleted">வரலாறு வெற்றிகரமாக நீக்கப்பட்டது.</string>
<string name="no_updates">பயன்பாட்டின் அண்மைக் கால பதிப்பு ஏற்கனவே நிறுவப்பட்டுள்ளது.</string>
<string name="cover_reset">கவர் படம் வெற்றிகரமாக மீட்டமைக்கப்பட்டது.</string>
<string name="file_path">கோப்பு பாதை</string>
<string name="file_last_opened">கோப்பு கடைசியாக திறக்கப்பட்டது</string>
@ -272,7 +259,6 @@
<string name="no_chapters">அத்தியாயங்கள் இல்லை</string>
<string name="chapters">பாடங்கள்</string>
<string name="app_version_option_desc_1">புத்தகத்தின் கதை v%1$s</string>
<string name="app_version_option_desc_2">புதுப்பிப்புகளை சரிபார்க்க சொடுக்கு செய்க</string>
<string name="report_bug_option">ஒரு பிழையைப் புகாரளிக்கவும்</string>
<string name="whats_new_option">புதியது என்ன</string>
<string name="credits_option">வரவு</string>
@ -306,7 +292,6 @@
<string name="start_theme_preferences">கருப்பொருள் விருப்பத்தேர்வுகள்</string>
<string name="start_permissions_granted">வழங்கப்பட்டது</string>
<string name="start_permissions_storage_desc">உங்கள் சாதனத்தை ச்கேன் செய்து புத்தகங்களைக் கண்டுபிடிக்க வேண்டும்</string>
<string name="start_permissions_notifications">அறிவிப்புகள் இசைவு</string>
<string name="start_done_desc">பயன்பாட்டின் அடிப்படை அமைப்பை நீங்கள் வெற்றிகரமாக முடித்துவிட்டீர்கள். உதவித் திரையைப் படிப்பதன் மூலம் பயன்பாட்டை எவ்வாறு பயன்படுத்துவது என்பதை அறிய விரும்புகிறீர்களா?</string>
<string name="yesterday">நேற்று</string>
<string name="continue_reading_content_desc">தொடர்ந்து படிக்கவும்</string>

View file

@ -8,17 +8,6 @@
<!-- Basic Strings -->
<string name="default_string">Varsayılan</string>
<!-- Notifications -->
<string name="updates_notification_channel">Yeni güncellemeler</string>
<string name="updates_notification_title">Book\'s Story için yeni güncelleme!</string>
<string name="updates_notification_desc">
Güncelleme %1$s yeni yayınlandı!
Yayın sayfasına gitmek için tıklayın.
</string>
<string name="updates_notification_action">
İndir
</string>
<!-- Screens -->
<string name="library_screen">Kütüphane</string>
<string name="history_screen">Geçmiş</string>
@ -35,7 +24,6 @@
<string name="delete_book">Kitap silinsin mi?</string>
<string name="move_book">Kitap taşınsın mı?</string>
<string name="delete_history">Okuma geçmişi silinsin mi?</string>
<string name="enable_check_for_updates">Güncellemeleri kontrol etme etkinleştirilsin mi?</string>
<string name="edit">Düzenle</string>
<!-- Dialog Descriptions -->
@ -68,17 +56,6 @@
Tüm geçmiş veritabanından silinecektir.
Geçmişi sildikten sonra kitapların sıralaması sıfırlanacaktır.
</string>
<string name="update_app_description">
Yeni bir uygulama sürümü bulundu.
İşleme devam edip yayın sayfasına gitmek istiyor musunuz?
</string>
<string name="enable_check_for_updates_description">
«Güncellemeleri kontrol et» özelliğini etkinleştirerek
uygulama her açıldığında «api.github.com» üzerinden
en son sürüm bilgilerini alacaktır.
İşleme devam edip «Güncellemeleri kontrol et» özelliğini etkinleştirmek istiyor musunuz?
</string>
<!-- Errors -->
<string name="error_permission">
Cihazınızı kitaplar için tarayabilmemiz adına depolama iznine ihtiyacımız var
@ -97,10 +74,6 @@
Dosya boş, bozuk veya eksik.
Lütfen dosyayı doğrulayın ya da yolu güncelleyerek tekrar deneyin.
</string>
<string name="error_check_internet">
Bir şeyler ters gitti.
Daha sonra tekrar deneyin.
</string>
<string name="error_could_not_reset_cover">Kapak resmi sıfırlanamadı.</string>
<string name="error_closed_source">Kapalı kaynak</string>
<string name="error_no_file">Dosya mevcut değil</string>
@ -121,7 +94,6 @@
<!-- Query strings -->
<string name="selected_items_count_query">%1$s seçildi</string>
<string name="update_query">Güncelle %1$s</string>
<string name="color_preset_query">Ön ayar %1$s</string>
<string name="color_preset_selected_query">Seçilen «%1$s»</string>
@ -205,8 +177,6 @@
<string name="absolute_dark_option_desc">Arka plan rengini tamamen siyah yap</string>
<string name="theme_contrast_option">Tema kontrastı</string>
<string name="app_theme_option">Uygulama teması</string>
<string name="check_for_updates_option">Güncellemeleri kontrol et</string>
<string name="check_for_updates_option_desc">Uygulama açılışında yeni sürümü kontrol et</string>
<string name="double_press_exit_option">Çıkmak için iki kez geri bas</string>
<string name="double_press_exit_option_desc">Uygulamadan çıkmak için geri tuşuna iki kez basın</string>
@ -375,7 +345,6 @@
<string name="book_moved">Bu kitap başarıyla taşındı.</string>
<string name="copied">Kopyalandı</string>
<string name="history_deleted">Geçmiş başarıyla silindi.</string>
<string name="no_updates">Uygulamanın en son sürümü zaten yüklü.</string>
<string name="cover_reset">Kapak resmi başarıyla sıfırlandı.</string>
<string name="title_changed">Başlık başarıyla değiştirildi.</string>
<string name="author_changed">Yazar başarıyla değiştirildi.</string>
@ -401,7 +370,6 @@
<!-- About -->
<string name="app_version_option">Uygulama sürümü</string>
<string name="app_version_option_desc_1">Book\'s Story v%1$s</string>
<string name="app_version_option_desc_2">Güncellemeleri kontrol etmek için tıklayın</string>
<string name="report_bug_option">Hata bildir</string>
<string name="whats_new_option">Yenilikler</string>
<string name="licenses_option">ık kaynak lisansları</string>
@ -575,8 +543,6 @@
<string name="start_permissions_granted">Verildi</string>
<string name="start_permissions_storage">Depolama izni</string>
<string name="start_permissions_storage_desc">Cihazınızı tarayıp kitapları bulmak için gereklidir</string>
<string name="start_permissions_notifications">Bildirim izni</string>
<string name="start_permissions_notifications_desc">Yeni uygulama sürümünü kontrol etmek için gereklidir</string>
<string name="start_done">Her şey tamam!</string>
<string name="start_done_desc">
Uygulamanın temel ayarlarını başarıyla tamamladınız.

View file

@ -8,12 +8,6 @@
<!-- Basic Strings -->
<string name="default_string">За замовчуванням</string>
<!-- Notifications -->
<string name="updates_notification_channel">Нові оновлення</string>
<string name="updates_notification_title">Нове оновлення Book\'s Story!</string>
<string name="updates_notification_desc">Оновлення %1$s вийшло! Натисніть, щоб перейти на сторінку релізу.</string>
<string name="updates_notification_action">Завантажити</string>
<!-- Screens -->
<string name="library_screen">Бібліотека</string>
<string name="history_screen">Історія</string>
@ -30,7 +24,6 @@
<string name="delete_book">Видалити книгу?</string>
<string name="move_book">Перемістити книгу?</string>
<string name="delete_history">Видалити історію читання?</string>
<string name="enable_check_for_updates">Увімнкути перевірку на оновлення?</string>
<string name="edit">Редагувати</string>
<!-- Dialog Descriptions -->
@ -41,9 +34,6 @@
<string name="delete_book_description">Це видалить цю книгу з бази даних. Це не видалить цю книгу з вашого пристрою.</string>
<string name="move_book_description">Виберіть категорію, в яку ви хочете перемістити цю книгу. Ця книга буде переміщена в обрану категорію.</string>
<string name="delete_history_description">Це видалить всю історію з бази даних. Після видалення всієї історії порядок книг буде скинутий.</string>
<string name="update_app_description">Нова версія застосунку була знайдена. Чи бажаєте продовжити та перейти на сторінку релізу?</string>
<string name="enable_check_for_updates_description">Увімкнувши «Перевіряти на оновлення» застосунок буде отримувати інформацію про останній реліз з «api.github.com» кожен раз, коли застосунок запускається. Хочете продовжити та увімкнути «Перевіряти на оновлення»?</string>
<!-- Errors -->
<string name="error_permission">Нам потрібен дозвіл на сховище, щоб просканувати Ваш Девайс на наявність книг</string>
<string name="error_no_description">Немає опису.</string>
@ -56,7 +46,6 @@
Файл порожній, пошкоджений або відсутній.
Перевірте файл або змініть шлях і спробуйте ще раз.
</string>
<string name="error_check_internet">Щось пішло не так. Спробуйте пізніше.</string>
<string name="error_could_not_reset_cover">Не вдалося скинути обкладинку.</string>
<string name="error_closed_source">Закритий код</string>
<string name="error_no_file">Файла не існує</string>
@ -69,7 +58,6 @@
<!-- Query strings -->
<string name="selected_items_count_query">%1$s обрано</string>
<string name="update_query">Оновлення %1$s</string>
<string name="color_preset_query">Пресет %1$s</string>
<string name="color_preset_selected_query">Вибрано «%1$s»</string>
@ -153,8 +141,6 @@
<string name="absolute_dark_option_desc">Змінити колір фона на повністю чорний</string>
<string name="theme_contrast_option">Контрастність теми</string>
<string name="app_theme_option">Тема застосунка</string>
<string name="check_for_updates_option">Перевіряти на оновлення</string>
<string name="check_for_updates_option_desc">Перевіряти на новішу версію застосунку при запуску</string>
<string name="double_press_exit_option">Подвійне натискання для виходу</string>
<string name="double_press_exit_option_desc">Натисніть назад двічі, щоб вийти з застосунку</string>
@ -321,7 +307,6 @@
<string name="book_moved">Ця книга була успішно переміщена.</string>
<string name="copied">Скопійовано</string>
<string name="history_deleted">Історія була успішно видалена.</string>
<string name="no_updates">Остання версія застосунка вже встановлена.</string>
<string name="cover_reset">Обкладинка була успішно скинута.</string>
<string name="title_changed">Назва була успішно змінена.</string>
<string name="author_changed">Автор був успішно змінений.</string>
@ -347,7 +332,6 @@
<!-- About -->
<string name="app_version_option">Версія застосунка</string>
<string name="app_version_option_desc_1">Book\'s Story v%1$s</string>
<string name="app_version_option_desc_2">Натисніть, щоб перевірити на оновлення</string>
<string name="report_bug_option">Повідомити про помилку</string>
<string name="whats_new_option">Що нового</string>
<string name="licenses_option">Ліцензії з відкритим кодом</string>
@ -427,8 +411,6 @@
<string name="start_permissions_granted">Надано</string>
<string name="start_permissions_storage">Дозвіл на сховище</string>
<string name="start_permissions_storage_desc">Потрібний, щоб просканувати ваш пристрій та знайти книги</string>
<string name="start_permissions_notifications">Дозвіл на сповіщення</string>
<string name="start_permissions_notifications_desc">Потрібний, щоб перевірити застосунок на нову версію</string>
<string name="start_done">Все готово!</string>
<string name="start_done_desc">Ви успішно закінчили базове налаштовування застосунку. Бажаєте дізнатися, як користуватися застосунком, прочитавши екран Довідки?</string>

View file

@ -15,8 +15,6 @@
<string name="change_cover_desc">从你的图库中选择新封面</string>
<string name="delete_cover">删除封面图片</string>
<string name="author">作者</string>
<string name="update_query">更新 %1$s</string>
<string name="updates_notification_action">下载</string>
<string name="dictionary">词典</string>
<string name="settings_screen">设置</string>
<string name="error_no_translator">未发现翻译应用。</string>
@ -24,8 +22,6 @@
<string name="color_preset_query">预设 %1$s</string>
<string name="cancel">取消</string>
<string name="error_permission">我们需要存储权限以扫描您的设备上的书</string>
<string name="updates_notification_title">Book\'s Story 的新更新!</string>
<string name="updates_notification_desc">更新 %1$s 已发布!点击前往发布页面。</string>
<string name="library_screen">书库</string>
<string name="history_screen">历史</string>
<string name="browse_screen">浏览</string>
@ -37,14 +33,11 @@
<string name="delete_book_description">这本书将会从数据库中删除,但不会从您的设备上删除。</string>
<string name="move_book_description">选择你想将这本书移动到的分类。这本书将会被移动到指定的分类。</string>
<string name="delete_history_description">所有的历史将从数据库中被删除。删除所有的历史后,书的顺序将会被重置。</string>
<string name="update_app_description">发现了新版本。您想继续并前往发布页面吗?</string>
<string name="enable_check_for_updates_description">启用《检查更新》之后应用将在每次启动时从《api.github.com》获取最新发布信息。是否要继续并启用《检查更新》</string>
<string name="error_no_description">无简介。</string>
<string name="error_something_went_wrong">出现了一些错误。</string>
<string name="error_no_share_app">未找到要共享的应用。</string>
<string name="error_no_dictionary">未发现词典应用。</string>
<string name="error_could_not_get_text">这本书的内容为空,或有损坏和缺失。请核对文件或尝试更新文件路径。</string>
<string name="error_check_internet">出现了一些错误。请稍后尝试。</string>
<string name="error_could_not_reset_cover">无法重置封面图片。</string>
<string name="error_closed_source">关闭的源</string>
<string name="browse_empty">通过下载扩展图书馆的藏书</string>
@ -73,9 +66,7 @@
<string name="translate">翻译</string>
<string name="copy">复制</string>
<string name="selected_items_count_query">已选择 %1$s</string>
<string name="enable_check_for_updates">启用检查更新?</string>
<string name="delete_books">删除书籍?</string>
<string name="updates_notification_channel">新更新</string>
<string name="add_books_description">您可以挑选您想添加哪些书。您可以在之后编辑书的标题与封面图片。加载过程可能会花费数分钟。</string>
<string name="move_books_description">选择你想将所选的书(%1$s移动到的分类。所有被选择的书将会被移动到指定的分类。</string>
<string name="reading_speed_reader_settings">阅读速度</string>
@ -93,7 +84,6 @@
<string name="language_option">应用语言</string>
<string name="pure_dark_option">纯黑OLED</string>
<string name="theme_contrast_option">主题对比</string>
<string name="check_for_updates_option">检查更新</string>
<string name="double_press_exit_option">双击返回退出</string>
<string name="double_press_exit_option_desc">双击返回退出应用</string>
<string name="font_family_option">字体系列</string>
@ -113,7 +103,6 @@
<string name="app_theme_option">应用主题</string>
<string name="colors_appearance_settings">颜色</string>
<string name="translator_reader_settings">翻译器</string>
<string name="check_for_updates_option_desc">在启动时检查新版本</string>
<string name="sort_browse_settings">排序</string>
<string name="blue_color">蓝色</string>
<string name="paragraph_height_option">段落间距</string>
@ -196,7 +185,6 @@
<string name="book_moved">这本书已被成功移动。</string>
<string name="copied">已复制</string>
<string name="history_deleted">成功删除历史。</string>
<string name="no_updates">本应用的最新版本已被安装。</string>
<string name="cover_image_changed">成功更改了封面图片。</string>
<string name="history_element_deleted">成功删除了历史元素。</string>
<string name="books_moved">成功移动所有已选择的书。</string>
@ -213,7 +201,6 @@
<string name="credits_ideas">想法</string>
<string name="help_title_how_to_add_books">我应该如何添加书籍到库中?</string>
<string name="app_version_option_desc_1">Book\'s Story v%1$s</string>
<string name="app_version_option_desc_2">点击检查更新</string>
<string name="help_desc_how_to_add_books_4">书库中</string>
<string name="file_path">路径</string>
<string name="credits_icon">图标</string>
@ -276,12 +263,10 @@
<string name="start_permissions_preferences">权限</string>
<string name="start_done">设置完成!</string>
<string name="error_content_desc">错误</string>
<string name="start_permissions_notifications">通知权限</string>
<string name="start_permissions_granted">已授权</string>
<string name="start_permissions_storage">存储权限</string>
<string name="start_done_desc">你已经成功完成了应用基本设置。要参阅帮助以获取更多使用技巧吗?</string>
<string name="cover_image_not_found_content_desc">未找到封面图片</string>
<string name="start_permissions_notifications_desc">用于检查应用更新</string>
<string name="start_language_preferences">语言偏好</string>
<string name="start_theme_preferences">应用主题</string>
<string name="sort_order_content_desc">排序规则</string>

View file

@ -10,17 +10,6 @@
<string name="app_name" translatable="false">Book\'s Story</string>
<string name="default_string">Default</string>
<!-- Notifications -->
<string name="updates_notification_channel">New updates</string>
<string name="updates_notification_title">New update of Book\'s Story!</string>
<string name="updates_notification_desc">
Update %1$s just released!
Click to go to the release page.
</string>
<string name="updates_notification_action">
Download
</string>
<!-- Screens -->
<string name="library_screen">Library</string>
<string name="history_screen">History</string>
@ -37,7 +26,6 @@
<string name="delete_book">Delete book?</string>
<string name="move_book">Move book?</string>
<string name="delete_history">Delete reading history?</string>
<string name="enable_check_for_updates">Enable check for updates?</string>
<string name="edit">Edit</string>
<!-- Dialog Descriptions -->
@ -70,16 +58,6 @@
It will delete the whole history from the database.
After deleting the whole history, the order of the books will be reset.
</string>
<string name="update_app_description">
New app version was found.
Do you want to proceed and go to the release page?
</string>
<string name="enable_check_for_updates_description">
By enabling «Check for updates»
the app will retrieve latest release information from «api.github.com» each time
when app starts.
Do you want to proceed and enable «Check for updates»?
</string>
<!-- Errors -->
<string name="error_permission">
@ -99,10 +77,6 @@
File is empty, corrupted, or missing.
Please verify the file or update the path and try again.
</string>
<string name="error_check_internet">
Something went wrong.
Try again later.
</string>
<string name="error_could_not_reset_cover">Could not reset cover image.</string>
<string name="error_closed_source">Closed source</string>
<string name="error_no_file">File does not exist</string>
@ -123,7 +97,6 @@
<!-- Query strings -->
<string name="selected_items_count_query">%1$s selected</string>
<string name="update_query">Update %1$s</string>
<string name="color_preset_query">Preset %1$s</string>
<string name="color_preset_selected_query">Selected «%1$s»</string>
@ -207,8 +180,6 @@
<string name="absolute_dark_option_desc">Change background color to be completely black</string>
<string name="theme_contrast_option">Theme contrast</string>
<string name="app_theme_option">App theme</string>
<string name="check_for_updates_option">Check for updates</string>
<string name="check_for_updates_option_desc">Check for newer app version on startup</string>
<string name="double_press_exit_option">Double back press to exit</string>
<string name="double_press_exit_option_desc">Press back twice to exit the app</string>
@ -377,7 +348,6 @@
<string name="book_moved">This book was successfully moved.</string>
<string name="copied">Copied</string>
<string name="history_deleted">History was successfully deleted.</string>
<string name="no_updates">The latest version of the app is already installed.</string>
<string name="cover_reset">Cover image was successfully reset.</string>
<string name="title_changed">Title was successfully changed.</string>
<string name="author_changed">Author was successfully changed.</string>
@ -403,7 +373,6 @@
<!-- About -->
<string name="app_version_option">App version</string>
<string name="app_version_option_desc_1">Book\'s Story v%1$s</string>
<string name="app_version_option_desc_2">Click to check for updates</string>
<string name="report_bug_option">Report a bug</string>
<string name="whats_new_option">What\'s new</string>
<string name="licenses_option">Open source licenses</string>
@ -580,8 +549,6 @@
<string name="start_permissions_granted">Granted</string>
<string name="start_permissions_storage">Storage permission</string>
<string name="start_permissions_storage_desc">Required to scan your device and find books</string>
<string name="start_permissions_notifications">Notifications permission</string>
<string name="start_permissions_notifications_desc">Required to check for newer app version</string>
<string name="start_done">Everything\'s done!</string>
<string name="start_done_desc">
You\'re successfully done basic setting of the app.