diff --git a/briar-android/src/main/java/org/briarproject/briar/android/BriarApplicationImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/BriarApplicationImpl.java index 58b8b05b5..927827913 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/BriarApplicationImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/BriarApplicationImpl.java @@ -51,6 +51,7 @@ public class BriarApplicationImpl extends Application Localizer.initialize(prefs); super.attachBaseContext( Localizer.getInstance().setLocale(base)); + Localizer.getInstance().setLocale(this); setTheme(base, prefs); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java b/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java index a4f4d0b0e..3e2098d71 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java @@ -170,6 +170,7 @@ public class BriarService extends Service { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(Localizer.getInstance().setLocale(base)); + Localizer.getInstance().setLocale(this); } private void showStartupFailureNotification(StartResult result) { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/Localizer.java b/briar-android/src/main/java/org/briarproject/briar/android/Localizer.java index 2b51659bb..5e99eba79 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/Localizer.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/Localizer.java @@ -68,7 +68,21 @@ public class Localizer { return new Locale(tag); } - // Returns the localized version of context + /* + * Apply localization to the specified context. + * + * It updates the configuration of the context's resources object but can + * also return a new context derived from the context parameter. Hence + * make sure to work with the return value of this method instead of + * the context you passed as a parameter. + * + * This method also has side-effects as it calls Locale#setDefault(). + * + * When using this in attachBaseContext() of Application, Service or + * Activity subclasses, it is important to not only apply this method to the + * base Context parameter received in that method, but also apply it on the + * class itself which also extends Context. + */ public Context setLocale(Context context) { Resources res = context.getResources(); Configuration conf = res.getConfiguration(); @@ -82,7 +96,7 @@ public class Localizer { Locale.setDefault(locale); if (SDK_INT >= 17) { conf.setLocale(locale); - context.createConfigurationContext(conf); + context = context.createConfigurationContext(conf); } else conf.locale = locale; //noinspection deprecation diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/BaseActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/BaseActivity.java index 08f196e18..4f7b0fbde 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/activity/BaseActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/BaseActivity.java @@ -109,6 +109,7 @@ public abstract class BaseActivity extends AppCompatActivity protected void attachBaseContext(Context base) { super.attachBaseContext( Localizer.getInstance().setLocale(base)); + Localizer.getInstance().setLocale(this); } public ActivityComponent getActivityComponent() { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/splash/ExpiredActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/splash/ExpiredActivity.java index 7db01bf85..3f8828ce5 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/splash/ExpiredActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/splash/ExpiredActivity.java @@ -1,5 +1,6 @@ package org.briarproject.briar.android.splash; +import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -7,6 +8,7 @@ import android.view.View; import android.view.View.OnClickListener; import org.briarproject.briar.R; +import org.briarproject.briar.android.Localizer; import androidx.appcompat.app.AppCompatActivity; @@ -27,6 +29,13 @@ public class ExpiredActivity extends AppCompatActivity findViewById(R.id.download_briar_button).setOnClickListener(this); } + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext( + Localizer.getInstance().setLocale(base)); + Localizer.getInstance().setLocale(this); + } + @Override public void onClick(View v) { Uri uri = Uri.parse("https://briarproject.org/download.html");