From 394e83523b3821e5be0d7b3e2fbde788903391e9 Mon Sep 17 00:00:00 2001 From: Dan Fandrich Date: Tue, 24 Dec 2024 10:58:34 -0800 Subject: [PATCH] Use time zone tag from photo when available If a time zone is found in an image, use that in preference to an automatically-determined time zone. If a manually-specified time zone is given, that takes precedence over all. Only the German translations are fully updated. Fixes #24 --- .github/workflows/ci.yml | 30 +-- INSTALL | 2 + README.md | 3 + RELEASES | 1 + correlate.c | 29 ++- correlate.h | 5 +- doc/gpscorrelate-manpage.xml.in | 106 +++++++--- doc/gui.html | 2 + exif-gps.cpp | 25 ++- exif-gps.h | 8 +- gpx-read.c | 4 +- gui.c | 26 ++- main-command.c | 58 ++++-- po/de.po | 333 ++++++++++++++++--------------- po/fr.po | 335 +++++++++++++++++--------------- po/ru.po | 331 ++++++++++++++++--------------- tests/data/test186.param | 6 + tests/data/test186.result | 37 ++++ tests/data/test187.param | 6 + tests/data/test187.result | 11 ++ tests/data/test188.param | 6 + tests/data/test188.result | 36 ++++ tests/data/test189.param | 5 + tests/data/test189.result | 36 ++++ tests/data/test190.param | 7 + tests/data/test190.result | 65 +++++++ tests/data/test191.param | 7 + tests/data/test191.result | 63 ++++++ tests/data/test192.param | 7 + tests/data/test192.result | 63 ++++++ tests/data/test193.param | 7 + tests/data/test193.result | 63 ++++++ tests/data/test194.param | 6 + tests/data/test194.result | 24 +++ tests/data/test195.param | 10 + tests/data/test195.result | 25 +++ tests/staging/point1-6.jpg | Bin 0 -> 1151 bytes tests/staging/point1-7.jpg | Bin 0 -> 1151 bytes tests/staging/point1-8.jpg | Bin 0 -> 1149 bytes tests/staging/withtz.jpg | Bin 0 -> 1389 bytes unixtime.c | 7 +- unixtime.h | 2 +- 42 files changed, 1242 insertions(+), 555 deletions(-) create mode 100644 tests/data/test186.param create mode 100644 tests/data/test186.result create mode 100644 tests/data/test187.param create mode 100644 tests/data/test187.result create mode 100644 tests/data/test188.param create mode 100644 tests/data/test188.result create mode 100644 tests/data/test189.param create mode 100644 tests/data/test189.result create mode 100644 tests/data/test190.param create mode 100644 tests/data/test190.result create mode 100644 tests/data/test191.param create mode 100644 tests/data/test191.result create mode 100644 tests/data/test192.param create mode 100644 tests/data/test192.result create mode 100644 tests/data/test193.param create mode 100644 tests/data/test193.result create mode 100644 tests/data/test194.param create mode 100644 tests/data/test194.result create mode 100644 tests/data/test195.param create mode 100644 tests/data/test195.result create mode 100644 tests/staging/point1-6.jpg create mode 100644 tests/staging/point1-7.jpg create mode 100644 tests/staging/point1-8.jpg create mode 100644 tests/staging/withtz.jpg diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2f10117..f6b65ef 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -152,7 +152,7 @@ jobs: cxx: g++ target: gpscorrelate install_target: install - valgrind: yes + check_options: -m - name: 'locale tests' cc: gcc gtk: 3 @@ -173,7 +173,6 @@ jobs: cxxflags: -std=c++11 -D_POSIX_C_SOURCE=200809L -Wall -Wextra -Werror -Wno-error=deprecated-declarations -O3 -DENABLE_NLS=1 target: all install_target: install install-po install-desktop-file - osver: 20.04 exclude: # Exclude configurations intended for a single OS version - osver: 22.04 @@ -194,16 +193,19 @@ jobs: run: env ASAN_OPTIONS="${{ matrix.build.asan_options }}" ./gpscorrelate -V - name: 'test' run: | - if [[ -z "${{ matrix.build.failing_tests }}" ]] ; then - make check CHECK_OPTIONS=-v ASAN_OPTIONS="${{ matrix.build.asan_options }}" + if [[ "${{ matrix.osver }}" == "20.04" ]]; then + # Ubuntu 20.04 has an old version of exiv2 that doesn't support + # time zone tags, so those 8 tests are expected to fail + FAILING_TESTS="$((8 + ${{ matrix.build.failing_tests || '0'}}))" else - # Debug logging enabled makes some tests fail due to differing output - echo 'Expecting ${{ matrix.build.failing_tests }} test failures' - make check CHECK_OPTIONS=-v | tee /dev/stderr | grep -q '${{ matrix.build.failing_tests }} test(s) have FAILED' + FAILING_TESTS="${{ matrix.build.failing_tests }}" + fi + if [[ -z "$FAILING_TESTS" ]] ; then + make check CHECK_OPTIONS="-v ${{ matrix.build.check_options }}" ASAN_OPTIONS="${{ matrix.build.asan_options }}" + else + echo "Expecting $FAILING_TESTS test failures" + make check CHECK_OPTIONS="-v ${{ matrix.build.check_options }}" | tee /dev/stderr | grep -Fq "$FAILING_TESTS test(s) have FAILED" fi - - if: matrix.build.valgrind == 'yes' - name: 'valgrind test' - run: make check CHECK_OPTIONS='-v -m' - if: matrix.build.locale name: 'locale test' env: @@ -220,7 +222,13 @@ jobs: LC_SOURCED: ${{ matrix.build.locale }} LC_TELEPHONE: ${{ matrix.build.locale }} LC_TIME: ${{ matrix.build.locale }} - run: make check CHECK_OPTIONS='-v' + run: | + if [[ -z "$FAILING_TESTS" ]] ; then + make check CHECK_OPTIONS=-v ASAN_OPTIONS="${{ matrix.build.asan_options }}" + else + echo "Expecting $FAILING_TESTS test failures" + make check CHECK_OPTIONS=-v | tee /dev/stderr | grep -Fq "$FAILING_TESTS test(s) have FAILED" + fi - name: 'install test' run: make prefix= DESTDIR="${PWD}" ${{ matrix.build.install_target }} diff --git a/INSTALL b/INSTALL index 739575a..38dc64a 100644 --- a/INSTALL +++ b/INSTALL @@ -3,6 +3,7 @@ Installation of GPS Correlate To build, you will need these prerequisites: * The Exiv2 library (C++ EXIF tag handling): https://www.exiv2.org/ + (ver. 0.27.4 or newer is required for time zone tag support) * libxml2 (XML parsing): http://www.xmlsoft.org/ * pkgconfig: https://pkg-config.freedesktop.org/ * make, such as GNU makes: https://www.gnu.org/software/make/make.html @@ -12,6 +13,7 @@ To build, you will need these prerequisites: https://docbook.sourceforge.net/ or an OS package (often named something like docbook-xsl or docbook-style-xsl) * intltool (only for rebuilding the AppStream metadata file) +* exiv2 CLI (only for running the test suite) You can build the command line version and the GUI together simply with: make diff --git a/README.md b/README.md index 09c189e..7ca3a94 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,9 @@ version of the program. * The resolution of GPX positions is down to one second, but sub-second photo time is used (when available in the photo) to more accurately estimate the camera position between those points. +* A time zone tag embedded in the photo is used to determine the local time of + the image when found, otherwise the time zone is assumed to be same as the + local machine. * For best results, you should synchronise your camera to the GPS time before you start taking photos. Note: digital cameras clocks drift quickly - even over a short period of time (say, a week). diff --git a/RELEASES b/RELEASES index a972dae..84273a7 100644 --- a/RELEASES +++ b/RELEASES @@ -5,6 +5,7 @@ v2.x: X - When interpolation is disabled, round up when exactly half way - Allow fractional times in --photooffset - Fix handling of --timeadd values between -1:00 and 0:00 + - Read time zone from photos when available or --no-photo-tz to disable v2.2: 17 October 2024 - Fix metainfo nits diff --git a/correlate.c b/correlate.c index 4c08a31..59626f0 100644 --- a/correlate.c +++ b/correlate.c @@ -65,7 +65,7 @@ void SetAutoTimeZoneOptions(const char *Time, /* PhotoTime isn't a true epoch time, but is rather out * by the local offset from UTC */ struct timespec PhotoTime = - ConvertToUnixTime(Time, EXIF_DATE_FORMAT, 0, 0); + ConvertToUnixTime(Time, EXIF_DATE_FORMAT, 0); /* Extract the component time values */ struct tm *PhotoTm = gmtime(&PhotoTime.tv_sec); @@ -82,11 +82,18 @@ void SetAutoTimeZoneOptions(const char *Time, /* Convert a time into Unixtime with the configured time zone conversion. */ struct timespec ConvertTimeToUnixTime(const char *Time, const char *TimeFormat, - const struct CorrelateOptions* Options) + long OffsetTime, long *UsedOffset, const struct CorrelateOptions* Options) { - struct timespec PhotoTime = - ConvertToUnixTime(Time, TimeFormat, - Options->TimeZoneHours, Options->TimeZoneMins); + long TZOffset; + if (Options->TimeZoneFromPhoto && OffsetTime != NO_OFFSET_TIME) + /* Use the photo's time zone */ + TZOffset = OffsetTime; + else + /* Use the automatic or manually-specified time zone */ + TZOffset = Options->TimeZoneHours * 3600 + Options->TimeZoneMins * 60; + if (UsedOffset) + *UsedOffset = TZOffset; + struct timespec PhotoTime = ConvertToUnixTime(Time, TimeFormat, TZOffset); /* Add the PhotoOffset time. This is to make the Photo time match * the GPS time - i.e., it is (GPS - Photo). */ @@ -112,11 +119,14 @@ struct timespec ConvertTimeToUnixTime(const char *Time, const char *TimeFormat, * the files - ie, just correlate and keep into memory... */ struct GPSPoint* CorrelatePhoto(const char* Filename, - struct CorrelateOptions* Options) + long *UsedOffset, struct CorrelateOptions* Options) { + *UsedOffset = NO_OFFSET_TIME; /* Read out the timestamp from the EXIF data. */ int IncludesGPS = 0; - char* TimeTemp = ReadExifData(Filename, &IncludesGPS, NULL, NULL, NULL); + long OffsetTime = 0; + char* TimeTemp = ReadExifData(Filename, &IncludesGPS, NULL, NULL, NULL, + &OffsetTime); if (!TimeTemp) { /* Error reading the time from the file. Abort. */ @@ -141,10 +151,11 @@ struct GPSPoint* CorrelatePhoto(const char* Filename, SetAutoTimeZoneOptions(TimeTemp, Options); Options->AutoTimeZone = 0; } - //printf("Using offset %02d:%02d\n", Options->TimeZoneHours, Options->TimeZoneMins); + //printf("Using offset %ld sec.\n", OffsetTime); /* Now convert the time into Unixtime with the configured time zone conversion. */ - struct timespec PhotoTime = ConvertTimeToUnixTime(TimeTemp, EXIF_DATE_FORMAT, Options); + struct timespec PhotoTime = ConvertTimeToUnixTime(TimeTemp, EXIF_DATE_FORMAT, OffsetTime, + UsedOffset, Options); /* Free the memory for the time string - it won't otherwise * be freed for us. */ diff --git a/correlate.h b/correlate.h index 880d70a..bb966d4 100644 --- a/correlate.h +++ b/correlate.h @@ -36,6 +36,7 @@ struct CorrelateOptions { int TimeZoneHours; /* To add to photos to make them UTC. */ int TimeZoneMins; int AutoTimeZone; + int TimeZoneFromPhoto; int FeatherTime; int WriteHeading; int HeadingOffset; @@ -81,8 +82,8 @@ struct CorrelateOptions { struct GPSPoint* CorrelatePhoto(const char* Filename, - struct CorrelateOptions* Options); + long *UsedOffset, struct CorrelateOptions* Options); void SetAutoTimeZoneOptions(const char *TimeTemp, struct CorrelateOptions* Options); struct timespec ConvertTimeToUnixTime(const char *TimeTemp, const char *TimeFormat, - const struct CorrelateOptions* Options); + long OffsetTime, long *UsedOffset, const struct CorrelateOptions* Options); diff --git a/doc/gpscorrelate-manpage.xml.in b/doc/gpscorrelate-manpage.xml.in index 54ef111..d2c2849 100644 --- a/doc/gpscorrelate-manpage.xml.in +++ b/doc/gpscorrelate-manpage.xml.in @@ -49,13 +49,32 @@ &dhpackage; + + + -g file.gpx + + + + + -l + --latlong + latitude,longitude,elevation + + + + + -z - - --timeadd +/-HH[:MM] + --timeadd + +/-HH[:MM] + + --no-photo-tz + + -O @@ -125,20 +144,6 @@ --degmins - - - -g file.gpx - - - - - -l - --latlong - - latitude,longitude,elevation - - - image.jpg @@ -146,17 +151,43 @@ &dhpackage; - + -s --show - -x - --show-gpx -o --machine image.jpg + + + &dhpackage; + + -x + --show-gpx + + + + -z + + --timeadd +/-HH[:MM] + + + + + --no-photo-tz + + + + -O + + --photooffset seconds + + + image.jpg + + &dhpackage; @@ -282,7 +313,8 @@ Only show the GPS data already in the given image's EXIF tags - instead of correlating them. + instead of correlating them. The time shown comes directly from + the image without adjustments. @@ -312,7 +344,8 @@ Only show the GPS data of the given images in a - machine-readable CSV format. Images without GPS tags are + machine-readable CSV format. The time shown comes directly from the + image without adjustments. Images without GPS tags are ignored. The fields output are file name, date and time, latitude, longitude, elevation, where the first value is the filename, as passed, the second is the timestamp, and the last three are floating @@ -345,9 +378,28 @@ in local time. Enter the timezone used when taking the images; e.g., +8 for Perth, Western Australia or -2:30 for St. John's, Newfoundland. - This defaults to the UTC offset of the local time zone as of the - time of the first image processed (versions before 1.7 defaulted to - 00:00). + This defaults to the time zone embedded in the image, or if that is not + available (or when --no-photo-tz is given), the + UTC offset of the local time zone as of the time of the first image + processed (versions before 1.7 defaulted to 00:00). + + + + + + + + + + Ignore any OffsetTimeOriginal EXIF tags in + photos that specify the time zone in which the photo was taken. + If the tag is wrong, such as if the user forgot to update the time + zone manually when travelling, then this will prevent it from being + used. If this option is given, then gpscorrelate + reverts to using automatic time zone detection for the photo, or + a manually-specified one (if --timeadd is + given). + @@ -681,10 +733,10 @@ Correlate a photo taken from a camera with a fast clock (i.e., the clock - was 77.5 seconds ahead of GPS time): - + was 77.5 seconds ahead of GPS time) and with incorrectly-specified time zone + tags: - gpscorrelate -g Test.gpx -O -77.5 photo.jpg + gpscorrelate -g Test.gpx -O -77.5 --no-photo-tz photo.jpg diff --git a/doc/gui.html b/doc/gui.html index 5afbd44..d64f905 100644 --- a/doc/gui.html +++ b/doc/gui.html @@ -42,6 +42,8 @@

Step 3: Set options

The "Auto time zone" checkbox, if checked, will choose an appropriate value for "Time Zone", based on the local time zone and the time of the first photo in the list to be correlated.

+

The "Use photo time zone" checkbox, if checked, will use each photo's time zone tag to determine the local time of the image. If this tag is not available, the regular "Auto time zone" behaviour will take effect.

+

The "Write heading" checkbox, if checked, will write tags into the picture indicating the direction of movement at the time the picture was taken, when these data are available in the GPX file. These tags are not written during times of rapid turning, determined by the Max heading change setting.

The "Write camera direction" checkbox, if checked, will write tags into the picture indicating the direction that the camera was facing at the time the picture was taken. This is determined by adding the Camera direction value to the heading written in Write heading.

