Add the German string translations, credit Petra Mirelli

https://gitlab.com/divested-mobile/hypatia/-/issues/1
This commit is contained in:
Tad 2021-02-02 09:00:44 -05:00
parent 415ff8d25e
commit a85f812d04
14 changed files with 150 additions and 24 deletions

Binary file not shown.

6
.idea/compiler.xml generated Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="1.8" />
</component>
</project>

12
.idea/gradle.xml generated
View file

@ -1,14 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings"> <component name="GradleSettings">
<option name="linkedExternalProjectsSettings"> <option name="linkedExternalProjectsSettings">
<GradleProjectSettings> <GradleProjectSettings>
<compositeConfiguration> <option name="testRunner" value="PLATFORM" />
<compositeBuild compositeDefinitionSource="SCRIPT" />
</compositeConfiguration>
<option name="distributionType" value="DEFAULT_WRAPPED" /> <option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" /> <option name="resolveModulePerSourceSet" value="false" />
<option name="useQualifiedModuleNames" value="true" />
</GradleProjectSettings> </GradleProjectSettings>
</option> </option>
</component> </component>

25
.idea/jarRepositories.xml generated Normal file
View file

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="BintrayJCenter" />
<option name="name" value="BintrayJCenter" />
<option name="url" value="https://jcenter.bintray.com/" />
</remote-repository>
<remote-repository>
<option name="id" value="Google" />
<option name="name" value="Google" />
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
</remote-repository>
</component>
</project>

2
.idea/misc.xml generated
View file

@ -5,7 +5,7 @@
<configuration PROFILE_NAME="Debug" CONFIG_NAME="Debug" /> <configuration PROFILE_NAME="Debug" CONFIG_NAME="Debug" />
</configurations> </configurations>
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="JDK" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="JDK" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">

2
.idea/modules.xml generated
View file

@ -3,7 +3,7 @@
<component name="ProjectModuleManager"> <component name="ProjectModuleManager">
<modules> <modules>
<module fileurl="file://$PROJECT_DIR$/Veritas.iml" filepath="$PROJECT_DIR$/Veritas.iml" /> <module fileurl="file://$PROJECT_DIR$/Veritas.iml" filepath="$PROJECT_DIR$/Veritas.iml" />
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" /> <module fileurl="file://$PROJECT_DIR$/.idea/modules/app/Veritas.app.iml" filepath="$PROJECT_DIR$/.idea/modules/app/Veritas.app.iml" />
</modules> </modules>
</component> </component>
</project> </project>

View file

@ -6,7 +6,7 @@ android {
applicationId "us.spotco.malwarescanner" applicationId "us.spotco.malwarescanner"
minSdkVersion 16 minSdkVersion 16
targetSdkVersion 26 targetSdkVersion 26
versionCode 41 versionCode 42
versionName "3.0" versionName "3.0"
resConfigs "en" resConfigs "en"
vectorDrawables.useSupportLibrary = true vectorDrawables.useSupportLibrary = true

View file

@ -13,7 +13,6 @@
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
android:largeHeap="true" android:largeHeap="true"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/AppTheme" android:theme="@style/AppTheme"

View file

@ -29,7 +29,7 @@ public class DownloaderTask extends AsyncTask<Object, String, String> {
protected String doInBackground(Object... objects) { protected String doInBackground(Object... objects) {
String url = (String) objects[0]; String url = (String) objects[0];
File out = new File((String) objects[1]); File out = new File((String) objects[1]);
publishProgress("Downloading " + url); publishProgress(Utils.getContext().getString(R.string.main_database_downloading, url));
try { try {
HttpURLConnection connection = Utils.getConnection(url); HttpURLConnection connection = Utils.getConnection(url);
if (out.exists()) { if (out.exists()) {
@ -51,18 +51,18 @@ public class DownloaderTask extends AsyncTask<Object, String, String> {
} }
fileOutputStream.close(); fileOutputStream.close();
publishProgress("Successfully downloaded\n"); publishProgress(Utils.getContext().getString(R.string.main_database_download_success) + "\n");
} else { } else {
publishProgress("File not downloaded, response code " + res + "\n"); publishProgress(Utils.getContext().getString(R.string.main_database_download_error, res + "") + "\n");
} }
} else { } else {
publishProgress("File not changed\n"); publishProgress(Utils.getContext().getString(R.string.main_database_not_changed) + "\n");
} }
connection.disconnect(); connection.disconnect();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
out.delete(); out.delete();
publishProgress("Failed to download, check logcat\n"); publishProgress(Utils.getContext().getString(R.string.main_database_download_error_logcat) + "\n");
} }
return null; return null;
} }

