From d6059ebd3d6ece052908f891d1076d6ef04163e2 Mon Sep 17 00:00:00 2001 From: rainxchzed Date: Tue, 5 May 2026 16:01:45 +0500 Subject: [PATCH 1/3] feat(details): source license from backend, drop GitHub enrichment, bump RepoStats cache key to v3 --- .../core/data/dto/BackendRepoResponse.kt | 7 +++ .../rainxch/details/data/di/SharedModule.kt | 1 - .../data/repository/DetailsRepositoryImpl.kt | 52 ++++--------------- 3 files changed, 16 insertions(+), 44 deletions(-) diff --git a/core/data/src/commonMain/kotlin/zed/rainxch/core/data/dto/BackendRepoResponse.kt b/core/data/src/commonMain/kotlin/zed/rainxch/core/data/dto/BackendRepoResponse.kt index def195dc4..78e8f9662 100644 --- a/core/data/src/commonMain/kotlin/zed/rainxch/core/data/dto/BackendRepoResponse.kt +++ b/core/data/src/commonMain/kotlin/zed/rainxch/core/data/dto/BackendRepoResponse.kt @@ -14,6 +14,7 @@ data class BackendRepoResponse( val stargazersCount: Int, val forksCount: Int, val openIssuesCount: Int = 0, + val license: BackendLicense? = null, val language: String? = null, val topics: List = emptyList(), val releasesUrl: String? = null, @@ -37,3 +38,9 @@ data class BackendRepoOwner( val login: String, val avatarUrl: String? = null, ) + +@Serializable +data class BackendLicense( + val spdxId: String? = null, + val name: String? = null, +) diff --git a/feature/details/data/src/commonMain/kotlin/zed/rainxch/details/data/di/SharedModule.kt b/feature/details/data/src/commonMain/kotlin/zed/rainxch/details/data/di/SharedModule.kt index 5f6eb63dc..23f8239e9 100644 --- a/feature/details/data/src/commonMain/kotlin/zed/rainxch/details/data/di/SharedModule.kt +++ b/feature/details/data/src/commonMain/kotlin/zed/rainxch/details/data/di/SharedModule.kt @@ -19,7 +19,6 @@ val detailsModule = backendApiClient = get(), localizationManager = get(), cacheManager = get(), - tokenStore = get(), ) } diff --git a/feature/details/data/src/commonMain/kotlin/zed/rainxch/details/data/repository/DetailsRepositoryImpl.kt b/feature/details/data/src/commonMain/kotlin/zed/rainxch/details/data/repository/DetailsRepositoryImpl.kt index 3de9ed257..1df687d52 100644 --- a/feature/details/data/src/commonMain/kotlin/zed/rainxch/details/data/repository/DetailsRepositoryImpl.kt +++ b/feature/details/data/src/commonMain/kotlin/zed/rainxch/details/data/repository/DetailsRepositoryImpl.kt @@ -54,7 +54,6 @@ class DetailsRepositoryImpl( private val localizationManager: LocalizationManager, private val logger: GitHubStoreLogger, private val cacheManager: CacheManager, - private val tokenStore: zed.rainxch.core.data.data_source.TokenStore, ) : DetailsRepository { private val httpClient: HttpClient get() = clientProvider.client @@ -211,7 +210,7 @@ class DetailsRepositoryImpl( val cacheKey = "details:repo:$owner/$name" cacheManager.put(cacheKey, result, REPO_DETAILS) cacheManager.invalidate("details:repo_id:${result.id}") - cacheManager.invalidate("details:stats:v2:$owner/$name") + cacheManager.invalidate("details:stats:v3:$owner/$name") cacheManager.invalidate("details:latest_release:$owner/$name") cacheManager.invalidate("details:releases:$owner/$name") return result @@ -517,61 +516,28 @@ class DetailsRepositoryImpl( owner: String, repo: String, ): RepoStats { - // v2 — backend now supplies openIssues; pre-PR entries had it pinned - // to 0 for anon users. Bumping the key forces re-fetch instead of - // serving stale zeros for the remainder of the 6h TTL after upgrade. - val cacheKey = "details:stats:v2:$owner/$repo" + // v3 — backend now supplies license. Bumping the key forces re-fetch + // so post-upgrade users get a populated license instead of waiting + // 6h for the stale v2 entry (license=null) to expire. + val cacheKey = "details:stats:v3:$owner/$repo" cacheManager.get(cacheKey)?.let { cached -> logger.debug("Cache hit for repo stats $owner/$repo") return cached } - // Try backend first — provides stars/forks/openIssues/downloadCount. - // Backend doesn't have license yet, so supplement with a best-effort - // GitHub call for that field when signed in. If GitHub is blocked - // (e.g. for users in China), we still show the backend data. + // Try backend first — provides stars/forks/openIssues/license/downloadCount. + // No more direct GitHub enrichment for license (was 1 quota hit per + // signed-in user per stats fetch); backend is now authoritative. val backendResult = backendApiClient.getRepo(owner, repo) backendResult.fold( onSuccess = { backendRepo -> logger.debug("Backend hit for repo stats $owner/$repo") - - val hasToken = runCatching { - tokenStore.currentToken()?.accessToken?.isNotBlank() == true - }.getOrDefault(false) - val githubInfo = if (hasToken) { - try { - httpClient.executeRequest { - get("/repos/$owner/$repo") { - header(HttpHeaders.Accept, "application/vnd.github+json") - } - }.getOrNull() - } catch (e: CancellationException) { - throw e - } catch (e: Exception) { - logger.debug("GitHub enrichment failed for $owner/$repo: ${e.message}") - null - } - } else { - null - } - - // Preserve last-known license when GitHub enrichment didn't - // land — backend doesn't supply license yet, so a transient - // failure would otherwise clobber a real value with null. - val staleLicense = if (githubInfo == null) { - cacheManager.getStale(cacheKey)?.license - } else { - null - } - val result = RepoStats( stars = backendRepo.stargazersCount, forks = backendRepo.forksCount, openIssues = backendRepo.openIssuesCount, - license = githubInfo?.license?.spdxId - ?: githubInfo?.license?.name - ?: staleLicense, + license = backendRepo.license?.spdxId ?: backendRepo.license?.name, totalDownloads = backendRepo.downloadCount, ) cacheManager.put(cacheKey, result, REPO_STATS) From ae7bf5d854a88243bd36b08235e5cf4c2567c8eb Mon Sep 17 00:00:00 2001 From: rainxchzed Date: Tue, 5 May 2026 16:01:50 +0500 Subject: [PATCH 2/3] feat(search): route Recently Updated through backend, add Recently Released sort backed by latest release date --- .../search/data/repository/SearchRepositoryImpl.kt | 10 ++++++---- .../kotlin/zed/rainxch/domain/model/SortBy.kt | 9 +++++++++ .../search/presentation/mappers/SortByMappers.kt | 1 + .../zed/rainxch/search/presentation/model/SortByUi.kt | 1 + .../rainxch/search/presentation/utils/SortByMapper.kt | 1 + 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/feature/search/data/src/commonMain/kotlin/zed/rainxch/search/data/repository/SearchRepositoryImpl.kt b/feature/search/data/src/commonMain/kotlin/zed/rainxch/search/data/repository/SearchRepositoryImpl.kt index 8a712898b..a26d3d85b 100644 --- a/feature/search/data/src/commonMain/kotlin/zed/rainxch/search/data/repository/SearchRepositoryImpl.kt +++ b/feature/search/data/src/commonMain/kotlin/zed/rainxch/search/data/repository/SearchRepositoryImpl.kt @@ -112,9 +112,10 @@ class SearchRepositoryImpl( ): PaginatedDiscoveryRepositories? { if (query.isBlank()) return null - // Backend doesn't support forks or recently-updated sorting — - // fall through to GitHub REST which honors both natively. - if (sortBy == SortBy.MostForks || sortBy == SortBy.RecentlyUpdated) return null + // Backend doesn't support forks sorting — fall through to GitHub + // REST. RecentlyUpdated and RecentlyReleased route through backend + // (sort=updated / sort=releases respectively). + if (sortBy == SortBy.MostForks) return null val platformSlug = when (platform) { DiscoveryPlatform.Android -> "android" @@ -127,8 +128,9 @@ class SearchRepositoryImpl( val sort = when (sortBy) { SortBy.MostStars -> "stars" SortBy.BestMatch -> "relevance" + SortBy.RecentlyUpdated -> "updated" + SortBy.RecentlyReleased -> "releases" SortBy.MostForks -> null // unreachable, guarded above - SortBy.RecentlyUpdated -> null // unreachable, guarded above } val offset = (page - 1) * BACKEND_PAGE_SIZE diff --git a/feature/search/domain/src/commonMain/kotlin/zed/rainxch/domain/model/SortBy.kt b/feature/search/domain/src/commonMain/kotlin/zed/rainxch/domain/model/SortBy.kt index 0e3593ef9..f3373a6b4 100644 --- a/feature/search/domain/src/commonMain/kotlin/zed/rainxch/domain/model/SortBy.kt +++ b/feature/search/domain/src/commonMain/kotlin/zed/rainxch/domain/model/SortBy.kt @@ -5,13 +5,22 @@ enum class SortBy { MostForks, BestMatch, RecentlyUpdated, + RecentlyReleased, ; + /** + * GitHub's REST `/search/repositories?sort=...` doesn't expose a + * "by latest release date" axis — only repo-level activity. When the + * backend isn't reachable and we fall through here, RecentlyReleased + * borrows `updated` semantics (closest available approximation) so + * the UI doesn't degrade silently to relevance order. + */ fun toGithubSortParam(): String? = when (this) { MostStars -> "stars" MostForks -> "forks" BestMatch -> null RecentlyUpdated -> "updated" + RecentlyReleased -> "updated" } } diff --git a/feature/search/presentation/src/commonMain/kotlin/zed/rainxch/search/presentation/mappers/SortByMappers.kt b/feature/search/presentation/src/commonMain/kotlin/zed/rainxch/search/presentation/mappers/SortByMappers.kt index 66a1bf8a9..f8006a565 100644 --- a/feature/search/presentation/src/commonMain/kotlin/zed/rainxch/search/presentation/mappers/SortByMappers.kt +++ b/feature/search/presentation/src/commonMain/kotlin/zed/rainxch/search/presentation/mappers/SortByMappers.kt @@ -10,5 +10,6 @@ fun SortByUi.toDomain(): SortBy { SortByUi.MostForks -> MostForks SortByUi.BestMatch -> BestMatch SortByUi.RecentlyUpdated -> RecentlyUpdated + SortByUi.RecentlyReleased -> RecentlyReleased } } diff --git a/feature/search/presentation/src/commonMain/kotlin/zed/rainxch/search/presentation/model/SortByUi.kt b/feature/search/presentation/src/commonMain/kotlin/zed/rainxch/search/presentation/model/SortByUi.kt index d5f0d23d0..3880102a4 100644 --- a/feature/search/presentation/src/commonMain/kotlin/zed/rainxch/search/presentation/model/SortByUi.kt +++ b/feature/search/presentation/src/commonMain/kotlin/zed/rainxch/search/presentation/model/SortByUi.kt @@ -5,4 +5,5 @@ enum class SortByUi { MostForks, BestMatch, RecentlyUpdated, + RecentlyReleased, } diff --git a/feature/search/presentation/src/commonMain/kotlin/zed/rainxch/search/presentation/utils/SortByMapper.kt b/feature/search/presentation/src/commonMain/kotlin/zed/rainxch/search/presentation/utils/SortByMapper.kt index 2d2c32943..8827a2a3b 100644 --- a/feature/search/presentation/src/commonMain/kotlin/zed/rainxch/search/presentation/utils/SortByMapper.kt +++ b/feature/search/presentation/src/commonMain/kotlin/zed/rainxch/search/presentation/utils/SortByMapper.kt @@ -11,4 +11,5 @@ fun SortByUi.label(): StringResource = MostForks -> Res.string.sort_most_forks BestMatch -> Res.string.sort_best_match RecentlyUpdated -> Res.string.sort_recently_updated + RecentlyReleased -> Res.string.sort_recently_released } From 2e12187a056e8e5ce9ae2341dd4c88d1b208367a Mon Sep 17 00:00:00 2001 From: rainxchzed Date: Tue, 5 May 2026 16:01:56 +0500 Subject: [PATCH 3/3] chore(strings): add sort_recently_released and 1.8.1 what's-new bullets across locales --- .../src/commonMain/composeResources/files/whatsnew/16.json | 5 +++-- .../commonMain/composeResources/files/whatsnew/ar/16.json | 5 +++-- .../commonMain/composeResources/files/whatsnew/bn/16.json | 5 +++-- .../commonMain/composeResources/files/whatsnew/es/16.json | 5 +++-- .../commonMain/composeResources/files/whatsnew/fr/16.json | 5 +++-- .../commonMain/composeResources/files/whatsnew/hi/16.json | 5 +++-- .../commonMain/composeResources/files/whatsnew/it/16.json | 5 +++-- .../commonMain/composeResources/files/whatsnew/ja/16.json | 5 +++-- .../commonMain/composeResources/files/whatsnew/ko/16.json | 5 +++-- .../commonMain/composeResources/files/whatsnew/pl/16.json | 5 +++-- .../commonMain/composeResources/files/whatsnew/ru/16.json | 5 +++-- .../commonMain/composeResources/files/whatsnew/tr/16.json | 5 +++-- .../commonMain/composeResources/files/whatsnew/zh-CN/16.json | 5 +++-- .../src/commonMain/composeResources/values-ar/strings-ar.xml | 1 + .../src/commonMain/composeResources/values-bn/strings-bn.xml | 1 + .../src/commonMain/composeResources/values-es/strings-es.xml | 1 + .../src/commonMain/composeResources/values-fr/strings-fr.xml | 1 + .../src/commonMain/composeResources/values-hi/strings-hi.xml | 1 + .../src/commonMain/composeResources/values-it/strings-it.xml | 1 + .../src/commonMain/composeResources/values-ja/strings-ja.xml | 1 + .../src/commonMain/composeResources/values-ko/strings-ko.xml | 1 + .../src/commonMain/composeResources/values-pl/strings-pl.xml | 1 + .../src/commonMain/composeResources/values-ru/strings-ru.xml | 1 + .../src/commonMain/composeResources/values-tr/strings-tr.xml | 1 + .../composeResources/values-zh-rCN/strings-zh-rCN.xml | 1 + .../src/commonMain/composeResources/values/strings.xml | 1 + 26 files changed, 52 insertions(+), 26 deletions(-) diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/16.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/16.json index 991814d78..6d2bd89ad 100644 --- a/core/presentation/src/commonMain/composeResources/files/whatsnew/16.json +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/16.json @@ -16,7 +16,7 @@ "Add from starred — surface APK-shipping repos from your GitHub stars and jump straight into installing.", "Installer attribution — set what installer name silent installs claim, so apps that gate on installer source can be coaxed into running.", "Manual refresh on details — pull-to-refresh on Android, overflow-menu Refresh on every platform, Ctrl/Cmd+R on desktop.", - "Search now sorts by Recently Updated — find repos with fresh stable releases first." + "Search now sorts by Recently Updated and Recently Released — find repos with fresh activity or fresh stable releases first." ] }, { @@ -24,7 +24,8 @@ "bullets": [ "Manual rescan surfaces every GitHub-style app on device.", "Tighter auth handling — transient 401s no longer trigger spurious sign-outs.", - "Open-issues count now shown to everyone, including signed-out users — the count now comes from the backend." + "Open-issues count now shown to everyone, including signed-out users — the count now comes from the backend.", + "License now shown for every repo regardless of sign-in state — sourced from backend, no more GitHub quota cost per Details open." ] }, { diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/ar/16.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/ar/16.json index f7acf806b..1ac80891b 100644 --- a/core/presentation/src/commonMain/composeResources/files/whatsnew/ar/16.json +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/ar/16.json @@ -16,7 +16,7 @@ "إضافة من المُنجَّمة: استعرض المستودعات التي تشحن APK ضمن نجوم GitHub لديك وانتقل مباشرة إلى التثبيت.", "تخصيص هوية المثبّت: عيّن اسم المثبّت الذي تدّعيه التثبيتات الصامتة، حتى تعمل التطبيقات التي تتحقّق من مصدر التثبيت.", "تحديث يدوي على شاشة التفاصيل: السحب للتحديث على Android، وعنصر «تحديث» في قائمة الخيارات على كل المنصات، واختصار Ctrl/Cmd+R على سطح المكتب.", - "البحث يدعم الآن الترتيب حسب «المحدّث مؤخراً» — اعثر على المستودعات ذات أحدث الإصدارات المستقرّة أولاً." + "البحث يدعم الآن الترتيب حسب «المحدّث مؤخراً» و«الأحدث إصداراً» — اعثر على المستودعات ذات أحدث النشاط أو أحدث الإصدارات المستقرّة أولاً." ] }, { @@ -24,7 +24,8 @@ "bullets": [ "إعادة المسح اليدوي تُظهر كل تطبيقات GitHub الموجودة على الجهاز دون تفويت أيّ منها.", "معالجة أكثر صرامة للمصادقة: استجابات 401 العابرة لم تعد تتسبّب في تسجيل خروج خاطئ.", - "عداد المشكلات المفتوحة يظهر الآن للجميع بمن فيهم غير المسجَّلين — يأتي من الخادم الخلفي دون أي تكلفة لحصص GitHub." + "عداد المشكلات المفتوحة يظهر الآن للجميع بمن فيهم غير المسجَّلين — يأتي من الخادم الخلفي دون أي تكلفة لحصص GitHub.", + "الترخيص يظهر الآن لكل مستودع بصرف النظر عن حالة تسجيل الدخول — يأتي من الخادم الخلفي بدون أي استهلاك لحصص GitHub عند فتح صفحة التفاصيل." ] }, { diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/bn/16.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/bn/16.json index d5a6ac6bb..e0af09708 100644 --- a/core/presentation/src/commonMain/composeResources/files/whatsnew/bn/16.json +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/bn/16.json @@ -16,7 +16,7 @@ "Add from starred — আপনার GitHub স্টার করা যেসব রিপো APK পাঠায় সেগুলো দেখুন আর সরাসরি ইনস্টলে যান।", "Installer attribution — সাইলেন্ট ইনস্টল কোন ইনস্টলার নাম দাবি করবে তা সেট করুন, যাতে যেসব অ্যাপ ইনস্টলার সোর্স দেখে সেগুলোও চলতে পারে।", "ডিটেইলস স্ক্রিনে ম্যানুয়াল রিফ্রেশ — Android-এ পুল-টু-রিফ্রেশ, সব প্ল্যাটফর্মে ওভারফ্লো মেনুতে রিফ্রেশ, ডেস্কটপে Ctrl/Cmd+R।", - "সার্চ এখন «সাম্প্রতিক আপডেট» দিয়ে সাজানো যায় — সর্বশেষ স্থিতিশীল রিলিজ আছে এমন রিপো প্রথমে দেখুন।" + "সার্চ এখন «সাম্প্রতিক আপডেট» আর «সাম্প্রতিক রিলিজ» দিয়ে সাজানো যায় — সর্বশেষ অ্যাক্টিভিটি বা স্থিতিশীল রিলিজ আছে এমন রিপো প্রথমে দেখুন।" ] }, { @@ -24,7 +24,8 @@ "bullets": [ "ম্যানুয়াল রি-স্ক্যান এখন ডিভাইসে থাকা সব GitHub-ধাঁচের অ্যাপ তুলে আনে।", "অথেনটিকেশন আরও সংযত: সাময়িক 401 আর ভুল করে সাইন-আউট ঘটায় না।", - "ওপেন ইস্যুর সংখ্যা এখন সবাইকে দেখানো হয়, এমনকি সাইন-ইন না করা ব্যবহারকারীদেরও — ব্যাকএন্ড থেকে আসে, GitHub কোটায় কোনো খরচ নেই।" + "ওপেন ইস্যুর সংখ্যা এখন সবাইকে দেখানো হয়, এমনকি সাইন-ইন না করা ব্যবহারকারীদেরও — ব্যাকএন্ড থেকে আসে, GitHub কোটায় কোনো খরচ নেই।", + "লাইসেন্স এখন প্রতিটি রিপোর জন্য সাইন-ইন স্ট্যাটাস নির্বিশেষে দেখানো হয় — ব্যাকএন্ড থেকে আসে, ডিটেইলস খোলার সময় GitHub কোটায় আর কোনো খরচ নেই।" ] }, { diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/es/16.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/es/16.json index 9bdf17867..124d8b0c4 100644 --- a/core/presentation/src/commonMain/composeResources/files/whatsnew/es/16.json +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/es/16.json @@ -16,7 +16,7 @@ "Añadir desde estrellas: descubre los repos de tus estrellas en GitHub que envían APK y salta directo a instalar.", "Atribución del instalador: define qué nombre de instalador declaran las instalaciones silenciosas, para que las apps que filtran por origen del instalador funcionen.", "Actualización manual en detalles: deslizar para actualizar en Android, opción «Actualizar» en el menú de opciones en todas las plataformas, Ctrl/Cmd+R en escritorio.", - "Búsqueda ordena ahora por «Actualizados recientemente» — encuentra primero los repos con releases estables más recientes." + "Búsqueda ordena ahora por «Actualizados recientemente» y «Lanzados recientemente» — encuentra primero los repos con actividad fresca o releases estables más recientes." ] }, { @@ -24,7 +24,8 @@ "bullets": [ "El reescaneo manual muestra todas las apps tipo GitHub presentes en el dispositivo.", "Mejor manejo de autenticación: los 401 transitorios ya no provocan cierres de sesión espurios.", - "El número de incidencias abiertas ahora se muestra a todos, incluidos los usuarios sin sesión — viene del backend, sin coste de cuota de GitHub." + "El número de incidencias abiertas ahora se muestra a todos, incluidos los usuarios sin sesión — viene del backend, sin coste de cuota de GitHub.", + "La licencia ahora se muestra para cada repo independientemente del estado de inicio de sesión — viene del backend, sin coste de cuota de GitHub al abrir Detalles." ] }, { diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/fr/16.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/fr/16.json index 9008d7d52..7fa864764 100644 --- a/core/presentation/src/commonMain/composeResources/files/whatsnew/fr/16.json +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/fr/16.json @@ -16,7 +16,7 @@ "Ajouter depuis les étoiles : repérez parmi vos repos étoilés sur GitHub ceux qui livrent un APK, puis installez-les directement.", "Attribution de l’installateur : choisissez le nom d’installateur que les installations silencieuses revendiquent, pour que les apps qui filtrent par source d’installation fonctionnent.", "Actualisation manuelle dans les détails : tirer pour actualiser sur Android, entrée « Actualiser » dans le menu sur toutes les plateformes, Ctrl/Cmd+R sur le bureau.", - "La recherche peut désormais trier par « Récemment mis à jour » — trouvez d’abord les dépôts avec les releases stables les plus récentes." + "La recherche peut désormais trier par « Récemment mis à jour » et « Récemment publiés » — trouvez d’abord les dépôts avec une activité récente ou les releases stables les plus récentes." ] }, { @@ -24,7 +24,8 @@ "bullets": [ "Le rescan manuel fait remonter toutes les apps de type GitHub présentes sur l’appareil.", "Gestion d’authentification renforcée : les 401 transitoires ne déconnectent plus à tort.", - "Le nombre d’issues ouvertes s’affiche désormais pour tout le monde, y compris les utilisateurs déconnectés — fourni par le backend, sans coût de quota GitHub." + "Le nombre d’issues ouvertes s’affiche désormais pour tout le monde, y compris les utilisateurs déconnectés — fourni par le backend, sans coût de quota GitHub.", + "La licence s’affiche désormais pour chaque dépôt, peu importe l’état de connexion — fournie par le backend, sans coût de quota GitHub à l’ouverture des Détails." ] }, { diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/hi/16.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/hi/16.json index 737ba7ac8..50badeffc 100644 --- a/core/presentation/src/commonMain/composeResources/files/whatsnew/hi/16.json +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/hi/16.json @@ -16,7 +16,7 @@ "Add from starred — अपने GitHub स्टार किए हुए रेपो में से APK वाले को सामने लाएँ और सीधे इंस्टॉल पर जाएँ।", "Installer attribution — साइलेंट इंस्टॉल किस इंस्टॉलर नाम का दावा करेंगे, इसे सेट करें ताकि इंस्टॉलर सोर्स पर निर्भर ऐप्स भी चल सकें।", "विवरण स्क्रीन पर मैन्युअल रीफ़्रेश — Android पर पुल-टू-रीफ़्रेश, हर प्लेटफ़ॉर्म पर ओवरफ़्लो मेन्यू में 'रीफ़्रेश', डेस्कटॉप पर Ctrl/Cmd+R।", - "सर्च अब 'हाल ही में अपडेट किया गया' के अनुसार सॉर्ट कर सकती है — सबसे नई स्थिर रिलीज़ वाले रेपो पहले देखें।" + "सर्च अब 'हाल ही में अपडेट किया गया' और 'हाल ही में रिलीज़' दोनों के अनुसार सॉर्ट कर सकती है — सबसे नई गतिविधि या स्थिर रिलीज़ वाले रेपो पहले देखें।" ] }, { @@ -24,7 +24,8 @@ "bullets": [ "मैन्युअल रीस्कैन डिवाइस पर मौजूद हर GitHub-शैली के ऐप को सामने ले आता है।", "ऑथ हैंडलिंग पहले से बेहतर: अस्थायी 401 अब ग़लती से साइन-आउट नहीं कराते।", - "खुले इश्यू की संख्या अब सभी को दिखाई देती है, यहाँ तक कि साइन-आउट उपयोगकर्ताओं को भी — बैकएंड से आती है, GitHub कोटे पर कोई असर नहीं।" + "खुले इश्यू की संख्या अब सभी को दिखाई देती है, यहाँ तक कि साइन-आउट उपयोगकर्ताओं को भी — बैकएंड से आती है, GitHub कोटे पर कोई असर नहीं।", + "लाइसेंस अब हर रेपो के लिए साइन-इन की स्थिति की परवाह किए बिना दिखता है — बैकएंड से आता है, विवरण खोलने पर अब GitHub कोटा खर्च नहीं होता।" ] }, { diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/it/16.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/it/16.json index 9d89f63bf..75bec7a82 100644 --- a/core/presentation/src/commonMain/composeResources/files/whatsnew/it/16.json +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/it/16.json @@ -16,7 +16,7 @@ "Aggiungi dalle stelle: scopri i repo che spediscono APK fra le tue stelle GitHub e vai dritto all'installazione.", "Attribuzione installatore: scegli quale nome di installatore dichiarano le installazioni silenziose, così le app che filtrano sull'origine funzionano.", "Aggiornamento manuale nei dettagli: trascina per aggiornare su Android, voce «Aggiorna» nel menu su tutte le piattaforme, Ctrl/Cmd+R su desktop.", - "La ricerca può ora ordinare per «Aggiornati di recente» — trova prima i repo con le release stabili più recenti." + "La ricerca può ora ordinare per «Aggiornati di recente» e «Rilasciati di recente» — trova prima i repo con attività fresca o release stabili più recenti." ] }, { @@ -24,7 +24,8 @@ "bullets": [ "La rilevazione manuale mostra tutte le app di tipo GitHub presenti sul dispositivo.", "Gestione dell’autenticazione più solida: i 401 transitori non causano più disconnessioni indebite.", - "Il conteggio delle issue aperte ora è visibile a tutti, anche agli utenti non autenticati — arriva dal backend, senza costi di quota GitHub." + "Il conteggio delle issue aperte ora è visibile a tutti, anche agli utenti non autenticati — arriva dal backend, senza costi di quota GitHub.", + "La licenza ora è mostrata per ogni repo indipendentemente dallo stato di accesso — arriva dal backend, senza costi di quota GitHub all’apertura dei Dettagli." ] }, { diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/ja/16.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/ja/16.json index 3d403982d..caad0a3e4 100644 --- a/core/presentation/src/commonMain/composeResources/files/whatsnew/ja/16.json +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/ja/16.json @@ -16,7 +16,7 @@ "スター付きから追加 — GitHub のスター付きリポから APK を配布しているものを表示し、そのままインストールに進めます。", "インストーラー属性 — サイレントインストール時に名乗るインストーラー名を変更でき、インストール元を見るアプリも動かせるようにします。", "詳細画面で手動更新 — Android はプルして更新、全プラットフォームでオーバーフローメニューに「更新」、デスクトップは Ctrl/Cmd+R に対応。", - "検索で「最近更新」順の並べ替えに対応 — 最新の安定版リリースがあるリポジトリを先に表示します。" + "検索で「最近更新」と「最近リリース」の並べ替えに対応 — 直近の動きがあるリポジトリ、または最新の安定版リリースがあるリポジトリを先に表示します。" ] }, { @@ -24,7 +24,8 @@ "bullets": [ "手動での再スキャンで、端末上の GitHub 系アプリをすべて検出するようになりました。", "認証エラー処理を強化。一時的な 401 で誤ってサインアウトされなくなりました。", - "オープン Issue 数を未ログインユーザーを含む全員に表示。バックエンドから取得するため GitHub のクォータを消費しません。" + "オープン Issue 数を未ログインユーザーを含む全員に表示。バックエンドから取得するため GitHub のクォータを消費しません。", + "ライセンスをサインイン状態に関係なく全リポジトリで表示。バックエンドから取得するため、詳細画面を開いても GitHub のクォータを消費しません。" ] }, { diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/ko/16.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/ko/16.json index 3a1ac5d2d..d35a44f90 100644 --- a/core/presentation/src/commonMain/composeResources/files/whatsnew/ko/16.json +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/ko/16.json @@ -16,7 +16,7 @@ "별표한 저장소에서 추가 — GitHub 별표 저장소 중 APK를 배포하는 곳을 보여주고, 바로 설치 단계로 넘어갈 수 있습니다.", "설치자 속성 — 무음 설치가 어떤 설치자 이름을 사용할지 지정해서, 설치 출처를 확인하는 앱도 실행될 수 있도록 합니다.", "세부 정보 화면에서 수동 새로 고침 — Android에서 당겨서 새로 고침, 모든 플랫폼의 오버플로 메뉴에 ‘새로 고침’, 데스크톱에서 Ctrl/Cmd+R.", - "검색에서 ‘최근 업데이트’ 정렬을 추가했습니다 — 최신 안정 릴리스가 있는 저장소를 먼저 보여줍니다." + "검색에서 ‘최근 업데이트’와 ‘최근 릴리스’ 정렬을 추가했습니다 — 최근 활동이 있거나 최신 안정 릴리스가 있는 저장소를 먼저 보여줍니다." ] }, { @@ -24,7 +24,8 @@ "bullets": [ "수동 재스캔이 기기의 모든 GitHub 계열 앱을 빠짐없이 표시합니다.", "인증 처리 강화: 일시적인 401로 인해 잘못 로그아웃되지 않습니다.", - "열린 이슈 수가 이제 로그아웃 사용자를 포함한 모두에게 표시됩니다 — 백엔드에서 제공되며 GitHub 할당량을 소비하지 않습니다." + "열린 이슈 수가 이제 로그아웃 사용자를 포함한 모두에게 표시됩니다 — 백엔드에서 제공되며 GitHub 할당량을 소비하지 않습니다.", + "라이선스가 로그인 여부와 관계없이 모든 저장소에 표시됩니다 — 백엔드에서 제공되며 세부 정보를 열어도 GitHub 할당량을 소비하지 않습니다." ] }, { diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/pl/16.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/pl/16.json index 9f80cf77c..054cd1a98 100644 --- a/core/presentation/src/commonMain/composeResources/files/whatsnew/pl/16.json +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/pl/16.json @@ -16,7 +16,7 @@ "Dodaj z oznaczonych gwiazdką — zobacz, które z twoich oznaczonych repo GitHub publikują APK, i przejdź wprost do instalacji.", "Atrybucja instalatora — ustaw nazwę instalatora, którą deklarują ciche instalacje, by aplikacje filtrujące po źródle instalacji działały.", "Ręczne odświeżanie w szczegółach — pociągnij, aby odświeżyć na Androidzie, pozycja „Odśwież” w menu na każdej platformie, Ctrl/Cmd+R na pulpicie.", - "Wyszukiwarka sortuje teraz po „Ostatnio zaktualizowane” — najpierw repozytoria z najświeższymi stabilnymi wydaniami." + "Wyszukiwarka sortuje teraz po „Ostatnio zaktualizowane” i „Niedawno wydane” — najpierw repozytoria z świeżą aktywnością albo najświeższymi stabilnymi wydaniami." ] }, { @@ -24,7 +24,8 @@ "bullets": [ "Ręczne ponowne skanowanie pokazuje wszystkie aplikacje z GitHuba obecne na urządzeniu.", "Stabilniejsza obsługa autoryzacji — przejściowe 401 nie powodują już fałszywych wylogowań.", - "Liczba otwartych zgłoszeń jest teraz pokazywana wszystkim, także użytkownikom niezalogowanym — pochodzi z backendu, bez kosztów limitu GitHuba." + "Liczba otwartych zgłoszeń jest teraz pokazywana wszystkim, także użytkownikom niezalogowanym — pochodzi z backendu, bez kosztów limitu GitHuba.", + "Licencja jest teraz pokazywana dla każdego repo niezależnie od stanu zalogowania — pochodzi z backendu, bez kosztów limitu GitHuba przy otwieraniu Szczegółów." ] }, { diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/ru/16.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/ru/16.json index 7d0e0f384..b9f6db280 100644 --- a/core/presentation/src/commonMain/composeResources/files/whatsnew/ru/16.json +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/ru/16.json @@ -16,7 +16,7 @@ "Добавление из звёзд — видите среди ваших звёзд GitHub репозитории с APK и сразу переходите к установке.", "Атрибуция установщика — задайте имя установщика, которым представляются тихие установки, чтобы работали приложения, проверяющие источник установки.", "Ручное обновление на экране деталей — потяните вниз для обновления на Android, пункт «Обновить» в меню на всех платформах, Ctrl/Cmd+R на десктопе.", - "Поиск теперь умеет сортировать по «Недавно обновлённым» — репозитории с самыми свежими стабильными релизами выводятся первыми." + "Поиск теперь умеет сортировать по «Недавно обновлённым» и «Недавно выпущенным» — репозитории со свежей активностью или самыми свежими стабильными релизами выводятся первыми." ] }, { @@ -24,7 +24,8 @@ "bullets": [ "Ручное пересканирование показывает все приложения GitHub-типа на устройстве.", "Аккуратная обработка авторизации: единичные 401 больше не вызывают ложный выход из аккаунта.", - "Количество открытых задач теперь видно всем, в том числе неавторизованным пользователям — берётся из бэкенда, без расхода квоты GitHub." + "Количество открытых задач теперь видно всем, в том числе неавторизованным пользователям — берётся из бэкенда, без расхода квоты GitHub.", + "Лицензия теперь видна для каждого репозитория независимо от статуса входа — берётся из бэкенда, без расхода квоты GitHub при открытии деталей." ] }, { diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/tr/16.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/tr/16.json index 5f25a8762..0ff7e4a40 100644 --- a/core/presentation/src/commonMain/composeResources/files/whatsnew/tr/16.json +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/tr/16.json @@ -16,7 +16,7 @@ "Yıldızlananlardan ekle — GitHub'da yıldızladıklarınız arasından APK gönderenleri görüp doğrudan kuruluma geçin.", "Yükleyici atfı — sessiz kurulumların hangi yükleyici adını taşıyacağını ayarlayın; kurulum kaynağını kontrol eden uygulamalar yine çalışsın.", "Detaylar ekranında manuel yenileme — Android'de aşağı çek-yenile, her platformda taşma menüsünde 'Yenile' seçeneği, masaüstünde Ctrl/Cmd+R.", - "Arama artık 'Yeni Güncellenmiş' sırasıyla sıralanabiliyor — en yeni kararlı sürümlere sahip depoları önce görün." + "Arama artık 'Yeni Güncellenmiş' ve 'Yeni Yayımlanmış' sırasıyla sıralanabiliyor — taze etkinliği veya en yeni kararlı sürümleri olan depoları önce görün." ] }, { @@ -24,7 +24,8 @@ "bullets": [ "Manuel yeniden tarama, cihazdaki tüm GitHub tipi uygulamaları görünür kılıyor.", "Daha sağlam kimlik doğrulama: geçici 401 yanıtları artık yanlışlıkla oturumu kapatmıyor.", - "Açık konu sayısı artık oturum açmamış kullanıcılar dahil herkese gösteriliyor — backend'den geliyor, GitHub kotası harcamıyor." + "Açık konu sayısı artık oturum açmamış kullanıcılar dahil herkese gösteriliyor — backend'den geliyor, GitHub kotası harcamıyor.", + "Lisans artık oturum durumundan bağımsız olarak her depo için gösteriliyor — backend'den geliyor, Detayları açarken GitHub kotası harcanmıyor." ] }, { diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/zh-CN/16.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/zh-CN/16.json index ccbb08041..256ed1b5b 100644 --- a/core/presentation/src/commonMain/composeResources/files/whatsnew/zh-CN/16.json +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/zh-CN/16.json @@ -16,7 +16,7 @@ "从星标添加:列出你 GitHub 星标里发布 APK 的仓库,直接跳到安装环节。", "安装来源伪装:可设置静默安装时声明的安装器名称,让那些根据安装来源做判断的应用也能正常运行。", "详情页手动刷新:Android 下拉刷新,所有平台的溢出菜单都加入「刷新」,桌面端支持 Ctrl/Cmd+R。", - "搜索新增「最近更新」排序 — 优先展示有最新稳定版本的仓库。" + "搜索新增「最近更新」和「最新发布」排序 — 优先展示有最新活动或最新稳定版本的仓库。" ] }, { @@ -24,7 +24,8 @@ "bullets": [ "手动重新扫描会列出设备上所有 GitHub 风格的应用,不再漏报。", "更稳健的鉴权处理:偶发的 401 不会再让你被错误地踢出登录。", - "未登录用户也能看到「Open Issues」数量了 — 数据来自后端,不消耗任何 GitHub 配额。" + "未登录用户也能看到「Open Issues」数量了 — 数据来自后端,不消耗任何 GitHub 配额。", + "无论是否登录,每个仓库都会显示许可证信息 — 数据来自后端,打开详情页不再消耗 GitHub 配额。" ] }, { diff --git a/core/presentation/src/commonMain/composeResources/values-ar/strings-ar.xml b/core/presentation/src/commonMain/composeResources/values-ar/strings-ar.xml index f13adc9b7..47a738479 100644 --- a/core/presentation/src/commonMain/composeResources/values-ar/strings-ar.xml +++ b/core/presentation/src/commonMain/composeResources/values-ar/strings-ar.xml @@ -83,6 +83,7 @@ الأكثر نجوماً الأكثر تفرعاً الأفضل تطابقاً + الأحدث إصداراً تنازلي تصاعدي diff --git a/core/presentation/src/commonMain/composeResources/values-bn/strings-bn.xml b/core/presentation/src/commonMain/composeResources/values-bn/strings-bn.xml index ed1c6967d..93f5966e7 100644 --- a/core/presentation/src/commonMain/composeResources/values-bn/strings-bn.xml +++ b/core/presentation/src/commonMain/composeResources/values-bn/strings-bn.xml @@ -83,6 +83,7 @@ সবচেয়ে বেশি স্টার সবচেয়ে বেশি ফর্ক সেরা মিল + সাম্প্রতিক রিলিজ অধোগামী ঊর্ধ্বগামী diff --git a/core/presentation/src/commonMain/composeResources/values-es/strings-es.xml b/core/presentation/src/commonMain/composeResources/values-es/strings-es.xml index ade41a8dd..afbf2e1f6 100644 --- a/core/presentation/src/commonMain/composeResources/values-es/strings-es.xml +++ b/core/presentation/src/commonMain/composeResources/values-es/strings-es.xml @@ -68,6 +68,7 @@ Más estrellas Más forks Mejor coincidencia + Lanzados recientemente Descendente Ascendente diff --git a/core/presentation/src/commonMain/composeResources/values-fr/strings-fr.xml b/core/presentation/src/commonMain/composeResources/values-fr/strings-fr.xml index 101983ebb..8136a47aa 100644 --- a/core/presentation/src/commonMain/composeResources/values-fr/strings-fr.xml +++ b/core/presentation/src/commonMain/composeResources/values-fr/strings-fr.xml @@ -68,6 +68,7 @@ Le plus d’étoiles Le plus de forks Meilleure correspondance + Récemment publiés Décroissant Croissant diff --git a/core/presentation/src/commonMain/composeResources/values-hi/strings-hi.xml b/core/presentation/src/commonMain/composeResources/values-hi/strings-hi.xml index 9a603bb66..b4e1468ec 100644 --- a/core/presentation/src/commonMain/composeResources/values-hi/strings-hi.xml +++ b/core/presentation/src/commonMain/composeResources/values-hi/strings-hi.xml @@ -83,6 +83,7 @@ सबसे अधिक स्टार सबसे अधिक फोर्क्स सबसे अच्छा मिलान + हाल ही में रिलीज़ अवरोही आरोही diff --git a/core/presentation/src/commonMain/composeResources/values-it/strings-it.xml b/core/presentation/src/commonMain/composeResources/values-it/strings-it.xml index 12c514f9e..22277c33f 100644 --- a/core/presentation/src/commonMain/composeResources/values-it/strings-it.xml +++ b/core/presentation/src/commonMain/composeResources/values-it/strings-it.xml @@ -83,6 +83,7 @@ Più Stelle Più Forks Miglior corrispondenza + Rilasciati di recente Decrescente Crescente diff --git a/core/presentation/src/commonMain/composeResources/values-ja/strings-ja.xml b/core/presentation/src/commonMain/composeResources/values-ja/strings-ja.xml index ebd9d2639..e380a27a5 100644 --- a/core/presentation/src/commonMain/composeResources/values-ja/strings-ja.xml +++ b/core/presentation/src/commonMain/composeResources/values-ja/strings-ja.xml @@ -68,6 +68,7 @@ スター数順 フォーク数順 最適な一致 + 最近リリース 降順 昇順 diff --git a/core/presentation/src/commonMain/composeResources/values-ko/strings-ko.xml b/core/presentation/src/commonMain/composeResources/values-ko/strings-ko.xml index ed622bddd..6d5dc4714 100644 --- a/core/presentation/src/commonMain/composeResources/values-ko/strings-ko.xml +++ b/core/presentation/src/commonMain/composeResources/values-ko/strings-ko.xml @@ -81,6 +81,7 @@ 별 많은 순 포크 많은 순 최적의 결과 + 최근 릴리스 내림차순 오름차순 diff --git a/core/presentation/src/commonMain/composeResources/values-pl/strings-pl.xml b/core/presentation/src/commonMain/composeResources/values-pl/strings-pl.xml index 9ba4636a0..cbf3e17a5 100644 --- a/core/presentation/src/commonMain/composeResources/values-pl/strings-pl.xml +++ b/core/presentation/src/commonMain/composeResources/values-pl/strings-pl.xml @@ -69,6 +69,7 @@ Najwięcej gwiazdek Najwięcej forków Najlepsze dopasowanie + Niedawno wydane Malejąco Rosnąco diff --git a/core/presentation/src/commonMain/composeResources/values-ru/strings-ru.xml b/core/presentation/src/commonMain/composeResources/values-ru/strings-ru.xml index d38ce0120..3b96792ac 100644 --- a/core/presentation/src/commonMain/composeResources/values-ru/strings-ru.xml +++ b/core/presentation/src/commonMain/composeResources/values-ru/strings-ru.xml @@ -68,6 +68,7 @@ Больше звёзд Больше форков Лучшее совпадение + Недавно выпущенные По убыванию По возрастанию diff --git a/core/presentation/src/commonMain/composeResources/values-tr/strings-tr.xml b/core/presentation/src/commonMain/composeResources/values-tr/strings-tr.xml index 3d4be6411..9953cfa4a 100644 --- a/core/presentation/src/commonMain/composeResources/values-tr/strings-tr.xml +++ b/core/presentation/src/commonMain/composeResources/values-tr/strings-tr.xml @@ -82,6 +82,7 @@ En Çok Yıldız En Çok Fork En İyi Eşleşme + Yeni Yayımlanmış Azalan Artan diff --git a/core/presentation/src/commonMain/composeResources/values-zh-rCN/strings-zh-rCN.xml b/core/presentation/src/commonMain/composeResources/values-zh-rCN/strings-zh-rCN.xml index 844253657..4d8909b0f 100644 --- a/core/presentation/src/commonMain/composeResources/values-zh-rCN/strings-zh-rCN.xml +++ b/core/presentation/src/commonMain/composeResources/values-zh-rCN/strings-zh-rCN.xml @@ -70,6 +70,7 @@ 最多星标 最多分叉 最佳匹配 + 最新发布 降序 升序 diff --git a/core/presentation/src/commonMain/composeResources/values/strings.xml b/core/presentation/src/commonMain/composeResources/values/strings.xml index 8ea0f864e..f2e92e1ff 100644 --- a/core/presentation/src/commonMain/composeResources/values/strings.xml +++ b/core/presentation/src/commonMain/composeResources/values/strings.xml @@ -86,6 +86,7 @@ Most Stars Most Forks Best Match + Recently Released Descending Ascending