From d6ffb6e5cc4c7eee61816d30349abe158fee389c Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Tue, 25 Aug 2026 20:00:53 -0400 Subject: [PATCH 1/2] Send the device language on WordPress.com requests Changes: - Add `DeviceWpComLanguageProvider`, mapping the device locale to a `WpComLanguage` via `fromLocale` on every request - Pass it to `WpComApiClient` in `WpComApiClientProvider` - Add `TrackNetworkRequestsInterceptor` to that client's `OkHttpClient`, so its requests appear in Chucker when network tracking is enabled - Point `wordpress-rs` at the `1590-af9a28ec` CI build --- .../restapi/DeviceWpComLanguageProvider.kt | 22 +++++++++++++++++++ .../restapi/WpComApiClientProvider.kt | 7 +++++- gradle/libs.versions.toml | 2 +- 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 WordPress/src/main/java/org/wordpress/android/networking/restapi/DeviceWpComLanguageProvider.kt diff --git a/WordPress/src/main/java/org/wordpress/android/networking/restapi/DeviceWpComLanguageProvider.kt b/WordPress/src/main/java/org/wordpress/android/networking/restapi/DeviceWpComLanguageProvider.kt new file mode 100644 index 000000000000..8cfde5536841 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/networking/restapi/DeviceWpComLanguageProvider.kt @@ -0,0 +1,22 @@ +package org.wordpress.android.networking.restapi + +import org.wordpress.android.util.LocaleManagerWrapper +import rs.wordpress.api.kotlin.fromLocale +import uniffi.wp_api.WpComLanguage +import uniffi.wp_api.WpComLanguageProvider +import javax.inject.Inject + +/** + * Reports the device language that WordPress.com should localize its responses to. + * + * The locale is read on every request rather than captured once, so a language + * change part-way through a session is picked up without rebuilding the client. + * Returns `null` when the device language has no WordPress.com equivalent, which + * sends no locale and leaves the choice to the server. + */ +class DeviceWpComLanguageProvider @Inject constructor( + private val localeManagerWrapper: LocaleManagerWrapper +) : WpComLanguageProvider { + override fun currentLanguage(): WpComLanguage? = + WpComLanguage.fromLocale(localeManagerWrapper.getLocale()) +} diff --git a/WordPress/src/main/java/org/wordpress/android/networking/restapi/WpComApiClientProvider.kt b/WordPress/src/main/java/org/wordpress/android/networking/restapi/WpComApiClientProvider.kt index 39d2c70b2921..65a06bd014fb 100644 --- a/WordPress/src/main/java/org/wordpress/android/networking/restapi/WpComApiClientProvider.kt +++ b/WordPress/src/main/java/org/wordpress/android/networking/restapi/WpComApiClientProvider.kt @@ -1,6 +1,7 @@ package org.wordpress.android.networking.restapi import okhttp3.OkHttpClient +import org.wordpress.android.fluxc.network.TrackNetworkRequestsInterceptor import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpNetworkAvailabilityProvider import org.wordpress.android.fluxc.network.rest.wpapi.rs.applyWpRsTimeouts import rs.wordpress.api.kotlin.WpComApiClient @@ -12,10 +13,13 @@ import javax.inject.Inject class WpComApiClientProvider @Inject constructor( private val networkAvailabilityProvider: WpNetworkAvailabilityProvider, + private val languageProvider: DeviceWpComLanguageProvider, + private val trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor, ) { fun getWpComApiClient(accessToken: String): WpComApiClient { val okHttpClient = OkHttpClient.Builder() .applyWpRsTimeouts() + .addInterceptor(trackNetworkRequestsInterceptor) .build() return WpComApiClient( @@ -24,7 +28,8 @@ class WpComApiClientProvider @Inject constructor( networkAvailabilityProvider = networkAvailabilityProvider ), authProvider = WpAuthenticationProvider.staticWithAuth(WpAuthentication.Bearer(token = accessToken) - ) + ), + languageProvider = languageProvider ) } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0f8f2054e36e..ac9cd0220fe7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -101,7 +101,7 @@ wellsql = '2.0.0' wordpress-aztec = 'v2.1.4' wordpress-lint = '2.2.0' wordpress-persistent-edittext = '1.0.2' -wordpress-rs = '0.7.0' +wordpress-rs = '1590-af9a28ec86d13203855db032d85e608b00b645c0' wordpress-utils = '3.14.0' automattic-ucrop = '2.2.11' zendesk = '5.5.3' From 6fb9ae5c22d6eb2d6d62b10189e1d1f2471a6a36 Mon Sep 17 00:00:00 2001 From: Oguz Kocer Date: Tue, 25 Aug 2026 20:23:16 -0400 Subject: [PATCH 2/2] Read the app language rather than the device language `AppCompatDelegate.getApplicationLocales()` holds the language the user picked inside the app. `Locale.getDefault()` only reflects it once the framework has propagated the change to the process, so a request made before that lands, or from a background service, reads the OS language. Changes: - Read the locale from `PerAppLocaleManager.getCurrentLocale()`, which falls back to `Locale.getDefault()` when no app language is set - Rename `DeviceWpComLanguageProvider` to `AppWpComLanguageProvider` --- .../restapi/AppWpComLanguageProvider.kt | 23 +++++++++++++++++++ .../restapi/DeviceWpComLanguageProvider.kt | 22 ------------------ .../restapi/WpComApiClientProvider.kt | 2 +- 3 files changed, 24 insertions(+), 23 deletions(-) create mode 100644 WordPress/src/main/java/org/wordpress/android/networking/restapi/AppWpComLanguageProvider.kt delete mode 100644 WordPress/src/main/java/org/wordpress/android/networking/restapi/DeviceWpComLanguageProvider.kt diff --git a/WordPress/src/main/java/org/wordpress/android/networking/restapi/AppWpComLanguageProvider.kt b/WordPress/src/main/java/org/wordpress/android/networking/restapi/AppWpComLanguageProvider.kt new file mode 100644 index 000000000000..e66d0a12c931 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/networking/restapi/AppWpComLanguageProvider.kt @@ -0,0 +1,23 @@ +package org.wordpress.android.networking.restapi + +import org.wordpress.android.util.PerAppLocaleManager +import rs.wordpress.api.kotlin.fromLocale +import uniffi.wp_api.WpComLanguage +import uniffi.wp_api.WpComLanguageProvider +import javax.inject.Inject + +/** + * Reports the language that WordPress.com should localize its responses to. + * + * Reads the app's own language preference, falling back to the device language when + * the user hasn't chosen one. The locale is read on every request, so a language + * change part-way through a session takes effect without rebuilding the client. + * Returns `null` when the language has no WordPress.com equivalent, which sends no + * locale and leaves the choice to the server. + */ +class AppWpComLanguageProvider @Inject constructor( + private val perAppLocaleManager: PerAppLocaleManager +) : WpComLanguageProvider { + override fun currentLanguage(): WpComLanguage? = + WpComLanguage.fromLocale(perAppLocaleManager.getCurrentLocale()) +} diff --git a/WordPress/src/main/java/org/wordpress/android/networking/restapi/DeviceWpComLanguageProvider.kt b/WordPress/src/main/java/org/wordpress/android/networking/restapi/DeviceWpComLanguageProvider.kt deleted file mode 100644 index 8cfde5536841..000000000000 --- a/WordPress/src/main/java/org/wordpress/android/networking/restapi/DeviceWpComLanguageProvider.kt +++ /dev/null @@ -1,22 +0,0 @@ -package org.wordpress.android.networking.restapi - -import org.wordpress.android.util.LocaleManagerWrapper -import rs.wordpress.api.kotlin.fromLocale -import uniffi.wp_api.WpComLanguage -import uniffi.wp_api.WpComLanguageProvider -import javax.inject.Inject - -/** - * Reports the device language that WordPress.com should localize its responses to. - * - * The locale is read on every request rather than captured once, so a language - * change part-way through a session is picked up without rebuilding the client. - * Returns `null` when the device language has no WordPress.com equivalent, which - * sends no locale and leaves the choice to the server. - */ -class DeviceWpComLanguageProvider @Inject constructor( - private val localeManagerWrapper: LocaleManagerWrapper -) : WpComLanguageProvider { - override fun currentLanguage(): WpComLanguage? = - WpComLanguage.fromLocale(localeManagerWrapper.getLocale()) -} diff --git a/WordPress/src/main/java/org/wordpress/android/networking/restapi/WpComApiClientProvider.kt b/WordPress/src/main/java/org/wordpress/android/networking/restapi/WpComApiClientProvider.kt index 65a06bd014fb..9b60b07b7657 100644 --- a/WordPress/src/main/java/org/wordpress/android/networking/restapi/WpComApiClientProvider.kt +++ b/WordPress/src/main/java/org/wordpress/android/networking/restapi/WpComApiClientProvider.kt @@ -13,7 +13,7 @@ import javax.inject.Inject class WpComApiClientProvider @Inject constructor( private val networkAvailabilityProvider: WpNetworkAvailabilityProvider, - private val languageProvider: DeviceWpComLanguageProvider, + private val languageProvider: AppWpComLanguageProvider, private val trackNetworkRequestsInterceptor: TrackNetworkRequestsInterceptor, ) { fun getWpComApiClient(accessToken: String): WpComApiClient {