View file

@ -52,7 +52,7 @@ class MalwareScanner extends AsyncTask<Set<File>, Object, String> {
@Override @Override
protected final void onPreExecute() { protected final void onPreExecute() {
scanTime = SystemClock.elapsedRealtime(); scanTime = SystemClock.elapsedRealtime();
returnResult("Starting scan...", true); returnResult(Utils.getContext().getString(R.string.main_starting_scan), true);
} }
@Override @Override
@ -62,18 +62,18 @@ class MalwareScanner extends AsyncTask<Set<File>, Object, String> {
fileHashesSHA1.clear(); fileHashesSHA1.clear();
fileHashesSHA256.clear(); fileHashesSHA256.clear();
publishProgress(filesToScan[0].size() + " files pending scan\n", true); publishProgress( Utils.getContext().getString(R.string.main_files_pending_scan, filesToScan[0].size() + "") + "\n", true);
DatabaseManager.loadAllAvailableDatabases(false); DatabaseManager.loadAllAvailableDatabases(false);
if (Signatures.getSignatureCount() >= 0) { if (Signatures.getSignatureCount() >= 0) {
publishProgress("Loaded database with " + Signatures.getSignatureCount() + " signatures\n", true); publishProgress(Utils.getContext().getString(R.string.main_database_loaded, Signatures.getSignatureCount() + "") + "\n", true);
//Get file hashes //Get file hashes
publishProgress("Hashing files...", true); publishProgress(Utils.getContext().getString(R.string.main_hashing_files), true);
for (File file : filesToScan[0]) { for (File file : filesToScan[0]) {
getFileHashes(file); getFileHashes(file);
} }
publishProgress("Calculated MD5/SHA-1/SHA-256 hashes for all files\n", true); publishProgress(Utils.getContext().getString(R.string.main_hash_scan_done) + "\n", true);
//Check the hashes //Check the hashes
checkSignature("MD5", fileHashesMD5, Signatures.MD5); checkSignature("MD5", fileHashesMD5, Signatures.MD5);
@ -86,9 +86,9 @@ class MalwareScanner extends AsyncTask<Set<File>, Object, String> {
fileHashesSHA256.clear(); fileHashesSHA256.clear();
System.gc(); System.gc();
Utils.amtFilesScanned += filesToScan[0].size(); Utils.amtFilesScanned += filesToScan[0].size();
publishProgress("Scan completed in " + ((SystemClock.elapsedRealtime() - scanTime) / 1000) + " seconds!\n\n\n\n", true); publishProgress(Utils.getContext().getString(R.string.main_scanning_done, ((SystemClock.elapsedRealtime() - scanTime) / 1000) + "") + "\n\n\n\n", true);
} else { } else {
publishProgress("No database available, not scanning...", true); publishProgress(Utils.getContext().getString(R.string.main_no_database_available), true);
} }
return null; return null;
} }
@ -106,9 +106,9 @@ class MalwareScanner extends AsyncTask<Set<File>, Object, String> {
publishProgress(result + " in " + file.getValue().toString().replaceAll(Environment.getExternalStorageDirectory().toString(), "~"), false); publishProgress(result + " in " + file.getValue().toString().replaceAll(Environment.getExternalStorageDirectory().toString(), "~"), false);
} }
} }
publishProgress("Checked all " + hashType + " hashes against signature databases\n", true); publishProgress(Utils.getContext().getString(R.string.main_hash_scan_done, hashType) + "\n", true);
} else { } else {
publishProgress("No " + hashType + " signatures available\n", true); publishProgress(Utils.getContext().getString(R.string.main_no_hashes_available, hashType) + "\n", true);
} }
} }

