Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,6 @@ android {
namespace = "com.owncloud.android"
testNamespace = "${namespace}.test"

androidResources.generateLocaleConfig = true

defaultConfig {
applicationId = "com.nextcloud.client"
minSdk = 28
Expand Down Expand Up @@ -176,6 +174,11 @@ android {
versionName = "1"
}
}

// NMC customization to only include German and English translations and exclude the others
// By doing this no need to delete the other strings which aren't required for NMC
// Refer: https://developer.android.com/guide/topics/resources/providing-resources#AlternativeResources
resConfigs("en", "de_DE", "de")
}

applicationVariants.configureEach {
Expand Down
172 changes: 172 additions & 0 deletions app/src/androidTest/java/com/nmc/android/LocalizationResourceTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2025 TSI-mc <surinder.kumar@t-systems.com>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

package com.nmc.android

import android.content.Context
import android.content.res.Configuration
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.owncloud.android.R
import junit.framework.TestCase.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import java.util.Locale

/**
* Test class to verify the strings customized in this branch PR for NMC
*/
@RunWith(AndroidJUnit4::class)
class LocalizationResourceTest {

private val baseContext = ApplicationProvider.getApplicationContext<Context>()

private val localizedStringMap = mapOf(
R.string.about_version to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to $$"Version %1$s",
Locale.GERMAN to $$"Version %1$s"
)
),
R.string.actionbar_see_details to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to "Share",
Locale.GERMAN to "Teilen"
)
),
R.string.drawer_item_on_device to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to "Offline files",
Locale.GERMAN to "Offline verfügbare Dateien"
)
),
R.string.prefs_lock to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to "Security",
Locale.GERMAN to "Sicherheit"
)
),
R.string.filedetails_download to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to "Offline availability",
Locale.GERMAN to "Offline Verfügbarkeit"
)
),
R.string.filedetails_sync_file to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to "Offline availability",
Locale.GERMAN to "Offline Verfügbarkeit"
)
),
R.string.action_send_share to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to "Sharing",
Locale.GERMAN to "Teilen"
)
),
R.string.common_cancel_sync to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to "Cancel",
Locale.GERMAN to "Abbrechen"
)
),
R.string.instant_upload_path to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to "/Camera-Media",
Locale.GERMAN to "/Kamera-Medien"
)
),
R.string.prefs_synced_folders_remote_path_title to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to "Target folder in your MagentaCLOUD",
Locale.GERMAN to "Zielorder in Deiner MagentaCLOUD"
)
),
R.string.prefs_e2e_mnemonic to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to "End-to-end encryption",
Locale.GERMAN to "Ende-zu-Ende Verschlüsselung"
)
),
R.string.storage_choose_location to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to "Choose Source",
Locale.GERMAN to "Wählen Sie Quelle"
)
),
R.string.subtitle_photos_videos to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to "Images and videos",
Locale.GERMAN to "Fotos und Videos"
)
),
R.string.show_images to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to "Show images",
Locale.GERMAN to "Bilder anzeigen"
)
),
R.string.subtitle_photos_only to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to "Images only",
Locale.GERMAN to "Nur Fotos"
)
),
R.string.select_media_folder to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to "Select the \"Media\" folder",
Locale.GERMAN to "Den Ordner \"Medien\" auswählen",
)
),
R.string.file_already_exists to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to "Filename already exists.",
Locale.GERMAN to "Dateiname bereits vorhanden",
)
),
R.string.email_pick_failed to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to "Failed to pick email address.",
Locale.GERMAN to "Fehler beim Zugriff auf E-Mail Adresse.",
)
),
R.string.menu_item_sort_by_date_newest_first to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to "Newest first",
Locale.GERMAN to "Neueste zuerst",
)
),
R.string.update_link_file_error to ExpectedLocalizedString(
translations = mapOf(
Locale.ENGLISH to "An error occurred while trying to update the share.",
Locale.GERMAN to "Fehler bei der Aktualisierungd der Freigabe aufgetreten.",
)
),
)

@Test
fun verifyLocalizedStrings() {
localizedStringMap.forEach { (stringRes, expected) ->
expected.translations.forEach { (locale, expectedText) ->

val config = Configuration(baseContext.resources.configuration)
config.setLocale(locale)

val localizedContext = baseContext.createConfigurationContext(config)
val actualText = localizedContext.getString(stringRes)

assertEquals(
"Mismatch for ${baseContext.resources.getResourceEntryName(stringRes)} in $locale",
expectedText,
actualText
)
}
}
}

