ML-236 Exposure offset for equipment profiles (#238)

* Set `targetSdkVersion ` to 35

* unified zoom icons

* expose exposure and zoom ranges

* added list tile to set exposure offset for equipment profile

* added translations

* Update metering_screen.png

* use latest m3 packages

* fixed iap stub

* added missing field
This commit is contained in:
Vadim 2025-07-09 19:27:46 +02:00 committed by GitHub
parent 02184529ed
commit dfe10493b8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
18 changed files with 892 additions and 824 deletions

View file

@ -20,6 +20,7 @@ class EquipmentProfilesStorageService {
List<ApertureValue>? apertureValues, List<ApertureValue>? apertureValues,
List<ShutterSpeedValue>? shutterSpeedValues, List<ShutterSpeedValue>? shutterSpeedValues,
double? lensZoom, double? lensZoom,
double? exposureOffset,
bool? isUsed, bool? isUsed,
}) async {} }) async {}

View file

@ -12,7 +12,7 @@ dependencies:
m3_lightmeter_resources: m3_lightmeter_resources:
git: git:
url: "https://github.com/vodemn/m3_lightmeter_resources" url: "https://github.com/vodemn/m3_lightmeter_resources"
ref: v2.1.0 ref: v2.2.0
shared_preferences: shared_preferences:
dev_dependencies: dev_dependencies:

View file

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

View file

@ -1,167 +1,169 @@
{ {
"@@locale": "en", "@@locale": "en",
"fastestExposurePair": "Fastest", "fastestExposurePair": "Fastest",
"slowestExposurePair": "Slowest", "slowestExposurePair": "Slowest",
"ev": "EV", "ev": "EV",
"evValue": "{value} EV", "evValue": "{value} EV",
"@evValue": { "@evValue": {
"placeholders": { "placeholders": {
"value": { "value": {
"type": "String" "type": "String"
} }
} }
}, },
"iso": "ISO", "iso": "ISO",
"filmSpeed": "Film sensitivity", "filmSpeed": "Film sensitivity",
"nd": "ND", "nd": "ND",
"ndFilterFactor": "Neutral density filter factor", "ndFilterFactor": "Neutral density filter factor",
"noExposurePairs": "There are no exposure pairs for the selected settings.", "noExposurePairs": "There are no exposure pairs for the selected settings.",
"noCamerasDetected": "Seems like your device doesn't have any cameras connected.", "noCamerasDetected": "Seems like your device doesn't have any cameras connected.",
"noCameraPermission": "Camera permission is not granted.", "noCameraPermission": "Camera permission is not granted.",
"otherCameraError": "An error occurred when connecting to the camera.", "otherCameraError": "An error occurred when connecting to the camera.",
"none": "None", "none": "None",
"cancel": "Cancel", "cancel": "Cancel",
"select": "Select", "select": "Select",
"save": "Save", "save": "Save",
"settings": "Settings", "settings": "Settings",
"metering": "Metering", "metering": "Metering",
"fractionalStops": "Fractional stops", "fractionalStops": "Fractional stops",
"showFractionalStops": "Show fractional stops", "showFractionalStops": "Show fractional stops",
"halfStops": "1/2", "halfStops": "1/2",
"thirdStops": "1/3", "thirdStops": "1/3",
"calibration": "Calibration", "calibration": "Calibration",
"calibrationMessage": "The accuracy of the readings measured by this application depends entirely on the hardware of the device. Therefore, consider testing this application and setting up EV calibration values that will give you the desired measurement results.", "calibrationMessage": "The accuracy of the readings measured by this application depends entirely on the hardware of the device. Therefore, consider testing this application and setting up EV calibration values that will give you the desired measurement results.",
"calibrationMessageCameraOnly": "The accuracy of the readings measured by this application depends entirely on the rear camera of the device. Therefore, consider testing this application and setting up an EV calibration value that will give you the desired measurement results.", "calibrationMessageCameraOnly": "The accuracy of the readings measured by this application depends entirely on the rear camera of the device. Therefore, consider testing this application and setting up an EV calibration value that will give you the desired measurement results.",
"camera": "Camera", "camera": "Camera",
"lightSensor": "Light sensor", "lightSensor": "Light sensor",
"showEv100": "Show EV\u2081\u2080\u2080", "showEv100": "Show EV₁₀₀",
"meteringScreenLayout": "Metering screen layout", "meteringScreenLayout": "Metering screen layout",
"meteringScreenLayoutHint": "Hide elements on the metering screen that you don't need so that they don't waste exposure pairs list space.", "meteringScreenLayoutHint": "Hide elements on the metering screen that you don't need so that they don't waste exposure pairs list space.",
"meteringScreenLayoutHintEquipmentProfiles": "Equipment profile picker", "meteringScreenLayoutHintEquipmentProfiles": "Equipment profile picker",
"meteringScreenFeatureExtremeExposurePairs": "Fastest & shortest exposure pairs", "meteringScreenFeatureExtremeExposurePairs": "Fastest & shortest exposure pairs",
"meteringScreenFeatureFilmPicker": "Film picker", "meteringScreenFeatureFilmPicker": "Film picker",
"cameraFeatures": "Camera features", "cameraFeatures": "Camera features",
"cameraFeatureSpotMetering": "Spot metering", "cameraFeatureSpotMetering": "Spot metering",
"cameraFeatureSpotMeteringHint": "Long press the camera view to remove metering spot", "cameraFeatureSpotMeteringHint": "Long press the camera view to remove metering spot",
"cameraFeatureHistogram": "Histogram", "cameraFeatureHistogram": "Histogram",
"cameraFeatureHistogramHint": "Enabling histogram can encrease battery drain", "cameraFeatureHistogramHint": "Enabling histogram can encrease battery drain",
"cameraFeaturesShowFocalLength": "Show Focal Length", "cameraFeaturesShowFocalLength": "Show Focal Length",
"cameraFeaturesShowFocalLengthHint": "Displays 35mm equivalent focal length instead of zoom factor", "cameraFeaturesShowFocalLengthHint": "Displays 35mm equivalent focal length instead of zoom factor",
"film": "Film", "film": "Film",
"filmPush": "Film (push)", "filmPush": "Film (push)",
"filmPull": "Film (pull)", "filmPull": "Film (pull)",
"filmReciprocityHint": "Applies correction for shutter speeds greater than 1 second", "filmReciprocityHint": "Applies correction for shutter speeds greater than 1 second",
"equipmentProfileName": "Equipment profile name", "equipmentProfileName": "Equipment profile name",
"equipmentProfileNameHint": "Praktica MTL5B", "equipmentProfileNameHint": "Praktica MTL5B",
"equipmentProfileAllValues": "All", "equipmentProfileAllValues": "All",
"apertureValues": "Aperture values", "apertureValues": "Aperture values",
"apertureValuesFilterDescription": "Select the range of aperture values to display. This is usually determined by the lens you are using.", "apertureValuesFilterDescription": "Select the range of aperture values to display. This is usually determined by the lens you are using.",
"ndFilters": "ND filters", "ndFilters": "ND filters",
"ndFiltersFilterDescription": "Select the ND filters to display. These may be your most commonly used ND filters or the ones that fit your lens.", "ndFiltersFilterDescription": "Select the ND filters to display. These may be your most commonly used ND filters or the ones that fit your lens.",
"shutterSpeedValues": "Shutter speed values", "shutterSpeedValues": "Shutter speed values",
"shutterSpeedValuesFilterDescription": "Select the range of shutter speed values to display. This is usually determined by the camera body you are using.", "shutterSpeedValuesFilterDescription": "Select the range of shutter speed values to display. This is usually determined by the camera body you are using.",
"shutterSpeedManualShort": "B", "shutterSpeedManualShort": "B",
"shutterSpeedManual": "Manual", "shutterSpeedManual": "Manual",
"isoValues": "ISO values", "isoValues": "ISO values",
"isoValuesFilterDescription": "Select the ISO values to display. These may be your most commonly used values or those supported by your camera.", "isoValuesFilterDescription": "Select the ISO values to display. These may be your most commonly used values or those supported by your camera.",
"lensZoom": "Lens zoom", "lensZoom": "Lens zoom",
"lensZoomDescription": "Set the zoom level relative to the phone's camera to match your camera's viewfinder.", "lensZoomDescription": "Set the zoom level relative to the phone's camera to match your camera's viewfinder.",
"equipmentProfile": "Equipment profile", "exposureOffset": "Exposure offset",
"equipmentProfiles": "Equipment profiles", "exposureOffsetDescription": "Set the exposure offset to get the most accurate results for the given camera.",
"tapToAdd": "Tap to add", "equipmentProfile": "Equipment profile",
"general": "General", "equipmentProfiles": "Equipment profiles",
"keepScreenOn": "Keep screen on", "tapToAdd": "Tap to add",
"haptics": "Haptics", "general": "General",
"autostartTimer": "Autostart timer", "keepScreenOn": "Keep screen on",
"volumeKeysAction": "Shutter by volume keys", "haptics": "Haptics",
"language": "Language", "autostartTimer": "Autostart timer",
"chooseLanguage": "Choose language", "volumeKeysAction": "Shutter by volume keys",
"theme": "Theme", "language": "Language",
"chooseTheme": "Choose theme", "chooseLanguage": "Choose language",
"themeLight": "Light", "theme": "Theme",
"themeDark": "Dark", "chooseTheme": "Choose theme",
"themeSystemDefault": "System default", "themeLight": "Light",
"dynamicColor": "Dynamic color", "themeDark": "Dark",
"primaryColor": "Primary color", "themeSystemDefault": "System default",
"choosePrimaryColor": "Choose primary color", "dynamicColor": "Dynamic color",
"about": "About", "primaryColor": "Primary color",
"restorePurchases": "Restore purchases", "choosePrimaryColor": "Choose primary color",
"sourceCode": "Source code", "about": "About",
"reportIssue": "Report an issue", "restorePurchases": "Restore purchases",
"writeEmail": "Write an email", "sourceCode": "Source code",
"youDontHaveMailApp": "You don't have any mail app installed.", "reportIssue": "Report an issue",
"copyEmail": "Copy email", "writeEmail": "Write an email",
"version": "Version", "youDontHaveMailApp": "You don't have any mail app installed.",
"versionNumber": "{version} ({buildNumber})", "copyEmail": "Copy email",
"@versionNumber": { "version": "Version",
"placeholders": { "versionNumber": "{version} ({buildNumber})",
"version": { "@versionNumber": {
"type": "String" "placeholders": {
}, "version": {
"buildNumber": { "type": "String"
"type": "String" },
} "buildNumber": {
} "type": "String"
}, }
"proFeaturesTitle": "Lightmeter Pro", }
"getPro": "Get Pro", },
"featuresFree": "Free", "proFeaturesTitle": "Lightmeter Pro",
"featuresPro": "Pro", "getPro": "Get Pro",
"proFeaturesPromoText": "Lightmeter Pro delivers everything you need to get the best shots!", "featuresFree": "Free",
"proFeaturesWhatsIncluded": "What's included?", "featuresPro": "Pro",
"featureReflectedLightMetering": "Reflected light metering", "proFeaturesPromoText": "Lightmeter Pro delivers everything you need to get the best shots!",
"featureIncidentLightMetering": "Incident light metering", "proFeaturesWhatsIncluded": "What's included?",
"featureIsoAndNdValues": "Wide range of ISO and ND filters values", "featureReflectedLightMetering": "Reflected light metering",
"featureTheme": "Theme customization", "featureIncidentLightMetering": "Incident light metering",
"featureSpotMeteringAndHistorgram": "Spot metering and histogram", "featureIsoAndNdValues": "Wide range of ISO and ND filters values",
"featureFocalLength35mm": "35mm equivalent focal length instead of zoom", "featureTheme": "Theme customization",
"featureListOfFilms": "List of 20+ films with reciprocity formulas", "featureSpotMeteringAndHistorgram": "Spot metering and histogram",
"featureCustomFilms": "Ability to create custom films", "featureFocalLength35mm": "35mm equivalent focal length instead of zoom",
"featureEquipmentProfiles": "Equipment profiles", "featureListOfFilms": "List of 20+ films with reciprocity formulas",
"featureTimer": "Built-in timer for long exposure", "featureCustomFilms": "Ability to create custom films",
"featureMeteringScreenLayout": "Customizable main screen", "featureEquipmentProfiles": "Equipment profiles",
"proFeaturesSupportText": "By purchasing Lightmeter Pro you support the development and make it possible to add new features to the app.", "featureTimer": "Built-in timer for long exposure",
"getNowFor": "Get now for {price}", "featureMeteringScreenLayout": "Customizable main screen",
"@getNowFor": { "proFeaturesSupportText": "By purchasing Lightmeter Pro you support the development and make it possible to add new features to the app.",
"price": { "getNowFor": "Get now for {price}",
"version": { "@getNowFor": {
"type": "String" "price": {
} "version": {
} "type": "String"
}, }
"tooltipAdd": "Add", }
"tooltipClose": "Close", },
"tooltipExpand": "Expand", "tooltipAdd": "Add",
"tooltipCollapse": "Collapse", "tooltipClose": "Close",
"tooltipCopy": "Copy", "tooltipExpand": "Expand",
"tooltipDelete": "Delete", "tooltipCollapse": "Collapse",
"tooltipSelectAll": "Select all", "tooltipCopy": "Copy",
"tooltipDesecelectAll": "Deselect all", "tooltipDelete": "Delete",
"tooltipResetToZero": "Reset to zero", "tooltipSelectAll": "Select all",
"tooltipUseLightSensor": "Use lightsensor", "tooltipDesecelectAll": "Deselect all",
"tooltipUseCamera": "Use camera", "tooltipResetToZero": "Reset to zero",
"tooltipOpenSettings": "Open settings", "tooltipUseLightSensor": "Use lightsensor",
"exposurePair": "Exposure pair", "tooltipUseCamera": "Use camera",
"whatsnew": "What's new?", "tooltipOpenSettings": "Open settings",
"changesInVersion": "Changes in version {version}:", "exposurePair": "Exposure pair",
"@changesInVersion": { "whatsnew": "What's new?",
"placeholders": { "changesInVersion": "Changes in version {version}:",
"version": { "@changesInVersion": {
"type": "String" "placeholders": {
} "version": {
} "type": "String"
}, }
"close": "Close", }
"films": "Films", },
"filmsInUse": "Films in use", "close": "Close",
"filmsCustom": "Custom films", "films": "Films",
"addFilmTitle": "Add film", "filmsInUse": "Films in use",
"editFilmTitle": "Edit film", "filmsCustom": "Custom films",
"filmFormula": "Formula", "addFilmTitle": "Add film",
"filmFormulaExponential": "T=t^Rf", "editFilmTitle": "Edit film",
"filmFormulaExponentialRf": "Rf", "filmFormula": "Formula",
"filmFormulaExponentialRfPlaceholder": "1.3", "filmFormulaExponential": "T=t^Rf",
"name": "Name", "filmFormulaExponentialRf": "Rf",
"addEquipmentProfileTitle": "Add equipment", "filmFormulaExponentialRfPlaceholder": "1.3",
"editEquipmentProfileTitle": "Edit equipment" "name": "Name",
} "addEquipmentProfileTitle": "Add equipment",
"editEquipmentProfileTitle": "Edit equipment"
}

