Improve language setup.
[dcpomatic.git] / src / lib / util.cc
index 3d70a3122166bce4f66b1f50f58fea05bb822954..2e467125181afe6a3c75a2848d625c0101c8ce98 100644 (file)
@@ -235,9 +235,6 @@ seconds (struct timeval t)
 void
 dvdomatic_setup ()
 {
-       bindtextdomain ("libdvdomatic", LOCALE_PREFIX);
-       setlocale (LC_ALL, "");
-       
        avfilter_register_all ();
        
        Format::setup_formats ();
@@ -249,6 +246,41 @@ dvdomatic_setup ()
        ui_thread = this_thread::get_id ();
 }
 
+#ifdef DVDOMATIC_WINDOWS
+boost::filesystem::path
+mo_path ()
+{
+       wchar_t buffer[512];
+       GetModuleFileName (0, buffer, 512 * sizeof(wchar_t));
+       boost::filesystem::path p (buffer);
+       p = p.parent_path ();
+       p = p.parent_path ();
+       p /= "locale";
+       return p;
+}
+#endif
+
+void
+dvdomatic_setup_i18n (string lang)
+{
+       setlocale (LC_ALL, "");
+       textdomain ("libdvdomatic");
+       
+#ifdef DVDOMATIC_WINDOWS
+       string const e = "LANGUAGE=" + lang;
+       putenv (e.c_str());
+
+       bindtextdomain ("libdvdomatic", mo_path().string().c_str());
+#else
+       /* Hack to silence warning */
+       lang.clear ();
+#endif 
+
+#ifdef DVDOMATIC_POSIX
+       bindtextdomain ("libdvdomatic", POSIX_LOCALE_PREFIX);
+#endif 
+}
+
 /** @param start Start position for the crop within the image.
  *  @param size Size of the cropped area.
  *  @return FFmpeg crop filter string.
@@ -375,21 +407,12 @@ public:
                , dcp (dcp_)
        {}
 
-       bool skip () const {
-               return !about_equal (source, dcp) && source > dcp;
-       }
-
-       bool repeat () const {
-               return !about_equal (source, dcp) && source < dcp;
-       }
-
        float source;
        int dcp;
 };
 
-/** @param fps Arbitrary source frames-per-second value */
-/** XXX: this could be slow-ish */
-DCPFrameRate::DCPFrameRate (float source_fps)
+int
+best_dcp_frame_rate (float source_fps)
 {
        list<int> const allowed_dcp_frame_rates = Config::instance()->allowed_dcp_frame_rates ();
 
@@ -427,14 +450,8 @@ DCPFrameRate::DCPFrameRate (float source_fps)
                ++i;
        }
 
-       if (!best) {
-               throw EncodeError (_("cannot find a suitable DCP frame rate for this source"));
-       }
-
-       frames_per_second = best->dcp;
-       skip = best->skip ();
-       repeat = best->repeat ();
-       change_speed = !about_equal (source_fps * factor(), frames_per_second);
+       assert (best);
+       return best->dcp;
 }
 
 /** @param An arbitrary sampling rate.
@@ -450,19 +467,6 @@ dcp_audio_sample_rate (int fs)
        return 96000;
 }
 
-int
-dcp_audio_channels (int f)
-{
-       if (f == 1) {
-               /* The source is mono, so to put the mono channel into
-                  the centre we need to generate a 5.1 soundtrack.
-               */
-               return 6;
-       }
-
-       return f;
-}
-
 bool operator== (Crop const & a, Crop const & b)
 {
        return (a.left == b.left && a.right == b.right && a.top == b.top && a.bottom == b.bottom);
@@ -903,3 +907,104 @@ cpu_info ()
 
        return info;
 }
+
+string
+audio_channel_name (int c)
+{
+       assert (MAX_AUDIO_CHANNELS == 6);
+
+       /* TRANSLATORS: these are the names of audio channels; Lfe (sub) is the low-frequency
+          enhancement channel (sub-woofer)./
+       */
+       string const channels[] = {
+               "Left",
+               "Right",
+               "Centre",
+               "Lfe (sub)",
+               "Left surround",
+               "Right surround",
+       };
+
+       return channels[c];
+}
+
+AudioMapping::AudioMapping (int c)
+       : _source_channels (c)
+{
+
+}
+
+optional<libdcp::Channel>
+AudioMapping::source_to_dcp (int c) const
+{
+       if (c >= _source_channels) {
+               return optional<libdcp::Channel> ();
+       }
+
+       if (_source_channels == 1) {
+               /* mono sources to centre */
+               return libdcp::CENTRE;
+       }
+       
+       return static_cast<libdcp::Channel> (c);
+}
+
+optional<int>
+AudioMapping::dcp_to_source (libdcp::Channel c) const
+{
+       if (_source_channels == 1) {
+               if (c == libdcp::CENTRE) {
+                       return 0;
+               } else {
+                       return optional<int> ();
+               }
+       }
+
+       if (static_cast<int> (c) >= _source_channels) {
+               return optional<int> ();
+       }
+       
+       return static_cast<int> (c);
+}
+
+int
+AudioMapping::dcp_channels () const
+{
+       if (_source_channels == 1) {
+               /* The source is mono, so to put the mono channel into
+                  the centre we need to generate a 5.1 soundtrack.
+               */
+               return 6;
+       }
+
+       return _source_channels;
+}
+
+FrameRateConversion::FrameRateConversion (float source, int dcp)
+       : skip (false)
+       , repeat (false)
+       , change_speed (false)
+{
+       if (fabs (source / 2.0 - dcp) < (fabs (source - dcp))) {
+               skip = true;
+       } else if (fabs (source * 2 - dcp) < fabs (source - dcp)) {
+               repeat = true;
+       }
+
+       change_speed = !about_equal (source * factor(), dcp);
+
+       if (!skip && !repeat && !change_speed) {
+               description = _("DCP and source have the same rate.\n");
+       } else {
+               if (skip) {
+                       description = _("DCP will use every other frame of the source.\n");
+               } else if (repeat) {
+                       description = _("Each source frame will be doubled in the DCP.\n");
+               }
+
+               if (change_speed) {
+                       float const pc = dcp * 100 / (source * factor());
+                       description += String::compose (_("DCP will run at %1%% of the source speed."), pc);
+               }
+       }
+}