diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/AndroidHostInterface.java b/android/app/src/main/java/com/github/stenzek/duckstation/AndroidHostInterface.java
index b0713ba47..71057e3b9 100644
--- a/android/app/src/main/java/com/github/stenzek/duckstation/AndroidHostInterface.java
+++ b/android/app/src/main/java/com/github/stenzek/duckstation/AndroidHostInterface.java
@@ -9,6 +9,7 @@ import android.widget.Toast;
import java.io.IOException;
import java.io.InputStream;
+import java.util.Locale;
public class AndroidHostInterface {
public final static int DISPLAY_ALIGNMENT_TOP_OR_LEFT = 0;
diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/MainActivity.java b/android/app/src/main/java/com/github/stenzek/duckstation/MainActivity.java
index 536546dbc..c0af5169a 100644
--- a/android/app/src/main/java/com/github/stenzek/duckstation/MainActivity.java
+++ b/android/app/src/main/java/com/github/stenzek/duckstation/MainActivity.java
@@ -6,6 +6,8 @@ import android.content.ClipboardManager;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
+import android.content.res.Configuration;
+import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
@@ -30,6 +32,7 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
+import java.util.Locale;
import java.util.Set;
public class MainActivity extends AppCompatActivity {
@@ -42,6 +45,25 @@ public class MainActivity extends AppCompatActivity {
private ListView mGameListView;
private boolean mHasExternalStoragePermissions = false;
+ private void setLanguage() {
+ String language = PreferenceManager.getDefaultSharedPreferences(this).getString("Main/Language", "none");
+ if (language == null || language.equals("none")) {
+ return;
+ }
+
+ String[] parts = language.split("-");
+ if (parts.length < 2)
+ return;
+
+ Locale locale = new Locale(parts[0], parts[1]);
+ Locale.setDefault(locale);
+
+ Resources res = getResources();
+ Configuration config = res.getConfiguration();
+ config.setLocale(locale);
+ res.updateConfiguration(config, res.getDisplayMetrics());
+ }
+
private boolean shouldResumeStateByDefault() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
return prefs.getBoolean("Main/SaveStateOnExit", true);
@@ -59,6 +81,7 @@ public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ setLanguage();
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
diff --git a/android/app/src/main/res/values/arrays.xml b/android/app/src/main/res/values/arrays.xml
index 0f734ae9b..9da976715 100644
--- a/android/app/src/main/res/values/arrays.xml
+++ b/android/app/src/main/res/values/arrays.xml
@@ -421,4 +421,16 @@
- portrait
- landscape
+
+ - Use Device Setting
+ - English
+ - Portuguese (pt) in Brazil (BR)
+ - Italian (it)
+
+
+ - none
+ - en-EN
+ - pt-rBR
+ - it-IT
+
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index d432de9c3..a236e4d4a 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -151,4 +151,5 @@
Copy
Threaded GPU Rendering
Uses a second thread for drawing graphics. Currently only available for the software renderer, but can provide a significant speed improvement, and is safe to use.
+ Language (restart to apply)
diff --git a/android/app/src/main/res/xml/advanced_preferences.xml b/android/app/src/main/res/xml/advanced_preferences.xml
index 91411d2a3..034b2b425 100644
--- a/android/app/src/main/res/xml/advanced_preferences.xml
+++ b/android/app/src/main/res/xml/advanced_preferences.xml
@@ -15,6 +15,14 @@
-->
+