From 0f450e65af956123898e81bad6116a8f6a055e3e Mon Sep 17 00:00:00 2001 From: Jakub Grzywacz <kontakt@jakubgrzywacz.pl> Date: Mon, 11 Nov 2024 18:21:21 +0100 Subject: [PATCH 1/3] feat: introduce setDefaultLanguage --- src/NativeLocalizationSettings.ts | 1 + src/api.ts | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/src/NativeLocalizationSettings.ts b/src/NativeLocalizationSettings.ts index fff6ecb..5230edf 100644 --- a/src/NativeLocalizationSettings.ts +++ b/src/NativeLocalizationSettings.ts @@ -4,6 +4,7 @@ import { TurboModuleRegistry } from 'react-native'; export interface Spec extends TurboModule { getLanguage(): Promise<string>; setLanguage(lang: string): void; + setDefaultLanguage(): void; getConstants(): { language: string; }; diff --git a/src/api.ts b/src/api.ts index 67d5509..40991c6 100644 --- a/src/api.ts +++ b/src/api.ts @@ -72,3 +72,13 @@ export function getLanguageAsync(fallback?: string): Promise<string> { export function setLanguage(language: string): void { LocalizationSettings.setLanguage(language); } + +/** + * Set default language (unset previously set language) + * @example + * Usage: + * setDefaultLanguage() + */ +export function setDefaultLanguage(): void { + LocalizationSettings.setDefaultLanguage(); +} From 9937df9c4becd77d2f88bee4f9365d83ac93b000 Mon Sep 17 00:00:00 2001 From: Jakub Grzywacz <kontakt@jakubgrzywacz.pl> Date: Mon, 11 Nov 2024 18:21:46 +0100 Subject: [PATCH 2/3] feat: implement setDefaultLanguage on Android --- .../LocalizationSettingsModule.kt | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/android/src/main/java/com/localizationsettings/LocalizationSettingsModule.kt b/android/src/main/java/com/localizationsettings/LocalizationSettingsModule.kt index 67fffcf..6f83aee 100644 --- a/android/src/main/java/com/localizationsettings/LocalizationSettingsModule.kt +++ b/android/src/main/java/com/localizationsettings/LocalizationSettingsModule.kt @@ -41,14 +41,13 @@ class LocalizationSettingsModule internal constructor(context: ReactApplicationC private fun getCurrentLanguage(): String? { // If API version is >= 33, then use per-app language settings if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - val currentLocaleName = if (!AppCompatDelegate.getApplicationLocales().isEmpty) { + if (!AppCompatDelegate.getApplicationLocales().isEmpty) { // get per-app language - AppCompatDelegate.getApplicationLocales()[0]?.toLanguageTag() + return AppCompatDelegate.getApplicationLocales()[0]?.toLanguageTag() } else { // Fallback to the default System Locale - Locale.getDefault().toLanguageTag() + return Locale.getDefault().toLanguageTag() } - return currentLocaleName } // if API is < 33, then use SharedPreferences with fallback to default System Locale if (getPreferences().getString("languageFrom", null) == Locale.getDefault().language) { @@ -79,6 +78,27 @@ class LocalizationSettingsModule internal constructor(context: ReactApplicationC } } + /** + * Set default language + * If API version >= 33, use native per-app language feature + * else, fallback to SharedPreferences + **/ + private fun unsetLanguage() { + // use per-app language settings + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + val defaultLocales = LocaleListCompat.getEmptyLocaleList() + AppCompatDelegate.setApplicationLocales(defaultLocales) + val test = Locale.getDefault() + val test2 = Locale.getDefault() + } else { + // use SharedPreferences language + val editor = getEditor(); + editor.putString("languageFrom", Locale.getDefault().language) + editor.putString("language", Locale.getDefault().language) + editor.apply() + } + } + /** * Expose functions to react-native @@ -93,6 +113,11 @@ class LocalizationSettingsModule internal constructor(context: ReactApplicationC setCurrentLanguage(language) } + @ReactMethod + override fun setDefaultLanguage() { + unsetLanguage() + } + /** * Expose constants to react-native **/ From 362ea44cf7a6fda8bcb956d51652b3793e579ca7 Mon Sep 17 00:00:00 2001 From: Jakub Grzywacz <kontakt@jakubgrzywacz.pl> Date: Mon, 11 Nov 2024 18:22:12 +0100 Subject: [PATCH 3/3] docs: add to example app --- example/App.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/example/App.tsx b/example/App.tsx index 55b79a0..3afca03 100644 --- a/example/App.tsx +++ b/example/App.tsx @@ -6,6 +6,7 @@ import { createLanguageDetector, getLanguage, getLanguageAsync, + setDefaultLanguage, } from 'react-native-localization-settings'; const languageDetector = createLanguageDetector(); @@ -53,6 +54,7 @@ export default function App() { <Button title={'change to pl'} onPress={changeLanguage('pl-PL')} /> <Button title={'change to en'} onPress={changeLanguage('en-US')} /> <Button title={'change to fr'} onPress={changeLanguage('fr-FR')} /> + <Button title={'unset'} onPress={setDefaultLanguage} /> <Button title={'get language sync'} onPress={() => console.log(getLanguage())}