diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 82893a609..c3ca44408 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -19,6 +19,7 @@ workflow: - saas-linux-medium-amd64 variables: JAVA_HOME: /usr/lib/jvm/java-21-openjdk-amd64 + GIT_SUBMODULE_STRATEGY: none before_script: - test -e /etc/apt/sources.list.d/trixie-backports.list || echo "deb http://deb.debian.org/debian trixie-backports main" >> /etc/apt/sources.list diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..8a1137a46 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "fastlane"] + path = fastlane + url = https://gitlab.com/fdroid/fdroidclient-fastlane.git diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 39adaf66f..cb4be776f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -22,7 +22,7 @@ android { versionCode = 2000010 versionName = "2.0-alpha10" - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunner = "org.fdroid.HiltTestRunner" } // filter out incomplete translations from stable releases (which end in 50+) @@ -177,6 +177,9 @@ dependencies { androidTestImplementation(libs.androidx.test.uiautomator) androidTestImplementation(libs.coil.test) androidTestImplementation(libs.coil.network.okhttp) + androidTestImplementation(libs.turbine) + androidTestImplementation(libs.hilt.android.testing) + kspAndroidTest(libs.hilt.android.compiler) screenshotTestImplementation(libs.screenshot.validation.api) } diff --git a/app/lint.xml b/app/lint.xml index cdd395479..dedbe3114 100644 --- a/app/lint.xml +++ b/app/lint.xml @@ -19,4 +19,7 @@ + + + diff --git a/app/src/androidTest/java/org/fdroid/HiltTestRunner.kt b/app/src/androidTest/java/org/fdroid/HiltTestRunner.kt new file mode 100644 index 000000000..753c9085f --- /dev/null +++ b/app/src/androidTest/java/org/fdroid/HiltTestRunner.kt @@ -0,0 +1,12 @@ +package org.fdroid + +import android.app.Application +import android.content.Context +import androidx.test.runner.AndroidJUnitRunner +import dagger.hilt.android.testing.HiltTestApplication + +class HiltTestRunner : AndroidJUnitRunner() { + override fun newApplication(cl: ClassLoader?, name: String?, context: Context?): Application { + return super.newApplication(cl, HiltTestApplication::class.java.name, context) + } +} diff --git a/app/src/androidTest/java/org/fdroid/repo/RepoManagerAddAllIntegrationTest.kt b/app/src/androidTest/java/org/fdroid/repo/RepoManagerAddAllIntegrationTest.kt new file mode 100644 index 000000000..f77f40df3 --- /dev/null +++ b/app/src/androidTest/java/org/fdroid/repo/RepoManagerAddAllIntegrationTest.kt @@ -0,0 +1,170 @@ +package org.fdroid.repo + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import app.cash.turbine.TurbineTestContext +import app.cash.turbine.test +import dagger.hilt.android.testing.HiltAndroidRule +import dagger.hilt.android.testing.HiltAndroidTest +import javax.inject.Inject +import kotlin.test.assertIs +import kotlin.time.Duration.Companion.seconds +import kotlinx.coroutines.runBlocking +import org.fdroid.index.RepoManager +import org.junit.Assume.assumeTrue +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder +import org.junit.runner.RunWith +import org.slf4j.LoggerFactory + +@HiltAndroidTest +@RunWith(AndroidJUnit4::class) +internal class RepoManagerAddAllIntegrationTest { + + @get:Rule var hiltRule = HiltAndroidRule(this) + + @get:Rule var folder: TemporaryFolder = TemporaryFolder() + + private val repos = + listOf( + "https://raw.githubusercontent.com/2br-2b/Fdroid-repo/master/fdroid/repo", + "https://anonymousmessenger.ly/fdroid/repo", + "https://fdroid.beocode.eu/fdroid/repo", + "https://mobileapp.bitwarden.com/fdroid/repo", + "https://briarproject.org/fdroid/repo", + "https://fdroid.bromite.org/fdroid/repo", + "https://fdroid.gitlab.io/ccc/fdroid/repo", + "https://www.collaboraoffice.com/downloads/fdroid/repo", + "https://bubu1.eu/cctg/fdroid/repo", + "https://static.cryptomator.org/android/fdroid/repo", + "https://lucaapp.gitlab.io/fdroid-repository/fdroid/repo", + "https://divestos.org/apks/official/fdroid/repo", + "https://divestos.org/apks/unofficial/fdroid/repo", + "https://raw.githubusercontent.com/efreak/auto-daily-fdroid/main/fdroid/repo", + "https://bubu1.eu/fdroidclassic/fdroid/repo", + "https://f5a.typed.icu/fdroid/repo", + "https://fdroid.fedilab.app/repo", + "https://raw.githubusercontent.com/Tobi823/ffupdaterrepo/master/fdroid/repo", + "https://rfc2822.gitlab.io/fdroid-firefox/fdroid/repo", + "https://raw.githubusercontent.com/Five-Prayers/fdroid-repo-stable/main/fdroid/repo", + "https://codeberg.org/florian-obernberger/fdroid-repo/raw/branch/main/repo", + "https://fdroid.frostnerd.com/fdroid/repo", + "https://pili.qi0.de/fdroid/repo", + "https://gitjournal.io/fdroid/repo", + "https://guardianproject.info/fdroid/repo", + "https://s3.amazonaws.com/guardianproject/fdroid/repo", + "https://guardianproject.info/fdroid/repo", + "https://f-droid.i2p.io/repo", + "https://iitc.app/fdroid/repo", + "https://jhass.github.io/insporation/fdroid/repo", + "https://raw.githubusercontent.com/iodeOS/fdroid/master/fdroid/repo", + "https://apt.izzysoft.de/fdroid/repo", + "https://android.izzysoft.de/repo", + "https://jak-linux.org/fdroid/repo", + "https://julianfairfax.gitlab.io/fdroid-repo/fdroid/repo", + "https://kaffeemitkoffein.de/fdroid/repo", + "https://store.nethunter.com/repo", + "https://cdn.kde.org/android/stable-releases/fdroid/repo", + "https://repo.kuschku.de/fdroid/repo", + "https://fdroid.libretro.com/repo", + "https://fdroid.ltheinrich.de/fdroid/repo", + "https://ltt.rs/fdroid/repo", + "https://pili.qi0.de/fdroid/repo", + "https://fdroid.metatransapps.com/fdroid/repo", + "https://microg.org/fdroid/repo", + "https://fdroid.mm20.de/repo", + "https://repo.mobilsicher.de/fdroid/repo", + "https://molly.im/fdroid/repo", + "https://molly.im/fdroid/foss/fdroid/repo", + "https://f-droid.monerujo.io/fdroid/repo", + "https://releases.nailyk.fr/repo", + "https://nanolx.org/fdroid/repo", + "https://www.nanolx.org/fdroid/repo", + "https://repo.netsyms.com/fdroid/repo", + "https://archive.newpipe.net/fdroid/repo", + "https://repo.nononsenseapps.com/fdroid/repo", + "https://fdroid.novy.software/repo", + "https://raw.githubusercontent.com/nucleus-ffm/Nucleus-F-Droid-Repo/master/fdroid/repo", + "https://obfusk.ch/fdroid/repo", + "https://ouchadam.github.io/fdroid-repository/repo", + "https://fdroid.partidopirata.com.ar/fdroid/repo", + "https://thecapslock.gitlab.io/fdroid-patched-apps/fdroid/repo", + "https://fdroid.i2pd.xyz/fdroid/repo", + "https://fdroid.rami.io/fdroid/repo", + "https://thedoc.eu.org/fdroid/repo", + "https://repo.samourai.io/fdroid/repo", + "https://fdroid.a3.pm/seabear/repo", + "https://raw.githubusercontent.com/jackbonadies/seekerandroid/fdroid/fdroid/repo", + "https://fdroid.getsession.org/fdroid/repo", + "https://raw.githubusercontent.com/simlar/simlar-fdroid-repo/master/fdroid/repo", + "https://s2.spiritcroc.de/fdroid/repo", + "https://haagch.frickel.club/files/fdroid/repo", + "https://submarine.strangled.net/fdroid/repo", + "https://service.tagesschau.de/app/repo", + "https://fdroid-repo.calyxinstitute.org/fdroid/repo", + "https://releases.threema.ch/fdroid/repo", + "https://raw.githubusercontent.com/chrisgch/tca/master/fdroid/repo", + "https://fdroid.twinhelix.com/fdroid/repo", + "https://secfirst.org/fdroid/repo", + "https://fdroid.videlibri.de/repo", + "https://guardianproject-wind.s3.amazonaws.com/fdroid/repo", + "https://raw.githubusercontent.com/xarantolus/fdroid/main/fdroid/repo", + "https://zimbelstern.eu/fdroid/repo", + ) + + private val log = LoggerFactory.getLogger(this::class.java.simpleName) + + @Inject lateinit var repoManager: RepoManager + + @Before + fun optIn() { + // Careful! This will add lots of repos to your live DB + assumeTrue(false) // don't run integration tests with real repos all the time + + // inject repo manager before running test + hiltRule.inject() + } + + @Test + fun addAllTheThings() = runBlocking { + repos.forEach { addRepo(it) } + } + + private suspend fun addRepo(url: String) { + log.info("Fetching $url") + repoManager.fetchRepositoryPreview(url = url, proxy = null) + repoManager.addRepoState.test(timeout = 15.seconds) { + val fetchState = awaitFinalFetchState() + if (fetchState is Fetching && fetchState.fetchResult != null) { + repoManager.addFetchedRepository() + val item = awaitItem() + if (item is Adding) { + // await final state + assertIs(awaitItem()) + } else { + // was already final state + assertIs(item) + } + log.info(" Added") + } else if (fetchState is AddRepoError) { + log.error(" $fetchState $url") + } + repoManager.abortAddingRepository() + assertIs(awaitItem()) + cancelAndIgnoreRemainingEvents() + } + log.info("End $url") + } + + private suspend fun TurbineTestContext.awaitFinalFetchState(): AddRepoState { + var item = awaitItem() + log.info(" $item") + while (item is None || (item is Fetching && !item.done)) { + item = awaitItem() + log.info(" $item") + } + log.info(" final: $item") + return item + } +} diff --git a/app/src/androidTest/java/org/fdroid/ui/LocalizationTest.kt b/app/src/androidTest/java/org/fdroid/ui/LocalizationTest.kt new file mode 100644 index 000000000..dd2e78de4 --- /dev/null +++ b/app/src/androidTest/java/org/fdroid/ui/LocalizationTest.kt @@ -0,0 +1,231 @@ +package org.fdroid.ui + +import android.content.res.Resources +import android.text.TextUtils +import android.util.DisplayMetrics +import android.util.Log +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import java.util.IllegalFormatException +import java.util.Locale +import java.util.regex.Pattern +import org.fdroid.R +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +/** + * Runs through all the translated strings and tests them with the same format values that the + * source strings expect. This is to ensure that the formats in the translations are correct in + * number and in type (e.g. `s` or `s`). It reads the source formats and then builds `formats` to + * represent the position and type of the formats. Then it runs through all the translations with + * formats of the correct number and type. + */ +@Suppress("DEPRECATION") +@RunWith(AndroidJUnit4::class) +class LocalizationTest { + private val androidFormat: Pattern = Pattern.compile("(%[a-z0-9]\\$?[a-z]?)") + private val locales: Array = Locale.getAvailableLocales() + private val localeNames = HashSet(locales.size) + + private val context = InstrumentationRegistry.getInstrumentation().targetContext + private var assets = context.assets + private var config = + context.resources.configuration.apply { + locale = Locale.ENGLISH + } + private var resources = Resources(assets, DisplayMetrics(), config) + + @Before + fun setUp() { + for (locale in LOCALES_TO_TEST) { + localeNames.add(locale.toString()) + } + for (locale in locales) { + localeNames.add(locale.toString()) + } + } + + @Test + @Throws(IllegalAccessException::class) + fun testLoadAllPlural() { + val fields = R.plurals::class.java.declaredFields + + val haveFormats = HashMap() + for (field in fields) { + // Log.i(TAG, field.getName()); + val resId = field.getInt(Int::class.javaPrimitiveType) + val string = resources.getQuantityText(resId, 4) + // Log.i(TAG, field.getName() + ": '" + string + "'"); + val matcher = androidFormat.matcher(string) + var matches = 0 + val formats = CharArray(5) + while (matcher.find()) { + val match = matcher.group(0) + val formatType = match!!.get(match.length - 1) + when (match.length) { + 2 -> { + formats[matches] = formatType + matches++ + } + 4 -> formats[match.substring(1, 2).toInt() - 1] = formatType + 5 -> formats[match.substring(1, 3).toInt() - 1] = formatType + else -> throw IllegalStateException(field.getName() + " has bad format: " + match) + } + } + haveFormats[field.getName()] = String(formats).trim { it <= ' ' } + } + + for (locale in locales) { + config.locale = locale + // Resources() requires DisplayMetrics, but they are only needed for drawables + resources = Resources(assets, DisplayMetrics(), config) + for (field in fields) { + var formats: String? = null + try { + val resId = field.getInt(Int::class.javaPrimitiveType) + for (quantity in 0..566) { + resources.getQuantityString(resId, quantity) + } + + formats = haveFormats[field.getName()] + when (formats) { + "d" -> resources.getQuantityString(resId, 1, 1) + "s" -> resources.getQuantityString(resId, 1, "ONE") + "ds" -> resources.getQuantityString(resId, 2, 1, "TWO") + else -> + check(TextUtils.isEmpty(formats)) { "Pattern not included in tests: " + formats } + } + } catch (e: IllegalFormatException) { + Log.i(TAG, locale.toString() + " " + field.getName()) + throw IllegalArgumentException( + ("Bad '" + formats + "' format in " + locale + " " + field.getName() + ": " + e.message) + ) + } catch (e: Resources.NotFoundException) { + Log.i(TAG, locale.toString() + " " + field.getName()) + throw IllegalArgumentException( + ("Bad '" + formats + "' format in " + locale + " " + field.getName() + ": " + e.message) + ) + } + } + } + } + + @Test + @Throws(IllegalAccessException::class) + fun testLoadAllStrings() { + val fields = R.string::class.java.declaredFields + + val haveFormats = HashMap() + for (field in fields) { + val string = resources.getString(field.getInt(Int::class.javaPrimitiveType)) + val matcher = androidFormat.matcher(string) + var matches = 0 + val formats = CharArray(5) + while (matcher.find()) { + val match = matcher.group(0) + val formatType = match!!.get(match.length - 1) + when (match.length) { + 2 -> { + formats[matches] = formatType + matches++ + } + 4 -> formats[match.substring(1, 2).toInt() - 1] = formatType + 5 -> formats[match.substring(1, 3).toInt() - 1] = formatType + else -> throw IllegalStateException(field.getName() + " has bad format: " + match) + } + } + haveFormats[field.getName()] = String(formats).trim { it <= ' ' } + } + + for (locale in locales) { + config!!.locale = locale + // Resources() requires DisplayMetrics, but they are only needed for drawables + resources = Resources(assets, DisplayMetrics(), config) + for (field in fields) { + val resId = field.getInt(Int::class.javaPrimitiveType) + resources.getString(resId) + + val formats = haveFormats.get(field.getName()) + try { + when (formats) { + "d" -> resources.getString(resId, 1) + "dd" -> resources.getString(resId, 1, 2) + "ds" -> resources.getString(resId, 1, "TWO") + "dds" -> resources.getString(resId, 1, 2, "THREE") + "sds" -> resources.getString(resId, "ONE", 2, "THREE") + "s" -> resources.getString(resId, "ONE") + "ss" -> resources.getString(resId, "ONE", "TWO") + "sss" -> resources.getString(resId, "ONE", "TWO", "THREE") + "ssss" -> resources.getString(resId, "ONE", "TWO", "THREE", "FOUR") + "ssd" -> resources.getString(resId, "ONE", "TWO", 3) + "sssd" -> resources.getString(resId, "ONE", "TWO", "THREE", 4) + else -> + check(TextUtils.isEmpty(formats)) { "Pattern not included in tests: " + formats } + } + } catch (e: Exception) { + Log.i(TAG, locale.toString() + " " + field.getName()) + throw IllegalArgumentException( + ("Bad format in '" + locale + "' '" + field.getName() + "': " + e.message) + ) + } + } + } + } + + companion object { + const val TAG: String = "LocalizationTest" + + val LOCALES_TO_TEST: Array = + arrayOf( + Locale.ENGLISH, + Locale.FRENCH, + Locale.GERMAN, + Locale.ITALIAN, + Locale.JAPANESE, + Locale.KOREAN, + Locale.SIMPLIFIED_CHINESE, + Locale.TRADITIONAL_CHINESE, + Locale("zh", "HK"), + Locale("bo"), + Locale("af"), + Locale("ar"), + Locale("be"), + Locale("bg"), + Locale("ca"), + Locale("cs"), + Locale("da"), + Locale("el"), + Locale("es"), + Locale("eo"), + Locale("et"), + Locale("eu"), + Locale("fa"), + Locale("fi"), + Locale("he"), + Locale("hi"), + Locale("hu"), + Locale("hy"), + Locale("id"), + Locale("is"), + Locale("it"), + Locale("ml"), + Locale("my"), + Locale("nb"), + Locale("nl"), + Locale("pl"), + Locale("pt"), + Locale("ro"), + Locale("ru"), + Locale("sc"), + Locale("sk"), + Locale("sn"), + Locale("sr"), + Locale("sv"), + Locale("th"), + Locale("tr"), + Locale("uk"), + Locale("vi"), + ) + } +} diff --git a/app/src/androidTest/java/org/fdroid/ui/screenshots/CategoryItems.kt b/app/src/androidTest/java/org/fdroid/ui/screenshots/CategoryItems.kt index 1f2383b88..5975aa7b1 100644 --- a/app/src/androidTest/java/org/fdroid/ui/screenshots/CategoryItems.kt +++ b/app/src/androidTest/java/org/fdroid/ui/screenshots/CategoryItems.kt @@ -6,11 +6,39 @@ import org.fdroid.ui.categories.CategoryItem fun getCategoryItems(localeList: LocaleListCompat) = listOf( + CategoryItem( + id = "Action Game", + name = + mapOf( + "ar" to "العاب الآكشن", + "cs" to "Akční hra", + "de" to "Action-Spiel", + "en-GB" to "Action Game", + "en-US" to "Action Game", + "et" to "Märulimängud", + "fa" to "بازی کنشی", + "fi" to "Toimintapeli", + "fr" to "Jeu d'action", + "ga" to "Cluiche Gníomhaíochta", + "id" to "Game Aksi", + "ja" to "アクション", + "nl" to "Actie Spel", + "pl" to "Gra akcji", + "pt-BR" to "Jogo de ação", + "ro" to "Joc de acțiune", + "ru" to "Экшен-игра", + "vi" to "Game hành động", + "zh-CN" to "动作游戏", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "AI Chat", name = mapOf( + "af" to "AI Chat", "ar" to "محادثة ذكاء اصناعي", + "be" to "ШІ Размова", "bg" to "Разговори с ИИ", "ca" to "Xat d'IA", "cs" to "AI chat", @@ -30,6 +58,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "hu" to "MI csevegés", "id" to "Chat AI", "is" to "AI-spjall", + "it" to "Chat IA", "ja" to "AI チャット", "kn" to "AI ಚಾಟ್", "ko" to "AI 채팅", @@ -39,9 +68,12 @@ fun getCategoryItems(localeList: LocaleListCompat) = "nl" to "AI-chat", "nl-BE" to "AI Chat", "pl" to "Czat AI", + "pt" to "Conversar com IA", "pt-BR" to "Conversar com IA", + "pt-PT" to "Conversar com IA", "ro" to "Chat AI", "ru" to "Чаты с ИИ", + "sk" to "AI Chat", "sl" to "Klepet z UI", "sq" to "Fjalosje IA", "sr" to "Ћаскање са вештачким паметњаковићем", @@ -60,6 +92,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = name = mapOf( "ar" to "مدير تطبيق", + "be" to "Кіраўнік Праграм", "bg" to "Управление на проложения", "ca" to "Gestor d'aplicacions", "cs" to "Správce aplikací", @@ -72,6 +105,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "es" to "Gestor de aplicaciones", "et" to "Rakendustehaldur", "fa" to "مدیر کاره", + "fi" to "Sovellusten hallinta", "fr" to "Gestionnaire d'applications", "ga" to "Bainisteoir Aipeanna", "he" to "מנהל יישומונים", @@ -79,6 +113,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "hu" to "Alkalmazáskezelő", "id" to "Manajer Aplikasi", "is" to "Forritastýring", + "it" to "Gestore di app", "ja" to "アプリマネージャー", "kn" to "ಅಪ್ಲಿಕೇಶನ್ ಮ್ಯಾನೇಜರ್", "ko" to "앱 관리자", @@ -88,9 +123,12 @@ fun getCategoryItems(localeList: LocaleListCompat) = "nl" to "Appbeheerder", "nl-BE" to "App Manager", "pl" to "Menedżer aplikacji", + "pt" to "Gestor de apps", "pt-BR" to "Gerenciador de aplicativos", + "pt-PT" to "Gestor de apps", "ro" to "Manager aplicații", "ru" to "Менеджер приложений", + "sk" to "Správca aplikácií", "sl" to "Upravitelj orodij", "sq" to "Përgjegjës Aplikacionesh", "sr" to "Управник програма", @@ -109,6 +147,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = name = mapOf( "ar" to "متجر التطبيقات والمُحدِّث", + "be" to "App Store і абнаўленні", "bg" to "Магазин за приложения и обновяване", "ca" to "Botiga d'aplicacions i actualitzador", "ckb" to "ئاپستۆر و نوێکەرەوەکان", @@ -129,7 +168,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ga" to "App Store & Nuashonraitheoir", "gl" to "Tenda de aplicacións e actualizador", "he" to "חנות יישומונים ומעדכן", - "hr" to "Trgovina aplikacija i ažuriranje", + "hr" to "Trgovina aplikacija i alat za aktualiziranje", "hu" to "Alkalmazásbolt és -frissítő", "id" to "Toko Aplikasi & Aplikasi Pembaruan", "is" to "Forritasafn og uppfærslur", @@ -148,12 +187,13 @@ fun getCategoryItems(localeList: LocaleListCompat) = "pt-BR" to "Loja de apps e atualizador", "pt-PT" to "Loja de apps e atualizador", "ro" to "Magazin aplicații & Actualizări", - "ru" to "Приложения и обновления", + "ru" to "Магазин приложений и обновления", "sc" to "Butega de aplicatziones e atualizadore", + "sk" to "Obchod s aplikáciami a aktualizácie", "sl" to "App trgovina in posodobitve", "sq" to "Shitore & Përditësues Aplikacionesh", "sr" to "Складиште и надграђивач програма", - "sv" to "App Store och uppdateringsprogram", + "sv" to "Appbutik & uppdateringsprogram", "sw" to "Ghala la Programu", "ta" to "ஆப் கடை & அப்டேட்டர்", "tr" to "Uygulama Deposu ve Güncelleyici", @@ -165,11 +205,83 @@ fun getCategoryItems(localeList: LocaleListCompat) = ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "Battery", + name = + mapOf( + "ar" to "البطارية", + "be" to "Батарэя", + "bg" to "Батерия", + "ca" to "Bateria", + "cs" to "Baterie", + "de" to "Akku", + "el" to "Μπαταρία", + "en-GB" to "Battery", + "en-US" to "Battery", + "eo" to "Baterio", + "es" to "Batería", + "et" to "Akuhaldus", + "fa" to "باتری", + "fi" to "Akku", + "fr" to "Batterie", + "ga" to "Ceallraí", + "hr" to "Baterija", + "hu" to "Akkumulátor", + "id" to "Baterai", + "is" to "Rafhlaða", + "it" to "Batteria", + "ja" to "バッテリー", + "nb" to "Batteri", + "nl" to "Batterij", + "pl" to "Bateria", + "pt" to "Pilha", + "pt-BR" to "Bateria", + "pt-PT" to "Pilha", + "ro" to "Baterie", + "ru" to "Батарея", + "sk" to "Batéria", + "sl" to "Baterija", + "sq" to "Bateri", + "sr" to "Батерија", + "tr" to "Batarya", + "uk" to "Батарея", + "vi" to "Pin", + "zh-CN" to "电池", + "zh-TW" to "電池", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), + CategoryItem( + id = "Board Game", + name = + mapOf( + "ar" to "العاب الطاولة", + "cs" to "Desková hra", + "de" to "Brettspiel", + "en-GB" to "Board Game", + "en-US" to "Board Game", + "et" to "Lauamängud", + "fa" to "بازی صفحه‌ای", + "fr" to "Jeu de société", + "ga" to "Cluiche Boird", + "id" to "Game Papan", + "ja" to "ボードゲーム", + "nl" to "Bordspel", + "pl" to "Gra planszowa", + "pt-BR" to "Jogo de tabuleiro", + "ro" to "Joc de societate", + "ru" to "Настольная игра", + "vi" to "Game cờ", + "zh-CN" to "桌游", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "Bookmark", name = mapOf( "ar" to "علامة", + "be" to "Закладка", "bg" to "Отметки", "ca" to "Adreça d'interès", "cs" to "Záložka", @@ -209,8 +321,9 @@ fun getCategoryItems(localeList: LocaleListCompat) = "pt-BR" to "Marcador", "pt-PT" to "Marcador", "ro" to "Semn de carte", - "ru" to "Закладки", + "ru" to "Закладка", "sc" to "Sinnalibru", + "sk" to "Záložky", "sl" to "Zaznamek", "sq" to "Faqerojtës", "sr" to "Забелешка", @@ -231,6 +344,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = name = mapOf( "ar" to "المتصفح", + "be" to "Аглядальнік", "bg" to "Мрежов четец", "br" to "Merdeer", "ca" to "Navegador", @@ -257,6 +371,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "is" to "Vafri", "it" to "Browser", "ja" to "ブラウザ", + "kab" to "Iminig", "kn" to "ಬ್ರೌಸರ್", "ko" to "브라우저", "lb" to "Browser", @@ -271,8 +386,9 @@ fun getCategoryItems(localeList: LocaleListCompat) = "pt-BR" to "Navegador", "pt-PT" to "Navegador", "ro" to "Navigator web", - "ru" to "Браузеры", + "ru" to "Браузер", "sc" to "Navigadore", + "sk" to "Prehliadač", "sl" to "Brskalnik", "sq" to "Shfletues", "sr" to "Прегледник", @@ -293,6 +409,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = name = mapOf( "ar" to "حاسبة", + "be" to "Калькулятар", "bg" to "Калкулатор", "ca" to "Calculadora", "cs" to "Kalkulačka", @@ -318,6 +435,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "is" to "Reiknivél", "it" to "Calcolatrice", "ja" to "計算機", + "kab" to "Tamsiḍent", "kn" to "ಕ್ಯಾಲ್ಕುಲೇಟರ್", "ko" to "계산기", "lt" to "Skaičiuotuvas", @@ -331,10 +449,11 @@ fun getCategoryItems(localeList: LocaleListCompat) = "pt-BR" to "Calculadora", "pt-PT" to "Calculador", "ro" to "Calculator", - "ru" to "Калькуляторы", + "ru" to "Калькулятор", "sc" to "Carculadora", + "sk" to "Kalkulačka", "sl" to "Kalkulator", - "sq" to "Llogaritës", + "sq" to "Makinë Llogaritëse", "sr" to "Рачунар", "sv" to "Kalkylator", "sw" to "Kikokotoo", @@ -353,6 +472,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = name = mapOf( "ar" to "التقويم والأجندة", + "be" to "Каляндар і парадак дня", "bg" to "Календар и график", "ca" to "Calendaris i Agendes", "cs" to "Kalendář a agenda", @@ -367,7 +487,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "es-MX" to "Calendario y Agenda", "et" to "Kalender ja päevakava", "fa" to "تقویم و دستور کار", - "fi" to "Kalenteri & esityslista", + "fi" to "Kalenteri ja päivyri", "fr" to "Calendrier & Agenda", "ga" to "Féilire agus Clár Oibre", "gl" to "Calendario e axenda", @@ -384,15 +504,16 @@ fun getCategoryItems(localeList: LocaleListCompat) = "lv" to "Kalendārs un dienaskārtība", "my" to "ပြက္ခဒိန်နှင့် လုပ်ငန်းစဉ်များ", "nb" to "Kalender & Agenda", - "nl" to "Kalender & agenda", + "nl" to "Kalender & Agenda", "nl-BE" to "Kalender & Agenda", "pl" to "Kalendarz i harmonogram", "pt" to "Calendário e agenda", "pt-BR" to "Calendário e agenda", "pt-PT" to "Calendário e agenda", "ro" to "Calendar & Agenda", - "ru" to "Ежедневники", + "ru" to "Календари и ежедневники", "sc" to "Calendàriu e agenda", + "sk" to "Kalendár a diár", "sl" to "Koledar in urnik", "sq" to "Kalendar & Plane", "sr" to "Календар и роковник", @@ -408,11 +529,61 @@ fun getCategoryItems(localeList: LocaleListCompat) = ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "Card Game", + name = + mapOf( + "ar" to "العاب البطاقات", + "cs" to "Karetní hra", + "de" to "Kartenspiel", + "en-GB" to "Card Game", + "en-US" to "Card Game", + "et" to "Kaardimängud", + "fa" to "بازی کارتی", + "fr" to "Jeu de cartes", + "ga" to "Cluiche Cártaí", + "id" to "Game Kartu", + "ja" to "カードゲーム", + "nl" to "Kaartspel", + "pl" to "Gra karciana", + "pt-BR" to "Jogo de cartas", + "ro" to "Joc de cărți", + "ru" to "Карточная игра", + "vi" to "Game bài", + "zh-CN" to "纸牌游戏", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), + CategoryItem( + id = "Casual Game", + name = + mapOf( + "cs" to "Ležérní hra", + "de" to "Casual Game", + "en-GB" to "Casual Game", + "en-US" to "Casual Game", + "et" to "Vabaaja mäng", + "fr" to "Jeu occasionnel", + "ga" to "Cluiche Ócáideach", + "id" to "Game Kasual", + "ja" to "カジュアルゲーム", + "nl" to "Casual spel", + "pl" to "Gra rekreacyjna", + "pt-BR" to "Jogo casual", + "ro" to "Joc ocazional", + "ru" to "Казуальная игра", + "vi" to "Game casual", + "zh-CN" to "休闲游戏", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "Clock", name = mapOf( "ar" to "ساعة", + "be" to "Гадзіннік", + "bg" to "Часовник", "br" to "Horolaj", "ca" to "Rellotge", "cs" to "Hodiny", @@ -425,6 +596,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "es" to "Reloj", "et" to "Kellad", "fa" to "ساعت", + "fi" to "Kello", "fr" to "Horloge", "ga" to "Clog", "he" to "שעון", @@ -432,6 +604,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "hu" to "Óra", "id" to "Jam", "is" to "Klukka", + "it" to "Orologio", "ja" to "時計", "kn" to "ಗಡಿಯಾರ", "ko" to "시계", @@ -441,9 +614,12 @@ fun getCategoryItems(localeList: LocaleListCompat) = "nl" to "Klok", "nl-BE" to "Klok", "pl" to "Zegar", + "pt" to "Relógio", "pt-BR" to "Relógio", + "pt-PT" to "Relógio", "ro" to "Ceas", "ru" to "Часы", + "sk" to "Hodiny", "sl" to "Ura", "sq" to "Sahat", "sr" to "Часовник", @@ -462,12 +638,13 @@ fun getCategoryItems(localeList: LocaleListCompat) = name = mapOf( "ar" to "التخزين السحابي ومزامنة الملفات", + "be" to "Воблачнае Сховішча і сінхранізацыя файлаў", "bg" to "Облачно хранилище и синхронизиране", "ca" to "Emmagatzematge al núvol i sincronització d'arxius", "cs" to "Cloudové úložiště a synchronizace souborů", "da" to "Cloudlager og filsynkronisering", - "de" to "Cloud-Speicher / Dateisynchronisierung", - "el" to "Cloud Αποθηκευτικός Χώρος & Συγχρονισμός Αρχείων", + "de" to "Cloudspeicher / Dateisynchronisierung", + "el" to "Μεταφόρτωση και συγχρονισμός αρχείων", "en-GB" to "Cloud Storage & File Sync", "en-US" to "Cloud Storage & File Sync", "eo" to "Nuba konservado kaj dosiera samtempigo", @@ -491,7 +668,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "lv" to "Mākoņkrātuve un datņu sinhronizēšana", "my" to "Cloud သိုလှောင်မှုနှင့် ဖိုင်ချိတ်ဆက်ခြင်း", "nb" to "Skylagring & Filsynkronisering", - "nl" to "Cloudopslag & bestandssynchronisatie", + "nl" to "Cloudopslag & Bestanden Synchroniseren", "nl-BE" to "Cloud opslag & Bestand Synchronisatie", "pl" to "Przechowywanie w chmurze i synchronizacja plików", "pt" to "Armazenamento na nuvem e sincronização de ficheiros", @@ -500,6 +677,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Stocare în cloud & Sincronizare fișiere", "ru" to "Хранение и синхронизация", "sc" to "Archiviatzione in sa nue e sincronizada de documentos", + "sk" to "Úložisko v cloude a synchronizácia súborov", "sl" to "Shranjevanje v oblaku in sinhronizacija datotek", "sq" to "Depozitim Në Re & Njëkohësim Kartelash", "sr" to "Складиште у облаку и усклађивање датотека", @@ -585,7 +763,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Conectivitate", "ru" to "Связь", "sc" to "Connetividade", - "sk" to "Pripojiteľnosť", + "sk" to "Pripojenie", "sl" to "Povezljivost", "sn" to "Mahakiro", "so" to "Ku", @@ -614,6 +792,8 @@ fun getCategoryItems(localeList: LocaleListCompat) = name = mapOf( "ar" to "التواصل", + "be" to "Кантакты", + "bg" to "Контакт", "ca" to "Contacte", "cs" to "Kontakt", "da" to "Kontakt", @@ -625,6 +805,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "es" to "Contactos", "et" to "Kontaktihaldus", "fa" to "آشنا", + "fi" to "Yhteystiedot", "fr" to "Contact", "ga" to "Teagmháil", "he" to "פרטי קשר", @@ -632,6 +813,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "hu" to "Névjegy", "id" to "Kontak", "is" to "Tengiliðir", + "it" to "Contatto", "ja" to "連絡", "kn" to "ಸಂಪರ್ಕಿಸಿ", "ko" to "연락처", @@ -640,9 +822,12 @@ fun getCategoryItems(localeList: LocaleListCompat) = "nl" to "Contact", "nl-BE" to "Contact", "pl" to "Kontakt", + "pt" to "Contacto", "pt-BR" to "Contato", + "pt-PT" to "Contacto", "ro" to "Contact", "ru" to "Контакты", + "sk" to "Kontakty", "sl" to "Stiki", "sq" to "Kontakt", "sr" to "Додир", @@ -651,7 +836,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "tr" to "İletişim", "uk" to "Контакти", "vi" to "Danh bạ", - "zh-CN" to "联络", + "zh-CN" to "联系人", "zh-TW" to "聯絡", ) .getBestLocale(localeList) ?: "Unknown Category", @@ -720,7 +905,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "nl-BE" to "Ontwikkeling", "nn" to "Utvikling", "pa" to "ਡਿਵੈਲਪਮੈਂਟ", - "pl" to "Rozwój", + "pl" to "Rozwój oprogramowania", "ps" to "پرمختيا", "pt" to "Desenvolvimento", "pt-BR" to "Desenvolvimento", @@ -752,12 +937,75 @@ fun getCategoryItems(localeList: LocaleListCompat) = ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "Dice", + name = + mapOf( + "ar" to "النرد", + "cs" to "Kostky", + "de" to "Würfel", + "en-GB" to "Dice", + "en-US" to "Dice", + "et" to "Täringumängud", + "fa" to "تاس", + "fr" to "Dés", + "ga" to "Dísle", + "id" to "Dadu", + "ja" to "賽子", + "nl" to "Dobbelsteen", + "pl" to "Kości", + "pt-BR" to "Dados", + "ro" to "Zar", + "ru" to "Игральные кости", + "vi" to "Xúc xắc", + "zh-CN" to "骰子", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), + CategoryItem( + id = "Diet", + name = + mapOf( + "ar" to "حمية", + "cs" to "Dieta", + "de" to "Diät", + "el" to "Δίαιτα", + "en-GB" to "Diet", + "en-US" to "Diet", + "eo" to "Dieto", + "es" to "Dieta", + "et" to "Toiduvalik", + "fa" to "رژیم", + "fr" to "Régime alimentaire", + "ga" to "Aiste bia", + "hr" to "Dijeta", + "hu" to "Étrend", + "id" to "Diet", + "is" to "Mataræði", + "ja" to "ダイエット", + "nl" to "Diëet", + "pl" to "Dieta", + "pt" to "Dieta", + "pt-BR" to "Dieta", + "pt-PT" to "Dieta", + "ro" to "Dietă", + "ru" to "Диета", + "sk" to "Strava", + "sl" to "Dieta", + "sr" to "Исхрана", + "tr" to "Diyet", + "vi" to "Ăn kiêng", + "zh-CN" to "饮食", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "DNS & Hosts", name = mapOf( "ar" to "DNS والمضيفون", "ba" to "DNS һәм хост", + "be" to "DNS і хасты", "bg" to "DNS и хостове", "ca" to "DNS i Allotjament", "cs" to "DNS a hostitelé", @@ -767,7 +1015,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "en-GB" to "DNS & Hosts", "en-US" to "DNS & Hosts", "eo" to "DNS kaj retgastigo", - "es" to "DNS y bloqueos de red", + "es" to "DNS y Hospedajes", "et" to "Nimelahendus ja hostid", "fa" to "ساناد و میزبان‌ها", "fr" to "DNS & Hôtes", @@ -794,6 +1042,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "DNS & Gazde", "ru" to "DNS и хосты", "sc" to "DNS e retzidores (hosts)", + "sk" to "DNS a hostitelia", "sl" to "DNS in gostitelji", "sq" to "DNS & Strehë", "sr" to "ДНС и домаћини", @@ -809,11 +1058,28 @@ fun getCategoryItems(localeList: LocaleListCompat) = ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "Download", + name = + mapOf( + "cs" to "Stahování", + "de" to "Download", + "en-US" to "Download", + "et" to "Allalaadimised", + "fa" to "بارگیری", + "pl" to "Pobieranie", + "pt-BR" to "Download", + "ro" to "Descărcare", + "zh-CN" to "下载", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "Draw", name = mapOf( "ar" to "رسم", + "be" to "Маляванне", "bg" to "Рисуване", "ca" to "Dibuix", "cs" to "Kreslení", @@ -852,6 +1118,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Desen", "ru" to "Рисование", "sc" to "Disinnu", + "sk" to "Kreslenie", "sl" to "Riši", "sq" to "Vizatim", "sr" to "Цртање", @@ -872,16 +1139,17 @@ fun getCategoryItems(localeList: LocaleListCompat) = name = mapOf( "ar" to "قارئ الكتب الإلكترونية", + "be" to "Чытальнікі электронных кніг", "bg" to "Четене на електронни книги", "ca" to "Lector de llibres electrònics", "cs" to "Čtečka e-knih", "da" to "E-bogslæser", "de" to "E-Book-Reader", - "el" to "Αναγνώστης ηλεκτρονικών βιβλίων", + "el" to "Ανάγνωση ηλεκτρονικών βιβλίων", "en-GB" to "Ebook Reader", "en-US" to "Ebook Reader", "eo" to "Legiloj de bitlibroj", - "es" to "Lector de libros electrónicos", + "es" to "Lector de libro-e", "et" to "E-raamatute lugemine", "fa" to "کتابخوان", "fi" to "E-kirjan lukija", @@ -910,6 +1178,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Carte electronică", "ru" to "Читалки", "sc" to "Leghidore de libros eletrònicos", + "sk" to "Čítačka e-kníh", "sl" to "Bralnik e-knjig", "sq" to "Lexues Elibrash", "sr" to "Читач е-књига", @@ -925,23 +1194,49 @@ fun getCategoryItems(localeList: LocaleListCompat) = ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "Educational Game", + name = + mapOf( + "ar" to "الالعاب التعليمية", + "cs" to "Vzdělávací hra", + "de" to "Lernspiel", + "en-GB" to "Educational Game", + "en-US" to "Educational Game", + "et" to "Harivad mängud", + "fa" to "بازی آموزشی", + "fr" to "Jeu éducatif", + "ga" to "Cluiche Oideachasúil", + "id" to "Game Edukasi", + "ja" to "教育向けゲーム", + "nl" to "Educatief spel", + "pl" to "Gra edukacyjna", + "pt-BR" to "Jogo educacional", + "ro" to "Joc educațional", + "ru" to "Образовательная игра", + "vi" to "Game giáo dục", + "zh-CN" to "益智游戏", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "Email", name = mapOf( "ar" to "البريد الإلكتروني", "ba" to "Email", + "be" to "Электронная пошта", "bg" to "Електронна поща", "br" to "Postel", "ca" to "Correu electrònic", "cs" to "E-mail", "da" to "E-mail", "de" to "E-Mail", - "el" to "Email", + "el" to "Ηλεκτρονικό ταχυδρομείο", "en-GB" to "Email", "en-US" to "Email", "eo" to "Retpoŝto", - "es" to "Correo electrónico", + "es" to "Correo-e", "es-MX" to "Email", "et" to "E-post", "fa" to "رایانامه", @@ -956,6 +1251,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "is" to "Tölvupóstur", "it" to "Email", "ja" to "Eメール", + "kab" to "Imayl", "kn" to "ಇಮೇಲ್", "ko" to "이메일", "lb" to "E-Mail", @@ -972,6 +1268,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "E-mail", "ru" to "Электронная почта", "sc" to "Posta eletrònica", + "sk" to "E-mail", "sl" to "E-pošta", "sq" to "Email", "sr" to "Е-пошта", @@ -987,25 +1284,51 @@ fun getCategoryItems(localeList: LocaleListCompat) = ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "Emulator", + name = + mapOf( + "ar" to "مُحاكي", + "cs" to "Emulátor", + "de" to "Emulator", + "en-GB" to "Emulator", + "en-US" to "Emulator", + "et" to "Emulaatorid", + "fa" to "شبیه‌ساز", + "fr" to "Émulateur", + "ga" to "Aithriseoir", + "id" to "Emulator", + "ja" to "エミュレータ", + "nl" to "Emulator", + "pl" to "Emulator", + "pt-BR" to "Emulador", + "ro" to "Emulator", + "ru" to "Эмулятор", + "vi" to "Giả lập", + "zh-CN" to "模拟器", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "File Encryption & Vault", name = mapOf( "ar" to "تعمية الملفات والخزنة", "ba" to "Файлдарҙы шифрлау һәм Һаҡлағыс", + "be" to "Шыфраванне файлаў і сховішча", "bg" to "Шифроване на файлове и хранилище", "ca" to "Xifratge de fitxers i caixa forta", "cs" to "Šifrování souborů a trezor", "da" to "Filkryptering og boks", "de" to "Dateiverschlüsselung / Tresor", - "el" to "Κρυπτογράφηση Αρχείων & Ασφαλής Φάκελος", + "el" to "Κρυπτογράφηση Αρχείων & Φακέλων", "en-GB" to "File Encryption & Vault", "en-US" to "File Encryption & Vault", "eo" to "Dosiera ĉifrado", "es" to "Cifrado de archivos y bóvedas", "et" to "Krüptimine ja andmehoidlad", "fa" to "رمزنگاری پرونده", - "fi" to "Tiedoston salaus & holvi", + "fi" to "Tiedostojen salaus", "fr" to "Chiffrement de fichiers & Coffre-fort", "ga" to "Criptiú Comhad & Cruinneachán", "he" to "הצפנת קבצים וכספת", @@ -1020,7 +1343,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "lv" to "Datņu šifrēšana un glabātava", "my" to "ဖိုင်လုံခြုံရေး နှင့် သိုလှောင်ခန်း", "nb" to "Filkryptering & Hvelv", - "nl" to "Bestandsversleuteling & kluis", + "nl" to "Bestandsversleuteling & Kluis", "nl-BE" to "Bestanden versleuteling en kluis", "pl" to "Szyfrowanie plików i sejf", "pt" to "Criptografia de ficheiros e cofre", @@ -1029,6 +1352,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Criptare fișiere și seif", "ru" to "Шифрование файлов", "sc" to "Tzifradura de documentos e cassaforte", + "sk" to "Šifrovanie súborov a trezor", "sl" to "Šifriranje datotek in trezor", "sq" to "Fshehtëzim & Kasafortë Kartelash", "sr" to "Шифровање и складиштење датотека", @@ -1044,12 +1368,29 @@ fun getCategoryItems(localeList: LocaleListCompat) = ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "File Manager", + name = + mapOf( + "cs" to "Správce souborů", + "de" to "Dateimanager", + "en-US" to "File Manager", + "et" to "Failihaldurid", + "fa" to "مدیر پرونده", + "pl" to "Menedżer plików", + "pt-BR" to "Gerenciador de arquivos", + "ro" to "Manager fișier", + "zh-CN" to "文件管理器", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "File Transfer", name = mapOf( "ar" to "نقل الملفات", "ba" to "Файлдарҙы тапшырыу", + "be" to "Перадача файлаў", "bg" to "Прехвърляне на файлове", "ca" to "Transferències de fitxers", "cs" to "Přenos souborů", @@ -1059,7 +1400,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "en-GB" to "File Transfer", "en-US" to "File Transfer", "eo" to "Dosiera kunhavigo", - "es" to "Transferencia de archivos", + "es" to "Transferencia de archivo", "et" to "Failide edastamine", "fa" to "انتقال پرونده", "fi" to "Tiedostonsiirto", @@ -1087,6 +1428,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Transfer fișiere", "ru" to "Передача файлов", "sc" to "Tràmuda de documentos", + "sk" to "Prenos súborov", "sl" to "Posredovanje datotek", "sq" to "Shpërngulje Kartelash", "sr" to "Пренос датотека", @@ -1107,18 +1449,20 @@ fun getCategoryItems(localeList: LocaleListCompat) = name = mapOf( "ar" to "مدير مالي", + "be" to "Кіраўнік Фінансаў", "bg" to "Управление на файлове", "ca" to "Gestor de finances", "cs" to "Správce financí", "da" to "Økonomihåndtering", "de" to "Finanzmanager", - "el" to "Διαχειριστής Οικονομικών", + "el" to "Διαχείριση Οικονομικών", "en-GB" to "Finance Manager", "en-US" to "Finance Manager", "eo" to "Financ-administriloj", "es" to "Contabilidad y finanzas", "et" to "Rahahaldus", "fa" to "مدیر مالی", + "fi" to "Raha-asiat", "fr" to "Gestionnaire de finances", "ga" to "Bainisteoir Airgeadais", "he" to "ניהול כספים", @@ -1143,6 +1487,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Manager financiar", "ru" to "Финансовый менеджер", "sc" to "Gestore de finàntzias", + "sk" to "Správca financií", "sl" to "Upravitelj financ", "sq" to "Përgjegjës Financash", "sr" to "Управник новцем", @@ -1162,17 +1507,20 @@ fun getCategoryItems(localeList: LocaleListCompat) = name = mapOf( "ar" to "جدار حماية", + "be" to "Заслона", + "bg" to "Защитна стена", "ca" to "Tallafoc", "cs" to "Firewall", "da" to "Firewall", "de" to "Firewall", - "el" to "Τοίχος Προστασίας", + "el" to "Τείχος Προστασίας", "en-GB" to "Firewall", "en-US" to "Firewall", "eo" to "Farjoŝirmiloj", "es" to "Cortafuegos", "et" to "Tulemüürid", "fa" to "دیوار آتش", + "fi" to "Palomuuri", "fr" to "Pare-feu", "ga" to "Balla dóiteáin", "he" to "חומת אש", @@ -1180,6 +1528,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "hu" to "Tűzfal", "id" to "Firewall", "is" to "Eldveggur", + "it" to "Firewall", "ja" to "ファイアウォール", "kn" to "ಫೈರ್ವಾಲ್", "ko" to "방화벽", @@ -1189,11 +1538,15 @@ fun getCategoryItems(localeList: LocaleListCompat) = "nl" to "Firewall", "nl-BE" to "Firewall", "pl" to "Zapora", + "pt" to "Firewall", "pt-BR" to "Firewall", + "pt-PT" to "Firewall", "ro" to "Firewall", "ru" to "Брандмауэр", + "sk" to "Firewall", "sl" to "Požarni zid", "sq" to "Firewall", + "sr" to "Ватрени зид", "sv" to "Brandvägg", "sw" to "Firewall", "tr" to "Güvenlik Duvarı", @@ -1204,11 +1557,57 @@ fun getCategoryItems(localeList: LocaleListCompat) = ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "Flashlight", + name = + mapOf( + "ar" to "مصباح", + "be" to "Ліхтарык", + "bg" to "Фенерче", + "ca" to "Llanterna", + "cs" to "Svítilna", + "de" to "Taschenlampe", + "el" to "Φακός", + "en-GB" to "Torch", + "en-US" to "Flashlight", + "eo" to "Poŝlampo", + "es" to "Linterna", + "et" to "Välklambid", + "fa" to "چراغ‌قوه", + "fi" to "Taskulamppu", + "fr" to "Lampe de poche", + "ga" to "Tóirse", + "hr" to "Svjetiljka", + "hu" to "Zseblámpa", + "id" to "Senter", + "is" to "Vasaljós", + "it" to "Torcia", + "ja" to "懐中電灯", + "nb" to "Lommelykt", + "nl" to "Zaklamp", + "pl" to "Latarka", + "pt" to "Lanterna", + "pt-BR" to "Lanterna", + "pt-PT" to "Lanterna", + "ro" to "Lanternă", + "ru" to "Фонарик", + "sk" to "Baterka", + "sl" to "Svetilka", + "sr" to "Лампе", + "tr" to "Fener", + "uk" to "Ліхтарик", + "vi" to "Đèn pin", + "zh-CN" to "手电筒", + "zh-TW" to "手電筒", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "Forum", name = mapOf( "ar" to "المنتدى", + "be" to "Форум", "bg" to "Форум", "br" to "Forom", "ca" to "Fòrum", @@ -1222,6 +1621,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "es" to "Foros", "et" to "Foorumid", "fa" to "انجمن", + "fi" to "Foorumi", "fr" to "Forum", "ga" to "Fóram", "he" to "פורום", @@ -1246,8 +1646,10 @@ fun getCategoryItems(localeList: LocaleListCompat) = "pt-PT" to "Fórum", "ro" to "Forum", "ru" to "Форум", + "sk" to "Fórum", "sl" to "Klepetalnica", "sq" to "Forum", + "sr" to "Збор", "sv" to "Forum", "sw" to "Jukwaa la majadiliano", "ta" to "மன்றம்", @@ -1264,6 +1666,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = name = mapOf( "ar" to "معرض", + "be" to "Галерэя", "bg" to "Галерия", "ca" to "Galeria", "cs" to "Galerie", @@ -1302,6 +1705,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Galerie", "ru" to "Галерея", "sc" to "Galleria", + "sk" to "Galéria", "sl" to "Galerija", "sq" to "Galeri", "sr" to "Излог слика", @@ -1318,100 +1722,27 @@ fun getCategoryItems(localeList: LocaleListCompat) = .getBestLocale(localeList) ?: "Unknown Category", ), CategoryItem( - id = "Games", + id = "Game Helper", name = mapOf( - "af" to "Speletjies", - "ar" to "الألعاب", - "ast" to "Xuegos", - "ba" to "Уйындар", - "be" to "Гульні", - "ber" to "ⵓⵔⴰⵔⵏ", - "bg" to "Игри", - "bn" to "গেমস", - "bn-BD" to "গেমস", - "bo" to "རྩེད་རིགས།", - "br" to "C'hoarioù", - "ca" to "Jocs", - "ckb" to "یاری", - "cs" to "Hry", - "cy" to "Gemau", - "da" to "Spil", - "de" to "Spiele", - "el" to "Παιχνίδια", - "en-GB" to "Games", - "en-US" to "Games", - "eo" to "Ludoj", - "es" to "Juegos", - "es-AR" to "Juegos", - "es-MX" to "Juegos", - "et" to "Mängud", - "eu" to "Jolasak", - "fa" to "بازی", - "fi" to "Pelit", - "fil" to "Laro", - "fr" to "Jeux", - "fy" to "Spultsjes", - "ga" to "Cluichí", - "gd" to "Geamannan", - "gl" to "Xogos", - "he" to "משחקים", - "hi" to "गेम्स", - "hr" to "Igre", - "hu" to "Játékok", - "hy" to "Խաղեր", - "id" to "Permainan", - "is" to "Leikir", - "it" to "Giochi", - "ja" to "ゲーム", - "kab" to "Uraren", - "kmr" to "Lîsk", - "kn" to "ಆಟಗಳು", - "ko" to "게임", - "lb" to "Spiller", - "lt" to "Žaidimai", - "lv" to "Spēles", - "mk" to "Игри", - "ml" to "കളികൾ", - "mn" to "Тоглоомууд", - "mr" to "खेळ", - "my" to "ဂိမ်းများ", - "nb" to "Spill", - "ne" to "खेलहरू", - "nl" to "Spellen", - "nl-BE" to "Spellen", - "nn" to "Spel", - "pa" to "ਖੇਡਾਂ", - "pl" to "Gry", - "ps" to "لوبې", - "pt" to "Jogos", - "pt-BR" to "Jogos", - "pt-PT" to "Jogos", - "ro" to "Jocuri", - "ru" to "Игры", - "sc" to "Giogos", - "si" to "ක්‍රීඩා", - "sk" to "Hry", - "sl" to "Igre", - "sn" to "Mitambo", - "so" to "Geemamka", - "sq" to "Lojëra", - "sr" to "Игре", - "sv" to "Spel", - "sw" to "Michezo", - "ta" to "விளையாட்டுகள்", - "te" to "ఆట", - "th" to "เกม", - "tr" to "Oyunlar", - "tzm" to "uraren", - "ug" to "ئويۇنلار", - "uk" to "Ігри", - "ur" to "گیمس", - "vi" to "Trò chơi", - "yue" to "遊戲", - "zh-CN" to "游戏", - "zh-HK" to "遊戲", - "zh-TW" to "遊戲", + "ar" to "مُساعد الالعاب", + "cs" to "Herní pomocník", + "de" to "Spielhilfe", + "en-GB" to "Game Helper", + "en-US" to "Game Helper", + "et" to "Mängude abitarvikud", + "fa" to "یاریگر بازی", + "fr" to "Aide au jeu", + "ga" to "Cúntóir Cluiche", + "id" to "Bantuan Game", + "ja" to "ゲームヘルパー", + "nl" to "Spellenhelper", + "pl" to "Pomocnik do gry", + "pt-BR" to "Ajudante de jogo", + "ro" to "Instrument de ajutor pentru joc", + "ru" to "Игровой помощник", + "vi" to "Trợ giúp game", + "zh-CN" to "游戏助手", ) .getBestLocale(localeList) ?: "Unknown Category", ), @@ -1444,7 +1775,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "es-MX" to "Gráficos", "et" to "Graafika", "eu" to "Grafikoak", - "fa" to "گرافیک", + "fa" to "نگاشتار", "fi" to "Grafiikka", "fil" to "Grapiks", "fr" to "Graphisme", @@ -1520,13 +1851,14 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ca" to "Registre d'hàbits", "cs" to "Sledování návyků", "de" to "Gewohnheitstracker", - "el" to "Ιχνηλάτης Συνηθειών", + "el" to "Καταγραφή Συνηθειών", "en-GB" to "Habit Tracker", "en-US" to "Habit Tracker", "eo" to "Spuriloj de kutimoj", "es" to "Seguimiento de hábitos", "et" to "Elustiil", "fa" to "ردیاب عادت", + "fi" to "Rutiinien seuranta", "fr" to "Suivi des habitudes", "ga" to "Rianaitheoir Nósanna", "he" to "מעקב הרגלים", @@ -1550,8 +1882,10 @@ fun getCategoryItems(localeList: LocaleListCompat) = "pt-PT" to "Rastejador de hábitos", "ro" to "Jurnal de obiceiuri", "ru" to "Трекер привычек", + "sk" to "Sledovanie návykov", "sl" to "Sledilnik navad", "sq" to "Ndjekës Zakonesh", + "sr" to "Праћење навика", "sv" to "Vanespårare", "sw" to "Kifuatilia Tabia", "ta" to "பழக்கமான டிராக்கர்", @@ -1563,17 +1897,52 @@ fun getCategoryItems(localeList: LocaleListCompat) = ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "Health Manager", + name = + mapOf( + "ar" to "مدير الصحة", + "cs" to "Správce zdraví", + "de" to "Gesundheitsmanager", + "el" to "Διαχείριση Υγείας", + "en-GB" to "Health Manager", + "en-US" to "Health Manager", + "eo" to "Administriloj de sano", + "et" to "Tervisehaldus", + "fa" to "مدیر سلامتی", + "fr" to "Responsable santé", + "ga" to "Bainisteoir Sláinte", + "hr" to "Upravljač zdravljem", + "hu" to "Egészségkezelő", + "id" to "Manajer Kesehatan", + "is" to "Heilsustjórnun", + "ja" to "健康管理", + "nl" to "Gezondheidsbeheer", + "pl" to "Menedżer zdrowia", + "pt" to "Gestão de saúde", + "pt-BR" to "Gerenciamento de saúde", + "pt-PT" to "Gestão de saúde", + "ro" to "Manager de sănătate", + "sk" to "Správca zdravia", + "sl" to "Upravljalnik zdravja", + "tr" to "Sağlık Yönetimi", + "vi" to "Quản lý sức khỏe", + "zh-CN" to "健康管理工具", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "Icon Pack", name = mapOf( "ar" to "حزمة الأيقونات", + "be" to "Пачкі значкоў", "bg" to "Пакет с пиктограми", "ca" to "Pack d'icones", "cs" to "Balíček ikon", "da" to "Ikonpakke", - "de" to "Symbol-Paket", - "el" to "Πακέτο Εικονιδίων", + "de" to "Symbolpaket", + "el" to "Πακέτα Εικονιδίων", "en-GB" to "Icon Pack", "en-US" to "Icon Pack", "eo" to "Bildsimbol-pakaĵoj", @@ -1605,6 +1974,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Pachet iconițe", "ru" to "Наборы значков", "sc" to "Pachete de iconas", + "sk" to "Balík ikon", "sl" to "Zbirka ikon", "sq" to "Paketë Ikonash", "sr" to "Омот сличица", @@ -1723,17 +2093,19 @@ fun getCategoryItems(localeList: LocaleListCompat) = name = mapOf( "ar" to "جرد", + "be" to "Інвэнтар", "ca" to "Inventari", "cs" to "Inventář", "da" to "Inventar", "de" to "Inventar", - "el" to "Απόθεμα", + "el" to "Απογραφή", "en-GB" to "Inventory", "en-US" to "Inventory", "eo" to "Administriloj de posedaĵoj", "es" to "Inventario", "et" to "Varahaldus", "fa" to "موجودی", + "fi" to "Varasto", "fr" to "Inventaire", "ga" to "Fardal", "he" to "מלאי", @@ -1750,8 +2122,12 @@ fun getCategoryItems(localeList: LocaleListCompat) = "nl" to "Inventarisatie", "nl-BE" to "Voorraad", "pl" to "Zasoby", + "pt" to "Inventário", "pt-BR" to "Inventário", + "pt-PT" to "Inventário", "ro" to "Inventar", + "ru" to "Инвентарь", + "sk" to "Inventár", "sl" to "Popis imetja", "sq" to "Inventar", "sv" to "Inventarie", @@ -1769,6 +2145,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = name = mapOf( "ar" to "لوحة المفاتيح وIME", + "be" to "Клавіятура і ўвод", "bg" to "Клавиатура и въвеждане", "ca" to "Teclat i IME", "cs" to "Klávesnice a IME", @@ -1806,6 +2183,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Tastatură & IME", "ru" to "Клавиатуры и ввод", "sc" to "Tecladu e mètodos de intrada (IME)", + "sk" to "Klávesnica a IME", "sl" to "Tipkovnica in urejevalec vnosa IME", "sq" to "Tastierë & IME", "sr" to "Тастатура и начин уноса", @@ -1826,12 +2204,13 @@ fun getCategoryItems(localeList: LocaleListCompat) = name = mapOf( "ar" to "مُطلِق", + "be" to "Запускальнік", "bg" to "Начален екран", "ca" to "Llançador", "cs" to "Launcher", "da" to "Launcher", "de" to "Launcher", - "el" to "Εκκινητής", + "el" to "Εκκίνηση Εφαρμογών", "en-GB" to "Launcher", "en-US" to "Launcher", "eo" to "Aplikaĵlanĉiloj", @@ -1863,6 +2242,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Lansator", "ru" to "Лаунчер", "sc" to "Aviadores de aplicatziones", + "sk" to "Spúšťač", "sl" to "Zaganjalnik", "sq" to "Nisës", "sr" to "Покретач", @@ -1883,6 +2263,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = name = mapOf( "ar" to "مشغل الوسائط المحلي", + "be" to "Лакальны Медыя Прайгравальнік", "bg" to "Местно изпълняване на медия", "ca" to "Reproductor local de mitjans", "cs" to "Přehrávač lokálních médií", @@ -1920,6 +2301,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Vizualizator media local", "ru" to "Медиаплееры", "sc" to "Leghidore multimediale locale", + "sk" to "Prehrávač miestnych médií", "sl" to "Lokalni predvajalnik glasbe", "sq" to "Lojtës Mediash Vendore", "sr" to "Местни извођач садржаја", @@ -1940,17 +2322,19 @@ fun getCategoryItems(localeList: LocaleListCompat) = name = mapOf( "ar" to "متتبع ومشارك الموقع", + "be" to "Адсочванне і абагульванне месцазнаходжання", "bg" to "Публикуване и споделяне на местоположение", "ca" to "Seguiment i compartició d'ubicació", "cs" to "Sledování a sdílení polohy", "de" to "Standort-Tracker / -Teiler", - "el" to "Ιχνηλάτης & Διαμοιραστής Τοποθεσίας", + "el" to "Εντοπισμός & Κοινοποίηση Τοποθεσίας", "en-GB" to "Location Tracker & Sharer", "en-US" to "Location Tracker & Sharer", "eo" to "Spuriloj (kaj kunhavigiloj) de pozicio", "es" to "Seguir y compartir mi ubicación", "et" to "Asukoha logimine ja jagamine", "fa" to "ردیابی و هم‌رسانی مکان", + "fi" to "Sijainnin seuranta ja jakaminen", "fr" to "Suivi & partage de localisation", "ga" to "Rianaitheoir Suímh & Roinnteoir", "he" to "מעקב ושיתוף מיקום", @@ -1968,9 +2352,12 @@ fun getCategoryItems(localeList: LocaleListCompat) = "nl" to "Locatie bijhouden en delen", "nl-BE" to "Locatietracker en -deler", "pl" to "Śledzenie i udostępnianie lokalizacji", + "pt" to "Rastreador e compartilhador de localização", "pt-BR" to "Rastreador e compartilhador de localização", + "pt-PT" to "Rastreador e compartilhador de localização", "ro" to "Localizare și partajare locație", "ru" to "Отслеживание и публикация местоположения", + "sk" to "Sledovanie a zdieľanie polohy", "sl" to "Sledilnik in delilnik položaja", "sq" to "Gjurmues & Dhënës Vendndodhjesh", "sv" to "Platsspårare och delare", @@ -1983,6 +2370,29 @@ fun getCategoryItems(localeList: LocaleListCompat) = ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "Meditation", + name = + mapOf( + "ar" to "الاسترخاء", + "cs" to "Meditace", + "de" to "Meditation", + "en-GB" to "Meditation", + "en-US" to "Meditation", + "et" to "Mediteerimine", + "fa" to "مراقبه", + "fr" to "Méditation", + "ga" to "Machnamh", + "nl" to "Meditatie", + "pl" to "Medytacja", + "pt-BR" to "Meditação", + "ro" to "Meditație", + "ru" to "Медитация", + "vi" to "Thiền", + "zh-CN" to "冥想", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "Messaging", name = @@ -2026,6 +2436,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Mesagerie", "ru" to "Сообщения", "sc" to "Messagìstica", + "sk" to "Správy", "sl" to "Sporočila", "sq" to "Shkëmbim Mesazhesh", "sr" to "Поруке", @@ -2112,7 +2523,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Finanțe", "ru" to "Финансы", "sc" to "Dinare", - "sk" to "Financie", + "sk" to "Peniaze", "sl" to "Denar", "sn" to "Mari", "so" to "Lacag", @@ -2234,17 +2645,19 @@ fun getCategoryItems(localeList: LocaleListCompat) = id = "Music Practice Tool", name = mapOf( + "ar" to "أداة تدريب موسيقية", "bg" to "Инструмент за музикална практика", "ca" to "Eina de pràctica musical", "cs" to "Nástroj pro cvičení hudby", "de" to "Musikübungstool", - "el" to "Εργαλείο Εξάσκησης Μουσικής", + "el" to "Μουσική εξάσκηση", "en-GB" to "Music Practice Tool", "en-US" to "Music Practice Tool", "eo" to "Muzik-ekzerciloj", "es" to "Práctica musical", "et" to "Muusikatarvikud", "fa" to "ابزار تمرین آهنگ", + "fi" to "Soitonharjoittelu", "fr" to "Outil de pratique musicale", "ga" to "Uirlis Cleachtaidh Ceoil", "he" to "כלי תרגול מוזיקה", @@ -2260,7 +2673,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "lv" to "Mūzikas vingrināšanās rīks", "my" to "ဂီတလေ့ကျင့်ရေး ကိရိယာ", "nb" to "Musikkøvingsverktøy", - "nl" to "Hulpmiddelen voor muzikanten", + "nl" to "Hulpmiddel om muziek te oefenen", "nl-BE" to "Muziek oefentool", "pl" to "Narzędzie do ćwiczeń muzycznych", "pt" to "Ferramenta de prática musical", @@ -2268,9 +2681,10 @@ fun getCategoryItems(localeList: LocaleListCompat) = "pt-PT" to "Ferramenta de prática musical", "ro" to "Instrumentul de practică muzicală", "ru" to "Инструмент для музыкальной практики", + "sk" to "Nástroje na cvičenie hudby", "sl" to "Orodje za vadbo glasbe", "sq" to "Mjet Praktimi Muzike", - "sv" to "Muskikövningsapp", + "sv" to "Musikövningsapp", "sw" to "Zana ya Mazoezi ya Muziki", "ta" to "இசை பயிற்சி கருவி", "tr" to "Müzik Çalışma Aracı", @@ -2383,13 +2797,14 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ca" to "Analitzador de xarxa", "cs" to "Analýza sítě", "de" to "Netzwerkanalyse", - "el" to "Αναλυτής Δικτύου", + "el" to "Διάγνωση Δικτύου", "en-GB" to "Network Analyser", "en-US" to "Network Analyzer", "eo" to "Analiziloj de retkonektoj", "es" to "Diagnósticos de red", "et" to "Võrguanalüüs", "fa" to "تحلیلگر شبکه", + "fi" to "Verkkoanalysaattori", "fr" to "Analyseur de réseau", "ga" to "Anailíseoir Líonra", "he" to "מאבחן רשת", @@ -2397,6 +2812,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "hu" to "Hálózatelemző", "id" to "Penganalisis Jaringan", "is" to "Greining netkerfa", + "it" to "Analizzatore di rete", "ja" to "ネットワークアナライザ", "kn" to "ನೆಟ್‌ವರ್ಕ್ ವಿಶ್ಲೇಷಕ", "ko" to "네트워크 분석기", @@ -2406,9 +2822,12 @@ fun getCategoryItems(localeList: LocaleListCompat) = "nl" to "Netwerkanalyse", "nl-BE" to "Netwerk analysetool", "pl" to "Analizator sieci", + "pt" to "Analisador de rede", "pt-BR" to "Analisador de rede", + "pt-PT" to "Analisador de rede", "ro" to "Analiză rețea", "ru" to "Сетевой анализатор", + "sk" to "Analyzátor siete", "sl" to "Pregledovalnik omrežja", "sq" to "Analizues Rrjeti", "sw" to "Kichanganuzi cha Mtandao", @@ -2435,7 +2854,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "en-GB" to "News", "en-US" to "News", "eo" to "Legiloj de novaĵoj", - "es" to "Noticias", + "es" to "Novedades", "et" to "Uudised", "fa" to "اخبار", "fi" to "Uutiset", @@ -2448,6 +2867,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "is" to "Fréttir", "it" to "Notizie", "ja" to "ニュース", + "kab" to "Isallen", "kn" to "ಸುದ್ದಿ", "ko" to "뉴스", "lb" to "Noriichten", @@ -2464,6 +2884,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Știri", "ru" to "Новости", "sc" to "Novas", + "sk" to "Správy", "sl" to "Novice", "sq" to "Lajme", "sr" to "Вести", @@ -2496,6 +2917,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "es" to "Notas", "et" to "Märkmikud", "fa" to "یادداشت", + "fi" to "Muistiinpano", "fr" to "Note", "ga" to "Nóta", "he" to "הערה", @@ -2505,6 +2927,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "is" to "Minnispunktur", "it" to "Appunti", "ja" to "ノート", + "kab" to "Tazmilt", "kn" to "ಗಮನಿಸಿ", "ko" to "메모", "lb" to "Notiz", @@ -2521,6 +2944,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Notițe", "ru" to "Заметки", "sc" to "Nota", + "sk" to "Poznámky", "sl" to "Beležka", "sq" to "Shënim", "sr" to "Белешка", @@ -2546,7 +2970,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "cs" to "Přehrávač online médií", "da" to "Online medieafspiller", "de" to "Online-Mediaplayer", - "el" to "Διαδικτυακός Αναπαραγωγέας Πολυμέσων", + "el" to "Διαδικτυακή Αναπαραγωγή Πολυμέσων", "en-GB" to "Online Media Player", "en-US" to "Online Media Player", "eo" to "Ludiloj de foraj aŭdvidaĵoj", @@ -2577,6 +3001,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Vizualizator media pe Internet", "ru" to "Онлайн-медиаплееры", "sc" to "Leghidore multimediale in lìnia", + "sk" to "Prehrávač online médií", "sl" to "Predvajalnik spletnih vsebin", "sq" to "Lojtës Mediash Në Internet", "sr" to "Мрежни извођач садржаја", @@ -2592,6 +3017,30 @@ fun getCategoryItems(localeList: LocaleListCompat) = ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "Party Game", + name = + mapOf( + "ar" to "العاب الحفلة", + "cs" to "Párty hra", + "de" to "Partyspiel", + "en-GB" to "Party Game", + "en-US" to "Party Game", + "et" to "Peomängud", + "fa" to "بازی مهمانی", + "fr" to "Jeu de société", + "ga" to "Cluiche Cóisire", + "id" to "Game Pesta", + "ja" to "パーティゲーム", + "nl" to "Party spel", + "pl" to "Gra towarzyska", + "pt-BR" to "Jogo de festa", + "ro" to "Joc de petrecere", + "vi" to "Game party", + "zh-CN" to "派对游戏", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "Pass Wallet", name = @@ -2601,7 +3050,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ca" to "Cartera de paraules de pas", "cs" to "Peněženka na lístky", "de" to "Passcode-Wallet", - "el" to "Πορτοφόλι Πάσου", + "el" to "Πορτοφόλι Εισιτηρίων", "en-GB" to "Pass Wallet", "en-US" to "Pass Wallet", "eo" to "Biletujoj (por lojalec-kartoj)", @@ -2632,10 +3081,12 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Portofel tichete", "ru" to "Кошелек", "sc" to "Portafòlliu de cartas e billetes", + "sk" to "Peňaženka na preukazy", "sl" to "Denarnica kartic", "sq" to "Kuletë Fjalëkalimesh", "sr" to "Новчаник лозинки", "sv" to "Passplånbok", + "sw" to "Pass Wallet", "ta" to "பணப்பையை கடந்து செல்லுங்கள்", "tr" to "Şifre Cüzdanı", "ug" to "ئىم ھەميانى", @@ -2674,13 +3125,14 @@ fun getCategoryItems(localeList: LocaleListCompat) = "is" to "Lykilorð og 2FA", "it" to "Password & Autenticazione a 2 Fattori", "ja" to "パスワード&2要素認証", + "kab" to "Awal n uɛeddi & A2F", "kn" to "ಪಾಸ್ವರ್ಡ್", "ko" to "비밀번호 및 2단계 인증", "lt" to "Slaptažodžiai ir 2 fakt. autentif.", "lv" to "Paroles un divpakāpju autentificēšana", "my" to "စကားဝှက်နှင့် အဆင့်ဆင့်လုံခြုံရေး", "nb" to "Passord & 2FA", - "nl" to "Wachtwoorden & 2FA", + "nl" to "Wachtwoorden & Tweestaps-Authenticatie (2FA)", "nl-BE" to "Wachtwoord en 2FA", "pl" to "Hasło i uwierzytelnianie dwuskładnikowe (2FA)", "pt" to "Palavras-passe e dois fatores", @@ -2689,10 +3141,12 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Parole & 2FA", "ru" to "Пароли и авторизация", "sc" to "Crae de intrada e autenticatzione a duos fatores", + "sk" to "Heslá a 2FA", "sl" to "Gesla in dvostopenjsko preverjanje pristnosti", "sq" to "Fjalëkalime & 2FA", "sr" to "Лозинке и двострука пријава", "sv" to "Lösenord och 2FA", + "sw" to "Nenosiri na 2FA", "ta" to "கடவுச்சொல் & 2FA", "tr" to "Şifre & 2FA", "ug" to "ئىم ۋە ئىككى ئامىللىق دەلىللەش", @@ -2730,7 +3184,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "es" to "Llamadas de teléfono y SMS", "es-AR" to "Teléfono y SMS", "es-MX" to "Teléfono & SMS", - "et" to "Telefon & SMS", + "et" to "Telefon ja SMS", "eu" to "Telefonoa eta SMS", "fa" to "تلفن و پیامک", "fi" to "Puhelin ja tekstiviestit", @@ -2798,6 +3252,29 @@ fun getCategoryItems(localeList: LocaleListCompat) = ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "Platformer Game", + name = + mapOf( + "cs" to "Plošinová hra", + "de" to "Plattformspiel", + "en-GB" to "Platformer Game", + "en-US" to "Platformer Game", + "et" to "Platvormimängud", + "fa" to "بازی سکویی", + "fr" to "Jeu de plateforme", + "ga" to "Cluiche Ardáin", + "id" to "Game Platformer", + "ja" to "プラットフォーマーゲーム", + "nl" to "Platform spel", + "pl" to "Gra platformowa", + "pt-BR" to "Jogo de plataforma", + "ro" to "Joc platformer", + "vi" to "Game platformer", + "zh-CN" to "平台游戏", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "Podcast", name = @@ -2842,10 +3319,11 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Podcast", "ru" to "Подкасты", "sc" to "Podcast", + "sk" to "Podcast", "sl" to "Podkast", "sq" to "Podkast", "sr" to "Довод", - "sv" to "Pod", + "sv" to "Podd", "sw" to "Podikasti", "ta" to "போட்காச்ட்", "tr" to "Podcast", @@ -2874,7 +3352,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "es" to "Transporte público", "et" to "Ühistransport ja sõiduplaanid", "fa" to "حمل‌ونقل عمومی", - "fi" to "Joukkoliikenteen kartta ja aikataulu", + "fi" to "Joukkoliikenne", "fr" to "Transports en commun", "ga" to "Léarscáil & Amchlár Iompair Phoiblí", "he" to "מפה ולו״ז תחבורה ציבורית", @@ -2893,13 +3371,14 @@ fun getCategoryItems(localeList: LocaleListCompat) = "nb" to "Offentlig transport", "nl" to "Openbaar vervoer", "nl-BE" to "Openbaar vervoer", - "pl" to "Mapa transportu publicznego i rozkład jazdy", + "pl" to "Transport publiczny", "pt" to "Mapa de transporte público e horários", "pt-BR" to "Mapa de transporte público e horários", "pt-PT" to "Mapa de transporte público e horários", "ro" to "Transport public & Orar", "ru" to "Транспорт и расписания", "sc" to "Oràrios e mapas de sos trasportos pùblicos", + "sk" to "Verejná doprava", "sl" to "Javni prevoz", "sq" to "Transport Publik", "sr" to "Карта и ред вожње јавног превоза", @@ -2910,11 +3389,74 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ug" to "ئاممىۋى قاتناش خەرىتىسى ۋە ۋاقىت جەدۋىلى", "uk" to "Карта та розклад руху громадського транспорту", "vi" to "Phương tiện giao thông", - "zh-CN" to "公共交通地图和时间表", + "zh-CN" to "公共交通", "zh-TW" to "大眾運輸", ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "Puzzle Game", + name = + mapOf( + "ar" to "العاب الالغاز", + "cs" to "Logická hra", + "de" to "Puzzlespiel", + "en-GB" to "Puzzle Game", + "en-US" to "Puzzle Game", + "et" to "Mõistatusmängud", + "fa" to "بازی معمّایی", + "fr" to "Jeu de réflexion", + "ga" to "Cluiche Puzail", + "id" to "Game Puzzle", + "ja" to "パズルゲーム", + "nl" to "Puzzelspel", + "pl" to "Gra logiczna", + "pt-BR" to "Jogo de quebra-cabeça", + "ro" to "Jocuri de puzzle", + "vi" to "Game xếp hình", + "zh-CN" to "解谜游戏", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), + CategoryItem( + id = "Radio", + name = + mapOf( + "ar" to "مذياع", + "cs" to "Rádio", + "de" to "Radio", + "el" to "Ραδιόφωνο", + "en-GB" to "Radio", + "en-US" to "Radio", + "eo" to "Radio", + "es" to "Radio", + "et" to "Raadio", + "fa" to "رادیو", + "fi" to "Radio", + "fr" to "Radio", + "ga" to "Raidió", + "hr" to "Radio", + "hu" to "Rádió", + "id" to "Radio", + "is" to "Útvarp", + "ja" to "ラジオ", + "nb" to "Radio", + "nl" to "Radio", + "pl" to "Radio", + "pt" to "Rádio", + "pt-BR" to "Rádio", + "pt-PT" to "Rádio", + "ro" to "Radio", + "ru" to "Радио", + "sk" to "Rádio", + "sq" to "Radio", + "tr" to "Radyo", + "vi" to "Radio", + "zh-CN" to "收音机", + "zh-TW" to "收音機", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "Reading", name = @@ -3021,7 +3563,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ca" to "Gestor de receptes", "cs" to "Správce receptů", "de" to "Rezeptmanager", - "el" to "Διαχείριση συνταγών", + "el" to "Διαχείριση Συνταγών", "en-GB" to "Recipe Manager", "en-US" to "Recipe Manager", "eo" to "Administriloj de kuir-receptoj", @@ -3053,10 +3595,12 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Manager rețete", "ru" to "Рецепты", "sc" to "Manigiadore de retzetas", + "sk" to "Správca receptov", "sl" to "Upravitelj receptov", "sq" to "Përgjegjës Recetash Gatimi", "sr" to "Управник упутства", "sv" to "Recepthanterare", + "sw" to "Kidhibiti cha Mapishi", "ta" to "செய்முறை மேலாளர்", "tr" to "Tarif Yöneticisi", "ug" to "رىسالە باشقۇرغۇچ", @@ -3083,6 +3627,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "es" to "Religión", "et" to "Usk ja religioon", "fa" to "مذهبی", + "fi" to "Uskonto", "fr" to "Religion", "ga" to "Reiligiún", "he" to "דת", @@ -3090,18 +3635,22 @@ fun getCategoryItems(localeList: LocaleListCompat) = "hu" to "Vallás", "id" to "Agama", "is" to "Trúarbrögð", + "it" to "Religione", "ja" to "宗教", "kn" to "ಧರ್ಮ", "ko" to "종교", "lv" to "Ticība", "my" to "ဘာသာရေး", "nb" to "Religion", - "nl" to "Godsdienst", + "nl" to "Religie", "nl-BE" to "Religie", "pl" to "Religia", + "pt" to "Religião", "pt-BR" to "Religião", + "pt-PT" to "Religião", "ro" to "Religie", "ru" to "Религия", + "sk" to "Náboženstvo", "sl" to "Vera", "sq" to "Fe", "sv" to "Religion", @@ -3114,6 +3663,137 @@ fun getCategoryItems(localeList: LocaleListCompat) = ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "Role-Playing Game", + name = + mapOf( + "cs" to "Hra na hrdiny", + "de" to "Rollenspiel", + "en-GB" to "Role-playing Game", + "en-US" to "Role-playing Game", + "et" to "Rollimängud", + "fa" to "بازی نقش‌آفرینی", + "fr" to "Jeu de rôle", + "ga" to "Cluiche Ról-imirt", + "id" to "Game Bermain Peran", + "ja" to "ロールプレイングゲーム", + "nl" to "Rollenspel", + "pl" to "Gra fabularna", + "pt-BR" to "Jogo de RPG", + "ro" to "Joc de rol", + "vi" to "Game nhập vai", + "zh-CN" to "角色扮演游戏", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), + CategoryItem( + id = "Remote Access", + name = + mapOf( + "ar" to "الوصول عن بُعد", + "cs" to "Vzdálený přístup", + "de" to "Fernzugriff", + "el" to "Αποομακρυσμένη Πρόσβαση", + "en-GB" to "Remote Access", + "en-US" to "Remote Access", + "eo" to "Fora aliro", + "es" to "Acceso Remoto", + "et" to "Kaugligipääs", + "fa" to "دسترسی از راه دور", + "fi" to "Etäkäyttö", + "fr" to "Accès à distance", + "ga" to "Rochtain Chianda", + "hr" to "Udaljeni pristup", + "hu" to "Távoli elérés", + "id" to "Akses Jarak Jauh", + "is" to "Fjaraðgangur", + "ja" to "リモートアクセス", + "nb" to "Fjernkontroll", + "nl" to "Toegang op Afstand", + "pl" to "Zdalny dostęp", + "pt" to "Acesso remoto", + "pt-BR" to "Acesso remoto", + "pt-PT" to "Acesso remoto", + "ro" to "Acces la distanță", + "ru" to "Удаленный доступ", + "sk" to "Vzdialený prístup", + "tr" to "Uzaktan Erişim", + "vi" to "Truy cập từ xa", + "zh-CN" to "远程访问", + "zh-TW" to "遠端存取", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), + CategoryItem( + id = "Remote Controller", + name = + mapOf( + "ar" to "متحكم بعيد", + "cs" to "Vzdálené ovládání", + "de" to "Fernbedienung", + "el" to "Τηλεχειριστήριο", + "en-GB" to "Remote Controller", + "en-US" to "Remote Controller", + "eo" to "Teleregiloj", + "es" to "Mando a Distancia", + "et" to "Kaugjuhtimispuldid", + "fa" to "واپایش از راه دور", + "fi" to "Kaukosäädin", + "fr" to "Télécommande", + "ga" to "Rialaitheoir Cianrialtáin", + "hr" to "Daljinski upravljač", + "hu" to "Távirányító", + "id" to "Alat Kontrol Jarak Jauh", + "is" to "Fjarstýring", + "ja" to "リモコン", + "nb" to "Fjernkontroll", + "nl" to "Afstandsbediening", + "pl" to "Pilot", + "pt" to "Controlo remoto", + "pt-BR" to "Controle remoto", + "pt-PT" to "Controlo remoto", + "ro" to "Control la distanță", + "ru" to "Пульт дистанционного управления", + "sk" to "Diaľkové ovládanie", + "tr" to "Uzaktan Kumanda", + "vi" to "Điều khiển từ xa", + "zh-CN" to "遥控器", + "zh-TW" to "遙控器", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), + CategoryItem( + id = "Schedule", + name = + mapOf( + "ar" to "جدولة", + "cs" to "Plán", + "de" to "Terminplan", + "en-GB" to "Schedule", + "en-US" to "Schedule", + "eo" to "Horplanoj", + "et" to "Ürituste päevakavad", + "fa" to "زمان‌بندی", + "fr" to "Calendrier", + "ga" to "Sceideal", + "hr" to "Raspored termina", + "hu" to "Ütemezés", + "id" to "Jadwal", + "is" to "Vinnuáætlun", + "ja" to "スケジュール", + "nl" to "Rooster", + "pl" to "Harmonogram", + "pt" to "Agenda", + "pt-BR" to "Agenda", + "pt-PT" to "Agenda", + "ro" to "Planificare", + "sk" to "Plánovanie", + "tr" to "Planlama", + "vi" to "Lịch trình", + "zh-CN" to "计划", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "Science & Education", name = @@ -3142,7 +3822,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "es" to "Ciencia y Educación", "es-AR" to "Ciencias y Educación", "es-MX" to "Ciencia y Educación", - "et" to "Teadus & haridus", + "et" to "Teadus ja haridus", "eu" to "Zientzia eta hezkuntza", "fa" to "علم و آموزش", "fi" to "Tiede ja koulutus", @@ -3187,7 +3867,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Știință & educație", "ru" to "Наука и образование", "sc" to "Iscièntzia e educatzione", - "sk" to "Veda a výuka", + "sk" to "Veda a vzdelávanie", "sl" to "Znanost & Izobrazba", "sn" to "zveScience neFundo", "so" to "Sayniska & Waxbarashada", @@ -3307,6 +3987,53 @@ fun getCategoryItems(localeList: LocaleListCompat) = ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "Shooter Game", + name = + mapOf( + "cs" to "Střílečka", + "de" to "Shooter", + "en-GB" to "Shooter Game", + "en-US" to "Shooter Game", + "et" to "Laskmismängud", + "fa" to "بازی شلیکی", + "fr" to "Jeu de tir", + "ga" to "Cluiche Lámhachóra", + "id" to "Game Tembak-menembak", + "ja" to "シューティングゲーム", + "nl" to "Schietspel", + "pl" to "Gra strzelanka", + "pt-BR" to "Jogo de tiro", + "ro" to "Joc cu împușcături", + "vi" to "Game bắn súng", + "zh-CN" to "射击游戏", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), + CategoryItem( + id = "Strategy Game", + name = + mapOf( + "ar" to "العاب ستراتيجية", + "cs" to "Strategická hra", + "de" to "Strategiespiel", + "en-GB" to "Strategy Game", + "en-US" to "Strategy Game", + "et" to "Strateegiamängud", + "fa" to "بازی استراتژی", + "fr" to "Jeu de stratégie", + "ga" to "Cluiche Straitéise", + "id" to "Game Strategi", + "ja" to "戦略ゲーム", + "nl" to "Strategiespel", + "pl" to "Gra strategiczna", + "pt-BR" to "Jogo de estratégia", + "ro" to "Joc de strategie", + "vi" to "Game chiến thuật", + "zh-CN" to "策略游戏", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "Shopping List", name = @@ -3349,6 +4076,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Listă cumpărături", "ru" to "Список покупок", "sc" to "Lista de còmporas", + "sk" to "Nákupný zoznam", "sl" to "Nakupovalni seznam", "sq" to "Listë Blerjesh", "sr" to "Списак за куповину", @@ -3397,7 +4125,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "lv" to "Sabiedriskais tīkls", "my" to "လှုမှုကွန်ယက်", "nb" to "Sosialt nettverk", - "nl" to "Sociaal netwerk", + "nl" to "Sociaal Netwerk", "nl-BE" to "Sociaalnetwerk", "pl" to "Sieć społecznościowa", "pt" to "Rede social", @@ -3406,10 +4134,12 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Rețea socială", "ru" to "Соцсети", "sc" to "Retes sotziales", + "sk" to "Sociálne siete", "sl" to "Družabna omrežja", "sq" to "Rrjet Shoqëror", "sr" to "Друштвена мрежа", "sv" to "Socialt nätverk", + "sw" to "Mtandao wa Kijamii", "ta" to "சமூக வலைப்பின்னல்", "tr" to "Sosyal Ağ", "ug" to "ئىجتىمائىي تور", @@ -3420,6 +4150,30 @@ fun getCategoryItems(localeList: LocaleListCompat) = ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "Sport Game", + name = + mapOf( + "ar" to "لعبة رياضة", + "cs" to "Sportovní hra", + "de" to "Sportspiel", + "en-GB" to "Sport Game", + "en-US" to "Sport Game", + "et" to "Spordimängud", + "fa" to "بازی ورزشی", + "fr" to "Jeu de sport", + "ga" to "Cluiche Spóirt", + "id" to "Game Olahraga", + "ja" to "スポーツゲーム", + "nl" to "Sportspel", + "pl" to "Gra sportowa", + "pt-BR" to "Jogo de esporte", + "ro" to "Joc sportiv", + "vi" to "Game thể thao", + "zh-CN" to "体育游戏", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "Sports & Health", name = @@ -3447,7 +4201,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "es" to "Deportes y Salud", "es-AR" to "Deportes y Salud", "es-MX" to "Deportes & Salud", - "et" to "Sport & tervis", + "et" to "Sport ja tervis", "eu" to "Kirola eta osasuna", "fa" to "ورزش و سلامت", "fi" to "Urheilu ja terveys", @@ -3491,7 +4245,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Sport & sănătate", "ru" to "Спорт и здоровье", "sc" to "Isport e Salude", - "sk" to "Šport & Zdravie", + "sk" to "Šport a zdravie", "sl" to "Šport & zdravje", "sn" to "Nhabvu neUtano", "so" to "Ciyaaraha & Caafimaadka", @@ -3651,6 +4405,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Activitate", "ru" to "Задачи", "sc" to "Faina", + "sk" to "Úlohy", "sl" to "Opravila", "sq" to "Punë", "sr" to "Задатак", @@ -3693,6 +4448,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "is" to "Textaritill", "it" to "Editor di Testo", "ja" to "テキストエディタ", + "kab" to "Amaẓrag n weḍris", "kn" to "ಪಠ್ಯ ಸಂಪಾದಕ", "ko" to "텍스트 편집기", "lt" to "Tekstų redaktorius", @@ -3708,10 +4464,12 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Editor text", "ru" to "Текстовые редакторы", "sc" to "Editore de testu", + "sk" to "Textový editor", "sl" to "Urejevalnik besedila", "sq" to "Përpunues Tekstesh", "sr" to "Управник писања", "sv" to "Textredigerare", + "sw" to "Mhariri wa maandishi", "ta" to "உரை ஆசிரியர்", "tr" to "Metin Düzenleyici", "ug" to "تېكىست تەھرىرلىگۈچ", @@ -3722,6 +4480,38 @@ fun getCategoryItems(localeList: LocaleListCompat) = ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "Text to Speech", + name = + mapOf( + "ar" to "تحويل النص إلى كلام", + "cs" to "Text na řeč", + "de" to "Text-zu-Sprache", + "en-GB" to "Text to Speech", + "en-US" to "Text to Speech", + "eo" to "Parolsinteziloj", + "et" to "Kõnesüntees", + "fa" to "متن به گفتار", + "fr" to "Synthèse vocale", + "ga" to "Téacs go Caint", + "hr" to "Tekst u govor", + "hu" to "Szöveg beszéddé alakítása", + "id" to "Text to Speech", + "is" to "Texti-í-tal", + "ja" to "テキスト読み上げ", + "nl" to "Text naar Spraak", + "pl" to "Synteza mowy", + "pt" to "Texto para fala", + "pt-BR" to "Texto para fala", + "pt-PT" to "Texto para fala", + "ro" to "Conversie text în vorbire", + "sk" to "Prevod textu na reč", + "tr" to "Metinden Sese", + "vi" to "Chuyển văn bản thành giọng nói", + "zh-CN" to "文本转语音", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "Theming", name = @@ -3760,7 +4550,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "gl" to "Aparencia", "he" to "עיצוב", "hi" to "विषय", - "hr" to "Teme", + "hr" to "Izgled", "hu" to "Stílus", "hy" to "Ոճ", "id" to "Personalisasi", @@ -3907,6 +4697,60 @@ fun getCategoryItems(localeList: LocaleListCompat) = ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "Time Tracker", + name = + mapOf( + "ar" to "متتبع الوقت", + "cs" to "Sledování času", + "de" to "Zeiterfassung", + "en-GB" to "Time Tracker", + "en-US" to "Time Tracker", + "eo" to "Temp-mezuriloj", + "et" to "Ajakasutuse jälgimine", + "fa" to "ردیاب زمان", + "fr" to "Compteur de temps", + "ga" to "Rianaitheoir Ama", + "hr" to "Praćenje vremena", + "hu" to "Időkövető", + "id" to "Pelacak Waktu", + "is" to "Tímastjórnun", + "ja" to "タイムトラッカー", + "nl" to "Tijd Bijhouden", + "pl" to "Miernik czasu", + "pt" to "Rastreador de tempo", + "pt-BR" to "Rastreador de tempo", + "pt-PT" to "Rastreador de tempo", + "ro" to "Urmărirea timpului", + "sk" to "Sledovanie času", + "tr" to "Zaman Takipçisi", + "vi" to "Theo dõi thời gian", + "zh-CN" to "时间追踪工具", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), + CategoryItem( + id = "Timer", + name = + mapOf( + "ar" to "مُئَقِّت", + "cs" to "Časovač", + "de" to "Timer", + "en-GB" to "Timer", + "en-US" to "Timer", + "et" to "Taimerid", + "fa" to "زمان‌سنج", + "fr" to "Minuteur", + "ga" to "Amaireadóir", + "nl" to "Timer", + "pl" to "Minutnik", + "pt-BR" to "Cronômetro", + "ro" to "Temporizator", + "vi" to "Đếm thời gian", + "zh-CN" to "计时器", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "Translation & Dictionary", name = @@ -3940,7 +4784,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "lv" to "Tulkošana un vārdnīca", "my" to "ဘာသာပြန်နှင့် အဘိဓာန်", "nb" to "Oversettelse & Ordbok", - "nl" to "Vertalen & woordenboek", + "nl" to "Vertalen & Woordenboek", "pl" to "Tłumaczenie i słownik", "pt" to "Tradução e dicionário", "pt-BR" to "Tradução e dicionário", @@ -3948,6 +4792,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Traducere & dicționar", "ru" to "Перевод и словари", "sc" to "Tradutzione e ditzionàriu", + "sk" to "Preklad a slovník", "sl" to "Prevajalec in slovar", "sq" to "Përkthim & Fjalor", "sr" to "Превод и речник", @@ -3995,7 +4840,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "lv" to "Vienību pārveidotājs", "my" to "ယူနစ် ပြောင်းလဲမှု", "nb" to "Enhetskonvertering", - "nl" to "Eenheden omrekenen", + "nl" to "Eenheden Omrekenen", "pl" to "Konwerter jednostek", "pt" to "Conversor de unidades", "pt-BR" to "Conversor de unidades", @@ -4003,6 +4848,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Convertor unități", "ru" to "Перевод единиц", "sc" to "Cunvertidore de unidades", + "sk" to "Prevodník jednotiek", "sl" to "Pretvornik enot", "sq" to "Shndërrues Njësish", "sr" to "Претварач јединца", @@ -4018,6 +4864,30 @@ fun getCategoryItems(localeList: LocaleListCompat) = ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "Visual Novel", + name = + mapOf( + "ar" to "رواية صورية", + "cs" to "Vizuální román", + "de" to "Visual Novel", + "en-GB" to "Visual Novel", + "en-US" to "Visual Novel", + "et" to "Visuaalromaanid", + "fa" to "رمان تصویری", + "fr" to "Roman visuel", + "ga" to "Úrscéal Amhairc", + "id" to "Novel Visual", + "ja" to "ヴィジュアルノベル", + "nl" to "Visueel verhaal", + "pl" to "Powieść wizualna", + "pt-BR" to "Romance visual", + "ro" to "Romanul vizual", + "vi" to "Visual novel", + "zh-CN" to "视觉小说", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "Voice & Video Chat", name = @@ -4027,7 +4897,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ca" to "Xat de veu i vídeo", "cs" to "Hlasový a video chat", "da" to "Stemme- og videochat", - "de" to "Sprach-/Video-Chat", + "de" to "Sprach- / Video-Chat", "el" to "Φωνή & Βιντεοκλήσεις", "en-GB" to "Voice & Video Chat", "en-US" to "Voice & Video Chat", @@ -4050,7 +4920,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "lv" to "Balss un video tērzēšana", "my" to "အသံနှင့် ဗီဒီယိုဖြင့် ပြောဆိုခြင်း", "nb" to "Stemme- & Video-chat", - "nl" to "Bellen & videobellen", + "nl" to "Bellen & Videobellen", "pl" to "Czat głosowy i wideo", "pt" to "Chat de voz e vídeo", "pt-BR" to "Ligação de voz e vídeo", @@ -4058,6 +4928,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Apeluri audio & Video", "ru" to "Голосовые и видеочаты", "sc" to "Tzarrada de boghe e vìdeu", + "sk" to "Hlasový a video chat", "sl" to "Glasovni in slikovni klepet", "sq" to "Fjalosje Me Zë & Video", "sr" to "Ћаскање гласом и видеом", @@ -4067,7 +4938,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "tr" to "Sesli ve Görüntülü Görüşme", "ug" to "ئۈن ۋە سىن سۆھبەت", "uk" to "Голосовий та відеочат", - "vi" to "Trò chuyện thoại và video", + "vi" to "Gọi thoại và video", "zh-CN" to "音视频聊天", "zh-TW" to "語音與視像聊天", ) @@ -4090,7 +4961,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "eo" to "VPN kaj retperiloj", "es" to "Redes privadas (VPN) y proxies", "es-MX" to "VPN & Proxy", - "et" to "VPN ja proksiteenused", + "et" to "VPN-id ja proksiteenused", "fa" to "پیشکار و وی‌پی‌ان", "fi" to "VPN ja välityspalvelin", "fr" to "VPN & proxy", @@ -4102,13 +4973,14 @@ fun getCategoryItems(localeList: LocaleListCompat) = "is" to "VPN og milliþjónn", "it" to "VPN & Proxy", "ja" to "VPN & プロキシ", + "kab" to "VPN & Upṛuksi", "kn" to "VPN", "ko" to "VPN 및 프록시", "lt" to "VPN ir įgaliotieji serveriai", "lv" to "VPN un starpniekserveris", "my" to "VPN နှင့် Proxy", "nb" to "VPN & Mellomserver", - "nl" to "VPN & proxy", + "nl" to "VPN & Proxy", "pl" to "VPN i proxy", "pt" to "VPN e proxy", "pt-BR" to "VPN e proxy", @@ -4116,6 +4988,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "VPN & Proxy", "ru" to "VPN и прокси", "sc" to "VPN e serbidores intermediàrios", + "sk" to "VPN a proxy", "sl" to "VPN in posredniški strežniki (proxy)", "sq" to "VPN & Ndërmjetës", "sr" to "Нестварна лична мрежа и посредник", @@ -4157,6 +5030,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "is" to "Veski", "it" to "Portafoglio", "ja" to "ウォレット", + "kab" to "Ṭṭezḍam", "kn" to "ವಾಲೆಟ್", "ko" to "지갑", "lt" to "Piniginė", @@ -4171,6 +5045,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Portofel", "ru" to "Кошельки", "sc" to "Taschinu", + "sk" to "Peňaženka", "sl" to "Denarnica", "sq" to "Kuletë", "sr" to "Новчаник", @@ -4227,6 +5102,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Fundal", "ru" to "Обои", "sc" to "Isfundu", + "sk" to "Tapety", "sl" to "Ozadja", "sq" to "Sfond", "sr" to "Позадинска слика", @@ -4270,6 +5146,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "is" to "Veður", "it" to "Meteo", "ja" to "天気", + "kab" to "Tignewt", "kn" to "ಹವಾಮಾನ", "ko" to "날씨", "lt" to "Orai", @@ -4284,10 +5161,12 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Meteo", "ru" to "Погода", "sc" to "Mèteu", + "sk" to "Počasie", "sl" to "Vreme", "sq" to "Mot", "sr" to "Временске прилике", "sv" to "Väder", + "sw" to "Hali ya hewa", "ta" to "வானிலை", "tr" to "Hava Durumu", "ug" to "ھاۋا رايى", @@ -4298,6 +5177,30 @@ fun getCategoryItems(localeList: LocaleListCompat) = ) .getBestLocale(localeList) ?: "Unknown Category", ), + CategoryItem( + id = "Word Game", + name = + mapOf( + "ar" to "لعبة الغاز كتابية", + "cs" to "Slovní hra", + "de" to "Wortspiel", + "en-GB" to "Word Game", + "en-US" to "Word Game", + "et" to "Sõnamängud", + "fa" to "بازی واژه‌ای", + "fr" to "Jeu de lettres", + "ga" to "Cluiche Focal", + "id" to "Game Kata", + "ja" to "言葉遊び", + "nl" to "Woordspel", + "pl" to "Gra słowna", + "pt-BR" to "Jogo de palavras", + "ro" to "Joc de cuvinte", + "vi" to "Game chữ", + "zh-CN" to "单词游戏", + ) + .getBestLocale(localeList) ?: "Unknown Category", + ), CategoryItem( id = "Workout", name = @@ -4315,7 +5218,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "es" to "Ejercicio físico", "et" to "Treening", "fa" to "ورزش", - "fi" to "Harjoitus", + "fi" to "Kuntoilu", "fr" to "Entraînement", "ga" to "Babhta traenála", "he" to "כושר", @@ -4331,7 +5234,7 @@ fun getCategoryItems(localeList: LocaleListCompat) = "lv" to "Trenēšanās", "my" to "လေ့ကျင့်ခန်း", "nb" to "Trening", - "nl" to "Trainen & work-out", + "nl" to "Work-Out", "pl" to "Trening", "pt" to "Exercício físico", "pt-BR" to "Exercício físico", @@ -4339,10 +5242,12 @@ fun getCategoryItems(localeList: LocaleListCompat) = "ro" to "Antrenament", "ru" to "Тренировки", "sc" to "Allenamentu", + "sk" to "Cvičenie", "sl" to "Telovadba", "sq" to "Stërvitje", "sr" to "Вежбање", "sv" to "Träningspass", + "sw" to "Mazoezi", "ta" to "பயிற்சி", "tr" to "Antrenman", "ug" to "چېنىقىش", diff --git a/app/src/androidTest/java/org/fdroid/ui/screenshots/DetailsItem.kt b/app/src/androidTest/java/org/fdroid/ui/screenshots/DetailsItem.kt index 2a0434836..076e2e141 100644 --- a/app/src/androidTest/java/org/fdroid/ui/screenshots/DetailsItem.kt +++ b/app/src/androidTest/java/org/fdroid/ui/screenshots/DetailsItem.kt @@ -7,35 +7,42 @@ val appMetadata = repoId = 1L, packageName = "org.fdroid.basic", added = 1680776466000L, - lastUpdated = 1772364577000L, + lastUpdated = 1777704496684L, name = mapOf( "en-GB" to "F-Droid Basic", "es" to "F-Droid Basic", - "pl" to "F-Droid Podstawowy", + "nb" to "F-Droid Basic", + "pl" to "F-Droid Basic", "pt" to "F-Droid Básico", "pt-PT" to "F-Droid Básico", "ru" to "F-Droid Basic", + "sv" to "F-Droid Basic", "ar" to "F-Droid Basic", + "be" to "F-Droid Basic", "ca" to "F-Droid bàsic", "cs" to "F-Droid Basic", "de" to "F-Droid Basic", "en-US" to "F-Droid Basic", "eo" to "F-Droid Baza", "et" to "F-Droid Basic", - "fa-IR" to "اف‌دروید پایه‌ای", + "fa" to "اف‌دروید پایه‌ای", "fr" to "F-Droid Basic", "ga" to "F-Droid Bunúsach", "he" to "F-Droid בסיסי", - "hu-HU" to "Alap F-Droid", - "is-IS" to "Grunnútgáfa F-Droid", + "hr" to "F-Droid Basic", + "hu" to "Alap F-Droid", + "id" to "F-Droid Basic", + "is" to "Grunnútgáfa F-Droid", + "it" to "F-Droid Basic", "ja" to "F-Droid Basic", + "nl" to "F-Droid Basis", "pt-BR" to "F-Droid Básico", "ro" to "F-Droid Basic", "sr" to "Основни F-Droid", - "sv-SE" to "F-Droid Basic", - "ta-IN" to "எஃப்-டிராய்டு அடிப்படை", - "tr" to "F-Droid Temel", + "sw" to "F-Droid Basic", + "ta" to "எஃப்-டிராய்டு அடிப்படை", + "tr" to "F-Droid Basic", "uk" to "F-Droid Basic", "zh-CN" to "F-Droid Basic", "zh-TW" to "F-Droid Basic", @@ -44,38 +51,42 @@ val appMetadata = mapOf( "en-GB" to "The minimal client app for the app store that respects freedom and privacy", "es" to "Aplicación para la tienda de aplicaciones; respeta la libertad y la privacidad", + "nb" to "Den minimale klient-appen for app-butikken som respekterer frihet og personvern", "pl" to "Minimalistyczna apka kliencka dla sklepu z apkami szanująca wolność i prywatność", "pt" to "App cliente mínima para a loja de apps que respeita a liberdade e a privacidade", "pt-PT" to "App cliente mínima para a loja de apps que respeita a liberdade e a privacidade", "ru" to "Минималистичный магазин приложений, уважающий свободу и приватность", - "ar" to "تطبيق عميل خفيف لمتجر التطبيقات والذي يحترم الحرية والخصوصية", + "sv" to "Den minimala klient-appen för app-butiken som respekterar frihet och privatliv", + "ar" to "تطبيق عميل بسيط لمتجر التطبيقات الذي يحترم الحرية والخصوصية", + "be" to "Мінімальная кліентская праграма што паважае вашыя свабоду і прыватнасць", "ca" to "El client mínim del centre d'aplicacions que respecta la llibertat i privadesa", "cs" to "Minimální klient pro obchod s aplikacemi, který respektuje svobodu a soukromí", "de" to "Der minimale Client für den App-Store, der Freiheit und Privatsphäre respektiert", "en-US" to "The minimal client app for the app store that respects freedom and privacy", "eo" to "Minimuma kliento por la aplikaĵa vendejo respektanta liberecon kaj privatecon", "et" to "Lihtsustatud variant F-Droidi rakendustepoe kliendist", - "fa-IR" to "کارخواه کمینه برای فروشگاه کاره‌ای که به آزادی و محرمانگی احترام می‌گذارد", + "fa" to "کارخواه کمینه برای فروشگاه کاره‌ای که به آزادی و محرمانگی احترام می‌گذارد", "fr" to "L’application minimale pour le magasin d’applis respectueux de la vie privée", "ga" to "Aip íosta cliant don siopa a léiríonn meas ar shaoirse agus ar phríobháideachas", "he" to "יישומון הלקוח המזערי לחנות יישומונים שמכבד חופש ופרטיות", - "hu-HU" to "Az alap app a tárolóban, amely tiszteli a szabadságot és a magánéletet", - "is-IS" to - "Lágmarksviðmót forritsins fyrir hugbúnaðarsafnið sem virðir frelsi og gagnaleynd", + "hr" to "Minimalalna aplikacija za trgovinu aplikacija koja poštuje slobodu i privatnost", + "hu" to "Az alap app a tárolóban, amely tiszteli a szabadságot és a magánéletet", + "id" to "Aplikasi klien minimal untuk toko aplikasi yang menghormati kebebasan dan privas", + "is" to "Lágmarksviðmót forritsins fyrir hugbúnaðarsafnið sem virðir frelsi og gagnaleynd", + "it" to "Il client minimale per l'app store che rispetta la libertà e la privacy", "ja" to "自由とプライバシーを尊重するアプリストアの簡略版クライアント", + "nl" to "De minimale clientapp van de appwinkel die vrijheid en privacy respecteert", "pt-BR" to - "App cliente mínimo para a loja de apps que respeita a liberdade e a privacidade", + "O app minimalista para a loja de aplicativos que respeita a liberdade e a privac", "ro" to "Client minim pentru magazinul de aplicații ce respectă libertatea și intimitatea", "sr" to "Клијент апликација за продавницу апликација која поштује слободу и приватност", - "sv-SE" to "Den minimala klient-appen för app-butiken som respekterar frihet och privatliv", "sw" to "An app cliant íosta don siopa app a urramaíonn saoirse agus príobháideachta", - "ta-IN" to - "விடுதலை மற்றும் தனியுரிமையை மதிக்கும் பயன்பாட்டு கடைக்கான குறைந்தபட்ச வாங்கி பயன", - "tr" to "Özgürlük ve gizliliğe saygılı uygulama mağazası için sade bir istemci uygulaması", + "ta" to "விடுதலை மற்றும் தனியுரிமையை மதிக்கும் பயன்பாட்டு கடைக்கான குறைந்தபட்ச வாங்கி பயன", + "tr" to "Özgürlüğe ve gizliliğe saygılı uygulama mağazası için en sade istemci uygulaması", "uk" to "Мінімалістичний клієнтський застосунок, який поважає свободу й приватність", "zh-CN" to "尊重自由和隐私的应用商店的极简客户端应用", - "zh-TW" to "尊重自由和隱私的應用商店最小客戶端應用程序", + "zh-TW" to "尊重自由和隱私的應用商店最小用戶端應用程序", ), description = mapOf( @@ -91,8 +102,12 @@ val appMetadata = "AVISO: A versão básica do cliente F-Droid tem menos funções (por exemplo, não tem o \"Por perto\" ou a função de pânico). Está preparado para o Android 13 e pode fazer atualizações sem intervenção do utilizador, sem precisar da extensão privilegiada ou de ", "ru" to "ПРИМЕЧАНИЕ: Basic-версия клиента F-Droid имеет урезанный набор функций (например, нет общего доступа к близлежащим ресурсам и функции паники). Она нацелена на Android 13 и может выполнять обновления без участия пользователя и без особого расширения или roo", + "sv" to + "OBS: Basic-versionen av F-Droid Client har en reducerad funktionsuppsättning (t.ex. ingen när-delning och ingen panikfunktion). Den riktar sig till Android 13 och kan göra obevakade uppdateringar utan privilegierad förlängning eller root.\n\nF-Droid är en ", "ar" to - "ملاحظة: الإصدار الأساسي من عميل F-Droid يحتوي على مجموعة ميزات مخفضة (على سبيل المثال، لا توجد مشاركة قريبة ولا توجد ميزة الذعر). وهو يستهدف Android 13 ويمكنه إجراء تحديثات غير مراقبة بدون امتداد أو جذر مميز.\n\nF-Droid عبارة عن كتالوج قابل للتثبيت لتطبيقا", + "ملاحظة: النسخة الأساسية من عميل F-Droid تأتي بميزات محدودة (على سبيل المثال، لا تتوفر ميزة المشاركة القريبة أو ميزة الطوارئ). تستهدف هذه النسخة نظام أندرويد 13، ويمكنها إجراء تحديثات تلقائية دون الحاجة إلى صلاحيات إضافية أو الجذر.\n\nF-Droid هو دليل قابل ل", + "be" to + "Увага: Базавая версія Кліента F-Droid мае зменшаны набор функцый (напр. няма функцый абагульвання і панікі). Ён нацэлены на Android 13 і можа выконваць аўтаматычныя абнаўленні без пашыраных прывіляў альбо root.\n\nF-Droid гэта каталог для ўсталёўкі Вольнаг", "ca" to "NOTA: La versió bàsica del client de l'F-Droid té un conjunt de funcionalitats reduït (p. ex. no hi ha compartició propera i funció del pànic). Està orientada a l'Android 13 i pot fer actualitzacions desateses sense extensions de privilegis ni permisos d'a", "cs" to @@ -105,7 +120,7 @@ val appMetadata = "RIMARKO: la baza versio de kliento F-Droid estas senigita de kelkaj ebloj (kiel proksima interŝanĝo kaj panika butono). Ĝi celas Android 13 kaj povas ĝisdatigi aplikaĵojn fone sen uzi ĉefuzantan permeson aŭ la privilegian aldonaĵon.\n\nF-Droid estas instal", "et" to "NB! F-Droid Basic on piiratud funktsionaalsusega klient (nt. puuduvad naabritega jagamine ja paanikarežiimi keelamine). Ta on mõeldud Android 13-le ja saab paigaldada uuendusi iseseisvalt, priviligeeritud laienduse või juurkasutajata.\n\nF-Droid on paigald", - "fa-IR" to + "fa" to "نکته: نگارش پایه‌ای کارخواه اف دروید مجموعه ویز؛ی‌های کم‌تری دارد (برای نمونه هم‌رسانی نزدیک و دکمهٔ هراس). اندروید ۱۳ را هدف قرار داده و می‌تواند به‌روز رسانی‌های پس‌زمینه را بدون ریشه یا افزونهٔ ممتاز انجام دهد.\n\nاف‌دروید کالانمایی قابل نصب از کاره‌های", "fr" to "REMARQUE : la version Basic du client F-Droid a un jeu de fonctionnalités réduit (par ex. pas de partage de proximité et aucune fonction \"no panic\"). Elle est destinée à la plateforme Android 13 et peut faire des mises à jour sans extension privilégiée o", @@ -113,30 +128,32 @@ val appMetadata = "NÓTA: Tá sraith gnéithe laghdaithe ag an leagan Bunúsach de Chliant F-Droid (e.g. gan aon chomhroinnt in aice láimhe agus gan aon ghné scaoill). Díríonn sé ar Android 13 agus is féidir leis nuashonruithe gan duine a dhéanamh gan síneadh pribhléideach ná fr", "he" to "הערה: לגרסה הבסיסית של לקוח F-Droid יש מערכת תכונה מופחתת (לדוגמה, אין שיתוף סמוך ואין תכונה פאניקה). הוא מכוון לאנדרואיד 13 ויכול לעשות עדכונים ללא הרחבה מועדפת או root.\n\nF-Droid הוא קטלוג של יישומי תוכנה חופשית עבור אנדרואיד. יישומון לקוח F-Droid מקל ל", - "hu-HU" to + "hu" to "MEGJEGYZÉS: Az alap F-Droid verzió csökkentett funkciókészlettel rendelkezik (pl. nincs közeli megosztás és nincs pánik funkció). Az android 13-as rendszert célozza meg, és képes felügyelet nélküli frissítéseket végezni jogosultsági kiterjesztés vagy root ", - "is-IS" to + "id" to + "CATATAN: Versi Basic dari Klien F-Droid memiliki fitur yang lebih terbatas (misalnya, tidak ada berbagi terdekat dan tidak ada fitur panik). Versi ini menargetkan Android 13 dan dapat melakukan pembaruan otomatis tanpa ekstensi istimewa atau akses root.\n", + "is" to "ATHUGAÐU: Grunnútgáfa (Basic) F-Droid forritsins er með færri eiginleika (t.d. ekki deilingu til tækja í nágrenninu og enga neyðaraðgerð). Hún miðast við Android 13 og getur séð um uppfærslur án afskipta notandans án forgangsviðbótarinnar eða rótaraðgangs.", "ja" to "注意:F-DroidクライアントのBasic版は、機能が制限されています(例えば、近くへ共有やパニック機能がありません)。Android 13がターゲットで、特権の拡張やroot無しで更新出来ます。\n\nF-DroidはAndroidのための自由かつインストール可能なソフトウェアアプリの目録です。F-Droidクライアントアプリは、あなたのデバイス上での閲覧、インストール、更新の追跡を簡単にします。\n\nF-Droidは互換性のあるリポジトリへ接続します。標準のリポジトリはf-droid.orgでホスト", + "nl" to + "NOTITIE: De basisversie van de F-Droid-client heeft een gereduceerd aantal functies (bvb geen dichtbij delen en geen paniekfunctie). Het is gericht op Android 13 en kan zelfstandig updates uitvoeren zonder bevoorrechtte extensie of root.\n\nF-Droid is een ", "pt-BR" to "AVISO: A versão básica do cliente F-Droid tem um número reduzido de funções (por exemplo, não tem o \"Por perto\" ou a função de Pánico). Ela \"atinge\" o Android 13 e pode fazer atualizações sem intervenção do usuário, sem precisar da extensão privilegiad", "ro" to "NOTĂ: Versiunea de client F-Droid Basic are un set redus de funcții (de exemplu, fără partajare în apropiere și fără funcție de panică). Aceasta vizează Android 13 și poate face actualizări nesupravegheate fără extensia privilegiată sau root.\n\nF-Droid es", "sr" to "Напомена: Основна верзија клијента F-Droid има ограничен сет функција (нпр. нема опцију за дељење у близини и нема функцију за хитне случајеве). Она је намењена за Android 13 и може да обавља ажурирања без повишених привилегија или рута.\n\nF-Droid је ката", - "sv-SE" to - "OBS: Basic-versionen av F-Droid Client har en reducerad funktionsuppsättning (t.ex. ingen när-delning och ingen panikfunktion). Den riktar sig till Android 13 och kan göra obevakade uppdateringar utan privilegierad förlängning eller root.\n\nF-Droid är en ", - "ta-IN" to + "ta" to "குறிப்பு: எஃப்-டிராய்டு கிளையண்டின் அடிப்படை பதிப்பு குறைக்கப்பட்ட அம்சத் தொகுப்பைக் கொண்டுள்ளது (எ.கா. அருகிலுள்ள பங்கு இல்லை மற்றும் அச்சம் நற்பொருத்தம் இல்லை). இது ஆண்ட்ராய்டு 13 ஐ குறிவைக்கிறது மற்றும் சலுகை பெற்ற நீட்டிப்பு அல்லது வேர் இல்லாமல் கவனிக்", "tr" to - "NOT: F-Droid İstemcisinin Temel sürümünün düşürülmüş özellikleri mevcuttur (mesela nearby share ve panik özelliği yok). Android 13'ü hedef alır ve özel eklenti veya root gerektirmeden gözetimsiz güncellemeler yapabilir.\nF-Droid, Android için özgür yazılım", + "NOT: F-Droid İstemcisinin Basic (Temel) sürümü daraltılmış bir özellik setine sahiptir (örneğin yakındakilerle paylaşım ve panik özelliği yoktur). Android 13'ü hedefler ve ayrıcalıklı bir eklentiye veya root erişimine ihtiyaç duymadan katılımsız (arka plan", "uk" to "ПРИМІТКА. Базова версія F-Droid Client має скорочений набір функцій (наприклад, немає функції спільного доступу поблизу та функції паніки). Він націлений на Android 13 і може виконувати автоматичні оновлення без привілейованого розширення або root-права. ", "zh-CN" to "注意:F-Droid 客户端基础版本的功能不全 (如没有“附近”分享和应急功能)。它针对 Android 13 ,可以在没有特权扩展或 root 的情况下执行无人值守更新。.\n\nF-Droid 是 Android 系统自由软件应用的可安装目录。 F-Droid 客户端应用使得浏览、安装和跟踪设备上的应用更新变得轻而易举。\n\n它可以连接到任何兼容 F-Droid 的存储库。默认存储库托管在 f-droid.org 上,其中只包含真正的自由软件。\n\nAndroid 本身是开放的,意思是你可以从任何地", "zh-TW" to - "注意:F-Droid 用戶端基本版的功能集較少(例如,沒有附近共享和恐慌功能)。它以 Android 13 為目標,無需特權擴充或 root 即可進行無人值守更新。\n\nF-Droid 是適用於 Android 的自由軟體應用程式的可安裝目錄。 F-Droid 用戶端應用程式可以輕鬆瀏覽、安裝和追蹤裝置上的更新。\n\n它可以連接到任何與 F-Droid 相容的儲存庫。預設 repo 託管在 f-droid.org,其中僅包含真正的自由軟體。\n\nAndroid 本身是開放的,這意味著您可以自由地從任何", + "注意:F-Droid 用戶端基本版的功能集較少(例如,沒有附近共享和恐慌功能)。它以 Android 13 為目標,無需特權擴充或 root 即可進行無人值守更新。\n\nF-Droid 是適用於 Android 的自由軟體應用程式的可安裝目錄。 F-Droid 用戶端應用程式可以輕鬆瀏覽、安裝和追蹤裝置上的更新。\n\n它可以連線到任何與 F-Droid 相容的軟體庫。預設 repo 託管在 f-droid.org,其中僅包含真正的自由軟體。\n\nAndroid 本身是開放的,這意味著您可以自由地從任何", ), webSite = "https://f-droid.org", changelog = "https://gitlab.com/fdroid/fdroidclient/-/blob/HEAD/CHANGELOG.md", diff --git a/app/src/androidTest/java/org/fdroid/ui/screenshots/DiscoverItems.kt b/app/src/androidTest/java/org/fdroid/ui/screenshots/DiscoverItems.kt index ac9c91d11..82f44fc90 100644 --- a/app/src/androidTest/java/org/fdroid/ui/screenshots/DiscoverItems.kt +++ b/app/src/androidTest/java/org/fdroid/ui/screenshots/DiscoverItems.kt @@ -6,6 +6,59 @@ import org.fdroid.ui.discover.AppDiscoverItem fun getNewApps(localeList: LocaleListCompat) = listOf( + AppDiscoverItem( + packageName = "org.fairscan.app", + name = + mapOf("en-US" to "FairScan – PDF Scanner", "ru" to "FairScan – Сканер в PDF") + .getBestLocale(localeList) ?: "Unknown App", + isInstalled = true, + imageModel = + "https://f-droid.org/repo/org.fairscan.app/en-US/icon_jXreg-23j73Q35sj5mioXnOD8m6Y9V6kLjX037gxq00=.png", + ), + AppDiscoverItem( + packageName = "com.github.catfriend1.syncthingfork", + name = + mapOf( + "en-US" to "Syncthing-Fork", + "vi" to "Syncthing-Fork", + "he" to "Syncthing-Fork", + "pt-PT" to "Syncthing-Fork", + "zh-CN" to "Syncthing-Fork", + "ru-RU" to "Syncthing-Fork", + "es-419" to "Syncthing-Fork", + "fr-FR" to "Syncthing-Fork", + "es-ES" to "Syncthing-Fork", + "be" to "Syncthing-Fork", + "tr-TR" to "Syncthing-Fork", + "ro" to "Syncthing-Fork", + "ca" to "Syncthing-Fork", + "it-IT" to "Syncthing-Fork", + "uk" to "Syncthing-Fork", + "zh-TW" to "Syncthing-Fork", + "bg" to "Syncthing-Fork", + "cs-CZ" to "Syncthing-Fork", + "nl-NL" to "Syncthing-Fork", + "de-DE" to "Syncthing-Fork", + "ja-JP" to "Syncthing-Fork", + "da-DK" to "Syncthing-Fork", + "ko-KR" to "Syncthing-Fork", + "id" to "Syncthing-Fork", + "sr" to "Syncthing-Fork", + "hu-HU" to "Syncthing-Fork", + "sv-SE" to "Syncthing-Fork", + "et" to "Syncthing-Fork", + "pl-PL" to "Syncthing-Fork", + "pt-BR" to "Syncthing-Fork", + "ar" to "Syncthing-Fork", + "sk" to "Syncthing-Fork", + "es-US" to "Syncthing-Fork", + "fi-FI" to "Syncthing-Fork", + ) + .getBestLocale(localeList) ?: "Unknown App", + isInstalled = false, + imageModel = + "https://f-droid.org/repo/com.github.catfriend1.syncthingfork/en-US/icon_egWOwTWZpQ_1CxmdrwP5wRta5EVmCCuzQWxjI5JTs0w=.png", + ), AppDiscoverItem( packageName = "jp.nonbili.noutube", name = mapOf("en-US" to "NouTube").getBestLocale(localeList) ?: "Unknown App", @@ -13,6 +66,64 @@ fun getNewApps(localeList: LocaleListCompat) = imageModel = "https://f-droid.org/repo/jp.nonbili.noutube/en-US/icon_A1nC0BkAzsvNhws7y1thjfhF8LJJReXVUORApHsstDE=.png", ), + AppDiscoverItem( + packageName = "app.comaps.fdroid", + name = + mapOf( + "pt-PT" to "CoMaps - Mapas e Navegação - Offline e Privada", + "zh-CN" to "CoMaps — 隐私保护下的离线远足、骑行、驾驶", + "lv" to "CoMaps - dodies ceļā bezsaistē ar privātumu", + "hr" to "CoMaps - Pješačite, biciklirajte, vozite Offline i", + "sl" to "CoMaps – potujte brez povezave, zasebno", + "ru-RU" to "CoMaps - Карты и путешествия с приватностью", + "fr-FR" to "CoMaps - Randonnée, Vélo, Conduite hors ligne", + "es-ES" to "CoMaps - Senderismo, ciclismo y conducción offline", + "lt" to "CoMaps – keliaukite atsijungę ir privačiai", + "en-US" to "CoMaps - Hike, Bike, Drive Offline with Privacy", + "tr-TR" to "CoMaps - Gizlilikle Yürüyün, Sürün, Gezin", + "ro" to "CoMaps - călătorește offline cu confidențialitate", + "bn-BD" to "কোম্যাপস - অফলাইনে হাইকিং, সাইকেলিং ও ড্রাইভিং", + "ca" to "CoMaps - Camina, pedala o condueix privadament", + "it-IT" to "CoMaps - Navigazione Offline con Privacy", + "uk" to "CoMaps — ходьба та поїздки офлайн із приватність", + "zh-TW" to "CoMaps — 隱私保護下的離線遠足、騎行、駕駛", + "gl-ES" to "CoMaps - Aplicación de mapas privada, sen conexión", + "bg" to "CoMaps - Хайкинг, Велосипед, Пътуване без Интернет", + "cs-CZ" to "CoMaps – pěšky, na kole a autem offline a soukromě", + "nl-NL" to "CoMaps - Wandel, fiets, rijd offline met privacy", + "de-DE" to "CoMaps – Offline navigieren mit Datenschutz", + "da-DK" to "CoMaps - vandr, cykl og kør offline med privatliv", + "id" to "CoMaps- Navigasi Offline dengan Privasi", + "sr" to "CoMaps - пешачење, бицикл и вожња, са приватношћу", + "el-GR" to "CoMaps - Πλοήγηση εκτός σύνδεσης με ιδιωτικότητα", + "eu-ES" to "CoMaps - mapak offline eta dena pribatuan", + "hu-HU" to "CoMaps – túrázás, kerékpározás, autózás offline", + "no-NO" to "CoMaps - Gå, Sykle, Kjør Uten Internett", + "sv-SE" to "Comaps- Vandra, Cykla, Kör Offline, Privat", + "et" to "CoMaps - sinu privaatne kaart", + "pl-PL" to "CoMaps - Nawiguj offline z zachowaniem prywatności", + "kn-IN" to "ಸಹ ನಕ್ಷೆಗಳು - ಆಫ್‌ಲೈನ್ ಮತ್ತು ಗೌಪ್ಯತೆಯೊಂದಿಗೆ", + "pt-BR" to "CoMaps - Mapas e Navegação Offline com Privacidade", + "ar" to "CoMaps - تنزه وتنقل وقُد دون إنترنت مع الخصوصية", + "sk" to "CoMaps - kráčaj, bicykluj a jazdi v súkromí", + "fi-FI" to "CoMaps - Navigoi yksityisesti ilman verkkoyhteyttä", + "kw" to "CoMaps - Viajya gans Privetter", + "fa-IR" to "CoMaps - کوه‌نوردی، دوچرخه‌سواری و رانندگی آفلاین", + "pt" to "CoMaps - Mapas e Navegação - Offline e Privada", + "ta-IN" to "இணைவரைபடங்கள் - மலையேறு, வண்டி, தனிமையில் இயக்கு", + "en-GB" to "CoMaps - Hike, Bike, Drive Offline with Privacy", + "mt" to "CoMaps - Imxi, Suq Rota u Karozza bil-Privatezza", + "bn" to "CoMaps - অফলাইনে হাইক, বাইক, ড্রাইভ করুন", + "brh" to "CoMaps - آفلائن مش لگ، سائکل سواری و موٹر سواری", + "en-CA" to "CoMaps - Hike, Bike, Drive Offline with Privacy", + "eo" to "CoMaps - Migru, Biciklu, Veturigu Eksterrete", + "ast" to "CoMaps - Mapas ensin conexón con privacidá", + ) + .getBestLocale(localeList) ?: "Unknown App", + isInstalled = true, + imageModel = + "https://f-droid.org/repo/app.comaps.fdroid/en-US/icon_Xqa9hlGluoI0ME9XbHrLOaAJ_dX9wWMtDhLgpFYbUOI=.png", + ), AppDiscoverItem( packageName = "net.thunderbird.android", name = @@ -20,7 +131,7 @@ fun getNewApps(localeList: LocaleListCompat) = "ar" to "ثَندَربِرْد: حرّر صندوق بريدك", "be" to "Thunderbird: Вольная Пошта", "bg" to "Thunderbird: Освободете пощата", - "br" to "Thunderbird: Dieubit hor boest degemer", + "br" to "Thunderbird: Dieubit ho poest degemer", "ca" to "Thunderbird: allibereu la vostra safata d'entrada", "co" to "Thunderbird : Messaghjeria libera", "cs-CZ" to "Thunderbird: Svobodná pošta", @@ -38,7 +149,8 @@ fun getNewApps(localeList: LocaleListCompat) = "fr-FR" to "Thunderbird : Courriel libre", "fy" to "Thunderbird: Befrij jo Postfek", "ga" to "Thunderbird: Saor Do Phost", - "gd" to "Thunderbird: Saorsa dhan phost agad", + "gd" to "Thunderbird: Saorsa dhan phost", + "gl-ES" to "Thunderbird: O teu correo libre", "hi-IN" to "थंडरबर्ड - इन्बॉक्स मुक्त करें", "hr" to "Thunderbird: Oslobodite svoju poštu", "hu-HU" to "Thunderbird: Szabad levelezés", @@ -47,6 +159,7 @@ fun getNewApps(localeList: LocaleListCompat) = "it-IT" to "Thunderbird: libera la tua casella di posta", "iw-IL" to "ת'אנדרבירד: שחרר את תיבת הדואר שלך", "ja-JP" to "Thunderbird: 受信トレイをもっと自由に", + "ko-KR" to "Thunderbird: 이메일을 자유롭게", "lt" to "Thunderbird: lais. savo gaut.", "mnw" to "ဂစေံလလဳ: သၠးကဠာလိက်မၞး", "nl-NL" to "Thunderbird: Bevrijd uw e-mail", @@ -64,7 +177,7 @@ fun getNewApps(localeList: LocaleListCompat) = "sv-SE" to "Thunderbird: Frigör din inkorg", "ta-IN" to "இடிபறவை: உங்கள் உள்பெட்டி விடுவி", "tr-TR" to "Thunderbird: Özgür E-posta", - "uk" to "Thunderbird: Вільна е-пошта", + "uk" to "Thunderbird: Вивільніть Вхідні", "vi" to "Thunderbird: Giải phóng hộp thư của bạn", "zh-CN" to "Thunderbird:解放收件箱", "zh-TW" to "Thunderbird: 釋放你的收件匣", @@ -83,60 +196,6 @@ fun getNewApps(localeList: LocaleListCompat) = imageModel = "https://f-droid.org/repo/io.element.android.x/en-US/icon_YBz4_OnMHd7E2Bd_oEza9ImLSlHTpL_C-ovHcKljeFA=.png", ), - AppDiscoverItem( - packageName = "org.breezyweather", - name = mapOf("en-US" to "Breezy Weather").getBestLocale(localeList) ?: "Unknown App", - isInstalled = true, - imageModel = - "https://f-droid.org/repo/org.breezyweather/en-US/icon_e18rWq0tKc__3173BVXmiiasM_F7yrUbs6kh7lQffto=.png", - ), - AppDiscoverItem( - packageName = "helium314.keyboard", - name = - mapOf( - "ar" to "HeliBoard", - "bg" to "HeliBoard", - "bn" to "হেলিবোর্ড", - "ca" to "HeliBoard", - "cs-CZ" to "HeliBoard", - "de-DE" to "HeliBoard", - "en-US" to "HeliBoard", - "es-ES" to "HeliBoard", - "et" to "HeliBoard", - "fi-FI" to "HeliBoard", - "fr-FR" to "HeliBoard", - "gl-ES" to "HeliBoard", - "hu-HU" to "HeliBoard", - "id" to "HeliBoard", - "is-IS" to "HeliBoard", - "it-IT" to "HeliBoard", - "iw-IL" to "הליבורד HeliBoard", - "lv" to "HeliBoard", - "nl-NL" to "HeliBoard", - "pa-PK" to "ہیلی‌بورڈ", - "pl-PL" to "HeliBoard", - "pt" to "HeliBoard", - "pt-BR" to "HeliBoard", - "ru-RU" to "HeliBoard", - "ta-IN" to "எலிபோர்டு", - "tr-TR" to "HeliBoard", - "uk" to "HeliBoard", - "zh-CN" to "HeliBoard", - ) - .getBestLocale(localeList) ?: "Unknown App", - isInstalled = true, - imageModel = - "https://f-droid.org/repo/helium314.keyboard/en-US/icon_-nkf9NO4Zp7Y0YX1AOcQdZMf32R_bPt8AZC2Ycn2v1I=.png", - ), - AppDiscoverItem( - packageName = "dev.imranr.obtainium.fdroid", - name = - mapOf("de" to "Obtainium", "en-US" to "Obtainium", "ru-RU" to "Obtainium") - .getBestLocale(localeList) ?: "Unknown App", - isInstalled = false, - imageModel = - "https://f-droid.org/repo/dev.imranr.obtainium.fdroid/en-US/icon_8o6Dm3kPEr-C-8U1QdRd9B6DrkXPqLJQ7or0KN7ut_4=.png", - ), ) fun getRecentlyUpdatedApps(localeList: LocaleListCompat) = @@ -148,6 +207,7 @@ fun getRecentlyUpdatedApps(localeList: LocaleListCompat) = "ar" to "K-9 Mail", "be" to "Пошта K-9", "bg" to "K-9 Поща", + "br" to "Postel K-9", "ca" to "K-9 Mail", "co" to "K-9 Mail", "cs-CZ" to "K-9 Mail", @@ -165,6 +225,7 @@ fun getRecentlyUpdatedApps(localeList: LocaleListCompat) = "fy" to "K-9 Mail", "ga" to "K-9 Mail", "gd" to "Post K-9", + "gl-ES" to "K-9 Mail", "he" to "K-9 דוא\"ל", "hi-IN" to "K-9 Mail", "hr" to "K-9 Mail", @@ -258,14 +319,14 @@ fun getRecentlyUpdatedApps(localeList: LocaleListCompat) = packageName = "com.kunzisoft.keepass.libre", name = mapOf( - "ar" to "KeePassDX Passkey Vault", + "ar" to "خزنة مفتاح مرور KeePassDX", "cs-CZ" to "Trezor pro klíče KeePassDX", "de-DE" to "KeePassDX Passkey-Tresor", "en-US" to "KeePassDX Passkey Vault", "es-ES" to "KeePassDX Passkey Vault", "et" to "KeePassDX salasõnahoidla", "fr-FR" to "KeePassDX - Passkey local", - "hr" to "KeePassDX Passkey Vault", + "hr" to "KeePassDX trezor za lozinke", "hu-HU" to "KeePassDX jelszótároló", "id" to "KeePassDX Passkey Vault", "it-IT" to "Cassaforte passkey KeePassDX", @@ -277,10 +338,12 @@ fun getRecentlyUpdatedApps(localeList: LocaleListCompat) = "pl-PL" to "KeePassDX – Bezpieczny sejf", "ru-RU" to "KeePassDX - менеджер паролей", "sq" to "Kasafortë Kyçklm. KeePassDX", + "ta-IN" to "KeePassDX பாச்கி வால்ட்", "th" to "ตู้นิรภัยพาสคีย์คียพาสดีเอ็กซ์", - "tr-TR" to "KeePassDX Passkey Vault", + "tr-TR" to "KeePassDX Passkey Kasası", + "ur" to "کی پاس ڈی ایکس پاس کی تجوری", "zh-CN" to "KeePassDX 密码库", - "zh-TW" to "KeePassDX 密碼(金鑰/單字)保險庫", + "zh-TW" to "KeePassDX 密碼金鑰保險庫", ) .getBestLocale(localeList) ?: "Unknown App", isInstalled = false, @@ -300,59 +363,95 @@ fun getMostDownloadedApps(localeList: LocaleListCompat) = "pt-PT" to "Organic Maps - Mapas offline", "zh-CN" to "Organic Maps・离线地图与导航 & GPS", "iw-IL" to "Organic Maps・מפת אופליין ו-GPS", + "ms-MY" to "Organic Maps: Peta & Navigasi", "lv" to "Organic Maps・Kartes・Navigācija", + "am" to "Organic Maps・ከመስመር ውጭ ካርታ & GPS", + "en-SG" to "Organic Maps・Offline Map & GPS", + "af" to "Organic Maps・Aflynkaart & GPS", "kk" to "Organic Maps: Карталар", "hr" to "Organic Maps: offline karte", "th" to "Organic Maps: แผนที่gps", "si-LK" to "Organic Maps・ඔෆ්ලයින් සිතියම්", "sl" to "Organic Maps・Offline Karte", "ru-RU" to "Organic Maps: GPS карты офлайн", + "es-419" to "Organic Maps: mapas sin conexión y GPS", "ne-NP" to "Organic Map・अफलाइन नक्सा & GPS", + "jv" to "Organic Maps・Peta Offline & GPS", "fr-FR" to "Organic Maps: gps hors ligne", "es-ES" to "Organic Maps: mapas offline", "mk-MK" to "Organic Maps・Мапи и навигација", + "ta-IN" to "Organic Maps・ஆஃப்லைன் வரைபடம்", "be" to "Organic Maps: GPS карты офлайн", + "or" to "Organic Maps・ଅଫଲାଇନ୍ ମ୍ୟାପ୍ ଓ GPS", + "en-ZA" to "Organic Maps・Offline Map & GPS", + "fr-CA" to "Organic Maps: gps hors ligne", "lt" to "Organic Maps・žemėlapis & GPS", "ms" to "Organic Maps: Peta & Navigasi", + "sq" to "Organic Maps・Hartë Offline & GPS", + "fa-AE" to "Organic Maps・نقشه آفلاین و GPS", "en-US" to "Organic Maps・Offline Map & GPS", + "bs" to "Organic Maps: Offline mape i GPS", "tr-TR" to "Organic Maps: Haritalar ve GPS", "ro" to "Organic Maps: hărți offline", + "en-GB" to "Organic Maps・Offline Map & GPS", + "ug" to "Organic Maps・تورسىز خەرىتە GPS", "hi-IN" to "Organic Maps・ऑफ़लाइन मैप", + "bo" to "Organic Maps・དྲ་རྒྱ་མེད་ས་ཁྲ། GPS", "mr-IN" to "Organic Maps ऑफलाईन नकाशे", "bn-BD" to "Organic Maps・मैप्स और नेविगेशन", "ca" to "Organic Map・Mapa Offline i GPS", "it-IT" to "Organic Maps: Mappe Offline", "uk" to "Organic Maps: GPS карти офлайн", + "fa-AF" to "Organic Maps・نقشه آفلاین و GPS", + "mn-MN" to "Organic Maps・Офлайн газрын зураг ба GPS", "zh-TW" to "Organic Maps・離線地圖與導航 GPS", + "as" to "Organic Maps・অফলাইন মেপ আৰু GPS", "zh-HK" to "Organic Maps: 地圖與導航", "gl-ES" to "Organic Maps・Mapa fóra de liña", + "mi" to "Organic Maps・Mahere Tuimotu GPS", + "en-AU" to "Organic Maps・Offline Map & GPS", "bg" to "Organic Maps: офлайн GPS карти", + "my-MM" to "Organic Maps・အော့ဖ်လိုင်းမြေပုံနှင့် GPS", "cs-CZ" to "Organic Maps・mapy offline, GPS", "ml-IN" to "Organic Maps・ഓഫ്‌ലൈൻ മാപ്പ്", "nl-NL" to "Organic Maps: offline kaarten", + "en-CA" to "Organic Maps・Offline Map & GPS", "de-DE" to "Organic Maps Offline Karten", + "zu" to "Organic Maps・Imephu Offline ne-GPS", "ja-JP" to "Organic Maps: マップ & ナビゲーション", "da-DK" to "Organic Maps: Offline Kort", "fa" to "Organic Maps・نقشه آفلاین و GPS", + "en-IN" to "Organic Maps・Offline Map & GPS", + "hy-AM" to "Organic Maps・Offline Map & GPS", "ur" to "Organic Maps・Offline Map & GPS", + "mai" to "Organic Maps・ऑफलाइन नक्शा आ GPS", "ko-KR" to "Organic Maps・GPS 지도 길찾기 앱 & 地图", "id" to "Organic Maps: pemetaan offline", + "ky-KG" to "Organic Maps・Офлайн карта жана GPS", "sr" to "Organic Maps・Mape i navigacija", "el-GR" to "Organic Maps: Χάρτες & GPS", "eu-ES" to "Organic Maps・Offline Map & GPS", "hu-HU" to "Organic Maps offline navigáció", "lo-LA" to "Organic Maps・ແຜນທີ່ອອບໄລນ໌", "no-NO" to "Organic Maps・kart & navigasjon", + "rm" to "Organic Maps: Carta Offline & GPS", + "sw" to "Organic Maps・Ramani Offline na GPS", + "te-IN" to "Organic Maps・ఆఫ్‌లైన్ మ్యాప్", + "uz" to "Organic Maps: Oflayn xarita va GPS", "sv-SE" to "Organic Maps: kartor & GPS", "et" to "Organic Maps: gps offline", "pl-PL" to "Organic Map・mapy i GPS offline", "kn-IN" to "Organic Maps・ಆಫ್‌ಲೈನ್ ಮ್ಯಾಪ್", + "fil" to "Organic Maps・Offline na Mapa at GPS", "pt-BR" to "Organic Maps - Mapas offline", "ar" to "Organic Maps・خرائط بدون إنترنت", "ka-GE" to "Organic Map: ნავიგაცია, რუკები", "sk" to "Organic Map・Offline Mapy & GPS", + "pa" to "Organic Maps: ਆਫਲਾਈਨ ਨਕਸ਼ੇ", "gu" to "Organic Maps・ઓફલાઇન નકશો", + "is-IS" to "Organic Maps・Ótengd kort og GPS", "az-AZ" to "Organic Maps – Xəritə və GPS", + "es-US" to "Organic Maps: mapas sin conexión y GPS", "fi-FI" to "Organic Maps: offline kartat", ) .getBestLocale(localeList) ?: "Unknown App", diff --git a/app/src/androidTest/java/org/fdroid/ui/screenshots/MyAppsItems.kt b/app/src/androidTest/java/org/fdroid/ui/screenshots/MyAppsItems.kt index 7ecdf198f..2ebfbfbcf 100644 --- a/app/src/androidTest/java/org/fdroid/ui/screenshots/MyAppsItems.kt +++ b/app/src/androidTest/java/org/fdroid/ui/screenshots/MyAppsItems.kt @@ -8,6 +8,71 @@ import org.fdroid.ui.utils.getPreviewVersion fun getUpdates(localeList: LocaleListCompat) = listOf( + AppUpdateItem( + repoId = 1L, + packageName = "app.comaps.fdroid", + name = + mapOf( + "pt-PT" to "CoMaps - Mapas e Navegação - Offline e Privada", + "zh-CN" to "CoMaps — 隐私保护下的离线远足、骑行、驾驶", + "lv" to "CoMaps - dodies ceļā bezsaistē ar privātumu", + "hr" to "CoMaps - Pješačite, biciklirajte, vozite Offline i", + "sl" to "CoMaps – potujte brez povezave, zasebno", + "ru-RU" to "CoMaps - Карты и путешествия с приватностью", + "fr-FR" to "CoMaps - Randonnée, Vélo, Conduite hors ligne", + "es-ES" to "CoMaps - Senderismo, ciclismo y conducción offline", + "lt" to "CoMaps – keliaukite atsijungę ir privačiai", + "en-US" to "CoMaps - Hike, Bike, Drive Offline with Privacy", + "tr-TR" to "CoMaps - Gizlilikle Yürüyün, Sürün, Gezin", + "ro" to "CoMaps - călătorește offline cu confidențialitate", + "bn-BD" to "কোম্যাপস - অফলাইনে হাইকিং, সাইকেলিং ও ড্রাইভিং", + "ca" to "CoMaps - Camina, pedala o condueix privadament", + "it-IT" to "CoMaps - Navigazione Offline con Privacy", + "uk" to "CoMaps — ходьба та поїздки офлайн із приватність", + "zh-TW" to "CoMaps — 隱私保護下的離線遠足、騎行、駕駛", + "gl-ES" to "CoMaps - Aplicación de mapas privada, sen conexión", + "bg" to "CoMaps - Хайкинг, Велосипед, Пътуване без Интернет", + "cs-CZ" to "CoMaps – pěšky, na kole a autem offline a soukromě", + "nl-NL" to "CoMaps - Wandel, fiets, rijd offline met privacy", + "de-DE" to "CoMaps – Offline navigieren mit Datenschutz", + "da-DK" to "CoMaps - vandr, cykl og kør offline med privatliv", + "id" to "CoMaps- Navigasi Offline dengan Privasi", + "sr" to "CoMaps - пешачење, бицикл и вожња, са приватношћу", + "el-GR" to "CoMaps - Πλοήγηση εκτός σύνδεσης με ιδιωτικότητα", + "eu-ES" to "CoMaps - mapak offline eta dena pribatuan", + "hu-HU" to "CoMaps – túrázás, kerékpározás, autózás offline", + "no-NO" to "CoMaps - Gå, Sykle, Kjør Uten Internett", + "sv-SE" to "Comaps- Vandra, Cykla, Kör Offline, Privat", + "et" to "CoMaps - sinu privaatne kaart", + "pl-PL" to "CoMaps - Nawiguj offline z zachowaniem prywatności", + "kn-IN" to "ಸಹ ನಕ್ಷೆಗಳು - ಆಫ್‌ಲೈನ್ ಮತ್ತು ಗೌಪ್ಯತೆಯೊಂದಿಗೆ", + "pt-BR" to "CoMaps - Mapas e Navegação Offline com Privacidade", + "ar" to "CoMaps - تنزه وتنقل وقُد دون إنترنت مع الخصوصية", + "sk" to "CoMaps - kráčaj, bicykluj a jazdi v súkromí", + "fi-FI" to "CoMaps - Navigoi yksityisesti ilman verkkoyhteyttä", + "kw" to "CoMaps - Viajya gans Privetter", + "fa-IR" to "CoMaps - کوه‌نوردی، دوچرخه‌سواری و رانندگی آفلاین", + "pt" to "CoMaps - Mapas e Navegação - Offline e Privada", + "ta-IN" to "இணைவரைபடங்கள் - மலையேறு, வண்டி, தனிமையில் இயக்கு", + "en-GB" to "CoMaps - Hike, Bike, Drive Offline with Privacy", + "mt" to "CoMaps - Imxi, Suq Rota u Karozza bil-Privatezza", + "bn" to "CoMaps - অফলাইনে হাইক, বাইক, ড্রাইভ করুন", + "brh" to "CoMaps - آفلائن مش لگ، سائکل سواری و موٹر سواری", + "en-CA" to "CoMaps - Hike, Bike, Drive Offline with Privacy", + "eo" to "CoMaps - Migru, Biciklu, Veturigu Eksterrete", + "ast" to "CoMaps - Mapas ensin conexón con privacidá", + ) + .getBestLocale(localeList) ?: "Unknown App", + installedVersionName = "2026.05.06-10-FDroid", + update = + getPreviewVersion( + versionName = "2026.05.06-11-FDroid", + size = 65470491, + ), + whatsNew = "foo bar", + iconModel = + "https://f-droid.org/repo/app.comaps.fdroid/en-US/icon_Xqa9hlGluoI0ME9XbHrLOaAJ_dX9wWMtDhLgpFYbUOI=.png", + ), AppUpdateItem( repoId = 1L, packageName = "app.organicmaps", @@ -18,64 +83,104 @@ fun getUpdates(localeList: LocaleListCompat) = "pt-PT" to "Organic Maps - Mapas offline", "zh-CN" to "Organic Maps・离线地图与导航 & GPS", "iw-IL" to "Organic Maps・מפת אופליין ו-GPS", + "ms-MY" to "Organic Maps: Peta & Navigasi", "lv" to "Organic Maps・Kartes・Navigācija", + "am" to "Organic Maps・ከመስመር ውጭ ካርታ & GPS", + "en-SG" to "Organic Maps・Offline Map & GPS", + "af" to "Organic Maps・Aflynkaart & GPS", "kk" to "Organic Maps: Карталар", "hr" to "Organic Maps: offline karte", "th" to "Organic Maps: แผนที่gps", "si-LK" to "Organic Maps・ඔෆ්ලයින් සිතියම්", "sl" to "Organic Maps・Offline Karte", "ru-RU" to "Organic Maps: GPS карты офлайн", + "es-419" to "Organic Maps: mapas sin conexión y GPS", "ne-NP" to "Organic Map・अफलाइन नक्सा & GPS", + "jv" to "Organic Maps・Peta Offline & GPS", "fr-FR" to "Organic Maps: gps hors ligne", "es-ES" to "Organic Maps: mapas offline", "mk-MK" to "Organic Maps・Мапи и навигација", + "ta-IN" to "Organic Maps・ஆஃப்லைன் வரைபடம்", "be" to "Organic Maps: GPS карты офлайн", + "or" to "Organic Maps・ଅଫଲାଇନ୍ ମ୍ୟାପ୍ ଓ GPS", + "en-ZA" to "Organic Maps・Offline Map & GPS", + "fr-CA" to "Organic Maps: gps hors ligne", "lt" to "Organic Maps・žemėlapis & GPS", "ms" to "Organic Maps: Peta & Navigasi", + "sq" to "Organic Maps・Hartë Offline & GPS", + "fa-AE" to "Organic Maps・نقشه آفلاین و GPS", "en-US" to "Organic Maps・Offline Map & GPS", + "bs" to "Organic Maps: Offline mape i GPS", "tr-TR" to "Organic Maps: Haritalar ve GPS", "ro" to "Organic Maps: hărți offline", + "en-GB" to "Organic Maps・Offline Map & GPS", + "ug" to "Organic Maps・تورسىز خەرىتە GPS", "hi-IN" to "Organic Maps・ऑफ़लाइन मैप", + "bo" to "Organic Maps・དྲ་རྒྱ་མེད་ས་ཁྲ། GPS", "mr-IN" to "Organic Maps ऑफलाईन नकाशे", "bn-BD" to "Organic Maps・मैप्स और नेविगेशन", "ca" to "Organic Map・Mapa Offline i GPS", "it-IT" to "Organic Maps: Mappe Offline", "uk" to "Organic Maps: GPS карти офлайн", + "fa-AF" to "Organic Maps・نقشه آفلاین و GPS", + "mn-MN" to "Organic Maps・Офлайн газрын зураг ба GPS", "zh-TW" to "Organic Maps・離線地圖與導航 GPS", + "as" to "Organic Maps・অফলাইন মেপ আৰু GPS", "zh-HK" to "Organic Maps: 地圖與導航", "gl-ES" to "Organic Maps・Mapa fóra de liña", + "mi" to "Organic Maps・Mahere Tuimotu GPS", + "en-AU" to "Organic Maps・Offline Map & GPS", "bg" to "Organic Maps: офлайн GPS карти", + "my-MM" to "Organic Maps・အော့ဖ်လိုင်းမြေပုံနှင့် GPS", "cs-CZ" to "Organic Maps・mapy offline, GPS", "ml-IN" to "Organic Maps・ഓഫ്‌ലൈൻ മാപ്പ്", "nl-NL" to "Organic Maps: offline kaarten", + "en-CA" to "Organic Maps・Offline Map & GPS", "de-DE" to "Organic Maps Offline Karten", + "zu" to "Organic Maps・Imephu Offline ne-GPS", "ja-JP" to "Organic Maps: マップ & ナビゲーション", "da-DK" to "Organic Maps: Offline Kort", "fa" to "Organic Maps・نقشه آفلاین و GPS", + "en-IN" to "Organic Maps・Offline Map & GPS", + "hy-AM" to "Organic Maps・Offline Map & GPS", "ur" to "Organic Maps・Offline Map & GPS", + "mai" to "Organic Maps・ऑफलाइन नक्शा आ GPS", "ko-KR" to "Organic Maps・GPS 지도 길찾기 앱 & 地图", "id" to "Organic Maps: pemetaan offline", + "ky-KG" to "Organic Maps・Офлайн карта жана GPS", "sr" to "Organic Maps・Mape i navigacija", "el-GR" to "Organic Maps: Χάρτες & GPS", "eu-ES" to "Organic Maps・Offline Map & GPS", "hu-HU" to "Organic Maps offline navigáció", "lo-LA" to "Organic Maps・ແຜນທີ່ອອບໄລນ໌", "no-NO" to "Organic Maps・kart & navigasjon", + "rm" to "Organic Maps: Carta Offline & GPS", + "sw" to "Organic Maps・Ramani Offline na GPS", + "te-IN" to "Organic Maps・ఆఫ్‌లైన్ మ్యాప్", + "uz" to "Organic Maps: Oflayn xarita va GPS", "sv-SE" to "Organic Maps: kartor & GPS", "et" to "Organic Maps: gps offline", "pl-PL" to "Organic Map・mapy i GPS offline", "kn-IN" to "Organic Maps・ಆಫ್‌ಲೈನ್ ಮ್ಯಾಪ್", + "fil" to "Organic Maps・Offline na Mapa at GPS", "pt-BR" to "Organic Maps - Mapas offline", "ar" to "Organic Maps・خرائط بدون إنترنت", "ka-GE" to "Organic Map: ნავიგაცია, რუკები", "sk" to "Organic Map・Offline Mapy & GPS", + "pa" to "Organic Maps: ਆਫਲਾਈਨ ਨਕਸ਼ੇ", "gu" to "Organic Maps・ઓફલાઇન નકશો", + "is-IS" to "Organic Maps・Ótengd kort og GPS", "az-AZ" to "Organic Maps – Xəritə və GPS", + "es-US" to "Organic Maps: mapas sin conexión y GPS", "fi-FI" to "Organic Maps: offline kartat", ) .getBestLocale(localeList) ?: "Unknown App", - installedVersionName = "2026.02.18-4-FDroid", - update = getPreviewVersion(versionName = "2026.02.18-5-FDroid", size = 70355961), + installedVersionName = "2026.05.27-10-FDroid", + update = + getPreviewVersion( + versionName = "2026.05.27-11-FDroid", + size = 71778828, + ), whatsNew = "foo bar", iconModel = "https://f-droid.org/repo/app.organicmaps/en-US/icon_dE7f4P95-uKZwu7cI89Q0xSi_-gvU4DD-XnLoDG9RLg=.png", @@ -84,34 +189,37 @@ fun getUpdates(localeList: LocaleListCompat) = repoId = 1L, packageName = "at.bitfire.davdroid", name = mapOf("ca" to "DAVx⁵", "en-US" to "DAVx⁵").getBestLocale(localeList) ?: "Unknown App", - installedVersionName = "4.5.8-ose", - update = getPreviewVersion(versionName = "4.5.9-ose", size = 15974669), + installedVersionName = "4.5.12-ose", + update = + getPreviewVersion( + versionName = "4.5.13-ose", + size = 16018266, + ), whatsNew = null, iconModel = "https://f-droid.org/repo/at.bitfire.davdroid/en-US/icon_NexNou7vmaD45rbdc8kjLj0Rv7FW128Mde9OQpHFXPE=.png", ), - AppUpdateItem( - repoId = 1L, - packageName = "ch.protonvpn.android", - name = - mapOf("en-US" to "ProtonVPN - Secure and Free VPN").getBestLocale(localeList) - ?: "Unknown App", - installedVersionName = "5.16.30.9", - update = getPreviewVersion(versionName = "5.16.31.0", size = 54161941), - whatsNew = "foo bar", - iconModel = - "https://f-droid.org/repo/ch.protonvpn.android/en-US/icon_xAphlcwMgx7oE7sxB15sxUFIO8geUokWkG01K1fubas=.png", - ), ) fun getInstalledApps(localeList: LocaleListCompat) = listOf( + InstalledAppItem( + packageName = "ch.protonvpn.android", + name = + mapOf("en-US" to "ProtonVPN - Secure and Free VPN").getBestLocale(localeList) + ?: "Unknown App", + installedVersionName = "5.18.75.0", + installedVersionCode = 1, + lastUpdated = 1780506857489L, + iconModel = + "https://f-droid.org/repo/ch.protonvpn.android/en-US/icon_xAphlcwMgx7oE7sxB15sxUFIO8geUokWkG01K1fubas=.png", + ), InstalledAppItem( packageName = "com.aurora.store", name = mapOf("en-US" to "Aurora Store").getBestLocale(localeList) ?: "Unknown App", - installedVersionName = "4.8.1", + installedVersionName = "4.8.3", installedVersionCode = 1, - lastUpdated = 1771544205000L, + lastUpdated = 1779007734975L, iconModel = "https://f-droid.org/repo/com.aurora.store/en-US/icon_tbAhwq51NNd0liZcTg0cQNNvazxrWlj7bPCe_1TkCV8=.png", ), @@ -119,18 +227,18 @@ fun getInstalledApps(localeList: LocaleListCompat) = packageName = "com.duckduckgo.mobile.android", name = mapOf("en-US" to "DuckDuckGo Privacy Browser").getBestLocale(localeList) ?: "Unknown App", - installedVersionName = "5.268.1", + installedVersionName = "5.281.1", installedVersionCode = 1, - lastUpdated = 1772699310000L, + lastUpdated = 1780614376764L, iconModel = "https://f-droid.org/repo/com.duckduckgo.mobile.android/en-US/icon_QyKhnj_C0Pek3xtJAfPFTvywRXDutsVh7r-9t-doP9E=.png", ), InstalledAppItem( packageName = "com.foobnix.pro.pdf.reader", name = mapOf("en-US" to "Librera Reader").getBestLocale(localeList) ?: "Unknown App", - installedVersionName = "9.3.63-fdroid", + installedVersionName = "9.3.75-fdroid", installedVersionCode = 1, - lastUpdated = 1772574994000L, + lastUpdated = 1777245514905L, iconModel = "https://f-droid.org/repo/com.foobnix.pro.pdf.reader/en-US/icon_y15Jxhzp6YrmjLC-wtc27B6XLTcArf7yK-2WlpNaoe0=.png", ), @@ -141,6 +249,7 @@ fun getInstalledApps(localeList: LocaleListCompat) = "ar" to "K-9 Mail", "be" to "Пошта K-9", "bg" to "K-9 Поща", + "br" to "Postel K-9", "ca" to "K-9 Mail", "co" to "K-9 Mail", "cs-CZ" to "K-9 Mail", @@ -158,6 +267,7 @@ fun getInstalledApps(localeList: LocaleListCompat) = "fy" to "K-9 Mail", "ga" to "K-9 Mail", "gd" to "Post K-9", + "gl-ES" to "K-9 Mail", "he" to "K-9 דוא\"ל", "hi-IN" to "K-9 Mail", "hr" to "K-9 Mail", @@ -191,36 +301,82 @@ fun getInstalledApps(localeList: LocaleListCompat) = "zh-TW" to "K-9 Mail", ) .getBestLocale(localeList) ?: "Unknown App", - installedVersionName = "16.1", + installedVersionName = "19.2", installedVersionCode = 1, - lastUpdated = 1770745842000L, + lastUpdated = 1780699361309L, iconModel = "https://f-droid.org/repo/com.fsck.k9/en-US/icon_-2bZW0ZnkKqPVher2SxQK8hXGGSjgaBHoa8x6vW0v8w=.png", ), InstalledAppItem( packageName = "com.github.andreyasadchy.xtra", name = mapOf("en-US" to "Xtra").getBestLocale(localeList) ?: "Unknown App", - installedVersionName = "2.54.3", + installedVersionName = "2.56.2", installedVersionCode = 1, - lastUpdated = 1772397992000L, + lastUpdated = 1780506857489L, iconModel = "https://f-droid.org/repo/com.github.andreyasadchy.xtra/en-US/icon_yfnxF0cNrXwFX2a93BUclISVaIQzoRmbOuxtGDAwz28=.png", ), + InstalledAppItem( + packageName = "com.github.catfriend1.syncthingfork", + name = + mapOf( + "en-US" to "Syncthing-Fork", + "vi" to "Syncthing-Fork", + "he" to "Syncthing-Fork", + "pt-PT" to "Syncthing-Fork", + "zh-CN" to "Syncthing-Fork", + "ru-RU" to "Syncthing-Fork", + "es-419" to "Syncthing-Fork", + "fr-FR" to "Syncthing-Fork", + "es-ES" to "Syncthing-Fork", + "be" to "Syncthing-Fork", + "tr-TR" to "Syncthing-Fork", + "ro" to "Syncthing-Fork", + "ca" to "Syncthing-Fork", + "it-IT" to "Syncthing-Fork", + "uk" to "Syncthing-Fork", + "zh-TW" to "Syncthing-Fork", + "bg" to "Syncthing-Fork", + "cs-CZ" to "Syncthing-Fork", + "nl-NL" to "Syncthing-Fork", + "de-DE" to "Syncthing-Fork", + "ja-JP" to "Syncthing-Fork", + "da-DK" to "Syncthing-Fork", + "ko-KR" to "Syncthing-Fork", + "id" to "Syncthing-Fork", + "sr" to "Syncthing-Fork", + "hu-HU" to "Syncthing-Fork", + "sv-SE" to "Syncthing-Fork", + "et" to "Syncthing-Fork", + "pl-PL" to "Syncthing-Fork", + "pt-BR" to "Syncthing-Fork", + "ar" to "Syncthing-Fork", + "sk" to "Syncthing-Fork", + "es-US" to "Syncthing-Fork", + "fi-FI" to "Syncthing-Fork", + ) + .getBestLocale(localeList) ?: "Unknown App", + installedVersionName = "2.1.0.0", + installedVersionCode = 1, + lastUpdated = 1778740722978L, + iconModel = + "https://f-droid.org/repo/com.github.catfriend1.syncthingfork/en-US/icon_egWOwTWZpQ_1CxmdrwP5wRta5EVmCCuzQWxjI5JTs0w=.png", + ), InstalledAppItem( packageName = "com.github.libretube", name = mapOf("en-US" to "LibreTube").getBestLocale(localeList) ?: "Unknown App", - installedVersionName = "0.30.0", + installedVersionName = "31.4", installedVersionCode = 1, - lastUpdated = 1769702789000L, + lastUpdated = 1780094298321L, iconModel = "https://f-droid.org/repo/com.github.libretube/en-US/icon_p6_cfoYk-2IlerJpH4rKIQmkI76zXtS3R9-RZp-3Ggk=.png", ), InstalledAppItem( packageName = "com.inspiredandroid.linuxcommandbibliotheca", name = mapOf("en-US" to "Linux Command Library").getBestLocale(localeList) ?: "Unknown App", - installedVersionName = "3.5.13", + installedVersionName = "4.0.6", installedVersionCode = 1, - lastUpdated = 1772463524000L, + lastUpdated = 1780012218733L, iconModel = "https://f-droid.org/repo/com.inspiredandroid.linuxcommandbibliotheca/en-US/icon_DrA_e_52nvGa_kTMSapBw4MCqKpccl8WZqrG5enB7rI=.png", ), @@ -257,48 +413,4 @@ fun getInstalledApps(localeList: LocaleListCompat) = iconModel = "https://f-droid.org/repo/com.junkfood.seal/en-US/icon_j8mCLA_OX-sJn7TRAdvoaUMW1f6djRv6RMzAnNdaG4I=.png", ), - InstalledAppItem( - packageName = "com.kunzisoft.keepass.libre", - name = - mapOf( - "ar" to "KeePassDX Passkey Vault", - "cs-CZ" to "Trezor pro klíče KeePassDX", - "de-DE" to "KeePassDX Passkey-Tresor", - "en-US" to "KeePassDX Passkey Vault", - "es-ES" to "KeePassDX Passkey Vault", - "et" to "KeePassDX salasõnahoidla", - "fr-FR" to "KeePassDX - Passkey local", - "hr" to "KeePassDX Passkey Vault", - "hu-HU" to "KeePassDX jelszótároló", - "id" to "KeePassDX Passkey Vault", - "it-IT" to "Cassaforte passkey KeePassDX", - "ja-JP" to "KeePassDX パスワード管理ツール", - "lt" to "KeePassDX slaptažodžių seifas", - "lv" to "KeePassDX: paroļu pārvaldnieks", - "mk-MK" to "KeePassDX Passkey Vault", - "nl-NL" to "KeePassDX Passkey-kluis", - "pl-PL" to "KeePassDX – Bezpieczny sejf", - "ru-RU" to "KeePassDX - менеджер паролей", - "sq" to "Kasafortë Kyçklm. KeePassDX", - "th" to "ตู้นิรภัยพาสคีย์คียพาสดีเอ็กซ์", - "tr-TR" to "KeePassDX Passkey Vault", - "zh-CN" to "KeePassDX 密码库", - "zh-TW" to "KeePassDX 密碼(金鑰/單字)保險庫", - ) - .getBestLocale(localeList) ?: "Unknown App", - installedVersionName = "4.3.2", - installedVersionCode = 1, - lastUpdated = 1768680637000L, - iconModel = - "https://f-droid.org/repo/com.kunzisoft.keepass.libre/en-US/icon_eLwXEQD9l2URrUS3t8esDXnsKGBaH02E-ddEYhV_i7Q=.png", - ), - InstalledAppItem( - packageName = "com.looker.droidify", - name = mapOf("en-US" to "Droid-ify").getBestLocale(localeList) ?: "Unknown App", - installedVersionName = "0.7.0", - installedVersionCode = 1, - lastUpdated = 1771667689000L, - iconModel = - "https://f-droid.org/repo/com.looker.droidify/en-US/icon_lApsnfhrMqGkCaW-IdnYwx86CUjdTutncPvXPJythaM=.png", - ), ) diff --git a/app/src/full/res/drawable/check.xml b/app/src/full/res/drawable/check.xml deleted file mode 100644 index 3f26c70ce..000000000 --- a/app/src/full/res/drawable/check.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/full/res/drawable/ic_add_circle_outline.xml b/app/src/full/res/drawable/ic_add_circle_outline.xml deleted file mode 100644 index c6c1d9a0a..000000000 --- a/app/src/full/res/drawable/ic_add_circle_outline.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/full/res/layout/swap_app_list_item.xml b/app/src/full/res/layout/swap_app_list_item.xml deleted file mode 100644 index 8530a552e..000000000 --- a/app/src/full/res/layout/swap_app_list_item.xml +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - -