diff options
34 files changed, 1450 insertions, 1245 deletions
diff --git a/benchmark/image_benchmark.cc b/benchmark/image_benchmark.cc new file mode 100644 index 000000000..5067e1e06 --- /dev/null +++ b/benchmark/image_benchmark.cc @@ -0,0 +1,40 @@ +/* + Copyright (C) 2026 Carl Hetherington <cth@carlh.net> + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>. + +*/ + + +#include "lib/image.h" +#include "lib/timer.h" + + +int main() +{ + auto constexpr TRIALS = 1024; + + { + auto image = std::make_shared<Image>(AV_PIX_FMT_UYVY422, dcp::Size{ 3996, 2160 }, Image::Alignment::COMPACT); + PeriodTimer timer("Image::make_black AV_PIX_FMT_UYVY422"); + for (auto i = 0; i < TRIALS; ++i) { + image->make_black(); + } + } + + return 0; +} + diff --git a/benchmark/wscript b/benchmark/wscript new file mode 100644 index 000000000..9b1e776b4 --- /dev/null +++ b/benchmark/wscript @@ -0,0 +1,8 @@ +def build(bld): + for benchmark in ['image']: + obj = bld(features='cxx cxxprogram') + obj.uselib = 'DCP AVFORMAT AVFILTER SWSCALE LWEXT4 SUB SWRESAMPLE LEQM_NRT POSTPROC GLIB CURL ICU NETTLE CXML ' + obj.uselib += 'XMLPP BOOST_FILESYSTEM FONTCONFIG XMLSEC SSH SAMPLERATE BOOST_THREAD CAIROMM PANGOMM ZIP SQLITE3 ' + obj.use = ['libdcpomatic2'] + obj.source = '%s_benchmark.cc' % benchmark + obj.target = '%s_benchmark' % benchmark @@ -32,5 +32,5 @@ def po_to_mo(dir, name, bld): po = os.path.join('po', '%s.po' % lang) mo = os.path.join('mo', lang, '%s.mo' % name) - bld(rule='msgfmt -c ${SRC} -o ${TGT}', source=bld.path.make_node(po), target=bld.path.get_bld().make_node(mo)) + bld(rule='msgfmt ${SRC} -o ${TGT}', source=bld.path.make_node(po), target=bld.path.get_bld().make_node(mo)) bld.install_files(os.path.join('${PREFIX}', 'share', 'locale', lang, 'LC_MESSAGES'), mo) diff --git a/platform/osx/make_dmg.sh b/platform/osx/make_dmg.sh index fb20ad864..5509af505 100644 --- a/platform/osx/make_dmg.sh +++ b/platform/osx/make_dmg.sh @@ -172,6 +172,7 @@ function copy_libs { copy_lib_root libleqm_nrt "$dest" copy $ROOT src/$SOURCE_NAME/build/src/lib/libdcpomatic2.dylib "$dest" copy $ROOT src/$SOURCE_NAME/build/src/wx/libdcpomatic2-wx.dylib "$dest" + copy_lib_env libboost_atomic "$dest" copy_lib_env libboost_system "$dest" copy_lib_env libboost_filesystem "$dest" copy_lib_env libboost_thread "$dest" diff --git a/run/benchmarks b/run/benchmarks new file mode 100755 index 000000000..1138e9e0f --- /dev/null +++ b/run/benchmarks @@ -0,0 +1,8 @@ +#!/bin/bash + +set -e + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +source $DIR/environment + +build/benchmark/image_benchmark @@ -86,9 +86,9 @@ if [ "$(uname)" == "Darwin" ]; then # We need to find ffcmp in here export PATH=$PATH:$HOME/workspace/bin if [ -d "$environment/$(uname -m)/11.0" ]; then - export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$environment/$(uname -m)/11.0/lib + export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$environment/$(uname -m)/11.0/lib:$DIR/../../../lib else - export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$environment/$(uname -m)/10.10/lib + export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$environment/$(uname -m)/10.10/lib:$DIR/../../../lib fi fi diff --git a/src/lib/audio_mapping.cc b/src/lib/audio_mapping.cc index 4e13d1adb..c926437ea 100644 --- a/src/lib/audio_mapping.cc +++ b/src/lib/audio_mapping.cc @@ -85,13 +85,13 @@ AudioMapping::make_zero() struct ChannelRegex { - ChannelRegex(string regex_, int channel_) + ChannelRegex(string regex_, dcp::Channel channel_) : regex(regex_) , channel(channel_) {} string regex; - int channel; + dcp::Channel channel; }; @@ -99,19 +99,19 @@ void AudioMapping::make_default(AudioProcessor const * processor, optional<boost::filesystem::path> filename) { static ChannelRegex const regex[] = { - ChannelRegex(".*[\\._-]L[\\._-].*", 0), - ChannelRegex(".*[\\._-]R[\\._-].*", 1), - ChannelRegex(".*[\\._-]C[\\._-].*", 2), - ChannelRegex(".*[\\._-]Lfe[\\._-].*", 3), - ChannelRegex(".*[\\._-]LFE[\\._-].*", 3), - ChannelRegex(".*[\\._-]Lss[\\._-].*", 4), - ChannelRegex(".*[\\._-]Lsr[\\._-].*", 6), - ChannelRegex(".*[\\._-]Lrs[\\._-].*", 6), - ChannelRegex(".*[\\._-]Ls[\\._-].*", 4), - ChannelRegex(".*[\\._-]Rss[\\._-].*", 5), - ChannelRegex(".*[\\._-]Rsr[\\._-].*", 7), - ChannelRegex(".*[\\._-]Rrs[\\._-].*", 7), - ChannelRegex(".*[\\._-]Rs[\\._-].*", 5), + ChannelRegex(".*[\\._-]L[\\._-].*", dcp::Channel::LEFT), + ChannelRegex(".*[\\._-]R[\\._-].*", dcp::Channel::RIGHT), + ChannelRegex(".*[\\._-]C[\\._-].*", dcp::Channel::CENTRE), + ChannelRegex(".*[\\._-]Lfe[\\._-].*", dcp::Channel::LFE), + ChannelRegex(".*[\\._-]LFE[\\._-].*", dcp::Channel::LFE), + ChannelRegex(".*[\\._-]Lss[\\._-].*", dcp::Channel::LS), + ChannelRegex(".*[\\._-]Lsr[\\._-].*", dcp::Channel::BSL), + ChannelRegex(".*[\\._-]Lrs[\\._-].*", dcp::Channel::BSL), + ChannelRegex(".*[\\._-]Ls[\\._-].*", dcp::Channel::LS), + ChannelRegex(".*[\\._-]Rss[\\._-].*", dcp::Channel::RS), + ChannelRegex(".*[\\._-]Rsr[\\._-].*", dcp::Channel::BSR), + ChannelRegex(".*[\\._-]Rrs[\\._-].*", dcp::Channel::BSR), + ChannelRegex(".*[\\._-]Rs[\\._-].*", dcp::Channel::RS), }; static int const regexes = sizeof(regex) / sizeof(*regex); @@ -127,7 +127,7 @@ AudioMapping::make_default(AudioProcessor const * processor, optional<boost::fil if (filename) { for (int i = 0; i < regexes; ++i) { boost::regex e(regex[i].regex, boost::regex::icase); - if (boost::regex_match(filename->filename().string(), e) && regex[i].channel < output_channels()) { + if (boost::regex_match(filename->filename().string(), e) && static_cast<int>(regex[i].channel) < output_channels()) { set(0, regex[i].channel, 1); guessed = true; } diff --git a/src/lib/digester.cc b/src/lib/digester.cc index 67a3e2398..bbcad5478 100644 --- a/src/lib/digester.cc +++ b/src/lib/digester.cc @@ -22,6 +22,7 @@ #include "digester.h" #include "dcpomatic_assert.h" #include <nettle/md5.h> +#include <nettle/version.h> #include <iomanip> #include <cstdio> @@ -32,38 +33,42 @@ using std::setfill; using std::setw; -Digester::Digester () +Digester::Digester() { - md5_init (&_context); + md5_init(&_context); } -Digester::~Digester () +Digester::~Digester() { - get (); + get(); } void -Digester::add (void const * data, size_t size) +Digester::add(void const * data, size_t size) { - md5_update (&_context, size, reinterpret_cast<uint8_t const *>(data)); + md5_update(&_context, size, reinterpret_cast<uint8_t const *>(data)); } void -Digester::add (string const & s) +Digester::add(string const & s) { - add (s.c_str(), s.length()); + add(s.c_str(), s.length()); } string -Digester::get () const +Digester::get() const { if (!_digest) { unsigned char digest[MD5_DIGEST_SIZE]; - md5_digest (&_context, MD5_DIGEST_SIZE, digest); +#if NETTLE_VERSION_MAJOR >= 4 + md5_digest(&_context, digest); +#else + md5_digest(&_context, MD5_DIGEST_SIZE, digest); +#endif char hex[MD5_DIGEST_SIZE * 2 + 1]; for (int i = 0; i < MD5_DIGEST_SIZE; ++i) { @@ -73,19 +78,23 @@ Digester::get () const _digest = hex; } - return _digest.get (); + return _digest.get(); } void -Digester::get (uint8_t* buffer) const +Digester::get(uint8_t* buffer) const { - md5_digest (&_context, MD5_DIGEST_SIZE, buffer); +#if NETTLE_VERSION_MAJOR >= 4 + md5_digest(&_context, buffer); +#else + md5_digest(&_context, MD5_DIGEST_SIZE, buffer); +#endif } int -Digester::size () const +Digester::size() const { return MD5_DIGEST_SIZE; } diff --git a/src/lib/digester.h b/src/lib/digester.h index e4daabd68..5ff50f363 100644 --- a/src/lib/digester.h +++ b/src/lib/digester.h @@ -27,26 +27,26 @@ class Digester { public: - Digester (); - ~Digester (); + Digester(); + ~Digester(); - Digester (Digester const&) = delete; - Digester& operator= (Digester const&) = delete; + Digester(Digester const&) = delete; + Digester& operator=(Digester const&) = delete; - void add (void const * data, size_t size); + void add(void const * data, size_t size); template <class T> - void add (T data) { - add (&data, sizeof (T)); + void add(T data) { + add(&data, sizeof(T)); } - void add (std::string const & s); + void add(std::string const & s); - std::string get () const; + std::string get() const; - void get (uint8_t* buffer) const; + void get(uint8_t* buffer) const; - int size () const; + int size() const; private: mutable md5_ctx _context; diff --git a/src/lib/film.cc b/src/lib/film.cc index b0276086a..de6343b9c 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -113,6 +113,7 @@ using namespace dcpomatic; static constexpr char metadata_file[] = "metadata.xml"; static constexpr char ui_state_file[] = "ui.xml"; static constexpr char assets_file[] = "assets.xml"; +static constexpr char info_dir[] = "info"; /* 5 -> 6 @@ -289,7 +290,7 @@ boost::filesystem::path Film::info_file(DCPTimePeriod period) const { boost::filesystem::path p; - p /= "info"; + p /= info_dir; p /= video_identifier() + "_" + fmt::to_string(period.from.get()) + "_" + fmt::to_string(period.to.get()); return file(p); } @@ -1440,7 +1441,7 @@ Film::cpls() const for (auto const& item: dcp::filesystem::directory_iterator(dir)) { if ( dcp::filesystem::is_directory(item) && - item.path().filename() != "j2c" && item.path().filename() != "video" && item.path().filename() != "info" && item.path().filename() != "analysis" + item.path().filename() != "j2c" && item.path().filename() != "video" && item.path().filename() != info_dir && item.path().filename() != "analysis" ) { try { @@ -2204,12 +2205,35 @@ Film::speed_up_range(int dcp_frame_rate) const return _playlist->speed_up_range(dcp_frame_rate); } + void -Film::copy_from(shared_ptr<const Film> film) +Film::copy_from(shared_ptr<const Film> film, std::function<void (float)> set_progress) { read_metadata(film->file(metadata_file)); + + auto old_assets = film->read_remembered_assets(); + auto new_assets = std::vector<RememberedAsset>{}; + + /* Find source film's remembered assets that still exist and copy them to our new film */ + for (auto path: dcp::filesystem::recursive_directory_iterator(*film->directory())) { + auto iter = std::find_if(old_assets.begin(), old_assets.end(), [path](RememberedAsset const& asset) { + return asset.filename() == path.path().filename(); + }); + if (iter != old_assets.end()) { + copy_in_bits(path, assets_path() / path.path().filename(), set_progress); + new_assets.push_back({path.path().filename(), iter->period(), iter->identifier()}); + } + } + + write_remembered_assets(new_assets); + + /* To use the assets we also need the info files */ + for (auto path: dcp::filesystem::directory_iterator(film->dir(info_dir))) { + dcp::filesystem::copy_file(path.path(), dir(info_dir) / path.path().filename()); + } } + bool Film::references_dcp_video() const { diff --git a/src/lib/film.h b/src/lib/film.h index ae812f6d4..09b51202c 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -122,7 +122,7 @@ public: void write_template(boost::filesystem::path path) const; std::shared_ptr<xmlpp::Document> metadata(bool with_content_paths = true) const; - void copy_from(std::shared_ptr<const Film> film); + void copy_from(std::shared_ptr<const Film> film, std::function<void (float)> set_progress); std::string isdcf_name(bool if_created_now) const; std::string dcp_name(bool if_created_now = false) const; diff --git a/src/lib/image.cc b/src/lib/image.cc index 0810fbbea..3a2e99c23 100644 --- a/src/lib/image.cc +++ b/src/lib/image.cc @@ -190,7 +190,8 @@ Image::crop_source_pointers(Crop crop) const corrected_crop.bottom = size().height - 4; } - std::vector<uint8_t*> pointers(planes()); + /* FFmpeg memcpy()s this array and assumes it has 4 entries */ + std::vector<uint8_t*> pointers(4); for (int c = 0; c < planes(); ++c) { int const x = lrintf(bytes_per_pixel(c) * corrected_crop.left); pointers[c] = data()[c] + x + stride()[c] * (corrected_crop.top / vertical_factor(c)); @@ -286,7 +287,8 @@ Image::crop_scale_window( round_height_for_subsampling((out_size.height - inter_size.height) / 2, out_desc) ); - std::vector<uint8_t*> scale_out_data(out->planes()); + /* FFmpeg memcpy()s this array and assumes it has 4 entries */ + std::vector<uint8_t*> scale_out_data(4); for (int c = 0; c < out->planes(); ++c) { int const x = lrintf(out->bytes_per_pixel(c) * corner.x); scale_out_data[c] = out->data()[c] + x + out->stride()[c] * (corner.y / out->vertical_factor(c)); @@ -610,17 +612,15 @@ Image::make_black() case AV_PIX_FMT_UYVY422: { - int const Y = sample_size(0).height; - int const X = line_size()[0]; - uint8_t* p = data()[0]; - for (int y = 0; y < Y; ++y) { - for (int x = 0; x < X / 4; ++x) { - *p++ = eight_bit_uv; // Cb - *p++ = 0; // Y0 - *p++ = eight_bit_uv; // Cr - *p++ = 0; // Y1 - } - } + fill_memory( + data()[0], + sample_size(0).height * line_size()[0], + /* Cb/Cr is eight_bit_uv, Y0/Y1 is 0 */ + static_cast<uint64_t>(eight_bit_uv) | + (static_cast<uint64_t>(eight_bit_uv) << 16) | + (static_cast<uint64_t>(eight_bit_uv) << 32) | + (static_cast<uint64_t>(eight_bit_uv) << 48) + ); break; } diff --git a/src/lib/memory_util.cc b/src/lib/memory_util.cc index 00117855d..cf8842615 100644 --- a/src/lib/memory_util.cc +++ b/src/lib/memory_util.cc @@ -30,12 +30,52 @@ LIBDCP_ENABLE_WARNINGS void * -wrapped_av_malloc (size_t s) +wrapped_av_malloc(size_t s) { - auto p = av_malloc (s); + auto p = av_malloc(s); if (!p) { - throw std::bad_alloc (); + throw std::bad_alloc(); } return p; } + +void +fill_memory(void* ptr, size_t bytes, uint64_t value) +{ + if (bytes == 0) { + return; + } + + auto const start = std::min(bytes, sizeof(value) - reinterpret_cast<uintptr_t>(ptr) % sizeof(value)); + auto start_ptr = reinterpret_cast<uint8_t*>(ptr); + if (start < 8) { + for (auto i = 0UL; i < start; ++i) { + *start_ptr++ = value & 0xff; + value = (value >> 8) | ((value & 0xff) << 56); + } + + bytes -= start; + if (bytes == 0) { + return; + } + } + + auto const main = (bytes - (bytes % sizeof(value))) / 8; + auto main_ptr = reinterpret_cast<uint64_t*>(start_ptr); + for (auto i = 0UL; i < main; ++i) { + *main_ptr++ = value; + } + + bytes -= main * 8; + if (bytes == 0) { + return; + } + + auto end_ptr = reinterpret_cast<uint8_t*>(main_ptr); + for (auto i = 0UL; i < bytes; ++i) { + *end_ptr++ = value & 0xff; + value = (value >> 8) | ((value & 0xff) << 56); + } +} + diff --git a/src/lib/memory_util.h b/src/lib/memory_util.h index eccc4a857..f6bbe0621 100644 --- a/src/lib/memory_util.h +++ b/src/lib/memory_util.h @@ -19,4 +19,9 @@ */ -extern void* wrapped_av_malloc (size_t); +#include <cstddef> +#include <cstdint> + + +extern void* wrapped_av_malloc(size_t); +extern void fill_memory(void* ptr, size_t bytes, uint64_t value); diff --git a/src/lib/player.cc b/src/lib/player.cc index dece1306c..cf5429fd5 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -86,6 +86,7 @@ using namespace dcpomatic; Player::Player(shared_ptr<const Film> film, Image::Alignment subtitle_alignment, bool tolerant) : _film(film) , _suspended(0) + , _video_container_size(dcp::Size{}) , _ignore_video(false) , _ignore_audio(false) , _ignore_text(false) @@ -94,6 +95,7 @@ Player::Player(shared_ptr<const Film> film, Image::Alignment subtitle_alignment, , _tolerant(tolerant) , _play_referenced(false) , _audio_merger(film->audio_frame_rate()) + , _playback_length(dcpomatic::DCPTime{}) , _subtitle_alignment(subtitle_alignment) { construct(); @@ -104,6 +106,7 @@ Player::Player(shared_ptr<const Film> film, shared_ptr<const Playlist> playlist_ : _film(film) , _playlist(playlist_) , _suspended(0) + , _video_container_size(dcp::Size{}) , _ignore_video(false) , _ignore_audio(false) , _ignore_text(false) @@ -112,6 +115,7 @@ Player::Player(shared_ptr<const Film> film, shared_ptr<const Playlist> playlist_ , _tolerant(tolerant) , _play_referenced(false) , _audio_merger(film->audio_frame_rate()) + , _playback_length(dcpomatic::DCPTime{}) { construct(); } diff --git a/src/lib/po/ja_JP.po b/src/lib/po/ja_JP.po index 804a2f259..6ec5315d1 100644 --- a/src/lib/po/ja_JP.po +++ b/src/lib/po/ja_JP.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-19 23:03+0200\n" -"PO-Revision-Date: 2026-04-07 19:21+0900\n" +"POT-Creation-Date: 2026-02-15 21:03+0100\n" +"PO-Revision-Date: 2026-04-25 20:27+0900\n" "Last-Translator: \n" "Language-Team: \n" "Language: ja_JP\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.8\n" -#: src/lib/video_content.cc:515 +#: src/lib/video_content.cc:513 #, c-format msgid "" "\n" @@ -27,8 +27,7 @@ msgstr "" "\n" "コンテンツのフレームレート %.4f\n" -#: src/lib/video_content.cc:479 -#, c++-format +#: src/lib/video_content.cc:477 msgid "" "\n" "Cropped to {}x{}" @@ -36,7 +35,7 @@ msgstr "" "\n" "切り抜きサイズ: {}x{}" -#: src/lib/video_content.cc:469 +#: src/lib/video_content.cc:467 #, c-format msgid "" "\n" @@ -45,8 +44,7 @@ msgstr "" "\n" "画面アスペクト比= %.2f:1" -#: src/lib/video_content.cc:503 -#, c++-format +#: src/lib/video_content.cc:501 msgid "" "\n" "Padded with black to fit container {} ({}x{})" @@ -54,8 +52,7 @@ msgstr "" "\n" "画角に合う黒地入りアクセクト比= {} ({}x{})" -#: src/lib/video_content.cc:493 -#, c++-format +#: src/lib/video_content.cc:491 msgid "" "\n" "Scaled to {}x{}" @@ -63,7 +60,7 @@ msgstr "" "\n" "スケール= {}x{}" -#: src/lib/video_content.cc:497 src/lib/video_content.cc:508 +#: src/lib/video_content.cc:495 src/lib/video_content.cc:506 #, c-format msgid " (%.2f:1)" msgstr " (%.2f:1)" @@ -71,11 +68,10 @@ msgstr " (%.2f:1)" #. TRANSLATORS: the {} in this string will be filled in with a day of the week #. to say what day a job will finish. #: src/lib/job.cc:628 -#, c++-format msgid " on {}" msgstr "" -#: src/lib/config.cc:1270 +#: src/lib/config.cc:1266 msgid "" "$CPL_NAME\n" "\n" @@ -99,11 +95,11 @@ msgstr "" "長さ: $LENGTH\n" "サイズ: $SIZE\n" -#: src/lib/config.cc:1248 +#: src/lib/config.cc:1244 msgid "$JOB_NAME: $JOB_STATUS" msgstr "$処理名: $処理状況" -#: src/lib/video_content.cc:464 +#: src/lib/video_content.cc:462 #, c-format msgid ", pixel aspect ratio %.2f:1" msgstr ", ピクセルアスペクト比= %.2f:1" @@ -148,11 +144,11 @@ msgstr "1.85 (Flat)" msgid "1.90 (Full frame)" msgstr "1.90 (Full frame)" -#: src/lib/util.cc:622 +#: src/lib/util.cc:628 msgid "10" msgstr "10" -#: src/lib/util.cc:628 +#: src/lib/util.cc:634 msgid "16" msgstr "16" @@ -176,7 +172,7 @@ msgstr "2.39 (Scope)" msgid "3D denoiser" msgstr "3Dノイズ除去" -#: src/lib/hints.cc:222 +#: src/lib/hints.cc:219 msgid "" "4K 3D is only supported by a very limited number of projectors. Unless you " "know that you will play this DCP back on a capable projector, it is " @@ -186,25 +182,23 @@ msgstr "" "クターで再生する予定がない場合は「DCP→動画」タブでDCPを2Kに設定することをお勧" "めします。" -#: src/lib/util.cc:621 +#: src/lib/util.cc:627 msgid "9" msgstr "9" #. TRANSLATORS: fps here is an abbreviation for frames per second #: src/lib/transcode_job.cc:184 -#, c++-format msgid "; {} fps" msgstr "; {} fps" #: src/lib/job.cc:633 -#, c++-format msgid "; {} remaining; finishing at {}{}" msgstr "; 残り時間 {} ; 終了予定 {}{}" #: src/lib/analytics.cc:58 -#, fuzzy, c++-format +#, c-format msgid "" -"<h2>You have made {} DCPs with {}!</h2><img width=\"150\" height=\"193\" " +"<h2>You have made {} DCPs with {}!</h2><img width=\"20%%\" " "src=\"memory:me.jpg\" align=\"center\"><font size=\"+1\"><p>Hello. I'm Carl " "and I'm the developer of {}. I work on it in my spare time (with the help of " "a volunteer team of testers and translators) and I release it as free " @@ -228,7 +222,7 @@ msgstr "" "donate_amount?amount=10\">Paypal で €10 を寄付</a></ul><p>ありがとうございま" "す。</font>" -#: src/lib/hints.cc:179 +#: src/lib/hints.cc:176 msgid "" "A few projectors have problems playing back very high bit-rate DCPs. It is " "a good idea to drop the video bit rate down to about 200Mbit/s; this is " @@ -239,7 +233,6 @@ msgstr "" "画像の目に見える影響が出る可能性は低いと思います。" #: src/lib/text_content.cc:230 -#, c++-format msgid "" "A subtitle or closed caption file in this project is marked with the " "language '{}', which {} does not recognise. The file's language has been " @@ -256,7 +249,7 @@ msgstr "ARIB STD-B67(ハイブリッドログガンマ/HLG)" msgid "Advertisement" msgstr "広告(ADV)" -#: src/lib/hints.cc:156 +#: src/lib/hints.cc:153 msgid "" "All of your content is in Scope (2.39:1) but your DCP's container is Flat " "(1.85:1). This will letter-box your content inside a Flat (1.85:1) frame. " @@ -268,7 +261,7 @@ msgstr "" "レターボックス表示されます。「DCP」タブで、DCPのコンテナをスコープ(2.39:1)" "に設定することをお勧めします。" -#: src/lib/hints.cc:160 +#: src/lib/hints.cc:157 msgid "" "All of your content narrower than 1.90:1 but your DCP's container is Scope " "(2.39:1). This will pillar-box your content. You may prefer to set your " @@ -279,7 +272,6 @@ msgstr "" "ペクト比をコンテンツと同じ比率に設定することをお勧めします。" #: src/lib/job.cc:115 -#, c++-format msgid "An error occurred whilst handling the file {}." msgstr "ファイル {} の処理中にエラーが発生しました。" @@ -291,28 +283,28 @@ msgstr "音声解析中" msgid "Analysing subtitles" msgstr "字幕解析中" -#: src/lib/hints.cc:379 +#: src/lib/hints.cc:384 #, fuzzy msgid "" "At least one marker comes after the end of the project and will be ignored." msgstr "最低1つのマーカーがプロジェクトの終了後に出現しますが、無視されます。" -#: src/lib/hints.cc:526 +#: src/lib/hints.cc:523 msgid "At least one of your closed caption files is larger than " msgstr "最低1つの「クローズドキャプション」ファイルが次のサイズより大きいです" -#: src/lib/hints.cc:520 +#: src/lib/hints.cc:516 #, fuzzy msgid "At least one of your closed caption files' XML part is larger than " msgstr "" "最低1つの「クローズドキャプション」ファイルのXML部分が次のサイズより大きいで" "す" -#: src/lib/hints.cc:532 +#: src/lib/hints.cc:531 msgid "At least one of your subtitle files is larger than " msgstr "最低1つの字幕はサイズが大きいです" -#: src/lib/hints.cc:490 +#: src/lib/hints.cc:495 msgid "" "At least one of your subtitle lines has more than 52 characters. It is " "recommended to make each line 52 characters at most in length." @@ -320,7 +312,7 @@ msgstr "" "最低1つの字幕は1行が52文字を超えています。各行の長さは52文字以下にすることを" "お勧めします。" -#: src/lib/hints.cc:492 +#: src/lib/hints.cc:497 msgid "" "At least one of your subtitle lines has more than 79 characters. You should " "make each line 79 characters at most in length." @@ -328,13 +320,13 @@ msgstr "" "最低1つの字幕は1行が79文字を超えています。各行の長さを79文字以下にしてくださ" "い。" -#: src/lib/hints.cc:681 +#: src/lib/hints.cc:664 msgid "" "At least one of your subtitles has more than 3 lines. It is advisable to " "use no more than 3 lines." msgstr "最低1つの字幕は3行を超えています。3行以内に収めることをお勧めします。" -#: src/lib/hints.cc:648 +#: src/lib/hints.cc:631 msgid "" "At least one of your subtitles lasts less than 15 frames. It is advisable " "to make each subtitle at least 15 frames long." @@ -342,7 +334,7 @@ msgstr "" "最低1つの字幕は15フレーム未満です。各字幕は最低15フレーム以上にすることをお勧" "めします。" -#: src/lib/hints.cc:653 +#: src/lib/hints.cc:636 msgid "" "At least one of your subtitles starts less than 2 frames after the previous " "one. It is advisable to make the gap between subtitles at least 2 frames." @@ -350,7 +342,7 @@ msgstr "" "最低1つの字幕は少なくとも前の字幕から2フレーム以内に始まります。字幕の間隔を2" "フレーム以上あけることをお勧めします。" -#: src/lib/hints.cc:724 +#: src/lib/hints.cc:707 msgid "" "At least one piece of subtitle content has no specified language. It is " "advisable to set the language for each piece of subtitle content in the " @@ -361,12 +353,10 @@ msgstr "" "定することをお勧めします。" #: src/lib/audio_content.cc:264 -#, c++-format msgid "Audio will be resampled from {}Hz to {}Hz" msgstr "音声は {}Hz から {}Hz に再サンプリングされます" #: src/lib/audio_content.cc:266 -#, c++-format msgid "Audio will be resampled to {}Hz" msgstr "オーディオは {}Hz に再サンプリングされます" @@ -427,20 +417,19 @@ msgstr "ピクセルあたりのビット数" msgid "Bob Weaver Deinterlacing Filter" msgstr "" -#: src/lib/util.cc:623 +#: src/lib/util.cc:629 msgid "BsL" msgstr "BsL" -#: src/lib/util.cc:624 +#: src/lib/util.cc:630 msgid "BsR" msgstr "BsR" -#: src/lib/util.cc:615 +#: src/lib/util.cc:621 msgid "C" msgstr "C" #: src/lib/exceptions.cc:196 -#, c++-format msgid "CPL {} not found" msgstr "CPL {} が見つかりません" @@ -453,15 +442,15 @@ msgid "Cannot contain slashes" msgstr "スラッシュを含めることはできません" #: src/lib/exceptions.cc:78 -#, fuzzy, c++-format +#, fuzzy msgid "Cannot handle pixel format {} during {}" msgstr "{} 中にピクセル形式 {} を処理できません" -#: src/lib/film.cc:1940 +#: src/lib/film.cc:1938 msgid "Cannot make a KDM as this project is not encrypted." msgstr "このプロジェクトは暗号化されていない為、KDM を作成できません。" -#: src/lib/util.cc:584 +#: src/lib/util.cc:590 msgid "Centre" msgstr "Centre" @@ -544,7 +533,7 @@ msgstr "カラースペース" msgid "Combine DCPs" msgstr "複数のDCPを結合" -#: src/lib/writer.cc:525 +#: src/lib/writer.cc:522 #, fuzzy msgid "Computing digests" msgstr "ダイジェストの計算" @@ -700,8 +689,7 @@ msgstr "結合するコンテンツは同じ字幕ストリームを使用する msgid "Content to be joined must use the same text language." msgstr "結合するコンテンツは同じ言語文字を使用する必要があります。" -#: src/lib/video_content.cc:455 -#, c++-format +#: src/lib/video_content.cc:453 msgid "Content video is {}x{}" msgstr "コンテンツ動画=: {}x{}" @@ -714,7 +702,6 @@ msgid "Copying DCP" msgstr "DCPのコピー" #: src/lib/copy_to_drive_job.cc:61 -#, c++-format msgid "Copying DCPs to {}" msgstr "DCPを{}にコピーしています" @@ -723,39 +710,35 @@ msgid "Copying existing asset" msgstr "既存のassetをコピーする" #: src/lib/copy_to_drive_job.cc:58 -#, c++-format msgid "" "Copying {}\n" "to {}" msgstr "{} を {} へコピーしています" #: src/lib/scp_uploader.cc:56 -#, c++-format msgid "Could not connect to server {} ({})" msgstr "サーバー {} ({}) に接続できませんでした" #: src/lib/scp_uploader.cc:105 -#, fuzzy, c++-format +#, fuzzy msgid "Could not create remote directory {} ({})" msgstr "リモート ディレクトリ {} ({}) を作成できませんでした" #: src/lib/image_examiner.cc:64 -#, fuzzy, c++-format +#, fuzzy msgid "Could not decode JPEG2000 file {} ({})" msgstr "JPEG2000 ファイル {} ({}) をデコードできませんでした" #: src/lib/ffmpeg_image_proxy.cc:163 -#, fuzzy, c++-format +#, fuzzy msgid "Could not decode image ({})" msgstr "画像をデコードできませんでした ({})" #: src/lib/unzipper.cc:77 -#, c++-format msgid "Could not find file {} in ZIP file" msgstr "ZIPファイル内にファイル「 {} 」が見つかりませんでした" #: src/lib/encode_server_finder.cc:197 -#, c++-format msgid "" "Could not listen for remote encode servers. Perhaps another instance of {} " "is running." @@ -768,31 +751,26 @@ msgid "Could not open downloaded ZIP file" msgstr "ダウンロードしたZIPファイルを開けませんでした" #: src/lib/internet.cc:178 -#, c++-format msgid "Could not open downloaded ZIP file ({}:{}: {})" msgstr "ダウンロードしたZIPファイルを開けませんでした ({}:{}: {})" -#: src/lib/config.cc:1172 +#: src/lib/config.cc:1168 msgid "Could not open file for writing" msgstr "書き込み用のファイルを開けませんでした" #: src/lib/ffmpeg_file_encoder.cc:282 -#, c++-format msgid "Could not open output file {} ({})" msgstr "出力ファイル{}を開けませんでした({})" #: src/lib/job.cc:179 src/lib/job.cc:194 -#, c++-format msgid "Could not open {}" msgstr "{} を開けませんでした" #: src/lib/curl_uploader.cc:101 src/lib/scp_uploader.cc:121 -#, c++-format msgid "Could not open {} to send" msgstr "{} を開き送信できませんでした" #: src/lib/dcp_subtitle.cc:59 -#, c++-format msgid "Could not read subtitles ({} / {})" msgstr "字幕を読み取れませんでした({} / {})" @@ -801,23 +779,22 @@ msgid "Could not start transfer" msgstr "転送を開始できませんでした" #: src/lib/curl_uploader.cc:109 src/lib/scp_uploader.cc:137 -#, c++-format msgid "Could not write to remote file ({})" msgstr "リモートファイルへの書き込みができませんでした ({})" -#: src/lib/util.cc:594 +#: src/lib/util.cc:600 msgid "D-BOX primary" msgstr "D-BOXプライマリ" -#: src/lib/util.cc:595 +#: src/lib/util.cc:601 msgid "D-BOX secondary" msgstr "D-BOX セカンダリ" -#: src/lib/audio_processor.cc:144 src/lib/util.cc:625 +#: src/lib/audio_processor.cc:144 src/lib/util.cc:631 msgid "DBP" msgstr "DBP" -#: src/lib/audio_processor.cc:145 src/lib/util.cc:626 +#: src/lib/audio_processor.cc:145 src/lib/util.cc:632 msgid "DBS" msgstr "DBS" @@ -829,16 +806,15 @@ msgstr "DCI Flat" msgid "DCI Scope" msgstr "DCI Scope" -#: src/lib/film.cc:2048 +#: src/lib/film.cc:2046 msgid "DCP" msgstr "DCP" -#: src/lib/film.cc:2045 -#, c++-format +#: src/lib/film.cc:2043 msgid "DCP (via {})" msgstr "DCP ({}経由)" -#: src/lib/dcp_subtitle_content.cc:138 +#: src/lib/dcp_subtitle_content.cc:139 msgid "DCP XML subtitles" msgstr "DCP XML字幕" @@ -846,12 +822,7 @@ msgstr "DCP XML字幕" msgid "DCP sample rate" msgstr "DCPサンプルレート" -#: src/lib/frame_rate_change.cc:93 -#, fuzzy, c++-format -msgid "DCP will contain 1 out of every {} frames of the content.\n" -msgstr "DCP はコンテンツのフレームを 1 つおきに使用します。\n" - -#: src/lib/frame_rate_change.cc:103 +#: src/lib/frame_rate_change.cc:101 #, c-format msgid "DCP will run at %.1f%% of the content speed.\n" msgstr "" @@ -862,7 +833,7 @@ msgstr "" msgid "DCP will use every other frame of the content.\n" msgstr "DCP はコンテンツのフレームを 1 つおきに使用します。\n" -#: src/lib/film.cc:1857 +#: src/lib/film.cc:1855 msgid "" "DCP-o-matic had to set your container to 1920x1080 as it's the only one that " "can be used with MPEG2 encoding." @@ -870,7 +841,7 @@ msgstr "" "DCP-o-matic では MPEG2 エンコーディングに使用できるのは 1920x1080 のみです。" "その為アスペクト比と解像度を 1920x1080 に変更しましした。" -#: src/lib/film.cc:1861 +#: src/lib/film.cc:1859 #, fuzzy msgid "" "DCP-o-matic had to set your film to 2D as 3D is not yet supported with MPEG2 " @@ -879,7 +850,7 @@ msgstr "" "DCP-o-matic では、MPEG2 エンコーディングではまだ 3D がサポートされていないた" "め、プロジェクトを 2D に設定する必要がありました。" -#: src/lib/film.cc:1865 +#: src/lib/film.cc:1863 msgid "" "DCP-o-matic set your container to DCI Flat as it was previously 1920x1080 " "and that is not a standard ratio with JPEG2000 encoding." @@ -897,8 +868,7 @@ msgstr "Datasat AP20 or AP25" msgid "De-interlacing" msgstr "インターレース解除" -#: src/lib/config.cc:1233 -#, c++-format +#: src/lib/config.cc:1229 msgid "" "Dear Projectionist\n" "\n" @@ -925,12 +895,10 @@ msgstr "" "{}" #: src/lib/exceptions.cc:178 -#, c++-format msgid "Disk full when writing {}" msgstr "書込みディスクが一杯です {}" #: src/lib/job.cc:268 -#, c++-format msgid "Disk full while writing {}" msgstr "書込み中のディスクが一杯です {}" @@ -939,7 +907,6 @@ msgid "Dolby CP650 or CP750" msgstr "Dolby CP650 or CP750" #: src/lib/internet.cc:124 -#, c++-format msgid "Download failed ({} error {})" msgstr "ダウンロードに失敗しました ({} エラー {})" @@ -949,13 +916,13 @@ msgstr "ダウンロードに失敗しました ({} エラー {})" msgid "EC" msgstr "EC" -#: src/lib/frame_rate_change.cc:95 +#: src/lib/frame_rate_change.cc:93 #, fuzzy msgid "Each content frame will be doubled in the DCP.\n" msgstr "各コンテンツ フレームは DCP で 2 倍になります。\n" -#: src/lib/frame_rate_change.cc:97 -#, fuzzy, c++-format +#: src/lib/frame_rate_change.cc:95 +#, fuzzy msgid "Each content frame will be repeated {} more times in the DCP.\n" msgstr "各コンテンツ フレームは DCP 内で {} 回以上繰り返されます。\n" @@ -964,7 +931,6 @@ msgid "Email KDMs" msgstr "KDMをメール" #: src/lib/send_kdm_email_job.cc:96 -#, c++-format msgid "Email KDMs for {}" msgstr "{}にKDMを送信" @@ -977,7 +943,6 @@ msgid "Email problem report" msgstr "問題レポートをEmailで報告" #: src/lib/send_problem_report_job.cc:71 -#, c++-format msgid "Email problem report for {}" msgstr "{} の問題レポートをメールで送信" @@ -990,12 +955,11 @@ msgid "Episode" msgstr "エピソード・物語(EPS)" #: src/lib/exceptions.cc:85 -#, fuzzy, c++-format +#, fuzzy msgid "Error in subtitle file: saw {} while expecting {}" msgstr "字幕ファイルエラー:saw {} while expecting {}" #: src/lib/job.cc:655 -#, c++-format msgid "Error: {}" msgstr "エラー: {}" @@ -1003,11 +967,11 @@ msgstr "エラー: {}" msgid "Event" msgstr "イベント・行事(EVT)" -#: src/lib/hints.cc:410 +#: src/lib/hints.cc:415 msgid "Examining audio" msgstr "音声の検査" -#: src/lib/hints.cc:412 +#: src/lib/hints.cc:417 msgid "Examining audio, subtitles and closed captions" msgstr "音声、字幕、クローズドキャプションの検査" @@ -1019,7 +983,7 @@ msgstr "コンテンツの検査" msgid "Examining subtitles" msgstr "字幕の検査" -#: src/lib/hints.cc:408 +#: src/lib/hints.cc:413 msgid "Examining subtitles and closed captions" msgstr "字幕とクローズドキャプションの検査" @@ -1036,7 +1000,7 @@ msgid "FCP XML subtitles" msgstr "FCP XML字幕" #: src/lib/scp_uploader.cc:68 -#, fuzzy, c++-format +#, fuzzy msgid "Failed to authenticate with server ({})" msgstr "サーバーとの認証に失敗しました({})" @@ -1090,7 +1054,6 @@ msgid "Full" msgstr "" #: src/lib/ffmpeg_content.cc:562 -#, c++-format msgid "Full (0-{})" msgstr "" @@ -1137,11 +1100,11 @@ msgstr "Gamma 28 (BT470BG)" msgid "Gradient debander" msgstr "" -#: src/lib/audio_processor.cc:142 src/lib/util.cc:619 +#: src/lib/audio_processor.cc:142 src/lib/util.cc:625 msgid "HI" msgstr "HI" -#: src/lib/util.cc:588 +#: src/lib/util.cc:594 msgid "Hearing impaired" msgstr "聴覚障害(HI)" @@ -1175,11 +1138,11 @@ msgstr "IEC61966-2-4" msgid "IN" msgstr "" -#: src/lib/hints.cc:198 +#: src/lib/hints.cc:195 msgid "If you do use 25fps you should change your DCP standard to SMPTE." msgstr "25fpsを使用する場合、DCP規格をSMPTEに変更する必要があります。" -#: src/lib/hints.cc:261 +#: src/lib/hints.cc:258 msgid "" "In general it is now advisable to make SMPTE DCPs unless you have a " "particular reason to use Interop. It is advisable to set your DCP to use " @@ -1189,7 +1152,7 @@ msgstr "" "勧めします。「DCP」タブで、SMPTE規格を使用するようにDCPを設定することをお勧め" "します。" -#: src/lib/hints.cc:641 +#: src/lib/hints.cc:624 msgid "" "It is advisable to put your first subtitle at least 4 seconds after the " "start of the DCP to make sure it is seen." @@ -1198,7 +1161,6 @@ msgstr "" "することをお勧めします。" #: src/lib/job.cc:169 src/lib/job.cc:204 src/lib/job.cc:295 src/lib/job.cc:305 -#, c++-format msgid "It is not known what caused this error. {}" msgstr "このエラーの原因は不明です。{}" @@ -1206,7 +1168,7 @@ msgstr "このエラーの原因は不明です。{}" msgid "JEDEC P22" msgstr "JEDEC P22" -#: src/lib/config.cc:422 src/lib/config.cc:1230 +#: src/lib/config.cc:421 src/lib/config.cc:1226 msgid "KDM delivery: $CPL_NAME" msgstr "KDM配信: $CPL_NAME" @@ -1216,35 +1178,35 @@ msgid "Kernel deinterlacer" msgstr "カーネルデインターレース" #. TRANSLATORS: L here is an abbreviation for "left", to indicate the left-eye part of a 3D export -#: src/lib/ffmpeg_film_encoder.cc:265 src/lib/util.cc:613 +#: src/lib/ffmpeg_film_encoder.cc:265 src/lib/util.cc:619 msgid "L" msgstr "L" -#: src/lib/mid_side_decoder.cc:106 src/lib/util.cc:582 +#: src/lib/mid_side_decoder.cc:106 src/lib/util.cc:588 msgid "Left" msgstr "Left" -#: src/lib/util.cc:590 +#: src/lib/util.cc:596 msgid "Left centre" msgstr "Left centre" -#: src/lib/util.cc:592 +#: src/lib/util.cc:598 msgid "Left rear surround" msgstr "Left rear surround" -#: src/lib/util.cc:586 +#: src/lib/util.cc:592 msgid "Left surround" msgstr "Left surround" -#: src/lib/video_content.cc:528 +#: src/lib/video_content.cc:526 msgid "Length" msgstr "長さ" -#: src/lib/util.cc:616 +#: src/lib/util.cc:622 msgid "Lfe" msgstr "Lfe" -#: src/lib/util.cc:585 +#: src/lib/util.cc:591 msgid "Lfe (sub)" msgstr "Lfe (sub)" @@ -1254,7 +1216,7 @@ msgid "Limited" msgstr "限定" #: src/lib/ffmpeg_content.cc:555 -#, fuzzy, c++-format +#, fuzzy msgid "Limited / video ({}-{})" msgstr "限定 / ビデオ ({}-{})" @@ -1276,7 +1238,7 @@ msgstr "対数(316:1 range)" msgid "Lost communication between main and writer processes" msgstr "メインプロセスとライタープロセス間の通信が失われました" -#: src/lib/util.cc:617 +#: src/lib/util.cc:623 msgid "Ls" msgstr "Ls" @@ -1315,7 +1277,6 @@ msgid "Mismatched video sizes in DCP" msgstr "DCP のビデオ サイズの不一致" #: src/lib/exceptions.cc:71 -#, c++-format msgid "Missing required setting {}" msgstr "必要な設定 {} がありません" @@ -1371,12 +1332,10 @@ msgid "OK" msgstr "OK" #: src/lib/job.cc:652 -#, c++-format msgid "OK (ran for {} from {} to {})" -msgstr "" +msgstr "OK ( 処理時間 {} 、 開始時刻 {} 、 終了時刻 {} )" #: src/lib/job.cc:650 -#, c++-format msgid "OK (ran for {})" msgstr "" @@ -1398,7 +1357,6 @@ msgid "Open subtitles" msgstr "字幕を開く" #: src/lib/transcode_job.cc:113 -#, c++-format msgid "" "Open the project in {}, check the settings, then save it before trying again." msgstr "" @@ -1431,8 +1389,7 @@ msgstr "P3 D65 (~6500K)" msgid "P3 DCI (~6300K)" msgstr "P3 DCI (~6300K)" -#: src/lib/util.cc:1111 -#, c++-format +#: src/lib/util.cc:1137 msgid "" "Please report this problem by using Help -> Report a problem or via email to " "{}" @@ -1454,7 +1411,6 @@ msgid "Prepared for video frame rate" msgstr "動画フレームレートの準備" #: src/lib/exceptions.cc:106 -#, c++-format msgid "Programming error at {}:{} {}" msgstr "プログラミングエラー({}:{} {})" @@ -1467,7 +1423,7 @@ msgid "Public Service Announcement" msgstr "公共広告(PSA)" #. TRANSLATORS: R here is an abbreviation for "right", to indicate the right-eye part of a 3D export -#: src/lib/ffmpeg_film_encoder.cc:270 src/lib/util.cc:614 +#: src/lib/ffmpeg_film_encoder.cc:270 src/lib/util.cc:620 msgid "R" msgstr "R" @@ -1501,19 +1457,19 @@ msgstr "Rec. 601" msgid "Rec. 709" msgstr "Rec. 709" -#: src/lib/mid_side_decoder.cc:107 src/lib/util.cc:583 +#: src/lib/mid_side_decoder.cc:107 src/lib/util.cc:589 msgid "Right" msgstr "Right" -#: src/lib/util.cc:591 +#: src/lib/util.cc:597 msgid "Right centre" msgstr "Right centre" -#: src/lib/util.cc:593 +#: src/lib/util.cc:599 msgid "Right rear surround" msgstr "Right rear surround" -#: src/lib/util.cc:587 +#: src/lib/util.cc:593 msgid "Right surround" msgstr "Right surround" @@ -1525,7 +1481,7 @@ msgstr "反時計回りに90度回転" msgid "Rotate 90 degrees clockwise" msgstr "時計回りに90度回転" -#: src/lib/util.cc:618 +#: src/lib/util.cc:624 msgid "Rs" msgstr "Rs" @@ -1550,7 +1506,7 @@ msgstr "SMPTE 2085, Y'D'zD'x" msgid "SMPTE 240M" msgstr "SMPTE 240M" -#: src/lib/hints.cc:706 +#: src/lib/hints.cc:689 msgid "" "SMPTE DCPs with the type FTR (feature) should have markers for the first " "frame of end credits (FFEC) and the first frame of moving credits (FFMC). " @@ -1585,13 +1541,11 @@ msgid "SMPTE ST 432-1 D65 (2010)" msgstr "SMPTE ST 432-1 D65 (2010)" #: src/lib/scp_uploader.cc:46 -#, c++-format msgid "SSH error [{}]" msgstr "SSH エラー [{}]" #: src/lib/scp_uploader.cc:62 src/lib/scp_uploader.cc:75 #: src/lib/scp_uploader.cc:82 -#, c++-format msgid "SSH error [{}] ({})" msgstr "SSH エラー [{}] ({})" @@ -1611,17 +1565,16 @@ msgstr "メールを送信する" msgid "Short" msgstr "短編(SHR)" -#: src/lib/audio_processor.cc:146 src/lib/util.cc:627 +#: src/lib/audio_processor.cc:146 src/lib/util.cc:633 #, fuzzy msgid "Sign" msgstr "サイン" -#: src/lib/video_content.cc:530 +#: src/lib/video_content.cc:528 msgid "Size" msgstr "サイズ" #: src/lib/audio_content.cc:259 -#, c++-format msgid "Some audio will be resampled to {}Hz" msgstr "一部の音声は {}Hz に再サンプリングされます" @@ -1660,14 +1613,13 @@ msgstr "" "DCP-o-maticのバグ修正により、一部のファイルの再調査が必要です。設定の確認が必" "要になる場合があります。" -#: src/lib/hints.cc:622 -#, c++-format +#: src/lib/hints.cc:605 msgid "" "Some of your closed captions span more than {} lines, so they will be " "truncated." msgstr "字幕の中には{}行を超えるものがある為、途中が途切れて表示されます。" -#: src/lib/hints.cc:744 +#: src/lib/hints.cc:727 msgid "" "Some of your content has audio but you have not set the audio language. It " "is advisable to set the audio language in the \"DCP\" tab unless your audio " @@ -1677,7 +1629,7 @@ msgstr "" "ナレーションが含まれていない場合を除き「DCP」タブで音声言語を設定することをお" "勧めします。" -#: src/lib/hints.cc:815 +#: src/lib/hints.cc:798 msgid "" "Some of your content is encrypted, and some not. Though some distributors " "(e.g. Netflix) require subtitles not to be encrypted (even if picture and " @@ -1703,8 +1655,7 @@ msgstr "コンテンツの一部にはKDMが必要です" msgid "Some of your content needs an OV" msgstr "コンテンツの一部にはOVが必要です" -#: src/lib/hints.cc:798 -#, c++-format +#: src/lib/hints.cc:781 msgid "" "Some of your video content contains an alpha channel, and {} cannot be " "certain how to process it. Check that your video looks correct in the " @@ -1767,12 +1718,10 @@ msgid "The certificate chain for signing is invalid" msgstr "署名用の証明書チェーンが無効です" #: src/lib/exceptions.cc:99 -#, c++-format msgid "The certificate chain for signing is invalid ({})" msgstr "署名用の証明書チェーンが無効です ({})" -#: src/lib/hints.cc:761 -#, c++-format +#: src/lib/hints.cc:744 msgid "" "The certificate chain that {} uses for signing DCPs and KDMs contains a " "small error which will prevent DCPs from being validated correctly on some " @@ -1785,8 +1734,7 @@ msgstr "" "「秘密鍵」ページで「証明書と秘密鍵を再作成する」ボタンをクリックして、署名証" "明書チェーンを再作成することをお勧めします。" -#: src/lib/hints.cc:769 -#, c++-format +#: src/lib/hints.cc:752 msgid "" "The certificate chain that {} uses for signing DCPs and KDMs has a validity " "period that is too long. This will cause problems playing back DCPs on some " @@ -1800,7 +1748,6 @@ msgstr "" "名証明書チェーンを再作成することをお勧めします。" #: src/lib/video_decoder.cc:69 -#, c++-format msgid "" "The content file {} is set as 3D but does not appear to contain 3D images. " "Please set it to 2D. You can still make a 3D DCP from this content by " @@ -1819,26 +1766,22 @@ msgstr "" "てからもう一度お試しください。" #: src/lib/playlist.cc:244 -#, c++-format msgid "The file {} has been moved {} milliseconds earlier." msgstr "{}は{}ms前に移動されました。" #: src/lib/playlist.cc:239 -#, c++-format msgid "The file {} has been moved {} milliseconds later." msgstr "{}は{}ms後に移動されました。" #: src/lib/playlist.cc:264 -#, c++-format msgid "The file {} has been trimmed by {} milliseconds less." msgstr "{}は{}ms短縮されました。" #: src/lib/playlist.cc:259 -#, c++-format msgid "The file {} has been trimmed by {} milliseconds more." msgstr "{}はさらにに{}ms短縮されました。" -#: src/lib/hints.cc:270 +#: src/lib/hints.cc:267 msgid "" "The vast majority of cinemas in Europe, Australasia and North America expect " "DCPs encoded with JPEG2000 rather than MPEG2. Make sure that your cinema " @@ -1859,7 +1802,7 @@ msgstr "" "うになりました。プロジェクト内の字幕が意図した位置に配置されているか、必ず確" "認してください。" -#: src/lib/hints.cc:251 +#: src/lib/hints.cc:248 msgid "" "There is a large difference between the frame rate of your DCP and that of " "some of your content. This will cause your audio to play back at a much " @@ -1885,20 +1828,17 @@ msgstr "" "メモリが不足しています。32ビットオペレーティングシステムを使用している場合、" "環境設定の「一般」タブでエンコードスレッドの数を減らしてみてください。" -#: src/lib/util.cc:961 -#, c++-format +#: src/lib/util.cc:987 msgid "This KDM was made for {} but not for its leaf certificate." msgstr "" "このKDMは{}のために作成されたものです。リーフ証明書のために作成されたものでは" "ありません。" -#: src/lib/util.cc:959 -#, c++-format +#: src/lib/util.cc:985 msgid "This KDM was not made for {}'s decryption certificate." msgstr "このKDMは{}の復号のために作成された証明書ではありません。" #: src/lib/job.cc:141 -#, c++-format msgid "" "This error has probably occurred because you are running the 32-bit version " "of {} and trying to use too many encoding threads. Please reduce the " @@ -1910,7 +1850,6 @@ msgstr "" "を減らして、もう一度お試しください。" #: src/lib/job.cc:155 -#, c++-format msgid "" "This error has probably occurred because you are running the 32-bit version " "of {}. Please re-install {} with the 64-bit installer and try again." @@ -1927,7 +1866,6 @@ msgstr "" "して「KDMを追加」を選択してください。" #: src/lib/film.cc:556 -#, c++-format msgid "" "This film was created with a newer version of {}, and it cannot be loaded " "into this version. Sorry!" @@ -1936,7 +1874,6 @@ msgstr "" "ができません。" #: src/lib/film.cc:537 -#, c++-format msgid "" "This film was created with an older version of {}, and unfortunately it " "cannot be loaded into this version. You will need to create a new Film, re-" @@ -1964,7 +1901,6 @@ msgid "Trailer" msgstr "予告(TLR)" #: src/lib/transcode_job.cc:74 -#, c++-format msgid "Transcoding {}" msgstr "トランスコーディング {}" @@ -1997,8 +1933,7 @@ msgstr "不明" msgid "Unknown error" msgstr "不明なエラー" -#: src/lib/ffmpeg_decoder.cc:384 -#, c++-format +#: src/lib/ffmpeg_decoder.cc:377 msgid "Unrecognised audio sample format ({})" msgstr "認識されていない音声サンプル形式 ({})" @@ -2019,7 +1954,7 @@ msgstr "未指定" msgid "Untitled" msgstr "未使用" -#: src/lib/util.cc:596 src/lib/util.cc:597 +#: src/lib/util.cc:602 src/lib/util.cc:603 msgid "Unused" msgstr "未使用" @@ -2031,7 +1966,7 @@ msgstr "Upmix L" msgid "Upmix R" msgstr "Upmix R" -#: src/lib/audio_processor.cc:143 src/lib/util.cc:620 +#: src/lib/audio_processor.cc:143 src/lib/util.cc:626 msgid "VI" msgstr "VI" @@ -2048,11 +1983,10 @@ msgid "Vertical flip" msgstr "垂直反転" #: src/lib/fcpxml.cc:69 -#, c++-format msgid "Video refers to missing asset {}" msgstr "" -#: src/lib/util.cc:589 +#: src/lib/util.cc:595 msgid "Visually impaired" msgstr "視覚障害者" @@ -2085,8 +2019,7 @@ msgstr "YCgCo-R, 奇数追加" msgid "Yet Another Deinterlacing Filter" msgstr "" -#: src/lib/hints.cc:211 -#, c++-format +#: src/lib/hints.cc:208 msgid "" "You are set up for a DCP at a frame rate of {} fps. This frame rate is not " "supported by all projectors. It is advisable to change the DCP frame rate " @@ -2096,8 +2029,7 @@ msgstr "" "ロジェクターで対応している訳ではりません。DCPのフレームレートを{} fpsに変更す" "ることをお勧めします。" -#: src/lib/hints.cc:195 -#, c++-format +#: src/lib/hints.cc:192 msgid "" "You are set up for a DCP at a frame rate of {} fps. This frame rate is not " "supported by all projectors. You may want to consider changing your frame " @@ -2107,7 +2039,7 @@ msgstr "" "ロジェクターで対応している訳ではりません。DCPのフレームレートを{} fpsに変更す" "ることをお勧めします。" -#: src/lib/hints.cc:205 +#: src/lib/hints.cc:202 msgid "" "You are set up for a DCP frame rate of 30fps, which is not supported by all " "projectors. Be aware that you may have compatibility problems." @@ -2116,7 +2048,7 @@ msgstr "" "トされているわけではありません。互換性の問題が発生する可能性がありますのでご" "注意ください。" -#: src/lib/hints.cc:325 +#: src/lib/hints.cc:322 msgid "" "You are using 3D content but your DCP is set to 2D. Set the DCP to 3D if " "you want to play it back on a 3D system (e.g. Real-D, MasterImage etc.)" @@ -2124,8 +2056,7 @@ msgstr "" "3Dコンテンツを使用していますがDCP設定が2Dになっています。RealD・MasterImageな" "どの3Dシステムで再生する場合はDCP設定を3Dに設定してください。" -#: src/lib/hints.cc:128 -#, c++-format +#: src/lib/hints.cc:125 msgid "" "You are using {}'s stereo-to-5.1 upmixer. This is experimental and may " "result in poor-quality audio. If you continue, you should listen to the " @@ -2135,7 +2066,7 @@ msgstr "" "的な機能であり音質が低下する可能性があります。続行する場合、生成されたDCPを映" "画館で試聴して音質が良好であることを確認してください。" -#: src/lib/film.cc:1794 +#: src/lib/film.cc:1792 #, fuzzy msgid "" "You have more than one piece of Atmos content, and they do not have the same " @@ -2144,7 +2075,7 @@ msgstr "" "Atmosコンテンツが複数存在し、それらのフレームレートが異なっています。Atmosコ" "ンテンツの一部を削除する必要があります。" -#: src/lib/hints.cc:629 +#: src/lib/hints.cc:612 msgid "" "You have overlapping closed captions, which are not allowed in Interop " "DCPs. Change your DCP standard to SMPTE." @@ -2152,7 +2083,7 @@ msgstr "" "字幕が重複していますが、これはInterop DCPでは許可されていません。DCP規格を" "SMPTEに変更してください。" -#: src/lib/hints.cc:293 +#: src/lib/hints.cc:290 msgid "" "You have specified a font file which is larger than 640kB. This is very " "likely to cause problems on playback." @@ -2160,8 +2091,8 @@ msgstr "" "640KBを超えるフォントファイルが指定されました。再生時に問題が発生する可能性が" "高くなります。" -#: src/lib/hints.cc:309 -#, fuzzy, c++-format +#: src/lib/hints.cc:306 +#, fuzzy msgid "" "You have {} files that look like they are VOB files from DVD. You should " "join them to ensure smooth joins between the files." @@ -2173,8 +2104,7 @@ msgstr "" msgid "You must add some content to the DCP before creating it" msgstr "DCPを作成する前にコンテンツを追加する必要があります" -#: src/lib/hints.cc:113 -#, c++-format +#: src/lib/hints.cc:110 msgid "" "Your DCP has fewer than 6 audio channels. This may cause problems on some " "projectors. You may want to set the DCP to have 6 channels. It does not " @@ -2185,8 +2115,7 @@ msgstr "" "があります。DCP音声を6チャンネルに設定することをおすすめします。コンテンツの" "音声チャンネル数は6未満でも問題ありませんが{}は余分な部分を無音で埋めます。" -#: src/lib/hints.cc:787 -#, c++-format +#: src/lib/hints.cc:770 msgid "" "Your DCP has {} audio channels, rather than 8 or 16. This may cause some " "distributors to raise QC errors when they check your DCP. To avoid this, " @@ -2196,7 +2125,7 @@ msgstr "" "給会社がDCPチェック時に品質エラーを報告する可能性があります。これを回避するに" "は、DCPの音声チャンネルを8chまたは16chに設定してください。" -#: src/lib/hints.cc:170 +#: src/lib/hints.cc:167 msgid "" "Your DCP uses an unusual container ratio. This may cause problems on some " "projectors. If possible, use Flat or Scope for the DCP container ratio." @@ -2205,8 +2134,7 @@ msgstr "" "性があります。可能であれば、DCPのコンテナ比率をフラットまたはスコープに設定し" "てください。" -#: src/lib/hints.cc:359 -#, c++-format +#: src/lib/hints.cc:356 msgid "" "Your audio level is very high (on {}). You should reduce the gain of your " "audio content." @@ -2237,7 +2165,7 @@ msgstr "" msgid "[still]" msgstr "" -#: src/lib/dcp_subtitle_content.cc:132 src/lib/fcpxml_content.cc:86 +#: src/lib/dcp_subtitle_content.cc:133 src/lib/fcpxml_content.cc:86 #: src/lib/string_text_file_content.cc:111 msgid "[subtitles]" msgstr "" @@ -2245,7 +2173,7 @@ msgstr "" #. TRANSLATORS: _reel{} here is to be added to an export filename to indicate #. which reel it is. Preserve the {}; it will be replaced with the reel number. #: src/lib/ffmpeg_film_encoder.cc:151 -#, fuzzy, c++-format +#, fuzzy msgid "_reel{}" msgstr "_リール{}" @@ -2254,7 +2182,7 @@ msgstr "_リール{}" msgid "bits" msgstr "ビット" -#: src/lib/dcpomatic_socket.cc:86 src/lib/dcpomatic_socket.cc:116 +#: src/lib/dcpomatic_socket.cc:82 src/lib/dcpomatic_socket.cc:112 #, fuzzy msgid "connect timed out" msgstr "接続時間超過" @@ -2269,7 +2197,6 @@ msgid "content type" msgstr "コンテンツ種類" #: src/lib/uploader.cc:79 -#, c++-format msgid "copying {}" msgstr "" @@ -2278,57 +2205,47 @@ msgid "could not find stream information" msgstr "ストリーム情報が見つかりませんでした" #: src/lib/reel_writer.cc:408 -#, fuzzy, c++-format +#, fuzzy msgid "could not move atmos asset into the DCP ({})" msgstr "atmosアセットをDCPに移動できませんでした ({})" #: src/lib/reel_writer.cc:391 -#, c++-format msgid "could not move audio asset into the DCP ({})" msgstr "音声AssetをDCPに移動できませんでした({})" #: src/lib/exceptions.cc:38 -#, c++-format msgid "could not open file {} for read ({})" msgstr "{} を読込み用に開けませんでした ({})" #: src/lib/exceptions.cc:37 -#, c++-format msgid "could not open file {} for read/write ({})" msgstr "{} を読書き用に開けませんでした ({})" #: src/lib/exceptions.cc:38 -#, c++-format msgid "could not open file {} for write ({})" msgstr "{} を書込み用に開けませんでした ({})" #: src/lib/exceptions.cc:57 -#, c++-format msgid "could not read from file {} ({})" msgstr "ファイル {} ({}) から読み取れませんでした" #: src/lib/exceptions.cc:64 -#, c++-format msgid "could not write to file {} ({})" msgstr "{} への書き込みができませんでした ({})" -#: src/lib/dcpomatic_socket.cc:112 -#, c++-format +#: src/lib/dcpomatic_socket.cc:108 msgid "error during async_connect ({})" msgstr "" -#: src/lib/dcpomatic_socket.cc:82 -#, c++-format +#: src/lib/dcpomatic_socket.cc:78 msgid "error during async_connect: ({})" msgstr "" -#: src/lib/dcpomatic_socket.cc:204 -#, c++-format +#: src/lib/dcpomatic_socket.cc:200 msgid "error during async_read ({})" msgstr "" -#: src/lib/dcpomatic_socket.cc:163 -#, c++-format +#: src/lib/dcpomatic_socket.cc:159 msgid "error during async_write ({})" msgstr "" @@ -2348,7 +2265,6 @@ msgid "it has a different frame rate to the film." msgstr "filmとはフレームレートが異なります。" #: src/lib/dcp_content.cc:799 -#, c++-format msgid "" "it has a different number of audio channels than the project; set the " "project to have {} channels." @@ -2462,42 +2378,38 @@ msgstr "" msgid "unknown" msgstr "不明" -#: src/lib/video_content.cc:528 +#: src/lib/video_content.cc:526 msgid "video frames" msgstr "動画フレーム" #: src/lib/cross_common.cc:106 -#, c++-format msgid "{} ({} GB) [{}]" msgstr "{} ({} GB) [{}]" #: src/lib/atmos_mxf_content.cc:95 -#, c++-format msgid "{} [Atmos]" msgstr "{} [Atmos]" #: src/lib/dcp_content.cc:381 -#, c++-format msgid "{} [DCP]" msgstr "{} [DCP]" #: src/lib/ffmpeg_content.cc:345 -#, fuzzy, c++-format +#, fuzzy msgid "{} [audio]" msgstr "{} [音声]" #: src/lib/ffmpeg_content.cc:341 -#, fuzzy, c++-format +#, fuzzy msgid "{} [movie]" msgstr "{} [ムービー]" #: src/lib/ffmpeg_content.cc:343 src/lib/video_mxf_content.cc:105 -#, fuzzy, c++-format +#, fuzzy msgid "{} [video]" msgstr "{} [ビデオ]" #: src/lib/job.cc:180 src/lib/job.cc:195 -#, c++-format msgid "" "{} could not open the file {} ({}). Perhaps it does not exist or is in an " "unexpected format." @@ -2505,8 +2417,7 @@ msgstr "" "{} はファイル {} ({}) を開けませんでした。ファイルが存在しないか、予期しない" "形式の可能性があります。" -#: src/lib/film.cc:1831 -#, c++-format +#: src/lib/film.cc:1829 msgid "" "{} had to change your settings for referring to DCPs as OV. Please review " "those settings to make sure they are what you want." @@ -2514,8 +2425,8 @@ msgstr "" "{}はDCPをOVとして参照するために設定を変更する必要がありました。設定を確認し、" "正しいことを確認してください。" -#: src/lib/film.cc:1797 -#, fuzzy, c++-format +#: src/lib/film.cc:1795 +#, fuzzy msgid "" "{} had to change your settings so that the film's frame rate is the same as " "that of your Atmos content." @@ -2523,8 +2434,8 @@ msgstr "" "{} は、映画のフレームレートが Atmos コンテンツのフレームレートと同じになるよ" "うに設定を変更する必要がありました。" -#: src/lib/film.cc:1844 -#, fuzzy, c++-format +#: src/lib/film.cc:1842 +#, fuzzy msgid "" "{} had to remove one of your custom reel boundaries as it no longer lies " "within the film." @@ -2532,8 +2443,8 @@ msgstr "" "{} は、カスタム リール境界の 1 つがフィルム内に収まらなくなったため、削除する" "必要がありました。" -#: src/lib/film.cc:1842 -#, fuzzy, c++-format +#: src/lib/film.cc:1840 +#, fuzzy msgid "" "{} had to remove some of your custom reel boundaries as they no longer lie " "within the film." @@ -2542,16 +2453,14 @@ msgstr "" "それらを削除する必要がありました。" #: src/lib/ffmpeg_content.cc:114 -#, fuzzy, c++-format +#, fuzzy msgid "{} no longer supports the `{}' filter, so it has been turned off." msgstr "{} は `{}' フィルターをサポートしなくなったため、オフになりました。" -#: src/lib/config.cc:432 src/lib/config.cc:1245 -#, c++-format +#: src/lib/config.cc:431 src/lib/config.cc:1241 msgid "{} notification" msgstr "{} 通知" #: src/lib/transcode_job.cc:181 -#, c++-format msgid "{}; {}/{} frames" msgstr "{}; {}/{} フレーム" diff --git a/src/lib/po/zh_CN.po b/src/lib/po/zh_CN.po index a575f752b..db2ab4731 100644 --- a/src/lib/po/zh_CN.po +++ b/src/lib/po/zh_CN.po @@ -13,15 +13,15 @@ msgstr "" "Project-Id-Version: LIBDCPOMATIC\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-04-19 23:03+0200\n" -"PO-Revision-Date: 2025-10-05 13:31+0800\n" +"PO-Revision-Date: 2026-05-17 10:45+0800\n" "Last-Translator: Dian Li <xslidian@gmail.com>\n" -"Language-Team: Chinese Simplified (Rov8 branch)\n" +"Language-Team: Chinese Simplified (Hanyuan branch)\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 3.7\n" +"X-Generator: Poedit 3.9\n" "X-Poedit-SourceCharset: UTF-8\n" #: src/lib/video_content.cc:515 @@ -207,7 +207,7 @@ msgid "; {} remaining; finishing at {}{}" msgstr "; 剩余 {} ; 完成于 {}{}" #: src/lib/analytics.cc:58 -#, fuzzy, c++-format +#, c++-format msgid "" "<h2>You have made {} DCPs with {}!</h2><img width=\"150\" height=\"193\" " "src=\"memory:me.jpg\" align=\"center\"><font size=\"+1\"><p>Hello. I'm Carl " @@ -429,7 +429,7 @@ msgstr "中置" #: src/lib/exceptions.cc:196 #, c++-format msgid "CPL {} not found" -msgstr "" +msgstr "未找到CPL {}" #: src/lib/job.cc:657 msgid "Cancelled" @@ -461,6 +461,8 @@ msgid "" "Check the server settings in the TMS tab of preferences, or un-tick \"Upload " "DCP to TMS after creation\" if you do not want to upload your DCP." msgstr "" +"在首选项的TMS页面中检查服务器设置,或者您不想要上传DCP的话,则取消选中“制作" +"DCP后上传到TMS)复选框" #: src/lib/transcode_job.cc:106 msgid "Check their new settings, then try again." @@ -682,9 +684,8 @@ msgid "Copying DCPs to {}" msgstr "复制DCP到 {}" #: src/lib/reel_writer.cc:194 -#, fuzzy msgid "Copying existing asset" -msgstr "检查现有的图像数据" +msgstr "正在拷贝已经存在的资产" #: src/lib/copy_to_drive_job.cc:58 #, c++-format @@ -811,9 +812,9 @@ msgid "DCP sample rate" msgstr "DCP 采样率" #: src/lib/frame_rate_change.cc:93 -#, fuzzy, c++-format +#, c++-format msgid "DCP will contain 1 out of every {} frames of the content.\n" -msgstr "将使用隔帧打包DCP。\n" +msgstr "DCP 将包含内容中每 {} 帧中的 1 帧。\n" #: src/lib/frame_rate_change.cc:103 #, c-format @@ -904,9 +905,8 @@ msgstr "下载失败 ({} error {})" #. TRANSLATORS: this is an abbreviation for "end credits", shown next to the pair of markers #. "FFEC" and "LFEC" ({First, Last} Frame of End Credits) #: src/lib/layout_markers.cc:145 -#, fuzzy msgid "EC" -msgstr "中置" +msgstr "片尾字幕" #: src/lib/frame_rate_change.cc:95 msgid "Each content frame will be doubled in the DCP.\n" @@ -1128,7 +1128,7 @@ msgstr "IEC61966-2-4" #. "FFOI" and "LFOI" ({First, Last} Frame of Intermission) #: src/lib/layout_markers.cc:142 msgid "IN" -msgstr "" +msgstr "幕间休息" #: src/lib/hints.cc:198 msgid "If you do use 25fps you should change your DCP standard to SMPTE." @@ -1231,9 +1231,8 @@ msgstr "左环绕" #. TRANSLATORS: this is an abbreviation for "moving credits", shown next to the pair of markers #. "FFMC" and "LFMC" ({First, Last} Frame of Moving Credits) #: src/lib/layout_markers.cc:148 -#, fuzzy msgid "MC" -msgstr "中置" +msgstr "滚动字幕" #: src/lib/mid_side_decoder.cc:39 msgid "Mid-side decoder" @@ -1279,12 +1278,11 @@ msgstr "动态隔行补偿" #: src/lib/dcp_content.cc:212 msgid "No ASSETMAP or ASSETMAP.xml file found: is this a DCP?" -msgstr "" +msgstr "未找到ASSETMAP或ASSETMAP.xml文件,这是一个DCP吗?" #: src/lib/dcp_examiner.cc:115 -#, fuzzy msgid "No CPLs found in DCP" -msgstr "DCP中没有找到CPL文件。" +msgstr "DCP中没有找到CPL文件" #: src/lib/dcp_decoder.cc:114 msgid "No CPLs found in DCP." @@ -1362,15 +1360,15 @@ msgstr "小波降噪" #: src/lib/colour_conversion.cc:293 msgid "P3 D60 (~6000K)" -msgstr "" +msgstr "P3 D60 (~6000K)" #: src/lib/colour_conversion.cc:292 msgid "P3 D65 (~6500K)" -msgstr "" +msgstr "P3 D65 (~6500K)" #: src/lib/colour_conversion.cc:291 msgid "P3 DCI (~6300K)" -msgstr "" +msgstr "P3 DCI (~6300K)" #: src/lib/util.cc:1111 #, c++-format @@ -1412,9 +1410,8 @@ msgstr "右声道" #. TRANSLATORS: this is an abbreviation for "ratings band", shown next to the pair of markers #. "FFOB" and "LFOB" ({First, Last} Frame of Band) #: src/lib/layout_markers.cc:136 -#, fuzzy msgid "RB" -msgstr "右声道" +msgstr "评级" #: src/lib/ffmpeg_content.cc:644 msgid "RGB / sRGB (IEC61966-2-1)" @@ -1503,9 +1500,8 @@ msgid "SMPTE ST 2084 for 10, 12, 14 and 16 bit systems" msgstr "SMPTE ST 2084 10, 12, 14和16 bit" #: src/lib/ffmpeg_content.cc:660 -#, fuzzy msgid "SMPTE ST 2128, IPT-C2" -msgstr "SMPTE ST 428-1" +msgstr "SMPTE ST 2128, IPT-C2" #: src/lib/ffmpeg_content.cc:636 msgid "SMPTE ST 428-1" @@ -1589,14 +1585,12 @@ msgstr "" "这些文件现在将被重新检查,因此您可能需要检查它们的设置。" #: src/lib/check_content_job.cc:94 -#, fuzzy msgid "" "Some files must be re-examined due to a bug fix in DCP-o-matic. You may " "need to check their settings." msgstr "" -"有些文件在添加到项目后发生了更改\n" -"\n" -"这些文件现在将被重新检查,因此您可能需要检查它们的设置。" +"由于 DCP-o-matic 中的一个漏洞修复,某些文件必须重新检查。您可能需要检查它们的" +"设置。" #: src/lib/hints.cc:622 #, c++-format @@ -1622,6 +1616,9 @@ msgid "" "in doubt, set everything (picture, sound and text) to be either encrypted or " "not." msgstr "" +"你的一些内容是加密的,而有些则不是。虽然一些分销商(例如 Netflix)要求字幕不" +"能加密(即使画面和声音可以加密),但其他分销商会对由此项目生成的 DCP 标记错" +"误。如果不确定,请将所有内容(画面、声音和文字)设置为加密或不加密。" #: src/lib/make_dcp.cc:69 msgid "Some of your content is missing" @@ -1670,9 +1667,8 @@ msgstr "星期日" #. TRANSLATORS: this is an abbreviation for "title credits", shown next to the pair of markers #. "FFTC" and "LFTC" ({First, Last} Frame of Title Credits) #: src/lib/layout_markers.cc:139 -#, fuzzy msgid "TC" -msgstr "中置" +msgstr "标题字幕" #: src/lib/dcp_content_type.cc:60 msgid "Teaser" @@ -1987,11 +1983,11 @@ msgstr "YCOCG" #: src/lib/ffmpeg_content.cc:661 msgid "YCgCo-R, even addition" -msgstr "" +msgstr "YCgCo-R,偶数叠加编码" #: src/lib/ffmpeg_content.cc:662 msgid "YCgCo-R, odd addition" -msgstr "" +msgstr "YCgCo-R,奇数叠加编码" #: src/lib/filter.cc:98 msgid "Yet Another Deinterlacing Filter" @@ -2313,11 +2309,10 @@ msgstr "名字" #. TRANSLATORS: this string will follow "Cannot reference this DCP: " #: src/lib/dcp_content.cc:829 -#, fuzzy msgid "" "one of its closed caption reels has a non-zero entry point so it must be re-" "written." -msgstr "它的一个隐藏字幕有一个非零的时间点,因此必须重写。" +msgstr "它的一个隐藏字幕卷有一个非零的起始点,因此必须重写。" #. TRANSLATORS: this string will follow "Cannot reference this DCP: " #: src/lib/dcp_content.cc:823 diff --git a/src/lib/raw_image_proxy.cc b/src/lib/raw_image_proxy.cc index 9e819140b..e54163e9e 100644 --- a/src/lib/raw_image_proxy.cc +++ b/src/lib/raw_image_proxy.cc @@ -19,6 +19,7 @@ */ +#include "dcpomatic_assert.h" #include "raw_image_proxy.h" #include "image.h" #include <dcp/util.h> @@ -47,7 +48,7 @@ using boost::optional; RawImageProxy::RawImageProxy(shared_ptr<const Image> image) : _image (image) { - + DCPOMATIC_ASSERT(image); } diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc index b85b53305..76c1f8124 100644 --- a/src/lib/reel_writer.cc +++ b/src/lib/reel_writer.cc @@ -591,6 +591,7 @@ ReelWriter::create_reel_sound(shared_ptr<dcp::Reel> reel, list<ReferencedReelAss } +/** @param ensure_closed_captions List of DCPTextTracks that we need to make sure exist in this reel */ void ReelWriter::create_reel_text( shared_ptr<dcp::Reel> reel, @@ -630,17 +631,30 @@ ReelWriter::create_reel_text( } } - for (auto const& i: _closed_caption_assets) { - auto a = maybe_add_text<dcp::ReelInteropTextAsset, dcp::ReelSMPTETextAsset, dcp::ReelTextAsset>( - i.second, dcp::TextType::CLOSED_CAPTION, duration, reel, _reel_index, _reel_count, _content_summary, refs, film(), _period, output_dcp, _text_only + for (auto iter = ensure_closed_captions.begin(); iter != ensure_closed_captions.end(); ) { + /* Find any asset we wrote for this track */ + auto written_asset = _closed_caption_assets.find(*iter); + + /* Try to make a reel asset out of either written_asset or one of the referenced assets */ + auto asset = maybe_add_text<dcp::ReelInteropTextAsset, dcp::ReelSMPTETextAsset, dcp::ReelTextAsset>( + written_asset == _closed_caption_assets.end() ? shared_ptr<dcp::TextAsset>() : written_asset->second, + dcp::TextType::CLOSED_CAPTION, duration, reel, _reel_index, _reel_count, _content_summary, refs, film(), _period, output_dcp, _text_only ); - DCPOMATIC_ASSERT(a); - a->set_annotation_text(i.first.name); - if (i.first.language) { - a->set_language(i.first.language.get()); + + /* Fill in some details for the reel asset if we know them */ + if (asset && written_asset != _closed_caption_assets.end()) { + asset->set_annotation_text(written_asset->first.name); + if (written_asset->first.language) { + asset->set_language(written_asset->first.language.get()); + } } - ensure_closed_captions.erase(i.first); + if (asset) { + /* We made a reel asset for this track, so we don't need to worry about it any more */ + iter = ensure_closed_captions.erase(iter); + } else { + ++iter; + } } /* Make empty tracks for anything we've been asked to ensure but that we haven't added */ diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index 691841bbc..4c1221d60 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -107,6 +107,7 @@ LIBDCP_DISABLE_WARNINGS #include <wx/cmdline.h> #include <wx/generic/aboutdlgg.h> #include <wx/preferences.h> +#include <wx/progdlg.h> #include <wx/splash.h> #include <wx/stdpaths.h> #include <wx/wxhtml.h> @@ -153,10 +154,10 @@ using namespace boost::placeholders; class FilmChangedClosingDialog { public: - explicit FilmChangedClosingDialog (string name) + explicit FilmChangedClosingDialog(string name) : _dialog( nullptr, - wxString::Format(_("Save changes to film \"%s\" before closing?"), std_to_wx (name).data()), + wxString::Format(_("Save changes to film \"%s\" before closing?"), std_to_wx(name).data()), /// TRANSLATORS: this is the heading for a dialog box, which tells the user that the current /// project (Film) has been changed since it was last saved. _("Film changed"), @@ -168,7 +169,7 @@ public: ); } - int run () + int run() { return _dialog.ShowModal(); } @@ -181,10 +182,10 @@ private: class FilmChangedDuplicatingDialog { public: - explicit FilmChangedDuplicatingDialog (string name) + explicit FilmChangedDuplicatingDialog(string name) : _dialog( nullptr, - wxString::Format(_("Save changes to film \"%s\" before duplicating?"), std_to_wx (name).data()), + wxString::Format(_("Save changes to film \"%s\" before duplicating?"), std_to_wx(name).data()), /// TRANSLATORS: this is the heading for a dialog box, which tells the user that the current /// project (Film) has been changed since it was last saved. _("Film changed"), @@ -196,7 +197,7 @@ public: ); } - int run () + int run() { return _dialog.ShowModal(); } @@ -310,8 +311,8 @@ private: class DOMFrame : public wxFrame { public: - explicit DOMFrame (wxString const& title) - : wxFrame (nullptr, -1, title) + explicit DOMFrame(wxString const& title) + : wxFrame(nullptr, -1, title) /* Use a panel as the only child of the Frame so that we avoid the dark-grey background on Windows. */ @@ -320,11 +321,11 @@ public: , _film_viewer(_right_panel, false) { auto bar = new wxMenuBar; - setup_menu (bar); - SetMenuBar (bar); + setup_menu(bar); + SetMenuBar(bar); #ifdef DCPOMATIC_WINDOWS - SetIcon (wxIcon (std_to_wx ("id"))); + SetIcon(wxIcon(std_to_wx("id"))); #endif _config_changed_connection = Config::instance()->Changed.connect(boost::bind(&DOMFrame::config_changed, this, _1)); @@ -332,46 +333,46 @@ public: _analytics_message_connection = Analytics::instance()->Message.connect(boost::bind(&DOMFrame::analytics_message, this, _1, _2)); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_new, this), ID_file_new); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_open, this), ID_file_open); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_save, this), ID_file_save); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_save_as_template, this), ID_file_save_as_template); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_duplicate, this), ID_file_duplicate); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_duplicate_and_open, this), ID_file_duplicate_and_open); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_close, this), ID_file_close); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_history, this, _1), ID_file_history, ID_file_history + HISTORY_SIZE); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_exit, this), wxID_EXIT); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::edit_copy, this), ID_edit_copy); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::edit_paste, this), ID_edit_paste); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::edit_select_all, this), ID_edit_select_all); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::edit_preferences, this), wxID_PREFERENCES); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_make_dcp, this), ID_jobs_make_dcp); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_make_kdms, this), ID_jobs_make_kdms); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_make_dkdms, this), ID_jobs_make_dkdms); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_make_dcp_batch, this), ID_jobs_make_dcp_batch); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_make_self_dkdm, this), ID_jobs_make_self_dkdm); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_export_video_file, this), ID_jobs_export_video_file); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_export_subtitles, this), ID_jobs_export_subtitles); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_send_dcp_to_tms, this), ID_jobs_send_dcp_to_tms); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_show_dcp, this), ID_jobs_show_dcp); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_open_dcp_in_player, this), ID_jobs_open_dcp_in_player); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::view_closed_captions, this), ID_view_closed_captions); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::view_video_waveform, this), ID_view_video_waveform); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_version_file, this), ID_tools_version_file); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_hints, this), ID_tools_hints); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_encoding_servers, this), ID_tools_encoding_servers); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_manage_templates, this), ID_tools_manage_templates); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_check_for_updates, this), ID_tools_check_for_updates); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_system_information, this),ID_tools_system_information); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_restore_default_preferences, this), ID_tools_restore_default_preferences); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_export_preferences, this), ID_tools_export_preferences); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_import_preferences, this), ID_tools_import_preferences); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::help_about, this), wxID_ABOUT); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::help_user_manual, this), ID_help_user_manual); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::help_report_a_problem, this), ID_help_report_a_problem); - - Bind (wxEVT_CLOSE_WINDOW, boost::bind (&DOMFrame::close, this, _1)); - Bind (wxEVT_SHOW, boost::bind (&DOMFrame::show, this, _1)); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::file_new, this), ID_file_new); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::file_open, this), ID_file_open); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::file_save, this), ID_file_save); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::file_save_as_template, this), ID_file_save_as_template); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::file_duplicate, this), ID_file_duplicate); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::file_duplicate_and_open, this), ID_file_duplicate_and_open); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::file_close, this), ID_file_close); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::file_history, this, _1), ID_file_history, ID_file_history + HISTORY_SIZE); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::file_exit, this), wxID_EXIT); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::edit_copy, this), ID_edit_copy); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::edit_paste, this), ID_edit_paste); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::edit_select_all, this), ID_edit_select_all); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::edit_preferences, this), wxID_PREFERENCES); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::jobs_make_dcp, this), ID_jobs_make_dcp); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::jobs_make_kdms, this), ID_jobs_make_kdms); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::jobs_make_dkdms, this), ID_jobs_make_dkdms); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::jobs_make_dcp_batch, this), ID_jobs_make_dcp_batch); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::jobs_make_self_dkdm, this), ID_jobs_make_self_dkdm); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::jobs_export_video_file, this), ID_jobs_export_video_file); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::jobs_export_subtitles, this), ID_jobs_export_subtitles); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::jobs_send_dcp_to_tms, this), ID_jobs_send_dcp_to_tms); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::jobs_show_dcp, this), ID_jobs_show_dcp); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::jobs_open_dcp_in_player, this), ID_jobs_open_dcp_in_player); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::view_closed_captions, this), ID_view_closed_captions); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::view_video_waveform, this), ID_view_video_waveform); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::tools_version_file, this), ID_tools_version_file); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::tools_hints, this), ID_tools_hints); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::tools_encoding_servers, this), ID_tools_encoding_servers); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::tools_manage_templates, this), ID_tools_manage_templates); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::tools_check_for_updates, this), ID_tools_check_for_updates); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::tools_system_information, this),ID_tools_system_information); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::tools_restore_default_preferences, this), ID_tools_restore_default_preferences); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::tools_export_preferences, this), ID_tools_export_preferences); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::tools_import_preferences, this), ID_tools_import_preferences); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::help_about, this), wxID_ABOUT); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::help_user_manual, this), ID_help_user_manual); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::help_report_a_problem, this), ID_help_report_a_problem); + + Bind(wxEVT_CLOSE_WINDOW, boost::bind(&DOMFrame::close, this, _1)); + Bind(wxEVT_SHOW, boost::bind(&DOMFrame::show, this, _1)); auto left_panel = new wxPanel(_splitter, wxID_ANY); @@ -386,27 +387,27 @@ public: _controls->set_film(_film_viewer.film()); auto job_manager_view = new JobManagerView(_right_panel, false); - auto right_sizer = new wxBoxSizer (wxVERTICAL); + auto right_sizer = new wxBoxSizer(wxVERTICAL); right_sizer->Add(_film_viewer.panel(), 2, wxEXPAND | wxALL, 6); - right_sizer->Add (_controls, 0, wxEXPAND | wxALL, 6); - right_sizer->Add (job_manager_view, 1, wxEXPAND | wxALL, 6); + right_sizer->Add(_controls, 0, wxEXPAND | wxALL, 6); + right_sizer->Add(job_manager_view, 1, wxEXPAND | wxALL, 6); _right_panel->SetSizer(right_sizer); _splitter->SplitVertically(left_panel, _right_panel, Config::instance()->main_divider_sash_position().get_value_or(left_panel->GetSize().GetWidth() + 8)); - set_menu_sensitivity (); + set_menu_sensitivity(); - _film_editor->content_panel()->SelectionChanged.connect (boost::bind (&DOMFrame::set_menu_sensitivity, this)); - set_title (); + _film_editor->content_panel()->SelectionChanged.connect(boost::bind(&DOMFrame::set_menu_sensitivity, this)); + set_title(); JobManager::instance()->ActiveJobsChanged.connect(boost::bind(&DOMFrame::active_jobs_changed, this)); UpdateChecker::instance()->StateChanged.connect(boost::bind(&DOMFrame::update_checker_state_changed, this)); - FocusManager::instance()->SetFocus.connect (boost::bind (&DOMFrame::remove_accelerators, this)); - FocusManager::instance()->KillFocus.connect (boost::bind (&DOMFrame::add_accelerators, this)); - add_accelerators (); + FocusManager::instance()->SetFocus.connect(boost::bind(&DOMFrame::remove_accelerators, this)); + FocusManager::instance()->KillFocus.connect(boost::bind(&DOMFrame::add_accelerators, this)); + add_accelerators(); } ~DOMFrame() @@ -415,7 +416,7 @@ public: _video_waveform_dialog.reset(); } - void add_accelerators () + void add_accelerators() { #ifdef __WXOSX__ int accelerators = 7; @@ -424,63 +425,63 @@ public: #endif std::vector<wxAcceleratorEntry> accel(accelerators); /* [Shortcut] Ctrl+A:Add file(s) to the film */ - accel[0].Set (wxACCEL_CTRL, static_cast<int>('A'), ID_add_file); + accel[0].Set(wxACCEL_CTRL, static_cast<int>('A'), ID_add_file); /* [Shortcut] Delete:Remove selected content from film */ - accel[1].Set (wxACCEL_NORMAL, WXK_DELETE, ID_remove); + accel[1].Set(wxACCEL_NORMAL, WXK_DELETE, ID_remove); /* [Shortcut] Space:Start/stop playback */ - accel[2].Set (wxACCEL_NORMAL, WXK_SPACE, ID_start_stop); + accel[2].Set(wxACCEL_NORMAL, WXK_SPACE, ID_start_stop); /* [Shortcut] Ctrl+T:Open timeline window */ - accel[3].Set (wxACCEL_CTRL, static_cast<int>('T'), ID_timeline); + accel[3].Set(wxACCEL_CTRL, static_cast<int>('T'), ID_timeline); /* [Shortcut] Left arrow:Move back one frame */ - accel[4].Set (wxACCEL_NORMAL, WXK_LEFT, ID_back_frame); + accel[4].Set(wxACCEL_NORMAL, WXK_LEFT, ID_back_frame); /* [Shortcut] Right arrow:Move forward one frame */ - accel[5].Set (wxACCEL_NORMAL, WXK_RIGHT, ID_forward_frame); + accel[5].Set(wxACCEL_NORMAL, WXK_RIGHT, ID_forward_frame); #ifdef __WXOSX__ - accel[6].Set (wxACCEL_CTRL, static_cast<int>('W'), ID_file_close); + accel[6].Set(wxACCEL_CTRL, static_cast<int>('W'), ID_file_close); #endif - Bind (wxEVT_MENU, boost::bind (&ContentPanel::add_file_clicked, _film_editor->content_panel()), ID_add_file); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::remove_clicked, this, _1), ID_remove); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::start_stop_pressed, this), ID_start_stop); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::timeline_pressed, this), ID_timeline); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::back_frame, this), ID_back_frame); - Bind (wxEVT_MENU, boost::bind (&DOMFrame::forward_frame, this), ID_forward_frame); - wxAcceleratorTable accel_table (accelerators, accel.data()); - SetAcceleratorTable (accel_table); + Bind(wxEVT_MENU, boost::bind(&ContentPanel::add_file_clicked, _film_editor->content_panel()), ID_add_file); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::remove_clicked, this, _1), ID_remove); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::start_stop_pressed, this), ID_start_stop); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::timeline_pressed, this), ID_timeline); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::back_frame, this), ID_back_frame); + Bind(wxEVT_MENU, boost::bind(&DOMFrame::forward_frame, this), ID_forward_frame); + wxAcceleratorTable accel_table(accelerators, accel.data()); + SetAcceleratorTable(accel_table); } - void remove_accelerators () + void remove_accelerators() { - SetAcceleratorTable (wxAcceleratorTable ()); + SetAcceleratorTable(wxAcceleratorTable()); } - void remove_clicked (wxCommandEvent& ev) + void remove_clicked(wxCommandEvent& ev) { - if (_film_editor->content_panel()->remove_clicked (true)) { - ev.Skip (); + if (_film_editor->content_panel()->remove_clicked(true)) { + ev.Skip(); } } /** Make a new film in the given path, using template_name as a template * (or the default template if it's empty). */ - void new_film (boost::filesystem::path path, optional<string> template_name) + void new_film(boost::filesystem::path path, optional<string> template_name) { auto film = make_shared<Film>(path); film->use_template(template_name); - film->set_name (path.filename().generic_string()); - film->write_metadata (); - set_film (film); + film->set_name(path.filename().generic_string()); + film->write_metadata(); + set_film(film); } - void load_film (boost::filesystem::path file) + void load_film(boost::filesystem::path file) try { auto film = make_shared<Film>(file); - auto const notes = film->read_metadata (); + auto const notes = film->read_metadata(); film->read_ui_state(); if (film->state_version() == 4) { - error_dialog ( + error_dialog( 0, _("This film was created with an old version of DVD-o-matic and may not load correctly " "in this version. Please check the film's settings carefully.") @@ -488,53 +489,53 @@ public: } for (auto i: notes) { - error_dialog (0, std_to_wx(i)); + error_dialog(0, std_to_wx(i)); } - set_film (film); + set_film(film); JobManager::instance()->add(make_shared<CheckContentJob>(film)); } catch (FileNotFoundError& e) { auto const dir = e.file().parent_path(); if (dcp::filesystem::exists(dir / "ASSETMAP") || dcp::filesystem::exists(dir / "ASSETMAP.xml")) { - error_dialog ( + error_dialog( this, variant::wx::insert_dcpomatic(_("Could not open this folder as a %s project.")), variant::wx::insert_dcpomatic( _("It looks like you are trying to open a DCP. File -> Open is for loading %s projects, not DCPs. " "To import a DCP, create a new project with File -> New and then click the \"Add DCP...\" button.")) ); } else { - auto const p = std_to_wx(file.string ()); - error_dialog (this, wxString::Format(_("Could not open film at %s"), p.data()), std_to_wx(e.what())); + auto const p = std_to_wx(file.string()); + error_dialog(this, wxString::Format(_("Could not open film at %s"), p.data()), std_to_wx(e.what())); } } catch (std::exception& e) { - auto const p = std_to_wx (file.string()); - error_dialog (this, wxString::Format(_("Could not open film at %s"), p.data()), std_to_wx(e.what())); + auto const p = std_to_wx(file.string()); + error_dialog(this, wxString::Format(_("Could not open film at %s"), p.data()), std_to_wx(e.what())); } - void set_film (shared_ptr<Film> film) + void set_film(shared_ptr<Film> film) { _film = film; _film_viewer.set_film(_film); _film_editor->set_film(_film); - _controls->set_film (_film); + _controls->set_film(_film); _video_waveform_dialog.reset(); - set_menu_sensitivity (); + set_menu_sensitivity(); if (_film && _film->directory()) { - Config::instance()->add_to_history (_film->directory().get()); + Config::instance()->add_to_history(_film->directory().get()); } if (_film) { - _film->Change.connect (boost::bind (&DOMFrame::film_change, this, _1)); - _film->Message.connect (boost::bind(&DOMFrame::film_message, this, _1)); - _film->DirtyChange.connect (boost::bind(&DOMFrame::set_title, this)); - dcpomatic_log = _film->log (); + _film->Change.connect(boost::bind(&DOMFrame::film_change, this, _1)); + _film->Message.connect(boost::bind(&DOMFrame::film_message, this, _1)); + _film->DirtyChange.connect(boost::bind(&DOMFrame::set_title, this)); + dcpomatic_log = _film->log(); } - set_title (); + set_title(); } - shared_ptr<Film> film () const { + shared_ptr<Film> film() const { return _film; } @@ -543,7 +544,7 @@ private: void show (wxShowEvent& ev) { if (ev.IsShown() && !_first_shown_called) { - _film_editor->first_shown (); + _film_editor->first_shown(); _first_shown_called = true; #ifdef DCPOMATIC_WORKAROUND_MUTTER signal_manager->when_idle([this]() { Maximize(); }); @@ -551,19 +552,19 @@ private: } } - void film_message (string m) + void film_message(string m) { - message_dialog (this, std_to_wx(m)); + message_dialog(this, std_to_wx(m)); } - void film_change (ChangeType type) + void film_change(ChangeType type) { if (type == ChangeType::DONE) { - set_menu_sensitivity (); + set_menu_sensitivity(); } } - void file_new () + void file_new() { FilmNameLocationDialog dialog(this, _("New Film"), true); int const r = dialog.ShowModal(); @@ -587,23 +588,23 @@ private: wxString message = _("Could not create folder to store film."); message += char_to_wx(" "); if (!found_bad_chars.empty()) { - message += wxString::Format (_("Try removing the %s characters from your folder name."), std_to_wx(found_bad_chars).data()); + message += wxString::Format(_("Try removing the %s characters from your folder name."), std_to_wx(found_bad_chars).data()); } else { message += variant::wx::insert_dcpomatic(_("Please check that you do not have Windows controlled folder access enabled for %s.")); } - error_dialog (this, message, std_to_wx(e.what())); + error_dialog(this, message, std_to_wx(e.what())); #else - error_dialog (this, _("Could not create folder to store film."), std_to_wx(e.what())); + error_dialog(this, _("Could not create folder to store film."), std_to_wx(e.what())); #endif } } - void file_open () + void file_open() { wxDirDialog dialog( this, _("Select film to open"), - std_to_wx (Config::instance()->default_directory_or (wx_to_std (wxStandardPaths::Get().GetDocumentsDir())).string ()), + std_to_wx(Config::instance()->default_directory_or(wx_to_std(wxStandardPaths::Get().GetDocumentsDir())).string()), wxDEFAULT_DIALOG_STYLE | wxDD_DIR_MUST_EXIST ); @@ -611,7 +612,7 @@ private: while (true) { r = dialog.ShowModal(); if (r == wxID_OK && dialog.GetPath() == wxStandardPaths::Get().GetDocumentsDir()) { - error_dialog (this, _("You did not select a folder. Make sure that you select a folder before clicking Open.")); + error_dialog(this, _("You did not select a folder. Make sure that you select a folder before clicking Open.")); } else { break; } @@ -622,16 +623,16 @@ private: } } - void file_save () + void file_save() { try { - _film->write_metadata (); + _film->write_metadata(); } catch (exception& e) { error_dialog(this, _("Could not save project."), std_to_wx(e.what())); } } - void file_save_as_template () + void file_save_as_template() { SaveTemplateDialog dialog(this); if (dialog.ShowModal() == wxID_OK) { @@ -647,13 +648,16 @@ private: } } - void file_duplicate () + void file_duplicate() { FilmNameLocationDialog dialog(this, _("Duplicate Film"), false); if (dialog.ShowModal() == wxID_OK && dialog.check_path() && maybe_save_film<FilmChangedDuplicatingDialog>()) { auto film = make_shared<Film>(dialog.path()); - film->copy_from (_film); + wxProgressDialog progress(variant::wx::dcpomatic(), _("Duplicating film")); + film->copy_from(_film, [&progress](float value) { + progress.Update(value * 100); + }); film->set_name(dialog.path().filename().generic_string()); try { film->write_metadata(); @@ -663,26 +667,29 @@ private: } } - void file_duplicate_and_open () + void file_duplicate_and_open() { FilmNameLocationDialog dialog(this, _("Duplicate Film"), false); if (dialog.ShowModal() == wxID_OK && dialog.check_path() && maybe_save_film<FilmChangedDuplicatingDialog>()) { auto film = make_shared<Film>(dialog.path()); - film->copy_from (_film); + wxProgressDialog progress(variant::wx::dcpomatic(), _("Duplicating film")); + film->copy_from(_film, [&progress](float value) { + progress.Update(value * 100); + }); film->set_name(dialog.path().filename().generic_string()); try { - film->write_metadata (); - set_film (film); + film->write_metadata(); + set_film(film); } catch (exception& e) { error_dialog(this, _("Could not duplicate project."), std_to_wx(e.what())); } } } - void file_close () + void file_close() { - if (_film && _film->dirty ()) { + if (_film && _film->dirty()) { FilmChangedClosingDialog dialog(_film->name()); switch (dialog.run()) { case wxID_NO: @@ -690,7 +697,7 @@ private: break; case wxID_YES: /* Save and carry on to close */ - _film->write_metadata (); + _film->write_metadata(); break; case wxID_CANCEL: /* Stop */ @@ -698,25 +705,25 @@ private: } } - set_film (shared_ptr<Film>()); + set_film(shared_ptr<Film>()); } - void file_history (wxCommandEvent& event) + void file_history(wxCommandEvent& event) { - auto history = Config::instance()->history (); + auto history = Config::instance()->history(); int n = event.GetId() - ID_file_history; - if (n >= 0 && n < static_cast<int> (history.size ()) && maybe_save_then_delete_film<FilmChangedClosingDialog>()) { - load_film (history[n]); + if (n >= 0 && n < static_cast<int>(history.size()) && maybe_save_then_delete_film<FilmChangedClosingDialog>()) { + load_film(history[n]); } } - void file_exit () + void file_exit() { /* false here allows the close handler to veto the close request */ - Close (false); + Close(false); } - void edit_copy () + void edit_copy() { auto const sel = _film_editor->content_panel()->selected(); if (sel.size() == 1) { @@ -724,7 +731,7 @@ private: } } - void edit_paste () + void edit_paste() { if (!_clipboard) { return; @@ -737,19 +744,19 @@ private: for (auto i: _film_editor->content_panel()->selected()) { if (dialog.video() && i->video) { - DCPOMATIC_ASSERT (_clipboard->video); - i->video->take_settings_from (_clipboard->video); + DCPOMATIC_ASSERT(_clipboard->video); + i->video->take_settings_from(_clipboard->video); } if (dialog.audio() && i->audio) { - DCPOMATIC_ASSERT (_clipboard->audio); - i->audio->take_settings_from (_clipboard->audio); + DCPOMATIC_ASSERT(_clipboard->audio); + i->audio->take_settings_from(_clipboard->audio); } if (dialog.text()) { - auto j = i->text.begin (); - auto k = _clipboard->text.begin (); + auto j = i->text.begin(); + auto k = _clipboard->text.begin(); while (j != i->text.end() && k != _clipboard->text.end()) { - (*j)->take_settings_from (*k); + (*j)->take_settings_from(*k); ++j; ++k; } @@ -757,20 +764,20 @@ private: } } - void edit_select_all () + void edit_select_all() { _film_editor->content_panel()->select_all(); } - void edit_preferences () + void edit_preferences() { if (!_config_dialog) { - _config_dialog = create_full_config_dialog (); + _config_dialog = create_full_config_dialog(); } - _config_dialog->Show (this); + _config_dialog->Show(this); } - void tools_restore_default_preferences () + void tools_restore_default_preferences() { wxMessageDialog dialog( nullptr, @@ -780,11 +787,11 @@ private: ); if (dialog.ShowModal() == wxID_YES) { - Config::restore_defaults (); + Config::restore_defaults(); } } - void tools_export_preferences () + void tools_export_preferences() { FileDialog dialog( this, _("Specify ZIP file"), char_to_wx("ZIP files (*.zip)|*.zip"), wxFD_SAVE | wxFD_OVERWRITE_PROMPT, "Preferences", string("dcpomatic_config.zip") @@ -827,14 +834,14 @@ private: Config::instance()->load_from_zip(dialog.path(), action); } - void jobs_make_dcp () + void jobs_make_dcp() { double required; double available; if (!_film->should_be_enough_disk_space(required, available)) { auto const message = wxString::Format(_("The DCP for this film will take up about %.1f GB, and the disk that you are using only has %.1f GB available. Do you want to continue anyway?"), required, available); - if (!confirm_dialog (this, message)) { + if (!confirm_dialog(this, message)) { return; } } @@ -846,8 +853,8 @@ private: } } - if (_film->encrypted ()) { - NagDialog::maybe_nag ( + if (_film->encrypted()) { + NagDialog::maybe_nag( this, Config::NAG_ENCRYPTED_METADATA, _("You are making an encrypted DCP. It will not be possible to make KDMs for this DCP unless you have copies of " @@ -858,9 +865,9 @@ private: } /* Remove any existing DCP if the user agrees */ - auto const dcp_dir = _film->dir (_film->dcp_name(), false); + auto const dcp_dir = _film->dir(_film->dcp_name(), false); if (dcp::filesystem::exists(dcp_dir)) { - if (!confirm_dialog (this, wxString::Format (_("Do you want to overwrite the existing DCP %s?"), std_to_wx(dcp_dir.string()).data()))) { + if (!confirm_dialog(this, wxString::Format(_("Do you want to overwrite the existing DCP %s?"), std_to_wx(dcp_dir.string()).data()))) { return; } @@ -872,37 +879,37 @@ private: /* It seems to make sense to auto-save metadata here, since the make DCP may last a long time, and crashes/power failures are moderately likely. */ - _film->write_metadata (); - make_dcp (_film, TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP); + _film->write_metadata(); + make_dcp(_film, TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP); } catch (BadSettingError& e) { - error_dialog (this, wxString::Format (_("Bad setting for %s."), std_to_wx(e.setting()).data()), std_to_wx(e.what())); + error_dialog(this, wxString::Format(_("Bad setting for %s."), std_to_wx(e.setting()).data()), std_to_wx(e.what())); } catch (std::exception& e) { - error_dialog (this, wxString::Format (_("Could not make DCP.")), std_to_wx(e.what())); + error_dialog(this, wxString::Format(_("Could not make DCP.")), std_to_wx(e.what())); } } - void jobs_make_kdms () + void jobs_make_kdms() { if (!_film) { return; } _kdm_dialog.reset(this, _film); - _kdm_dialog->Show (); + _kdm_dialog->Show(); } - void jobs_make_dkdms () + void jobs_make_dkdms() { if (!_film) { return; } _dkdm_dialog.reset(this, _film); - _dkdm_dialog->Show (); + _dkdm_dialog->Show(); } /** @return false if we succeeded, true if not */ - bool send_to_other_tool (int port, function<void()> start, string message) + bool send_to_other_tool(int port, function<void()> start, string message) { /* i = 0; try to connect via socket i = 1; try again, and then try to start the tool @@ -910,30 +917,30 @@ private: */ for (int i = 0; i < 8; ++i) { try { - Socket socket (5); + Socket socket(5); socket.connect("127.0.0.1", port); - DCPOMATIC_ASSERT (_film->directory ()); - socket.write (message.length() + 1); - socket.write ((uint8_t *) message.c_str(), message.length() + 1); + DCPOMATIC_ASSERT(_film->directory()); + socket.write(message.length() + 1); + socket.write((uint8_t *) message.c_str(), message.length() + 1); /* OK\0 */ uint8_t ok[3]; - socket.read (ok, 3); + socket.read(ok, 3); return false; } catch (exception& e) { } if (i == 1) { - start (); + start(); } - dcpomatic_sleep_seconds (1); + dcpomatic_sleep_seconds(1); } return true; } - void jobs_make_dcp_batch () + void jobs_make_dcp_batch() { if (!_film) { return; @@ -946,33 +953,33 @@ private: } } - _film->write_metadata (); + _film->write_metadata(); - if (send_to_other_tool (BATCH_JOB_PORT, &start_batch_converter, _film->directory()->string())) { + if (send_to_other_tool(BATCH_JOB_PORT, &start_batch_converter, _film->directory()->string())) { #ifdef DCPOMATIC_OSX - error_dialog (this, _("Could not start the batch converter. You may need to download it from dcpomatic.com.")); + error_dialog(this, _("Could not start the batch converter. You may need to download it from dcpomatic.com.")); #else - error_dialog (this, _("Could not find batch converter.")); + error_dialog(this, _("Could not find batch converter.")); #endif } } - void jobs_open_dcp_in_player () + void jobs_open_dcp_in_player() { if (!_film) { return; } - if (send_to_other_tool (PLAYER_PLAY_PORT, &start_player, _film->dir(_film->dcp_name(false)).string())) { + if (send_to_other_tool(PLAYER_PLAY_PORT, &start_player, _film->dir(_film->dcp_name(false)).string())) { #ifdef DCPOMATIC_OSX - error_dialog (this, _("Could not start the player. You may need to download it from dcpomatic.com.")); + error_dialog(this, _("Could not start the player. You may need to download it from dcpomatic.com.")); #else - error_dialog (this, _("Could not find player.")); + error_dialog(this, _("Could not find player.")); #endif } } - void jobs_make_self_dkdm () + void jobs_make_self_dkdm() { if (!_film) { return; @@ -983,10 +990,10 @@ private: return; } - NagDialog::maybe_nag ( + NagDialog::maybe_nag( this, Config::NAG_DKDM_CONFIG, - wxString::Format ( + wxString::Format( _("You are making a DKDM which is encrypted by a private key held in" "\n\n<tt>%s</tt>\n\nIt is <span weight=\"bold\" size=\"larger\">VITALLY IMPORTANT</span> " "that you <span weight=\"bold\" size=\"larger\">BACK UP THIS FILE</span> since if it is lost " @@ -995,10 +1002,10 @@ private: ); - dcp::LocalTime from (Config::instance()->signer_chain()->leaf().not_before()); - from.add_days (1); - dcp::LocalTime to (Config::instance()->signer_chain()->leaf().not_after()); - to.add_days (-1); + dcp::LocalTime from(Config::instance()->signer_chain()->leaf().not_before()); + from.add_days(1); + dcp::LocalTime to(Config::instance()->signer_chain()->leaf().not_after()); + to.add_days(-1); auto signer = Config::instance()->signer_chain(); if (!signer->valid()) { @@ -1013,22 +1020,22 @@ private: if (dialog.internal()) { auto dkdms = Config::instance()->dkdms(); dkdms->add(make_shared<DKDM>(kdm)); - Config::instance()->changed (); + Config::instance()->changed(); } else { auto path = dialog.directory() / (_film->dcp_name(false) + "_DKDM.xml"); kdm.as_xml(path); } } catch (dcp::NotEncryptedError& e) { - error_dialog (this, _("CPL's content is not encrypted.")); + error_dialog(this, _("CPL's content is not encrypted.")); } catch (exception& e) { error_dialog(this, std_to_wx(e.what())); } catch (...) { - error_dialog (this, _("An unknown exception occurred.")); + error_dialog(this, _("An unknown exception occurred.")); } } - void jobs_export_video_file () + void jobs_export_video_file() { ExportVideoFileDialog dialog(this, _film->isdcf_name(true)); if (dialog.ShowModal() != wxID_OK) { @@ -1047,15 +1054,15 @@ private: } auto job = make_shared<TranscodeJob>(_film, TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP); - job->set_encoder ( + job->set_encoder( make_shared<FFmpegFilmEncoder>( _film, job, dialog.path(), dialog.format(), dialog.mixdown_to_stereo(), dialog.split_reels(), dialog.split_streams(), dialog.x264_crf()) ); - JobManager::instance()->add (job); + JobManager::instance()->add(job); } - void jobs_export_subtitles () + void jobs_export_subtitles() { ExportSubtitlesDialog dialog(this, _film->reels().size(), _film->interop()); if (dialog.ShowModal() != wxID_OK) { @@ -1077,40 +1084,40 @@ private: } - void jobs_send_dcp_to_tms () + void jobs_send_dcp_to_tms() { - _film->send_dcp_to_tms (); + _film->send_dcp_to_tms(); } - void jobs_show_dcp () + void jobs_show_dcp() { - DCPOMATIC_ASSERT (_film->directory ()); + DCPOMATIC_ASSERT(_film->directory()); if (show_in_file_manager(_film->directory().get(), _film->dir(_film->dcp_name(false)))) { - error_dialog (this, _("Could not show DCP.")); + error_dialog(this, _("Could not show DCP.")); } } - void view_closed_captions () + void view_closed_captions() { - _film_viewer.show_closed_captions (); + _film_viewer.show_closed_captions(); } - void view_video_waveform () + void view_video_waveform() { if (!_video_waveform_dialog) { _video_waveform_dialog.reset(this, _film, _film_viewer); } - _video_waveform_dialog->Show (); + _video_waveform_dialog->Show(); } - void tools_system_information () + void tools_system_information() { if (!_system_information_dialog) { - _system_information_dialog = new SystemInformationDialog (this, _film_viewer); + _system_information_dialog = new SystemInformationDialog(this, _film_viewer); } - _system_information_dialog->Show (); + _system_information_dialog->Show(); } void tools_version_file() @@ -1124,40 +1131,40 @@ private: _dcp_referencing_dialog->Show(); } - void tools_hints () + void tools_hints() { if (!_hints_dialog) { - _hints_dialog = new HintsDialog (this, _film, true); + _hints_dialog = new HintsDialog(this, _film, true); } - _hints_dialog->Show (); + _hints_dialog->Show(); } - void tools_encoding_servers () + void tools_encoding_servers() { if (!_servers_list_dialog) { - _servers_list_dialog = new ServersListDialog (this); + _servers_list_dialog = new ServersListDialog(this); } - _servers_list_dialog->Show (); + _servers_list_dialog->Show(); } - void tools_manage_templates () + void tools_manage_templates() { if (!_templates_dialog) { _templates_dialog.reset(this); } - _templates_dialog->Show (); + _templates_dialog->Show(); } - void tools_check_for_updates () + void tools_check_for_updates() { _update_news_requested = true; UpdateChecker::instance()->run(); } - void help_about () + void help_about() { AboutDialog dialog(this); dialog.ShowModal(); @@ -1168,7 +1175,7 @@ private: wxLaunchDefaultBrowser(std_to_wx("https://dcpomatic.com/manual")); } - void help_report_a_problem () + void help_report_a_problem() { ReportProblemDialog dialog(this, _film); if (dialog.ShowModal() == wxID_OK) { @@ -1176,9 +1183,9 @@ private: } } - bool should_close () + bool should_close() { - if (!JobManager::instance()->work_to_do ()) { + if (!JobManager::instance()->work_to_do()) { return true; } @@ -1192,14 +1199,14 @@ private: return dialog.ShowModal() == wxID_YES; } - void close (wxCloseEvent& ev) + void close(wxCloseEvent& ev) { - if (!should_close ()) { - ev.Veto (); + if (!should_close()) { + ev.Veto(); return; } - if (_film && _film->dirty ()) { + if (_film && _film->dirty()) { FilmChangedClosingDialog dialog(_film->name()); switch (dialog.run()) { case wxID_NO: @@ -1207,11 +1214,11 @@ private: break; case wxID_YES: /* Save and carry on to close */ - _film->write_metadata (); + _film->write_metadata(); break; case wxID_CANCEL: /* Veto the event and stop */ - ev.Veto (); + ev.Veto(); return; } } @@ -1220,15 +1227,15 @@ private: cause the File menu to be altered, which itself will be deleted around now (without, as far as I can see, any way for us to find out). */ - _config_changed_connection.disconnect (); + _config_changed_connection.disconnect(); /* Also stop hearing about analytics-related stuff */ - _analytics_message_connection.disconnect (); + _analytics_message_connection.disconnect(); FontConfig::drop(); - ev.Skip (); - JobManager::drop (); + ev.Skip(); + JobManager::drop(); } void active_jobs_changed() @@ -1240,16 +1247,16 @@ private: signal_manager->when_idle(boost::bind(&DOMFrame::set_menu_sensitivity, this)); } - void set_menu_sensitivity () + void set_menu_sensitivity() { - auto jobs = JobManager::instance()->get (); + auto jobs = JobManager::instance()->get(); auto const dcp_creation = std::any_of( jobs.begin(), jobs.end(), [](shared_ptr<const Job> job) { return dynamic_pointer_cast<const DCPTranscodeJob>(job) && !job->finished(); }); - bool const have_cpl = _film && !_film->cpls().empty (); + bool const have_cpl = _film && !_film->cpls().empty(); bool const have_single_selected_content = _film_editor->content_panel()->selected().size() == 1; bool const have_selected_content = !_film_editor->content_panel()->selected().empty(); bool const have_selected_video_content = !_film_editor->content_panel()->selected_video().empty(); @@ -1301,7 +1308,7 @@ private: enabled = false; } - j.first->Enable (enabled); + j.first->Enable(enabled); } } @@ -1309,7 +1316,7 @@ private: * should continue, false to abort it. */ template <class T> - bool maybe_save_film () + bool maybe_save_film() { if (!_film) { return true; @@ -1338,131 +1345,131 @@ private: } template <class T> - bool maybe_save_then_delete_film () + bool maybe_save_then_delete_film() { - bool const r = maybe_save_film<T> (); + bool const r = maybe_save_film<T>(); if (r) { - _film.reset (); + _film.reset(); } return r; } - void add_item (wxMenu* menu, wxString text, int id, int sens) + void add_item(wxMenu* menu, wxString text, int id, int sens) { - auto item = menu->Append (id, text); - menu_items.insert (make_pair (item, sens)); + auto item = menu->Append(id, text); + menu_items.insert(make_pair(item, sens)); } - void setup_menu (wxMenuBar* m) + void setup_menu(wxMenuBar* m) { _file_menu = new wxMenu; /* [Shortcut] Ctrl+N:New film */ - add_item (_file_menu, _("New...\tCtrl-N"), ID_file_new, ALWAYS); + add_item(_file_menu, _("New...\tCtrl-N"), ID_file_new, ALWAYS); /* [Shortcut] Ctrl+O:Open existing film */ - add_item (_file_menu, _("&Open...\tCtrl-O"), ID_file_open, ALWAYS); - _file_menu->AppendSeparator (); + add_item(_file_menu, _("&Open...\tCtrl-O"), ID_file_open, ALWAYS); + _file_menu->AppendSeparator(); /* [Shortcut] Ctrl+S:Save current film */ - add_item (_file_menu, _("&Save\tCtrl-S"), ID_file_save, NEEDS_FILM); - _file_menu->AppendSeparator (); - add_item (_file_menu, _("Save as &template..."), ID_file_save_as_template, NEEDS_FILM); - add_item (_file_menu, _("Duplicate..."), ID_file_duplicate, NEEDS_FILM); - add_item (_file_menu, _("Duplicate and open..."), ID_file_duplicate_and_open, NEEDS_FILM); + add_item(_file_menu, _("&Save\tCtrl-S"), ID_file_save, NEEDS_FILM); + _file_menu->AppendSeparator(); + add_item(_file_menu, _("Save as &template..."), ID_file_save_as_template, NEEDS_FILM); + add_item(_file_menu, _("Duplicate..."), ID_file_duplicate, NEEDS_FILM); + add_item(_file_menu, _("Duplicate and open..."), ID_file_duplicate_and_open, NEEDS_FILM); _history_position = _file_menu->GetMenuItems().GetCount(); - _file_menu->AppendSeparator (); + _file_menu->AppendSeparator(); /* [Shortcut] Ctrl+W:Close current film */ - add_item (_file_menu, _("&Close\tCtrl-W"), ID_file_close, NEEDS_FILM); + add_item(_file_menu, _("&Close\tCtrl-W"), ID_file_close, NEEDS_FILM); #ifndef __WXOSX__ - _file_menu->AppendSeparator (); + _file_menu->AppendSeparator(); #endif #ifdef __WXOSX__ - add_item (_file_menu, _("&Exit"), wxID_EXIT, ALWAYS); + add_item(_file_menu, _("&Exit"), wxID_EXIT, ALWAYS); #else - add_item (_file_menu, _("&Quit"), wxID_EXIT, ALWAYS); + add_item(_file_menu, _("&Quit"), wxID_EXIT, ALWAYS); #endif auto edit = new wxMenu; /* [Shortcut] Ctrl+C:Copy settings from currently selected content */ - add_item (edit, _("Copy settings\tCtrl-C"), ID_edit_copy, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_SINGLE_SELECTED_CONTENT); + add_item(edit, _("Copy settings\tCtrl-C"), ID_edit_copy, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_SINGLE_SELECTED_CONTENT); /* [Shortcut] Ctrl+V:Paste settings into currently selected content */ - add_item (edit, _("Paste settings...\tCtrl-V"), ID_edit_paste, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_SELECTED_CONTENT | NEEDS_CLIPBOARD); - edit->AppendSeparator (); + add_item(edit, _("Paste settings...\tCtrl-V"), ID_edit_paste, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_SELECTED_CONTENT | NEEDS_CLIPBOARD); + edit->AppendSeparator(); /* [Shortcut] Shift+Ctrl+A:Select all content */ - add_item (edit, _("Select all\tShift-Ctrl-A"), ID_edit_select_all, NEEDS_FILM); + add_item(edit, _("Select all\tShift-Ctrl-A"), ID_edit_select_all, NEEDS_FILM); #ifdef __WXOSX__ add_item(_file_menu, _("&Preferences...\tCtrl-,"), wxID_PREFERENCES, ALWAYS); #else - edit->AppendSeparator (); + edit->AppendSeparator(); /* [Shortcut] Ctrl+P:Open preferences window */ - add_item (edit, _("&Preferences...\tCtrl-P"), wxID_PREFERENCES, ALWAYS); + add_item(edit, _("&Preferences...\tCtrl-P"), wxID_PREFERENCES, ALWAYS); #endif auto jobs_menu = new wxMenu; /* [Shortcut] Ctrl+M:Make DCP */ - add_item (jobs_menu, _("&Make DCP\tCtrl-M"), ID_jobs_make_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION); + add_item(jobs_menu, _("&Make DCP\tCtrl-M"), ID_jobs_make_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION); /* [Shortcut] Ctrl+B:Make DCP in the batch converter*/ - add_item (jobs_menu, _("Make DCP in &batch converter\tCtrl-B"), ID_jobs_make_dcp_batch, NEEDS_FILM | NOT_DURING_DCP_CREATION); - jobs_menu->AppendSeparator (); + add_item(jobs_menu, _("Make DCP in &batch converter\tCtrl-B"), ID_jobs_make_dcp_batch, NEEDS_FILM | NOT_DURING_DCP_CREATION); + jobs_menu->AppendSeparator(); /* [Shortcut] Ctrl+K:Make KDMs */ - add_item (jobs_menu, _("Make &KDMs...\tCtrl-K"), ID_jobs_make_kdms, NEEDS_FILM); + add_item(jobs_menu, _("Make &KDMs...\tCtrl-K"), ID_jobs_make_kdms, NEEDS_FILM); /* [Shortcut] Ctrl+D:Make DKDMs */ - add_item (jobs_menu, _("Make &DKDMs...\tCtrl-D"), ID_jobs_make_dkdms, NEEDS_FILM); + add_item(jobs_menu, _("Make &DKDMs...\tCtrl-D"), ID_jobs_make_dkdms, NEEDS_FILM); add_item(jobs_menu, variant::wx::insert_dcpomatic(_("Make DKDM for %s...")), ID_jobs_make_self_dkdm, NEEDS_FILM | NEEDS_ENCRYPTION); - jobs_menu->AppendSeparator (); + jobs_menu->AppendSeparator(); /* [Shortcut] Ctrl+E:Export video file */ - add_item (jobs_menu, _("Export video file...\tCtrl-E"), ID_jobs_export_video_file, NEEDS_FILM); - add_item (jobs_menu, _("Export subtitles...\tShift-Ctrl-E"), ID_jobs_export_subtitles, NEEDS_FILM); - jobs_menu->AppendSeparator (); - add_item (jobs_menu, _("&Send DCP to TMS"), ID_jobs_send_dcp_to_tms, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL); + add_item(jobs_menu, _("Export video file...\tCtrl-E"), ID_jobs_export_video_file, NEEDS_FILM); + add_item(jobs_menu, _("Export subtitles...\tShift-Ctrl-E"), ID_jobs_export_subtitles, NEEDS_FILM); + jobs_menu->AppendSeparator(); + add_item(jobs_menu, _("&Send DCP to TMS"), ID_jobs_send_dcp_to_tms, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL); #if defined(DCPOMATIC_OSX) - add_item (jobs_menu, _("S&how DCP in Finder"), ID_jobs_show_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL); + add_item(jobs_menu, _("S&how DCP in Finder"), ID_jobs_show_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL); #elif defined(DCPOMATIC_WINDOWS) - add_item (jobs_menu, _("S&how DCP in Explorer"), ID_jobs_show_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL); + add_item(jobs_menu, _("S&how DCP in Explorer"), ID_jobs_show_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL); #else - add_item (jobs_menu, _("S&how DCP in Files"), ID_jobs_show_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL); + add_item(jobs_menu, _("S&how DCP in Files"), ID_jobs_show_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL); #endif - add_item (jobs_menu, _("Open DCP in &player"), ID_jobs_open_dcp_in_player, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL); + add_item(jobs_menu, _("Open DCP in &player"), ID_jobs_open_dcp_in_player, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL); auto view = new wxMenu; - add_item (view, _("Closed captions..."), ID_view_closed_captions, NEEDS_FILM); - add_item (view, _("Video waveform..."), ID_view_video_waveform, NEEDS_FILM); + add_item(view, _("Closed captions..."), ID_view_closed_captions, NEEDS_FILM); + add_item(view, _("Video waveform..."), ID_view_video_waveform, NEEDS_FILM); auto tools = new wxMenu; - add_item (tools, _("Version File (VF)..."), ID_tools_version_file, NEEDS_FILM | NEEDS_DCP_CONTENT); - add_item (tools, _("Hints..."), ID_tools_hints, NEEDS_FILM); - add_item (tools, _("Encoding servers..."), ID_tools_encoding_servers, 0); - add_item (tools, _("Manage templates..."), ID_tools_manage_templates, 0); - add_item (tools, _("Check for updates"), ID_tools_check_for_updates, 0); - add_item (tools, _("System information..."), ID_tools_system_information, 0); - tools->AppendSeparator (); - add_item (tools, _("Restore default preferences"), ID_tools_restore_default_preferences, ALWAYS); - tools->AppendSeparator (); - add_item (tools, _("Export preferences..."), ID_tools_export_preferences, ALWAYS); - add_item (tools, _("Import preferences..."), ID_tools_import_preferences, ALWAYS); + add_item(tools, _("Version File (VF)..."), ID_tools_version_file, NEEDS_FILM | NEEDS_DCP_CONTENT); + add_item(tools, _("Hints..."), ID_tools_hints, NEEDS_FILM); + add_item(tools, _("Encoding servers..."), ID_tools_encoding_servers, 0); + add_item(tools, _("Manage templates..."), ID_tools_manage_templates, 0); + add_item(tools, _("Check for updates"), ID_tools_check_for_updates, 0); + add_item(tools, _("System information..."), ID_tools_system_information, 0); + tools->AppendSeparator(); + add_item(tools, _("Restore default preferences"), ID_tools_restore_default_preferences, ALWAYS); + tools->AppendSeparator(); + add_item(tools, _("Export preferences..."), ID_tools_export_preferences, ALWAYS); + add_item(tools, _("Import preferences..."), ID_tools_import_preferences, ALWAYS); wxMenu* help = new wxMenu; #ifdef __WXOSX__ add_item(help, variant::wx::insert_dcpomatic(_("About %s")), wxID_ABOUT, ALWAYS); #else - add_item (help, _("About"), wxID_ABOUT, ALWAYS); + add_item(help, _("About"), wxID_ABOUT, ALWAYS); #endif add_item(help, _("User manual..."), ID_help_user_manual, ALWAYS); if (variant::show_report_a_problem()) { add_item(help, _("Report a problem..."), ID_help_report_a_problem, ALWAYS); } - m->Append (_file_menu, _("&File")); - m->Append (edit, _("&Edit")); - m->Append (jobs_menu, _("&Jobs")); - m->Append (view, _("&View")); - m->Append (tools, _("&Tools")); - m->Append (help, _("&Help")); + m->Append(_file_menu, _("&File")); + m->Append(edit, _("&Edit")); + m->Append(jobs_menu, _("&Jobs")); + m->Append(view, _("&View")); + m->Append(tools, _("&Tools")); + m->Append(help, _("&Help")); } void config_changed(Config::Property what) @@ -1471,21 +1478,21 @@ private: try { Config::instance()->write_config(); } catch (exception& e) { - error_dialog ( + error_dialog( this, - wxString::Format ( + wxString::Format( _("Could not write to config file at %s. Your changes have not been saved."), - std_to_wx (Config::instance()->cinemas_file().string()).data() + std_to_wx(Config::instance()->cinemas_file().string()).data() ) ); } for (int i = 0; i < _history_items; ++i) { - delete _file_menu->Remove (ID_file_history + i); + delete _file_menu->Remove(ID_file_history + i); } if (_history_separator) { - _file_menu->Remove (_history_separator); + _file_menu->Remove(_history_separator); } delete _history_separator; _history_separator = 0; @@ -1493,11 +1500,11 @@ private: int pos = _history_position; /* Clear out non-existent history items before we re-build the menu */ - Config::instance()->clean_history (); + Config::instance()->clean_history(); auto history = Config::instance()->history(); - if (!history.empty ()) { - _history_separator = _file_menu->InsertSeparator (pos++); + if (!history.empty()) { + _history_separator = _file_menu->InsertSeparator(pos++); } for (size_t i = 0; i < history.size(); ++i) { @@ -1507,12 +1514,12 @@ private: } else { s = history[i].string(); } - _file_menu->Insert (pos++, ID_file_history + i, std_to_wx (s)); + _file_menu->Insert(pos++, ID_file_history + i, std_to_wx(s)); } - _history_items = history.size (); + _history_items = history.size(); - dcpomatic_log->set_types (Config::instance()->log_types()); + dcpomatic_log->set_types(Config::instance()->log_types()); #ifdef DCPOMATIC_GROK if (what == Config::GROK) { @@ -1523,9 +1530,9 @@ private: #endif } - void update_checker_state_changed () + void update_checker_state_changed() { - auto uc = UpdateChecker::instance (); + auto uc = UpdateChecker::instance(); bool const announce = _update_news_requested || @@ -1550,7 +1557,7 @@ private: _update_news_requested = false; } - void start_stop_pressed () + void start_stop_pressed() { if (_film_viewer.playing()) { _film_viewer.stop(); @@ -1559,28 +1566,28 @@ private: } } - void timeline_pressed () + void timeline_pressed() { - _film_editor->content_panel()->timeline_clicked (); + _film_editor->content_panel()->timeline_clicked(); } - void back_frame () + void back_frame() { _film_viewer.seek_by(-_film_viewer.one_video_frame(), true); } - void forward_frame () + void forward_frame() { _film_viewer.seek_by(_film_viewer.one_video_frame(), true); } - void analytics_message (string title, string html) + void analytics_message(string title, string html) { HTMLDialog dialog(this, std_to_wx(title), std_to_wx(html)); dialog.ShowModal(); } - void set_title () + void set_title() { auto s = variant::dcpomatic(); if (_film) { @@ -1592,7 +1599,7 @@ private: } } - SetTitle (std_to_wx(s)); + SetTitle(std_to_wx(s)); } FilmEditor* _film_editor; @@ -1629,7 +1636,7 @@ static const wxCmdLineEntryDesc command_line_description[] = { { wxCMD_LINE_SWITCH, "v", "version", "show version", wxCMD_LINE_VAL_NONE, wxCMD_LINE_PARAM_OPTIONAL }, { wxCMD_LINE_OPTION, "", "config", "directory containing config.xml and cinemas.xml", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL }, { wxCMD_LINE_PARAM, 0, 0, "film to load or create", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL }, - { wxCMD_LINE_NONE, "", "", "", wxCmdLineParamType (0), 0 } + { wxCMD_LINE_NONE, "", "", "", wxCmdLineParamType(0), 0 } }; @@ -1639,18 +1646,18 @@ static const wxCmdLineEntryDesc command_line_description[] = { class App : public wxApp { public: - App () - : wxApp () + App() + : wxApp() { - dcpomatic_setup_path_encoding (); + dcpomatic_setup_path_encoding(); #ifdef DCPOMATIC_LINUX - XInitThreads (); + XInitThreads(); #endif } private: - bool OnInit () override + bool OnInit() override { try { @@ -1673,12 +1680,12 @@ private: cout << variant::insert_dcpomatic("{} is starting.") << "\n"; } #endif - wxInitAllImageHandlers (); + wxInitAllImageHandlers(); Config::FailedToLoad.connect(boost::bind(&App::config_failed_to_load, this, _1)); - Config::Warning.connect (boost::bind (&App::config_warning, this, _1)); + Config::Warning.connect(boost::bind(&App::config_warning, this, _1)); - _splash = maybe_show_splash (); + _splash = maybe_show_splash(); SetAppName(variant::wx::dcpomatic()); @@ -1687,12 +1694,12 @@ private: } #ifdef DCPOMATIC_LINUX - unsetenv ("UBUNTU_MENUPROXY"); + unsetenv("UBUNTU_MENUPROXY"); #endif #ifdef DCPOMATIC_OSX - dcpomatic_sleep_seconds (1); - make_foreground_application (); + dcpomatic_sleep_seconds(1); + make_foreground_application(); #endif /* Enable i18n; this will create a Config object @@ -1706,28 +1713,28 @@ private: /* Set things up, including filters etc. which will now be internationalised correctly. */ - dcpomatic_setup (); + dcpomatic_setup(); /* Force the configuration to be re-loaded correctly next time it is needed. */ - Config::drop (); + Config::drop(); /* We only look out for bad configuration from here on, as before dcpomatic_setup() we haven't got OpenSSL ready so there will be incorrect certificate chain validity errors. */ - Config::Bad.connect (boost::bind(&App::config_bad, this, _1)); + Config::Bad.connect(boost::bind(&App::config_bad, this, _1)); - signal_manager = new wxSignalManager (this); + signal_manager = new wxSignalManager(this); _frame = new DOMFrame(variant::wx::dcpomatic()); - SetTopWindow (_frame); - _frame->Maximize (); - close_splash (); + SetTopWindow(_frame); + _frame->Maximize(); + close_splash(); - if (running_32_on_64 ()) { - NagDialog::maybe_nag ( + if (running_32_on_64()) { + NagDialog::maybe_nag( _frame, Config::NAG_32_ON_64, wxString::Format( _("You are running the 32-bit version of %s on a 64-bit version of Windows. " @@ -1740,34 +1747,34 @@ private: false); } - _frame->Show (); + _frame->Show(); - Bind (wxEVT_IDLE, boost::bind (&App::idle, this, _1)); + Bind(wxEVT_IDLE, boost::bind(&App::idle, this, _1)); if (!_film_to_load.empty() && dcp::filesystem::is_directory(_film_to_load)) { try { - _frame->load_film (_film_to_load); + _frame->load_film(_film_to_load); } catch (exception& e) { - error_dialog (nullptr, std_to_wx(fmt::format(wx_to_std(_("Could not load film {} ({})")), _film_to_load)), std_to_wx(e.what())); + error_dialog(nullptr, std_to_wx(fmt::format(wx_to_std(_("Could not load film {} ({})")), _film_to_load)), std_to_wx(e.what())); } } - if (!_film_to_create.empty ()) { - _frame->new_film (_film_to_create, optional<string>()); + if (!_film_to_create.empty()) { + _frame->new_film(_film_to_create, optional<string>()); if (!_content_to_add.empty()) { _frame->film()->examine_and_add_content(content_factory(_content_to_add)); } - if (!_dcp_to_add.empty ()) { + if (!_dcp_to_add.empty()) { _frame->film()->examine_and_add_content({make_shared<DCPContent>(_dcp_to_add)}); } } - Bind (wxEVT_TIMER, boost::bind (&App::check, this)); - _timer.reset (new wxTimer (this)); - _timer->Start (1000); + Bind(wxEVT_TIMER, boost::bind(&App::check, this)); + _timer.reset(new wxTimer(this)); + _timer->Start(1000); - if (Config::instance()->check_for_updates ()) { - UpdateChecker::instance()->run (); + if (Config::instance()->check_for_updates()) { + UpdateChecker::instance()->run(); } if (auto release_notes = find_release_notes(gui_is_dark())) { @@ -1790,51 +1797,51 @@ private: return true; } - void OnInitCmdLine (wxCmdLineParser& parser) override + void OnInitCmdLine(wxCmdLineParser& parser) override { - parser.SetDesc (command_line_description); + parser.SetDesc(command_line_description); parser.SetSwitchChars(char_to_wx("-")); } - bool OnCmdLineParsed (wxCmdLineParser& parser) override + bool OnCmdLineParsed(wxCmdLineParser& parser) override { if (parser.Found(char_to_wx("version"))) { cout << "dcpomatic version " << dcpomatic_version << " " << dcpomatic_git_commit << "\n"; - exit (EXIT_SUCCESS); + exit(EXIT_SUCCESS); } if (parser.GetParamCount() > 0) { if (parser.Found(char_to_wx("new"))) { - _film_to_create = wx_to_std (parser.GetParam (0)); + _film_to_create = wx_to_std(parser.GetParam(0)); } else { - _film_to_load = wx_to_std (parser.GetParam (0)); + _film_to_load = wx_to_std(parser.GetParam(0)); } } wxString content; if (parser.Found(char_to_wx("content"), &content)) { - _content_to_add = wx_to_std (content); + _content_to_add = wx_to_std(content); } wxString dcp; if (parser.Found(char_to_wx("dcp"), &dcp)) { - _dcp_to_add = wx_to_std (dcp); + _dcp_to_add = wx_to_std(dcp); } wxString config; if (parser.Found(char_to_wx("config"), &config)) { - State::override_path = wx_to_std (config); + State::override_path = wx_to_std(config); } return true; } - void report_exception () + void report_exception() { try { throw; } catch (FileError& e) { - error_dialog ( + error_dialog( nullptr, wxString::Format( _("An exception occurred: %s (%s)\n\n%s"), @@ -1844,7 +1851,7 @@ private: ) ); } catch (boost::filesystem::filesystem_error& e) { - error_dialog ( + error_dialog( nullptr, wxString::Format( _("An exception occurred: %s (%s) (%s)\n\n%s"), @@ -1855,7 +1862,7 @@ private: ) ); } catch (exception& e) { - error_dialog ( + error_dialog( nullptr, wxString::Format( _("An exception occurred: %s.\n\n%s"), @@ -1869,34 +1876,34 @@ private: } /* An unhandled exception has occurred inside the main event loop */ - bool OnExceptionInMainLoop () override + bool OnExceptionInMainLoop() override { - report_exception (); + report_exception(); /* This will terminate the program */ return false; } - void OnUnhandledException () override + void OnUnhandledException() override { - report_exception (); + report_exception(); } - void idle (wxIdleEvent& ev) + void idle(wxIdleEvent& ev) { - signal_manager->ui_idle (); - ev.Skip (); + signal_manager->ui_idle(); + ev.Skip(); } - void check () + void check() { try { - EncodeServerFinder::instance()->rethrow (); + EncodeServerFinder::instance()->rethrow(); } catch (exception& e) { - error_dialog (0, std_to_wx (e.what ())); + error_dialog(0, std_to_wx(e.what())); } } - void close_splash () + void close_splash() { if (_splash) { _splash->Destroy(); @@ -1904,17 +1911,17 @@ private: } } - void config_failed_to_load (Config::LoadFailure what) + void config_failed_to_load(Config::LoadFailure what) { report_config_load_failure(_frame, what); } - void config_warning (string m) + void config_warning(string m) { - message_dialog (_frame, std_to_wx(m)); + message_dialog(_frame, std_to_wx(m)); } - bool config_bad (Config::BadReason reason) + bool config_bad(Config::BadReason reason) { /* Destroy the splash screen here, as otherwise bad things seem to happen (for reasons unknown) when we open our recreate dialog, close it, *then* try to Destroy the splash (the Destroy fails). @@ -1971,7 +1978,7 @@ private: variant::wx::insert_dcpomatic(_("Close %s")) ); if (dialog.ShowModal() != wxID_OK) { - exit (EXIT_FAILURE); + exit(EXIT_FAILURE); } return true; } @@ -1990,7 +1997,7 @@ private: variant::wx::insert_dcpomatic(_("Close %s")) ); if (dialog.ShowModal() != wxID_OK) { - exit (EXIT_FAILURE); + exit(EXIT_FAILURE); } return true; } @@ -2012,7 +2019,7 @@ private: return dialog.ShowModal() == wxID_OK; } default: - DCPOMATIC_ASSERT (false); + DCPOMATIC_ASSERT(false); } } @@ -2026,4 +2033,4 @@ private: }; -IMPLEMENT_APP (App) +IMPLEMENT_APP(App) diff --git a/src/tools/po/ja_JP.po b/src/tools/po/ja_JP.po index 5b8ef0f13..9c4266825 100644 --- a/src/tools/po/ja_JP.po +++ b/src/tools/po/ja_JP.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-12 11:50+0200\n" -"PO-Revision-Date: 2026-04-07 19:25+0900\n" +"POT-Creation-Date: 2026-02-15 21:03+0100\n" +"PO-Revision-Date: 2026-04-25 20:27+0900\n" "Last-Translator: \n" "Language-Team: \n" "Language: ja_JP\n" @@ -79,21 +79,21 @@ msgstr "&編集" #: src/tools/dcpomatic_batch.cc:90 src/tools/dcpomatic.cc:1382 #: src/tools/dcpomatic_editor.cc:433 src/tools/dcpomatic_player.cc:672 -#: src/tools/dcpomatic_playlist.cc:609 src/tools/dcpomatic_verifier.cc:260 +#: src/tools/dcpomatic_playlist.cc:609 src/tools/dcpomatic_verifier.cc:247 msgid "&Exit" msgstr "&終了" #: src/tools/dcpomatic_batch.cc:108 src/tools/dcpomatic.cc:1460 #: src/tools/dcpomatic_editor.cc:445 src/tools/dcpomatic_kdm.cc:346 #: src/tools/dcpomatic_player.cc:725 src/tools/dcpomatic_playlist.cc:623 -#: src/tools/dcpomatic_verifier.cc:265 +#: src/tools/dcpomatic_verifier.cc:252 msgid "&File" msgstr "&ファイル" #: src/tools/dcpomatic_batch.cc:113 src/tools/dcpomatic.cc:1465 #: src/tools/dcpomatic_editor.cc:446 src/tools/dcpomatic_kdm.cc:349 #: src/tools/dcpomatic_player.cc:732 src/tools/dcpomatic_playlist.cc:612 -#: src/tools/dcpomatic_playlist.cc:626 src/tools/dcpomatic_verifier.cc:269 +#: src/tools/dcpomatic_playlist.cc:626 src/tools/dcpomatic_verifier.cc:256 msgid "&Help" msgstr "&ヘルプ" @@ -125,7 +125,7 @@ msgstr "&環境設定\tCtrl-P" #: src/tools/dcpomatic_batch.cc:92 src/tools/dcpomatic.cc:1384 #: src/tools/dcpomatic_editor.cc:435 src/tools/dcpomatic_kdm.cc:326 #: src/tools/dcpomatic_player.cc:674 src/tools/dcpomatic_playlist.cc:615 -#: src/tools/dcpomatic_verifier.cc:264 +#: src/tools/dcpomatic_verifier.cc:251 msgid "&Quit" msgstr "&終了" @@ -150,11 +150,11 @@ msgstr "&ツール" msgid "&View" msgstr "&表示" -#: src/tools/dcpomatic_verifier.cc:107 +#: src/tools/dcpomatic_verifier.cc:104 msgid "(encrypted, have KDM)" msgstr "(暗号化、KDM あり)" -#: src/tools/dcpomatic_verifier.cc:109 +#: src/tools/dcpomatic_verifier.cc:106 msgid "(encrypted, no KDM)" msgstr "(暗号化、KDM なし)" @@ -169,13 +169,13 @@ msgstr "<b>プレイリスト</b>" #: src/tools/dcpomatic_batch.cc:106 src/tools/dcpomatic.cc:1453 #: src/tools/dcpomatic_editor.cc:442 src/tools/dcpomatic_kdm.cc:339 #: src/tools/dcpomatic_player.cc:719 src/tools/dcpomatic_playlist.cc:621 -#: src/tools/dcpomatic_verifier.cc:267 +#: src/tools/dcpomatic_verifier.cc:254 msgid "About" msgstr "このソフトウェアについて" #: src/tools/dcpomatic.cc:1451 src/tools/dcpomatic_editor.cc:440 #: src/tools/dcpomatic_kdm.cc:337 src/tools/dcpomatic_player.cc:717 -#: src/tools/dcpomatic_playlist.cc:610 src/tools/dcpomatic_verifier.cc:261 +#: src/tools/dcpomatic_playlist.cc:610 src/tools/dcpomatic_verifier.cc:248 #, c-format msgid "About %s" msgstr "%s について" @@ -188,7 +188,7 @@ msgstr "追加" msgid "Add &KDM..." msgstr "KDMを追加" -#: src/tools/dcpomatic_verifier.cc:187 +#: src/tools/dcpomatic_verifier.cc:180 msgid "Add KDM..." msgstr "KDMを追加" @@ -228,7 +228,7 @@ msgstr "" #: src/tools/dcpomatic.cc:1840 src/tools/dcpomatic_combiner.cc:303 #: src/tools/dcpomatic_disk.cc:565 src/tools/dcpomatic_editor.cc:602 #: src/tools/dcpomatic_kdm.cc:959 src/tools/dcpomatic_player.cc:1474 -#: src/tools/dcpomatic_playlist.cc:730 src/tools/dcpomatic_verifier.cc:481 +#: src/tools/dcpomatic_playlist.cc:730 src/tools/dcpomatic_verifier.cc:457 #, c-format msgid "" "An exception occurred: %s (%s)\n" @@ -239,7 +239,7 @@ msgstr "" "\n" "%s" -#: src/tools/dcpomatic.cc:1850 src/tools/dcpomatic_verifier.cc:491 +#: src/tools/dcpomatic.cc:1850 src/tools/dcpomatic_verifier.cc:467 #, c-format msgid "" "An exception occurred: %s (%s) (%s)\n" @@ -251,7 +251,7 @@ msgstr "" "%s" #: src/tools/dcpomatic.cc:1861 src/tools/dcpomatic_disk.cc:575 -#: src/tools/dcpomatic_kdm.cc:969 src/tools/dcpomatic_verifier.cc:502 +#: src/tools/dcpomatic_kdm.cc:969 src/tools/dcpomatic_verifier.cc:478 #, c-format msgid "" "An exception occurred: %s.\n" @@ -275,7 +275,7 @@ msgstr "不明な例外が発生しました。" #: src/tools/dcpomatic_disk.cc:581 src/tools/dcpomatic_editor.cc:618 #: src/tools/dcpomatic_kdm.cc:975 src/tools/dcpomatic_kdm.cc:984 #: src/tools/dcpomatic_player.cc:1490 src/tools/dcpomatic_playlist.cc:746 -#: src/tools/dcpomatic_playlist.cc:755 src/tools/dcpomatic_verifier.cc:508 +#: src/tools/dcpomatic_playlist.cc:755 src/tools/dcpomatic_verifier.cc:484 #, c-format msgid "An unknown exception occurred. %s" msgstr "不明な例外が発生しました。%s" @@ -315,7 +315,7 @@ msgstr "CPL のコンテンツは暗号化されていません。" msgid "CPL: %s" msgstr "CPL: %s" -#: src/tools/dcpomatic_verifier.cc:206 +#: src/tools/dcpomatic_verifier.cc:199 msgid "Cancel" msgstr "キャンセル" @@ -323,7 +323,7 @@ msgstr "キャンセル" msgid "Check for updates" msgstr "アップデートを確認する" -#: src/tools/dcpomatic_verifier.cc:375 +#: src/tools/dcpomatic_verifier.cc:362 msgid "Checking KDM" msgstr "KDMの確認" @@ -370,7 +370,7 @@ msgstr "設定をコピー \tCtrl-C" msgid "Could not create folder to store film." msgstr "プロジェクトを保存するフォルダを作成できませんでした。" -#: src/tools/dcpomatic_kdm.cc:652 src/tools/dcpomatic_verifier.cc:367 +#: src/tools/dcpomatic_kdm.cc:652 src/tools/dcpomatic_verifier.cc:354 msgid "" "Could not decrypt the DKDM. Perhaps it was not created with the correct " "certificate." @@ -424,7 +424,7 @@ msgstr "" "\n" "%s" -#: src/tools/dcpomatic_player.cc:829 src/tools/dcpomatic_verifier.cc:370 +#: src/tools/dcpomatic_player.cc:829 src/tools/dcpomatic_verifier.cc:357 msgid "Could not load KDM." msgstr "KDMを読み込めませんでした。" @@ -435,12 +435,11 @@ msgid "Could not load a DCP from %s" msgstr "%s から DCP を読み込めませんでした" #: src/tools/dcpomatic_batch.cc:495 -#, c++-format msgid "Could not load film {}" msgstr "プロジェクトを読み込めませんでした {}" #: src/tools/dcpomatic.cc:1751 -#, fuzzy, c++-format +#, fuzzy msgid "Could not load film {} ({})" msgstr "プロジェクトを読み込めませんでした {}({})" @@ -473,7 +472,7 @@ msgstr "" "ファイルをKDMとして読み込めませんでした。ファイルが大きすぎます。DKDM(XML)" "ファイルを読み込んでいることを確認してください。" -#: src/tools/dcpomatic_kdm.cc:645 src/tools/dcpomatic_verifier.cc:360 +#: src/tools/dcpomatic_kdm.cc:645 src/tools/dcpomatic_verifier.cc:347 #, fuzzy msgid "" "Could not read file as a KDM. Perhaps it is badly formatted, or not a KDM " @@ -538,7 +537,7 @@ msgstr "作成者" msgid "Crop" msgstr "切り抜き" -#: src/tools/dcpomatic_disk.cc:139 src/tools/dcpomatic_verifier.cc:179 +#: src/tools/dcpomatic_disk.cc:139 src/tools/dcpomatic_verifier.cc:172 msgid "DCP" msgstr "DCP" @@ -546,7 +545,7 @@ msgstr "DCP" msgid "DCP-o-matic Encode Server" msgstr "DCP-o-matic Encode Server" -#: src/tools/dcpomatic_disk.cc:135 src/tools/dcpomatic_verifier.cc:149 +#: src/tools/dcpomatic_disk.cc:135 src/tools/dcpomatic_verifier.cc:146 msgid "DCPs" msgstr "DCP一覧" @@ -675,7 +674,7 @@ msgstr "暗号化" msgid "Entry point" msgstr "エントリーポイント" -#: src/tools/dcpomatic_verifier.cc:152 +#: src/tools/dcpomatic_verifier.cc:156 #, fuzzy msgid "Examining DCPs" msgstr "DCP一覧の検討" @@ -990,7 +989,7 @@ msgstr "DCPを選択して開く" msgid "Select DCP to open as OV" msgstr "DCP(OV)を選択して開く" -#: src/tools/dcpomatic_verifier.cc:165 src/tools/dcpomatic_verifier.cc:167 +#: src/tools/dcpomatic_verifier.cc:150 src/tools/dcpomatic_verifier.cc:152 msgid "Select DCP(s)" msgstr "DCPを選択" @@ -1002,7 +1001,7 @@ msgstr "DKDMファイルを選択" msgid "Select DKDM file" msgstr "DKDMファイルを選択" -#: src/tools/dcpomatic_player.cc:810 src/tools/dcpomatic_verifier.cc:348 +#: src/tools/dcpomatic_player.cc:810 src/tools/dcpomatic_verifier.cc:335 msgid "Select KDM" msgstr "KDMを選択" @@ -1169,7 +1168,7 @@ msgstr "" "DCP および KDM の署名に使用する証明書チェーンを再作成しますか?" #: src/tools/dcpomatic_combiner.cc:167 -#, fuzzy, c++-format +#, fuzzy msgid "" "The directory {} already exists and is not empty. Are you sure you want to " "use it?" @@ -1227,7 +1226,7 @@ msgstr "" "これは%sプロジェクトフォルダのようですがプレーヤーに読み込めません。再生した" "い場合は、%sプロジェクトフォルダ内のDCPフォルダを選択してください。" -#: src/tools/dcpomatic_verifier.cc:197 +#: src/tools/dcpomatic_verifier.cc:190 msgid "" "Tick to check details of the picture asset, such as frame sizes and JPEG2000 " "bitstream validity. These checks are quite time-consuming." @@ -1275,7 +1274,7 @@ msgstr "上へ" msgid "User manual..." msgstr "ユーザーマニュアル(English)" -#: src/tools/dcpomatic_verifier.cc:208 +#: src/tools/dcpomatic_verifier.cc:201 #, fuzzy msgid "Verify" msgstr "確認" @@ -1288,7 +1287,7 @@ msgstr "DCPを検証" msgid "Verify DCP..." msgstr "DCPを検証" -#: src/tools/dcpomatic_verifier.cc:194 +#: src/tools/dcpomatic_verifier.cc:187 msgid "Verify picture asset details" msgstr "画像データの詳細を確認する" @@ -1300,7 +1299,7 @@ msgstr "バージョンファイル (VF)" msgid "Video waveform..." msgstr "動画波形" -#: src/tools/dcpomatic_verifier.cc:201 +#: src/tools/dcpomatic_verifier.cc:194 msgid "Write logs to DCP folders" msgstr "DCPフォルダへログを書込む" diff --git a/src/tools/po/zh_CN.po b/src/tools/po/zh_CN.po index b515feb78..591841030 100644 --- a/src/tools/po/zh_CN.po +++ b/src/tools/po/zh_CN.po @@ -13,15 +13,15 @@ msgstr "" "Project-Id-Version: DCPOMATIC\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-04-12 11:50+0200\n" -"PO-Revision-Date: 2025-10-05 13:41+0800\n" +"PO-Revision-Date: 2026-05-17 10:46+0800\n" "Last-Translator: Dian Li <xslidian@gmail.com>\n" -"Language-Team: Chinese Simplified (Rov8 branch)\n" +"Language-Team: Chinese Simplified (Hanyuan branch)\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 3.7\n" +"X-Generator: Poedit 3.9\n" "X-Poedit-SourceCharset: UTF-8\n" #: src/tools/dcpomatic_kdm.cc:491 @@ -37,7 +37,7 @@ msgstr "%d 导出KDMs 到 %s" #: src/tools/dcpomatic_combiner.cc:177 #, c-format msgid "%s already exists as a file, so you cannot use it for a DCP." -msgstr "%s文件已存在,您不可以将它用于DCP。" +msgstr "%s是一个文件且已经存在,因此您不可以将它用于DCP。" #: src/tools/dcpomatic_disk.cc:518 src/tools/dcpomatic_kdm.cc:944 #: src/tools/dcpomatic_player.cc:1426 @@ -157,11 +157,11 @@ msgstr "查看(&V)" #: src/tools/dcpomatic_verifier.cc:107 msgid "(encrypted, have KDM)" -msgstr "" +msgstr "(已加密,有KDM)" #: src/tools/dcpomatic_verifier.cc:109 msgid "(encrypted, no KDM)" -msgstr "" +msgstr "(已加密,无KDM)" #: src/tools/dcpomatic_playlist.cc:324 msgid "<b>Playlist:</b>" @@ -194,9 +194,8 @@ msgid "Add &KDM..." msgstr "添加 &KDM..." #: src/tools/dcpomatic_verifier.cc:187 -#, fuzzy msgid "Add KDM..." -msgstr "添加 &KDM..." +msgstr "添加 KDM..." #: src/tools/dcpomatic_playlist.cc:80 msgid "Add content" @@ -294,11 +293,11 @@ msgstr "注释文本" msgid "" "Are you sure you want to restore preferences to their defaults? This cannot " "be undone." -msgstr "确定要恢复默认设置? 该操作不能撤销。" +msgstr "确定恢复默认偏好设置? 该操作不能撤销。" #: src/tools/dcpomatic_player.cc:709 msgid "Audio graph..." -msgstr "" +msgstr "音频图..." #: src/tools/dcpomatic.cc:878 #, c-format @@ -329,7 +328,7 @@ msgstr "检查更新" #: src/tools/dcpomatic_verifier.cc:375 msgid "Checking KDM" -msgstr "" +msgstr "检查KDM" #: src/tools/dcpomatic_combiner.cc:68 src/tools/dcpomatic_disk.cc:84 msgid "Choose a DCP folder" @@ -376,7 +375,7 @@ msgstr "无法创建目录来存储影片。" msgid "" "Could not decrypt the DKDM. Perhaps it was not created with the correct " "certificate." -msgstr "不能解开DKDM。 也许它不是用选定的证书所加密的。" +msgstr "无法解密DKDM。 也许它不是用选定证书所加密的。" #: src/tools/dcpomatic.cc:661 src/tools/dcpomatic.cc:678 msgid "Could not duplicate project." @@ -506,11 +505,11 @@ msgstr "无法启动播放器,你可能需要从dcpomatic.com下载。" #, c-format msgid "" "Could not write to config file at %s. Your changes have not been saved." -msgstr "不能保存设置%s。设置没有被保存。" +msgstr "不能保存设置到文件%s。你的修改没有被保存。" #: src/tools/dcpomatic_player.cc:1136 msgid "Could not write to config file. Your changes have not been saved." -msgstr "不能保存设置到文件。更改没有被保存。" +msgstr "不能保存设置到文件。你的修改没有被保存。" #: src/tools/dcpomatic_kdm.cc:239 msgid "Create KDMs" @@ -655,18 +654,16 @@ msgid "Entry point" msgstr "入口点" #: src/tools/dcpomatic_verifier.cc:152 -#, fuzzy msgid "Examining DCPs" -msgstr "正在组合DCP" +msgstr "正在检查DCPs" #: src/tools/dcpomatic.cc:1446 msgid "Export preferences..." msgstr "导出首选项设置..." #: src/tools/dcpomatic.cc:1418 -#, fuzzy msgid "Export subtitles...\tShift-Ctrl-E" -msgstr "导出字幕..." +msgstr "导出字幕...\tShift-Ctrl-E" #: src/tools/dcpomatic.cc:1417 msgid "Export video file...\tCtrl-E" @@ -683,7 +680,7 @@ msgstr "眼" #: src/tools/dcpomatic.cc:1041 src/tools/dcpomatic_kdm.cc:362 #, c-format msgid "File %s already exists. Do you want to overwrite it?" -msgstr "已存在文件 %s ,是否覆盖?" +msgstr "已存在文件 %s ,你是否想要覆盖?" #. TRANSLATORS: this is the heading for a dialog box, which tells the user that the current #. project (Film) has been changed since it was last saved. @@ -698,7 +695,7 @@ msgstr "查找磁盘" #: src/tools/dcpomatic_kdm.cc:357 #, c-format msgid "Folder %s already exists. Do you want to overwrite it?" -msgstr "已存在文件 %s 。是否覆盖?" +msgstr "已存在文件夹 %s 。你是否想要覆盖?" #: src/tools/dcpomatic_server.cc:169 msgid "Frames per second" @@ -958,9 +955,8 @@ msgid "Select DCP to open as OV" msgstr "选择DCP作为OV打开" #: src/tools/dcpomatic_verifier.cc:165 src/tools/dcpomatic_verifier.cc:167 -#, fuzzy msgid "Select DCP(s)" -msgstr "选择KDM" +msgstr "选择DCP(s)" #: src/tools/dcpomatic_kdm.cc:821 msgid "Select DKDM File" @@ -1228,7 +1224,7 @@ msgstr "向上" #: src/tools/dcpomatic.cc:1455 msgid "User manual..." -msgstr "" +msgstr "用户手册..." #: src/tools/dcpomatic_verifier.cc:208 msgid "Verify" diff --git a/src/wx/dcp_panel.cc b/src/wx/dcp_panel.cc index 8f5c8fe7f..a69da7c1f 100644 --- a/src/wx/dcp_panel.cc +++ b/src/wx/dcp_panel.cc @@ -913,29 +913,23 @@ DCPPanel::add_video_panel_to_grid() int r = 0; add_label_to_sizer(_video_grid, _container_label, true, wxGBPosition(r, 0)); - { - auto s = new wxBoxSizer(wxHORIZONTAL); - s->Add(_container, 1, wxEXPAND | wxRIGHT, DCPOMATIC_SIZER_X_GAP); - s->Add(_container_size, 1, wxLEFT | wxALIGN_CENTER_VERTICAL); - _video_grid->Add(s, wxGBPosition(r, 1)); - ++r; - } + _video_grid->Add(_container, wxGBPosition(r, 1), wxDefaultSpan, wxEXPAND); + _video_grid->Add(_container_size, wxGBPosition(r, 2), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); + ++r; add_label_to_sizer(_video_grid, _resolution_label, true, wxGBPosition(r, 0)); - _video_grid->Add(_resolution, wxGBPosition(r, 1)); + _video_grid->Add(_resolution, wxGBPosition(r, 1), wxDefaultSpan, wxEXPAND); ++r; add_label_to_sizer(_video_grid, _frame_rate_label, true, wxGBPosition(r, 0)); - { - _frame_rate_sizer = new wxBoxSizer(wxHORIZONTAL); - _frame_rate_sizer->Add(_frame_rate_choice, 1, wxALIGN_CENTER_VERTICAL); - _frame_rate_sizer->Add(_frame_rate_spin, 1, wxALIGN_CENTER_VERTICAL); - _frame_rate_sizer->Add(_best_frame_rate, 1, wxLEFT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP); - _video_grid->Add(_frame_rate_sizer, wxGBPosition(r, 1)); - ++r; - } + _frame_rate_sizer = new wxBoxSizer(wxHORIZONTAL); + _frame_rate_sizer->Add(_frame_rate_choice, 1, wxALIGN_CENTER_VERTICAL); + _frame_rate_sizer->Add(_frame_rate_spin, 1, wxALIGN_CENTER_VERTICAL); + _video_grid->Add(_frame_rate_sizer, wxGBPosition(r, 1), wxDefaultSpan, wxEXPAND); + _video_grid->Add(_best_frame_rate, wxGBPosition(r, 2)); + ++r; - _video_grid->Add(_three_d, wxGBPosition(r, 0), wxGBSpan(1, 2)); + _video_grid->Add(_three_d, wxGBPosition(r, 0), wxGBSpan(1, 3)); ++r; add_label_to_sizer(_video_grid, _video_bit_rate_label, true, wxGBPosition(r, 0)); @@ -944,7 +938,7 @@ DCPPanel::add_video_panel_to_grid() add_label_to_sizer(s, _mbits_label, false, 0, wxLEFT | wxALIGN_CENTER_VERTICAL); _video_grid->Add(s, wxGBPosition(r, 1), wxDefaultSpan); ++r; - _video_grid->Add(_reencode_j2k, wxGBPosition(r, 0), wxGBSpan(1, 2)); + _video_grid->Add(_reencode_j2k, wxGBPosition(r, 0), wxGBSpan(1, 3)); } diff --git a/src/wx/film_name_location_dialog.cc b/src/wx/film_name_location_dialog.cc index 893b789f9..0ac7cc98a 100644 --- a/src/wx/film_name_location_dialog.cc +++ b/src/wx/film_name_location_dialog.cc @@ -27,6 +27,7 @@ #include "dir_picker_ctrl.h" #endif #include "lib/config.h" +#include <dcp/filesystem.h> #include <dcp/warnings.h> LIBDCP_DISABLE_WARNINGS #include <wx/stdpaths.h> @@ -139,7 +140,7 @@ FilmNameLocationDialog::template_name () const bool FilmNameLocationDialog::check_path () { - if (boost::filesystem::is_directory(path()) && !boost::filesystem::is_empty(path())) { + if (dcp::filesystem::is_directory(path()) && !dcp::filesystem::is_empty(path())) { if (!confirm_dialog ( this, wxString::Format( @@ -149,7 +150,7 @@ FilmNameLocationDialog::check_path () )) { return false; } - } else if (boost::filesystem::is_regular_file(path())) { + } else if (dcp::filesystem::is_regular_file(path())) { error_dialog ( this, wxString::Format(_("%s already exists as a file, so you cannot use it for a film."), std_to_wx(path().string())) diff --git a/src/wx/gl_video_view.cc b/src/wx/gl_video_view.cc index a04cb3000..1fea68218 100644 --- a/src/wx/gl_video_view.cc +++ b/src/wx/gl_video_view.cc @@ -71,6 +71,7 @@ using namespace dcpomatic::gl; GLVideoView::GLVideoView(FilmViewer* viewer, wxWindow *parent, bool wake) : VideoView(viewer, wake) , _context(nullptr) + , _canvas_size(wxSize{}) , _rec2020(false) , _vsync_enabled(false) , _playing(false) diff --git a/src/wx/po/ja_JP.po b/src/wx/po/ja_JP.po index 8d186a25b..ea0ad5a02 100644 --- a/src/wx/po/ja_JP.po +++ b/src/wx/po/ja_JP.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-04-21 17:39+0200\n" -"PO-Revision-Date: 2026-04-01 21:46+0900\n" +"POT-Creation-Date: 2026-02-15 21:03+0100\n" +"PO-Revision-Date: 2026-05-04 22:09+0900\n" "Last-Translator: \n" "Language-Team: \n" "Language: ja_JP\n" @@ -121,12 +121,12 @@ msgstr "" "(C) 2012-2026 Carl Hetherington, Terrence Meiczinger\n" "Aaron Boxer" -#: src/wx/full_config_dialog.cc:1227 src/wx/player_config_dialog.cc:131 +#: src/wx/full_config_dialog.cc:1210 src/wx/player_config_dialog.cc:131 #, c-format msgid "(restart %s to change display mode)" msgstr "(表示モードを変更するには %s を再起動してください)" -#: src/wx/general_preferences_page.cc:105 +#: src/wx/general_preferences_page.cc:104 #, c-format msgid "(restart %s to see language changes)" msgstr "(言語の変更を確認するには %s を再起動してください)" @@ -169,7 +169,7 @@ msgstr "12 - 7.1/HI/VI" #: src/wx/wx_util.cc:486 msgid "2 - stereo" -msgstr "2 - stereo" +msgstr "2 - ステレオ" #: src/wx/rgba_colour_picker.cc:40 msgid "255" @@ -183,17 +183,17 @@ msgstr "2D" msgid "2D version of 3D DCP" msgstr "3D DCPの2Dバージョン" -#: src/wx/dcp_panel.cc:900 +#: src/wx/dcp_panel.cc:895 msgid "2K" msgstr "2K" -#: src/wx/dcp_panel.cc:873 src/wx/video_panel.cc:189 +#: src/wx/dcp_panel.cc:868 src/wx/video_panel.cc:189 msgid "3D" msgstr "3D" #: src/wx/video_panel.cc:192 msgid "3D alternate" -msgstr "3D 代替" +msgstr "3D 交互" #: src/wx/video_panel.cc:193 msgid "3D left only" @@ -215,11 +215,11 @@ msgstr "3D 上/下" msgid "4 - L/C/R/Lfe" msgstr "4 - L/C/R/Lfe" -#: src/wx/dcp_panel.cc:1012 +#: src/wx/dcp_panel.cc:1007 msgid "48kHz" msgstr "48kHz" -#: src/wx/dcp_panel.cc:901 +#: src/wx/dcp_panel.cc:896 msgid "4K" msgstr "4K" @@ -231,7 +231,7 @@ msgstr "6 - 5.1" msgid "8 - 5.1/HI/VI" msgstr "8 - 5.1/HI/VI" -#: src/wx/dcp_panel.cc:1013 +#: src/wx/dcp_panel.cc:1008 msgid "96kHz" msgstr "96kHz" @@ -239,14 +239,14 @@ msgstr "96kHz" msgid ":1" msgstr ":1" -#: src/wx/verify_dcp_result_panel.cc:648 +#: src/wx/verify_dcp_result_panel.cc:637 #, fuzzy, c-format -msgid "<IssueDate> has an invalid value %issue_date" +msgid "<IssueDate> has an invalid value %n" msgstr "<IssueDate> 無効な値があります %n" -#: src/wx/verify_dcp_result_panel.cc:654 +#: src/wx/verify_dcp_result_panel.cc:643 #, fuzzy, c-format -msgid "<MainSoundConfiguration> is invalid (%error)" +msgid "<MainSoundConfiguration> is invalid (%n)" msgstr "<MainSoundConfiguration> 無効です (%n)" #: src/wx/subtitle_appearance_dialog.cc:118 @@ -270,90 +270,84 @@ msgstr "" msgid "A" msgstr "A" -#: src/wx/verify_dcp_result_panel.cc:570 +#: src/wx/verify_dcp_result_panel.cc:546 #, fuzzy, c-format -msgid "A 2K JPEG2000 frame contains %tile_parts tile parts instead of 3." +msgid "A 2K JPEG2000 frame contains %n tile parts instead of 3." msgstr "2K JPEG2000 フレームには、3 個ではなく %n 個のタイル部分が含まれます。" -#: src/wx/verify_dcp_result_panel.cc:584 +#: src/wx/verify_dcp_result_panel.cc:560 #, fuzzy, c-format -msgid "" -"A 2K JPEG2000 frame contains an invalid Rsiz (capabilities) value of " -"%capabilities" +msgid "A 2K JPEG2000 frame contains an invalid Rsiz (capabilities) value of %n" msgstr "2K JPEG2000フレームに無効なRsiz(機能)値%nが含まれています" -#: src/wx/verify_dcp_result_panel.cc:507 +#: src/wx/verify_dcp_result_panel.cc:518 #, fuzzy, c-format -msgid "A 2K JPEG2000 frame has %guard_bits guard bits instead of 1." -msgstr "2K JPEG2000 フレームには、1 ではなく %n のガード ビットがあります。" +msgid "A 2K JPEG2000 frame has %n POC marker(s) instead of 0." +msgstr "2K JPEG2000 フレームには、0 ではなく %n 個の POC マーカーがあります。" -#: src/wx/verify_dcp_result_panel.cc:542 +#: src/wx/verify_dcp_result_panel.cc:483 #, fuzzy, c-format -msgid "A 2K JPEG2000 frame has %poc_markers POC marker(s) instead of 0." -msgstr "2K JPEG2000 フレームには、0 ではなく %n 個の POC マーカーがあります。" +msgid "A 2K JPEG2000 frame has %n guard bits instead of 1." +msgstr "2K JPEG2000 フレームには、1 ではなく %n のガード ビットがあります。" -#: src/wx/verify_dcp_result_panel.cc:577 +#: src/wx/verify_dcp_result_panel.cc:553 #, fuzzy, c-format -msgid "A 4K JPEG2000 frame contains %tile_parts tile parts instead of 6." +msgid "A 4K JPEG2000 frame contains %n tile parts instead of 6." msgstr "4K JPEG2000 フレームには、6 個ではなく %n 個のタイル部分が含まれます。" -#: src/wx/verify_dcp_result_panel.cc:591 +#: src/wx/verify_dcp_result_panel.cc:567 #, fuzzy, c-format -msgid "" -"A 4K JPEG2000 frame contains an invalid Rsiz (capabilities) value of " -"%capabilities" +msgid "A 4K JPEG2000 frame contains an invalid Rsiz (capabilities) value of %n" msgstr "4K JPEG2000フレームに無効なRsiz(機能)値%nが含まれています" -#: src/wx/verify_dcp_result_panel.cc:514 -#, fuzzy, c-format -msgid "A 4K JPEG2000 frame has %guard_bits guard bits instead of 2." -msgstr "4K JPEG2000 フレームには 2 ではなく %n のガード ビットがあります。" - -#: src/wx/verify_dcp_result_panel.cc:549 +#: src/wx/verify_dcp_result_panel.cc:525 #, fuzzy, c-format -msgid "A 4K JPEG2000 frame has %poc_markers POC marker(s) instead of 1." +msgid "A 4K JPEG2000 frame has %n POC marker(s) instead of 1." msgstr "" "4K JPEG2000 フレームには、1 個ではなく %n 個の POC マーカーがあります。" -#: src/wx/verify_dcp_result_panel.cc:563 +#: src/wx/verify_dcp_result_panel.cc:490 +#, fuzzy, c-format +msgid "A 4K JPEG2000 frame has %n guard bits instead of 2." +msgstr "4K JPEG2000 フレームには 2 ではなく %n のガード ビットがあります。" + +#: src/wx/verify_dcp_result_panel.cc:539 #, fuzzy msgid "A JPEG2000 frame contains a POC marker in an invalid location." msgstr "JPEG2000 フレームに無効な場所に POC マーカーが含まれています。" -#: src/wx/verify_dcp_result_panel.cc:556 +#: src/wx/verify_dcp_result_panel.cc:532 #, fuzzy, c-format msgid "A JPEG2000 frame contains an invalid POC marker (%n)." msgstr "JPEG2000 フレームに無効な POC マーカー (%n) が含まれています。" -#: src/wx/verify_dcp_result_panel.cc:535 +#: src/wx/verify_dcp_result_panel.cc:511 #, fuzzy, c-format -msgid "" -"A JPEG2000 frame has a code-block height of %code_block_height instead of 32." +msgid "A JPEG2000 frame has a code-block height of %n instead of 32." msgstr "JPEG2000フレームのコードブロックの高さが32ではなく%nです。" -#: src/wx/verify_dcp_result_panel.cc:528 +#: src/wx/verify_dcp_result_panel.cc:504 #, fuzzy, c-format -msgid "" -"A JPEG2000 frame has a code-block width of %code_block_width instead of 32." +msgid "A JPEG2000 frame has a code-block width of %n instead of 32." msgstr "JPEG2000 フレームのコード ブロック幅は 32 ではなく %n です。" -#: src/wx/verify_dcp_result_panel.cc:598 +#: src/wx/verify_dcp_result_panel.cc:574 msgid "A JPEG2000 frame has no TLM marker." msgstr "JPEG2000フレームにTLMマーカーがありません。" -#: src/wx/verify_dcp_result_panel.cc:521 +#: src/wx/verify_dcp_result_panel.cc:497 #, fuzzy msgid "A JPEG2000 tile size does not match the image size." msgstr "JPEG2000 タイルのサイズが画像のサイズと一致しません。" #: src/wx/update_dialog.cc:45 -#, fuzzy, c-format +#, c-format msgid "A new version of %s is available." msgstr "%s の新しいバージョンが利用可能です。" -#: src/wx/verify_dcp_result_panel.cc:500 +#: src/wx/verify_dcp_result_panel.cc:476 #, fuzzy, c-format -msgid "A picture frame has an invalid JPEG2000 codestream (%error)." +msgid "A picture frame has an invalid JPEG2000 codestream (%n)." msgstr "画像フレームに無効な JPEG2000 コードストリーム (%n) があります。" #: src/wx/hints_dialog.cc:183 @@ -361,16 +355,16 @@ msgstr "画像フレームに無効な JPEG2000 コードストリーム (%n) msgid "A problem occurred when looking for hints (%s)" msgstr "ヒントの検索中に問題が発生しました (%s)" -#: src/wx/verify_dcp_result_panel.cc:603 +#: src/wx/verify_dcp_result_panel.cc:579 #, fuzzy msgid "A subtitle lasts longer than the reel it is in." msgstr "字幕の長さは、字幕が含まれるリールの長さよりも長くなります。" -#: src/wx/verify_dcp_result_panel.cc:670 -#, fuzzy, c-format +#: src/wx/verify_dcp_result_panel.cc:659 +#, c-format msgid "" -"A subtitle or closed caption refers to a font with ID %load_font_id that " -"does not have a corresponding <LoadFont> node." +"A subtitle or closed caption refers to a font with ID %id that does not have " +"a corresponding <LoadFont> node." msgstr "" "字幕またはクローズドキャプションは対応する<LoadFont>ノードを持たないID%idの" "フォントを指します。" @@ -469,7 +463,6 @@ msgid "Add recipient" msgstr "受信者を追加" #: src/wx/dcp_timeline.cc:173 -#, fuzzy msgid "Add reel boundary" msgstr "リール境界を追加" @@ -523,7 +516,7 @@ msgstr "アドレス" msgid "Adjust white point to" msgstr "ホワイトポイントを調整する" -#: src/wx/full_config_dialog.cc:1195 src/wx/kdm_config_dialog.cc:105 +#: src/wx/full_config_dialog.cc:1178 src/wx/kdm_config_dialog.cc:105 #: src/wx/metadata_dialog.cc:79 src/wx/player_config_dialog.cc:277 msgid "Advanced" msgstr "詳細" @@ -570,11 +563,6 @@ msgstr "フルフレームと非標準コンテナ比率を許可する" msgid "Allow mapping to all audio channels" msgstr "すべての音声チャンネルへの関連付けを許可する" -#: src/wx/full_config_dialog.cc:1079 -#, fuzzy -msgid "Allow use of MPEG2 Interop" -msgstr "SMPTE Bv2.0の使用を許可する" - #: src/wx/full_config_dialog.cc:1077 msgid "Allow use of SMPTE Bv2.0" msgstr "SMPTE Bv2.0の使用を許可する" @@ -583,17 +571,17 @@ msgstr "SMPTE Bv2.0の使用を許可する" msgid "Alpha 0" msgstr "Alpha 0" -#: src/wx/about_dialog.cc:184 +#: src/wx/about_dialog.cc:182 msgid "Also supported by" msgstr "更なる支援者" -#: src/wx/verify_dcp_result_panel.cc:307 +#: src/wx/verify_dcp_result_panel.cc:283 msgid "An asset has an empty path in the ASSETMAP." msgstr "ASSETMAP内のデータのパスが空です。" -#: src/wx/verify_dcp_result_panel.cc:633 +#: src/wx/verify_dcp_result_panel.cc:622 #, fuzzy, c-format -msgid "An invalid <ContentKind> %content_kind has been used." +msgid "An invalid <ContentKind> %n has been used." msgstr "無効な <ContentKind> %n が使用されました。" #: src/wx/dkdm_output_panel.cc:204 src/wx/kdm_output_panel.cc:321 @@ -602,7 +590,6 @@ msgid "An unknown exception occurred." msgstr "不明な例外が発生しました。" #: src/wx/short_kdm_output_panel.cc:100 src/wx/tall_kdm_output_panel.cc:81 -#, fuzzy msgid "Annotation text" msgstr "注釈テキスト" @@ -643,28 +630,28 @@ msgstr "" "次のアドレスにメールを送信してもよろしいですか?\n" "\n" -#: src/wx/verify_dcp_result_panel.cc:618 +#: src/wx/verify_dcp_result_panel.cc:607 #, fuzzy msgid "At least one <Text> node in a subtitle or closed caption is empty." msgstr "" "字幕またはクローズドキャプション内の少なくとも 1 つの <Text>ノードが空です。" -#: src/wx/verify_dcp_result_panel.cc:432 +#: src/wx/verify_dcp_result_panel.cc:408 msgid "" "At least one asset in a reel does not have the same duration as the others." msgstr "リール内の最低1 つのデータの長さが、他のデータと同じではありません。" -#: src/wx/verify_dcp_result_panel.cc:402 +#: src/wx/verify_dcp_result_panel.cc:378 #, fuzzy msgid "At least one pair of subtitles is separated by less than 2 frames." msgstr "最低1組の字幕の間隔が2フレーム未満です。" -#: src/wx/verify_dcp_result_panel.cc:396 +#: src/wx/verify_dcp_result_panel.cc:372 #, fuzzy msgid "At least one subtitle has zero or negative duration." msgstr "少なくとも 1 つの字幕の長さがゼロまたはそれ以下です。" -#: src/wx/verify_dcp_result_panel.cc:399 +#: src/wx/verify_dcp_result_panel.cc:375 #, fuzzy msgid "At least one subtitle lasts less than 15 frames." msgstr "少なくとも 1 つの字幕の長さが 15 フレーム未満です。" @@ -674,7 +661,7 @@ msgid "Atmos" msgstr "Atmos" #: src/wx/audio_dialog.cc:65 src/wx/audio_panel.cc:66 -#: src/wx/content_properties_dialog.cc:95 src/wx/dcp_panel.cc:124 +#: src/wx/content_properties_dialog.cc:82 src/wx/dcp_panel.cc:124 #: src/wx/timeline_labels_view.cc:42 src/wx/timeline_labels_view.cc:92 msgid "Audio" msgstr "音声" @@ -833,7 +820,7 @@ msgstr "証明書チェーン" msgid "Channel gain" msgstr "チャンネルゲイン" -#: src/wx/audio_dialog.cc:110 src/wx/dcp_panel.cc:981 +#: src/wx/audio_dialog.cc:110 src/wx/dcp_panel.cc:976 msgid "Channels" msgstr "音声チャンネル" @@ -841,11 +828,11 @@ msgstr "音声チャンネル" msgid "Check all" msgstr "全チェック" -#: src/wx/general_preferences_page.cc:203 +#: src/wx/general_preferences_page.cc:202 msgid "Check for testing updates on startup" msgstr "起動時にテスト更新を確認する" -#: src/wx/general_preferences_page.cc:199 +#: src/wx/general_preferences_page.cc:198 msgid "Check for updates on startup" msgstr "起動時にアップデートを確認する" @@ -885,7 +872,7 @@ msgstr "Christie" msgid "Cinema" msgstr "映画館" -#: src/wx/general_preferences_page.cc:126 +#: src/wx/general_preferences_page.cc:125 msgid "Cinema and screen database file" msgstr "映画とスクリーンのデータベースファイル" @@ -894,9 +881,9 @@ msgid "Click the button to set all selected content to the same value." msgstr "" "ボタンをクリックすると、選択したすべてのコンテンツが同じ値に設定されます。" -#: src/wx/verify_dcp_result_panel.cc:450 -#, fuzzy, c-format -msgid "Closed caption asset %asset_id has a non-zero <EntryPoint>." +#: src/wx/verify_dcp_result_panel.cc:426 +#, c-format +msgid "Closed caption asset %n has a non-zero <EntryPoint>." msgstr "" "クローズド キャプション データ %n には、ゼロ以外の <EntryPoint> があります。." @@ -929,12 +916,12 @@ msgstr "会社名" msgid "Component" msgstr "コンポーネント" -#: src/wx/general_preferences_page.cc:121 +#: src/wx/general_preferences_page.cc:120 msgid "Configuration file" msgstr "設定ファイル" #. TRANSLATORS: translate the word "Timing" here; do not include the "Config|" prefix -#: src/wx/full_config_dialog.cc:1308 src/wx/player_config_dialog.cc:319 +#: src/wx/full_config_dialog.cc:1291 src/wx/player_config_dialog.cc:319 msgid "Config|Timing" msgstr "設定|タイミング" @@ -942,7 +929,7 @@ msgstr "設定|タイミング" msgid "Confirm KDM email" msgstr "" -#: src/wx/dcp_panel.cc:861 +#: src/wx/dcp_panel.cc:856 msgid "Container" msgstr "アスペクト比" @@ -978,7 +965,7 @@ msgstr "コントラスト" #: src/wx/text_panel.cc:101 msgid "Coord|Y" -msgstr "" +msgstr "調整|Y" #: src/wx/dcp_panel.cc:93 msgid "Copy as name" @@ -1036,13 +1023,13 @@ msgstr "KDMを読み込めませんでした。" msgid "Could not load certificate (%s)" msgstr "証明書を読み込めませんでした (%s)" -#: src/wx/simple_video_view.cc:175 +#: src/wx/simple_video_view.cc:176 msgid "Could not play content" msgstr "コンテンツを再生できませんでした" -#: src/wx/verify_dcp_result_panel.cc:286 -#, fuzzy, c-format -msgid "Could not read DCP (%error)" +#: src/wx/verify_dcp_result_panel.cc:262 +#, c-format +msgid "Could not read DCP (%n)" msgstr "DCPファイルを読み取れませんでした(%n)" #: src/wx/gl_video_view.cc:131 @@ -1052,7 +1039,6 @@ msgstr "DCPを読み取れませんでした: %s" #: src/wx/download_certificate_panel.cc:66 #: src/wx/download_certificate_panel.cc:79 -#, c++-format msgid "Could not read certificate file ({})" msgstr "証明書ファイルを読み取れませんでした。({})" @@ -1140,7 +1126,7 @@ msgstr "DCP" msgid "DCP Text Track" msgstr "DCPテキストトラック" -#: src/wx/full_config_dialog.cc:1274 +#: src/wx/full_config_dialog.cc:1257 msgid "DCP asset filename format" msgstr "DCPデータファイル名の形式" @@ -1148,7 +1134,7 @@ msgstr "DCPデータファイル名の形式" msgid "DCP directory" msgstr "DCPのディレクトリ" -#: src/wx/full_config_dialog.cc:1255 +#: src/wx/full_config_dialog.cc:1238 msgid "DCP metadata filename format" msgstr "DCP詳細情報ファイル名の形式" @@ -1156,31 +1142,31 @@ msgstr "DCP詳細情報ファイル名の形式" msgid "Debug log file" msgstr "デバッグログファイル" -#: src/wx/full_config_dialog.cc:1310 +#: src/wx/full_config_dialog.cc:1293 msgid "Debug: 3D" msgstr "デバッグ: 3D" -#: src/wx/full_config_dialog.cc:1320 +#: src/wx/full_config_dialog.cc:1303 msgid "Debug: audio analysis" msgstr "デバッグ: audio analysis" -#: src/wx/full_config_dialog.cc:1322 +#: src/wx/full_config_dialog.cc:1305 msgid "Debug: butler" msgstr "デバッグ: butler" -#: src/wx/full_config_dialog.cc:1314 src/wx/kdm_config_dialog.cc:142 +#: src/wx/full_config_dialog.cc:1297 src/wx/kdm_config_dialog.cc:142 msgid "Debug: email sending" msgstr "デバッグ: email sending" -#: src/wx/full_config_dialog.cc:1312 +#: src/wx/full_config_dialog.cc:1295 msgid "Debug: encode" msgstr "デバッグ: encode" -#: src/wx/full_config_dialog.cc:1318 src/wx/player_config_dialog.cc:323 +#: src/wx/full_config_dialog.cc:1301 src/wx/player_config_dialog.cc:323 msgid "Debug: player" msgstr "デバッグ: player" -#: src/wx/full_config_dialog.cc:1316 src/wx/player_config_dialog.cc:321 +#: src/wx/full_config_dialog.cc:1299 src/wx/player_config_dialog.cc:321 msgid "Debug: video view" msgstr "デバッグ: video view" @@ -1355,7 +1341,7 @@ msgid "Edit screen" msgstr "スクリーンを編集" #: src/wx/audio_mapping_view.cc:90 src/wx/content_advanced_dialog.cc:75 -#: src/wx/dcp_panel.cc:996 src/wx/language_tag_widget.cc:51 +#: src/wx/dcp_panel.cc:991 src/wx/language_tag_widget.cc:51 #: src/wx/recipients_panel.cc:71 src/wx/region_subtag_widget.cc:52 #: src/wx/video_panel.cc:159 src/wx/video_panel.cc:170 #: src/wx/editable_list.h:149 @@ -1424,7 +1410,7 @@ msgstr "エンド" msgid "Enter your email address for the contact, not %s" msgstr "連絡先のメールアドレスを入力してください。%s" -#: src/wx/full_config_dialog.cc:1305 src/wx/kdm_config_dialog.cc:140 +#: src/wx/full_config_dialog.cc:1288 src/wx/kdm_config_dialog.cc:140 #: src/wx/player_config_dialog.cc:316 src/wx/verify_dcp_result_panel.cc:61 msgid "Errors" msgstr "エラー" @@ -1454,7 +1440,7 @@ msgid "Export video file" msgstr "動画ファイルをエクスポート" #: src/wx/certificate_chain_editor.cc:112 -#: src/wx/general_preferences_page.cc:129 +#: src/wx/general_preferences_page.cc:128 msgid "Export..." msgstr "エクスポート" @@ -1505,7 +1491,6 @@ msgid "Filename format" msgstr "ファイル名フォーマット" #: src/wx/film_name_location_dialog.cc:48 -#, fuzzy msgid "Film name" msgstr "プロジェクト名" @@ -1533,8 +1518,9 @@ msgid "Find missing..." msgstr "紛失物を探す" #: src/wx/subtitle_appearance_dialog.cc:130 +#, fuzzy msgid "Finding the colours in these subtitles..." -msgstr "" +msgstr "これらの字幕の色を見つける" #: src/wx/markers.cc:39 msgid "First frame of end credits (FFEC)" @@ -1584,28 +1570,32 @@ msgstr "鑑識的に動画をマーク" msgid "Format" msgstr "フォーマット" -#: src/wx/verify_dcp_result_panel.cc:343 +#: src/wx/verify_dcp_result_panel.cc:319 #, c-format msgid "" "Frame %frame (timecode %timecode) in asset %f has an instantaneous bit rate " "that is close to the limit of 250Mbit/s." msgstr "" +"%f 内の %frame フレーム(タイムコード %timecode)の瞬間ビットレートは250Mbit/" +"s の制限値に近い値です。" -#: src/wx/verify_dcp_result_panel.cc:336 +#: src/wx/verify_dcp_result_panel.cc:312 #, c-format msgid "" "Frame %frame (timecode %timecode) in asset %f has an instantaneous bit rate " "that is over the limit of 250Mbit/s." msgstr "" +"%f 内の %frame フレーム(タイムコード %timecode)の瞬間ビットレートは250Mbit/" +"s の制限値を超えています。" -#: src/wx/verify_dcp_result_panel.cc:662 +#: src/wx/verify_dcp_result_panel.cc:651 #, c-format msgid "" "Frame %frame has an image component that is too large (component %component " -"is %size_in_bytes bytes in size)." +"is %size bytes in size)." msgstr "" -#: src/wx/dcp_panel.cc:868 +#: src/wx/dcp_panel.cc:863 msgid "Frame Rate" msgstr "フレームレート" @@ -1632,7 +1622,6 @@ msgid "From address" msgstr "送信先メールアドレス" #: src/wx/film_name_location_dialog.cc:66 -#, fuzzy msgid "From template" msgstr "テンプレート元" @@ -1665,7 +1654,7 @@ msgstr "ゲイン計算機" msgid "Gain for content channel %d in DCP channel %d" msgstr "DCP チャネル %d のコンテンツ チャネル %d のゲイン" -#: src/wx/content_properties_dialog.cc:89 src/wx/full_config_dialog.cc:1301 +#: src/wx/content_properties_dialog.cc:76 src/wx/full_config_dialog.cc:1284 #: src/wx/general_preferences_page.cc:66 src/wx/kdm_config_dialog.cc:136 #: src/wx/player_config_dialog.cc:312 msgid "General" @@ -1729,7 +1718,7 @@ msgstr "IPアドレス" msgid "IP address / host name" msgstr "IPアドレス / ホスト名" -#: src/wx/full_config_dialog.cc:1083 +#: src/wx/full_config_dialog.cc:1080 msgid "ISDCF name part length" msgstr "ISDCF名部分の最大文字長" @@ -1959,7 +1948,7 @@ msgstr "LEQ(m) %.2fdB" msgid "Label" msgstr "ラベル" -#: src/wx/dcp_panel.cc:994 src/wx/dcp_text_track_dialog.cc:35 +#: src/wx/dcp_panel.cc:989 src/wx/dcp_text_track_dialog.cc:35 #: src/wx/text_panel.cc:166 msgid "Language" msgstr "言語" @@ -2005,7 +1994,7 @@ msgstr "タイトルクレジットの最終フレーム(LFTC)" msgid "Later" msgstr "後へ" -#: src/wx/full_config_dialog.cc:1242 +#: src/wx/full_config_dialog.cc:1225 msgid "Layout for short screen" msgstr "短い画面のレイアウト" @@ -2029,12 +2018,11 @@ msgstr "リーフ秘密鍵がリーフ証明書と一致しません!" msgid "Left" msgstr "左" -#: src/wx/content_properties_dialog.cc:98 +#: src/wx/content_properties_dialog.cc:85 msgid "Length" msgstr "長さ" #: src/wx/player_information.cc:181 -#, fuzzy, c++-format msgid "Length: {} ({} frames)" msgstr "長さ: {} ({} フレーム)" @@ -2062,7 +2050,7 @@ msgstr "プレイリストとKDMの読み込み中" msgid "Locations" msgstr "場所" -#: src/wx/full_config_dialog.cc:1299 src/wx/kdm_config_dialog.cc:134 +#: src/wx/full_config_dialog.cc:1282 src/wx/kdm_config_dialog.cc:134 #: src/wx/player_config_dialog.cc:310 msgid "Log" msgstr "ログ" @@ -2110,7 +2098,7 @@ msgstr "MP4 / H.264" msgid "MP4 files (*.mp4)|*.mp4" msgstr "MP4 files (*.mp4)|*.mp4" -#: src/wx/dcp_panel.cc:181 +#: src/wx/dcp_panel.cc:176 msgid "MPEG2 Interop" msgstr "MPEG2 Interop" @@ -2180,7 +2168,7 @@ msgstr "JPEG2000の最大ビットレート" msgid "Maximum MPEG2 bit rate" msgstr "MPEG2の最大ビットレート" -#: src/wx/full_config_dialog.cc:1247 +#: src/wx/full_config_dialog.cc:1230 msgid "Maximum number of frames to store per thread" msgstr "スレッドあたりに保存可能なフレームの最大数" @@ -2188,7 +2176,7 @@ msgstr "スレッドあたりに保存可能なフレームの最大数" msgid "Maximum reel size" msgstr "リールの最大容量" -#: src/wx/dcp_panel.cc:877 src/wx/full_config_dialog.cc:1050 +#: src/wx/dcp_panel.cc:872 src/wx/full_config_dialog.cc:1050 #: src/wx/full_config_dialog.cc:1059 msgid "Mbit/s" msgstr "Mbit/s" @@ -2209,100 +2197,100 @@ msgstr "付帯情報" msgid "Mix audio down to stereo" msgstr "音声をステレオへMIX" -#: src/wx/verify_dcp_result_panel.cc:571 +#: src/wx/verify_dcp_result_panel.cc:547 msgid "" "More 2K JPEG2000 frames (not listed) contain the wrong number of tile parts." msgstr "" "さらに多くの 2K JPEG2000 フレーム(リストに無い) には、間違った数のタイル部" "分が含まれています。" -#: src/wx/verify_dcp_result_panel.cc:508 +#: src/wx/verify_dcp_result_panel.cc:484 msgid "" "More 2K JPEG2000 frames (not listed) have an invalid number of guard bits." msgstr "" "さらに多くの 2K JPEG2000 フレーム(リストに無い)には、無効な数のガード ビッ" "トがあります。" -#: src/wx/verify_dcp_result_panel.cc:543 +#: src/wx/verify_dcp_result_panel.cc:519 msgid "More 2K JPEG2000 frames (not listed) have too many POC markers." msgstr "" "さらに多くの 2K JPEG2000 フレーム(リストにない)には、POC マーカーが多すぎま" "す。" -#: src/wx/verify_dcp_result_panel.cc:515 +#: src/wx/verify_dcp_result_panel.cc:491 msgid "" "More 4K JPEG2000 frames (not listed) have an invalid number of guard bits." msgstr "" "さらに多くの 4K JPEG2000 フレーム(リストに無い)には、無効な数のガード ビッ" "トがあります。" -#: src/wx/verify_dcp_result_panel.cc:550 +#: src/wx/verify_dcp_result_panel.cc:526 msgid "More 4K JPEG2000 frames (not listed) have too many POC markers." msgstr "" "さらに多くの 4K JPEG2000 フレーム(リストに無い)には、POC マーカーが多すぎま" "す。" -#: src/wx/verify_dcp_result_panel.cc:564 +#: src/wx/verify_dcp_result_panel.cc:540 msgid "" "More JPEG2000 frames (not listed) contain POC markers in invalid locations." msgstr "" "さらに多くの JPEG2000 フレーム(リストに無い)には、無効な場所に POC マーカー" "が含まれています。" -#: src/wx/verify_dcp_result_panel.cc:557 +#: src/wx/verify_dcp_result_panel.cc:533 #, fuzzy msgid "More JPEG2000 frames (not listed) contain invalid POC markers." msgstr "JPEG2000フレーム(記載なし)に無効なPOCマーカーが多数含まれています。" -#: src/wx/verify_dcp_result_panel.cc:585 src/wx/verify_dcp_result_panel.cc:592 +#: src/wx/verify_dcp_result_panel.cc:561 src/wx/verify_dcp_result_panel.cc:568 msgid "More JPEG2000 frames (not listed) contain invalid Rsiz values." msgstr "" -#: src/wx/verify_dcp_result_panel.cc:578 +#: src/wx/verify_dcp_result_panel.cc:554 msgid "" "More JPEG2000 frames (not listed) contain the wrong number of tile parts." msgstr "" -#: src/wx/verify_dcp_result_panel.cc:536 +#: src/wx/verify_dcp_result_panel.cc:512 msgid "More JPEG2000 frames (not listed) have an invalid code-block height." msgstr "" -#: src/wx/verify_dcp_result_panel.cc:529 +#: src/wx/verify_dcp_result_panel.cc:505 msgid "More JPEG2000 frames (not listed) have an invalid code-block width." msgstr "" -#: src/wx/verify_dcp_result_panel.cc:599 +#: src/wx/verify_dcp_result_panel.cc:575 msgid "More JPEG2000 frames (not listed) have no TLM marker." msgstr "" -#: src/wx/verify_dcp_result_panel.cc:522 +#: src/wx/verify_dcp_result_panel.cc:498 msgid "More JPEG2000 tile sizes (not listed) do not match the image size." msgstr "" -#: src/wx/verify_dcp_result_panel.cc:344 +#: src/wx/verify_dcp_result_panel.cc:320 msgid "" "More frames (not listed) have an instantaneous bit rate that is close to the " "limit of 250Mbit/s." msgstr "" -#: src/wx/verify_dcp_result_panel.cc:337 +#: src/wx/verify_dcp_result_panel.cc:313 msgid "" "More frames (not listed) have an instantaneous bit rate that is over the " "limit of 250Mbit/s." msgstr "" -#: src/wx/verify_dcp_result_panel.cc:663 +#: src/wx/verify_dcp_result_panel.cc:652 msgid "More frames (not listed) have image components that are too large." msgstr "" -#: src/wx/verify_dcp_result_panel.cc:501 +#: src/wx/verify_dcp_result_panel.cc:477 msgid "More picture frames (not listed) have invalid JPEG2000 codestreams." msgstr "" #: src/wx/markers_panel.cc:278 #, c-format msgid "Move %s marker to current position" -msgstr "" +msgstr "マーカー%sを現在位置に移動します" #: src/wx/config_move_dialog.cc:31 msgid "Move configuration" @@ -2383,7 +2371,7 @@ msgstr "次" msgid "No" msgstr "いいえ" -#: src/wx/verify_dcp_result_panel.cc:325 +#: src/wx/verify_dcp_result_panel.cc:301 msgid "No ASSETMAP or ASSETMAP.xml file was found." msgstr "ASSETMAPファイルまたはASSETMAP.xmlファイルが見つかりませんでした。" @@ -2391,7 +2379,7 @@ msgstr "ASSETMAPファイルまたはASSETMAP.xmlファイルが見つかりま msgid "No DCP loaded." msgstr "DCPが読み込まれていません。" -#: src/wx/verify_dcp_result_panel.cc:711 +#: src/wx/verify_dcp_result_panel.cc:700 msgid "No SMPTE Bv2.1 errors found." msgstr "SMPTE Bv2.1のエラーは見つかりませんでした。" @@ -2404,11 +2392,11 @@ msgstr "" msgid "No content found in this folder." msgstr "このフォルダ内にコンテンツが見つかりません。" -#: src/wx/verify_dcp_result_panel.cc:707 +#: src/wx/verify_dcp_result_panel.cc:696 msgid "No errors found." msgstr "異常は見つかりませんでした。" -#: src/wx/verify_dcp_result_panel.cc:715 +#: src/wx/verify_dcp_result_panel.cc:704 msgid "No warnings found." msgstr "警告は見つかりませんでした。" @@ -2416,13 +2404,13 @@ msgstr "警告は見つかりませんでした。" msgid "Non-standard" msgstr "カスタマイズ" -#: src/wx/content_advanced_dialog.cc:74 src/wx/content_advanced_dialog.cc:155 -#: src/wx/content_advanced_dialog.cc:163 src/wx/dcp_panel.cc:1099 +#: src/wx/content_advanced_dialog.cc:74 src/wx/content_advanced_dialog.cc:156 +#: src/wx/content_advanced_dialog.cc:164 src/wx/dcp_panel.cc:1094 #: src/wx/subtitle_appearance_dialog.cc:151 msgid "None" msgstr "なし" -#: src/wx/verify_dcp_result_panel.cc:384 +#: src/wx/verify_dcp_result_panel.cc:360 msgid "Not all subtitle assets specify the same <Language> tag." msgstr "すべての字幕データが同じ<Language>タグを指定していません。" @@ -2468,11 +2456,11 @@ msgstr "オフ" msgid "Offset" msgstr "オフセット" -#: src/wx/full_config_dialog.cc:1238 +#: src/wx/full_config_dialog.cc:1221 msgid "Only servers encode" msgstr "エンコードサーバーのみ" -#: src/wx/full_config_dialog.cc:1328 src/wx/player_config_dialog.cc:329 +#: src/wx/full_config_dialog.cc:1311 src/wx/player_config_dialog.cc:329 msgid "Open console window" msgstr "コンソールウィンドウを開く" @@ -2480,7 +2468,7 @@ msgstr "コンソールウィンドウを開く" msgid "Open the timeline for the film (Ctrl+T)." msgstr "映画のタイムラインを開く (Ctrl+T)。" -#: src/wx/full_config_dialog.cc:1335 src/wx/player_config_dialog.cc:127 +#: src/wx/full_config_dialog.cc:1318 src/wx/player_config_dialog.cc:127 msgid "OpenGL (faster)" msgstr "OpenGL (高速)" @@ -2551,11 +2539,11 @@ msgstr "検出された動画フレームレートを上書きする" msgid "Overwrite this file with current configuration" msgstr "このファイルへ現在の設定を上書き" -#: src/wx/verify_dcp_result_panel.cc:615 +#: src/wx/verify_dcp_result_panel.cc:604 msgid "Part of the DCP could not be checked because no KDM was available." msgstr "KDM が利用できないため、DCP の一部をチェックできませんでした。" -#: src/wx/verify_dcp_result_panel.cc:313 +#: src/wx/verify_dcp_result_panel.cc:289 msgid "" "Parts of the DCP are written according to the Interop standard and parts " "according to SMPTE." @@ -2588,7 +2576,7 @@ msgstr "字幕とキャプションの設定を貼付け" msgid "Paste video settings" msgstr "動画設定を貼付け" -#: src/wx/about_dialog.cc:176 +#: src/wx/about_dialog.cc:174 msgid "Patrons" msgstr "後援者" @@ -2662,7 +2650,7 @@ msgstr "先行公開(プレリリース)" msgid "Previous" msgstr "" -#: src/wx/dcp_panel.cc:990 +#: src/wx/dcp_panel.cc:985 msgid "Processor" msgstr "プロセッサー" @@ -2716,7 +2704,7 @@ msgstr "評価" msgid "Ratings" msgstr "評価" -#: src/wx/dcp_panel.cc:879 +#: src/wx/dcp_panel.cc:874 msgid "Re-encode JPEG2000 data from input" msgstr "入力からJPEG2000データを再エンコード" @@ -2804,7 +2792,7 @@ msgstr "公開地域" #: src/wx/metadata_dialog.cc:213 msgid "Release territory for this DCP" -msgstr "" +msgstr "このDCPの公開地域" #: src/wx/certificate_chain_editor.cc:91 src/wx/content_menu.cc:120 #: src/wx/content_panel.cc:284 src/wx/full_language_tag_dialog.cc:71 @@ -2874,7 +2862,7 @@ msgstr "件名と本文をデフォルトにリセット" msgid "Reset to default text" msgstr "デフォルトのテキストにリセット" -#: src/wx/dcp_panel.cc:865 +#: src/wx/dcp_panel.cc:860 msgid "Resolution" msgstr "解像度" @@ -2948,7 +2936,7 @@ msgstr "プロジェクトと同じ場所" msgid "Sample peak is %.2fdB at %s on %s" msgstr "サンプルピークは %.2fdB at %s on %schです" -#: src/wx/dcp_panel.cc:986 +#: src/wx/dcp_panel.cc:981 msgid "Sample rate" msgstr "サンプルレート" @@ -3021,7 +3009,7 @@ msgstr "証明書ファイルを選択" msgid "Select Chain File" msgstr "証明書チェーンを選択" -#: src/wx/general_preferences_page.cc:186 +#: src/wx/general_preferences_page.cc:185 msgid "Select Cinemas File" msgstr "映画館ファイルを選択" @@ -3053,11 +3041,11 @@ msgstr "OVを選択" msgid "Select and move content" msgstr "コンテンツを選択して移動する" -#: src/wx/general_preferences_page.cc:127 +#: src/wx/general_preferences_page.cc:126 msgid "Select cinema and screen database file" msgstr "映画館とスクリーンのデータベースファイルを選択" -#: src/wx/general_preferences_page.cc:122 +#: src/wx/general_preferences_page.cc:121 msgid "Select configuration file" msgstr "設定ファイルを選択" @@ -3069,7 +3057,7 @@ msgstr "デバッグログファイルを選択" msgid "Select output file" msgstr "出力ファイルを選択" -#: src/wx/full_language_tag_dialog.cc:221 +#: src/wx/full_language_tag_dialog.cc:222 msgid "Select..." msgstr "選択..." @@ -3165,11 +3153,11 @@ msgstr "シャドウ" msgid "Show" msgstr "表示" -#: src/wx/full_config_dialog.cc:1234 +#: src/wx/full_config_dialog.cc:1217 msgid "Show experimental audio processors" msgstr "試験的なオーディオプロセッサを表示" -#: src/wx/audio_panel.cc:75 src/wx/dcp_panel.cc:998 +#: src/wx/audio_panel.cc:75 src/wx/dcp_panel.cc:993 msgid "Show graph of audio levels..." msgstr "音声レベルのグラフを表示..." @@ -3194,7 +3182,7 @@ msgstr "手話動画言語" msgid "Signing DCPs and KDMs" msgstr "DCPとKDMの署名" -#: src/wx/full_config_dialog.cc:1333 src/wx/player_config_dialog.cc:126 +#: src/wx/full_config_dialog.cc:1316 src/wx/player_config_dialog.cc:126 msgid "Simple (safer)" msgstr "シンプル(安全)" @@ -3239,13 +3227,13 @@ msgstr "" "KDMの中で証明書の有効期間が受信者の有効期間と異なるものがあります。What do " "you want to do?" -#: src/wx/verify_dcp_result_panel.cc:621 +#: src/wx/verify_dcp_result_panel.cc:610 msgid "" "Some closed <Text> or <Image> nodes have different vertical alignments " "within a <Subtitle>." msgstr "" -#: src/wx/verify_dcp_result_panel.cc:624 +#: src/wx/verify_dcp_result_panel.cc:613 msgid "" "Some closed captions are not listed in the order of their vertical position." msgstr "" @@ -3255,7 +3243,7 @@ msgstr "" msgid "Sound" msgstr "サウンド" -#: src/wx/verify_dcp_result_panel.cc:651 +#: src/wx/verify_dcp_result_panel.cc:640 msgid "Sound assets do not all have the same channel count." msgstr "音声データは全て同じチャンネル数とは限りません。" @@ -3332,7 +3320,7 @@ msgstr "発行先共通名" msgid "Subject organization name" msgstr "発行先組織名" -#: src/wx/about_dialog.cc:180 +#: src/wx/about_dialog.cc:178 msgid "Subscribers" msgstr "購読者" @@ -3340,11 +3328,10 @@ msgstr "購読者" msgid "Subtitle appearance" msgstr "字幕外観" -#: src/wx/verify_dcp_result_panel.cc:444 -#, fuzzy, c-format -msgid "Subtitle asset %asset_id has a non-zero <EntryPoint>." +#: src/wx/verify_dcp_result_panel.cc:420 +#, c-format +msgid "Subtitle asset %n has a non-zero <EntryPoint>." msgstr "" -"クローズド キャプション データ %n には、ゼロ以外の <EntryPoint> があります。." #: src/wx/export_subtitles_dialog.cc:105 msgid "Subtitle files (.mxf)|*.mxf" @@ -3419,7 +3406,7 @@ msgstr "テストメールを送信しました。" msgid "Test version" msgstr "テストバージョン" -#: src/wx/about_dialog.cc:251 +#: src/wx/about_dialog.cc:249 msgid "Tested by" msgstr "テスト実施者" @@ -3427,12 +3414,12 @@ msgstr "テスト実施者" msgid "The 'until' time must be after the 'from' time." msgstr "「終了」時間は「開始」時間より後である必要があります。" -#: src/wx/verify_dcp_result_panel.cc:679 +#: src/wx/verify_dcp_result_panel.cc:668 #, c-format msgid "The <LabelText> in a <ContentVersion> in CPL %cpl is empty" msgstr "" -#: src/wx/verify_dcp_result_panel.cc:636 +#: src/wx/verify_dcp_result_panel.cc:625 #, fuzzy msgid "" "The <MainPictureActiveArea> is either not a multiple of 2, or is bigger than " @@ -3440,12 +3427,12 @@ msgid "" msgstr "" "<MainPictureActiveArea> が 2 の倍数でないか、アセットよりも大きいです。" -#: src/wx/verify_dcp_result_panel.cc:642 -#, fuzzy, c-format -msgid "The ASSETMAP %asset_map_id has more than one asset with the same ID." +#: src/wx/verify_dcp_result_panel.cc:631 +#, c-format +msgid "The ASSETMAP %n has more than one asset with the same ID." msgstr "ASSETMAP %n には、同じ ID を持つデータが複数存在します。" -#: src/wx/verify_dcp_result_panel.cc:609 +#: src/wx/verify_dcp_result_panel.cc:585 #, fuzzy msgid "" "The Asset ID in a timed text MXF is the same as the Resource ID or that of " @@ -3454,7 +3441,7 @@ msgstr "" "タイムドテキストMXF内のデータIDは、リソースID、または含まれるXMLのリソースID" "と同じです。" -#: src/wx/verify_dcp_result_panel.cc:429 +#: src/wx/verify_dcp_result_panel.cc:405 #, c-format msgid "" "The CPL %cpl has an <AnnotationText> which is not the same as its " @@ -3462,58 +3449,58 @@ msgid "" msgstr "" "CPL %cpl には、<ContentTitleText> とは異なる <AnnotationText> があります。" -#: src/wx/verify_dcp_result_panel.cc:682 -#, fuzzy, c-format -msgid "The CPL %cpl has an invalid namespace %xml_namespace" +#: src/wx/verify_dcp_result_panel.cc:671 +#, c-format +msgid "The CPL %cpl has an invalid namespace %n" msgstr "CPL%cplには無効な名前空間%nが含まれています" -#: src/wx/verify_dcp_result_panel.cc:486 +#: src/wx/verify_dcp_result_panel.cc:462 #, c-format msgid "The CPL %cpl has encrypted content but is not signed." msgstr "" "CPL %cpl には暗号化されたコンテンツが含まれていますが署名されていません。" -#: src/wx/verify_dcp_result_panel.cc:426 +#: src/wx/verify_dcp_result_panel.cc:402 #, c-format msgid "The CPL %cpl has no <AnnotationText> tag." msgstr "CPL %cpl には <AnnotationText> タグがありません。" -#: src/wx/verify_dcp_result_panel.cc:685 +#: src/wx/verify_dcp_result_panel.cc:674 #, c-format msgid "The CPL %cpl has no <ContentVersion> tag" msgstr "CPL %cpl には <ContentVersion> タグがありません" -#: src/wx/verify_dcp_result_panel.cc:480 +#: src/wx/verify_dcp_result_panel.cc:456 #, c-format msgid "The CPL %cpl has no CPL extension metadata tag." msgstr "CPL %cpl には CPL 拡張メタデータタグがありません。" -#: src/wx/verify_dcp_result_panel.cc:474 +#: src/wx/verify_dcp_result_panel.cc:450 #, c-format msgid "The CPL %cpl has no CPL metadata tag." msgstr "CPL %cpl には CPL メタデータ タグがありません。" -#: src/wx/verify_dcp_result_panel.cc:477 +#: src/wx/verify_dcp_result_panel.cc:453 #, fuzzy, c-format msgid "The CPL %cpl has no CPL metadata version number tag." msgstr "CPL %cpl には CPL付帯情報バージョン番号タグがありません。" -#: src/wx/verify_dcp_result_panel.cc:483 -#, fuzzy, c-format -msgid "The CPL %f has an invalid CPL extension metadata tag (%error)" +#: src/wx/verify_dcp_result_panel.cc:459 +#, c-format +msgid "The CPL %f has an invalid CPL extension metadata tag (%n)" msgstr "CPL %f には無効な CPL 拡張メタデータ タグ (%n) が含まれています" -#: src/wx/verify_dcp_result_panel.cc:468 -#, fuzzy, c-format -msgid "The DCP has a FFOC of %time instead of 1." +#: src/wx/verify_dcp_result_panel.cc:444 +#, c-format +msgid "The DCP has a FFOC of %n instead of 1." msgstr "DCPのFFOCは1ではなく%nです。" -#: src/wx/verify_dcp_result_panel.cc:471 -#, fuzzy, c-format -msgid "The DCP has a LFOC of %time instead of the reel duration minus one." +#: src/wx/verify_dcp_result_panel.cc:447 +#, c-format +msgid "The DCP has a LFOC of %n instead of the reel duration minus one." msgstr "DCPのLFOCは、リールの長さから1を引いた値ではなく%nとなっています。" -#: src/wx/verify_dcp_result_panel.cc:438 +#: src/wx/verify_dcp_result_panel.cc:414 msgid "" "The DCP has closed captions but not every reel has the same number of closed " "caption assets." @@ -3521,33 +3508,33 @@ msgstr "" "DCP にはクローズド キャプションがありますが、すべてのリールに同じ数のクローズ" "ド キャプションデータがあるわけではありません。" -#: src/wx/verify_dcp_result_panel.cc:495 +#: src/wx/verify_dcp_result_panel.cc:471 msgid "The DCP has encrypted content, but not all its assets are encrypted." msgstr "" "DCP には暗号化されたコンテンツがありますが、すべてのデータが暗号化されている" "わけではありません。" -#: src/wx/verify_dcp_result_panel.cc:462 +#: src/wx/verify_dcp_result_panel.cc:438 msgid "The DCP has no FFOC (first frame of content) marker." msgstr "DCPにはFFOC(コンテンツの最初のフレーム)マーカーがありません。" -#: src/wx/verify_dcp_result_panel.cc:465 +#: src/wx/verify_dcp_result_panel.cc:441 msgid "The DCP has no LFOC (last frame of content) marker." msgstr "DCPにはLFOC(コンテンツの最終フレーム)マーカーがありません。" -#: src/wx/verify_dcp_result_panel.cc:435 +#: src/wx/verify_dcp_result_panel.cc:411 msgid "The DCP has subtitles but at least one reel has no subtitle asset." msgstr "" "DCPには字幕が付いていますが、最低1つのリールには字幕データがありません。" -#: src/wx/verify_dcp_result_panel.cc:456 +#: src/wx/verify_dcp_result_panel.cc:432 msgid "" "The DCP is a feature but has no FFEC (first frame of end credits) marker." msgstr "" "DCPは本編ですがFFEC(エンドクレジットの最初のフレーム)マーカーが付いていませ" "ん。" -#: src/wx/verify_dcp_result_panel.cc:459 +#: src/wx/verify_dcp_result_panel.cc:435 msgid "" "The DCP is a feature but has no FFMC (first frame of moving credits) marker." msgstr "" @@ -3573,121 +3560,114 @@ msgstr "" "KDMの開始期間が、署名証明書の有効期間の開始前(または開始日に近い)になってい" "ます。このKDMにはより遅い開始時刻を使用してください。" -#: src/wx/verify_dcp_result_panel.cc:701 -#, fuzzy, c-format -msgid "The PKL %f has an invalid namespace %xml_namespace" +#: src/wx/verify_dcp_result_panel.cc:690 +#, c-format +msgid "The PKL %f has an invalid namespace %n" msgstr "PKL%fには無効な名前空間%nが含まれています" -#: src/wx/verify_dcp_result_panel.cc:492 -#, fuzzy, c-format +#: src/wx/verify_dcp_result_panel.cc:468 +#, c-format msgid "" -"The PKL %pkl has an <AnnotationText> which does not match its CPL's " +"The PKL %n has an <AnnotationText> which does not match its CPL's " "<ContentTitleText>." msgstr "" "PKL %n には、CPL の <ContentTitleText> と一致しない <AnnotationText> がありま" "す。" -#: src/wx/verify_dcp_result_panel.cc:489 -#, fuzzy, c-format -msgid "The PKL %pkl has encrypted content but is not signed." -msgstr "" -"CPL %cpl には暗号化されたコンテンツが含まれていますが署名されていません。" +#: src/wx/verify_dcp_result_panel.cc:465 +#, c-format +msgid "The PKL %n has encrypted content but is not signed." +msgstr "PKL %n は暗号化されたコンテンツを含みますが署名がされていません。" -#: src/wx/verify_dcp_result_panel.cc:639 -#, fuzzy, c-format -msgid "The PKL %pkl_id has more than one asset with the same ID." +#: src/wx/verify_dcp_result_panel.cc:628 +#, c-format +msgid "The PKL %n has more than one asset with the same ID." msgstr "PKL %n には、同じ ID を持つデータが複数存在します。" -#: src/wx/verify_dcp_result_panel.cc:298 +#: src/wx/verify_dcp_result_panel.cc:274 #, c-format msgid "The PKL and CPL hashes disagree for picture asset %f." msgstr "画像データ %f のPKLとCPLのハッシュ値が一致しません。" -#: src/wx/verify_dcp_result_panel.cc:304 +#: src/wx/verify_dcp_result_panel.cc:280 #, c-format msgid "The PKL and CPL hashes disagree for sound asset %f." msgstr "音声データ %f のPKLとCPLのハッシュ値が一致しません。" -#: src/wx/verify_dcp_result_panel.cc:606 +#: src/wx/verify_dcp_result_panel.cc:582 msgid "" "The Resource ID in a timed text MXF did not match the ID of the contained " "XML." msgstr "" "時間指定テキストMXF内のリソースIDが、含まれるXMLのIDと一致しませんでした。" -#: src/wx/verify_dcp_result_panel.cc:673 -#, fuzzy, c-format -msgid "" -"The SMPTE subtitle asset %asset_id has <Text> nodes but no <LoadFont> node" +#: src/wx/verify_dcp_result_panel.cc:662 +#, c-format +msgid "The SMPTE subtitle asset %id has <Text> nodes but no <LoadFont> node" msgstr "" "SMPTE字幕データ%id には<Text>ノードがありますが、<LoadFont>ノードがありませ" "ん。" -#: src/wx/verify_dcp_result_panel.cc:320 -#, fuzzy, c-format -msgid "The XML in %f is malformed (%error)." +#: src/wx/verify_dcp_result_panel.cc:296 +#, c-format +msgid "The XML in %f is malformed (%n)." msgstr "%f の XML は不正な形式です (%n)。" -#: src/wx/verify_dcp_result_panel.cc:318 -#, fuzzy -msgid "The XML in %f is malformed on line %l (%error)." +#: src/wx/verify_dcp_result_panel.cc:294 +msgid "The XML in %f is malformed on line %l (%n)." msgstr "XML %f の %l 行目は不正な形式です(%n)。" -#: src/wx/verify_dcp_result_panel.cc:372 -#, fuzzy, c-format +#: src/wx/verify_dcp_result_panel.cc:348 +#, c-format msgid "" -"The XML in the closed caption asset %f takes up %size_in_bytes bytes which " -"is over the 256KB limit." +"The XML in the closed caption asset %f takes up %n bytes which is over the " +"256KB limit." msgstr "" "クローズド キャプション アセット %f 内の XML は %n バイトを占めており、256 " "KB の制限を超えています。" -#: src/wx/verify_dcp_result_panel.cc:667 -#, fuzzy, c-format +#: src/wx/verify_dcp_result_panel.cc:656 +#, c-format msgid "" -"The XML in the subtitle asset %asset_id has more than one namespace " -"declaration." +"The XML in the subtitle asset %n has more than one namespace declaration." msgstr "字幕データ%n内のXMLには複数の名前空間宣言が含まれています。" -#: src/wx/verify_dcp_result_panel.cc:331 -#, fuzzy, c-format -msgid "" -"The asset %asset_id has a duration of less than 1 second, which is invalid." -msgstr "データ%nの有効期間が1秒未満であるため、無効です。" - -#: src/wx/verify_dcp_result_panel.cc:328 -#, fuzzy, c-format -msgid "" -"The asset %asset_id has an intrinsic duration of less than 1 second, which " -"is invalid." -msgstr "データ%nの固有持続時間は1秒未満であり、これは無効です。" - -#: src/wx/verify_dcp_result_panel.cc:453 -#, fuzzy, c-format -msgid "The asset %asset_id has no <Hash> in the CPL." -msgstr "データ%nのCPLには<Hash>は含まれません。" - -#: src/wx/verify_dcp_result_panel.cc:351 +#: src/wx/verify_dcp_result_panel.cc:327 #, c-format msgid "The asset %f is 3D but its MXF is marked as 2D." msgstr "データ %f は3Dですが、MXFは2Dとしてマークされています。" -#: src/wx/verify_dcp_result_panel.cc:310 +#: src/wx/verify_dcp_result_panel.cc:286 #, c-format msgid "The asset %f is missing." msgstr "データ%fが見つかりません。" -#: src/wx/verify_dcp_result_panel.cc:676 -#, fuzzy, c-format +#: src/wx/verify_dcp_result_panel.cc:307 +#, c-format +msgid "The asset %n has a duration of less than 1 second, which is invalid." +msgstr "データ%nの有効期間が1秒未満であるため、無効です。" + +#: src/wx/verify_dcp_result_panel.cc:304 +#, c-format msgid "" -"The asset with ID %asset_id in the asset map actually has an id of " -"%other_asset_id" +"The asset %n has an intrinsic duration of less than 1 second, which is " +"invalid." +msgstr "データ%nの固有持続時間は1秒未満であり、これは無効です。" + +#: src/wx/verify_dcp_result_panel.cc:429 +#, c-format +msgid "The asset %n has no <Hash> in the CPL." +msgstr "データ%nのCPLには<Hash>は含まれません。" + +#: src/wx/verify_dcp_result_panel.cc:665 +#, c-format +msgid "The asset with ID %id in the asset map actually has an id of %other_id" msgstr "" "アセットマップ内のID%iのデータは、実際は %other_id というIDを持っています。" -#: src/wx/verify_dcp_result_panel.cc:447 -#, fuzzy, c-format -msgid "The closed caption asset %asset_id has no <EntryPoint> tag." +#: src/wx/verify_dcp_result_panel.cc:423 +#, c-format +msgid "The closed caption asset %n has no <EntryPoint> tag." msgstr "クローズドキャプションアセット %n には <EntryPoint> タグがありません。" #: src/wx/film_name_location_dialog.cc:146 @@ -3729,32 +3709,32 @@ msgstr "" "ファイル %s は既に存在します。これを新しい設定として使用しますか?もしくは現" "在の設定を上書きしますか?" -#: src/wx/verify_dcp_result_panel.cc:393 +#: src/wx/verify_dcp_result_panel.cc:369 msgid "" "The first subtitle or closed caption happens before 4s into the first reel." msgstr "" "最初の字幕またはクローズド キャプションは、最初のリールの 4 秒前に表示されま" "す。" -#: src/wx/verify_dcp_result_panel.cc:657 -#, fuzzy, c-format +#: src/wx/verify_dcp_result_panel.cc:646 +#, c-format msgid "" -"The font file for font ID \"%load_font_id\" was not found, or was not " -"referred to in the ASSETMAP." +"The font file for font ID \"%n\" was not found, or was not referred to in " +"the ASSETMAP." msgstr "" "フォント ID \"%n\" のフォント ファイルが見つからないか、ASSETMAP で参照されて" "いません。" -#: src/wx/verify_dcp_result_panel.cc:378 -#, fuzzy, c-format +#: src/wx/verify_dcp_result_panel.cc:354 +#, c-format msgid "" -"The fonts in the timed text asset %f take up %size_in_bytes bytes which is " -"over the 10MB limit." +"The fonts in the timed text asset %f take up %n bytes which is over the 10MB " +"limit." msgstr "" "タイムドテキストデータ%fに含まれるフォントは%nバイトを消費しており、10MBの制" "限を超えています。" -#: src/wx/verify_dcp_result_panel.cc:295 +#: src/wx/verify_dcp_result_panel.cc:271 msgid "" "The hash (%calculated_hash) of the picture asset %f does not agree with the " "PKL file (%reference_hash). This probably means that the asset file is " @@ -3763,7 +3743,7 @@ msgstr "" "画像データ%fのハッシュ値(%calculated_hash)がPKLファイル(%reference_hash)" "と一致しません。アセットファイルが破損している事が原因と思われます。" -#: src/wx/verify_dcp_result_panel.cc:301 +#: src/wx/verify_dcp_result_panel.cc:277 msgid "" "The hash (%calculated_hash) of the sound asset %f does not agree with the " "PKL file (%reference_hash). This probably means that the asset file is " @@ -3772,7 +3752,7 @@ msgstr "" "音声データ%fのハッシュ値(%calculated_hash)がPKLファイル(%reference_hash)" "と一致しません。アセットファイルが破損している事が原因と思われます。" -#: src/wx/verify_dcp_result_panel.cc:289 +#: src/wx/verify_dcp_result_panel.cc:265 msgid "" "The hash (%reference_hash) of the CPL %cpl in the PKL does not agree with " "the CPL file (%calculated_hash). This probably means that the CPL file is " @@ -3782,9 +3762,9 @@ msgstr "" "(%calculated_hash)と一致しません。CPLファイルが破損している事が原因と思われ" "ます。" -#: src/wx/verify_dcp_result_panel.cc:357 -#, fuzzy -msgid "The invalid language tag %language is used." +#: src/wx/verify_dcp_result_panel.cc:333 +#, c-format +msgid "The invalid language tag %n is used." msgstr "無効な言語タグ %n が使用されています。" #: src/wx/smpte_metadata_dialog.cc:63 @@ -3792,29 +3772,28 @@ msgstr "無効な言語タグ %n が使用されています。" msgid "The language that the film's title (\"%s\") is in" msgstr "映画のタイトル(\"%s\")の言語" -#: src/wx/verify_dcp_result_panel.cc:292 -#, fuzzy, c-format -msgid "" -"The picture in a reel has a frame rate of %frame_rate, which is not valid." +#: src/wx/verify_dcp_result_panel.cc:268 +#, c-format +msgid "The picture in a reel has a frame rate of %n, which is not valid." msgstr "リール内の画像フレームレートは%nですが無効です。" -#: src/wx/verify_dcp_result_panel.cc:612 -#, fuzzy, c-format +#: src/wx/verify_dcp_result_panel.cc:595 +#, c-format msgid "" -"The reel duration (%other_duration) of some timed text is not the same as " -"the ContainerDuration (%duration) of its MXF." +"The reel duration (%s) of some timed text is not the same as the " +"ContainerDuration (%s) of its MXF." msgstr "" "一部のタイムドテキストのリール再生時間(%s)は、そのMXFファイルのコンテナ再生" "時間(%s)とは異なります。" -#: src/wx/verify_dcp_result_panel.cc:423 -#, fuzzy, c-format -msgid "The sound asset %f has an invalid bit depth of %bit_depth." +#: src/wx/verify_dcp_result_panel.cc:399 +#, c-format +msgid "The sound asset %f has an invalid bit depth of %n." msgstr "音声データ%fのビット深度%nは無効です。" -#: src/wx/verify_dcp_result_panel.cc:420 -#, fuzzy, c-format -msgid "The sound asset %f has an invalid frame rate of %frame_rate." +#: src/wx/verify_dcp_result_panel.cc:396 +#, c-format +msgid "The sound asset %f has an invalid frame rate of %n." msgstr "音声データ%fのフレームレート%nは無効です。" #: src/wx/dcp_panel.cc:142 @@ -3825,79 +3804,78 @@ msgstr "" "The standard that the DCP should use。Interopは古い規格で、SMPTEは新しい現在" "の規格です。迷った場合は「SMPTE」を選択してください。" -#: src/wx/verify_dcp_result_panel.cc:645 -#, fuzzy, c-format -msgid "The subtitle asset %asset_id contains no subtitles." -msgstr "字幕データ%nには字幕が含まれていません。" - -#: src/wx/verify_dcp_result_panel.cc:441 -#, fuzzy, c-format -msgid "The subtitle asset %asset_id has no <EntryPoint> tag." -msgstr "字幕データ%nには<EntryPoint>タグがありません。" - -#: src/wx/verify_dcp_result_panel.cc:381 +#: src/wx/verify_dcp_result_panel.cc:357 #, c-format msgid "The subtitle asset %f contains no <Language> tag." msgstr "字幕データ%fには<Language>タグが含まれていません。" -#: src/wx/verify_dcp_result_panel.cc:387 +#: src/wx/verify_dcp_result_panel.cc:363 #, c-format msgid "The subtitle asset %f contains no <StartTime> tag." msgstr "字幕データ%fには<StartTime>タグが含まれていません。" -#: src/wx/verify_dcp_result_panel.cc:390 +#: src/wx/verify_dcp_result_panel.cc:366 #, c-format msgid "The subtitle asset %f has a <StartTime> which is not zero." msgstr "字幕データ%fの<StartTime>はゼロではありません。" -#: src/wx/verify_dcp_result_panel.cc:375 -#, fuzzy, c-format +#: src/wx/verify_dcp_result_panel.cc:634 +#, c-format +msgid "The subtitle asset %n contains no subtitles." +msgstr "字幕データ%nには字幕が含まれていません。" + +#: src/wx/verify_dcp_result_panel.cc:417 +#, c-format +msgid "The subtitle asset %n has no <EntryPoint> tag." +msgstr "字幕データ%nには<EntryPoint>タグがありません。" + +#: src/wx/verify_dcp_result_panel.cc:351 +#, c-format msgid "" -"The timed text asset %f takes up %size_in_bytes bytes which is over the " -"115MB limit." +"The timed text asset %f takes up %n bytes which is over the 115MB limit." msgstr "" "タイムドテキストデータ%fは%nバイトを消費しており、115MBの制限を超えています。" -#: src/wx/verify_dcp_result_panel.cc:366 -#, fuzzy, c-format +#: src/wx/verify_dcp_result_panel.cc:345 +#, c-format msgid "" -"The video asset %f uses the frame rate %frame_rate which is invalid for 4K " -"video." +"The video asset %f uses the frame rate %n which is invalid for 3D video." +msgstr "動画データ%fには3D動画では無効なフレームレート%nを使用しています。" + +#: src/wx/verify_dcp_result_panel.cc:342 +#, c-format +msgid "" +"The video asset %f uses the frame rate %n which is invalid for 4K video." msgstr "動画データ%fには4K動画では無効なフレームレート%nを使用しています。" -#: src/wx/verify_dcp_result_panel.cc:363 -#, fuzzy, c-format -msgid "The video asset %f uses the invalid frame rate %frame_rate." +#: src/wx/verify_dcp_result_panel.cc:339 +#, c-format +msgid "The video asset %f uses the invalid frame rate %n." msgstr "動画データ%fには無効なフレームレート%nを使用しています。" -#: src/wx/verify_dcp_result_panel.cc:360 -#, fuzzy, c-format -msgid "The video asset %f uses the invalid image size %size_in_pixels." +#: src/wx/verify_dcp_result_panel.cc:336 +#, c-format +msgid "The video asset %f uses the invalid image size %n." msgstr "動画データ%fには無効な画像サイズ%nを使用しています。" -#: src/wx/verify_dcp_result_panel.cc:369 -#, fuzzy -msgid "The video asset is 4K which is not allowed for 3D video." -msgstr "動画データ%fには3D動画では無効なフレームレート%nを使用しています。" - -#: src/wx/verify_dcp_result_panel.cc:414 +#: src/wx/verify_dcp_result_panel.cc:390 msgid "There are more than 3 closed caption lines in at least one place." msgstr "少なくとも 1 か所に 3 行を超えるクローズド キャプション行があります。" -#: src/wx/verify_dcp_result_panel.cc:405 +#: src/wx/verify_dcp_result_panel.cc:381 msgid "There are more than 3 subtitle lines in at least one place." msgstr "最低1箇所に3行以上の字幕が表示されます。" -#: src/wx/verify_dcp_result_panel.cc:417 +#: src/wx/verify_dcp_result_panel.cc:393 msgid "There are more than 32 characters in at least one closed caption line." msgstr "" "最低1つのクローズド キャプション行に 32 文字を超える文字が含まれています。" -#: src/wx/verify_dcp_result_panel.cc:408 +#: src/wx/verify_dcp_result_panel.cc:384 msgid "There are more than 52 characters in at least one subtitle line." msgstr "最低1つの字幕行に52文字以上が含まれています。" -#: src/wx/verify_dcp_result_panel.cc:411 +#: src/wx/verify_dcp_result_panel.cc:387 msgid "There are more than 79 characters in at least one subtitle line." msgstr "最低1つの字幕行に79文字以上が含まれています。" @@ -3909,11 +3887,11 @@ msgstr "ヒントはまだありません:プロジェクトチェック進行 msgid "There are no hints: everything looks good!" msgstr "ヒントは一切ありません。すべて良好です!" -#: src/wx/verify_dcp_result_panel.cc:630 +#: src/wx/verify_dcp_result_panel.cc:619 msgid "There is a <Duration> tag inside a <MainMarkers>." msgstr "<MainMarkers>タグの中に<Duration>タグがあります。" -#: src/wx/verify_dcp_result_panel.cc:627 +#: src/wx/verify_dcp_result_panel.cc:616 msgid "There is a <EntryPoint> tag inside a <MainMarkers>." msgstr "<MainMarkers>タグの中に<EntryPoint>タグがあります。" @@ -3938,16 +3916,16 @@ msgstr "" msgid "This CPL contains no encrypted assets." msgstr "このCPLには暗号化されたデータが含まれていません。" -#: src/wx/verify_dcp_result_panel.cc:348 -#, fuzzy, c-format +#: src/wx/verify_dcp_result_panel.cc:324 +#, c-format msgid "" -"This DCP refers to the asset %asset_id in another DCP (and perhaps others), " -"so it is a \"version file\" (VF)" +"This DCP refers to at the asset %n in another DCP (and perhaps others), so " +"it is a \"version file\" (VF)" msgstr "" "これはバージョンファイル(VF)です。別のDCP(またはその他)のデータ%nを参照し" "ます。" -#: src/wx/verify_dcp_result_panel.cc:354 +#: src/wx/verify_dcp_result_panel.cc:330 msgid "This DCP uses the Interop standard, but it should be made with SMPTE." msgstr "" "このDCPはInterop規格を使用しています。SMPTE規格に準拠して作成する必要がありま" @@ -4108,7 +4086,7 @@ msgstr "上" msgid "Track" msgstr "トラック" -#: src/wx/about_dialog.cc:172 +#: src/wx/about_dialog.cc:170 msgid "Translated by" msgstr "翻訳者" @@ -4304,7 +4282,7 @@ msgstr "デフォルトでISDCF名を使用する" msgid "Use as" msgstr "" -#: src/wx/dcp_panel.cc:871 +#: src/wx/dcp_panel.cc:866 msgid "Use best" msgstr "推奨を利用" @@ -4337,7 +4315,7 @@ msgstr "有効期間|終了" msgid "Vendor" msgstr "ベンダー" -#: src/wx/verify_dcp_result_panel.cc:725 +#: src/wx/verify_dcp_result_panel.cc:714 msgid "Verification report" msgstr "検証レポート" @@ -4369,7 +4347,7 @@ msgstr "バージョンファイル(VF)の設定" msgid "Version number" msgstr "バージョン番号" -#: src/wx/content_properties_dialog.cc:92 src/wx/dcp_panel.cc:123 +#: src/wx/content_properties_dialog.cc:79 src/wx/dcp_panel.cc:123 #: src/wx/timeline_labels_view.cc:41 src/wx/timeline_labels_view.cc:74 #: src/wx/video_panel.cc:70 msgid "Video" @@ -4383,7 +4361,7 @@ msgstr "Video (MPEG, 16-235)" msgid "Video Waveform" msgstr "動画波形" -#: src/wx/dcp_panel.cc:875 +#: src/wx/dcp_panel.cc:870 msgid "" "Video bit rate\n" "for newly-encoded data" @@ -4391,7 +4369,7 @@ msgstr "" "新たにエンコードするデータの\n" "動画ビットレート" -#: src/wx/full_config_dialog.cc:1223 src/wx/player_config_dialog.cc:124 +#: src/wx/full_config_dialog.cc:1206 src/wx/player_config_dialog.cc:124 msgid "Video display mode" msgstr "動画表示モード" @@ -4417,7 +4395,7 @@ msgstr "表示..." msgid "WASAPI" msgstr "Windows Audio Session API" -#: src/wx/full_config_dialog.cc:1303 src/wx/kdm_config_dialog.cc:138 +#: src/wx/full_config_dialog.cc:1286 src/wx/kdm_config_dialog.cc:138 #: src/wx/player_config_dialog.cc:314 src/wx/verify_dcp_result_panel.cc:63 msgid "Warnings" msgstr "警告" @@ -4572,7 +4550,7 @@ msgstr "コンポーネント値" msgid "content" msgstr "コンテンツ" -#: src/wx/full_config_dialog.cc:1286 +#: src/wx/full_config_dialog.cc:1269 msgid "content filename" msgstr "コンテンツファイル名" @@ -4604,7 +4582,7 @@ msgstr "f" #: src/wx/dkdm_output_panel.cc:67 src/wx/kdm_output_panel.cc:142 msgid "film name" -msgstr "プロジェクト名称" +msgstr "プロジェクト名" #: src/wx/metadata_dialog.cc:335 msgid "foot lambert" @@ -4646,7 +4624,7 @@ msgstr "ms" msgid "not enabled" msgstr "有効ではない" -#: src/wx/full_config_dialog.cc:1285 +#: src/wx/full_config_dialog.cc:1268 msgid "number of reels" msgstr "リール番号" @@ -4674,7 +4652,7 @@ msgstr "プロトコル" msgid "recipient name" msgstr "受取人名" -#: src/wx/full_config_dialog.cc:1284 +#: src/wx/full_config_dialog.cc:1267 msgid "reel number" msgstr "リール番号" @@ -4703,11 +4681,11 @@ msgstr "終了日付/時刻" msgid "to fit DCP" msgstr "DCP適合" -#: src/wx/full_config_dialog.cc:1283 +#: src/wx/full_config_dialog.cc:1266 msgid "type (j2c/pcm/sub)" msgstr "タイプ(j2c/pcm/sub)" -#: src/wx/full_config_dialog.cc:1264 +#: src/wx/full_config_dialog.cc:1247 msgid "type(cpl/pkl)" msgstr "種類(cpl/pkl)" @@ -4754,7 +4732,3 @@ msgstr "年" #: src/wx/drive_wipe_warning_dialog.cc:61 msgid "yes" msgstr "はい" - -#, c-format -#~ msgid "The PKL %n has encrypted content but is not signed." -#~ msgstr "PKL %n は暗号化されたコンテンツを含みますが署名がされていません。" diff --git a/src/wx/po/zh_CN.po b/src/wx/po/zh_CN.po index d8ad12371..87833885b 100644 --- a/src/wx/po/zh_CN.po +++ b/src/wx/po/zh_CN.po @@ -13,16 +13,16 @@ msgstr "" "Project-Id-Version: libdcpomatic-wx\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-04-21 17:39+0200\n" -"PO-Revision-Date: 2025-10-05 14:09+0800\n" +"PO-Revision-Date: 2026-05-17 10:50+0800\n" "Last-Translator: Dian Li <xslidian@gmail.com>\n" -"Language-Team: Chinese Simplified (Rov8 branch)\n" +"Language-Team: Chinese Simplified (Hanyuan branch)\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" -"X-Generator: Poedit 3.7\n" +"X-Generator: Poedit 3.9\n" "X-Poedit-SourceCharset: UTF-8\n" #: src/wx/player_information.cc:111 @@ -109,9 +109,9 @@ msgid "%s already exists as a file, so you cannot use it for a film." msgstr "%s 文件已经存在,所以不能用它创建工程。" #: src/wx/audio_dialog.cc:175 -#, fuzzy, c-format +#, c-format msgid "%s audio" -msgstr "%s 音频 - %s" +msgstr "%s 音频" #: src/wx/audio_dialog.cc:171 src/wx/audio_dialog.cc:173 #, c-format @@ -124,12 +124,11 @@ msgid "%s test email" msgstr "%s发送测试邮件" #: src/wx/about_dialog.cc:95 -#, fuzzy msgid "" "(C) 2012-2026 Carl Hetherington, Terrence Meiczinger\n" "Aaron Boxer" msgstr "" -"(C) 2012-2025 Carl Hetherington, Terrence Meiczinger\n" +"(C) 2012-2026 Carl Hetherington, Terrence Meiczinger\n" "Aaron Boxer" #: src/wx/full_config_dialog.cc:1227 src/wx/player_config_dialog.cc:131 @@ -559,9 +558,8 @@ msgid "Allow mapping to all audio channels" msgstr "允许映射到所有音频通道" #: src/wx/full_config_dialog.cc:1079 -#, fuzzy msgid "Allow use of MPEG2 Interop" -msgstr "允许使用SMPTE Bv2.0" +msgstr "允许使用MPEG2 Interop" #: src/wx/full_config_dialog.cc:1077 msgid "Allow use of SMPTE Bv2.0" @@ -826,9 +824,8 @@ msgid "Check for updates on startup" msgstr "启动时检查软件更新" #: src/wx/content_menu.cc:116 -#, fuzzy msgid "Choose CPL" -msgstr "选择CPL…" +msgstr "选择CPL" #: src/wx/content_panel.cc:677 msgid "Choose a DCP folder" @@ -1038,9 +1035,8 @@ msgid "Could not read certificate file." msgstr "无法读取证书文件。" #: src/wx/certificate_chain_editor.cc:195 -#, fuzzy msgid "Could not read certificate file. Make sure it is in PEM format." -msgstr "无法读取证书文件。" +msgstr "无法读取证书文件。确保它是 PEM 格式。" #: src/wx/qube_certificate_panel.cc:55 msgid "Could not read certificates from Qube server." @@ -1140,9 +1136,8 @@ msgid "Debug: audio analysis" msgstr "调试: 音频分析" #: src/wx/full_config_dialog.cc:1322 -#, fuzzy msgid "Debug: butler" -msgstr "调试: 播放器" +msgstr "调试: 管家(butler)" #: src/wx/full_config_dialog.cc:1314 src/wx/kdm_config_dialog.cc:142 msgid "Debug: email sending" @@ -1361,33 +1356,28 @@ msgid "Encoding Servers" msgstr "编码服务器" #: src/wx/encryption_settings_dialog.cc:33 -#, fuzzy msgid "Encrypt picture" -msgstr "加密" +msgstr "加密图像" #: src/wx/encryption_settings_dialog.cc:34 -#, fuzzy msgid "Encrypt sound" -msgstr "加密" +msgstr "加密声音" #: src/wx/encryption_settings_dialog.cc:35 -#, fuzzy msgid "Encrypt text" -msgstr "加密" +msgstr "加密文本" #: src/wx/dcp_panel.cc:106 src/wx/spl_entry_dialog.cc:51 msgid "Encrypted" msgstr "加密" #: src/wx/encryption_settings_dialog.cc:31 -#, fuzzy msgid "Encryption settings" -msgstr "导出所有KDM加密设置…" +msgstr "加密设置" #: src/wx/dcp_panel.cc:107 -#, fuzzy msgid "Encryption settings..." -msgstr "导出所有KDM加密设置…" +msgstr "加密设置..." #: src/wx/text_view.cc:68 msgid "End" @@ -1508,29 +1498,24 @@ msgid "Finding the colours in these subtitles..." msgstr "查找这些字幕中的颜色..." #: src/wx/markers.cc:39 -#, fuzzy msgid "First frame of end credits (FFEC)" -msgstr "片尾的第一帧" +msgstr "片尾字幕的第一帧(FFEC)" #: src/wx/markers.cc:37 -#, fuzzy msgid "First frame of intermission (FFOI)" -msgstr "幕间休息第一帧" +msgstr "幕间休息的第一帧 (FFOI)" #: src/wx/markers.cc:41 -#, fuzzy msgid "First frame of moving credits (FFMC)" -msgstr "动态字幕的第一帧" +msgstr "滚动字幕的第一帧(FFMC)" #: src/wx/markers.cc:33 -#, fuzzy msgid "First frame of ratings band (FFOB)" -msgstr "评级等级的第一帧" +msgstr "评级的第一帧(FFOB)" #: src/wx/markers.cc:35 -#, fuzzy msgid "First frame of title credits (FFTC)" -msgstr "标题字幕第一帧" +msgstr "标题字幕第一帧(FFTC)" #: src/wx/short_kdm_output_panel.cc:115 src/wx/tall_kdm_output_panel.cc:84 msgid "Folder / ZIP name format" @@ -1953,29 +1938,24 @@ msgid "Language used for any sign language video track" msgstr "用于手语视频轨道的语言" #: src/wx/markers.cc:40 -#, fuzzy msgid "Last frame of end credits (LFEC)" -msgstr "片尾字幕的最后一帧" +msgstr "片尾字幕的最后一帧(LFEC)" #: src/wx/markers.cc:38 -#, fuzzy msgid "Last frame of intermission (LFOI)" -msgstr "幕间休息的最后一帧" +msgstr "幕间休息的最后一帧(LFOI)" #: src/wx/markers.cc:42 -#, fuzzy msgid "Last frame of moving credits (LFMC)" -msgstr "动态字幕的最后一帧" +msgstr "动态字幕的最后一帧(LFMC)" #: src/wx/markers.cc:34 -#, fuzzy msgid "Last frame of ratings band (LFOB)" -msgstr "评级等级的最后一帧" +msgstr "评级等级的最后一帧(LFOB)" #: src/wx/markers.cc:36 -#, fuzzy msgid "Last frame of title credits (LFTC)" -msgstr "标题字幕的最后一帧" +msgstr "标题字幕的最后一帧(LFTC)" #: src/wx/content_panel.cc:292 msgid "Later" @@ -2090,9 +2070,8 @@ msgid "MPEG2 Interop" msgstr "MPEG2 Interop" #: src/wx/export_subtitles_dialog.cc:48 -#, fuzzy msgid "MXF (SMPTE)" -msgstr "SMPTE" +msgstr "MXF (SMPTE)" #. TRANSLATORS: Main and Additional here are a choice for whether a set of subtitles is in the "main" language of the #. film or an "additional" language. @@ -3719,9 +3698,9 @@ msgstr "" "(%duration) 不同。" #: src/wx/verify_dcp_result_panel.cc:423 -#, fuzzy, c-format +#, c-format msgid "The sound asset %f has an invalid bit depth of %bit_depth." -msgstr "声音资产 %f 的位深度 %bit_depth 无效。" +msgstr "音频资产 %f 的位深 %bit_depth 无效。" #: src/wx/verify_dcp_result_panel.cc:420 #, c-format @@ -3786,9 +3765,8 @@ msgid "The video asset %f uses the invalid image size %size_in_pixels." msgstr "视频资产 %f 使用了无效的图像大小 %size_in_pixels。" #: src/wx/verify_dcp_result_panel.cc:369 -#, fuzzy msgid "The video asset is 4K which is not allowed for 3D video." -msgstr "视频资产 %f 使用的帧速率 %frame_rate 对于3D视频无效。" +msgstr "该视频素材为4K,不允许用于3D视频。" #: src/wx/verify_dcp_result_panel.cc:414 msgid "There are more than 3 closed caption lines in at least one place." @@ -3846,13 +3824,13 @@ msgid "This CPL contains no encrypted assets." msgstr "该CPL没有包含加密内容。" #: src/wx/verify_dcp_result_panel.cc:348 -#, fuzzy, c-format +#, c-format msgid "" "This DCP refers to the asset %asset_id in another DCP (and perhaps others), " "so it is a \"version file\" (VF)" msgstr "" -"此DCP引用了另一个DCP(可能还有其他DCP)中的资产 %asset_id,因此它是一个“版本" -"文件”(VF)" +"这个DCP引用了另一个DCP中的资产%asset_id(也可能是其他DCP中的资产),因此它是" +"一个“版本文件”(VF)" #: src/wx/verify_dcp_result_panel.cc:354 msgid "This DCP uses the Interop standard, but it should be made with SMPTE." @@ -4257,18 +4235,16 @@ msgid "Verify" msgstr "验证" #: src/wx/content_menu.cc:425 -#, fuzzy msgid "Verify DCP" -msgstr "验证" +msgstr "验证DCP" #: src/wx/verify_dcp_dialog.cc:94 msgid "Verify picture asset details" msgstr "验证图像资产详细信息" #: src/wx/content_menu.cc:107 -#, fuzzy msgid "Verify..." -msgstr "验证" +msgstr "验证..." #: src/wx/smpte_metadata_dialog.cc:109 src/wx/system_information_dialog.cc:67 msgid "Version" @@ -4385,9 +4361,8 @@ msgid "X" msgstr "X" #: src/wx/export_subtitles_dialog.cc:47 -#, fuzzy msgid "XML (Interop)" -msgstr "Interop" +msgstr "XML (Interop)" #: src/wx/text_panel.cc:93 msgid "Y" diff --git a/src/wx/supporters.cc b/src/wx/supporters.cc index a2ad21c59..cd331bba7 100644 --- a/src/wx/supporters.cc +++ b/src/wx/supporters.cc @@ -86,6 +86,7 @@ supported_by.Add (wxT ("John Bacon")); supported_by.Add (wxT ("Lee Bailes")); supported_by.Add (wxT ("Pietro Baj")); supported_by.Add (wxT ("Joshua Baker")); +supported_by.Add (wxT ("David Baker")); supported_by.Add (wxT ("José Val Bal")); supported_by.Add (wxT ("Grant Baldwin")); supported_by.Add (wxT ("Kai Balin")); @@ -252,6 +253,7 @@ supported_by.Add (wxT ("Dan Cohen")); supported_by.Add (wxT ("Jonathan Cole")); supported_by.Add (wxT ("Shane Colella")); supported_by.Add (wxT ("Blair Collie")); +supported_by.Add (wxT ("Andrew Collins")); supported_by.Add (wxT ("Devon Collins")); supported_by.Add (wxT ("Kimberly Collmer")); supported_by.Add (wxT ("Sodalite Color")); @@ -262,6 +264,7 @@ supported_by.Add (wxT ("Marketplace Media Company")); supported_by.Add (wxT ("The Archetype Company")); supported_by.Add (wxT ("Conta'm")); supported_by.Add (wxT ("Mike Coombs")); +supported_by.Add (wxT ("Griffin Cork")); supported_by.Add (wxT ("Kathy Corley")); supported_by.Add (wxT ("Xavier Cortes")); supported_by.Add (wxT ("Thomas Cosgrove")); @@ -596,6 +599,7 @@ supported_by.Add (wxT ("Jessica Han")); supported_by.Add (wxT ("Mark Hanrahan")); supported_by.Add (wxT ("Niels-Erik Constantin Hansen")); supported_by.Add (wxT ("Richard Hansen")); +supported_by.Add (wxT ("Paul Hara")); supported_by.Add (wxT ("Jozef Hardos")); supported_by.Add (wxT ("Filmschuur Harlem")); supported_by.Add (wxT ("Jens Harms")); @@ -616,6 +620,7 @@ supported_by.Add (wxT ("Martin Oliveros Heinze")); supported_by.Add (wxT ("Patrik Gunnar Helin")); supported_by.Add (wxT ("Bert Helsen")); supported_by.Add (wxT ("Jeff Hemingway")); +supported_by.Add (wxT ("Ton Hendriks")); supported_by.Add (wxT ("Pascal Hennequin")); supported_by.Add (wxT ("Mark Hensley")); supported_by.Add (wxT ("Ronny Hermansen")); @@ -827,6 +832,7 @@ supported_by.Add (wxT ("Stuart Leask")); supported_by.Add (wxT ("David Armati Lechner")); supported_by.Add (wxT ("Youen Leclerc")); supported_by.Add (wxT ("Richard Lecocq")); +supported_by.Add (wxT ("Philipp Leder")); supported_by.Add (wxT ("Lilian Lefranc")); supported_by.Add (wxT ("Robert Legato")); supported_by.Add (wxT ("Nicholas Legault")); @@ -898,6 +904,7 @@ supported_by.Add (wxT ("Kara Long")); supported_by.Add (wxT ("Juan Marin Lorenzo")); supported_by.Add (wxT ("Tim Lorge")); supported_by.Add (wxT ("Thomas Lorin")); +supported_by.Add (wxT ("Stephen Lorusso")); supported_by.Add (wxT ("Leonard Louder")); supported_by.Add (wxT ("Auguste && Louise")); supported_by.Add (wxT ("Cubic Films Pty Ltd")); @@ -1194,6 +1201,7 @@ supported_by.Add (wxT ("A Tractor Productions")); supported_by.Add (wxT ("Second Wind Productions")); supported_by.Add (wxT ("Locomotive Productions")); supported_by.Add (wxT ("Stoneman Productions")); +supported_by.Add (wxT ("Zombie Zoo Productions")); supported_by.Add (wxT ("Oley Sassone Productions")); supported_by.Add (wxT ("RIOT Productions")); supported_by.Add (wxT ("Undercrank Productions")); @@ -1539,6 +1547,7 @@ supported_by.Add (wxT ("Mike Wendt")); supported_by.Add (wxT ("Frank Wenz")); supported_by.Add (wxT ("Anja Wenz")); supported_by.Add (wxT ("Olav Werner")); +supported_by.Add (wxT ("Georg Werner")); supported_by.Add (wxT ("Maik Wieczorek")); supported_by.Add (wxT ("Ralph Wiegandt")); supported_by.Add (wxT ("Johannes Wilbrand")); diff --git a/test/audio_mapping_test.cc b/test/audio_mapping_test.cc index dfde022a0..9bc5bcf5f 100644 --- a/test/audio_mapping_test.cc +++ b/test/audio_mapping_test.cc @@ -36,71 +36,71 @@ using std::string; using boost::optional; -BOOST_AUTO_TEST_CASE (audio_mapping_test) +BOOST_AUTO_TEST_CASE(audio_mapping_test) { AudioMapping none; - BOOST_CHECK_EQUAL (none.input_channels(), 0); + BOOST_CHECK_EQUAL(none.input_channels(), 0); - AudioMapping four (4, MAX_DCP_AUDIO_CHANNELS); - BOOST_CHECK_EQUAL (four.input_channels(), 4); + AudioMapping four(4, MAX_DCP_AUDIO_CHANNELS); + BOOST_CHECK_EQUAL(four.input_channels(), 4); - four.set (0, 1, 1); + four.set(0, 1, 1); for (int i = 0; i < 4; ++i) { for (int j = 0; j < MAX_DCP_AUDIO_CHANNELS; ++j) { - BOOST_CHECK_EQUAL (four.get(i, j), (i == 0 && j == 1) ? 1 : 0); + BOOST_CHECK_EQUAL(four.get(i, j), (i == 0 && j == 1) ? 1 : 0); } } - auto mapped = four.mapped_output_channels (); - BOOST_CHECK_EQUAL (mapped.size(), 1U); - BOOST_CHECK_EQUAL (mapped.front(), 1); + auto mapped = four.mapped_output_channels(); + BOOST_CHECK_EQUAL(mapped.size(), 1U); + BOOST_CHECK_EQUAL(mapped.front(), 1); - four.make_zero (); + four.make_zero(); for (int i = 0; i < 4; ++i) { for (int j = 0; j < MAX_DCP_AUDIO_CHANNELS; ++j) { - BOOST_CHECK_EQUAL (four.get (i, j), 0); + BOOST_CHECK_EQUAL(four.get(i, j), 0); } } } static void -guess_check (boost::filesystem::path filename, int output_channel) +guess_check(boost::filesystem::path filename, dcp::Channel output_channel) { - AudioMapping m (1, 8); - m.make_default (0, filename); - for (int i = 0; i < 8; ++i) { + AudioMapping m(1, 12); + m.make_default(0, filename); + for (int i = 0; i < 12; ++i) { BOOST_TEST_INFO(fmt::format("{} channel {}", filename.string(), i)); - BOOST_CHECK_CLOSE (m.get(0, i), i == output_channel ? 1 : 0, 0.01); + BOOST_CHECK_CLOSE(m.get(0, i), i == static_cast<int>(output_channel) ? 1 : 0, 0.01); } } -BOOST_AUTO_TEST_CASE (audio_mapping_guess_test) +BOOST_AUTO_TEST_CASE(audio_mapping_guess_test) { - guess_check ("stuff_L_nonsense.wav", 0); - guess_check ("stuff_nonsense.wav", 2); - guess_check ("fred_R.wav", 1); - guess_check ("jim_C_sheila.aiff", 2); - guess_check ("things_Lfe_and.wav", 3); - guess_check ("weeee_Ls.aiff", 4); - guess_check ("try_Rs-it.wav", 5); + guess_check("stuff_L_nonsense.wav", dcp::Channel::LEFT); + guess_check("stuff_nonsense.wav", dcp::Channel::CENTRE); + guess_check("fred_R.wav", dcp::Channel::RIGHT); + guess_check("jim_C_sheila.aiff", dcp::Channel::CENTRE); + guess_check("things_Lfe_and.wav", dcp::Channel::LFE); + guess_check("weeee_Ls.aiff", dcp::Channel::LS); + guess_check("try_Rs-it.wav", dcp::Channel::RS); /* PT-style */ - guess_check ("things_LFE.wav", 3); - guess_check ("ptish_Lsr_abc.wav", 6); - guess_check ("ptish_Rsr_abc.wav", 7); - guess_check ("more_Lss_s.wav", 4); - guess_check ("other_Rss.aiff", 5); + guess_check("things_LFE.wav", dcp::Channel::LFE); + guess_check("ptish_Lsr_abc.wav", dcp::Channel::BSL); + guess_check("ptish_Rsr_abc.wav", dcp::Channel::BSR); + guess_check("more_Lss_s.wav", dcp::Channel::LS); + guess_check("other_Rss.aiff", dcp::Channel::RS); /* Only the filename should be taken into account */ - guess_check ("-Lfe-/foo_L.wav", 0); + guess_check("-Lfe-/foo_L.wav", dcp::Channel::LEFT); /* Dolby-style */ - guess_check ("jake-Lrs-good.wav", 6); - guess_check ("elwood-Rrs-good.wav", 7); + guess_check("jake-Lrs-good.wav", dcp::Channel::BSL); + guess_check("elwood-Rrs-good.wav", dcp::Channel::BSR); } diff --git a/test/film_test.cc b/test/film_test.cc index 5ce195637..9949fd7d6 100644 --- a/test/film_test.cc +++ b/test/film_test.cc @@ -86,3 +86,24 @@ BOOST_AUTO_TEST_CASE(film_possible_reel_types_test2) BOOST_CHECK_EQUAL(film->possible_reel_types().size(), 2U); } + +BOOST_AUTO_TEST_CASE(film_copy_remembered_assets_test) +{ + dcp::filesystem::remove_all("build/test/film_copy_remembered_assets_test2"); + + auto content = content_factory("test/data/flat_red.png")[0]; + auto film = new_test_film("film_copy_remembered_assets_test", { content }); + make_and_verify_dcp(film); + + auto copy = make_shared<Film>(boost::filesystem::path("build/test/film_copy_remembered_assets_test2")); + copy->copy_from(film, [](float) {}); + + auto remembered = copy->read_remembered_assets(); + BOOST_REQUIRE_EQUAL(remembered.size(), 1U); + auto path = find_asset(remembered, *copy->directory(), dcpomatic::DCPTimePeriod({}, dcpomatic::DCPTime::from_seconds(10)), film->video_identifier()); + BOOST_CHECK(path.has_value()); + + for (auto path: dcp::filesystem::directory_iterator(film->dir("info"))) { + check_file(path.path(), copy->dir("info") / path.path().filename()); + } +} diff --git a/test/memory_util_test.cc b/test/memory_util_test.cc new file mode 100644 index 000000000..43dedb5ce --- /dev/null +++ b/test/memory_util_test.cc @@ -0,0 +1,72 @@ +/* + Copyright (C) 2026 Carl Hetherington <cth@carlh.net> + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>. + +*/ + + +#include "lib/memory_util.h" +#include <boost/test/unit_test.hpp> + + +void check(void* p, int size, uint64_t value) +{ + uint8_t* up = reinterpret_cast<uint8_t*>(p); + for (int i = 0; i < size; ++i) { + BOOST_CHECK_EQUAL(*up++, (value >> (i * 8)) & 0xff); + } +} + + +/** Aligned, multiple of 64 size */ +BOOST_AUTO_TEST_CASE(fill_memory_test1) +{ + int constexpr size = 256; + auto memory = wrapped_av_malloc(size); + BOOST_REQUIRE_EQUAL(reinterpret_cast<uintptr_t>(memory) % 8, 0); + + fill_memory(memory, size, 0x1928374654abdfea); + check(memory, size, 0x1928374654abdfea); +} + + +/** Aligned, extra bytes at the end */ +BOOST_AUTO_TEST_CASE(fill_memory_test2) +{ + int constexpr size = 259; + + auto memory = wrapped_av_malloc(size); + BOOST_REQUIRE_EQUAL(reinterpret_cast<uintptr_t>(memory) % 8, 0); + + fill_memory(memory, size, 0x1928374654abdfea); + check(memory, size, 0x1928374654abdfea); +} + + +/** Non-aligned, extra bytes at start and end */ +BOOST_AUTO_TEST_CASE(fill_memory_test3) +{ + int constexpr size = 265; + + auto memory = wrapped_av_malloc(size + 512); + BOOST_REQUIRE_EQUAL(reinterpret_cast<uintptr_t>(memory) % 8, 0); + memory = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(memory) + 3); + + fill_memory(memory, size, 0x1928374654abdfea); + check(memory, size, 0x1928374654abdfea); +} + diff --git a/test/vf_test.cc b/test/vf_test.cc index 9c7ff65be..29b9913fd 100644 --- a/test/vf_test.cc +++ b/test/vf_test.cc @@ -592,3 +592,99 @@ BOOST_AUTO_TEST_CASE(vf_subs_get_font_from_ov) auto vf_font = find_file(*font_dir, "font"); check_file("test/data/Inconsolata-VF.ttf", vf_font); } + + +/** CCAPs in OVs would not correctly be referred to as we'd incorrectly create an + * empty filler CCAP asset. + */ +BOOST_AUTO_TEST_CASE(vf_referring_to_ov_ccap_test) +{ + auto picture = content_factory("test/data/flat_red.png")[0]; + auto ccap = content_factory("test/data/short.srt")[0]; + auto ov = new_test_film("vf_referring_to_ov_ccap_test_ov", { picture, ccap }); + ccap->only_text()->set_use(true); + ccap->only_text()->set_type(TextType::CLOSED_CAPTION); + ccap->only_text()->set_dcp_track(DCPTextTrack("First track", dcp::LanguageTag("fr"))); + make_and_verify_dcp(ov, { dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }); + + auto ov_dcp = make_shared<DCPContent>(ov->dir(ov->dcp_name())); + auto subs = content_factory("test/data/short.srt")[0]; + auto vf = new_test_film("vf_referring_to_ov_ccap_test_vf", { ov_dcp, subs }); + vf->set_reel_type(ReelType::BY_VIDEO_CONTENT); + ov_dcp->set_reference_video(true); + ov_dcp->set_reference_audio(true); + ov_dcp->set_reference_text(TextType::CLOSED_CAPTION, true); + subs->only_text()->set_use(true); + subs->only_text()->set_type(TextType::OPEN_SUBTITLE); + subs->set_position(vf, dcpomatic::DCPTime()); + vf->write_metadata(); + make_dcp(vf, TranscodeJob::ChangedBehaviour::IGNORE); + BOOST_REQUIRE(!wait_for_jobs()); + + dcp::DCP ov_check(ov->dir(ov->dcp_name())); + ov_check.read(); + dcp::DCP vf_check(vf->dir(vf->dcp_name())); + vf_check.read(); + + BOOST_REQUIRE_EQUAL(ov_check.cpls().size(), 1U); + BOOST_REQUIRE_EQUAL(vf_check.cpls().size(), 1U); + BOOST_REQUIRE_EQUAL(ov_check.cpls()[0]->reels().size(), 1U); + BOOST_REQUIRE_EQUAL(vf_check.cpls()[0]->reels().size(), 1U); + BOOST_REQUIRE_EQUAL(ov_check.cpls()[0]->reels()[0]->closed_captions().size(), 1U); + BOOST_REQUIRE_EQUAL(vf_check.cpls()[0]->reels()[0]->closed_captions().size(), 1U); + + BOOST_CHECK_EQUAL( + ov_check.cpls()[0]->reels()[0]->closed_captions()[0]->id(), + vf_check.cpls()[0]->reels()[0]->closed_captions()[0]->id() + ); +} + + +/** Check that in a VF we can have a CCAP reel which refers to the OV and another + * which is an auto-created filler. + */ +BOOST_AUTO_TEST_CASE(ccaps_can_be_referred_and_filled_test) +{ + auto picture = content_factory("test/data/flat_red.png")[0]; + auto ccap = content_factory("test/data/short.srt")[0]; + auto ov = new_test_film("ccaps_can_be_referred_and_filled_test_ov", { picture, ccap }); + ccap->only_text()->set_use(true); + ccap->only_text()->set_type(TextType::CLOSED_CAPTION); + ccap->only_text()->set_dcp_track(DCPTextTrack("First track", dcp::LanguageTag("fr"))); + make_and_verify_dcp(ov, { dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME }); + + auto ov_dcp = make_shared<DCPContent>(ov->dir(ov->dcp_name())); + auto subs = content_factory("test/data/short.srt")[0]; + auto vf = new_test_film("ccaps_can_be_referred_and_filled_test_vf", { ov_dcp, subs, picture }); + vf->set_reel_type(ReelType::BY_VIDEO_CONTENT); + ov_dcp->set_reference_video(true); + ov_dcp->set_reference_audio(true); + ov_dcp->set_reference_text(TextType::CLOSED_CAPTION, true); + subs->only_text()->set_use(true); + subs->only_text()->set_type(TextType::OPEN_SUBTITLE); + subs->set_position(vf, dcpomatic::DCPTime()); + vf->write_metadata(); + make_dcp(vf, TranscodeJob::ChangedBehaviour::IGNORE); + BOOST_REQUIRE(!wait_for_jobs()); + + dcp::DCP ov_check(ov->dir(ov->dcp_name())); + ov_check.read(); + dcp::DCP vf_check(vf->dir(vf->dcp_name())); + vf_check.read(); + + BOOST_REQUIRE_EQUAL(ov_check.cpls().size(), 1U); + BOOST_REQUIRE_EQUAL(vf_check.cpls().size(), 1U); + BOOST_REQUIRE_EQUAL(ov_check.cpls()[0]->reels().size(), 1U); + BOOST_REQUIRE_EQUAL(vf_check.cpls()[0]->reels().size(), 2U); + + BOOST_REQUIRE_EQUAL(ov_check.cpls()[0]->reels()[0]->closed_captions().size(), 1U); + BOOST_REQUIRE_EQUAL(vf_check.cpls()[0]->reels()[0]->closed_captions().size(), 1U); + + BOOST_CHECK_EQUAL( + ov_check.cpls()[0]->reels()[0]->closed_captions()[0]->id(), + vf_check.cpls()[0]->reels()[0]->closed_captions()[0]->id() + ); + + BOOST_REQUIRE_EQUAL(vf_check.cpls()[0]->reels()[1]->closed_captions().size(), 1U); +} + diff --git a/test/wscript b/test/wscript index 341c407e7..3c8e2229a 100644 --- a/test/wscript +++ b/test/wscript @@ -136,6 +136,7 @@ def build(bld): markers_test.cc map_cli_test.cc mca_subdescriptors_test.cc + memory_util_test.cc mpeg2_dcp_test.cc no_use_video_test.cc open_caption_test.cc @@ -766,6 +766,7 @@ def build(bld): bld.recurse('src') bld.recurse('graphics') bld.recurse('web') + bld.recurse('benchmark') if not bld.env.DISABLE_TESTS: bld.recurse('test') |
