diff --git a/app/src/main/java/com/emanuelef/remote_capture/Utils.java b/app/src/main/java/com/emanuelef/remote_capture/Utils.java
index 723a6bb8..edfe47dd 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/Utils.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/Utils.java
@@ -129,6 +129,16 @@ public class Utils {
return fmt.format(new Date(epoch * 1000));
}
+ public static void setAppLanguage(Context context, String language) {
+ Locale locale = new Locale(language);
+ Configuration config = new Configuration();
+
+ Locale.setDefault(locale);
+ config.locale = locale;
+ context.getResources().updateConfiguration(config,
+ context.getResources().getDisplayMetrics());
+ }
+
public static String proto2str(int proto) {
switch(proto) {
case 6: return "TCP";
diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/AboutActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/AboutActivity.java
index 7e4a0c0d..65b8c327 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/activities/AboutActivity.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/activities/AboutActivity.java
@@ -24,12 +24,10 @@ import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.widget.TextView;
-import androidx.appcompat.app.AppCompatActivity;
-
import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.Utils;
-public class AboutActivity extends AppCompatActivity {
+public class AboutActivity extends BaseActivity {
private static final String TAG = "AboutActivity";
@Override
diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/AppsActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/AppsActivity.java
index eeca385c..d160b77a 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/activities/AppsActivity.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/activities/AppsActivity.java
@@ -21,11 +21,9 @@ package com.emanuelef.remote_capture.activities;
import android.os.Bundle;
-import androidx.appcompat.app.AppCompatActivity;
-
import com.emanuelef.remote_capture.R;
-public class AppsActivity extends AppCompatActivity {
+public class AppsActivity extends BaseActivity {
private static final String TAG = "AppsActivity";
@Override
diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/BaseActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/BaseActivity.java
new file mode 100644
index 00000000..23586931
--- /dev/null
+++ b/app/src/main/java/com/emanuelef/remote_capture/activities/BaseActivity.java
@@ -0,0 +1,24 @@
+package com.emanuelef.remote_capture.activities;
+
+import android.content.SharedPreferences;
+import android.os.Bundle;
+
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.preference.PreferenceManager;
+
+import com.emanuelef.remote_capture.Utils;
+import com.emanuelef.remote_capture.model.Prefs;
+
+class BaseActivity extends AppCompatActivity {
+ protected SharedPreferences mPrefs;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
+
+ if(!Prefs.useSystemLanguage(mPrefs))
+ Utils.setAppLanguage(this, "en");
+ }
+}
diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java
index ef233c0e..6e88720c 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java
@@ -20,7 +20,6 @@
package com.emanuelef.remote_capture.activities;
import androidx.annotation.NonNull;
-import androidx.appcompat.app.AppCompatActivity;
import android.content.ClipData;
import android.content.ClipboardManager;
@@ -37,7 +36,7 @@ import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.Utils;
import com.emanuelef.remote_capture.model.ConnectionDescriptor;
-public class ConnectionDetailsActivity extends AppCompatActivity {
+public class ConnectionDetailsActivity extends BaseActivity {
private static final String TAG = "ConnectionDetails";
public static final String CONN_EXTRA_KEY = "conn_descriptor";
public static final String APP_NAME_EXTRA_KEY = "app_name";
diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/MainActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/MainActivity.java
index 337c55df..23088fb7 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/activities/MainActivity.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/activities/MainActivity.java
@@ -23,7 +23,6 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.net.VpnService;
@@ -31,14 +30,12 @@ import android.net.VpnService;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AlertDialog;
-import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
-import androidx.preference.PreferenceManager;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
@@ -68,8 +65,7 @@ import java.io.FileNotFoundException;
import cat.ereza.customactivityoncrash.config.CaocConfig;
-public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
- private SharedPreferences mPrefs;
+public class MainActivity extends BaseActivity implements NavigationView.OnNavigationItemSelectedListener {
private ViewPager2 mPager;
private TabLayout mTabLayout;
private AppState mState;
@@ -113,8 +109,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
setupTabs();
- mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
-
/* Register for service status */
mReceiver = new BroadcastReceiver() {
@Override
diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/SettingsActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/SettingsActivity.java
index c7307a40..b039e939 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/activities/SettingsActivity.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/activities/SettingsActivity.java
@@ -24,9 +24,7 @@ import android.text.InputType;
import android.util.Patterns;
import androidx.appcompat.app.ActionBar;
-import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.EditTextPreference;
-import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.SwitchPreference;
@@ -36,7 +34,7 @@ import com.emanuelef.remote_capture.R;
import java.util.regex.Matcher;
-public class SettingsActivity extends AppCompatActivity {
+public class SettingsActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/StatsActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/StatsActivity.java
index b8938767..4e026220 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/activities/StatsActivity.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/activities/StatsActivity.java
@@ -21,7 +21,6 @@ package com.emanuelef.remote_capture.activities;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
-import androidx.appcompat.app.AppCompatActivity;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import android.content.BroadcastReceiver;
@@ -43,7 +42,7 @@ import com.emanuelef.remote_capture.R;
import com.emanuelef.remote_capture.Utils;
import com.emanuelef.remote_capture.model.VPNStats;
-public class StatsActivity extends AppCompatActivity {
+public class StatsActivity extends BaseActivity {
private BroadcastReceiver mReceiver;
private TextView mBytesSent;
private TextView mBytesRcvd;
diff --git a/app/src/main/java/com/emanuelef/remote_capture/model/Prefs.java b/app/src/main/java/com/emanuelef/remote_capture/model/Prefs.java
index 438047e5..a99a3106 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/model/Prefs.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/model/Prefs.java
@@ -65,4 +65,5 @@ public class Prefs {
public static int getTlsProxyPort(SharedPreferences p) { return(Integer.parseInt(p.getString(Prefs.PREF_TLS_PROXY_PORT_KEY, "8080"))); }
public static String getAppFilter(SharedPreferences p) { return(p.getString(PREF_APP_FILTER, "")); }
public static boolean getIPv6Enabled(SharedPreferences p) { return(p.getBoolean(PREF_IPV6_ENABLED, false)); }
+ public static boolean useSystemLanguage(SharedPreferences p) { return("system".equals(p.getString("app_language", "system")));}
}
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
new file mode 100644
index 00000000..ff7cac9a
--- /dev/null
+++ b/app/src/main/res/values-it/strings.xml
@@ -0,0 +1,110 @@
+
+ Avvia
+ Ferma
+ Impostazioni
+ Nessun Filtro
+ Collettore UDP: %1$s:%2$d
+ Server HTTP: http://%1$s:%2$d
+ %1$s ricevuti — %2$s inviati
+ Query
+ Host
+ La cattura non è in esecuzione!
+ La cattura non è stata avviata!
+ Filtro App
+ Pronto
+ Informazioni
+ Stato
+ Connessioni
+ Nessuna connessione
+ Dettagli Connessione
+ App
+ Protocollo
+ Sorgente
+ Destinazione
+ Bytes
+ Pacchetti
+ Durata
+ Server HTTP
+ Esportatore UDP
+ Nessun Dump
+ Il PCAP non sarà dumpato
+ Avvia un server HTTP per il download del PCAP
+ Invia il PCAP a un collettore UDP remoto
+ Porta del Server HTTP
+ IP del Collettore
+ Porta del Collettore
+ Modalità di Dump
+ IP del mitmproxy
+ Porta del mitmproxy
+ Abilita Decrittazione TLS
+ Quando abilitata, tutto il traffico TLS sarà rediretto a un\'istanza mitmproxy remota per la decrittazione.
+ Decrittazione TLS
+ Guida Utente
+ Valuta
+ Gruppo Telegram
+ Codice Sorgente
+ SI
+ NO
+ L\'app di VPN attualmente in esecuzione verrà disconnessa. Vuoi procedere?
+ Setup della VPN fallito
+ L\'app "%1$s" non è stata trovata
+ Caricamento delle app in corso, attendere
+ Statistiche
+ Connessioni Attive
+ Connessioni Droppate
+ Connessioni Totali
+ Socket Aperti
+ FD Massimo
+ Bytes Inviati
+ Bytes Ricevuti
+ Pacchetti Inviati
+ Pacchetti Ricevuti
+ Query DNS
+ Cerca App
+ Nessuna app
+ Server DNS
+ App
+ Rimuovi il filtro app
+ Imposta il filtro app
+ Apri Drawer
+ Chiudi Drawer
+ File PCAP
+ Crea un file PCAP nella memoria del dispositivo
+ Impossibile scrivere il file PCAP
+ Impossibile scrivere il file
+ Condividi
+ Elimina
+ Ok
+ Traffico salvato nel file %1$s (%2$s).
+ Impossibile eliminare il file
+ Cattura in esecuzione
+ %1$s catturati, %2$s connessioni
+ Nessun filtro app impostato
+ %1$s, %2$d
+ Aperta
+ Inizio
+ Fine
+ Chiusa
+ Copia negli appunti
+ Copiato negli appunti!
+ IPProto,SrcIP,SrcPort,DstIp,DstPort,Uid,App,Proto,Status,Info,BytesSent,BytesRcvd,PktsSent,PktsRcvd,FirstSeen,LastSeen
+ Esporta in un file
+ File salvato correttamente
+ %1$d connessioni precedenti nascoste
+ PCAPdroid è un software libero per la cattura e il monitoraggio di rete che funziona senza privilegi di root.
+ PCAPdroid è distribuito nella speranza che sia utile, ma SENZA ALCUNA GARANZIA; senza neanche la garanzia implicita di COMMERCIABILITÀ o IDONEITÀ PER UNO SCOPO PARTICOLARE. Fare riferimento alla GNU General Public License per ulteriori dettagli.
+ Licenza GPLv3
+ Scaricala:
+ Come impostare la Decrittazione TLS
+ Sconosciuta
+ VPN
+ Abilita IPv6
+ Permetti connessioni internet IPv6. Da abilitare soltanto in reti con gateway IPv6.
+ Errore
+ Irraggiungibile
+ Altro
+ Lingua dell\'App
+ Inglese
+ Predefinita del sistema
+
+
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index a93d4fb2..faccf157 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -48,7 +48,6 @@
mitmproxy 端口
启用 TLS 解密
启用后,所有 TLS 通信都将被重定向到远程 mitmproxy 实例进行解密。
- 8080
TLS 解密
用户指南
评分
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index bb498353..fbd32ccc 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -20,4 +20,14 @@
- @string/pcap_file_info
- @string/udp_exporter_info
+
+
+ - system
+ - english
+
+
+
+ - @string/lang_system_default
+ - @string/lang_english
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 6c2eaa21..173650ba 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -48,7 +48,6 @@
mitmproxy Port
Enable TLS Decryption
When enabled, all the TLS traffic will be redirected to a remote mitmproxy instance for decryption.
- 8080
TLS Decryption
User Guide
Rate
@@ -113,5 +112,9 @@
Allow IPv6 internet connections. This should only be enabled on networks with an IPv6 gateway.
Error
Unreachable
+ Other
+ App Language
+ English
+ System default
diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml
index 038f0c7c..a07253aa 100644
--- a/app/src/main/res/xml/root_preferences.xml
+++ b/app/src/main/res/xml/root_preferences.xml
@@ -70,16 +70,25 @@
app:key="tls_proxy_port"
app:title="@string/tls_proxy_port"
app:iconSpaceReserved="false"
- app:defaultValue="@string/default_proxy_port"
+ app:defaultValue="8080"
app:useSimpleSummaryProvider="true" />
-
+
+
+