View file

@ -1,158 +1,160 @@
{ {
"@@locale": "fr", "@@locale": "fr",
"fastestExposurePair": "Le plus rapide", "fastestExposurePair": "Le plus rapide",
"slowestExposurePair": "Le plus lent", "slowestExposurePair": "Le plus lent",
"ev": "EV", "ev": "EV",
"evValue": "{value} EV", "evValue": "{value} EV",
"@evValue": { "@evValue": {
"placeholders": { "placeholders": {
"value": { "value": {
"type": "String" "type": "String"
} }
} }
}, },
"iso": "ISO", "iso": "ISO",
"filmSpeed": "Sensibilité du film", "filmSpeed": "Sensibilité du film",
"nd": "ND", "nd": "ND",
"ndFilterFactor": "Facteur de filtre de densité neutre", "ndFilterFactor": "Facteur de filtre de densité neutre",
"noExposurePairs": "Il n'y a pas de paires d'exposition pour les réglages sélectionnés.", "noExposurePairs": "Il n'y a pas de paires d'exposition pour les réglages sélectionnés.",
"noCamerasDetected": "Il semble que votre appareil n'a pas de caméras connectées.", "noCamerasDetected": "Il semble que votre appareil n'a pas de caméras connectées.",
"noCameraPermission": "L'accès à la caméra n'est pas accordé.", "noCameraPermission": "L'accès à la caméra n'est pas accordé.",
"otherCameraError": "Une erreur s'est produite lors de la connexion à la caméra.", "otherCameraError": "Une erreur s'est produite lors de la connexion à la caméra.",
"none": "Aucun", "none": "Aucun",
"cancel": "Annuler", "cancel": "Annuler",
"select": "Sélectionner", "select": "Sélectionner",
"save": "Enregistrer", "save": "Enregistrer",
"settings": "Paramètres", "settings": "Paramètres",
"metering": "Mesure", "metering": "Mesure",
"fractionalStops": "Arrêts fractionnaires", "fractionalStops": "Arrêts fractionnaires",
"showFractionalStops": "Afficher les arrêts fractionnaires", "showFractionalStops": "Afficher les arrêts fractionnaires",
"halfStops": "1/2", "halfStops": "1/2",
"thirdStops": "1/3", "thirdStops": "1/3",
"calibration": "Calibration", "calibration": "Calibration",
"calibrationMessage": "La précision des lectures mesurées par cette application dépend entièrement du matériel de l'appareil. Par conséquent, envisagez de tester cette application et de configurer les valeurs d'étalonnage des EV qui vous donneront les résultats de mesure souhaités.", "calibrationMessage": "La précision des lectures mesurées par cette application dépend entièrement du matériel de l'appareil. Par conséquent, envisagez de tester cette application et de configurer les valeurs d'étalonnage des EV qui vous donneront les résultats de mesure souhaités.",
"calibrationMessageCameraOnly": "La précision des lectures mesurées par cette application dépend entièrement de la caméra arrière de l'appareil. Par conséquent, envisagez de tester cette application et de configurer une valeur d'étalonnage EV qui vous donnera les résultats de mesure souhaités.", "calibrationMessageCameraOnly": "La précision des lectures mesurées par cette application dépend entièrement de la caméra arrière de l'appareil. Par conséquent, envisagez de tester cette application et de configurer une valeur d'étalonnage EV qui vous donnera les résultats de mesure souhaités.",
"camera": "Caméra", "camera": "Caméra",
"lightSensor": "Capteur de lumière", "lightSensor": "Capteur de lumière",
"showEv100": "Montrer EV\u2081\u2080\u2080", "showEv100": "Montrer EV₁₀₀",
"meteringScreenLayout": "Disposition de l'écran de mesure", "meteringScreenLayout": "Disposition de l'écran de mesure",
"meteringScreenLayoutHint": "Masquer les éléments sur l'écran de mesure dont vous n'avez pas besoin pour qu'ils ne gaspillent pas de l'espace dans les paires d'exposition.", "meteringScreenLayoutHint": "Masquer les éléments sur l'écran de mesure dont vous n'avez pas besoin pour qu'ils ne gaspillent pas de l'espace dans les paires d'exposition.",
"meteringScreenLayoutHintEquipmentProfiles": "Sélecteur de profil de l'équipement", "meteringScreenLayoutHintEquipmentProfiles": "Sélecteur de profil de l'équipement",
"meteringScreenFeatureExtremeExposurePairs": "Paires d'exposition les plus rapides et les plus courtes", "meteringScreenFeatureExtremeExposurePairs": "Paires d'exposition les plus rapides et les plus courtes",
"meteringScreenFeatureFilmPicker": "Sélecteur de film", "meteringScreenFeatureFilmPicker": "Sélecteur de film",
"cameraFeatures": "Fonctionnalités de la caméra", "cameraFeatures": "Fonctionnalités de la caméra",
"cameraFeatureSpotMetering": "Mesure spot", "cameraFeatureSpotMetering": "Mesure spot",
"cameraFeatureSpotMeteringHint": "Appuyez longuement sur la vue de l'appareil photo pour supprimer le spot de mesure", "cameraFeatureSpotMeteringHint": "Appuyez longuement sur la vue de l'appareil photo pour supprimer le spot de mesure",
"cameraFeatureHistogram": "Histogramme", "cameraFeatureHistogram": "Histogramme",
"cameraFeatureHistogramHint": "L'activation de l'histogramme peut augmenter la consommation de la batterie", "cameraFeatureHistogramHint": "L'activation de l'histogramme peut augmenter la consommation de la batterie",
"cameraFeaturesShowFocalLength": "Afficher la focale", "cameraFeaturesShowFocalLength": "Afficher la focale",
"cameraFeaturesShowFocalLengthHint": "Affiche la focale équivalente 35 mm au lieu du facteur de zoom", "cameraFeaturesShowFocalLengthHint": "Affiche la focale équivalente 35 mm au lieu du facteur de zoom",
"film": "Pellicule", "film": "Pellicule",
"filmPush": "Pellicule (push)", "filmPush": "Pellicule (push)",
"filmPull": "Pellicule (pull)", "filmPull": "Pellicule (pull)",
"filmReciprocityHint": "La correction s'applique aux vitesses d'obturation supérieures à 1 seconde", "filmReciprocityHint": "La correction s'applique aux vitesses d'obturation supérieures à 1 seconde",
"equipmentProfileName": "Nom du profil de l'équipement", "equipmentProfileName": "Nom du profil de l'équipement",
"equipmentProfileNameHint": "Praktica MTL5B", "equipmentProfileNameHint": "Praktica MTL5B",
"equipmentProfileAllValues": "Tout", "equipmentProfileAllValues": "Tout",
"apertureValues": "Valeurs Aperture", "apertureValues": "Valeurs Aperture",
"apertureValuesFilterDescription": "Sélectionnez la plage de valeurs d'ouverture à afficher. Cela est généralement déterminé par l'objectif que vous utilisez.", "apertureValuesFilterDescription": "Sélectionnez la plage de valeurs d'ouverture à afficher. Cela est généralement déterminé par l'objectif que vous utilisez.",
"ndFilters": "Filtres ND", "ndFilters": "Filtres ND",
"ndFiltersFilterDescription": "Sélectionnez les filtres ND à afficher. Ce sont peut-être vos filtres ND les plus couramment utilisés ou ceux qui correspondent à votre lentille.", "ndFiltersFilterDescription": "Sélectionnez les filtres ND à afficher. Ce sont peut-être vos filtres ND les plus couramment utilisés ou ceux qui correspondent à votre lentille.",
"shutterSpeedValues": "Valeurs de la vitesse d'obturation", "shutterSpeedValues": "Valeurs de la vitesse d'obturation",
"shutterSpeedValuesFilterDescription": "Sélectionnez la plage de valeurs de vitesse d'obturation à afficher. Cela est généralement déterminé par le corps de l'appareil que vous utilisez.", "shutterSpeedValuesFilterDescription": "Sélectionnez la plage de valeurs de vitesse d'obturation à afficher. Cela est généralement déterminé par le corps de l'appareil que vous utilisez.",
"shutterSpeedManualShort": "B", "shutterSpeedManualShort": "B",
"shutterSpeedManual": "Manuelle", "shutterSpeedManual": "Manuelle",
"isoValues": "Valeurs ISO", "isoValues": "Valeurs ISO",
"isoValuesFilterDescription": "Sélectionnez les valeurs ISO à afficher. Ce sont peut-être vos valeurs les plus couramment utilisées ou celles prises en charge par votre caméra.", "isoValuesFilterDescription": "Sélectionnez les valeurs ISO à afficher. Ce sont peut-être vos valeurs les plus couramment utilisées ou celles prises en charge par votre caméra.",
"lensZoom": "Zoom sur l'objectif", "lensZoom": "Zoom sur l'objectif",
"lensZoomDescription": "Réglez le niveau de zoom par rapport à l'appareil photo du téléphone pour qu'il corresponde au viseur de votre appareil photo.", "lensZoomDescription": "Réglez le niveau de zoom par rapport à l'appareil photo du téléphone pour qu'il corresponde au viseur de votre appareil photo.",
"equipmentProfile": "Profil de l'équipement", "exposureOffset": "Décalage dexposition",
"equipmentProfiles": "Profils de l'équipement", "exposureOffsetDescription": "Définissez le décalage dexposition pour obtenir les résultats les plus précis selon lappareil photo.",
"tapToAdd": "Appuie pour ajouter", "equipmentProfile": "Profil de l'équipement",
"general": "Général", "equipmentProfiles": "Profils de l'équipement",
"keepScreenOn": "Garder l'écran allumé", "tapToAdd": "Appuie pour ajouter",
"haptics": "Haptiques", "general": "Général",
"autostartTimer": "Minuterie de démarrage automatique", "keepScreenOn": "Garder l'écran allumé",
"volumeKeysAction": "Obturateur par boutons de volume", "haptics": "Haptiques",
"language": "Langue", "autostartTimer": "Minuterie de démarrage automatique",
"chooseLanguage": "Choisissez la langue", "volumeKeysAction": "Obturateur par boutons de volume",
"theme": "Thème", "language": "Langue",
"chooseTheme": "Choisissez le thème", "chooseLanguage": "Choisissez la langue",
"themeLight": "Lumière", "theme": "Thème",
"themeDark": "Sombre", "chooseTheme": "Choisissez le thème",
"themeSystemDefault": "Thème système", "themeLight": "Lumière",
"dynamicColor": "Couleur dynamique", "themeDark": "Sombre",
"primaryColor": "Couleur primaire", "themeSystemDefault": "Thème système",
"choosePrimaryColor": "Choisir la couleur primaire", "dynamicColor": "Couleur dynamique",
"about": "À propos de l'application", "primaryColor": "Couleur primaire",
"restorePurchases": "Restaurer les achats", "choosePrimaryColor": "Choisir la couleur primaire",
"sourceCode": "Code source", "about": "À propos de l'application",
"reportIssue": "Rapporter un problème", "restorePurchases": "Restaurer les achats",
"writeEmail": "Écrire un email", "sourceCode": "Code source",
"youDontHaveMailApp": "Vous n'avez installé aucune application de messagerie.", "reportIssue": "Rapporter un problème",
"copyEmail": "Copier un e-mail", "writeEmail": "Écrire un email",
"version": "Version", "youDontHaveMailApp": "Vous n'avez installé aucune application de messagerie.",
"versionNumber": "{version} ({buildNumber})", "copyEmail": "Copier un e-mail",
"@versionNumber": { "version": "Version",
"placeholders": { "versionNumber": "{version} ({buildNumber})",
"version": { "@versionNumber": {
"type": "String" "placeholders": {
}, "version": {
"buildNumber": { "type": "String"
"type": "String" },
} "buildNumber": {
} "type": "String"
}, }
"proFeaturesTitle": "Lightmeter Pro", }
"getPro": "Acheter Pro", },
"unlock": "Déverrouiller", "proFeaturesTitle": "Lightmeter Pro",
"featuresFree": "Gratuit", "getPro": "Acheter Pro",
"featuresPro": "Pro", "unlock": "Déverrouiller",
"proFeaturesPromoText": "Lightmeter Pro offre tout ce dont vous avez besoin pour obtenir les meilleurs clichés!", "featuresFree": "Gratuit",
"proFeaturesWhatsIncluded": "Qu'est-ce qui est inclus?", "featuresPro": "Pro",
"featureReflectedLightMetering": "Mesure de la lumière réfléchie", "proFeaturesPromoText": "Lightmeter Pro offre tout ce dont vous avez besoin pour obtenir les meilleurs clichés!",
"featureIncidentLightMetering": "Mesure de la lumière incidente", "proFeaturesWhatsIncluded": "Qu'est-ce qui est inclus?",
"featureIsoAndNdValues": "Large gamme de valeurs ISO et de filtres ND", "featureReflectedLightMetering": "Mesure de la lumière réfléchie",
"featureTheme": "Personnalisation du thème", "featureIncidentLightMetering": "Mesure de la lumière incidente",
"featureSpotMeteringAndHistorgram": "Mesure spot et histogramme", "featureIsoAndNdValues": "Large gamme de valeurs ISO et de filtres ND",
"featureFocalLength35mm": "Focale équivalente 35 mm au lieu du zoom", "featureTheme": "Personnalisation du thème",
"featureListOfFilms": "Liste de plus de 20 films avec des formules de correction", "featureSpotMeteringAndHistorgram": "Mesure spot et histogramme",
"featureCustomFilms": "Possibilité de créer des films personnalisés", "featureFocalLength35mm": "Focale équivalente 35 mm au lieu du zoom",
"featureEquipmentProfiles": "Profils de l'équipement", "featureListOfFilms": "Liste de plus de 20 films avec des formules de correction",
"featureTimer": "Minuteur intégré pour longues expositions", "featureCustomFilms": "Possibilité de créer des films personnalisés",
"featureMeteringScreenLayout": "Écran principal personnalisable", "featureEquipmentProfiles": "Profils de l'équipement",
"proFeaturesSupportText": "En achetant Lightmeter Pro, vous soutenez le développement et permettez l'ajout de nouvelles fonctionnalités à l'application.", "featureTimer": "Minuteur intégré pour longues expositions",
"getNowFor": "Acheter maintenant {price}", "featureMeteringScreenLayout": "Écran principal personnalisable",
"@getNowFor": { "proFeaturesSupportText": "En achetant Lightmeter Pro, vous soutenez le développement et permettez l'ajout de nouvelles fonctionnalités à l'application.",
"price": { "getNowFor": "Acheter maintenant {price}",
"version": { "@getNowFor": {
"type": "String" "price": {
} "version": {
} "type": "String"
}, }
"tooltipAdd": "Ajouter", }
"tooltipClose": "Fermer", },
"tooltipExpand": "Élargir", "tooltipAdd": "Ajouter",
"tooltipCollapse": "Effondrement", "tooltipClose": "Fermer",
"tooltipCopy": "Copie", "tooltipExpand": "Élargir",
"tooltipDelete": "Supprimer", "tooltipCollapse": "Effondrement",
"tooltipSelectAll": "Tout sélectionner", "tooltipCopy": "Copie",
"tooltipDesecelectAll": "Désélectionner tout", "tooltipDelete": "Supprimer",
"tooltipResetToZero": "Remise à zéro", "tooltipSelectAll": "Tout sélectionner",
"tooltipUseLightSensor": "Utiliser un capteur de lumière", "tooltipDesecelectAll": "Désélectionner tout",
"tooltipUseCamera": "Utiliser la caméra", "tooltipResetToZero": "Remise à zéro",
"tooltipOpenSettings": "Ouvrir les paramètres", "tooltipUseLightSensor": "Utiliser un capteur de lumière",
"exposurePair": "Paire d'exposition", "tooltipUseCamera": "Utiliser la caméra",
"films": "Films", "tooltipOpenSettings": "Ouvrir les paramètres",
"filmsInUse": "Films en usage", "exposurePair": "Paire d'exposition",
"filmsCustom": "Films personnalisés", "films": "Films",
"addFilmTitle": "Ajouter un film", "filmsInUse": "Films en usage",
"editFilmTitle": "Editer le film", "filmsCustom": "Films personnalisés",
"filmFormula": "Formule", "addFilmTitle": "Ajouter un film",
"filmFormulaExponential": "T=t^Rf", "editFilmTitle": "Editer le film",
"filmFormulaExponentialRf": "Rf", "filmFormula": "Formule",
"filmFormulaExponentialRfPlaceholder": "1.3", "filmFormulaExponential": "T=t^Rf",
"name": "Titre", "filmFormulaExponentialRf": "Rf",
"addEquipmentProfileTitle": "Ajouter un profil", "filmFormulaExponentialRfPlaceholder": "1.3",
"editEquipmentProfileTitle": "Editer le profil" "name": "Titre",
} "addEquipmentProfileTitle": "Ajouter un profil",
"editEquipmentProfileTitle": "Editer le profil"
}

