From d6ea6008a01c28b107bae82613e28329ceaefe3a Mon Sep 17 00:00:00 2001
From: drenkmann <l.vondrenkmann@yahoo.com>
Date: Mon, 17 Mar 2025 16:54:50 +0100
Subject: [PATCH 1/5] l10n: add German translation

---
 lib/l10n/intl_de.arb | 165 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 165 insertions(+)
 create mode 100644 lib/l10n/intl_de.arb

diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb
new file mode 100644
index 0000000..9dbfa9f
--- /dev/null
+++ b/lib/l10n/intl_de.arb
@@ -0,0 +1,165 @@
+{
+    "@@locale": "de",
+    "fastestExposurePair": "Schnellstes",
+    "slowestExposurePair": "Langsamstes",
+    "ev": "EV",
+    "evValue": "{value} EV",
+    "@evValue": {
+        "placeholders": {
+            "value": {
+                "type": "String"
+            }
+        }
+    },
+    "iso": "ISO",
+    "filmSpeed": "Film Empfindlichkeit",
+    "nd": "ND",
+    "ndFilterFactor": "Neutraldichtefilter-Faktor",
+    "noExposurePairs": "Es gibt keine Belichtungspaare für die ausgewählten Einstellungen.",
+    "noCamerasDetected": "Scheinbar sind keine Kameras an das Gerät angeschlossen.",
+    "noCameraPermission": "Kamera-Erlaubnis nicht erteilt.",
+    "otherCameraError": "Beim Verbinden der Kamera ist ein Fehler aufgetreten.",
+    "none": "Keine",
+    "cancel": "Abbrechen",
+    "select": "Auswählen",
+    "save": "Speichern",
+    "settings": "Einstellungen",
+    "metering": "Messung",
+    "fractionalStops": "Zwischenstufen",
+    "showFractionalStops": "Zwischenstufen anzeigen",
+    "halfStops": "1/2",
+    "thirdStops": "1/3",
+    "calibration": "Kalibration",
+    "calibrationMessage": "Die Genauigkeit der Messungen sind vollständig von der Hardware des Geräts abhängig. Deshalb ist es empfehlenswert diese App zu testen und EV-Kalibrationswerte einzustellen, die korrekte Messungen produzieren.",
+    "calibrationMessageCameraOnly": "Die Genauigkeit der Messungen sind vollständig von der Kamera des Geräts abhängig. Deshalb ist es empfehlenswert diese App zu testen und EV-Kalibrationswerte einzustellen, die korrekte Messungen produzieren.",
+    "camera": "Kamera",
+    "lightSensor": "Lichtsensor",
+    "showEv100": "EV\u2081\u2080\u2080 anzeigen",
+    "meteringScreenLayout": "Messansicht Layout",
+    "meteringScreenLayoutHint": "Verstecke Elemente von der Messansicht, damit sie nicht den Platz für Belichtungspaare verschwenden.",
+    "meteringScreenLayoutHintEquipmentProfiles": "Ausrüstungsprofil Auswahl",
+    "meteringScreenFeatureExtremeExposurePairs": "Schnellste & langsamste Belichtungspaare",
+    "meteringScreenFeatureFilmPicker": "Film Auswahl",
+    "cameraFeatures": "Kamerafunktionen",
+    "cameraFeatureSpotMetering": "Punkt-Messung",
+    "cameraFeatureSpotMeteringHint": "Halte die Kameraansicht gedrückt um den Messpunkt zu entfernen",
+    "cameraFeatureHistogram": "Histogramm",
+    "cameraFeatureHistogramHint": "Verwendung des Histogramms kann den Batterieverbrauch erhöhen",
+    "film": "Film",
+    "filmPush": "Film (push)",
+    "filmPull": "Film (pull)",
+    "filmReciprocityHint": "Korrigiert Belichtungszeiten länger als 1 Sekunde",
+    "equipmentProfileName": "Ausrüstungsprofilname",
+    "equipmentProfileNameHint": "Praktica MTL5B",
+    "equipmentProfileAllValues": "Alle",
+    "apertureValues": "Blend-Werte",
+    "apertureValuesFilterDescription": "Wähle die anzuzeigenden Blend-Werte aus. Die Werte sind normalerweise von dem verwendeten Objektiv bestimmt.",
+    "ndFilters": "ND Filter",
+    "ndFiltersFilterDescription": "Wähle die anzuzeigenden ND Filter aus. (Beispielsweise die Meistverwendeten)",
+    "shutterSpeedValues": "Belichtungszeiten",
+    "shutterSpeedValuesFilterDescription": "Wähle die anzuzeigenden Belichtungszeiten aus. Die Werte sind normalerweise von der Kamera bestimmt.",
+    "shutterSpeedManualShort": "B",
+    "shutterSpeedManual": "Manuell",
+    "isoValues": "ISO Werte",
+    "isoValuesFilterDescription": "Wähle die anzuzeigenden ISO Werte aus. (Beispielsweise die Meistverwendeten)",
+    "lensZoom": "Objektiv-Zoom",
+    "lensZoomDescription": "Wähle den Zoom, relativ zur Handykamera, dass mit dem Sucher der Kamera übereinstimmt.",
+    "equipmentProfile": "Ausrüstungsprofil",
+    "equipmentProfiles": "Ausrüstungsprofile",
+    "tapToAdd": "Tippe zum Hinzufügen",
+    "general": "Allgemein",
+    "keepScreenOn": "Bildschirm anbehalten",
+    "haptics": "Haptik",
+    "autostartTimer": "Timer auto-starten",
+    "volumeKeysAction": "Auslösen durch Lautstärketasten",
+    "language": "Sprache",
+    "chooseLanguage": "Sprache auswählen",
+    "theme": "Theme",
+    "chooseTheme": "Theme auswählen",
+    "themeLight": "Hell",
+    "themeDark": "Dunkel",
+    "themeSystemDefault": "Systemeinstellung",
+    "dynamicColor": "Dynamische Farbe",
+    "primaryColor": "Akzentfarbe",
+    "choosePrimaryColor": "Akzentfarbe auswählen",
+    "about": "Über",
+    "restorePurchases": "Käufe wiederherstellen",
+    "sourceCode": "Source code",
+    "reportIssue": "Problem melden",
+    "writeEmail": "Email schreiben",
+    "youDontHaveMailApp": "Es ist keine Email App installiert.",
+    "copyEmail": "Email kopieren",
+    "version": "Version",
+    "versionNumber": "{version} ({buildNumber})",
+    "@versionNumber": {
+        "placeholders": {
+            "version": {
+                "type": "String"
+            },
+            "buildNumber": {
+                "type": "String"
+            }
+        }
+    },
+    "proFeaturesTitle": "Lightmeter Pro",
+    "getPro": "Pro kaufen",
+    "featuresFree": "Gratis",
+    "featuresPro": "Pro",
+    "proFeaturesPromoText": "Lightmeter Pro liefert alles, was Sie brauchen, um die besten Aufnahmen zu machen!",
+    "proFeaturesWhatsIncluded": "Was ist enthalten?",
+    "featureReflectedLightMetering": "Messung von reflektiertem Licht",
+    "featureIncidentLightMetering": "Messung von einfallendem Licht",
+    "featureIsoAndNdValues": "Große Auswahl von ISO und ND Filtern",
+    "featureTheme": "Theme Anpassung",
+    "featureSpotMetering": "Punktmessung",
+    "featureHistogram": "Histogramm",
+    "featureListOfFilms": "Liste von 20+ Filmen mit Reziprozitätsformeln",
+    "featureCustomFilms": "Eigene Filme erstellen",
+    "featureEquipmentProfiles": "Ausrüstungsprofile",
+    "featureTimer": "Eingebauter Timer für Langzeitbelichtungen",
+    "featureMeteringScreenLayout": "Anpassbare Messansicht",
+    "proFeaturesSupportText": "Durch den Kauf von Lightmeter Pro unterstützen Sie den Entwickler und ermöglichen das Hinzufügen weiterer Funktionen.",
+    "getNowFor": "Jetzt für {price} kaufen",
+    "@getNowFor": {
+        "price": {
+            "version": {
+                "type": "String"
+            }
+        }
+    },
+    "tooltipAdd": "Hinzufügen",
+    "tooltipClose": "Schließen",
+    "tooltipExpand": "Erweitern",
+    "tooltipCollapse": "Schrumpfen",
+    "tooltipCopy": "Kopieren",
+    "tooltipDelete": "Löschen",
+    "tooltipSelectAll": "Alle auswählen",
+    "tooltipDesecelectAll": "Keine auswählen",
+    "tooltipResetToZero": "Auf null zurücksetzen",
+    "tooltipUseLightSensor": "Lichtsensor verwenden",
+    "tooltipUseCamera": "Kamera verwenden",
+    "tooltipOpenSettings": "Einstellungen öffnen",
+    "exposurePair": "Belichtungspaar",
+    "whatsnew": "Was ist neu?",
+    "changesInVersion": "Änderungen in Version {version}:",
+    "@changesInVersion": {
+        "placeholders": {
+            "version": {
+                "type": "String"
+            }
+        }
+    },
+    "close": "Schließen",
+    "films": "Filme",
+    "filmsInUse": "Verwendete Filme",
+    "filmsCustom": "Eigene Filme",
+    "addFilmTitle": "Film hinzufügen",
+    "editFilmTitle": "Film bearbeiten",
+    "filmFormula": "Formel",
+    "filmFormulaExponential": "T=t^Rf",
+    "filmFormulaExponentialRf": "Rf",
+    "filmFormulaExponentialRfPlaceholder": "1.3",
+    "name": "Name",
+    "addEquipmentProfileTitle": "Ausrüstung hinzufügen",
+    "editEquipmentProfileTitle": "Ausrüstung bearbeiten"
+}

From 79b3827461ae79797b70a4ebefb215293f44f9e8 Mon Sep 17 00:00:00 2001
From: drenkmann <l.vondrenkmann@yahoo.com>
Date: Mon, 17 Mar 2025 16:57:55 +0100
Subject: [PATCH 2/5] l10n: add German to supported locales

---
 lib/data/models/supported_locale.dart       | 4 +++-
 test/data/models/supported_locale_test.dart | 2 ++
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/lib/data/models/supported_locale.dart b/lib/data/models/supported_locale.dart
index 0d93a50..ffb6eba 100644
--- a/lib/data/models/supported_locale.dart
+++ b/lib/data/models/supported_locale.dart
@@ -1,4 +1,4 @@
-enum SupportedLocale { en, fr, ru, zh }
+enum SupportedLocale { en, fr, ru, zh, de }
 
 extension SupportedLocaleExtension on SupportedLocale {
   String get intlName => toString().replaceAll("SupportedLocale.", "");
@@ -13,6 +13,8 @@ extension SupportedLocaleExtension on SupportedLocale {
         return 'Русский';
       case SupportedLocale.zh:
         return '简体中文';
+      case SupportedLocale.de:
+        return 'Deutsch';
     }
   }
 }
diff --git a/test/data/models/supported_locale_test.dart b/test/data/models/supported_locale_test.dart
index 83f7489..d43fb20 100644
--- a/test/data/models/supported_locale_test.dart
+++ b/test/data/models/supported_locale_test.dart
@@ -7,6 +7,7 @@ void main() {
     expect(SupportedLocale.fr.intlName, 'fr');
     expect(SupportedLocale.ru.intlName, 'ru');
     expect(SupportedLocale.zh.intlName, 'zh');
+    expect(SupportedLocale.de.intlName, 'de');
   });
 
   test('localizedName', () {
@@ -14,5 +15,6 @@ void main() {
     expect(SupportedLocale.fr.localizedName, 'Français');
     expect(SupportedLocale.ru.localizedName, 'Русский');
     expect(SupportedLocale.zh.localizedName, '简体中文');
+    expect(SupportedLocale.de.localizedName, 'Deutsch');
   });
 }

From 729fc07938d919dec31bd57411fb42db428e3f0b Mon Sep 17 00:00:00 2001
From: drenkmann <l.vondrenkmann@yahoo.com>
Date: Tue, 18 Mar 2025 11:21:54 +0100
Subject: [PATCH 3/5] l10n(german): improve translation of "none"

---
 lib/l10n/intl_de.arb | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb
index 9dbfa9f..84b6bb0 100644
--- a/lib/l10n/intl_de.arb
+++ b/lib/l10n/intl_de.arb
@@ -19,7 +19,7 @@
     "noCamerasDetected": "Scheinbar sind keine Kameras an das Gerät angeschlossen.",
     "noCameraPermission": "Kamera-Erlaubnis nicht erteilt.",
     "otherCameraError": "Beim Verbinden der Kamera ist ein Fehler aufgetreten.",
-    "none": "Keine",
+    "none": "Keiner",
     "cancel": "Abbrechen",
     "select": "Auswählen",
     "save": "Speichern",
@@ -162,4 +162,4 @@
     "name": "Name",
     "addEquipmentProfileTitle": "Ausrüstung hinzufügen",
     "editEquipmentProfileTitle": "Ausrüstung bearbeiten"
-}
+}
\ No newline at end of file

From 2b526c3f1b49661dfc8fe19590c7966968f4237a Mon Sep 17 00:00:00 2001
From: drenkmann <l.vondrenkmann@yahoo.com>
Date: Tue, 18 Mar 2025 11:32:04 +0100
Subject: [PATCH 4/5] l10n(german): change about title