data class ExpectedLocalizedString(val translations: Map<Locale, String>)
}
39 changes: 20 additions & 19 deletions app/src/main/res/values-de/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@
<string name="action_edit">Bearbeiten</string>
<string name="action_empty_notifications">Alle Benachrichtigungen löschen</string>
<string name="action_empty_trashbin">Papierkorb leeren</string>
<string name="action_send_share">Senden/Teilen</string>
<string name="action_send_share">Teilen</string>
<string name="action_switch_grid_view">Kachelansicht</string>
<string name="action_switch_list_view">Listenansicht</string>
<string name="actionbar_calendar_contacts_restore">Kontakte und Kalender wiederherstellen</string>
<string name="actionbar_mkdir">Neuer Ordner</string>
<string name="actionbar_move_or_copy">Verschieben oder kopieren</string>
<string name="actionbar_open_with">Öffnen mit</string>
<string name="actionbar_search">Suche</string>
<string name="actionbar_see_details">Details</string>
<string name="actionbar_see_details">Teilen</string>
<string name="actionbar_send_file">Senden</string>
<string name="actionbar_settings">Einstellungen</string>
<string name="actionbar_sort">Sortieren</string>
Expand Down Expand Up @@ -146,7 +146,7 @@
<string name="clipboard_unexpected_error">Unerwarteter Fehler beim Kopieren in die Zwischenablage</string>
<string name="common_back">Zurück</string>
<string name="common_cancel">Abbrechen</string>
<string name="common_cancel_sync">Synchronisierung abbrechen</string>
<string name="common_cancel_sync">Abbrechen</string>
<string name="common_choose_account">Konto auswählen</string>
<string name="common_confirm">Bestätigen</string>
<string name="common_copy">Kopieren</string>
Expand Down Expand Up @@ -201,7 +201,7 @@
<string name="conflict_message_description_for_folder">Falls beide Versionen gewählt werden, wird beim lokalen Ordner eine Zahl am Ende des Dateinamens hinzugefügt.</string>
<string name="conflict_server_file">Serverdatei</string>
<string name="contact_backup_title">Kontakte-Backup</string>
<string name="contact_no_permission">Eine Kontakterlaubnis ist erforderlich.</string>
<string name="contact_no_permission">Zugriff auf Kontakte erforderlich.</string>
<string name="contactlist_item_icon">Nutzericon für Kontaktliste</string>
<string name="contactlist_no_permission">Keine Berechtigung vergeben, es wurde nichts importiert.</string>
<string name="contacts">Kontakte</string>
Expand Down Expand Up @@ -302,11 +302,11 @@
<string name="drawer_item_groupfolders">Gruppenordner</string>
<string name="drawer_item_home">Home</string>
<string name="drawer_item_notifications">Benachrichtigungen</string>
<string name="drawer_item_on_device">Auf dem Gerät</string>
<string name="drawer_item_on_device">Offline verfügbare Dateien</string>
<string name="drawer_item_personal_files">Persönliche Dateien</string>
<string name="drawer_item_recently_modified">Kürzlich geändert</string>
<string name="drawer_item_shared">Geteilt</string>
<string name="drawer_item_trashbin">Gelöschte Dateien</string>
<string name="drawer_item_trashbin">Papierkorb</string>
<string name="drawer_item_uploads_list">Uploads</string>
<string name="drawer_logout">Abmelden</string>
<string name="drawer_open">Hauptmenü öffnen</string>
Expand All @@ -324,7 +324,7 @@
<string name="ecosystem_apps_display_more">Mehr</string>
<string name="ecosystem_apps_more">Weitere Nextcloud-Apps</string>
<string name="editor_web_view_cannot_open_file">Dateiauswahl konnte nicht geöffnet werden</string>
<string name="email_pick_failed">E-Mail-Adresse konnte nicht ausgewählt werden.</string>
<string name="email_pick_failed">Fehler beim Zugriff auf E-Mail Adresse.</string>
<string name="encrypted">Als verschlüsselt festlegen</string>
<string name="end_to_end_encryption_certificate_unavailable">Serverzertifikat kann nicht abgerufen werden</string>
<string name="end_to_end_encryption_certificate_verification_failed">Der öffentliche Schlüssel konnte nicht verifiziert werden.</string>
Expand Down Expand Up @@ -475,10 +475,10 @@
<string name="file_upload_worker_same_file_already_exists">%s existiert bereits, kein Konflikt erkannt</string>
<string name="file_version_restored_error">Fehler beim Wiederherstellen der Dateiversion!</string>
<string name="filedetails_details">Details</string>
<string name="filedetails_download">Herunterladen</string>
<string name="filedetails_download">Offline Verfügbarkeit</string>
<string name="filedetails_export">Exportieren</string>
<string name="filedetails_renamed_in_upload_msg">Datei während des Hochladens in %1$s umbenannt</string>
<string name="filedetails_sync_file">Synchronisieren</string>
<string name="filedetails_sync_file">Offline Verfügbarkeit</string>
<string name="filedisplay_no_file_selected">Keine Datei gewählt</string>
<string name="filename_empty">Dateiname darf nicht leer sein</string>
<string name="filename_forbidden_characters">Verbotene Zeichen: / \\ &lt; &gt; : \" | ? *</string>
Expand Down Expand Up @@ -541,7 +541,7 @@
<string name="image_preview_unit_seconds">%s s</string>
<string name="instant_upload_existing">Vorhandene Dateien ebenfalls hochladen</string>
<string name="instant_upload_on_charging">Nur während des Ladens der Batterie hochladen</string>
<string name="instant_upload_path">/SofortUpload</string>
<string name="instant_upload_path">/Kamera-Medien</string>
<string name="internal_shares">Interne Freigaben</string>
<string name="internal_two_way_sync">Interne 2-Wege-Synchronisierung</string>
<string name="internal_two_way_sync_not_yet">Bislang nicht, wird demnächst synchronisiert</string>
Expand Down Expand Up @@ -592,7 +592,7 @@
<string name="media_play_pause_description">Wiedergabe-/Pause Knopf</string>
<string name="media_rewind_description">Rückspulknopf</string>
<string name="media_state_playing">%1$s (wird abgespielt)</string>
<string name="menu_item_sort_by_date_newest_first">Neue zuerst</string>
<string name="menu_item_sort_by_date_newest_first">Neueste zuerst</string>
<string name="menu_item_sort_by_date_oldest_first">Älteste zuerst</string>
<string name="menu_item_sort_by_name_a_z">A - Z</string>
<string name="menu_item_sort_by_name_z_a">Z - A</string>
Expand Down Expand Up @@ -623,7 +623,7 @@
<string name="no_mutliple_accounts_allowed">Nur ein Konto zulässig</string>
<string name="no_pdf_app_available">Keine App zum Öffnen von PDFs verfügbar</string>
<string name="no_send_app">Keine App zum Senden der ausgewählten Dateien verfügbar</string>
<string name="no_share_permission_selected">Bitte mindestens eine Berechtigung zum Teilen auswählen.</string>
<string name="note_confirm">Senden</string>
<string name="note_could_not_sent">Notiz konnte nicht versandt werden</string>
<string name="note_icon_hint">Notiz-Symbol</string>
<string name="notification_action_failed">Aktion konnte nicht ausgeführt werden</string>
Expand Down Expand Up @@ -718,7 +718,7 @@
<string name="prefs_data_storage_location_summary">Speicherort der Daten verwalten</string>
<string name="prefs_davx5_setup_error">Unerwarteter Fehler beim Einrichten von DAVx⁵ (früher bekannt als DAVdroid)</string>
<string name="prefs_e2e_active">Ende-zu-Ende-Verschlüsselung ist eingerichtet!</string>
<string name="prefs_e2e_mnemonic">E2E-Gedächtnisstütze</string>
<string name="prefs_e2e_mnemonic">Ende-zu-Ende Verschlüsselung</string>
<string name="prefs_e2e_no_device_credentials">Um die Gedächtnisstütze anzuzeigen, aktivieren Sie bitte Geräte-Zugangsdaten</string>
<string name="prefs_enable_media_scan_notifications">Benachrichtigungen der Mediensuche anzeigen</string>
<string name="prefs_enable_media_scan_notifications_summary">Über neu gefundene Medienordner informieren</string>
Expand All @@ -734,7 +734,7 @@
<string name="prefs_instant_upload_subfolder_rule_title">Unterordneroptionen</string>
<string name="prefs_keys_exist">Diesem Client Ende-zu-Ende-Verschlüsselung hinzufügen</string>
<string name="prefs_license">Lizenz</string>
<string name="prefs_lock">App-PIN</string>
<string name="prefs_lock">Sicherheit</string>
<string name="prefs_lock_device_credentials_enabled">Geräte-Anmeldedaten aktiviert</string>
<string name="prefs_lock_device_credentials_not_setup">Keine Geräte-Anmeldedaten eingerichtet.</string>
<string name="prefs_lock_none">Nichts</string>
Expand All @@ -751,7 +751,7 @@
<string name="prefs_sourcecode">Zum Quellcode</string>
<string name="prefs_sycned_folders_summary">Ordner für \"Automatisches Hochladen\" verwalten</string>
<string name="prefs_synced_folders_local_path_title">Lokaler Ordner</string>
<string name="prefs_synced_folders_remote_path_title">Remote-Ordner</string>
<string name="prefs_synced_folders_remote_path_title">Zielorder in Deiner MagentaCLOUD</string>
<string name="prefs_theme_title">Design</string>
<string name="prefs_two_way_sync_interval">Intervall</string>
<string name="prefs_two_way_sync_summary">Interne Ordner für 2-Wege-Synchronisierung verwalten</string>
Expand Down Expand Up @@ -822,11 +822,12 @@
<string name="secure_share_not_set_up">Sicheres teilen ist für diesen Benutzer nicht eingerichtet</string>
<string name="secure_share_search">Sicheres teilen …</string>
<string name="select_all">Alle auswählen</string>
<string name="select_media_folder">Medien-Ordner auswählen</string>
<string name="select_media_folder">Den Ordner \"Medien\" auswählen</string>
<string name="select_one_template">Bitte eine Vorlage auswählen</string>
<string name="select_template">Vorlage auswählen</string>
<string name="send">Senden</string>
<string name="send_share">Freigabe senden</string>
<string name="send_note">Notiz an Empfänger senden</string>
<string name="sendbutton_description">Icon für den Senden-Button</string>
<string name="server_not_reachable">Inhalt konnte nicht geladen werden</string>
<string name="server_not_reachable_content">Das Gerät scheint nicht mit dem Internet verbunden zu sein</string>
Expand Down Expand Up @@ -892,7 +893,7 @@
<string name="sharee_add_failed">Freigeben fehlgeschlagen</string>
<string name="sharee_already_added_to_file">Das Hinzufügen der Freigabe ist fehlgeschlagen. Diese Datei oder dieser Ordner wurden bereits für diese Person oder Gruppe freigegeben.</string>
<string name="show_all">Alle anzeigen</string>
<string name="show_images">Fotos anzeigen</string>
<string name="show_images">Bilder anzeigen</string>
<string name="show_less">Weniger anzeigen</string>
<string name="show_video">Videos anzeigen</string>
<string name="sign_tos_failed">Bitte überprüfen Sie die Nutzungsbedingungen selbst!</string>
Expand Down Expand Up @@ -928,7 +929,7 @@
<string name="ssl_validator_reason_hostname_not_verified">- Die Adresse stimmt nicht mit dem im Zertifikat angegebenen Hostnamen überein</string>
<string name="status_message">Statusnachricht</string>
<string name="storage_camera">Kamera</string>
<string name="storage_choose_location">Speicherort auswählen</string>
<string name="storage_choose_location">Wählen Sie Quelle</string>
<string name="storage_description_default">Standard</string>
<string name="storage_documents">Dokumente</string>
<string name="storage_downloads">Downloads</string>
Expand Down Expand Up @@ -1026,7 +1027,7 @@
<string name="unshare_link_forbidden_permissions">diese Datei nicht mehr zu teilen</string>
<string name="unsharing_failed">Freigabe aufheben fehlgeschlagen</string>
<string name="untrusted_domain">Zugriff über nicht vertrauenswürdige Domain. Weitere Informationen finden sich in der Dokumentation.</string>
<string name="update_link_file_error">Es ist ein Fehler bei der Aktualisierungd der Freigabe aufgetreten.</string>
<string name="update_link_file_error">Fehler bei der Aktualisierungd der Freigabe aufgetreten.</string>
<string name="update_link_file_no_exist">Aktualisierung nicht möglich. Bitte prüfen Sie, ob die Datei existiert.</string>
<string name="update_link_forbidden_permissions">zum Aktualisieren dieser Freigabe</string>
<string name="updating_share_failed">Aktualisierung der Freigabe fehlgeschlagen</string>
Expand Down
Loading