View file

@ -1,157 +1,159 @@
{ {
"@@locale": "ru", "@@locale": "ru",
"fastestExposurePair": "Короткая выдержка", "fastestExposurePair": "Короткая выдержка",
"slowestExposurePair": "Длинная выдержка", "slowestExposurePair": "Длинная выдержка",
"ev": "EV", "ev": "EV",
"evValue": "{value} EV", "evValue": "{value} EV",
"@evValue": { "@evValue": {
"placeholders": { "placeholders": {
"value": { "value": {
"type": "String" "type": "String"
} }
} }
}, },
"iso": "ISO", "iso": "ISO",
"filmSpeed": "Чувствительность плёнки", "filmSpeed": "Чувствительность плёнки",
"nd": "ND", "nd": "ND",
"ndFilterFactor": "Степень затемнения нейтрального фильтра", "ndFilterFactor": "Степень затемнения нейтрального фильтра",
"noExposurePairs": "Для выбранных настроек нет пар экспозиции.", "noExposurePairs": "Для выбранных настроек нет пар экспозиции.",
"noCamerasDetected": "Похоже, ваше устройство не имеет камеры.", "noCamerasDetected": "Похоже, ваше устройство не имеет камеры.",
"noCameraPermission": "Нет разрешения на доступ к камере.", "noCameraPermission": "Нет разрешения на доступ к камере.",
"otherCameraError": "Произошла ошибка при подключении к камере.", "otherCameraError": "Произошла ошибка при подключении к камере.",
"none": "Нет", "none": "Нет",
"cancel": "Отменить", "cancel": "Отменить",
"select": "Выбрать", "select": "Выбрать",
"save": "Сохранить", "save": "Сохранить",
"settings": "Настройки", "settings": "Настройки",
"metering": "Измерения", "metering": "Измерения",
"fractionalStops": "Дробные значения", "fractionalStops": "Дробные значения",
"showFractionalStops": "Показывать дробные значения", "showFractionalStops": "Показывать дробные значения",
"halfStops": "1/2", "halfStops": "1/2",
"thirdStops": "1/3", "thirdStops": "1/3",
"calibration": "Калибровка", "calibration": "Калибровка",
"calibrationMessage": "Точность измерений данного приложения полностью зависит от точности камеры и датчика освещенности вашего устройства. Поэтому рекомендуется самостоятельно подобрать калибровочные значения, которые дадут желаемый результат измерений.", "calibrationMessage": "Точность измерений данного приложения полностью зависит от точности камеры и датчика освещенности вашего устройства. Поэтому рекомендуется самостоятельно подобрать калибровочные значения, которые дадут желаемый результат измерений.",
"calibrationMessageCameraOnly": "Точность измерений данного приложения полностью зависит от точности камеры вашего устройства. Поэтому рекомендуется самостоятельно подобрать калибровочное значение, которое даст желаемый результат измерений.", "calibrationMessageCameraOnly": "Точность измерений данного приложения полностью зависит от точности камеры вашего устройства. Поэтому рекомендуется самостоятельно подобрать калибровочное значение, которое даст желаемый результат измерений.",
"camera": "Камера", "camera": "Камера",
"lightSensor": "Датчик освещённости", "lightSensor": "Датчик освещённости",
"showEv100": "Показывать EV\u2081\u2080\u2080", "showEv100": "Показывать EV₁₀₀",
"meteringScreenLayout": "Элементы главного экрана", "meteringScreenLayout": "Элементы главного экрана",
"meteringScreenLayoutHint": "Здесь вы можете скрыть некоторые ненужные или неиспользуемые элементы с главного экрана.", "meteringScreenLayoutHint": "Здесь вы можете скрыть некоторые ненужные или неиспользуемые элементы с главного экрана.",
"meteringScreenLayoutHintEquipmentProfiles": "Выбор профиля оборудования", "meteringScreenLayoutHintEquipmentProfiles": "Выбор профиля оборудования",
"meteringScreenFeatureExtremeExposurePairs": "Длинная и короткая выдержки", "meteringScreenFeatureExtremeExposurePairs": "Длинная и короткая выдержки",
"meteringScreenFeatureFilmPicker": "Выбор пленки", "meteringScreenFeatureFilmPicker": "Выбор пленки",
"cameraFeatures": "Возможности камеры", "cameraFeatures": "Возможности камеры",
"cameraFeatureSpotMetering": "Точечный замер", "cameraFeatureSpotMetering": "Точечный замер",
"cameraFeatureSpotMeteringHint": "Используйте долгое нажатие, чтобы удалить точку замера", "cameraFeatureSpotMeteringHint": "Используйте долгое нажатие, чтобы удалить точку замера",
"cameraFeatureHistogram": "Гистограмма", "cameraFeatureHistogram": "Гистограмма",
"cameraFeatureHistogramHint": "Использование гистограммы может увеличить расход аккумулятора", "cameraFeatureHistogramHint": "Использование гистограммы может увеличить расход аккумулятора",
"cameraFeaturesShowFocalLength": "Показать фокусное расстояние", "cameraFeaturesShowFocalLength": "Показать фокусное расстояние",
"cameraFeaturesShowFocalLengthHint": "Показывает эквивалент фокусного расстояния (35 мм) вместо коэффициента зума", "cameraFeaturesShowFocalLengthHint": "Показывает эквивалент фокусного расстояния (35 мм) вместо коэффициента зума",
"film": "Пленка", "film": "Пленка",
"filmPush": "Пленка (push)", "filmPush": "Пленка (push)",
"filmPull": "Пленка (pull)", "filmPull": "Пленка (pull)",
"filmReciprocityHint": "Применяет коррекцию для выдержек длиннее 1 секунды", "filmReciprocityHint": "Применяет коррекцию для выдержек длиннее 1 секунды",
"equipmentProfileName": "Название профиля", "equipmentProfileName": "Название профиля",
"equipmentProfileNameHint": "Praktica MTL5B", "equipmentProfileNameHint": "Praktica MTL5B",
"equipmentProfileAllValues": "Все", "equipmentProfileAllValues": "Все",
"apertureValues": "Значения диафрагмы", "apertureValues": "Значения диафрагмы",
"apertureValuesFilterDescription": "Выберите диапазон значений диафрагмы для отображения. Обычно определяется объективом, который вы используете.", "apertureValuesFilterDescription": "Выберите диапазон значений диафрагмы для отображения. Обычно определяется объективом, который вы используете.",
"ndFilters": "ND фильтры", "ndFilters": "ND фильтры",
"ndFiltersFilterDescription": "Выберите ND фильтры для отображения. Это могут быть наиболее часто используемые ND фильтры или фильтры, подходящие под ваш объектив.", "ndFiltersFilterDescription": "Выберите ND фильтры для отображения. Это могут быть наиболее часто используемые ND фильтры или фильтры, подходящие под ваш объектив.",
"shutterSpeedValues": "Значения выдержки", "shutterSpeedValues": "Значения выдержки",
"shutterSpeedValuesFilterDescription": "Выберите диапазон значений выдержки. Обычно ограничивается возможностями вашей камеры.", "shutterSpeedValuesFilterDescription": "Выберите диапазон значений выдержки. Обычно ограничивается возможностями вашей камеры.",
"shutterSpeedManualShort": "B", "shutterSpeedManualShort": "B",
"shutterSpeedManual": "Ручная", "shutterSpeedManual": "Ручная",
"isoValues": "Значения ISO", "isoValues": "Значения ISO",
"isoValuesFilterDescription": "Выберите значения ISO для отображения. Это может быть наиболее часто используемые значения или значения, поддерживаемые вашей камерой.", "isoValuesFilterDescription": "Выберите значения ISO для отображения. Это может быть наиболее часто используемые значения или значения, поддерживаемые вашей камерой.",
"lensZoom": "Зум объектива", "lensZoom": "Зум объектива",
"lensZoomDescription": "Установите уровень зума относительно камеры телефона, чтобы он соответствовал видоискателю вашей камеры.", "lensZoomDescription": "Установите уровень зума относительно камеры телефона, чтобы он соответствовал видоискателю вашей камеры.",
"equipmentProfile": "Оборудование", "exposureOffset": "Смещение экспозиции",
"equipmentProfiles": "Профили оборудования", "exposureOffsetDescription": "Установите смещение экспозиции для получения наиболее точных результатов с данной камерой.",
"tapToAdd": "Нажмите, чтобы добавить", "equipmentProfile": "Оборудование",
"general": "Общие", "equipmentProfiles": "Профили оборудования",
"keepScreenOn": "Запрет блокировки", "tapToAdd": "Нажмите, чтобы добавить",
"haptics": "Вибрация", "general": "Общие",
"autostartTimer": "Автозапуск таймера", "keepScreenOn": "Запрет блокировки",
"volumeKeysAction": "Затвор по кнопкам громкости", "haptics": "Вибрация",
"language": "Язык", "autostartTimer": "Автозапуск таймера",
"chooseLanguage": "Выберите язык", "volumeKeysAction": "Затвор по кнопкам громкости",
"theme": "Тема", "language": "Язык",
"chooseTheme": "Выберите тему", "chooseLanguage": "Выберите язык",
"themeLight": "Светлая", "theme": "Тема",
"themeDark": "Тёмная", "chooseTheme": "Выберите тему",
"themeSystemDefault": "Системная", "themeLight": "Светлая",
"dynamicColor": "Динамический цвет", "themeDark": "Тёмная",
"primaryColor": "Основной цвет", "themeSystemDefault": "Системная",
"choosePrimaryColor": "Выберите основной цвет", "dynamicColor": "Динамический цвет",
"about": "О приложении", "primaryColor": "Основной цвет",
"restorePurchases": "Восстановить покупки", "choosePrimaryColor": "Выберите основной цвет",
"sourceCode": "Исходный код", "about": "О приложении",
"reportIssue": "Сообщить о проблеме", "restorePurchases": "Восстановить покупки",
"writeEmail": "Написать на почту", "sourceCode": "Исходный код",
"youDontHaveMailApp": "У вас не установлено почтовое приложение.", "reportIssue": "Сообщить о проблеме",
"copyEmail": "Скопировать адрес", "writeEmail": "Написать на почту",
"version": "Версия", "youDontHaveMailApp": "У вас не установлено почтовое приложение.",
"versionNumber": "{version} ({buildNumber})", "copyEmail": "Скопировать адрес",
"@versionNumber": { "version": "Версия",
"placeholders": { "versionNumber": "{version} ({buildNumber})",
"version": { "@versionNumber": {
"type": "String" "placeholders": {
}, "version": {
"buildNumber": { "type": "String"
"type": "String" },
} "buildNumber": {
} "type": "String"
}, }
"proFeaturesTitle": "Lightmeter Pro", }
"getPro": "Купить Pro", },
"featuresFree": "Бесплатно", "proFeaturesTitle": "Lightmeter Pro",
"featuresPro": "Pro", "getPro": "Купить Pro",
"proFeaturesPromoText": "Lightmeter Pro предоставляет все необходимое для получения лучших снимков!", "featuresFree": "Бесплатно",
"proFeaturesWhatsIncluded": "Что включено?", "featuresPro": "Pro",
"featureReflectedLightMetering": "Замер отраженного света", "proFeaturesPromoText": "Lightmeter Pro предоставляет все необходимое для получения лучших снимков!",
"featureIncidentLightMetering": "Замер падающего света", "proFeaturesWhatsIncluded": "Что включено?",
"featureIsoAndNdValues": "Широкий диапазон значений ISO и фильтров ND", "featureReflectedLightMetering": "Замер отраженного света",
"featureTheme": "Настройка темы", "featureIncidentLightMetering": "Замер падающего света",
"featureSpotMeteringAndHistorgram": "Точечный замер и гистограмма", "featureIsoAndNdValues": "Широкий диапазон значений ISO и фильтров ND",
"featureFocalLength35mm": "Эквивалентное фокусное расстояние 35 мм вместо зума", "featureTheme": "Настройка темы",
"featureListOfFilms": "Список из 20+ плёнок с формулами коррекции", "featureSpotMeteringAndHistorgram": "Точечный замер и гистограмма",
"featureCustomFilms": "Возможность создания собственных плёнок", "featureFocalLength35mm": "Эквивалентное фокусное расстояние 35 мм вместо зума",
"featureEquipmentProfiles": "Профили оборудования", "featureListOfFilms": "Список из 20+ плёнок с формулами коррекции",
"featureTimer": "Встроенный таймер для длинных выдержек", "featureCustomFilms": "Возможность создания собственных плёнок",
"featureMeteringScreenLayout": "Настраиваемый главный экран", "featureEquipmentProfiles": "Профили оборудования",
"proFeaturesSupportText": "Покупая Lightmeter Pro, вы поддерживаете разработку и делаете возможным добавление новых функций в приложение.", "featureTimer": "Встроенный таймер для длинных выдержек",
"getNowFor": "Купить за {price}", "featureMeteringScreenLayout": "Настраиваемый главный экран",
"@getNowFor": { "proFeaturesSupportText": "Покупая Lightmeter Pro, вы поддерживаете разработку и делаете возможным добавление новых функций в приложение.",
"price": { "getNowFor": "Купить за {price}",
"version": { "@getNowFor": {
"type": "String" "price": {
} "version": {
} "type": "String"
}, }
"tooltipAdd": "Добавить", }
"tooltipClose": "Закрыть", },
"tooltipExpand": "Развернуть", "tooltipAdd": "Добавить",
"tooltipCollapse": "Свернуть", "tooltipClose": "Закрыть",
"tooltipCopy": "Скопировать", "tooltipExpand": "Развернуть",
"tooltipDelete": "Удалить", "tooltipCollapse": "Свернуть",
"tooltipSelectAll": "Выбрать все", "tooltipCopy": "Скопировать",
"tooltipDesecelectAll": "Отменить все", "tooltipDelete": "Удалить",
"tooltipResetToZero": "Сбросить до 0", "tooltipSelectAll": "Выбрать все",
"tooltipUseLightSensor": "Использовать датчик освещенности", "tooltipDesecelectAll": "Отменить все",
"tooltipUseCamera": "Использовать камеру", "tooltipResetToZero": "Сбросить до 0",
"tooltipOpenSettings": "Открыть настройки", "tooltipUseLightSensor": "Использовать датчик освещенности",
"exposurePair": "Пара экспозиции", "tooltipUseCamera": "Использовать камеру",
"films": "Плёнки", "tooltipOpenSettings": "Открыть настройки",
"filmsInUse": "Используемые плёнки", "exposurePair": "Пара экспозиции",
"filmsCustom": "Пользовательские плёнки", "films": "Плёнки",
"addFilmTitle": "Добавить плёнку", "filmsInUse": "Используемые плёнки",
"editFilmTitle": "Редактировать плёнку", "filmsCustom": "Пользовательские плёнки",
"filmFormula": "Формула", "addFilmTitle": "Добавить плёнку",
"filmFormulaExponential": "T=t^Rf", "editFilmTitle": "Редактировать плёнку",
"filmFormulaExponentialRf": "Rf", "filmFormula": "Формула",
"filmFormulaExponentialRfPlaceholder": "1.3", "filmFormulaExponential": "T=t^Rf",
"name": "Название", "filmFormulaExponentialRf": "Rf",
"addEquipmentProfileTitle": "Добавить профиль", "filmFormulaExponentialRfPlaceholder": "1.3",
"editEquipmentProfileTitle": "Редактировать профиль" "name": "Название",
} "addEquipmentProfileTitle": "Добавить профиль",
"editEquipmentProfileTitle": "Редактировать профиль"
}