---
 lib/l10n/intl_de.arb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb
index 84b6bb0..464656d 100644
--- a/lib/l10n/intl_de.arb
+++ b/lib/l10n/intl_de.arb
@@ -82,7 +82,7 @@
     "dynamicColor": "Dynamische Farbe",
     "primaryColor": "Akzentfarbe",
     "choosePrimaryColor": "Akzentfarbe auswählen",
-    "about": "Über",
+    "about": "Info",
     "restorePurchases": "Käufe wiederherstellen",
     "sourceCode": "Source code",
     "reportIssue": "Problem melden",

From 04ded6c35fdef0831d97abbe32dae06ca069128c Mon Sep 17 00:00:00 2001
From: drenkmann <l.vondrenkmann@yahoo.com>
Date: Thu, 20 Mar 2025 17:18:17 +0100
Subject: [PATCH 5/5] style: alphabetical sorting of languages

---
 lib/data/models/supported_locale.dart | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/lib/data/models/supported_locale.dart b/lib/data/models/supported_locale.dart
index ffb6eba..f0aab98 100644
--- a/lib/data/models/supported_locale.dart
+++ b/lib/data/models/supported_locale.dart
@@ -1,10 +1,12 @@
-enum SupportedLocale { en, fr, ru, zh, de }
+enum SupportedLocale { de, en, fr, ru, zh }
 
 extension SupportedLocaleExtension on SupportedLocale {
   String get intlName => toString().replaceAll("SupportedLocale.", "");
 
   String get localizedName {
     switch (this) {
+      case SupportedLocale.de:
+        return 'Deutsch';
       case SupportedLocale.en:
         return 'English';
       case SupportedLocale.fr:
@@ -13,8 +15,6 @@ extension SupportedLocaleExtension on SupportedLocale {
         return 'Русский';
       case SupportedLocale.zh:
         return '简体中文';
-      case SupportedLocale.de:
-        return 'Deutsch';
     }
   }
 }