diff --git a/src/docs/HISTORY.md b/src/docs/HISTORY.md
index f8f1167c6..675a5acb8 100644
--- a/src/docs/HISTORY.md
+++ b/src/docs/HISTORY.md
@@ -8,6 +8,9 @@ v1.2.6
 - Added Portuguese, Italian and French translations done with AI.
 - Added top bar OCIO / Color toggle (Hotkey 't' by default).
 - Added lumma channel (Hotkey 'l' by default).
+- Allowed saving .otio movie files as .mp4, .mov, etc. files.  This allows
+  turning an .otio file into a new movie file.  Useful when concatenating
+  movies with the Playlist panel or the -edl command-line switch.
   
 
 v1.2.5
diff --git a/src/lib/mrvFl/mrvSaveMovie.cpp b/src/lib/mrvFl/mrvSaveMovie.cpp
index af8424fae..fe2dfc4fd 100644
--- a/src/lib/mrvFl/mrvSaveMovie.cpp
+++ b/src/lib/mrvFl/mrvSaveMovie.cpp
@@ -208,7 +208,8 @@ namespace mrv
             const bool hasVideo = !info.video.empty();
 
             if (player->timeRange() != timeRange ||
-                info.videoTime.start_time() != timeRange.start_time())
+                info.videoTime.start_time() != timeRange.start_time() ||
+                info.videoTime.duration() != timeRange.duration())
             {
                 double videoRate = info.videoTime.duration().rate();
                 videoTime = otime::TimeRange(
@@ -652,7 +653,7 @@ namespace mrv
             size_t totalSamples = 0;
             size_t currentSampleCount =
                 startTime.rescaled_to(sampleRate).value();
-
+            
             while (running)
             {
                 context->tick();
@@ -770,66 +771,72 @@ namespace mrv
                     else
                     {
                         // Get the videoData
-                        const auto videoData =
+                        auto videoData =
                             timeline->getVideo(currentTime).future.get();
+                        
                         if (videoData.layers.empty() ||
                             !videoData.layers[0].image)
                         {
                             std::string err =
-                                string::Format(
-                                    _("Empty video data at time {0}."))
+                                string::Format(_("Empty video data at time "
+                                                 "{0}.  Repeating frame."))
                                     .arg(currentTime);
-                            LOG_ERROR(err);
+                            LOG_WARNING(err);
                         }
-
-                        // This refreshes the view window
-                        if (interactive)
+                        else
                         {
-                            view->make_current();
-                            view->currentVideoCallback({videoData});
-                            view->flush();
-                        }
+
+                            // This refreshes the view window
+                            if (interactive)
+                            {
+                                view->make_current();
+                                view->currentVideoCallback({videoData});
+                                view->flush();
+                            }
                         
-                        // back to conventional pixel operation
-                        glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
-                        // CHECK_GL;
-                        glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
+                            // back to conventional pixel operation
+                            glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
+                            // CHECK_GL;
+                            glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
 
-                        if (interactive)
-                            gl::initGLAD();
+                            if (interactive)
+                                gl::initGLAD();
 
-                        // Render the video to an offscreen buffer.
-                        gl::OffscreenBufferBinding binding(buffer);
-                        {
-                            locale::SetAndRestore saved;
-                            render->begin(offscreenBufferSize);
-                            render->setOCIOOptions(view->getOCIOOptions());
-                            render->setLUTOptions(view->lutOptions());
-                            render->drawVideo(
-                                {videoData},
-                                {math::Box2i(0, 0, renderSize.w, renderSize.h)},
-                                {timeline::ImageOptions()},
-                                {timeline::DisplayOptions()},
-                                timeline::CompareOptions(),
-                                ui->uiView->getBackgroundOptions());
-                            render->end();
-                        }
+                            // Render the video to an offscreen buffer.
+                            gl::OffscreenBufferBinding binding(buffer);
+                            {
+                                locale::SetAndRestore saved;
+                                render->begin(offscreenBufferSize);
+                                render->setOCIOOptions(view->getOCIOOptions());
+                                render->setLUTOptions(view->lutOptions());
+                                render->drawVideo(
+                                    {videoData},
+                                    {math::Box2i(0, 0, renderSize.w, renderSize.h)},
+                                    {timeline::ImageOptions()},
+                                    {timeline::DisplayOptions()},
+                                    timeline::CompareOptions(),
+                                    ui->uiView->getBackgroundOptions());
+                                render->end();
+                            }
 
-                        glPixelStorei(
-                            GL_PACK_ALIGNMENT, outputInfo.layout.alignment);
+                            glPixelStorei(
+                                GL_PACK_ALIGNMENT, outputInfo.layout.alignment);
 #if defined(TLRENDER_API_GL_4_1)
-                        glPixelStorei(
-                            GL_PACK_SWAP_BYTES,
-                            outputInfo.layout.endian != memory::getEndian());
+                            glPixelStorei(
+                                GL_PACK_SWAP_BYTES,
+                                outputInfo.layout.endian != memory::getEndian());
 #endif // TLRENDER_API_GL_4_1
 
-                        glReadPixels(
-                            0, 0, outputInfo.size.w, outputInfo.size.h, format,
-                            type, outputImage->getData());
+                            glReadPixels(
+                                0, 0, outputInfo.size.w, outputInfo.size.h, format,
+                                type, outputImage->getData());
+                        }
                     }
 
                     if (videoTime.contains(currentTime))
+                    {
                         writer->writeVideo(currentTime, outputImage);
+                    }
                 }
 
                 if (hasVideo)
diff --git a/src/po/de.po b/src/po/de.po
index 02cfa6464..bb104af67 100644
--- a/src/po/de.po
+++ b/src/po/de.po
@@ -2816,8 +2816,8 @@ msgstr "OpenGL Info: {0}"
 msgid "Saving... {0}"
 msgstr "Speichern... {0}"
 
-msgid "Empty video data at time {0}."
-msgstr "Leere Videodaten zur Zeit {0}."
+msgid "Empty video data at time {0}.  Repeating frame."
+msgstr "Leere Videodaten zur Zeit {0}. Wiederholungsbild."
 
 msgid "Reading preferences from \"{0}{1}\"."
 msgstr "Voreinstellungen von \"{0}{1}\" lesen."
diff --git a/src/po/en.po b/src/po/en.po
index c7c0fea8d..436ad3a35 100644
--- a/src/po/en.po
+++ b/src/po/en.po
@@ -19,14 +19,12 @@ msgid ""
 "\n"
 "USD module.\n"
 "\n"
-"Contains all classes and enums related to USD (Universal Scene "
-"Description). \n"
+"Contains all classes and enums related to USD (Universal Scene Description). \n"
 msgstr ""
 "\n"
 "USD module.\n"
 "\n"
-"Contains all classes and enums related to USD (Universal Scene "
-"Description). \n"
+"Contains all classes and enums related to USD (Universal Scene Description). \n"
 
 msgid "Renderer Name"
 msgstr "Renderer Name"
@@ -310,11 +308,11 @@ msgid "Duplicated Python plugin {0} in {1} and {2}."
 msgstr "Duplicated Python plugin {0} in {1} and {2}."
 
 msgid ""
-"Expected a tuple containing a Python function and a string with menu options "
-"in it."
+"Expected a tuple containing a Python function and a string with menu options"
+" in it."
 msgstr ""
-"Expected a tuple containing a Python function and a string with menu options "
-"in it."
+"Expected a tuple containing a Python function and a string with menu options"
+" in it."
 
 msgid ""
 "Expected a handle to a Python function or to a tuple containing a Python "
@@ -402,8 +400,7 @@ msgid ""
 "        Dictionary of menu entries as keys with callbacks as values.\n"
 "\n"
 "\n"
-"        :return: A dictionary of menu entries and their corresponding "
-"callbacks.\n"
+"        :return: A dictionary of menu entries and their corresponding callbacks.\n"
 "        :rtype: dict\n"
 "\n"
 "        \"\"\"\n"
@@ -447,8 +444,7 @@ msgstr ""
 "        Dictionary of menu entries as keys with callbacks as values.\n"
 "\n"
 "\n"
-"        :return: A dictionary of menu entries and their corresponding "
-"callbacks.\n"
+"        :return: A dictionary of menu entries and their corresponding callbacks.\n"
 "        :rtype: dict\n"
 "\n"
 "        \"\"\"\n"
@@ -508,24 +504,20 @@ msgstr "unsupported operand type(s) for {0}: RationalTime and {1}"
 
 msgid ""
 "\n"
-"The RationalTime class represents a measure of time of :math:`rt.value/rt."
-"rate` seconds.\n"
+"The RationalTime class represents a measure of time of :math:`rt.value/rt.rate` seconds.\n"
 "It can be rescaled into another :class:`~RationalTime`'s rate.\n"
 msgstr ""
 "\n"
-"The RationalTime class represents a measure of time of :math:`rt.value/rt."
-"rate` seconds.\n"
+"The RationalTime class represents a measure of time of :math:`rt.value/rt.rate` seconds.\n"
 "It can be rescaled into another :class:`~RationalTime`'s rate.\n"
 
 msgid ""
 "\n"
-"Returns true if the time is invalid. The time is considered invalid if the "
-"value or the rate are a NaN value\n"
+"Returns true if the time is invalid. The time is considered invalid if the value or the rate are a NaN value\n"
 "or if the rate is less than or equal to zero.\n"
 msgstr ""
 "\n"
-"Returns true if the time is invalid. The time is considered invalid if the "
-"value or the rate are a NaN value\n"
+"Returns true if the time is invalid. The time is considered invalid if the value or the rate are a NaN value\n"
 "or if the rate is less than or equal to zero.\n"
 
 msgid "Returns the time value for time converted to new_rate."
@@ -539,43 +531,35 @@ msgstr "Returns the time value for \"self\" converted to new_rate."
 
 msgid ""
 "\n"
-"Compute the duration of samples from first to last (excluding last). This is "
-"not the same as distance.\n"
+"Compute the duration of samples from first to last (excluding last). This is not the same as distance.\n"
 "\n"
-"For example, the duration of a clip from frame 10 to frame 15 is 5 frames. "
-"Result will be in the rate of start_time.\n"
+"For example, the duration of a clip from frame 10 to frame 15 is 5 frames. Result will be in the rate of start_time.\n"
 msgstr ""
 "\n"
-"Compute the duration of samples from first to last (excluding last). This is "
-"not the same as distance.\n"
+"Compute the duration of samples from first to last (excluding last). This is not the same as distance.\n"
 "\n"
-"For example, the duration of a clip from frame 10 to frame 15 is 5 frames. "
-"Result will be in the rate of start_time.\n"
+"For example, the duration of a clip from frame 10 to frame 15 is 5 frames. Result will be in the rate of start_time.\n"
 
 msgid ""
 "\n"
-"Compute the duration of samples from first to last (including last). This is "
-"not the same as distance.\n"
+"Compute the duration of samples from first to last (including last). This is not the same as distance.\n"
 "\n"
-"For example, the duration of a clip from frame 10 to frame 15 is 6 frames. "
-"Result will be in the rate of start_time.\n"
+"For example, the duration of a clip from frame 10 to frame 15 is 6 frames. Result will be in the rate of start_time.\n"
 msgstr ""
 "\n"
-"Compute the duration of samples from first to last (including last). This is "
-"not the same as distance.\n"
+"Compute the duration of samples from first to last (including last). This is not the same as distance.\n"
 "\n"
-"For example, the duration of a clip from frame 10 to frame 15 is 6 frames. "
-"Result will be in the rate of start_time.\n"
+"For example, the duration of a clip from frame 10 to frame 15 is 6 frames. Result will be in the rate of start_time.\n"
 
 msgid "Returns true if the rate is valid for use with timecode."
 msgstr "Returns true if the rate is valid for use with timecode."
 
 msgid ""
-"Returns the first valid timecode rate that has the least difference from the "
-"given value."
+"Returns the first valid timecode rate that has the least difference from the"
+" given value."
 msgstr ""
-"Returns the first valid timecode rate that has the least difference from the "
-"given value."
+"Returns the first valid timecode rate that has the least difference from the"
+" given value."
 
 msgid "Turn a frame number and rate into a :class:`~RationalTime` object."
 msgstr "Turn a frame number and rate into a :class:`~RationalTime` object."
@@ -590,9 +574,11 @@ msgid "Convert to timecode (``HH:MM:SS;FRAME``)"
 msgstr "Convert to timecode (``HH:MM:SS;FRAME``)"
 
 msgid ""
-"Convert a timecode string (``HH:MM:SS;FRAME``) into a :class:`~RationalTime`."
+"Convert a timecode string (``HH:MM:SS;FRAME``) into a "
+":class:`~RationalTime`."
 msgstr ""
-"Convert a timecode string (``HH:MM:SS;FRAME``) into a :class:`~RationalTime`."
+"Convert a timecode string (``HH:MM:SS;FRAME``) into a "
+":class:`~RationalTime`."
 
 msgid ""
 "Convert a time with microseconds string (``HH:MM:ss`` where ``ss`` is an "
@@ -603,17 +589,13 @@ msgstr ""
 
 msgid ""
 "\n"
-"The TimeRange class represents a range in time. It encodes the start time "
-"and the duration,\n"
-"meaning that :meth:`end_time_inclusive` (last portion of a sample in the "
-"time range) and\n"
+"The TimeRange class represents a range in time. It encodes the start time and the duration,\n"
+"meaning that :meth:`end_time_inclusive` (last portion of a sample in the time range) and\n"
 ":meth:`end_time_exclusive` can be computed.\n"
 msgstr ""
 "\n"
-"The TimeRange class represents a range in time. It encodes the start time "
-"and the duration,\n"
-"meaning that :meth:`end_time_inclusive` (last portion of a sample in the "
-"time range) and\n"
+"The TimeRange class represents a range in time. It encodes the start time and the duration,\n"
+"meaning that :meth:`end_time_inclusive` (last portion of a sample in the time range) and\n"
 ":meth:`end_time_exclusive` can be computed.\n"
 
 msgid ""
@@ -626,8 +608,7 @@ msgid ""
 "If the time range starts at (0, 24) with duration (10.5, 24):\n"
 "(10, 24)\n"
 "\n"
-"In other words, the last frame with data, even if the last frame is "
-"fractional.\n"
+"In other words, the last frame with data, even if the last frame is fractional.\n"
 msgstr ""
 "\n"
 "The time of the last sample containing data in the time range.\n"
@@ -638,8 +619,7 @@ msgstr ""
 "If the time range starts at (0, 24) with duration (10.5, 24):\n"
 "(10, 24)\n"
 "\n"
-"In other words, the last frame with data, even if the last frame is "
-"fractional.\n"
+"In other words, the last frame with data, even if the last frame is fractional.\n"
 
 msgid ""
 "\n"
@@ -660,7 +640,8 @@ msgstr ""
 "If start frame is 10 and duration is 5.5, then end_time_exclusive is\n"
 "15.5, because the last time with data in this range is 15.\n"
 
-msgid "Construct a new :class:`~TimeRange` that is this one extended by other."
+msgid ""
+"Construct a new :class:`~TimeRange` that is this one extended by other."
 msgstr ""
 "Construct a new :class:`~TimeRange` that is this one extended by other."
 
@@ -749,10 +730,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"The start of `this` strictly precedes end of `other` by a value >= "
-"`epsilon_s`.\n"
-"The end of `this` strictly antecedes start of `other` by a value >= "
-"`epsilon_s`.\n"
+"The start of `this` strictly precedes end of `other` by a value >= `epsilon_s`.\n"
+"The end of `this` strictly antecedes start of `other` by a value >= `epsilon_s`.\n"
 "::\n"
 "\n"
 "   [ this ]\n"
@@ -761,10 +740,8 @@ msgid ""
 "The converse would be ``other.overlaps(this)``\n"
 msgstr ""
 "\n"
-"The start of `this` strictly precedes end of `other` by a value >= "
-"`epsilon_s`.\n"
-"The end of `this` strictly antecedes start of `other` by a value >= "
-"`epsilon_s`.\n"
+"The start of `this` strictly precedes end of `other` by a value >= `epsilon_s`.\n"
+"The end of `this` strictly antecedes start of `other` by a value >= `epsilon_s`.\n"
 "::\n"
 "\n"
 "   [ this ]\n"
@@ -834,8 +811,7 @@ msgstr ""
 msgid ""
 "\n"
 "The start of `this` strictly equals the start of `other`.\n"
-"The end of `this` strictly precedes the end of `other` by a value >= "
-"`epsilon_s`.\n"
+"The end of `this` strictly precedes the end of `other` by a value >= `epsilon_s`.\n"
 "::\n"
 "\n"
 "   [ this ]\n"
@@ -845,8 +821,7 @@ msgid ""
 msgstr ""
 "\n"
 "The start of `this` strictly equals the start of `other`.\n"
-"The end of `this` strictly precedes the end of `other` by a value >= "
-"`epsilon_s`.\n"
+"The end of `this` strictly precedes the end of `other` by a value >= `epsilon_s`.\n"
 "::\n"
 "\n"
 "   [ this ]\n"
@@ -877,8 +852,7 @@ msgstr ""
 
 msgid ""
 "\n"
-"The start of `this` strictly antecedes the start of `other` by a value >= "
-"`epsilon_s`.\n"
+"The start of `this` strictly antecedes the start of `other` by a value >= `epsilon_s`.\n"
 "The end of `this` strictly equals the end of `other`.\n"
 "::\n"
 "\n"
@@ -888,8 +862,7 @@ msgid ""
 "The converse would be ``other.finishes(this)``\n"
 msgstr ""
 "\n"
-"The start of `this` strictly antecedes the start of `other` by a value >= "
-"`epsilon_s`.\n"
+"The start of `this` strictly antecedes the start of `other` by a value >= `epsilon_s`.\n"
 "The end of `this` strictly equals the end of `other`.\n"
 "::\n"
 "\n"
@@ -900,10 +873,8 @@ msgstr ""
 
 msgid ""
 "\n"
-"The start of `this` precedes or equals the end of `other` by a value >= "
-"`epsilon_s`.\n"
-"The end of `this` antecedes or equals the start of `other` by a value >= "
-"`epsilon_s`.\n"
+"The start of `this` precedes or equals the end of `other` by a value >= `epsilon_s`.\n"
+"The end of `this` antecedes or equals the start of `other` by a value >= `epsilon_s`.\n"
 "::\n"
 "\n"
 "   [    this    ]           OR      [    other    ]\n"
@@ -912,10 +883,8 @@ msgid ""
 "The converse would be ``other.finishes(this)``\n"
 msgstr ""
 "\n"
-"The start of `this` precedes or equals the end of `other` by a value >= "
-"`epsilon_s`.\n"
-"The end of `this` antecedes or equals the start of `other` by a value >= "
-"`epsilon_s`.\n"
+"The start of `this` precedes or equals the end of `other` by a value >= `epsilon_s`.\n"
+"The end of `this` antecedes or equals the start of `other` by a value >= `epsilon_s`.\n"
 "::\n"
 "\n"
 "   [    this    ]           OR      [    other    ]\n"
@@ -925,33 +894,25 @@ msgstr ""
 
 msgid ""
 "\n"
-"Creates a :class:`~TimeRange` from start and end :class:`~RationalTime`\\s "
-"(exclusive).\n"
+"Creates a :class:`~TimeRange` from start and end :class:`~RationalTime`\\s (exclusive).\n"
 "\n"
-"For example, if start_time is 1 and end_time is 10, the returned will have a "
-"duration of 9.\n"
+"For example, if start_time is 1 and end_time is 10, the returned will have a duration of 9.\n"
 msgstr ""
 "\n"
-"Creates a :class:`~TimeRange` from start and end :class:`~RationalTime`\\s "
-"(exclusive).\n"
+"Creates a :class:`~TimeRange` from start and end :class:`~RationalTime`\\s (exclusive).\n"
 "\n"
-"For example, if start_time is 1 and end_time is 10, the returned will have a "
-"duration of 9.\n"
+"For example, if start_time is 1 and end_time is 10, the returned will have a duration of 9.\n"
 
 msgid ""
 "\n"
-"Creates a :class:`~TimeRange` from start and end :class:`~RationalTime`\\s "
-"(inclusive).\n"
+"Creates a :class:`~TimeRange` from start and end :class:`~RationalTime`\\s (inclusive).\n"
 "\n"
-"For example, if start_time is 1 and end_time is 10, the returned will have a "
-"duration of 10.\n"
+"For example, if start_time is 1 and end_time is 10, the returned will have a duration of 10.\n"
 msgstr ""
 "\n"
-"Creates a :class:`~TimeRange` from start and end :class:`~RationalTime`\\s "
-"(inclusive).\n"
+"Creates a :class:`~TimeRange` from start and end :class:`~RationalTime`\\s (inclusive).\n"
 "\n"
-"For example, if start_time is 1 and end_time is 10, the returned will have a "
-"duration of 10.\n"
+"For example, if start_time is 1 and end_time is 10, the returned will have a duration of 10.\n"
 
 msgid ""
 "\n"
@@ -1410,14 +1371,12 @@ msgid ""
 "\n"
 "Command module.\n"
 "\n"
-"Used to run main commands and get arguments and set the display, image, "
-"compare, LUT options.\n"
+"Used to run main commands and get arguments and set the display, image, compare, LUT options.\n"
 msgstr ""
 "\n"
 "Command module.\n"
 "\n"
-"Used to run main commands and get arguments and set the display, image, "
-"compare, LUT options.\n"
+"Used to run main commands and get arguments and set the display, image, compare, LUT options.\n"
 
 msgid ""
 "Get command-line arguments passed as single quoted string to -pythonArgs."
@@ -1638,11 +1597,11 @@ msgid "Python Script to run and exit."
 msgstr "Python Script to run and exit."
 
 msgid ""
-"Python Arguments to pass to the Python script as a single quoted string like "
-"\"arg1 'arg2 asd' arg3\", stored in cmd.argv."
+"Python Arguments to pass to the Python script as a single quoted string like"
+" \"arg1 'arg2 asd' arg3\", stored in cmd.argv."
 msgstr ""
-"Python Arguments to pass to the Python script as a single quoted string like "
-"\"arg1 'arg2 asd' arg3\", stored in cmd.argv."
+"Python Arguments to pass to the Python script as a single quoted string like"
+" \"arg1 'arg2 asd' arg3\", stored in cmd.argv."
 
 msgid "Reset settings to defaults."
 msgstr "Reset settings to defaults."
@@ -2907,17 +2866,19 @@ msgstr "Saving audio to {0}."
 msgid "Saving pictures to {0}."
 msgstr "Saving pictures to {0}."
 
-#, fuzzy
 msgid "ProRes profiles need a .mov movie extension.  Changing it to .mov."
-msgstr "HAP profile needs a .mov extension.  Changing it to .mov"
+msgstr "ProRes profiles need a .mov movie extension.  Changing it to .mov."
 
 msgid ""
-"VP9 profile needs a .mp4, .mkv or .webm movie extension.  Changing it to .mp4"
+"VP9 profile needs a .mp4, .mkv or .webm movie extension.  Changing it to "
+".mp4"
 msgstr ""
-"VP9 profile needs a .mp4, .mkv or .webm movie extension.  Changing it to .mp4"
+"VP9 profile needs a .mp4, .mkv or .webm movie extension.  Changing it to "
+".mp4"
 
 msgid "AV1 profile needs a .mp4 or .mkv movie extension.  Changing it to .mp4"
-msgstr "AV1 profile needs a .mp4 or .mkv movie extension.  Changing it to .mp4"
+msgstr ""
+"AV1 profile needs a .mp4 or .mkv movie extension.  Changing it to .mp4"
 
 msgid ""
 "GoPro Cineform profile needs a .mkv movie extension.  Changing it to .mkv"
@@ -2986,8 +2947,8 @@ msgstr "OpenGL info: {0}"
 msgid "Saving... {0}"
 msgstr "Saving... {0}"
 
-msgid "Empty video data at time {0}."
-msgstr "Empty video data at time {0}."
+msgid "Empty video data at time {0}.  Repeating frame."
+msgstr "Empty video data at time {0}.  Repeating frame."
 
 msgid "Reading preferences from \"{0}{1}\"."
 msgstr "Reading preferences from \"{0}{1}\"."
@@ -3503,11 +3464,11 @@ msgid "Unknown action mode in "
 msgstr "Unknown action mode in "
 
 msgid ""
-"Cannot create an annotation here for all frames.  A current frame annotation "
-"already exists."
+"Cannot create an annotation here for all frames.  A current frame annotation"
+" already exists."
 msgstr ""
-"Cannot create an annotation here for all frames.  A current frame annotation "
-"already exists."
+"Cannot create an annotation here for all frames.  A current frame annotation"
+" already exists."
 
 msgid ""
 "Cannot create an annotation here for current frame.  An all frames "
@@ -4065,11 +4026,11 @@ msgid "Detail mode"
 msgstr "Detail mode"
 
 msgid ""
-"Could not create directory '%s'. You may not have permission to perform this "
-"operation."
+"Could not create directory '%s'. You may not have permission to perform this"
+" operation."
 msgstr ""
-"Could not create directory '%s'. You may not have permission to perform this "
-"operation."
+"Could not create directory '%s'. You may not have permission to perform this"
+" operation."
 
 msgid "An error ocurred while trying to delete '%s'. %s"
 msgstr "An error ocurred while trying to delete '%s'. %s"
@@ -5012,24 +4973,20 @@ msgid ""
 "      Y = 0.2126 R + 0.7152 G + 0.0722 B\n"
 "Y' (Lumma) is the weighted pixel value according to:\n"
 "      Y' = ( R + G + B ) / 3.0\n"
-"L (Lightness) is the human perception of luminance of the image which is non "
-"linear.\n"
+"L (Lightness) is the human perception of luminance of the image which is non linear.\n"
 "According to CIE No.15.2:\n"
 "      L = (116 * Y ^ 1/3 - 16) / 100\n"
-"A pixel of Y = 0.18 (L = 0.5) will appear about half as bright as Y = L = "
-"1.0 (white)."
+"A pixel of Y = 0.18 (L = 0.5) will appear about half as bright as Y = L = 1.0 (white)."
 msgstr ""
 "Switch brightness calculation.\n"
 "Y (Luminance) is the pixel value according to Rec709:\n"
 "      Y = 0.2126 R + 0.7152 G + 0.0722 B\n"
 "Y' (Lumma) is the weighted pixel value according to:\n"
 "      Y' = ( R + G + B ) / 3.0\n"
-"L (Lightness) is the human perception of luminance of the image which is non "
-"linear.\n"
+"L (Lightness) is the human perception of luminance of the image which is non linear.\n"
 "According to CIE No.15.2:\n"
 "      L = (116 * Y ^ 1/3 - 16) / 100\n"
-"A pixel of Y = 0.18 (L = 0.5) will appear about half as bright as Y = L = "
-"1.0 (white)."
+"A pixel of Y = 0.18 (L = 0.5) will appear about half as bright as Y = L = 1.0 (white)."
 
 msgid "Luminance of image pixel under mouse."
 msgstr "Luminance of image pixel under mouse."
@@ -5591,12 +5548,10 @@ msgstr "Single Instance"
 
 msgid ""
 "When selected, only a single mrv2 instance is allowed.\n"
-"If you try to open several mrv2s with different images, all these images "
-"will be sent to the already open mrv2."
+"If you try to open several mrv2s with different images, all these images will be sent to the already open mrv2."
 msgstr ""
 "When selected, only a single mrv2 instance is allowed.\n"
-"If you try to open several mrv2s with different images, all these images "
-"will be sent to the already open mrv2."
+"If you try to open several mrv2s with different images, all these images will be sent to the already open mrv2."
 
 msgid "Auto Refit Image"
 msgstr "Auto Refit Image"
@@ -5657,9 +5612,11 @@ msgid "Topbar"
 msgstr "Topbar"
 
 msgid ""
-"When selected, mrv2 will start with its channel, gain, gamma toolbar visible."
+"When selected, mrv2 will start with its channel, gain, gamma toolbar "
+"visible."
 msgstr ""
-"When selected, mrv2 will start with its channel, gain, gamma toolbar visible."
+"When selected, mrv2 will start with its channel, gain, gamma toolbar "
+"visible."
 
 msgid "Pixel Toolbar"
 msgstr "Pixel Toolbar"
@@ -5690,12 +5647,14 @@ msgid "Tool Dock"
 msgstr "Tool Dock"
 
 msgid "When selected, mrv2 will start with the action tool dock already open."
-msgstr "When selected, mrv2 will start with the action tool dock already open."
+msgstr ""
+"When selected, mrv2 will start with the action tool dock already open."
 
 msgid "Only One Panel"
 msgstr "Only One Panel"
 
-msgid "When selected, mrv2 will start with the only one panel option selected."
+msgid ""
+"When selected, mrv2 will start with the only one panel option selected."
 msgstr ""
 "When selected, mrv2 will start with the only one panel option selected."
 
@@ -5876,12 +5835,12 @@ msgid "Fixed Position"
 msgstr "Fixed Position"
 
 msgid ""
-"When this option is set, mrv2 will open in the position you set here (except "
-"if the window goes out of the Desktop).  If Always Save on Exit is on, the "
+"When this option is set, mrv2 will open in the position you set here (except"
+" if the window goes out of the Desktop).  If Always Save on Exit is on, the "
 "values are recakculated upon exiting the program."
 msgstr ""
-"When this option is set, mrv2 will open in the position you set here (except "
-"if the window goes out of the Desktop).  If Always Save on Exit is on, the "
+"When this option is set, mrv2 will open in the position you set here (except"
+" if the window goes out of the Desktop).  If Always Save on Exit is on, the "
 "values are recakculated upon exiting the program."
 
 msgid "X:"
@@ -5969,11 +5928,11 @@ msgid "Remove EDLs in Temporary Folder on Exit"
 msgstr "Remove EDLs in Temporary Folder on Exit"
 
 msgid ""
-"When selected, temporary EDLs (Playlists) will be removed from the temporary "
-"folder."
+"When selected, temporary EDLs (Playlists) will be removed from the temporary"
+" folder."
 msgstr ""
-"When selected, temporary EDLs (Playlists) will be removed from the temporary "
-"folder."
+"When selected, temporary EDLs (Playlists) will be removed from the temporary"
+" folder."
 
 msgid "Playback"
 msgstr "Playback"
@@ -6031,13 +5990,13 @@ msgid "Scrub Sensitivity"
 msgstr "Scrub Sensitivity"
 
 msgid ""
-"This setting controls the sensitivity of scrubbing (SHIFT and then the mouse "
-"right and left).  Smaller values make the mouse move jump more frames while "
-"higher values does the opposite."
+"This setting controls the sensitivity of scrubbing (SHIFT and then the mouse"
+" right and left).  Smaller values make the mouse move jump more frames while"
+" higher values does the opposite."
 msgstr ""
-"This setting controls the sensitivity of scrubbing (SHIFT and then the mouse "
-"right and left).  Smaller values make the mouse move jump more frames while "
-"higher values does the opposite."
+"This setting controls the sensitivity of scrubbing (SHIFT and then the mouse"
+" right and left).  Smaller values make the mouse move jump more frames while"
+" higher values does the opposite."
 
 msgid "Default View"
 msgstr "Default View"
@@ -6105,36 +6064,30 @@ msgid "8-bits"
 msgstr "8-bits"
 
 msgid ""
-"The name of the OCIO default image color space for 8 bit images (jpg, bmp, "
-"etc)\n"
+"The name of the OCIO default image color space for 8 bit images (jpg, bmp, etc)\n"
 "(Environment variable: MRV_OCIO_8bits_ICS)"
 msgstr ""
-"The name of the OCIO default image color space for 8 bit images (jpg, bmp, "
-"etc)\n"
+"The name of the OCIO default image color space for 8 bit images (jpg, bmp, etc)\n"
 "(Environment variable: MRV_OCIO_8bits_ICS)"
 
 msgid "16-bits"
 msgstr "16-bits"
 
 msgid ""
-"The name of the OCIO default image color space for 16-bit images (cin, tiff, "
-"etc)\n"
+"The name of the OCIO default image color space for 16-bit images (cin, tiff, etc)\n"
 "(Environment variable: MRV_OCIO_16bits_ICS)"
 msgstr ""
-"The name of the OCIO default image color space for 16-bit images (cin, tiff, "
-"etc)\n"
+"The name of the OCIO default image color space for 16-bit images (cin, tiff, etc)\n"
 "(Environment variable: MRV_OCIO_16bits_ICS)"
 
 msgid "32-bits"
 msgstr "32-bits"
 
 msgid ""
-"The name of the OCIO default image color space for 32-bit int images "
-"(openexr integers, etc)\n"
+"The name of the OCIO default image color space for 32-bit int images (openexr integers, etc)\n"
 "(Environment variable: MRV_OCIO_32bits_ICS)"
 msgstr ""
-"The name of the OCIO default image color space for 32-bit int images "
-"(openexr integers, etc)\n"
+"The name of the OCIO default image color space for 32-bit int images (openexr integers, etc)\n"
 "(Environment variable: MRV_OCIO_32bits_ICS)"
 
 msgid "half"
@@ -6151,12 +6104,10 @@ msgid "float"
 msgstr "float"
 
 msgid ""
-"The name of the OCIO default image color space for half and float images "
-"(OpenEXR, dpx, etc)\n"
+"The name of the OCIO default image color space for half and float images (OpenEXR, dpx, etc)\n"
 "(Environment variable: MRV_OCIO_float_ICS)"
 msgstr ""
-"The name of the OCIO default image color space for half and float images "
-"(OpenEXR, dpx, etc)\n"
+"The name of the OCIO default image color space for half and float images (OpenEXR, dpx, etc)\n"
 "(Environment variable: MRV_OCIO_float_ICS)"
 
 msgid "Default Look"
@@ -6293,7 +6244,8 @@ msgid "API"
 msgstr "API"
 
 msgid "Audio API to use for platforms that support multiple APIs (Linux only)"
-msgstr "Audio API to use for platforms that support multiple APIs (Linux only)"
+msgstr ""
+"Audio API to use for platforms that support multiple APIs (Linux only)"
 
 msgid "Output Device"
 msgstr "Output Device"
@@ -6315,9 +6267,11 @@ msgid "Use ComfyUI Pipe"
 msgstr "Use ComfyUI Pipe"
 
 msgid ""
-"This setting opens a pipe to communicate with ComfyUI's mrv2_save_exr_node.py"
+"This setting opens a pipe to communicate with ComfyUI's "
+"mrv2_save_exr_node.py"
 msgstr ""
-"This setting opens a pipe to communicate with ComfyUI's mrv2_save_exr_node.py"
+"This setting opens a pipe to communicate with ComfyUI's "
+"mrv2_save_exr_node.py"
 
 msgid "Errors"
 msgstr "Errors"
@@ -6337,7 +6291,8 @@ msgstr "Adjusts how Log Window behaves in case of error."
 msgid "Check for Updates"
 msgstr "Check for Updates"
 
-msgid "Allows you to automatically download updates of mrv2 when it starts up."
+msgid ""
+"Allows you to automatically download updates of mrv2 when it starts up."
 msgstr ""
 "Allows you to automatically download updates of mrv2 when it starts up."
 
@@ -6428,12 +6383,12 @@ msgstr "Click to delete the selected preset."
 
 msgid ""
 "Select, Add or Delete an OCIO Preset that stores: config filename, Input "
-"Color Space, View, Look, LUT settings and Defaults for 8-bits, 16-bits, 32-"
-"bits, half and float images. "
+"Color Space, View, Look, LUT settings and Defaults for 8-bits, 16-bits, "
+"32-bits, half and float images. "
 msgstr ""
 "Select, Add or Delete an OCIO Preset that stores: config filename, Input "
-"Color Space, View, Look, LUT settings and Defaults for 8-bits, 16-bits, 32-"
-"bits, half and float images. "
+"Color Space, View, Look, LUT settings and Defaults for 8-bits, 16-bits, "
+"32-bits, half and float images. "
 
 msgid "Summary"
 msgstr "Summary"
diff --git a/src/po/es.po b/src/po/es.po
index 389100eb7..e6d27c213 100644
--- a/src/po/es.po
+++ b/src/po/es.po
@@ -2998,8 +2998,8 @@ msgstr "Información de OpenGL: {0}"
 msgid "Saving... {0}"
 msgstr "Grando... {0}."
 
-msgid "Empty video data at time {0}."
-msgstr "Datos de vídeo vacios en {0}."
+msgid "Empty video data at time {0}.  Repeating frame."
+msgstr "Datos de vídeo vacíos en el momento {0}. Repetición del cuadro."
 
 msgid "Reading preferences from \"{0}{1}\"."
 msgstr "Leyendo preferencias desde \"{0}{1}\"."
diff --git a/src/po/fr.po b/src/po/fr.po
index cd65b4a96..66c875568 100644
--- a/src/po/fr.po
+++ b/src/po/fr.po
@@ -2805,8 +2805,8 @@ msgstr "Informations OpenGL: {0}"
 msgid "Saving... {0}"
 msgstr "Enregistrement... {0}"
 
-msgid "Empty video data at time {0}."
-msgstr "Données vidéo vides au moment {0}."
+msgid "Empty video data at time {0}.  Repeating frame."
+msgstr "Données vidéo vides au moment {0}. Cadre répétitif."
 
 msgid "Reading preferences from \"{0}{1}\"."
 msgstr "Préférences de lecture de \"{0}{1}\"."
diff --git a/src/po/hi_IN.po b/src/po/hi_IN.po
index 5efd1c24c..db5b6fabd 100644
--- a/src/po/hi_IN.po
+++ b/src/po/hi_IN.po
@@ -2784,7 +2784,7 @@ msgstr "ओपन- जीएल जानकारी: {0}"
 msgid "Saving... {0}"
 msgstr "सहेजा जा रहा है... {0}"
 
-msgid "Empty video data at time {0}."
+msgid "Empty video data at time {0}.  Repeating frame."
 msgstr "{0} समय पर वीडियो आँकड़ा खाली करें"
 
 msgid "Reading preferences from \"{0}{1}\"."
diff --git a/src/po/it.po b/src/po/it.po
index 7c6c65a8e..04f1699ee 100644
--- a/src/po/it.po
+++ b/src/po/it.po
@@ -2815,8 +2815,8 @@ msgstr "Informazioni OpenGL: {0}"
 msgid "Saving... {0}"
 msgstr "Salvataggio... {0}"
 
-msgid "Empty video data at time {0}."
-msgstr "Dati video vuoti al momento {0}."
+msgid "Empty video data at time {0}.  Repeating frame."
+msgstr "Dati video vuoti al momento {0}. Ripetizione della cornice."
 
 msgid "Reading preferences from \"{0}{1}\"."
 msgstr "Preferenze di lettura da \"{0}{1}\"."
diff --git a/src/po/messages.pot b/src/po/messages.pot
index 0a4bee932..49bd675a9 100644
--- a/src/po/messages.pot
+++ b/src/po/messages.pot
@@ -2665,7 +2665,7 @@ msgstr ""
 msgid "Saving... {0}"
 msgstr ""
 
-msgid "Empty video data at time {0}."
+msgid "Empty video data at time {0}.  Repeating frame."
 msgstr ""
 
 msgid "Reading preferences from \"{0}{1}\"."
diff --git a/src/po/pt.po b/src/po/pt.po
index c1e438ec3..9fa252826 100644
--- a/src/po/pt.po
+++ b/src/po/pt.po
@@ -2782,8 +2782,8 @@ msgstr "Informaes do OpenGL: {0}"
 msgid "Saving... {0}"
 msgstr "Salvar... {0}"
 
-msgid "Empty video data at time {0}."
-msgstr "Dados de vdeo vazios no momento {0}."
+msgid "Empty video data at time {0}.  Repeating frame."
+msgstr "Dados de vídeo vazios no tempo {0}. Repetir o quadro."
 
 msgid "Reading preferences from \"{0}{1}\"."
 msgstr "Preferncias de leitura de \"{0}{1}\"."
diff --git a/src/po/zh-CN.po b/src/po/zh-CN.po
index 701fed516..b992ab4f2 100644
--- a/src/po/zh-CN.po
+++ b/src/po/zh-CN.po
@@ -2879,8 +2879,8 @@ msgstr "OpenGL 信息: {0}"
 msgid "Saving... {0}"
 msgstr "保存... {0}"
 
-msgid "Empty video data at time {0}."
-msgstr "时间 {0} 时空视频数据 。"
+msgid "Empty video data at time {0}.  Repeating frame."
+msgstr "时间 {0} 时空视频数据。 重复框架 。"
 
 msgid "Reading preferences from \"{0}{1}\"."
 msgstr "读取“ \"{0}{1}\" 的首选项 。"