View file

@ -1,155 +1,157 @@
{ {
"@@locale": "zh", "@@locale": "zh",
"fastestExposurePair": "最快曝光组合", "fastestExposurePair": "最快曝光组合",
"slowestExposurePair": "最慢曝光组合", "slowestExposurePair": "最慢曝光组合",
"ev": "EV", "ev": "EV",
"evValue": "{value} EV", "evValue": "{value} EV",
"@evValue": { "@evValue": {
"placeholders": { "placeholders": {
"value": { "value": {
"type": "String" "type": "String"
} }
} }
}, },
"iso": "ISO", "iso": "ISO",
"filmSpeed": "胶片感光度", "filmSpeed": "胶片感光度",
"nd": "ND", "nd": "ND",
"ndFilterFactor": "ND 滤镜系数", "ndFilterFactor": "ND 滤镜系数",
"noExposurePairs": "所选设置没有曝光配对", "noExposurePairs": "所选设置没有曝光配对",
"noCamerasDetected": "您的设备似乎没有连接到任何摄像头", "noCamerasDetected": "您的设备似乎没有连接到任何摄像头",
"noCameraPermission": "未获得摄像头权限", "noCameraPermission": "未获得摄像头权限",
"otherCameraError": "连接摄像头时发生错误", "otherCameraError": "连接摄像头时发生错误",
"none": "无", "none": "无",
"cancel": "取消", "cancel": "取消",
"select": "选择", "select": "选择",
"save": "保存", "save": "保存",
"settings": "设置", "settings": "设置",
"metering": "测量", "metering": "测量",
"fractionalStops": "EV 步进值", "fractionalStops": "EV 步进值",
"showFractionalStops": "显示 EV 步进值", "showFractionalStops": "显示 EV 步进值",
"halfStops": "1/2", "halfStops": "1/2",
"thirdStops": "1/3", "thirdStops": "1/3",
"calibration": "校准", "calibration": "校准",
"calibrationMessage": "此应用测量读数的准确性取决于设备的后置摄像头。如需更精确的测量结果或测量结果存在偏差,请手动校准 EV 。", "calibrationMessage": "此应用测量读数的准确性取决于设备的后置摄像头。如需更精确的测量结果或测量结果存在偏差,请手动校准 EV 。",
"calibrationMessageCameraOnly": "此应用测量读数的准确性取决于设备的后置摄像头。如需更精确的测量结果或测量结果存在偏差,请手动校准 EV 。", "calibrationMessageCameraOnly": "此应用测量读数的准确性取决于设备的后置摄像头。如需更精确的测量结果或测量结果存在偏差,请手动校准 EV 。",
"camera": "摄像头", "camera": "摄像头",
"lightSensor": "光线传感器", "lightSensor": "光线传感器",
"showEv100": "显示 EV\u2081\u2080\u2080", "showEv100": "显示 EV₁₀₀",
"meteringScreenLayout": "布局", "meteringScreenLayout": "布局",
"meteringScreenLayoutHint": "隐藏不需要的元素,让主界面更加整洁", "meteringScreenLayoutHint": "隐藏不需要的元素,让主界面更加整洁",
"meteringScreenLayoutHintEquipmentProfiles": "选择设备配置", "meteringScreenLayoutHintEquipmentProfiles": "选择设备配置",
"meteringScreenFeatureExtremeExposurePairs": "最快 & 最慢曝光组合", "meteringScreenFeatureExtremeExposurePairs": "最快 & 最慢曝光组合",
"meteringScreenFeatureFilmPicker": "胶片选择", "meteringScreenFeatureFilmPicker": "胶片选择",
"cameraFeatures": "相机功能", "cameraFeatures": "相机功能",
"cameraFeatureSpotMetering": "点测光", "cameraFeatureSpotMetering": "点测光",
"cameraFeatureSpotMeteringHint": "长按相机视图可移除测光点", "cameraFeatureSpotMeteringHint": "长按相机视图可移除测光点",
"cameraFeatureHistogram": "直方图", "cameraFeatureHistogram": "直方图",
"cameraFeatureHistogramHint": "启用直方图会增加电池消耗", "cameraFeatureHistogramHint": "启用直方图会增加电池消耗",
"cameraFeaturesShowFocalLength": "显示焦距", "cameraFeaturesShowFocalLength": "显示焦距",
"cameraFeaturesShowFocalLengthHint": "显示 35mm 等效焦距而非变焦倍数", "cameraFeaturesShowFocalLengthHint": "显示 35mm 等效焦距而非变焦倍数",
"film": "胶片", "film": "胶片",
"filmPush": "胶片 (push)", "filmPush": "胶片 (push)",
"filmPull": "胶片 (pull)", "filmPull": "胶片 (pull)",
"filmReciprocityHint": "倒易律失效补偿(对快门速度超过 1 秒的情况进行修正)", "filmReciprocityHint": "倒易律失效补偿(对快门速度超过 1 秒的情况进行修正)",
"equipmentProfileName": "设备配置名称", "equipmentProfileName": "设备配置名称",
"equipmentProfileNameHint": "Praktica MTL5B", "equipmentProfileNameHint": "Praktica MTL5B",
"equipmentProfileAllValues": "全部", "equipmentProfileAllValues": "全部",
"apertureValues": "光圈值", "apertureValues": "光圈值",
"apertureValuesFilterDescription": "选择要显示的光圈值范围。取决于使用的镜头。", "apertureValuesFilterDescription": "选择要显示的光圈值范围。取决于使用的镜头。",
"ndFilters": "ND 滤镜", "ndFilters": "ND 滤镜",
"ndFiltersFilterDescription": "选择要显示的 ND 滤镜系数。取决于使用的 ND 滤镜", "ndFiltersFilterDescription": "选择要显示的 ND 滤镜系数。取决于使用的 ND 滤镜",
"shutterSpeedValues": "快门速度", "shutterSpeedValues": "快门速度",
"shutterSpeedValuesFilterDescription": "选择要显示的快门速度范围。取决于相机机身。", "shutterSpeedValuesFilterDescription": "选择要显示的快门速度范围。取决于相机机身。",
"shutterSpeedManualShort": "B门", "shutterSpeedManualShort": "B门",
"shutterSpeedManual": "手动", "shutterSpeedManual": "手动",
"isoValues": "ISO", "isoValues": "ISO",
"isoValuesFilterDescription": "选择要显示的 ISO 范围。", "isoValuesFilterDescription": "选择要显示的 ISO 范围。",
"lensZoom": "镜头变焦", "lensZoom": "镜头变焦",
"lensZoomDescription": "设置相对于手机摄像头的变焦焦距,使其与相机取景相匹配。", "lensZoomDescription": "设置相对于手机摄像头的变焦焦距,使其与相机取景相匹配。",
"equipmentProfile": "设备配置", "exposureOffset": "曝光补偿",
"equipmentProfiles": "设备配置", "exposureOffsetDescription": "设置曝光补偿,以获得针对所用相机的最准确结果。",
"tapToAdd": "点击添加", "equipmentProfile": "设备配置",
"general": "通用", "equipmentProfiles": "设备配置",
"keepScreenOn": "保持屏幕常亮", "tapToAdd": "点击添加",
"haptics": "震动", "general": "通用",
"autostartTimer": "自动启动定时器", "keepScreenOn": "保持屏幕常亮",
"volumeKeysAction": "音量键快门", "haptics": "震动",
"language": "语言", "autostartTimer": "自动启动定时器",
"chooseLanguage": "选择语言", "volumeKeysAction": "音量键快门",
"theme": "主题", "language": "语言",
"chooseTheme": "选择主题", "chooseLanguage": "选择语言",
"themeLight": "亮色", "theme": "主题",
"themeDark": "暗色", "chooseTheme": "选择主题",
"themeSystemDefault": "跟随系统", "themeLight": "亮色",
"dynamicColor": "动态颜色", "themeDark": "暗色",
"primaryColor": "主题颜色", "themeSystemDefault": "跟随系统",
"choosePrimaryColor": "选择主题颜色", "dynamicColor": "动态颜色",
"about": "关于", "primaryColor": "主题颜色",
"restorePurchases": "恢复购买", "choosePrimaryColor": "选择主题颜色",
"sourceCode": "源代码", "about": "关于",
"reportIssue": "报告问题", "restorePurchases": "恢复购买",
"writeEmail": "Email", "sourceCode": "源代码",
"youDontHaveMailApp": "您没有安装任何邮件App。", "reportIssue": "报告问题",
"copyEmail": "复制电子邮件", "writeEmail": "Email",
"version": "Version", "youDontHaveMailApp": "您没有安装任何邮件App。",
"versionNumber": "{version} ({buildNumber})", "copyEmail": "复制电子邮件",
"@versionNumber": { "version": "Version",
"placeholders": { "versionNumber": "{version} ({buildNumber})",
"version": { "@versionNumber": {
"type": "String" "placeholders": {
}, "version": {
"buildNumber": { "type": "String"
"type": "String" },
} "buildNumber": {
} "type": "String"
}, }
"getPro": "购买专业版", }
"featuresFree": "免费", },
"featuresPro": "专业版", "getPro": "购买专业版",
"proFeaturesPromoText": "Lightmeter Pro 提供您需要的一切,助您拍出最佳照片!", "featuresFree": "免费",
"proFeaturesWhatsIncluded": "Lightmeter Pro 包含哪些内容?", "featuresPro": "专业版",
"featureReflectedLightMetering": "反射光测光", "proFeaturesPromoText": "Lightmeter Pro 提供您需要的一切,助您拍出最佳照片!",
"featureIncidentLightMetering": "入射光测光", "proFeaturesWhatsIncluded": "Lightmeter Pro 包含哪些内容?",
"featureIsoAndNdValues": "更广的 ISO 和 ND 滤镜系数范围", "featureReflectedLightMetering": "反射光测光",
"featureTheme": "主题自定义", "featureIncidentLightMetering": "入射光测光",
"featureSpotMeteringAndHistorgram": "点测光与直方图", "featureIsoAndNdValues": "更广的 ISO 和 ND 滤镜系数范围",
"featureFocalLength35mm": "35mm 等效焦距替代变焦", "featureTheme": "主题自定义",
"featureListOfFilms": "20多种胶片的补偿公式", "featureSpotMeteringAndHistorgram": "点测光与直方图",
"featureCustomFilms": "创建自定义胶片", "featureFocalLength35mm": "35mm 等效焦距替代变焦",
"featureEquipmentProfiles": "设备配置文件", "featureListOfFilms": "20多种胶片的补偿公式",
"featureTimer": "内置长曝光计时器", "featureCustomFilms": "创建自定义胶片",
"featureMeteringScreenLayout": "可自定义的主界面", "featureEquipmentProfiles": "设备配置文件",
"proFeaturesSupportText": "通过购买Lightmeter Pro支持软件的开发让软件持续添加新功能", "featureTimer": "内置长曝光计时器",
"getNowFor": "立即获取 {price}", "featureMeteringScreenLayout": "可自定义的主界面",
"@getNowFor": { "proFeaturesSupportText": "通过购买Lightmeter Pro支持软件的开发让软件持续添加新功能",
"price": { "getNowFor": "立即获取 {price}",
"version": { "@getNowFor": {
"type": "String" "price": {
} "version": {
} "type": "String"
}, }
"tooltipAdd": "添加", }
"tooltipClose": "关闭", },
"tooltipExpand": "展开", "tooltipAdd": "添加",
"tooltipCollapse": "崩溃", "tooltipClose": "关闭",
"tooltipCopy": "复制", "tooltipExpand": "展开",
"tooltipDelete": "删除", "tooltipCollapse": "崩溃",
"tooltipSelectAll": "全选", "tooltipCopy": "复制",
"tooltipDesecelectAll": "取消全选", "tooltipDelete": "删除",
"resetToZero": "重置为零", "tooltipSelectAll": "全选",
"tooltipUseLightSensor": "使用光线传感器", "tooltipDesecelectAll": "取消全选",
"tooltipUseCamera": "使用摄像头", "resetToZero": "重置为零",
"tooltipOpenSettings": "打开设置", "tooltipUseLightSensor": "使用光线传感器",
"exposurePair": "曝光对", "tooltipUseCamera": "使用摄像头",
"films": "Films", "tooltipOpenSettings": "打开设置",
"filmsInUse": "使用的胶片", "exposurePair": "曝光对",
"filmsCustom": "自定义胶片", "films": "Films",
"addFilmTitle": "添加胶片", "filmsInUse": "使用的胶片",
"editFilmTitle": "编辑胶片", "filmsCustom": "自定义胶片",
"filmFormula": "计算公式", "addFilmTitle": "添加胶片",
"filmFormulaExponential": "T=t^Rf", "editFilmTitle": "编辑胶片",
"filmFormulaExponentialRf": "Rf", "filmFormula": "计算公式",
"filmFormulaExponentialRfPlaceholder": "1.3", "filmFormulaExponential": "T=t^Rf",
"addEquipmentProfileTitle": "添加设备", "filmFormulaExponentialRf": "Rf",
"editEquipmentProfileTitle": "编辑设备" "filmFormulaExponentialRfPlaceholder": "1.3",
} "addEquipmentProfileTitle": "添加设备",
"editEquipmentProfileTitle": "编辑设备"
}

View file

@ -73,13 +73,13 @@ class EquipmentProfilesProviderState extends State<EquipmentProfilesProvider> {
final oldProfile = _customProfiles[profile.id]!.value; final oldProfile = _customProfiles[profile.id]!.value;
await widget.storageService.updateProfile( await widget.storageService.updateProfile(
id: profile.id, id: profile.id,
name: oldProfile.name != profile.name ? profile.name : null, name: oldProfile.name.changedOrNull(profile.name),
apertureValues: oldProfile.apertureValues != profile.apertureValues ? profile.apertureValues : null, apertureValues: oldProfile.apertureValues.changedOrNull(profile.apertureValues),
shutterSpeedValues: shutterSpeedValues: oldProfile.shutterSpeedValues.changedOrNull(profile.shutterSpeedValues),
oldProfile.shutterSpeedValues != profile.shutterSpeedValues ? profile.shutterSpeedValues : null, isoValues: oldProfile.isoValues.changedOrNull(profile.isoValues),
isoValues: oldProfile.isoValues != profile.isoValues ? profile.isoValues : null, ndValues: oldProfile.ndValues.changedOrNull(profile.ndValues),
ndValues: oldProfile.ndValues != profile.ndValues ? profile.ndValues : null, lensZoom: oldProfile.lensZoom.changedOrNull(profile.lensZoom),
lensZoom: oldProfile.lensZoom != profile.lensZoom ? profile.lensZoom : null, exposureOffset: oldProfile.exposureOffset.changedOrNull(profile.exposureOffset),
); );
_customProfiles[profile.id] = (value: profile, isUsed: _customProfiles[profile.id]!.isUsed); _customProfiles[profile.id] = (value: profile, isUsed: _customProfiles[profile.id]!.isUsed);
setState(() {}); setState(() {});
@ -183,3 +183,9 @@ class EquipmentProfiles extends InheritedModel<_EquipmentProfilesModelAspect> {
const DeepCollectionEquality().equals(oldWidget.profiles, profiles)); const DeepCollectionEquality().equals(oldWidget.profiles, profiles));
} }
} }
extension on Object {
T? changedOrNull<T>(T newValue) {
return this != newValue ? newValue : null;
}
}