diff --git a/exif-gps.cpp b/exif-gps.cpp index 080d23d..5f58892 100644 --- a/exif-gps.cpp +++ b/exif-gps.cpp @@ -85,7 +85,7 @@ int main(int argc, char* argv[]) printf("Done write, now reading...\n"); int GPS = 0; - char* Ret = ReadExifData(argv[1], &GPS, NULL, NULL, NULL); + char* Ret = ReadExifData(argv[1], &GPS, NULL, NULL, NULL, NULL); if (Ret) { printf("Date: %s.\n", Ret); @@ -103,7 +103,8 @@ int main(int argc, char* argv[]) }; */ -char* ReadExifData(const char* File, int* IncludesGPS, double* Lat, double* Long, double* Elev) +char* ReadExifData(const char* File, int* IncludesGPS, double* Lat, double* Long, double* Elev, + long *OffsetTime) { *IncludesGPS = 0; @@ -155,6 +156,26 @@ char* ReadExifData(const char* File, int* IncludesGPS, double* Lat, double* Long // Copy the tag and return that. char* DateTime = strdup(Value.c_str()); + // Look for time offset + if (OffsetTime) { +#if EXIV2_TEST_VERSION(0, 27, 4) + Exiv2::Exifdatum& OffsetTimeTag = ExifRead["Exif.Photo.OffsetTimeOriginal"]; + std::string OffsetTimeValue = OffsetTimeTag.toString(); + if (OffsetTimeValue.length() == 6) { + /* Split into hours, minutes with the same sign for both. */ + int OffsetHours, OffsetMins; + if (sscanf(OffsetTimeValue.c_str(), "%d:%d", &OffsetHours, &OffsetMins) == 2) { + /* Can't look at sign of hours because it might be -0 */ + if (OffsetTimeValue[0] == '-') + OffsetMins *= -1; + *OffsetTime = OffsetHours * 3600 + OffsetMins * 60; + } else + *OffsetTime = NO_OFFSET_TIME; + } else +#endif + *OffsetTime = NO_OFFSET_TIME; + } + // Check if we have GPS tags. Exiv2::Exifdatum GPSData = ExifRead["Exif.GPSInfo.GPSVersionID"]; diff --git a/exif-gps.h b/exif-gps.h index 0dd96d2..cea2290 100644 --- a/exif-gps.h +++ b/exif-gps.h @@ -30,7 +30,13 @@ extern "C" { #endif -char* ReadExifData(const char* File, int* IncludesGPS, double* Lat, double* Long, double* Elevation); +#include + +// No offset time tag was found in photo +#define NO_OFFSET_TIME INT_MIN + +char* ReadExifData(const char* File, int* IncludesGPS, double* Lat, double* Long, double* Elevation, + long *OffsetTime); char* ReadGPSTimestamp(const char* File, char* DateStamp, char* TimeStamp, int* IncludesGPS); int WriteGPSData(const char* File, const struct GPSPoint* Point, const char* Datum, int NoChangeMtime, int DegMinSecs); diff --git a/gpx-read.c b/gpx-read.c index 5f9ba52..258804b 100644 --- a/gpx-read.c +++ b/gpx-read.c @@ -208,13 +208,13 @@ static void ExtractTrackPoints(xmlNodePtr Start) LastPoint->MoveHeading = atof(Heading); LastPoint->HeadingRef = HeadingRef; } - struct timespec Timespec = ConvertToUnixTime(Time, GPX_DATE_FORMAT, 0, 0); + struct timespec Timespec = ConvertToUnixTime(Time, GPX_DATE_FORMAT, 0); LastPoint->Time = Timespec.tv_sec; /* Debug... printf("TrackPoint. Lat %s (%f), Long %s (%f). Elev %s (%f), Time %d.\n", Lat, atof(Lat), Long, atof(Long), Elev, atof(Elev), - ConvertToUnixTime(Time, GPX_DATE_FORMAT, 0, 0)); + ConvertToUnixTime(Time, GPX_DATE_FORMAT, 0)); printf("Decimals %d %d %d\n", LastPoint->LatDecimals, LastPoint->LongDecimals, LastPoint->ElevDecimals); */ diff --git a/gui.c b/gui.c index 2a9de28..b70d8c0 100644 --- a/gui.c +++ b/gui.c @@ -76,6 +76,7 @@ GtkWidget *NoMtimeCheck; GtkWidget *BetweenSegmentsCheck; GtkWidget *DegMinSecsCheck; GtkWidget *AutoTimeZoneCheck; +GtkWidget *PhotoTimeZoneCheck; GtkWidget *HeadingCheck; GtkWidget *DirectionCheck; GtkWidget *OptionsTable; @@ -160,6 +161,7 @@ static const char* const ConfigDefaults[] = { "writeddmmss", "true", "replace", "false", "autotimezone", "true", + "phototimezone", "true", "maxgap", "90", "heading", "true", "maxheading", "100", @@ -491,6 +493,22 @@ GtkWidget* CreateMatchWindow (void) #endif gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (AutoTimeZoneCheck), g_key_file_get_boolean(GUISettings, "default", "autotimezone", &error)); + PhotoTimeZoneCheck = gtk_check_button_new_with_mnemonic (_("Use photo time zone")); + gtk_widget_show (PhotoTimeZoneCheck); + gtk_box_pack_start (GTK_BOX (OptionsVBox), PhotoTimeZoneCheck, FALSE, FALSE, 0); +#if GTK_CHECK_VERSION(2, 12, 0) + gtk_widget_set_tooltip_text (PhotoTimeZoneCheck, + _("Use a time zone tag if found in the photo.")); +#else + gtk_tooltips_set_tip (tooltips, PhotoTimeZoneCheck, + _("Use a time zone tag if found in the photo."), NULL); +#endif + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (PhotoTimeZoneCheck), g_key_file_get_boolean(GUISettings, "default", "phototimezone", &error)); + /* Toggle visibility of photo time zone entry when auto time zone is toggled */ + entry_toggle_visibility_inv(AutoTimeZoneCheck, PhotoTimeZoneCheck); + g_signal_connect(AutoTimeZoneCheck, "toggled", + G_CALLBACK (entry_toggle_visibility_inv), GTK_ENTRY (PhotoTimeZoneCheck)); + HeadingCheck = gtk_check_button_new_with_mnemonic (_("Write heading")); gtk_widget_show (HeadingCheck); gtk_box_pack_start (GTK_BOX (OptionsVBox), HeadingCheck, FALSE, FALSE, 0); @@ -909,6 +927,7 @@ gboolean DestroyWindow(GtkWidget *Widget, g_key_file_set_boolean(GUISettings, "default", "betweensegments", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(BetweenSegmentsCheck))); g_key_file_set_boolean(GUISettings, "default", "writeddmmss", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(DegMinSecsCheck))); g_key_file_set_boolean(GUISettings, "default", "autotimezone", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(AutoTimeZoneCheck))); + g_key_file_set_boolean(GUISettings, "default", "phototimezone", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(PhotoTimeZoneCheck))); g_key_file_set_string(GUISettings, "default", "maxgap", gtk_entry_get_text(GTK_ENTRY(GapTimeEntry))); g_key_file_set_string(GUISettings, "default", "maxheading", gtk_entry_get_text(GTK_ENTRY(MaxHeadingEntry))); g_key_file_set_string(GUISettings, "default", "directionoffset", gtk_entry_get_text(GTK_ENTRY(CameraDirectionEntry))); @@ -1061,7 +1080,7 @@ void AddPhotoToList(const char* Filename) int IncludesGPS = 0; /* Read the EXIF data. */ - char *Time = ReadExifData(Filename, &IncludesGPS, &Lat, &Long, &Elev); + char *Time = ReadExifData(Filename, &IncludesGPS, &Lat, &Long, &Elev, NULL); /* Note: we don't check if Time is NULL here. It is done for * us in SetListItem, and we check again before we attempt @@ -1579,6 +1598,8 @@ void CorrelateButtonPress( GtkWidget *Widget, gpointer Data ) /* TimeZone. We may need to extract the timezone from a string. */ Options.AutoTimeZone = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(AutoTimeZoneCheck)); + Options.TimeZoneFromPhoto = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(PhotoTimeZoneCheck)) && + Options.AutoTimeZone; Options.TimeZoneHours = 0; Options.TimeZoneMins = 0; char* TZString = (char*) gtk_entry_get_text(GTK_ENTRY(TimeZoneEntry)); @@ -1632,7 +1653,8 @@ void CorrelateButtonPress( GtkWidget *Widget, gpointer Data ) GtkGUIUpdate(); /* Do the correlation. */ - Result = CorrelatePhoto(Walk->Filename, &Options); + long UsedOffset; + Result = CorrelatePhoto(Walk->Filename, &UsedOffset, &Options); /* Figure out if it worked. */ if (Result) diff --git a/main-command.c b/main-command.c index d32ae93..592535b 100644 --- a/main-command.c +++ b/main-command.c @@ -74,6 +74,7 @@ static const struct option program_options[] = { { "heading", no_argument, 0, '('}, { "direction", required_argument, 0, 'b'}, { "max-heading", required_argument, 0, 'B'}, + { "no-photo-tz", no_argument, 0, ')'}, { 0, 0, 0, 0 } }; @@ -110,6 +111,7 @@ static void PrintUsage(const char* ProgramName) puts( _("-f, --fix-datestamps Fix broken GPS datestamps written with ver. < 1.5.2")); puts( _(" --degmins Write location as DD MM.MM (was default before v1.5.3)")); puts( _("-O, --photooffset SECS Offset added to photo time to make it match the GPS")); + puts( _(" --no-photo-tz Ignore time zone tags within photos")); puts( _("-h, --help Display this help message")); puts( _("-v, --verbose Show more detailed output")); puts( _("-V, --version Display version information")); @@ -154,7 +156,8 @@ static int ShowFileDetails(const char* File, enum OutputFormat Format, int IncludesGPS = 0; Lat = Long = 0; Elev = NAN; /* Elevation is optional, so this means it's missing */ - char* Time = ReadExifData(File, &IncludesGPS, &Lat, &Long, &Elev); + long OffsetTime = 0; + char* Time = ReadExifData(File, &IncludesGPS, &Lat, &Long, &Elev, &OffsetTime); int rc = 1; char* OldLocale = NULL; static int Started = 0; @@ -207,7 +210,8 @@ static int ShowFileDetails(const char* File, enum OutputFormat Format, } else if (Format == GPX_FORMAT) { /* Now convert the time into Unixtime. */ - struct timespec PhotoTime = ConvertTimeToUnixTime(Time, EXIF_DATE_FORMAT, Options); + struct timespec PhotoTime = ConvertTimeToUnixTime(Time, EXIF_DATE_FORMAT, + OffsetTime, NULL, Options); static time_t LastGpxTime; if (CompareTimes(PhotoTime, LastGpxTime) < 0) fprintf(stderr, _("Warning: image files are not ordered by time.\n")); @@ -320,11 +324,11 @@ static int FixDatestamp(const char* File, int AdjustmentHours, int AdjustmentMin } else { /* Check the timestamp. */ struct timespec PhotoTime = ConvertToUnixTime(OriginalDateStamp, EXIF_DATE_FORMAT, - AdjustmentHours, AdjustmentMinutes); + AdjustmentHours * 3600 + AdjustmentMinutes * 60); snprintf(CombinedTime, sizeof(CombinedTime), "%s %s", DateStamp, TimeStamp); - struct timespec GPSTime = ConvertToUnixTime(CombinedTime, EXIF_DATE_FORMAT, 0, 0); + struct timespec GPSTime = ConvertToUnixTime(CombinedTime, EXIF_DATE_FORMAT, 0); if (CompareTimes(PhotoTime, GPSTime.tv_sec)) { /* Timestamp is wrong. Fix it. @@ -392,6 +396,7 @@ int main(int argc, char** argv) int RemoveTags = 0; int DoBetweenTrackSegs = 0; int NoChangeMtime = 0; + int NoPhotoTz = 0; int FixDatestamps = 0; int DegMinSecs = 1; double PhotoOffset = 0; @@ -528,6 +533,10 @@ int main(int argc, char** argv) /* This option specifies to write the GPSTrack tag, if possible. */ WriteHeading = 1; break; + case ')': + /* This option causes OffsetTime tags within photos to be ignored. */ + NoPhotoTz = 1; + break; case 'b': /* This option gives us the offset of the camera from forward. */ if (optarg) @@ -657,8 +666,9 @@ int main(int argc, char** argv) struct CorrelateOptions Options; Options.NoWriteExif = NoWriteExif; Options.OverwriteExisting = OverwriteExisting; - Options.NoInterpolate = (Interpolate ? 0 : 1); + Options.NoInterpolate = !Interpolate; Options.AutoTimeZone = !HaveTimeAdjustment; + Options.TimeZoneFromPhoto = !NoPhotoTz && !HaveTimeAdjustment; Options.TimeZoneHours = TimeZoneHours; Options.TimeZoneMins = TimeZoneMins; Options.FeatherTime = FeatherTime; @@ -748,6 +758,8 @@ int main(int argc, char** argv) int TooFar = 0; int NoDate = 0; int GPSPresent = 0; + long UsedOffset = NO_OFFSET_TIME; + int OffsetCount = 0; /* Now it is time to correlate the photos. Feed one in at a time, and * see what happens.*/ @@ -757,8 +769,14 @@ int main(int argc, char** argv) while (optind < argc) { File = argv[optind++]; + long ThisOffset; /* Pass the file along to Correlate and see what happens. */ - Result = CorrelatePhoto(File, &Options); + Result = CorrelatePhoto(File, &ThisOffset, &Options); + if (UsedOffset == NO_OFFSET_TIME) + UsedOffset = ThisOffset; + else if (ThisOffset != NO_OFFSET_TIME && ThisOffset != UsedOffset) + /* Multiple offsets were encountered */ + ++OffsetCount; /* Was result non-NULL? */ if (Result) @@ -773,8 +791,7 @@ int main(int argc, char** argv) } else { printf("."); } - } - if (Options.Result == CORR_INTERPOLATED) + } else if (Options.Result == CORR_INTERPOLATED) { MatchInter++; if (ShowDetails) @@ -783,8 +800,7 @@ int main(int argc, char** argv) } else { printf("/"); } - } - if (Options.Result == CORR_ROUND) + } else if (Options.Result == CORR_ROUND) { MatchRound++; if (ShowDetails) @@ -793,8 +809,7 @@ int main(int argc, char** argv) } else { printf("<"); } - } - if (Options.Result == CORR_EXIFWRITEFAIL) + } else if (Options.Result == CORR_EXIFWRITEFAIL) { WriteFail++; if (ShowDetails) @@ -827,8 +842,7 @@ int main(int argc, char** argv) } else { printf("-"); } - } - if (Options.Result == CORR_TOOFAR) + } else if (Options.Result == CORR_TOOFAR) { TooFar++; if (ShowDetails) @@ -837,8 +851,7 @@ int main(int argc, char** argv) } else { printf("^"); } - } - if (Options.Result == CORR_NOEXIFINPUT) + } else if (Options.Result == CORR_NOEXIFINPUT) { NoDate++; if (ShowDetails) @@ -847,8 +860,7 @@ int main(int argc, char** argv) } else { printf("?"); } - } - if (Options.Result == CORR_GPSDATAEXISTS) + } else if (Options.Result == CORR_GPSDATAEXISTS) { GPSPresent++; if (ShowDetails) @@ -879,12 +891,16 @@ int main(int argc, char** argv) /* Print details of what happened. */ printf(_("\nCompleted correlation process.\n")); - if (ShowDetails) + if (ShowDetails && UsedOffset != NO_OFFSET_TIME) { /* This has to be shown at the end in case auto time zone * was used, since it isn't known before the first file * is processed. */ - printf(_("Used time zone offset %d:%02d\n"), - Options.TimeZoneHours, abs(Options.TimeZoneMins)); + if (OffsetCount) + printf(_("Used time zone offset (multiple)\n")); + else + printf(_("Used time zone offset %s%ld:%02ld\n"), UsedOffset < 0 ? "-" : "", + labs(UsedOffset / 3600), labs(UsedOffset % 3600) / 60); + } printf(_("Matched: %5d (%d Exact, %d Interpolated, %d Rounded).\n"), MatchExact + MatchInter + MatchRound, MatchExact, MatchInter, MatchRound); diff --git a/po/de.po b/po/de.po index 0241a73..987aac6 100644 --- a/po/de.po +++ b/po/de.po @@ -3,12 +3,12 @@ # This file is distributed under the same license as the gpscorrelate package. # Dan Fandrich , 2013. # -#: gui.c:1784 +#: gui.c:1807 msgid "" msgstr "" "Project-Id-Version: gpscorrelate 2.2\n" "Report-Msgid-Bugs-To: dan@coneharvesters.com\n" -"POT-Creation-Date: 2024-12-19 16:48-0800\n" +"POT-Creation-Date: 2024-12-30 15:58-0800\n" "PO-Revision-Date: 2024-10-17 21:41-0700\n" "Last-Translator: Dan Fandrich \n" "Language-Team: deutsch\n" @@ -17,9 +17,9 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: gpx-read.c:194 gui.c:207 gui.c:884 gui.c:1090 gui.c:1159 gui.c:1436 -#: gui.c:1462 main-command.c:198 main-command.c:224 main-command.c:409 -#: main-command.c:447 main-command.c:460 main-command.c:623 main-command.c:634 +#: gpx-read.c:194 gui.c:209 gui.c:902 gui.c:1109 gui.c:1178 gui.c:1455 +#: gui.c:1481 main-command.c:199 main-command.c:226 main-command.c:412 +#: main-command.c:450 main-command.c:463 main-command.c:631 main-command.c:642 #, c-format msgid "Out of memory.\n" msgstr "Kein Speicherplatz mehr.\n" @@ -39,41 +39,41 @@ msgstr "Ungültige GPX-Datei hat keine Wurzel.\n" msgid "Invalid GPX file.\n" msgstr "Ungültige GPX-Datei.\n" -#: gui.c:288 +#: gui.c:290 #, c-format msgid "GPS Photo Correlate %s" msgstr "GPS Foto korrelieren %s" -#: gui.c:318 +#: gui.c:320 msgid "Add..." msgstr "Hinzufügen…" -#: gui.c:322 gui.c:324 +#: gui.c:324 gui.c:326 msgid "Add photos to be correlated." msgstr "Fotos zum korrelieren hinzufügen." -#: gui.c:329 +#: gui.c:331 msgid "Remove" msgstr "Entfernen" -#: gui.c:333 gui.c:335 +#: gui.c:335 gui.c:337 msgid "Remove selected photos from the list." msgstr "Die ausgewählten Fotos aus der Liste entfernen." -#: gui.c:340 +#: gui.c:342 msgid "1. Add Photos" msgstr "1. Fotos hinzufügen" -#: gui.c:359 gui.c:1477 +#: gui.c:361 gui.c:1496 #, c-format msgid "Read from: No file" msgstr "Gelesen aus: Keine Datei" -#: gui.c:366 +#: gui.c:368 msgid "Choose..." msgstr "Auswählen…" -#: gui.c:371 gui.c:375 +#: gui.c:373 gui.c:377 msgid "" "Choose GPX file from which to read GPS data. If the GPS data is not in the " "GPX format, use a converter like GPSBabel to convert it to GPX first." @@ -82,15 +82,15 @@ msgstr "" "GPS-Daten nicht im GPX-Format sind, benutze ein Konverter wie z.B. GPSBabel, " "um sie ins GPX-Format zu konvertieren." -#: gui.c:381 +#: gui.c:383 msgid "2. GPS Data" msgstr "2. GPS-Daten" -#: gui.c:400 +#: gui.c:402 msgid "Interpolate" msgstr "Interpolieren" -#: gui.c:405 gui.c:409 +#: gui.c:407 gui.c:411 msgid "" "Interpolate between points. If disabled, points will be rounded to the " "nearest recorded point." @@ -98,11 +98,11 @@ msgstr "" "Interpolieren zwischen Punkten. Falls es deaktiviert ist, werden die Punkte " "auf dem nächsten aufgenommenen Punkt gerundet." -#: gui.c:414 +#: gui.c:416 msgid "Don't write" msgstr "Nicht schreiben" -#: gui.c:419 gui.c:423 +#: gui.c:421 gui.c:425 msgid "" "Don't write EXIF data back to the photos. This is useful for testing the " "settings without modifying the photos." @@ -110,27 +110,27 @@ msgstr "" "Die EXIF-Daten nicht in die Fotos schreiben. Hiermit kann man die Auswirkung " "von Einstellungen testen, ohne die Fotos zu ändern." -#: gui.c:428 +#: gui.c:430 msgid "Replace existing tags" msgstr "Existierende GPS-Metadaten ersetzen" -#: gui.c:432 gui.c:434 +#: gui.c:434 gui.c:436 msgid "Replace any existing GPS tags in the photos." msgstr "Existierende GPS-Metadaten in den Fotos ersetzen." -#: gui.c:438 +#: gui.c:440 msgid "Don't change mtime" msgstr "Änderungsdatum nicht ändern" -#: gui.c:443 gui.c:446 +#: gui.c:445 gui.c:448 msgid "Don't change file modification time of the photos." msgstr "Änderungsdatum der Fotos nicht ändern." -#: gui.c:450 +#: gui.c:452 msgid "Between Segments" msgstr "Zwischen Segmente" -#: gui.c:455 gui.c:460 +#: gui.c:457 gui.c:462 msgid "" "Interpolate between track segments. Generally the data is segmented to show " "where location data was available and not available, but you might still " @@ -140,11 +140,11 @@ msgstr "" "Segmente aufgeteiltund zeigen, wo GPS-Daten verfügbar waren und wo nicht. " "Man kann auch zwischen den Segmenten interpolieren." -#: gui.c:466 +#: gui.c:468 msgid "Write DD MM SS.SS" msgstr "Schreibe GG MM SS.SS" -#: gui.c:471 gui.c:476 +#: gui.c:473 gui.c:478 msgid "" "Write the latitude and longitude values as DD MM SS.SS; this is the new " "default. The old behaviour was to write it as DD MM.MM, which will occur if " @@ -154,20 +154,28 @@ msgstr "" "Wenn diese Einstellung deaktiviert wird, werden sie im Format GG MM.MM " "geschrieben, welches in früheren Versionen verwendet wurde." -#: gui.c:482 +#: gui.c:484 msgid "Auto time zone" msgstr "Automatische Zeitzone" -#: gui.c:487 gui.c:490 +#: gui.c:489 gui.c:492 msgid "Assume the camera time zone is the same as the local time zone." msgstr "" "Nehme an, dass die Kamerazeitzone dieselbe ist wie die lokale Zeitzone." -#: gui.c:494 +#: gui.c:496 +msgid "Use photo time zone" +msgstr "Foto-Zeitzone benutzen" + +#: gui.c:501 gui.c:504 +msgid "Use a time zone tag if found in the photo." +msgstr "Zeitzone-Feld benutzen falls eins in das Foto gefunden wird" + +#: gui.c:512 msgid "Write heading" msgstr "Steuerkurs schreiben" -#: gui.c:499 gui.c:504 +#: gui.c:517 gui.c:522 msgid "" "Write an EXIF tag specifying the direction of movement as the photo was " "taken. This is only possible if the GPX file contains these data and if the " @@ -178,11 +186,11 @@ msgstr "" "und wenn die Richtungsänderung das Maximum (unten angegeben) nicht " "überschritten hat." -#: gui.c:510 +#: gui.c:528 msgid "Write camera direction" msgstr "Kamerarichtung schreiben" -#: gui.c:515 gui.c:520 +#: gui.c:533 gui.c:538 msgid "" "Write an EXIF tag specifying the camera direction as the photo was taken. " "This is only possible if the GPX file contains these data and if the heading " @@ -193,31 +201,31 @@ msgstr "" "und wenn die Richtungsänderung das Maximum (unten angegeben) nicht " "überschritten hat." -#: gui.c:531 +#: gui.c:549 msgid "Max gap time:" msgstr "Max. Zeitlücke:" -#: gui.c:539 +#: gui.c:557 msgid "Max heading change:" msgstr "Max. Steuerkurswechsel" -#: gui.c:547 +#: gui.c:565 msgid "Camera direction:" msgstr "Kamerarichtung:" -#: gui.c:555 +#: gui.c:573 msgid "Time Zone:" msgstr "Zeitzone:" -#: gui.c:563 +#: gui.c:581 msgid "Photo Offset:" msgstr "Zeitverschiebung des Fotos:" -#: gui.c:571 +#: gui.c:589 msgid "GPS Datum:" msgstr "GPS Datum:" -#: gui.c:587 gui.c:593 +#: gui.c:605 gui.c:611 msgid "" "Maximum time \"away\" from a point that the photo can be taken yet still " "match, in seconds. If a photo's time is outside this value (from both points " @@ -228,7 +236,7 @@ msgstr "" "Fotozeites (von beiden Punkte auf jeder Seite) höher ist, wird es nicht " "übereinstimmen." -#: gui.c:609 gui.c:613 +#: gui.c:627 gui.c:631 msgid "" "Maximum number of degrees of rotation allowed between points while still " "writing a heading tag. -1 means no maximum." @@ -236,7 +244,7 @@ msgstr "" "Maximaler Drehungsgrad, der zwischen Punkten erlaubt ist, während noch ein " "Heading-Feld geschrieben wird. -1 bedeutet kein Maximum." -#: gui.c:632 gui.c:637 +#: gui.c:650 gui.c:655 msgid "" "Number of degrees from the direction of movement towards which the camera " "faces. If the camera is facing out the right-hand window of a car, this " @@ -245,7 +253,7 @@ msgstr "" "Anzahl der Grad aus der Bewegungsrichtung, in die die Kamera zeigt. Wenn die " "Kamera aus dem rechten Fenster eines Autos schaut, wäre dies 90." -#: gui.c:657 gui.c:663 +#: gui.c:675 gui.c:681 msgid "" "The timezone that the camera's time was set to when the photos were taken. " "For example, if a camera is set to AWST or +8:00 hours from UTC, enter +8:00 " @@ -257,7 +265,7 @@ msgstr "" "ist, gebe hier +2:00 ein, so dass die richtige Justierung gemacht werden " "kann. GPS-Daten sind immer in UTC." -#: gui.c:684 gui.c:689 +#: gui.c:702 gui.c:707 msgid "" "The number of seconds to add to the photo's time to make it match the GPS " "data. Calculate this with (GPS - Photo). Can be negative or positive and " @@ -267,7 +275,7 @@ msgstr "" "GPS-Daten übereinstimmt. Rechne es als (GPS-Zeit - Fotozeit). Es kann " "negativ oder positiv sein und fraktionale Sekunden sind erlaubt." -#: gui.c:704 gui.c:708 +#: gui.c:722 gui.c:726 msgid "" "The datum used for the GPS data. This text here is recorded in the EXIF tags " "as the source datum. WGS-84 is very commonly used." @@ -275,15 +283,15 @@ msgstr "" "Das Datum, dass als GPS-Datum benutzt worden ist. Dieser Text wird als das " "Quelldatum in den EXIF-Felder aufgenommen. WGS-84 wird sehr häufig benutzt." -#: gui.c:715 +#: gui.c:733 msgid "3. Set options" msgstr "3. Einstellungen festlegen" -#: gui.c:730 +#: gui.c:748 msgid "Correlate Photos" msgstr "Fotos korrelieren" -#: gui.c:735 gui.c:739 +#: gui.c:753 gui.c:757 msgid "" "Begin the correlation process, writing back into the photos' EXIF tags " "(unless Don't write is selected)." @@ -291,230 +299,230 @@ msgstr "" "Korrelation beginnen. Die EXIF-Felder der Fotos werden geändert, außer wenn " "„Nicht schreiben“ ausgewählt ist." -#: gui.c:745 +#: gui.c:763 msgid "4. Correlate!" msgstr "4. Korrelieren" -#: gui.c:764 +#: gui.c:782 msgid "Strip GPS tags" msgstr "GPS-Metadaten entfernen" -#: gui.c:769 gui.c:772 +#: gui.c:787 gui.c:790 msgid "Strip GPS tags from the selected photos." msgstr "GPS-Metadaten aus den ausgewählten Fotos entfernen." -#: gui.c:777 +#: gui.c:795 msgid "Help" msgstr "Hilfe" -#: gui.c:782 gui.c:785 +#: gui.c:800 gui.c:803 msgid "View help for this application." msgstr "Hilfe zu dieser Anwendung anzeigen." -#: gui.c:790 +#: gui.c:808 msgid "About" msgstr "Über" -#: gui.c:795 gui.c:798 +#: gui.c:813 gui.c:816 msgid "Show information about the program." msgstr "Informationen über dieses Programm anzeigen." -#: gui.c:803 +#: gui.c:821 msgid "Other Tools" msgstr "Extras" -#: gui.c:839 +#: gui.c:857 msgid "File" msgstr "Datei" -#: gui.c:846 +#: gui.c:864 msgid "Latitude" msgstr "Breitengrad" -#: gui.c:853 +#: gui.c:871 msgid "Longitude" msgstr "Längengrad" -#: gui.c:860 +#: gui.c:878 msgid "Elevation" msgstr "Höhe" -#: gui.c:867 +#: gui.c:885 msgid "Time" msgstr "Zeit" -#: gui.c:874 +#: gui.c:892 msgid "State" msgstr "Status" -#: gui.c:978 gui.c:983 +#: gui.c:997 gui.c:1002 msgid "Add Photos..." msgstr "Fotos hinzufügen…" -#: gui.c:997 +#: gui.c:1016 msgid "JPEG images" msgstr "JPEG-Bilder" -#: gui.c:1003 gui.c:1375 +#: gui.c:1022 gui.c:1394 msgid "All files" msgstr "Alle Dateien" -#: gui.c:1103 gui.c:1274 +#: gui.c:1122 gui.c:1293 msgid "No EXIF data" msgstr "Keine EXIF-Daten" -#: gui.c:1279 +#: gui.c:1298 msgid "GPS Data Present" msgstr "GPS-Daten sind vorhanden" -#: gui.c:1287 +#: gui.c:1306 msgid "S" msgstr "S" -#: gui.c:1287 +#: gui.c:1306 msgid "N" msgstr "N" -#: gui.c:1295 +#: gui.c:1314 msgid "W" msgstr "W" -#: gui.c:1295 +#: gui.c:1314 msgid "E" msgstr "O" -#: gui.c:1302 +#: gui.c:1321 msgid "m" msgstr "m" -#: gui.c:1308 +#: gui.c:1327 msgid "Ready" msgstr "Bereit" -#: gui.c:1350 gui.c:1355 +#: gui.c:1369 gui.c:1374 msgid "Select GPS Data..." msgstr "GPS-Daten wählen…" -#: gui.c:1369 +#: gui.c:1388 msgid "GPX files" msgstr "GPX-Dateien" -#: gui.c:1400 +#: gui.c:1419 msgid "Loading GPS data from file... Won't be a moment..." msgstr "GPS-Daten werden aus den Dateien gelesen. Bitte warten…" -#: gui.c:1426 +#: gui.c:1445 msgid "multiple files" msgstr "mehrere Dateien" -#: gui.c:1472 +#: gui.c:1491 #, c-format msgid "Read from: %s" msgstr "Gelesen aus: %s" -#: gui.c:1484 +#: gui.c:1503 #, c-format msgid "Unable to read file %s for some reason. Please try again." msgstr "Fehler beim Lesen der Datei %s. Versuche es bitte noch einmal." -#: gui.c:1531 +#: gui.c:1550 msgid "No photos selected to match! Please use Add to add photos first!" msgstr "Keine Fotos zur Übereinstimmung ausgewählt. Zuerst Fotos hinzufügen." -#: gui.c:1544 +#: gui.c:1563 msgid "No GPS data loaded! Please select a GPX file to read GPS data from." msgstr "" "Keine GPS-Daten geladen. Wähle einen GPX-Datei, woraus GPS-Daten gelesen " "werden können." -#: gui.c:1619 +#: gui.c:1641 msgid "Internal error" msgstr "Interner Fehler" -#: gui.c:1624 +#: gui.c:1646 msgid "Correlating..." msgstr "Korrelieren…" -#: gui.c:1647 +#: gui.c:1670 msgid "Exact Match" msgstr "Exakte Übereinstimmung" -#: gui.c:1651 +#: gui.c:1674 msgid "Interpolated Match" msgstr "Interpolierte Übereinstimmung" -#: gui.c:1655 +#: gui.c:1678 msgid "Rounded Match" msgstr "Gerundeter Übereinstimmung" -#: gui.c:1659 +#: gui.c:1682 msgid "Write Failure" msgstr "Fehler beim Schreiben" -#: gui.c:1673 +#: gui.c:1696 msgid "Data Already Present" msgstr "Daten bereits vorhanden" -#: gui.c:1680 +#: gui.c:1703 msgid "No Match" msgstr "Keine Übereinstimmung" -#: gui.c:1684 +#: gui.c:1707 msgid "Too far" msgstr "Zu weit" -#: gui.c:1688 +#: gui.c:1711 msgid "No data" msgstr "Keine Daten" -#: gui.c:1743 +#: gui.c:1766 msgid "Stripping..." msgstr "Entfernen…" -#: gui.c:1760 +#: gui.c:1783 msgid "Error Stripping" msgstr "Fehler beim Entfernen" -#: gui.c:1819 +#: gui.c:1842 msgid "GPS Correlate attaches EXIF GPS location tags to images." msgstr "GPS Correlate fügt Bildern EXIF GPS-Standort-Metadaten bei." -#: gui.c:1821 +#: gui.c:1844 msgid "Copyright © 2005-2024 Daniel Foote, Dan Fandrich" msgstr "Copyright © 2005-2024 Daniel Foote, Dan Fandrich" -#: main-command.c:83 +#: main-command.c:84 #, c-format msgid "%s, ver. %s. %s\n" msgstr "%s, Ver. %s. %s\n" -#: main-command.c:85 +#: main-command.c:86 msgid "Copyright (C) 2005-2024 Daniel Foote, Dan Fandrich" msgstr "Copyright © 2005-2024 Daniel Foote, Dan Fandrich" -#: main-command.c:91 +#: main-command.c:92 #, c-format msgid "Usage: %s [options] file.jpg ...\n" msgstr "Aufruf: %s [Optionen] Datei.jpg ...\n" -#: main-command.c:92 +#: main-command.c:93 msgid "-g, --gps file.gpx Specifies GPX file with GPS data" msgstr "-g, --gps datei.gpx Gibt GPX-Datei mit GPS-Daten an" -#: main-command.c:93 +#: main-command.c:94 msgid "" "-l, --latlong LAT,LONG[,E] Specifies latitude/longitude/elevation directly" msgstr "" "-l, --latlong Breit.,Läng.[,Höhe] Gibt Breitengrad/Längengrad/Höhe direkt an" -#: main-command.c:94 +#: main-command.c:95 msgid "" "-z, --timeadd +/-HH[:MM] Time to add to GPS data to make it match photos" msgstr "" "-z, --timeadd +/-HH[:MM] Zeit, dass zu den GPS-Daten addiert werden muss,\n" " um mit den Fotos zu übereinstimmen" -#: main-command.c:95 +#: main-command.c:96 msgid "" "-i, --no-interpolation Disable interpolation between points; " "interpolation\n" @@ -525,86 +533,86 @@ msgstr "" "wenn\n" " deaktiviert" -#: main-command.c:97 +#: main-command.c:98 msgid "-d, --datum DATUM Specify measurement datum (defaults to WGS-84)" msgstr "-d, --datum DATUM Gibt GPS Datum an (Standard ist WGS-84)" -#: main-command.c:98 +#: main-command.c:99 msgid "" "-n, --no-write Do not write the EXIF data. Useful with --verbose" msgstr "" "-n, --no-write Nicht die EXIF-Daten schreiben. Nützlich mit --" "verbose" -#: main-command.c:99 +#: main-command.c:100 msgid "" "-R, --replace Overwrite any GPS tags already in the image file" msgstr "" "-R, --replace Existierende GPS-Metadaten in der Datei " "überschreiben" -#: main-command.c:100 +#: main-command.c:101 msgid "" "-m, --max-dist SECS Max time outside points that photo will be matched" msgstr "" "-m, --max-dist SEK Max. Zeitlücke außer den Punkten, dass\n" " übereingestimmt wird" -#: main-command.c:101 +#: main-command.c:102 msgid " --heading Store the direction of movement in the image" msgstr " --heading Speichert die Bewegungsrichtung in der Datei" -#: main-command.c:102 +#: main-command.c:103 msgid "" "-B, --max-heading DEG Max degrees between points that will be matched" msgstr "" "-B, --max-heading GRAD Max. Grad zwischen den Punkten, der\n" " übereingestimmt wird" -#: main-command.c:103 +#: main-command.c:104 msgid "" "-b, --direction DEG Angular offset of camera from forward direction" msgstr "" "-b, --direction GRAD Winkelversatz der Kamera von der Vorwärts-Richtung" -#: main-command.c:104 +#: main-command.c:105 msgid "-s, --show Just show the GPS data from the given files" msgstr "" "-s, --show Nur GPS-Daten aus den angegebenen Dateien zeigen" -#: main-command.c:105 +#: main-command.c:106 msgid "" "-o, --machine Like --show but with machine-readable CSV output" msgstr "" "-o, --machine Ähnlich zu --show aber mit einer maschinenlesbaren\n" " CSV-Ausgabe" -#: main-command.c:106 +#: main-command.c:107 msgid "-x, --show-gpx Like --show but with GPX output" msgstr "-x, --show-gpx Ähnlich zu --show aber mit GPX Ausgabe" -#: main-command.c:107 +#: main-command.c:108 msgid "-r, --remove Strip GPS tags from the given files" msgstr "" "-r, --remove GPS-Metadaten aus den angegebenen Dateien entfernen" -#: main-command.c:108 +#: main-command.c:109 msgid "-t, --ignore-tracksegs Interpolate between track segments, too" msgstr "-t, --ignore-tracksegs Interpolieren auch Zwischen Track-Segmente" -#: main-command.c:109 +#: main-command.c:110 msgid "-M, --no-mtime Don't change mtime of modified files" msgstr "" "-M, --no-mtime Nicht Änderungsdatum von veränderte Dateien ändern" -#: main-command.c:110 +#: main-command.c:111 msgid "" "-f, --fix-datestamps Fix broken GPS datestamps written with ver. < 1.5.2" msgstr "" "-f, --fix-datestamps GPS-Datumsstempel, die von < V.1.5.2 geschrieben\n" " worden sind, reparieren" -#: main-command.c:111 +#: main-command.c:112 msgid "" " --degmins Write location as DD MM.MM (was default before " "v1.5.3)" @@ -612,7 +620,7 @@ msgstr "" " --degmins Ort als GG MM.MM schreiben (war vor V.1.5.3 " "Standard)" -#: main-command.c:112 +#: main-command.c:113 msgid "" "-O, --photooffset SECS Offset added to photo time to make it match the GPS" msgstr "" @@ -620,59 +628,63 @@ msgstr "" "muss,\n" " damit es mit dem GPS übereinstimmt" -#: main-command.c:113 +#: main-command.c:114 +msgid " --no-photo-tz Ignore time zone tags within photos" +msgstr " --no-photo-tz Zeitzone-Feld innerhalb von Fotos ignorieren" + +#: main-command.c:115 msgid "-h, --help Display this help message" msgstr "-h, --help Hilfetext anzeigen" -#: main-command.c:114 +#: main-command.c:116 msgid "-v, --verbose Show more detailed output" msgstr "-v, --verbose Detailliertere Ausgabe anzeigen" -#: main-command.c:115 +#: main-command.c:117 msgid "-V, --version Display version information" msgstr "-V, --version Versionsinformationen anzeigen" -#: main-command.c:215 +#: main-command.c:217 #, c-format msgid "Warning: image files are not ordered by time.\n" msgstr "Warnung: Fotodatein sind nicht nach Zeit geordnet.\n" -#: main-command.c:241 +#: main-command.c:243 #, c-format msgid "%s: %s, Lat %f, Long %f, Elevation " msgstr "%s: %s, Breitengrad %f, Längengrad %f, Höhe " -#: main-command.c:246 +#: main-command.c:248 #, c-format msgid "(unknown)" msgstr "(unbekannt)" -#: main-command.c:255 +#: main-command.c:257 #, c-format msgid "%s: %s, No GPS Data.\n" msgstr "%s: %s, Keine GPS-Daten.\n" -#: main-command.c:264 main-command.c:317 +#: main-command.c:266 main-command.c:319 #, c-format msgid "%s: No EXIF data.\n" msgstr "%s: Keine EXIF-Daten.\n" -#: main-command.c:293 +#: main-command.c:295 #, c-format msgid "%s: Removed GPS tags.\n" msgstr "%s: GPS-Metadaten entfernt.\n" -#: main-command.c:296 +#: main-command.c:298 #, c-format msgid "%s: Tag removal failure.\n" msgstr "%s: Fehler beim Löschen eines Feldes.\n" -#: main-command.c:320 +#: main-command.c:322 #, c-format msgid "%s: No GPS data.\n" msgstr "%s: Keine GPS-Daten.\n" -#: main-command.c:346 +#: main-command.c:348 #, c-format msgid "" "%s: Wrong timestamp:\n" @@ -685,32 +697,32 @@ msgstr "" " GPS: %s\n" " Korrigiert: %s\n" -#: main-command.c:351 +#: main-command.c:353 #, c-format msgid "%s: Timestamp is OK: Photo %s (localtime), GPS %s (UTC).\n" msgstr "%s: Zeitstempel ok: Foto %s (Lokalzeit), GPS %s (UTC).\n" -#: main-command.c:433 +#: main-command.c:436 #, c-format msgid "Reading GPS Data..." msgstr "GPS-Daten werden gelesen..." -#: main-command.c:465 +#: main-command.c:468 #, c-format msgid "Error parsing location.\n" msgstr "Fehler beim Parsen des Standorts.\n" -#: main-command.c:539 +#: main-command.c:547 #, c-format msgid "The --direction value must be between -359..359\n" msgstr "Der --direction Wert muss zwischen -359..359 liegen\n" -#: main-command.c:556 +#: main-command.c:564 #, c-format msgid "The --max-heading value must be between 0..179\n" msgstr "Der --max-heading Wert muss zwischen 0..179 liegen\n" -#: main-command.c:569 +#: main-command.c:577 #, c-format msgid "" "This is free software; see the source for copying conditions. There is NO\n" @@ -721,23 +733,23 @@ msgstr "" "Es gibt keine Gewährleistung, das schließt auch MARKTFÄHIGKEIT oder\n" "die ERFÜLLUNG EINES BESTIMMTEN ZWECKES ein.\n" -#: main-command.c:647 +#: main-command.c:655 #, c-format msgid "At least one image file name must be given.\n" msgstr "Mindestens eine Fotodatei benötigt.\n" -#: main-command.c:706 +#: main-command.c:715 #, c-format msgid "A time offset must be given with the -z option to fix photos.\n" msgstr "" "Ein Zeitversatz durch -z ist erforderlich, um den Zeitpunkt festzulegen.\n" -#: main-command.c:724 +#: main-command.c:733 #, c-format msgid "Cannot continue since no GPS data is available.\n" msgstr "Kann nicht weitermachen, da keine GPS-Daten verfügbar sind.\n" -#: main-command.c:732 +#: main-command.c:741 #, c-format msgid "" "Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far\n" @@ -747,7 +759,7 @@ msgstr "" " ^ = Zu weit, w = Fehler beim Schreiben, ? = Kein EXIF Zeitfeld,\n" " ! = GPS-Daten schon vorhanden\n" -#: main-command.c:737 +#: main-command.c:746 #, c-format msgid "" "\n" @@ -756,57 +768,57 @@ msgstr "" "\n" "Korrelieren: " -#: main-command.c:773 +#: main-command.c:790 #, c-format msgid "%s: Exact match: " msgstr "%s: Exakte Übereinstimmung: " -#: main-command.c:783 +#: main-command.c:799 #, c-format msgid "%s: Interpolated: " msgstr "%s: Interpoliert: " -#: main-command.c:793 +#: main-command.c:808 #, c-format msgid "%s: Rounded: " msgstr "%s: Gerundet: " -#: main-command.c:803 +#: main-command.c:817 #, c-format msgid "%s: EXIF write failure: " msgstr "%s: Fehler beim Schreiben der EXIF-Daten: " -#: main-command.c:811 +#: main-command.c:825 #, c-format msgid "Lat %f, Long %f, Elev " msgstr "Breitengrad %f, Längengrad %f, Höhe " -#: main-command.c:816 +#: main-command.c:830 #, c-format msgid "(unknown).\n" msgstr "(unbekannt).\n" -#: main-command.c:827 +#: main-command.c:841 #, c-format msgid "%s: No match.\n" msgstr "%s: Keine Übereinstimmung.\n" -#: main-command.c:837 +#: main-command.c:850 #, c-format msgid "%s: Too far from nearest point.\n" msgstr "%s: Zu weit entfernt vom nächsten Punkt.\n" -#: main-command.c:847 +#: main-command.c:859 #, c-format msgid "%s: No EXIF date tag present.\n" msgstr "%s: Kein EXIF Zeitfeld vorhanden.\n" -#: main-command.c:857 +#: main-command.c:868 #, c-format msgid "%s: GPS Data already present.\n" msgstr "%s: GPS-Daten bereits vorhanden.\n" -#: main-command.c:882 +#: main-command.c:893 #, c-format msgid "" "\n" @@ -815,24 +827,29 @@ msgstr "" "\n" "Korrelation ist abgeschlossen.\n" -#: main-command.c:887 +#: main-command.c:899 +#, c-format +msgid "Used time zone offset (multiple)\n" +msgstr "Verwendeter Zeitversatz (mehrere)\n" + +#: main-command.c:901 #, c-format -msgid "Used time zone offset %d:%02d\n" -msgstr "Verwendeter Zeitversatz %d:%02d\n" +msgid "Used time zone offset %s%ld:%02ld\n" +msgstr "Verwendeter Zeitversatz %s%ld:%02ld\n" -#: main-command.c:889 +#: main-command.c:904 #, c-format msgid "Matched: %5d (%d Exact, %d Interpolated, %d Rounded).\n" msgstr "Übereingestimmt: %5d (%d Genau, %d Interpoliert, %d Gerundet).\n" -#: main-command.c:892 +#: main-command.c:907 #, c-format msgid "Failed: %5d (%d Not matched, %d Write failure, %d Too Far,\n" msgstr "" "Fehler: %5d (%d Nicht übereingestimmt, %d Fehler beim Schreiben, %d Zu " "weit,\n" -#: main-command.c:895 +#: main-command.c:910 #, c-format msgid " %d No Date, %d GPS Already Present.)\n" msgstr " %d Kein Datum, %d GPS-Daten bereits vorhanden.)\n" diff --git a/po/fr.po b/po/fr.po index 93a5fac..fd8ac2f 100644 --- a/po/fr.po +++ b/po/fr.po @@ -3,12 +3,12 @@ # This file is distributed under the same license as the gpscorrelate package. # Vincent Gay , 2013. # -#: gui.c:1784 +#: gui.c:1807 msgid "" msgstr "" "Project-Id-Version: gpscorrelate 2.2\n" "Report-Msgid-Bugs-To: dan@coneharvesters.com\n" -"POT-Creation-Date: 2024-12-19 16:48-0800\n" +"POT-Creation-Date: 2024-12-30 15:58-0800\n" "PO-Revision-Date: 2024-04-03 11:24+0100\n" "Last-Translator: jybz, papoteur\n" "Language-Team: français\n" @@ -18,9 +18,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.5.4\n" -#: gpx-read.c:194 gui.c:207 gui.c:884 gui.c:1090 gui.c:1159 gui.c:1436 -#: gui.c:1462 main-command.c:198 main-command.c:224 main-command.c:409 -#: main-command.c:447 main-command.c:460 main-command.c:623 main-command.c:634 +#: gpx-read.c:194 gui.c:209 gui.c:902 gui.c:1109 gui.c:1178 gui.c:1455 +#: gui.c:1481 main-command.c:199 main-command.c:226 main-command.c:412 +#: main-command.c:450 main-command.c:463 main-command.c:631 main-command.c:642 #, c-format msgid "Out of memory.\n" msgstr "Manque de mémoire.\n" @@ -40,41 +40,41 @@ msgstr "Erreur : Le fichier GPX n'a pas de racine.\n" msgid "Invalid GPX file.\n" msgstr "Fichier GPX invalide.\n" -#: gui.c:288 +#: gui.c:290 #, c-format msgid "GPS Photo Correlate %s" msgstr "Corrélation GPS Photo %s" -#: gui.c:318 +#: gui.c:320 msgid "Add..." msgstr "Ajouter…" -#: gui.c:322 gui.c:324 +#: gui.c:324 gui.c:326 msgid "Add photos to be correlated." msgstr "Ajouter des photos à correler." -#: gui.c:329 +#: gui.c:331 msgid "Remove" msgstr "Retirer" -#: gui.c:333 gui.c:335 +#: gui.c:335 gui.c:337 msgid "Remove selected photos from the list." msgstr "Retirer les photos sélectionnées de la liste." -#: gui.c:340 +#: gui.c:342 msgid "1. Add Photos" msgstr "1. Ajouter des photos" -#: gui.c:359 gui.c:1477 +#: gui.c:361 gui.c:1496 #, c-format msgid "Read from: No file" msgstr "Lecture depuis : pas de fichier" -#: gui.c:366 +#: gui.c:368 msgid "Choose..." msgstr "Choisir…" -#: gui.c:371 gui.c:375 +#: gui.c:373 gui.c:377 msgid "" "Choose GPX file from which to read GPS data. If the GPS data is not in the " "GPX format, use a converter like GPSBabel to convert it to GPX first." @@ -83,15 +83,15 @@ msgstr "" "les données GPS ne sont pas au format GPX, utilisez un convertisseur tel que " "GPSBabel." -#: gui.c:381 +#: gui.c:383 msgid "2. GPS Data" msgstr "2. Données GPS" -#: gui.c:400 +#: gui.c:402 msgid "Interpolate" msgstr "Interpoler" -#: gui.c:405 gui.c:409 +#: gui.c:407 gui.c:411 msgid "" "Interpolate between points. If disabled, points will be rounded to the " "nearest recorded point." @@ -99,11 +99,11 @@ msgstr "" "Interpolation entre les points. Si cette option est désactivée la " "correlation sera arrondie au point le plus proche." -#: gui.c:414 +#: gui.c:416 msgid "Don't write" msgstr "Ne pas écrire" -#: gui.c:419 gui.c:423 +#: gui.c:421 gui.c:425 msgid "" "Don't write EXIF data back to the photos. This is useful for testing the " "settings without modifying the photos." @@ -111,27 +111,27 @@ msgstr "" "Ne pas écrire les données EXIF dans les photos. C'est utile pour tester les " "paramètres sans modifier les photos." -#: gui.c:428 +#: gui.c:430 msgid "Replace existing tags" msgstr "Remplacer les tags existants" -#: gui.c:432 gui.c:434 +#: gui.c:434 gui.c:436 msgid "Replace any existing GPS tags in the photos." msgstr "Remplacer les tags GPS existants sur les photos." -#: gui.c:438 +#: gui.c:440 msgid "Don't change mtime" msgstr "Ne pas changer le mtime" -#: gui.c:443 gui.c:446 +#: gui.c:445 gui.c:448 msgid "Don't change file modification time of the photos." msgstr "Ne pas changer la date de modification des fichiers photo." -#: gui.c:450 +#: gui.c:452 msgid "Between Segments" msgstr "Entre les segments" -#: gui.c:455 gui.c:460 +#: gui.c:457 gui.c:462 msgid "" "Interpolate between track segments. Generally the data is segmented to show " "where location data was available and not available, but you might still " @@ -142,11 +142,11 @@ msgstr "" "disponibles ou non, mais vous pouvez quand-même vouloir interpoler entre des " "segments. " -#: gui.c:466 +#: gui.c:468 msgid "Write DD MM SS.SS" msgstr "Écrire en DD MM SS.SS" -#: gui.c:471 gui.c:476 +#: gui.c:473 gui.c:478 msgid "" "Write the latitude and longitude values as DD MM SS.SS; this is the new " "default. The old behaviour was to write it as DD MM.MM, which will occur if " @@ -156,21 +156,29 @@ msgstr "" "par défaut. C'était précédemment DD MM.MM, ce que vous pouvez rétablir en " "décochant cette case." -#: gui.c:482 +#: gui.c:484 msgid "Auto time zone" msgstr "Fuseau horaire automatique" -#: gui.c:487 gui.c:490 +#: gui.c:489 gui.c:492 msgid "Assume the camera time zone is the same as the local time zone." msgstr "" "Supposer que le fuseau horaire de la caméra est le même que le fuseau " "horaire local." -#: gui.c:494 +#: gui.c:496 +msgid "Use photo time zone" +msgstr "" + +#: gui.c:501 gui.c:504 +msgid "Use a time zone tag if found in the photo." +msgstr "" + +#: gui.c:512 msgid "Write heading" msgstr "Écriture de l'entête" -#: gui.c:499 gui.c:504 +#: gui.c:517 gui.c:522 msgid "" "Write an EXIF tag specifying the direction of movement as the photo was " "taken. This is only possible if the GPX file contains these data and if the " @@ -181,11 +189,11 @@ msgstr "" "si le changement d'entête n'excède pas la taille maximum (définit ci-" "desous)." -#: gui.c:510 +#: gui.c:528 msgid "Write camera direction" msgstr "Inscrire la direction de la caméra" -#: gui.c:515 gui.c:520 +#: gui.c:533 gui.c:538 msgid "" "Write an EXIF tag specifying the camera direction as the photo was taken. " "This is only possible if the GPX file contains these data and if the heading " @@ -196,31 +204,31 @@ msgstr "" "donnée et si le changement d'entête n'exède pas la taille maxium (définit ci-" "dessous)." -#: gui.c:531 +#: gui.c:549 msgid "Max gap time:" msgstr "Écart de temps maximum :" -#: gui.c:539 +#: gui.c:557 msgid "Max heading change:" msgstr "Changement de l'entête maximum :" -#: gui.c:547 +#: gui.c:565 msgid "Camera direction:" msgstr "Direction de l'appareil photo :" -#: gui.c:555 +#: gui.c:573 msgid "Time Zone:" msgstr "Fuseau horaire :" -#: gui.c:563 +#: gui.c:581 msgid "Photo Offset:" msgstr "Décalage des photos :" -#: gui.c:571 +#: gui.c:589 msgid "GPS Datum:" msgstr "Système géodésique :" -#: gui.c:587 gui.c:593 +#: gui.c:605 gui.c:611 msgid "" "Maximum time \"away\" from a point that the photo can be taken yet still " "match, in seconds. If a photo's time is outside this value (from both points " @@ -230,7 +238,7 @@ msgstr "" "l'horodatage d'une photo est distant de n'importe quel point d'une valeur " "supérieure, aucune correspondance ne sera établie." -#: gui.c:609 gui.c:613 +#: gui.c:627 gui.c:631 msgid "" "Maximum number of degrees of rotation allowed between points while still " "writing a heading tag. -1 means no maximum." @@ -238,7 +246,7 @@ msgstr "" "Nombre maximum de degrés de rotation permis parmi les points lors de " "l'écriture d'une étiquette d'entête. -1 signifie sans limite. " -#: gui.c:632 gui.c:637 +#: gui.c:650 gui.c:655 msgid "" "Number of degrees from the direction of movement towards which the camera " "faces. If the camera is facing out the right-hand window of a car, this " @@ -248,7 +256,7 @@ msgstr "" "l'appareil photo. Si l'appareil photo faisait face à la vitre droite d'un " "véhicule, ce serait 90." -#: gui.c:657 gui.c:663 +#: gui.c:675 gui.c:681 msgid "" "The timezone that the camera's time was set to when the photos were taken. " "For example, if a camera is set to AWST or +8:00 hours from UTC, enter +8:00 " @@ -260,7 +268,7 @@ msgstr "" "(CET : Paris, Bruxelles, Genève…) et +2:00 pour l’heure d’été d’Europe " "centrale (CEST). L'heure du GPS est toujours en temps unniversel (UTC)." -#: gui.c:684 gui.c:689 +#: gui.c:702 gui.c:707 msgid "" "The number of seconds to add to the photo's time to make it match the GPS " "data. Calculate this with (GPS - Photo). Can be negative or positive and " @@ -270,7 +278,7 @@ msgstr "" "correspondre aux données GPS. Égal à (GPS - Photo). Peut être négatif ou " "positif et des secondes fractionnelles sont autorisées." -#: gui.c:704 gui.c:708 +#: gui.c:722 gui.c:726 msgid "" "The datum used for the GPS data. This text here is recorded in the EXIF tags " "as the source datum. WGS-84 is very commonly used." @@ -278,15 +286,15 @@ msgstr "" "Le datum utilisé dans les données GPS. Cette valeur sera enregistrée dans " "les tags EXIF en tant que datum source. WSG-84 est communément utilisé." -#: gui.c:715 +#: gui.c:733 msgid "3. Set options" msgstr "3. Options" -#: gui.c:730 +#: gui.c:748 msgid "Correlate Photos" msgstr "Corrélation des photos" -#: gui.c:735 gui.c:739 +#: gui.c:753 gui.c:757 msgid "" "Begin the correlation process, writing back into the photos' EXIF tags " "(unless Don't write is selected)." @@ -294,234 +302,234 @@ msgstr "" "Début du processus de correlation, écriture dans les photos si l'option " "n'est pas désactivée, sauf si Ne pas écrire est sélectionné." -#: gui.c:745 +#: gui.c:763 msgid "4. Correlate!" msgstr "4. Correlation !" -#: gui.c:764 +#: gui.c:782 msgid "Strip GPS tags" msgstr "Suprimer les tags GPS" -#: gui.c:769 gui.c:772 +#: gui.c:787 gui.c:790 msgid "Strip GPS tags from the selected photos." msgstr "Suprimer les tags GPS des photos sélectionnées." -#: gui.c:777 +#: gui.c:795 msgid "Help" msgstr "Aide" -#: gui.c:782 gui.c:785 +#: gui.c:800 gui.c:803 msgid "View help for this application." msgstr "Affiche l'aide pour cette application." -#: gui.c:790 +#: gui.c:808 msgid "About" msgstr "À propos" -#: gui.c:795 gui.c:798 +#: gui.c:813 gui.c:816 msgid "Show information about the program." msgstr "Afficher des informations sur le programme." -#: gui.c:803 +#: gui.c:821 msgid "Other Tools" msgstr "Autres outils" -#: gui.c:839 +#: gui.c:857 msgid "File" msgstr "Fichier" -#: gui.c:846 +#: gui.c:864 msgid "Latitude" msgstr "Latitude" -#: gui.c:853 +#: gui.c:871 msgid "Longitude" msgstr "Longitude" -#: gui.c:860 +#: gui.c:878 msgid "Elevation" msgstr "Altitude" -#: gui.c:867 +#: gui.c:885 msgid "Time" msgstr "Date-Heure" -#: gui.c:874 +#: gui.c:892 msgid "State" msgstr "État" -#: gui.c:978 gui.c:983 +#: gui.c:997 gui.c:1002 msgid "Add Photos..." msgstr "Ajouter des photos…" -#: gui.c:997 +#: gui.c:1016 msgid "JPEG images" msgstr "Images JPEG" -#: gui.c:1003 gui.c:1375 +#: gui.c:1022 gui.c:1394 msgid "All files" msgstr "Tous les fichiers" -#: gui.c:1103 gui.c:1274 +#: gui.c:1122 gui.c:1293 msgid "No EXIF data" msgstr "Pas de données EXIF" -#: gui.c:1279 +#: gui.c:1298 msgid "GPS Data Present" msgstr "Données GPS présentes" -#: gui.c:1287 +#: gui.c:1306 msgid "S" msgstr "S" -#: gui.c:1287 +#: gui.c:1306 msgid "N" msgstr "N" -#: gui.c:1295 +#: gui.c:1314 msgid "W" msgstr "O" -#: gui.c:1295 +#: gui.c:1314 msgid "E" msgstr "E" -#: gui.c:1302 +#: gui.c:1321 msgid "m" msgstr "m" -#: gui.c:1308 +#: gui.c:1327 msgid "Ready" msgstr "Prêt" -#: gui.c:1350 gui.c:1355 +#: gui.c:1369 gui.c:1374 msgid "Select GPS Data..." msgstr "Sélection des données GPS…" -#: gui.c:1369 +#: gui.c:1388 msgid "GPX files" msgstr "Fichiers GPX" -#: gui.c:1400 +#: gui.c:1419 msgid "Loading GPS data from file... Won't be a moment..." msgstr "Chargement des données GPS depuis le fichier… Ce ne sera pas long…" -#: gui.c:1426 +#: gui.c:1445 msgid "multiple files" msgstr "Fichiers multiples" -#: gui.c:1472 +#: gui.c:1491 #, c-format msgid "Read from: %s" msgstr "Lecture depuis : %s" -#: gui.c:1484 +#: gui.c:1503 #, c-format msgid "Unable to read file %s for some reason. Please try again." msgstr "" "Lecture du fichier %s impossible pour une raison inconnue. Essayez de " "nouveau SVP." -#: gui.c:1531 +#: gui.c:1550 msgid "No photos selected to match! Please use Add to add photos first!" msgstr "Aucune photo sélectionnée ! Ajoutez d'abord des photos SVP !" -#: gui.c:1544 +#: gui.c:1563 msgid "No GPS data loaded! Please select a GPX file to read GPS data from." msgstr "" "Aucube donnée GPS chargée ! Sélectionnez un fichier contenant des données " "GPS." -#: gui.c:1619 +#: gui.c:1641 msgid "Internal error" msgstr "Erreur interne" -#: gui.c:1624 +#: gui.c:1646 msgid "Correlating..." msgstr "Correlation en cours…" -#: gui.c:1647 +#: gui.c:1670 msgid "Exact Match" msgstr "Correspondance exacte" -#: gui.c:1651 +#: gui.c:1674 msgid "Interpolated Match" msgstr "Correspondance interpolée" -#: gui.c:1655 +#: gui.c:1678 msgid "Rounded Match" msgstr "Correspondance arrondie" -#: gui.c:1659 +#: gui.c:1682 msgid "Write Failure" msgstr "Echec de l'écriture" -#: gui.c:1673 +#: gui.c:1696 msgid "Data Already Present" msgstr "Données déjà présentes" -#: gui.c:1680 +#: gui.c:1703 msgid "No Match" msgstr "Aucune correspondance" -#: gui.c:1684 +#: gui.c:1707 msgid "Too far" msgstr "Trop loin" -#: gui.c:1688 +#: gui.c:1711 msgid "No data" msgstr "Pas de données" -#: gui.c:1743 +#: gui.c:1766 msgid "Stripping..." msgstr "Suppression…" -#: gui.c:1760 +#: gui.c:1783 msgid "Error Stripping" msgstr "Erreur pendant la suppression" -#: gui.c:1819 +#: gui.c:1842 msgid "GPS Correlate attaches EXIF GPS location tags to images." msgstr "GPS Correlate attache des tags de position GPS EXIF aux images." -#: gui.c:1821 +#: gui.c:1844 msgid "Copyright © 2005-2024 Daniel Foote, Dan Fandrich" msgstr "Copyright © 2005-2024 Daniel Foote, Dan Fandrich" -#: main-command.c:83 +#: main-command.c:84 #, c-format msgid "%s, ver. %s. %s\n" msgstr "%s, ver. %s. %s\n" -#: main-command.c:85 +#: main-command.c:86 msgid "Copyright (C) 2005-2024 Daniel Foote, Dan Fandrich" msgstr "Copyright © 2005-2024 Daniel Foote, Dan Fandrich" -#: main-command.c:91 +#: main-command.c:92 #, c-format msgid "Usage: %s [options] file.jpg ...\n" msgstr "Usage: %s [options] fichier.jpg ...\n" -#: main-command.c:92 +#: main-command.c:93 msgid "-g, --gps file.gpx Specifies GPX file with GPS data" msgstr "" "-g, --gps fichier.gpx Indique le fichier GPX contenant les données GPS" -#: main-command.c:93 +#: main-command.c:94 msgid "" "-l, --latlong LAT,LONG[,E] Specifies latitude/longitude/elevation directly" msgstr "" "-l, --latlong LAT,LONG[,É] Indiquer la latitude/longitude/élévation " "directement" -#: main-command.c:94 +#: main-command.c:95 msgid "" "-z, --timeadd +/-HH[:MM] Time to add to GPS data to make it match photos" msgstr "" "-z, --timeadd +/-HH[:MM] Décalage horaire à ajouter aux données GPS pour\n" " correspondre aux photos." -#: main-command.c:95 +#: main-command.c:96 msgid "" "-i, --no-interpolation Disable interpolation between points; " "interpolation\n" @@ -531,85 +539,85 @@ msgstr "" "points;\n" " arrondit au point le plus proche" -#: main-command.c:97 +#: main-command.c:98 msgid "-d, --datum DATUM Specify measurement datum (defaults to WGS-84)" msgstr "-d, --datum DATUM Spécifie le datum (WGS-84 par défaut)" -#: main-command.c:98 +#: main-command.c:99 msgid "" "-n, --no-write Do not write the EXIF data. Useful with --verbose" msgstr "" "-n, --no-write Ne pas écrire les données EXIF. Utile avec\n" " l'option --verbose" -#: main-command.c:99 +#: main-command.c:100 msgid "" "-R, --replace Overwrite any GPS tags already in the image file" msgstr "" "-R, --replace Effacer et remplacer les tags GPS déjà présentés\n" " dans l'image" -#: main-command.c:100 +#: main-command.c:101 msgid "" "-m, --max-dist SECS Max time outside points that photo will be matched" msgstr "" "-m, --max-dist SECS Écart de temps maximum entre un point GPS et une\n" " photo pour établir une corrélation." -#: main-command.c:101 +#: main-command.c:102 msgid " --heading Store the direction of movement in the image" msgstr "" " --heading Enregistre la direction du mouvement dans l'image" -#: main-command.c:102 +#: main-command.c:103 msgid "" "-B, --max-heading DEG Max degrees between points that will be matched" msgstr "-B, --max-heading DEG Degrés maximum entre deux points assortis" -#: main-command.c:103 +#: main-command.c:104 msgid "" "-b, --direction DEG Angular offset of camera from forward direction" msgstr "" "-b, --direction DEG Offset angulaire de la caméra par rapport à la dir." -#: main-command.c:104 +#: main-command.c:105 msgid "-s, --show Just show the GPS data from the given files" msgstr "" "-s, --show Seulement montrer les données GPS des " "fichiersindiqués" -#: main-command.c:105 +#: main-command.c:106 msgid "" "-o, --machine Like --show but with machine-readable CSV output" msgstr "-o, --machine Similaire à --show mais en format machine" -#: main-command.c:106 +#: main-command.c:107 msgid "-x, --show-gpx Like --show but with GPX output" msgstr "-x, --show-gpx Similaire à --show mais en format GPX" -#: main-command.c:107 +#: main-command.c:108 msgid "-r, --remove Strip GPS tags from the given files" msgstr "-r, --remove Retirer les tags GPS des fichiers indiqués" -#: main-command.c:108 +#: main-command.c:109 msgid "-t, --ignore-tracksegs Interpolate between track segments, too" msgstr "" "-t, --ignore-tracksegs Interpoler également entre les segments de piste" -#: main-command.c:109 +#: main-command.c:110 msgid "-M, --no-mtime Don't change mtime of modified files" msgstr "" "-M, --no-mtime Ne pas changer la date de dernière modification\n" " des fichiers" -#: main-command.c:110 +#: main-command.c:111 msgid "" "-f, --fix-datestamps Fix broken GPS datestamps written with ver. < 1.5.2" msgstr "" "-f, --fix-datestamps Corrige les erreurs d'horodatage des version\n" " antérieures à 1.5.2" -#: main-command.c:111 +#: main-command.c:112 msgid "" " --degmins Write location as DD MM.MM (was default before " "v1.5.3)" @@ -617,7 +625,7 @@ msgstr "" " --degmins Écrit la position en DD MM.MM (format par défaut\n" " avant la version 1.5.3)" -#: main-command.c:112 +#: main-command.c:113 msgid "" "-O, --photooffset SECS Offset added to photo time to make it match the GPS" msgstr "" @@ -625,61 +633,67 @@ msgstr "" "photos\n" " pour les caler sur le GPS" -#: main-command.c:113 +#: main-command.c:114 +msgid " --no-photo-tz Ignore time zone tags within photos" +msgstr "" +" --no-photo-tz Ignorer les balises des fuseaux horaires dans les\n" +" photos" + +#: main-command.c:115 msgid "-h, --help Display this help message" msgstr "-h, --help Affiche le message d'aide" -#: main-command.c:114 +#: main-command.c:116 msgid "-v, --verbose Show more detailed output" msgstr "-v, --verbose Affichage détaillé en sortie" -#: main-command.c:115 +#: main-command.c:117 msgid "-V, --version Display version information" msgstr "-V, --version Affiche les information de version" -#: main-command.c:215 +#: main-command.c:217 #, c-format msgid "Warning: image files are not ordered by time.\n" msgstr "" "Attention : les fichiers d'images ne sont pas classés par ordre " "chronologique.\n" -#: main-command.c:241 +#: main-command.c:243 #, c-format msgid "%s: %s, Lat %f, Long %f, Elevation " msgstr "%s: %s, Lat %f, Long %f, Altitude " -#: main-command.c:246 +#: main-command.c:248 #, c-format msgid "(unknown)" msgstr "(inconnu)" -#: main-command.c:255 +#: main-command.c:257 #, c-format msgid "%s: %s, No GPS Data.\n" msgstr "%s: %s, Aucune donnée GPS.\n" -#: main-command.c:264 main-command.c:317 +#: main-command.c:266 main-command.c:319 #, c-format msgid "%s: No EXIF data.\n" msgstr "%s : Aucune donnée EXIF.\n" -#: main-command.c:293 +#: main-command.c:295 #, c-format msgid "%s: Removed GPS tags.\n" msgstr "%s : Tags GPS retirés.\n" -#: main-command.c:296 +#: main-command.c:298 #, c-format msgid "%s: Tag removal failure.\n" msgstr "%s : Echec du retrait des tags.\n" -#: main-command.c:320 +#: main-command.c:322 #, c-format msgid "%s: No GPS data.\n" msgstr "%s : Aucune donnée GPS.\n" -#: main-command.c:346 +#: main-command.c:348 #, c-format msgid "" "%s: Wrong timestamp:\n" @@ -692,32 +706,32 @@ msgstr "" " GPS: %s\n" " Corrigé: %s\n" -#: main-command.c:351 +#: main-command.c:353 #, c-format msgid "%s: Timestamp is OK: Photo %s (localtime), GPS %s (UTC).\n" msgstr "%s: Horodatage OK: Photo %s (heure locale), GPS %s (UTC).\n" -#: main-command.c:433 +#: main-command.c:436 #, c-format msgid "Reading GPS Data..." msgstr "Lecture des données GPS..." -#: main-command.c:465 +#: main-command.c:468 #, c-format msgid "Error parsing location.\n" msgstr "Erreur lors de l'analyse de l'emplacement.\n" -#: main-command.c:539 +#: main-command.c:547 #, c-format msgid "The --direction value must be between -359..359\n" msgstr "La valeur --direction doit être dans la plage -359..359\n" -#: main-command.c:556 +#: main-command.c:564 #, c-format msgid "The --max-heading value must be between 0..179\n" msgstr "La valeur --max-heading doit être dans la plage 0..179\n" -#: main-command.c:569 +#: main-command.c:577 #, c-format msgid "" "This is free software; see the source for copying conditions. There is NO\n" @@ -729,22 +743,22 @@ msgstr "" "qu'il\n" "est DE QUALITÉ LOYALE ET MARCHANDE ou APPROPRIÉ POUR UN BUT PARTICULIER.\n" -#: main-command.c:647 +#: main-command.c:655 #, c-format msgid "At least one image file name must be given.\n" msgstr "Au moins un fichier est nécessaire.\n" -#: main-command.c:706 +#: main-command.c:715 #, c-format msgid "A time offset must be given with the -z option to fix photos.\n" msgstr "Vous devez indiquer le décalage horaire des photos avec l'option -z.\n" -#: main-command.c:724 +#: main-command.c:733 #, c-format msgid "Cannot continue since no GPS data is available.\n" msgstr "Impossible de continuer car il n'y a pas de données GPS.\n" -#: main-command.c:732 +#: main-command.c:741 #, c-format msgid "" "Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far\n" @@ -754,7 +768,7 @@ msgstr "" " ^ = Trop loin, w = Echec de l'écriture, ? = Pas de date EXIF,\n" " ! = Données GPS déjà présentes.\n" -#: main-command.c:737 +#: main-command.c:746 #, c-format msgid "" "\n" @@ -763,57 +777,57 @@ msgstr "" "\n" "Corrélation : " -#: main-command.c:773 +#: main-command.c:790 #, c-format msgid "%s: Exact match: " msgstr "%s : Correspondance exacte : " -#: main-command.c:783 +#: main-command.c:799 #, c-format msgid "%s: Interpolated: " msgstr "%s : Interpolée(s): " -#: main-command.c:793 +#: main-command.c:808 #, c-format msgid "%s: Rounded: " msgstr "%s : Arrondie(s): " -#: main-command.c:803 +#: main-command.c:817 #, c-format msgid "%s: EXIF write failure: " msgstr "%s : Echec de l'écriture des données Exif :" -#: main-command.c:811 +#: main-command.c:825 #, c-format msgid "Lat %f, Long %f, Elev " msgstr "Lat %f, Long %f, Alti " -#: main-command.c:816 +#: main-command.c:830 #, c-format msgid "(unknown).\n" msgstr "(inconnu).\n" -#: main-command.c:827 +#: main-command.c:841 #, c-format msgid "%s: No match.\n" msgstr "%s : Pas de correspondance.\n" -#: main-command.c:837 +#: main-command.c:850 #, c-format msgid "%s: Too far from nearest point.\n" msgstr "%s: Trop loin du point le plus proche.\n" -#: main-command.c:847 +#: main-command.c:859 #, c-format msgid "%s: No EXIF date tag present.\n" msgstr "%s: Date absente dans les tags EXIF.\n" -#: main-command.c:857 +#: main-command.c:868 #, c-format msgid "%s: GPS Data already present.\n" msgstr "%s: Données GPS déjà présentes.\n" -#: main-command.c:882 +#: main-command.c:893 #, c-format msgid "" "\n" @@ -822,24 +836,29 @@ msgstr "" "\n" "Processus de corrélation terminé.\n" -#: main-command.c:887 +#: main-command.c:899 +#, c-format +msgid "Used time zone offset (multiple)\n" +msgstr "Décalage de fuseau horaire utilisé (plusieurs)\n" + +#: main-command.c:901 #, c-format -msgid "Used time zone offset %d:%02d\n" -msgstr "Décalage de fuseau horaire utilisé %d:%02d\n" +msgid "Used time zone offset %s%ld:%02ld\n" +msgstr "Décalage de fuseau horaire utilisé %s%ld:%02ld\n" -#: main-command.c:889 +#: main-command.c:904 #, c-format msgid "Matched: %5d (%d Exact, %d Interpolated, %d Rounded).\n" msgstr "Correspondances : %5d (%d Exactes, %d Interpolatées, %d Arrondies).\n" -#: main-command.c:892 +#: main-command.c:907 #, c-format msgid "Failed: %5d (%d Not matched, %d Write failure, %d Too Far,\n" msgstr "" "Échec : %5d (%d Pas de correspondance, %d Problème d'écriture, %d Trop " "loin,\n" -#: main-command.c:895 +#: main-command.c:910 #, c-format msgid " %d No Date, %d GPS Already Present.)\n" msgstr " %d Pas de date, %d Données GPS déjà présentes.)\n" diff --git a/po/ru.po b/po/ru.po index 0282f0b..5aecab9 100644 --- a/po/ru.po +++ b/po/ru.po @@ -3,12 +3,12 @@ # This file is distributed under the same license as the gpscorrelate package. # Nikolay Korotkiy , 2019. # -#: gui.c:1784 +#: gui.c:1807 msgid "" msgstr "" "Project-Id-Version: gpscorrelate 2.2\n" "Report-Msgid-Bugs-To: dan@coneharvesters.com\n" -"POT-Creation-Date: 2024-12-19 16:48-0800\n" +"POT-Creation-Date: 2024-12-30 15:58-0800\n" "PO-Revision-Date: 2019-03-18 10:12+0300\n" "Last-Translator: Nikolay Korotkiy \n" "Language-Team: russian\n" @@ -17,9 +17,9 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: gpx-read.c:194 gui.c:207 gui.c:884 gui.c:1090 gui.c:1159 gui.c:1436 -#: gui.c:1462 main-command.c:198 main-command.c:224 main-command.c:409 -#: main-command.c:447 main-command.c:460 main-command.c:623 main-command.c:634 +#: gpx-read.c:194 gui.c:209 gui.c:902 gui.c:1109 gui.c:1178 gui.c:1455 +#: gui.c:1481 main-command.c:199 main-command.c:226 main-command.c:412 +#: main-command.c:450 main-command.c:463 main-command.c:631 main-command.c:642 #, c-format msgid "Out of memory.\n" msgstr "" @@ -39,41 +39,41 @@ msgstr "Неверный GPX файл не имеет корня.\n" msgid "Invalid GPX file.\n" msgstr "Неверный GPX файл.\n" -#: gui.c:288 +#: gui.c:290 #, c-format msgid "GPS Photo Correlate %s" msgstr "GPS Photo Correlate %s" -#: gui.c:318 +#: gui.c:320 msgid "Add..." msgstr "Добавить..." -#: gui.c:322 gui.c:324 +#: gui.c:324 gui.c:326 msgid "Add photos to be correlated." msgstr "Добавить фотографии для привязки." -#: gui.c:329 +#: gui.c:331 msgid "Remove" msgstr "Удалить" -#: gui.c:333 gui.c:335 +#: gui.c:335 gui.c:337 msgid "Remove selected photos from the list." msgstr "Удалить выбранные фотографии из списка." -#: gui.c:340 +#: gui.c:342 msgid "1. Add Photos" msgstr "1. Добавить фотографии" -#: gui.c:359 gui.c:1477 +#: gui.c:361 gui.c:1496 #, c-format msgid "Read from: No file" msgstr "Читать из: нет файла" -#: gui.c:366 +#: gui.c:368 msgid "Choose..." msgstr "Выбрать..." -#: gui.c:371 gui.c:375 +#: gui.c:373 gui.c:377 msgid "" "Choose GPX file from which to read GPS data. If the GPS data is not in the " "GPX format, use a converter like GPSBabel to convert it to GPX first." @@ -82,15 +82,15 @@ msgstr "" "не в GPX формате, воспользуйтесь конвертером, таким как GPSBabel, чтобы " "сначала преобразовать их в GPX." -#: gui.c:381 +#: gui.c:383 msgid "2. GPS Data" msgstr "2. GPS данные" -#: gui.c:400 +#: gui.c:402 msgid "Interpolate" msgstr "Интерполировать" -#: gui.c:405 gui.c:409 +#: gui.c:407 gui.c:411 msgid "" "Interpolate between points. If disabled, points will be rounded to the " "nearest recorded point." @@ -98,11 +98,11 @@ msgstr "" "Интерполировать между точками. Если выключено, будет использована ближайшая " "записанная устройством точка." -#: gui.c:414 +#: gui.c:416 msgid "Don't write" msgstr "Не сохранять" -#: gui.c:419 gui.c:423 +#: gui.c:421 gui.c:425 msgid "" "Don't write EXIF data back to the photos. This is useful for testing the " "settings without modifying the photos." @@ -110,27 +110,27 @@ msgstr "" "Не записывать EXIF данные фотографий. Полезно для тестирования настроек без " "изменения фотографий." -#: gui.c:428 +#: gui.c:430 msgid "Replace existing tags" msgstr "Заменить существующие теги" -#: gui.c:432 gui.c:434 +#: gui.c:434 gui.c:436 msgid "Replace any existing GPS tags in the photos." msgstr "Заменить уже существующие теги у фотографий." -#: gui.c:438 +#: gui.c:440 msgid "Don't change mtime" msgstr "Не изменять mtime" -#: gui.c:443 gui.c:446 +#: gui.c:445 gui.c:448 msgid "Don't change file modification time of the photos." msgstr "Не обновлять время изменения файлов." -#: gui.c:450 +#: gui.c:452 msgid "Between Segments" msgstr "Между сегментами" -#: gui.c:455 gui.c:460 +#: gui.c:457 gui.c:462 msgid "" "Interpolate between track segments. Generally the data is segmented to show " "where location data was available and not available, but you might still " @@ -140,11 +140,11 @@ msgstr "" "то, что данные о местоположении были недоступны, но возможно вы все равно " "хотите интерполировать между ними." -#: gui.c:466 +#: gui.c:468 msgid "Write DD MM SS.SS" msgstr "В формате DD MM SS.SS" -#: gui.c:471 gui.c:476 +#: gui.c:473 gui.c:478 msgid "" "Write the latitude and longitude values as DD MM SS.SS; this is the new " "default. The old behaviour was to write it as DD MM.MM, which will occur if " @@ -154,62 +154,70 @@ msgstr "" "умолчанию. Предыдущим форматом было DD MM.MM, чтобы его использовать " "выключите данную опцию." -#: gui.c:482 +#: gui.c:484 msgid "Auto time zone" msgstr "Автоматически определять часовой пояс" -#: gui.c:487 gui.c:490 +#: gui.c:489 gui.c:492 msgid "Assume the camera time zone is the same as the local time zone." msgstr "" "Предполагать, что часовой пояс камеры совпадает с местным часовым поясом." -#: gui.c:494 +#: gui.c:496 +msgid "Use photo time zone" +msgstr "" + +#: gui.c:501 gui.c:504 +msgid "Use a time zone tag if found in the photo." +msgstr "" + +#: gui.c:512 msgid "Write heading" msgstr "" -#: gui.c:499 gui.c:504 +#: gui.c:517 gui.c:522 msgid "" "Write an EXIF tag specifying the direction of movement as the photo was " "taken. This is only possible if the GPX file contains these data and if the " "heading change does not exceed the maximum (specified below)." msgstr "" -#: gui.c:510 +#: gui.c:528 msgid "Write camera direction" msgstr "" -#: gui.c:515 gui.c:520 +#: gui.c:533 gui.c:538 msgid "" "Write an EXIF tag specifying the camera direction as the photo was taken. " "This is only possible if the GPX file contains these data and if the heading " "change does not exceed the maximum (specified below)." msgstr "" -#: gui.c:531 +#: gui.c:549 msgid "Max gap time:" msgstr "Макс. промежуток времени:" -#: gui.c:539 +#: gui.c:557 msgid "Max heading change:" msgstr "" -#: gui.c:547 +#: gui.c:565 msgid "Camera direction:" msgstr "" -#: gui.c:555 +#: gui.c:573 msgid "Time Zone:" msgstr "Часовой пояс:" -#: gui.c:563 +#: gui.c:581 msgid "Photo Offset:" msgstr "Смещение фотографии:" -#: gui.c:571 +#: gui.c:589 msgid "GPS Datum:" msgstr "GPS датум:" -#: gui.c:587 gui.c:593 +#: gui.c:605 gui.c:611 msgid "" "Maximum time \"away\" from a point that the photo can be taken yet still " "match, in seconds. If a photo's time is outside this value (from both points " @@ -220,20 +228,20 @@ msgstr "" "выходит за пределы этого значения (из обеих точек с обеих сторон), " "местоположение будет считаться не совпадающим." -#: gui.c:609 gui.c:613 +#: gui.c:627 gui.c:631 msgid "" "Maximum number of degrees of rotation allowed between points while still " "writing a heading tag. -1 means no maximum." msgstr "" -#: gui.c:632 gui.c:637 +#: gui.c:650 gui.c:655 msgid "" "Number of degrees from the direction of movement towards which the camera " "faces. If the camera is facing out the right-hand window of a car, this " "would be 90." msgstr "" -#: gui.c:657 gui.c:663 +#: gui.c:675 gui.c:681 msgid "" "The timezone that the camera's time was set to when the photos were taken. " "For example, if a camera is set to AWST or +8:00 hours from UTC, enter +8:00 " @@ -245,7 +253,7 @@ msgstr "" "часов от UTC, введите здесь +3:00, чтобы можно было правильно определить " "время фотографии. Данные GPS всегда в UTC." -#: gui.c:684 gui.c:689 +#: gui.c:702 gui.c:707 msgid "" "The number of seconds to add to the photo's time to make it match the GPS " "data. Calculate this with (GPS - Photo). Can be negative or positive and " @@ -255,7 +263,7 @@ msgstr "" "соответствовало GPS данным. Рассчитывается с помощью (GPS - Фото). Может " "быть отрицательным или положительным, и разрешены дробные секунды." -#: gui.c:704 gui.c:708 +#: gui.c:722 gui.c:726 msgid "" "The datum used for the GPS data. This text here is recorded in the EXIF tags " "as the source datum. WGS-84 is very commonly used." @@ -263,15 +271,15 @@ msgstr "" "Датум, используемый для GPS данных. Этот текст записывается в EXIF теги как " "датум источника. WGS-84 очень широко используется." -#: gui.c:715 +#: gui.c:733 msgid "3. Set options" msgstr "3. Установить параметры" -#: gui.c:730 +#: gui.c:748 msgid "Correlate Photos" msgstr "Привязать фотографии" -#: gui.c:735 gui.c:739 +#: gui.c:753 gui.c:757 msgid "" "Begin the correlation process, writing back into the photos' EXIF tags " "(unless Don't write is selected)." @@ -279,359 +287,363 @@ msgstr "" "Начать процесс привязки и записи EXIF тегов (если не выбрана опция 'Не " "сохранять')." -#: gui.c:745 +#: gui.c:763 msgid "4. Correlate!" msgstr "4. Привязать!" -#: gui.c:764 +#: gui.c:782 msgid "Strip GPS tags" msgstr "Очистить GPS теги" -#: gui.c:769 gui.c:772 +#: gui.c:787 gui.c:790 msgid "Strip GPS tags from the selected photos." msgstr "Очистить GPS теги с выделенных фотографий." -#: gui.c:777 +#: gui.c:795 msgid "Help" msgstr "Справка" -#: gui.c:782 gui.c:785 +#: gui.c:800 gui.c:803 msgid "View help for this application." msgstr "Вызвать справку для этого приложения." -#: gui.c:790 +#: gui.c:808 msgid "About" msgstr "О программе" -#: gui.c:795 gui.c:798 +#: gui.c:813 gui.c:816 msgid "Show information about the program." msgstr "Информация о программе." -#: gui.c:803 +#: gui.c:821 msgid "Other Tools" msgstr "Другие инструменты" -#: gui.c:839 +#: gui.c:857 msgid "File" msgstr "Файл" -#: gui.c:846 +#: gui.c:864 msgid "Latitude" msgstr "Широта" -#: gui.c:853 +#: gui.c:871 msgid "Longitude" msgstr "Долгота" -#: gui.c:860 +#: gui.c:878 msgid "Elevation" msgstr "Высота" -#: gui.c:867 +#: gui.c:885 msgid "Time" msgstr "Время" -#: gui.c:874 +#: gui.c:892 msgid "State" msgstr "Состояние" -#: gui.c:978 gui.c:983 +#: gui.c:997 gui.c:1002 msgid "Add Photos..." msgstr "Добавить фотографии..." -#: gui.c:997 +#: gui.c:1016 msgid "JPEG images" msgstr "JPEG изображения" -#: gui.c:1003 gui.c:1375 +#: gui.c:1022 gui.c:1394 msgid "All files" msgstr "Все файлы" -#: gui.c:1103 gui.c:1274 +#: gui.c:1122 gui.c:1293 msgid "No EXIF data" msgstr "Нет EXIF данных" -#: gui.c:1279 +#: gui.c:1298 msgid "GPS Data Present" msgstr "GPS данные присутствуют" -#: gui.c:1287 +#: gui.c:1306 msgid "S" msgstr "ю.ш." -#: gui.c:1287 +#: gui.c:1306 msgid "N" msgstr "с.ш." -#: gui.c:1295 +#: gui.c:1314 msgid "W" msgstr "з.д." -#: gui.c:1295 +#: gui.c:1314 msgid "E" msgstr "в.д." -#: gui.c:1302 +#: gui.c:1321 msgid "m" msgstr "м" -#: gui.c:1308 +#: gui.c:1327 msgid "Ready" msgstr "Готово" -#: gui.c:1350 gui.c:1355 +#: gui.c:1369 gui.c:1374 msgid "Select GPS Data..." msgstr "Выбрать GPS данные..." -#: gui.c:1369 +#: gui.c:1388 msgid "GPX files" msgstr "GPX файлы" -#: gui.c:1400 +#: gui.c:1419 msgid "Loading GPS data from file... Won't be a moment..." msgstr "Загрузка GPS данных из файла..." -#: gui.c:1426 +#: gui.c:1445 msgid "multiple files" msgstr "несколько файлов" -#: gui.c:1472 +#: gui.c:1491 #, c-format msgid "Read from: %s" msgstr "Читать из: %s" -#: gui.c:1484 +#: gui.c:1503 #, c-format msgid "Unable to read file %s for some reason. Please try again." msgstr "Невозможно прочитать файл %s. Пожалуйста, попробуйте еще раз." -#: gui.c:1531 +#: gui.c:1550 msgid "No photos selected to match! Please use Add to add photos first!" msgstr "" "Не выбрано ни одной фотографии! Пожалуйста, добавьте сначала фотографии." -#: gui.c:1544 +#: gui.c:1563 msgid "No GPS data loaded! Please select a GPX file to read GPS data from." msgstr "GPS данные не загружены! Выберите GPX файл." -#: gui.c:1619 +#: gui.c:1641 msgid "Internal error" msgstr "Внутренняя ошибка" -#: gui.c:1624 +#: gui.c:1646 msgid "Correlating..." msgstr "Привязка..." -#: gui.c:1647 +#: gui.c:1670 msgid "Exact Match" msgstr "Точное совпадение" -#: gui.c:1651 +#: gui.c:1674 msgid "Interpolated Match" msgstr "Интерполированное совпадение" -#: gui.c:1655 +#: gui.c:1678 msgid "Rounded Match" msgstr "Округленное совпадение" -#: gui.c:1659 +#: gui.c:1682 msgid "Write Failure" msgstr "Ошибка записи" -#: gui.c:1673 +#: gui.c:1696 msgid "Data Already Present" msgstr "Данные уже присутствуют" -#: gui.c:1680 +#: gui.c:1703 msgid "No Match" msgstr "Нет совпадений" -#: gui.c:1684 +#: gui.c:1707 msgid "Too far" msgstr "Слишком далеко" -#: gui.c:1688 +#: gui.c:1711 msgid "No data" msgstr "Нет данных" -#: gui.c:1743 +#: gui.c:1766 msgid "Stripping..." msgstr "Очистка..." -#: gui.c:1760 +#: gui.c:1783 msgid "Error Stripping" msgstr "Ошибка очистки" -#: gui.c:1819 +#: gui.c:1842 msgid "GPS Correlate attaches EXIF GPS location tags to images." msgstr "GPS Correlate прикрепляет к изображениям теги местоположения GPS EXIF." -#: gui.c:1821 +#: gui.c:1844 msgid "Copyright © 2005-2024 Daniel Foote, Dan Fandrich" msgstr "Авторские права © 2005-2024 Daniel Foote, Dan Fandrich" -#: main-command.c:83 +#: main-command.c:84 #, c-format msgid "%s, ver. %s. %s\n" msgstr "%s, ver. %s. %s\n" -#: main-command.c:85 +#: main-command.c:86 msgid "Copyright (C) 2005-2024 Daniel Foote, Dan Fandrich" msgstr "Авторские права © 2005-2024 Daniel Foote, Dan Fandrich" -#: main-command.c:91 +#: main-command.c:92 #, c-format msgid "Usage: %s [options] file.jpg ...\n" msgstr "" -#: main-command.c:92 +#: main-command.c:93 msgid "-g, --gps file.gpx Specifies GPX file with GPS data" msgstr "" -#: main-command.c:93 +#: main-command.c:94 msgid "" "-l, --latlong LAT,LONG[,E] Specifies latitude/longitude/elevation directly" msgstr "" -#: main-command.c:94 +#: main-command.c:95 msgid "" "-z, --timeadd +/-HH[:MM] Time to add to GPS data to make it match photos" msgstr "" -#: main-command.c:95 +#: main-command.c:96 msgid "" "-i, --no-interpolation Disable interpolation between points; " "interpolation\n" " is linear, points rounded if disabled" msgstr "" -#: main-command.c:97 +#: main-command.c:98 msgid "-d, --datum DATUM Specify measurement datum (defaults to WGS-84)" msgstr "" -#: main-command.c:98 +#: main-command.c:99 msgid "" "-n, --no-write Do not write the EXIF data. Useful with --verbose" msgstr "" -#: main-command.c:99 +#: main-command.c:100 msgid "" "-R, --replace Overwrite any GPS tags already in the image file" msgstr "" -#: main-command.c:100 +#: main-command.c:101 msgid "" "-m, --max-dist SECS Max time outside points that photo will be matched" msgstr "" -#: main-command.c:101 +#: main-command.c:102 msgid " --heading Store the direction of movement in the image" msgstr "" -#: main-command.c:102 +#: main-command.c:103 msgid "" "-B, --max-heading DEG Max degrees between points that will be matched" msgstr "" -#: main-command.c:103 +#: main-command.c:104 msgid "" "-b, --direction DEG Angular offset of camera from forward direction" msgstr "" -#: main-command.c:104 +#: main-command.c:105 msgid "-s, --show Just show the GPS data from the given files" msgstr "" -#: main-command.c:105 +#: main-command.c:106 msgid "" "-o, --machine Like --show but with machine-readable CSV output" msgstr "" -#: main-command.c:106 +#: main-command.c:107 msgid "-x, --show-gpx Like --show but with GPX output" msgstr "" -#: main-command.c:107 +#: main-command.c:108 msgid "-r, --remove Strip GPS tags from the given files" msgstr "" -#: main-command.c:108 +#: main-command.c:109 msgid "-t, --ignore-tracksegs Interpolate between track segments, too" msgstr "" -#: main-command.c:109 +#: main-command.c:110 msgid "-M, --no-mtime Don't change mtime of modified files" msgstr "" -#: main-command.c:110 +#: main-command.c:111 msgid "" "-f, --fix-datestamps Fix broken GPS datestamps written with ver. < 1.5.2" msgstr "" -#: main-command.c:111 +#: main-command.c:112 msgid "" " --degmins Write location as DD MM.MM (was default before " "v1.5.3)" msgstr "" -#: main-command.c:112 +#: main-command.c:113 msgid "" "-O, --photooffset SECS Offset added to photo time to make it match the GPS" msgstr "" -#: main-command.c:113 +#: main-command.c:114 +msgid " --no-photo-tz Ignore time zone tags within photos" +msgstr "" + +#: main-command.c:115 msgid "-h, --help Display this help message" msgstr "" -#: main-command.c:114 +#: main-command.c:116 msgid "-v, --verbose Show more detailed output" msgstr "" -#: main-command.c:115 +#: main-command.c:117 msgid "-V, --version Display version information" msgstr "" -#: main-command.c:215 +#: main-command.c:217 #, c-format msgid "Warning: image files are not ordered by time.\n" msgstr "" -#: main-command.c:241 +#: main-command.c:243 #, c-format msgid "%s: %s, Lat %f, Long %f, Elevation " msgstr "" -#: main-command.c:246 +#: main-command.c:248 #, c-format msgid "(unknown)" msgstr "" -#: main-command.c:255 +#: main-command.c:257 #, c-format msgid "%s: %s, No GPS Data.\n" msgstr "" -#: main-command.c:264 main-command.c:317 +#: main-command.c:266 main-command.c:319 #, c-format msgid "%s: No EXIF data.\n" msgstr "" -#: main-command.c:293 +#: main-command.c:295 #, c-format msgid "%s: Removed GPS tags.\n" msgstr "" -#: main-command.c:296 +#: main-command.c:298 #, c-format msgid "%s: Tag removal failure.\n" msgstr "" -#: main-command.c:320 +#: main-command.c:322 #, c-format msgid "%s: No GPS data.\n" msgstr "" -#: main-command.c:346 +#: main-command.c:348 #, c-format msgid "" "%s: Wrong timestamp:\n" @@ -640,140 +652,145 @@ msgid "" " Corrected: %s\n" msgstr "" -#: main-command.c:351 +#: main-command.c:353 #, c-format msgid "%s: Timestamp is OK: Photo %s (localtime), GPS %s (UTC).\n" msgstr "" -#: main-command.c:433 +#: main-command.c:436 #, c-format msgid "Reading GPS Data..." msgstr "" -#: main-command.c:465 +#: main-command.c:468 #, c-format msgid "Error parsing location.\n" msgstr "" -#: main-command.c:539 +#: main-command.c:547 #, c-format msgid "The --direction value must be between -359..359\n" msgstr "" -#: main-command.c:556 +#: main-command.c:564 #, c-format msgid "The --max-heading value must be between 0..179\n" msgstr "" -#: main-command.c:569 +#: main-command.c:577 #, c-format msgid "" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" msgstr "" -#: main-command.c:647 +#: main-command.c:655 #, c-format msgid "At least one image file name must be given.\n" msgstr "" -#: main-command.c:706 +#: main-command.c:715 #, c-format msgid "A time offset must be given with the -z option to fix photos.\n" msgstr "" -#: main-command.c:724 +#: main-command.c:733 #, c-format msgid "Cannot continue since no GPS data is available.\n" msgstr "" -#: main-command.c:732 +#: main-command.c:741 #, c-format msgid "" "Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far\n" " w = Write Fail, ? = No EXIF date, ! = GPS already present\n" msgstr "" -#: main-command.c:737 +#: main-command.c:746 #, c-format msgid "" "\n" "Correlate: " msgstr "" -#: main-command.c:773 +#: main-command.c:790 #, c-format msgid "%s: Exact match: " msgstr "" -#: main-command.c:783 +#: main-command.c:799 #, c-format msgid "%s: Interpolated: " msgstr "" -#: main-command.c:793 +#: main-command.c:808 #, c-format msgid "%s: Rounded: " msgstr "" -#: main-command.c:803 +#: main-command.c:817 #, c-format msgid "%s: EXIF write failure: " msgstr "" -#: main-command.c:811 +#: main-command.c:825 #, c-format msgid "Lat %f, Long %f, Elev " msgstr "" -#: main-command.c:816 +#: main-command.c:830 #, c-format msgid "(unknown).\n" msgstr "" -#: main-command.c:827 +#: main-command.c:841 #, c-format msgid "%s: No match.\n" msgstr "" -#: main-command.c:837 +#: main-command.c:850 #, c-format msgid "%s: Too far from nearest point.\n" msgstr "" -#: main-command.c:847 +#: main-command.c:859 #, c-format msgid "%s: No EXIF date tag present.\n" msgstr "" -#: main-command.c:857 +#: main-command.c:868 #, c-format msgid "%s: GPS Data already present.\n" msgstr "" -#: main-command.c:882 +#: main-command.c:893 #, c-format msgid "" "\n" "Completed correlation process.\n" msgstr "" -#: main-command.c:887 +#: main-command.c:899 +#, c-format +msgid "Used time zone offset (multiple)\n" +msgstr "" + +#: main-command.c:901 #, c-format -msgid "Used time zone offset %d:%02d\n" +msgid "Used time zone offset %s%ld:%02ld\n" msgstr "" -#: main-command.c:889 +#: main-command.c:904 #, c-format msgid "Matched: %5d (%d Exact, %d Interpolated, %d Rounded).\n" msgstr "" -#: main-command.c:892 +#: main-command.c:907 #, c-format msgid "Failed: %5d (%d Not matched, %d Write failure, %d Too Far,\n" msgstr "" -#: main-command.c:895 +#: main-command.c:910 #, c-format msgid " %d No Date, %d GPS Already Present.)\n" msgstr "" diff --git a/tests/data/test186.param b/tests/data/test186.param new file mode 100644 index 0000000..ef77d47 --- /dev/null +++ b/tests/data/test186.param @@ -0,0 +1,6 @@ +TITLE='Correlate a file with OffsetTime tag' +PRECOMMAND='cat "$STAGINGDIR/point1-6.jpg" >"$LOGDIR/test.jpg"' +COMMAND='$PROGRAM -v -g "$STAGINGDIR/track10.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' +POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' +RESULTCODE=0 +SEDCOMMAND='s@^([a-zA-Z]:)?/.*/|.*Copyright.*$@@' # strip path and copyright line diff --git a/tests/data/test186.result b/tests/data/test186.result new file mode 100644 index 0000000..11cb621 --- /dev/null +++ b/tests/data/test186.result @@ -0,0 +1,37 @@ + +Reading GPS Data... + +Correlate: +test.jpg: Exact match: Lat 38.598576, Long -109.573474, Elev 1180.156. + +Completed correlation process. +Used time zone offset -7:00 +Matched: 1 (1 Exact, 0 Interpolated, 0 Rounded). +Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, + 0 No Date, 0 GPS Already Present.) +0x011a Image XResolution Rational 1 72/1 +0x011b Image YResolution Rational 1 72/1 +0x0128 Image ResolutionUnit Short 1 2 +0x0132 Image DateTime Ascii 20 2012:11:22 12:35:20 +0x0213 Image YCbCrPositioning Short 1 1 +0x8769 Image ExifTag Long 1 134 +0x9000 Photo ExifVersion Undefined 4 48 50 49 48 +0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:35:20 +0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:35:20 +0x9011 Photo OffsetTimeOriginal Ascii 7 -07:00 +0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 +0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 +0xa001 Photo ColorSpace Short 1 65535 +0xa002 Photo PixelXDimension Long 1 64 +0xa003 Photo PixelYDimension Long 1 64 +0x8825 Image GPSTag Long 1 296 +0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 +0x0001 GPSInfo GPSLatitudeRef Ascii 2 N +0x0002 GPSInfo GPSLatitude Rational 3 38/1 35/1 54874/1000 +0x0003 GPSInfo GPSLongitudeRef Ascii 2 W +0x0004 GPSInfo GPSLongitude Rational 3 109/1 34/1 24506/1000 +0x0005 GPSInfo GPSAltitudeRef Byte 1 0 +0x0006 GPSInfo GPSAltitude Rational 1 1180156/1000 +0x0007 GPSInfo GPSTimeStamp Rational 3 19/1 35/1 20/1 +0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 +0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 diff --git a/tests/data/test187.param b/tests/data/test187.param new file mode 100644 index 0000000..10bd5c3 --- /dev/null +++ b/tests/data/test187.param @@ -0,0 +1,6 @@ +TITLE='Correlate a file with automatic time zone detection, ignoring OffsetTime tag' +PRECOMMAND='cat "$STAGINGDIR/point1-6.jpg" >"$LOGDIR/test.jpg"' +COMMAND='env TZ=UTC $PROGRAM --no-photo-tz -v -g "$STAGINGDIR/track10.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' +POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' +RESULTCODE=2 +SEDCOMMAND='s@^([a-zA-Z]:)?/.*/|.*Copyright.*$@@' # strip path and copyright line diff --git a/tests/data/test187.result b/tests/data/test187.result new file mode 100644 index 0000000..f1be33a --- /dev/null +++ b/tests/data/test187.result @@ -0,0 +1,11 @@ + +Reading GPS Data... + +Correlate: +test.jpg: No match. + +Completed correlation process. +Used time zone offset 0:00 +Matched: 0 (0 Exact, 0 Interpolated, 0 Rounded). +Failed: 1 (1 Not matched, 0 Write failure, 0 Too Far, + 0 No Date, 0 GPS Already Present.) diff --git a/tests/data/test188.param b/tests/data/test188.param new file mode 100644 index 0000000..500bf04 --- /dev/null +++ b/tests/data/test188.param @@ -0,0 +1,6 @@ +# End location is the same as test 29 +TITLE='Correlate a file with OffsetTime tag <1h from UTC' +PRECOMMAND='cat "$STAGINGDIR/point1-7.jpg" >"$LOGDIR/test.jpg"' +COMMAND='$PROGRAM -t -O -1824 -g "$STAGINGDIR/track2.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' +POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' +RESULTCODE=0 diff --git a/tests/data/test188.result b/tests/data/test188.result new file mode 100644 index 0000000..cabb31f --- /dev/null +++ b/tests/data/test188.result @@ -0,0 +1,36 @@ +Reading GPS Data... +Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far + w = Write Fail, ? = No EXIF date, ! = GPS already present + +Correlate: / + +Completed correlation process. +Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). +Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, + 0 No Date, 0 GPS Already Present.) +0x011a Image XResolution Rational 1 72/1 +0x011b Image YResolution Rational 1 72/1 +0x0128 Image ResolutionUnit Short 1 2 +0x0132 Image DateTime Ascii 20 2012:11:22 12:35:20 +0x0213 Image YCbCrPositioning Short 1 1 +0x8769 Image ExifTag Long 1 134 +0x9000 Photo ExifVersion Undefined 4 48 50 49 48 +0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:35:20 +0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:35:20 +0x9011 Photo OffsetTimeOriginal Ascii 7 -00:30 +0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 +0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 +0xa001 Photo ColorSpace Short 1 65535 +0xa002 Photo PixelXDimension Long 1 64 +0xa003 Photo PixelYDimension Long 1 64 +0x8825 Image GPSTag Long 1 296 +0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 +0x0001 GPSInfo GPSLatitudeRef Ascii 2 N +0x0002 GPSInfo GPSLatitude Rational 3 47/1 25/1 16449600/1000000 +0x0003 GPSInfo GPSLongitudeRef Ascii 2 E +0x0004 GPSInfo GPSLongitude Rational 3 10/1 59/1 6888000/1000000 +0x0005 GPSInfo GPSAltitudeRef Byte 1 0 +0x0006 GPSInfo GPSAltitude Rational 1 2959867/1000 +0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 +0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 +0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 diff --git a/tests/data/test189.param b/tests/data/test189.param new file mode 100644 index 0000000..53ed176 --- /dev/null +++ b/tests/data/test189.param @@ -0,0 +1,5 @@ +TITLE='Correlate a file with invalid OffsetTime tag' +PRECOMMAND='cat "$STAGINGDIR/point1-8.jpg" >"$LOGDIR/test.jpg"' +COMMAND='env TZ=UTC $PROGRAM -g "$STAGINGDIR/track2.gpx" "$LOGDIR/test.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test.jpg" >> "$OUTFILE" 2>&1' +POSTCOMMAND='rm -f "$LOGDIR/test.jpg"' +RESULTCODE=0 diff --git a/tests/data/test189.result b/tests/data/test189.result new file mode 100644 index 0000000..db064bd --- /dev/null +++ b/tests/data/test189.result @@ -0,0 +1,36 @@ +Reading GPS Data... +Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far + w = Write Fail, ? = No EXIF date, ! = GPS already present + +Correlate: / + +Completed correlation process. +Matched: 1 (0 Exact, 1 Interpolated, 0 Rounded). +Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, + 0 No Date, 0 GPS Already Present.) +0x011a Image XResolution Rational 1 72/1 +0x011b Image YResolution Rational 1 72/1 +0x0128 Image ResolutionUnit Short 1 2 +0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 +0x0213 Image YCbCrPositioning Short 1 1 +0x8769 Image ExifTag Long 1 134 +0x9000 Photo ExifVersion Undefined 4 48 50 49 48 +0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 +0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 +0x9011 Photo OffsetTimeOriginal Ascii 5 3Z12 +0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 +0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 +0xa001 Photo ColorSpace Short 1 65535 +0xa002 Photo PixelXDimension Long 1 64 +0xa003 Photo PixelYDimension Long 1 64 +0x8825 Image GPSTag Long 1 294 +0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 +0x0001 GPSInfo GPSLatitudeRef Ascii 2 N +0x0002 GPSInfo GPSLatitude Rational 3 47/1 25/1 16449600/1000000 +0x0003 GPSInfo GPSLongitudeRef Ascii 2 E +0x0004 GPSInfo GPSLongitude Rational 3 10/1 59/1 6888000/1000000 +0x0005 GPSInfo GPSAltitudeRef Byte 1 0 +0x0006 GPSInfo GPSAltitude Rational 1 2959867/1000 +0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 +0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 +0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 diff --git a/tests/data/test190.param b/tests/data/test190.param new file mode 100644 index 0000000..4da4ec9 --- /dev/null +++ b/tests/data/test190.param @@ -0,0 +1,7 @@ +TITLE='Correlate multiple files with different OffsetTime tags' +# First file uses -07:00 (EXIF tag), second file uses -00:30 (EXIF tag) +PRECOMMAND='cat "$STAGINGDIR/point1-6.jpg" >"$LOGDIR/test1.jpg" && cat "$STAGINGDIR/point1-7.jpg" >"$LOGDIR/test2.jpg"' +COMMAND='env TZ=UTC $PROGRAM -v -O -1824 -t -g "$STAGINGDIR/track2.gpx" -g "$STAGINGDIR/track10.gpx" "$LOGDIR/test1.jpg" "$LOGDIR/test2.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test1.jpg" >> "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test2.jpg" >> "$OUTFILE" 2>&1' +POSTCOMMAND='rm -f "$LOGDIR/test1.jpg" "$LOGDIR/test2.jpg"' +RESULTCODE=0 +SEDCOMMAND='s@^([a-zA-Z]:)?/.*/|.*Copyright.*$@@' # strip path and copyright line diff --git a/tests/data/test190.result b/tests/data/test190.result new file mode 100644 index 0000000..41bda2c --- /dev/null +++ b/tests/data/test190.result @@ -0,0 +1,65 @@ + +Reading GPS Data... +Reading GPS Data... + +Correlate: +test1.jpg: Interpolated: Lat 38.697925, Long -109.664583, Elev 1307.055. +test2.jpg: Interpolated: Lat 47.421236, Long 10.985247, Elev 2959.867. + +Completed correlation process. +Used time zone offset (multiple) +Matched: 2 (0 Exact, 2 Interpolated, 0 Rounded). +Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, + 0 No Date, 0 GPS Already Present.) +0x011a Image XResolution Rational 1 72/1 +0x011b Image YResolution Rational 1 72/1 +0x0128 Image ResolutionUnit Short 1 2 +0x0132 Image DateTime Ascii 20 2012:11:22 12:35:20 +0x0213 Image YCbCrPositioning Short 1 1 +0x8769 Image ExifTag Long 1 134 +0x9000 Photo ExifVersion Undefined 4 48 50 49 48 +0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:35:20 +0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:35:20 +0x9011 Photo OffsetTimeOriginal Ascii 7 -07:00 +0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 +0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 +0xa001 Photo ColorSpace Short 1 65535 +0xa002 Photo PixelXDimension Long 1 64 +0xa003 Photo PixelYDimension Long 1 64 +0x8825 Image GPSTag Long 1 296 +0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 +0x0001 GPSInfo GPSLatitudeRef Ascii 2 N +0x0002 GPSInfo GPSLatitude Rational 3 38/1 41/1 52530/1000 +0x0003 GPSInfo GPSLongitudeRef Ascii 2 W +0x0004 GPSInfo GPSLongitude Rational 3 109/1 39/1 52499/1000 +0x0005 GPSInfo GPSAltitudeRef Byte 1 0 +0x0006 GPSInfo GPSAltitude Rational 1 1307055/1000 +0x0007 GPSInfo GPSTimeStamp Rational 3 19/1 4/1 56/1 +0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 +0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 +0x011a Image XResolution Rational 1 72/1 +0x011b Image YResolution Rational 1 72/1 +0x0128 Image ResolutionUnit Short 1 2 +0x0132 Image DateTime Ascii 20 2012:11:22 12:35:20 +0x0213 Image YCbCrPositioning Short 1 1 +0x8769 Image ExifTag Long 1 134 +0x9000 Photo ExifVersion Undefined 4 48 50 49 48 +0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:35:20 +0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:35:20 +0x9011 Photo OffsetTimeOriginal Ascii 7 -00:30 +0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 +0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 +0xa001 Photo ColorSpace Short 1 65535 +0xa002 Photo PixelXDimension Long 1 64 +0xa003 Photo PixelYDimension Long 1 64 +0x8825 Image GPSTag Long 1 296 +0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 +0x0001 GPSInfo GPSLatitudeRef Ascii 2 N +0x0002 GPSInfo GPSLatitude Rational 3 47/1 25/1 16449600/1000000 +0x0003 GPSInfo GPSLongitudeRef Ascii 2 E +0x0004 GPSInfo GPSLongitude Rational 3 10/1 59/1 6888000/1000000 +0x0005 GPSInfo GPSAltitudeRef Byte 1 0 +0x0006 GPSInfo GPSAltitude Rational 1 2959867/1000 +0x0007 GPSInfo GPSTimeStamp Rational 3 12/1 34/1 56/1 +0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 +0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 diff --git a/tests/data/test191.param b/tests/data/test191.param new file mode 100644 index 0000000..1d7c2f0 --- /dev/null +++ b/tests/data/test191.param @@ -0,0 +1,7 @@ +TITLE='Correlate multiple files with and without OffsetTime tags' +# First file uses -07:00 (EXIF tag), second file uses -02:00 (automatic) +PRECOMMAND='cat "$STAGINGDIR/point1-6.jpg" >"$LOGDIR/test1.jpg" && cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test2.jpg"' +COMMAND='env TZ=WGT2 $PROGRAM -v -t -g "$STAGINGDIR/track10.gpx" "$LOGDIR/test1.jpg" "$LOGDIR/test2.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test1.jpg" >> "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test2.jpg" >> "$OUTFILE" 2>&1' +POSTCOMMAND='rm -f "$LOGDIR/test1.jpg" "$LOGDIR/test2.jpg"' +RESULTCODE=0 +SEDCOMMAND='s@^([a-zA-Z]:)?/.*/|.*Copyright.*$@@' # strip path and copyright line diff --git a/tests/data/test191.result b/tests/data/test191.result new file mode 100644 index 0000000..c4d298d --- /dev/null +++ b/tests/data/test191.result @@ -0,0 +1,63 @@ + +Reading GPS Data... + +Correlate: +test1.jpg: Exact match: Lat 38.598576, Long -109.573474, Elev 1180.156. +test2.jpg: Interpolated: Lat 38.697925, Long -109.664568, Elev 1317.697. + +Completed correlation process. +Used time zone offset (multiple) +Matched: 2 (1 Exact, 1 Interpolated, 0 Rounded). +Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, + 0 No Date, 0 GPS Already Present.) +0x011a Image XResolution Rational 1 72/1 +0x011b Image YResolution Rational 1 72/1 +0x0128 Image ResolutionUnit Short 1 2 +0x0132 Image DateTime Ascii 20 2012:11:22 12:35:20 +0x0213 Image YCbCrPositioning Short 1 1 +0x8769 Image ExifTag Long 1 134 +0x9000 Photo ExifVersion Undefined 4 48 50 49 48 +0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:35:20 +0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:35:20 +0x9011 Photo OffsetTimeOriginal Ascii 7 -07:00 +0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 +0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 +0xa001 Photo ColorSpace Short 1 65535 +0xa002 Photo PixelXDimension Long 1 64 +0xa003 Photo PixelYDimension Long 1 64 +0x8825 Image GPSTag Long 1 296 +0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 +0x0001 GPSInfo GPSLatitudeRef Ascii 2 N +0x0002 GPSInfo GPSLatitude Rational 3 38/1 35/1 54874/1000 +0x0003 GPSInfo GPSLongitudeRef Ascii 2 W +0x0004 GPSInfo GPSLongitude Rational 3 109/1 34/1 24506/1000 +0x0005 GPSInfo GPSAltitudeRef Byte 1 0 +0x0006 GPSInfo GPSAltitude Rational 1 1180156/1000 +0x0007 GPSInfo GPSTimeStamp Rational 3 19/1 35/1 20/1 +0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 +0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 +0x011a Image XResolution Rational 1 72/1 +0x011b Image YResolution Rational 1 72/1 +0x0128 Image ResolutionUnit Short 1 2 +0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 +0x0213 Image YCbCrPositioning Short 1 1 +0x8769 Image ExifTag Long 1 134 +0x9000 Photo ExifVersion Undefined 4 48 50 49 48 +0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 +0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 +0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 +0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 +0xa001 Photo ColorSpace Short 1 65535 +0xa002 Photo PixelXDimension Long 1 64 +0xa003 Photo PixelYDimension Long 1 64 +0x8825 Image GPSTag Long 1 276 +0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 +0x0001 GPSInfo GPSLatitudeRef Ascii 2 N +0x0002 GPSInfo GPSLatitude Rational 3 38/1 41/1 52530/1000 +0x0003 GPSInfo GPSLongitudeRef Ascii 2 W +0x0004 GPSInfo GPSLongitude Rational 3 109/1 39/1 52444/1000 +0x0005 GPSInfo GPSAltitudeRef Byte 1 0 +0x0006 GPSInfo GPSAltitude Rational 1 1317697/1000 +0x0007 GPSInfo GPSTimeStamp Rational 3 14/1 34/1 56/1 +0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 +0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 diff --git a/tests/data/test192.param b/tests/data/test192.param new file mode 100644 index 0000000..d56e676 --- /dev/null +++ b/tests/data/test192.param @@ -0,0 +1,7 @@ +TITLE='Correlate multiple files with and without OffsetTime tags with manual time zone' +# Both files use -02:00 (manual) +PRECOMMAND='cat "$STAGINGDIR/point1-6.jpg" >"$LOGDIR/test1.jpg" && cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test2.jpg"' +COMMAND='env TZ=UTC $PROGRAM -v -z -2 -t -g "$STAGINGDIR/track10.gpx" "$LOGDIR/test1.jpg" "$LOGDIR/test2.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test1.jpg" >> "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test2.jpg" >> "$OUTFILE" 2>&1' +POSTCOMMAND='rm -f "$LOGDIR/test1.jpg" "$LOGDIR/test2.jpg"' +RESULTCODE=0 +SEDCOMMAND='s@^([a-zA-Z]:)?/.*/|.*Copyright.*$@@' # strip path and copyright line diff --git a/tests/data/test192.result b/tests/data/test192.result new file mode 100644 index 0000000..a437925 --- /dev/null +++ b/tests/data/test192.result @@ -0,0 +1,63 @@ + +Reading GPS Data... + +Correlate: +test1.jpg: Interpolated: Lat 38.697925, Long -109.664568, Elev 1317.754. +test2.jpg: Interpolated: Lat 38.697925, Long -109.664568, Elev 1317.697. + +Completed correlation process. +Used time zone offset -2:00 +Matched: 2 (0 Exact, 2 Interpolated, 0 Rounded). +Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, + 0 No Date, 0 GPS Already Present.) +0x011a Image XResolution Rational 1 72/1 +0x011b Image YResolution Rational 1 72/1 +0x0128 Image ResolutionUnit Short 1 2 +0x0132 Image DateTime Ascii 20 2012:11:22 12:35:20 +0x0213 Image YCbCrPositioning Short 1 1 +0x8769 Image ExifTag Long 1 134 +0x9000 Photo ExifVersion Undefined 4 48 50 49 48 +0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:35:20 +0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:35:20 +0x9011 Photo OffsetTimeOriginal Ascii 7 -07:00 +0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 +0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 +0xa001 Photo ColorSpace Short 1 65535 +0xa002 Photo PixelXDimension Long 1 64 +0xa003 Photo PixelYDimension Long 1 64 +0x8825 Image GPSTag Long 1 296 +0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 +0x0001 GPSInfo GPSLatitudeRef Ascii 2 N +0x0002 GPSInfo GPSLatitude Rational 3 38/1 41/1 52530/1000 +0x0003 GPSInfo GPSLongitudeRef Ascii 2 W +0x0004 GPSInfo GPSLongitude Rational 3 109/1 39/1 52446/1000 +0x0005 GPSInfo GPSAltitudeRef Byte 1 0 +0x0006 GPSInfo GPSAltitude Rational 1 1317754/1000 +0x0007 GPSInfo GPSTimeStamp Rational 3 14/1 35/1 20/1 +0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 +0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 +0x011a Image XResolution Rational 1 72/1 +0x011b Image YResolution Rational 1 72/1 +0x0128 Image ResolutionUnit Short 1 2 +0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 +0x0213 Image YCbCrPositioning Short 1 1 +0x8769 Image ExifTag Long 1 134 +0x9000 Photo ExifVersion Undefined 4 48 50 49 48 +0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 +0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 +0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 +0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 +0xa001 Photo ColorSpace Short 1 65535 +0xa002 Photo PixelXDimension Long 1 64 +0xa003 Photo PixelYDimension Long 1 64 +0x8825 Image GPSTag Long 1 276 +0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 +0x0001 GPSInfo GPSLatitudeRef Ascii 2 N +0x0002 GPSInfo GPSLatitude Rational 3 38/1 41/1 52530/1000 +0x0003 GPSInfo GPSLongitudeRef Ascii 2 W +0x0004 GPSInfo GPSLongitude Rational 3 109/1 39/1 52444/1000 +0x0005 GPSInfo GPSAltitudeRef Byte 1 0 +0x0006 GPSInfo GPSAltitude Rational 1 1317697/1000 +0x0007 GPSInfo GPSTimeStamp Rational 3 14/1 34/1 56/1 +0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 +0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 diff --git a/tests/data/test193.param b/tests/data/test193.param new file mode 100644 index 0000000..8c09b7d --- /dev/null +++ b/tests/data/test193.param @@ -0,0 +1,7 @@ +TITLE='Correlate multiple files with and without OffsetTime tags ignoring tags' +# Both files use -2:00 (automatic) +PRECOMMAND='cat "$STAGINGDIR/point1-6.jpg" >"$LOGDIR/test1.jpg" && cat "$STAGINGDIR/point1-1.jpg" >"$LOGDIR/test2.jpg"' +COMMAND='env TZ=WGT2 $PROGRAM -v --no-photo-tz -t -g "$STAGINGDIR/track10.gpx" "$LOGDIR/test1.jpg" "$LOGDIR/test2.jpg" > "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test1.jpg" >> "$OUTFILE" 2>&1 && exiv2 -pv pr "$LOGDIR/test2.jpg" >> "$OUTFILE" 2>&1' +POSTCOMMAND='rm -f "$LOGDIR/test1.jpg" "$LOGDIR/test2.jpg"' +RESULTCODE=0 +SEDCOMMAND='s@^([a-zA-Z]:)?/.*/|.*Copyright.*$@@' # strip path and copyright line diff --git a/tests/data/test193.result b/tests/data/test193.result new file mode 100644 index 0000000..a437925 --- /dev/null +++ b/tests/data/test193.result @@ -0,0 +1,63 @@ + +Reading GPS Data... + +Correlate: +test1.jpg: Interpolated: Lat 38.697925, Long -109.664568, Elev 1317.754. +test2.jpg: Interpolated: Lat 38.697925, Long -109.664568, Elev 1317.697. + +Completed correlation process. +Used time zone offset -2:00 +Matched: 2 (0 Exact, 2 Interpolated, 0 Rounded). +Failed: 0 (0 Not matched, 0 Write failure, 0 Too Far, + 0 No Date, 0 GPS Already Present.) +0x011a Image XResolution Rational 1 72/1 +0x011b Image YResolution Rational 1 72/1 +0x0128 Image ResolutionUnit Short 1 2 +0x0132 Image DateTime Ascii 20 2012:11:22 12:35:20 +0x0213 Image YCbCrPositioning Short 1 1 +0x8769 Image ExifTag Long 1 134 +0x9000 Photo ExifVersion Undefined 4 48 50 49 48 +0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:35:20 +0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:35:20 +0x9011 Photo OffsetTimeOriginal Ascii 7 -07:00 +0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 +0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 +0xa001 Photo ColorSpace Short 1 65535 +0xa002 Photo PixelXDimension Long 1 64 +0xa003 Photo PixelYDimension Long 1 64 +0x8825 Image GPSTag Long 1 296 +0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 +0x0001 GPSInfo GPSLatitudeRef Ascii 2 N +0x0002 GPSInfo GPSLatitude Rational 3 38/1 41/1 52530/1000 +0x0003 GPSInfo GPSLongitudeRef Ascii 2 W +0x0004 GPSInfo GPSLongitude Rational 3 109/1 39/1 52446/1000 +0x0005 GPSInfo GPSAltitudeRef Byte 1 0 +0x0006 GPSInfo GPSAltitude Rational 1 1317754/1000 +0x0007 GPSInfo GPSTimeStamp Rational 3 14/1 35/1 20/1 +0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 +0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 +0x011a Image XResolution Rational 1 72/1 +0x011b Image YResolution Rational 1 72/1 +0x0128 Image ResolutionUnit Short 1 2 +0x0132 Image DateTime Ascii 20 2012:11:22 12:34:56 +0x0213 Image YCbCrPositioning Short 1 1 +0x8769 Image ExifTag Long 1 134 +0x9000 Photo ExifVersion Undefined 4 48 50 49 48 +0x9003 Photo DateTimeOriginal Ascii 20 2012:11:22 12:34:56 +0x9004 Photo DateTimeDigitized Ascii 20 2012:11:22 12:34:56 +0x9101 Photo ComponentsConfiguration Undefined 4 1 2 3 0 +0xa000 Photo FlashpixVersion Undefined 4 48 49 48 48 +0xa001 Photo ColorSpace Short 1 65535 +0xa002 Photo PixelXDimension Long 1 64 +0xa003 Photo PixelYDimension Long 1 64 +0x8825 Image GPSTag Long 1 276 +0x0000 GPSInfo GPSVersionID Byte 4 2 2 0 0 +0x0001 GPSInfo GPSLatitudeRef Ascii 2 N +0x0002 GPSInfo GPSLatitude Rational 3 38/1 41/1 52530/1000 +0x0003 GPSInfo GPSLongitudeRef Ascii 2 W +0x0004 GPSInfo GPSLongitude Rational 3 109/1 39/1 52444/1000 +0x0005 GPSInfo GPSAltitudeRef Byte 1 0 +0x0006 GPSInfo GPSAltitude Rational 1 1317697/1000 +0x0007 GPSInfo GPSTimeStamp Rational 3 14/1 34/1 56/1 +0x0012 GPSInfo GPSMapDatum Ascii 7 WGS-84 +0x001d GPSInfo GPSDateStamp Ascii 11 2012:11:22 diff --git a/tests/data/test194.param b/tests/data/test194.param new file mode 100644 index 0000000..0dae47e --- /dev/null +++ b/tests/data/test194.param @@ -0,0 +1,6 @@ +TITLE='Show GPS data in GPX format with images including OffsetTime' +# First file uses -07:00 (EXIF tag), remainder use -02:00 (automatic) +COMMAND='env TZ=WGT2 $PROGRAM -x "$STAGINGDIR/withgps.jpg" "$STAGINGDIR/noelev.jpg" "$STAGINGDIR/withtz.jpg" > "$OUTFILE" 2>&1' +RESULTCODE=0 +# Strip paths & version number. +SEDCOMMAND='s/(creator="gpscorrelate )[^"]*/\1VERSION/;/\!--/s@[^ ]*/@@' diff --git a/tests/data/test194.result b/tests/data/test194.result new file mode 100644 index 0000000..483dad8 --- /dev/null +++ b/tests/data/test194.result @@ -0,0 +1,24 @@ + + + + + + 10.000 + + + + + + + + + 1180.156 + + + + + + diff --git a/tests/data/test195.param b/tests/data/test195.param new file mode 100644 index 0000000..40bf244 --- /dev/null +++ b/tests/data/test195.param @@ -0,0 +1,10 @@ +TITLE='Show GPS data in GPX format with images ignoring OffsetTime and out-of-order' +# All files use -01:00 (manual) +COMMAND='$PROGRAM -z 1 --no-photo-tz -x "$STAGINGDIR/withgps.jpg" "$STAGINGDIR/noelev.jpg" "$STAGINGDIR/withtz.jpg" > "$OUTFILE" 2>&1' +RESULTCODE=0 +# Strip paths & version number. Also, move the Warning: line(s) to the end of +# the file so they are in a known location (carefully, especially with edge +# cases like the line already appearing at the end of the file), since the +# blending of stdout/stderr is done differently on different platforms. +# Unfortunately, BSD sed doesn't support grouping commands with {}. +SEDCOMMAND='s/(creator="gpscorrelate )[^"]*/\1VERSION/;/\!--/s@[^ ]*/@@;$G;s/\n//;$q;/^Warning:/H;/^Warning:/d' diff --git a/tests/data/test195.result b/tests/data/test195.result new file mode 100644 index 0000000..ac00d90 --- /dev/null +++ b/tests/data/test195.result @@ -0,0 +1,25 @@ + + + + + + 10.000 + + + + + + + + + 1180.156 + + + + + + +Warning: image files are not ordered by time. diff --git a/tests/staging/point1-6.jpg b/tests/staging/point1-6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0838e85aa0fc722da24540442eecf518c7035e22 GIT binary patch literal 1151 zcmex=_8kk!d03G=MHiI*R2p_)?Kd*?8 zfRMPTh=iPxqMVG3oUM+Yijk*-kGH#nn`=N+aZ*5NZkVfEN=IsLd39q`qhCVr^q$&j z#dVD}{|_*5b1*nCI508_GW)~@hdWw*hqYOc0!yYS=n^Le&y-S%jUN1=g8H4~@EyD2Fa?ee|xmunv_cYBfJ zDfgFsqjCI>J71>-)=YaRvWw-Dj??1H1vOH+t~zI*3U+RcKEm|y;+FGw7XRTr>v-?+ zCcRrSdmnjCc*!zV`@7=>i5F(f$0m9;Dm1AGq`5}j{b=-`VNq0fQh04a!(^!`0+n8i zcPbqCd^t4IPp0a)(Cp(=mg|YEEa7!xWI1U)*?{wQyy@)LwfE{R^OiL&Tw1K_kRi;L zem~#z<(43yeLSf}V&|>?GklA>=qtETSdG7!LEbUC=-Q&!qQ!Z_-_4vH-m&zb5PkAB z@}L;6ZNb~yEt)wFPS(QqJN^jRTs_Fpq2%~Jo_9-IBkw{D_8=h!wp|xp3wP|uyV<(u z)6QrIRrd|+RVqD#&uMO%vS7uOwyC6arQA~Wzrvw6ZJI51yTZYDnOyRjwx@35D^&d)ai^&N<-un`4-PFZa(lqnyz-;B z#eA`QdViM~O_GXsXui|SKbO(&YqNOOnli`POP0@mxjN8Lp^4*%$t^uQPvBC2#PH{;pSoafXTtWpNg*qq6-KZ4&%k_XU$I47(YJ%!{k1Nt z@-eEaubb=m_HEFM2i50S^TirWd;ZSfF#I4xUDkTh?qu;isYI1YsoB;mzT3@h_eypZ K2?U|~|2F~Wp?`4z literal 0 HcmV?d00001 diff --git a/tests/staging/point1-7.jpg b/tests/staging/point1-7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..654e86764236fa4a1dfccc0f10ce36b603815be7 GIT binary patch literal 1151 zcmex=_8W>m^10DGPHiI*R2p_)?Kd*?8 zfRMPTh=iPxqMVG3oUM+Yijk*-kGH#nn`=N+aZ*5NZkVfEN=IsLd39q`qhCVr^q$&j z#dVD}{|_*5b1*nCI508_GW)~@hdWw*hqYOc0!yYS=n^Le&y-S%jUN1=g8H4~@EyD2Fa?ee|xmunv_cYBfJ zDfgFsqjCI>J71>-)=YaRvWw-Dj??1H1vOH+t~zI*3U+RcKEm|y;+FGw7XRTr>v-?+ zCcRrSdmnjCc*!zV`@7=>i5F(f$0m9;Dm1AGq`5}j{b=-`VNq0fQh04a!(^!`0+n8i zcPbqCd^t4IPp0a)(Cp(=mg|YEEa7!xWI1U)*?{wQyy@)LwfE{R^OiL&Tw1K_kRi;L zem~#z<(43yeLSf}V&|>?GklA>=qtETSdG7!LEbUC=-Q&!qQ!Z_-_4vH-m&zb5PkAB z@}L;6ZNb~yEt)wFPS(QqJN^jRTs_Fpq2%~Jo_9-IBkw{D_8=h!wp|xp3wP|uyV<(u z)6QrIRrd|+RVqD#&uMO%vS7uOwyC6arQA~Wzrvw6ZJI51yTZYDnOyRjwx@35D^&d)ai^&N<-un`4-PFZa(lqnyz-;B z#eA`QdViM~O_GXsXui|SKbO(&YqNOOnli`POP0@mxjN8Lp^4*%$t^uQPvBC2#PH{;pSoafXTtWpNg*qq6-KZ4&%k_XU$I47(YJ%!{k1Nt z@-eEaubb=m_HEFM2i50S^TirWd;ZSfF#I4xUDkTh?qu;isYI1YsoB;mzT3@h_eypZ K2?U|~|2F~JZ+~q7 literal 0 HcmV?d00001 diff --git a/tests/staging/point1-8.jpg b/tests/staging/point1-8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..63a5dea74a7efec18edd777edba8fc3ab26f8fef GIT binary patch literal 1149 zcmex=j z0+?Py1A_&O5SRS_&%m&N3GNby1jYCuD~W{9A#((45Ql&&I}@a{6hS^B0>T} z;-VrFaz=`BGBR?uI(jNbo(?|V?hbCQ0a3+C0in5Ju5KwEsk!CVjZKYy3BA*MYNr*~ zHP-w;z`)JH;K1O($SBD0{|JLL0|PTK7J%^p2dr!?%8E3 z0nn#{3@ogQhHOHPfsKiU6NQZyiYOfvRSvrN;r}fL4v;za44W5qX@Jo5l%i`9SNgBo zo?2SF!f%z`2CJ&M+Pdw+kJr!V*|v4tqb(kV1|ro=oFeb0q*%1e_r_nYeYD)|MUJQ3 zU-pg0@jLE(ofcR#?VZRjmQOlPi!T?{NaecfoP8?TxiR_()5D8f&fi)5hxe@Gy~msM zZprL@}ju#|em@yxl=+&suq#}^!8g=)h(SL?TQQb-5wFM26rKSi}dM)0m zaNzUh&`3X-s^dblk55^yC$h4H*NKtkr1fM2&fD>(vs>5RtGCQs*0gYGv93dgFkAZl zeAAa(f_(Pzq!x*txBAcUE$X7L;6hjc(tkqq$=Aq( zV!XBmZ*R9~<~TT63)}DbBVcp&AVY_ez+?L zqa9S;H>_8w^awtuxn;_N6;qaPP0R4%zjbO9Dtf9oHouI0X)lyAz5AGWB=f74i5w~(EGOqTWO<7p zxxVJU+3MY`mU&wl9t5y4T1{kf$!FT0x{0q)^>f6XqW+f$p9MWQw7AIa0bldVkKPvZ z#qR0-U1BszD%zp>PA~slM!T=g;#F(P9A__CKKteBKtqKljvppJZ%^N`UFYmBp=EDw z*_;wq;af6s$=vqL@2g7`br))QIR#B%a=5{`Vcpbr&HjA#l&71IG_24JxT})m{`bn2 zNfmPMUpuXv!COCpOZ^eUpR0cAg1Mau+w&%ctaw%!z2ZLu^QC>o7Hvh}4sQ3?x~R&> zsH(nhuH)OcK`$OupI^-vYcTEkJAcFQgA8?9>qWbh#q*>RRVJloTd(+TH@Dp@*;OPE JgzEp_1OOLHe@6fS literal 0 HcmV?d00001 diff --git a/tests/staging/withtz.jpg b/tests/staging/withtz.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7506dfd9a8e17300e0eee2a82ca542e9da0dbd5f GIT binary patch literal 1389 zcmex==!g`x6Lec-rb z40jLKwJ<>r1z?)E&EU)+!pASf&nqG%AS5m-A|Yp_C?_K$XRD*9V&v)Ik68|Lbk(vg~5UftN#=$Ftty{C3sab080{{sx%91IQ&4vdU~4F8WXNCRB~Om)C? z2M4TdEX?doj6g|!0R~29W+ql+YH>=`yM>e2wA=_y6mBChmbwLP`8c7@+6yA4)VbG3Ebg&(h<&$Dgowntk$ z3JpZ6nK(t>O-Zq6m+y_gT>EIb+lw4exxefijpKLR`8qAIX4*TET`Zq;oEBd$sFBKb z)j9iAuybSd5vGS1x17JT_z&+{$9s=A>D`jq`^am;OO~nH-yJVVyf9-vHqon5p-Dv` z%{A)oN2C7?i=w)d!fOi}CQD5bsPtOAQ{lkp%b}5eGF8WgW*?ujTu)?W39l0)%Sr3W z2AsF!O=q{Ry;pCUx2$R5(qdhQ3}LqP`}w9Xw*>j@<4G+NJ8$)$;ak*2U%`dKYW&3v z@{Z9(*A~4NEzT4EZsz3hj-~&E=##IJ2gP`83*O#t(adphvKF@A@khYs>OqDMCCB&i zyj$8Dc^7K12MIB-?Yih%xMN4&&DK4ic1Am>x^GyoQt1(VPIJqY1uLd3-=OaJF=P&B z;mJw0O(mr(<(8`d6%M^=(`>QZHD8z~pd) zal^W)?VA1h>M2h*A8A;j8E{u6$Nle>E0ZeZ-oJKQH-oo+0+;$DhCf&R)CF@p6Sn6~ z3R&^2FnYy*2IfoqiY?lTz8&1|uXRzCk5N^9-CW1FZ-ZVus6M}%FV