View file

@ -114,7 +114,7 @@ public class MalwareScannerService extends Service {
} }
malwareMonitors.clear(); malwareMonitors.clear();
System.gc(); System.gc();
//Toast.makeText(this, "Hypatia: Realtime Scanning Stopped", Toast.LENGTH_SHORT).show(); //Toast.makeText(this, "Hypatia: Realtime Scanning Stopped", Toast.LENGTH_SHORT).show(); //TODO: Move to strings.xml
} }
private void setForeground() { private void setForeground() {
@ -134,7 +134,7 @@ public class MalwareScannerService extends Service {
} }
private void updateForegroundNotification() { private void updateForegroundNotification() {
foregroundNotification.setSubText(Utils.amtFilesScanned + " files scanned"); foregroundNotification.setSubText(Utils.amtFilesScanned + " files scanned"); //TODO: Move to strings.xml
notificationManager.notify(-1, foregroundNotification.build()); notificationManager.notify(-1, foregroundNotification.build());
} }

View file

@ -44,6 +44,10 @@ public class Utils {
Utils.context = context; Utils.context = context;
} }
public static Context getContext() {
return context;
}
public static SharedPreferences getPrefs(Context context) { public static SharedPreferences getPrefs(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context); return PreferenceManager.getDefaultSharedPreferences(context);
} }

View file

@ -0,0 +1,69 @@
<resources>
<string name="app_name">Hypatia V3</string>
<!-- START MainActivity -->
<string name="title_scanner">Scanner</string>
<string name="title_log">Verlauf</string>
<string name="title_databases">Datenbanken</string>
<string name="title_settings">Einstellungen</string>
<string name="main_database_updating">Update der %s Datenbank...</string>
<string name="main_database_downloading">Download von %s</string>
<string name="main_database_download_success">Erfolgreich heruntergeladen</string>
<string name="main_database_download_error">Datei wurde nicht heruntergeladen. Fehlercode %s</string>
<string name="main_no_database_available">Keine Datenbank verfügbar. Scan wird abgebrochen...</string>
<string name="main_database_not_changed">Datei wurd nicht geändert</string>
<string name="main_database_download_error_logcat">Download ist fehlgeschlagen. Für weitere Details bitte in logcat nachsehen</string>
<string name="main_starting_scan">Scan startet...</string>
<string name="main_files_pending_scan">%s Dateien, die zur Überprüfung vorgesehen sind</string>
<string name="main_database_loaded">Datenbank mit %s Signaturen geladen</string>
<string name="main_hashing_files">Generiere Hashes für Dateien...</string>
<string name="main_hashing_done">Hashes für alle Dateien generiert</string>
<string name="main_hash_scan_done">Alle %s Hashes wurden mit den Signatur-Datenbanken abgeglichen</string>
<string name="main_no_hashes_available">Keine %s Hash-Signaturen verfügbar</string>
<string name="main_scanning_done">Scan nach %s Sekunden abgeschlossen!</string>
<!-- END MainActivity -->
<!-- START NOTIFICATIONS -->
<string name="notif_scanner_realtime">Malware-Erkennung</string>
<string name="notif_scanner_realtime_channel">Dient zur Warnung in Echtzeit wenn Malware erkannt wird</string>
<string name="notif_scanner_realtime_context">Bekannte Malware wird in Echtzeit erkannt</string>
<!-- END NOTIFICATIONS -->
<!-- START TOASTS -->
<string name="toast_orbot_unavailable">Für dieses Feature wird Orbot benöntigt</string>
<!-- END TOASTS -->
<!-- START SettingsFragment -->
<string name="settings_category_scanner_realtime">Echtzeit-Scanner</string>
<string name="settings_pref_scanner_realtime_enabled">Echtzeit-Scannen</string>
<string name="settings_pref_scanner_realtime_enabled_summary">Überwachung auf Bedrohungen in Echtzeit mit den folgenden Einstellungen</string>
<string name="settings_pref_scanner_realtime_path_apps">Apps scannen</string>
<string name="settings_pref_scanner_realtime_path_apps_summary">Apps während der Installation scannen</string>
<string name="settings_pref_scanner_realtime_path_internal">Internen Speicher überwachen</string>
<string name="settings_pref_scanner_realtime_path_internal_summary">Rekursive Überwachung des internen Speichers</string>
<string name="settings_pref_scanner_realtime_path_external">Externen Speicher überwachen</string>
<string name="settings_pref_scanner_realtime_path_external_summary">Rekursive Überwachung des externen Speichers</string>
<string name="settings_pref_scanner_realtime_path_system">System überwachen</string>
<string name="settings_pref_scanner_realtime_path_system_summary">Warnung bei Änderungen an /system</string>
<string name="settings_category_optimizations">Optimierungen</string>
<string name="settings_pref_optimizations_scanner_max_size">Maximale Datei-Größe</string>
<string name="settings_pref_optimizations_scanner_max_size_summary">Dateien, die größer als diese Angabe in Megabyte sind, werden nicht gescannt</string>
<string name="settings_pref_optimizations_database_hash_length">Maximale Hash-Länge</string>
<string name="settings_pref_optimizations_database_hash_length_summary">Geringerer Belegung des Arbeitsspeicher bei Gefahr von vermehrten Fehlalarmen (false positives)</string>
<string name="settings_pref_optimizations_database_trim">Variantennamen abkürzen</string>
<string name="settings_pref_optimizations_database_trim_summary">Geringere Belastung des Arbeitsspeichers auf Kosten von detaillierten Erkennungsmeldungen</string>
<string name="settings_category_network">Netzwerk</string>
<string name="settings_pref_network_tor">Onion-Routing</string>
<string name="settings_pref_network_tor_summary">Alle Netzwerk-Requests über Tor leiten</string>
<string name="settings_category_other">Sonstiges</string>
<string name="settings_pref_other_third_party">Dritt-Anbieter-Zugriff erlauben</string>
<string name="settings_pref_other_third_party_summary">Anderen Apps erlauben das Scannen von Objekten aufzurufen</string>
<string name="settings_pref_network_database_repo">Datenbank-Repository</string>
<string name="settings_pref_network_database_repo_summary">API von der die Datenbanken bezogen werden sollen</string>
<!-- END SettingsFragment -->
</resources>