View file

@ -42,6 +42,7 @@ class EquipmentProfileEditBloc extends Bloc<EquipmentProfileEditEvent, Equipment
isoValues: profile.isoValues, isoValues: profile.isoValues,
ndValues: profile.ndValues, ndValues: profile.ndValues,
lensZoom: profile.lensZoom, lensZoom: profile.lensZoom,
exposureOffset: profile.exposureOffset,
canSave: false, canSave: false,
), ),
) { ) {
@ -60,6 +61,8 @@ class EquipmentProfileEditBloc extends Bloc<EquipmentProfileEditEvent, Equipment
await _onNdValuesChanged(e, emit); await _onNdValuesChanged(e, emit);
case final EquipmentProfileLensZoomChangedEvent e: case final EquipmentProfileLensZoomChangedEvent e:
await _onLensZoomChanged(e, emit); await _onLensZoomChanged(e, emit);
case final EquipmentProfileExposureOffsetChangedEvent e:
await _onExposureOffsetChanged(e, emit);
case EquipmentProfileSaveEvent(): case EquipmentProfileSaveEvent():
await _onSave(event, emit); await _onSave(event, emit);
case EquipmentProfileCopyEvent(): case EquipmentProfileCopyEvent():
@ -131,6 +134,16 @@ class EquipmentProfileEditBloc extends Bloc<EquipmentProfileEditEvent, Equipment
); );
} }
Future<void> _onExposureOffsetChanged(EquipmentProfileExposureOffsetChangedEvent event, Emitter emit) async {
_newEquipmentProfile = _newEquipmentProfile.copyWith(exposureOffset: event.exposureOffset);
emit(
state.copyWith(
exposureOffset: event.exposureOffset,
canSave: _canSave(state.name, event.exposureOffset),
),
);
}
Future<void> _onSave(EquipmentProfileSaveEvent _, Emitter emit) async { Future<void> _onSave(EquipmentProfileSaveEvent _, Emitter emit) async {
emit(state.copyWith(isLoading: true)); emit(state.copyWith(isLoading: true));
if (_isEdit) { if (_isEdit) {
@ -143,6 +156,7 @@ class EquipmentProfileEditBloc extends Bloc<EquipmentProfileEditEvent, Equipment
shutterSpeedValues: state.shutterSpeedValues, shutterSpeedValues: state.shutterSpeedValues,
isoValues: state.isoValues, isoValues: state.isoValues,
lensZoom: state.lensZoom, lensZoom: state.lensZoom,
exposureOffset: state.exposureOffset,
), ),
); );
} else { } else {
@ -155,6 +169,7 @@ class EquipmentProfileEditBloc extends Bloc<EquipmentProfileEditEvent, Equipment
shutterSpeedValues: state.shutterSpeedValues, shutterSpeedValues: state.shutterSpeedValues,
isoValues: state.isoValues, isoValues: state.isoValues,
lensZoom: state.lensZoom, lensZoom: state.lensZoom,
exposureOffset: state.exposureOffset,
), ),
); );
} }
@ -173,6 +188,6 @@ class EquipmentProfileEditBloc extends Bloc<EquipmentProfileEditEvent, Equipment
} }
bool _canSave(String name, double? lensZoom) { bool _canSave(String name, double? lensZoom) {
return name.isNotEmpty && lensZoom != null && _newEquipmentProfile != _originalEquipmentProfile; return name.isNotEmpty && _newEquipmentProfile != _originalEquipmentProfile;
} }
} }

