diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index ec88dfc8f..ad03fb40a 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -15,7 +15,7 @@ jobs: coverageReport: strategy: matrix: - api-level: [21, 29] + api-level: [21, 21] fail-fast: false runs-on: macOS-latest steps: diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index cce791c36..7928f4b6d 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -10,7 +10,7 @@ jobs: instrumentation_tests: strategy: matrix: - api-level: [21, 22, 23, 24, 25, 27, 28, 29] + api-level: [21, 22, 23, 24, 25, 27, 28] fail-fast: false runs-on: macOS-latest steps: diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml new file mode 100644 index 000000000..b1bd93d1a --- /dev/null +++ b/app/src/main/res/values-cs/strings.xml @@ -0,0 +1,9 @@ + + + + Váš souborový systém nepodporuje soubory větší než 4GB + Zjišťování, zda souborový systém dokáže vytvořit 4GB soubory + Nepodařilo se otevřít soubor\nZkuste prosím tento soubor vyhledat na kartě Zařízení ve Vaší knihovně + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml new file mode 100644 index 000000000..e1a1b2c0e --- /dev/null +++ b/app/src/main/res/values-ru/strings.xml @@ -0,0 +1,9 @@ + + + + Ваша файловая система не поддерживает файлы больше 4GB + Проверка, поддерживает ли файловая система файлы больше 4GB + Невозможно открыть файл\nПожалуйста, попытайтесь найти этот файл во вкладке \“Устройство\” в вашей библиотеке + diff --git a/core/detekt_baseline.xml b/core/detekt_baseline.xml index 043c9f0fa..b277f6610 100644 --- a/core/detekt_baseline.xml +++ b/core/detekt_baseline.xml @@ -11,6 +11,7 @@ MagicNumber:CoreSplashActivity.kt$CoreSplashActivity$10 MagicNumber:DownloadItem.kt$DownloadItem$1000L MagicNumber:DownloaderModule.kt$DownloaderModule$5 + MagicNumber:FetchDownloadNotificationManager.kt$FetchDownloadNotificationManager$100 MagicNumber:FetchDownloadRequester.kt$10 MagicNumber:FileUtils.kt$FileUtils$3 MagicNumber:JNIInitialiser.kt$JNIInitialiser$1024 diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/StorageObserver.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/StorageObserver.kt index fb50615fd..a92a178aa 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/StorageObserver.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/StorageObserver.kt @@ -49,5 +49,6 @@ class StorageObserver @Inject constructor( downloads.firstOrNull { file.absolutePath.endsWith(it.fileNameFromUrl) } == null private fun convertToBookOnDisk(file: File) = - zimReaderFactory.create(file)?.let { BookOnDisk(file, it) } + zimReaderFactory.create(file) + ?.let { zimFileReader -> BookOnDisk(file, zimFileReader).also { zimFileReader.dispose() } } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadNotificationManager.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadNotificationManager.kt index 22cd1eff2..0a710eee0 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadNotificationManager.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadNotificationManager.kt @@ -30,6 +30,7 @@ import androidx.core.app.NotificationCompat import com.tonyodev.fetch2.DefaultFetchNotificationManager import com.tonyodev.fetch2.DownloadNotification import com.tonyodev.fetch2.Fetch +import com.tonyodev.fetch2.util.DEFAULT_NOTIFICATION_TIMEOUT_AFTER_RESET import org.kiwix.kiwixmobile.core.Intents import org.kiwix.kiwixmobile.core.R import org.kiwix.kiwixmobile.core.R.string @@ -58,7 +59,59 @@ class FetchDownloadNotificationManager(context: Context) : downloadNotification: DownloadNotification, context: Context ) { - super.updateNotification(notificationBuilder, downloadNotification, context) + // super method but with pause button removed + val smallIcon = if (downloadNotification.isDownloading) { + android.R.drawable.stat_sys_download + } else { + android.R.drawable.stat_sys_download_done + } + notificationBuilder.setPriority(NotificationCompat.PRIORITY_DEFAULT) + .setSmallIcon(smallIcon) + .setContentTitle(downloadNotification.title) + .setContentText(getSubtitleText(context, downloadNotification)) + .setOngoing(downloadNotification.isOnGoingNotification) + .setGroup(downloadNotification.groupId.toString()) + .setGroupSummary(false) + if (downloadNotification.isFailed || downloadNotification.isCompleted) { + notificationBuilder.setProgress(0, 0, false) + } else { + val progressIndeterminate = downloadNotification.progressIndeterminate + val maxProgress = if (downloadNotification.progressIndeterminate) 0 else 100 + val progress = if (downloadNotification.progress < 0) 0 else downloadNotification.progress + notificationBuilder.setProgress(maxProgress, progress, progressIndeterminate) + } + when { + downloadNotification.isDownloading -> + notificationBuilder.setTimeoutAfter(getNotificationTimeOutMillis()) + .addAction( + R.drawable.fetch_notification_cancel, + context.getString(R.string.fetch_notification_download_cancel), + getActionPendingIntent(downloadNotification, DownloadNotification.ActionType.CANCEL) + ) + downloadNotification.isPaused -> + notificationBuilder.setTimeoutAfter(getNotificationTimeOutMillis()) + .addAction( + R.drawable.fetch_notification_resume, + context.getString(R.string.fetch_notification_download_resume), + getActionPendingIntent(downloadNotification, DownloadNotification.ActionType.RESUME) + ) + .addAction( + R.drawable.fetch_notification_cancel, + context.getString(R.string.fetch_notification_download_cancel), + getActionPendingIntent(downloadNotification, DownloadNotification.ActionType.CANCEL) + ) + downloadNotification.isQueued -> + notificationBuilder.setTimeoutAfter(getNotificationTimeOutMillis()) + else -> notificationBuilder.setTimeoutAfter(DEFAULT_NOTIFICATION_TIMEOUT_AFTER_RESET) + } + notificationCustomisation(downloadNotification, notificationBuilder, context) + } + + private fun notificationCustomisation( + downloadNotification: DownloadNotification, + notificationBuilder: NotificationCompat.Builder, + context: Context + ) { if (downloadNotification.isCompleted) { val internal = Intents.internal(CoreMainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/DeleteBookmarkItems.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/DeleteBookmarkItems.kt index 4c676bfc4..239b58d7c 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/DeleteBookmarkItems.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/DeleteBookmarkItems.kt @@ -35,6 +35,7 @@ data class DeleteBookmarkItems( override fun invokeWith(activity: AppCompatActivity) { if (state.isInSelectionState) { bookmarksDao.deleteBookmarks(state.pageItems.filter(BookmarkItem::isSelected)) + effects.offer(ShowToast(R.string.selected_bookmarks_cleared)) } else { bookmarksDao.deleteBookmarks(state.pageItems) effects.offer(ShowToast(R.string.all_bookmarks_cleared)) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/ShowDeleteBookmarksDialog.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/ShowDeleteBookmarksDialog.kt index 86f1405ee..50e705f51 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/ShowDeleteBookmarksDialog.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/ShowDeleteBookmarksDialog.kt @@ -25,7 +25,8 @@ import org.kiwix.kiwixmobile.core.dao.NewBookmarksDao import org.kiwix.kiwixmobile.core.page.bookmark.BookmarksActivity import org.kiwix.kiwixmobile.core.page.bookmark.viewmodel.BookmarkState import org.kiwix.kiwixmobile.core.utils.DialogShower -import org.kiwix.kiwixmobile.core.utils.KiwixDialog.DeleteBookmarks +import org.kiwix.kiwixmobile.core.utils.KiwixDialog.DeleteAllBookmarks +import org.kiwix.kiwixmobile.core.utils.KiwixDialog.DeleteSelectedBookmarks import javax.inject.Inject data class ShowDeleteBookmarksDialog( @@ -36,8 +37,7 @@ data class ShowDeleteBookmarksDialog( @Inject lateinit var dialogShower: DialogShower override fun invokeWith(activity: AppCompatActivity) { (activity as BookmarksActivity).activityComponent.inject(this) - dialogShower.show(DeleteBookmarks, { - effects.offer(DeleteBookmarkItems(effects, state, bookmarksDao)) - }) + dialogShower.show(if (state.isInSelectionState) DeleteSelectedBookmarks else DeleteAllBookmarks, + { effects.offer(DeleteBookmarkItems(effects, state, bookmarksDao)) }) } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/effects/ShowDeleteHistoryDialog.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/effects/ShowDeleteHistoryDialog.kt index 1e3c9194f..406a67dff 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/effects/ShowDeleteHistoryDialog.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/effects/ShowDeleteHistoryDialog.kt @@ -26,6 +26,7 @@ import org.kiwix.kiwixmobile.core.page.history.HistoryActivity import org.kiwix.kiwixmobile.core.page.history.viewmodel.HistoryState import org.kiwix.kiwixmobile.core.utils.DialogShower import org.kiwix.kiwixmobile.core.utils.KiwixDialog.DeleteAllHistory +import org.kiwix.kiwixmobile.core.utils.KiwixDialog.DeleteSelectedHistory import javax.inject.Inject data class ShowDeleteHistoryDialog( @@ -36,7 +37,7 @@ data class ShowDeleteHistoryDialog( @Inject lateinit var dialogShower: DialogShower override fun invokeWith(activity: AppCompatActivity) { (activity as HistoryActivity).activityComponent.inject(this) - dialogShower.show(DeleteAllHistory, { + dialogShower.show(if (state.isInSelectionState) DeleteSelectedHistory else DeleteAllHistory, { effects.offer(DeleteHistoryItems(state, historyDao)) }) } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimFileReader.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimFileReader.kt index da97d7837..6dff00b23 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimFileReader.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimFileReader.kt @@ -224,6 +224,10 @@ class ZimFileReader constructor( tags = this@ZimFileReader.tags } + fun dispose() { + jniKiwixReader.dispose() + } + companion object { /* * these uris aren't actually nullable but unit tests fail to compile as diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimReaderContainer.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimReaderContainer.kt index c550a94e7..5b47c52a6 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimReaderContainer.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimReaderContainer.kt @@ -18,7 +18,6 @@ package org.kiwix.kiwixmobile.core.reader import android.webkit.WebResourceResponse -import org.kiwix.kiwixlib.JNIKiwixSearcher import org.kiwix.kiwixmobile.core.reader.ZimFileReader.Factory import java.io.File import javax.inject.Inject @@ -26,17 +25,12 @@ import javax.inject.Singleton @Singleton class ZimReaderContainer @Inject constructor( - private val zimFileReaderFactory: Factory, - private val jniKiwixSearcher: JNIKiwixSearcher? + private val zimFileReaderFactory: Factory ) { - private val listOfAddedReaderIds = mutableListOf() var zimFileReader: ZimFileReader? = null set(value) { + field?.dispose() field = value - if (value != null && !listOfAddedReaderIds.contains(value.id)) { - listOfAddedReaderIds.add(value.id) - jniKiwixSearcher?.addKiwixReader(value.jniKiwixReader) - } } fun setZimFile(file: File?) { @@ -48,19 +42,9 @@ class ZimReaderContainer @Inject constructor( else null } - fun searchSuggestions(prefix: String, count: Int) = - zimFileReader?.searchSuggestions(prefix, count) ?: false - - fun getNextSuggestion() = zimFileReader?.getNextSuggestion() - fun getPageUrlFromTitle(title: String) = zimFileReader?.getPageUrlFrom(title) fun getRandomArticleUrl() = zimFileReader?.getRandomArticleUrl() - fun search(query: String, count: Int) { - jniKiwixSearcher?.search(query, count) - } - - fun getNextResult() = jniKiwixSearcher?.nextResult?.let { SearchResult(it.title) } fun isRedirect(url: String): Boolean = zimFileReader?.isRedirect(url) == true fun getRedirect(url: String): String = zimFileReader?.getRedirect(url) ?: "" fun load(url: String) = diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchResultGenerator.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchResultGenerator.kt index 7bd361cb7..dbf9a59f3 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchResultGenerator.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchResultGenerator.kt @@ -22,7 +22,6 @@ import org.kiwix.kiwixmobile.core.reader.ZimFileReader import org.kiwix.kiwixmobile.core.reader.ZimReaderContainer import org.kiwix.kiwixmobile.core.search.adapter.SearchListItem import org.kiwix.kiwixmobile.core.search.adapter.SearchListItem.ZimSearchResultListItem -import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import javax.inject.Inject interface SearchResultGenerator { @@ -30,7 +29,6 @@ interface SearchResultGenerator { } class ZimSearchResultGenerator @Inject constructor( - private val sharedPreferenceUtil: SharedPreferenceUtil, private val zimReaderContainer: ZimReaderContainer ) : SearchResultGenerator { override fun generateSearchResults(searchTerm: String) = @@ -41,19 +39,12 @@ class ZimSearchResultGenerator @Inject constructor( it: String, reader: ZimFileReader? ) = - if (sharedPreferenceUtil.prefFullTextSearch) - zimReaderContainer.search(it, 200).run { fullTextResults() } - else - reader?.searchSuggestions(it, 200).run { suggestionResults(reader) } - - private fun fullTextResults() = generateSequence { - zimReaderContainer.getNextResult()?.title?.let(::ZimSearchResultListItem) - }.filter { it.value.isNotBlank() } - .toList() + reader?.searchSuggestions(it, 200).run { suggestionResults(reader) } private fun suggestionResults(reader: ZimFileReader?) = generateSequence { reader?.getNextSuggestion()?.let { ZimSearchResultListItem(it.title) } } .distinct() .toList() + .also { reader?.dispose() } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/KiwixDialog.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/KiwixDialog.kt index 42d0b9c56..b1131196c 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/KiwixDialog.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/KiwixDialog.kt @@ -189,7 +189,7 @@ sealed class KiwixDialog( } object DeleteSelectedHistory : KiwixDialog( - R.string.delete_history, + R.string.delete_selected_history, null, positiveMessage = R.string.delete, negativeMessage = R.string.cancel @@ -202,12 +202,19 @@ sealed class KiwixDialog( negativeMessage = R.string.cancel ) - object DeleteBookmarks : KiwixDialog( + object DeleteAllBookmarks : KiwixDialog( R.string.delete_bookmarks, null, positiveMessage = R.string.delete, negativeMessage = R.string.cancel ) + + object DeleteSelectedBookmarks : KiwixDialog( + R.string.delete_selected_bookmarks, + null, + positiveMessage = R.string.delete, + negativeMessage = R.string.cancel + ) } interface HasBodyFormatArgs { diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.java b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.java index ae4bd1859..d4fd58add 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.java +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.java @@ -124,11 +124,6 @@ public class SharedPreferenceUtil { return sharedPreferences.getString(PREF_STORAGE_TITLE, defaultTitle); } - public boolean getPrefFullTextSearch() { - return false; // Temporarily disable multizim for 2.4 - //return sharedPreferences.getBoolean(PREF_FULL_TEXT_SEARCH, false); - } - public void putPrefLanguage(String language) { sharedPreferences.edit().putString(PREF_LANG, language).apply(); } diff --git a/core/src/main/res/values-ar/strings.xml b/core/src/main/res/values-ar/strings.xml index bf94f30ec..40ac7fdea 100644 --- a/core/src/main/res/values-ar/strings.xml +++ b/core/src/main/res/values-ar/strings.xml @@ -261,10 +261,11 @@ لا توجد إشارات مرجعية! لا تاريخ الجهاز الافتراضي - حذف التاريخ؟ - أزل العلامات المرجعية؟ + حذف التاريخ؟ + أزل العلامات المرجعية؟ تشغيل تعطيل تلقائي تفاصيل نظام الملفات + تصفح تجريبي diff --git a/core/src/main/res/values-ast/strings.xml b/core/src/main/res/values-ast/strings.xml index afd7245fd..57da9dfb9 100644 --- a/core/src/main/res/values-ast/strings.xml +++ b/core/src/main/res/values-ast/strings.xml @@ -254,8 +254,8 @@ Nun hai marcadores Nun hai Historial Predeterminao del preséu - ¿Desaniciar l\'Historial? - ¿Desaniciar los Marcadores? + ¿Desaniciar l\'Historial? + ¿Desaniciar los Marcadores? Activáu Desactiváu Auto diff --git a/core/src/main/res/values-b+be+tarask/strings.xml b/core/src/main/res/values-b+be+tarask/strings.xml new file mode 100644 index 000000000..d5ad69ff3 --- /dev/null +++ b/core/src/main/res/values-b+be+tarask/strings.xml @@ -0,0 +1,84 @@ + + + + Дапамога + Галоўная + Налады + Знайсьці на старонцы + Закладкі + Выпадковы артыкул + На ўвесь экран + Выйсьці з рэжыму поўнага экрану + Чытаць уголас + Спыніць чытаньне ўголас + Падтрымаць Kiwix + Узьнікла памылка пры захаваньні мэдыяфайлу! + Мэдыя-файл захаваны як %s у Android/media/org.kiwix…/ + Абярыце файл зьместу (*.zim) + Адкрыць спасылку ў новай укладцы? + Памылка: абраны ZIM-файл ня знойдзены. + Памылка: абраны файл не зьяўляецца слушным ZIM-файлам. + Памылка: загрузка артыкула (Url: %1$s) не атрымалася. + Інфармацыя + Вэрсія + Начны рэжым + Паказваць артыкулы ў інвэртаваных колерах + Вярнуцца ўгару + Паказваць кнопку ў канцы старонкі для пракручваньня ўверх + Мова + Абярыце мову + Мова гэтай старонкі не падтрымліваецца або адпаведныя зьвесткі мовы не былі ўсталяваныя. Артыкул можа быць няправільна прачытаны. + Ня знойдзеныя ўсталяваныя праграмы для гэтага тыпу файлу + Ня знойдзеныя загалоўкі зьместу + Каб атрымаць доступ да зьместу оф-лайн, нам трэба мець доступ да вашага сховішча + Вы сапраўды хочаце выдаліць гісторыю пошуку і скінуць усе актыўныя закладкі? + Выдаліць гэты элемэнт? + Уся гісторыя ачышчаная + Ачысьціць усю гісторыю? + Выдаліць + Нядаўні пошук выдалены + Зразумела + Ці ведалі вы? + Закладка дададзеная + Калі ласка, ацаніце нас + Калі вам падабаецца карыстацца + , калі ласка, знайдзіце час, каб ацаніць. Дзякуем за вашую падтрымку! + Ацаніць! + Не, дзякуй + Пазьней + Закладка выдаленая + Адкрыць новую ўкладку на фоне + Пры адкрыцьці новай укладкі, яна будзе адкрытая на заднім пляне + Дадаткова + Прылада + Што робіць Kiwix? + Дзе зьмест? + Выбачайце, мы не змаглі выдаліць некаторыя файлы. Паспрабуйце скарыстацца файлавым кіраўніком. + Спыніць загрузку? + Вы ўпэўненыя, што хочаце спыніць гэтую загрузку? + Вы ўводзіце вонкавую спасылку. Гэта можа прывесьці да зьняцьця грошай мабільным апэратарам ці проста не спрацаваць, калі вы знаходзіцеся ў офлайне. Хочаце працягнуць? + Болей не пытаць + Выбраныя мовы: + Іншыя мовы: + Падобна, што мы паламаліся.\n\nЦі можаце дапамагчы нам выправіць гэтую праблему, адаслаўшы наступную інфармацыю? + Вашыя моўныя налады + Сьпіс вашых zim-файлаў + Падрабязнасьці аварыі + Журналы праграмы + Падрабязнасьці прылады + Скарот недаступны + Новая ўкладка + Атрымаць зьмест + Любімая іконка + %s артыкулаў + Пачаць + Скачвайце кнігі + Веды чалавецтва ў вашым тэлефоне. + Вітаем у сям’і + Нататкамі нельга карыстацца бяз доступу да сховішча + Android вымагае лякальнага дазволу на доступ праграмы да вызначэньня прыладаў + Няма закладак + diff --git a/core/src/main/res/values-ckb/strings.xml b/core/src/main/res/values-ckb/strings.xml index 194827a5b..80c4055e5 100644 --- a/core/src/main/res/values-ckb/strings.xml +++ b/core/src/main/res/values-ckb/strings.xml @@ -1,6 +1,7 @@ + + Hilf + Yystellige + I de Syte finde + Läsezeiche + Zuefälligi Syte + Vollbildschirm + Vollbildmodus beende + Vorläse + Ufhöre vorläse + Kiwix unterstützä + Medie spychere + Bim Spychere vo de Medie isch ä Fähler passiert! + Medie als %s nach Android/media/org.kiwix…/ gspycheret + Sueche + Inhaltedatei (*.zim) uswähle + Bitte zersch Büecher uswähle + Server het nid chönne gschtartät wärde. + Server erfolgriich gschtartät. + Server erfolgriich gschtopped. + Server am Schtartä + Inschtruktionä um Büecher bereit z\'stellä + WIITERMACHE + Server schtartä + Server schtoppe + Fehler: Di usgwählti ZIM-Datei isch nit gfunde worde. + Cha zim Datei nid uftue + Fehler: Di usgwählti Datei isch chei gültigi ZIM-Datei. + Fehler: S\' Lade vom Artikel (URL: %1$s) het nit gchlappt. + Azeig + Information + Version + Nachtmodus + Zeig d\'Artikel mit umcherte Farbe + Zruck nach obe + Zeig e Chnopf am End vo dr Syte zuem uffe rolle + Wärchzüglischte sichtbar bhaute + Sprach + E Sprach uswähle + Das Elemänt löschä? + Verlouf lösche + Ganzä Verlouf glöscht + Ganzä Verlouf lösche? + Teile + ZIM Dateiä teilä mit: + Lösche + Abbräche + Letschti Suech entfärnt + Nach linggs wüsche um dr Inhaut vo däm Artikel aazluege + Verschtande + Scho gwüsst? + Rückgängig machä + Tuä üs bewärte + Bewärte! + Nei danke + Spääter + Ufmache + Äxtras + Kiwix dürsuechä + Grät + Bibliothek + Dateiä erfolgriich glöscht + Hie hets ke Dateiä + Nid gnüegend Spiicherplatz um abezladä. + Verfüegbaare Spiicherplatz: + Eifach + Ke Bilder + Ke Videos + Keni Netzwärkverbindig + Wo isch der Inhaut? + Spiicher + Aktuelle Ordnär + pousiere + wiitermache + schtoppe + Ja + Nei + Abeladä schtoppä? + Nächschti + Vorhärigi + Hüt + Geschter + Nümme fraagä + Zur vorherigä Syte gah + Zur nächschtä Syte gah + Spraach uswähle + Ufklappe + Suechverläuf + %1$d usgwählt + Fertig + Pousiert + Fählgschlage: %s + Spychere + Notiz + Notiz spychere fählgschlage + Notiz erfolgriich glöscht + Notiz isch nid glöscht worde + Notiz gspycheret + Diä Notiz Datei gits nid + Aui Notizä lösche? + Gwüssi Dateiä si nid glöscht worde + Verbindig fählgschlagä + Dateiübertragig abgschlossä + Es isch ä Fähler passiert während dr Übertragig + Fähler bim Übertrage vor Datei %s + Dateiä am Vorbereitä für d\'Übertragig… + Status + Alli Notizä lösche + Numä Texscht + Churzä Texscht + Ke Ergäbnis + Ke Verlouf + Verlouf lösche? + Aa + Uus + %d%% + diff --git a/core/src/main/res/values-it/strings.xml b/core/src/main/res/values-it/strings.xml index 6a064952f..eb8e6e5ab 100644 --- a/core/src/main/res/values-it/strings.xml +++ b/core/src/main/res/values-it/strings.xml @@ -100,6 +100,6 @@ Vai alle impostazioni hotspot Nessun risultato Nessun segnalibro - Cancellare la cronologia? - Cancellare i segnalibri? + Cancellare la cronologia? + Cancellare i segnalibri? diff --git a/core/src/main/res/values-iw/strings.xml b/core/src/main/res/values-iw/strings.xml index a66c565d2..8eeae71c2 100644 --- a/core/src/main/res/values-iw/strings.xml +++ b/core/src/main/res/values-iw/strings.xml @@ -261,8 +261,8 @@ אין סימניות אין היסטוריה ברירת המחדל של המכשיר - למחוק היסטוריה? - למחוק מועדפים? + למחוק היסטוריה? + למחוק מועדפים? מופעל כבוי אוטומטי diff --git a/core/src/main/res/values-ko/strings.xml b/core/src/main/res/values-ko/strings.xml index 15e23eb30..47f7ec12d 100644 --- a/core/src/main/res/values-ko/strings.xml +++ b/core/src/main/res/values-ko/strings.xml @@ -264,8 +264,8 @@ 북마크가 없습니다! 역사 없음 장치 기본값 - 역사를 삭제할까요? - 북마크를 삭제할까요? + 역사를 삭제할까요? + 북마크를 삭제할까요? 켜기 끄기 자동 diff --git a/core/src/main/res/values-lb/strings.xml b/core/src/main/res/values-lb/strings.xml index a5fda61de..3e0f0d404 100644 --- a/core/src/main/res/values-lb/strings.xml +++ b/core/src/main/res/values-lb/strings.xml @@ -114,9 +114,10 @@ Keng Resultater Keng Lieszeechen! Keen Historique - Versioune läschen? - Lieszeeche läschen? + Versioune läschen? + Lieszeeche läschen? Un Aus Automatesch + Experimentell Naavigatioun diff --git a/core/src/main/res/values-mk/strings.xml b/core/src/main/res/values-mk/strings.xml index 285acb546..e02f3522f 100644 --- a/core/src/main/res/values-mk/strings.xml +++ b/core/src/main/res/values-mk/strings.xml @@ -256,8 +256,8 @@ Нема обележувачи Нема историја Основно на уредот - Да ја избришам историјата? - Да ги избришам обележувачите? + Да ја избришам историјата? + Да ги избришам обележувачите? Вкл. Искл. Авто @@ -267,4 +267,5 @@ Испратете ги сите следни поединости за да можеме да го дијагностицираме проблемот %d%% Приближување на текст + Опитен прегледник diff --git a/core/src/main/res/values-ml/strings.xml b/core/src/main/res/values-ml/strings.xml index e3e6d328e..92d32c5a9 100644 --- a/core/src/main/res/values-ml/strings.xml +++ b/core/src/main/res/values-ml/strings.xml @@ -130,5 +130,5 @@ സജ്ജീകരണങ്ങളിലേക്ക് പോവുക ഫലങ്ങൾ ഒന്നുമില്ല നാൾവഴിയില്ല - നാൾവഴി ഒഴിവാക്കട്ടെ? + നാൾവഴി ഒഴിവാക്കട്ടെ? diff --git a/core/src/main/res/values-nl/strings.xml b/core/src/main/res/values-nl/strings.xml index 9895f4794..384680e32 100644 --- a/core/src/main/res/values-nl/strings.xml +++ b/core/src/main/res/values-nl/strings.xml @@ -1,4 +1,13 @@ - + + Hulp Startpagina @@ -11,10 +20,10 @@ Voorlezen Stoppen met voorlezen Media opslaan als… - Er is een fout opgetreden bij het opslaan van de media! - Het bestand is opgeslagen als %1$s in uw afbeeldingenmap + Er is een fout opgetreden bij het opslaan van de media! + Het bestand is opgeslagen als %1$s in uw afbeeldingenmap Zoeken - Selecteer een ZIM inhoudsbestand (*.zim) + Selecteer een ZIM inhoudsbestand (*.zim) Koppeling openen in nieuw tabblad? Fout: het geselecteerde ZIM-bestand kon niet gevonden worden. Fout: het geselecteerde bestand is geen geldig ZIM-bestand. @@ -30,29 +39,68 @@ Taal kiezen De taak van deze pagina wordt niet ondersteund, of de juiste taalgegevens zijn niet geïnstalleerd. De pagina kan niet correct gelezen worden. Kon geen geïnstalleerde applicatie vinden voor dit type bestand - Geen inhoudsheaders gevonden - Om toegang te krijgen tot ZIM-bestanden is toegang tot uw opslag nodig + Geen inhoudsheaders gevonden + Om toegang te krijgen tot ZIM-bestanden is toegang tot uw opslag nodig + Dit item verwijderen? + Verwijderen + Annuleren + Wist u dat? + Ongedaan maken Bladwijzer toegevoegd Beoordeel ons alstublieft Als u geniet van het gebruik van , geef dan even een beoordeling. Dank u wel voor uw steun! Beoordelen! Nee, bedankt + Later Nieuw tabblab in de achtergrond openen Nieuwe tabbladen worden niet actief gemaakt + Apparaat Bibliotheek + Eenvoudig + Geen afbeeldingen Geen video\'s Onze inhoud is ondergebracht op de Kiwix website - - @string/help_3 - @string/help_4 - - - @string/help_6 - @string/help_7 - @string/help_8 - @string/help_9 - @string/help_10 - @string/help_11 - + Opslag + Huidige map + pauzeren + hervatten + Intern + Extern + Ja + Nee + Volgende + Vorige + dag + u + min + s + te gaan + Vandaag + Gisteren + Geselecteerde talen: + Andere talen: + Nieuw tabblad + Aan de slag + Inhoudsopgave + Talen opslaan + Geschiedenis + Zoekgeschiedenis + Alle tabbladen sluiten + In afwachting + In behandeling + Afgerond + Gepauzeerd + Mislukt: %s + Opslaan + Opmerking + Bestandsoverdracht compleet + Uw apparaat: + Alleen text + Geen resultaten + Geen bladwijzers + Geen geschiedenis + Aan + Uit + Automatisch diff --git a/core/src/main/res/values-pl/strings.xml b/core/src/main/res/values-pl/strings.xml index 6999702b4..227e95b45 100644 --- a/core/src/main/res/values-pl/strings.xml +++ b/core/src/main/res/values-pl/strings.xml @@ -266,8 +266,8 @@ Brak zakładek Nie ma Historii Domyślne urządzenie - Usunąć historię? - Usunąć zakładki? + Usunąć historię? + Usunąć zakładki? Włącz Wyłącz Automatycznie diff --git a/core/src/main/res/values-pt-rBR/strings.xml b/core/src/main/res/values-pt-rBR/strings.xml index 62735f474..a8e0cacf3 100644 --- a/core/src/main/res/values-pt-rBR/strings.xml +++ b/core/src/main/res/values-pt-rBR/strings.xml @@ -262,8 +262,8 @@ Sem Favoritos Sem histórico Padrão do dispositivo - Apagar histórico? - Excluir marcadores? + Apagar histórico? + Excluir marcadores? Lig Des Auto @@ -273,4 +273,5 @@ Envie todos os detalhes a seguir para que possamos diagnosticar o problema %d%% Zoom de texto + Navegação experimental diff --git a/core/src/main/res/values-qq/strings.xml b/core/src/main/res/values-qq/strings.xml index 2974d6357..6a604205e 100644 --- a/core/src/main/res/values-qq/strings.xml +++ b/core/src/main/res/values-qq/strings.xml @@ -6,6 +6,7 @@ * Liuxinyu970226 * Robby * Shirayuki +* Stephane * The RedBurn * Verdy p --> @@ -16,6 +17,7 @@ {{Identical|Bookmark}} {{Identical|Random article}} {{Identical|Full screen}} + Il s\'agit de la fonctionnalité hotspot - l\'anglais \"host books\" n\'est pas particulièrement satisfaisant à la base. {{Identical|Search}} Do not change:\n* <code>%1$s</code> (replaced by the “SSID” value identifying the WiFi hotspot identity for users)\n* <code>%2$s</code> (replaced by the password or code configured in the hotspot to authorize the association and network connection) This the title displayed when a user clicks wants to start the server in the host books section @@ -27,6 +29,7 @@ {{Identical|Back to top}} {{Identical|Language}} {{Identical|Choose language}} + Tell the user that the selected bookmarks has been deleted/cleared {{Identical|Delete}} {{identical|Cancel}} {{Identical|Undo}} @@ -46,8 +49,12 @@ {{Identical|Save}} This is used in the start server dialog and leads the user to mobile hotspot settings when pressed This means \"there are no bookmarks\" - This is a menu item that opens the applicaiton in a new experimental mode that uses different navigation. + Ask if the user wants to delete all history items. + Ask if the user wants to delete a number of selected history items. + Ask if the user wants to delete all bookmarks. + Ask if the user wants to delete a number of selected bookmarks. This is used in the settings screen to turn on the night mode. This is used in the settings screen to turn off the night mode. This is used in the settings screen to turn the night mode on or off automatically depending upon the system settings of the phone. + This is a menu item that opens the applicaiton in a new experimental mode that uses different navigation. diff --git a/core/src/main/res/values-ro/strings.xml b/core/src/main/res/values-ro/strings.xml index 31f8bcbcb..1fc517694 100644 --- a/core/src/main/res/values-ro/strings.xml +++ b/core/src/main/res/values-ro/strings.xml @@ -259,8 +259,8 @@ Nici un semn de carte Fără Istorie Dispozitiv prestabilit - Șterge istoricul? - Ștergeți semnele de carte? + Șterge istoricul? + Ștergeți semnele de carte? Pornit Oprit Auto @@ -268,4 +268,6 @@ Detalii Sistem Fișiere Raport Diagnostic Vă rugăm să trimiteți toate următoarele detalii, astfel încât să putem diagnostica problema + %d%% + Mărește text diff --git a/core/src/main/res/values-ru/strings.xml b/core/src/main/res/values-ru/strings.xml index 0fc94dbea..6bc7b1984 100644 --- a/core/src/main/res/values-ru/strings.xml +++ b/core/src/main/res/values-ru/strings.xml @@ -15,6 +15,8 @@ * Okras * Pacha Tchernof * Putnik +* Smavrina +* Teretalexev --> Помощь @@ -24,18 +26,43 @@ Закладки Случайная статья Полный экран - Выйти из режима полного экрана + Выйти из полноэкранного режима Читать вслух Остановить чтение вслух + Поддержать Kiwix + Разместить книги Сохранить Медиа-файлы Произошла ошибка при сохранении медиафайла! Медиафайл сохранён как %s в Android/media/org.kiwix…/ Поиск Выберите файл содержимого (*.zim) Открыть ссылку в новой вкладке? + Сервисный канал Точки доступа + Не удалось запустить точку доступа + Кажется, ваша точка доступа уже включена. Пожалуйста, выключите точку доступа, чтобы продолжить. + Перейти к настройкам WIFI + Точка доступа работает + Пожалуйста, сначала выберете книги + Невозможно запустить сервер. Пожалуйста, включите вашу точку доступа + Невозможно запустить сервер. + Сервер успешно запущен Сервер успешно остановлен. + Точка доступа включена + Детали вашей точки доступа:\nSSID: %1$s \nПароль: %2$s + Выберете файлы, которые вы хотите разместить на сервере + Запуск сервера + Инструкции по размещению книг Обнаружено Wi-Fi подключение + Чтобы просматривать книги, размещённые на других устройствах, проверьте, что все устройства подсоединены к одной и той же сети WiFi. + Чтобы данная функция работала, вам нужно включить точку доступа WiFi или подключить устройства отправителя и получателя к одной и той же сети WiFi. + ПРОДОЛЖИТЬ + Обновления о состоянии вашей точки доступа/сервера. + Точка Доступа Kiwix + Запустить сервер + Остановить сервер + Введите этот IP адрес в ваш браузер чтобы получить доступ к серверу %s Ошибка: выбранный ZIM-файл не найден. + Невозможно открыть файл zim Ошибка: Выбранный файл не является пригодным ZIM-файлом. Ошибка: Загрузка статьи (Url: %1$s) не удалась. Экран @@ -60,8 +87,13 @@ Очистить историю Очистить недавние поисковые запросы и историю вкладок Вся история очищена - Очистить всю историю + Очистить закладки + Все закладки удалены + Очистить всю историю? + Поделиться + Поделиться файлами ZIM с: Удалить + Отменить Последний поиск удалён Вы можете пролистнуть влево, чтобы увидеть содержание статьи Понятно @@ -87,17 +119,18 @@ Устройство Онлайн Библиотека + Следующие файлы zim будут удалены:\n\n%s Файл успешно удалён Файлы отсутствуют - Недостаточно места для загрузки этого файла. + Недостаточно места для загрузки. Доступно Места: Простой Без картинок - Нет видео + Без видео Отсутствует сетевое подключение Что делает Kiwix? Kiwix - это автономный контент-ридер. Он действует схоже с браузером, но вместо обращения к онлайн страницам, он считывает содержимое из файла в формате ZIM. - Хотя Kiwix и был изначально разработан, чтобы просматривать Wikipedia офлайн, он также пригоден и для другого содержимого. + Хотя Kiwix и был изначально разработан, чтобы просматривать Wikipedia оффлайн, он также пригоден и для другого содержимого. Где содержимое? Наш контент размещён на сайте Kiwix. Они доступны как ZIM файлы. Их существует много: @@ -120,43 +153,134 @@ Выбор носителя информации Перевод текста в речь не доступен для этого ZIM файла Не удалось инициализировать текст в речь. Пожалуйста, попробуйте еще раз + Непредвиденная ошибка при переводе текста в речь. Пожалуйста, попробуйте ещё раз. Неожиданная ошибка при поиске. Пожалуйста, попробуйте еще раз Далее Предыдущий Разрешить загрузку контента через мобильную сеть? При выборе “Да”, вы не будете предупреждаться в будущем. Однако, вы всегда можете поменять это в Настройках. - Загрузить контент только через WiFi + Загружать контент только через WiFi день ч м с осталось + Сегодня + Вчера Предупреждать когда происходит ввод внешних ссылок Показать всплывающее сообщение про снятие дополнительных средств мобильным оператором или невозможности работы ссылок в офлайне. - Ввод внешней ссылки + Ввод Внешней Ссылки! Вы указали внешнюю ссылку. Её открытие может привести к снятию средств мобильным оператором или может не сработать, если вы офлайн. Хотите продолжить? - Больше не спрашивай + Больше не спрашивать Выбранные языки: Другие языки: + Нет доступных элементов + Хммм… Как неловко Похоже, приложение вылетело.\n\nНе могли бы вы помочь нам исправить эту проблему, предоставив следующую информацию? Ваши Языковые Настройки Список Ваших Zim Файлов + Детали ошибки Журнал Действий Приложения Подробности об Устройстве ОТПРАВИТЬ ПОДРОБНОСТИ - Скачивайте книги + Ярлык недоступен + Новая вкладка + Получить содержимое + Иконка + %s статей + Начать + Скачать книги + Знания человечества, на вашем телефоне. + Добро пожаловать в семью + Сохранить книги в автономный режим Скачивайте книги и читайте, где бы вы ни были. + Не удалось добавить в закладки + Перейти к предыдущей странице + Перейти к следующей странице + Содержание + Выбрать языки + Сохранить языки + Отправить отзыв Развернуть - Закладки в текущей книге + История + Посмотреть историю из всех книг + Поиск в истории + %1$d выбрано + Показать Закладки Во Всех Книгах + Искать в закладках + Переключить вкладки Закрыть все вкладки + В ожидании + В процессе + Завершено + Приостановлено Ошибка: %s + Сохранить + Заметка + Заголовок Статьи Wiki Разрешение на хранение необходимо для Заметок Заметки не могут быть использованы без разрешения на хранение + Заметка не сохранена + Заметка успешно удалена + Заметка не была удалена + Заметка сохранена + Ошибка при сохранении заметки: запись в хранилище не разрешена + Файл заметок не существует + Поделиться файлом заметок с: Отменить несохранённые изменения? Удалить все заметки? Ошибка: Отсутствует разрешение на хранение - Очистить Все Заметки + Папка с заметками полностью удалена + Некоторые файлы не были удалены + %d книг + Обнаружение начато + Обнаружение не удалось + Серьёзная ошибка! Попробуйте выключить и снова включить WiFi P2P + Не удалось установить соединение + Доступ к местонахождению требуется Android для поиска близлежащих устройств + Невозможно обнаружить устройства без доступа к местоположению + Невозможно получить доступ к файлам zim без разрешения на доступ к хранилищу + Разрешите доступ к местоположению, чтобы позволить поиск устройств + Поиск близлежащих устройств невозможен без доступа к местоположению + Включите WiFi P2P в настройках системы + Поиск устройств невозможен без включённого WiFi + Передать файлы на %s? + Выбранное устройство отказало в передаче + Передача файла завершена + Произошла ошибка во время передачи файла + Ошибка при передаче файла %s + Получить контент с устройства рядом + Поиск устройств + Ваше устройство: + УСТРОЙСТВА РЯДОМ + Устройства не найдены. Нажмите кнопку Поиск чтобы попробовать ещё раз. + ФАЙЛЫ ДЛЯ ПЕРЕДАЧИ + Подготовка файлов для передачи… + Производим \“рукопожатие\”… + Статус + Очистить все заметки во всех статьях + Очистить все заметки + Изображение + Видео + Только текст + Короткий текст + Доступ к хранилищу запрещён + Для работы этому приложению необходим доступ к хранилищу на чтение. Пожалуйста, разрешите доступ в ваших настройках + Перейти к Настройкам Точки Доступа + Нет результатов Нет Закладок - Удалить историю? - Удалить закладки? + История пуста + Настройки устройства по умолчанию + Удалить историю? + Удалить закладки? + Вкл + Выкл + Авто + Отправить отчёт диагностики + Информация о файловой системе + Отчёт диагностики + Пожалуйста, пришлите нам всю информацию ниже, чтобы мы смогли обнаружить проблему + %d%% + Масштаб Текста + Экспериментальная навигация diff --git a/core/src/main/res/values-sc/strings.xml b/core/src/main/res/values-sc/strings.xml index c51a873a4..14b036c72 100644 --- a/core/src/main/res/values-sc/strings.xml +++ b/core/src/main/res/values-sc/strings.xml @@ -255,8 +255,8 @@ Perunu sinnalibru! Peruna cronologia Valore predefinidu de su dispositivu - Iscantzellare sa cronologia? - Iscantzellare sos sinnalibros? + Iscantzellare sa cronologia? + Iscantzellare sos sinnalibros? Alluta Istudada Automàtica diff --git a/core/src/main/res/values-sr/strings.xml b/core/src/main/res/values-sr/strings.xml index bff0d593c..ceeb221d9 100644 --- a/core/src/main/res/values-sr/strings.xml +++ b/core/src/main/res/values-sr/strings.xml @@ -83,8 +83,8 @@ Нема обележивача Нема историјата Подразумеване вредности уређаја - Избрисати историјат? - Избрисати обележиваче? + Избрисати историјат? + Избрисати обележиваче? Укљ. Искљ. Ауто diff --git a/core/src/main/res/values-sv/strings.xml b/core/src/main/res/values-sv/strings.xml index 8eae788d3..ba1025f82 100644 --- a/core/src/main/res/values-sv/strings.xml +++ b/core/src/main/res/values-sv/strings.xml @@ -246,8 +246,8 @@ Inga bokmärken Ingen historik Enhetsstandard - Radera historik? - Radera bokmärken? + Radera historik? + Radera bokmärken? Av Auto diff --git a/core/src/main/res/values-tr/strings.xml b/core/src/main/res/values-tr/strings.xml index 040cc44cb..82f02b1be 100644 --- a/core/src/main/res/values-tr/strings.xml +++ b/core/src/main/res/values-tr/strings.xml @@ -267,8 +267,8 @@ Yer İmi Yok Geçmiş Yok Cihaz Varsayılanı - Geçmiş Silinsin mi? - Yer İşaretleri Silinsin mi? + Geçmiş Silinsin mi? + Yer İşaretleri Silinsin mi? Açık Kapalı Otomatik @@ -276,4 +276,7 @@ Dosya Sistemi Ayrıntıları Teşhis Raporu Sorunu teşhis edebilmemiz için lütfen aşağıdaki tüm ayrıntıları gönderin + %%%d + Metin Yakınlığı + Deneysel Gezintisi diff --git a/core/src/main/res/values-zh-rTW/strings.xml b/core/src/main/res/values-zh-rTW/strings.xml index 6a40fea0a..f6ced3f06 100644 --- a/core/src/main/res/values-zh-rTW/strings.xml +++ b/core/src/main/res/values-zh-rTW/strings.xml @@ -261,8 +261,8 @@ 沒有書籤! 沒有歷史 設備預設 - 刪除歷史? - 刪除書籤? + 刪除歷史? + 刪除書籤? 開啟 關閉 自動 @@ -272,4 +272,5 @@ 請傳送所有以下詳細資訊,以讓我們可以方便診斷問題 %d%% 文字縮放 + 實現性導覽 diff --git a/core/src/main/res/values-zh/strings.xml b/core/src/main/res/values-zh/strings.xml index aad89a977..6cafcb7e4 100644 --- a/core/src/main/res/values-zh/strings.xml +++ b/core/src/main/res/values-zh/strings.xml @@ -3,6 +3,7 @@ * A Chinese Wikipedian * Abijeet Patro * Akagisoy +* Arthur2e5 * Josephine W. * Liuxinyu970226 * SomeyaMako @@ -24,15 +25,38 @@ 退出全屏 朗读 停止朗读 + 支持Kiwix + 成为服务器共享书籍 保存媒体 尝试保存该媒体时出错! 已将媒体作为%s保存至Android/media/org.kiwix…/ 搜索 选择一个内容文件(*.zim) 在新标签页打开链接? + 热点服务频段 + 未能启动热点 + 你的热点好像已经打开了。请先关闭 Wi-Fi 热点再继续。 转到WIFI设置 + 运行热点 + 请先选择书籍 + 未能启动服务器。请打开热点。 + 未能启动服务器。 + 成功启动服务器。 + 成功停止服务器。 + 热点已开启 + 以下为您的本地热点的信息。\nSSID:%1$s \n密码:%2$s + 选择你想在服务器上共享的文件 + 正在启动服务器 + 书籍共享说明 检测到Wi-Fi连接 + 要在其他设备上看书,就先要确认所有设备都连接到同一个 WiFi 网络。 + 要让此功能运作,你需要先手动启动 Wi-Fi 热点,或者确定主机和接受设备在同一个 Wi-Fi 网络上。 + 继续 + Kiwix 热点 + 启动服务器 + 中止服务器 错误:找不到选定的ZIM文件。 + 无法打开 zim 文件 错误:选定的文件不是有效ZIM文件。 错误:加载条目(网址:%1$s)失败。 显示 @@ -57,9 +81,11 @@ 清空历史 清空最近搜索及标签历史 已清空所有历史 - 清空所有历史 + 清除书签 + 清空所有历史? 分享 删除 + 取消 已移除最近搜索 您可以向左滑动来查看此条目的内容 明白了 @@ -87,7 +113,7 @@ 图书馆 文件已删除 没有文件 - 缺少下载此文件所需的空间。 + 缺少下载所需的空间。 可用空间: 简单 没有图片 @@ -95,17 +121,17 @@ 没有网络连接 Kiwix可以做什么? Kiwix是一个离线内容阅读器。它的功能就好像一个浏览器,但它不需要访问在线网页,而是从ZIM格式文件中读取内容。 - 尽管Kiwix原本设计用于提供维基百科离线内容,但它也可以阅读其他内容。 + 尽管Kiwix原本设计用于提供维基百科离线内容,但它也可以阅读其他内容。 内容在哪里? 我们的内容存储在Kiwix网站中。 它们以ZIM格式的文件存在。这里是其中一些: u2022维基百科分别提供每种语言版本 u2022同样可用于例如维基解密或维基文库等其他内容 - 您可以在应用中下载您选择的ZIM文件,也可以在电脑端下载您想要的文件,并在稍后将其转移至您的SD卡中。 + 您可以在应用中下载您选择的ZIM文件,也可以在电脑端下载您想要的文件,并在稍后将其转移至您的SD卡中。 在应用中下载的ZIM文件被存放于外部存储中一个名为Kiwix的文件夹内。 存储 当前文件夹 - 对不起,我们无法删除此文件。您应尝试改用文件管理器。 + 对不起,我们无法删除一些文件。您应尝试改用文件管理器。 暂停 恢复 停止 @@ -131,7 +157,7 @@ 昨天 访问外部链接时警告 对额外费用或离线时链接不可用弹出警告 - 正在进入外部链接 + 正在进入外部链接! 您正在输入外部链接。这可能导致额外数据转移费用,或当您离线时不能工作。您是否要继续? 不要再次询问 选择的语言: @@ -143,6 +169,7 @@ 应用程序日志 设备细节 发送详情 + 新建标签页 获取内容 %s个条目 入门 diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index e4870988e..5c1a6cd21 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -70,6 +70,7 @@ All History Cleared Clear bookmarks All Bookmarks Cleared + Selected Bookmarks Cleared Clear All History? Share Share ZIM files with: @@ -264,8 +265,10 @@ No Bookmarks No History Device Default - Delete History? - Delete Bookmarks? + Delete All History? + Delete Selected History? + Delete All Bookmarks? + Delete Selected Bookmarks? On Off Auto diff --git a/core/src/test/java/org/kiwix/kiwixmobile/core/StorageObserverTest.kt b/core/src/test/java/org/kiwix/kiwixmobile/core/StorageObserverTest.kt index 33cfdc22b..bc85ba3fb 100644 --- a/core/src/test/java/org/kiwix/kiwixmobile/core/StorageObserverTest.kt +++ b/core/src/test/java/org/kiwix/kiwixmobile/core/StorageObserverTest.kt @@ -21,6 +21,7 @@ package org.kiwix.kiwixmobile.core import io.mockk.clearAllMocks import io.mockk.every import io.mockk.mockk +import io.mockk.verify import io.reactivex.processors.PublishProcessor import io.reactivex.schedulers.Schedulers import org.junit.jupiter.api.AfterAll @@ -68,11 +69,7 @@ class StorageObserverTest { every { fileSearch.scan() } returns files every { downloadDao.downloads() } returns downloads every { readerFactory.create(file) } returns zimFileReader - storageObserver = StorageObserver( - downloadDao, - fileSearch, - readerFactory - ) + storageObserver = StorageObserver(downloadDao, fileSearch, readerFactory) } @Test @@ -92,6 +89,7 @@ class StorageObserverTest { booksOnFileSystem().assertValues( listOf(bookOnDisk(book = expectedBook, file = file)) ) + verify { zimFileReader.dispose() } } private fun booksOnFileSystem() = storageObserver.booksOnFileSystem diff --git a/core/src/test/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/DeleteBookmarkItemsTest.kt b/core/src/test/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/DeleteBookmarkItemsTest.kt index d2325e5ce..f7df458fb 100644 --- a/core/src/test/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/DeleteBookmarkItemsTest.kt +++ b/core/src/test/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/DeleteBookmarkItemsTest.kt @@ -63,4 +63,13 @@ internal class DeleteBookmarkItemsTest { ) verify { effects.offer(ShowToast(R.string.all_bookmarks_cleared)) } } + + @Test + fun `delete with selected items shows toast with message selected bookmarks cleared`() { + item1.isSelected = true + DeleteBookmarkItems(effects, bookmarkState(listOf(item1, item2)), bookmarksDao).invokeWith( + activity + ) + verify { effects.offer(ShowToast(R.string.selected_bookmarks_cleared)) } + } } diff --git a/core/src/test/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/ShowDeleteBookmarksDialogTest.kt b/core/src/test/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/ShowDeleteBookmarksDialogTest.kt index 98a4450f2..8d6d7d78d 100644 --- a/core/src/test/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/ShowDeleteBookmarksDialogTest.kt +++ b/core/src/test/java/org/kiwix/kiwixmobile/core/page/bookmark/viewmodel/effects/ShowDeleteBookmarksDialogTest.kt @@ -26,29 +26,61 @@ import io.reactivex.processors.PublishProcessor import org.junit.jupiter.api.Test import org.kiwix.kiwixmobile.core.base.SideEffect import org.kiwix.kiwixmobile.core.dao.NewBookmarksDao +import org.kiwix.kiwixmobile.core.page.bookmark import org.kiwix.kiwixmobile.core.page.bookmark.BookmarksActivity import org.kiwix.kiwixmobile.core.page.bookmarkState import org.kiwix.kiwixmobile.core.utils.DialogShower -import org.kiwix.kiwixmobile.core.utils.KiwixDialog +import org.kiwix.kiwixmobile.core.utils.KiwixDialog.DeleteAllBookmarks +import org.kiwix.kiwixmobile.core.utils.KiwixDialog.DeleteSelectedBookmarks internal class ShowDeleteBookmarksDialogTest { + val effects = mockk>>(relaxed = true) + private val newBookmarksDao = mockk() + val activity = mockk() + private val dialogShower = mockk(relaxed = true) @Test fun `invoke with shows dialog that offers ConfirmDelete action`() { - val effects = mockk>>(relaxed = true) - val newBookmarksDao = mockk() - val activity = mockk() val showDeleteBookmarksDialog = ShowDeleteBookmarksDialog(effects, bookmarkState(), newBookmarksDao) - val dialogShower = mockk() + mockkActivityInjection(showDeleteBookmarksDialog) + val lambdaSlot = slot<() -> Unit>() + showDeleteBookmarksDialog.invokeWith(activity) + verify { dialogShower.show(any(), capture(lambdaSlot)) } + lambdaSlot.captured.invoke() + verify { effects.offer(DeleteBookmarkItems(effects, bookmarkState(), newBookmarksDao)) } + } + + private fun mockkActivityInjection(showDeleteBookmarksDialog: ShowDeleteBookmarksDialog) { every { activity.activityComponent.inject(showDeleteBookmarksDialog) } answers { showDeleteBookmarksDialog.dialogShower = dialogShower Unit } - val lambdaSlot = slot<() -> Unit>() + } + + @Test + fun `invoke with selected items shows dialog with DeleteSelectedBookmarks title`() { + val showDeleteBookmarksDialog = + ShowDeleteBookmarksDialog( + effects, + bookmarkState(listOf(bookmark(isSelected = true))), + newBookmarksDao + ) + mockkActivityInjection(showDeleteBookmarksDialog) showDeleteBookmarksDialog.invokeWith(activity) - verify { dialogShower.show(KiwixDialog.DeleteBookmarks, capture(lambdaSlot)) } - lambdaSlot.captured.invoke() - verify { effects.offer(DeleteBookmarkItems(effects, bookmarkState(), newBookmarksDao)) } + verify { dialogShower.show(DeleteSelectedBookmarks, any()) } + } + + @Test + fun `invoke with no selected items shows dialog with DeleteAllBookmarks title`() { + val showDeleteBookmarksDialog = + ShowDeleteBookmarksDialog( + effects, + bookmarkState(listOf(bookmark())), + newBookmarksDao + ) + mockkActivityInjection(showDeleteBookmarksDialog) + showDeleteBookmarksDialog.invokeWith(activity) + verify { dialogShower.show(DeleteAllBookmarks, any()) } } } diff --git a/core/src/test/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/effects/ShowDeleteHistoryDialogTest.kt b/core/src/test/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/effects/ShowDeleteHistoryDialogTest.kt index f1469a51f..5c0dbcad7 100644 --- a/core/src/test/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/effects/ShowDeleteHistoryDialogTest.kt +++ b/core/src/test/java/org/kiwix/kiwixmobile/core/page/history/viewmodel/effects/ShowDeleteHistoryDialogTest.kt @@ -9,27 +9,53 @@ import org.junit.jupiter.api.Test import org.kiwix.kiwixmobile.core.base.SideEffect import org.kiwix.kiwixmobile.core.dao.HistoryDao import org.kiwix.kiwixmobile.core.page.history.HistoryActivity +import org.kiwix.kiwixmobile.core.page.historyItem import org.kiwix.kiwixmobile.core.page.historyState import org.kiwix.kiwixmobile.core.utils.DialogShower import org.kiwix.kiwixmobile.core.utils.KiwixDialog.DeleteAllHistory +import org.kiwix.kiwixmobile.core.utils.KiwixDialog.DeleteSelectedHistory internal class ShowDeleteHistoryDialogTest { + val effects = mockk>>(relaxed = true) + private val historyDao = mockk() + val activity = mockk() + private val dialogShower = mockk(relaxed = true) @Test fun `invoke with shows dialog that offers ConfirmDelete action`() { - val effects = mockk>>(relaxed = true) - val historyDao = mockk() - val activity = mockk() val showDeleteHistoryDialog = ShowDeleteHistoryDialog(effects, historyState(), historyDao) - val dialogShower = mockk() + mockkActivityInjection(showDeleteHistoryDialog) + val lambdaSlot = slot<() -> Unit>() + showDeleteHistoryDialog.invokeWith(activity) + verify { dialogShower.show(any(), capture(lambdaSlot)) } + lambdaSlot.captured.invoke() + verify { effects.offer(DeleteHistoryItems(historyState(), historyDao)) } + } + + @Test + fun `invoke with selected item shows dialog with delete selected items title`() { + val showDeleteHistoryDialog = ShowDeleteHistoryDialog( + effects, + historyState(listOf(historyItem(isSelected = true))), + historyDao + ) + mockkActivityInjection(showDeleteHistoryDialog) + showDeleteHistoryDialog.invokeWith(activity) + verify { dialogShower.show(DeleteSelectedHistory, any()) } + } + + @Test + fun `invoke with no selected items shows dialog with delete all items title`() { + val showDeleteHistoryDialog = ShowDeleteHistoryDialog(effects, historyState(), historyDao) + mockkActivityInjection(showDeleteHistoryDialog) + showDeleteHistoryDialog.invokeWith(activity) + verify { dialogShower.show(DeleteAllHistory, any()) } + } + + private fun mockkActivityInjection(showDeleteHistoryDialog: ShowDeleteHistoryDialog) { every { activity.activityComponent.inject(showDeleteHistoryDialog) } answers { showDeleteHistoryDialog.dialogShower = dialogShower Unit } - val lambdaSlot = slot<() -> Unit>() - showDeleteHistoryDialog.invokeWith(activity) - verify { dialogShower.show(DeleteAllHistory, capture(lambdaSlot)) } - lambdaSlot.captured.invoke() - verify { effects.offer(DeleteHistoryItems(historyState(), historyDao)) } } } diff --git a/core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/ZimSearchResultGeneratorTest.kt b/core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/ZimSearchResultGeneratorTest.kt index 6cd6b1ef7..39949fca5 100644 --- a/core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/ZimSearchResultGeneratorTest.kt +++ b/core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/ZimSearchResultGeneratorTest.kt @@ -24,7 +24,6 @@ import io.mockk.verify import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -import org.kiwix.kiwixmobile.core.reader.SearchResult import org.kiwix.kiwixmobile.core.reader.ZimFileReader import org.kiwix.kiwixmobile.core.reader.ZimReaderContainer import org.kiwix.kiwixmobile.core.search.SearchSuggestion @@ -38,7 +37,7 @@ internal class ZimSearchResultGeneratorTest { private val zimFileReader: ZimFileReader = mockk() private val zimSearchResultGenerator: ZimSearchResultGenerator = - ZimSearchResultGenerator(sharedPreferenceUtil, zimReaderContainer) + ZimSearchResultGenerator(zimReaderContainer) @BeforeEach internal fun setUp() { @@ -51,48 +50,19 @@ internal class ZimSearchResultGeneratorTest { .isEqualTo(emptyList()) } - @Test - fun `full text results removes blanks`() { - val searchTerm = " " - every { sharedPreferenceUtil.prefFullTextSearch } returns true - val validItem = mockk() - val filteredItem = mockk() - val invalidTerminalItem = mockk() - every { zimReaderContainer.getNextResult() } returnsMany listOf( - validItem, - filteredItem, - invalidTerminalItem - ) - val validItemTitle = "title" - every { validItem.title } returns validItemTitle - every { filteredItem.title } returns " " - every { invalidTerminalItem.title } returns null - assertThat(zimSearchResultGenerator.generateSearchResults(searchTerm)) - .isEqualTo(listOf(ZimSearchResultListItem(validItemTitle))) - verify { zimReaderContainer.search(searchTerm, 200) } - } - - @Test - internal fun `null search result terminates full text result sequence`() { - every { sharedPreferenceUtil.prefFullTextSearch } returns true - val searchResult = mockk() - every { zimReaderContainer.getNextResult() } returnsMany listOf(null, searchResult) - every { searchResult.title } returns "title" - assertThat(zimSearchResultGenerator.generateSearchResults("searchTerm")) - .isEqualTo(emptyList()) - } - @Test internal fun `suggestion results are distinct`() { val validTitle = "title" val searchTerm = " " val item = mockk() - every { sharedPreferenceUtil.prefFullTextSearch } returns false every { zimFileReader.searchSuggestions(" ", 200) } returns true every { zimFileReader.getNextSuggestion() } returnsMany listOf(item, item, null) every { item.title } returns validTitle assertThat(zimSearchResultGenerator.generateSearchResults(searchTerm)) .isEqualTo(listOf(ZimSearchResultListItem(validTitle))) - verify { zimFileReader.searchSuggestions(searchTerm, 200) } + verify { + zimFileReader.searchSuggestions(searchTerm, 200) + zimFileReader.dispose() + } } } diff --git a/custom/src/main/res/values-cs/strings.xml b/custom/src/main/res/values-cs/strings.xml index a4785c3e1..b896b76b9 100644 --- a/custom/src/main/res/values-cs/strings.xml +++ b/custom/src/main/res/values-cs/strings.xml @@ -1,6 +1,10 @@ + Zkusit znovu + Stáhnout + Neplatná instalace. Stáhněte si prosím Zim.\nZkontrolujte, zda je zapnuto WiFi a zda máte v úložišti dostatek místa diff --git a/custom/src/main/res/values-gsw/strings.xml b/custom/src/main/res/values-gsw/strings.xml new file mode 100644 index 000000000..81c66cfff --- /dev/null +++ b/custom/src/main/res/values-gsw/strings.xml @@ -0,0 +1,8 @@ + + + + Nomal probierä + Abelade + diff --git a/custom/src/main/res/values-nl/strings.xml b/custom/src/main/res/values-nl/strings.xml new file mode 100644 index 000000000..ae35f8e7d --- /dev/null +++ b/custom/src/main/res/values-nl/strings.xml @@ -0,0 +1,8 @@ + + + + Opnieuw proberen + Downloaden + diff --git a/custom/src/main/res/values-ru/strings.xml b/custom/src/main/res/values-ru/strings.xml new file mode 100644 index 000000000..1a2933127 --- /dev/null +++ b/custom/src/main/res/values-ru/strings.xml @@ -0,0 +1,9 @@ + + + + Повторить + Скачать + Проблема с установкой. Пожалуйста скачайте Zim.\n Проверьте, что WiFi включён и в хранилище достаточно места +