View file

@ -6,6 +6,23 @@
<string name="title_log">History</string> <string name="title_log">History</string>
<string name="title_databases">Databases</string> <string name="title_databases">Databases</string>
<string name="title_settings">Settings</string> <string name="title_settings">Settings</string>
<string name="main_database_updating">Updating %s databases...</string>
<string name="main_database_downloading">Downloading %s</string>
<string name="main_database_download_success">Successfully downloaded</string>
<string name="main_database_download_error">File not downloaded, response code %s</string>
<string name="main_no_database_available">No database available, not scanning...</string>
<string name="main_database_not_changed">File not changed</string>
<string name="main_database_download_error_logcat">Failed to download, check logcat</string>
<string name="main_starting_scan">Starting scan...</string>
<string name="main_files_pending_scan">%s files pending scan</string>
<string name="main_database_loaded">Loaded database with %s signatures</string>
<string name="main_hashing_files">Hashing files...</string>
<string name="main_hashing_done">Calculated hashes for all files</string>
<string name="main_hash_scan_done">Checked all %s hashes against signature databases</string>
<string name="main_no_hashes_available">No %s hashes signatures available</string>
<string name="main_scanning_done">Scan completed in %s seconds!</string>
<!-- END MainActivity --> <!-- END MainActivity -->
<!-- START NOTIFICATIONS --> <!-- START NOTIFICATIONS -->
@ -49,4 +66,4 @@
<string name="settings_pref_network_database_repo">Database repo</string> <string name="settings_pref_network_database_repo">Database repo</string>
<string name="settings_pref_network_database_repo_summary">API to request databases from</string> <string name="settings_pref_network_database_repo_summary">API to request databases from</string>
<!-- END SettingsFragment --> <!-- END SettingsFragment -->
</resources> </resources>