View file

@ -40,6 +40,12 @@ class EquipmentProfileLensZoomChangedEvent extends EquipmentProfileEditEvent {
const EquipmentProfileLensZoomChangedEvent(this.lensZoom); const EquipmentProfileLensZoomChangedEvent(this.lensZoom);
} }
class EquipmentProfileExposureOffsetChangedEvent extends EquipmentProfileEditEvent {
final double exposureOffset;
const EquipmentProfileExposureOffsetChangedEvent(this.exposureOffset);
}
class EquipmentProfileSaveEvent extends EquipmentProfileEditEvent { class EquipmentProfileSaveEvent extends EquipmentProfileEditEvent {
const EquipmentProfileSaveEvent(); const EquipmentProfileSaveEvent();
} }

View file

@ -10,9 +10,11 @@ import 'package:lightmeter/screens/equipment_profile_edit/components/slider_pick
import 'package:lightmeter/screens/equipment_profile_edit/event_equipment_profile_edit.dart'; import 'package:lightmeter/screens/equipment_profile_edit/event_equipment_profile_edit.dart';
import 'package:lightmeter/screens/equipment_profile_edit/flow_equipment_profile_edit.dart'; import 'package:lightmeter/screens/equipment_profile_edit/flow_equipment_profile_edit.dart';
import 'package:lightmeter/screens/equipment_profile_edit/state_equipment_profile_edit.dart'; import 'package:lightmeter/screens/equipment_profile_edit/state_equipment_profile_edit.dart';
import 'package:lightmeter/screens/metering/components/camera_container/bloc_container_camera.dart';
import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart'; import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart';
import 'package:lightmeter/screens/shared/text_field/widget_text_field.dart'; import 'package:lightmeter/screens/shared/text_field/widget_text_field.dart';
import 'package:lightmeter/utils/double_to_zoom.dart'; import 'package:lightmeter/utils/double_to_zoom.dart';
import 'package:lightmeter/utils/to_string_signed.dart';
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
class EquipmentProfileEditScreen extends StatefulWidget { class EquipmentProfileEditScreen extends StatefulWidget {
@ -108,6 +110,7 @@ class _EquipmentProfileEditScreenState extends State<EquipmentProfileEditScreen>
_ApertureValuesListTileBuilder(), _ApertureValuesListTileBuilder(),
_ShutterSpeedValuesListTileBuilder(), _ShutterSpeedValuesListTileBuilder(),
_LensZoomListTileBuilder(), _LensZoomListTileBuilder(),
_ExposureOffsetListTileBuilder(),
], ],
), ),
), ),
@ -246,7 +249,7 @@ class _LensZoomListTileBuilder extends StatelessWidget {
title: S.of(context).lensZoom, title: S.of(context).lensZoom,
description: S.of(context).lensZoomDescription, description: S.of(context).lensZoomDescription,
value: state.lensZoom, value: state.lensZoom,
range: const RangeValues(1, 7), range: CameraContainerBloc.zoomMaxRange,
valueAdapter: (context, value) => value.toZoom(context), valueAdapter: (context, value) => value.toZoom(context),
onChanged: (value) { onChanged: (value) {
context.read<EquipmentProfileEditBloc>().add(EquipmentProfileLensZoomChangedEvent(value)); context.read<EquipmentProfileEditBloc>().add(EquipmentProfileLensZoomChangedEvent(value));
@ -255,3 +258,24 @@ class _LensZoomListTileBuilder extends StatelessWidget {
); );
} }
} }
class _ExposureOffsetListTileBuilder extends StatelessWidget {
const _ExposureOffsetListTileBuilder();
@override
Widget build(BuildContext context) {
return BlocBuilder<EquipmentProfileEditBloc, EquipmentProfileEditState>(
builder: (context, state) => SliderPickerListTile(
icon: Icons.light_mode_outlined,
title: S.of(context).exposureOffset,
description: S.of(context).exposureOffsetDescription,
value: state.exposureOffset,
range: CameraContainerBloc.exposureMaxRange,
valueAdapter: (context, value) => S.of(context).evValue(value.toStringSignedAsFixed(1)),
onChanged: (value) {
context.read<EquipmentProfileEditBloc>().add(EquipmentProfileExposureOffsetChangedEvent(value));
},
),
);
}
}

