Add initial language switch support

Also add italian translation
This commit is contained in:
emanuele-f 2021-03-23 19:26:15 +01:00
parent 7430687d8c
commit 6ae5f3fd04
14 changed files with 176 additions and 24 deletions

View File

@ -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";

View File

@ -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

View File

@ -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

View File

@ -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");
}
}

View File

@ -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";

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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")));}
}

View File

@ -0,0 +1,110 @@
<resources>
<string name="start_button">Avvia</string>
<string name="stop_button">Ferma</string>
<string name="title_activity_settings">Impostazioni</string>
<string name="no_filter">Nessun Filtro</string>
<string name="collector_info">Collettore UDP: %1$s:%2$d</string>
<string name="http_server_status">Server HTTP: http://%1$s:%2$d</string>
<string name="up_and_down">%1$s ricevuti — %2$s inviati</string>
<string name="query">Query</string>
<string name="host">Host</string>
<string name="capture_not_running">La cattura non è in esecuzione!</string>
<string name="capture_not_started">La cattura non è stata avviata!</string>
<string name="app_filter">Filtro App</string>
<string name="ready">Pronto</string>
<string name="about">Informazioni</string>
<string name="status">Stato</string>
<string name="connections_view">Connessioni</string>
<string name="no_connections">Nessuna connessione</string>
<string name="connection_details">Dettagli Connessione</string>
<string name="app">App</string>
<string name="protocol">Protocollo</string>
<string name="source">Sorgente</string>
<string name="destination">Destinazione</string>
<string name="bytes">Bytes</string>
<string name="packets">Pacchetti</string>
<string name="duration">Durata</string>
<string name="http_server">Server HTTP</string>
<string name="udp_exporter">Esportatore UDP</string>
<string name="no_dump">Nessun Dump</string>
<string name="no_dump_info">Il PCAP non sarà dumpato</string>
<string name="http_server_info">Avvia un server HTTP per il download del PCAP</string>
<string name="udp_exporter_info">Invia il PCAP a un collettore UDP remoto</string>
<string name="http_server_port">Porta del Server HTTP</string>
<string name="receiver_ip_address">IP del Collettore</string>
<string name="receiver_port">Porta del Collettore</string>
<string name="dump_mode">Modalità di Dump</string>
<string name="tls_proxy_ip_address">IP del mitmproxy</string>
<string name="tls_proxy_port">Porta del mitmproxy</string>
<string name="enable_tls_decryption">Abilita Decrittazione TLS</string>
<string name="enable_tls_decryption_summary">Quando abilitata, tutto il traffico TLS sarà rediretto a un\'istanza mitmproxy remota per la decrittazione.</string>
<string name="tls_decryption">Decrittazione TLS</string>
<string name="user_guide">Guida Utente</string>
<string name="rate_app">Valuta</string>
<string name="open_telegram_group">Gruppo Telegram</string>
<string name="source_code">Codice Sorgente</string>
<string name="yes">SI</string>
<string name="no">NO</string>
<string name="existing_vpn_confirm">L\'app di VPN attualmente in esecuzione verrà disconnessa. Vuoi procedere?</string>
<string name="vpn_setup_failed">Setup della VPN fallito</string>
<string name="app_not_found">L\'app "%1$s" non è stata trovata</string>
<string name="apps_loading_please_wait">Caricamento delle app in corso, attendere</string>
<string name="stats">Statistiche</string>
<string name="active_connections">Connessioni Attive</string>
<string name="dropped_connections">Connessioni Droppate</string>
<string name="tot_connections">Connessioni Totali</string>
<string name="open_sockets">Socket Aperti</string>
<string name="max_file_descriptor">FD Massimo</string>
<string name="bytes_sent">Bytes Inviati</string>
<string name="bytes_rcvd">Bytes Ricevuti</string>
<string name="packets_sent">Pacchetti Inviati</string>
<string name="packets_rcvd">Pacchetti Ricevuti</string>
<string name="dns_queries">Query DNS</string>
<string name="search_apps">Cerca App</string>
<string name="no_apps">Nessuna app</string>
<string name="dns_server">Server DNS</string>
<string name="apps">App</string>
<string name="remove_app_filter">Rimuovi il filtro app</string>
<string name="set_app_filter">Imposta il filtro app</string>
<string name="navigation_drawer_open">Apri Drawer</string>
<string name="navigation_drawer_close">Chiudi Drawer</string>
<string name="pcap_file">File PCAP</string>
<string name="pcap_file_info">Crea un file PCAP nella memoria del dispositivo</string>
<string name="cannot_write_pcap_file">Impossibile scrivere il file PCAP</string>
<string name="cannot_write_file">Impossibile scrivere il file</string>
<string name="share">Condividi</string>
<string name="delete">Elimina</string>
<string name="ok">Ok</string>
<string name="pcap_file_action">Traffico salvato nel file %1$s (%2$s).</string>
<string name="delete_error">Impossibile eliminare il file</string>
<string name="capture_running">Cattura in esecuzione</string>
<string name="notification_msg">%1$s catturati, %2$s connessioni</string>
<string name="no_app_filter">Nessun filtro app impostato</string>
<string name="proto_and_port">%1$s, %2$d</string>
<string name="conn_status_open">Aperta</string>
<string name="first_seen">Inizio</string>
<string name="last_seen">Fine</string>
<string name="conn_status_closed">Chiusa</string>
<string name="copy_to_clipboard">Copia negli appunti</string>
<string name="copied_to_clipboard">Copiato negli appunti!</string>
<string name="connections_csv_fields_v1">IPProto,SrcIP,SrcPort,DstIp,DstPort,Uid,App,Proto,Status,Info,BytesSent,BytesRcvd,PktsSent,PktsRcvd,FirstSeen,LastSeen</string>
<string name="save_to_file">Esporta in un file</string>
<string name="file_saved">File salvato correttamente</string>
<string name="older_connections_notice">%1$d connessioni precedenti nascoste</string>
<string name="about_text">PCAPdroid è un software libero per la cattura e il monitoraggio di rete che funziona senza privilegi di root.</string>
<string name="app_no_warranty">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.</string>
<string name="gpl_license_link">Licenza GPLv3</string>
<string name="get_app">Scaricala:</string>
<string name="tls_how_to">Come impostare la Decrittazione TLS</string>
<string name="unknown_app">Sconosciuta</string>
<string name="vpn_prefs">VPN</string>
<string name="enable_ipv6">Abilita IPv6</string>
<string name="enable_ipv6_summary">Permetti connessioni internet IPv6. Da abilitare soltanto in reti con gateway IPv6.</string>
<string name="error">Errore</string>
<string name="conn_status_unreachable">Irraggiungibile</string>
<string name="other_prefs">Altro</string>
<string name="app_language">Lingua dell\'App</string>
<string name="lang_english">Inglese</string>
<string name="lang_system_default">Predefinita del sistema</string>
</resources>

