diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index ec9393b3a7..1e51fb58b9 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -1,7 +1,5 @@ - - + \ No newline at end of file diff --git a/.idea/inspectionProfiles/kiwixAndroidInspections.xml b/.idea/inspectionProfiles/kiwixAndroidInspections.xml index ab42fb636f..1e14387f43 100644 --- a/.idea/inspectionProfiles/kiwixAndroidInspections.xml +++ b/.idea/inspectionProfiles/kiwixAndroidInspections.xml @@ -51,7 +51,6 @@ - @@ -93,7 +92,6 @@ - @@ -135,7 +133,6 @@ - @@ -215,7 +212,6 @@ - @@ -229,6 +225,18 @@ + + + + + + + + @@ -262,6 +270,18 @@ + + + + + + + + @@ -303,6 +323,24 @@ + + + + + + + + + + + + @@ -407,4 +445,4 @@ - + \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index eb0ec5e9f4..9160aa8e6c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,6 +11,8 @@ import javax.xml.transform.stream.StreamResult plugins { android id("com.github.triplet.play") version Versions.com_github_triplet_play_gradle_plugin + id("org.jetbrains.kotlin.android") + id("org.jetbrains.kotlin.plugin.compose") version "2.1.0" } if (hasProperty("testingMinimizedBuild")) { apply(plugin = "com.slack.keeper") @@ -108,6 +110,13 @@ android { // is analyzed to provide actionable feedback on potential issues with dependencies. includeInBundle = true } + + buildFeatures { + compose = true + } + composeOptions { + kotlinCompilerExtensionVersion = "1.5.15" + } } play { @@ -129,6 +138,23 @@ androidComponents { dependencies { androidTestImplementation(Libs.leakcanary_android_instrumentation) testImplementation(Libs.kotlinx_coroutines_test) + + implementation("androidx.compose.material3:material3-android:1.3.1") + implementation("androidx.activity:activity-compose:1.9.3") + + implementation("androidx.compose.ui:ui:1.7.6") + implementation("androidx.compose.material:material:1.7.6") + + implementation(platform("androidx.compose:compose-bom:2024.12.01")) + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.compose.material:material") + implementation("androidx.compose.runtime:runtime-livedata") + implementation("androidx.compose.runtime:runtime-rxjava2") + + // For testing + androidTestImplementation("androidx.compose.ui:ui-test-junit4:1.7.6") + debugImplementation("androidx.compose.ui:ui-tooling") } task("generateVersionCodeAndName") { val file = File("VERSION_INFO") diff --git a/app/src/main/java/org/kiwix/kiwixmobile/help/KiwixHelpFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/help/KiwixHelpFragment.kt index 62e467caea..0e25ec802a 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/help/KiwixHelpFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/help/KiwixHelpFragment.kt @@ -18,25 +18,77 @@ package org.kiwix.kiwixmobile.help -import org.kiwix.kiwixmobile.core.R -import org.kiwix.kiwixmobile.core.help.HelpFragment +import android.content.Context +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.compose.ui.platform.ComposeView +import androidx.fragment.app.Fragment +import androidx.navigation.NavController +import androidx.navigation.Navigation +import org.kiwix.kiwixmobile.R +import org.kiwix.kiwixmobile.core.help.HelpScreen +import org.kiwix.kiwixmobile.core.help.HelpScreenItemDataClass +import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil -class KiwixHelpFragment : HelpFragment() { - override fun rawTitleDescriptionMap() = - if (sharedPreferenceUtil.isPlayStoreBuildWithAndroid11OrAbove()) { +open class KiwixHelpFragment : Fragment() { + private lateinit var navController: NavController + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + val context = requireContext() + val sharedPrefUtil = SharedPreferenceUtil(context) + + val rawData = if (sharedPrefUtil.isPlayStoreBuildWithAndroid11OrAbove()) { listOf( - R.string.help_2 to R.array.description_help_2, - R.string.help_5 to R.array.description_help_5, - R.string.how_to_update_content to R.array.update_content_description, - R.string.why_copy_move_files_to_app_directory to getString( - R.string.copy_move_files_to_app_directory_description + org.kiwix.kiwixmobile.core.R.string.help_2 to org.kiwix.kiwixmobile.core.R.array + .description_help_2, + org.kiwix.kiwixmobile.core.R.string.help_5 to org.kiwix.kiwixmobile.core.R.array + .description_help_5, + org.kiwix.kiwixmobile.core.R.string.how_to_update_content to org.kiwix.kiwixmobile + .core.R.array.update_content_description, + org.kiwix.kiwixmobile.core.R.string.why_copy_move_files_to_app_directory to getString( + org.kiwix.kiwixmobile.core.R.string.copy_move_files_to_app_directory_description ) ) } else { listOf( - R.string.help_2 to R.array.description_help_2, - R.string.help_5 to R.array.description_help_5, - R.string.how_to_update_content to R.array.update_content_description + org.kiwix.kiwixmobile.core.R.string.help_2 to org.kiwix.kiwixmobile.core.R.array + .description_help_2, + org.kiwix.kiwixmobile.core.R.string.help_5 to org.kiwix.kiwixmobile.core.R.array + .description_help_5, + org.kiwix.kiwixmobile.core.R.string.how_to_update_content to org.kiwix.kiwixmobile + .core.R.array.update_content_description ) } + + val helpScreenData: List = transformToHelpScreenData(context, rawData) + navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment) + + return ComposeView(requireContext()).apply { + setContent { + HelpScreen(data = helpScreenData, navController = navController) + } + } + } +} + +fun transformToHelpScreenData( + context: Context, + rawTitleDescriptionMap: List> +): List { + return rawTitleDescriptionMap.map { (titleResId, description) -> + val title = context.getString(titleResId) + val descriptionValue = when (description) { + is String -> description + is Int -> context.resources.getStringArray(description).joinToString(separator = "\n") + else -> { + throw IllegalArgumentException("Invalid description resource type for title: $titleResId") + } + } + HelpScreenItemDataClass(title, descriptionValue) + } } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 20216805f3..e72bfc5c5f 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -13,6 +13,8 @@ buildscript { } plugins { `android-library` + id("org.jetbrains.kotlin.android") + id("org.jetbrains.kotlin.plugin.compose") version "2.1.0" } plugins.apply(KiwixConfigurationPlugin::class) apply(plugin = "io.objectbox") @@ -26,6 +28,12 @@ android { isMinifyEnabled = false } } + buildFeatures { + compose = true + } + composeOptions { + kotlinCompilerExtensionVersion = "1.5.15" + } } fun shouldUseLocalVersion() = File(projectDir, "libs").exists() @@ -63,4 +71,22 @@ dependencies { implementation(Libs.kotlinx_coroutines_android) implementation(Libs.kotlinx_coroutines_rx3) implementation(Libs.zxing) + +// Compose ans Material3 Dependencies + implementation("androidx.compose.material3:material3-android:1.3.1") + implementation("androidx.activity:activity-compose:1.9.3") + + implementation("androidx.compose.ui:ui:1.7.6") + implementation("androidx.compose.material:material:1.7.6") + + implementation(platform("androidx.compose:compose-bom:2024.12.01")) + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.compose.material:material") + implementation("androidx.compose.runtime:runtime-livedata") + implementation("androidx.compose.runtime:runtime-rxjava2") + + // For testing + androidTestImplementation("androidx.compose.ui:ui-test-junit4:1.7.6") + debugImplementation("androidx.compose.ui:ui-tooling") } diff --git a/core/objectbox-models/default.json b/core/objectbox-models/default.json index ceb473092b..5e076bed5f 100644 --- a/core/objectbox-models/default.json +++ b/core/objectbox-models/default.json @@ -2,7 +2,6 @@ "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.", "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.", "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.", - "_note4": "The IDs of the entities and properties should not be changed unless there is a change in the corresponding entity.", "entities": [ { "id": "3:5536749840871435068", @@ -403,4 +402,4 @@ ], "retiredRelationUids": [], "version": 1 -} +} \ No newline at end of file diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/help/HelpItem.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/help/HelpItem.kt new file mode 100644 index 0000000000..1a555b2dc6 --- /dev/null +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/help/HelpItem.kt @@ -0,0 +1,163 @@ +/* + * Kiwix Android + * Copyright (c) 2025 Kiwix + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package org.kiwix.kiwixmobile.core.help + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.tween +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.KeyboardArrowDown +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp + +/* +Added the Values Here because of Linter configured according to XML Project +and the Composable names are in Camel case for the linter rules needed to be changed to Capital +*/ + +private val Padding_Top = 12.dp +private val Padding_Bottom = 8.dp +private val Padding_Horizontal = 16.dp +private const val ARROW_ANIMATION_DURATION = 300 +private val Ico_Size = 46.dp +private val TitleFontSize = 18.sp +private val DescriptionFontSize = 16.sp +private const val ANIMATION_END = 180f +private const val ANIMATION_START = 0f + +@Composable +fun HelpItem( + modifier: Modifier = Modifier, + data: HelpScreenItemDataClass, + initiallyOpened: Boolean = false +) { + var isOpen by remember { mutableStateOf(initiallyOpened) } + val isDarkTheme = isSystemInDarkTheme() + val itemColor = if (isDarkTheme) Color.White else Color.Black + val arrowRotation by + animateFloatAsState( + targetValue = if (isOpen) ANIMATION_END else ANIMATION_START, + animationSpec = tween(ARROW_ANIMATION_DURATION), + label = "arrowRotation" + ) + val interactionSource = remember(::MutableInteractionSource) + Column( + modifier = modifier + .fillMaxWidth() + .padding(top = Padding_Top), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + TopHeader( + headerData = HeaderData( + title = data.title, + arrowRotation = arrowRotation, + itemColor = itemColor + ), + interactionSource = interactionSource, + onClick = { + isOpen = !isOpen + } + ) + Spacer(modifier = Modifier.height(Padding_Top)) + AnimatedVisibility(visible = isOpen) { + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = Padding_Horizontal) + ) { + Text( + text = data.description, + fontSize = DescriptionFontSize, + textAlign = TextAlign.Left, + color = itemColor, + modifier = Modifier.padding(bottom = Padding_Bottom) + ) + } + } + } +} + +@Composable +fun TopHeader( + modifier: Modifier = Modifier, + headerData: HeaderData, + interactionSource: MutableInteractionSource, + onClick: () -> Unit +) { + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + modifier = modifier + .fillMaxWidth() + .clickable( + interactionSource = interactionSource, + indication = null, + onClick = onClick + ) + .padding(horizontal = 16.dp) + ) { + Text( + text = headerData.title, + fontSize = TitleFontSize, + color = headerData.itemColor, + fontWeight = FontWeight.SemiBold + ) + Icon( + imageVector = Icons.Default.KeyboardArrowDown, + contentDescription = "Open or Close DropDown", + modifier = Modifier + .graphicsLayer { rotationZ = headerData.arrowRotation } + .size(Ico_Size), + tint = headerData.itemColor + ) + } +} + +data class HeaderData( + val title: String, + val arrowRotation: Float, + val itemColor: Color +) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/help/HelpScreen.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/help/HelpScreen.kt new file mode 100644 index 0000000000..a180061325 --- /dev/null +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/help/HelpScreen.kt @@ -0,0 +1,168 @@ +/* + * Kiwix Android + * Copyright (c) 2025 Kiwix + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package org.kiwix.kiwixmobile.core.help + +import android.app.Activity +import android.content.Context +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment + +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp + +import androidx.navigation.NavController +import org.kiwix.kiwixmobile.core.R +import org.kiwix.kiwixmobile.core.error.DiagnosticReportActivity +import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.start + +@Composable +fun HelpScreen( + modifier: Modifier = Modifier, + data: List, + navController: NavController +) { + val context = LocalContext.current + val isDarkTheme = isSystemInDarkTheme() + val backgroundColor = getBackgroundColor(isDarkTheme) + val dividerColor = getDividerColor(isDarkTheme) + + Scaffold( + modifier = Modifier.fillMaxSize(), + topBar = { HelpScreenTopBar(modifier, navController) }, + containerColor = backgroundColor + ) { paddingValues -> + Column( + modifier = Modifier + .padding(paddingValues) + ) { + DiagnosticDataRow(context, isDarkTheme) + HelpItemList(data, dividerColor) + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun HelpScreenTopBar(modifier: Modifier, navController: NavController) { + TopAppBar( + title = { + Text( + modifier = modifier.padding(start = 16.dp), + text = stringResource(id = R.string.menu_help), + color = Color.White + ) + }, + navigationIcon = { + IconButton(onClick = navController::popBackStack) { + Icon( + imageVector = Icons.Filled.ArrowBack, + contentDescription = "Back", + tint = Color.White + ) + } + }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = Color.Black + ) + ) +} + +@Composable +private fun DiagnosticDataRow(context: Context, isDarkTheme: Boolean) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { + (context as? Activity)?.start() + }, + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Start + ) { + Image( + painter = painterResource(R.drawable.ic_feedback_orange_24dp), + contentDescription = "Feedback", + modifier = Modifier + .padding(16.dp) + ) + Text( + text = "Send Diagnostic Data", + color = if (isDarkTheme) Color.LightGray else Color.DarkGray, + fontSize = 18.sp + ) + } +} + +@Composable +private fun HelpItemList(data: List, dividerColor: Color) { + LazyColumn( + modifier = Modifier + .fillMaxWidth() + ) { + itemsIndexed(data, key = { _, item -> item.title }) { _, item -> + HorizontalDivider( + color = dividerColor + ) + HelpItem(data = item) + } + item { + HorizontalDivider( + color = dividerColor + ) + } + } +} + +@Composable +private fun getBackgroundColor(isDarkTheme: Boolean): Color = + if (isDarkTheme) colorResource(id = R.color.mine_shaft_gray900) else Color.White + +@Composable +private fun getDividerColor(isDarkTheme: Boolean): Color { + return if (isDarkTheme) colorResource(id = R.color.mine_shaft_gray600) else colorResource( + id = R.color.mine_shaft_gray350 + ) +} diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/help/HelpScreenItemDataClass.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/help/HelpScreenItemDataClass.kt new file mode 100644 index 0000000000..6f62e51ec1 --- /dev/null +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/help/HelpScreenItemDataClass.kt @@ -0,0 +1,22 @@ +/* + * Kiwix Android + * Copyright (c) 2025 Kiwix + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package org.kiwix.kiwixmobile.core.help + +// same as HelpItem data class in HelpAdapter.kt +data class HelpScreenItemDataClass(val title: String, val description: String) diff --git a/core/src/main/res/values-b+be+tarask+old/strings.xml b/core/src/main/res/values-b+be+tarask+old/strings.xml index f7b21eb9f4..c5ad44d637 100644 --- a/core/src/main/res/values-b+be+tarask+old/strings.xml +++ b/core/src/main/res/values-b+be+tarask+old/strings.xml @@ -1,8 +1,4 @@ - Дапамога Галоўная @@ -15,28 +11,39 @@ Чытаць уголас Спыніць чытаньне ўголас Падтрымаць Kiwix + Падтрымка %s + Пра праграму %s Пункт доступу WiFi Захаваць мэдыя Узьнікла памылка пры захаваньні мэдыяфайлу! Мэдыя-файл захаваны як %s у Downloads/org.kiwix…/ + Пошук + Пошукавы сьпіс Абярыце файл зьместу (*.zim) Адкрыць спасылку ў новай укладцы? + Сэрвісны канал пункту досягу + Не атрымалася запусьціць пункт досягу Падобна, што ваш пункт доступу ўжо ўключаны. Каб працягнуць, адключыце пункт доступу вай-фай. Перайсьці да наладаў вай-фаю + У падключэньні адмоўлена. + Пункт досягу працуе Немагчыма запусьціць сэрвэр. Калі ласка, уключыце ваш пункт доступу Немагчыма запусьціць сэрвэр. + Дэталі вашага лякальнага пункту досягу. \nSSID: %1$s \nСпокліч: %2$s Памылка: абраны ZIM-файл ня знойдзены. Памылка: абраны файл не зьяўляецца слушным ZIM-файлам. Памылка: загрузка артыкула (Url: %1$s) не атрымалася. Інфармацыя Вэрсія - Начны рэжым - Паказваць артыкулы ў інвэртаваных колерах + Цёмны рэжым + Паказваць артыкулы ў інвэртаваных колерах Вярнуцца ўгару Паказваць кнопку ў канцы старонкі для пракручваньня ўверх Мова Абярыце мову - Мова гэтай старонкі не падтрымліваецца або адпаведныя зьвесткі мовы не былі ўсталяваныя. Артыкул можа быць няправільна прачытаны. + Удзельнікі й ліцэнзіі + Стваральнікі + Мова гэтай старонкі не падтрымліваецца. Артыкул можа быць няправільна прачытаны. Ня знойдзеныя ўсталяваныя праграмы для гэтага тыпу файлу Ня знойдзеныя загалоўкі зьместу Каб атрымаць доступ да зьместу оф-лайн, нам трэба мець доступ да вашага сховішча @@ -44,10 +51,16 @@ Выдаліць гэты элемэнт? Уся гісторыя ачышчаная Ачысьціць усю гісторыю? + Падзяліцца файламі ZIM з: Выдаліць + Скасаваць Нядаўні пошук выдалены + Каб убачыць зьмест артыкулу, можаце прагарнуць улева Зразумела Ці ведалі вы? + Скасаваць + Закладка закрытая + Закладкі закрытыя Закладка дададзеная Калі ласка, ацаніце нас Ацаніць! @@ -57,19 +70,28 @@ Адкрыць новую ўкладку на фоне Пры адкрыцьці новай укладкі, яна будзе адкрытая на заднім пляне Дадаткова + Пошук у Kiwix Прылада + Анляйн + Бібліятэка Што робіць Kiwix? + Хоць Kiwix першапачаткова быў распрацаваны для афляйнавай падтрымкі Вікіпэдыі, але можа чытаць іншыя віды зьместу. Дзе зьмест? Выбачайце, мы не змаглі выдаліць некаторыя файлы. Паспрабуйце скарыстацца файлавым кіраўніком. Спыніць загрузку? Вы ўпэўненыя, што хочаце спыніць гэтую загрузку? + Няўдалая спроба ініцыялізацыі Чытаньня ўслых. Калі ласка, паспрабуйце яшчэ раз + засталося + Сёньня + Учора + Папярэджваць падчас уводу вонкавых спасылак Вы ўводзіце вонкавую спасылку. Гэта можа прывесьці да зьняцьця грошай мабільным апэратарам ці проста не спрацаваць, калі вы знаходзіцеся ў офлайне. Хочаце працягнуць? Болей не пытаць Выбраныя мовы: Іншыя мовы: Падобна, што мы паламаліся.\n\nЦі можаце дапамагчы нам выправіць гэтую праблему, адаслаўшы наступную інфармацыю? Вашыя моўныя налады - Сьпіс вашых zim-файлаў + Сьпіс вашых ZIM-файлаў Падрабязнасьці аварыі Журналы праграмы Падрабязнасьці прылады diff --git a/core/src/main/res/values-b+be+tarask/strings.xml b/core/src/main/res/values-b+be+tarask/strings.xml deleted file mode 100644 index 92be3a5967..0000000000 --- a/core/src/main/res/values-b+be+tarask/strings.xml +++ /dev/null @@ -1,114 +0,0 @@ - - - - Дапамога - Галоўная - Налады - Знайсьці на старонцы - Закладкі - Выпадковы артыкул - На ўвесь экран - Выйсьці з рэжыму поўнага экрану - Чытаць уголас - Спыніць чытаньне ўголас - Падтрымаць Kiwix - Падтрымка %s - Пра праграму %s - Пункт доступу WiFi - Захаваць мэдыя - Узьнікла памылка пры захаваньні мэдыяфайлу! - Мэдыя-файл захаваны як %s у Downloads/org.kiwix…/ - Пошук - Пошукавы сьпіс - Абярыце файл зьместу (*.zim) - Адкрыць спасылку ў новай укладцы? - Сэрвісны канал пункту досягу - Не атрымалася запусьціць пункт досягу - Падобна, што ваш пункт доступу ўжо ўключаны. Каб працягнуць, адключыце пункт доступу вай-фай. - Перайсьці да наладаў вай-фаю - У падключэньні адмоўлена. - Пункт досягу працуе - Немагчыма запусьціць сэрвэр. Калі ласка, уключыце ваш пункт доступу - Немагчыма запусьціць сэрвэр. - Дэталі вашага лякальнага пункту досягу. \nSSID: %1$s \nСпокліч: %2$s - Памылка: абраны ZIM-файл ня знойдзены. - Памылка: абраны файл не зьяўляецца слушным ZIM-файлам. - Памылка: загрузка артыкула (Url: %1$s) не атрымалася. - Інфармацыя - Вэрсія - Цёмны рэжым - Паказваць артыкулы ў інвэртаваных колерах - Вярнуцца ўгару - Паказваць кнопку ў канцы старонкі для пракручваньня ўверх - Мова - Абярыце мову - Удзельнікі й ліцэнзіі - Стваральнікі - Мова гэтай старонкі не падтрымліваецца. Артыкул можа быць няправільна прачытаны. - Ня знойдзеныя ўсталяваныя праграмы для гэтага тыпу файлу - Ня знойдзеныя загалоўкі зьместу - Каб атрымаць доступ да зьместу оф-лайн, нам трэба мець доступ да вашага сховішча - Вы сапраўды хочаце выдаліць гісторыю пошуку і скінуць усе актыўныя закладкі? - Выдаліць гэты элемэнт? - Уся гісторыя ачышчаная - Ачысьціць усю гісторыю? - Падзяліцца файламі ZIM з: - Выдаліць - Скасаваць - Нядаўні пошук выдалены - Каб убачыць зьмест артыкулу, можаце прагарнуць улева - Зразумела - Ці ведалі вы? - Скасаваць - Закладка закрытая - Закладкі закрытыя - Закладка дададзеная - Калі ласка, ацаніце нас - Ацаніць! - Не, дзякуй - Пазьней - Закладка выдаленая - Адкрыць новую ўкладку на фоне - Пры адкрыцьці новай укладкі, яна будзе адкрытая на заднім пляне - Дадаткова - Пошук у Kiwix - Прылада - Анляйн - Бібліятэка - Што робіць Kiwix? - Хоць Kiwix першапачаткова быў распрацаваны для афляйнавай падтрымкі Вікіпэдыі, але можа чытаць іншыя віды зьместу. - Дзе зьмест? - Выбачайце, мы не змаглі выдаліць некаторыя файлы. Паспрабуйце скарыстацца файлавым кіраўніком. - Спыніць загрузку? - Вы ўпэўненыя, што хочаце спыніць гэтую загрузку? - Няўдалая спроба ініцыялізацыі Чытаньня ўслых. Калі ласка, паспрабуйце яшчэ раз - засталося - Сёньня - Учора - Папярэджваць падчас уводу вонкавых спасылак - Вы ўводзіце вонкавую спасылку. Гэта можа прывесьці да зьняцьця грошай мабільным апэратарам ці проста не спрацаваць, калі вы знаходзіцеся ў офлайне. Хочаце працягнуць? - Болей не пытаць - Выбраныя мовы: - Іншыя мовы: - Падобна, што мы паламаліся.\n\nЦі можаце дапамагчы нам выправіць гэтую праблему, адаслаўшы наступную інфармацыю? - Вашыя моўныя налады - Сьпіс вашых ZIM-файлаў - Падрабязнасьці аварыі - Журналы праграмы - Падрабязнасьці прылады - Скарот недаступны - Новая ўкладка - Атрымаць зьмест - Любімая іконка - %s артыкулаў - Пачаць - Скачвайце кнігі - Веды чалавецтва ў вашым тэлефоне. - Вітаем у сям’і - Нататкамі нельга карыстацца бяз доступу да сховішча - Android вымагае лякальнага дазволу на доступ праграмы да вызначэньня прыладаў - Няма закладак -