View file

@ -7,6 +7,7 @@ class EquipmentProfileEditState {
final List<ShutterSpeedValue> shutterSpeedValues; final List<ShutterSpeedValue> shutterSpeedValues;
final List<IsoValue> isoValues; final List<IsoValue> isoValues;
final double lensZoom; final double lensZoom;
final double exposureOffset;
final bool canSave; final bool canSave;
final bool isLoading; final bool isLoading;
final EquipmentProfile? profileToCopy; final EquipmentProfile? profileToCopy;
@ -18,6 +19,7 @@ class EquipmentProfileEditState {
required this.shutterSpeedValues, required this.shutterSpeedValues,
required this.isoValues, required this.isoValues,
required this.lensZoom, required this.lensZoom,
required this.exposureOffset,
required this.canSave, required this.canSave,
this.isLoading = false, this.isLoading = false,
this.profileToCopy, this.profileToCopy,
@ -30,6 +32,7 @@ class EquipmentProfileEditState {
List<ShutterSpeedValue>? shutterSpeedValues, List<ShutterSpeedValue>? shutterSpeedValues,
List<IsoValue>? isoValues, List<IsoValue>? isoValues,
double? lensZoom, double? lensZoom,
double? exposureOffset,
bool? canSave, bool? canSave,
bool? isLoading, bool? isLoading,
EquipmentProfile? profileToCopy, EquipmentProfile? profileToCopy,
@ -41,6 +44,7 @@ class EquipmentProfileEditState {
shutterSpeedValues: shutterSpeedValues ?? this.shutterSpeedValues, shutterSpeedValues: shutterSpeedValues ?? this.shutterSpeedValues,
isoValues: isoValues ?? this.isoValues, isoValues: isoValues ?? this.isoValues,
lensZoom: lensZoom ?? this.lensZoom, lensZoom: lensZoom ?? this.lensZoom,
exposureOffset: exposureOffset ?? this.exposureOffset,
canSave: canSave ?? this.canSave, canSave: canSave ?? this.canSave,
isLoading: isLoading ?? this.isLoading, isLoading: isLoading ?? this.isLoading,
profileToCopy: profileToCopy ?? this.profileToCopy, profileToCopy: profileToCopy ?? this.profileToCopy,

View file

@ -30,11 +30,11 @@ class CameraContainerBloc extends EvSourceBlocBase<CameraContainerEvent, CameraC
CameraDescription? _camera; CameraDescription? _camera;
CameraController? _cameraController; CameraController? _cameraController;
static const _maxZoom = 7.0; static const zoomMaxRange = RangeValues(1, 7);
RangeValues? _zoomRange; RangeValues? _zoomRange;
double _currentZoom = 1.0; double _currentZoom = 1.0;
static const _exposureMaxRange = RangeValues(-4, 4); static const exposureMaxRange = RangeValues(-4, 4);
RangeValues? _exposureOffsetRange; RangeValues? _exposureOffsetRange;
double _exposureStep = 0.1; double _exposureStep = 0.1;
double _currentExposureOffset = 0.0; double _currentExposureOffset = 0.0;
@ -90,8 +90,10 @@ class CameraContainerBloc extends EvSourceBlocBase<CameraContainerEvent, CameraC
case final communication_states.EquipmentProfileChangedState communicationState: case final communication_states.EquipmentProfileChangedState communicationState:
if (state is CameraActiveState) { if (state is CameraActiveState) {
add(ZoomChangedEvent(communicationState.profile.lensZoom)); add(ZoomChangedEvent(communicationState.profile.lensZoom));
add(ExposureOffsetChangedEvent(communicationState.profile.exposureOffset));
} else { } else {
_currentZoom = communicationState.profile.lensZoom; _currentZoom = communicationState.profile.lensZoom;
_currentExposureOffset = communicationState.profile.exposureOffset;
} }
case communication_states.SettingsOpenedState(): case communication_states.SettingsOpenedState():
_settingsOpened = true; _settingsOpened = true;
@ -153,8 +155,8 @@ class CameraContainerBloc extends EvSourceBlocBase<CameraContainerEvent, CameraC
cameraController.getExposureOffsetStepSize(), cameraController.getExposureOffsetStepSize(),
]).then((value) { ]).then((value) {
_exposureOffsetRange = RangeValues( _exposureOffsetRange = RangeValues(
math.max(_exposureMaxRange.start, value[0]), math.max(exposureMaxRange.start, value[0]),
math.min(_exposureMaxRange.end, value[1]), math.min(exposureMaxRange.end, value[1]),
); );
_currentExposureOffset = 0.0; _currentExposureOffset = 0.0;
_exposureStep = value[2] == 0 ? 0.1 : value[2]; _exposureStep = value[2] == 0 ? 0.1 : value[2];
@ -168,7 +170,7 @@ class CameraContainerBloc extends EvSourceBlocBase<CameraContainerEvent, CameraC
]).then((value) { ]).then((value) {
_zoomRange = RangeValues( _zoomRange = RangeValues(
math.max(1.0, value[0]), math.max(1.0, value[0]),
math.min(_maxZoom, value[1]), math.min(zoomMaxRange.end, value[1]),
); );
if (_currentZoom < _zoomRange!.start || _currentZoom > _zoomRange!.end) { if (_currentZoom < _zoomRange!.start || _currentZoom > _zoomRange!.end) {
_currentZoom = _zoomRange!.start; _currentZoom = _zoomRange!.start;

View file

@ -21,7 +21,7 @@ class ZoomSlider extends StatelessWidget {
range: range, range: range,
value: value, value: value,
onChanged: onChanged, onChanged: onChanged,
icon: Icons.search_outlined, icon: Icons.zoom_in_outlined,
defaultValue: EquipmentProfiles.selectedOf(context).lensZoom, defaultValue: EquipmentProfiles.selectedOf(context).lensZoom,
rulerValueAdapter: (value) => value.toStringAsFixed(0), rulerValueAdapter: (value) => value.toStringAsFixed(0),
valueAdapter: (value) => value.toZoom(context), valueAdapter: (value) => value.toZoom(context),

View file

@ -829,20 +829,20 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
path: "." path: "."
ref: "v2.1.3" ref: "v2.2.0"
resolved-ref: "4575586ff6114b780ca651b7ac7c272a4a4801eb" resolved-ref: f8a0ab311a696b53d7172412922ce5c69b68fd4e
url: "https://github.com/vodemn/m3_lightmeter_iap" url: "https://github.com/vodemn/m3_lightmeter_iap"
source: git source: git
version: "2.1.3+30" version: "2.2.0+31"
m3_lightmeter_resources: m3_lightmeter_resources:
dependency: "direct main" dependency: "direct main"
description: description:
path: "." path: "."
ref: "v2.1.0" ref: "v2.2.0"
resolved-ref: "0e6eefe534adce851df639dcd28463a9089e5b92" resolved-ref: a337627f92989d20ba9173f747255fa25262ca4e
url: "https://github.com/vodemn/m3_lightmeter_resources" url: "https://github.com/vodemn/m3_lightmeter_resources"
source: git source: git
version: "2.1.0+9" version: "2.2.0+10"
macros: macros:
dependency: transitive dependency: transitive
description: description:

View file

@ -32,11 +32,11 @@ dependencies:
m3_lightmeter_iap: m3_lightmeter_iap:
git: git:
url: "https://github.com/vodemn/m3_lightmeter_iap" url: "https://github.com/vodemn/m3_lightmeter_iap"
ref: v2.1.3 ref: v2.2.0
m3_lightmeter_resources: m3_lightmeter_resources:
git: git:
url: "https://github.com/vodemn/m3_lightmeter_resources" url: "https://github.com/vodemn/m3_lightmeter_resources"
ref: v2.1.0 ref: v2.2.0
material_color_utilities: 0.12.0 material_color_utilities: 0.12.0
package_info_plus: 8.1.3 package_info_plus: 8.1.3
permission_handler: 11.3.1 permission_handler: 11.3.1

View file

@ -1,6 +1,6 @@
defaults -currentHost write -g AppleFontSmoothing -int 0 defaults -currentHost write -g AppleFontSmoothing -int 0
goldens=$(find ./test -name "*_golden_test.dart" -print) goldens=$(find ./test -name "*_golden_test.dart" -print)
for f in $goldens; do for f in $goldens; do
flutter test "$f" --dart-define cameraStubImage=assets/camera_stub_image.jpg --update-goldens fvm flutter test "$f" --dart-define cameraStubImage=assets/camera_stub_image.jpg --update-goldens
done done
defaults -currentHost write -g AppleFontSmoothing -int 3 defaults -currentHost write -g AppleFontSmoothing -int 3

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

After

Width:  |  Height:  |  Size: 1.5 MiB