View File

@ -48,7 +48,6 @@
<string name="tls_proxy_port">mitmproxy 端口</string>
<string name="enable_tls_decryption">启用 TLS 解密</string>
<string name="enable_tls_decryption_summary">启用后,所有 TLS 通信都将被重定向到远程 mitmproxy 实例进行解密。</string>
<string name="default_proxy_port">8080</string>
<string name="tls_decryption">TLS 解密</string>
<string name="user_guide">用户指南</string>
<string name="rate_app">评分</string>

View File

@ -20,4 +20,14 @@
<item>@string/pcap_file_info</item>
<item>@string/udp_exporter_info</item>
</string-array>
<string-array name="app_languages">
<item>system</item>
<item>english</item>
</string-array>
<string-array name="app_languages_labels">
<item>@string/lang_system_default</item>
<item>@string/lang_english</item>
</string-array>
</resources>

View File

@ -48,7 +48,6 @@
<string name="tls_proxy_port">mitmproxy Port</string>
<string name="enable_tls_decryption">Enable TLS Decryption</string>
<string name="enable_tls_decryption_summary">When enabled, all the TLS traffic will be redirected to a remote mitmproxy instance for decryption.</string>
<string name="default_proxy_port">8080</string>
<string name="tls_decryption">TLS Decryption</string>
<string name="user_guide">User Guide</string>
<string name="rate_app">Rate</string>
@ -113,5 +112,9 @@
<string name="enable_ipv6_summary">Allow IPv6 internet connections. This should only be enabled on networks with an IPv6 gateway.</string>
<string name="error">Error</string>
<string name="conn_status_unreachable">Unreachable</string>
<string name="other_prefs">Other</string>
<string name="app_language">App Language</string>
<string name="lang_english">English</string>
<string name="lang_system_default">System default</string>
</resources>

View File

@ -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" />
</PreferenceCategory>
<PreferenceCategory app:title="@string/vpn_prefs" app:iconSpaceReserved="false">
<PreferenceCategory app:title="@string/other_prefs" app:iconSpaceReserved="false">
<SwitchPreference
app:key="ipv6_enabled"
app:title="@string/enable_ipv6"
app:iconSpaceReserved="false"
app:summary="@string/enable_ipv6_summary"
app:defaultValue="false" />
<DropDownPreference
app:key="app_language"
app:title="@string/app_language"
android:entries="@array/app_languages_labels"
android:entryValues="@array/app_languages"
app:iconSpaceReserved="false"
app:defaultValue="system"
app:useSimpleSummaryProvider="true"/>
</PreferenceCategory>
</PreferenceScreen>