diff -Nru bombono-dvd-0.5.2/debian/bombono-dvd.1 bombono-dvd-0.6.0/debian/bombono-dvd.1 --- bombono-dvd-0.5.2/debian/bombono-dvd.1 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/debian/bombono-dvd.1 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,17 @@ +.\" Doc: http://www.kernel.org/doc/man-pages/online/pages/man7/man-pages.7.html +.\" +.\" First parameter, NAME, should be all caps +.TH "BOMBONO DVD" 1 "30 October 2009" +.SH NAME +bombono-dvd \- DVD authoring program with nice and clean GUI + +.SH SYNOPSIS +.B bombono-dvd + +.SH DESCRIPTION +See http://www.bombono.org +.SH "SEE ALSO" +\fBmpeg2demux\fP(1) + +.SH AUTHOR +Bombono DVD was written by Ilya Murav'jov . diff -Nru bombono-dvd-0.5.2/debian/changelog bombono-dvd-0.6.0/debian/changelog --- bombono-dvd-0.5.2/debian/changelog 2010-04-16 13:12:45.000000000 +0100 +++ bombono-dvd-0.6.0/debian/changelog 2010-04-16 13:12:46.000000000 +0100 @@ -1,20 +1,32 @@ -bombono-dvd (0.5.2-1~ppa1~jaunty1) jaunty; urgency=low +bombono-dvd (0.6.0-1ppa1~jaunty1) jaunty; urgency=low - * Distro switch + * PPA update - -- Ilya Murav'jov Mon, 28 Sep 2009 13:43:47 +0400 + -- Ilya Murav'jov Fri, 16 Apr 2010 16:02:07 +0400 -bombono-dvd (0.5.2-1~ppa1~intrepid1) intrepid; urgency=low +bombono-dvd (0.6.0-1) karmic; urgency=low - * Distro switch + * New upstream release. - -- Ilya Murav'jov Mon, 28 Sep 2009 13:32:51 +0400 + -- Ilya Murav'jov Fri, 16 Apr 2010 02:39:07 +0400 -bombono-dvd (0.5.2-1~ppa1~hardy1) hardy; urgency=low +bombono-dvd (0.5.10-1) karmic; urgency=low - * PPA update + * New upstream release. + + -- Ilya Murav'jov Tue, 06 Apr 2010 18:09:25 +0400 + +bombono-dvd (0.5.9-1) karmic; urgency=low + + * New upstream release. + + -- Ilya Murav'jov Fri, 02 Apr 2010 22:04:34 +0400 + +bombono-dvd (0.5.5-1) karmic; urgency=low + + * New upstream release. - -- Ilya Murav'jov Mon, 28 Sep 2009 12:31:52 +0400 + -- Ilya Murav'jov Wed, 03 Mar 2010 12:20:32 +0300 bombono-dvd (0.5.2-1) unstable; urgency=low diff -Nru bombono-dvd-0.5.2/debian/control bombono-dvd-0.6.0/debian/control --- bombono-dvd-0.5.2/debian/control 2010-04-16 13:12:45.000000000 +0100 +++ bombono-dvd-0.6.0/debian/control 2010-04-16 13:12:46.000000000 +0100 @@ -4,17 +4,17 @@ Maintainer: Ilya Murav'jov Build-Depends: cdbs, debhelper (>= 4.1.0), scons, libdvdread-dev, libgtkmm-2.4-dev, libxml++2.6-dev, libmjpegtools-dev, libgraphicsmagick++1-dev Homepage: http://www.bombono.org -Standards-Version: 3.6.2 +Standards-Version: 3.7.3 Package: bombono-dvd Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, dvdauthor, mjpegtools, dvd+rw-tools, scons, toolame +Depends: ${shlibs:Depends}, ${misc:Depends}, dvdauthor, mjpegtools, dvd+rw-tools, scons, twolame Suggests: totem Description: DVD authoring program with nice and clean GUI Bombono DVD is easy to use program for making DVD-Video. The main features of Bombono DVD are: - * excellent MPEG viewer: Timeline and Monitor - * real WYSIWYG Menu Editor with live thumbnails - * comfortable Drag-N-Drop support - * you can author to folder, make ISO-image or burn directly to DVD - * reauthoring: you can import video from DVD discs. + * Excellent MPEG viewer: Timeline and Monitor + * Real WYSIWYG Menu Editor with live thumbnails + * Comfortable Drag-N-Drop support + * You can author to folder, make ISO-image or burn directly to DVD + * Reauthoring: you can import video from DVD discs. diff -Nru bombono-dvd-0.5.2/debian/mpeg2demux.1 bombono-dvd-0.6.0/debian/mpeg2demux.1 --- bombono-dvd-0.5.2/debian/mpeg2demux.1 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/debian/mpeg2demux.1 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,24 @@ +.\" First parameter, NAME, should be all caps +.TH "MPEG2DEMUX" 1 "30 October 2009" + +.SH NAME +mpeg2demux \- demuxer for MPEG2 and VOB files. +.SH SYNOPSIS +.B mpeg2demux +.IR src-file +.IR dst-file-w/o-extension + +.SH DESCRIPTION +Demux video from src-file(.mpg, .vob). If +.IR src-file +has .vob extension then ac3/dts/lpcm audios are to be pulled too. +.PP +If there is a lpcm audio in +.IR src-file +it will have info for mplex muxer in its name, how to mux with -L option. + +.SH "SEE ALSO" +\fBbombono-dvd\fP(1) + +.SH AUTHOR +Ilya Murav'jov diff -Nru bombono-dvd-0.5.2/debian/rules bombono-dvd-0.6.0/debian/rules --- bombono-dvd-0.5.2/debian/rules 2009-09-10 14:31:41.000000000 +0100 +++ bombono-dvd-0.6.0/debian/rules 2010-04-16 12:53:55.000000000 +0100 @@ -19,12 +19,14 @@ BUILD_FLAGS += TEST=1 endif +DEB_INSTALL_MANPAGES_bombono-dvd := debian/bombono-dvd.1 debian/mpeg2demux.1 + build/bombono-dvd:: # :KLUDGE: -Wno-extra due to boost warnings scons -k $(BUILD_FLAGS) CFLAGS='-Wno-extra' PREFIX=/usr DESTDIR=$(CURDIR)/debian/bombono-dvd cleanbuilddir/bombono-dvd:: - rm -rf build config.opts + rm -rf build config.opts tools/scripts/*.pyc install/bombono-dvd:: scons install diff -Nru bombono-dvd-0.5.2/docs/Atom.planner bombono-dvd-0.6.0/docs/Atom.planner --- bombono-dvd-0.5.2/docs/Atom.planner 2009-07-27 21:01:12.000000000 +0100 +++ bombono-dvd-0.6.0/docs/Atom.planner 2010-04-16 12:53:55.000000000 +0100 @@ -20,63 +20,80 @@ - + - - + + - + + + + + + + + + + + + + + + + + + + - - + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - + diff -Nru bombono-dvd-0.5.2/docs/COPYING.LIB bombono-dvd-0.6.0/docs/COPYING.LIB --- bombono-dvd-0.5.2/docs/COPYING.LIB 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/docs/COPYING.LIB 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,482 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307 USA. + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff -Nru bombono-dvd-0.5.2/docs/Python-License.txt bombono-dvd-0.6.0/docs/Python-License.txt --- bombono-dvd-0.5.2/docs/Python-License.txt 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/docs/Python-License.txt 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,278 @@ +A. HISTORY OF THE SOFTWARE +========================== + +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. + +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. + +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations (now Zope +Corporation, see http://www.zope.com). In 2001, the Python Software +Foundation (PSF, see http://www.python.org/psf/) was formed, a +non-profit organization created specifically to own Python-related +Intellectual Property. Zope Corporation is a sponsoring member of +the PSF. + +All Python releases are Open Source (see http://www.opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. + + Release Derived Year Owner GPL- + from compatible? (1) + + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI yes (2) + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.2 2.1.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2.1 2.2 2002 PSF yes + 2.2.2 2.2.1 2002 PSF yes + 2.2.3 2.2.2 2003 PSF yes + 2.3 2.2.2 2002-2003 PSF yes + 2.3.1 2.3 2002-2003 PSF yes + 2.3.2 2.3.1 2002-2003 PSF yes + 2.3.3 2.3.2 2002-2003 PSF yes + 2.3.4 2.3.3 2004 PSF yes + 2.3.5 2.3.4 2005 PSF yes + 2.4 2.3 2004 PSF yes + 2.4.1 2.4 2005 PSF yes + 2.4.2 2.4.1 2005 PSF yes + 2.4.3 2.4.2 2006 PSF yes + 2.4.4 2.4.3 2006 PSF yes + 2.5 2.4 2006 PSF yes + 2.5.1 2.5 2007 PSF yes + 2.5.2 2.5.1 2008 PSF yes + 2.5.3 2.5.2 2008 PSF yes + 2.6 2.5 2008 PSF yes + 2.6.1 2.6 2008 PSF yes + 2.6.2 2.6.1 2009 PSF yes + 2.6.3 2.6.2 2009 PSF yes + 2.6.4 2.6.3 2009 PSF yes + 2.6.5 2.6.4 2010 PSF yes + +Footnotes: + +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. + +(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, + because its license has a choice of law clause. According to + CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 + is "not incompatible" with the GPL. + +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. + + +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +Python Software Foundation; All Rights Reserved" are retained in Python alone or +in any derivative version prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. + +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- + +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the Internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the Internet +using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + + ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- + +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff -Nru bombono-dvd-0.5.2/.gitignore bombono-dvd-0.6.0/.gitignore --- bombono-dvd-0.5.2/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/.gitignore 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,10 @@ +# After changing: 'git ls-files -i --exclude-standard' should be empty. + +*.vpwhistu +*.vtg +*.pyc + +build/ +config.opts + + diff -Nru bombono-dvd-0.5.2/libs/boost-lib/boost/format/alt_sstream.hpp bombono-dvd-0.6.0/libs/boost-lib/boost/format/alt_sstream.hpp --- bombono-dvd-0.5.2/libs/boost-lib/boost/format/alt_sstream.hpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/boost/format/alt_sstream.hpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,176 @@ +// ---------------------------------------------------------------------------- +// alt_sstream.hpp : alternative stringstream +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/format for library home page + +// ---------------------------------------------------------------------------- + + + +#ifndef BOOST_SK_ALT_SSTREAM_HPP +#define BOOST_SK_ALT_SSTREAM_HPP + +#include +#include +#include +#include +#include + +namespace boost { + namespace io { + + template, + class Alloc=::std::allocator > + class basic_altstringbuf; + + template, + class Alloc=::std::allocator > + class basic_oaltstringstream; + + + template + class basic_altstringbuf + : public ::std::basic_streambuf + { + typedef ::std::basic_streambuf streambuf_t; + typedef typename CompatAlloc::compatible_type compat_allocator_type; + typedef typename CompatTraits::compatible_type compat_traits_type; + public: + typedef Ch char_type; + typedef Tr traits_type; + typedef typename compat_traits_type::int_type int_type; + typedef typename compat_traits_type::pos_type pos_type; + typedef typename compat_traits_type::off_type off_type; + typedef Alloc allocator_type; + typedef ::std::basic_string string_type; + typedef typename string_type::size_type size_type; + + typedef ::std::streamsize streamsize; + + + explicit basic_altstringbuf(std::ios_base::openmode mode + = std::ios_base::in | std::ios_base::out) + : putend_(NULL), is_allocated_(false), mode_(mode) + {} + explicit basic_altstringbuf(const string_type& s, + ::std::ios_base::openmode mode + = ::std::ios_base::in | ::std::ios_base::out) + : putend_(NULL), is_allocated_(false), mode_(mode) + { dealloc(); str(s); } + virtual ~basic_altstringbuf() + { dealloc(); } + using streambuf_t::pbase; + using streambuf_t::pptr; + using streambuf_t::epptr; + using streambuf_t::eback; + using streambuf_t::gptr; + using streambuf_t::egptr; + + void clear_buffer(); + void str(const string_type& s); + + // 0-copy access : + Ch * begin() const; + size_type size() const; + size_type cur_size() const; // stop at current pointer + Ch * pend() const // the highest position reached by pptr() since creation + { return ((putend_ < pptr()) ? pptr() : putend_); } + size_type pcount() const + { return static_cast( pptr() - pbase()) ;} + + // copy buffer to string : + string_type str() const + { return string_type(begin(), size()); } + string_type cur_str() const + { return string_type(begin(), cur_size()); } + protected: + explicit basic_altstringbuf (basic_altstringbuf * s, + ::std::ios_base::openmode mode + = ::std::ios_base::in | ::std::ios_base::out) + : putend_(NULL), is_allocated_(false), mode_(mode) + { dealloc(); str(s); } + + virtual pos_type seekoff(off_type off, ::std::ios_base::seekdir way, + ::std::ios_base::openmode which + = ::std::ios_base::in | ::std::ios_base::out); + virtual pos_type seekpos (pos_type pos, + ::std::ios_base::openmode which + = ::std::ios_base::in | ::std::ios_base::out); + virtual int_type underflow(); + virtual int_type pbackfail(int_type meta = compat_traits_type::eof()); + virtual int_type overflow(int_type meta = compat_traits_type::eof()); + void dealloc(); + private: + enum { alloc_min = 256}; // minimum size of allocations + + Ch *putend_; // remembers (over seeks) the highest value of pptr() + bool is_allocated_; + ::std::ios_base::openmode mode_; + compat_allocator_type alloc_; // the allocator object + }; + + +// --- class basic_oaltstringstream ---------------------------------------- + template + class basic_oaltstringstream + : private base_from_member< shared_ptr< basic_altstringbuf< Ch, Tr, Alloc> > >, + public ::std::basic_ostream + { + class No_Op { + // used as no-op deleter for (not-owner) shared_pointers + public: + template + const T & operator()(const T & arg) { return arg; } + }; + typedef ::std::basic_ostream stream_t; + typedef boost::base_from_member > > + pbase_type; + typedef ::std::basic_string string_type; + typedef typename string_type::size_type size_type; + typedef basic_altstringbuf stringbuf_t; + public: + typedef Alloc allocator_type; + basic_oaltstringstream() + : pbase_type(new stringbuf_t), stream_t(rdbuf()) + { } + basic_oaltstringstream(::boost::shared_ptr buf) + : pbase_type(buf), stream_t(rdbuf()) + { } + basic_oaltstringstream(stringbuf_t * buf) + : pbase_type(buf, No_Op() ), stream_t(rdbuf()) + { } + stringbuf_t * rdbuf() const + { return pbase_type::member.get(); } + void clear_buffer() + { rdbuf()->clear_buffer(); } + + // 0-copy access : + Ch * begin() const + { return rdbuf()->begin(); } + size_type size() const + { return rdbuf()->size(); } + size_type cur_size() const // stops at current position + { return rdbuf()->cur_size(); } + + // copy buffer to string : + string_type str() const // [pbase, epptr[ + { return rdbuf()->str(); } + string_type cur_str() const // [pbase, pptr[ + { return rdbuf()->cur_str(); } + void str(const string_type& s) + { rdbuf()->str(s); } + }; + + } // N.S. io +} // N.S. boost + +#include + +#endif // include guard + diff -Nru bombono-dvd-0.5.2/libs/boost-lib/boost/format/alt_sstream_impl.hpp bombono-dvd-0.6.0/libs/boost-lib/boost/format/alt_sstream_impl.hpp --- bombono-dvd-0.5.2/libs/boost-lib/boost/format/alt_sstream_impl.hpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/boost/format/alt_sstream_impl.hpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,296 @@ +// ---------------------------------------------------------------------------- +// alt_sstream_impl.hpp : alternative stringstream, templates implementation +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/format for library home page + +// ---------------------------------------------------------------------------- + +#ifndef BOOST_SK_ALT_SSTREAM_IMPL_HPP +#define BOOST_SK_ALT_SSTREAM_IMPL_HPP + +namespace boost { + namespace io { +// --- Implementation ------------------------------------------------------// + + template + void basic_altstringbuf:: + clear_buffer () { + const Ch * p = pptr(); + const Ch * b = pbase(); + if(p != NULL && p != b) { + seekpos(0, ::std::ios_base::out); + } + p = gptr(); + b = eback(); + if(p != NULL && p != b) { + seekpos(0, ::std::ios_base::in); + } + } + + template + void basic_altstringbuf:: + str (const string_type& s) { + size_type sz=s.size(); + if(sz != 0 && mode_ & (::std::ios_base::in | ::std::ios_base::out) ) { + Ch *new_ptr = alloc_.allocate(sz, is_allocated_? eback() : 0); + // if this didnt throw, we're safe, update the buffer + dealloc(); + sz = s.copy(new_ptr, sz); + putend_ = new_ptr + sz; + if(mode_ & ::std::ios_base::in) + streambuf_t::setg(new_ptr, new_ptr, new_ptr + sz); + if(mode_ & ::std::ios_base::out) { + streambuf_t::setp(new_ptr, new_ptr + sz); + if(mode_ & (::std::ios_base::app | ::std::ios_base::ate)) + streambuf_t::pbump(static_cast(sz)); + if(gptr() == NULL) + streambuf_t::setg(new_ptr, NULL, new_ptr); + } + is_allocated_ = true; + } + else + dealloc(); + } + template + Ch* basic_altstringbuf:: + begin () const { + if(mode_ & ::std::ios_base::out && pptr() != NULL) + return pbase(); + else if(mode_ & ::std::ios_base::in && gptr() != NULL) + return eback(); + return NULL; + } + + template + typename std::basic_string::size_type + basic_altstringbuf:: + size () const { + if(mode_ & ::std::ios_base::out && pptr()) + return static_cast(pend() - pbase()); + else if(mode_ & ::std::ios_base::in && gptr()) + return static_cast(egptr() - eback()); + else + return 0; + } + + template + typename std::basic_string::size_type + basic_altstringbuf:: + cur_size () const { + if(mode_ & ::std::ios_base::out && pptr()) + return static_cast( pptr() - pbase()); + else if(mode_ & ::std::ios_base::in && gptr()) + return static_cast( gptr() - eback()); + else + return 0; + } + + template + typename basic_altstringbuf::pos_type + basic_altstringbuf:: + seekoff (off_type off, ::std::ios_base::seekdir way, ::std::ios_base::openmode which) { + if(pptr() != NULL && putend_ < pptr()) + putend_ = pptr(); + if(which & ::std::ios_base::in && gptr() != NULL) { + // get area + if(way == ::std::ios_base::end) + off += static_cast(putend_ - gptr()); + else if(way == ::std::ios_base::beg) + off += static_cast(eback() - gptr()); + else if(way != ::std::ios_base::cur || (which & ::std::ios_base::out) ) + // (altering in&out is only supported if way is beg or end, not cur) + return pos_type(off_type(-1)); + if(eback() <= off+gptr() && off+gptr() <= putend_ ) { + // set gptr + streambuf_t::gbump(off); + if(which & ::std::ios_base::out && pptr() != NULL) + // update pptr to match gptr + streambuf_t::pbump(static_cast(gptr()-pptr())); + } + else + off = off_type(-1); + } + else if(which & ::std::ios_base::out && pptr() != NULL) { + // put area + if(way == ::std::ios_base::end) + off += static_cast(putend_ - pptr()); + else if(way == ::std::ios_base::beg) + off += static_cast(pbase() - pptr()); + else if(way != ::std::ios_base::beg) + return pos_type(off_type(-1)); + if(pbase() <= off+pptr() && off+pptr() <= putend_) + // set pptr + streambuf_t::pbump(off); + else + off = off_type(-1); + } + else // neither in nor out + off = off_type(-1); + return (pos_type(off)); + } + //- end seekoff(..) + + + template + typename basic_altstringbuf::pos_type + basic_altstringbuf:: + seekpos (pos_type pos, ::std::ios_base::openmode which) { + off_type off = off_type(pos); // operation guaranteed by 27.4.3.2 table 88 + if(pptr() != NULL && putend_ < pptr()) + putend_ = pptr(); + if(off != off_type(-1)) { + if(which & ::std::ios_base::in && gptr() != NULL) { + // get area + if(0 <= off && off <= putend_ - eback()) { + streambuf_t::gbump(static_cast(eback() - gptr() + off)); + if(which & ::std::ios_base::out && pptr() != NULL) { + // update pptr to match gptr + streambuf_t::pbump(static_cast(gptr()-pptr())); + } + } + else + off = off_type(-1); + } + else if(which & ::std::ios_base::out && pptr() != NULL) { + // put area + if(0 <= off && off <= putend_ - eback()) + streambuf_t::pbump(static_cast(eback() - pptr() + off)); + else + off = off_type(-1); + } + else // neither in nor out + off = off_type(-1); + return (pos_type(off)); + } + else { + BOOST_ASSERT(0); // 27.4.3.2 allows undefined-behaviour here + return pos_type(off_type(-1)); + } + } + // -end seekpos(..) + + + template + typename basic_altstringbuf::int_type + basic_altstringbuf:: + underflow () { + if(gptr() == NULL) // no get area -> nothing to get. + return (compat_traits_type::eof()); + else if(gptr() < egptr()) // ok, in buffer + return (compat_traits_type::to_int_type(*gptr())); + else if(mode_ & ::std::ios_base::in && pptr() != NULL + && (gptr() < pptr() || gptr() < putend_) ) + { // expand get area + if(putend_ < pptr()) + putend_ = pptr(); // remember pptr reached this far + streambuf_t::setg(eback(), gptr(), putend_); + return (compat_traits_type::to_int_type(*gptr())); + } + else // couldnt get anything. EOF. + return (compat_traits_type::eof()); + } + // -end underflow(..) + + + template + typename basic_altstringbuf::int_type + basic_altstringbuf:: + pbackfail (int_type meta) { + if(gptr() != NULL && (eback() < gptr()) + && (mode_ & (::std::ios_base::out) + || compat_traits_type::eq_int_type(compat_traits_type::eof(), meta) + || compat_traits_type::eq(compat_traits_type::to_char_type(meta), gptr()[-1]) ) ) { + streambuf_t::gbump(-1); // back one character + if(!compat_traits_type::eq_int_type(compat_traits_type::eof(), meta)) + // put-back meta into get area + *gptr() = compat_traits_type::to_char_type(meta); + return (compat_traits_type::not_eof(meta)); + } + else + return (compat_traits_type::eof()); // failed putback + } + // -end pbackfail(..) + + + template + typename basic_altstringbuf::int_type + basic_altstringbuf:: + overflow (int_type meta) { + if(compat_traits_type::eq_int_type(compat_traits_type::eof(), meta)) + return compat_traits_type::not_eof(meta); // nothing to do + else if(pptr() != NULL && pptr() < epptr()) { + streambuf_t::sputc(compat_traits_type::to_char_type(meta)); + return meta; + } + else if(! (mode_ & ::std::ios_base::out)) + // no write position, and cant make one + return compat_traits_type::eof(); + else { // make a write position available + std::size_t prev_size = pptr() == NULL ? 0 : epptr() - eback(); + std::size_t new_size = prev_size; + // exponential growth : size *= 1.5 + std::size_t add_size = new_size / 2; + if(add_size < alloc_min) + add_size = alloc_min; + Ch * newptr = NULL, *oldptr = eback(); + + // make sure adding add_size wont overflow size_t + while (0 < add_size && ((std::numeric_limits::max)() + - add_size < new_size) ) + add_size /= 2; + if(0 < add_size) { + new_size += add_size; + newptr = alloc_.allocate(new_size, is_allocated_? oldptr : 0); + } + + if(0 < prev_size) + compat_traits_type::copy(newptr, oldptr, prev_size); + if(is_allocated_) + alloc_.deallocate(oldptr, prev_size); + is_allocated_=true; + + if(prev_size == 0) { // first allocation + putend_ = newptr; + streambuf_t::setp(newptr, newptr + new_size); + if(mode_ & ::std::ios_base::in) + streambuf_t::setg(newptr, newptr, newptr + 1); + else + streambuf_t::setg(newptr, 0, newptr); + } + else { // update pointers + putend_ = putend_ - oldptr + newptr; + int pptr_count = static_cast(pptr()-pbase()); + int gptr_count = static_cast(gptr()-eback()); + streambuf_t::setp(pbase() - oldptr + newptr, newptr + new_size); + streambuf_t::pbump(pptr_count); + if(mode_ & ::std::ios_base::in) + streambuf_t::setg(newptr, newptr + gptr_count, pptr() + 1); + else + streambuf_t::setg(newptr, 0, newptr); + } + streambuf_t::sputc(compat_traits_type::to_char_type(meta)); + return meta; + } + } + // -end overflow(..) + + template + void basic_altstringbuf:: dealloc() { + if(is_allocated_) + alloc_.deallocate(eback(), (pptr() != NULL ? epptr() : egptr()) - eback()); + is_allocated_ = false; + streambuf_t::setg(0, 0, 0); + streambuf_t::setp(0, 0); + putend_ = NULL; + } + + }// N.S. io +} // N.S. boost + +#endif // include guard + diff -Nru bombono-dvd-0.5.2/libs/boost-lib/boost/format/detail/compat_workarounds.hpp bombono-dvd-0.6.0/libs/boost-lib/boost/format/detail/compat_workarounds.hpp --- bombono-dvd-0.5.2/libs/boost-lib/boost/format/detail/compat_workarounds.hpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/boost/format/detail/compat_workarounds.hpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,86 @@ +// ---------------------------------------------------------------------------- +// compat_workarounds : general framework for non-conformance workarounds +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// see http://www.boost.org/libs/format for library home page + +// ---------------------------------------------------------------------------- + + +// this file defines wrapper classes to hide non-conforming +// std::char_traits<> and std::allocator<> traits +// and Includes : config_macros.hpp (defines config macros +// and compiler-specific switches) + +// Non-conformant Std-libs fail to supply conformant traits (std::char_traits, +// std::allocator) and/or the std::string doesnt support them. +// We don't want to have hundreds of #ifdef workarounds, so we define +// replacement traits. +// But both char_traits and allocator traits are visible in the interface, +// (inside the final string type), thus we need to keep both +// the replacement type (typedefed to 'compatible_type') for real use, +// and the original stdlib type (typedef to 'type_for_string') for interface +// visibility. This is what Compat* classes do (as well as be transparent +// when good allocator and char traits are present) + +#ifndef BOOST_FORMAT_COMPAT_WORKAROUNDS_HPP +#define BOOST_FORMAT_COMPAT_WORKAROUNDS_HPP + +namespace boost { + namespace io { + + // gcc-2.95 char traits (non-conformantly named string_char_traits) + // lack several functions so we extend them in a replacement class. + template + class CompatTraits; + + // std::allocator in gcc-2.95 is ok, but basic_string only works + // with plain 'std::alloc' still, alt_stringbuf requires a functionnal + // alloc template argument, so we need a replacement allocator + template + class CompatAlloc; + } // N.S. io +}// N.S. boost + + +#include + // sets-up macros and load compiler-specific workarounds headers. + +#if !defined(BOOST_FORMAT_STREAMBUF_DEFINED) +// workarounds-gcc-2.95 might have defined own streambuf +#include +#endif + +#if !defined(BOOST_FORMAT_OSTREAM_DEFINED) +// workarounds-gcc-2.95 might already have included +#include +#endif + + + +namespace boost { + namespace io { + + // **** CompatTraits general definitions : ---------------------------- + template + class CompatTraits + { // general case : be transparent + public: + typedef Tr compatible_type; + }; + + // **** CompatAlloc general definitions : ----------------------------- + template + class CompatAlloc + { // general case : be transparent + public: + typedef Alloc compatible_type; + }; + + } //N.S. io +} // N.S. boost +#endif // include guard diff -Nru bombono-dvd-0.5.2/libs/boost-lib/boost/format/detail/config_macros.hpp bombono-dvd-0.6.0/libs/boost-lib/boost/format/detail/config_macros.hpp --- bombono-dvd-0.5.2/libs/boost-lib/boost/format/detail/config_macros.hpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/boost/format/detail/config_macros.hpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,97 @@ +// -*- C++ -*- +// ---------------------------------------------------------------------------- +// config_macros.hpp : configuration macros for the format library +// only BOOST_IO_STD is absolutely needed (it should be 'std::' in general) +// others are compiler-specific workaround macros used in #ifdef switches +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// see http://www.boost.org/libs/format for library home page + + +// ---------------------------------------------------------------------------- + +#ifndef BOOST_FORMAT_CONFIG_MACROS_HPP +#define BOOST_FORMAT_CONFIG_MACROS_HPP + +#include +#include + +// make sure our local macros wont override something : +#if defined(BOOST_NO_LOCALE_ISDIGIT) || defined(BOOST_OVERLOAD_FOR_NON_CONST) \ + || defined(BOOST_IO_STD) || defined( BOOST_IO_NEEDS_USING_DECLARATION ) \ + || defined(BOOST_NO_TEMPLATE_STD_STREAM) \ + || defined(BOOST_FORMAT_STREAMBUF_DEFINED) || defined(BOOST_FORMAT_OSTREAM_DEFINED) +#error "boost::format uses a local macro that is already defined." +#endif + +// specific workarounds. each header can define BOOS_IO_STD if it +// needs. (e.g. because of IO_NEEDS_USING_DECLARATION) +#include +#include + +#ifndef BOOST_IO_STD +# define BOOST_IO_STD ::std:: +#endif + +#if defined(BOOST_NO_STD_LOCALE) || \ + ( BOOST_WORKAROUND(__BORLANDC__, <= 0x564) \ + || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT( 0x570 ) ) ) +// some future __BORLANDC__ >0x564 versions might not need this +// 0x570 is Borland's kylix branch +#define BOOST_NO_LOCALE_ISDIGIT +#endif + +#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570) ) || BOOST_WORKAROUND( BOOST_MSVC, BOOST_TESTED_AT(1300)) +#define BOOST_NO_OVERLOAD_FOR_NON_CONST +#endif + +// gcc-2.95's native stringstream is not usable +#if BOOST_WORKAROUND(__GNUC__, < 3) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) +#define BOOST_FORMAT_IGNORE_STRINGSTREAM +#endif + + +// **** Workaround for io streams, stlport and msvc. +#ifdef BOOST_IO_NEEDS_USING_DECLARATION +namespace boost { + using std::char_traits; + using std::basic_ostream; + namespace io { + using std::basic_ostream; + namespace detail { + using std::basic_ios; + using std::basic_ostream; + } + } +#if ! defined(BOOST_NO_STD_LOCALE) + using std::locale; + namespace io { + using std::locale; + namespace detail { + using std::locale; + } + } +#endif // locale +} + // -end N.S. boost +#endif // needs_using_declaration + + +// *** hide std::locale if it doesnt exist. +// this typedef is either std::locale or int, avoids placing ifdefs everywhere +namespace boost { namespace io { namespace detail { +#if ! defined(BOOST_NO_STD_LOCALE) + typedef BOOST_IO_STD locale locale_t; +#else + typedef int locale_t; +#endif +} } } + + +// ---------------------------------------------------------------------------- + +#endif // BOOST_FORMAT_MACROS_DEFAULT_HPP diff -Nru bombono-dvd-0.5.2/libs/boost-lib/boost/format/detail/msvc_disambiguater.hpp bombono-dvd-0.6.0/libs/boost-lib/boost/format/detail/msvc_disambiguater.hpp --- bombono-dvd-0.5.2/libs/boost-lib/boost/format/detail/msvc_disambiguater.hpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/boost/format/detail/msvc_disambiguater.hpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,56 @@ +// ---------------------------------------------------------------------------- +// msvc_disambiguater.hpp : msvc workarounds. (for put_{head|last} overloads) +// the trick was described in boost's list by Aleksey Gurtovoy +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// see http://www.boost.org/libs/format for library home page + +// ---------------------------------------------------------------------------- + +#ifndef BOOST_MSVC_DISAMBIGUATER_HPP +#define BOOST_MSVC_DISAMBIGUATER_HPP + +#if BOOST_WORKAROUND( BOOST_MSVC, <= 1300) || \ + BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042)) + // this whole header is specifically for msvc up to 7.0 + +#include +#include + +namespace boost { +namespace io { +namespace detail { + +template< class Ch, class Tr, class T > +struct disambiguater +{ + template< typename U > + static void put_head(BOOST_IO_STD basic_ostream& os, group1 const& x, long) + { + os << group_head(x.a1_); + } + static void put_head(BOOST_IO_STD basic_ostream& os, T const& x, int) + { + } + template< typename U > + static void put_last(BOOST_IO_STD basic_ostream& os, group1 const& x, long) + { + os << group_last(x.a1_); + } + static void put_last(BOOST_IO_STD basic_ostream& os, T const& x, int) + { + os << x; + } +}; + +} // namespace detail +} // namespace io +} // namespace boost + +#endif // -BOOST_MSVC + +#endif // -BOOST_MSVC_DISAMBIGUATER_HPP diff -Nru bombono-dvd-0.5.2/libs/boost-lib/boost/format/detail/unset_macros.hpp bombono-dvd-0.6.0/libs/boost-lib/boost/format/detail/unset_macros.hpp --- bombono-dvd-0.5.2/libs/boost-lib/boost/format/detail/unset_macros.hpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/boost/format/detail/unset_macros.hpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,34 @@ +// ---------------------------------------------------------------------------- +// unset_macros.hpp +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/format for library home page + +// ---------------------------------------------------------------------------- + +// *** Undefine 'local' macros : +#ifdef BOOST_NO_OVERLOAD_FOR_NON_CONST +#undef BOOST_NO_OVERLOAD_FOR_NON_CONST +#endif +#ifdef BOOST_NO_LOCALE_ISDIGIT +#undef BOOST_NO_LOCALE_ISDIGIT +#endif +#ifdef BOOST_IO_STD +#undef BOOST_IO_STD +#endif +#ifdef BOOST_IO_NEEDS_USING_DECLARATION +#undef BOOST_IO_NEEDS_USING_DECLARATION +#endif +#ifdef BOOST_NO_TEMPLATE_STD_STREAM +#undef BOOST_NO_TEMPLATE_STD_STREAM +#endif +#ifdef BOOST_FORMAT_STREAMBUF_DEFINED +#undef BOOST_FORMAT_STREAMBUF_DEFINED +#endif +#ifdef BOOST_FORMAT_OSTREAM_DEFINED +#undef BOOST_FORMAT_OSTREAM_DEFINED +#endif diff -Nru bombono-dvd-0.5.2/libs/boost-lib/boost/format/detail/workarounds_gcc-2_95.hpp bombono-dvd-0.6.0/libs/boost-lib/boost/format/detail/workarounds_gcc-2_95.hpp --- bombono-dvd-0.5.2/libs/boost-lib/boost/format/detail/workarounds_gcc-2_95.hpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/boost/format/detail/workarounds_gcc-2_95.hpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,162 @@ +// ---------------------------------------------------------------------------- +// workarounds for gcc < 3.0. +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/format for library home page + + +// ---------------------------------------------------------------------------- + +// There's a lot to do, the stdlib shipped with gcc prior to 3.x +// was terribly non-conforming. +// . defines macros switches +// . supplies template classes basic_foo where gcc only supplies foo. +// i.e : +// - basic_ios from ios +// - basic_ostream from ostream +// - basic_srteambuf from streambuf +// these can be used transparently. (it obviously does not work for wchar_t) +// . specialise CompatAlloc and CompatTraits to wrap gcc-2.95's +// string_char_traits and std::alloc + +#if BOOST_WORKAROUND(__GNUC__, < 3) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) + // only for gcc-2.95's native stdlib + +#ifndef BOOST_FORMAT_WORKAROUNDS_GCC295_H +#define BOOST_FORMAT_WORKAROUNDS_GCC295_H + +// SGI STL doesnt have and others, so we need iostream. +#include +#define BOOST_FORMAT_OSTREAM_DEFINED + +#include +#define BOOST_FORMAT_STREAMBUF_DEFINED + +#define BOOST_NO_TEMPLATE_STD_STREAM + +#ifndef BOOST_IO_STD +# define BOOST_IO_STD std:: +#endif + + + +// *** +// gcc's simple classes turned into standard-like template classes : + +namespace std { + + + // gcc has string_char_traits, it's incomplete. + // we declare a std::char_traits, and specialize CompatTraits<..> on it + // to do what is required + template + class char_traits; // no definition here, we will just use it as a tag. + + template + class basic_streambuf; + + template + class basic_streambuf : public streambuf { + }; + + template > + class basic_ios; + + template + class basic_ios : public ostream { + public: + basic_ios(streambuf * p) : ostream(p) {}; + char fill() const { return ios::fill(); } // gcc returns wchar.. + char fill(char c) { return ios::fill(c); } // gcc takes wchar.. + char widen(char c) { return c; } + char narrow(char c, char def) { return c; } + basic_ios& copyfmt(const ios& right) { + fill(right.fill()); + flags(right.flags() ); + exceptions(right.exceptions()); + width(right.width()); + precision(right.precision()); + return *this; + } + }; + + + typedef ios ios_base; + + template + class basic_ostream; + + template + class basic_ostream : public basic_ios + { + public: + basic_ostream(streambuf * p) : basic_ios (p) {} + }; + +} // namespace std + + +namespace boost { + namespace io { + + + // ** CompatTraits gcc2.95 specialisations ---------------------------- + template + class CompatTraits< ::std::string_char_traits > + : public ::std::string_char_traits + { + public: + typedef CompatTraits compatible_type; + + typedef Ch char_type; + typedef int int_type; + typedef ::std::streampos pos_type; + typedef ::std::streamoff off_type; + + static char_type + to_char_type(const int_type& meta) { + return static_cast(meta); } + static int_type + to_int_type(const char_type& ch) { + return static_cast(static_cast(ch) );} + static bool + eq_int_type(const int_type& left, const int_type& right) { + return left == right; } + static int_type + eof() { + return static_cast(EOF); + } + static int_type + not_eof(const int_type& meta) { + return (meta == eof()) ? 0 : meta; + } + }; + + template + class CompatTraits< ::std::char_traits > { + public: + typedef CompatTraits< ::std::string_char_traits > compatible_type; + }; + + // ** CompatAlloc gcc-2.95 specialisations --------------------------- + template<> + class CompatAlloc< ::std::alloc> + { + public: + typedef ::std::allocator compatible_type; + }; + + } // N.S. io +} // N.S. boost + + + + + +#endif // include guard + +#endif // if workaround diff -Nru bombono-dvd-0.5.2/libs/boost-lib/boost/format/detail/workarounds_stlport.hpp bombono-dvd-0.6.0/libs/boost-lib/boost/format/detail/workarounds_stlport.hpp --- bombono-dvd-0.5.2/libs/boost-lib/boost/format/detail/workarounds_stlport.hpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/boost/format/detail/workarounds_stlport.hpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,42 @@ +// ---------------------------------------------------------------------------- +// workarounds_stlport.hpp : workaround STLport issues +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// see http://www.boost.org/libs/format for library home page + +// ---------------------------------------------------------------------------- + +#ifndef BOOST_MACROS_STLPORT_HPP +#define BOOST_MACROS_STLPORT_HPP + +#if defined(_STLPORT_VERSION) && BOOST_WORKAROUND( BOOST_MSVC, <= 1300) +// msvc-6-stlport fails to find basic_string::append( iterator, iterator) when linking +// might affect other MSwindows compilers +#define BOOST_NO_STRING_APPEND +#endif + +// *** This should go to "boost/config/stdlib/stlport.hpp". + +// If the streams are not native and there are problems with using templates +// accross namespaces, we define some macros to enable a workaround for this. + +// STLport 4.5 +#if !defined(_STLP_OWN_IOSTREAMS) && defined(_STLP_USE_NAMESPACES) && defined(BOOST_NO_USING_TEMPLATE) +# define BOOST_IO_STD +# define BOOST_IO_NEEDS_USING_DECLARATION +#endif + +// STLport 4.0 +#if !defined(__SGI_STL_OWN_IOSTREAMS) && defined(__STL_USE_OWN_NAMESPACE) && defined(BOOST_NO_USING_TEMPLATE) +# define BOOST_IO_STD +# define BOOST_IO_NEEDS_USING_DECLARATION +#endif + + +// ---------------------------------------------------------------------------- + +#endif // BOOST_MACROS_STLPORT_HPP diff -Nru bombono-dvd-0.5.2/libs/boost-lib/boost/format/exceptions.hpp bombono-dvd-0.6.0/libs/boost-lib/boost/format/exceptions.hpp --- bombono-dvd-0.5.2/libs/boost-lib/boost/format/exceptions.hpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/boost/format/exceptions.hpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,100 @@ +// ---------------------------------------------------------------------------- +// boost/format/exceptions.hpp +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/format for library home page + +// ---------------------------------------------------------------------------- + +#ifndef BOOST_FORMAT_EXCEPTIONS_HPP +#define BOOST_FORMAT_EXCEPTIONS_HPP + + +#include + + +namespace boost { + + namespace io { + +// **** exceptions ----------------------------------------------- + + class format_error : public std::exception + { + public: + format_error() {} + virtual const char *what() const throw() { + return "boost::format_error: " + "format generic failure"; + } + }; + + class bad_format_string : public format_error + { + std::size_t pos_, next_; + public: + bad_format_string(std::size_t pos, std::size_t size) + : pos_(pos), next_(size) {} + std::size_t get_pos() const { return pos_; } + std::size_t get_next() const { return next_; } + virtual const char *what() const throw() { + return "boost::bad_format_string: format-string is ill-formed"; + } + }; + + class too_few_args : public format_error + { + std::size_t cur_, expected_; + public: + too_few_args(std::size_t cur, std::size_t expected) + : cur_(cur), expected_(expected) {} + std::size_t get_cur() const { return cur_; } + std::size_t get_expected() const { return expected_; } + virtual const char *what() const throw() { + return "boost::too_few_args: " + "format-string refered to more arguments than were passed"; + } + }; + + class too_many_args : public format_error + { + std::size_t cur_, expected_; + public: + too_many_args(std::size_t cur, std::size_t expected) + : cur_(cur), expected_(expected) {} + std::size_t get_cur() const { return cur_; } + std::size_t get_expected() const { return expected_; } + virtual const char *what() const throw() { + return "boost::too_many_args: " + "format-string refered to less arguments than were passed"; + } + }; + + + class out_of_range : public format_error + { + int index_, beg_, end_; // range is [ beg, end [ + public: + out_of_range(int index, int beg, int end) + : index_(index), beg_(beg), end_(end) {} + int get_index() const { return index_; } + int get_beg() const { return beg_; } + int get_end() const { return end_; } + virtual const char *what() const throw() { + return "boost::out_of_range: " + "tried to refer to an argument (or item) number which" + " is out of range, according to the format string."; + } + }; + + + } // namespace io + +} // namespace boost + + +#endif // BOOST_FORMAT_EXCEPTIONS_HPP diff -Nru bombono-dvd-0.5.2/libs/boost-lib/boost/format/feed_args.hpp bombono-dvd-0.6.0/libs/boost-lib/boost/format/feed_args.hpp --- bombono-dvd-0.5.2/libs/boost-lib/boost/format/feed_args.hpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/boost/format/feed_args.hpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,265 @@ +// ---------------------------------------------------------------------------- +// feed_args.hpp : functions for processing each argument +// (feed, feed_manip, and distribute) +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/format for library home page + +// ---------------------------------------------------------------------------- + +#ifndef BOOST_FORMAT_FEED_ARGS_HPP +#define BOOST_FORMAT_FEED_ARGS_HPP + +#include +#include +#include + +#include +#include +#include + +namespace boost { +namespace io { +namespace detail { + + template + void mk_str( std::basic_string & res, + const Ch * beg, + typename std::basic_string::size_type size, + std::streamsize w, + const Ch fill_char, + std::ios_base::fmtflags f, + const Ch prefix_space, // 0 if no space-padding + bool center) + // applies centered/left/right padding to the string [beg, beg+size[ + // Effects : the result is placed in res. + { + typedef typename std::basic_string::size_type size_type; + res.resize(0); + if(w<=0 || static_cast(w) <=size) { + // no need to pad. + res.reserve(size + !!prefix_space); + if(prefix_space) + res.append(1, prefix_space); + res.append(beg, size); + } + else { + std::streamsize n=static_cast(w-size-!!prefix_space); + std::streamsize n_after = 0, n_before = 0; + res.reserve(w); // allocate once for the 2 inserts + if(center) + n_after = n/2, n_before = n - n_after; + else + if(f & std::ios_base::left) + n_after = n; + else + n_before = n; + // now make the res string : + if(n_before) res.append(n_before, fill_char); + if(prefix_space) + res.append(1, prefix_space); + res.append(beg, size); + if(n_after) res.append(n_after, fill_char); + } + } // -mk_str(..) + + +#if BOOST_WORKAROUND( BOOST_MSVC, <= 1300) || \ + BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042)) +// MSVC needs to be tricked to disambiguate this simple overload.. +// the trick is in "boost/format/msvc_disambiguater.hpp" + + template< class Ch, class Tr, class T> inline + void put_head (BOOST_IO_STD basic_ostream & os, const T& x ) { + disambiguater::put_head(os, x, 1L); + } + template< class Ch, class Tr, class T> inline + void put_last (BOOST_IO_STD basic_ostream & os, const T& x ) { + disambiguater::put_last(os, x, 1L); + } + +#else + + template< class Ch, class Tr, class T> inline + void put_head (BOOST_IO_STD basic_ostream &, const T& ) { + } + + template< class Ch, class Tr, class T> inline + void put_head( BOOST_IO_STD basic_ostream & os, const group1& x ) { + os << group_head(x.a1_); // send the first N-1 items, not the last + } + + template< class Ch, class Tr, class T> inline + void put_last( BOOST_IO_STD basic_ostream & os, const T& x ) { + os << x ; + } + + template< class Ch, class Tr, class T> inline + void put_last( BOOST_IO_STD basic_ostream & os, const group1& x ) { + os << group_last(x.a1_); // this selects the last element + } + +#ifndef BOOST_NO_OVERLOAD_FOR_NON_CONST + template< class Ch, class Tr, class T> inline + void put_head( BOOST_IO_STD basic_ostream &, T& ) { + } + + template< class Ch, class Tr, class T> inline + void put_last( BOOST_IO_STD basic_ostream & os, T& x) { + os << x ; + } +#endif +#endif // -msvc workaround + + + template< class Ch, class Tr, class Alloc, class T> + void put( T x, + const format_item& specs, + typename basic_format::string_type& res, + typename basic_format::internal_streambuf_t & buf, + io::detail::locale_t *loc_p = NULL) + { + // does the actual conversion of x, with given params, into a string + // using the supplied stringbuf. + + typedef typename basic_format::string_type string_type; + typedef typename basic_format::format_item_t format_item_t; + typedef typename string_type::size_type size_type; + + basic_oaltstringstream oss( &buf); + specs.fmtstate_.apply_on(oss, loc_p); + + // the stream format state can be modified by manipulators in the argument : + put_head( oss, x ); + // in case x is a group, apply the manip part of it, + // in order to find width + + const std::ios_base::fmtflags fl=oss.flags(); + const bool internal = (fl & std::ios_base::internal) != 0; + const std::streamsize w = oss.width(); + const bool two_stepped_padding= internal && (w!=0); + + res.resize(0); + if(! two_stepped_padding) { + if(w>0) // handle padding via mk_str, not natively in stream + oss.width(0); + put_last( oss, x); + const Ch * res_beg = buf.pbase(); + Ch prefix_space = 0; + if(specs.pad_scheme_ & format_item_t::spacepad) + if(buf.pcount()== 0 || + (res_beg[0] !=oss.widen('+') && res_beg[0] !=oss.widen('-') )) + prefix_space = oss.widen(' '); + size_type res_size = (std::min)( + static_cast(specs.truncate_ - !!prefix_space), + buf.pcount() ); + mk_str(res, res_beg, res_size, w, oss.fill(), fl, + prefix_space, (specs.pad_scheme_ & format_item_t::centered) !=0 ); + } + else { // 2-stepped padding + // internal can be implied by zeropad, or user-set. + // left, right, and centered alignment overrule internal, + // but spacepad or truncate might be mixed with internal (using manipulator) + put_last( oss, x); // may pad + const Ch * res_beg = buf.pbase(); + size_type res_size = buf.pcount(); + bool prefix_space=false; + if(specs.pad_scheme_ & format_item_t::spacepad) + if(buf.pcount()== 0 || + (res_beg[0] !=oss.widen('+') && res_beg[0] !=oss.widen('-') )) + prefix_space = true; + if(res_size == static_cast(w) && w<=specs.truncate_ && !prefix_space) { + // okay, only one thing was printed and padded, so res is fine + res.assign(res_beg, res_size); + } + else { // length w exceeded + // either it was multi-output with first output padding up all width.. + // either it was one big arg and we are fine. + // Note that res_size oss2( &buf); + specs.fmtstate_.apply_on(oss2, loc_p); + put_head( oss2, x ); + + oss2.width(0); + if(prefix_space) + oss2 << ' '; + put_last(oss2, x ); + if(buf.pcount()==0 && specs.pad_scheme_ & format_item_t::spacepad) { + prefix_space =true; + oss2 << ' '; + } + // we now have the minimal-length output + const Ch * tmp_beg = buf.pbase(); + size_type tmp_size = (std::min)(static_cast(specs.truncate_), + buf.pcount() ); + + + if(static_cast(w) <= tmp_size) { + // minimal length is already >= w, so no padding (cool!) + res.assign(tmp_beg, tmp_size); + } + else { // hum.. we need to pad (multi_output, or spacepad present) + //find where we should pad + size_type sz = (std::min)(res_size+prefix_space, tmp_size); + size_type i = prefix_space; + for(; i=tmp_size) i=prefix_space; + res.assign(tmp_beg, i); + std::streamsize d = w - static_cast(tmp_size); + BOOST_ASSERT(d>0); + res.append(static_cast( d ), oss2.fill()); + res.append(tmp_beg+i, tmp_size-i); + BOOST_ASSERT(i+(tmp_size-i)+(std::max)(d,(std::streamsize)0) + == static_cast(w)); + BOOST_ASSERT(res.size() == static_cast(w)); + } + } + } + buf.clear_buffer(); + } // end- put(..) + + + template< class Ch, class Tr, class Alloc, class T> + void distribute (basic_format& self, T x) { + // call put(x, ..) on every occurence of the current argument : + if(self.cur_arg_ >= self.num_args_) { + if( self.exceptions() & too_many_args_bit ) + boost::throw_exception(too_many_args(self.cur_arg_, self.num_args_)); + else return; + } + for(unsigned long i=0; i < self.items_.size(); ++i) { + if(self.items_[i].argN_ == self.cur_arg_) { + put (x, self.items_[i], self.items_[i].res_, + self.buf_, boost::get_pointer(self.loc_) ); + } + } + } + + template + basic_format& + feed (basic_format& self, T x) { + if(self.dumped_) self.clear(); + distribute (self, x); + ++self.cur_arg_; + if(self.bound_.size() != 0) { + while( self.cur_arg_ < self.num_args_ && self.bound_[self.cur_arg_] ) + ++self.cur_arg_; + } + return self; + } + +} // namespace detail +} // namespace io +} // namespace boost + + +#endif // BOOST_FORMAT_FEED_ARGS_HPP diff -Nru bombono-dvd-0.5.2/libs/boost-lib/boost/format/format_class.hpp bombono-dvd-0.6.0/libs/boost-lib/boost/format/format_class.hpp --- bombono-dvd-0.5.2/libs/boost-lib/boost/format/format_class.hpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/boost/format/format_class.hpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,143 @@ +// ---------------------------------------------------------------------------- +// format_class.hpp : class interface +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/format for library home page + +// ---------------------------------------------------------------------------- + +#ifndef BOOST_FORMAT_CLASS_HPP +#define BOOST_FORMAT_CLASS_HPP + + +#include +#include + +#include // to store locale when needed + +#include +#include +#include +#include + +namespace boost { + + template + class basic_format + { + typedef typename io::CompatTraits::compatible_type compat_traits; + public: + typedef Ch CharT; // borland fails in operator% if we use Ch and Tr directly + typedef std::basic_string string_type; + typedef typename string_type::size_type size_type; + typedef io::detail::format_item format_item_t; + typedef io::basic_altstringbuf internal_streambuf_t; + + + explicit basic_format(const Ch* str=NULL); + explicit basic_format(const string_type& s); + basic_format(const basic_format& x); + basic_format& operator= (const basic_format& x); + void swap(basic_format& x); + +#if !defined(BOOST_NO_STD_LOCALE) + explicit basic_format(const Ch* str, const std::locale & loc); + explicit basic_format(const string_type& s, const std::locale & loc); +#endif + io::detail::locale_t getloc() const; + + basic_format& clear(); // empty all converted string buffers (except bound items) + basic_format& clear_binds(); // unbind all bound items, and call clear() + basic_format& parse(const string_type&); // resets buffers and parse a new format string + + // ** formatted result ** // + size_type size() const; // sum of the current string pieces sizes + string_type str() const; // final string + + // ** arguments passing ** // + template + basic_format& operator%(const T& x) + { return io::detail::feed(*this,x); } + +#ifndef BOOST_NO_OVERLOAD_FOR_NON_CONST + template basic_format& operator%(T& x) + { return io::detail::feed(*this,x); } +#endif + + // ** object modifying **// + template + basic_format& bind_arg(int argN, const T& val) + { return io::detail::bind_arg_body(*this, argN, val); } + basic_format& clear_bind(int argN); + template + basic_format& modify_item(int itemN, T manipulator) + { return io::detail::modify_item_body (*this, itemN, manipulator);} + + // Choosing which errors will throw exceptions : + unsigned char exceptions() const; + unsigned char exceptions(unsigned char newexcept); + +#if !defined( BOOST_NO_MEMBER_TEMPLATE_FRIENDS ) \ + && !BOOST_WORKAROUND(__BORLANDC__, <= 0x570) \ + && !BOOST_WORKAROUND( _CRAYC, != 0) \ + && !BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042)) + // use friend templates and private members only if supported + +#ifndef BOOST_NO_TEMPLATE_STD_STREAM + template + friend std::basic_ostream & + operator<<( std::basic_ostream & , + const basic_format& ); +#else + template + friend std::ostream & + operator<<( std::ostream & , + const basic_format& ); +#endif + + template + friend basic_format& + io::detail::feed (basic_format&, T); + + template friend + void io::detail::distribute (basic_format&, T); + + template friend + basic_format& + io::detail::modify_item_body (basic_format&, int, T); + + template friend + basic_format& + io::detail::bind_arg_body (basic_format&, int, const T&); + + private: +#endif + typedef io::detail::stream_format_state stream_format_state; + // flag bits, used for style_ + enum style_values { ordered = 1, // set only if all directives are positional + special_needs = 4 }; + + void make_or_reuse_data(std::size_t nbitems);// used for (re-)initialisation + + // member data --------------------------------------------// + std::vector items_; // each '%..' directive leads to a format_item + std::vector bound_; // stores which arguments were bound. size() == 0 || num_args + + int style_; // style of format-string : positional or not, etc + int cur_arg_; // keep track of wich argument is current + int num_args_; // number of expected arguments + mutable bool dumped_; // true only after call to str() or << + string_type prefix_; // piece of string to insert before first item + unsigned char exceptions_; + internal_streambuf_t buf_; // the internal stream buffer. + boost::optional loc_; + }; // class basic_format + +} // namespace boost + + +#endif // BOOST_FORMAT_CLASS_HPP diff -Nru bombono-dvd-0.5.2/libs/boost-lib/boost/format/format_fwd.hpp bombono-dvd-0.6.0/libs/boost-lib/boost/format/format_fwd.hpp --- bombono-dvd-0.5.2/libs/boost-lib/boost/format/format_fwd.hpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/boost/format/format_fwd.hpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,49 @@ +// ---------------------------------------------------------------------------- +// format_fwd.hpp : forward declarations +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/format for library home page + +// ---------------------------------------------------------------------------- + +#ifndef BOOST_FORMAT_FWD_HPP +#define BOOST_FORMAT_FWD_HPP + +#include +#include + +#include + +namespace boost { + + template , class Alloc = std::allocator > +#else + class Tr = std::string_char_traits, class Alloc = std::alloc > +#endif + class basic_format; + + typedef basic_format format; + +#if !defined(BOOST_NO_STD_WSTRING) && !defined(BOOST_NO_STD_WSTREAMBUF) \ + && !defined(BOOST_FORMAT_IGNORE_STRINGSTREAM) + typedef basic_format wformat; +#endif + + namespace io { + enum format_error_bits { bad_format_string_bit = 1, + too_few_args_bit = 2, too_many_args_bit = 4, + out_of_range_bit = 8, + all_error_bits = 255, no_error_bits=0 }; + + } // namespace io + +} // namespace boost + +#endif // BOOST_FORMAT_FWD_HPP diff -Nru bombono-dvd-0.5.2/libs/boost-lib/boost/format/format_implementation.hpp bombono-dvd-0.6.0/libs/boost-lib/boost/format/format_implementation.hpp --- bombono-dvd-0.5.2/libs/boost-lib/boost/format/format_implementation.hpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/boost/format/format_implementation.hpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,277 @@ +// ---------------------------------------------------------------------------- +// format_implementation.hpp Implementation of the basic_format class +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/format for library home page + + +// ---------------------------------------------------------------------------- + +#ifndef BOOST_FORMAT_IMPLEMENTATION_HPP +#define BOOST_FORMAT_IMPLEMENTATION_HPP + +#include +#include +#include +#include +#include // std::swap + +namespace boost { + +// --- basic_format implementation -----------------------------------------// + + template< class Ch, class Tr, class Alloc> + basic_format:: basic_format(const Ch* str) + : style_(0), cur_arg_(0), num_args_(0), dumped_(false), + exceptions_(io::all_error_bits) + { + if( str) + parse( str ); + } + +#if !defined(BOOST_NO_STD_LOCALE) + template< class Ch, class Tr, class Alloc> + basic_format:: basic_format(const Ch* str, const std::locale & loc) + : style_(0), cur_arg_(0), num_args_(0), dumped_(false), + loc_(loc), exceptions_(io::all_error_bits) + { + if(str) parse( str ); + } + + template< class Ch, class Tr, class Alloc> + basic_format:: basic_format(const string_type& s, const std::locale & loc) + : style_(0), cur_arg_(0), num_args_(0), dumped_(false), + loc_(loc), exceptions_(io::all_error_bits) + { + parse(s); + } +#endif // ! BOOST_NO_STD_LOCALE + template< class Ch, class Tr, class Alloc> + io::detail::locale_t basic_format:: + getloc() const { + return loc_ ? loc_.get() : io::detail::locale_t(); + } + + template< class Ch, class Tr, class Alloc> + basic_format:: basic_format(const string_type& s) + : style_(0), cur_arg_(0), num_args_(0), dumped_(false), + exceptions_(io::all_error_bits) + { + parse(s); + } + + template< class Ch, class Tr, class Alloc> // just don't copy the buf_ member + basic_format:: basic_format(const basic_format& x) + : items_(x.items_), bound_(x.bound_), style_(x.style_), + cur_arg_(x.cur_arg_), num_args_(x.num_args_), dumped_(false), + prefix_(x.prefix_), exceptions_(x.exceptions_), loc_(x.loc_) + { + } + + template< class Ch, class Tr, class Alloc> // just don't copy the buf_ member + basic_format& basic_format:: + operator= (const basic_format& x) { + if(this == &x) + return *this; + (basic_format(x)).swap(*this); + return *this; + } + template< class Ch, class Tr, class Alloc> + void basic_format:: + swap (basic_format & x) { + std::swap(exceptions_, x.exceptions_); + std::swap(style_, x.style_); + std::swap(cur_arg_, x.cur_arg_); + std::swap(num_args_, x.num_args_); + std::swap(dumped_, x.dumped_); + + items_.swap(x.items_); + prefix_.swap(x.prefix_); + bound_.swap(x.bound_); + } + + template< class Ch, class Tr, class Alloc> + unsigned char basic_format:: exceptions() const { + return exceptions_; + } + + template< class Ch, class Tr, class Alloc> + unsigned char basic_format:: exceptions(unsigned char newexcept) { + unsigned char swp = exceptions_; + exceptions_ = newexcept; + return swp; + } + + template + void basic_format:: + make_or_reuse_data (std::size_t nbitems) { +#if !defined(BOOST_NO_STD_LOCALE) + Ch fill = ( BOOST_USE_FACET(std::ctype, getloc()) ). widen(' '); +#else + Ch fill = ' '; +#endif + if(items_.size() == 0) + items_.assign( nbitems, format_item_t(fill) ); + else { + if(nbitems>items_.size()) + items_.resize(nbitems, format_item_t(fill)); + bound_.resize(0); + for(std::size_t i=0; i < nbitems; ++i) + items_[i].reset(fill); // strings are resized, instead of reallocated + } + } + + template< class Ch, class Tr, class Alloc> + basic_format& basic_format:: + clear () { + // empty the string buffers (except bound arguments) + // and make the format object ready for formatting a new set of arguments + + BOOST_ASSERT( bound_.size()==0 || num_args_ == static_cast(bound_.size()) ); + + for(unsigned long i=0; i + basic_format& basic_format:: + clear_binds () { + // remove all binds, then clear() + bound_.resize(0); + clear(); + return *this; + } + + template< class Ch, class Tr, class Alloc> + basic_format& basic_format:: + clear_bind (int argN) { + // remove the bind of ONE argument then clear() + if(argN<1 || argN > num_args_ || bound_.size()==0 || !bound_[argN-1] ) { + if( exceptions() & io::out_of_range_bit) + boost::throw_exception(io::out_of_range(argN, 1, num_args_+1 ) ); + else return *this; + } + bound_[argN-1]=false; + clear(); + return *this; + } + + template< class Ch, class Tr, class Alloc> + typename basic_format::string_type + basic_format:: + str () const { + if(items_.size()==0) + return prefix_; + if( cur_arg_ < num_args_) + if( exceptions() & io::too_few_args_bit ) + // not enough variables supplied + boost::throw_exception(io::too_few_args(cur_arg_, num_args_)); + + unsigned long i; + string_type res; + res.reserve(size()); + res += prefix_; + for(i=0; i < items_.size(); ++i) { + const format_item_t& item = items_[i]; + res += item.res_; + if( item.argN_ == format_item_t::argN_tabulation) { + BOOST_ASSERT( item.pad_scheme_ & format_item_t::tabulation); + if( static_cast(item.fmtstate_.width_) > res.size() ) + res.append( static_cast(item.fmtstate_.width_) - res.size(), + item.fmtstate_.fill_ ); + } + res += item.appendix_; + } + dumped_=true; + return res; + } + template< class Ch, class Tr, class Alloc> + typename std::basic_string::size_type basic_format:: + size () const { + BOOST_USING_STD_MAX(); + size_type sz = prefix_.size(); + unsigned long i; + for(i=0; i < items_.size(); ++i) { + const format_item_t& item = items_[i]; + sz += item.res_.size(); + if( item.argN_ == format_item_t::argN_tabulation) + sz = max BOOST_PREVENT_MACRO_SUBSTITUTION (sz, + static_cast(item.fmtstate_.width_) ); + sz += item.appendix_.size(); + } + return sz; + } + +namespace io { +namespace detail { + + template + basic_format& + bind_arg_body (basic_format& self, int argN, const T& val) { + // bind one argument to a fixed value + // this is persistent over clear() calls, thus also over str() and << + if(self.dumped_) + self.clear(); // needed because we will modify cur_arg_ + if(argN<1 || argN > self.num_args_) { + if( self.exceptions() & io::out_of_range_bit ) + boost::throw_exception(io::out_of_range(argN, 1, self.num_args_+1 ) ); + else return self; + } + if(self.bound_.size()==0) + self.bound_.assign(self.num_args_,false); + else + BOOST_ASSERT( self.num_args_ == static_cast(self.bound_.size()) ); + int o_cur_arg = self.cur_arg_; + self.cur_arg_ = argN-1; // arrays begin at 0 + + self.bound_[self.cur_arg_]=false; // if already set, we unset and re-sets.. + self.operator%(val); // put val at the right place, because cur_arg is set + + + // Now re-position cur_arg before leaving : + self.cur_arg_ = o_cur_arg; + self.bound_[argN-1]=true; + if(self.cur_arg_ == argN-1 ) { + // hum, now this arg is bound, so move to next free arg + while(self.cur_arg_ < self.num_args_ && self.bound_[self.cur_arg_]) + ++self.cur_arg_; + } + // In any case, we either have all args, or are on a non-binded arg : + BOOST_ASSERT( self.cur_arg_ >= self.num_args_ || ! self.bound_[self.cur_arg_]); + return self; + } + + template basic_format& + modify_item_body (basic_format& self, int itemN, T manipulator) { + // applies a manipulator to the format_item describing a given directive. + // this is a permanent change, clear or reset won't cancel that. + if(itemN<1 || itemN > static_cast(self.items_.size() )) { + if( self.exceptions() & io::out_of_range_bit ) + boost::throw_exception(io::out_of_range(itemN, 1, self.items_.size() )); + else return self; + } + self.items_[itemN-1].fmtstate_. template apply_manip ( manipulator ); + return self; + } + +} // namespace detail +} // namespace io +} // namespace boost + + + +#endif // BOOST_FORMAT_IMPLEMENTATION_HPP diff -Nru bombono-dvd-0.5.2/libs/boost-lib/boost/format/free_funcs.hpp bombono-dvd-0.6.0/libs/boost-lib/boost/format/free_funcs.hpp --- bombono-dvd-0.5.2/libs/boost-lib/boost/format/free_funcs.hpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/boost/format/free_funcs.hpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,70 @@ +// ---------------------------------------------------------------------------- +// free_funcs.hpp : implementation of the free functions of boost::format +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/format for library home page + +// ---------------------------------------------------------------------------- + +#ifndef BOOST_FORMAT_FUNCS_HPP +#define BOOST_FORMAT_FUNCS_HPP + +#include +#include + +namespace boost { + + template inline + std::basic_string str(const basic_format& f) { + // adds up all pieces of strings and converted items, and return the formatted string + return f.str(); + } + namespace io { + using ::boost::str; // keep compatibility with when it was defined in this N.S. + } // - namespace io + +#ifndef BOOST_NO_TEMPLATE_STD_STREAM + template + std::basic_ostream & + operator<<( std::basic_ostream & os, + const basic_format& f) +#else + template + std::ostream & + operator<<( std::ostream & os, + const basic_format& f) +#endif + // effect: "return os << str(f);" but we can do it faster + { + typedef boost::basic_format format_t; + if(f.items_.size()==0) + os << f.prefix_; + else { + if(f.cur_arg_ < f.num_args_) + if( f.exceptions() & io::too_few_args_bit ) + // not enough variables supplied + boost::throw_exception(io::too_few_args(f.cur_arg_, f.num_args_)); + if(f.style_ & format_t::special_needs) + os << f.str(); + else { + // else we dont have to count chars output, so we dump directly to os : + os << f.prefix_; + for(unsigned long i=0; i + + +namespace boost { +namespace io { + + +namespace detail { + + +// empty group, but useful even though. +struct group0 +{ + group0() {} +}; + +template +inline +BOOST_IO_STD basic_ostream& +operator << ( BOOST_IO_STD basic_ostream& os, + const group0& ) +{ + return os; +} + +template +struct group1 +{ + T1 a1_; + group1(T1 a1) + : a1_(a1) + {} +}; + +template +inline +BOOST_IO_STD basic_ostream& +operator << (BOOST_IO_STD basic_ostream& os, + const group1& x) +{ + os << x.a1_; + return os; +} + + + + +template +struct group2 +{ + T1 a1_; + T2 a2_; + group2(T1 a1,T2 a2) + : a1_(a1),a2_(a2) + {} +}; + +template +inline +BOOST_IO_STD basic_ostream& +operator << (BOOST_IO_STD basic_ostream& os, + const group2& x) +{ + os << x.a1_<< x.a2_; + return os; +} + +template +struct group3 +{ + T1 a1_; + T2 a2_; + T3 a3_; + group3(T1 a1,T2 a2,T3 a3) + : a1_(a1),a2_(a2),a3_(a3) + {} +}; + +template +inline +BOOST_IO_STD basic_ostream& +operator << (BOOST_IO_STD basic_ostream& os, + const group3& x) +{ + os << x.a1_<< x.a2_<< x.a3_; + return os; +} + +template +struct group4 +{ + T1 a1_; + T2 a2_; + T3 a3_; + T4 a4_; + group4(T1 a1,T2 a2,T3 a3,T4 a4) + : a1_(a1),a2_(a2),a3_(a3),a4_(a4) + {} +}; + +template +inline +BOOST_IO_STD basic_ostream& +operator << (BOOST_IO_STD basic_ostream& os, + const group4& x) +{ + os << x.a1_<< x.a2_<< x.a3_<< x.a4_; + return os; +} + +template +struct group5 +{ + T1 a1_; + T2 a2_; + T3 a3_; + T4 a4_; + T5 a5_; + group5(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5) + : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5) + {} +}; + +template +inline +BOOST_IO_STD basic_ostream& +operator << (BOOST_IO_STD basic_ostream& os, + const group5& x) +{ + os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_; + return os; +} + +template +struct group6 +{ + T1 a1_; + T2 a2_; + T3 a3_; + T4 a4_; + T5 a5_; + T6 a6_; + group6(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6) + : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6) + {} +}; + +template +inline +BOOST_IO_STD basic_ostream& +operator << (BOOST_IO_STD basic_ostream& os, + const group6& x) +{ + os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_; + return os; +} + +template +struct group7 +{ + T1 a1_; + T2 a2_; + T3 a3_; + T4 a4_; + T5 a5_; + T6 a6_; + T7 a7_; + group7(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7) + : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7) + {} +}; + +template +inline +BOOST_IO_STD basic_ostream& +operator << (BOOST_IO_STD basic_ostream& os, + const group7& x) +{ + os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_; + return os; +} + +template +struct group8 +{ + T1 a1_; + T2 a2_; + T3 a3_; + T4 a4_; + T5 a5_; + T6 a6_; + T7 a7_; + T8 a8_; + group8(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8) + : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7),a8_(a8) + {} +}; + +template +inline +BOOST_IO_STD basic_ostream& +operator << (BOOST_IO_STD basic_ostream& os, + const group8& x) +{ + os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_<< x.a8_; + return os; +} + +template +struct group9 +{ + T1 a1_; + T2 a2_; + T3 a3_; + T4 a4_; + T5 a5_; + T6 a6_; + T7 a7_; + T8 a8_; + T9 a9_; + group9(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9) + : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7),a8_(a8),a9_(a9) + {} +}; + +template +inline +BOOST_IO_STD basic_ostream& +operator << (BOOST_IO_STD basic_ostream& os, + const group9& x) +{ + os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_<< x.a8_<< x.a9_; + return os; +} + +template +struct group10 +{ + T1 a1_; + T2 a2_; + T3 a3_; + T4 a4_; + T5 a5_; + T6 a6_; + T7 a7_; + T8 a8_; + T9 a9_; + T10 a10_; + group10(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9,T10 a10) + : a1_(a1),a2_(a2),a3_(a3),a4_(a4),a5_(a5),a6_(a6),a7_(a7),a8_(a8),a9_(a9),a10_(a10) + {} +}; + +template +inline +BOOST_IO_STD basic_ostream& +operator << (BOOST_IO_STD basic_ostream& os, + const group10& x) +{ + os << x.a1_<< x.a2_<< x.a3_<< x.a4_<< x.a5_<< x.a6_<< x.a7_<< x.a8_<< x.a9_<< x.a10_; + return os; +} + + + + +template +inline +group1 +group_head( group2 const& x) +{ + return group1 (x.a1_); +} + +template +inline +group1 +group_last( group2 const& x) +{ + return group1 (x.a2_); +} + + + +template +inline +group2 +group_head( group3 const& x) +{ + return group2 (x.a1_,x.a2_); +} + +template +inline +group1 +group_last( group3 const& x) +{ + return group1 (x.a3_); +} + + + +template +inline +group3 +group_head( group4 const& x) +{ + return group3 (x.a1_,x.a2_,x.a3_); +} + +template +inline +group1 +group_last( group4 const& x) +{ + return group1 (x.a4_); +} + + + +template +inline +group4 +group_head( group5 const& x) +{ + return group4 (x.a1_,x.a2_,x.a3_,x.a4_); +} + +template +inline +group1 +group_last( group5 const& x) +{ + return group1 (x.a5_); +} + + + +template +inline +group5 +group_head( group6 const& x) +{ + return group5 (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_); +} + +template +inline +group1 +group_last( group6 const& x) +{ + return group1 (x.a6_); +} + + + +template +inline +group6 +group_head( group7 const& x) +{ + return group6 (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_,x.a6_); +} + +template +inline +group1 +group_last( group7 const& x) +{ + return group1 (x.a7_); +} + + + +template +inline +group7 +group_head( group8 const& x) +{ + return group7 (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_,x.a6_,x.a7_); +} + +template +inline +group1 +group_last( group8 const& x) +{ + return group1 (x.a8_); +} + + + +template +inline +group8 +group_head( group9 const& x) +{ + return group8 (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_,x.a6_,x.a7_,x.a8_); +} + +template +inline +group1 +group_last( group9 const& x) +{ + return group1 (x.a9_); +} + + + +template +inline +group9 +group_head( group10 const& x) +{ + return group9 (x.a1_,x.a2_,x.a3_,x.a4_,x.a5_,x.a6_,x.a7_,x.a8_,x.a9_); +} + +template +inline +group1 +group_last( group10 const& x) +{ + return group1 (x.a10_); +} + + + + + +} // namespace detail + + + +// helper functions + + +inline detail::group1< detail::group0 > +group() { return detail::group1< detail::group0 > ( detail::group0() ); } + +template +inline +detail::group1< detail::group2 > + group(T1 a1, Var const& var) +{ + return detail::group1< detail::group2 > + ( detail::group2 + (a1, var) + ); +} + +template +inline +detail::group1< detail::group3 > + group(T1 a1,T2 a2, Var const& var) +{ + return detail::group1< detail::group3 > + ( detail::group3 + (a1,a2, var) + ); +} + +template +inline +detail::group1< detail::group4 > + group(T1 a1,T2 a2,T3 a3, Var const& var) +{ + return detail::group1< detail::group4 > + ( detail::group4 + (a1,a2,a3, var) + ); +} + +template +inline +detail::group1< detail::group5 > + group(T1 a1,T2 a2,T3 a3,T4 a4, Var const& var) +{ + return detail::group1< detail::group5 > + ( detail::group5 + (a1,a2,a3,a4, var) + ); +} + +template +inline +detail::group1< detail::group6 > + group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5, Var const& var) +{ + return detail::group1< detail::group6 > + ( detail::group6 + (a1,a2,a3,a4,a5, var) + ); +} + +template +inline +detail::group1< detail::group7 > + group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6, Var const& var) +{ + return detail::group1< detail::group7 > + ( detail::group7 + (a1,a2,a3,a4,a5,a6, var) + ); +} + +template +inline +detail::group1< detail::group8 > + group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7, Var const& var) +{ + return detail::group1< detail::group8 > + ( detail::group8 + (a1,a2,a3,a4,a5,a6,a7, var) + ); +} + +template +inline +detail::group1< detail::group9 > + group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, Var const& var) +{ + return detail::group1< detail::group9 > + ( detail::group9 + (a1,a2,a3,a4,a5,a6,a7,a8, var) + ); +} + +template +inline +detail::group1< detail::group10 > + group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9, Var const& var) +{ + return detail::group1< detail::group10 > + ( detail::group10 + (a1,a2,a3,a4,a5,a6,a7,a8,a9, var) + ); +} + + +#ifndef BOOST_NO_OVERLOAD_FOR_NON_CONST + +template +inline +detail::group1< detail::group2 > + group(T1 a1, Var& var) +{ + return detail::group1< detail::group2 > + ( detail::group2 + (a1, var) + ); +} + +template +inline +detail::group1< detail::group3 > + group(T1 a1,T2 a2, Var& var) +{ + return detail::group1< detail::group3 > + ( detail::group3 + (a1,a2, var) + ); +} + +template +inline +detail::group1< detail::group4 > + group(T1 a1,T2 a2,T3 a3, Var& var) +{ + return detail::group1< detail::group4 > + ( detail::group4 + (a1,a2,a3, var) + ); +} + +template +inline +detail::group1< detail::group5 > + group(T1 a1,T2 a2,T3 a3,T4 a4, Var& var) +{ + return detail::group1< detail::group5 > + ( detail::group5 + (a1,a2,a3,a4, var) + ); +} + +template +inline +detail::group1< detail::group6 > + group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5, Var& var) +{ + return detail::group1< detail::group6 > + ( detail::group6 + (a1,a2,a3,a4,a5, var) + ); +} + +template +inline +detail::group1< detail::group7 > + group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6, Var& var) +{ + return detail::group1< detail::group7 > + ( detail::group7 + (a1,a2,a3,a4,a5,a6, var) + ); +} + +template +inline +detail::group1< detail::group8 > + group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7, Var& var) +{ + return detail::group1< detail::group8 > + ( detail::group8 + (a1,a2,a3,a4,a5,a6,a7, var) + ); +} + +template +inline +detail::group1< detail::group9 > + group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8, Var& var) +{ + return detail::group1< detail::group9 > + ( detail::group9 + (a1,a2,a3,a4,a5,a6,a7,a8, var) + ); +} + +template +inline +detail::group1< detail::group10 > + group(T1 a1,T2 a2,T3 a3,T4 a4,T5 a5,T6 a6,T7 a7,T8 a8,T9 a9, Var& var) +{ + return detail::group1< detail::group10 > + ( detail::group10 + (a1,a2,a3,a4,a5,a6,a7,a8,a9, var) + ); +} + + +#endif // - BOOST_NO_OVERLOAD_FOR_NON_CONST + + +} // namespace io + +} // namespace boost + + +#endif // BOOST_FORMAT_GROUP_HPP diff -Nru bombono-dvd-0.5.2/libs/boost-lib/boost/format/internals_fwd.hpp bombono-dvd-0.6.0/libs/boost-lib/boost/format/internals_fwd.hpp --- bombono-dvd-0.5.2/libs/boost-lib/boost/format/internals_fwd.hpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/boost/format/internals_fwd.hpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,60 @@ +// ---------------------------------------------------------------------------- +// internals_fwd.hpp : forward declarations, for internal headers +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/format for library home page + +// ---------------------------------------------------------------------------- + +#ifndef BOOST_FORMAT_INTERNAL_FWD_HPP +#define BOOST_FORMAT_INTERNAL_FWD_HPP + +#include +#include + + +namespace boost { +namespace io { + +namespace detail { + template struct stream_format_state; + template struct format_item; + + + // these functions were intended as methods, + // but MSVC have problems with template member functions : + // defined in format_implementation.hpp : + template + basic_format& + modify_item_body (basic_format& self, + int itemN, T manipulator); + + template + basic_format& + bind_arg_body (basic_format& self, + int argN, const T& val); + + // in internals.hpp : + template + void apply_manip_body (stream_format_state& self, + T manipulator); + + // argument feeding (defined in feed_args.hpp ) : + template + void distribute (basic_format& self, T x); + + template + basic_format& + feed (basic_format& self, T x); + +} // namespace detail + +} // namespace io +} // namespace boost + + +#endif // BOOST_FORMAT_INTERNAL_FWD_HPP diff -Nru bombono-dvd-0.5.2/libs/boost-lib/boost/format/internals.hpp bombono-dvd-0.6.0/libs/boost-lib/boost/format/internals.hpp --- bombono-dvd-0.5.2/libs/boost-lib/boost/format/internals.hpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/boost/format/internals.hpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,199 @@ +// ---------------------------------------------------------------------------- +// internals.hpp : internal structs : stream_format_state, format_item. +// included by format.hpp +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/format for library home page + +// ---------------------------------------------------------------------------- + +#ifndef BOOST_FORMAT_INTERNALS_HPP +#define BOOST_FORMAT_INTERNALS_HPP + + +#include +#include +#include +#include +#include +#include // used as a dummy stream + +namespace boost { +namespace io { +namespace detail { + + +//---- stream_format_state --------------------------------------------------// + +// set of params that define the format state of a stream + template + struct stream_format_state + { + typedef BOOST_IO_STD basic_ios basic_ios; + + stream_format_state(Ch fill) { reset(fill); } +// stream_format_state(const basic_ios& os) { set_by_stream(os); } + + void reset(Ch fill); //- sets to default state. + void set_by_stream(const basic_ios& os); //- sets to os's state. + void apply_on(basic_ios & os, //- applies format_state to the stream + boost::io::detail::locale_t * loc_default = 0) const; + template + void apply_manip(T manipulator) //- modifies state by applying manipulator + { apply_manip_body( *this, manipulator) ; } + + // --- data --- + std::streamsize width_; + std::streamsize precision_; + Ch fill_; + std::ios_base::fmtflags flags_; + std::ios_base::iostate rdstate_; + std::ios_base::iostate exceptions_; + boost::optional loc_; + }; + + +//---- format_item ---------------------------------------------------------// + +// stores all parameters that can be specified in format strings + template + struct format_item + { + enum pad_values { zeropad = 1, spacepad =2, centered=4, tabulation = 8 }; + // 1. if zeropad is set, all other bits are not, + // 2. if tabulation is set, all others are not. + // centered and spacepad can be mixed freely. + enum arg_values { argN_no_posit = -1, // non-positional directive. will set argN later + argN_tabulation = -2, // tabulation directive. (no argument read) + argN_ignored = -3 // ignored directive. (no argument read) + }; + typedef BOOST_IO_STD basic_ios basic_ios; + typedef detail::stream_format_state stream_format_state; + typedef ::std::basic_string string_type; + + format_item(Ch fill) :argN_(argN_no_posit), fmtstate_(fill), + truncate_(max_streamsize()), pad_scheme_(0) {} + void reset(Ch fill); + void compute_states(); // sets states according to truncate and pad_scheme. + + static std::streamsize max_streamsize() { + return (std::numeric_limits::max)(); + } + + // --- data --- + int argN_; //- argument number (starts at 0, eg : %1 => argN=0) + // negative values for items that don't process an argument + string_type res_; //- result of the formatting of this item + string_type appendix_; //- piece of string between this item and the next + + stream_format_state fmtstate_;// set by parsing, is only affected by modify_item + + std::streamsize truncate_;//- is set for directives like %.5s that ask truncation + unsigned int pad_scheme_;//- several possible padding schemes can mix. see pad_values + }; + + + +//--- Definitions ------------------------------------------------------------ + +// - stream_format_state:: ------------------------------------------------- + template + void stream_format_state:: apply_on (basic_ios & os, + boost::io::detail::locale_t * loc_default) const { + // set the state of this stream according to our params + if(width_ != -1) + os.width(width_); + if(precision_ != -1) + os.precision(precision_); + if(fill_ != 0) + os.fill(fill_); + os.flags(flags_); + os.clear(rdstate_); + os.exceptions(exceptions_); +#if !defined(BOOST_NO_STD_LOCALE) + if(loc_) + os.imbue(loc_.get()); + else if(loc_default) + os.imbue(*loc_default); +#endif + } + + template + void stream_format_state:: set_by_stream(const basic_ios& os) { + // set our params according to the state of this stream + flags_ = os.flags(); + width_ = os.width(); + precision_ = os.precision(); + fill_ = os.fill(); + rdstate_ = os.rdstate(); + exceptions_ = os.exceptions(); + } + + + template + void apply_manip_body( stream_format_state& self, + T manipulator) { + // modify our params according to the manipulator + basic_oaltstringstream ss; + self.apply_on( ss ); + ss << manipulator; + self.set_by_stream( ss ); + } + + template inline + void stream_format_state:: reset(Ch fill) { + // set our params to standard's default state. cf 27.4.4.1 of the C++ norm + width_=0; precision_=6; + fill_=fill; // default is widen(' '), but we cant compute it without the locale + flags_ = std::ios_base::dec | std::ios_base::skipws; + // the adjust_field part is left equal to 0, which means right. + exceptions_ = std::ios_base::goodbit; + rdstate_ = std::ios_base::goodbit; + } + + +// --- format_item:: -------------------------------------------------------- + + template + void format_item:: + reset (Ch fill) { + argN_=argN_no_posit; truncate_ = max_streamsize(); pad_scheme_ =0; + res_.resize(0); appendix_.resize(0); + fmtstate_.reset(fill); + } + + template + void format_item:: + compute_states() { + // reflect pad_scheme_ on fmt_state_ + // because some pad_schemes has complex consequences on several state params. + if(pad_scheme_ & zeropad) { + // ignore zeropad in left alignment : + if(fmtstate_.flags_ & std::ios_base::left) { + BOOST_ASSERT(!(fmtstate_.flags_ &(std::ios_base::adjustfield ^std::ios_base::left))); + // only left bit might be set. (not right, nor internal) + pad_scheme_ = pad_scheme_ & (~zeropad); + } + else { + pad_scheme_ &= ~spacepad; // printf ignores spacepad when zeropadding + fmtstate_.fill_='0'; + fmtstate_.flags_ = (fmtstate_.flags_ & ~std::ios_base::adjustfield) + | std::ios_base::internal; + // removes all adjustfield bits, and adds internal. + } + } + if(pad_scheme_ & spacepad) { + if(fmtstate_.flags_ & std::ios_base::showpos) + pad_scheme_ &= ~spacepad; + } + } + + +} } } // namespaces boost :: io :: detail + + +#endif // BOOST_FORMAT_INTERNALS_HPP diff -Nru bombono-dvd-0.5.2/libs/boost-lib/boost/format/parsing.hpp bombono-dvd-0.6.0/libs/boost-lib/boost/format/parsing.hpp --- bombono-dvd-0.5.2/libs/boost-lib/boost/format/parsing.hpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/boost/format/parsing.hpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,491 @@ +// ---------------------------------------------------------------------------- +// parsing.hpp : implementation of the parsing member functions +// ( parse, parse_printf_directive) +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// see http://www.boost.org/libs/format for library home page + +// ---------------------------------------------------------------------------- + +#ifndef BOOST_FORMAT_PARSING_HPP +#define BOOST_FORMAT_PARSING_HPP + + +#include +#include +#include + + +namespace boost { +namespace io { +namespace detail { + +#if defined(BOOST_NO_STD_LOCALE) + // streams will be used for narrow / widen. but these methods are not const + template + T& const_or_not(const T& x) { + return const_cast (x); + } +#else + template + const T& const_or_not(const T& x) { + return x; + } +#endif + + template inline + char wrap_narrow(const Facet& fac, Ch c, char deflt) { + return const_or_not(fac).narrow(c, deflt); + } + + template inline + bool wrap_isdigit(const Facet& fac, Ch c) { +#if ! defined( BOOST_NO_LOCALE_ISDIGIT ) + return fac.is(std::ctype::digit, c); +# else + using namespace std; + return isdigit(c); +#endif + } + + template + Iter wrap_scan_notdigit(const Facet & fac, Iter beg, Iter end) { + using namespace std; + for( ; beg!=end && wrap_isdigit(fac, *beg); ++beg) ; + return beg; + } + + + // Input : [start, last) iterators range and a + // a Facet to use its widen/narrow member function + // Effects : read sequence and convert digits into integral n, of type Res + // Returns : n + template + Iter str2int (const Iter & start, const Iter & last, Res & res, + const Facet& fac) + { + using namespace std; + Iter it; + res=0; + for(it=start; it != last && wrap_isdigit(fac, *it); ++it ) { + char cur_ch = wrap_narrow(fac, *it, 0); // cant fail. + res *= 10; + res += cur_ch - '0'; // 22.2.1.1.2.13 of the C++ standard + } + return it; + } + + // skip printf's "asterisk-fields" directives in the format-string buf + // Input : char string, with starting index *pos_p + // a Facet merely to use its widen/narrow member function + // Effects : advance *pos_p by skipping printf's asterisk fields. + // Returns : nothing + template + Iter skip_asterisk(Iter start, Iter last, const Facet& fac) + { + using namespace std; + ++ start; + start = wrap_scan_notdigit(fac, start, last); + if(start!=last && *start== const_or_not(fac).widen( '$') ) + ++start; + return start; + } + + + // auxiliary func called by parse_printf_directive + // for centralising error handling + // it either throws if user sets the corresponding flag, or does nothing. + inline void maybe_throw_exception(unsigned char exceptions, + std::size_t pos, std::size_t size) + { + if(exceptions & io::bad_format_string_bit) + boost::throw_exception(io::bad_format_string(pos, size) ); + } + + + // Input: the position of a printf-directive in the format-string + // a basic_ios& merely to use its widen/narrow member function + // a bitset'exceptions' telling whether to throw exceptions on errors. + // Returns: + // true if parse succeeded (ignore some errors if exceptions disabled) + // false if it failed so bad that the directive should be printed verbatim + // Effects: + // start is incremented so that *start is the first char after + // this directive + // *fpar is set with the parameters read in the directive + template + bool parse_printf_directive(Iter & start, const Iter& last, + detail::format_item * fpar, + const Facet& fac, + std::size_t offset, unsigned char exceptions) + { + typedef typename basic_format::format_item_t format_item_t; + + fpar->argN_ = format_item_t::argN_no_posit; // if no positional-directive + bool precision_set = false; + bool in_brackets=false; + Iter start0 = start; + std::size_t fstring_size = last-start0+offset; + if(*start== const_or_not(fac).widen( '|')) { + in_brackets=true; + if( ++start >= last ) { + maybe_throw_exception(exceptions, start-start0 + offset, fstring_size); + return false; + } + } + + // the flag '0' would be picked as a digit for argument order, but here it's a flag : + if(*start== const_or_not(fac).widen( '0')) + goto parse_flags; + + // handle argument order (%2$d) or possibly width specification: %2d + if(wrap_isdigit(fac, *start)) { + int n; + start = str2int(start, last, n, fac); + if( start >= last ) { + maybe_throw_exception(exceptions, start-start0+offset, fstring_size); + return false; + } + + // %N% case : this is already the end of the directive + if( *start == const_or_not(fac).widen( '%') ) { + fpar->argN_ = n-1; + ++start; + if( in_brackets) + maybe_throw_exception(exceptions, start-start0+offset, fstring_size); + // but don't return. maybe "%" was used in lieu of '$', so we go on. + else + return true; + } + + if ( *start== const_or_not(fac).widen( '$') ) { + fpar->argN_ = n-1; + ++start; + } + else { + // non-positionnal directive + fpar->fmtstate_.width_ = n; + fpar->argN_ = format_item_t::argN_no_posit; + goto parse_precision; + } + } + + parse_flags: + // handle flags + while ( start != last) { // as long as char is one of + - = _ # 0 l h or ' ' + // misc switches + switch ( wrap_narrow(fac, *start, 0)) { + case '\'' : break; // no effect yet. (painful to implement) + case 'l': + case 'h': // short/long modifier : for printf-comaptibility (no action needed) + break; + case '-': + fpar->fmtstate_.flags_ |= std::ios_base::left; + break; + case '=': + fpar->pad_scheme_ |= format_item_t::centered; + break; + case '_': + fpar->fmtstate_.flags_ |= std::ios_base::internal; + break; + case ' ': + fpar->pad_scheme_ |= format_item_t::spacepad; + break; + case '+': + fpar->fmtstate_.flags_ |= std::ios_base::showpos; + break; + case '0': + fpar->pad_scheme_ |= format_item_t::zeropad; + // need to know alignment before really setting flags, + // so just add 'zeropad' flag for now, it will be processed later. + break; + case '#': + fpar->fmtstate_.flags_ |= std::ios_base::showpoint | std::ios_base::showbase; + break; + default: + goto parse_width; + } + ++start; + } // loop on flag. + + if( start>=last) { + maybe_throw_exception(exceptions, start-start0+offset, fstring_size); + return true; + } + parse_width: + // handle width spec + // first skip 'asterisk fields' : *, or *N$ + if(*start == const_or_not(fac).widen( '*') ) + start = skip_asterisk(start, last, fac); + if(start!=last && wrap_isdigit(fac, *start)) + start = str2int(start, last, fpar->fmtstate_.width_, fac); + + parse_precision: + if( start>= last) { + maybe_throw_exception(exceptions, start-start0+offset, fstring_size); + return true; + } + // handle precision spec + if (*start== const_or_not(fac).widen( '.')) { + ++start; + if(start != last && *start == const_or_not(fac).widen( '*') ) + start = skip_asterisk(start, last, fac); + if(start != last && wrap_isdigit(fac, *start)) { + start = str2int(start, last, fpar->fmtstate_.precision_, fac); + precision_set = true; + } + else + fpar->fmtstate_.precision_ =0; + } + + // handle formatting-type flags : + while( start != last && ( *start== const_or_not(fac).widen( 'l') + || *start== const_or_not(fac).widen( 'L') + || *start== const_or_not(fac).widen( 'h')) ) + ++start; + if( start>=last) { + maybe_throw_exception(exceptions, start-start0+offset, fstring_size); + return true; + } + + if( in_brackets && *start== const_or_not(fac).widen( '|') ) { + ++start; + return true; + } + switch ( wrap_narrow(fac, *start, 0) ) { + case 'X': + fpar->fmtstate_.flags_ |= std::ios_base::uppercase; + case 'p': // pointer => set hex. + case 'x': + fpar->fmtstate_.flags_ &= ~std::ios_base::basefield; + fpar->fmtstate_.flags_ |= std::ios_base::hex; + break; + + case 'o': + fpar->fmtstate_.flags_ &= ~std::ios_base::basefield; + fpar->fmtstate_.flags_ |= std::ios_base::oct; + break; + + case 'E': + fpar->fmtstate_.flags_ |= std::ios_base::uppercase; + case 'e': + fpar->fmtstate_.flags_ &= ~std::ios_base::floatfield; + fpar->fmtstate_.flags_ |= std::ios_base::scientific; + + fpar->fmtstate_.flags_ &= ~std::ios_base::basefield; + fpar->fmtstate_.flags_ |= std::ios_base::dec; + break; + + case 'f': + fpar->fmtstate_.flags_ &= ~std::ios_base::floatfield; + fpar->fmtstate_.flags_ |= std::ios_base::fixed; + case 'u': + case 'd': + case 'i': + fpar->fmtstate_.flags_ &= ~std::ios_base::basefield; + fpar->fmtstate_.flags_ |= std::ios_base::dec; + break; + + case 'T': + ++start; + if( start >= last) + maybe_throw_exception(exceptions, start-start0+offset, fstring_size); + else + fpar->fmtstate_.fill_ = *start; + fpar->pad_scheme_ |= format_item_t::tabulation; + fpar->argN_ = format_item_t::argN_tabulation; + break; + case 't': + fpar->fmtstate_.fill_ = const_or_not(fac).widen( ' '); + fpar->pad_scheme_ |= format_item_t::tabulation; + fpar->argN_ = format_item_t::argN_tabulation; + break; + + case 'G': + fpar->fmtstate_.flags_ |= std::ios_base::uppercase; + break; + case 'g': // 'g' conversion is default for floats. + fpar->fmtstate_.flags_ &= ~std::ios_base::basefield; + fpar->fmtstate_.flags_ |= std::ios_base::dec; + + // CLEAR all floatield flags, so stream will CHOOSE + fpar->fmtstate_.flags_ &= ~std::ios_base::floatfield; + break; + + case 'C': + case 'c': + fpar->truncate_ = 1; + break; + case 'S': + case 's': + if(precision_set) // handle truncation manually, with own parameter. + fpar->truncate_ = fpar->fmtstate_.precision_; + fpar->fmtstate_.precision_ = 6; // default stream precision. + break; + case 'n' : + fpar->argN_ = format_item_t::argN_ignored; + break; + default: + maybe_throw_exception(exceptions, start-start0+offset, fstring_size); + } + ++start; + + if( in_brackets ) { + if( start != last && *start== const_or_not(fac).widen( '|') ) { + ++start; + return true; + } + else maybe_throw_exception(exceptions, start-start0+offset, fstring_size); + } + return true; + } + // -end parse_printf_directive() + + template + int upper_bound_from_fstring(const String& buf, + const typename String::value_type arg_mark, + const Facet& fac, + unsigned char exceptions) + { + // quick-parsing of the format-string to count arguments mark (arg_mark, '%') + // returns : upper bound on the number of format items in the format strings + using namespace boost::io; + typename String::size_type i1=0; + int num_items=0; + while( (i1=buf.find(arg_mark,i1)) != String::npos ) { + if( i1+1 >= buf.size() ) { + if(exceptions & bad_format_string_bit) + boost::throw_exception(bad_format_string(i1, buf.size() )); // must not end in ".. %" + else break; // stop there, ignore last '%' + } + if(buf[i1+1] == buf[i1] ) {// escaped "%%" + i1+=2; continue; + } + + ++i1; + // in case of %N% directives, dont count it double (wastes allocations..) : + i1 = detail::wrap_scan_notdigit(fac, buf.begin()+i1, buf.end()) - buf.begin(); + if( i1 < buf.size() && buf[i1] == arg_mark ) + ++i1; + ++num_items; + } + return num_items; + } + template inline + void append_string(String& dst, const String& src, + const typename String::size_type beg, + const typename String::size_type end) { +#if !defined(BOOST_NO_STRING_APPEND) + dst.append(src.begin()+beg, src.begin()+end); +#else + dst += src.substr(beg, end-beg); +#endif + } + +} // detail namespace +} // io namespace + + + +// ----------------------------------------------- +// format :: parse(..) + + template + basic_format& basic_format:: + parse (const string_type& buf) { + // parse the format-string + using namespace std; +#if !defined(BOOST_NO_STD_LOCALE) + const std::ctype & fac = BOOST_USE_FACET( std::ctype, getloc()); +#else + io::basic_oaltstringstream fac; + //has widen and narrow even on compilers without locale +#endif + + const Ch arg_mark = io::detail::const_or_not(fac).widen( '%'); + bool ordered_args=true; + int max_argN=-1; + + // A: find upper_bound on num_items and allocates arrays + int num_items = io::detail::upper_bound_from_fstring(buf, arg_mark, fac, exceptions()); + make_or_reuse_data(num_items); + + // B: Now the real parsing of the format string : + num_items=0; + typename string_type::size_type i0=0, i1=0; + typename string_type::const_iterator it; + bool special_things=false; + int cur_item=0; + while( (i1=buf.find(arg_mark,i1)) != string_type::npos ) { + string_type & piece = (cur_item==0) ? prefix_ : items_[cur_item-1].appendix_; + if( buf[i1+1] == buf[i1] ) { // escaped mark, '%%' + io::detail::append_string(piece, buf, i0, i1+1); + i1+=2; i0=i1; + continue; + } + BOOST_ASSERT( static_cast(cur_item) < items_.size() || cur_item==0); + + if(i1!=i0) + io::detail::append_string(piece, buf, i0, i1); + ++i1; + it = buf.begin()+i1; + bool parse_ok = io::detail::parse_printf_directive( + it, buf.end(), &items_[cur_item], fac, i1, exceptions()); + i1 = it - buf.begin(); + if( ! parse_ok ) // the directive will be printed verbatim + continue; + i0=i1; + items_[cur_item].compute_states(); // process complex options, like zeropad, into params + + int argN=items_[cur_item].argN_; + if(argN == format_item_t::argN_ignored) + continue; + if(argN ==format_item_t::argN_no_posit) + ordered_args=false; + else if(argN == format_item_t::argN_tabulation) special_things=true; + else if(argN > max_argN) max_argN = argN; + ++num_items; + ++cur_item; + } // loop on %'s + BOOST_ASSERT(cur_item == num_items); + + // store the final piece of string + { + string_type & piece = (cur_item==0) ? prefix_ : items_[cur_item-1].appendix_; + io::detail::append_string(piece, buf, i0, buf.size()); + } + + if( !ordered_args) { + if(max_argN >= 0 ) { // dont mix positional with non-positionnal directives + if(exceptions() & io::bad_format_string_bit) + boost::throw_exception(io::bad_format_string(max_argN, 0)); + // else do nothing. => positionnal arguments are processed as non-positionnal + } + // set things like it would have been with positional directives : + int non_ordered_items = 0; + for(int i=0; i< num_items; ++i) + if(items_[i].argN_ == format_item_t::argN_no_posit) { + items_[i].argN_ = non_ordered_items; + ++non_ordered_items; + } + max_argN = non_ordered_items-1; + } + + // C: set some member data : + items_.resize(num_items, format_item_t(io::detail::const_or_not(fac).widen( ' ')) ); + + if(special_things) style_ |= special_needs; + num_args_ = max_argN + 1; + if(ordered_args) style_ |= ordered; + else style_ &= ~ordered; + return *this; + } + +} // namespace boost + + +#endif // BOOST_FORMAT_PARSING_HPP diff -Nru bombono-dvd-0.5.2/libs/boost-lib/boost/format.hpp bombono-dvd-0.6.0/libs/boost-lib/boost/format.hpp --- bombono-dvd-0.5.2/libs/boost-lib/boost/format.hpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/boost/format.hpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,59 @@ +// ---------------------------------------------------------------------------- +// format.hpp : primary header +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/format for library home page + + +// ---------------------------------------------------------------------------- + +#ifndef BOOST_FORMAT_HPP +#define BOOST_FORMAT_HPP + +#include +#include +#include +#include + +#ifndef BOOST_NO_STD_LOCALE +#include +#endif + +// *** Compatibility framework +#include + +#ifdef BOOST_NO_LOCALE_ISIDIGIT +#include // we'll use the non-locale 's std::isdigit(int) +#endif + +// **** Forward declarations ---------------------------------- +#include // basic_format, and other frontends +#include // misc forward declarations for internal use + +// **** Auxiliary structs (stream_format_state , and format_item ) +#include + +// **** Format class interface -------------------------------- +#include + +// **** Exceptions ----------------------------------------------- +#include + +// **** Implementation ------------------------------------------- +#include // member functions +#include // class for grouping arguments +#include // argument-feeding functions +#include // format-string parsing (member-)functions + +// **** Implementation of the free functions ---------------------- +#include + + +// *** Undefine 'local' macros : +#include + +#endif // BOOST_FORMAT_HPP diff -Nru bombono-dvd-0.5.2/libs/boost-lib/libs/filesystem/src/operations_posix_windows.cpp bombono-dvd-0.6.0/libs/boost-lib/libs/filesystem/src/operations_posix_windows.cpp --- bombono-dvd-0.5.2/libs/boost-lib/libs/filesystem/src/operations_posix_windows.cpp 2009-04-18 20:28:38.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/libs/filesystem/src/operations_posix_windows.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -348,6 +348,8 @@ struct stat path_stat; if(::stat( ph.string().c_str(), &path_stat ) != 0) { + // Murav'jov - want strict policy as in 1.38 + return false; if((errno == ENOENT) || (errno == ENOTDIR)) return false; // stat failed because the path does not exist // for any other error we assume the file does exist and fall through, diff -Nru bombono-dvd-0.5.2/libs/boost-lib/libs/format/benchmark/bench_format.cpp bombono-dvd-0.6.0/libs/boost-lib/libs/format/benchmark/bench_format.cpp --- bombono-dvd-0.5.2/libs/boost-lib/libs/format/benchmark/bench_format.cpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/libs/format/benchmark/bench_format.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,388 @@ +// -*- C++ -*- +// Boost general library 'format' --------------------------- +// See http://www.boost.org for updates, documentation, and revision history. + +// (C) Samuel Krempp 2001 +// krempp@crans.ens-cachan.fr +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +// several suggestions from Jens Maurer + +// ------------------------------------------------------------------------------ +// bench_variants.cc : do the same task, with snprintf, stream, and format +// and compare their times. + +// This benchmark is provided purely for information. +// It might not even compile as-is, +// or not give any sensible results. +// (e.g., it expects sprintf to be POSIX compliant) + +// ------------------------------------------------------------------------------ + + +#include +#include +#include // sprintf +#include +#include +#include // floor +#include + +#include + +//#define knelson + +#ifdef knelson +namespace KNelson { +#include "boost/format3.hpp" +} +#endif + + + + +// portable /dev/null stream equivalent, by James Kanze, http://www.gabi-soft.de +class NulStreambuf : public std::streambuf +{ +public: + NulStreambuf() { + setp( dummyBuffer , dummyBuffer + 64 ) ; + } + virtual int overflow( int c ); + virtual int underflow(); +private: + char dummyBuffer[ 64 ] ; +} ; + +class NulStream : public std::basic_ostream > +{ +public: + NulStream(); + virtual ~NulStream(); + NulStreambuf* rdbuf() { + return static_cast< NulStreambuf* >( + ((std::basic_ostream > *) this) -> rdbuf() ) ; + } +} ; + + +//------------------------------------------------------------------------------------- +// NulStream implementation + +NulStream::NulStream() : std::basic_ostream > (NULL) { + init( new NulStreambuf ) ; +} + +NulStream::~NulStream() { + delete rdbuf() ; +} + +int NulStreambuf::underflow(){ return std::ios::traits_type::eof(); +} + +int NulStreambuf::overflow( int c ){ + setp( dummyBuffer , dummyBuffer + 64 ) ; + return (c == std::ios::traits_type::eof()) ? '\0' : c ; +} + + + +// ------------------------------------------------------------------------------------- + +static int NTests = 300000; + +//static std::stringstream nullStream; +static NulStream nullStream; +static double tstream, tpf; +//static const std::string fstring="%3$#x %1$20.10E %2$g %3$d \n"; +static const std::string fstring="%3$0#6x %1$20.10E %2$g %3$0+5d \n"; +static const double arg1=45.23; +static const double arg2=12.34; +static const int arg3=23; +static const std::string res = +"0x0017 4.5230000000E+01 12.34 +0023 \n"; +//static const std::string res = "23.0000 4.5230000000E+01 12.34 23 \n"; +void test_snprintf(); +void test_nullstream(); +void test_opti_nullstream(); +void test_parsed_once_format(); +void test_reused_format(); +void test_format(); +void test_try1(); +void test_try2(); + +#ifdef knelson +void test_format3(); +#endif + +int main(int argc, char * argv[]) { + using namespace boost; + using namespace std; + const string::size_type npos = string::npos; + + string choices=""; + if(1 oss; + oss << boost::format(fstring) % arg1 % arg2 % arg3; + boost::timer chrono; + int dummy=0; + for(int i=0; i oss; + oss << boost::format(fstring) % arg1 % arg2 % arg3; + oss << "blas 34567890GGGGGGGGGGGGGGGGGGGGGGGGGGGGggggggggggggggggggggggggggg " << endl; + string s = oss.cur_str(); + oss << s << s << s; + oss.clear_buffer(); + oss << s << s; + s = oss.cur_str(); + boost::timer chrono; + int dummy=0; + for(int i=0; i oss; + + { + do_stream(oss); + if(oss.str() != res ) { + cerr << endl << oss.str() ; + } + } + + for(int i=0; i oss; + //static const std::string fstring="%3$#x %1$20.10E %2$g %3$d \n"; + + std::ios_base::fmtflags f0 = oss.flags(), f1, f2; + streamsize p0 = oss.precision(); + { + oss << hex << showbase; + f1 = oss.flags(); + oss << arg3; + + oss.flags(f0); + oss << " " << scientific << setw(20) << setprecision(10) << uppercase; + f2 = oss.flags(); + oss << arg1; + + oss.flags(f0); oss.precision(p0); + oss << " " << arg2 << " " << arg3 << " \n" ; + + if(oss.str() != res ) { + cerr << endl << oss.str() ; + } + } + + for(int i=0; i oss; + oss << boost::format(fmter) % arg1 % arg2 % arg3 ; + if( oss.str() != res ) { + cerr << endl << oss.str(); + } + + // not only is the format-string parsed once, + // but also the buffer of the internal stringstream is already allocated. + + boost::timer chrono; + for(int i=0; i oss; + oss << boost::format(fstring) % arg1 % arg2 % arg3; + if(oss.str() != res ) { + cerr << endl << oss.str(); + } + + boost::timer chrono; + boost::format fmter; + for(int i=0; i oss; + oss << boost::format(fstring) % arg1 % arg2 % arg3; + if(oss.str() != res ) { + cerr << endl << oss.str(); + } + + boost::timer chrono; + for(int i=0; i oss; + oss << KNelson::boost::format(fstring.c_str(), arg1, arg2, arg3); + if(oss.str() != res ) { + cerr << endl << oss.str(); + } + + boost::timer chrono; + for(int i=0; i$(BOOST_ROOT) BOOST_FORMAT_OVERLOADS BOOST_FORMAT_ONLY_BASICFMT +# ; + +#exe bench_format_basicfmt +# : bench_format.cpp +# : $(BOOST_ROOT) BOOST_FORMAT_ONLY_BASICFMT +# ; + +exe bench_format_no_locale + : bench_format.cpp + : $(BOOST_ROOT) BOOST_NO_STD_LOCALE + ; + +exe bench_format_normal + : bench_format.cpp + : $(BOOST_ROOT) + ; + +exe bench_format_no_reuse_stream + : bench_format.cpp + : alts $(BOOST_ROOT) BOOST_FORMAT_NO_OSS_MEMBER + ; + +exe format_test + : format_test.cpp + : $(BOOST_ROOT) + ; + diff -Nru bombono-dvd-0.5.2/libs/boost-lib/libs/format/benchmark/results.txt bombono-dvd-0.6.0/libs/boost-lib/libs/format/benchmark/results.txt --- bombono-dvd-0.5.2/libs/boost-lib/libs/format/benchmark/results.txt 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/libs/format/benchmark/results.txt 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,288 @@ +// This benchmark is provided purely for information. +// It might not even compile as-is, +// or not give any sensible results. +// (e.g., it expects sprintf to be POSIX compliant) + + new results ( with outsstream vs. stringstream) + +bjam -sTOOLS="gcc intel-linux-7.1" -sBUILD="release" + +( -sBUILD="profile" for profiling..) + + + "_no_reuse_stream" "_stringstr" "_strstream" _no_locale + +intel-linux-7.1 + +for comp in gcc ; do + echo "\n------------------- Compiler $comp : ---------------- " + for var in _overloads _basicfmt _normal; do + echo "\n-- Variant **" $var "**" : + texe=$EXEBOOST/libs/format/benchmark/bench_format${var}/${comp}/release/bench_format${var} ; + ls -l $texe; + $texe + done +done + + +// stringstream recr chaque fois. +-- Variant ** _normal ** : +-rwx--x--x 1 sam users 61952 Sep 17 03:13 /home/data/zStore/BBoost/bin/boost//libs/format/benchmark/bench_format_normal/gcc/release/bench_format_normal +printf time :2.16 +ostream time : 3.69, = 1.70833 * printf +parsed-once time : 8.45, = 3.91204 * printf , = 2.28997 * nullStream +reused format time :10.94, = 5.06481 * printf , = 2.96477 * nullStream +format time :10.97, = 5.0787 * printf , = 2.9729 * nullStream + + +Pour le parsing. step 1 : scan_not + str2int (version Iter const& qques % mieux) + +------------------- Compiler gcc : ---------------- + +-- Variant ** _overloads ** : +-rwx--x--x 1 sam users 52864 2003-09-12 02:59 /home/sam/progs/Boost/bin/BBoost//libs/format/benchmark/bench_format_overloads/gcc/release/bench_format_overloads +printf time :2.21 +ostream time : 3.57, = 1.61538 * printf +parsed-once time : 4.93, = 2.23077 * printf , = 1.38095 * nullStream +reused format time : 9.25, = 4.18552 * printf , = 2.59104 * nullStream +format time :10.33, = 4.67421 * printf , = 2.89356 * nullStream + +-- Variant ** _basicfmt ** : +-rwx--x--x 1 sam users 52864 2003-09-12 03:00 /home/sam/progs/Boost/bin/BBoost//libs/format/benchmark/bench_format_basicfmt/gcc/release/bench_format_basicfmt +printf time :2.2 +ostream time : 3.57, = 1.62273 * printf +parsed-once time : 4.85, = 2.20455 * printf , = 1.35854 * nullStream +reused format time : 9.25, = 4.20455 * printf , = 2.59104 * nullStream +format time :10.29, = 4.67727 * printf , = 2.88235 * nullStream + +-- Variant ** _normal ** : +-rwx--x--x 1 sam users 53088 2003-09-12 03:00 /home/sam/progs/Boost/bin/BBoost//libs/format/benchmark/bench_format_normal/gcc/release/bench_format_normal +printf time :2.27 +ostream time : 3.47, = 1.52863 * printf +parsed-once time : 4.79, = 2.11013 * printf , = 1.3804 * nullStream +reused format time : 9.88, = 4.35242 * printf , = 2.84726 * nullStream +format time :10.97, = 4.8326 * printf , = 3.16138 * nullStream + +------------------------------------------------------------------------------------------------- +Overload : int, double char * -> put_simple : +#if defined(BOOST_FORMAT_OVERLOADS) + template + basic_format& operator%(const char* x) + { return io::detail::feed_overloaded(*this,x); } + template + basic_format& operator%(const double x) + { return io::detail::feed_overloaded(*this,x); } + template + basic_format& operator%(const int x) + { return io::detail::feed_overloaded(*this,x); } +#endif + + // put overloads for common types (-> faster) + template< class Ch, class Tr, class T> + void put_simple( T x, + const format_item& specs, + std::basic_string & res, + io::basic_outsstream& oss_ ) + { + typedef std::basic_string string_t; + typedef format_item format_item_t; + + specs.fmtstate_.apply_on(oss_); + const std::ios_base::fmtflags fl=oss_.flags(); + const std::streamsize w = oss_.width(); + + if(w!=0) + oss_.width(0); + put_last( oss_, x); + const Ch * res_beg = oss_.begin(); + std::streamsize res_size = std::min(specs.truncate_, oss_.pcount()); + int prefix_space = 0; + if(specs.pad_scheme_ & format_item_t::spacepad) + if( res_size == 0 || ( res_beg[0] !='+' && res_beg[0] !='-' )) + prefix_space = 1; + mk_str(res, res_beg, res_size, w, oss_.fill(), fl, + prefix_space, (specs.pad_scheme_ & format_item_t::centered) !=0 ); + clear_buffer( oss_); + } // end- put_simple(..) + + + +------------------- Compiler gcc : ---------------- + +-- Variant ** _overloads ** : +-rwx--x--x 1 sam users 52832 2003-09-12 00:17 /home/sam/progs/Boost/bin/BBoost//libs/format/benchmark/bench_format_overloads/gcc/release/bench_format_overloads +printf time :2.13 +ostream time : 2.91, = 1.3662 * printf +parsed-once time : 4.48, = 2.10329 * printf , = 1.53952 * nullStream +reused format time : 9.42, = 4.42254 * printf , = 3.23711 * nullStream +format time : 11.1, = 5.21127 * printf , = 3.81443 * nullStream + +RERUN +printf time :2.09 +ostream time : 2.92, = 1.39713 * printf +parsed-once time : 4.43, = 2.11962 * printf , = 1.51712 * nullStream +reused format time : 9.29, = 4.44498 * printf , = 3.18151 * nullStream +format time :11.05, = 5.28708 * printf , = 3.78425 * nullStream + +-- Variant ** _basicfmt ** : +-rwx--x--x 1 sam users 52832 2003-09-12 00:17 /home/sam/progs/Boost/bin/BBoost//libs/format/benchmark/bench_format_basicfmt/gcc/release/bench_format_basicfmt +printf time :2.16 +ostream time : 3.01, = 1.39352 * printf +parsed-once time : 4.41, = 2.04167 * printf , = 1.46512 * nullStream +reused format time : 9.61, = 4.44907 * printf , = 3.19269 * nullStream +format time :11.02, = 5.10185 * printf , = 3.66113 * nullStream + +-- Variant ** _no_locale ** : +-rwx--x--x 1 sam users 52192 2003-09-12 00:09 /home/sam/progs/Boost/bin/BBoost//libs/format/benchmark/bench_format_no_locale/gcc/release/bench_format_no_locale +printf time :2.1 +ostream time : 2.87, = 1.36667 * printf +parsed-once time : 4.44, = 2.11429 * printf , = 1.54704 * nullStream +reused format time : 8.21, = 3.90952 * printf , = 2.86063 * nullStream +format time : 9.25, = 4.40476 * printf , = 3.223 * nullStream + +-- Variant ** _normal ** : +-rwx--x--x 1 sam users 53056 2003-09-12 00:17 /home/sam/progs/Boost/bin/BBoost//libs/format/benchmark/bench_format_normal/gcc/release/bench_format_normal +printf time :2.18 +ostream time : 2.92, = 1.33945 * printf +parsed-once time : 5.75, = 2.63761 * printf , = 1.96918 * nullStream +reused format time :10.27, = 4.71101 * printf , = 3.51712 * nullStream + + + + + + + + + + + + + + + + + + + + +------------------- Compiler gcc : ---------------- + +-- Variant ** _normal ** : +-rwx--x--x 1 sam users 49280 2003-09-10 21:12 /home/sam/progs/Boost/bin/BBoost//libs/format/benchmark/bench_format_normal/gcc/release/bench_format_normal +printf time :2.16 +ostream time : 2.81, = 1.30093 * printf +stored format time :11.56, = 5.35185 * printf , = 4.11388 * nullStream +format time :18.69, = 8.65278 * printf , = 6.65125 * nullStream + +-- Variant ** _static_stream ** : +-rwx--x--x 1 sam users 45856 2003-09-10 21:13 /home/sam/progs/Boost/bin/BBoost//libs/format/benchmark/bench_format_static_stream/gcc/release/bench_format_static_stream +printf time :2.1 +ostream time : 2.79, = 1.32857 * printf +stored format time : 4.5, = 2.14286 * printf , = 1.6129 * nullStream +format time :10.05, = 4.78571 * printf , = 3.60215 * nullStream + +-- Variant ** _basicfmt ** : +-rwx--x--x 1 sam users 47200 2003-09-10 21:13 /home/sam/progs/Boost/bin/BBoost//libs/format/benchmark/bench_format_basicfmt/gcc/release/bench_format_basicfmt +printf time :2.22 +ostream time : 2.88, = 1.2973 * printf +stored format time : 4.45, = 2.0045 * printf , = 1.54514 * nullStream +format time :11.67, = 5.25676 * printf , = 4.05208 * nullStream + + + + + +The cost of imbuing locale after each object is fed : + +------------------- Compiler gcc : ---------------- +-- Variant _normal : +-rwx--x--x 1 sam users 49920 2003-09-10 20:23 /home/sam/progs/Boost/bin/BBoost//libs/format/benchmark/bench_format_normal/gcc/release/bench_format_normal +printf time :2.21 +ostream time : 3.1, = 1.40271 * printf +stored format time :11.53, = 3.71935 * stream +format time :18.86, = 6.08387 * stream + +-- Variant _static_stream : +-rwx--x--x 1 sam users 43232 2003-09-10 20:24 /home/sam/progs/Boost/bin/BBoost//libs/format/benchmark/bench_format_static_stream/gcc/release/bench_format_static_stream +printf time :2.19 +ostream time : 3.09, = 1.41096 * printf +stored format time : 4.63, = 1.49838 * stream +format time :10.12, = 3.27508 * stream + +-- Variant _basicfmt : +-rwx--x--x 1 sam users 45760 2003-09-10 20:24 /home/sam/progs/Boost/bin/BBoost//libs/format/benchmark/bench_format_basicfmt/gcc/release/bench_format_basicfmt +printf time :2.23 +ostream time : 3.14, = 1.40807 * printf +stored format time : 4.61, = 1.46815 * stream +format time :11.33, = 3.60828 * stream + + + + + + + +------------------- Compiler gcc : ---------------- +-- Variant _normal : +printf time :2.15 +ostream time :4.42, = 2.05581 * printf +stored format time :5.85, = 1.32353 * stream +format time :11.53, = 2.6086 * stream +-- Variant _no_reuse_stream : +printf time :2.13 +ostream time :4.4, = 2.06573 * printf +stored format time :11.1, = 2.52273 * stream +format time :14.3, = 3.25 * stream +-- Variant _stringstr : +printf time :2.01 +ostream time :4.42, = 2.199 * printf +stored format time :7.92, = 1.79186 * stream +format time :12.8, = 2.89593 * stream + +------------------- Compiler intel-linux-7.1 : ---------------- +-- Variant _normal : +printf time :2.08 +ostream time :4.49, = 2.15865 * printf +stored format time :5.3, = 1.1804 * stream +format time :17.8, = 3.96437 * stream +-- Variant _no_reuse_stream : +printf time :2.09 +ostream time :4.37, = 2.09091 * printf +stored format time :10.07, = 2.30435 * stream +format time :14.46, = 3.30892 * stream +-- Variant _stringstr : +printf time :1.99 +ostream time :5.16, = 2.59296 * printf +stored format time :5.83, = 1.12984 * stream +format time :17.42, = 3.37597 * stream + + + + +// older Result with gcc-3.03 on linux : + +// With flag -g : + +/*** +printf time :1.2 +ostream time :2.84, = 2.36667 * printf +stored format time :8.91, = 3.13732 * stream +format time :15.35, = 5.40493 * stream +format3 time :21.83, = 7.68662 * stream +***/ + + +// With flag -O + +/*** +printf time :1.16 +ostream time :1.94, = 1.67241 * printf +stored format time :3.68, = 1.89691 * stream +format time :6.31, = 3.25258 * stream +format3 time :9.04, = 4.65979 * stream +***/ + +// ==> that's quite acceptable. + +// ------------------------------------------------------------------------------ diff -Nru bombono-dvd-0.5.2/libs/boost-lib/libs/format/doc/choices.html bombono-dvd-0.6.0/libs/boost-lib/libs/format/doc/choices.html --- bombono-dvd-0.5.2/libs/boost-lib/libs/format/doc/choices.html 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/libs/format/doc/choices.html 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,258 @@ + + +Type-safe 'printf-like' format class + + + + +

boost.png (6897 bytes)Type-safe 'printf-like' format class

+

Choices made

+ +

"Le pourquoi du comment" ( - "the why of the how")

+
+

The syntax of the format-string

+

+Format is a new library. One of its goal is to provide a replacement for printf, +that means format can parse a format-string designed for printf, apply it to the given arguments, +and produce the same result as printf would have. +
With this constraint, there were roughly 3 possible choices for the syntax of the format-string : +

    +
  1. Use the exact same syntax of printf. It's well known by many experienced users, +and fits almost all needs. But with C++ streams, the type-conversion character, crucial to determine +the end of a directive, is only useful to set some associated formatting options, in a C++ streams +context (%x for setting hexa, etc..) +It would be better to make this obligatory type-conversion character, with modified meaning, optional. +
  2. +
  3. extend printf syntax while maintaining compatibility, by using characters and constructs +not yet valid as printf syntax. e.g. : "%1%", "%[1]", "%|1$d|", .. +Using begin / end marks, all sort of extension can be considered. +
  4. +
  5. Provide a non-legacy mode, in parallel of the printf-compatible one, that can be +designed to fit other objectives without constraints of compatibilty with the +existing printf syntax. +
    But Designing a replacement to printf's syntax, that would be clearly better, and as much powerful, + is yet another task than building a format class. + When such a syntax is designed, we should consider splitting Boost.format into + 2 separate libraries : one working hand in hand with this new syntax, and another + supporting the legacy syntax (possibly a fast version, built with + safety improvement above snprintf or the like). +
  6. +
+ +In the absence of a full, clever, new syntax clearly better adapted to C++ streams than printf, +the second approach was chosen. Boost.format uses printf's syntax, with extensions +(tabulations, centered alignements) that can be expressed using extensions to this syntax. +
And alternate compatible notations are provided to address the weaknesses of printf's : +
    +
  • "%N%" as a simpler positional, typeless and optionless notation.
  • +
  • %|spec| as a way to encapsulate printf directive in movre visually evident structures, + at the same time making printf's 'type-conversion character' optional. + +
+

+ + +
+

Why are arguments passed through an operator rather than a function call ?

+
+The inconvenience of the operator approach (for some people) +is that it might be confusing. It's a usual warning that too much +of overloading operators gets people real confused. +
+Since the use of format objects will be in specific contexts +( most often right after a "cout << ") + and look like a formatting string followed by arguments indeed : + +
+format(" %s at %s  with %s\n") % x % y % z;
+
+we can hope it wont confuse people that much. +

+An other fear about operators, is precedence problems. +What if I someday write format("%s") % x+y +
instead of format("%s") % (x+y) ?? +
+It will make a mistake at compile-time, so the error will be immediately detected. +
indeed, this line calls tmp = operator%( format("%s"), x) +
and then operator+(tmp, y) +
tmp will be a format object, for which no implicit conversion is defined, +and thus the call to operator+ will fail. (except if you define such an operator, of course). +So you can safely assume precedence mistakes will be noticed at compilation. +

+
+On the other hand, the function approach has a true inconvenience. +It needs to define lots of template function like : + +

+template <class T1, class T2,  .., class TN> 
+string format(string s,  const T1& x1, .... , const T1& xN);
+
+
+ +and even if we define those for N up to 500, that is still a limitation, that +C's printf does not have. +
+Also, since format somehow emulates printf in some cases, but is far from being +fully equivalent to printf, it's best to use a radically different appearance, +and using operator calls succeeds very well in that ! + +

+

+
+Anyhow, if we actually chose the formal function call templates system, +it would only be able to print Classes T for which there is an +

operator<< ( stream,   const T&)
+Because allowing both const and non const produces a combinatorics explosion - + if we go up to 10 arguments, we need 2^10 functions. +
(providing overloads on T& / const T& is at the frontier of defects of the C++ +standard, and thus is far from guaranteed to be supported. But right now several compilers +support those overloads) +
+There is a lot of chances that a class which only provides the non-const +equivalent is badly designed, but yet it is another unjustified +restriction to the user. +
Also, some manipulators are functions, and can not be passed as const references. +The function call approach thus does not support manipulators well. +

+ +

+In conclusion, using a dedicated binary operator is the simplest, most robust, +and least restrictive mechanism to pass arguments +when you can't know the number of arguments at compile-time. + +


+

Why operator% rather than a member function 'with(..)' ??

+technically, +
format(fstr) % x1 % x2 % x3;
+has the same structure as +
format(fstr).with( x1 ).with( x2 ).with( x3 );
+ +which does not have any precedence problem. +The only drawback, is it's harder for the eye to catch what is done in this line, +than when we are using operators. +calling .with(..), it looks just like any other line of code. + +So it may be a better solution, depending on tastes. +The extra characters, and overall cluttered aspect of the line of code using 'with(..)' +were enough for me to opt for a true operator. + +
+

Why operator% rather than usual formatting operator<< ??

+
    +
  • + because passing arguments to a format object is *not* the same as sending variables, sequentially, into a stream, and because a format object is not a stream, nor a manipulator. +
    +We use an operator to pass arguments. format will use them as a function would, it simply takes arguments one by one. + +
    +format objects can not provide stream-like behaviour. When you try to implement a format object that acts like a manipulator, returning a stream, you make the user beleive it is completely like a +stream-manipulator. And sooner or later, the user is deceived by this point of view. +
    The most obvious example of that difference in behaviour is +
    +cout << format("%s %s ") << x;
    +cout << y ;  // uh-oh, format is not really a stream manipulator
    +
    +
  • +
  • precedence of % is higher than that of <<. +It can be viewd as a problem, because + and - thus needs to be grouped inside parentheses, while it is not necessary with '<<'. +But if the user forgets, the mistake is catched at compilation, and hopefully he won't forget +again. +
    +On the other hand, the higher precedence makes format's behaviour very straight-forward. +
    +cout << format("%s %s ") % x % y << endl;
    +
    +is treated exaclt like : +
    +cout << ( format("%s %s ") % x % y ) << endl;
    +
    +So using %, the life of a format object does not interfere with the surrounding stream context. +This is the simplest possible behaviour, and thus the user is able to continue using the stream +after the format object. +
    +
    +With operator<<, things are much more problematic in this situation. This line : +
    +cout << format("%s %s ") <<  x  <<  y << endl;
    +
    +is understood as : +
    +( ( ( cout << format("%s %s ") ) << x ) <<  y ) << endl;
    +
    +Several alternative implementations chose operator<<, and there is only one way to make it work : +
    +the first call to
    operator<<( ostream&, format const&)
    +returns a proxy, encapsulating both the +final destination (cout) and the format-string information +
    +Passing arguments to format, or to the final destination after completion of the format are +indistinguishable. This is a problem. +

    +I examined several possible implementations, and none is completely satsifying. +
    +E.g. : In order to catch users mistake, it makes sense to raise exceptions when the user passes too many arguments. But in this context, supplementary arguments are most certainly aimed at the final destination. +There are several choices here : +

      +
    • You can give-up detection of arity excess, and have the proxy's template member operator<<( const T&) +simply forward all supplementary arguments to cout. +
    • +
    • Require the user to close the format arguments with a special manipulator, 'endf', in this way : +
      +cout << format("%s %s ") <<  x  <<  y << endf << endl;
      +
      +You can define endf to be a function that returns the final destination stored inside the proxy. +Then it's okay, after endf the user is calling << on cout again. +
    • +
    • An intermediate solution, is to adress the most frequent use, where the user simply wants to +output one more manipulator item to cout (a std::flush, or endl, ..) +
      +cout << format("%s %s \n") <<  x  <<  y << flush ;
      +
      +Then, the solution is to overload the operator<< for manipulators. +This way You don't need endf, but outputting a non-manipulator item right after the format +arguments is a mistake. +
    • +
    +
    +The most complete solution is the one with the endf manipualtor. +With operator%, there is no need for this end-format function, plus you instantly see which arguments are going into the format object, and which are going to the stream. +

    + +
  • +
  • Esthetically : '%' is the same letter as used inside the format-string. That is quite +nice to have the same letter used for passing each argument. +'<<' is 2 letters, '%' is one. '%' is also smaller in size. + It overall improves visualisation (we see what goes with what) : +
    cout << format("%s %s %s") %x %y %z << "And  avg is" << format("%s\n") %avg;
    +
    + compared to : +
    cout << format("%s %s %s") << x << y << z << endf <<"And avg is" << format("%s\n") << avg;
    +
    + "<<" misleadingly puts the arguments at the same level as any object passed to the stream. +
  • +
  • python also uses % for formatting, so you see it's not so "unheard of" + ;-) +
+ +
+

Why operator% rather than operator(), or operator[] ??

+ +

+operator() has the merit of being the natural way to send an argument into a function. +And some think that operator[] 's meaning apply well to the usage in format. +
They're as good as operator% technically, but quite ugly. (that's a matter of taste) +
And deepd down, using operator% for passing arguments that were referred to by "%" in the +format string seems much more natural to me than using those operators. + + + + +


+

July 07, 2001

+

Copyright Samuel Krempp 2001. Permission to copy, use, modify, sell and +distribute this document is granted provided this copyright notice appears in +all copies. This document is provided "as is" without express or implied +warranty, and with no claim as to its suitability for any purpose.

+

+

 

diff -Nru bombono-dvd-0.5.2/libs/boost-lib/libs/format/doc/format.html bombono-dvd-0.6.0/libs/boost-lib/libs/format/doc/format.html --- bombono-dvd-0.5.2/libs/boost-lib/libs/format/doc/format.html 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/libs/format/doc/format.html 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,865 @@ + + +The Boost Format library + + + + +

boost.png (6897 bytes)The Boost Format library

+

The +<boost/format.hpp> +format class provides printf-like formatting, in a type-safe manner which allows output of +user-defined types. +
+

+ + +
+

Synopsis

+

A format object is constructed from a format-string, and is then given arguments through +repeated calls to operator%. +
+Each of those arguments are then converted to strings, who are in turn combined into one string, + according to the format-string. +

+
+cout << boost::format("writing %1%,  x=%2% : %3%-th try") % "toto" % 40.23 % 50; 
+     // prints "writing toto,  x=40.230 : 50-th try"
+
+ + +
+

How it works

+
    +
  1. When you call format(s), where s is the format-string, it constructs an object, +which parses the format string and look for all directives in it and prepares internal structures +for the next step.
  2. +
  3. +Then, either immediately, +as in
    cout << format("%2% %1%") % 36 % 77 )
    +or later on, as in +
    format fmter("%2% %1%");
    +fmter % 36; fmter % 77;
    +you feed variables into the formatter. +
    those variables are dumped into an internal stream, +which state is set according to the given formatting options in the format-string +-if there are any-, +and the format object stores the string results for the last step. +
  4. +
  5. Once all arguments have been fed you can dump the format object to a stream, +or get its string value by using the +str() member function, or the free function str(const format& ) in namespace boost. The result string stays accessible in the format object until another argument is passed, +at which time it is reinitialised. + +
    +
    +// fmter was previously created and fed arguments, it can print the result :
    +cout << fmter ;  
    +
    +// You can take the string result :
    +string s  = fmter.str();
    +
    +// possibly several times :
    +s = fmter.str( );
    +
    +// You can also do all steps at once :
    +cout << boost::format("%2% %1%") % 36 % 77; 
    +
    +// using the str free function :
    +string s2 = str( format("%2% %1%") % 36 % 77 );
    +
    +
    +
  6. +
  7. +Optionnally, after step 3, you can re-use a format object and restart at step2 : +fmter % 18 % 39; +
    to format new variables with the same format-string, saving the expensive processing +involved at step 1. +
  8. +
+All in all, the format class translates a format-string (with eventually printf-like directives) +into operations on an internal stream, and finally returns the result of the formatting, +as a string, or directly into an output stream. + + +
+

Examples

+ +
+using namespace std;
+using boost::format;
+using boost::io::group;
+
+
    +
  • Simple output, with reordering : +
    +
    +cout << format("%1% %2% %3% %2% %1% \n") % "11" % "22" % "333"; // 'simple' style.
    +
    +
    + It prints : "11 22 333 22 11 \n" +
  • + +
  • More precise formatting, with Posix-printf positional directives : +
    +
    +cout << format("(x,y) = (%1$+5d,%2$+5d) \n") % -23 % 35;     // Posix-Printf style
    +
    +
    + It prints : "(x,y) = ( -23, +35) \n" +
  • + +
  • classical printf directive, no reordering : +
    +
    +cout << format("writing %s,  x=%s : %d-th step \n") % "toto" % 40.23 % 50; 
    +
    +
    + It prints : "writing toto, x=40.23 : 50-th step \n" +
  • + +
  • Several ways to express the same thing : +
    +
    +cout << format("(x,y) = (%+5d,%+5d) \n") % -23 % 35;
    +cout << format("(x,y) = (%|+5|,%|+5|) \n") % -23 % 35;
    +
    +cout << format("(x,y) = (%1$+5d,%2$+5d) \n") % -23 % 35;
    +cout << format("(x,y) = (%|1$+5|,%|2$+5|) \n") % -23 % 35;
    +
    +
    + all those print : "(x,y) = ( -23, +35) \n" + +
  • + +
  • Using manipulators to modify the format-string : +
    +
    +format fmter("_%1$+5d_ %1$d \n");
    +
    +format fmter2("_%1%_ %1% \n");
    +fmter2.modify_item(1, group(showpos, setw(5)) ); 
    +
    +cout << fmter % 101 ;
    +cout << fmter2 % 101 ;
    +
    +
    + Both print the same : "_ +101_ 101 \n" +
  • + +
  • Using manipulators with arguments : +
    +
    +cout << format("_%1%_ %1% \n") % group(showpos, setw(5), 101);
    +
    +
    + The manipulators are applied at each occurence of %1%, and thus it prints : "_ +101_ +101 \n" +
  • + +
  • New formatting feature : 'absolute tabulations', useful inside loops, +to insure a field is printed at the same position from one line to the next, +even if the widthes of the previous arguments can vary a lot. + +
    +
    +for(unsigned int i=0; i < names.size(); ++i)
    +    cout << format("%1%, %2%, %|40t|%3%\n") % names[i] % surname[i] % tel[i];
    +
    +
    + +For some std::vector names, surnames, and tel (see sample_new_features.cpp) it prints : +
    +Marc-Franois Michel, Durand,           +33 (0) 123 456 789
    +Jean, de Lattre de Tassigny,            +33 (0) 987 654 321
    +
    + + +
  • + +
+ +
+

Sample Files

+

The program sample_formats.cpp + demonstrates simple uses of format. +
+

sample_new_features.cpp + illustrates the few formatting features that were added to printf's syntax such as + simple positional directives, centered alignment, and 'tabulations'. +
+

sample_advanced.cpp + demonstrates uses of advanced features, like reusing, and modifying, format objects, etc.. +
+

And sample_userType.cpp +shows the behaviour of the format library on user-defined types. +

+ + + +
+

Syntax

+

+boost::format( format-string ) % arg1 % arg2 % ... % argN + +

+ +

+The format-string contains text in which special directives will be replaced by +strings resulting from the formatting of the given arguments. +
The legacy syntax in the C and C++ worlds is the one used by printf, and thus format can use +directly printf format-strings, and produce the same result (in almost all cases. see +Incompatibilities with printf for details) +
+This core syntax was extended, to allow new features, but also to adapt to the C++ streams context. +Thus, format accepts several forms of directives in format-strings : +

    +
  • Legacy printf format strings : %spec where spec is a + printf format specification +
    spec passes formatting options, like width, alignment, numerical base used for + formatting numbers, + as well as other specific flags. + But the classical type-specification flag of printf has a weaker meaning + in format. It merely sets the appropriate flags on the internal stream, + and/or formatting parameters, + but does not require the corresponding argument to be of a specific type. +
    + e.g. : the specification 2$x, + meaning "print argument number 2, which is an integral number, in hexa" for printf, + merely means "print argument 2 with stream basefield flags set to hex" for format. +
  • +
  • %|spec| where spec is a printf format specification. +
    + The brackets are introduced, to improve the readability of the format-string, + but primarily, to make the type-conversion character optional + in spec. This information is not necessary with C++ variables, + but with direct printf syntax, it is necessary to always give a type-conversion character, + merely because this character is crucial to determine the end of a format-specification. +
    + e.g. : "%|-5|" will format the next variable with width set to 5, and left-alignment + just like the following printf directives : "%-5g", "%-5f", "%-5s" .. +
  • +
  • %N%
    This simple positional notation + requests the formatting of the N-th argument - wihout any formatting option. +
    + (It's merely a shortcut to Printf's positional directives (like "%N$s"), + but a major benefit is that it's much more readable, and + does not use a "type-conversion" character) +
  • +
+ On top of the standard printf format specifications, new features were implemented, like centered alignment. See new format specification for details. + + +

printf format specifications

+

+The printf format specifications supported by Boost.format follows the Unix98 +Open-group printf +precise syntax, rather than the standard C printf, which does not support positional arguments. +(Common flags have the same meaning in both, so it should not be a headache for anybody) +
+ Note that it is an error to use positional format specifications +(e.g. %3$+d) + mixed with non-positional ones (e.g. %+d) in the same format string. +
+In the Open-group specification, referring to the same argument several times (e.g. "%1$d %1$d") has undefined behaviour. Boost.format's behaviour in such cases is to allow each argument to be reffered to any number of times. The only constraint is +that it expects exactly P arguments, P being the maximum argument number used in the + format string. (e.g., for "%1$d %10$d", P == 10 ). +
Supplying more, or less, than P arguments raises an exception. +(unless it was set otherwise, see exceptions) +

+

+
+
+A specification spec has the form : +[ N$ ] [ flags ] [ width ] +[ . precision ] type-char +
+
+Fields insided square brackets are optional. +Each of those fields are explained one by one in the following list : +

+ +
    +
  • +N $ (optional field) specifies that the format specification applies to the N-th argument. (it is called a positional format specification) +
    If this is not present, arguments are taken one by one. (and it is then an error to later supply an argument number) +
  • +flags is a sequences of any of those : +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Flag Meaning effect on internal stream
    '-' left alignmentN/A (applied later on the string)
    '=' centered alignmentN/A (applied later on the string) +
    - note : added feature, not in printf - +
    '_' internal alignmentsets internal alignment +
    - note : added feature, not in printf - +
    '+' show sign even for positive numberssets showpos
    '#'show numerical base, and decimal pointsets showbase and showpoint
    '0'pad with 0's (inserted after sign or base indicator)if not left-aligned, calls setfill('0') and sets internal +
    Extra actions are taken after stream conversion to handle + user-defined output.
    ' 'if the string does not begin with + or -, + insert a space before the converted stringN/A (applied later on the string) +
    Different to printf's behaviour : it is not affected by internal alignment
    +
    +
  • + +
  • +width specifies a minimal width for the string resulting form the conversion. +If necessary, the string will be padded with alignment and fill characters either set on the stream via manipulators, or specified by the format-string (e.g. flags '0', '-', ..) +
    +Note that width is not just set on the conversion stream. +To support output of user-defined types +(that might call operator<< many times on several members), +the width is handled after stream conversion of the whole argument object, +in the format class code. +
  • +precision (preceded by a point), sets the stream's precision +
      +
    • When outputting a floatting type number, it sets the maximum number of digits +
      • after decimal point when in fixed or scientific mode
      • +
      • in total when in default mode ('general mode', like %g)
      • +
      +
    • When used with type-char s or S it takes another meaning : + the conversion string is truncated to the precision first chars. + (Note that the eventual padding to width is done after truncation.) +
    • +
    +
  • +
  • +type-char. it does not impose the concerned argument to be of a restricted set +of types, but merely sets the flags that are associated with this type specification. + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Type-CharMeaningeffect on stream
    p or xhexadecimal outputsets hex
    ooctal outputsets oct
    escientific float formatsets floatfield bits to scientific
    ffixed float formatsets floatfield bits to fixed
    ggeneral -default- float formatunset all floatfield bits
    X, E or Gsame effect as their lowercase counterparts, + but using uppercase letters for number outputs. (exponents, hex digits, ..)same effects as 'x', 'e', or 'g', + plus uppercase
    d, i or udecimal type outputsets basefield bits to dec
    s or Sstring outputprecision specification is unset, + and its value goes to an internal field for later 'truncation'. + (see precision explanation above)
    c or C1-character outputonly the first character of the conversion string is used.
    %print the character %N/A
    +
    +

    Note that the 'n' type specification is ignored (and so is the corresponding argument), + because it does not fit in this context. +
    +Also, printf 'l', 'L', or 'h' modifiers (to indicate wide, long or short types) are supported +(and simply have no effect on the internal stream). +

    + +
  • +
+ + +

new format-specifications

+
    +
  • as stated in the flags table, centered and internal alignment flags (' = ', +and ' _ ') were added. +
  • +
  • %{nt} , where n is a positive number, + inserts an absolute tabulation. + It means that format will, if needed, fill the string with characters, until + the length of the string created so far reaches n characters. + (see examples ) +
  • +
  • %{nTX} inserts a tabulation in the same way, + but using X as fill character instead of the current 'fill' char of the stream + (which is space for a stream in default state) +
  • +
+ + +

Differences of behaviour vs printf

+Suppose you have variables x1, x2 (built_in types, supported by C's printf), +
and a format string s intended for use with a printf function this way : +
+printf(s, x1, x2);
+
+
+In almost all cases, the result will be the same as with this command : +
+cout << format(s) % x1 % x2;
+
+ +

+But because some printf format specifications don't translate well into stream formatting options, +there are a few notable imperfections in the way Boost.format emulates printf.
+In any case, the format class should quietly ignore the unsupported options, so +that printf format-strings are always accepted by format and produce almost the same +output as printf. +

+
Here is the full list of such differences : +
    +
  • '0' and ' ' options : +printf ignores these options for non numeric conversions, but format applies them to all +types of variables. +(so it is possible to use those options on user-defined types, e.g. a Rational class, etc..) +
  • +
  • precision for integral types arguments has a special meaning for printf : +
    printf( "(%5.3d)" , 7 ) ; prints ( 007) +
    While format, like streams, ignores the precision parameter for integral types conversions. +
  • +
  • the ' printf option +(format with thousands grouping characters)) +has no effect in format. +
  • +
  • Width or precision set to asterisk (*) are used by printf to read this field from +an argument. e.g. +printf("%1$d:%2$.*3$d:%4$.*3$d\n", hour, min, precision, sec); +
    This class does not support this mechanism for now. so such precision or width fields are quietly +ignored by the parsing. +
+ +Also, note that the special 'n' type-specification +(used to tell printf to save in a variable the number of characters output by the formatting) +has no effect in format. +
Thus format strings containing this type-specification should produce the same converted +string by printf or format. +It will not cause differences in the formatted strings between printf and format. +
To get the number of characters in the formatted string using Boost.Format, +you can use the size() member function : +
+format formatter("%+5d");
+cout << formatter % x;
+unsigned int n = formatter.size();
+
+ + +
+

User-defined types output

+

+All flags which are translated into modification to the stream state +act recursively within user-defined types. +( the flags remain active, and so does the desired format option, for each of +the '<<' operations that might be called by the user-defined class) +

+e.g., with a Rational class, we would have something like : +
+Rational ratio(16,9);
+cerr << format("%#x \n")  % ratio;  // -> "0x10/0x9 \n"
+
+ +

+It's a different story for other formatting options. For example, setting width applies +to the final output produced by the object, not to each of its internal outputs, and +that's fortunate : +

+
+cerr << format("%-8d")  % ratio;  // -> "16/9    "      and not    "16      /9       "
+cerr << format("%=8d")  % ratio;  // -> "  16/9  "      and not    "   16   /    9   "
+
+

+
But so does the 0 and ' ' options (contrarily to '+' which is directly translated to the stream +state by showpos. But no such flags exist for the zero and space printf options) +
and that is less natural : +

+
+cerr << format("%+08d \n")  % ratio;  // -> "+00016/9"
+cerr << format("% 08d \n")  % ratio;  // -> "000 16/9"
+
+It is possible to obtain a better behaviour by carefully designing the Rational's operator<< +to handle the stream's width, alignment and showpos paramaters by itself. This is demonstrated in +sample_userType.cpp. + +

+ + +
+

Manipulators, and internal stream state

+

+The internal stream state of format is saved before +and restored after output of an argument; therefore, the modifiers are not sticky and affect only +the argument they are applied to. +
The default state for streams, as stated by the standard, is : +precision 6, width 0, right alignment, and decimal flag set. +

+

+The state of the internal format stream can be changed by manipulators passed along +with the argument; via the group function, like that : +

+
+cout << format("%1% %2% %1%\n") % group(hex, showbase, 40) % 50; // prints "0x28 50 0x28\n"
+
+

+
When passing N items inside a 'group' Boost.format needs to process manipulators +diferently from regular argument, and thus using group is subject to the following constraints : +

    +
  1. the object to be printed must be passed as the last item in the group
  2. +
  3. the first N-1 items are treated as manipulators, and if they do produce output, it is discarded +
  4. +
+ + + +

+Such manipulators are passed to the streams right before the following argument, +at every occurence. +Note that formatting options specified within the format string are overridden +by stream state modifiers passed this way. For instance in the following code, +the hex manipulator has priority over the d type-specification in + the format-string which would set decimal output : +

+
+cout << format("%1$d %2% %1%\n") % group(hex, showbase, 40) % 50; 
+// prints "0x28 50 0x28\n"
+
+ + + +

Alternatives

+
    +
  • +printf is the classical alternative, that is not type safe and not extendable to user-defined types. +
  • +ofrstream.cc + by Karl Nelson's design was a big source of inspiration to this format class. +
  • +
  • James Kanze's library + has a format class (in srcode/Extended/format ) which looks + very well polished. Its design has in common with this class the use of internal stream + for the actual conversions, as well as using operators to pass arguments. + (but his class, as ofrstream, uses operator<< rather than operator% ) +
  • +
  • Karl Nelson's library + was intented as demonstration of alternative solutions + in discussions on Boost's list for the design of Boost.format. +
  • +
+ + + +
+

Exceptions

+

+Boost.format enforces a number of rules on the usage of format objects. The format-string must obeys +the syntax described above, the user must supply exactly the right number of arguments before outputting to the final destination, and if using modify_item or bind_arg, items and arguments index +must not be out of range. +
+When format detects that one of these rules is not satisfied, it raises a corresponding exception, +so that the mistakes don't go unnoticed and unhandled. +
+But the user can change this behaviour to fit his needs, +and select which types of errors may raise exceptions using the following functions : +

+
+
+unsigned char exceptions(unsigned char newexcept); // query and set
+unsigned char exceptions() const;                  // just query
+
+
+ +

+The user can compute the argument newexcept by combining the following atoms using binary arithmetic : + +

    +
  • boost::io::bad_format_string_bit selects errors due to ill-formed format-strings. +
  • + +
  • boost::io::too_few_args_bit selects errors due to asking for the srting result before all arguments are passed. +
  • + +
  • boost::io::too_many_args_bit selects errors due to passing too many arguments. +
  • + +
  • boost::io::out_of_range_bit select errors due to out of range index supplied by the user when calling + modify_item or other functions taking an item index (or an argument index) +
  • + +
  • boost::io::all_error_bits selects all errors +
  • + +
  • boost::io::no_error_bits selects no error. +
  • + +
+

+For instance, if you don't want Boost.format to detect bad number of arguments, you can define +a specific wrapper function for building format objects with the right exceptions settings : +

+
+
+boost::format  my_fmt(const std::string & f_string) {
+    using namespace boost::io;
+    format fmter(f_string);
+    fmter.exceptions( all_error_bits ^ ( too_many_args_bit | too_few_args_bit )  );
+    return fmter;
+}
+
+
+ +It is then allowed to give more arguments than needed (they are simply ignored) : + +
+
+cout << my_fmt(" %1% %2% \n") % 1 % 2 % 3 % 4 % 5;
+
+
+ +And if we ask for the result before all arguments are supplied, the corresponding part of the +result is simply empty + +
+
+cout << my_fmt(" _%2%_ _%1%_ \n") % 1 ;
+// prints      " __ _1_ \n"
+
+
+ + +
+

A Note about performance

+

+The performance of boost::format for formatting a few builtin type arguments with reordering can be compared +to that of Posix-printf, and of the equivalent stream manual operations to give a measure +of the overhead incurred. +The result may greatly depend on the compiler, standard library implementation, and the precise +choice of format-string and arguments. +

+

+Since common stream implementations eventually call functions of the printf family for the actual +formatting of numbers, in general printf will be noticeably faster than the direct stream operations +And due to to the reordering overhead (allocations to store the pieces of string, +stream initialisation at each item formatting, ..) the +direct stream operations would be faster than boost::format, +(one cas expect a ratio ranging from 2 to 5 or more) +

+

+When iterated formattings are a performance bottleneck, performance can be slightly increased by parsing +the format string into a format object, and copying it at each formatting, in the following way. +

+
+    const boost::format fmter(fstring);
+    dest << boost::format(fmter) % arg1 % arg2 % arg3 ;
+
+

+As an example of performance results, the author measured the time of execution of iterated formattings +with 4 different methods +

+
    +
  1. posix printf
  2. +
  3. manual stream output (to a dummy nullStream stream sending the bytes into oblivion)
  4. +
  5. boost::format copied from a const object as shown above
  6. +
  7. the straigt boost::format usage
  8. +
+

+the test was compiled with g++-3.3.3 and the following timings were measured (in seconds, and ratios) : +

+
+string     fstring="%3$0#6x %1$20.10E %2$g %3$0+5d \n";
+double     arg1=45.23;
+double     arg2=12.34;
+int        arg3=23;
+
+- release mode :
+printf                 : 2.13
+nullStream             : 3.43,  = 1.61033 * printf
+boost::format copied   : 6.77,  = 3.1784  * printf ,  = 1.97376 * nullStream
+boost::format straight :10.67,  = 5.00939 * printf ,  = 3.11079 * nullStream
+
+- debug mode :
+printf                 : 2.12
+nullStream             : 3.69,  = 1.74057 * printf
+boost::format copied   :10.02,  = 4.72642 * printf ,  = 2.71545 * nullStream
+boost::format straight :17.03,  = 8.03302 * printf ,  = 4.61518 * nullStream
+
+ + + +
+

Class Interface Extract

+ +
namespace boost {
+
+template<class charT, class Traits=std::char_traits<charT> > 
+class basic_format 
+{
+public:
+  typedef std::basic_string<charT, Traits> string_t;
+  typedef typename string_t::size_type     size_type;
+  basic_format(const charT* str);
+  basic_format(const charT* str, const std::locale & loc);
+  basic_format(const string_t& s);
+  basic_format(const string_t& s, const std::locale & loc);
+  basic_format& operator= (const basic_format& x);
+
+  void clear(); // reset buffers
+  basic_format& parse(const string_t&); // clears and parse a new format string
+
+  string_t str() const;
+  size_type size() const;
+
+  // pass arguments through those operators :
+  template<class T>  basic_format&   operator%(T& x);  
+  template<class T>  basic_format&   operator%(const T& x);
+
+  // dump buffers to ostream :
+  friend std::basic_ostream<charT, Traits>& 
+  operator<< <> ( std::basic_ostream<charT, Traits>& , basic_format& ); 
+
+   // Choosing which errors will throw exceptions :
+   unsigned char exceptions() const;
+   unsigned char exceptions(unsigned char newexcept);
+
+// ............  this is just an extract .......
+}; // basic_format
+
+typedef basic_format<char >          format;
+typedef basic_format<wchar_t >      wformat;
+
+
+// free function for ease of use :
+template<class charT, class Traits> 
+std::basic_string<charT,Traits>  str(const basic_format<charT,Traits>& f) {
+      return f.str();
+}
+
+
+} // namespace boost
+
+

+

+
+ + +

Rationale

+

This class's goal is to bring a better, C++, type-safe and type-extendable printf + equivalent to be used with streams. +

+Precisely, format was designed to provide the following features : +
    +
  • support positional arguments (required for internationalisation) +
  • accept an unlimited number of arguments. +
  • make formatting commands visually natural. +
  • support the use of manipulators to modify the display of an argument. + in addition to the format-string syntax. +
  • accept any types of variables, by relying on streams for the actual conversion + to string. This specifically concerns user-defined types, for which the formatting + options effects should be intuitively natural. +
  • provide printf-compatibility, as much as it makes sense in a type-safe and type-extendable + context. +
  • +
+

In the process of the design, many issues were faced, and some choices were made, that + might not be intuitively right. But in each case they were taken for + some reasons. +

+
+

Credits

+

The author of Boost format is Samuel Krempp.   He used ideas from + Rdiger Loos' format.hpp and Karl Nelson's formatting classes. +


+ +

Revised 26 January, 2003

+

+Valid HTML 4.0! +

+

Samuel Krempp 2002

+

Use, modification, and distribution are subject to the Boost Software +License, Version 1.0. (See accompanying file +LICENSE_1_0.txt or copy at +www.boost.org/LICENSE_1_0.txt)

+ +

+

 

diff -Nru bombono-dvd-0.5.2/libs/boost-lib/libs/format/example/Jamfile bombono-dvd-0.6.0/libs/boost-lib/libs/format/example/Jamfile --- bombono-dvd-0.5.2/libs/boost-lib/libs/format/example/Jamfile 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/libs/format/example/Jamfile 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,32 @@ +# Boost.Bind Library test Jamfile +# +# Copyright (c) 2003 Samuel Krempp +# +# Permission to copy, use, modify, sell and distribute this software +# is granted provided this copyright notice appears in all copies. +# This software is provided "as is" without express or implied +# warranty, and with no claim as to its suitability for any purpose. + +subproject libs/format/example ; + +exe sample_formats + : sample_formats.cpp + : $(BOOST_ROOT) + ; + +exe sample_advanced + : sample_advanced.cpp + : $(BOOST_ROOT) + ; + +exe sample_new_features + : sample_new_features.cpp + : $(BOOST_ROOT) + ; + +exe sample_userType + : sample_userType.cpp + : $(BOOST_ROOT) + ; + + diff -Nru bombono-dvd-0.5.2/libs/boost-lib/libs/format/example/sample_advanced.cpp bombono-dvd-0.6.0/libs/boost-lib/libs/format/example/sample_advanced.cpp --- bombono-dvd-0.5.2/libs/boost-lib/libs/format/example/sample_advanced.cpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/libs/format/example/sample_advanced.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,156 @@ +// ---------------------------------------------------------------------------- +// sample_advanced.cc : examples of adanced usage of format +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/format for library home page + +// ---------------------------------------------------------------------------- + +#include +#include + +#include "boost/format.hpp" + + +namespace MyNS_ForOutput { + using std::cout; using std::cerr; + using std::string; + using std::endl; using std::flush; + + using boost::format; + using boost::io::group; +} + +namespace MyNS_Manips { + using std::setfill; + using std::setw; + using std::hex ; + using std::dec ; + using std::showbase ; + using std::left ; + using std::right ; + using std::internal ; +} + +int main(){ + using namespace MyNS_ForOutput; + using namespace MyNS_Manips; + + std::string s; + + //------------------------------------------------------------------------ + // storing the parsed format-string in a 'formatter' : + // format objects are regular objects that can be copied, assigned, + // fed arguments, dumped to a stream, re-fed arguments, etc... + // So users can use them the way they like. + + format fmter("%1% %2% %3% %1% \n"); + fmter % 10 % 20 % 30; + cout << fmter; + // prints "10 20 30 10 \n" + + // note that once the fmter got all its arguments, + // the formatted string stays available (until next call to '%') + // The result is available via function str() or stream's << : + cout << fmter; + // prints the same string again. + + + // once you call operator% again, arguments are cleared inside the object + // and it is an error to ask for the conversion string before feeding all arguments : + fmter % 1001; + try { cout << fmter; } + catch (boost::io::too_few_args& exc) { + cout << exc.what() << "***Dont worry, that was planned\n"; + } + + // we just need to feed the last two arguments, and it will be ready for output again : + cout << fmter % 1002 % 1003; + // prints "1001 1002 1003 1001 \n" + + cout << fmter % 10 % 1 % 2; + // prints "10 1 2 10 \n" + + + + //--------------------------------------------------------------- + // using format objects + + // modify the formatting options for a given directive : + fmter = format("%1% %2% %3% %2% %1% \n"); + fmter.modify_item(4, group(setfill('_'), hex, showbase, setw(5)) ); + cout << fmter % 1 % 2 % 3; + // prints "1 2 3 __0x2 1 \n" + + // bind one of the argumets : + fmter.bind_arg(1, 18); + cout << fmter % group(hex, showbase, 20) % 30; // %2 is 20, and 20 == 0x14 + // prints "18 0x14 30 _0x14 18 \n" + + + fmter.modify_item(4, setw(0)); // cancels previous width-5 + fmter.bind_arg(1, 77); // replace 18 with 77 for first argument. + cout << fmter % 10 % 20; + // prints "77 10 20 0xa 77 \n" + + try + { + cout << fmter % 6 % 7 % 8; // Aye ! too many args, because arg1 is bound already + } + catch (boost::io::too_many_args& exc) + { + cout << exc.what() << "***Dont worry, that was planned\n"; + } + + // clear regular arguments, but not bound arguments : + fmter.clear(); + cout << fmter % 2 % 3; + // prints "77 2 3 0x2 77 \n" + + // clear_binds() clears both regular AND bound arguments : + fmter.clear_binds(); + cout << fmter % 1 % 2 % 3; + // prints "1 2 3 0x2 1 \n" + + + // setting desired exceptions : + fmter.exceptions( boost::io::all_error_bits ^( boost::io::too_many_args_bit ) ); + cout << fmter % 1 % 2 % 3 % 4 % 5 % 6 ; + + + // ----------------------------------------------------------- + // misc: + + // unsupported printf directives %n and asterisk-fields are purely ignored. + // do *NOT* provide an argument for them, it is an error. + cout << format("|%5d| %n") % 7 << endl; + // prints "| 7| " + cout << format("|%*.*d|") % 7 << endl; + // prints "|7|" + + + // truncations of strings : + cout << format("%|.2s| %|8c|.\n") % "root" % "user"; + // prints "ro u.\n" + + + // manipulators conflicting with format-string : manipulators win. + cout << format("%2s") % group(setfill('0'), setw(6), 1) << endl; + // prints "000001" + cout << format("%2$5s %1% %2$3s\n") % 1 % group(setfill('X'), setw(4), 2) ; + // prints "XXX2 1 XXX2\n" + // width is 4, as set by manip, not the format-string. + + // nesting : + cout << format("%2$014x [%1%] %2$05s\n") % (format("%05s / %s") % -18 % 7) + % group(showbase, -100); + // prints "0x0000ffffff9c [-0018 / 7] -0100\n" + + + cout << "\n\nEverything went OK, exiting. \n"; + return 0; +} diff -Nru bombono-dvd-0.5.2/libs/boost-lib/libs/format/example/sample_formats.cpp bombono-dvd-0.6.0/libs/boost-lib/libs/format/example/sample_formats.cpp --- bombono-dvd-0.5.2/libs/boost-lib/libs/format/example/sample_formats.cpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/libs/format/example/sample_formats.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,112 @@ +// ---------------------------------------------------------------------------- +// sample_formats.cpp : example of basic usage of format +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/format for library home page +// ---------------------------------------------------------------------------- + +#include +#include +#include + +#include "boost/format.hpp" + +// 2 custom namespaces, to bring in a few useful names : + +namespace MyNS_ForOutput { + using std::cout; using std::cerr; + using std::string; + using std::endl; using std::flush; + + using boost::format; + using boost::io::group; +} + +namespace MyNS_Manips { + using std::setfill; + using std::setw; + using std::hex ; + using std::dec ; +// gcc-2.95 doesnt define the next ones +// using std::showbase ; +// using std::left ; +// using std::right ; +// using std::internal ; +} + +int main(){ + using namespace MyNS_ForOutput; + using namespace MyNS_Manips; + + std::cout << format("%|1$1| %|2$3|") % "Hello" % 3 << std::endl; + + // Reordering : + cout << format("%1% %2% %3% %2% %1% \n") % "o" % "oo" % "O"; // 'simple' style. + // prints "o oo O oo o \n" + cout << format("(x,y) = (%1$+5d,%2$+5d) \n") % -23 % 35; // Posix-Printf style + + + // No reordering : + cout << format("writing %s, x=%s : %d-th step \n") % "toto" % 40.23 % 50; + // prints "writing toto, x=40.23 : 50-th step \n" + + cout << format("(x,y) = (%+5d,%+5d) \n") % -23 % 35; + cout << format("(x,y) = (%|+5|,%|+5|) \n") % -23 % 35; + cout << format("(x,y) = (%|1$+5|,%|2$+5|) \n") % -23 % 35; + // all those are the same, it prints "(x,y) = ( -23, +35) \n" + + + + // Using manipulators, via 'group' : + cout << format("%2% %1% %2%\n") % 1 % group(setfill('X'), hex, setw(4), 16+3) ; + // prints "XX13 1 XX13\n" + + + // printf directives's type-flag can be used to pass formatting options : + cout << format("_%1$4d_ is : _%1$#4x_, _%1$#4o_, and _%1$s_ by default\n") % 18; + // prints "_ 18_ is : _0x12_, _ 022_, and _18_ by default\n" + + // Taking the string value : + std::string s; + s= str( format(" %d %d ") % 11 % 22 ); + assert( s == " 11 22 "); + + + // ----------------------------------------------- + // %% prints '%' + + cout << format("%%##%#x ") % 20 << endl; + // prints "%##0x14 " + + + // ----------------------------------------------- + // Enforcing the right number of arguments + + // Too much arguments will throw an exception when feeding the unwanted argument : + try { + format(" %1% %1% ") % 101 % 102; + // the format-string refers to ONE argument, twice. not 2 arguments. + // thus giving 2 arguments is an error + } + catch (boost::io::too_many_args& exc) { + cerr << exc.what() << "\n\t\t***Dont worry, that was planned\n"; + } + + + // Too few arguments when requesting the result will also throw an exception : + try { + cerr << format(" %|3$| ") % 101; + // even if %1$ and %2$ are not used, you should have given 3 arguments + } + catch (boost::io::too_few_args& exc) { + cerr << exc.what() << "\n\t\t***Dont worry, that was planned\n"; + } + + + cerr << "\n\nEverything went OK, exiting. \n"; + return 0; +} diff -Nru bombono-dvd-0.5.2/libs/boost-lib/libs/format/example/sample_new_features.cpp bombono-dvd-0.6.0/libs/boost-lib/libs/format/example/sample_new_features.cpp --- bombono-dvd-0.5.2/libs/boost-lib/libs/format/example/sample_new_features.cpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/libs/format/example/sample_new_features.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,68 @@ +// ---------------------------------------------------------------------------- +// sample_new_features.cpp : demonstrate features added to printf's syntax +// ---------------------------------------------------------------------------- + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/format for library home page + +// ---------------------------------------------------------------------------- + +#include +#include + +#include "boost/format.hpp" + +int main(){ + using namespace std; + using boost::format; + using boost::io::group; + + // ------------------------------------------------------------------------ + // Simple style of reordering : + cout << format("%1% %2% %3% %2% %1% \n") % "o" % "oo" % "O"; + // prints "o oo O oo o \n" + + + // ------------------------------------------------------------------------ + // Centered alignment : flag '=' + cout << format("_%|=6|_") % 1 << endl; + // prints "_ 1 _" : 3 spaces are padded before, and 2 after. + + + + // ------------------------------------------------------------------------ + // Tabulations : "%|Nt|" => tabulation of N spaces. + // "%|NTf|" => tabulation of N times the character . + // are useful when printing lines with several fields whose width can vary a lot + // but we'd like to print some fields at the same place when possible : + vector names(1, "Marc-Franois Michel"), + surname(1,"Durand"), + tel(1, "+33 (0) 123 456 789"); + + names.push_back("Jean"); + surname.push_back("de Lattre de Tassigny"); + tel.push_back("+33 (0) 987 654 321"); + + for(unsigned int i=0; i +#include +#include "boost/format.hpp" + + +#if !(BOOST_WORKAROUND(__GNUC__, < 3) && defined(__STL_CONFIG_H) ) + // not for broken gcc stdlib +#include + +#else +// not as complete, but compatible with gcc-2.95 : + +void copyfmt(ios& left, const ios& right) { + left.fill(right.fill()); + left.flags(right.flags() ); + left.exceptions(right.exceptions()); + left.width(right.width()); + left.precision(right.precision()); +} + +namespace boost { namespace io { +class ios_all_saver { + std::basic_ios ios_; + std::ios & target_r; +public: + ios_all_saver(std::ios& right) : ios_(0), target_r(right) { + copyfmt(ios_, right); + } + ~ios_all_saver() { + copyfmt(target_r, ios_); + } +}; + +} } // N.S. boost::io + + +// define showpos and noshowpos : +class ShowPos { +public: + bool showpos_; + ShowPos(bool v) : showpos_(v) {} +}; +std::ostream& operator<<(std::ostream& os, const ShowPos& x) { + if(x.showpos_) + os.setf(ios_base:: showpos); + else + os.unsetf(ios_base:: showpos); + return os; +} +ShowPos noshowpos(false); +ShowPos showpos(true); + +#endif // -end gcc-2.95 workarounds + + + +//---------------------------------------------------------------------------// +// *** an exemple of UDT : a Rational class **** +class Rational { +public: + Rational(int n, unsigned int d) : n_(n), d_(d) {} + Rational(int n, int d); // convert denominator to unsigned + friend std::ostream& operator<<(std::ostream&, const Rational&); +private: + int n_; // numerator + unsigned int d_; // denominator +}; + +Rational::Rational(int n, int d) : n_(n) +{ + if(d < 0) { n_ = -n_; d=-d; } // make the denominator always non-negative. + d_ = static_cast(d); +} + +std::ostream& operator<<(std::ostream& os, const Rational& r) { + using namespace std; + streamsize n, s1, s2, s3; + streamsize w = os.width(0); // width has to be zeroed before saving state. +// boost::io::ios_all_saver bia_saver (os); + + boost::io::basic_oaltstringstream oss; + oss.copyfmt(os ); + oss << r.n_; + s1 = oss.size(); + oss << "/" << noshowpos; // a rational number needs only one sign ! + s2 = oss.size(); + oss << r.d_ ; + s3 = oss.size(); + + n = w - s3; + if(n <= 0) { + os.write(oss.begin(), oss.size()); + } + else if(os.flags() & std::ios_base::internal) { + std::streamsize n1 = w/2, n2 = w - n1, t; + t = (s3-s1) - n2; // is 2d part '/nnn' bigger than 1/2 w ? + if(t > 0) { + n1 = w -(s3-s1); // put all paddings on first part. + n2 = 0; // minimal width (s3-s2) + } + else { + n2 -= s2-s1; // adjust for '/', n2 is still w/2. + } + os << setw(n1) << r.n_ << "/" << noshowpos << setw(n2) << r.d_; + } + else { + if(! (os.flags() & std::ios_base::left)) { + // -> right align. (right bit is set, or no bit is set) + os << string(n, ' '); + } + os.write(oss.begin(), s3); + if( os.flags() & std::ios_base::left ) { + os << string(n, ' '); + } + } + + return os; +} + + + +int main(){ + using namespace std; + using boost::format; + using boost::io::group; + using boost::io::str; + string s; + + Rational r(16, 9); + + cout << "bonjour ! " << endl; + + cout << r << endl; + // prints : "16/9" + + cout << showpos << r << ", " << 5 << endl; + // prints : "+16/9, +5" + + cout << format("%02d : [%0+9d] \n") % 1 % r ; + + cout << format("%02d : [%_+9d] \n") % 2 % Rational(9,160); + + cout << format("%02d : [%_+9d] \n") % 3 % r; + + cout << format("%02d : [%_9d] \n") % 4 % Rational(8,1234); + + cout << format("%02d : [%_9d] \n") % 5 % Rational(1234,8); + + cout << format("%02d : [%09d] \n") % 6 % Rational(8,1234); + + cout << format("%02d : [%0+9d] \n") % 7 % Rational(1234,8); + + cout << format("%02d : [%0+9d] \n") % 8 % Rational(7,12345); + + /* output : +bonjour ! +16/9 ++16/9, +5 +01 : [+016/0009] +02 : [+ 9/ 160] +03 : [+ 16/ 9] +04 : [ 8/1234] +05 : [1234/ 8] +06 : [0008/1234] +07 : [+1234/008] +08 : [+07/12345] + */ + + + cerr << "\n\nEverything went OK, exiting. \n"; + return 0; +} diff -Nru bombono-dvd-0.5.2/libs/boost-lib/libs/format/index.html bombono-dvd-0.6.0/libs/boost-lib/libs/format/index.html --- bombono-dvd-0.5.2/libs/boost-lib/libs/format/index.html 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/libs/format/index.html 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,82 @@ + + + +The Boost Format library + + + + + + + + + + + + + + +
boost.png (6897 bytes)Home Libraries People FAQ More
+ +

Boost Format library

+ +

+The format library provides a class for formatting arguments according to a format-string, +as does printf, but with two major differences : +
+

    +
  • format sends the arguments to an internal stream, and so is entirely type-safe and +naturally supports all user-defined types.
  • +
  • The ellipsis (...) can not be used correctly in the strongly typed context of format, +and thus the function call with arbitrary arguments is replaced by successive calls to an +argument feeding operator% +
  • +
+ +

+ +

+
+You can find more Details in : +

+Submitted by Samuel Krempp.

+ + + diff -Nru bombono-dvd-0.5.2/libs/boost-lib/libs/format/Jamfile bombono-dvd-0.6.0/libs/boost-lib/libs/format/Jamfile --- bombono-dvd-0.5.2/libs/boost-lib/libs/format/Jamfile 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/libs/format/Jamfile 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,15 @@ +# Boost.Bind Library test Jamfile +# +# Copyright (c) 2003 Samuel Krempp +# +# Permission to copy, use, modify, sell and distribute this software +# is granted provided this copyright notice appears in all copies. +# This software is provided "as is" without express or implied +# warranty, and with no claim as to its suitability for any purpose. + + +subproject libs/format ; + +# please order by name to ease maintenance +subinclude libs/format/example ; +subinclude libs/format/test ; diff -Nru bombono-dvd-0.5.2/libs/boost-lib/libs/format/test/format_test1.cpp bombono-dvd-0.6.0/libs/boost-lib/libs/format/test/format_test1.cpp --- bombono-dvd-0.5.2/libs/boost-lib/libs/format/test/format_test1.cpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/libs/format/test/format_test1.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,46 @@ +// ------------------------------------------------------------------------------ +// libs/format/test/format_test1.cpp : test constructing objects and basic parsing +// ------------------------------------------------------------------------------ + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/format for library home page + +// ------------------------------------------------------------------------------ + +#include "boost/format.hpp" + +#define BOOST_INCLUDE_MAIN +#include + + +int test_main(int, char* []) +{ + + using boost::format; + using boost::str; + + if(str( format(" %% ") ) != " % ") + BOOST_ERROR("Basic parsing without arguments Failed"); + if(str( format("nothing") ) != "nothing") + BOOST_ERROR("Basic parsing without arguments Failed"); + if(str( format("%% ") ) != "% ") + BOOST_ERROR("Basic parsing without arguments Failed"); + if(str( format(" %%") ) != " %") + BOOST_ERROR("Basic parsing without arguments Failed"); + if(str( format(" %n ") ) != " ") + BOOST_ERROR("Basic parsing without arguments Failed"); + if(str( format("%n ") ) != " ") + BOOST_ERROR("Basic parsing without arguments Failed"); + if(str( format(" %n") ) != " ") + BOOST_ERROR("Basic parsing without arguments Failed"); + + if(str( format("%%##%%##%%1 %1%00") % "Escaped OK" ) != "%##%##%1 Escaped OK00") + BOOST_ERROR("Basic parsing Failed"); + if(str( format("%%##%#x ##%%1 %s00") % 20 % "Escaped OK" ) != "%##0x14 ##%1 Escaped OK00") + BOOST_ERROR("Basic p-parsing Failed") ; + + return 0; +} diff -Nru bombono-dvd-0.5.2/libs/boost-lib/libs/format/test/format_test2.cpp bombono-dvd-0.6.0/libs/boost-lib/libs/format/test/format_test2.cpp --- bombono-dvd-0.5.2/libs/boost-lib/libs/format/test/format_test2.cpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/libs/format/test/format_test2.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,118 @@ +// ------------------------------------------------------------------------------ +// format_test2.cpp : a few real, simple tests. +// ------------------------------------------------------------------------------ + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// see http://www.boost.org/libs/format for library home page + +// ------------------------------------------------------------------------------ + +#include "boost/format.hpp" + +#include +#include + +#define BOOST_INCLUDE_MAIN +#include + + +struct Rational { + int n,d; + Rational (int an, int ad) : n(an), d(ad) {} +}; + +std::ostream& operator<<( std::ostream& os, const Rational& r) { + os << r.n << "/" << r.d; + return os; +} + + +int test_main(int, char* []) +{ + using namespace std; + using boost::format; + using boost::io::group; + using boost::str; + + Rational r(16,9); + + string s; + s = str(format("%5%. %5$=6s . %1% format %5%, c'%3% %1% %2%.\n") + % "le" % "bonheur" % "est" % "trop" % group(setfill('_'), "bref") ); + + if(s != "bref. _bref_ . le format bref, c'est le bonheur.\n") { + cerr << s; + BOOST_ERROR("centered alignement : formatting result incorrect"); + } + + + s = str(format("%+8d %-8d\n") % r % r ); + if(s != " +16/+9 16/9 \n") { + cerr << s; + BOOST_ERROR("(user-type) formatting result incorrect"); + } + + s = str(format("[%0+4d %0+8d %-08d]\n") % 8 % r % r); + if(s != "[+008 +0016/+9 16/9 ]\n") { + cerr << s; + BOOST_ERROR("(zero-padded user-type) formatting result incorrect"); + } + + + s = str( format("%1%, %20T_ (%|2$5|,%|3$5|)\n") % "98765" % 1326 % 88 ) ; + if( s != "98765, _____________ ( 1326, 88)\n" ) + BOOST_ERROR("(tabulation) formatting result incorrect"); + s = str( format("%s, %|20t|=") % 88 ) ; + if( s != "88, =" ) { + cout << s << endl; + BOOST_ERROR("(tabulation) formatting result incorrect"); + } + + + s = str(format("%.2s %8c.\n") % "root" % "user" ); + if(s != "ro u.\n") { + cerr << s; + BOOST_ERROR("(truncation) formatting result incorrect"); + } + + // width in format-string is overridden by setw manipulator : + s = str( format("%|1$4| %|1$|") % group(setfill('0'), setw(6), 1) ); + if( s!= "000001 000001") + BOOST_ERROR("width in format VS in argument misbehaved"); + + s = str( format("%|=s|") % group(setfill('_'), setw(6), r) ); + if( s!= "_16/9_") { + cerr << s << endl; + BOOST_ERROR("width in group context is not handled correctly"); + } + + + // options that uses internal alignment : + 0 # + s = str( format("%+6d %0#6x %s\n") % 342 % 33 % "ok" ); + if( s !=" +342 0x0021 ok\n") + BOOST_ERROR("(flags +, 0, or #) formatting result incorrect"); + + // flags in the format string are not sticky + // and hex in argument overrrides type-char d (->decimal) : + s = str( format("%2$#4d %|1$4| %|2$#4| %|3$|") + % 101 + % group(setfill('_'), hex, 2) + % 103 ); + if(s != "_0x2 101 _0x2 103") + BOOST_ERROR("formatting error. (not-restoring state ?)"); + + + + // flag '0' is tricky . + // left-align cancels '0': + s = str( format("%2$0#12X %2$0#-12d %1$0#10d \n") % -20 % 10 ); + if( s != "0X000000000A 10 -000000020 \n"){ + cerr << s; + BOOST_ERROR("formatting error. (flag 0)"); + } + + return 0; +} diff -Nru bombono-dvd-0.5.2/libs/boost-lib/libs/format/test/format_test3.cpp bombono-dvd-0.6.0/libs/boost-lib/libs/format/test/format_test3.cpp --- bombono-dvd-0.5.2/libs/boost-lib/libs/format/test/format_test3.cpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/libs/format/test/format_test3.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,97 @@ +// ------------------------------------------------------------------------------ +// format_test3.cpp : complicated format strings and / or advanced uses +// ------------------------------------------------------------------------------ + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// see http://www.boost.org/libs/format for library home page + +// ------------------------------------------------------------------------------ + +#define BOOST_FORMAT_STATIC_STREAM +#include "boost/format.hpp" + +#include +#include + +#define BOOST_INCLUDE_MAIN +#include + +struct Rational { + int n,d; + Rational (int an, int ad) : n(an), d(ad) {} +}; + +std::ostream& operator<<( std::ostream& os, const Rational& r) { + os << r.n << "/" << r.d; + return os; +} + +int test_main(int, char* []) +{ + using namespace std; + using boost::format; + using boost::io::group; + using boost::str; + + string s, s2; + // special paddings + s = str( format("[%=6s] [%+6s] [%+6s] [% 6s] [%+6s]\n") + % 123 + % group(internal, setfill('W'), 234) + % group(internal, setfill('X'), -345) + % group(setfill('Y'), 456) + % group(setfill('Z'), -10 ) ); + + if(s != "[ 123 ] [+WW234] [-XX345] [YY 456] [ZZZ-10]\n" ) { + cerr << s ; + BOOST_ERROR("formatting error. (with special paddings)"); + } + + s = str( format("[% 6.8s] [% 8.6s] [% 7.7s]\n") + % group(internal, setfill('x'), Rational(12345,54321)) + % group(internal, setfill('x'), Rational(123,45)) + % group(internal, setfill('x'), Rational(123,321)) + ); + if(s != (s2="[ 12345/5] [ xx123/4] [ 123/32]\n" )) { + cerr << s << s2; + BOOST_ERROR("formatting error. (with special paddings)"); + } + + s = str( format("[% 6.8s] [% 6.8s] [% 6.8s] [% 6.8s] [%6.8s]\n") + % 1234567897 + % group(setfill('x'), 12) + % group(internal, setfill('x'), 12) + % group(internal, setfill('x'), 1234567890) + % group(internal, setfill('x'), 123456) + ); + if(s != (s2="[ 1234567] [xxx 12] [ xxx12] [ 1234567] [123456]\n") ) { + cerr << s << s2; + BOOST_ERROR("formatting error. (with special paddings)"); + } + + s = str( format("[% 8.6s] [% 6.4s] [% 6.4s] [% 8.6s] [% 8.6s]\n") + % 1234567897 + % group(setfill('x'), 12) + % group(internal, setfill('x'), 12) + % group(internal, setfill('x'), 1234567890) + % group(internal, setfill('x'), 12345) + ); + if(s != (s2="[ 12345] [xxx 12] [ xxx12] [ xx12345] [ xx12345]\n") ) { + cerr << s << s2; + BOOST_ERROR("formatting error. (with special paddings)"); + } + + // nesting formats : + s = str( format("%2$014x [%1%] %|2$05|\n") % (format("%05s / %s") % -18 % 7) + %group(showbase, -100) + ); + if( s != "0x0000ffffff9c [-0018 / 7] -0100\n" ){ + cerr << s ; + BOOST_ERROR("nesting did not work"); + } + + return 0; +} diff -Nru bombono-dvd-0.5.2/libs/boost-lib/libs/format/test/format_test_wstring.cpp bombono-dvd-0.6.0/libs/boost-lib/libs/format/test/format_test_wstring.cpp --- bombono-dvd-0.5.2/libs/boost-lib/libs/format/test/format_test_wstring.cpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/libs/format/test/format_test_wstring.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,36 @@ +// ------------------------------------------------------------------------------ +// format_test_wstring.cpp : test wchar_t format use (if supported) +// ------------------------------------------------------------------------------ + +// Copyright Samuel Krempp 2003. Use, modification, and distribution are +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See http://www.boost.org/libs/format for library home page + +// ------------------------------------------------------------------------------ + +#include "boost/format.hpp" + +#define BOOST_INCLUDE_MAIN +#include + + +int test_main(int, char* []) +{ + + using boost::format; + using boost::str; + +#if !defined(BOOST_NO_STD_WSTRING) && !defined(BOOST_NO_STD_WSTREAMBUF) + using boost::wformat; + wformat wfmter(L"%%##%%##%%1 %1%00"); + if(str( wfmter % L"Escaped OK" ) != L"%##%##%1 Escaped OK00") + BOOST_ERROR("Basic w-parsing Failed"); + if(str( wformat(L"%%##%#x ##%%1 %s00") % 20 % L"Escaped OK" ) != L"%##0x14 ##%1 Escaped OK00") + BOOST_ERROR("Basic wp-parsing Failed") ; +#endif // wformat tests + + + return 0; +} diff -Nru bombono-dvd-0.5.2/libs/boost-lib/libs/format/test/Jamfile bombono-dvd-0.6.0/libs/boost-lib/libs/format/test/Jamfile --- bombono-dvd-0.5.2/libs/boost-lib/libs/format/test/Jamfile 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/libs/format/test/Jamfile 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,49 @@ +# Boost.Bind Library test Jamfile +# +# Copyright (c) 2003 Samuel Krempp +# +# Permission to copy, use, modify, sell and distribute this software +# is granted provided this copyright notice appears in all copies. +# This software is provided "as is" without express or implied +# warranty, and with no claim as to its suitability for any purpose. + +subproject libs/format/test ; + +import testing ; + +# Make tests run by default. +DEPENDS all : test ; + +{ + +test-suite "format" + : [ run format_test1.cpp + ../../../libs/test/build/boost_test_exec_monitor + : # args + : # input files + : std::locale-support + ] + + [ run format_test2.cpp + ../../../libs/test/build/boost_test_exec_monitor + : # args + : # input files + : std::locale-support + ] + + [ run format_test3.cpp + ../../../libs/test/build/boost_test_exec_monitor + : # args + : # input files + : std::locale-support + ] + + [ run format_test_wstring.cpp + ../../../libs/test/build/boost_test_exec_monitor + : # args + : # input files + : std::locale-support + ] + ; +} + diff -Nru bombono-dvd-0.5.2/libs/boost-lib/libs/format/test/Jamfile.v2 bombono-dvd-0.6.0/libs/boost-lib/libs/format/test/Jamfile.v2 --- bombono-dvd-0.5.2/libs/boost-lib/libs/format/test/Jamfile.v2 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-lib/libs/format/test/Jamfile.v2 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,43 @@ +# Boost.Bind Library test Jamfile +# +# Copyright (c) 2003 Samuel Krempp +# +# Permission to copy, use, modify, sell and distribute this software +# is granted provided this copyright notice appears in all copies. +# This software is provided "as is" without express or implied +# warranty, and with no claim as to its suitability for any purpose. + +import testing ; +{ + +test-suite "format" + : [ run format_test1.cpp + ../../../libs/test/build//boost_test_exec_monitor + : # args + : # input files +# : std::locale-support + ] + + [ run format_test2.cpp + ../../../libs/test/build//boost_test_exec_monitor + : # args + : # input files +# : std::locale-support + ] + + [ run format_test3.cpp + ../../../libs/test/build//boost_test_exec_monitor + : # args + : # input files +# : std::locale-support + ] + + [ run format_test_wstring.cpp + ../../../libs/test/build//boost_test_exec_monitor + : # args + : # input files +# : std::locale-support + ] + ; +} + diff -Nru bombono-dvd-0.5.2/libs/boost-logging/boost-logging.diff bombono-dvd-0.6.0/libs/boost-logging/boost-logging.diff --- bombono-dvd-0.5.2/libs/boost-logging/boost-logging.diff 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/libs/boost-logging/boost-logging.diff 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,23 @@ +diff -Naur /mnt/hgfs/usbdisk/Temp/boost_logging/logging/boost/logging/detail/ts/ts.hpp Atom/boost-logging/boost/logging/detail/ts/ts.hpp +--- /mnt/hgfs/usbdisk/Temp/boost_logging/logging/boost/logging/detail/ts/ts.hpp 2007-11-02 14:41:22.000000000 +0300 ++++ Atom/boost-logging/boost/logging/detail/ts/ts.hpp 2007-11-21 17:24:43.000000000 +0300 +@@ -23,7 +23,8 @@ + + #include + +-#ifdef BOOST_HAS_THREADS ++//#ifdef BOOST_HAS_THREADS // Murav'jov - dont need thread-safe ++#if 0 + + #ifdef BOOST_LOG_USE_BOOST_THREADS + #include +@@ -44,7 +45,8 @@ + + namespace boost { namespace logging { namespace threading { + +-#ifdef BOOST_HAS_THREADS ++//#ifdef BOOST_HAS_THREADS // Murav'jov - dont need thread-safe ++#if 0 + + #ifdef BOOST_LOG_USE_BOOST_THREADS + typedef mutex_boost mutex; diff -Nru bombono-dvd-0.5.2/libs/mpeg2dec/SConscript bombono-dvd-0.6.0/libs/mpeg2dec/SConscript --- bombono-dvd-0.5.2/libs/mpeg2dec/SConscript 2009-07-01 22:34:51.000000000 +0100 +++ bombono-dvd-0.6.0/libs/mpeg2dec/SConscript 2010-04-16 12:53:55.000000000 +0100 @@ -33,15 +33,15 @@ else: cflags += release_flags -# Arch flags should be set via command options like "scons CFLAGS='-mtune=i686' CXXFLAGS='-mtune=i686'" -# # arch-specific flags -# if BuildVars.IsGccCompiler(): -# if BuildVars.IsX86Arch(): -# str = BuildVars.GetArch() # f.e., i586 -# if str[1] in ['3', '4', '5', '6']: -# cflags += ['-mtune=i' + str[1] + '86'] -# elif BuildVars.IsSparcArch(): -# cflags += ['-mcpu=ultrasparc', '-mvis'] +if BuildVars.IsGccCompiler(): + # Tune flags should be set via command options like "scons CFLAGS='-mtune=i686' CXXFLAGS='-mtune=i686'" + #if BuildVars.IsX86Arch(): + # str = BuildVars.GetArch() # f.e., i586 + # if str[1] in ['3', '4', '5', '6']: + # cflags += ['-mtune=i' + str[1] + '86'] + + if BuildVars.IsSparcArch(): + cflags += ['-mcpu=ultrasparc', '-mvis'] # libmpeg2_env.Append(CCFLAGS = cflags, CPPDEFINES = defines) diff -Nru bombono-dvd-0.5.2/po/bombono-dvd.pot bombono-dvd-0.6.0/po/bombono-dvd.pot --- bombono-dvd-0.5.2/po/bombono-dvd.pot 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/po/bombono-dvd.pot 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,939 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR "Ilya Murav'jov" +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-04-16 01:29+0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/mbase/project/media.cpp:68 src/mgui/project/media-browser.cpp:200 +msgid "Chapter" +msgstr "" + +#: src/mbase/project/media.cpp:112 +#, boost-format +msgid "Cant create folder %1% (check permissions)" +msgstr "" + +#: src/mbase/project/menu.cpp:276 +msgid "Menu" +msgstr "" + +#: src/mgui/dvdimport.cpp:82 +msgid "Choose Source DVD-Video" +msgstr "" + +#: src/mgui/dvdimport.cpp:85 +msgid "Select Videos to Import" +msgstr "" + +#: src/mgui/dvdimport.cpp:88 +msgid "Select Folder to Save Videos" +msgstr "" + +#: src/mgui/dvdimport.cpp:91 +msgid "Importing..." +msgstr "" + +#: src/mgui/dvdimport.cpp:94 +msgid "Import is completed." +msgstr "" + +#: src/mgui/dvdimport.cpp:207 src/mgui/project/mconstructor.cpp:824 +msgid "MB" +msgstr "" + +#: src/mgui/dvdimport.cpp:388 +msgid "Select All" +msgstr "" + +#: src/mgui/dvdimport.cpp:388 +msgid "Unselect All" +msgstr "" + +#. мы не можем пустить исключение здесь, потому что оно пойдет +#. и через C-шный код (Gtk) - отложим +#: src/mgui/dvdimport.cpp:410 +msgid "Are you sure to stop importing?" +msgstr "" + +#: src/mgui/dvdimport.cpp:443 +#, boost-format +msgid "Cant write to folder %1% (check permissions)." +msgstr "" + +#: src/mgui/dvdimport.cpp:471 src/mgui/win_utils.cpp:322 +#, boost-format +msgid "A file named \"%1%\" already exists. Do you want to replace it?" +msgstr "" + +#: src/mgui/dvdimport.cpp:504 +msgid "Import error!" +msgstr "" + +#: src/mgui/dvdimport.cpp:508 +msgid "Videos successfully imported." +msgstr "" + +#: src/mgui/dvdimport.cpp:509 +msgid "Import has been interrupted." +msgstr "" + +#: src/mgui/dvdimport.cpp:543 +msgid "DVD-Video Import" +msgstr "" + +#: src/mgui/dvdimport.cpp:566 +msgid "Choose DVD disc, DVD folder or iso image file." +msgstr "" + +#: src/mgui/dvdimport.cpp:584 +msgid "" +"NTSC/PAL mismatch. Try another disc or import to project of corresponding " +"type." +msgstr "" + +#. имя +#: src/mgui/dvdimport.cpp:608 src/mgui/project/media-browser.cpp:217 +msgid "Name" +msgstr "" + +#: src/mgui/dvdimport.cpp:621 +msgid "Details" +msgstr "" + +#: src/mgui/dvdimport.cpp:667 +msgid "It is desirable the destination folder to be empty." +msgstr "" + +#. COPY_N_PASTE - тупо сделал содержимое сообщений как у "TSNAMI-MPEG DVD Author" +#. А что делать - нафига свои придумывать, если смысл один и тот же +#: src/mgui/execution.cpp:47 +#, boost-format +msgid "You are about to cancel %1%. Are you sure?" +msgstr "" + +#: src/mgui/mux.cpp:51 +msgid "muxing" +msgstr "" + +#: src/mgui/mux.cpp:67 +#, boost-format +msgid "Muxing \"%1%\"" +msgstr "" + +#: src/mgui/mux.cpp:78 src/mgui/author/output.cpp:231 +msgid "Show/_Hide Details" +msgstr "" + +#: src/mgui/mux.cpp:102 +msgid "Muxing error" +msgstr "" + +#: src/mgui/mux.cpp:103 src/mgui/author/output.cpp:654 +#, boost-format +msgid "The reason is \"%1%\" (see Details)" +msgstr "" + +#: src/mgui/mux.cpp:119 +msgid "Select a folder" +msgstr "" + +#: src/mgui/mux.cpp:131 +msgid "in" +msgstr "" + +#: src/mgui/mux.cpp:165 +msgid "Mux streams" +msgstr "" + +#: src/mgui/mux.cpp:167 +msgid "Output" +msgstr "" + +#: src/mgui/mux.cpp:168 +msgid "Select elementary video" +msgstr "" + +#: src/mgui/mux.cpp:169 +msgid "Select audio" +msgstr "" + +#. Названия типов для i18n +#: src/mgui/mux.cpp:173 src/mgui/project/media-browser.cpp:199 +#: src/mgui/timeline/layout-draw.cpp:156 +msgid "Video" +msgstr "" + +#: src/mgui/mux.cpp:176 +msgid "MPEG2 elementary video (m2v)" +msgstr "" + +#: src/mgui/mux.cpp:181 +msgid "Audio" +msgstr "" + +#: src/mgui/mux.cpp:184 src/mgui/timeline/mviewer.cpp:271 +msgid "Audio for DVD" +msgstr "" + +#: src/mgui/mux.cpp:209 +msgid "Elementary video file is not selected." +msgstr "" + +#: src/mgui/mux.cpp:211 +msgid "Audio file is not selected." +msgstr "" + +#: src/mgui/mux.cpp:213 +msgid "Output file name is empty." +msgstr "" + +#: src/mgui/prefs.cpp:143 +msgid "Bombono DVD Preferences" +msgstr "" + +#: src/mgui/prefs.cpp:157 +msgid "_Default project type" +msgstr "" + +#: src/mgui/prefs.cpp:160 +msgid "Default _folder for authoring" +msgstr "" + +#: src/mgui/prefs.cpp:165 +msgid "_Play authoring result in" +msgstr "" + +#: src/mgui/win_utils.cpp:325 +msgid "Replacing the file overwrite its contents." +msgstr "" + +#: src/mgui/author/burn.cpp:198 +msgid "Auto" +msgstr "" + +#: src/mgui/author/burn.cpp:210 +msgid "Update speeds ..." +msgstr "" + +#: src/mgui/author/burn.cpp:331 +msgid "Checking Disc ..." +msgstr "" + +#: src/mgui/author/burn.cpp:345 +msgid "Selected burn drive is for CD discs only. Change to another burn drive." +msgstr "" + +#: src/mgui/author/burn.cpp:350 +msgid "CD disc is found in the drive, not DVD. Change to DVD disc." +msgstr "" + +#: src/mgui/author/burn.cpp:355 +msgid "No DVD disc in the drive. Load a clear one and press OK." +msgstr "" + +#: src/mgui/author/burn.cpp:360 +#, boost-format +msgid "" +"Disc with type \"%1%\" is found in the drive but for DVD-Video disc type " +"should be one from: DVD-R, DVD+R, DVD-RW, DVD+RW. Load a clear one with " +"right type and press OK." +msgstr "" + +#: src/mgui/author/burn.cpp:369 +#, boost-format +msgid "" +"Disc with type \"%1%\" in the drive is not clear. Only clear recordable " +"discs can be used for burning DVD-Video. Load a clear one and press OK." +msgstr "" + +#: src/mgui/author/burn.cpp:376 +#, boost-format +msgid "" +"Disc with type \"%1%\" in the drive is not clear. We need to remove its " +"contents before writing new one. Continue?" +msgstr "" + +#: src/mgui/author/burn.cpp:380 +msgid "_Cancel" +msgstr "" + +#: src/mgui/author/burn.cpp:381 +msgid "_Try again" +msgstr "" + +#: src/mgui/author/execute.cpp:72 +msgid "Status: " +msgstr "" + +#: src/mgui/author/execute.cpp:568 +#, boost-format +msgid "exit code = %1%" +msgstr "" + +#: src/mgui/author/execute.cpp:570 +#, boost-format +msgid "broken by signal %1%" +msgstr "" + +#: src/mgui/author/indicator.cpp:67 +msgid "Rendering Menus" +msgstr "" + +#: src/mgui/author/indicator.cpp:68 +msgid "Generating DVD-Video" +msgstr "" + +#: src/mgui/author/indicator.cpp:69 +msgid "Creating ISO Image" +msgstr "" + +#: src/mgui/author/indicator.cpp:70 +msgid "Burning DVD" +msgstr "" + +#: src/mgui/author/output.cpp:53 +msgid "DVD-Video Building" +msgstr "" + +#: src/mgui/author/output.cpp:63 +#, boost-format +msgid "_Cancel %1%" +msgstr "" + +#: src/mgui/author/output.cpp:64 +msgid "_Build DVD-Video" +msgstr "" + +#: src/mgui/author/output.cpp:161 +msgid "Select Output _Folder:" +msgstr "" + +#: src/mgui/author/output.cpp:177 +msgid " Choose Author Mode: " +msgstr "" + +#. цель по умолчанию +#: src/mgui/author/output.cpp:183 +msgid "_Write DVD Folder" +msgstr "" + +#: src/mgui/author/output.cpp:184 +msgid "Write Disk _Image" +msgstr "" + +#: src/mgui/author/output.cpp:193 +msgid "Disc Label: " +msgstr "" + +#: src/mgui/author/output.cpp:198 +msgid "Burn to _DVD" +msgstr "" + +#: src/mgui/author/output.cpp:206 +msgid "DVD Drive: " +msgstr "" + +#: src/mgui/author/output.cpp:212 +msgid "Writing Speed: " +msgstr "" + +#: src/mgui/author/output.cpp:223 +msgid "_Rendering only" +msgstr "" + +#: src/mgui/author/output.cpp:277 +msgid "Rendering" +msgstr "" + +#: src/mgui/author/output.cpp:354 +msgid "DVD Burning" +msgstr "" + +#: src/mgui/author/output.cpp:398 +msgid "The result is here" +msgstr "" + +#: src/mgui/author/output.cpp:400 +msgid "" +"You can run authoring manually by executing command \"scons\" at the " +"specified folder. Also, see README file for other options over there." +msgstr "" + +#. Translators: impossible to go on! +#: src/mgui/author/output.cpp:424 +msgid "Authoring is cancelled." +msgstr "" + +#: src/mgui/author/output.cpp:435 +#, boost-format +msgid "%1% is not a folder" +msgstr "" + +#: src/mgui/author/output.cpp:446 +#, boost-format +msgid "Cant have full access to folder %1% (read, write)" +msgstr "" + +#: src/mgui/author/output.cpp:454 +#, boost-format +msgid "" +"Folder %1% is not empty. We need to remove all files in it before " +"authoring.\n" +"Continue?" +msgstr "" + +#: src/mgui/author/output.cpp:460 +#, boost-format +msgid "Error during removing files: %1%" +msgstr "" + +#: src/mgui/author/output.cpp:651 +#, boost-format +msgid "%1% cancelled." +msgstr "" + +#: src/mgui/author/output.cpp:653 +#, boost-format +msgid "%1% broken." +msgstr "" + +#. Translators: can be tranlated as "Operation "%1%" ..." +#: src/mgui/author/output.cpp:660 +#, boost-format +msgid "%1% successfully completed." +msgstr "" + +#: src/mgui/author/output.cpp:690 src/mgui/timeline/select.cpp:239 +#, boost-format +msgid "_Play in %1%" +msgstr "" + +#: src/mgui/author/output.cpp:691 +msgid "_Burn to DVD" +msgstr "" + +#: src/mgui/author/script.cpp:392 +msgid "There is no media (video or menu)." +msgstr "" + +#: src/mgui/author/script.cpp:557 +#, boost-format +msgid "external command failure: %1%" +msgstr "" + +#: src/mgui/editor/select.cpp:499 +msgid "Delete" +msgstr "" + +#: src/mgui/editor/select.cpp:513 +msgid "Link" +msgstr "" + +#: src/mgui/editor/select.cpp:517 +msgid "Remove Link" +msgstr "" + +#. Poster Link +#: src/mgui/editor/select.cpp:521 +msgid "Set Poster" +msgstr "" + +#: src/mgui/editor/select.cpp:530 +msgid "Align" +msgstr "" + +#: src/mgui/editor/select.cpp:538 +msgid "Align Left" +msgstr "" + +#: src/mgui/editor/select.cpp:539 +msgid "Align Right" +msgstr "" + +#: src/mgui/editor/select.cpp:540 +msgid "Align Top" +msgstr "" + +#: src/mgui/editor/select.cpp:541 +msgid "Align Bottom" +msgstr "" + +#: src/mgui/editor/select.cpp:544 +msgid "Center Horizontally" +msgstr "" + +#: src/mgui/editor/select.cpp:545 +msgid "Center Vertically" +msgstr "" + +#. Set Background Color +#: src/mgui/editor/select.cpp:550 src/mgui/editor/select.cpp:802 +msgid "Set Background Color..." +msgstr "" + +#. Selection Tool +#: src/mgui/editor/toolbar.cpp:129 +msgid "Selection Tool" +msgstr "" + +#. Text Tool +#: src/mgui/editor/toolbar.cpp:132 +msgid "Text Tool" +msgstr "" + +#: src/mgui/editor/toolbar.cpp:493 +msgid "Add Item" +msgstr "" + +#: src/mgui/editor/toolbar.cpp:515 +msgid "Font Name" +msgstr "" + +#: src/mgui/editor/toolbar.cpp:531 +msgid "Font Size" +msgstr "" + +#. * кнопки стилей шрифта +#: src/mgui/editor/toolbar.cpp:536 +msgid "Bold" +msgstr "" + +#: src/mgui/editor/toolbar.cpp:537 +msgid "Italic" +msgstr "" + +#: src/mgui/editor/toolbar.cpp:538 +msgid "Underline" +msgstr "" + +#: src/mgui/editor/toolbar.cpp:547 +msgid "Pick a Color for Text" +msgstr "" + +#: src/mgui/editor/toolbar.cpp:549 +msgid "Text Color" +msgstr "" + +#: src/mgui/editor/toolbar.cpp:561 +msgid "Show Safe Area" +msgstr "" + +#: src/mgui/project/browser.cpp:128 +#, boost-format +msgid "Do you really want to delete \"%1%\" from Media List?" +msgstr "" + +#: src/mgui/project/browser.cpp:129 +#, boost-format +msgid "Do you really want to delete chapter \"%1%\"?" +msgstr "" + +#: src/mgui/project/browser.cpp:130 +#, boost-format +msgid "Do you really want to delete menu \"%1%\"?" +msgstr "" + +#: src/mgui/project/browser.cpp:242 +msgid "First-Play media can be Video or Menu only." +msgstr "" + +#: src/mgui/project/mconstructor.cpp:132 +msgid "Save Project As..." +msgstr "" + +#: src/mgui/project/mconstructor.cpp:169 +#, boost-format +msgid "Cant open project file \"%1%\"" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:465 +msgid "Bombono DVD is a DVD authoring program with nice and clean GUI" +msgstr "" + +#. dlg.set_authors(authors); +#. dlg.set_documenters(documenters); +#. dlg.set_decorated(false); +#: src/mgui/project/mconstructor.cpp:470 +msgid "translator-credits" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:611 +#, boost-format +msgid "Save changes to \"%1%\"?" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:613 +msgid "Close _without Saving" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:653 +msgid "New Project" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:662 +msgid "Please select a Television standard for your project:" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:687 +msgid "Open Project" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:691 +msgid "Project files (*.xml)" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:696 src/mgui/timeline/mviewer.cpp:273 +msgid "All Files (*.*)" +msgstr "" + +#. раньше Brasero использовал KiB, MiB и GiB, как более точные технически +#. (вроде как размеры HDD принято измерять по 1GB=1000MB); теперь Brasero +#. перешел на стандарт KB/MB/GB, ну и BmD тоже (а че, мы не гордые :) +#: src/mgui/project/mconstructor.cpp:824 +msgid "KB" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:824 +msgid "GB" +msgstr "" + +#. Project +#: src/mgui/project/mconstructor.cpp:935 +msgid "_Project" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:940 +msgid "_New Project" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:942 +msgid "_Open..." +msgstr "" + +#: src/mgui/project/mconstructor.cpp:944 +msgid "_Save" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:946 +msgid "Save _As..." +msgstr "" + +#: src/mgui/project/mconstructor.cpp:948 +msgid "_Quit" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:950 +msgid "Add Videos from _DVD" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:950 +msgid "DVD-Import Assistant" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:952 +msgid "_Mux" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:952 +msgid "Mux Elementary Streams into MPEG2" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:954 +msgid "Pr_eferences" +msgstr "" + +#. Go +#: src/mgui/project/mconstructor.cpp:993 +msgid "_Go" +msgstr "" + +#. первый вставляем сразу +#. Help +#: src/mgui/project/mconstructor.cpp:999 +msgid "_Help" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:1100 +msgctxt "MainTabs" +msgid "_Source" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:1102 +msgctxt "MainTabs" +msgid "_Menu" +msgstr "" + +#: src/mgui/project/mconstructor.cpp:1104 +msgctxt "MainTabs" +msgid "_Output" +msgstr "" + +#: src/mgui/project/mb-actions.cpp:144 +msgid "yes" +msgstr "" + +#: src/mgui/project/mb-actions.cpp:144 +msgid "no" +msgstr "" + +#: src/mgui/project/mb-actions.cpp:193 +msgid "Video bitrate" +msgstr "" + +#: src/mgui/project/mb-actions.cpp:194 +msgid "kbps" +msgstr "" + +#: src/mgui/project/mb-actions.cpp:195 +msgid "Maximum data rate for video (9800 kbps) is exceeded." +msgstr "" + +#: src/mgui/project/mb-actions.cpp:198 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with resolutions: %2% only." +msgstr "" + +#: src/mgui/project/mb-actions.cpp:199 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with frame rate: %2% only." +msgstr "" + +#: src/mgui/project/mb-actions.cpp:200 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with aspects 4:3, 16:9 only." +msgstr "" + +#: src/mgui/project/mb-actions.cpp:220 +msgid "Video size" +msgstr "" + +#: src/mgui/project/mb-actions.cpp:240 +msgid "Frame rate" +msgstr "" + +#: src/mgui/project/mb-actions.cpp:241 +msgid "fps" +msgstr "" + +#: src/mgui/project/mb-actions.cpp:249 +msgid "Aspect ratio" +msgstr "" + +#: src/mgui/project/mb-actions.cpp:324 +msgid "" +"Bombono DVD can use \"DVD-ready\" video only now. Use muxing programs " +"like \"mplex -f 8\" (from mjpegtools), mencoder (from mplayer) " +"or transcode to make your video ready for Bombono DVD." +msgstr "" + +#: src/mgui/project/mb-actions.cpp:328 +msgid "DVD packs" +msgstr "" + +#: src/mgui/project/mb-actions.cpp:330 +msgid "NAV packets" +msgstr "" + +#: src/mgui/project/mb-actions.cpp:336 +msgid "" +"This video may not be added due to (errors in red " +"color):" +msgstr "" + +#. подскажем пользователю, что он ошибся форматом проекта +#: src/mgui/project/mb-actions.cpp:347 +#, boost-format +msgid "" +"This video has %1% type and can't be added to current project of %2% type. " +"Create new project from menu \"Project->New Project\" with right type." +msgstr "" + +#: src/mgui/project/mb-actions.cpp:375 +msgid "File doesn't exist." +msgstr "" + +#: src/mgui/project/mb-actions.cpp:380 +msgid "Folders can't be added." +msgstr "" + +#. по расширению выводим наиболее вероятную ошибку +#: src/mgui/project/mb-actions.cpp:415 +msgid "Unknown file type." +msgstr "" + +#: src/mgui/project/mb-actions.cpp:646 +#, boost-format +msgid "" +"The file \"%1%\" looks like VOB from DVD.\n" +"Run import?" +msgstr "" + +#: src/mgui/project/mb-actions.cpp:663 +#, boost-format +msgid "" +"The file \"%1%\" looks like elementary stream and need to be muxed before " +"using. Run muxing?" +msgstr "" + +#: src/mgui/project/mb-actions.cpp:725 +msgid "Also:" +msgstr "" + +#: src/mgui/project/mb-actions.cpp:738 +#, boost-format +msgid "" +"See more about preparing video for authoring in online help." +msgstr "" + +#: src/mgui/project/mb-actions.cpp:749 +#, boost-format +msgid "Can't add file \"%1%\"." +msgstr "" + +#: src/mgui/project/mb-actions.cpp:751 +msgid "Can't add files:" +msgstr "" + +#: src/mgui/project/media-browser.cpp:146 +msgid "Previous Menu" +msgstr "" + +#: src/mgui/project/media-browser.cpp:146 +#: src/mgui/project/media-browser.cpp:148 +msgid "Next Video" +msgstr "" + +#: src/mgui/project/media-browser.cpp:147 +#, boost-format +msgid "Auto (%1%)" +msgstr "" + +#: src/mgui/project/media-browser.cpp:177 +msgid "End Action" +msgstr "" + +#: src/mgui/project/media-browser.cpp:201 +msgid "Still Picture" +msgstr "" + +#: src/mgui/project/media-browser.cpp:233 +msgid "Type" +msgstr "" + +#. // не меньше чем размер шрифта элемента в списке +#. Gtk::Label& label = *Gtk::manage(new Gtk::Label("Media List")); +#. label.set_use_markup(true); +#. vbox.pack_start(label, Gtk::PACK_SHRINK); +#. Gtk::Requisition req = label.size_request(); +#. label.set_size_request(0, req.height+10); +#: src/mgui/project/media-browser.cpp:291 +#: src/mgui/project/menu-browser.cpp:373 +msgid "Media List" +msgstr "" + +#: src/mgui/project/media-browser.cpp:331 +msgid "Add Media from File Browser" +msgstr "" + +#: src/mgui/project/media-browser.cpp:340 +msgid "Remove Media" +msgstr "" + +#: src/mgui/project/media-browser.cpp:351 +msgid "Make Chapters for Video" +msgstr "" + +#: src/mgui/project/menu-browser.cpp:190 +msgid "No Link" +msgstr "" + +#. * subj +#: src/mgui/project/menu-browser.cpp:337 +msgid "Menu List" +msgstr "" + +#: src/mgui/project/menu-browser.cpp:353 +msgid "Add Menu" +msgstr "" + +#: src/mgui/project/menu-browser.cpp:358 +msgid "Remove Menu" +msgstr "" + +#: src/mgui/project/menu-browser.cpp:363 +msgid "Edit Menu" +msgstr "" + +#. Add +#: src/mgui/timeline/layout.cpp:526 src/mgui/timeline/select.cpp:216 +msgid "Add Chapter Point" +msgstr "" + +#. 0 надпись +#: src/mgui/timeline/mviewer.cpp:239 +msgid "File Browser" +msgstr "" + +#: src/mgui/timeline/mviewer.cpp:269 +msgid "All formats" +msgstr "" + +#: src/mgui/timeline/mviewer.cpp:270 +msgid "MPEG files" +msgstr "" + +#: src/mgui/timeline/mviewer.cpp:272 +msgid "Still Images" +msgstr "" + +#: src/mgui/timeline/select.cpp:143 +msgid "A_dd to project" +msgstr "" + +#: src/mgui/timeline/select.cpp:146 +msgid "Save Frame..." +msgstr "" + +#. Add at Intervals +#: src/mgui/timeline/select.cpp:170 src/mgui/timeline/select.cpp:228 +msgid "Add Chapter Points at Intervals" +msgstr "" + +#: src/mgui/timeline/select.cpp:176 +msgid "Interval between Chapters:" +msgstr "" + +#: src/mgui/timeline/select.cpp:183 +msgid "min." +msgstr "" + +#: src/mgui/timeline/select.cpp:186 +msgid "Remove Existing Chapters" +msgstr "" + +#. Delete +#: src/mgui/timeline/select.cpp:219 +msgid "Delete Chapter Point" +msgstr "" + +#. Delete All +#: src/mgui/timeline/select.cpp:223 +msgid "Delete All Chapter Points" +msgstr "" + +#: src/mgui/timeline/select.cpp:236 +msgid "Save Current Frame" +msgstr "" diff -Nru bombono-dvd-0.5.2/po/da.po bombono-dvd-0.6.0/po/da.po --- bombono-dvd-0.5.2/po/da.po 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/po/da.po 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,924 @@ +# Danish translation bombono-dvd. +# Copyright (C) 2010 "Ilya Murav'jov" & nedenstående oversættere. +# This file is distributed under the same license as the bombono-dvd package. +# Joe Hansen , 2010. +# +# konventioner +# authoring -> fremstilling (måske oprettelse) +# elementary -> elementær (? i tvivl eller er det bare undervisnings, +# men hvad er det) +# frame -> billedrate +# mux -> mux (nogen bedre forslag?) +# Still Images -> fastbilleder +# +msgid "" +msgstr "" +"Project-Id-Version: bombono-dvd 0.5.9\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-04-03 00:13+0400\n" +"PO-Revision-Date: 2010-04-09 20:36+0200\n" +"Last-Translator: Joe Hansen \n" +"Language-Team: Danish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/mbase/project/media.cpp:68 src/mgui/project/media-browser.cpp:200 +msgid "Chapter" +msgstr "Kapitel" + +#: src/mbase/project/media.cpp:112 +#, boost-format +msgid "Cant create folder %1% (check permissions)" +msgstr "Kan ikke oprette mappe %1% (tjek rettigheder)" + +#: src/mbase/project/menu.cpp:276 +msgid "Menu" +msgstr "Menu" + +#: src/mgui/dvdimport.cpp:82 +msgid "Choose Source DVD-Video" +msgstr "Vælg kilde-dvd-video" + +#: src/mgui/dvdimport.cpp:85 +msgid "Select Videos to Import" +msgstr "Vælg videoer til importering" + +#: src/mgui/dvdimport.cpp:88 +msgid "Select Folder to Save Videos" +msgstr "Vælg mappe til gemning af videoer" + +#: src/mgui/dvdimport.cpp:91 +msgid "Importing..." +msgstr "Importerer..." + +#: src/mgui/dvdimport.cpp:94 +msgid "Import is completed." +msgstr "Import er færdig." + +#: src/mgui/dvdimport.cpp:207 src/mgui/project/mconstructor.cpp:824 +msgid "MB" +msgstr "MB" + +#: src/mgui/dvdimport.cpp:388 +msgid "Select All" +msgstr "Vælg alle" + +#: src/mgui/dvdimport.cpp:388 +msgid "Unselect All" +msgstr "Fravælg alle" + +#. мы не можем пустить исключение здесь, потому что оно пойдет +#. и через C-шный код (Gtk) - отложим +#: src/mgui/dvdimport.cpp:410 +msgid "Are you sure to stop importing?" +msgstr "Er du sikker på du ønsker at stoppe importering?" + +#: src/mgui/dvdimport.cpp:443 +#, boost-format +msgid "Cant write to folder %1% (check permissions)." +msgstr "Kan ikke skrive til mappe %1% (tjek rettigheder)." + +#: src/mgui/dvdimport.cpp:471 src/mgui/win_utils.cpp:319 +#, boost-format +msgid "A file named \"%1%\" already exists. Do you want to replace it?" +msgstr "En fil med navnet »%1%« eksisterer allerede. Ønsker du at erstatte den?" + +#: src/mgui/dvdimport.cpp:504 +msgid "Import error!" +msgstr "Importfejl!" + +#: src/mgui/dvdimport.cpp:508 +msgid "Videos successfully imported." +msgstr "Videoer importeret." + +#: src/mgui/dvdimport.cpp:509 +msgid "Import has been interrupted." +msgstr "Import er blevet afbrudt." + +#: src/mgui/dvdimport.cpp:543 +msgid "DVD-Video Import" +msgstr "Dvd-video-import" + +#: src/mgui/dvdimport.cpp:566 +msgid "Choose DVD disc, DVD folder or iso image file." +msgstr "Vælg dvd-disk, dvd-mappe eller iso-aftryksfil." + +#: src/mgui/dvdimport.cpp:584 +msgid "NTSC/PAL mismatch. Try another disc or import to project of corresponding type." +msgstr "Forskel på NTSC/PAL. Forsøg med en anden disk eller importer til et projekt med tilsvarende type." + +#. имя +#: src/mgui/dvdimport.cpp:608 src/mgui/project/media-browser.cpp:217 +msgid "Name" +msgstr "Navn" + +#: src/mgui/dvdimport.cpp:621 +msgid "Details" +msgstr "Detaljer" + +#: src/mgui/dvdimport.cpp:667 +msgid "It is desirable the destination folder to be empty." +msgstr "Det er formålstjenligt at modtagelsesmappen er tom." + +#. COPY_N_PASTE - тупо сделал содержимое сообщений как у "TSNAMI-MPEG DVD Author" +#. А что делать - нафига свои придумывать, если смысл один и тот же +#: src/mgui/execution.cpp:27 +#, boost-format +msgid "You are about to cancel %1%. Are you sure?" +msgstr "Du er ved at afbryde %1%. Er du sikker?" + +#: src/mgui/mux.cpp:29 +msgid "muxing" +msgstr "muxing" + +#: src/mgui/mux.cpp:45 +#, boost-format +msgid "Muxing \"%1%\"" +msgstr "Muxer »%1%«" + +#: src/mgui/mux.cpp:56 src/mgui/author/output.cpp:229 +msgid "Show/_Hide Details" +msgstr "Vis/_skjul detaljer" + +#: src/mgui/mux.cpp:80 +msgid "Muxing error" +msgstr "Muxingfejl" + +#: src/mgui/mux.cpp:81 src/mgui/author/output.cpp:632 +#, boost-format +msgid "The reason is \"%1%\" (see Details)" +msgstr "Årsagen er »%1%« (se detaljer)" + +#: src/mgui/mux.cpp:97 +msgid "Select a folder" +msgstr "Vælg en mappe" + +#: src/mgui/mux.cpp:109 +msgid "in" +msgstr "i" + +#: src/mgui/mux.cpp:143 +msgid "Mux streams" +msgstr "Mux-strømme" + +#: src/mgui/mux.cpp:145 +msgid "Output" +msgstr "Uddata" + +#: src/mgui/mux.cpp:146 +msgid "Select elementary video" +msgstr "Vælg elementærvideo" + +#: src/mgui/mux.cpp:147 +msgid "Select audio" +msgstr "Vælg lyd" + +#. Названия типов для i18n +#: src/mgui/mux.cpp:151 src/mgui/project/media-browser.cpp:199 +#: src/mgui/timeline/layout-draw.cpp:156 +msgid "Video" +msgstr "Video" + +#: src/mgui/mux.cpp:154 +msgid "MPEG2 elementary video (m2v)" +msgstr "MPEG2-elementærvideo (m2v)" + +#: src/mgui/mux.cpp:159 +msgid "Audio" +msgstr "Lyd" + +#: src/mgui/mux.cpp:162 src/mgui/timeline/mviewer.cpp:271 +msgid "Audio for DVD" +msgstr "Lyd til dvd" + +#: src/mgui/mux.cpp:187 +msgid "Elementary video file is not selected." +msgstr "Elementærvideofil er ikke valgt." + +#: src/mgui/mux.cpp:189 +msgid "Audio file is not selected." +msgstr "Lydfil er ikke valgt." + +#: src/mgui/mux.cpp:191 +msgid "Output file name is empty." +msgstr "Filnavn for uddata er tom." + +#: src/mgui/prefs.cpp:98 +msgid "Bombono DVD Preferences" +msgstr "Indstillinger for Bombono DVD" + +#: src/mgui/prefs.cpp:111 +msgid "_Default Project Type" +msgstr "_Standardprojekttype" + +#: src/mgui/prefs.cpp:116 +msgid "_Play Authoring Result in" +msgstr "_Afspilningsfremstilling resulterer i" + +#: src/mgui/win_utils.cpp:322 +msgid "Replacing the file overwrite its contents." +msgstr "Erstatning af filen overskriver dens indhold." + +#: src/mgui/author/burn.cpp:198 +msgid "Auto" +msgstr "Auto" + +#: src/mgui/author/burn.cpp:210 +msgid "Update speeds ..." +msgstr "Opdateringshastigheder..." + +#: src/mgui/author/burn.cpp:331 +msgid "Checking Disc ..." +msgstr "Tjekker disk..." + +#: src/mgui/author/burn.cpp:345 +msgid "Selected burn drive is for CD discs only. Change to another burn drive." +msgstr "Valgt brændingsdrev er kun til cd'er. Skift til et andet brændingsdrev." + +#: src/mgui/author/burn.cpp:350 +msgid "CD disc is found in the drive, not DVD. Change to DVD disc." +msgstr "Cd-disk er fundet i drevet, ikke dvd. Skift til en dvd-disk." + +#: src/mgui/author/burn.cpp:355 +msgid "No DVD disc in the drive. Load a clear one and press OK." +msgstr "Ingen dvd-disk i drevet. Indlæs en tom og tryk o.k." + +#: src/mgui/author/burn.cpp:360 +#, boost-format +msgid "Disc with type \"%1%\" is found in the drive but for DVD-Video disc type should be one from: DVD-R, DVD+R, DVD-RW, DVD+RW. Load a clear one with right type and press OK." +msgstr "Disk med typen »%1%« er fundet i drevet men til dvd-video bør disktypen være en af de følgende: DVD-R, DVD+R, DVD-RW, DVD+RW. Indlæs en korrekt tom type og tryk på o.k." + +#: src/mgui/author/burn.cpp:369 +#, boost-format +msgid "Disc with type \"%1%\" in the drive is not clear. Only clear recordable discs can be used for burning DVD-Video. Load a clear one and press OK." +msgstr "Disk af typen »%1%« i drevet er ikke tom. Kun tomme optagbare disk kan bruges til brænding af dvd-videoer. Indlæs en tom og tryk på o.k." + +#: src/mgui/author/burn.cpp:376 +#, boost-format +msgid "Disc with type \"%1%\" in the drive is not clear. We need to remove its contents before writing new one. Continue?" +msgstr "Disk af typen »%1%« i drevet er ikke tom. Vi har brug for at fjerne dens indhold før vi skriver på den igen. Fortsæt?" + +#: src/mgui/author/burn.cpp:380 +msgid "_Cancel" +msgstr "_Afbryd" + +#: src/mgui/author/burn.cpp:381 +msgid "_Try again" +msgstr "_Forsøg igen" + +#: src/mgui/author/execute.cpp:72 +msgid "Status: " +msgstr "Status: " + +#: src/mgui/author/execute.cpp:568 +#, boost-format +msgid "exit code = %1%" +msgstr "afslutningskode = %1%" + +#: src/mgui/author/execute.cpp:570 +#, boost-format +msgid "broken by signal %1%" +msgstr "i stykker efter signal %1%" + +#: src/mgui/author/indicator.cpp:67 +msgid "Rendering Menus" +msgstr "Optegningsmenuer" + +#: src/mgui/author/indicator.cpp:68 +msgid "Generating DVD-Video" +msgstr "Genererer dvd-video" + +#: src/mgui/author/indicator.cpp:69 +msgid "Creating ISO Image" +msgstr "Opretter ISO-aftryk" + +#: src/mgui/author/indicator.cpp:70 +msgid "Burning DVD" +msgstr "Brænder dvd" + +#: src/mgui/author/output.cpp:53 +msgid "DVD-Video Building" +msgstr "Dvd-video-opbygning" + +#: src/mgui/author/output.cpp:63 +#, boost-format +msgid "_Cancel %1%" +msgstr "_Afbryd %1%" + +#: src/mgui/author/output.cpp:64 +msgid "_Build DVD-Video" +msgstr "_Byg dvd-video" + +#: src/mgui/author/output.cpp:161 +msgid "Select Output _Folder:" +msgstr "Vælg uddata _mappe:" + +#: src/mgui/author/output.cpp:175 +msgid " Choose Author Mode: " +msgstr " Vælg forfattertilstand: " + +#. цель по умолчанию +#: src/mgui/author/output.cpp:181 +msgid "_Write DVD Folder" +msgstr "_Skriv dvd-mappe" + +#: src/mgui/author/output.cpp:182 +msgid "Write Disk _Image" +msgstr "Skriv disk_aftryk" + +#: src/mgui/author/output.cpp:191 +msgid "Disc Label: " +msgstr "Disketiket: " + +#: src/mgui/author/output.cpp:196 +msgid "Burn to _DVD" +msgstr "Brænd til _dvd" + +#: src/mgui/author/output.cpp:204 +msgid "DVD Drive: " +msgstr "Dvd-drive: " + +#: src/mgui/author/output.cpp:210 +msgid "Writing Speed: " +msgstr "Skrivehastighed: " + +#: src/mgui/author/output.cpp:221 +msgid "_Rendering only" +msgstr "Kun _optegning" + +#: src/mgui/author/output.cpp:275 +msgid "Rendering" +msgstr "Optegning" + +#: src/mgui/author/output.cpp:352 +msgid "DVD Burning" +msgstr "Dvd-brænding" + +#: src/mgui/author/output.cpp:396 +msgid "The result is here" +msgstr "Resultatet er her" + +#: src/mgui/author/output.cpp:398 +msgid "You can run authoring manually by executing command \"scons\" at the specified folder. Also, see README file for other options over there." +msgstr "Du kan køre fremstilling manuelt ved at køre kommandoen »scons« ved den angivne mappe. Se også README-filen for andre tilvalg." + +#. Translators: impossible to go on! +#: src/mgui/author/output.cpp:422 +msgid "Authoring is cancelled." +msgstr "Fremstilling er afbrudt." + +#: src/mgui/author/output.cpp:433 +#, boost-format +msgid "%1% is not a folder" +msgstr "%1% er ikke en mappe" + +#: src/mgui/author/output.cpp:444 +#, boost-format +msgid "Cant have full access to folder %1% (read, write)" +msgstr "Kan ikke have fuld adgang til mappe %1% (læs, skriv)" + +#: src/mgui/author/output.cpp:452 +#, boost-format +msgid "" +"Folder %1% is not empty. We need to remove all files in it before authoring.\n" +"Continue?" +msgstr "" +"Mappe %1% er ikke tom. Vi har brug for at fjerne alle filer i mappen før fremstilling.\n" +"Fortsæt?" + +#: src/mgui/author/output.cpp:458 +#, boost-format +msgid "Error during removing files: %1%" +msgstr "Fejl under fjernelse af filer: %1%" + +#: src/mgui/author/output.cpp:629 +#, boost-format +msgid "%1% cancelled." +msgstr "%1% afbrudt." + +#: src/mgui/author/output.cpp:631 +#, boost-format +msgid "%1% broken." +msgstr "%1% i stykker." + +#. Translators: can be tranlated as "Operation "%1%" ..." +#: src/mgui/author/output.cpp:638 +#, boost-format +msgid "%1% successfully completed." +msgstr "%1% færdig." + +#: src/mgui/author/output.cpp:668 src/mgui/timeline/select.cpp:216 +#, boost-format +msgid "_Play in %1%" +msgstr "_Afspil i %1%" + +#: src/mgui/author/output.cpp:669 +msgid "_Burn to DVD" +msgstr "_Brænd til dvd" + +#: src/mgui/author/script.cpp:392 +msgid "There is no media (video or menu)." +msgstr "Der er intet medie (video eller menu)." + +#: src/mgui/author/script.cpp:557 +#, boost-format +msgid "external command failure: %1%" +msgstr "ekstern kommandofejl: %1%" + +#: src/mgui/editor/select.cpp:499 +msgid "Delete" +msgstr "Slet" + +#: src/mgui/editor/select.cpp:513 +msgid "Link" +msgstr "Henvisning" + +#: src/mgui/editor/select.cpp:517 +msgid "Remove Link" +msgstr "Fjern henvisning" + +# yak, hvad sker der her. +#. Poster Link +#: src/mgui/editor/select.cpp:521 +msgid "Set Poster" +msgstr "Angiv plakat" + +#: src/mgui/editor/select.cpp:530 +msgid "Align" +msgstr "Juster" + +#: src/mgui/editor/select.cpp:538 +msgid "Align Left" +msgstr "Juster venstre" + +#: src/mgui/editor/select.cpp:539 +msgid "Align Right" +msgstr "Juster højre" + +#: src/mgui/editor/select.cpp:540 +msgid "Align Top" +msgstr "Juster øverst" + +#: src/mgui/editor/select.cpp:541 +msgid "Align Bottom" +msgstr "Juster nederst" + +#: src/mgui/editor/select.cpp:544 +msgid "Center Horizontally" +msgstr "Centrer vandret" + +#: src/mgui/editor/select.cpp:545 +msgid "Center Vertically" +msgstr "Centrer lodret" + +#. Set Background Color +#: src/mgui/editor/select.cpp:550 src/mgui/editor/select.cpp:802 +msgid "Set Background Color..." +msgstr "Angiv baggrundsfarve..." + +#. Selection Tool +#: src/mgui/editor/toolbar.cpp:129 +msgid "Selection Tool" +msgstr "Markeringsværktøj" + +#. Text Tool +#: src/mgui/editor/toolbar.cpp:132 +msgid "Text Tool" +msgstr "Tekstværktøj" + +#: src/mgui/editor/toolbar.cpp:493 +msgid "Add Item" +msgstr "Tilføj punkt" + +#: src/mgui/editor/toolbar.cpp:515 +msgid "Font Name" +msgstr "Skriftnavn" + +#: src/mgui/editor/toolbar.cpp:531 +msgid "Font Size" +msgstr "Skriftstørrelse" + +#. * кнопки стилей шрифта +#: src/mgui/editor/toolbar.cpp:536 +msgid "Bold" +msgstr "Fed" + +#: src/mgui/editor/toolbar.cpp:537 +msgid "Italic" +msgstr "Kursiv" + +#: src/mgui/editor/toolbar.cpp:538 +msgid "Underline" +msgstr "Understregning" + +#: src/mgui/editor/toolbar.cpp:547 +msgid "Pick a Color for Text" +msgstr "Vælg en farve til teksten" + +#: src/mgui/editor/toolbar.cpp:549 +msgid "Text Color" +msgstr "Tekstfarve" + +#: src/mgui/editor/toolbar.cpp:561 +msgid "Show Safe Area" +msgstr "Vis sikkerhedsområde" + +#: src/mgui/project/browser.cpp:128 +#, boost-format +msgid "Do you really want to delete \"%1%\" from Media List?" +msgstr "Ønsker du virkelig at slette »%1%« fra medielisten?" + +#: src/mgui/project/browser.cpp:129 +#, boost-format +msgid "Do you really want to delete chapter \"%1%\"?" +msgstr "Ønsker du virkelig at slette kapitel »%1%«?" + +#: src/mgui/project/browser.cpp:130 +#, boost-format +msgid "Do you really want to delete menu \"%1%\"?" +msgstr "Ønsker du virkelig at slette menu »%1%«?" + +#: src/mgui/project/browser.cpp:242 +msgid "First-Play media can be Video or Menu only." +msgstr "First-Play-medie kan kun være video eller menu." + +#: src/mgui/project/mconstructor.cpp:132 +msgid "Save Project As..." +msgstr "Gem projekt som..." + +#: src/mgui/project/mconstructor.cpp:169 +#, boost-format +msgid "Cant open project file \"%1%\"" +msgstr "Kan ikke åbne projektfil »%1%«" + +#: src/mgui/project/mconstructor.cpp:465 +msgid "Bombono DVD is a DVD authoring program with nice and clean GUI" +msgstr "Bombono DVD er et dvd-fremstillingsprogram med en pæn og ren grænseflade" + +#. dlg.set_authors(authors); +#. dlg.set_documenters(documenters); +#. dlg.set_decorated(false); +#: src/mgui/project/mconstructor.cpp:470 +msgid "translator-credits" +msgstr "" +"Joe Hansen, 2010.\n" +"\n" +"Dansk-gruppen \n" +"Mere info: http://www.dansk-gruppen.dk" + +#: src/mgui/project/mconstructor.cpp:611 +#, boost-format +msgid "Save changes to \"%1%\"?" +msgstr "Gem ændringer til »%1%«?" + +#: src/mgui/project/mconstructor.cpp:613 +msgid "Close _without Saving" +msgstr "Luk _uden at gemme" + +#: src/mgui/project/mconstructor.cpp:653 +msgid "New Project" +msgstr "Nyt projekt" + +#: src/mgui/project/mconstructor.cpp:662 +msgid "Please select a Television standard for your project:" +msgstr "Vælg venligst en tv-standard for dit projekt:" + +#: src/mgui/project/mconstructor.cpp:687 +msgid "Open Project" +msgstr "Åbn projekt" + +#: src/mgui/project/mconstructor.cpp:691 +msgid "Project files (*.xml)" +msgstr "Projektfiler (*.xml)" + +#: src/mgui/project/mconstructor.cpp:696 src/mgui/timeline/mviewer.cpp:273 +msgid "All Files (*.*)" +msgstr "Alle filer (*.*)" + +#. раньше Brasero использовал KiB, MiB и GiB, как более точные технически +#. (вроде как размеры HDD принято измерять по 1GB=1000MB); теперь Brasero +#. перешел на стандарт KB/MB/GB, ну и BmD тоже (а че, мы не гордые :) +#: src/mgui/project/mconstructor.cpp:824 +msgid "KB" +msgstr "KB" + +#: src/mgui/project/mconstructor.cpp:824 +msgid "GB" +msgstr "GB" + +#. Project +#: src/mgui/project/mconstructor.cpp:935 +msgid "_Project" +msgstr "_Projekt" + +#: src/mgui/project/mconstructor.cpp:940 +msgid "_New Project" +msgstr "_Nyt projekt" + +#: src/mgui/project/mconstructor.cpp:942 +msgid "_Open..." +msgstr "_Åbn..." + +#: src/mgui/project/mconstructor.cpp:944 +msgid "_Save" +msgstr "_Gem" + +#: src/mgui/project/mconstructor.cpp:946 +msgid "Save _As..." +msgstr "Gem _som..." + +#: src/mgui/project/mconstructor.cpp:948 +msgid "_Quit" +msgstr "_Afslut" + +#: src/mgui/project/mconstructor.cpp:950 +msgid "Add Videos from _DVD" +msgstr "Tilføj videoer fra _dvd" + +#: src/mgui/project/mconstructor.cpp:950 +msgid "DVD-Import Assistant" +msgstr "Assistent til dvd-import" + +#: src/mgui/project/mconstructor.cpp:952 +msgid "_Mux" +msgstr "_Mux" + +#: src/mgui/project/mconstructor.cpp:952 +msgid "Mux Elementary Streams into MPEG2" +msgstr "Mux elementærstrømme ind i MPEG" + +#: src/mgui/project/mconstructor.cpp:954 +msgid "Pr_eferences" +msgstr "_Indstillinger" + +#. Go +#: src/mgui/project/mconstructor.cpp:993 +msgid "_Go" +msgstr "_Begynd" + +#. первый вставляем сразу +#. Help +#: src/mgui/project/mconstructor.cpp:999 +msgid "_Help" +msgstr "_Hjælp" + +#: src/mgui/project/mconstructor.cpp:1100 +msgctxt "MainTabs" +msgid "_Source" +msgstr "_Kilde" + +#: src/mgui/project/mconstructor.cpp:1102 +msgctxt "MainTabs" +msgid "_Menu" +msgstr "_Menu" + +#: src/mgui/project/mconstructor.cpp:1104 +msgctxt "MainTabs" +msgid "_Output" +msgstr "_Uddata" + +#: src/mgui/project/mb-actions.cpp:142 +msgid "yes" +msgstr "ja" + +#: src/mgui/project/mb-actions.cpp:142 +msgid "no" +msgstr "nej" + +#: src/mgui/project/mb-actions.cpp:191 +msgid "Video bitrate" +msgstr "Videobitrate" + +#: src/mgui/project/mb-actions.cpp:192 +msgid "kbps" +msgstr "kbps" + +#: src/mgui/project/mb-actions.cpp:193 +msgid "Maximum data rate for video (9800 kbps) is exceeded." +msgstr "Maksimal datahastighed for video (9.800 kbps) er overgået." + +#: src/mgui/project/mb-actions.cpp:196 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with resolutions: %2% only." +msgstr "Dvd-videoen %1% kan kun acceptere MPEG-2 med opløsninger: %2%." + +#: src/mgui/project/mb-actions.cpp:197 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with frame rate: %2% only." +msgstr "Dvd-videoen %1% kan kun acceptere MPEG-2 med billedrate: %2%." + +#: src/mgui/project/mb-actions.cpp:198 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with aspects 4:3, 16:9 only." +msgstr "Dvd-videoen %1% kan kun acceptere MPEG-2 i forholdet 4:3, 16:9." + +#: src/mgui/project/mb-actions.cpp:218 +msgid "Video size" +msgstr "Videostørrelse" + +#: src/mgui/project/mb-actions.cpp:238 +msgid "Frame rate" +msgstr "Billedrate" + +#: src/mgui/project/mb-actions.cpp:239 +msgid "fps" +msgstr "bps" + +#: src/mgui/project/mb-actions.cpp:247 +msgid "Aspect ratio" +msgstr "Billedforhold" + +#: src/mgui/project/mb-actions.cpp:322 +msgid "Bombono DVD can use \"DVD-ready\" video only now. Use muxing programs like \"mplex -f 8\" (from mjpegtools), mencoder (from mplayer) or transcode to make your video ready for Bombono DVD." +msgstr "Bombono DVD kan i øjeblikke kun bruge »DVD-ready-video«. Brug muxingprogrammer som »mplex -f 8« (fra mjpegtools), mencoder (fra mplayer) eller transcode for at gøre dine video klar til Bombono DVD." + +#: src/mgui/project/mb-actions.cpp:326 +msgid "DVD packs" +msgstr "Dvd-pakker" + +#: src/mgui/project/mb-actions.cpp:328 +msgid "NAV packets" +msgstr "NAV-pakker" + +#: src/mgui/project/mb-actions.cpp:334 +msgid "This video may not be added due to (errors in red color):" +msgstr "Denne video kan ikke tilføjes på grund af (fejl i rød farve):" + +#. подскажем пользователю, что он ошибся форматом проекта +#: src/mgui/project/mb-actions.cpp:345 +#, boost-format +msgid "This video has %1% type and can't be added to current project of %2% type. Create new project from menu \"Project->New Project\" with right type." +msgstr "Denne video indeholder typen %1% og kan ikke tilføjes til det aktuelle projekt af typen %2%. Opret et nyt projekt fra menuen »Projekt->Nyt projekt« med den korrekte type." + +#: src/mgui/project/mb-actions.cpp:373 +msgid "File doesn't exist." +msgstr "Fil eksisterer ikke." + +#: src/mgui/project/mb-actions.cpp:378 +msgid "Folders can't be added." +msgstr "Mapper kan ikke tilføjes." + +#. по расширению выводим наиболее вероятную ошибку +#: src/mgui/project/mb-actions.cpp:413 +msgid "Unknown file type." +msgstr "Ukendt filtype." + +#: src/mgui/project/mb-actions.cpp:631 +#, boost-format +msgid "" +"The file \"%1%\" looks like VOB from DVD.\n" +"Run import?" +msgstr "" +"Filen »%1%« ligner vob fra dvd.\n" +"Kør import?" + +#: src/mgui/project/mb-actions.cpp:648 +#, boost-format +msgid "The file \"%1%\" looks like elementary stream and need to be muxed before using. Run muxing?" +msgstr "Filen »%1%« ligner elementærstrøm og skal muxes før brug. Kør muxing?" + +#: src/mgui/project/mb-actions.cpp:710 +msgid "Also:" +msgstr "Også:" + +#: src/mgui/project/mb-actions.cpp:719 +#, boost-format +msgid "See more about preparing video for authoring in online help." +msgstr "Se mere om forberedning af video til fremstilling i hjælpen på nettet." + +#: src/mgui/project/mb-actions.cpp:727 +#, boost-format +msgid "Can't add file \"%1%\"." +msgstr "Kan ikke tilføje fil »%1%«." + +#: src/mgui/project/mb-actions.cpp:730 +msgid "Can't add files:" +msgstr "Kan ikke tilføje filer:" + +#: src/mgui/project/media-browser.cpp:146 +msgid "Previous Menu" +msgstr "Forrige menu" + +#: src/mgui/project/media-browser.cpp:146 +#: src/mgui/project/media-browser.cpp:148 +msgid "Next Video" +msgstr "Næste video" + +#: src/mgui/project/media-browser.cpp:147 +#, boost-format +msgid "Auto (%1%)" +msgstr "Auto (%1%)" + +#: src/mgui/project/media-browser.cpp:177 +msgid "End Action" +msgstr "Afslut handling" + +#: src/mgui/project/media-browser.cpp:201 +msgid "Still Picture" +msgstr "Fastbillede" + +#: src/mgui/project/media-browser.cpp:233 +msgid "Type" +msgstr "Type" + +#. // не меньше чем размер шрифта элемента в списке +#. Gtk::Label& label = *Gtk::manage(new Gtk::Label("Media List")); +#. label.set_use_markup(true); +#. vbox.pack_start(label, Gtk::PACK_SHRINK); +#. Gtk::Requisition req = label.size_request(); +#. label.set_size_request(0, req.height+10); +#: src/mgui/project/media-browser.cpp:291 +#: src/mgui/project/menu-browser.cpp:373 +msgid "Media List" +msgstr "Medieliste" + +#: src/mgui/project/media-browser.cpp:331 +msgid "Add Media from File Browser" +msgstr "Tilføj medie fra filbrowser" + +#: src/mgui/project/media-browser.cpp:340 +msgid "Remove Media" +msgstr "Fjern medie" + +#: src/mgui/project/media-browser.cpp:351 +msgid "Make Chapters for Video" +msgstr "Lav kapitler til videoen" + +#: src/mgui/project/menu-browser.cpp:190 +msgid "No Link" +msgstr "Ingen henvisning" + +#. * subj +#: src/mgui/project/menu-browser.cpp:337 +msgid "Menu List" +msgstr "Menuliste" + +#: src/mgui/project/menu-browser.cpp:353 +msgid "Add Menu" +msgstr "Tilføj menu" + +#: src/mgui/project/menu-browser.cpp:358 +msgid "Remove Menu" +msgstr "Fjern menu" + +#: src/mgui/project/menu-browser.cpp:363 +msgid "Edit Menu" +msgstr "Rediger menu" + +#. Add +#: src/mgui/timeline/layout.cpp:526 src/mgui/timeline/select.cpp:193 +msgid "Add Chapter Point" +msgstr "Tilføj kapitelpunkt" + +#. 0 надпись +#: src/mgui/timeline/mviewer.cpp:239 +msgid "File Browser" +msgstr "Filbrowser" + +#: src/mgui/timeline/mviewer.cpp:269 +msgid "All formats" +msgstr "Alle formater" + +#: src/mgui/timeline/mviewer.cpp:270 +msgid "MPEG files" +msgstr "MPEG-filer" + +#: src/mgui/timeline/mviewer.cpp:272 +msgid "Still Images" +msgstr "Fastbilleder" + +#: src/mgui/timeline/select.cpp:127 +msgid "Save Frame..." +msgstr "Gem billedrate..." + +#. Add at Intervals +#: src/mgui/timeline/select.cpp:147 src/mgui/timeline/select.cpp:205 +msgid "Add Chapter Points at Intervals" +msgstr "Tilføj kapitelpunkt ved intervaller" + +#: src/mgui/timeline/select.cpp:153 +msgid "Interval between Chapters:" +msgstr "Interval mellem kapitler:" + +#: src/mgui/timeline/select.cpp:160 +msgid "min." +msgstr "min." + +#: src/mgui/timeline/select.cpp:163 +msgid "Remove Existing Chapters" +msgstr "Fjern eksisterende kapitler" + +#. Delete +#: src/mgui/timeline/select.cpp:196 +msgid "Delete Chapter Point" +msgstr "Slet kapitelpunkt" + +#. Delete All +#: src/mgui/timeline/select.cpp:200 +msgid "Delete All Chapter Points" +msgstr "Slet alle kapitelpunkter" + +#: src/mgui/timeline/select.cpp:213 +msgid "Save Current Frame" +msgstr "Gem aktuel billedrate" diff -Nru bombono-dvd-0.5.2/po/fi.po bombono-dvd-0.6.0/po/fi.po --- bombono-dvd-0.5.2/po/fi.po 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/po/fi.po 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,942 @@ +# Finnish messages for bombono-dvd. +# Copyright © 2010 "Ilya Murav'jov" +# This file is distributed under the same license as the bombono-dvd package. +# Jorma Karvonen , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: bombono-dvd 0.5.9\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-04-03 00:13+0400\n" +"PO-Revision-Date: 2010-04-06 09:34+0200\n" +"Last-Translator: Jorma Karvonen \n" +"Language-Team: Finnish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/mbase/project/media.cpp:68 src/mgui/project/media-browser.cpp:200 +msgid "Chapter" +msgstr "Kappale" + +#: src/mbase/project/media.cpp:112 +#, boost-format +msgid "Cant create folder %1% (check permissions)" +msgstr "Ei voi luoda kansiota %1% (tarkista käyttöoikeudet)" + +#: src/mbase/project/menu.cpp:276 +msgid "Menu" +msgstr "Valikko" + +#: src/mgui/dvdimport.cpp:82 +msgid "Choose Source DVD-Video" +msgstr "Valitse lähde-DVD-video" + +#: src/mgui/dvdimport.cpp:85 +msgid "Select Videos to Import" +msgstr "Valitse tuotavat videot" + +#: src/mgui/dvdimport.cpp:88 +msgid "Select Folder to Save Videos" +msgstr "Valitse kansio, johon videot tallennetaan" + +#: src/mgui/dvdimport.cpp:91 +msgid "Importing..." +msgstr "Tuodaan..." + +#: src/mgui/dvdimport.cpp:94 +msgid "Import is completed." +msgstr "Tuonti on toteutettu." + +#: src/mgui/dvdimport.cpp:207 src/mgui/project/mconstructor.cpp:824 +msgid "MB" +msgstr "megatavua" + +#: src/mgui/dvdimport.cpp:388 +msgid "Select All" +msgstr "Valitse kaikki" + +#: src/mgui/dvdimport.cpp:388 +msgid "Unselect All" +msgstr "Poista kaikki valinnat" + +#. мы не можем пустить исключение здесь, потому что оно пойдет +#. и через C-шный код (Gtk) - отложим +#: src/mgui/dvdimport.cpp:410 +msgid "Are you sure to stop importing?" +msgstr "Haluatko varmasti pysäyttää tuonnin?" + +#: src/mgui/dvdimport.cpp:443 +#, boost-format +msgid "Cant write to folder %1% (check permissions)." +msgstr "Ei voi kirjoittaa kansioon %1% (tarkista käyttöoikeudet)." + +#: src/mgui/dvdimport.cpp:471 src/mgui/win_utils.cpp:319 +#, boost-format +msgid "A file named \"%1%\" already exists. Do you want to replace it?" +msgstr "Tiedosto nimeltä ”%1%” on jo olemassa. Haluatko korvata sen?" + +#: src/mgui/dvdimport.cpp:504 +msgid "Import error!" +msgstr "Tuontivirhe!" + +#: src/mgui/dvdimport.cpp:508 +msgid "Videos successfully imported." +msgstr "Videot tuotiin onnistuneesti." + +#: src/mgui/dvdimport.cpp:509 +msgid "Import has been interrupted." +msgstr "Tuonti on keskeytetty." + +#: src/mgui/dvdimport.cpp:543 +msgid "DVD-Video Import" +msgstr "DVD-videotuonti" + +#: src/mgui/dvdimport.cpp:566 +msgid "Choose DVD disc, DVD folder or iso image file." +msgstr "Valitse DVD-levy, DVD-kansio tai iso-vedostiedosto." + +#: src/mgui/dvdimport.cpp:584 +msgid "NTSC/PAL mismatch. Try another disc or import to project of corresponding type." +msgstr "NTSC/PAL-täsmäämättömyys. Kokeile toista levyä tai tuo vastaavantyyppinen projekti." + +#. имя +#: src/mgui/dvdimport.cpp:608 src/mgui/project/media-browser.cpp:217 +msgid "Name" +msgstr "Nimi" + +#: src/mgui/dvdimport.cpp:621 +msgid "Details" +msgstr "Yksityiskohdat" + +#: src/mgui/dvdimport.cpp:667 +msgid "It is desirable the destination folder to be empty." +msgstr "On toivottavaa, että kohdekansio olisi tyhjä." + +#. COPY_N_PASTE - тупо сделал содержимое сообщений как у "TSNAMI-MPEG DVD Author" +#. А что делать - нафига свои придумывать, если смысл один и тот же +#: src/mgui/execution.cpp:27 +#, boost-format +msgid "You are about to cancel %1%. Are you sure?" +msgstr "Olet perumassa toiminnon %1%. Oletko varma?" + +#: src/mgui/mux.cpp:29 +msgid "muxing" +msgstr "lomitus" + +#: src/mgui/mux.cpp:45 +#, boost-format +msgid "Muxing \"%1%\"" +msgstr "Lomitetaan ”%1%”" + +#: src/mgui/mux.cpp:56 src/mgui/author/output.cpp:229 +msgid "Show/_Hide Details" +msgstr "Näytä/P_iilota yksityiskohdat" + +#: src/mgui/mux.cpp:80 +msgid "Muxing error" +msgstr "Lomitusvirhe" + +#: src/mgui/mux.cpp:81 src/mgui/author/output.cpp:632 +#, boost-format +msgid "The reason is \"%1%\" (see Details)" +msgstr "Syy on ”%1%” (katso Yksityiskohdat)" + +#: src/mgui/mux.cpp:97 +msgid "Select a folder" +msgstr "Valitse kansio" + +#: src/mgui/mux.cpp:109 +msgid "in" +msgstr "kohteessa" + +#: src/mgui/mux.cpp:143 +msgid "Mux streams" +msgstr "Lomitusvuot" + +#: src/mgui/mux.cpp:145 +msgid "Output" +msgstr "Tuloste" + +#: src/mgui/mux.cpp:146 +msgid "Select elementary video" +msgstr "Valitse perusvideo" + +#: src/mgui/mux.cpp:147 +msgid "Select audio" +msgstr "Valitse ääni" + +#. Названия типов для i18n +#: src/mgui/mux.cpp:151 src/mgui/project/media-browser.cpp:199 +#: src/mgui/timeline/layout-draw.cpp:156 +msgid "Video" +msgstr "Video" + +#: src/mgui/mux.cpp:154 +msgid "MPEG2 elementary video (m2v)" +msgstr "MPEG2-perusvideo (m2v)" + +#: src/mgui/mux.cpp:159 +msgid "Audio" +msgstr "Ääni" + +#: src/mgui/mux.cpp:162 src/mgui/timeline/mviewer.cpp:271 +msgid "Audio for DVD" +msgstr "Ääni DVD:lle" + +#: src/mgui/mux.cpp:187 +msgid "Elementary video file is not selected." +msgstr "Perusvideotiedostoa ei ole valittu." + +#: src/mgui/mux.cpp:189 +msgid "Audio file is not selected." +msgstr "Äänitiedostoa ei ole valittu." + +#: src/mgui/mux.cpp:191 +msgid "Output file name is empty." +msgstr "Tulostetiedostonimi on tyhjä." + +#: src/mgui/prefs.cpp:98 +msgid "Bombono DVD Preferences" +msgstr "Bombono DVD-asetukset" + +#: src/mgui/prefs.cpp:111 +msgid "_Default Project Type" +msgstr "Ol_etusprojektityyppi" + +#: src/mgui/prefs.cpp:116 +msgid "_Play Authoring Result in" +msgstr "S_oita tekemistulokset kohteessa" + +#: src/mgui/win_utils.cpp:322 +msgid "Replacing the file overwrite its contents." +msgstr "Tiedoston korvaamisessa sen sisältö ylikirjoitetaan." + +#: src/mgui/author/burn.cpp:198 +msgid "Auto" +msgstr "Automaattinen" + +#: src/mgui/author/burn.cpp:210 +msgid "Update speeds ..." +msgstr "Päivitysnopeudet ..." + +#: src/mgui/author/burn.cpp:331 +msgid "Checking Disc ..." +msgstr "Tarkistetaan levyä ..." + +#: src/mgui/author/burn.cpp:345 +msgid "Selected burn drive is for CD discs only. Change to another burn drive." +msgstr "Valittu tallennuslaite on vain CD-levyjä varten. Vaihda toiseen tallentavaan laitteeseen." + +#: src/mgui/author/burn.cpp:350 +msgid "CD disc is found in the drive, not DVD. Change to DVD disc." +msgstr "Levyasemasta löytyi CD-levy, ei DVD-levy. Vaihda DVD-levyyn." + +#: src/mgui/author/burn.cpp:355 +msgid "No DVD disc in the drive. Load a clear one and press OK." +msgstr "Levyasemassa ei ole DVD-levyä. Lataa tyhjä levy ja paina OK-painiketta." + +#: src/mgui/author/burn.cpp:360 +#, boost-format +msgid "Disc with type \"%1%\" is found in the drive but for DVD-Video disc type should be one from: DVD-R, DVD+R, DVD-RW, DVD+RW. Load a clear one with right type and press OK." +msgstr "Levyasemasta löytyi ”%1%”-tyyppinen levy, mutta DVD-videolevyä varten tyypin pitäisi olla yksi seuraavista: DVD-R, DVD+R, DVD-RW, DVD+RW. Lataa tyhjä oikeantyyppinen levy ja paina OK-painiketta." + +#: src/mgui/author/burn.cpp:369 +#, boost-format +msgid "Disc with type \"%1%\" in the drive is not clear. Only clear recordable discs can be used for burning DVD-Video. Load a clear one and press OK." +msgstr "Levyasemassa oleva ”%1%”-tyyppinen levy ei ole tyhjä. Vain tyhjiä tallentavia levyjä voidaan käyttää DVD-videon tallentamiseen. Lataa tyhjä levy ja paina OK-painiketta." + +#: src/mgui/author/burn.cpp:376 +#, boost-format +msgid "Disc with type \"%1%\" in the drive is not clear. We need to remove its contents before writing new one. Continue?" +msgstr "Levyasemassa oleva ”%1%”-tyyppinen levy ei ole tyhjä. Meidän on poistettava sen sisältö ennen uuden kirjoittamista. Jatketaanko?" + +#: src/mgui/author/burn.cpp:380 +msgid "_Cancel" +msgstr "_Peru" + +#: src/mgui/author/burn.cpp:381 +msgid "_Try again" +msgstr "Yri_tä uudelleen" + +#: src/mgui/author/execute.cpp:72 +msgid "Status: " +msgstr "Tila: " + +#: src/mgui/author/execute.cpp:568 +#, boost-format +msgid "exit code = %1%" +msgstr "poistumiskoodi = %1%" + +#: src/mgui/author/execute.cpp:570 +#, boost-format +msgid "broken by signal %1%" +msgstr "signaalin %1% rikkoma" + +#: src/mgui/author/indicator.cpp:67 +msgid "Rendering Menus" +msgstr "Hahmontamisvalikot" + +#: src/mgui/author/indicator.cpp:68 +msgid "Generating DVD-Video" +msgstr "Tuotetaan DVD-video" + +#: src/mgui/author/indicator.cpp:69 +msgid "Creating ISO Image" +msgstr "Luodaan ISO-vedos" + +#: src/mgui/author/indicator.cpp:70 +msgid "Burning DVD" +msgstr "Tallennetaan DVD" + +#: src/mgui/author/output.cpp:53 +msgid "DVD-Video Building" +msgstr "DVD-videotallennus" + +# Edellinen msgid saattaa olla tämän msgid:n parametri +#: src/mgui/author/output.cpp:63 +#, boost-format +msgid "_Cancel %1%" +msgstr "Per_u %1%" + +#: src/mgui/author/output.cpp:64 +msgid "_Build DVD-Video" +msgstr "Rak_enna DVD-video" + +#: src/mgui/author/output.cpp:161 +msgid "Select Output _Folder:" +msgstr "Valitse tulo_stekansio:" + +#: src/mgui/author/output.cpp:175 +msgid " Choose Author Mode: " +msgstr " Valitse tekijätila: " + +#. цель по умолчанию +#: src/mgui/author/output.cpp:181 +msgid "_Write DVD Folder" +msgstr "Kir_joita DVD-kansio" + +#: src/mgui/author/output.cpp:182 +msgid "Write Disk _Image" +msgstr "Kirj_oita levyvedos" + +#: src/mgui/author/output.cpp:191 +msgid "Disc Label: " +msgstr "Levynimiö: " + +#: src/mgui/author/output.cpp:196 +msgid "Burn to _DVD" +msgstr "Tallenna _DVD:lle" + +#: src/mgui/author/output.cpp:204 +msgid "DVD Drive: " +msgstr "DVD-asema: " + +#: src/mgui/author/output.cpp:210 +msgid "Writing Speed: " +msgstr "Kirjoitusnopeus: " + +#: src/mgui/author/output.cpp:221 +msgid "_Rendering only" +msgstr "_Vain hahmontaminen" + +#: src/mgui/author/output.cpp:275 +msgid "Rendering" +msgstr "Hahmonnetaan" + +#: src/mgui/author/output.cpp:352 +msgid "DVD Burning" +msgstr "DVD-tallennus" + +#: src/mgui/author/output.cpp:396 +msgid "The result is here" +msgstr "Tulos on tässä" + +#: src/mgui/author/output.cpp:398 +msgid "You can run authoring manually by executing command \"scons\" at the specified folder. Also, see README file for other options over there." +msgstr "Voit suorittaa tekemisen manuaalisesti komennolla ”scons” määritellyssä kansiossa. Katso myös README-tiedostosta lisävalitsimia." + +#. Translators: impossible to go on! +#: src/mgui/author/output.cpp:422 +msgid "Authoring is cancelled." +msgstr "Tekeminen peruttiin." + +#: src/mgui/author/output.cpp:433 +#, boost-format +msgid "%1% is not a folder" +msgstr "%1% ei ole kansio" + +#: src/mgui/author/output.cpp:444 +#, boost-format +msgid "Cant have full access to folder %1% (read, write)" +msgstr "Ei voi olla täysiä käyttöoikeuksia kansioon %1% (luku, kirjoitus)" + +#: src/mgui/author/output.cpp:452 +#, boost-format +msgid "" +"Folder %1% is not empty. We need to remove all files in it before authoring.\n" +"Continue?" +msgstr "" +"Kansio %1% ei ole tyhjä. Meidän on poistettava siitä kaikki tiedostot ennen tekemistä.\n" +"Jatketaanko?" + +#: src/mgui/author/output.cpp:458 +#, boost-format +msgid "Error during removing files: %1%" +msgstr "Virhe poistettaessa tiedostoja: %1%" + +#: src/mgui/author/output.cpp:629 +#, boost-format +msgid "%1% cancelled." +msgstr "%1% peruttu." + +#: src/mgui/author/output.cpp:631 +#, boost-format +msgid "%1% broken." +msgstr "%1% rikki." + +#. Translators: can be tranlated as "Operation "%1%" ..." +#: src/mgui/author/output.cpp:638 +#, boost-format +msgid "%1% successfully completed." +msgstr "Toiminto %1% valmis." + +#: src/mgui/author/output.cpp:668 src/mgui/timeline/select.cpp:216 +#, boost-format +msgid "_Play in %1%" +msgstr "_Soita kohteessa %1%" + +#: src/mgui/author/output.cpp:669 +msgid "_Burn to DVD" +msgstr "T_allenna DVD:lle" + +#: src/mgui/author/script.cpp:392 +msgid "There is no media (video or menu)." +msgstr "Ei ole mediaa (video tai valikko)." + +#: src/mgui/author/script.cpp:557 +#, boost-format +msgid "external command failure: %1%" +msgstr "ulkoisen komennon virhe: %1%" + +#: src/mgui/editor/select.cpp:499 +msgid "Delete" +msgstr "Poista" + +#: src/mgui/editor/select.cpp:513 +msgid "Link" +msgstr "Linkki" + +#: src/mgui/editor/select.cpp:517 +msgid "Remove Link" +msgstr "Poista linkki" + +#. Poster Link +#: src/mgui/editor/select.cpp:521 +msgid "Set Poster" +msgstr "Aseta juliste" + +#: src/mgui/editor/select.cpp:530 +msgid "Align" +msgstr "Tasaa" + +#: src/mgui/editor/select.cpp:538 +msgid "Align Left" +msgstr "Tasaa vasemmalle" + +#: src/mgui/editor/select.cpp:539 +msgid "Align Right" +msgstr "Tasaa oikealle" + +#: src/mgui/editor/select.cpp:540 +msgid "Align Top" +msgstr "Tasaa ylös" + +#: src/mgui/editor/select.cpp:541 +msgid "Align Bottom" +msgstr "Tasaa alas" + +#: src/mgui/editor/select.cpp:544 +msgid "Center Horizontally" +msgstr "Keskitä vaakasuoraan" + +#: src/mgui/editor/select.cpp:545 +msgid "Center Vertically" +msgstr "Keskitä pystysuoraan" + +#. Set Background Color +#: src/mgui/editor/select.cpp:550 src/mgui/editor/select.cpp:802 +msgid "Set Background Color..." +msgstr "Aseta taustaväri..." + +#. Selection Tool +#: src/mgui/editor/toolbar.cpp:129 +msgid "Selection Tool" +msgstr "Valintatyökalu" + +#. Text Tool +#: src/mgui/editor/toolbar.cpp:132 +msgid "Text Tool" +msgstr "Tekstityökalu" + +#: src/mgui/editor/toolbar.cpp:493 +msgid "Add Item" +msgstr "Lisää kohde" + +#: src/mgui/editor/toolbar.cpp:515 +msgid "Font Name" +msgstr "Kirjasinnimi" + +#: src/mgui/editor/toolbar.cpp:531 +msgid "Font Size" +msgstr "Kirjasinkoko" + +#. * кнопки стилей шрифта +#: src/mgui/editor/toolbar.cpp:536 +msgid "Bold" +msgstr "Vahvennettu" + +#: src/mgui/editor/toolbar.cpp:537 +msgid "Italic" +msgstr "Kursiivi" + +#: src/mgui/editor/toolbar.cpp:538 +msgid "Underline" +msgstr "Alleviivattu" + +#: src/mgui/editor/toolbar.cpp:547 +msgid "Pick a Color for Text" +msgstr "Valitse tekstiväri" + +#: src/mgui/editor/toolbar.cpp:549 +msgid "Text Color" +msgstr "Tekstiväri" + +#: src/mgui/editor/toolbar.cpp:561 +msgid "Show Safe Area" +msgstr "Näytä turva-alue" + +#: src/mgui/project/browser.cpp:128 +#, boost-format +msgid "Do you really want to delete \"%1%\" from Media List?" +msgstr "Haluatko varmasti poistaa ”%1%” Media-luettelosta?" + +#: src/mgui/project/browser.cpp:129 +#, boost-format +msgid "Do you really want to delete chapter \"%1%\"?" +msgstr "Haluatko todella poistaa kappaleen ”%1%”?" + +#: src/mgui/project/browser.cpp:130 +#, boost-format +msgid "Do you really want to delete menu \"%1%\"?" +msgstr "Haluatko todella poistaa valikon ”%1%”?" + +#: src/mgui/project/browser.cpp:242 +msgid "First-Play media can be Video or Menu only." +msgstr "Ensimmäinen soittomedia voi olla vain video tai valikko." + +#: src/mgui/project/mconstructor.cpp:132 +msgid "Save Project As..." +msgstr "Tallenna projekti nimellä..." + +#: src/mgui/project/mconstructor.cpp:169 +#, boost-format +msgid "Cant open project file \"%1%\"" +msgstr "Ei voi avata projektitiedostoa ”%1%”" + +#: src/mgui/project/mconstructor.cpp:465 +msgid "Bombono DVD is a DVD authoring program with nice and clean GUI" +msgstr "Bombono DVD on DVD-tekemisohjelma kauniilla ja siistillä graafisella käyttöliittymällä" + +#. dlg.set_authors(authors); +#. dlg.set_documenters(documenters); +#. dlg.set_decorated(false); +#: src/mgui/project/mconstructor.cpp:470 +msgid "translator-credits" +msgstr "Jorma Karvonen " + +# Parametri on ilmeisesti projektin otsikko +#: src/mgui/project/mconstructor.cpp:611 +#, boost-format +msgid "Save changes to \"%1%\"?" +msgstr "Tallenna muutokset projektiin ”%1%”?" + +#: src/mgui/project/mconstructor.cpp:613 +msgid "Close _without Saving" +msgstr "Sulje tallenta_matta" + +#: src/mgui/project/mconstructor.cpp:653 +msgid "New Project" +msgstr "Uusi projekti" + +#: src/mgui/project/mconstructor.cpp:662 +msgid "Please select a Television standard for your project:" +msgstr "Valitse televisiostandardi projektillesi:" + +#: src/mgui/project/mconstructor.cpp:687 +msgid "Open Project" +msgstr "Avaa projekti" + +#: src/mgui/project/mconstructor.cpp:691 +msgid "Project files (*.xml)" +msgstr "Projektitiedostot (*.xml)" + +#: src/mgui/project/mconstructor.cpp:696 src/mgui/timeline/mviewer.cpp:273 +msgid "All Files (*.*)" +msgstr "Kaikki tiedostot (*.*)" + +#. раньше Brasero использовал KiB, MiB и GiB, как более точные технически +#. (вроде как размеры HDD принято измерять по 1GB=1000MB); теперь Brasero +#. перешел на стандарт KB/MB/GB, ну и BmD тоже (а че, мы не гордые :) +#: src/mgui/project/mconstructor.cpp:824 +msgid "KB" +msgstr "kilotavua" + +#: src/mgui/project/mconstructor.cpp:824 +msgid "GB" +msgstr "gigatavua" + +#. Project +#: src/mgui/project/mconstructor.cpp:935 +msgid "_Project" +msgstr "Proje_kti" + +#: src/mgui/project/mconstructor.cpp:940 +msgid "_New Project" +msgstr "Uu_si projekti" + +#: src/mgui/project/mconstructor.cpp:942 +msgid "_Open..." +msgstr "A_vaa..." + +#: src/mgui/project/mconstructor.cpp:944 +msgid "_Save" +msgstr "Talle_nna" + +#: src/mgui/project/mconstructor.cpp:946 +msgid "Save _As..." +msgstr "T_allenna nimellä..." + +#: src/mgui/project/mconstructor.cpp:948 +msgid "_Quit" +msgstr "_Poistu" + +#: src/mgui/project/mconstructor.cpp:950 +msgid "Add Videos from _DVD" +msgstr "Lisää videot _DVD:stä" + +#: src/mgui/project/mconstructor.cpp:950 +msgid "DVD-Import Assistant" +msgstr "DVD-tuontiavustaja" + +#: src/mgui/project/mconstructor.cpp:952 +msgid "_Mux" +msgstr "_Multiplekseri" + +#: src/mgui/project/mconstructor.cpp:952 +msgid "Mux Elementary Streams into MPEG2" +msgstr "Multiplekseriperusvuot MPEG2:teen" + +#: src/mgui/project/mconstructor.cpp:954 +msgid "Pr_eferences" +msgstr "Asetu_kset" + +#. Go +#: src/mgui/project/mconstructor.cpp:993 +msgid "_Go" +msgstr "_Siirry" + +#. первый вставляем сразу +#. Help +#: src/mgui/project/mconstructor.cpp:999 +msgid "_Help" +msgstr "O_paste" + +#: src/mgui/project/mconstructor.cpp:1100 +msgctxt "MainTabs" +msgid "_Source" +msgstr "Lä_hde" + +#: src/mgui/project/mconstructor.cpp:1102 +msgctxt "MainTabs" +msgid "_Menu" +msgstr "Valikk_o" + +#: src/mgui/project/mconstructor.cpp:1104 +msgctxt "MainTabs" +msgid "_Output" +msgstr "_Tuloste" + +#: src/mgui/project/mb-actions.cpp:142 +msgid "yes" +msgstr "kyllä" + +#: src/mgui/project/mb-actions.cpp:142 +msgid "no" +msgstr "ei" + +#: src/mgui/project/mb-actions.cpp:191 +msgid "Video bitrate" +msgstr "Videon bittinopeus" + +#: src/mgui/project/mb-actions.cpp:192 +msgid "kbps" +msgstr "kilobittiä per sekunti" + +#: src/mgui/project/mb-actions.cpp:193 +msgid "Maximum data rate for video (9800 kbps) is exceeded." +msgstr "Enimmäisdatanopeus videolle (9800 kilobittiä per sekunti) ylitettiin." + +#: src/mgui/project/mb-actions.cpp:196 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with resolutions: %2% only." +msgstr "DVD-video %1% voi hyväksyä MPEG-2 -koodausta vain resoluutioilla: %2%." + +#: src/mgui/project/mb-actions.cpp:197 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with frame rate: %2% only." +msgstr "DVD-video %1% voi hyväksyä MPEG-2 -koodausta vain kehysnopeudella: %2%." + +#: src/mgui/project/mb-actions.cpp:198 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with aspects 4:3, 16:9 only." +msgstr "DVD-video %1% voi hyväksyä MPEG-2 -koodausta vain kuvasuhteilla 4:3, 16:9." + +#: src/mgui/project/mb-actions.cpp:218 +msgid "Video size" +msgstr "Videokoko" + +#: src/mgui/project/mb-actions.cpp:238 +msgid "Frame rate" +msgstr "Kehysnopeus" + +# Arvaus: frames per second +#: src/mgui/project/mb-actions.cpp:239 +msgid "fps" +msgstr "kehystä/sekunti" + +#: src/mgui/project/mb-actions.cpp:247 +msgid "Aspect ratio" +msgstr "Kuvasuhde" + +# Muxing tarkoittaa samaa kuin multiplexing +#: src/mgui/project/mb-actions.cpp:322 +msgid "Bombono DVD can use \"DVD-ready\" video only now. Use muxing programs like \"mplex -f 8\" (from mjpegtools), mencoder (from mplayer) or transcode to make your video ready for Bombono DVD." +msgstr "Bombono DVD voidaan käyttää nyt vain ”DVD-ready”-videoille. Käytä lomittamisohjelmia kuten ”mplex -f 8” (ohjelmasta mjpegtools), mencoder (ohjelmasta mplayer) tai transcode tekemään videon valmiiksi Bombono DVD:lle." + +#: src/mgui/project/mb-actions.cpp:326 +msgid "DVD packs" +msgstr "DVD-kokoelmat" + +#: src/mgui/project/mb-actions.cpp:328 +msgid "NAV packets" +msgstr "NAV-paketit" + +#: src/mgui/project/mb-actions.cpp:334 +msgid "This video may not be added due to (errors in red color):" +msgstr "Tätä videota ei saa lisätä seuraavista syistä (virheet punaisella värillä):" + +#. подскажем пользователю, что он ошибся форматом проекта +#: src/mgui/project/mb-actions.cpp:345 +#, boost-format +msgid "This video has %1% type and can't be added to current project of %2% type. Create new project from menu \"Project->New Project\" with right type." +msgstr "Tämän videon tyyppi on %1% ja sitä ei voi lisätä nykyiseen %2%-tyyppiseen projektiin. Luo uusi oikean tyyppinen projekti valikosta ”Projekti->Uusi projekti”." + +#: src/mgui/project/mb-actions.cpp:373 +msgid "File doesn't exist." +msgstr "Tiedostoa ei ole olemassa." + +#: src/mgui/project/mb-actions.cpp:378 +msgid "Folders can't be added." +msgstr "Kansioita ei voida lisätä." + +#. по расширению выводим наиболее вероятную ошибку +#: src/mgui/project/mb-actions.cpp:413 +msgid "Unknown file type." +msgstr "Tuntematon tiedostotyyppi." + +#: src/mgui/project/mb-actions.cpp:631 +#, boost-format +msgid "" +"The file \"%1%\" looks like VOB from DVD.\n" +"Run import?" +msgstr "" +"Tiedosto ”%1%” näyttää aivan VOB-tiedostolta DVD:ltä.\n" +"Suoritetaanko tuonti?" + +#: src/mgui/project/mb-actions.cpp:648 +#, boost-format +msgid "The file \"%1%\" looks like elementary stream and need to be muxed before using. Run muxing?" +msgstr "Tiedosto ”%1%” näyttää perusvuolta ja se on lomitettava ennen käyttöä. Suoritetaanko lomitus?" + +#: src/mgui/project/mb-actions.cpp:710 +msgid "Also:" +msgstr "Myös:" + +#: src/mgui/project/mb-actions.cpp:719 +#, boost-format +msgid "See more about preparing video for authoring in online help." +msgstr "Lisätietoja videon tekemisvalmisteluista online-opasteesta." + +#: src/mgui/project/mb-actions.cpp:727 +#, boost-format +msgid "Can't add file \"%1%\"." +msgstr "Ei voi lisätä tiedostoa ”%1%”." + +#: src/mgui/project/mb-actions.cpp:730 +msgid "Can't add files:" +msgstr "Ei voi lisätä tiedostoja:" + +#: src/mgui/project/media-browser.cpp:146 +msgid "Previous Menu" +msgstr "Edellinen valikko" + +#: src/mgui/project/media-browser.cpp:146 +#: src/mgui/project/media-browser.cpp:148 +msgid "Next Video" +msgstr "Seuraava video" + +#: src/mgui/project/media-browser.cpp:147 +#, boost-format +msgid "Auto (%1%)" +msgstr "Automaattinen (%1%)" + +#: src/mgui/project/media-browser.cpp:177 +msgid "End Action" +msgstr "Lopputoiminto" + +#: src/mgui/project/media-browser.cpp:201 +msgid "Still Picture" +msgstr "Pysäytyskuva" + +#: src/mgui/project/media-browser.cpp:233 +msgid "Type" +msgstr "Tyyppi" + +#. // не меньше чем размер шрифта элемента в списке +#. Gtk::Label& label = *Gtk::manage(new Gtk::Label("Media List")); +#. label.set_use_markup(true); +#. vbox.pack_start(label, Gtk::PACK_SHRINK); +#. Gtk::Requisition req = label.size_request(); +#. label.set_size_request(0, req.height+10); +#: src/mgui/project/media-browser.cpp:291 +#: src/mgui/project/menu-browser.cpp:373 +msgid "Media List" +msgstr "Medialuettelo" + +#: src/mgui/project/media-browser.cpp:331 +msgid "Add Media from File Browser" +msgstr "Lisää media tiedostoselaimesta" + +#: src/mgui/project/media-browser.cpp:340 +msgid "Remove Media" +msgstr "Poista media" + +#: src/mgui/project/media-browser.cpp:351 +msgid "Make Chapters for Video" +msgstr "Tee kappaleita videolle" + +#: src/mgui/project/menu-browser.cpp:190 +msgid "No Link" +msgstr "Ei linkkiä" + +#. * subj +#: src/mgui/project/menu-browser.cpp:337 +msgid "Menu List" +msgstr "Valikkoluettelo" + +#: src/mgui/project/menu-browser.cpp:353 +msgid "Add Menu" +msgstr "Lisää valikko" + +#: src/mgui/project/menu-browser.cpp:358 +msgid "Remove Menu" +msgstr "Poista valikko" + +#: src/mgui/project/menu-browser.cpp:363 +msgid "Edit Menu" +msgstr "Muokkaa valikkoa" + +#. Add +#: src/mgui/timeline/layout.cpp:526 src/mgui/timeline/select.cpp:193 +msgid "Add Chapter Point" +msgstr "Lisää kappalekohta" + +#. 0 надпись +#: src/mgui/timeline/mviewer.cpp:239 +msgid "File Browser" +msgstr "Tiedostoselain" + +#: src/mgui/timeline/mviewer.cpp:269 +msgid "All formats" +msgstr "Kaikki muodot" + +#: src/mgui/timeline/mviewer.cpp:270 +msgid "MPEG files" +msgstr "MPEG-tiedostot" + +#: src/mgui/timeline/mviewer.cpp:272 +msgid "Still Images" +msgstr "Pysätyskuvat" + +#: src/mgui/timeline/select.cpp:127 +msgid "Save Frame..." +msgstr "Tallenna kehys..." + +#. Add at Intervals +#: src/mgui/timeline/select.cpp:147 src/mgui/timeline/select.cpp:205 +msgid "Add Chapter Points at Intervals" +msgstr "Lisää kappalekohtia aikavälein" + +#: src/mgui/timeline/select.cpp:153 +msgid "Interval between Chapters:" +msgstr "Kappeleiden välinen aika:" + +#: src/mgui/timeline/select.cpp:160 +msgid "min." +msgstr "min." + +#: src/mgui/timeline/select.cpp:163 +msgid "Remove Existing Chapters" +msgstr "Poista olemassa olevat kappaleet" + +#. Delete +#: src/mgui/timeline/select.cpp:196 +msgid "Delete Chapter Point" +msgstr "Poista kappalekohta" + +#. Delete All +#: src/mgui/timeline/select.cpp:200 +msgid "Delete All Chapter Points" +msgstr "Poista kaikki kappalekohdat" + +#: src/mgui/timeline/select.cpp:213 +msgid "Save Current Frame" +msgstr "Tallenna nykyinen kehys" + +#~ msgctxt "MediaBrowser" +#~ msgid "Edit" +#~ msgstr "Muokkaa" + +#~ msgctxt "MenuBrowser" +#~ msgid "Edit" +#~ msgstr "Muokkaa" + +#~ msgid "KiB" +#~ msgstr "kibitavua" + +#~ msgid "MiB" +#~ msgstr "mebitavua" + +#~ msgid "%d MiB of %s" +#~ msgstr "%d mebitavua/%s" + +#~ msgid "GiB" +#~ msgstr "gibitavua" + +#~ msgid "_Forward" +#~ msgstr "E_delleen" + +#~ msgid "_Back" +#~ msgstr "Takaisi_n" diff -Nru bombono-dvd-0.5.2/po/nn.po bombono-dvd-0.6.0/po/nn.po --- bombono-dvd-0.5.2/po/nn.po 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/po/nn.po 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,924 @@ +# Norwegian Nynorsk translation for bombono-dvd. +# Copyright (C) 2010 "Ilya Murav'jov" +# This file is distributed under the same license as the bombono-dvd package. +# Eivind Ødegård , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: bombono-dvd 0.5.9\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-04-03 00:13+0400\n" +"PO-Revision-Date: 2010-04-06 21:11+0100\n" +"Last-Translator: Eivind Ødegård \n" +"Language-Team: Norwegian Nynorsk \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Norwegian Nynorsk\n" +"X-Poedit-Country: NORWAY\n" + +#: src/mbase/project/media.cpp:68 src/mgui/project/media-browser.cpp:200 +msgid "Chapter" +msgstr "Kapittel" + +#: src/mbase/project/media.cpp:112 +#, boost-format +msgid "Cant create folder %1% (check permissions)" +msgstr "Greier ikkje laga mappa %1% (sjekk tilgangsløyve)." + +#: src/mbase/project/menu.cpp:276 +msgid "Menu" +msgstr "Meny" + +#: src/mgui/dvdimport.cpp:82 +msgid "Choose Source DVD-Video" +msgstr "Vel kjelde for DVD-video" + +#: src/mgui/dvdimport.cpp:85 +msgid "Select Videos to Import" +msgstr "Vel videoane du vil importera" + +#: src/mgui/dvdimport.cpp:88 +msgid "Select Folder to Save Videos" +msgstr "Vel mappe å lagra videoane i" + +#: src/mgui/dvdimport.cpp:91 +msgid "Importing..." +msgstr "Importerer …" + +#: src/mgui/dvdimport.cpp:94 +msgid "Import is completed." +msgstr "Ferdig med importen." + +#: src/mgui/dvdimport.cpp:207 src/mgui/project/mconstructor.cpp:824 +msgid "MB" +msgstr "MiB" + +#: src/mgui/dvdimport.cpp:388 +msgid "Select All" +msgstr "Vel alt" + +#: src/mgui/dvdimport.cpp:388 +msgid "Unselect All" +msgstr "Merk ingen" + +#. мы не можем пустить исключение здесь, потому что оно пойдет +#. и через C-шный код (Gtk) - отложим +#: src/mgui/dvdimport.cpp:410 +msgid "Are you sure to stop importing?" +msgstr "Er du sikker på at du vil avslutta importen?" + +#: src/mgui/dvdimport.cpp:443 +#, boost-format +msgid "Cant write to folder %1% (check permissions)." +msgstr "Greier ikkje skriva til mappa %1% (sjekk tilgangsløyve)." + +#: src/mgui/dvdimport.cpp:471 src/mgui/win_utils.cpp:319 +#, boost-format +msgid "A file named \"%1%\" already exists. Do you want to replace it?" +msgstr "Ein fil med namnet \"%1%\" eksisterer allereie. Vil du byta henne ut?" + +#: src/mgui/dvdimport.cpp:504 +msgid "Import error!" +msgstr "Importeringsfeil!" + +#: src/mgui/dvdimport.cpp:508 +msgid "Videos successfully imported." +msgstr "Videoane vart importerte utan feil." + +#: src/mgui/dvdimport.cpp:509 +msgid "Import has been interrupted." +msgstr "Importen er avbroten." + +#: src/mgui/dvdimport.cpp:543 +msgid "DVD-Video Import" +msgstr "DVD-video-import" + +#: src/mgui/dvdimport.cpp:566 +msgid "Choose DVD disc, DVD folder or iso image file." +msgstr "Vel ei DVD-plate, ei DVD-mappe eller ei iso-biletfil." + +#: src/mgui/dvdimport.cpp:584 +msgid "NTSC/PAL mismatch. Try another disc or import to project of corresponding type." +msgstr "Manglar NTSC/PAL-samsvar. Prøv ei anna plate, eller importer til eit prosjekt av same type." + +#. имя +#: src/mgui/dvdimport.cpp:608 src/mgui/project/media-browser.cpp:217 +msgid "Name" +msgstr "Namn" + +#: src/mgui/dvdimport.cpp:621 +msgid "Details" +msgstr "Detaljar" + +#: src/mgui/dvdimport.cpp:667 +msgid "It is desirable the destination folder to be empty." +msgstr "Målmappa bør vera tom." + +#. COPY_N_PASTE - тупо сделал содержимое сообщений как у "TSNAMI-MPEG DVD Author" +#. А что делать - нафига свои придумывать, если смысл один и тот же +#: src/mgui/execution.cpp:27 +#, boost-format +msgid "You are about to cancel %1%. Are you sure?" +msgstr "Du skal til å avbryta %1%. Er du sikker?" + +#: src/mgui/mux.cpp:29 +msgid "muxing" +msgstr "muksar" + +#: src/mgui/mux.cpp:45 +#, boost-format +msgid "Muxing \"%1%\"" +msgstr "Muksar \"%1%\"" + +#: src/mgui/mux.cpp:56 src/mgui/author/output.cpp:229 +msgid "Show/_Hide Details" +msgstr "Vis/gøy_m detaljar" + +#: src/mgui/mux.cpp:80 +msgid "Muxing error" +msgstr "Muksefeil" + +#: src/mgui/mux.cpp:81 src/mgui/author/output.cpp:632 +#, boost-format +msgid "The reason is \"%1%\" (see Details)" +msgstr "Dette er på grunn av \"%1%\" (sjå detaljane)" + +#: src/mgui/mux.cpp:97 +msgid "Select a folder" +msgstr "Vel ei mappe" + +#: src/mgui/mux.cpp:109 +msgid "in" +msgstr "inn" + +#: src/mgui/mux.cpp:143 +msgid "Mux streams" +msgstr "Muks-straumar" + +#: src/mgui/mux.cpp:145 +msgid "Output" +msgstr "Utgang" + +#: src/mgui/mux.cpp:146 +msgid "Select elementary video" +msgstr "Vel grunnvideo" + +#: src/mgui/mux.cpp:147 +msgid "Select audio" +msgstr "Vel lyd" + +#. Названия типов для i18n +#: src/mgui/mux.cpp:151 src/mgui/project/media-browser.cpp:199 +#: src/mgui/timeline/layout-draw.cpp:156 +msgid "Video" +msgstr "Film" + +#: src/mgui/mux.cpp:154 +msgid "MPEG2 elementary video (m2v)" +msgstr "MPEG2-grunnvideo (m2v)" + +#: src/mgui/mux.cpp:159 +msgid "Audio" +msgstr "Lyd" + +#: src/mgui/mux.cpp:162 src/mgui/timeline/mviewer.cpp:271 +msgid "Audio for DVD" +msgstr "Lyd for DVD" + +#: src/mgui/mux.cpp:187 +msgid "Elementary video file is not selected." +msgstr "Inga grunnvideofil er vald." + +#: src/mgui/mux.cpp:189 +msgid "Audio file is not selected." +msgstr "Inga lydfil er vald." + +#: src/mgui/mux.cpp:191 +msgid "Output file name is empty." +msgstr "Namnet på utfila står tomt." + +#: src/mgui/prefs.cpp:98 +msgid "Bombono DVD Preferences" +msgstr "Innstillingar for Bombono DVD" + +#: src/mgui/prefs.cpp:111 +msgid "_Default Project Type" +msgstr "Standar_d prosjekttype" + +#: src/mgui/prefs.cpp:116 +msgid "_Play Authoring Result in" +msgstr "S_pel resultatet av samansetjinga i" + +#: src/mgui/win_utils.cpp:322 +msgid "Replacing the file overwrite its contents." +msgstr "Byter du ut ei fil, byter du òg over filinnhaldet." + +#: src/mgui/author/burn.cpp:198 +msgid "Auto" +msgstr "Auto" + +#: src/mgui/author/burn.cpp:210 +msgid "Update speeds ..." +msgstr "Oppdater fart..." + +#: src/mgui/author/burn.cpp:331 +msgid "Checking Disc ..." +msgstr "Sjekkar plate..." + +#: src/mgui/author/burn.cpp:345 +msgid "Selected burn drive is for CD discs only. Change to another burn drive." +msgstr "Denne brennaren kan berre brenna CD-plater. Vel ein annan brennar." + +#: src/mgui/author/burn.cpp:350 +msgid "CD disc is found in the drive, not DVD. Change to DVD disc." +msgstr "Det står ei CD-plate i brennaren, ikkje ein DVD. Byt til ei DVD-plate." + +#: src/mgui/author/burn.cpp:355 +msgid "No DVD disc in the drive. Load a clear one and press OK." +msgstr "Det er inga DVD-plate i brennaren. Set inn ei tom plate og klikk OK." + +#: src/mgui/author/burn.cpp:360 +#, boost-format +msgid "Disc with type \"%1%\" is found in the drive but for DVD-Video disc type should be one from: DVD-R, DVD+R, DVD-RW, DVD+RW. Load a clear one with right type and press OK." +msgstr "Det er ei plate av typen \"%1%\" i brennaren, men for å laga ei DVD-Video-plate treng du ein av desse typane: DVD-R, DVD+R, DVD-RW, DVD+RW. Set inn ei tom plate av rett type og klikk OK." + +#: src/mgui/author/burn.cpp:369 +#, boost-format +msgid "Disc with type \"%1%\" in the drive is not clear. Only clear recordable discs can be used for burning DVD-Video. Load a clear one and press OK." +msgstr "Plata av typen \"%1%\" er ikkje tom. Du kan berre bruka tomme, opptakbare plater for å brenna ei DVD-videoplate. Set inn ei tom plate og klikk OK." + +#: src/mgui/author/burn.cpp:376 +#, boost-format +msgid "Disc with type \"%1%\" in the drive is not clear. We need to remove its contents before writing new one. Continue?" +msgstr "Plata i brennaren, av typen \"%1%\", er ikkje tom. Me må fjerna innhaldet på plata før me kan brenna på nytt. Halda fram?" + +#: src/mgui/author/burn.cpp:380 +msgid "_Cancel" +msgstr "A_vbryt" + +#: src/mgui/author/burn.cpp:381 +msgid "_Try again" +msgstr "Prøv igjen" + +#: src/mgui/author/execute.cpp:72 +msgid "Status: " +msgstr "Status:" + +#: src/mgui/author/execute.cpp:568 +#, boost-format +msgid "exit code = %1%" +msgstr "sluttkode = %1%" + +#: src/mgui/author/execute.cpp:570 +#, boost-format +msgid "broken by signal %1%" +msgstr "avbrote av signalet %1%" + +#: src/mgui/author/indicator.cpp:67 +msgid "Rendering Menus" +msgstr "Teiknar opp menyar" + +#: src/mgui/author/indicator.cpp:68 +msgid "Generating DVD-Video" +msgstr "Lagar DVD-video" + +#: src/mgui/author/indicator.cpp:69 +msgid "Creating ISO Image" +msgstr "Lagar ISO-biletfil" + +#: src/mgui/author/indicator.cpp:70 +msgid "Burning DVD" +msgstr "Skriv DVD" + +#: src/mgui/author/output.cpp:53 +msgid "DVD-Video Building" +msgstr "Bygg DVD-video" + +#: src/mgui/author/output.cpp:63 +#, boost-format +msgid "_Cancel %1%" +msgstr "_Avbryt %1%" + +#: src/mgui/author/output.cpp:64 +msgid "_Build DVD-Video" +msgstr "_Bygg DVD-video" + +#: src/mgui/author/output.cpp:161 +msgid "Select Output _Folder:" +msgstr "Vel _utmappe..." + +#: src/mgui/author/output.cpp:175 +msgid " Choose Author Mode: " +msgstr "Vel samansetjingsmåte:" + +#. цель по умолчанию +#: src/mgui/author/output.cpp:181 +msgid "_Write DVD Folder" +msgstr "Skri_v DVD-mappe" + +#: src/mgui/author/output.cpp:182 +msgid "Write Disk _Image" +msgstr "Skriv disk_bilete" + +#: src/mgui/author/output.cpp:191 +msgid "Disc Label: " +msgstr "Etikett for plate:" + +#: src/mgui/author/output.cpp:196 +msgid "Burn to _DVD" +msgstr "Brenn til _DVD" + +#: src/mgui/author/output.cpp:204 +msgid "DVD Drive: " +msgstr "DVD-stasjon:" + +#: src/mgui/author/output.cpp:210 +msgid "Writing Speed: " +msgstr "Brennefart:" + +#: src/mgui/author/output.cpp:221 +msgid "_Rendering only" +msgstr "Be_rre teikne opp" + +#: src/mgui/author/output.cpp:275 +msgid "Rendering" +msgstr "Teiknar" + +#: src/mgui/author/output.cpp:352 +msgid "DVD Burning" +msgstr "Brenner DVD" + +#: src/mgui/author/output.cpp:396 +msgid "The result is here" +msgstr "Her er resultatet" + +#: src/mgui/author/output.cpp:398 +msgid "You can run authoring manually by executing command \"scons\" at the specified folder. Also, see README file for other options over there." +msgstr "Du kan køyra samansetjing manuelt ved å køyra kommandoen \"scons\" i rette mappa. Sjå på README-fila for fleire val." + +#. Translators: impossible to go on! +#: src/mgui/author/output.cpp:422 +msgid "Authoring is cancelled." +msgstr "Samansetjinga er avbroten." + +#: src/mgui/author/output.cpp:433 +#, boost-format +msgid "%1% is not a folder" +msgstr "%1% er ikkje ei mappe." + +#: src/mgui/author/output.cpp:444 +#, boost-format +msgid "Cant have full access to folder %1% (read, write)" +msgstr "Greier ikkje få full lese- og skrivetilgang til %1%" + +#: src/mgui/author/output.cpp:452 +#, boost-format +msgid "" +"Folder %1% is not empty. We need to remove all files in it before authoring.\n" +"Continue?" +msgstr "" +"Mappa %1% er ikkje tom. Me må sletta alle filer der før me held fram å setja saman plata.\n" +"Vil du halda fram?" + +#: src/mgui/author/output.cpp:458 +#, boost-format +msgid "Error during removing files: %1%" +msgstr "Greidde ikkje fjerna filer: %1%" + +#: src/mgui/author/output.cpp:629 +#, boost-format +msgid "%1% cancelled." +msgstr "%1% avbrote." + +#: src/mgui/author/output.cpp:631 +#, boost-format +msgid "%1% broken." +msgstr "%1% øydelagt." + +#. Translators: can be tranlated as "Operation "%1%" ..." +#: src/mgui/author/output.cpp:638 +#, boost-format +msgid "%1% successfully completed." +msgstr "%1% ferdig utan problem." + +#: src/mgui/author/output.cpp:668 src/mgui/timeline/select.cpp:216 +#, boost-format +msgid "_Play in %1%" +msgstr "S_pel i %1%" + +#: src/mgui/author/output.cpp:669 +msgid "_Burn to DVD" +msgstr "_Brenn til DVD" + +#: src/mgui/author/script.cpp:392 +msgid "There is no media (video or menu)." +msgstr "Ingen media (video eller meny)." + +#: src/mgui/author/script.cpp:557 +#, boost-format +msgid "external command failure: %1%" +msgstr "feil med ekstern kommando: %1%" + +#: src/mgui/editor/select.cpp:499 +msgid "Delete" +msgstr "Slett" + +#: src/mgui/editor/select.cpp:513 +msgid "Link" +msgstr "Lenkje" + +#: src/mgui/editor/select.cpp:517 +msgid "Remove Link" +msgstr "Fjern lenkje" + +#. Poster Link +#: src/mgui/editor/select.cpp:521 +msgid "Set Poster" +msgstr "Set plakat" + +#: src/mgui/editor/select.cpp:530 +msgid "Align" +msgstr "Juster" + +#: src/mgui/editor/select.cpp:538 +msgid "Align Left" +msgstr "Venstrejuster" + +#: src/mgui/editor/select.cpp:539 +msgid "Align Right" +msgstr "Høgrejuster" + +#: src/mgui/editor/select.cpp:540 +msgid "Align Top" +msgstr "Toppjuster" + +#: src/mgui/editor/select.cpp:541 +msgid "Align Bottom" +msgstr "Botnjuster" + +#: src/mgui/editor/select.cpp:544 +msgid "Center Horizontally" +msgstr "I midten vassrett" + +#: src/mgui/editor/select.cpp:545 +msgid "Center Vertically" +msgstr "I midten loddrett" + +#. Set Background Color +#: src/mgui/editor/select.cpp:550 src/mgui/editor/select.cpp:802 +msgid "Set Background Color..." +msgstr "Vel bakgrunnsfarge..." + +#. Selection Tool +#: src/mgui/editor/toolbar.cpp:129 +msgid "Selection Tool" +msgstr "Merkeverktøy" + +#. Text Tool +#: src/mgui/editor/toolbar.cpp:132 +msgid "Text Tool" +msgstr "Tekstverktøy" + +#: src/mgui/editor/toolbar.cpp:493 +msgid "Add Item" +msgstr "Legg til element" + +#: src/mgui/editor/toolbar.cpp:515 +msgid "Font Name" +msgstr "Skriftnamn" + +#: src/mgui/editor/toolbar.cpp:531 +msgid "Font Size" +msgstr "Skriftstorleik" + +#. * кнопки стилей шрифта +#: src/mgui/editor/toolbar.cpp:536 +msgid "Bold" +msgstr "Feit" + +#: src/mgui/editor/toolbar.cpp:537 +msgid "Italic" +msgstr "Kursiv" + +#: src/mgui/editor/toolbar.cpp:538 +msgid "Underline" +msgstr "Understreka" + +#: src/mgui/editor/toolbar.cpp:547 +msgid "Pick a Color for Text" +msgstr "Plukk ei skriftfarge" + +#: src/mgui/editor/toolbar.cpp:549 +msgid "Text Color" +msgstr "Skriftfarge" + +#: src/mgui/editor/toolbar.cpp:561 +#, fuzzy +msgid "Show Safe Area" +msgstr "Vis trygt område" + +#: src/mgui/project/browser.cpp:128 +#, boost-format +msgid "Do you really want to delete \"%1%\" from Media List?" +msgstr "Vil du verkeleg sletta \"%1%\" frå medialista?" + +#: src/mgui/project/browser.cpp:129 +#, boost-format +msgid "Do you really want to delete chapter \"%1%\"?" +msgstr "Vil du verkeleg sletta kapitlet \"%1%\"?" + +#: src/mgui/project/browser.cpp:130 +#, boost-format +msgid "Do you really want to delete menu \"%1%\"?" +msgstr "Vil du verkeleg sletta menyen \"%1%\"?" + +#: src/mgui/project/browser.cpp:242 +msgid "First-Play media can be Video or Menu only." +msgstr "Spel fyrst-media kan vera berre video- eller meny-media." + +#: src/mgui/project/mconstructor.cpp:132 +msgid "Save Project As..." +msgstr "Lagra prosjektet som …" + +#: src/mgui/project/mconstructor.cpp:169 +#, boost-format +msgid "Cant open project file \"%1%\"" +msgstr "Greier ikkje opna prosjektfila \"%1%\"" + +#: src/mgui/project/mconstructor.cpp:465 +msgid "Bombono DVD is a DVD authoring program with nice and clean GUI" +msgstr "Bombono DVD er eit enkelt og oversikteleg program for å setja saman DVD-ar." + +#. dlg.set_authors(authors); +#. dlg.set_documenters(documenters); +#. dlg.set_decorated(false); +#: src/mgui/project/mconstructor.cpp:470 +msgid "translator-credits" +msgstr "" +"Eivind Ødegård\n" +"Send feilmeldingar og kommentarar til " + +#: src/mgui/project/mconstructor.cpp:611 +#, boost-format +msgid "Save changes to \"%1%\"?" +msgstr "Lagra endringar i \"%1%\"?" + +#: src/mgui/project/mconstructor.cpp:613 +msgid "Close _without Saving" +msgstr "Lukk _utan å lagra" + +#: src/mgui/project/mconstructor.cpp:653 +msgid "New Project" +msgstr "Nytt prosjekt" + +#: src/mgui/project/mconstructor.cpp:662 +msgid "Please select a Television standard for your project:" +msgstr "Vel kva TV-standard prosjektet ditt skal ha:" + +#: src/mgui/project/mconstructor.cpp:687 +msgid "Open Project" +msgstr "Opna prosjekt" + +#: src/mgui/project/mconstructor.cpp:691 +msgid "Project files (*.xml)" +msgstr "Prosjektfiler (*xml)" + +#: src/mgui/project/mconstructor.cpp:696 src/mgui/timeline/mviewer.cpp:273 +msgid "All Files (*.*)" +msgstr "Alle filer (*.*)" + +#. раньше Brasero использовал KiB, MiB и GiB, как более точные технически +#. (вроде как размеры HDD принято измерять по 1GB=1000MB); теперь Brasero +#. перешел на стандарт KB/MB/GB, ну и BmD тоже (а че, мы не гордые :) +#: src/mgui/project/mconstructor.cpp:824 +msgid "KB" +msgstr "KiB" + +#: src/mgui/project/mconstructor.cpp:824 +msgid "GB" +msgstr "GiB" + +#. Project +#: src/mgui/project/mconstructor.cpp:935 +msgid "_Project" +msgstr "_Prosjekt" + +#: src/mgui/project/mconstructor.cpp:940 +msgid "_New Project" +msgstr "_Nytt prosjekt" + +#: src/mgui/project/mconstructor.cpp:942 +msgid "_Open..." +msgstr "_Opna..." + +#: src/mgui/project/mconstructor.cpp:944 +msgid "_Save" +msgstr "_Lagra" + +#: src/mgui/project/mconstructor.cpp:946 +msgid "Save _As..." +msgstr "L_agra som..." + +#: src/mgui/project/mconstructor.cpp:948 +msgid "_Quit" +msgstr "_Avslutt" + +#: src/mgui/project/mconstructor.cpp:950 +msgid "Add Videos from _DVD" +msgstr "Legg til videoar frå _DVD" + +#: src/mgui/project/mconstructor.cpp:950 +msgid "DVD-Import Assistant" +msgstr "DVD-importhjelpar" + +#: src/mgui/project/mconstructor.cpp:952 +msgid "_Mux" +msgstr "_Muks" + +#: src/mgui/project/mconstructor.cpp:952 +msgid "Mux Elementary Streams into MPEG2" +msgstr "Muks grunnstraumar til ein MPEG2" + +#: src/mgui/project/mconstructor.cpp:954 +msgid "Pr_eferences" +msgstr "I_nnstillingar" + +#. Go +#: src/mgui/project/mconstructor.cpp:993 +msgid "_Go" +msgstr "_Køyr" + +#. первый вставляем сразу +#. Help +#: src/mgui/project/mconstructor.cpp:999 +msgid "_Help" +msgstr "_Hjelp" + +#: src/mgui/project/mconstructor.cpp:1100 +msgctxt "MainTabs" +msgid "_Source" +msgstr "K_jelde:" + +#: src/mgui/project/mconstructor.cpp:1102 +msgctxt "MainTabs" +msgid "_Menu" +msgstr "_Meny" + +#: src/mgui/project/mconstructor.cpp:1104 +msgctxt "MainTabs" +msgid "_Output" +msgstr "_Utdata" + +#: src/mgui/project/mb-actions.cpp:142 +msgid "yes" +msgstr "ja" + +#: src/mgui/project/mb-actions.cpp:142 +msgid "no" +msgstr "nei" + +#: src/mgui/project/mb-actions.cpp:191 +msgid "Video bitrate" +msgstr "Videobitrate" + +#: src/mgui/project/mb-actions.cpp:192 +msgid "kbps" +msgstr "kbps" + +#: src/mgui/project/mb-actions.cpp:193 +msgid "Maximum data rate for video (9800 kbps) is exceeded." +msgstr "Du bruker høgare videorate enn maksverdien (9800 kbps)." + +#: src/mgui/project/mb-actions.cpp:196 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with resolutions: %2% only." +msgstr "%1%-DVD-videoen godtek berre MPEG-2 med desse oppløysingane: %2%" + +#: src/mgui/project/mb-actions.cpp:197 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with frame rate: %2% only." +msgstr "%1%-DVD-videoen godtek berre MPEG-2 med så mange rammer per sekund: %2%" + +#: src/mgui/project/mb-actions.cpp:198 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with aspects 4:3, 16:9 only." +msgstr "%1%-DVD-videoen godtek berre MPEG-2 med biletforhold på 4:3 eller 16:9." + +#: src/mgui/project/mb-actions.cpp:218 +msgid "Video size" +msgstr "Videostorleik:" + +#: src/mgui/project/mb-actions.cpp:238 +msgid "Frame rate" +msgstr "Rammer per sekund" + +#: src/mgui/project/mb-actions.cpp:239 +msgid "fps" +msgstr "rammer/s" + +#: src/mgui/project/mb-actions.cpp:247 +msgid "Aspect ratio" +msgstr "Biletforhold" + +#: src/mgui/project/mb-actions.cpp:322 +msgid "Bombono DVD can use \"DVD-ready\" video only now. Use muxing programs like \"mplex -f 8\" (from mjpegtools), mencoder (from mplayer) or transcode to make your video ready for Bombono DVD." +msgstr "Bombono DVD kan berre bruka \"DVD-klare\" videofiler no. Bruk gjerne muxprogram som \"mplex -f 8\" (frå mjpegtools), mencoder (frå mplayer) eller transcode for å gjera videoen klar for Bombono DVD." + +#: src/mgui/project/mb-actions.cpp:326 +msgid "DVD packs" +msgstr "DVD-pakker" + +#: src/mgui/project/mb-actions.cpp:328 +msgid "NAV packets" +msgstr "NAV-pakker" + +#: src/mgui/project/mb-actions.cpp:334 +msgid "This video may not be added due to (errors in red color):" +msgstr "Det kan henda du ikkje kan leggja til denne videoen på grunn av (feil i raudt):" + +#. подскажем пользователю, что он ошибся форматом проекта +#: src/mgui/project/mb-actions.cpp:345 +#, boost-format +msgid "This video has %1% type and can't be added to current project of %2% type. Create new project from menu \"Project->New Project\" with right type." +msgstr "Denne videoen er av %1%-typen, og då kan du ikkje leggja han til i prosjekt av %2%-typen. Lag eit nytt prosjekt med rett type frå menyen \"Prosjekt->Nytt prosjekt\"." + +#: src/mgui/project/mb-actions.cpp:373 +msgid "File doesn't exist." +msgstr "Fila finst ikkje." + +#: src/mgui/project/mb-actions.cpp:378 +msgid "Folders can't be added." +msgstr "Du kan ikkje leggja til mapper." + +#. по расширению выводим наиболее вероятную ошибку +#: src/mgui/project/mb-actions.cpp:413 +msgid "Unknown file type." +msgstr "Ukjend filtype." + +#: src/mgui/project/mb-actions.cpp:631 +#, boost-format +msgid "" +"The file \"%1%\" looks like VOB from DVD.\n" +"Run import?" +msgstr "" +"Fila \"%1%\" ser ut som ei VOB-looks like VOB frå ein DVD.\n" +"Vil du importera ho?" + +#: src/mgui/project/mb-actions.cpp:648 +#, boost-format +msgid "The file \"%1%\" looks like elementary stream and need to be muxed before using. Run muxing?" +msgstr "Fila \"%1%\" ser ut som ein grunnstraum, og treng muksing før du bruker han. Vil du muksa no?" + +#: src/mgui/project/mb-actions.cpp:710 +msgid "Also:" +msgstr "Òg" + +#: src/mgui/project/mb-actions.cpp:719 +#, boost-format +msgid "See more about preparing video for authoring in online help." +msgstr "Sjå meir om korleis du klargjer ein video for samansetjing på hjelpesidene." + +#: src/mgui/project/mb-actions.cpp:727 +#, boost-format +msgid "Can't add file \"%1%\"." +msgstr "Greier ikkje leggja til fila \"%1%\"." + +#: src/mgui/project/mb-actions.cpp:730 +msgid "Can't add files:" +msgstr "Greier ikkje leggja til filene:" + +#: src/mgui/project/media-browser.cpp:146 +msgid "Previous Menu" +msgstr "Førre meny" + +#: src/mgui/project/media-browser.cpp:146 +#: src/mgui/project/media-browser.cpp:148 +msgid "Next Video" +msgstr "Neste video" + +#: src/mgui/project/media-browser.cpp:147 +#, boost-format +msgid "Auto (%1%)" +msgstr "Auto (%1%)" + +#: src/mgui/project/media-browser.cpp:177 +msgid "End Action" +msgstr "Slutthandling" + +#: src/mgui/project/media-browser.cpp:201 +msgid "Still Picture" +msgstr "Stillbilete" + +#: src/mgui/project/media-browser.cpp:233 +msgid "Type" +msgstr "Type" + +#. // не меньше чем размер шрифта элемента в списке +#. Gtk::Label& label = *Gtk::manage(new Gtk::Label("Media List")); +#. label.set_use_markup(true); +#. vbox.pack_start(label, Gtk::PACK_SHRINK); +#. Gtk::Requisition req = label.size_request(); +#. label.set_size_request(0, req.height+10); +#: src/mgui/project/media-browser.cpp:291 +#: src/mgui/project/menu-browser.cpp:373 +msgid "Media List" +msgstr "Filliste" + +#: src/mgui/project/media-browser.cpp:331 +msgid "Add Media from File Browser" +msgstr "Legg til media frå filhandsamar" + +#: src/mgui/project/media-browser.cpp:340 +msgid "Remove Media" +msgstr "Fjern mediet" + +#: src/mgui/project/media-browser.cpp:351 +msgid "Make Chapters for Video" +msgstr "Lag kapittel frå video" + +#: src/mgui/project/menu-browser.cpp:190 +msgid "No Link" +msgstr "Ikkje noko lenkje" + +#. * subj +#: src/mgui/project/menu-browser.cpp:337 +msgid "Menu List" +msgstr "Menyliste" + +#: src/mgui/project/menu-browser.cpp:353 +msgid "Add Menu" +msgstr "Legg til meny" + +#: src/mgui/project/menu-browser.cpp:358 +msgid "Remove Menu" +msgstr "Fjern meny" + +#: src/mgui/project/menu-browser.cpp:363 +msgid "Edit Menu" +msgstr "Endra meny" + +#. Add +#: src/mgui/timeline/layout.cpp:526 src/mgui/timeline/select.cpp:193 +msgid "Add Chapter Point" +msgstr "Legg til kapittelpunkt" + +#. 0 надпись +#: src/mgui/timeline/mviewer.cpp:239 +msgid "File Browser" +msgstr "Filhandsamar" + +#: src/mgui/timeline/mviewer.cpp:269 +msgid "All formats" +msgstr "Alle format" + +#: src/mgui/timeline/mviewer.cpp:270 +msgid "MPEG files" +msgstr "MPEG-videofiler" + +#: src/mgui/timeline/mviewer.cpp:272 +msgid "Still Images" +msgstr "Stillbilete" + +#: src/mgui/timeline/select.cpp:127 +msgid "Save Frame..." +msgstr "Lagra ramma..." + +#. Add at Intervals +#: src/mgui/timeline/select.cpp:147 src/mgui/timeline/select.cpp:205 +msgid "Add Chapter Points at Intervals" +msgstr "Legg til kapittelpunkt ved intervall" + +#: src/mgui/timeline/select.cpp:153 +msgid "Interval between Chapters:" +msgstr "Mellomrom mellom kapittel:" + +#: src/mgui/timeline/select.cpp:160 +msgid "min." +msgstr "min." + +#: src/mgui/timeline/select.cpp:163 +msgid "Remove Existing Chapters" +msgstr "Fjern dei eksisterande kapitla" + +#. Delete +#: src/mgui/timeline/select.cpp:196 +msgid "Delete Chapter Point" +msgstr "Slett kapittelmerke" + +#. Delete All +#: src/mgui/timeline/select.cpp:200 +msgid "Delete All Chapter Points" +msgstr "Slett alle kapittelmerke" + +#: src/mgui/timeline/select.cpp:213 +msgid "Save Current Frame" +msgstr "Lagre denne ramma" + +#~ msgctxt "MediaBrowser" +#~ msgid "Edit" +#~ msgstr "Endre" + +#~ msgctxt "MenuBrowser" +#~ msgid "Edit" +#~ msgstr "Endra" diff -Nru bombono-dvd-0.5.2/po/README bombono-dvd-0.6.0/po/README --- bombono-dvd-0.5.2/po/README 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/po/README 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,9 @@ +To build all .po files to .mo files use: + $ scons -u msgupdate # see .mo in build/po/locale/... + +To install all .mo files use to $PREFIX: + $ scons -u install # see .mo in $PREFIX/share/locale/... + +If ./bombono.pot becomes obsolete then create new .pot file from sources: + $ scons -u potupdate # see bombono.pot in build/po/bombono-dvd.pot + diff -Nru bombono-dvd-0.5.2/po/ru.po bombono-dvd-0.6.0/po/ru.po --- bombono-dvd-0.5.2/po/ru.po 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/po/ru.po 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,944 @@ +# translation of ru.po to Russian +# Copyright (C) 2010 Ilya Murav'jov +# This file is distributed under the same license as the PACKAGE package. +# +# Ilya Murav'jov , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: ru\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-04-06 17:32+0400\n" +"PO-Revision-Date: 2010-04-06 17:36+0300\n" +"Last-Translator: Ilya Murav'jov \n" +"Language-Team: \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%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: src/mbase/project/media.cpp:68 +#: src/mgui/project/media-browser.cpp:200 +msgid "Chapter" +msgstr "Глава" + +#: src/mbase/project/media.cpp:112 +#, boost-format +msgid "Cant create folder %1% (check permissions)" +msgstr "Не удалось создать папку %1% (проверьте права доступа)" + +#: src/mbase/project/menu.cpp:276 +msgid "Menu" +msgstr "Меню" + +#: src/mgui/dvdimport.cpp:82 +msgid "Choose Source DVD-Video" +msgstr "Выберите источник DVD-Video" + +#: src/mgui/dvdimport.cpp:85 +msgid "Select Videos to Import" +msgstr "Выберите видео для импорта" + +#: src/mgui/dvdimport.cpp:88 +msgid "Select Folder to Save Videos" +msgstr "Выберите папку для сохранения видео" + +#: src/mgui/dvdimport.cpp:91 +msgid "Importing..." +msgstr "Импорт..." + +#: src/mgui/dvdimport.cpp:94 +msgid "Import is completed." +msgstr "Импорт завершён" + +#: src/mgui/dvdimport.cpp:207 +#: src/mgui/project/mconstructor.cpp:824 +msgid "MB" +msgstr "МБ" + +#: src/mgui/dvdimport.cpp:388 +msgid "Select All" +msgstr "Выбрать все" + +#: src/mgui/dvdimport.cpp:388 +msgid "Unselect All" +msgstr "Снять выделение" + +#. мы не можем пустить исключение здесь, потому что оно пойдет +#. и через C-шный код (Gtk) - отложим +#: src/mgui/dvdimport.cpp:410 +msgid "Are you sure to stop importing?" +msgstr "Прекратить импорт?" + +#: src/mgui/dvdimport.cpp:443 +#, boost-format +msgid "Cant write to folder %1% (check permissions)." +msgstr "Не могу записывать в папку %1% (проверьте права)." + +#: src/mgui/dvdimport.cpp:471 +#: src/mgui/win_utils.cpp:322 +#, boost-format +msgid "A file named \"%1%\" already exists. Do you want to replace it?" +msgstr "Файл с именем \"%1%\" уже существует. Заменить его?" + +#: src/mgui/dvdimport.cpp:504 +msgid "Import error!" +msgstr "Ошибка импорта!" + +#: src/mgui/dvdimport.cpp:508 +msgid "Videos successfully imported." +msgstr "Видео успешно импортировано." + +#: src/mgui/dvdimport.cpp:509 +msgid "Import has been interrupted." +msgstr "Импорт прерван." + +#: src/mgui/dvdimport.cpp:543 +msgid "DVD-Video Import" +msgstr "Импорт DVD-Video" + +#: src/mgui/dvdimport.cpp:566 +msgid "Choose DVD disc, DVD folder or iso image file." +msgstr "Выберите DVD диск, папку DVD или iso-образ." + +#: src/mgui/dvdimport.cpp:584 +msgid "NTSC/PAL mismatch. Try another disc or import to project of corresponding type." +msgstr "Несоответствие NTSC/PAL. Попробуйте другой диск или импортируйте в проект соответствующего типа." + +#. имя +#: src/mgui/dvdimport.cpp:608 +#: src/mgui/project/media-browser.cpp:217 +msgid "Name" +msgstr "Имя" + +#: src/mgui/dvdimport.cpp:621 +msgid "Details" +msgstr "Сведения" + +#: src/mgui/dvdimport.cpp:667 +msgid "It is desirable the destination folder to be empty." +msgstr "Желательно чтобы папка назначения была пуста." + +#. COPY_N_PASTE - тупо сделал содержимое сообщений как у "TSNAMI-MPEG DVD Author" +#. А что делать - нафига свои придумывать, если смысл один и тот же +#: src/mgui/execution.cpp:27 +#, boost-format +msgid "You are about to cancel %1%. Are you sure?" +msgstr "Вы собираетесь прекратить %1%. Вы уверены?" + +#: src/mgui/mux.cpp:29 +msgid "muxing" +msgstr "микширование" + +#: src/mgui/mux.cpp:45 +#, boost-format +msgid "Muxing \"%1%\"" +msgstr "Микширование \"%1%\"" + +#: src/mgui/mux.cpp:56 +#: src/mgui/author/output.cpp:231 +msgid "Show/_Hide Details" +msgstr "По_казать/скрыть подробности" + +#: src/mgui/mux.cpp:80 +msgid "Muxing error" +msgstr "Ошибка микширования" + +#: src/mgui/mux.cpp:81 +#: src/mgui/author/output.cpp:634 +#, boost-format +msgid "The reason is \"%1%\" (see Details)" +msgstr "Причина \"%1%\" (см. Подробности)" + +#: src/mgui/mux.cpp:97 +msgid "Select a folder" +msgstr "Выберите папку назначения" + +#: src/mgui/mux.cpp:109 +msgid "in" +msgstr "в" + +#: src/mgui/mux.cpp:143 +msgid "Mux streams" +msgstr "Микшировать видео и аудио" + +#: src/mgui/mux.cpp:145 +msgid "Output" +msgstr "Результат" + +#: src/mgui/mux.cpp:146 +msgid "Select elementary video" +msgstr "Выберите видеодорожку" + +#: src/mgui/mux.cpp:147 +msgid "Select audio" +msgstr "Выберите аудиодорожку" + +#. Названия типов для i18n +#: src/mgui/mux.cpp:151 +#: src/mgui/project/media-browser.cpp:199 +#: src/mgui/timeline/layout-draw.cpp:156 +msgid "Video" +msgstr "Видео" + +#: src/mgui/mux.cpp:154 +msgid "MPEG2 elementary video (m2v)" +msgstr "MPEG2-видео (m2v)" + +#: src/mgui/mux.cpp:159 +msgid "Audio" +msgstr "Аудио" + +#: src/mgui/mux.cpp:162 +#: src/mgui/timeline/mviewer.cpp:271 +msgid "Audio for DVD" +msgstr "Аудио для DVD" + +#: src/mgui/mux.cpp:187 +msgid "Elementary video file is not selected." +msgstr "Файл видеодорожки не выбран." + +#: src/mgui/mux.cpp:189 +msgid "Audio file is not selected." +msgstr "Файл аудиодорожки не выбран." + +#: src/mgui/mux.cpp:191 +msgid "Output file name is empty." +msgstr "Имя нового файла пустое." + +#: src/mgui/prefs.cpp:123 +msgid "Bombono DVD Preferences" +msgstr "Настройки Bombono DVD" + +#: src/mgui/prefs.cpp:137 +msgid "_Default project type" +msgstr "_Тип проекта по умолчанию" + +#: src/mgui/prefs.cpp:140 +msgid "Default _folder for authoring" +msgstr "_Папка для авторинга по умолчанию" + +#: src/mgui/prefs.cpp:145 +msgid "_Play authoring result in" +msgstr "_Воспроизводить результат авторинга в" + +#: src/mgui/win_utils.cpp:325 +msgid "Replacing the file overwrite its contents." +msgstr "Его замена приведёт к перезаписи содержимого." + +#: src/mgui/author/burn.cpp:198 +msgid "Auto" +msgstr "Авто" + +#: src/mgui/author/burn.cpp:210 +msgid "Update speeds ..." +msgstr "Обновить скорости ..." + +#: src/mgui/author/burn.cpp:331 +msgid "Checking Disc ..." +msgstr "Проверка диска ..." + +#: src/mgui/author/burn.cpp:345 +msgid "Selected burn drive is for CD discs only. Change to another burn drive." +msgstr "Выбранный привод предназначен только для CD. Смените на другой." + +#: src/mgui/author/burn.cpp:350 +msgid "CD disc is found in the drive, not DVD. Change to DVD disc." +msgstr "CD-диск найден в приводе. Смените на DVD-диск." + +#: src/mgui/author/burn.cpp:355 +msgid "No DVD disc in the drive. Load a clear one and press OK." +msgstr "DVD-диск не найден в приводе. Загрузите чистый диск и нажмите ОК." + +#: src/mgui/author/burn.cpp:360 +#, boost-format +msgid "Disc with type \"%1%\" is found in the drive but for DVD-Video disc type should be one from: DVD-R, DVD+R, DVD-RW, DVD+RW. Load a clear one with right type and press OK." +msgstr "Диск с типом \"%1%\" найден в приводе, но для DVD-Video тип диска должен быть одним из: DVD-R, DVD+R, DVD-RW, DVD+RW. Загрузите чистый диск соответствующего типа и нажмите ОК." + +#: src/mgui/author/burn.cpp:369 +#, boost-format +msgid "Disc with type \"%1%\" in the drive is not clear. Only clear recordable discs can be used for burning DVD-Video. Load a clear one and press OK." +msgstr "Диск с типом \"%1%\" не пустой. Только чистые записываемые диски могут быть использованы для записи DVD-Video. Загрузите чистый диск и нажмите ОК." + +#: src/mgui/author/burn.cpp:376 +#, boost-format +msgid "Disc with type \"%1%\" in the drive is not clear. We need to remove its contents before writing new one. Continue?" +msgstr "Диск с типом \"%1%\" не пустой. Необходимо удалить его содержимое перед записью. Продолжать?" + +#: src/mgui/author/burn.cpp:380 +msgid "_Cancel" +msgstr "_Отмена" + +#: src/mgui/author/burn.cpp:381 +msgid "_Try again" +msgstr "_Повторить снова" + +#: src/mgui/author/execute.cpp:72 +msgid "Status: " +msgstr "Статус: " + +#: src/mgui/author/execute.cpp:568 +#, boost-format +msgid "exit code = %1%" +msgstr "Код выхода: %1%" + +#: src/mgui/author/execute.cpp:570 +#, boost-format +msgid "broken by signal %1%" +msgstr "прервано по сигналу %1%" + +#: src/mgui/author/indicator.cpp:67 +msgid "Rendering Menus" +msgstr "Рендеринг меню" + +#: src/mgui/author/indicator.cpp:68 +msgid "Generating DVD-Video" +msgstr "Генерация DVD-Video" + +#: src/mgui/author/indicator.cpp:69 +msgid "Creating ISO Image" +msgstr "Создание ISO-образа" + +#: src/mgui/author/indicator.cpp:70 +msgid "Burning DVD" +msgstr "Запись DVD" + +#: src/mgui/author/output.cpp:53 +msgid "DVD-Video Building" +msgstr "Создание DVD-Video" + +#: src/mgui/author/output.cpp:63 +#, boost-format +msgid "_Cancel %1%" +msgstr "_Отменить \"%1%\"" + +#: src/mgui/author/output.cpp:64 +msgid "_Build DVD-Video" +msgstr "Соз_дать DVD-Video" + +#: src/mgui/author/output.cpp:161 +msgid "Select Output _Folder:" +msgstr "_Выберите папку назначения:" + +#: src/mgui/author/output.cpp:177 +msgid " Choose Author Mode: " +msgstr "Выберите режим авторинга" + +#. цель по умолчанию +#: src/mgui/author/output.cpp:183 +msgid "_Write DVD Folder" +msgstr "_Записать в папку" + +#: src/mgui/author/output.cpp:184 +msgid "Write Disk _Image" +msgstr "Записать _образ диска" + +#: src/mgui/author/output.cpp:193 +msgid "Disc Label: " +msgstr "Имя диска:" + +#: src/mgui/author/output.cpp:198 +msgid "Burn to _DVD" +msgstr "З_аписать на DVD" + +#: src/mgui/author/output.cpp:206 +msgid "DVD Drive: " +msgstr "Привод DVD:" + +#: src/mgui/author/output.cpp:212 +msgid "Writing Speed: " +msgstr "Скорость записи:" + +#: src/mgui/author/output.cpp:223 +msgid "_Rendering only" +msgstr "_Только рендеринг" + +#: src/mgui/author/output.cpp:277 +msgid "Rendering" +msgstr "Рендеринг" + +#: src/mgui/author/output.cpp:354 +msgid "DVD Burning" +msgstr "Запись DVD" + +#: src/mgui/author/output.cpp:398 +msgid "The result is here" +msgstr "Результат находится здесь" + +#: src/mgui/author/output.cpp:400 +msgid "You can run authoring manually by executing command \"scons\" at the specified folder. Also, see README file for other options over there." +msgstr "Вы можете довести авторинг вручную, выполнив команду \"scons\" в указанной папке. Дополнительные опции смотрите в файле README там же." + +#. Translators: impossible to go on! +#: src/mgui/author/output.cpp:424 +msgid "Authoring is cancelled." +msgstr "Авторинг прекращен." + +#: src/mgui/author/output.cpp:435 +#, boost-format +msgid "%1% is not a folder" +msgstr "%1% не является папкой" + +#: src/mgui/author/output.cpp:446 +#, boost-format +msgid "Cant have full access to folder %1% (read, write)" +msgstr "Не удалось получить полный доступ к папке %1% (read, write)" + +#: src/mgui/author/output.cpp:454 +#, boost-format +msgid "" +"Folder %1% is not empty. We need to remove all files in it before authoring.\n" +"Continue?" +msgstr "" +"Папка %1% не пуста. Требуется удалить все файлы в ней перед авторингом.\n" +"Продолжать?" + +#: src/mgui/author/output.cpp:460 +#, boost-format +msgid "Error during removing files: %1%" +msgstr "Ошибка во время удаления файлов: %1%" + +#: src/mgui/author/output.cpp:631 +#, boost-format +msgid "%1% cancelled." +msgstr "Операция \"%1%\" отменена." + +#: src/mgui/author/output.cpp:633 +#, boost-format +msgid "%1% broken." +msgstr "Операция \"%1%\" завершена неудачно." + +#. Translators: can be tranlated as "Operation "%1%" ..." +#: src/mgui/author/output.cpp:640 +#, boost-format +msgid "%1% successfully completed." +msgstr "Операция \"%1%\" успешно завершена." + +#: src/mgui/author/output.cpp:670 +#: src/mgui/timeline/select.cpp:239 +#, boost-format +msgid "_Play in %1%" +msgstr "_Воспроизвести в %1%" + +#: src/mgui/author/output.cpp:671 +msgid "_Burn to DVD" +msgstr "_Записать на DVD" + +#: src/mgui/author/script.cpp:392 +msgid "There is no media (video or menu)." +msgstr "Нечего авторить (ни видео, ни меню)." + +#: src/mgui/author/script.cpp:557 +#, boost-format +msgid "external command failure: %1%" +msgstr "ошибка выполнения внешней команды: %1%" + +#: src/mgui/editor/select.cpp:499 +msgid "Delete" +msgstr "Удалить" + +#: src/mgui/editor/select.cpp:513 +msgid "Link" +msgstr "Связать" + +#: src/mgui/editor/select.cpp:517 +msgid "Remove Link" +msgstr "Удалить связь" + +#. Poster Link +#: src/mgui/editor/select.cpp:521 +msgid "Set Poster" +msgstr "Установить постер" + +#: src/mgui/editor/select.cpp:530 +msgid "Align" +msgstr "Выравнивание" + +#: src/mgui/editor/select.cpp:538 +msgid "Align Left" +msgstr "По левому краю" + +#: src/mgui/editor/select.cpp:539 +msgid "Align Right" +msgstr "По правому краю" + +#: src/mgui/editor/select.cpp:540 +msgid "Align Top" +msgstr "По верхнему краю" + +#: src/mgui/editor/select.cpp:541 +msgid "Align Bottom" +msgstr "По нижнему краю" + +#: src/mgui/editor/select.cpp:544 +msgid "Center Horizontally" +msgstr "По центру (горизонтально)" + +#: src/mgui/editor/select.cpp:545 +msgid "Center Vertically" +msgstr "По центру (вертикально)" + +#. Set Background Color +#: src/mgui/editor/select.cpp:550 +#: src/mgui/editor/select.cpp:802 +msgid "Set Background Color..." +msgstr "Выбрать цвет фона..." + +#. Selection Tool +#: src/mgui/editor/toolbar.cpp:129 +msgid "Selection Tool" +msgstr "Выделение" + +#. Text Tool +#: src/mgui/editor/toolbar.cpp:132 +msgid "Text Tool" +msgstr "Текст" + +#: src/mgui/editor/toolbar.cpp:493 +msgid "Add Item" +msgstr "Добавить элемент" + +#: src/mgui/editor/toolbar.cpp:515 +msgid "Font Name" +msgstr "Название шрифта" + +#: src/mgui/editor/toolbar.cpp:531 +msgid "Font Size" +msgstr "Размер шрифта" + +#. * кнопки стилей шрифта +#: src/mgui/editor/toolbar.cpp:536 +msgid "Bold" +msgstr "Жирный" + +#: src/mgui/editor/toolbar.cpp:537 +msgid "Italic" +msgstr "Наклонный" + +#: src/mgui/editor/toolbar.cpp:538 +msgid "Underline" +msgstr "Подчёркнутый" + +#: src/mgui/editor/toolbar.cpp:547 +msgid "Pick a Color for Text" +msgstr "Выберите цвет текста" + +#: src/mgui/editor/toolbar.cpp:549 +msgid "Text Color" +msgstr "Цвет текста" + +#: src/mgui/editor/toolbar.cpp:561 +msgid "Show Safe Area" +msgstr "Показать безопасную область" + +#: src/mgui/project/browser.cpp:128 +#, boost-format +msgid "Do you really want to delete \"%1%\" from Media List?" +msgstr "Вы действительно хотите удалить \"%1%\" из Списка медиа?" + +#: src/mgui/project/browser.cpp:129 +#, boost-format +msgid "Do you really want to delete chapter \"%1%\"?" +msgstr "Вы действительно хотите удалить главу \"%1%\"?" + +#: src/mgui/project/browser.cpp:130 +#, boost-format +msgid "Do you really want to delete menu \"%1%\"?" +msgstr "Вы действительно хотите удалить меню \"%1%\"?" + +#: src/mgui/project/browser.cpp:242 +msgid "First-Play media can be Video or Menu only." +msgstr "Только видео или меню может быть First-Play." + +#: src/mgui/project/mconstructor.cpp:132 +msgid "Save Project As..." +msgstr "Сохранить проект _как..." + +#: src/mgui/project/mconstructor.cpp:169 +#, boost-format +msgid "Cant open project file \"%1%\"" +msgstr "Не удалось открыть файл проекта \"%1%\"" + +#: src/mgui/project/mconstructor.cpp:465 +msgid "Bombono DVD is a DVD authoring program with nice and clean GUI" +msgstr "Bombono DVD - программа авторинга с аккуратным графическим интерфейсом" + +#. dlg.set_authors(authors); +#. dlg.set_documenters(documenters); +#. dlg.set_decorated(false); +#: src/mgui/project/mconstructor.cpp:470 +msgid "translator-credits" +msgstr "Илья Муравьев " + +#: src/mgui/project/mconstructor.cpp:611 +#, boost-format +msgid "Save changes to \"%1%\"?" +msgstr "Сохранить изменения в \"%1%\"?" + +#: src/mgui/project/mconstructor.cpp:613 +msgid "Close _without Saving" +msgstr "Закрыть _без сохранения" + +#: src/mgui/project/mconstructor.cpp:653 +msgid "New Project" +msgstr "Создать проект" + +#: src/mgui/project/mconstructor.cpp:662 +msgid "Please select a Television standard for your project:" +msgstr "Выберите, пожалуйста, ТВ-стандарт для вашего проекта:" + +#: src/mgui/project/mconstructor.cpp:687 +msgid "Open Project" +msgstr "Открыть проект" + +#: src/mgui/project/mconstructor.cpp:691 +msgid "Project files (*.xml)" +msgstr "Файлы проектов (*xml)" + +#: src/mgui/project/mconstructor.cpp:696 +#: src/mgui/timeline/mviewer.cpp:273 +msgid "All Files (*.*)" +msgstr "Все файлы (*.*)" + +#. раньше Brasero использовал KiB, MiB и GiB, как более точные технически +#. (вроде как размеры HDD принято измерять по 1GB=1000MB); теперь Brasero +#. перешел на стандарт KB/MB/GB, ну и BmD тоже (а че, мы не гордые :) +#: src/mgui/project/mconstructor.cpp:824 +msgid "KB" +msgstr "КБ" + +#: src/mgui/project/mconstructor.cpp:824 +msgid "GB" +msgstr "ГБ" + +#. Project +#: src/mgui/project/mconstructor.cpp:935 +msgid "_Project" +msgstr "_Проект" + +#: src/mgui/project/mconstructor.cpp:940 +msgid "_New Project" +msgstr "_Создать проект" + +#: src/mgui/project/mconstructor.cpp:942 +msgid "_Open..." +msgstr "_Открыть..." + +#: src/mgui/project/mconstructor.cpp:944 +msgid "_Save" +msgstr "Со_хранить" + +#: src/mgui/project/mconstructor.cpp:946 +msgid "Save _As..." +msgstr "Сохранить _как..." + +#: src/mgui/project/mconstructor.cpp:948 +msgid "_Quit" +msgstr "_Выход" + +#: src/mgui/project/mconstructor.cpp:950 +msgid "Add Videos from _DVD" +msgstr "_Добавить видео с DVD" + +#: src/mgui/project/mconstructor.cpp:950 +msgid "DVD-Import Assistant" +msgstr "Помощник по импорту с DVD" + +#: src/mgui/project/mconstructor.cpp:952 +msgid "_Mux" +msgstr "_Микшировать" + +#: src/mgui/project/mconstructor.cpp:952 +msgid "Mux Elementary Streams into MPEG2" +msgstr "Микшировать дорожки в MPEG2" + +#: src/mgui/project/mconstructor.cpp:954 +msgid "Pr_eferences" +msgstr "_Параметры" + +#. Go +#: src/mgui/project/mconstructor.cpp:993 +msgid "_Go" +msgstr "П_ерейти" + +#. первый вставляем сразу +#. Help +#: src/mgui/project/mconstructor.cpp:999 +msgid "_Help" +msgstr "_Справка" + +#: src/mgui/project/mconstructor.cpp:1100 +msgctxt "MainTabs" +msgid "_Source" +msgstr "_Начало" + +#: src/mgui/project/mconstructor.cpp:1102 +msgctxt "MainTabs" +msgid "_Menu" +msgstr "_Меню" + +#: src/mgui/project/mconstructor.cpp:1104 +msgctxt "MainTabs" +msgid "_Output" +msgstr "_Результат" + +#: src/mgui/project/mb-actions.cpp:142 +msgid "yes" +msgstr "да" + +#: src/mgui/project/mb-actions.cpp:142 +msgid "no" +msgstr "нет" + +#: src/mgui/project/mb-actions.cpp:191 +msgid "Video bitrate" +msgstr "Видео-битрейт" + +#: src/mgui/project/mb-actions.cpp:192 +msgid "kbps" +msgstr "кбит/с" + +#: src/mgui/project/mb-actions.cpp:193 +msgid "Maximum data rate for video (9800 kbps) is exceeded." +msgstr "Превышен максимальный битрейт для видео (9800 кбит/с)." + +#: src/mgui/project/mb-actions.cpp:196 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with resolutions: %2% only." +msgstr "DVD-Video формата %1% может принимать MPEG-2 только следующих размеров: %2%." + +#: src/mgui/project/mb-actions.cpp:197 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with frame rate: %2% only." +msgstr "DVD-Video формата %1% может принимать MPEG-2 только с частотой кадров: %2%." + +#: src/mgui/project/mb-actions.cpp:198 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with aspects 4:3, 16:9 only." +msgstr "DVD-Video формата %1% может принимать MPEG-2 только следующих соотношений: 4:3, 16:9." + +#: src/mgui/project/mb-actions.cpp:218 +msgid "Video size" +msgstr "Размер видео" + +#: src/mgui/project/mb-actions.cpp:238 +msgid "Frame rate" +msgstr "Частота кадров" + +#: src/mgui/project/mb-actions.cpp:239 +msgid "fps" +msgstr "кадров/с" + +#: src/mgui/project/mb-actions.cpp:247 +msgid "Aspect ratio" +msgstr "Соотношение сторон" + +#: src/mgui/project/mb-actions.cpp:322 +msgid "Bombono DVD can use \"DVD-ready\" video only now. Use muxing programs like \"mplex -f 8\" (from mjpegtools), mencoder (from mplayer) or transcode to make your video ready for Bombono DVD." +msgstr "Bombono DVD может использовать сейчас только \"готовые для DVD\" видео. Используйте программы мультиплексирования, например \"mplex -f 8\" (из mjpegtools), mencoder (из mplayer) или transcode, чтобы подготовить видео для Bombono DVD." + +#: src/mgui/project/mb-actions.cpp:326 +msgid "DVD packs" +msgstr "DVD-пакеты" + +#: src/mgui/project/mb-actions.cpp:328 +msgid "NAV packets" +msgstr "NAV-пакеты" + +#: src/mgui/project/mb-actions.cpp:334 +msgid "This video may not be added due to (errors in red color):" +msgstr "Это видео не может быть добавлено из-за (ошибки красным цветом):" + +#. подскажем пользователю, что он ошибся форматом проекта +#: src/mgui/project/mb-actions.cpp:345 +#, boost-format +msgid "This video has %1% type and can't be added to current project of %2% type. Create new project from menu \"Project->New Project\" with right type." +msgstr "Это видео имеет тип %1% и не может быть добавлено в текущий проект типа %2%. Создайте новый проект из меню \"Проект->Новый проект\" соответствующего типа." + +#: src/mgui/project/mb-actions.cpp:373 +msgid "File doesn't exist." +msgstr "Файл не существует." + +#: src/mgui/project/mb-actions.cpp:378 +msgid "Folders can't be added." +msgstr "Каталоги нельзя добавлять." + +#. по расширению выводим наиболее вероятную ошибку +#: src/mgui/project/mb-actions.cpp:413 +msgid "Unknown file type." +msgstr "Неизвестный тип файла." + +#: src/mgui/project/mb-actions.cpp:631 +#, boost-format +msgid "" +"The file \"%1%\" looks like VOB from DVD.\n" +"Run import?" +msgstr "" +"Файл \"%1%\" похож на VOB с DVD.\n" +"Запустить импорт?" + +#: src/mgui/project/mb-actions.cpp:648 +#, boost-format +msgid "The file \"%1%\" looks like elementary stream and need to be muxed before using. Run muxing?" +msgstr "Файл \"%1%\" похож видео/аудио-дорожку. Необходимо смикшировать видео перед использованием. Выполнить микширование?" + +#: src/mgui/project/mb-actions.cpp:710 +msgid "Also:" +msgstr "А также:" + +#: src/mgui/project/mb-actions.cpp:719 +#, boost-format +msgid "See more about preparing video for authoring in online help." +msgstr "Подробнее о подготовке видео для авторинга смотрите в онлайн-справке." + +#: src/mgui/project/mb-actions.cpp:727 +#, boost-format +msgid "Can't add file \"%1%\"." +msgstr "Не удалось добавить файл \"%1%\"." + +#: src/mgui/project/mb-actions.cpp:730 +msgid "Can't add files:" +msgstr "Не удалось добавить файлы:" + +#: src/mgui/project/media-browser.cpp:146 +msgid "Previous Menu" +msgstr "Вернуться в предыдущее меню" + +#: src/mgui/project/media-browser.cpp:146 +#: src/mgui/project/media-browser.cpp:148 +msgid "Next Video" +msgstr "Следующее видео" + +#: src/mgui/project/media-browser.cpp:147 +#, boost-format +msgid "Auto (%1%)" +msgstr "Авто (%1%)" + +#: src/mgui/project/media-browser.cpp:177 +msgid "End Action" +msgstr "Действие по окончанию" + +#: src/mgui/project/media-browser.cpp:201 +msgid "Still Picture" +msgstr "Рисунок" + +#: src/mgui/project/media-browser.cpp:233 +msgid "Type" +msgstr "Тип" + +#. // не меньше чем размер шрифта элемента в списке +#. Gtk::Label& label = *Gtk::manage(new Gtk::Label("Media List")); +#. label.set_use_markup(true); +#. vbox.pack_start(label, Gtk::PACK_SHRINK); +#. Gtk::Requisition req = label.size_request(); +#. label.set_size_request(0, req.height+10); +#: src/mgui/project/media-browser.cpp:291 +#: src/mgui/project/menu-browser.cpp:373 +msgid "Media List" +msgstr "Список медиа" + +#: src/mgui/project/media-browser.cpp:331 +msgid "Add Media from File Browser" +msgstr "Добавить медиа из браузера" + +#: src/mgui/project/media-browser.cpp:340 +msgid "Remove Media" +msgstr "Удалить медиа" + +#: src/mgui/project/media-browser.cpp:351 +msgid "Make Chapters for Video" +msgstr "Разметить главы для видео" + +#: src/mgui/project/menu-browser.cpp:190 +msgid "No Link" +msgstr "Без связи" + +#. * subj +#: src/mgui/project/menu-browser.cpp:337 +msgid "Menu List" +msgstr "Список меню" + +#: src/mgui/project/menu-browser.cpp:353 +msgid "Add Menu" +msgstr "Добавить меню" + +#: src/mgui/project/menu-browser.cpp:358 +msgid "Remove Menu" +msgstr "Удалить меню" + +#: src/mgui/project/menu-browser.cpp:363 +msgid "Edit Menu" +msgstr "Редактировать меню" + +#. Add +#: src/mgui/timeline/layout.cpp:526 +#: src/mgui/timeline/select.cpp:216 +msgid "Add Chapter Point" +msgstr "Добавить главу" + +#. 0 надпись +#: src/mgui/timeline/mviewer.cpp:239 +msgid "File Browser" +msgstr "Браузер файлов" + +#: src/mgui/timeline/mviewer.cpp:269 +msgid "All formats" +msgstr "Поддерживаемые форматы" + +#: src/mgui/timeline/mviewer.cpp:270 +msgid "MPEG files" +msgstr "Файлы MPEG" + +#: src/mgui/timeline/mviewer.cpp:272 +msgid "Still Images" +msgstr "Рисунки" + +#: src/mgui/timeline/select.cpp:143 +msgid "A_dd to project" +msgstr "Д_обавить в проект" + +#: src/mgui/timeline/select.cpp:146 +msgid "Save Frame..." +msgstr "Сохранить кадр..." + +#. Add at Intervals +#: src/mgui/timeline/select.cpp:170 +#: src/mgui/timeline/select.cpp:228 +msgid "Add Chapter Points at Intervals" +msgstr "Добавить главы через интервал" + +#: src/mgui/timeline/select.cpp:176 +msgid "Interval between Chapters:" +msgstr "Интервал между главами" + +#: src/mgui/timeline/select.cpp:183 +msgid "min." +msgstr "мин." + +#: src/mgui/timeline/select.cpp:186 +msgid "Remove Existing Chapters" +msgstr "Удалить существующие главы" + +#. Delete +#: src/mgui/timeline/select.cpp:219 +msgid "Delete Chapter Point" +msgstr "Удалить главу" + +#. Delete All +#: src/mgui/timeline/select.cpp:223 +msgid "Delete All Chapter Points" +msgstr "Удалить все главы" + +#: src/mgui/timeline/select.cpp:236 +msgid "Save Current Frame" +msgstr "Сохранить текущий кадр" + +#~ msgid "_Mux Streams" +#~ msgstr "_Микшировать" +#~ msgctxt "MediaBrowser" +#~ msgid "Edit" +#~ msgstr " " +#~ msgctxt "MenuBrowser" +#~ msgid "Edit" +#~ msgstr " " + diff -Nru bombono-dvd-0.5.2/po/SConscript bombono-dvd-0.6.0/po/SConscript --- bombono-dvd-0.5.2/po/SConscript 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/po/SConscript 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,98 @@ +#!/usr/bin/env python + +Import('env', 'user_options_dict') + +# .po handling code stolen from Ardour + +# +# mo_builder: builder function for (binary) message catalogs (.mo) +# first source: .po file +# + +def mo_builder(target,source,env): + args = [ 'msgfmt', + '-c', + '-o', + target[0].get_path(), + source[0].get_path() + ] + return os.spawnvp(os.P_WAIT, 'msgfmt', args) + +mo_bld = Builder(action = mo_builder) +env.Append(BUILDERS = {'MoBuild' : mo_bld}) + +# +# po_builder: builder function to copy po files to the parent directory while updating them +# first source: .po file +# second source: .pot file +# + +def po_builder(target,source,env): + trgt = str(target[0]) + args = [ 'msgmerge', + '-v', + '--output-file=' + trgt, + str(source[0]), + str(source[1]), + ] + print 'Updating ' + trgt + return os.spawnvp(os.P_WAIT, 'msgmerge', args) + +po_bld = Builder (action = po_builder) +env.Append(BUILDERS = {'PoBuild' : po_bld}) + +import os, glob +cwd = str(Dir('.').srcnode()) +PackageName = 'bombono-dvd' + +po_files = [ os.path.basename(po) for po in glob.glob(os.path.join(cwd, '*.po')) ] +languages = [ po.replace('.po', '') for po in po_files ] + +for lang in languages: + mo_file = 'locale/' + lang + '/LC_MESSAGES/bombono-dvd.mo' + po_file = lang + ".po" + po_src_file = env.File(po_file).srcnode() + tgt = env.MoBuild(mo_file, po_src_file) + + env.Alias('msgupdate', tgt) + inst_tgt = env.InstallAs(os.path.join(user_options_dict['DEST_PREFIX'], 'share', mo_file), tgt) + env.Alias("install", inst_tgt) + + # :TRICKY: update po files from generated .pot, not from kept one + env.PoBuild(po_file, [po_src_file, 'bombono-dvd.pot']) + +# :BUG: updated *.mo (with scons msgudpate) in build/po/locale do not install to DEST_PREFIX/share/locale +# if the folder exists already. So we install them explicitly (see above). +#import BuildVars as BV +#env.Alias("install", BV.InstallDir(env, os.path.join(user_options_dict['DEST_PREFIX'], 'share'), 'locale')) + +# +# pot_builder: builder function for message templates (.pot) +# source: list of C/C++ etc. files to extract messages from +# + +def pot_builder(target,source,env): + args = [ 'xgettext', + '--keyword=_', + '--keyword=N_', + '--keyword=C_:1c,2', + '--keyword=F_', + '--boost', + '--keyword=BF_', # = boost::format(gettext()), boost-format comment is auto added + '--keyword=DOTS_', + '--keyword=SMCLN_', + '--add-comments', + '--from-code=UTF-8', + '-o', target[0].get_path(), + "--default-domain=" + PackageName, + '''--copyright-holder="Ilya Murav'jov"''' ] + args += [ src.get_path() for src in source ] + + return os.spawnvp(os.P_WAIT, 'xgettext', args) + +pot_bld = Builder(action = pot_builder) +env.Append(BUILDERS = {'PotBuild' : pot_bld}) + +sources = user_options_dict['XGETTEXT_SOURCES'] # + ['#src/mgui/tests/test_gettext.cpp'] +env.Alias('potupdate', env.PotBuild('bombono-dvd.pot', sources)) + diff -Nru bombono-dvd-0.5.2/po/sv.po bombono-dvd-0.6.0/po/sv.po --- bombono-dvd-0.5.2/po/sv.po 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/po/sv.po 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,760 @@ +# Swedish translation for bombono-dvd. +# Copyright (C) 2010 Free Software Foundation, Inc. +# This file is distributed under the same license as the bombono-dvd package. +# Daniel Nylander , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: bombono-dvd-0.5.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-02-28 15:35+0300\n" +"PO-Revision-Date: 2010-03-17 13:15+0100\n" +"Last-Translator: Daniel Nylander \n" +"Language-Team: Swedish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/mbase/project/media.cpp:66 src/mgui/project/media-browser.cpp:106 +msgid "Chapter" +msgstr "Kapitel" + +#: src/mbase/project/menu.cpp:274 +msgid "Menu" +msgstr "Meny" + +#: src/mgui/dvdimport.cpp:64 +msgid "Choose Source DVD-Video" +msgstr "" + +#: src/mgui/dvdimport.cpp:67 +msgid "Select Videos to Import" +msgstr "Välj videor att importera" + +#: src/mgui/dvdimport.cpp:70 +msgid "Select Folder to Save Videos" +msgstr "Välj mapp att spara videor i" + +#: src/mgui/dvdimport.cpp:73 +msgid "Importing..." +msgstr "Importerar..." + +#: src/mgui/dvdimport.cpp:76 +msgid "Import is completed." +msgstr "Importen är färdig." + +#: src/mgui/dvdimport.cpp:189 src/mgui/project/mconstructor.cpp:807 +msgid "MB" +msgstr "MB" + +#: src/mgui/dvdimport.cpp:370 +msgid "Select All" +msgstr "Markera allt" + +#: src/mgui/dvdimport.cpp:370 +msgid "Unselect All" +msgstr "Avmarkera allt" + +#. мы не можем пустить исключение здесь, потому что оно пойдет +#. и через C-шный код (Gtk) - отложим +#: src/mgui/dvdimport.cpp:392 +msgid "Are you sure to stop importing?" +msgstr "Är du säker på att du vill stoppa importen?" + +#: src/mgui/dvdimport.cpp:425 +#, boost-format +msgid "Cant write to folder %1% (check permissions)." +msgstr "Kan inte skriva till mappen %1% (kontrollera behörighet)." + +#: src/mgui/dvdimport.cpp:453 src/mgui/win_utils.cpp:298 +#, boost-format +msgid "A file named \"%1%\" already exists. Do you want to replace it?" +msgstr "En fil med namnet \"%1%\" finns redan. Vill du ersätta den?" + +#: src/mgui/dvdimport.cpp:493 +msgid "Import error!" +msgstr "Importeringsfel!" + +#: src/mgui/dvdimport.cpp:497 +msgid "Videos successfully imported." +msgstr "" + +#: src/mgui/dvdimport.cpp:498 +msgid "Import has been interrupted." +msgstr "" + +#: src/mgui/dvdimport.cpp:532 +msgid "DVD-Video Import" +msgstr "" + +#: src/mgui/dvdimport.cpp:555 +msgid "Choose DVD disc, DVD folder or iso image file." +msgstr "" + +#: src/mgui/dvdimport.cpp:573 +msgid "NTSC/PAL mismatch. Try another disc or import to project of corresponding type." +msgstr "" + +#. имя +#: src/mgui/dvdimport.cpp:597 src/mgui/project/media-browser.cpp:123 +msgid "Name" +msgstr "Namn" + +#: src/mgui/dvdimport.cpp:610 +msgid "Details" +msgstr "Detaljer" + +#: src/mgui/dvdimport.cpp:656 +msgid "It is desirable the destination folder to be empty." +msgstr "" + +#: src/mgui/win_utils.cpp:301 +msgid "Replacing the file overwrite its contents." +msgstr "" + +#: src/mgui/author/burn.cpp:191 +msgid "Auto" +msgstr "Automatisk" + +#: src/mgui/author/burn.cpp:203 +msgid "Update speeds ..." +msgstr "Uppdatera hastigheter ..." + +#: src/mgui/author/burn.cpp:333 +msgid "Checking Disc ..." +msgstr "Kontrollerar skiva ..." + +#: src/mgui/author/burn.cpp:347 +msgid "Selected burn drive is for CD discs only. Change to another burn drive." +msgstr "" + +#: src/mgui/author/burn.cpp:352 +msgid "CD disc is found in the drive, not DVD. Change to DVD disc." +msgstr "" + +#: src/mgui/author/burn.cpp:357 +msgid "No DVD disc in the drive. Load a clear one and press OK." +msgstr "" + +#: src/mgui/author/burn.cpp:362 +#, boost-format +msgid "Disc with type \"%1%\" is found in the drive but for DVD-Video disc type should be one from: DVD-R, DVD+R, DVD-RW, DVD+RW. Load a clear one with right type and press OK." +msgstr "" + +#: src/mgui/author/burn.cpp:371 +#, boost-format +msgid "Disc with type \"%1%\" in the drive is not clear. Only clear recordable discs can be used for burning DVD-Video. Load a clear one and press OK." +msgstr "" + +#: src/mgui/author/burn.cpp:378 +#, boost-format +msgid "Disc with type \"%1%\" in the drive is not clear. We need to remove its contents before writing new one. Continue?" +msgstr "" + +#: src/mgui/author/burn.cpp:382 +msgid "_Cancel" +msgstr "_Avbryt" + +#: src/mgui/author/burn.cpp:383 +msgid "_Try again" +msgstr "_Försök igen" + +#: src/mgui/author/execute.cpp:72 +msgid "Status: " +msgstr "Status: " + +#: src/mgui/author/execute.cpp:659 +#, boost-format +msgid "exit code = %1%" +msgstr "avslutningskod = %1%" + +#: src/mgui/author/execute.cpp:661 +#, boost-format +msgid "broken by signal %1%" +msgstr "" + +#: src/mgui/author/indicator.cpp:67 +msgid "Rendering Menus" +msgstr "" + +#: src/mgui/author/indicator.cpp:68 +msgid "Generating DVD-Video" +msgstr "" + +#: src/mgui/author/indicator.cpp:69 +msgid "Creating ISO Image" +msgstr "Skapar ISO-avbildning" + +#: src/mgui/author/indicator.cpp:70 +msgid "Burning DVD" +msgstr "" + +#: src/mgui/author/output.cpp:53 +msgid "DVD-Video Building" +msgstr "" + +#: src/mgui/author/output.cpp:63 +#, boost-format +msgid "_Cancel %1%" +msgstr "_Avbryt %1%" + +#: src/mgui/author/output.cpp:64 +msgid "_Build DVD-Video" +msgstr "_Bygg DVD-video" + +#: src/mgui/author/output.cpp:164 +msgid "Select Output _Folder:" +msgstr "" + +#: src/mgui/author/output.cpp:178 +msgid " Choose Author Mode: " +msgstr "" + +#. цель по умолчанию +#: src/mgui/author/output.cpp:184 +msgid "_Write DVD Folder" +msgstr "S_kriv DVD-mapp" + +#: src/mgui/author/output.cpp:185 +msgid "Write Disk _Image" +msgstr "Skriv skiva_vbildning" + +#: src/mgui/author/output.cpp:194 +msgid "Disc Label: " +msgstr "Skivetikett: " + +#: src/mgui/author/output.cpp:199 +msgid "Burn to _DVD" +msgstr "Bränn till _DVD" + +#: src/mgui/author/output.cpp:207 +msgid "DVD Drive: " +msgstr "DVD-enhet: " + +#: src/mgui/author/output.cpp:213 +msgid "Writing Speed: " +msgstr "Skrivhastighet: " + +#: src/mgui/author/output.cpp:224 +msgid "_Rendering only" +msgstr "" + +#: src/mgui/author/output.cpp:232 +msgid "Show/_Hide Details" +msgstr "Visa/_Dölj detaljer" + +#: src/mgui/author/output.cpp:278 +msgid "Rendering" +msgstr "" + +#: src/mgui/author/output.cpp:355 +msgid "DVD Burning" +msgstr "" + +#: src/mgui/author/output.cpp:399 +msgid "The result is here" +msgstr "Resultatet finns här" + +#: src/mgui/author/output.cpp:401 +msgid "You can run authoring manually by executing command \"scons\" at the specified folder. Also, see README file for other options over there." +msgstr "" + +#. Translators: impossible to go on! +#: src/mgui/author/output.cpp:425 +msgid "Authoring is cancelled." +msgstr "" + +#: src/mgui/author/output.cpp:432 +#, boost-format +msgid "Cant create folder %1% (check permissions)" +msgstr "Kan inte skapa mappen %1% (kontrollera behörighet)" + +#: src/mgui/author/output.cpp:439 +#, boost-format +msgid "%1% is not a folder" +msgstr "%1% är inte en mapp" + +#: src/mgui/author/output.cpp:450 +#, boost-format +msgid "Cant have full access to folder %1% (read, write)" +msgstr "" + +#: src/mgui/author/output.cpp:458 +#, boost-format +msgid "" +"Folder %1% is not empty. We need to remove all files in it before authoring.\n" +"Continue?" +msgstr "" + +#: src/mgui/author/output.cpp:464 +#, boost-format +msgid "Error during removing files: %1%" +msgstr "Fel vid borttagning av filer: %1%" + +#: src/mgui/author/output.cpp:634 +#, boost-format +msgid "%1% cancelled." +msgstr "%1% avbröts." + +#: src/mgui/author/output.cpp:636 +#, boost-format +msgid "%1% broken." +msgstr "%1% är trasig." + +#: src/mgui/author/output.cpp:637 +#, boost-format +msgid "The reason is \"%1%\" (see Details)" +msgstr "Anledningen är \"%1%\" (se Detaljer)" + +#. Translators: can be tranlated as "Operation "%1%" ..." +#: src/mgui/author/output.cpp:643 +#, boost-format +msgid "%1% successfully completed." +msgstr "%1% färdigställdes." + +#: src/mgui/author/output.cpp:673 +msgid "_Play in Totem" +msgstr "_Spela upp i Totem" + +#: src/mgui/author/output.cpp:674 +msgid "_Burn to DVD" +msgstr "_Bränn till dvd" + +#. COPY_N_PASTE - тупо сделал содержимое сообщений как у "TSNAMI-MPEG DVD Author" +#. А что делать - нафига свои придумывать, если смысл один и тот же +#: src/mgui/author/output.cpp:739 +#, boost-format +msgid "You are about to cancel %1%. Are you sure?" +msgstr "Du är på väg att avbryta %1%. Är du säker?" + +#: src/mgui/author/script.cpp:310 +msgid "There is no media (video or menu)." +msgstr "Det finns inget media (video eller meny)." + +#: src/mgui/author/script.cpp:481 +#, boost-format +msgid "external command failure: %1%" +msgstr "" + +#: src/mgui/editor/select.cpp:337 +msgid "Delete" +msgstr "Ta bort" + +#: src/mgui/editor/select.cpp:351 +msgid "Link" +msgstr "Länk" + +#: src/mgui/editor/select.cpp:356 +msgid "Remove Link" +msgstr "Ta bort länk" + +#: src/mgui/editor/select.cpp:358 src/mgui/editor/select.cpp:611 +msgid "Set Background Color..." +msgstr "Ställ in bakgrundsfärg..." + +#. Selection Tool +#: src/mgui/editor/toolbar.cpp:129 +msgid "Selection Tool" +msgstr "Markeringsverktyg" + +#. Text Tool +#: src/mgui/editor/toolbar.cpp:132 +msgid "Text Tool" +msgstr "Textverktyg" + +#: src/mgui/editor/toolbar.cpp:493 +msgid "Add Item" +msgstr "Lägg till objekt" + +#: src/mgui/editor/toolbar.cpp:515 +msgid "Font Name" +msgstr "Typsnittsnamn" + +#: src/mgui/editor/toolbar.cpp:531 +msgid "Font Size" +msgstr "Typsnittsstorlek" + +#. * кнопки стилей шрифта +#: src/mgui/editor/toolbar.cpp:536 +msgid "Bold" +msgstr "Fet" + +#: src/mgui/editor/toolbar.cpp:537 +msgid "Italic" +msgstr "Kursiv" + +#: src/mgui/editor/toolbar.cpp:538 +msgid "Underline" +msgstr "Understruken" + +#: src/mgui/editor/toolbar.cpp:546 +msgid "Pick a Color for Text" +msgstr "Välj en färg för texten" + +#: src/mgui/editor/toolbar.cpp:548 +msgid "Text Color" +msgstr "Textfärg" + +#: src/mgui/project/browser.cpp:128 +#, boost-format +msgid "Do you really want to delete \"%1%\" from Media List?" +msgstr "Vill du verkligen ta bort \"%1%\" från medialistan?" + +#: src/mgui/project/browser.cpp:129 +#, boost-format +msgid "Do you really want to delete chapter \"%1%\"?" +msgstr "Vill du verkligen ta bort kapitlet \"%1%\"?" + +#: src/mgui/project/browser.cpp:130 +#, boost-format +msgid "Do you really want to delete menu \"%1%\"?" +msgstr "Vill du verkligen ta bort menyn \"%1%\"?" + +#: src/mgui/project/browser.cpp:242 +msgid "First-Play media can be Video or Menu only." +msgstr "" + +#: src/mgui/project/mconstructor.cpp:132 +msgid "Save Project As..." +msgstr "Spara projekt som..." + +#: src/mgui/project/mconstructor.cpp:167 +#, boost-format +msgid "Cant open project file \"%1%\"" +msgstr "Kan inte öppna projektfilen \"%1%\"" + +#: src/mgui/project/mconstructor.cpp:444 +msgid "Bombono DVD is a DVD authoring program with nice and clean GUI" +msgstr "" + +#. dlg.set_authors(authors); +#. dlg.set_documenters(documenters); +#. dlg.set_decorated(false); +#: src/mgui/project/mconstructor.cpp:449 +msgid "translator-credits" +msgstr "" +"Daniel Nylander \n" +"\n" +"Skicka synpunkter på översättningen till\n" +"." + +#: src/mgui/project/mconstructor.cpp:590 +#, boost-format +msgid "Save changes to \"%1%\"?" +msgstr "Spara ändringar till \"%1%\"?" + +#: src/mgui/project/mconstructor.cpp:592 +msgid "Close _without Saving" +msgstr "Stäng _utan att spara" + +#: src/mgui/project/mconstructor.cpp:631 +msgid "New Project" +msgstr "Nytt projekt" + +#: src/mgui/project/mconstructor.cpp:643 +msgid "Please select a Television standard for your project:" +msgstr "Välj en tv-standard för ditt projekt:" + +#: src/mgui/project/mconstructor.cpp:670 +msgid "Open Project" +msgstr "Öppna projekt" + +#: src/mgui/project/mconstructor.cpp:674 +msgid "Project files (*.xml)" +msgstr "Projektfiler (*.xml)" + +#: src/mgui/project/mconstructor.cpp:679 src/mgui/timeline/mviewer.cpp:262 +msgid "All Files (*.*)" +msgstr "Alla filer (*.*)" + +#. раньше Brasero использовал KiB, MiB и GiB, как более точные технически +#. (вроде как размеры HDD принято измерять по 1GB=1000MB); теперь Brasero +#. перешел на стандарт KB/MB/GB, ну и BmD тоже (а че, мы не гордые :) +#: src/mgui/project/mconstructor.cpp:807 +msgid "KB" +msgstr "KB" + +#: src/mgui/project/mconstructor.cpp:807 +msgid "GB" +msgstr "GB" + +#. Project +#: src/mgui/project/mconstructor.cpp:912 +msgid "_Project" +msgstr "_Projekt" + +#: src/mgui/project/mconstructor.cpp:917 +msgid "_New Project" +msgstr "_Nytt projekt" + +#: src/mgui/project/mconstructor.cpp:919 +msgid "_Open..." +msgstr "_Öppna..." + +#: src/mgui/project/mconstructor.cpp:921 +msgid "_Save" +msgstr "_Spara" + +#: src/mgui/project/mconstructor.cpp:923 +msgid "Save _As..." +msgstr "Spara so_m..." + +#: src/mgui/project/mconstructor.cpp:925 +msgid "_Quit" +msgstr "A_vsluta" + +#: src/mgui/project/mconstructor.cpp:927 +msgid "Add Videos from _DVD" +msgstr "Lägg till videor från _DVD" + +#: src/mgui/project/mconstructor.cpp:927 +msgid "DVD-Import Assistant" +msgstr "Guide för DVD-importering" + +#. Go +#: src/mgui/project/mconstructor.cpp:963 +msgid "_Go" +msgstr "_Gå" + +#. первый вставляем сразу +#. Help +#: src/mgui/project/mconstructor.cpp:969 +msgid "_Help" +msgstr "_Hjälp" + +#: src/mgui/project/mconstructor.cpp:1070 +msgctxt "MainTabs" +msgid "_Source" +msgstr "_Källa" + +#: src/mgui/project/mconstructor.cpp:1072 +msgctxt "MainTabs" +msgid "_Menu" +msgstr "_Meny" + +#: src/mgui/project/mconstructor.cpp:1074 +msgctxt "MainTabs" +msgid "_Output" +msgstr "" + +#: src/mgui/project/mb-actions.cpp:141 +msgid "yes" +msgstr "ja" + +#: src/mgui/project/mb-actions.cpp:141 +msgid "no" +msgstr "nej" + +#: src/mgui/project/mb-actions.cpp:190 +msgid "Video bitrate" +msgstr "" + +#: src/mgui/project/mb-actions.cpp:191 +msgid "kbps" +msgstr "kbps" + +#: src/mgui/project/mb-actions.cpp:192 +msgid "Maximum data rate for video (9800 kbps) is exceeded." +msgstr "" + +#: src/mgui/project/mb-actions.cpp:195 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with resolutions: %2% only." +msgstr "" + +#: src/mgui/project/mb-actions.cpp:196 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with frame rate: %2% only." +msgstr "" + +#: src/mgui/project/mb-actions.cpp:197 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with aspects 4:3, 16:9 only." +msgstr "" + +#: src/mgui/project/mb-actions.cpp:217 +msgid "Video size" +msgstr "Videostorlek" + +#: src/mgui/project/mb-actions.cpp:237 +msgid "Frame rate" +msgstr "Bildfrekvens" + +#: src/mgui/project/mb-actions.cpp:238 +msgid "fps" +msgstr "bilder/s" + +#: src/mgui/project/mb-actions.cpp:246 +msgid "Aspect ratio" +msgstr "Bildförhållande" + +#: src/mgui/project/mb-actions.cpp:321 +msgid "Bombono DVD can use \"DVD-ready\" video only now. Use muxing programs like \"mplex -f 8\" (from mjpegtools), mencoder (from mplayer) or transcode to make your video ready for Bombono DVD." +msgstr "" + +#: src/mgui/project/mb-actions.cpp:325 +msgid "DVD packs" +msgstr "" + +#: src/mgui/project/mb-actions.cpp:327 +msgid "NAV packets" +msgstr "" + +#: src/mgui/project/mb-actions.cpp:333 +msgid "This video may not be added due to (errors in red color):" +msgstr "" + +#. подскажем пользователю, что он ошибся форматом проекта +#: src/mgui/project/mb-actions.cpp:344 +#, boost-format +msgid "This video has %1% type and can't be added to current project of %2% type. Create new project from menu \"Project->New Project\" with right type." +msgstr "" + +#: src/mgui/project/mb-actions.cpp:372 +msgid "File doesn't exist." +msgstr "Filen finns inte." + +#: src/mgui/project/mb-actions.cpp:377 +msgid "Folders can't be added." +msgstr "Mappar kan inte läggas till." + +#. по расширению выводим наиболее вероятную ошибку +#: src/mgui/project/mb-actions.cpp:412 +msgid "Unknown file type." +msgstr "Okänd filtyp." + +#: src/mgui/project/mb-actions.cpp:617 +#, boost-format +msgid "" +"The file \"%1%\" looks like VOB from DVD.\n" +"Run import?" +msgstr "" + +#: src/mgui/project/mb-actions.cpp:679 +msgid "Also:" +msgstr "Även:" + +#: src/mgui/project/mb-actions.cpp:688 +#, boost-format +msgid "See more about preparing video for authoring in online help." +msgstr "" + +#: src/mgui/project/mb-actions.cpp:696 +#, boost-format +msgid "Can't add file \"%1%\"." +msgstr "Kan inte lägga till filen \"%1%\"." + +#: src/mgui/project/mb-actions.cpp:699 +msgid "Can't add files:" +msgstr "Kan inte lägga till filer:" + +#. Названия типов для i18n +#: src/mgui/project/media-browser.cpp:105 +#: src/mgui/timeline/layout-draw.cpp:156 +msgid "Video" +msgstr "Video" + +#: src/mgui/project/media-browser.cpp:107 +msgid "Still Picture" +msgstr "Stillbild" + +#: src/mgui/project/media-browser.cpp:139 +msgid "Type" +msgstr "Typ" + +#. // не меньше чем размер шрифта элемента в списке +#. Gtk::Label& label = *Gtk::manage(new Gtk::Label("Media List")); +#. label.set_use_markup(true); +#. vbox.pack_start(label, Gtk::PACK_SHRINK); +#. Gtk::Requisition req = label.size_request(); +#. label.set_size_request(0, req.height+10); +#: src/mgui/project/media-browser.cpp:197 +#: src/mgui/project/menu-browser.cpp:340 +msgid "Media List" +msgstr "Medialista" + +#: src/mgui/project/media-browser.cpp:237 +msgid "Add Media from File Browser" +msgstr "Lägg till media från filbläddrare" + +#: src/mgui/project/media-browser.cpp:246 +msgid "Remove Media" +msgstr "Ta bort media" + +#. Translators: it is normal to translate "Edit" as " " (empty) and +#. to keep the button small; let the tooltip tell the purpose. The same thing +#. with the button "Edit" in Menu List +#: src/mgui/project/media-browser.cpp:253 +msgctxt "MediaBrowser" +msgid "Edit" +msgstr "Redigera" + +#: src/mgui/project/media-browser.cpp:254 +msgid "Make Chapters for Video" +msgstr "Skapa kapitel för video" + +#: src/mgui/project/menu-browser.cpp:188 +msgid "No Link" +msgstr "Ingen länk" + +#. * subj +#: src/mgui/project/menu-browser.cpp:300 +msgid "Menu List" +msgstr "Menylista" + +#: src/mgui/project/menu-browser.cpp:320 +msgid "Add Menu" +msgstr "Lägg till meny" + +#: src/mgui/project/menu-browser.cpp:325 +msgid "Remove Menu" +msgstr "Ta bort meny" + +#: src/mgui/project/menu-browser.cpp:329 +msgctxt "MenuBrowser" +msgid "Edit" +msgstr "Redigera" + +#: src/mgui/project/menu-browser.cpp:330 +msgid "Edit Menu" +msgstr "Redigera meny" + +#. Add +#: src/mgui/timeline/layout.cpp:528 src/mgui/timeline/select.cpp:141 +msgid "Add Chapter Point" +msgstr "Lägg till kapitelpunkt" + +#. 0 надпись +#: src/mgui/timeline/mviewer.cpp:229 +msgid "File Browser" +msgstr "Filbläddrare" + +#: src/mgui/timeline/mviewer.cpp:259 +msgid "All formats" +msgstr "Alla format" + +#: src/mgui/timeline/mviewer.cpp:260 +msgid "MPEG files" +msgstr "MPEG-filer" + +#: src/mgui/timeline/mviewer.cpp:261 +msgid "Still Images" +msgstr "Stillbilder" + +#: src/mgui/timeline/select.cpp:124 +msgid "Save Frame..." +msgstr "Spara bildruta..." + +#. Delete +#: src/mgui/timeline/select.cpp:144 +msgid "Delete Chapter Point" +msgstr "Ta bort kapitelpunkt" + +#. Delete All +#: src/mgui/timeline/select.cpp:148 +msgid "Delete All Chapter Points" +msgstr "Ta bort alla kapitelpunkter" + +#: src/mgui/timeline/select.cpp:157 +msgid "Save Current Frame..." +msgstr "Spara aktuell bildruta..." diff -Nru bombono-dvd-0.5.2/po/vi.po bombono-dvd-0.6.0/po/vi.po --- bombono-dvd-0.5.2/po/vi.po 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/po/vi.po 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,914 @@ +# Vietnamese translation for Bombono DVD. +# Copyright © 2010 Free Software Foundation, Inc. +# Copyright © 2010 Ilya Murav'jov. +# This file is distributed under the same license as the bombono-dvd package. +# Clytie Siddall , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: bombono-dvd 0.5.9\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-04-03 00:13+0400\n" +"PO-Revision-Date: 2010-04-06 17:00+0930\n" +"Last-Translator: Clytie Siddall \n" +"Language-Team: Vietnamese \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: LocFactoryEditor 1.8\n" + +#: src/mbase/project/media.cpp:68 src/mgui/project/media-browser.cpp:200 +msgid "Chapter" +msgstr "Tập" + +#: src/mbase/project/media.cpp:112 +#, boost-format +msgid "Cant create folder %1% (check permissions)" +msgstr "Không thể tạo thư mục %1% (kiểm tra quyền hạn)" + +#: src/mbase/project/menu.cpp:276 +msgid "Menu" +msgstr "Trình đơn" + +#: src/mgui/dvdimport.cpp:82 +msgid "Choose Source DVD-Video" +msgstr "Chọn DVD Phim nguồn" + +#: src/mgui/dvdimport.cpp:85 +msgid "Select Videos to Import" +msgstr "Chọn các phim cần nhập" + +#: src/mgui/dvdimport.cpp:88 +msgid "Select Folder to Save Videos" +msgstr "Chọn thư mục vào đó cần lưu phim" + +#: src/mgui/dvdimport.cpp:91 +msgid "Importing..." +msgstr "Đang nhập..." + +#: src/mgui/dvdimport.cpp:94 +msgid "Import is completed." +msgstr "Hoàn tất nhập vào." + +#: src/mgui/dvdimport.cpp:207 src/mgui/project/mconstructor.cpp:824 +msgid "MB" +msgstr "MB" + +#: src/mgui/dvdimport.cpp:388 +msgid "Select All" +msgstr "Chọn tất cả" + +#: src/mgui/dvdimport.cpp:388 +msgid "Unselect All" +msgstr "Bỏ chọn tất cả" + +#. мы не можем пустить исключение здесь, потому что оно пойдет +#. и через C-шный код (Gtk) - отложим +#: src/mgui/dvdimport.cpp:410 +msgid "Are you sure to stop importing?" +msgstr "Bạn chắc chắn muốn dừng chạy tiến trình nhập không?" + +#: src/mgui/dvdimport.cpp:443 +#, boost-format +msgid "Cant write to folder %1% (check permissions)." +msgstr "Không thẻ ghi lên thư mục %1% (kiểm tra quyền hạn)." + +#: src/mgui/dvdimport.cpp:471 src/mgui/win_utils.cpp:319 +#, boost-format +msgid "A file named \"%1%\" already exists. Do you want to replace it?" +msgstr "Một tập tin tên « %1% » đã có. Bạn có muốn thay thế nó không?" + +#: src/mgui/dvdimport.cpp:504 +msgid "Import error!" +msgstr "Lỗi nhập !" + +#: src/mgui/dvdimport.cpp:508 +msgid "Videos successfully imported." +msgstr "Các phim đã được nhập." + +#: src/mgui/dvdimport.cpp:509 +msgid "Import has been interrupted." +msgstr "Tiến trình nhập bị gián đoạn." + +#: src/mgui/dvdimport.cpp:543 +msgid "DVD-Video Import" +msgstr "Nhập DVD Phim" + +#: src/mgui/dvdimport.cpp:566 +msgid "Choose DVD disc, DVD folder or iso image file." +msgstr "Chọn đĩa DVD, thư mục DVD hay tập tin ảnh ISO." + +#: src/mgui/dvdimport.cpp:584 +msgid "NTSC/PAL mismatch. Try another disc or import to project of corresponding type." +msgstr "NTSC/PAL không tương ứng. Hãy thử một đĩa khác hoặc nhập vào một dự án có kiểu thích hợp." + +#. имя +#: src/mgui/dvdimport.cpp:608 src/mgui/project/media-browser.cpp:217 +msgid "Name" +msgstr "Tên" + +#: src/mgui/dvdimport.cpp:621 +msgid "Details" +msgstr "Chi tiết" + +#: src/mgui/dvdimport.cpp:667 +msgid "It is desirable the destination folder to be empty." +msgstr "Tốt hơn nếu thư mục đích vẫn trống." + +#. COPY_N_PASTE - тупо сделал содержимое сообщений как у "TSNAMI-MPEG DVD Author" +#. А что делать - нафига свои придумывать, если смысл один и тот же +#: src/mgui/execution.cpp:27 +#, boost-format +msgid "You are about to cancel %1%. Are you sure?" +msgstr "Bạn sắp thôi tiến trình %1%. Bạn có chắc chưa?" + +#: src/mgui/mux.cpp:29 +msgid "muxing" +msgstr "đang kết hợp lại" + +#: src/mgui/mux.cpp:45 +#, boost-format +msgid "Muxing \"%1%\"" +msgstr "Đang kết hợp lại « %1% »" + +#: src/mgui/mux.cpp:56 src/mgui/author/output.cpp:229 +msgid "Show/_Hide Details" +msgstr "_Hiện/ẩn chi tiết" + +#: src/mgui/mux.cpp:80 +msgid "Muxing error" +msgstr "Lỗi kết hợp lại" + +#: src/mgui/mux.cpp:81 src/mgui/author/output.cpp:632 +#, boost-format +msgid "The reason is \"%1%\" (see Details)" +msgstr "Lý do là « %1% » (xem Chi tiết)" + +#: src/mgui/mux.cpp:97 +msgid "Select a folder" +msgstr "Chọn một thư mục" + +#: src/mgui/mux.cpp:109 +msgid "in" +msgstr "trong" + +#: src/mgui/mux.cpp:143 +msgid "Mux streams" +msgstr "Kết hợp lại các luồng" + +#: src/mgui/mux.cpp:145 +msgid "Output" +msgstr "Xuất" + +#: src/mgui/mux.cpp:146 +msgid "Select elementary video" +msgstr "Chọn phim cơ bản" + +#: src/mgui/mux.cpp:147 +msgid "Select audio" +msgstr "Chọn âm thanh" + +#. Названия типов для i18n +#: src/mgui/mux.cpp:151 src/mgui/project/media-browser.cpp:199 +#: src/mgui/timeline/layout-draw.cpp:156 +msgid "Video" +msgstr "Phim" + +#: src/mgui/mux.cpp:154 +msgid "MPEG2 elementary video (m2v)" +msgstr "Phim cơ bản MPEG2 (m2v)" + +#: src/mgui/mux.cpp:159 +msgid "Audio" +msgstr "Âm thanh" + +#: src/mgui/mux.cpp:162 src/mgui/timeline/mviewer.cpp:271 +msgid "Audio for DVD" +msgstr "Âm thanh cho DVD" + +#: src/mgui/mux.cpp:187 +msgid "Elementary video file is not selected." +msgstr "Chưa chọn tập tin phim cơ bản." + +#: src/mgui/mux.cpp:189 +msgid "Audio file is not selected." +msgstr "Chưa chọn tập tin âm thanh." + +#: src/mgui/mux.cpp:191 +msgid "Output file name is empty." +msgstr "Tên tập tin kết xuất còn trống." + +#: src/mgui/prefs.cpp:98 +msgid "Bombono DVD Preferences" +msgstr "Tùy thích Bombono DVD" + +#: src/mgui/prefs.cpp:111 +msgid "_Default Project Type" +msgstr "Kiểu dự án _mặc định" + +#: src/mgui/prefs.cpp:116 +msgid "_Play Authoring Result in" +msgstr "_Phát kết quả sáng tạo bằng" + +#: src/mgui/win_utils.cpp:322 +msgid "Replacing the file overwrite its contents." +msgstr "Việc thay thế tập tin đó thì cũng ghi đè lên nội dung của nó." + +#: src/mgui/author/burn.cpp:198 +msgid "Auto" +msgstr "Tự động" + +#: src/mgui/author/burn.cpp:210 +msgid "Update speeds ..." +msgstr "Thời gian cập nhật ..." + +#: src/mgui/author/burn.cpp:331 +msgid "Checking Disc ..." +msgstr "Đang kiểm tra đĩa ..." + +#: src/mgui/author/burn.cpp:345 +msgid "Selected burn drive is for CD discs only. Change to another burn drive." +msgstr "Bạn đã chọn một ổ đĩa chép ra dành cho đĩa CD. Chuyển đổi sang một ổ đĩa khác." + +#: src/mgui/author/burn.cpp:350 +msgid "CD disc is found in the drive, not DVD. Change to DVD disc." +msgstr "Bạn đã nạp một đĩa CD, không phải DVD. Chuyển đổi sang một đĩa DVD." + +#: src/mgui/author/burn.cpp:355 +msgid "No DVD disc in the drive. Load a clear one and press OK." +msgstr "Ổ đĩa không chứa đĩa DVD. Nạp một đĩa DVD trống và bấm nút OK." + +#: src/mgui/author/burn.cpp:360 +#, boost-format +msgid "Disc with type \"%1%\" is found in the drive but for DVD-Video disc type should be one from: DVD-R, DVD+R, DVD-RW, DVD+RW. Load a clear one with right type and press OK." +msgstr "Bạn đã nạp một đĩa kiểu « %1% », nhưng mà đối với đĩa DVD Phim nên có một của những kiểu này: DVD-R, DVD+R, DVD-RW, DVD+RW. Hãy nạp một đĩa trống có kiểu đúng, sau đó bấm nút OK." + +#: src/mgui/author/burn.cpp:369 +#, boost-format +msgid "Disc with type \"%1%\" in the drive is not clear. Only clear recordable discs can be used for burning DVD-Video. Load a clear one and press OK." +msgstr "Bạn đã nạp một đĩa kiểu « %1% » mà không trống. Chỉ đĩa thu được vẫn trống có thể được sử dụng để chép ra đĩa DVD Phim. Hãy nạp một đĩa trống, và bấm nút OK." + +#: src/mgui/author/burn.cpp:376 +#, boost-format +msgid "Disc with type \"%1%\" in the drive is not clear. We need to remove its contents before writing new one. Continue?" +msgstr "Bạn đã nạp một đĩa kiểu « %1% » mà không trống. Có nên xoá bỏ nội dung của nó trước khi ghi dữ liệu mới. Tiếp tục ?" + +#: src/mgui/author/burn.cpp:380 +msgid "_Cancel" +msgstr "_Thôi" + +#: src/mgui/author/burn.cpp:381 +msgid "_Try again" +msgstr "Thử _lại" + +#: src/mgui/author/execute.cpp:72 +msgid "Status: " +msgstr "Trạng thái: " + +#: src/mgui/author/execute.cpp:568 +#, boost-format +msgid "exit code = %1%" +msgstr "mã thoát = %1%" + +#: src/mgui/author/execute.cpp:570 +#, boost-format +msgid "broken by signal %1%" +msgstr "bị ngắt do tín hiệu %1%" + +#: src/mgui/author/indicator.cpp:67 +msgid "Rendering Menus" +msgstr "Đang vẽ các trình đơn" + +#: src/mgui/author/indicator.cpp:68 +msgid "Generating DVD-Video" +msgstr "Đang tạo ra đĩa DVD phim" + +#: src/mgui/author/indicator.cpp:69 +msgid "Creating ISO Image" +msgstr "Đang tạo ảnh ISO" + +#: src/mgui/author/indicator.cpp:70 +msgid "Burning DVD" +msgstr "Đang chép ra đĩa DVD" + +#: src/mgui/author/output.cpp:53 +msgid "DVD-Video Building" +msgstr "Xây dựng đĩa DVD Phim" + +#: src/mgui/author/output.cpp:63 +#, boost-format +msgid "_Cancel %1%" +msgstr "_Thôi %1%" + +#: src/mgui/author/output.cpp:64 +msgid "_Build DVD-Video" +msgstr "Xây dựng DVD Phim" + +#: src/mgui/author/output.cpp:161 +msgid "Select Output _Folder:" +msgstr "Chọn thư mục _kết xuất:" + +#: src/mgui/author/output.cpp:175 +msgid " Choose Author Mode: " +msgstr "Chọn chế độ tạo tác: " + +#. цель по умолчанию +#: src/mgui/author/output.cpp:181 +msgid "_Write DVD Folder" +msgstr "_Ghi thư mục DVD" + +#: src/mgui/author/output.cpp:182 +msgid "Write Disk _Image" +msgstr "Gh_i ảnh đĩa" + +#: src/mgui/author/output.cpp:191 +msgid "Disc Label: " +msgstr "Nhãn đĩa: " + +#: src/mgui/author/output.cpp:196 +msgid "Burn to _DVD" +msgstr "Chép vào _DVD" + +#: src/mgui/author/output.cpp:204 +msgid "DVD Drive: " +msgstr "Ổ đĩa DVD: " + +#: src/mgui/author/output.cpp:210 +msgid "Writing Speed: " +msgstr "Tốc độ ghi: " + +#: src/mgui/author/output.cpp:221 +msgid "_Rendering only" +msgstr "Chỉ _vẽ" + +#: src/mgui/author/output.cpp:275 +msgid "Rendering" +msgstr "Đang dựng hình" + +#: src/mgui/author/output.cpp:352 +msgid "DVD Burning" +msgstr "Chép ra đĩa DVD" + +#: src/mgui/author/output.cpp:396 +msgid "The result is here" +msgstr "Kết quả ở đây" + +#: src/mgui/author/output.cpp:398 +msgid "You can run authoring manually by executing command \"scons\" at the specified folder. Also, see README file for other options over there." +msgstr "Bạn cũng có thể tự thực hiện bằng cách chạy lệnh « scons » trong thư mục đưa ra. Cũng xem tập tin Đọc Đi (README) để tìm thêm tuỳ chọn." + +#. Translators: impossible to go on! +#: src/mgui/author/output.cpp:422 +msgid "Authoring is cancelled." +msgstr "Tiến trình tạo tác bị thôi." + +#: src/mgui/author/output.cpp:433 +#, boost-format +msgid "%1% is not a folder" +msgstr "%1% không phải là thư mục" + +#: src/mgui/author/output.cpp:444 +#, boost-format +msgid "Cant have full access to folder %1% (read, write)" +msgstr "Không thể truy cập hoàn toàn đến thư mục %1% (đọc và ghi)" + +#: src/mgui/author/output.cpp:452 +#, boost-format +msgid "" +"Folder %1% is not empty. We need to remove all files in it before authoring.\n" +"Continue?" +msgstr "" +"Thư mục %1% không trống. Có nên xoá bỏ tất cả các tập tin khỏi nó trước khi tạo dữ liệu mới.\n" +"Tiếp tục ?" + +#: src/mgui/author/output.cpp:458 +#, boost-format +msgid "Error during removing files: %1%" +msgstr "Gặp lỗi trong khi gỡ bỏ tập tin: %1%" + +#: src/mgui/author/output.cpp:629 +#, boost-format +msgid "%1% cancelled." +msgstr "%1% bị thôi." + +#: src/mgui/author/output.cpp:631 +#, boost-format +msgid "%1% broken." +msgstr "%1% bị hỏng." + +#. Translators: can be tranlated as "Operation "%1%" ..." +#: src/mgui/author/output.cpp:638 +#, boost-format +msgid "%1% successfully completed." +msgstr "Hoàn tất thành công chạy thao tác %1%." + +#: src/mgui/author/output.cpp:668 src/mgui/timeline/select.cpp:216 +#, boost-format +msgid "_Play in %1%" +msgstr "_Phát bằng %1%" + +#: src/mgui/author/output.cpp:669 +msgid "_Burn to DVD" +msgstr "_Chép vào DVD" + +#: src/mgui/author/script.cpp:392 +msgid "There is no media (video or menu)." +msgstr "Không có phương tiện (phim hay trình đơn)." + +#: src/mgui/author/script.cpp:557 +#, boost-format +msgid "external command failure: %1%" +msgstr "lỗi chạy câu lệnh mở ngoài: %1%" + +#: src/mgui/editor/select.cpp:499 +msgid "Delete" +msgstr "Xoá" + +#: src/mgui/editor/select.cpp:513 +msgid "Link" +msgstr "Liên kết" + +#: src/mgui/editor/select.cpp:517 +msgid "Remove Link" +msgstr "Gỡ bỏ liên kết" + +#. Poster Link +#: src/mgui/editor/select.cpp:521 +msgid "Set Poster" +msgstr "Lập bích chương" + +#: src/mgui/editor/select.cpp:530 +msgid "Align" +msgstr "Sắp hàng" + +#: src/mgui/editor/select.cpp:538 +msgid "Align Left" +msgstr "Sắp hàng bên trái" + +#: src/mgui/editor/select.cpp:539 +msgid "Align Right" +msgstr "Sắp hàng bên phải" + +#: src/mgui/editor/select.cpp:540 +msgid "Align Top" +msgstr "Sắp hàng bên trên" + +#: src/mgui/editor/select.cpp:541 +msgid "Align Bottom" +msgstr "Sắp hàng bên dưới" + +#: src/mgui/editor/select.cpp:544 +msgid "Center Horizontally" +msgstr "Đặt giữa ngang" + +#: src/mgui/editor/select.cpp:545 +msgid "Center Vertically" +msgstr "Đặt giữa dọc" + +#. Set Background Color +#: src/mgui/editor/select.cpp:550 src/mgui/editor/select.cpp:802 +msgid "Set Background Color..." +msgstr "Chọn màu nền..." + +#. Selection Tool +#: src/mgui/editor/toolbar.cpp:129 +msgid "Selection Tool" +msgstr "Công cụ Lựa chọn" + +#. Text Tool +#: src/mgui/editor/toolbar.cpp:132 +msgid "Text Tool" +msgstr "Công cụ Văn bản" + +#: src/mgui/editor/toolbar.cpp:493 +msgid "Add Item" +msgstr "Thêm mục" + +#: src/mgui/editor/toolbar.cpp:515 +msgid "Font Name" +msgstr "Tên phông chữ" + +#: src/mgui/editor/toolbar.cpp:531 +msgid "Font Size" +msgstr "Cỡ phông chữ" + +#. * кнопки стилей шрифта +#: src/mgui/editor/toolbar.cpp:536 +msgid "Bold" +msgstr "Đậm" + +#: src/mgui/editor/toolbar.cpp:537 +msgid "Italic" +msgstr "Nghiêng" + +#: src/mgui/editor/toolbar.cpp:538 +msgid "Underline" +msgstr "Gạch dưới" + +#: src/mgui/editor/toolbar.cpp:547 +msgid "Pick a Color for Text" +msgstr "Chọn màu chữ" + +#: src/mgui/editor/toolbar.cpp:549 +msgid "Text Color" +msgstr "Màu chữ" + +#: src/mgui/editor/toolbar.cpp:561 +msgid "Show Safe Area" +msgstr "Hiện vùng an toàn" + +#: src/mgui/project/browser.cpp:128 +#, boost-format +msgid "Do you really want to delete \"%1%\" from Media List?" +msgstr "Bạn có chắc muốn xoá « %1% » khỏi Danh sách Nhạc/Phim không?" + +#: src/mgui/project/browser.cpp:129 +#, boost-format +msgid "Do you really want to delete chapter \"%1%\"?" +msgstr "Bạn thực sự muốn xoá tập « %1% » không?" + +#: src/mgui/project/browser.cpp:130 +#, boost-format +msgid "Do you really want to delete menu \"%1%\"?" +msgstr "Bạn thực sự muốn xoá trình đơn « %1% » không?" + +#: src/mgui/project/browser.cpp:242 +msgid "First-Play media can be Video or Menu only." +msgstr "Phương tiện Phát-Trước chỉ có thể là Phim hay Trình đơn." + +#: src/mgui/project/mconstructor.cpp:132 +msgid "Save Project As..." +msgstr "Lưu dự án dạng..." + +#: src/mgui/project/mconstructor.cpp:169 +#, boost-format +msgid "Cant open project file \"%1%\"" +msgstr "Không thể mở tập tin dự án « %1% »" + +#: src/mgui/project/mconstructor.cpp:465 +msgid "Bombono DVD is a DVD authoring program with nice and clean GUI" +msgstr "Bombono DVD là một chương trình tạo đĩa DVD có một giao diện đồ họa đẹp và thân thiện với người dùng" + +#. dlg.set_authors(authors); +#. dlg.set_documenters(documenters); +#. dlg.set_decorated(false); +#: src/mgui/project/mconstructor.cpp:470 +msgid "translator-credits" +msgstr "Clytie Siddall (clytie@riverland.net.au)" + +#: src/mgui/project/mconstructor.cpp:611 +#, boost-format +msgid "Save changes to \"%1%\"?" +msgstr "Lưu các thay đổi vào %1% ?" + +#: src/mgui/project/mconstructor.cpp:613 +msgid "Close _without Saving" +msgstr "Đóng mà _không lưu" + +#: src/mgui/project/mconstructor.cpp:653 +msgid "New Project" +msgstr "Dự án mới" + +#: src/mgui/project/mconstructor.cpp:662 +msgid "Please select a Television standard for your project:" +msgstr "Hãy chọn một tiêu chuẩn TV cho dự án này:" + +#: src/mgui/project/mconstructor.cpp:687 +msgid "Open Project" +msgstr "Mở dự án" + +#: src/mgui/project/mconstructor.cpp:691 +msgid "Project files (*.xml)" +msgstr "Tập tin dự án (*.xml)" + +#: src/mgui/project/mconstructor.cpp:696 src/mgui/timeline/mviewer.cpp:273 +msgid "All Files (*.*)" +msgstr "Mọi tập tin (*.*)" + +#. раньше Brasero использовал KiB, MiB и GiB, как более точные технически +#. (вроде как размеры HDD принято измерять по 1GB=1000MB); теперь Brasero +#. перешел на стандарт KB/MB/GB, ну и BmD тоже (а че, мы не гордые :) +#: src/mgui/project/mconstructor.cpp:824 +msgid "KB" +msgstr "KB" + +#: src/mgui/project/mconstructor.cpp:824 +msgid "GB" +msgstr "GB" + +#. Project +#: src/mgui/project/mconstructor.cpp:935 +msgid "_Project" +msgstr "_Dự án" + +#: src/mgui/project/mconstructor.cpp:940 +msgid "_New Project" +msgstr "Dự á_n mới" + +#: src/mgui/project/mconstructor.cpp:942 +msgid "_Open..." +msgstr "_Mở..." + +#: src/mgui/project/mconstructor.cpp:944 +msgid "_Save" +msgstr "_Lưu" + +#: src/mgui/project/mconstructor.cpp:946 +msgid "Save _As..." +msgstr "Lưu _dạng..." + +#: src/mgui/project/mconstructor.cpp:948 +msgid "_Quit" +msgstr "T_hoát" + +#: src/mgui/project/mconstructor.cpp:950 +msgid "Add Videos from _DVD" +msgstr "Thêm phim từ _DVD" + +#: src/mgui/project/mconstructor.cpp:950 +msgid "DVD-Import Assistant" +msgstr "Trợ lý nhập DVD" + +#: src/mgui/project/mconstructor.cpp:952 +msgid "_Mux" +msgstr "_Kết hợp lại" + +#: src/mgui/project/mconstructor.cpp:952 +msgid "Mux Elementary Streams into MPEG2" +msgstr "Kết hợp lại các luồng cơ bản thành MPEG2" + +#: src/mgui/project/mconstructor.cpp:954 +msgid "Pr_eferences" +msgstr "T_uỳ thích" + +#. Go +#: src/mgui/project/mconstructor.cpp:993 +msgid "_Go" +msgstr "_Tới" + +#. первый вставляем сразу +#. Help +#: src/mgui/project/mconstructor.cpp:999 +msgid "_Help" +msgstr "Trợ g_iúp" + +#: src/mgui/project/mconstructor.cpp:1100 +msgctxt "MainTabs" +msgid "_Source" +msgstr "_Nguồn" + +#: src/mgui/project/mconstructor.cpp:1102 +msgctxt "MainTabs" +msgid "_Menu" +msgstr "T_rình đơn" + +#: src/mgui/project/mconstructor.cpp:1104 +msgctxt "MainTabs" +msgid "_Output" +msgstr "_Xuất" + +#: src/mgui/project/mb-actions.cpp:142 +msgid "yes" +msgstr "có" + +#: src/mgui/project/mb-actions.cpp:142 +msgid "no" +msgstr "không" + +#: src/mgui/project/mb-actions.cpp:191 +msgid "Video bitrate" +msgstr "Tỷ lệ bit phim" + +#: src/mgui/project/mb-actions.cpp:192 +msgid "kbps" +msgstr "kb/giây" + +#: src/mgui/project/mb-actions.cpp:193 +msgid "Maximum data rate for video (9800 kbps) is exceeded." +msgstr "Vượt quá tốc độ dữ liệu cho phim (9800 kilô-byte/giây)." + +#: src/mgui/project/mb-actions.cpp:196 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with resolutions: %2% only." +msgstr "Đĩa DVD Phim %1% chỉ chấp nhận định dạng MPEG-2 có độ phân giải %2%." + +#: src/mgui/project/mb-actions.cpp:197 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with frame rate: %2% only." +msgstr "Đĩa DVD Phim %1% chỉ chấp nhận định dạng MPEG-2 có tỷ lệ khung %2%." + +#: src/mgui/project/mb-actions.cpp:198 +#, boost-format +msgid "The %1% DVD-Video can accept MPEG-2 with aspects 4:3, 16:9 only." +msgstr "Đĩa DVD Phim %1% chỉ chấp nhận định dạng MPEG-2 có tỷ lệ hình thể 4:3 hay 16:9." + +#: src/mgui/project/mb-actions.cpp:218 +msgid "Video size" +msgstr "Kích cỡ phim" + +#: src/mgui/project/mb-actions.cpp:238 +msgid "Frame rate" +msgstr "Tỷ lệ khung" + +#: src/mgui/project/mb-actions.cpp:239 +msgid "fps" +msgstr "khung/giây" + +#: src/mgui/project/mb-actions.cpp:247 +msgid "Aspect ratio" +msgstr "Tỷ lệ hình thể" + +#: src/mgui/project/mb-actions.cpp:322 +msgid "Bombono DVD can use \"DVD-ready\" video only now. Use muxing programs like \"mplex -f 8\" (from mjpegtools), mencoder (from mplayer) or transcode to make your video ready for Bombono DVD." +msgstr "Bombono DVD giờ có khả năng sử dụng chỉ phim « sẵn sàng cho đĩa DVD ». Hãy dùng chương trình kết hợp lại (muxer) như « mplex -f 8 » (từ bộ công cụ mjpegtools), mencoder (từ mplayer) hay transcode để chuẩn bị phim cho trình Bombono DVD." + +#: src/mgui/project/mb-actions.cpp:326 +msgid "DVD packs" +msgstr "Bó DVD" + +#: src/mgui/project/mb-actions.cpp:328 +msgid "NAV packets" +msgstr "Gói tin NAV" + +#: src/mgui/project/mb-actions.cpp:334 +msgid "This video may not be added due to (errors in red color):" +msgstr "Phim này có thể không được thêm do (lỗi trong màu đỏ):" + +#. подскажем пользователю, что он ошибся форматом проекта +#: src/mgui/project/mb-actions.cpp:345 +#, boost-format +msgid "This video has %1% type and can't be added to current project of %2% type. Create new project from menu \"Project->New Project\" with right type." +msgstr "Phim này có kiểu %1% thì không thêm được vào dự án kiểu %2%. Hãy tạo một dự án mới trong trình đơn « Dự án > Dự án mới », cũng gán kiểu đúng." + +#: src/mgui/project/mb-actions.cpp:373 +msgid "File doesn't exist." +msgstr "Tập tin không tồn tại." + +#: src/mgui/project/mb-actions.cpp:378 +msgid "Folders can't be added." +msgstr "Không thêm được thư mục." + +#. по расширению выводим наиболее вероятную ошибку +#: src/mgui/project/mb-actions.cpp:413 +msgid "Unknown file type." +msgstr "Không rõ dạng tập tin." + +#: src/mgui/project/mb-actions.cpp:631 +#, boost-format +msgid "" +"The file \"%1%\" looks like VOB from DVD.\n" +"Run import?" +msgstr "" +"Tập tin « %1% » hình như VOB từ đĩa DVD.\n" +"Chạy tiến trình nhập vào ?" + +#: src/mgui/project/mb-actions.cpp:648 +#, boost-format +msgid "The file \"%1%\" looks like elementary stream and need to be muxed before using. Run muxing?" +msgstr "Tập tin « %1% » hình như một luồng cơ bản thì cần phải được kết hợp lại (mux) trước khi sử dụng. Chạy tiến trình kết hợp lại ?" + +#: src/mgui/project/mb-actions.cpp:710 +msgid "Also:" +msgstr "Cũng: " + +#: src/mgui/project/mb-actions.cpp:719 +#, boost-format +msgid "See more about preparing video for authoring in online help." +msgstr "Xem thêm về chuẩn bị phim để tạo đĩa trong trợ giúp trực tuyến." + +#: src/mgui/project/mb-actions.cpp:727 +#, boost-format +msgid "Can't add file \"%1%\"." +msgstr "Không thêm được tập tin « %1% »." + +#: src/mgui/project/mb-actions.cpp:730 +msgid "Can't add files:" +msgstr "Không thể thêm những tập tin:" + +#: src/mgui/project/media-browser.cpp:146 +msgid "Previous Menu" +msgstr "Trình đơn trước" + +#: src/mgui/project/media-browser.cpp:146 +#: src/mgui/project/media-browser.cpp:148 +msgid "Next Video" +msgstr "Phim tiếp" + +#: src/mgui/project/media-browser.cpp:147 +#, boost-format +msgid "Auto (%1%)" +msgstr "Tự động (%1%)" + +#: src/mgui/project/media-browser.cpp:177 +msgid "End Action" +msgstr "Kết thúc hành vi" + +#: src/mgui/project/media-browser.cpp:201 +msgid "Still Picture" +msgstr "Ảnh tĩnh" + +#: src/mgui/project/media-browser.cpp:233 +msgid "Type" +msgstr "Kiểu" + +#. // не меньше чем размер шрифта элемента в списке +#. Gtk::Label& label = *Gtk::manage(new Gtk::Label("Media List")); +#. label.set_use_markup(true); +#. vbox.pack_start(label, Gtk::PACK_SHRINK); +#. Gtk::Requisition req = label.size_request(); +#. label.set_size_request(0, req.height+10); +#: src/mgui/project/media-browser.cpp:291 +#: src/mgui/project/menu-browser.cpp:373 +msgid "Media List" +msgstr "Danh sách Nhạc/Phim" + +#: src/mgui/project/media-browser.cpp:331 +msgid "Add Media from File Browser" +msgstr "Thêm nhạc/phim từ Bộ Quản lý Tập tin" + +#: src/mgui/project/media-browser.cpp:340 +msgid "Remove Media" +msgstr "Bỏ nhạc/phim" + +#: src/mgui/project/media-browser.cpp:351 +msgid "Make Chapters for Video" +msgstr "Chia phim ra các tập" + +#: src/mgui/project/menu-browser.cpp:190 +msgid "No Link" +msgstr "Không có liên kết" + +#. * subj +#: src/mgui/project/menu-browser.cpp:337 +msgid "Menu List" +msgstr "Danh sách Trình đơn" + +#: src/mgui/project/menu-browser.cpp:353 +msgid "Add Menu" +msgstr "Thêm trình đơn" + +#: src/mgui/project/menu-browser.cpp:358 +msgid "Remove Menu" +msgstr "Bỏ trình đơn" + +#: src/mgui/project/menu-browser.cpp:363 +msgid "Edit Menu" +msgstr "Sửa trình đơn" + +#. Add +#: src/mgui/timeline/layout.cpp:526 src/mgui/timeline/select.cpp:193 +msgid "Add Chapter Point" +msgstr "Thêm điểm Tập " + +#. 0 надпись +#: src/mgui/timeline/mviewer.cpp:239 +msgid "File Browser" +msgstr "Bộ duyệt tập tin" + +#: src/mgui/timeline/mviewer.cpp:269 +msgid "All formats" +msgstr "Mọi định dạng" + +#: src/mgui/timeline/mviewer.cpp:270 +msgid "MPEG files" +msgstr "Tập tin MPEG" + +#: src/mgui/timeline/mviewer.cpp:272 +msgid "Still Images" +msgstr "Ảnh tĩnh" + +#: src/mgui/timeline/select.cpp:127 +msgid "Save Frame..." +msgstr "Lưu khung..." + +#. Add at Intervals +#: src/mgui/timeline/select.cpp:147 src/mgui/timeline/select.cpp:205 +msgid "Add Chapter Points at Intervals" +msgstr "Thêm điểm Tập theo khoảng" + +#: src/mgui/timeline/select.cpp:153 +msgid "Interval between Chapters:" +msgstr "Khoảng giữa hai Tập:" + +#: src/mgui/timeline/select.cpp:160 +msgid "min." +msgstr "phút" + +#: src/mgui/timeline/select.cpp:163 +msgid "Remove Existing Chapters" +msgstr "Bỏ các Tập đã có" + +#. Delete +#: src/mgui/timeline/select.cpp:196 +msgid "Delete Chapter Point" +msgstr "Xoá điểm Tập" + +#. Delete All +#: src/mgui/timeline/select.cpp:200 +msgid "Delete All Chapter Points" +msgstr "Xoá mọi điểm Tập" + +#: src/mgui/timeline/select.cpp:213 +msgid "Save Current Frame" +msgstr "Lưu khung hiện tại" diff -Nru bombono-dvd-0.5.2/prjs/Atom.vpw bombono-dvd-0.6.0/prjs/Atom.vpw --- bombono-dvd-0.5.2/prjs/Atom.vpw 2008-10-03 20:36:14.000000000 +0100 +++ bombono-dvd-0.6.0/prjs/Atom.vpw 1970-01-01 01:00:00.000000000 +0100 @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru bombono-dvd-0.5.2/prjs/boost-lib.vpj bombono-dvd-0.6.0/prjs/boost-lib.vpj --- bombono-dvd-0.5.2/prjs/boost-lib.vpj 2009-04-18 20:38:45.000000000 +0100 +++ bombono-dvd-0.6.0/prjs/boost-lib.vpj 2010-04-16 12:53:55.000000000 +0100 @@ -183,6 +183,7 @@ + @@ -192,6 +193,10 @@ + + + + @@ -206,6 +211,10 @@ + + + + @@ -249,6 +258,8 @@ + + @@ -338,6 +349,7 @@ + @@ -352,6 +364,7 @@ + @@ -413,6 +426,7 @@ + @@ -422,6 +436,7 @@ + @@ -439,8 +454,13 @@ + + + + + @@ -470,6 +490,7 @@ + @@ -521,6 +542,8 @@ + + @@ -636,6 +659,7 @@ + @@ -677,6 +701,7 @@ + @@ -861,6 +886,7 @@ + @@ -889,6 +915,8 @@ + + diff -Nru bombono-dvd-0.5.2/prjs/mbase.vpj bombono-dvd-0.6.0/prjs/mbase.vpj --- bombono-dvd-0.5.2/prjs/mbase.vpj 2009-06-18 13:34:27.000000000 +0100 +++ bombono-dvd-0.6.0/prjs/mbase.vpj 2010-04-16 12:53:55.000000000 +0100 @@ -184,6 +184,7 @@ + @@ -201,6 +202,8 @@ + + diff -Nru bombono-dvd-0.5.2/prjs/mgui_tests.vpj bombono-dvd-0.6.0/prjs/mgui_tests.vpj --- bombono-dvd-0.5.2/prjs/mgui_tests.vpj 2009-07-27 22:44:17.000000000 +0100 +++ bombono-dvd-0.6.0/prjs/mgui_tests.vpj 2010-04-16 12:53:55.000000000 +0100 @@ -203,10 +203,12 @@ + + diff -Nru bombono-dvd-0.5.2/prjs/mgui.vpj bombono-dvd-0.6.0/prjs/mgui.vpj --- bombono-dvd-0.5.2/prjs/mgui.vpj 2009-04-09 12:08:12.000000000 +0100 +++ bombono-dvd-0.6.0/prjs/mgui.vpj 2010-04-16 12:53:55.000000000 +0100 @@ -194,65 +194,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -275,7 +216,9 @@ + + @@ -300,10 +243,12 @@ + + @@ -335,5 +280,70 @@ Filters=""> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru bombono-dvd-0.5.2/prjs/mlib.vpj bombono-dvd-0.6.0/prjs/mlib.vpj --- bombono-dvd-0.5.2/prjs/mlib.vpj 2009-04-03 20:44:06.000000000 +0100 +++ bombono-dvd-0.6.0/prjs/mlib.vpj 2010-04-16 12:53:55.000000000 +0100 @@ -202,6 +202,7 @@ + @@ -219,6 +220,7 @@ + Binary files /tmp/pq9PsVFcno/bombono-dvd-0.5.2/resources/copy-n-paste/lpetool_show_bbox.png and /tmp/1HeDGEIqNv/bombono-dvd-0.6.0/resources/copy-n-paste/lpetool_show_bbox.png differ diff -Nru bombono-dvd-0.5.2/resources/scons_authoring/ADVD.py bombono-dvd-0.6.0/resources/scons_authoring/ADVD.py --- bombono-dvd-0.5.2/resources/scons_authoring/ADVD.py 2009-08-19 21:25:03.000000000 +0100 +++ bombono-dvd-0.6.0/resources/scons_authoring/ADVD.py 2010-04-16 12:53:55.000000000 +0100 @@ -2,15 +2,20 @@ # coding: utf-8 import SConsTwin +import ASettings def MakeMenu(env): # 1 - m2v # '-a' - аспект: (1 - 1:1) 2 - 4:3, 3 - 16:9 (4 - 2.21:1) aspect = '2' + if not ASettings.Is4_3: + aspect = '3' # возможные опции оптимизации: -b , -q , -H # однако отображение в totem все равно гораздо хуже, чем снимок того же кадра, сделанного в totem! options = "-f 8" - env.Command('Menu.m2v', 'Menu.png', "png2yuv -n 1 -I p -f 25 -j $SOURCE | mpeg2enc -a " + aspect + " " + options + " -o $TARGET") + # 'n -1' sucks: need to generate two frames (n -2) + # for much better encoding quality with mpeg2enc (thanks to stagediverr) + env.Command('Menu.m2v', 'Menu.png', "png2yuv -n 2 -I p -f 25 -j $SOURCE | mpeg2enc -a " + aspect + " " + options + " -o $TARGET") # 2 - mpg env.Command('Menu.mpg', ['Menu.m2v', '#Silent.mp2'], "mplex -f 8 -o $TARGET $SOURCES") diff -Nru bombono-dvd-0.5.2/resources/scons_authoring/README bombono-dvd-0.6.0/resources/scons_authoring/README --- bombono-dvd-0.5.2/resources/scons_authoring/README 2009-01-31 20:27:30.000000000 +0000 +++ bombono-dvd-0.6.0/resources/scons_authoring/README 2010-04-16 12:53:55.000000000 +0100 @@ -1,6 +1,10 @@ -1. Заавторить в папку dvd - "scons" -2. Все удалить - "scons -c" -3. Проиграть результат в totem - "scons totem" -4. Сделать iso-образ - "scons dvd.iso" -5. Прожечь образ (/dev/dvd) - "scons burn" +Adjust DVDAuthor.xml, Menu.xml and other files and use +one of the commands: + +1. Write DVD Folder - "scons" +2. Clean - "scons -c" +3. Play Authored DVD in Totem - "scons totem" +3.1. --||-- in Xine - "scons xine" +4. Write Disk Image (.iso) - "scons dvd.iso" +5. Burn to DVD - "scons burn" diff -Nru bombono-dvd-0.5.2/resources/scons_authoring/README-ru bombono-dvd-0.6.0/resources/scons_authoring/README-ru --- bombono-dvd-0.5.2/resources/scons_authoring/README-ru 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/resources/scons_authoring/README-ru 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,6 @@ +1. Заавторить в папку dvd - "scons" +2. Все удалить - "scons -c" +3. Проиграть результат в totem - "scons totem" +4. Сделать iso-образ - "scons dvd.iso" +5. Прожечь образ (/dev/dvd) - "scons burn" + diff -Nru bombono-dvd-0.5.2/resources/scons_authoring/SConstruct bombono-dvd-0.6.0/resources/scons_authoring/SConstruct --- bombono-dvd-0.5.2/resources/scons_authoring/SConstruct 2009-08-19 21:24:41.000000000 +0100 +++ bombono-dvd-0.6.0/resources/scons_authoring/SConstruct 2010-04-16 12:53:55.000000000 +0100 @@ -1,7 +1,7 @@ #!/usr/bin/env python # coding: utf-8 -from SConsTwin import MakeGenAction +from SConsTwin import MakeGenAction, IsSConsVersionGE import os # поменьше служебных файлов на виду @@ -10,29 +10,26 @@ os.makedirs(tmp_dir) SConsignFile(tmp_dir + os.sep + '.sconsign') +if not IsSConsVersionGE((1, 1, 0)): + # до 1.1.0 md5 считалось чтением в строку (память) содержимого всего файла, + # что для гигабайтных файлов фатально + # Замечание: реально не вылетает если отключить вычисление csig, а не установкой + # SourceSignatures('timestamp'); потому что csig вычисляется всегда, "на всякий случай" для <= 1.1.0 + from SCons.Node.FS import FileNodeInfo + FileNodeInfo.field_list.remove('csig') + + SourceSignatures('timestamp') + # нужен правильный $PATH и т.д. # просто Replace() не дают сделать DefaultEnvironment().Replace(ENV = os.environ) # звук тишины для неподвижных меню def GetkHzArgForToolame(kHz): - import os - import re - #s = "tooLAME version 0.2l" - s = os.popen("toolame -v").read() - #print s - - m = re.compile("tooLAME version 0\.2(.)", re.M).search(s) - - res = kHz - if m and m.group(1) == 'l': - pass # classic toolame - else: - res = res * 1000 # twolame or similar - return res + return kHz * 1000 argHz = GetkHzArgForToolame(48) -Command('Silent.mp2', [], "dd if=/dev/zero bs=4 count=1920 | toolame -b 128 -s %d /dev/stdin $TARGET" % argHz) +Command('Silent.mp2', [], "dd if=/dev/zero bs=4 count=1920 | twolame -b 128 -s %d -r - $TARGET" % argHz) # основная функция создания меню import ADVD @@ -100,10 +97,17 @@ # * воспроизвести результат в Totem # # всю директорию указывать нельзя - scons будет пытаться со всех файлов брать md5="тупить на 4Gb" -def GenTotemAction(source, target, env, for_signature): - return "totem dvd://%s" % (GetDVDDir(source[0], 1)) # 'totem dvd://${SOURCES[0].abspath}') +def GenPlayerAction(player_name): + def GenAction(source, target, env, for_signature): + return player_name + " dvd://%s" % (GetDVDDir(source[0], 1)) # 'totem dvd://${SOURCES[0].abspath}') + return GenAction + +def MakePlayerCommand(player_name): + MakeAbstractCommandForDVDDir(player_name, GenPlayerAction(player_name)) + +MakePlayerCommand("totem") +MakePlayerCommand("xine") -MakeAbstractCommandForDVDDir("totem", GenTotemAction) DVDLabelOption = '' if DVDLabel: diff -Nru bombono-dvd-0.5.2/SConstruct bombono-dvd-0.6.0/SConstruct --- bombono-dvd-0.5.2/SConstruct 2009-09-27 12:44:34.000000000 +0100 +++ bombono-dvd-0.6.0/SConstruct 2010-04-16 12:53:55.000000000 +0100 @@ -487,8 +487,6 @@ # prefix = user_options_dict['PREFIX'] -inst_data_prefix = os.path.join(prefix, 'share', 'bombono') -user_options_dict['INST_DATA_PREFIX'] = inst_data_prefix dest_dir = str(user_options_dict['DESTDIR']) def MakeEndPrefix(prefix_name, f_arg, *args, **kw): @@ -501,14 +499,20 @@ MakeEndPrefix('DEST_PREFIX', prefix) bin_prefix = MakeEndPrefix('BIN_PREFIX', prefix, 'bin') -data_prefix = MakeEndPrefix('DATA_PREFIX', inst_data_prefix, add_to_dict=0) +data_prefix = MakeEndPrefix('DATA_PREFIX', prefix, 'share', 'bombono', add_to_dict=0) mgui_env.Alias('install', [bin_prefix, data_prefix]) # resources BV.InstallDir(mgui_env, data_prefix, "resources") +user_options_dict['XGETTEXT_SOURCES'] = [] +def AddSourcesForXgettext(src_files): + user_options_dict['XGETTEXT_SOURCES'] += [ File(src) for src in src_files ] +user_options_dict['AddSourcesForXgettext'] = AddSourcesForXgettext + SConscript([ BV.BuildDir+'/SConscript', BV.BuildDir+'/src/SConscript', + BV.BuildDir+'/po/SConscript', ]) diff -Nru bombono-dvd-0.5.2/src/mbase/composite/component.cpp bombono-dvd-0.6.0/src/mbase/composite/component.cpp --- bombono-dvd-0.5.2/src/mbase/composite/component.cpp 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mbase/composite/component.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -2,7 +2,7 @@ // mbase/composite/composite.cpp // This file is part of Bombono DVD project. // -// Copyright (c) 2007-2008 Ilya Murav'jov +// Copyright (c) 2007-2008, 2010 Ilya Murav'jov // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -20,27 +20,10 @@ // #include "component.h" -#include - -MediaLink::MediaLink(Comp::Object* own): owner(own) -{ - ASSERT( owner ); -} - -MediaLink::~MediaLink() -{ - ResetLink(owner, Project::MediaItem(), link); -} - -void MediaLink::SetLink(Project::MediaItem mi) -{ - ResetLink(owner, mi, link); - link = mi; -} namespace Composition { -FramedObj::FramedObj(const char* thm_name, Rect plc) +FramedObj::FramedObj(const char* thm_name, Rect plc): pstrLink(this) { //Load(thm_path, plc); SetPlacement(plc); diff -Nru bombono-dvd-0.5.2/src/mbase/composite/component.h bombono-dvd-0.6.0/src/mbase/composite/component.h --- bombono-dvd-0.5.2/src/mbase/composite/component.h 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mbase/composite/component.h 2010-04-16 12:53:55.000000000 +0100 @@ -2,7 +2,7 @@ // mbase/composite/component.h // This file is part of Bombono DVD project. // -// Copyright (c) 2007-2008 Ilya Murav'jov +// Copyright (c) 2007-2008, 2010 Ilya Murav'jov // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -22,33 +22,66 @@ #ifndef __MBASE_COMPOSITE_COMPONENT_H__ #define __MBASE_COMPOSITE_COMPONENT_H__ -#include +#include "comp_vis.h" + #include -#include "comp_vis.h" +#include + +class MILinkList; -class MediaLink +class CommonMediaLink { public: - MediaLink(Comp::Object* own); - ~MediaLink(); - + CommonMediaLink(Comp::Object* own); + virtual ~CommonMediaLink() {} + Project::MediaItem Link() { return link; } void SetLink(Project::MediaItem mi); void ClearLink() { SetLink(Project::MediaItem()); } // симуляция MediaItem operator Project::MediaItem() { return link; } - MediaLink& operator =(Project::MediaItem mi) - { - SetLink(mi); - return *this; - } + //CommonMediaLink& operator =(Project::MediaItem mi) + // { + // SetLink(mi); + // return *this; + // } - protected: + virtual MILinkList& GetLinks() = 0; + protected: Project::MediaItem link; Comp::Object* owner; + + private: + CommonMediaLink(); // не требуется; не нужны + CommonMediaLink(const CommonMediaLink&); + CommonMediaLink& operator =(const CommonMediaLink&); + + +void ResetLink(Project::MediaItem new_ref, Project::MediaItem old_ref); +}; + +class MediaLink: public CommonMediaLink +{ + typedef CommonMediaLink MyParent; + public: + + MediaLink(Comp::Object* own): MyParent(own) {} + ~MediaLink() { ClearLink(); } + + virtual MILinkList& GetLinks(); +}; + +class PosterLink: public CommonMediaLink +{ + typedef CommonMediaLink MyParent; + public: + PosterLink(Comp::FramedObj* own); + ~PosterLink() { ClearLink(); } + + virtual MILinkList& GetLinks(); }; namespace Composition { @@ -92,11 +125,13 @@ FramedObj(const char* thm_name, Rect plc); std::string& Theme() { return thmName; } + PosterLink& PosterItem() { return pstrLink; } //void Load(const char* thm_name, Rect& plc); - protected: - std::string thmName; + protected: + std::string thmName; + PosterLink pstrLink; }; diff -Nru bombono-dvd-0.5.2/src/mbase/obj_bind.cpp bombono-dvd-0.6.0/src/mbase/obj_bind.cpp --- bombono-dvd-0.5.2/src/mbase/obj_bind.cpp 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mbase/obj_bind.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -2,7 +2,7 @@ // mbase/obj_bind.cpp // This file is part of Bombono DVD project. // -// Copyright (c) 2008 Ilya Murav'jov +// Copyright (c) 2008, 2010 Ilya Murav'jov // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -23,13 +23,61 @@ #include "obj_bind.h" -MenuLink::MenuLink(Project::MediaItem ref_, Comp::Object* subj_) +#include + +#include + +struct MILink +{ + Project::MediaItem ref; + // -1 - ищем связи только по ref, нижняя граница + // 0 - по ref и subj (полный индекс) + // 1 - только по ref, верхняя граница + int subjDef; + Comp::Object* subj; + + // для поиска по полному ключу + // (без нулевых значений) + MILink(Project::MediaItem ref, Comp::Object* subj); + // для поиска по ref + MILink(Project::MediaItem ref, bool is_lower); + + void SetBound(bool is_lower) { subjDef = is_lower ? -1 : 1; } + private: + MILink(); // запрещен +}; + +struct MILinkLessOp +{ + bool operator()(const MILink& e1, const MILink& e2) const; +}; + +// +// MILinkList - связи пунктов меню с медиа (их содержимым): +// MenuRegion -> bgRef +// MediaObj -> mdItem +// +typedef std::set MILinkListType; + +class MILinkList: public MILinkListType +{ + typedef MILinkListType MyParent; + public: + + typedef MyParent::iterator Itr; +}; + +// список пунктов меню, связанных с ref +typedef std::pair MenuLinkRange; +MenuLinkRange LinkedObjects(Project::MediaItem ref); + +MILink::MILink(Project::MediaItem ref_, Comp::Object* subj_) : ref(ref_), subjDef(0), subj(subj_) { ASSERT( ref && subj ); } -MenuLink::MenuLink(Project::MediaItem ref_, bool is_lower) +MILink::MILink(Project::MediaItem ref_, bool is_lower) : ref(ref_), subjDef(0), subj(0) { SetBound(is_lower); @@ -52,7 +100,7 @@ return res; } -bool MenuLinkLessOp::operator()(const MenuLink& e1, const MenuLink& e2) const +bool MILinkLessOp::operator()(const MILink& e1, const MILink& e2) const { bool cmp_res; if( CompareComponent(e1.ref, e2.ref, cmp_res) || @@ -63,17 +111,17 @@ return false; } -void ResetLink(Comp::Object* obj, Project::MediaItem new_ref, Project::MediaItem old_ref) +// установить/изменить/удалить связь +void ResetLink(MILinkList& Set, Comp::Object* obj, Project::MediaItem new_ref, Project::MediaItem old_ref) { ASSERT( obj ); - MenuLinkList& Set = MenuLinkList::Instance(); - MenuLinkList::Itr end = Set.end(); + MILinkList::Itr end = Set.end(); // * удаляем старую связь if( old_ref ) { - MenuLink lnk(old_ref, obj); - MenuLinkList::Itr it = Set.find(lnk); + MILink lnk(old_ref, obj); + MILinkList::Itr it = Set.find(lnk); ASSERT( it != end ); Set.erase(it); } @@ -81,24 +129,111 @@ // * создаем новую if( new_ref ) { - bool res = Set.insert(MenuLink(new_ref, obj)).second; + bool res = Set.insert(MILink(new_ref, obj)).second; ASSERT( res ); } } -MenuLinkRange LinkedObjects(Project::MediaItem ref) +MenuLinkRange LinkedObjects(MILinkList& Set, Project::MediaItem ref) { - MenuLinkList& Set = MenuLinkList::Instance(); - MenuLinkList::Itr end = Set.end(); + MILinkList::Itr end = Set.end(); if( !ref ) return std::make_pair(end, end); - MenuLink lnk(ref, true); - MenuLinkList::Itr from = Set.lower_bound(lnk); + MILink lnk(ref, true); + MILinkList::Itr from = Set.lower_bound(lnk); lnk.SetBound(false); - MenuLinkList::Itr to = Set.upper_bound(lnk); + MILinkList::Itr to = Set.upper_bound(lnk); return std::make_pair(from, to); } +void ForeachLinked(MILinkList& links, Project::MediaItem mi, CompObjectFunctor fnr) +{ + for( MenuLinkRange rng = LinkedObjects(links, mi); rng.first != rng.second ; ) + { + ASSERT( rng.first->ref == mi ); + Comp::Object* obj = rng.first->subj; + ASSERT( obj ); + ++rng.first; // чтоб можно было удалять ссылки в цикле + + fnr(obj); + } +} + +MILinkList& MenuLinks() +{ + static MILinkList List; + return List; +} + +MILinkList& PosterLinks() +{ + static MILinkList List; + return List; +} + +////////////////////////////////// +// MediaLink + +void CommonMediaLink::SetLink(Project::MediaItem mi) +{ + ResetLink(mi, link); + link = mi; +} + +CommonMediaLink::CommonMediaLink(Comp::Object* own): owner(own) +{ + ASSERT( owner ); +} + +void CommonMediaLink::ResetLink(Project::MediaItem new_ref, Project::MediaItem old_ref) +{ + ::ResetLink(GetLinks(), owner, new_ref, old_ref); +} + +MILinkList& MediaLink::GetLinks() +{ + return MenuLinks(); +} + +PosterLink::PosterLink(Comp::FramedObj* own): MyParent(own) {} + +MILinkList& PosterLink::GetLinks() +{ + return PosterLinks(); +} + +////////////////////////////////// +// API + +void ForeachLinked(Project::MediaItem mi, CompObjectFunctor fnr) +{ + ForeachLinked(MenuLinks(), mi, fnr); +} + +static void PosterFunctorImpl(Comp::Object* obj, const Composition::FOFunctor& fnr) +{ + // только ради страховки проверяем + Comp::FramedObj* f_obj = dynamic_cast(obj); + ASSERT( f_obj ); + + fnr(*f_obj); +} + +void ForeachWithPoster(Project::MediaItem mi, Composition::FOFunctor fnr) +{ + ForeachLinked(PosterLinks(), mi, bl::bind(&PosterFunctorImpl, bl::_1, boost::ref(fnr))); +} + +// удостовериться, что все связей нет +void CheckObjectLinksEmpty() +{ + // видеопереходы + ASSERT( MenuLinks().empty() ); + // постеры для кнопок + ASSERT( PosterLinks().empty() ); +} + + diff -Nru bombono-dvd-0.5.2/src/mbase/obj_bind.h bombono-dvd-0.6.0/src/mbase/obj_bind.h --- bombono-dvd-0.5.2/src/mbase/obj_bind.h 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mbase/obj_bind.h 2010-04-16 12:53:55.000000000 +0100 @@ -2,7 +2,7 @@ // mbase/obj_bind.h // This file is part of Bombono DVD project. // -// Copyright (c) 2008 Ilya Murav'jov +// Copyright (c) 2008, 2010 Ilya Murav'jov // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -22,56 +22,22 @@ #ifndef __MBASE_OBJ_BIND_H__ #define __MBASE_OBJ_BIND_H__ -#include - -#include #include "composite/component.h" -struct MenuLink -{ - Project::MediaItem ref; - // -1 - ищем связи только по ref, нижняя граница - // 0 - по ref и subj (полный индекс) - // 1 - только по ref, верхняя граница - int subjDef; - Comp::Object* subj; - - // для поиска по полному ключу - // (без нулевых значений) - MenuLink(Project::MediaItem ref, Comp::Object* subj); - // для поиска по ref - MenuLink(Project::MediaItem ref, bool is_lower); - - void SetBound(bool is_lower) { subjDef = is_lower ? -1 : 1; } - private: - MenuLink(); // запрещен -}; - -struct MenuLinkLessOp -{ - bool operator()(const MenuLink& e1, const MenuLink& e2) const; -}; +#include -// -// MenuLinkList - связи пунктов меню с медиа (их содержимым): -// MenuRegion -> bgRef -// MediaObj -> mdItem -// -typedef std::set MenuLinkListType; +typedef boost::function CompObjectFunctor; +void ForeachLinked(Project::MediaItem mi, CompObjectFunctor fnr); + +namespace Composition { +typedef boost::function FOFunctor; +} + +void ForeachWithPoster(Project::MediaItem mi, Composition::FOFunctor fnr); -class MenuLinkList: public MenuLinkListType, public Singleton -{ - typedef MenuLinkListType MyParent; - public: - - typedef MyParent::iterator Itr; -}; - -// установить/изменить/удалить связь -void ResetLink(Comp::Object* obj, Project::MediaItem new_ref, Project::MediaItem old_ref); -// список пунктов меню, связанных с ref -typedef std::pair MenuLinkRange; -MenuLinkRange LinkedObjects(Project::MediaItem ref); +// Замечание: в принципе можно перебирать вручную все пункты меню (цикл по меню, +// затем по пунктам меню), однако могут быть проблемы при удалении меню/пунктов в процессе +// перебора #endif // #ifndef __MBASE_OBJ_BIND_H__ diff -Nru bombono-dvd-0.5.2/src/mbase/project/archieve-fwd.h bombono-dvd-0.6.0/src/mbase/project/archieve-fwd.h --- bombono-dvd-0.5.2/src/mbase/project/archieve-fwd.h 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/src/mbase/project/archieve-fwd.h 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,36 @@ +// +// mbase/project/archieve-fwd.h +// This file is part of Bombono DVD project. +// +// Copyright (c) 2010 Ilya Murav'jov +// +// This program 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. +// +// This program 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 this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// + +#ifndef __MBASE_PROJECT_ARCHIEVE_FWD_H__ +#define __MBASE_PROJECT_ARCHIEVE_FWD_H__ + +#include + +namespace Project +{ + +class Archieve; +typedef boost::function ArchieveFnr; + +} // namespace Project + +#endif // #ifndef __MBASE_PROJECT_ARCHIEVE_FWD_H__ + diff -Nru bombono-dvd-0.5.2/src/mbase/project/archieve-sdk.cpp bombono-dvd-0.6.0/src/mbase/project/archieve-sdk.cpp --- bombono-dvd-0.5.2/src/mbase/project/archieve-sdk.cpp 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/src/mbase/project/archieve-sdk.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,58 @@ +// +// mbase/project/archieve-sdk.cpp +// This file is part of Bombono DVD project. +// +// Copyright (c) 2010 Ilya Murav'jov +// +// This program 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. +// +// This program 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 this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// + +#include + +#include "archieve.h" +#include "archieve-sdk.h" + +namespace Project +{ + +void DoSaveArchieve(xmlpp::Element* root_node, const ArchieveFnr& afnr) +{ + Archieve ar(root_node, false); + afnr(ar); +} + +void DoLoadArchieve(const std::string& fname, const ArchieveFnr& afnr, const char* root_tag) +{ + xmlpp::DomParser parser; + try + { + parser.parse_file(fname); + } + catch(const std::exception& err) + { + // заменяем, потому что из сообщения непонятно, что произошло + throw std::runtime_error(std::string(fname) + " is not existed or corrupted"); + } + + xmlpp::Element* root_node = parser.get_document()->get_root_node(); + if( root_node->get_name() != root_tag ) + throw std::runtime_error("The file is not " APROGRAM_PRINTABLE_NAME " document."); + + Archieve ar(root_node, true); + afnr(ar); +} + +} // namespace Project + diff -Nru bombono-dvd-0.5.2/src/mbase/project/archieve-sdk.h bombono-dvd-0.6.0/src/mbase/project/archieve-sdk.h --- bombono-dvd-0.5.2/src/mbase/project/archieve-sdk.h 1970-01-01 01:00:00.000000000 +0100 +++ bombono-dvd-0.6.0/src/mbase/project/archieve-sdk.h 2010-04-16 12:53:55.000000000 +0100 @@ -0,0 +1,37 @@ +// +// mbase/project/archieve-sdk.h +// This file is part of Bombono DVD project. +// +// Copyright (c) 2010 Ilya Murav'jov +// +// This program 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. +// +// This program 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 this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// + +#ifndef __MBASE_PROJECT_ARCHIEVE_SDK_H__ +#define __MBASE_PROJECT_ARCHIEVE_SDK_H__ + +#include "archieve-fwd.h" + +namespace Project +{ + +void DoLoadArchieve(const std::string& fname, const ArchieveFnr& afnr, const char* root_tag); +void DoSaveArchieve(xmlpp::Element* root_node, const ArchieveFnr& afnr); + +} // namespace Project + +#endif // #ifndef __MBASE_PROJECT_ARCHIEVE_SDK_H__ + + diff -Nru bombono-dvd-0.5.2/src/mbase/project/media.cpp bombono-dvd-0.6.0/src/mbase/project/media.cpp --- bombono-dvd-0.5.2/src/mbase/project/media.cpp 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mbase/project/media.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -2,7 +2,7 @@ // mbase/project/media.cpp // This file is part of Bombono DVD project. // -// Copyright (c) 2008-2009 Ilya Murav'jov +// Copyright (c) 2008-2010 Ilya Murav'jov // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -25,6 +25,9 @@ #include #include // MakeAbsolutePath() +#include + +#include // fs::create_directories() namespace Project { @@ -62,7 +65,7 @@ void VideoMD::AddChapter(ChapterItem chp) { - chp->mdName = MakeAutoName("Chapter", chpLst.size()); + chp->mdName = MakeAutoName(_("Chapter"), chpLst.size()); chpLst.push_back(chp); } @@ -98,3 +101,17 @@ } // namespace Project +bool CreateDirs(const fs::path& dir, std::string& err_str) +{ + bool res = true; + if( !fs::exists(dir) ) + { + try { fs::create_directories(dir); } + catch( const std::exception& ) + { + err_str = BF_("Cant create folder %1% (check permissions)") % dir.string() % bf::stop; + res = false; + } + } + return res; +} diff -Nru bombono-dvd-0.5.2/src/mbase/project/media.h bombono-dvd-0.6.0/src/mbase/project/media.h --- bombono-dvd-0.5.2/src/mbase/project/media.h 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mbase/project/media.h 2010-04-16 12:53:55.000000000 +0100 @@ -2,7 +2,7 @@ // mbase/project/media.h // This file is part of Bombono DVD project. // -// Copyright (c) 2008-2009 Ilya Murav'jov +// Copyright (c) 2008-2010 Ilya Murav'jov // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -22,16 +22,15 @@ #ifndef __MBASE_PROJECT_MEDIA_H__ #define __MBASE_PROJECT_MEDIA_H__ -#include - #include "const.h" #include "object.h" +#include "archieve-fwd.h" + +#include namespace Project { -class Archieve; - template class PSO: public SimpleVisitorObject {}; @@ -95,6 +94,22 @@ typedef boost::intrusive_ptr ChapterItem; typedef boost::intrusive_ptr VideoItem; +enum PostActionType +{ + patAUTO = 0, // (по умолчанию) наиболее ожидаемое действие + // при "существующей топологии проекта" + patNEXT_TITLE, // (для видео) следующий по списку + patEXP_LINK, // явная ссылка +}; + +struct PostAction +{ + PostActionType paTyp; + MediaItem paLink; // цель для patEXP_LINK + + PostAction(): paTyp(patAUTO) {} +}; + // видео class VideoMD: public PSO // от StorageMD { @@ -108,11 +123,14 @@ virtual std::string TypeString() { return "Video"; } ListType& List() { return chpLst; } + PostAction& PAction() { return pAct; } + virtual void SerializeImpl(Archieve& ar); protected: ListType chpLst; // список глав + PostAction pAct; }; diff -Nru bombono-dvd-0.5.2/src/mbase/project/menu.cpp bombono-dvd-0.6.0/src/mbase/project/menu.cpp --- bombono-dvd-0.5.2/src/mbase/project/menu.cpp 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mbase/project/menu.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -2,7 +2,7 @@ // mbase/project/menu.cpp // This file is part of Bombono DVD project. // -// Copyright (c) 2008-2009 Ilya Murav'jov +// Copyright (c) 2008-2010 Ilya Murav'jov // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -21,12 +21,13 @@ #include -#include - #include "menu.h" #include "table.h" #include "srl-common.h" +#include +#include + namespace Project { @@ -250,6 +251,8 @@ void FrameItemMD::SerializeImpl(Archieve& ar) { ar & NameValue("Frame", themeStr); + SerializeReference(ar, "Poster", posterRef); + MyParent::SerializeImpl(ar); } @@ -270,7 +273,7 @@ Menu MakeMenu(int old_sz) { - return MakeMenu(MakeAutoName("Menu", old_sz)); + return MakeMenu(MakeAutoName(_("Menu"), old_sz)); } } // namespace Project diff -Nru bombono-dvd-0.5.2/src/mbase/project/menu.h bombono-dvd-0.6.0/src/mbase/project/menu.h --- bombono-dvd-0.5.2/src/mbase/project/menu.h 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mbase/project/menu.h 2010-04-16 12:53:55.000000000 +0100 @@ -2,7 +2,7 @@ // mbase/project/menu.h // This file is part of Bombono DVD project. // -// Copyright (c) 2008-2009 Ilya Murav'jov +// Copyright (c) 2008-2010 Ilya Murav'jov // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -99,9 +99,11 @@ virtual void SerializeImpl(Archieve& ar); std::string& Theme() { return themeStr; } + MediaItem& Poster() { return posterRef; } protected: std::string themeStr; + MediaItem posterRef; }; class TextItemMD: public PSO// от MenuItemMD diff -Nru bombono-dvd-0.5.2/src/mbase/project/table.cpp bombono-dvd-0.6.0/src/mbase/project/table.cpp --- bombono-dvd-0.5.2/src/mbase/project/table.cpp 2009-09-27 12:44:41.000000000 +0100 +++ bombono-dvd-0.6.0/src/mbase/project/table.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -2,7 +2,7 @@ // mbase/project/table.cpp // This file is part of Bombono DVD project. // -// Copyright (c) 2008-2009 Ilya Murav'jov +// Copyright (c) 2008-2010 Ilya Murav'jov // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ #include "table.h" #include "archieve.h" +#include "archieve-sdk.h" #include "srl-common.h" #include "handler.h" #include "theme.h" @@ -30,7 +31,7 @@ #include -const char* APROJECT_VERSION = "0.5.2"; +const char* APROJECT_VERSION = "0.6.0"; namespace Project { @@ -173,6 +174,8 @@ void StillImageMD::SerializeImpl(Archieve& ar) { MyParent::SerializeImpl(ar); + // :TODO: выделить для всех "файлов", в StorageMD::SerializeImpl: + // ar << NameValue("Type", TypeString()); if( ar.IsSave() ) ar << NameValue("Type", "StillPicture"); } @@ -183,23 +186,36 @@ return NameValue("Part", *ci); } +void Serialize(Archieve& ar, PostAction& pa) +{ + ar("Type", pa.paTyp); + SerializeReference(ar, "Ref", pa.paLink); +} + void VideoMD::SerializeImpl(Archieve& ar) { MyParent::SerializeImpl(ar); - if( ar.IsLoad() ) - { - using namespace boost; - ArchieveFunctor fnr = - MakeArchieveFunctor( lambda::bind(&LoadChapter, this) ); - LoadArray(ar, fnr); - } - else // IsSave - { + if( ar.IsSave() ) ar << NameValue("Type", "Video"); - for( Itr itr = chpLst.begin(), end = chpLst.end(); itr != end; ++itr ) - ar << NameValue("Part", **itr); + // * главы + { + ArchieveStackFrame asf(ar, "Parts"); + if( ar.IsLoad() ) + { + using namespace boost; + ArchieveFunctor fnr = + MakeArchieveFunctor( lambda::bind(&LoadChapter, this) ); + LoadArray(ar, fnr); + } + else // IsSave + { + for( Itr itr = chpLst.begin(), end = chpLst.end(); itr != end; ++itr ) + ar << NameValue("Part", **itr); + } } + + ar("PostAction", pAct); } void VideoChapterMD::SerializeImpl(Archieve& ar) @@ -273,9 +289,7 @@ root_node->set_attribute("Version", APROJECT_VERSION); root_node->add_child_comment("This document is for " APROGRAM_PRINTABLE_NAME " program"); - Archieve ar(root_node, false); - afnr(ar); - + DoSaveArchieve(root_node, afnr); doc.write_to_file_formatted(ConvertPathFromUtf8(prjFName)); return true; } @@ -288,23 +302,7 @@ if( !IsProjectSet() ) // пустой проект return; - xmlpp::DomParser parser; - try - { - parser.parse_file(ConvertPathFromUtf8(prjFName)); - } - catch(const std::exception& err) - { - // заменяем, потому что из сообщения непонятно, что произошло - throw std::runtime_error(std::string(fname) + " is not existed or corrupted"); - } - - xmlpp::Element* root_node = parser.get_document()->get_root_node(); - if( root_node->get_name() != "AProject" ) - throw std::runtime_error("The file is not " APROGRAM_PRINTABLE_NAME " document."); - - Archieve ar(root_node, true); - afnr(ar); + DoLoadArchieve(ConvertPathFromUtf8(prjFName), afnr, "AProject"); } // @@ -314,6 +312,10 @@ ThemeDirList::ThemeDirList() { // директории по умолчанию + std::string user_frames = GetConfigDir() + "/frames"; + if( CreateDirsQuiet(user_frames) ) + AddDir(user_frames); + AddDir(GetDataDir() + "/frames"); } diff -Nru bombono-dvd-0.5.2/src/mbase/project/table.h bombono-dvd-0.6.0/src/mbase/project/table.h --- bombono-dvd-0.5.2/src/mbase/project/table.h 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mbase/project/table.h 2010-04-16 12:53:55.000000000 +0100 @@ -2,7 +2,7 @@ // mbase/project/table.h // This file is part of Bombono DVD project. // -// Copyright (c) 2008-2009 Ilya Murav'jov +// Copyright (c) 2008-2010 Ilya Murav'jov // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -25,6 +25,8 @@ #include "media.h" #include "menu.h" +void CheckObjectLinksEmpty(); + namespace Project { @@ -110,8 +112,6 @@ class ADatabase: public Singleton, public DataWare { public: - typedef boost::function ArchieveFnr; - ADatabase(); void SetPalTvSystem(bool is_pal); @@ -198,6 +198,7 @@ public: DBCleanup(bool clear_before = true) { + CheckObjectLinksEmpty(); if( clear_before ) AData().Clear(); } diff -Nru bombono-dvd-0.5.2/src/mbase/resources.cpp bombono-dvd-0.6.0/src/mbase/resources.cpp --- bombono-dvd-0.5.2/src/mbase/resources.cpp 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mbase/resources.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -1,21 +1,78 @@ +// +// mbase/resources.cpp +// This file is part of Bombono DVD project. +// +// Copyright (c) 2010 Ilya Murav'jov +// +// This program 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. +// +// This program 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 this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// //#include #include "resources.h" #include +#include +#include + +#include // get_user_config_dir() + +const char* GetInstallPrefix() +{ +#ifdef INSTALL_PREFIX + return INSTALL_PREFIX; +#else + // работаем локально + return 0; +#endif + +} #define DATADIR "resources" -std::string GetDataDir() +const std::string& GetDataDir() { -#ifdef DATA_PREFIX static std::string res_dir; if( res_dir.empty() ) - res_dir = (fs::path(DATA_PREFIX) / DATADIR).string(); + { + const char* prefix = GetInstallPrefix(); + res_dir = prefix ? (fs::path(prefix) / "share" / "bombono" / DATADIR).string() : DATADIR ; + } return res_dir; -#else - // работаем локально - return DATADIR; -#endif } +bool CreateDirsQuiet(const fs::path& dir) +{ + bool res = true; + std::string err_str; + if( !CreateDirs(dir, err_str) ) + { + res = false; + LOG_ERR << "CreateDirsQuiet(): " << err_str << io::endl; + } + return res; +} + +const std::string& GetConfigDir() +{ + static std::string cfg_dir; + if( cfg_dir.empty() ) + { + fs::path dir = fs::path(Glib::get_user_config_dir()) / "bombono-dvd"; + CreateDirsQuiet(dir); + + cfg_dir = dir.string(); + } + return cfg_dir; +} diff -Nru bombono-dvd-0.5.2/src/mbase/resources.h bombono-dvd-0.6.0/src/mbase/resources.h --- bombono-dvd-0.5.2/src/mbase/resources.h 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mbase/resources.h 2010-04-16 12:53:55.000000000 +0100 @@ -2,7 +2,7 @@ // mbase/resources.h // This file is part of Bombono DVD project. // -// Copyright (c) 2008-2009 Ilya Murav'jov +// Copyright (c) 2008-2010 Ilya Murav'jov // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -24,7 +24,12 @@ #include -std::string GetDataDir(); +// если 0, то локальный запуск +const char* GetInstallPrefix(); +// папка resources +const std::string& GetDataDir(); +// ~/.config/bombono-dvd +const std::string& GetConfigDir(); #endif // #ifndef __MBASE_RESOURCES_H__ diff -Nru bombono-dvd-0.5.2/src/mbase/SConscript bombono-dvd-0.6.0/src/mbase/SConscript --- bombono-dvd-0.5.2/src/mbase/SConscript 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mbase/SConscript 2010-04-16 12:53:55.000000000 +0100 @@ -12,6 +12,7 @@ #'resources.cpp', 'project/archieve.cpp', + 'project/archieve-sdk.cpp', 'project/handler.cpp', 'project/media.cpp', 'project/menu.cpp', @@ -19,10 +20,11 @@ 'project/srl-db.cpp', 'project/table.cpp', ] +user_options_dict['AddSourcesForXgettext'](lib_src_files) resource_defines = [] if 'install' in BUILD_TARGETS: - resource_defines = [('DATA_PREFIX', '\'\"' + user_options_dict['INST_DATA_PREFIX'] + '\"\'')] + resource_defines = [('INSTALL_PREFIX', '\'\"' + user_options_dict['PREFIX'] + '\"\'')] # add define to CPPDEFINES, not replace old CPPDEFINES resources_obj = lib_mbase_env.Object('resources.cpp', CPPDEFINES = resource_defines + lib_mbase_env['CPPDEFINES']) diff -Nru bombono-dvd-0.5.2/src/mcomposite/mmedia.cpp bombono-dvd-0.6.0/src/mcomposite/mmedia.cpp --- bombono-dvd-0.5.2/src/mcomposite/mmedia.cpp 2009-09-09 07:23:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mcomposite/mmedia.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -119,13 +119,13 @@ img.modifyImage(); img.type(MagickLib::TrueColorType); // неявный перевод в RGBColorspace -#if (MagickLibVersion < 0x030000) || ((MagickLibVersion >= 0x100000) && (MagickLibVersion < 0x300000)) +#if (MagickLibVersion < 0x020000) || ((MagickLibVersion >= 0x100000) && (MagickLibVersion < 0x200000)) // см. configure.ac: из-за превышения 9 номер интерфейса (major interface) увелич. в 10 раз -#define GM2_ABI +#define GM1_ABI #endif - // с интерфейса >= 3 (версия 1.3) инициализация проходит при первом обращении Pixels::set|getConst() -#ifdef GM2_ABI + // с интерфейса >= 2 (версия 1.2) инициализация проходит при первом обращении Pixels::set|getConst() +#ifdef GM1_ABI // 2 - выделить и инициализировать ресурсы для хранения собственно // данных и кеша представлений MagickLib::OpenCache(img.image(), MagickLib::IOMode); diff -Nru bombono-dvd-0.5.2/src/mgui/author/burn.cpp bombono-dvd-0.6.0/src/mgui/author/burn.cpp --- bombono-dvd-0.5.2/src/mgui/author/burn.cpp 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mgui/author/burn.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -2,7 +2,7 @@ // mgui/author/burn.cpp // This file is part of Bombono DVD project. // -// Copyright (c) 2009 Ilya Murav'jov +// Copyright (c) 2009-2010 Ilya Murav'jov // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -24,8 +24,11 @@ #include "burn.h" #include "execute.h" +#include #include #include +#include +#include #include #include @@ -38,8 +41,10 @@ void devices_add_device(const gchar *device_name, const gchar * /*device_id*/, const gchar *device_node, const gint capabilities) { - // нам нужны резаки DVD - if( capabilities & DC_WRITE_DVDR ) + // требования: + // - информация доступна об устройстве + // - резаки DVD + if( device_name && (capabilities & DC_WRITE_DVDR) ) { //io::cout << "model = " << device_name << ", dev = " << device_node // << ", capabilities = " << capabilities << ", device_id = " << device_id << io::endl; @@ -87,34 +92,48 @@ boost::regex WriteSpeed_RE("Write Speed #"RG_NUM":"RG_SPS RG_NUM"\\."RG_NUM "x1385"); RefPtr sp_store; -Gtk::TreeModelColumn dbl_cln; -Gtk::TreeModelColumn str_cln; -const char* UpdateSpeedsEntry = "Update speeds ..."; + +enum SpeedEntryType +{ + setNONE = 0, // по умолчанию + setUPDATE = 1, // "Update speeds ..." +}; + +struct SpeedFields +{ + Gtk::TreeModelColumn dbl_cln; + Gtk::TreeModelColumn str_cln; + Gtk::TreeModelColumn type_cln; + + + SpeedFields(Gtk::TreeModelColumnRecord& rec) + { + rec.add(dbl_cln); + rec.add(str_cln); + rec.add(type_cln); + } +}; + +static SpeedFields& SF() +{ + return GetColumnFields(); +} bool SeparatorFunc(const RefPtr&, const Gtk::TreeIter& itr) { - return itr->get_value(str_cln) == "separator"; + return itr->get_value(SF().str_cln) == "separator"; } static void SetupSpeeds(Gtk::ComboBox& speed_btn) { if( !sp_store ) - { - Gtk::TreeModelColumnRecord columns; - Gtk::TreeModelColumn dbl_cln_; - dbl_cln = dbl_cln_; - Gtk::TreeModelColumn str_cln_; - str_cln = str_cln_; - columns.add(dbl_cln); - columns.add(str_cln); + sp_store = Gtk::ListStore::create(GetColumnRecord()); - sp_store = Gtk::ListStore::create(columns); - } speed_btn.set_model(sp_store); speed_btn.set_row_separator_func(&SeparatorFunc); // * внешний вид - speed_btn.pack_start(str_cln); + speed_btn.pack_start(SF().str_cln); } bool IsBurnerSetup(std::string& dev_path) @@ -132,7 +151,7 @@ { Gtk::TreeIter itr = GetBD().SpeedBtn().get_active(); ASSERT( itr ); - return itr->get_value(dbl_cln); + return itr->get_value(SF().dbl_cln); } bool TestDvdDisc(const std::string& dev_path, std::string& str) @@ -173,21 +192,23 @@ ASSERT( sp_store ); sp_store->clear(); + SpeedFields& sf = SF(); // * заполняем Gtk::TreeRow row = *sp_store->append(); - row[str_cln] = "Auto"; + row[sf.str_cln] = _("Auto"); speed_btn.set_active(row); for( SpeedsArray::iterator itr = speeds.begin(), end = speeds.end(); itr != end; ++itr ) { Gtk::TreeRow row = *sp_store->append(); - row[dbl_cln] = *itr; - row[str_cln] = boost::lexical_cast(*itr) + "\303\227"; + row[sf.dbl_cln] = *itr; + row[sf.str_cln] = boost::lexical_cast(*itr) + "\303\227"; } row = *sp_store->append(); - row[str_cln] = "separator"; + row[sf.str_cln] = "separator"; row = *sp_store->append(); - row[str_cln] = UpdateSpeedsEntry; + row[sf.str_cln] = _("Update speeds ..."); + row[sf.type_cln] = setUPDATE; } } @@ -208,7 +229,7 @@ { BurnData& bd = GetBD(); Gtk::TreeIter itr = bd.SpeedBtn().get_active(); - if( itr->get_value(str_cln) == UpdateSpeedsEntry ) + if( itr && (itr->get_value(SF().type_cln) == setUPDATE) ) { UpdateSpeeds(); @@ -274,35 +295,26 @@ return inf; } -static bool PulseProgress() +class WaitProgress { - GetES().prgBar.pulse(); - return true; -} - -struct WaitProgress -{ - WaitProgress(const std::string& msg) + public: + WaitProgress(const std::string& msg): pls(GetES().prgBar) { ExecState& es = GetES(); es.SetStatus(msg); // перевод в режим pulse es.prgBar.set_text(" "); es.prgBar.set_fraction(0.); - - tm.Connect(&PulseProgress, 500); } ~WaitProgress() { ExecState& es = GetES(); es.SetIndicator(0); es.SetStatus(); - - tm.Disconnect(); } protected: - Timer tm; + Execution::Pulse pls; }; bool CheckDVDBlank() @@ -316,7 +328,7 @@ std::string str; bool is_good = false; { - WaitProgress wp("Checking Disc ..."); + WaitProgress wp(_("Checking Disc ...")); is_good = TestDvdDisc(dvd_drive, str); } @@ -330,43 +342,43 @@ break; case dvdCD_DRIVE_ONLY: try_again = Gtk::RESPONSE_OK == - MessageBox("Selected burn drive is for CD discs only. Change to another burn drive.", + MessageBox(_("Selected burn drive is for CD discs only. Change to another burn drive."), Gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK_CANCEL, "", true); break; case dvdCD_DISC: try_again = Gtk::RESPONSE_OK == - MessageBox("CD disc is found in the drive, not DVD. Change to DVD disc.", + MessageBox(_("CD disc is found in the drive, not DVD. Change to DVD disc."), Gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK_CANCEL, "", true); break; case dvdEMPTY_DRIVE: try_again = Gtk::RESPONSE_OK == - MessageBox("No DVD disc in the drive. Load a clear one and press OK.", + MessageBox(_("No DVD disc in the drive. Load a clear one and press OK."), Gtk::MESSAGE_INFO, Gtk::BUTTONS_OK_CANCEL, "", true); break; case dvdOTHER: try_again = Gtk::RESPONSE_OK == - MessageBox("Disc with type \"" + inf.name + "\" is found in the drive but " + MessageBox(BF_("Disc with type \"%1%\" is found in the drive but " "for DVD-Video disc type should be one from: DVD-R, DVD+R, DVD-RW, DVD+RW. " - "Load a clear one with right type and press OK.", + "Load a clear one with right type and press OK.") % inf.name % bf::stop, Gtk::MESSAGE_INFO, Gtk::BUTTONS_OK_CANCEL, "", true); break; default: ASSERT( (inf.typ == dvdR) || (inf.typ == dvdRW) ); if( inf.typ == dvdR && !inf.isBlank ) try_again = Gtk::RESPONSE_OK == - MessageBox("Disc with type \"" + inf.name + "\" in the drive is not clear. Only clear recordable " - "discs can be used for burning DVD-Video. Load a clear one and press OK.", + MessageBox(BF_("Disc with type \"%1%\" in the drive is not clear. Only clear recordable " + "discs can be used for burning DVD-Video. Load a clear one and press OK.") % inf.name % bf::stop, Gtk::MESSAGE_INFO, Gtk::BUTTONS_OK_CANCEL, "", true); else { if( inf.typ == dvdRW && !inf.isBlank ) { - std::string title = "Disc with type \"" + inf.name + "\" in the drive is not clear." - " We need to remove its contents before writing new one. Continue?"; + std::string title = BF_("Disc with type \"%1%\" in the drive is not clear." + " We need to remove its contents before writing new one. Continue?") % inf.name % bf::stop; Gtk::MessageDialog dlg(MakeMessageBoxTitle(title), true, Gtk::MESSAGE_INFO, Gtk::BUTTONS_NONE); - dlg.add_button("_Cancel", Gtk::RESPONSE_CANCEL); - dlg.add_button("_Try again", Gtk::RESPONSE_REJECT); + dlg.add_button(_("_Cancel"), Gtk::RESPONSE_CANCEL); + dlg.add_button(_("_Try again"), Gtk::RESPONSE_REJECT); dlg.add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK); dlg.set_default_response(Gtk::RESPONSE_OK); diff -Nru bombono-dvd-0.5.2/src/mgui/author/execute.cpp bombono-dvd-0.6.0/src/mgui/author/execute.cpp --- bombono-dvd-0.5.2/src/mgui/author/execute.cpp 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mgui/author/execute.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -2,7 +2,7 @@ // mgui/author/execute.cpp // This file is part of Bombono DVD project. // -// Copyright (c) 2009 Ilya Murav'jov +// Copyright (c) 2009-2010 Ilya Murav'jov // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -27,12 +27,13 @@ //#include #include -#include // PackInScrolledWindow() #include +#include +#include +#include #include #include -#include #include #include @@ -40,7 +41,6 @@ #include #include -#include // SIGTERM #include #include // WIFEXITED @@ -60,7 +60,7 @@ void ExecState::Clean() { - userAbort = false; + eDat.Init(); detailsView.get_buffer()->set_text(""); SetStatus(); @@ -69,12 +69,7 @@ Gtk::Label& ExecState::SetStatus(const std::string& name) { - return Project::FillAuthorLabel(prgLabel, "Status: " + name); -} - -Gtk::Widget& PackDetails(Gtk::TextView& txt_view) -{ - return PackWidgetInFrame(Project::PackInScrolledWindow(txt_view, true), Gtk::SHADOW_ETCHED_IN); + return Project::FillAuthorLabel(prgLabel, _("Status: ") + name); } static void InitFoundStageTag(RefPtr tag) @@ -182,39 +177,11 @@ OnSetParser(); } -static void InitStderrTag(RefPtr tag) -{ - Glib::PropertyProxy prop = tag->property_font_desc(); - - Pango::FontDescription dsc = prop.get_value(); - dsc.set_style(Pango::STYLE_ITALIC); - prop.set_value(dsc); -} - -//static void InitRedTag(RefPtr tag, bool is_red) -//{ -// tag->property_foreground() = is_red ? "darkred" : "darkblue" ; -//} -// -//static bool RedTag = true; -//InitTagFunctor RedFnr = boost::lambda::bind(&InitRedTag, boost::lambda::_1, true); -//InitTagFunctor BlueFnr = boost::lambda::bind(&InitRedTag, boost::lambda::_1, false); -// -//static void ApplyStripyOutput(Gtk::TextView& txt_view, const TextIterRange& tir) -//{ -// RedTag ? ApplyTag(txt_view, tir, "RedTag", RedFnr) : ApplyTag(txt_view, tir, "BlueTag", BlueFnr) ; -// RedTag = !RedTag; -//} - void OutputFilter::OnGetLine(const char* dat, int sz, bool is_out) { Gtk::TextView& txt_view = GetTV(); std::string line(dat, sz); - TextIterRange tir = AppendText(txt_view, line); - //ApplyStripyOutput(txt_view, tir); - - if( !is_out ) - ApplyTag(txt_view, tir, "stderr", InitStderrTag); + TextIterRange tir = AppendNewText(txt_view, line, is_out); using namespace Author; if( ApplyStage(line, DVDAuthorRE, stDVDAUTHOR, tir, *this) ) @@ -263,58 +230,6 @@ // io::cout << rct.get_x() << " " << rct.get_y() << " " << rct.get_width() << " " << rct.get_height() << io::endl; //} -TextIterRange AppendText(Gtk::TextView& txt_view, const std::string& text) -{ - RefPtr buf = txt_view.get_buffer(); - Gtk::TextIter itr = buf->get_iter_at_offset(-1); - - // внизу ли находимся - Gdk::Rectangle disp_rct; - txt_view.get_visible_rect(disp_rct); - Gdk::Rectangle itr_rct; - txt_view.get_iter_location(itr, itr_rct); - // нас интересует пересечение только по высоте, тем более что - // ширина всегда нулевой ширины - itr_rct.set_x(disp_rct.get_x()); - itr_rct.set_width(disp_rct.get_width()); - // при интенсивном заполнении даже при таком поднятии могут происходить - // одиночные непересечения, но "по инерции" все равно будет скроллироваться - itr_rct.set_y(itr_rct.get_y()-itr_rct.get_height()); - - bool at_end = !itr_rct.intersect(disp_rct).has_zero_area(); - - int itr_off = itr.get_offset(); // после вставки не действителен - Gtk::TextIter end_itr = buf->insert(itr, text); - itr = buf->get_iter_at_offset(itr_off); - - if( at_end ) // скроллируем - { - RefPtr end_mark = buf->create_mark("end of text", end_itr, false); - txt_view.scroll_to(end_mark); - } - return TextIterRange(itr, end_itr); -} - -static RefPtr GetBufTag(RefPtr buf, const std::string& tag_name, - InitTagFunctor fnr) -{ - RefPtr tag = buf->get_tag_table()->lookup(tag_name); - if( !tag ) - { - tag = buf->create_tag(tag_name); - fnr(tag); - } - return tag; -} - -void ApplyTag(Gtk::TextView& txt_view, const TextIterRange& tir, - const std::string& tag_name, InitTagFunctor fnr) -{ - RefPtr buf = txt_view.get_buffer(); - RefPtr tag = GetBufTag(buf, tag_name, fnr); - buf->apply_tag(tag, tir.first, tir.second); -} - } // namespace Author struct ExecOutput @@ -644,21 +559,15 @@ return boost::lexical_cast(sig); } -void StopExecution(GPid& pid) -{ - ASSERT( pid != NO_HNDL ); - kill(pid, SIGTERM); -} - std::string ExitDescription(const ExitData& ed) { std::string end_str; if( ed.IsGood() ) end_str = "normal completion"; else if( ed.normExit ) - end_str = (str::stream() << "exit code = " << ed.retCode).str(); + end_str = BF_("exit code = %1%") % ed.retCode % bf::stop; else - end_str = "broken by signal " + SignalToString(ed.retCode); + end_str = BF_("broken by signal %1%") % SignalToString(ed.retCode) % bf::stop; return end_str; } diff -Nru bombono-dvd-0.5.2/src/mgui/author/execute.h bombono-dvd-0.6.0/src/mgui/author/execute.h --- bombono-dvd-0.5.2/src/mgui/author/execute.h 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mgui/author/execute.h 2010-04-16 12:53:55.000000000 +0100 @@ -2,7 +2,7 @@ // mgui/author/execute.h // This file is part of Bombono DVD project. // -// Copyright (c) 2009 Ilya Murav'jov +// Copyright (c) 2009-2010 Ilya Murav'jov // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -24,13 +24,14 @@ #include "indicator.h" +#include +#include + #include // Singleton<> #include // NO_HNDL #include #include -#include - namespace Author { @@ -42,30 +43,26 @@ Gtk::ProgressBar prgBar; Gtk::Label prgLabel; Gtk::TextView detailsView; - GPid pid; + Execution::Data eDat; Mode mode; std::string operationName; std::string exitDesc; // описание причины неудачного авторинга - bool userAbort; // пользователь сам отменил str::stream settings; // = ASettings.py ExecState() { Init(); } - void Init(); + void Init(); // конструктор, повторное использование Gtk::Button& ExecButton() { return *UnRefPtr(execBtn); } - void Clean(); + void Clean(); // (повторный) запуск на выполнение void Set(bool is_exec) { isExec = is_exec; - if( !is_exec ) - pid = NO_HNDL; } - void SetIndicator(double percent); Gtk::Label& SetStatus(const std::string& name = std::string()); }; @@ -121,14 +118,7 @@ virtual void SetProgress(double percent); }; -Gtk::Widget& PackDetails(Gtk::TextView& txt_view); - -typedef std::pair TextIterRange; -typedef boost::function)> InitTagFunctor; -TextIterRange AppendText(Gtk::TextView& txt_view, const std::string& text); -void ApplyTag(Gtk::TextView& txt_view, const TextIterRange& tir, - const std::string& tag_name, InitTagFunctor fnr); template class RefPtrT> void ReRefPtr(RefPtrT& p) @@ -165,7 +155,6 @@ GPid* pid = 0, bool line_up = true); ExitData ExecuteAsync(const char* dir, const char* cmd, Author::OutputFilter& of, GPid* pid); -void StopExecution(GPid& pid); std::string ExitDescription(const ExitData& ed); // COPY_N_PASTE_ETALON - симбиоз из: diff -Nru bombono-dvd-0.5.2/src/mgui/author/gb_devices.c bombono-dvd-0.6.0/src/mgui/author/gb_devices.c --- bombono-dvd-0.5.2/src/mgui/author/gb_devices.c 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mgui/author/gb_devices.c 2010-04-16 12:53:55.000000000 +0100 @@ -48,18 +48,26 @@ gboolean show_trace = FALSE; -gchar** -gbcommon_get_file_as_list(const gchar *file) +static gchar* +get_file_contents(const gchar *file) { GB_LOG_FUNC g_return_val_if_fail(file != NULL, NULL); - gchar **ret = NULL; gchar *contents = NULL; - if(g_file_get_contents(file, &contents, NULL, NULL)) - ret = g_strsplit(contents, "\n", 0); - else - g_warning("gbcommon_get_file_as_list - Failed to get contents of file [%s]", file); + if( !g_file_get_contents(file, &contents, NULL, NULL) ) + g_warning("get_file_contents - Failed to get contents of file [%s]", file); + + return contents; +} + +gchar** +gbcommon_get_file_as_list(const gchar *file) +{ + gchar **ret = NULL; + gchar *contents = get_file_contents(file); + if( contents ) + ret = g_strsplit(contents, "\n", 0); g_free(contents); return ret; @@ -82,9 +90,10 @@ g_return_if_fail(model_name != NULL); g_return_if_fail(device_id != NULL); GB_TRACE("devices_get_ide_device - probing [%s]\n", device_node); - gchar *contents = NULL; + gchar *file = g_strdup_printf("/proc/ide/%s/model", device_node); - if(g_file_get_contents(file, &contents, NULL, NULL)) + gchar *contents = get_file_contents(file); + if( contents ) { g_strstrip(contents); *model_name = g_strdup(contents); @@ -92,12 +101,35 @@ g_free(contents); } else - { g_warning("devices_get_ide_device - Failed to open %s", file); - } g_free(file); } +static char* get_sysfs_attr(const gchar* dev, const gchar* attr) +{ + g_return_val_if_fail(dev != NULL, NULL); + gchar *file = g_strdup_printf("/sys/block/%s/device/%s", dev, attr); + + gchar *ret = get_file_contents(file); + if( ret ) + g_strstrip(ret); + g_free(file); + return ret; +} + +static char* get_sysfs_modelname(const gchar* dev) +{ + gchar *model_name = NULL; + gchar* vendor = get_sysfs_attr(dev, "vendor"); + gchar* model = get_sysfs_attr(dev, "model"); + if( vendor && model ) + model_name = g_strdup_printf("%s %s", vendor, model); + + g_free(vendor); + g_free(model); + return model_name; +} + void devices_get_scsi_device(const gchar *device_node, const gchar *device_node_path, gchar **model_name, gchar **device_id) @@ -112,6 +144,7 @@ if((devices = gbcommon_get_file_as_list("/proc/scsi/sg/devices")) == NULL) { g_warning("devices_get_scsi_device - Failed to open /proc/scsi/sg/devices"); + *model_name = get_sysfs_modelname(device_node); } else if((device_strs = gbcommon_get_file_as_list("/proc/scsi/sg/device_strs")) == NULL) { diff -Nru bombono-dvd-0.5.2/src/mgui/author/indicator.cpp bombono-dvd-0.6.0/src/mgui/author/indicator.cpp --- bombono-dvd-0.5.2/src/mgui/author/indicator.cpp 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mgui/author/indicator.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -2,7 +2,7 @@ // mgui/author/indicator.cpp // This file is part of Bombono DVD project. // -// Copyright (c) 2009 Ilya Murav'jov +// Copyright (c) 2009-2010 Ilya Murav'jov // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ #include "script.h" // CheckAuthorMode #include // Round() +#include #include static std::string PercentString(double p) @@ -63,10 +64,10 @@ } StageMap[stLAST] = { - { "Rendering Menus", true, true, 1, 0.0 }, - { "Generating DVD-Video", true, true, 3, 0.0 }, - { "Creating ISO Image", true, true, 2, 0.0 }, - { "Burning DVD", true, true, 4, 0.0 }, + { N_("Rendering Menus"), true, true, 1, 0.0 }, + { N_("Generating DVD-Video"), true, true, 3, 0.0 }, + { N_("Creating ISO Image"), true, true, 2, 0.0 }, + { N_("Burning DVD"), true, true, 4, 0.0 }, }; // текущий этап Stage CurStage = stNO_STAGE; @@ -126,10 +127,10 @@ StageMap[st].isPassed = true; } -const std::string& StageToStr(Stage st) +std::string StageToStr(Stage st) { StageMapT& s = StageMap[st]; - return s.stgName; + return gettext(s.stgName.c_str()); } void SetStage(Stage st) diff -Nru bombono-dvd-0.5.2/src/mgui/author/indicator.h bombono-dvd-0.6.0/src/mgui/author/indicator.h --- bombono-dvd-0.5.2/src/mgui/author/indicator.h 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mgui/author/indicator.h 2010-04-16 12:53:55.000000000 +0100 @@ -2,7 +2,7 @@ // mgui/author/indicator.h // This file is part of Bombono DVD project. // -// Copyright (c) 2009 Ilya Murav'jov +// Copyright (c) 2009-2010 Ilya Murav'jov // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -54,7 +54,7 @@ void SetStage(Stage st); void SetStageProgress(double percent); -const std::string& StageToStr(Stage st); +std::string StageToStr(Stage st); } // namespace Author diff -Nru bombono-dvd-0.5.2/src/mgui/author/output.cpp bombono-dvd-0.6.0/src/mgui/author/output.cpp --- bombono-dvd-0.5.2/src/mgui/author/output.cpp 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mgui/author/output.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -2,7 +2,7 @@ // mgui/author/output.cpp // This file is part of Bombono DVD project. // -// Copyright (c) 2009 Ilya Murav'jov +// Copyright (c) 2009-2010 Ilya Murav'jov // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -31,7 +31,10 @@ #include #include #include +#include #include +#include +#include #include #include @@ -39,8 +42,6 @@ #include #include -#include // fs::create_directories() - static Gtk::Alignment& MakeNullAlg() { return NewManaged(0.0, 0.0, 0.0, 0.0); @@ -49,7 +50,7 @@ namespace Project { -const std::string DVDOperation = "DVD-Video Building"; +const std::string DVDOperation = N_("DVD-Video Building"); Gtk::Button& FillBuildButton(Gtk::Button& btn, bool not_started, const std::string& op_name) @@ -59,8 +60,8 @@ const char* pix_fname = "button/still.ico"; const char* tooltip = not_started ? "Build DVD-Video of the project." : 0 ; - std::string cancel_name = "_Cancel " + op_name; - std::string label = not_started ? std::string("_Build DVD-Video") : cancel_name.c_str() ; + std::string cancel_name = BF_("_Cancel %1%") % op_name % bf::stop; + std::string label = not_started ? std::string(_("_Build DVD-Video")) : cancel_name.c_str() ; ASSERT( btn.has_screen() ); // ради image-spacing int image_spacing = 0; @@ -70,9 +71,7 @@ PackStart(box, NewManaged(GetFactoryImage(pix_fname))).set_name("BurnImage"); - Gtk::Label& lbl = NewManaged("" + label + ""); - lbl.set_use_markup(true); - lbl.set_use_underline(true); + Gtk::Label& lbl = NewMarkupLabel("" + label + "", true); box.pack_start(lbl, false, false); lbl.set_mnemonic_widget(btn); @@ -83,10 +82,9 @@ return btn; } -static void SetAuthorMode(Author::Mode mode, Gtk::RadioButton& btn) +static void SetAuthorMode(Author::Mode mode) { - if( btn.get_active() ) - Author::GetES().mode = mode; + Author::GetES().mode = mode; } static Gtk::RadioButton& AddAuthoringMode(Gtk::Box& box, Gtk::RadioButtonGroup& grp, @@ -94,14 +92,14 @@ { Gtk::RadioButton& btn = NewManaged(grp, name); btn.set_use_underline(true); - btn.signal_toggled().connect(boost::lambda::bind(&SetAuthorMode, mode, boost::ref(btn))); + SetForRadioToggle(btn, bl::bind(&SetAuthorMode, mode)); PackStart(box, btn); // ручками устанавливаем режим вначале if( init_this ) { ASSERT( btn.get_active() ); - SetAuthorMode(mode, btn); + SetAuthorMode(mode); } return btn; } @@ -134,7 +132,7 @@ return FillAuthorLabel(NewManaged(), name, is_left); } -ActionFunctor PackOutput(ConstructorApp& app, const std::string& prj_fname) +ActionFunctor PackOutput(ConstructorApp& app, const std::string& /*prj_fname*/) { Gtk::Notebook& nbook = app.BookContent(); Gtk::Alignment& alg = Add(nbook, NewManaged(0.05, 0.05, 0.5, 0.5)); @@ -160,11 +158,13 @@ { Gtk::VBox& box = PackStart(vbox, NewManaged()); - Gtk::Label& lbl = PackStart(box, MakeAuthorLabel("Select Output _Folder:", true)); + Gtk::Label& lbl = PackStart(box, MakeAuthorLabel(_("Select Output _Folder:"), true)); lbl.set_mnemonic_widget(ch_btn); - // по умолчанию будет директория проекта - if( !prj_fname.empty() ) - ch_btn.set_filename(prj_fname); + // берем путь из настроек + //if( !prj_fname.empty() ) + // ch_btn.set_filename(prj_fname); + TryDefaultAuthorPath(ch_btn); + PackStart(box, ch_btn); } @@ -174,14 +174,14 @@ Gtk::Alignment& out_alg = PackStart(vbox, MakeNullAlg()); Gtk::Alignment& alg = MakeNullAlg(); alg.set_padding(0, 0, 5, 5); - out_alg.add(PackWidgetInFrame(alg, Gtk::SHADOW_ETCHED_IN, " Choose Author Mode: ")); + out_alg.add(PackWidgetInFrame(alg, Gtk::SHADOW_ETCHED_IN, _(" Choose Author Mode: "))); Gtk::VBox& mode_box = Add(alg, NewManaged(false, 2)); Gtk::RadioButtonGroup grp; // цель по умолчанию - AddAuthoringMode(mode_box, grp, "_Write DVD Folder", Author::modFOLDER, true); - AddAuthoringMode(mode_box, grp, "Write Disk _Image", Author::modDISK_IMAGE); + AddAuthoringMode(mode_box, grp, _("_Write DVD Folder"), Author::modFOLDER, true); + AddAuthoringMode(mode_box, grp, _("Write Disk _Image"), Author::modDISK_IMAGE); RefPtr labels_sg = Gtk::SizeGroup::create(Gtk::SIZE_GROUP_HORIZONTAL); RefPtr wdg_sg = Gtk::SizeGroup::create(Gtk::SIZE_GROUP_HORIZONTAL); @@ -190,12 +190,12 @@ Gtk::Alignment& alg = PackStart(mode_box, MakeSubOptionsAlg()); Gtk::HBox& box = Add(alg, NewManaged(false)); - labels_sg->add_widget(PackStart(box, MakeAuthorLabel("Disc Label: ", false))); + labels_sg->add_widget(PackStart(box, MakeAuthorLabel(_("Disc Label: "), false))); Gtk::Entry& ent = PackStart(box, bd.Label()); wdg_sg->add_widget(ent); } - Gtk::RadioButton& burn_rb = AddAuthoringMode(mode_box, grp, "Burn to _DVD", Author::modBURN); + Gtk::RadioButton& burn_rb = AddAuthoringMode(mode_box, grp, _("Burn to _DVD"), Author::modBURN); { Gtk::Alignment& alg = PackStart(mode_box, MakeSubOptionsAlg()); Gtk::Table& tbl = Add(alg, NewManaged(2, 2, false)); @@ -203,13 +203,13 @@ Gtk::ComboBoxText& dvd_btn = bd.DVDDevices(); Gtk::ComboBox& speed_btn = bd.SpeedBtn(); - Gtk::Label& drv_lbl = MakeAuthorLabel("DVD Drive: ", false); + Gtk::Label& drv_lbl = MakeAuthorLabel(_("DVD Drive: "), false); labels_sg->add_widget(drv_lbl); tbl.attach(drv_lbl, 0, 1, 0, 1, Gtk::SHRINK); wdg_sg->add_widget(dvd_btn); tbl.attach(dvd_btn, 1, 2, 0, 1, Gtk::SHRINK); - Gtk::Label& speed_lbl = MakeAuthorLabel("Writing Speed: ", false); + Gtk::Label& speed_lbl = MakeAuthorLabel(_("Writing Speed: "), false); labels_sg->add_widget(speed_lbl); tbl.attach(speed_lbl, 0, 1, 1, 2, Gtk::SHRINK); wdg_sg->add_widget(speed_btn); @@ -220,7 +220,7 @@ } PackHSeparator(mode_box); - AddAuthoringMode(mode_box, grp, "_Rendering only (for experts)", Author::modRENDERING); + AddAuthoringMode(mode_box, grp, _("_Rendering only"), Author::modRENDERING); } // * @@ -228,10 +228,10 @@ Gtk::VBox& box = PackStart(vbox, NewManaged()); PackProgressBar(box, es); - Gtk::Expander& expdr = PackStart(box, NewManaged("Show/_Hide Details", true)); + Gtk::Expander& expdr = PackStart(box, NewManaged(_("Show/_Hide Details"), true)); Gtk::TextView& txt_view = es.detailsView; txt_view.set_size_request(0, 200); - expdr.add(Author::PackDetails(txt_view)); + expdr.add(PackDetails(txt_view)); } Gtk::Button& build_btn = Add(PackStart(vbox, MakeNullAlg()), es.ExecButton()); @@ -274,7 +274,7 @@ void SetExecState(ExecState& es, bool is_exec) { - std::string op = (es.mode == modRENDERING) ? std::string("Rendering") : Project::DVDOperation; + std::string op = (es.mode == modRENDERING) ? _("Rendering") : gettext(Project::DVDOperation.c_str()); SetExecState(es, is_exec, op); if( is_exec ) InitStageMap(es.mode); @@ -351,11 +351,11 @@ { SetExecState(es, false); } }; -const std::string BurnOperation = "DVD Burning"; +const char* BurnOperation = N_("DVD Burning"); static void SetBurningState(ExecState& es, bool is_exec) { - SetExecState(es, is_exec, BurnOperation); + SetExecState(es, is_exec, gettext(BurnOperation)); } class BurningStateSetter: public CommonStateSetter @@ -395,10 +395,10 @@ str::stream dsc_strm; if( mode != modBURN ) { - dsc_strm << "The result is here: " << TargetPath(mode, dir).string() << "."; + dsc_strm << _("The result is here") << ": " << TargetPath(mode, dir).string() << "."; if( mode == modRENDERING ) - dsc_strm << "\n\nYou can run authoring manually by executing command \"scons\" at " - "the specified folder. Also, see README file for other options over there."; + dsc_strm << "\n\n" << _("You can run authoring manually by executing command \"scons\" at " + "the specified folder. Also, see README file for other options over there."); } return dsc_strm.str(); } @@ -420,20 +420,19 @@ static bool CanUseForAuthoring(const std::string& dir_str) { bool res = true; - std::string abort_str(". Authoring is cancelled."); - if( !fs::exists(dir_str) ) + // Translators: impossible to go on! + std::string abort_str(_("Authoring is cancelled.")); + abort_str = ". " + abort_str; + + std::string err_str; + if( !CreateDirs(dir_str, err_str) ) { - try { fs::create_directories(dir_str); } - catch( const std::exception& ) - { - MessageBox("Cant create directory " + dir_str + " (check permissions)" + abort_str, - Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK); - res = false; - } + MessageBox(err_str, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK); + res = false; } else if( !fs::is_directory(dir_str) ) { - MessageBox(dir_str + " is not a directory" + abort_str, + MessageBox(BF_("%1% is not a folder") % dir_str % bf::stop + abort_str, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK); res = false; } @@ -444,7 +443,7 @@ ASSERT( fs::is_directory(dir_path) ); if( !Project::HaveFullAccess(dir_path) ) { - MessageBox("Cant have full access to directory " + dir_str + " (read, write)" + abort_str, + MessageBox(BF_("Cant have full access to folder %1% (read, write)") % dir_str % bf::stop + abort_str, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK); res = false; } @@ -452,13 +451,13 @@ { bool is_empty = false; if( Gtk::RESPONSE_YES == - MessageBox(dir_str + " is not empty. We need to remove all files in it for authoring process.\n" - "Continue?", Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO) ) + MessageBox(BF_("Folder %1% is not empty. We need to remove all files in it before authoring.\n" + "Continue?") % dir_str % bf::stop, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO) ) { std::string err_str; is_empty = Project::ClearAllFiles(dir_path, err_str); if( !is_empty ) - MessageBox("Error during removing files: " + err_str + abort_str, + MessageBox(BF_("Error during removing files: %1%") % err_str % bf::stop + abort_str, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK); } res = is_empty; @@ -470,6 +469,26 @@ // Run() // COPY_N_PASTE_ETALON gtkdialog.c + +/* GTK - The GIMP Toolkit + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + struct RunInfo { GtkDialog* dialog; @@ -615,23 +634,30 @@ if( response_id == RESPONSE_TOTEM ) { res = false; - Spawn(dir_str.c_str(), "scons totem"); + std::string cmd = boost::format("scons %1%") % (Prefs().player == paTOTEM ? "totem" : "xine") % bf::stop; + Execution::SimpleSpawn(cmd.c_str(), dir_str.c_str()); } return res; } +static std::string MakeOperStatus(boost::format tmpl, ExecState& es) +{ + return (tmpl % es.operationName).str(); +} + static void FailureMessageBox(ExecState& es, const std::string& reason) { - if( es.userAbort ) - FinalMessageBox(es.operationName + " cancelled.", false, Gtk::MESSAGE_INFO, ""); + if( es.eDat.userAbort ) + FinalMessageBox(MakeOperStatus(BF_("%1% cancelled."), es), false, Gtk::MESSAGE_INFO, ""); else - FinalMessageBox(es.operationName + " broken.", false, Gtk::MESSAGE_ERROR, - "The reason is \"" + reason + "\" (see Details)"); + FinalMessageBox(MakeOperStatus(BF_("%1% broken."), es), false, Gtk::MESSAGE_ERROR, + BF_("The reason is \"%1%\" (see Details)") % reason % bf::stop); } static std::string OperationCompleted(ExecState& es) { - return es.operationName + " successfully completed."; + // Translators: can be tranlated as "Operation "%1%" ..." + return MakeOperStatus(BF_("%1% successfully completed."), es); } bool CheckDVDBlank(); @@ -661,8 +687,8 @@ Gtk::MESSAGE_INFO, Gtk::BUTTONS_NONE); dlg.set_secondary_text(desc_str, true); - dlg.add_button("_Play in Totem", RESPONSE_TOTEM); - dlg.add_button("_Burn to DVD", RESPONSE_BURN); + dlg.add_button(BF_("_Play in %1%") % (Prefs().player == paTOTEM ? "Totem" : "Xine") % bf::stop, RESPONSE_TOTEM); + dlg.add_button(_("_Burn to DVD"), RESPONSE_BURN); std::string dvd_drive; if( /*(es.mode == modBURN) ||*/ !Author::IsBurnerSetup(dvd_drive) ) dlg.set_response_sensitive(RESPONSE_BURN, false); @@ -724,17 +750,7 @@ } } else - { - // COPY_N_PASTE - тупо сделал содержимое сообщений как у "TSNAMI-MPEG DVD Author" - // А что делать - нафига свои придумывать, если смысл один и тот же - if( Gtk::RESPONSE_YES == MessageBox("You are about to cancel " + es.operationName + - ". Are you sure?", Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO) ) - { - es.userAbort = true; - if( es.pid != NO_HNDL ) // во время выполнения внешней команды - StopExecution(es.pid); - } - } + es.eDat.StopExecution(es.operationName); } } // namespace Author diff -Nru bombono-dvd-0.5.2/src/mgui/author/render.cpp bombono-dvd-0.6.0/src/mgui/author/render.cpp --- bombono-dvd-0.5.2/src/mgui/author/render.cpp 2009-07-26 18:31:16.000000000 +0100 +++ bombono-dvd-0.6.0/src/mgui/author/render.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -2,7 +2,7 @@ // mgui/author/render.cpp // This file is part of Bombono DVD project. // -// Copyright (c) 2009 Ilya Murav'jov +// Copyright (c) 2009-2010 Ilya Murav'jov // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -252,7 +252,7 @@ Author::SetStageProgress( DoneCnt/(double)WorkCnt * 100.); IteratePendingEvents(); - if( Author::GetES().userAbort ) + if( Author::GetES().eDat.userAbort ) throw std::runtime_error("User Abortion"); // строка реально не нужна - сработает userAbort } @@ -406,8 +406,10 @@ DoneCnt = 0; Author::Info("Rendering menu subtitles ..."); - // список меню std::iostream& menu_list = Author::GetES().settings; + bool IsMenuToBe4_3(); + menu_list << "Is4_3 = " << (IsMenuToBe4_3() ? 1 : 0) << "\n"; + // список меню menu_list << "List = [\n"; using namespace boost; // за один проход можно сделать и подготовку, и рендеринг вспомог. данных diff -Nru bombono-dvd-0.5.2/src/mgui/author/script.cpp bombono-dvd-0.6.0/src/mgui/author/script.cpp --- bombono-dvd-0.5.2/src/mgui/author/script.cpp 2009-09-04 11:33:14.000000000 +0100 +++ bombono-dvd-0.6.0/src/mgui/author/script.cpp 2010-04-16 12:53:55.000000000 +0100 @@ -2,7 +2,7 @@ // mgui/author/script.cpp // This file is part of Bombono DVD project. // -// Copyright (c) 2009 Ilya Murav'jov +// Copyright (c) 2009-2010 Ilya Murav'jov // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -29,7 +29,9 @@ #include #include // ClearLocalData() #include +#include #include // Project::CalcAspectSize() +#include #include #include @@ -143,21 +145,30 @@ class TargetCommandVis: public ObjVisitor { public: + std::string res; + bool vtsDomain; + + TargetCommandVis(bool is_vts): vtsDomain(is_vts) {} + virtual void Visit(MenuMD& obj); virtual void Visit(VideoMD& obj); virtual void Visit(VideoChapterMD&); - std::string res; }; +static int GetMenuANum(Menu mn) +{ + return LocalPath(mn.get())[0]+1; +} + void TargetCommandVis::Visit(MenuMD& obj) -{ - res = (str::stream() << "menu " << LocalPath(&obj)[0]+1).str(); +{ + res = boost::format("g1 = %1%; %2% menu entry root;") % GetMenuANum(&obj) % (vtsDomain ? "call" : "jump") % bf::stop; } void TargetCommandVis::Visit(VideoMD& obj) { - res = (str::stream() << "title " << GetAuthorNumber(obj)).str(); + res = (str::stream() << "jump title " << GetAuthorNumber(obj) << ";").str(); } void TargetCommandVis::Visit(VideoChapterMD& obj) @@ -166,17 +177,17 @@ // :TODO: title 1 всегда равно title 1 chapter 1; при этом dvdauthor не воспринимает // главы "вблизи нуля" (<0.27секунд; задание - посмотреть точно), поэтому нужна предварительная // перенумерация, как с видео - res = (str::stream() << "title " << v_num << " chapter " << ChapterPosInt(&obj) + 2).str(); + res = (str::stream() << "jump title " << v_num << " chapter " << ChapterPosInt(&obj) + 2 << ";").str(); } -static std::string MakeAuthorTarget(MediaItem mi) +static std::string MakeButtonJump(MediaItem mi, bool vts_domain) { - TargetCommandVis vis; + TargetCommandVis vis(vts_domain); mi->Accept(vis); return vis.res; } -static bool GetFirstVideo(VideoItem& res, VideoItem vi, int) +static bool _GetFirstVideo(VideoItem& res, VideoItem vi, int) { res = vi; return false; @@ -206,17 +217,31 @@ bool res = false; if( MediaItem btn_target = m_obj.MediaItem() ) { - targ_str = MakeAuthorTarget(btn_target); + targ_str = MakeButtonJump(btn_target, false); res = !targ_str.empty(); } return res; } +int MenusCnt() +{ + return Size(GetAStores().mnStore); +} + static bool ScriptMenu(xmlpp::Element* menus_node, Menu root_menu, Menu mn, int i) { xmlpp::Element* pgc_node = menus_node->add_child("pgc"); if( root_menu == mn ) pgc_node->set_attribute("entry", "root"); + + //
+    {
+        int num = GetMenuANum(mn);
+        int next_num = (i+1 < MenusCnt()) ? num+1 : 1 ;
+        std::string loop_menus = boost::format("if(g1 != %1%) {jump menu %2%;}") % num % next_num % bf::stop;
+        pgc_node->add_child("pre")->add_child_text(loop_menus);
+    }
+
     xmlpp::Element* vob_node = pgc_node->add_child("vob");
     // название меню
     std::string m_dir = MenuAuthorDir(mn, i);
@@ -230,7 +255,7 @@
             if( HasButtonLink(*m_obj, targ_str) )
             {
                 xmlpp::Element* node = pgc_node->add_child("button");
-                node->add_child_text("jump " + targ_str + ";");
+                node->add_child_text(targ_str);
             }
         }
     return true;
@@ -238,11 +263,6 @@
 
 typedef boost::function TitlePostCommand;
 
-static std::string CallRootMenu()
-{
-    return "call menu entry root;";
-}
-
 static std::string JumpNextTitle(VideoItem vi, int titles_cnt)
 {
     int cur_num = GetAuthorNumber(*vi);
@@ -252,9 +272,12 @@
     return "jump title " + boost::lexical_cast(next_num) + ";";
 }
 
+static std::string AutoPostCmd(const std::string& jnt_cmd)
+{
+    return MenusCnt() ? std::string("call menu entry root;") : jnt_cmd ;
+}
 
-static bool ScriptTitle(xmlpp::Element* ts_node, VideoItem vi,
-                        TitlePostCommand post_cmd)
+static bool ScriptTitle(xmlpp::Element* ts_node, VideoItem vi, int titles_cnt)
 {
     xmlpp::Element* pgc_node = ts_node->add_child("pgc");
     xmlpp::Element* vob_node = pgc_node->add_child("vob");
@@ -275,10 +298,73 @@
         vob_node->set_attribute("chapters", chapters);
 
     xmlpp::Element* post_node = pgc_node->add_child("post");
-    post_node->add_child_text(post_cmd(vi));
+
+    std::string jnt_cmd = JumpNextTitle(vi, titles_cnt);
+    // чаще всего будет эта команда
+    std::string post_cmd = AutoPostCmd(jnt_cmd);
+    PostAction& pa = vi->PAction();
+    switch( pa.paTyp )
+    {
+    case patAUTO:
+        break;
+    case patNEXT_TITLE:
+        post_cmd = jnt_cmd;
+        break;
+    case patEXP_LINK:
+        if( pa.paLink )
+            post_cmd = MakeButtonJump(pa.paLink, true);
+        break;
+    default:
+        //ASSERT_RTL(0);
+        break; // не вылетаем на плохих проектах
+    }
+    post_node->add_child_text(post_cmd);
+
     return true;
 }
 
+static Menu GetFirstMenu()
+{
+    RefPtr mn_store = GetAStores().mnStore;
+    TSBegEnd menus_be          = BeginEnd(mn_store);
+    return (menus_be.first != menus_be.second) ? GetMenu(mn_store, menus_be.first) : Menu();
+}
+
+VideoItem GetFirstVideo()
+{
+    VideoItem first_vi;
+    ForeachVideo(bl::bind(&_GetFirstVideo, boost::ref(first_vi), bl::_1, bl::_2));
+    return first_vi;
+}
+
+bool Is4_3(VideoItem first_vi)
+{
+    bool is_4_3 = true;
+    if( first_vi )
+    {
+        Point asp = Project::CalcAspectSize(*first_vi);
+        if( asp == Point(16, 9) )
+            is_4_3 = false;
+    }
+    return is_4_3;
+}
+
+static bool Is4_3(MenuParams& prms)
+{
+    return prms.GetAF() != af16_9;
+}
+
+// ограничение: глобальная настройка для всех меню
+bool IsMenuToBe4_3()
+{
+    bool is_menu_4_3 = Is4_3(AData().GetDefMP()); // по умолчанию, если все пусто
+    if( Menu mn = GetFirstMenu() )
+        is_menu_4_3 = Is4_3(mn->Params());
+    else if( VideoItem f_vi = GetFirstVideo() )
+        is_menu_4_3 = Is4_3(f_vi);
+    return is_menu_4_3;
+}
+
 void GenerateDVDAuthorScript(const std::string& out_dir)
 {
     int titles_cnt = IndexVideosForAuthoring();
@@ -288,12 +374,9 @@
     RefPtr mn_store = as.mnStore;
     TSBegEnd menus_be          = BeginEnd(mn_store);
 
-    using namespace boost;
     MediaItem fp   = db.FirstPlayItem();
-    Menu root_menu = (menus_be.first != menus_be.second) ? 
-        GetMenu(mn_store, menus_be.first) : Menu();
-    VideoItem first_vi;
-    ForeachVideo(lambda::bind(&GetFirstVideo, boost::ref(first_vi), lambda::_1, lambda::_2));
+    Menu root_menu = GetFirstMenu();
+    VideoItem first_vi = GetFirstVideo();
 
     if( !fp )
     {
@@ -306,7 +389,7 @@
             Author::Warning("There is no First-Play media. Assume it is " + fp_name + ".");
         }
         else
-            Author::Error("There is no media (video or menu).");
+            Author::Error(_("There is no media (video or menu)."));
     }
     else // fp != 0
     {
@@ -323,7 +406,7 @@
         xmlpp::Element* vmgm_node = root_node->add_child("vmgm");
         vmgm_node->add_child_comment("First Play");
         xmlpp::Element* node = vmgm_node->add_child("fpc");
-        node->add_child_text("jump " + MakeFPTarget(fp) + ";");
+        node->add_child_text("jump menu entry title;");
         node = vmgm_node->add_child("menus");
         // из-за того, что в VMG мы не устанавливаем ни одно видео, то
         // надо явно инициализировать атрибуты (см. функцию BuildAVInfo()
@@ -342,30 +425,24 @@
         // кнопка "Title" = кнопка "Menu"
         xmlpp::Element* title_entry = node->add_child("pgc");
         title_entry->set_attribute("entry", "title");
-        title_entry->add_child("pre")->add_child_text("jump fpc;");
+        std::string init_cmd = "jump " + MakeFPTarget(fp) + ";";
+        if( root_menu )
+            // если есть меню (вообще есть), то инициализируем первое
+            init_cmd = boost::format("g1 = %1%; %2%") % GetMenuANum(root_menu) % init_cmd % bf::stop;
+        title_entry->add_child("pre")->add_child_text(init_cmd);
     }
     // основная часть
     {
         xmlpp::Element* tts_node   = root_node->add_child("titleset");
         // * меню
         xmlpp::Element* menus_node = tts_node->add_child("menus");
-        // :KLUDGE: у всех меню будут одинаковые параметры?
-        AddVideoTag(menus_node);
-        ForeachMenu(lambda::bind(&ScriptMenu, menus_node, root_menu, lambda::_1, lambda::_2));
+        AddVideoTag(menus_node, IsMenuToBe4_3());
+        ForeachMenu(bl::bind(&ScriptMenu, menus_node, root_menu, bl::_1, bl::_2));
         // * список разделов (titles)
         xmlpp::Element* ts_node = tts_node->add_child("titles");
-        bool is_4_3 = true;
-        if( first_vi )
-        {
-            Point asp = Project::CalcAspectSize(*first_vi);
-            if( asp == Point(16, 9) )
-                is_4_3 = false;
-        }
-        AddVideoTag(ts_node, is_4_3);
+        AddVideoTag(ts_node, Is4_3(first_vi));
 
-        TitlePostCommand post_cmd = root_menu ? TitlePostCommand(bl::bind(&CallRootMenu)) 
-            : TitlePostCommand(bl::bind(&JumpNextTitle, bl::_1, titles_cnt));
-        ForeachVideo(bl::bind(&ScriptTitle, ts_node, bl::_1, post_cmd));
+        ForeachVideo(bl::bind(&ScriptTitle, ts_node, bl::_1, titles_cnt));
     }
     doc.write_to_file_formatted(AppendPath(out_dir, "DVDAuthor.xml"));
 }
@@ -477,7 +554,7 @@
                 ExitData ed = Author::ExecuteSconsCmd(out_dir, of, es.mode, scons_options);
     
                 if( !ed.IsGood() )
-                    throw std::runtime_error("external command failure: " + ExitDescription(ed));
+                    throw std::runtime_error(BF_("external command failure: %1%") % ExitDescription(ed) % bf::stop);
             }
         }
         else
@@ -592,7 +669,7 @@
                          Mode mod, const str::stream& scons_options)
 {
     std::string cmd = "scons" + scons_options.str() + " " + SconsTarget(mod);
-    return ExecuteAsync(out_dir.c_str(), cmd.c_str(), of, &GetES().pid);
+    return ExecuteAsync(out_dir.c_str(), cmd.c_str(), of, &GetES().eDat.pid);
 }
 
 } // namespace Author
diff -Nru bombono-dvd-0.5.2/src/mgui/design.h bombono-dvd-0.6.0/src/mgui/design.h
--- bombono-dvd-0.5.2/src/mgui/design.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/design.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/design.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -43,7 +43,8 @@
 // Цвета
 
 // белый
-const uint TOP_LFT_CLR    = 0xffffffff;
+const uint WHITE_CLR      = 0xffffffff;
+const uint TOP_LFT_CLR    = WHITE_CLR;
 const uint BLACK_CLR      = 0x000000ff;
 const uint TRANS_CLR      = 0x00000000;
 
diff -Nru bombono-dvd-0.5.2/src/mgui/dialog.h bombono-dvd-0.6.0/src/mgui/dialog.h
--- bombono-dvd-0.5.2/src/mgui/dialog.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/dialog.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/dialog.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -22,10 +22,34 @@
 #ifndef __MGUI_DIALOG_H__
 #define __MGUI_DIALOG_H__
 
+#include 
+
+#include 
+
+
 // классический диалог сообщения, "Message Box"
 Gtk::ResponseType MessageBox(const std::string& msg_str, Gtk::MessageType typ,
                              Gtk::ButtonsType b_typ, const std::string& desc_str = std::string(),
                              bool def_ok = false);
+
+typedef boost::function MDFunctor;
+Gtk::ResponseType MessageBoxEx(const std::string& msg_str, Gtk::MessageType typ,
+                               Gtk::ButtonsType b_typ, const std::string& desc_str, const MDFunctor& fnr);
+
+
+void SetWeblinkCallback(Gtk::MessageDialog& mdlg);
+inline
+Gtk::ResponseType MessageBoxWeb(const std::string& msg_str, Gtk::MessageType typ,
+                                Gtk::ButtonsType b_typ, const std::string& desc_str)
+{
+    return MessageBoxEx(msg_str, typ, b_typ, desc_str, SetWeblinkCallback);
+}
+
+inline void ErrorBox(const std::string& err_msg)
+{
+    MessageBox(err_msg, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK);
+}
+
 void AddCancelDoButtons(Gtk::Dialog& dialog, Gtk::BuiltinStockID do_id);
 inline void AddCancelSaveButtons(Gtk::Dialog& dialog)
 { AddCancelDoButtons(dialog, Gtk::Stock::SAVE); }
@@ -33,9 +57,27 @@
 
 std::string MakeMessageBoxTitle(const std::string& title);
 
+typedef boost::function FCDFunctor;
 // запросить у пользователя файл для сохранения
 bool ChooseFileSaveTo(std::string& fname, const std::string& title, Gtk::Widget& for_wdg,
-                      bool convert_to_utf8 = true);
+                      const FCDFunctor& fnr = FCDFunctor());
+bool CheckKeepOrigin(const std::string& fname);
+
+//Gtk::VBox& AddHIGedVBox(Gtk::Dialog& dlg);
+struct DialogVBox: public Gtk::VBox
+{
+    RefPtr labelSg;
+
+    DialogVBox(bool homogeneous = false, int spacing = 0): 
+        Gtk::VBox(homogeneous, spacing), labelSg(Gtk::SizeGroup::create(Gtk::SIZE_GROUP_HORIZONTAL)) {}
+};
+
+DialogVBox& AddHIGedVBox(Gtk::Dialog& dlg);
+
+void AppendWithLabel(DialogVBox& vbox, Gtk::Widget& wdg, const char* label);
+// close_style - вариант для настроек (без OK)
+void CompleteDialog(Gtk::Dialog& dlg, bool close_style = false);
+
 
 #endif // #ifndef __MGUI_DIALOG_H__
 
diff -Nru bombono-dvd-0.5.2/src/mgui/dvdimport.cpp bombono-dvd-0.6.0/src/mgui/dvdimport.cpp
--- bombono-dvd-0.5.2/src/mgui/dvdimport.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/dvdimport.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/dvdimport.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2009 Ilya Murav'jov
+// Copyright (c) 2009-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -25,7 +25,9 @@
 
 #include  // FillEmpty()
 #include  // TryAddMedia()
+#include 
 
+#include "sdk/treemodel.h"
 #include "sdk/window.h"
 #include "sdk/packing.h"
 #include "sdk/widget.h"
@@ -36,13 +38,30 @@
 #include 
 #include 
 
+#include 
 #include 
 
 namespace DVD {
 
+struct VobFields
+{
+    Gtk::TreeModelColumn          selState;
+    Gtk::TreeModelColumn > thumbnail;
+    Gtk::TreeModelColumn   name;
+    Gtk::TreeModelColumn   desc;
+
+    VobFields(Gtk::TreeModelColumnRecord& rec)
+    {
+        rec.add(selState);
+        rec.add(thumbnail);
+        rec.add(name);
+        rec.add(desc);
+    }
+};
+
 static VobFields& VF()
 {
-    return VobFields::Instance();
+    return GetColumnFields();
 }
 
 ImportData::ImportData(): srcChooser(Gtk::FILE_CHOOSER_ACTION_OPEN), 
@@ -60,19 +79,19 @@
     switch( pg_num )
     {
     case ipCHOOSE_SOURCE: 
-        title = "Choose Source DVD-Video";
+        title = _("Choose Source DVD-Video");
         break;
     case ipSELECT_VOBS: 
-        title = "Select Videos to Import";
+        title = _("Select Videos to Import");
         break;
     case ipCHOOSE_DEST: 
-        title = "Select Folder to Save Videos";
+        title = _("Select Folder to Save Videos");
         break;
     case ipIMPORT_PROC: 
-        title = "Importing...";
+        title = _("Importing...");
         break;
     case ipEND: 
-        title = "Import is completed.";
+        title = _("Import is completed.");
         break;
     default: 
         ASSERT(0);
@@ -185,7 +204,7 @@
                 std::string desc = (str::stream(Mpeg::SecToHMS(vob.tmLen, true)) <<  ", "
                                     << vob.sz.x << "x" << vob.sz.y << ", "
                                     << (vob.aspect == af4_3 ? "4:3" : "16:9") << ", " 
-                                    << std::fixed << std::setprecision(2) << vob.Count()/512. << " Mb").str();
+                                    << std::fixed << std::setprecision(2) << vob.Count()/512. << " " << _("MB")).str();
                 row[VF().desc]      = desc;
             }
             CompleteSelection(id, false);
@@ -194,10 +213,8 @@
             id.numToThumb = 0;
         }
         
-        // бывают случаи вызова prepare на одной странице дважды 
-        // - set_current_page() + "map"
-        if( id.curPage != ipSELECT_VOBS ) // дважды
-            id.thumbIdler.ConnectIdle(bl::bind(&OnSelectIdle, boost::ref(id)));
+        ASSERT( id.curPage != ipSELECT_VOBS );
+        id.thumbIdler.ConnectIdle(bl::bind(&OnSelectIdle, boost::ref(id)));
     }
     else
         id.CloseIdlers();
@@ -233,11 +250,8 @@
     return reader;
 }
 
-static void OnSelectSource(ImportData& id)
+static ReaderPtr OpenDVD(const std::string& dvd_path, ImportData& id)
 {
-    Gtk::FileChooserWidget& fcw = id.srcChooser;
-    std::string dvd_path = fcw.get_filename().raw();
-
     bool is_pal;
     ReaderPtr rd = OpenDVD(dvd_path, is_pal);
     if( rd && id.addToProject && (is_pal != Project::AData().PalTvSystem()) )
@@ -250,6 +264,21 @@
 
     id.reader = rd;
     SetCurPageComplete(id.ast, id.reader);
+
+    return rd;
+}
+
+static void OnSelectSource(ImportData& id)
+{
+    if( id.ast.get_current_page() != ipCHOOSE_SOURCE )
+        return;
+
+    // :TODO: порой тупит и выдает "" (файл не выделен якобы)
+    // Из-за этого errLbl может скрываться когда не надо
+    Gtk::FileChooserWidget& fcw = id.srcChooser;
+    std::string dvd_path = fcw.get_filename().raw();
+
+    OpenDVD(dvd_path, id);
 }
 
 bool SetVobSel(Gtk::TreeIter& itr, bool select_all)
@@ -356,7 +385,7 @@
 static void PackSelectionButton(Gtk::HBox& hbox, RefPtr sg, bool select_all,
                                 ImportData& id)
 {
-    const char* text = select_all ? "Select All" : "Unselect All" ;
+    const char* text = select_all ? _("Select All") : _("Unselect All") ;
     Gtk::Button& btn = PackStart(hbox, NewManaged(text));
     sg->add_widget(btn);
 
@@ -378,7 +407,7 @@
 {
     // мы не можем пустить исключение здесь, потому что оно пойдет
     // и через C-шный код (Gtk) - отложим
-    if( MessageBox("Are you sure to stop importing?", 
+    if( MessageBox(_("Are you sure to stop importing?"), 
                    Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO) == Gtk::RESPONSE_YES )
         id.isBreak = true;
 }
@@ -400,13 +429,18 @@
 
 static void OnApply(ImportData& id)
 {
+// смотри коммит ae37d209 в git://git.gnome.org/gtk+
+#if GTK_CHECK_VERSION(2,17,7)
+    id.ast.set_current_page(ipIMPORT_PROC);
+#endif
+
     std::string& dir_path = id.destPath;
     VobArr& arr = id.dvdVobs;
     ASSERT( fs::is_directory(dir_path) );
 
     bool res = Project::HaveFullAccess(dir_path);
     if( !res )
-        MessageBox("Cant write to folder " + dir_path + " (check permissions).",
+        MessageBox(BF_("Cant write to folder %1% (check permissions).") % dir_path % bf::stop,
                    Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK);
     else
     {
@@ -434,7 +468,7 @@
                     std::string name  = itr->get_value(VF().name);
                     std::string fname = AppendPath(dir_path, name);
                     if( fs::exists(fname) )
-                        if( MessageBox("The file already " + name + " already exists. Overwrite it?",
+                        if( MessageBox(BF_("A file named \"%1%\" already exists. Do you want to replace it?") % name % bf::stop,
                                        Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO) != Gtk::RESPONSE_YES )
                         {
                             res = false;    
@@ -459,27 +493,26 @@
                     }
                     
                     if( id.addToProject )
-                    {
-                        std::string err_str;
-                        Gtk::TreePath pth;
-                        if( !Project::TryAddMedia(fname.c_str(), pth, err_str) )
-                            LOG_ERR << "Import error: " << err_str << io::endl;
-                    }
+                        Project::TryAddMediaQuiet(fname, "DVD Import");
                 }
         }
         catch(const std::exception& err)
         {
             res = false;
-	    const char* what = err.what();
-	    if( what && (strcmp(what, USERT_BREAK_STR) != 0) )
-	      MessageBox("Import error!", Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, what);
+    	    const char* what = err.what();
+    	    if( what && (strcmp(what, USERT_BREAK_STR) != 0) )
+                MessageBox(_("Import error!"), Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, what);
         }
     }
 
-    const char* final = res ? "Videos successfully imported." 
-        : "Import has been interrupted." ;
+    const char* final = res ? _("Videos successfully imported.") 
+        : _("Import has been interrupted.") ;
     FillLabelForImport(id.finalMsg, final);
+
+// смотри коммит ae37d209 в git://git.gnome.org/gtk+
+#if !GTK_CHECK_VERSION(2,17,7)
     id.ast.set_current_page(ipEND);
+#endif
 }
 
 static Gtk::VBox& AppendVBoxAsPage(Gtk::Assistant& ast, Gtk::Container*& page)
@@ -507,7 +540,7 @@
 void ConstructImporter(ImportData& id)
 {
     Gtk::Assistant& ast = id.ast;
-    ast.set_title("DVD-Video Import");
+    ast.set_title(_("DVD-Video Import"));
     ast.set_default_size(600, 500);
 
     ast.signal_cancel().connect(&Gtk::Main::quit);
@@ -530,7 +563,7 @@
                 typ = Gtk::ASSISTANT_PAGE_INTRO;
 
                 Gtk::FileChooserWidget& fcw = id.srcChooser;
-                PackFCWPage(vbox, fcw, "Choose DVD disc, DVD folder or iso image file.");
+                PackFCWPage(vbox, fcw, _("Choose DVD disc, DVD folder or iso image file."));
                 fcw.signal_selection_changed().connect(bl::bind(&OnSelectSource, ref_id));
 
                 // 
@@ -547,8 +580,9 @@
                 //fcw.set_filter(ff);
 
                 Gtk::Label& err_lbl = id.errLbl;
-                err_lbl.set_markup("NTSC/PAL mismatch. Try another disc"
-                                   " or import to project of corresponding type.");
+                err_lbl.set_markup(boost::format("%1%")
+                                   % _("NTSC/PAL mismatch. Try another disc or import to project of corresponding type.")
+                                   % bf::stop);
                 ast.add_action_widget(err_lbl); // по умолчанию не видна
                 SetExpandFill(err_lbl);
                 SetAlign(err_lbl);
@@ -561,7 +595,7 @@
                 page = &hbox;
 
                 RefPtr& vob_list = id.vobList;
-                vob_list = Gtk::ListStore::create(VF());
+                vob_list = Gtk::ListStore::create(GetColumnRecord());
 
                 Gtk::TreeView& view = NewManaged(vob_list);
                 view.signal_row_activated().connect(bl::bind(&OnVobActivate, bl::_1, ref_id));
@@ -571,7 +605,7 @@
                 sel_rndr.signal_toggled().connect(bl::bind(&OnSelVob, ref_id));
 
                 // имя
-                Gtk::TreeView::Column& name_cln = NewManaged("Name");
+                Gtk::TreeView::Column& name_cln = NewManaged(_("Name"));
                 name_cln.set_resizable(true);
                 name_cln.set_expand(true);
 
@@ -584,7 +618,7 @@
                 name_cln.pack_start(rndr);
                 name_cln.set_renderer(rndr, VF().name);
                 view.append_column(name_cln);
-                view.append_column("Details", VF().desc);
+                view.append_column(_("Details"), VF().desc);
 
                 Gtk::ScrolledWindow& scr_win = PackStart(hbox, NewManaged(),
                                                          Gtk::PACK_EXPAND_WIDGET);
@@ -630,7 +664,7 @@
                 typ = Gtk::ASSISTANT_PAGE_CONFIRM;
 
                 Gtk::FileChooserWidget& fcw = NewManaged(Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER);
-                PackFCWPage(vbox, fcw, "It is desirable the destination folder to be empty.");
+                PackFCWPage(vbox, fcw, _("It is desirable the destination folder to be empty."));
 
                 fcw.signal_selection_changed().connect(
                     bl::bind(&OnSelectDest, boost::ref(fcw), ref_id));
@@ -681,39 +715,26 @@
     id.addToProject = true;
 
     ConstructImporter(id);
-    
+    //
+    // По опыту с помощником (GtkAssistant) стало ясно:
+    // - до момента show_all() вообще нельзя менять текущую страницу,
+    //   типы страниц и т.д.; иначе легко получить "UB", выражающееся в сегфолтах
+    //   и хз еще в чем
+    // - вывод: хочется изменения в помощнике - создавай его по-другому с самого
+    //   начала (ConstructImporter())
+    //
+    ast.show_all();
+
     if( !dvd_path.empty() )
     {
-        // реализовать переход сразу на 2ю страницу оказалось
-        // непростым делом:
-        // - после явного открытия reader'а самое главное - 
-        //   не дать srcChooser переустановить его вызовом
-        //   OnSelectSource() =>
-        // - перепробовав все, что можно (и скрытие, и удаление
-        //   первой страницы, ...), стало ясно, что нельзя вызывать
-        //   show_all() окна, если на первой странице =>
-        // - простой переход на 2ю страницу дает сегфолт, если
-        //   ранее не проходил show_all() (см. интересную функцию
-        //   compute_last_button_state()) - пат
-        // - и только смена типа с GTK_ASSISTANT_PAGE_CONTENT на любой
-        //   другой дала нужный результат!
-
-        bool is_pal;
-        ReaderPtr rd = OpenDVD(dvd_path, is_pal);
-        if( rd && (is_pal == Project::AData().PalTvSystem()) )
-        {
-            // чтоб не смутить OnPreparePage()
-            id.curPage = ipCHOOSE_SOURCE;
-            id.reader = rd;
+        // перейдем в директорию
+        id.srcChooser.set_filename(dvd_path);
 
-            ast.set_page_type(*ast.get_nth_page(ipSELECT_VOBS), Gtk::ASSISTANT_PAGE_INTRO);
+        if( OpenDVD(dvd_path, id) )
             ast.set_current_page(ipSELECT_VOBS);
-        }
-        else
-            // не получилось - тогда хотя бы перейдем в директорию
-            id.srcChooser.select_filename(dvd_path);
     }
-    RunWindow(ast);
+
+    Gtk::Main::run(ast);
 }
 
 } // namespace DVD
diff -Nru bombono-dvd-0.5.2/src/mgui/dvdimport.h bombono-dvd-0.6.0/src/mgui/dvdimport.h
--- bombono-dvd-0.5.2/src/mgui/dvdimport.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/dvdimport.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/dvdimport.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2009 Ilya Murav'jov
+// Copyright (c) 2009-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -47,25 +47,6 @@
     ipPAGE_NUM,          // число страниц
 };
 
-struct VobFields: public Gtk::TreeModelColumnRecord, 
-                  public Singleton
-{
-    Gtk::TreeModelColumn          selState;
-    Gtk::TreeModelColumn > thumbnail;
-    Gtk::TreeModelColumn   name;
-    Gtk::TreeModelColumn   desc;
-
-    protected:
-    VobFields() 
-    { 
-        add(selState);
-        add(thumbnail);
-        add(name);
-        add(desc);
-    }
-    friend class Singleton; // из-за не тривиального конструктора
-};
-
 void InitPreview(ImportData& id, AspectFormat af);
 inline void InitDefPreview(ImportData& id) { InitPreview(id, af4_3); }
 
diff -Nru bombono-dvd-0.5.2/src/mgui/editor/actions.cpp bombono-dvd-0.6.0/src/mgui/editor/actions.cpp
--- bombono-dvd-0.5.2/src/mgui/editor/actions.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/editor/actions.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/editor/actions.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -106,6 +106,11 @@
     return GetKeyboardState() & Gdk::CONTROL_MASK;
 }
 
+inline bool IsAltPressed()
+{
+    return GetKeyboardState() & Gdk::MOD1_MASK;
+}
+
 void Editor::Kit::on_drag_data_received(const RefPtr& context, int x, int y, 
                                         const Gtk::SelectionData& selection_data, guint info, guint time)
 {
@@ -135,9 +140,8 @@
                 }
                 else
                 {
-                    // меняем ссылку
-                    int_array single;
-                    SetObjectsLinks(*this, mi, (single.push_back(pos), single));
+                    // меняем ссылку/постер
+                    SetLinkForObject(*this, mi, pos, IsAltPressed());
                 }
             }
         }
@@ -146,7 +150,7 @@
     return MyParent::on_drag_data_received(context, x, y, selection_data, info, time);
 }
 
-static void DrawDndFrame(RGBA::Drawer& drw, const Rect& dnd_rct)
+static void DrawDndFrame(RGBA::Drawer* drw, const Rect& dnd_rct)
 {
     Rect rct(dnd_rct);
     // обводим внутри
@@ -155,9 +159,33 @@
     if( !rct.IsValid() )
         return;
 
-    drw.SetForegroundColor(BLUE_CLR);
-    drw.MoveTo(rct.lft, rct.top);
-    drw.FrameRectTo(rct.rgt, rct.btm);
+    drw->SetForegroundColor(BLUE_CLR);
+    drw->MoveTo(rct.lft, rct.top);
+    drw->FrameRectTo(rct.rgt, rct.btm);
+}
+
+static void DrawRect(RGBA::Drawer* drw, const Rect& rct, const int clr)
+{
+    drw->SetForegroundColor(clr);
+    drw->MoveTo(rct.lft, rct.top);
+    drw->FrameRectTo(rct.rgt, rct.btm);
+}
+
+static void DrawSafeArea(RGBA::Drawer* drw, MEditorArea& edt_area)
+{
+    Rect frm_rct = edt_area.FrameRect();
+    // с каждой стороны убираем 4,7%
+    const double safe_size = 1 - 0.047*2;
+
+    Rect rct = frm_rct;
+    rct.SetWidth(Round(frm_rct.Width()*safe_size));
+    rct.SetHeight(Round(frm_rct.Height()*safe_size));
+
+    rct = CenterRect(rct, frm_rct, true, true);
+
+    const int SA_BLUE = 0x3465a4ff; // цвет как у иконки :)
+    DrawRect(drw, rct+Point(2, 2), SA_BLUE);
+    DrawRect(drw, rct, WHITE_CLR);
 }
 
 void RenderEditor(MEditorArea& edt_area, RectListRgn& rct_lst)
@@ -165,23 +193,38 @@
     RenderVis r_vis(edt_area.SelArr(), rct_lst);
     edt_area.CurMenuRegion().Accept(r_vis);
 
-    DrawDndFrame(*r_vis.GetDrawer(), edt_area.DndSelFrame());
+    RGBA::Drawer* drw = &r_vis.GetDrawer(); 
+    DrawDndFrame(drw, edt_area.DndSelFrame());
+
+    if( edt_area.Toolbar().frmBtn.get_active() )
+        DrawSafeArea(drw, edt_area);
 }
 
-void Editor::Kit::SetDndFrame(const Rect& dnd_rct)
+typedef boost::function DrawerFnr;
+
+static void CalcRgnForRedraw(MEditorArea& edt_area, const DrawerFnr& fnr)
 {
-    if( dndSelFrame != dnd_rct ) // нужна перерисовка
-    {
-        RectListRgn rct_lst;
-        RGBA::RectListDrawer lst_drawer(rct_lst);
-        DrawDndFrame(lst_drawer, dndSelFrame);
-        DrawDndFrame(lst_drawer, dnd_rct);
+    RectListRgn rct_lst;
+    RGBA::RectListDrawer lst_drawer(rct_lst);
 
-        // *
-        dndSelFrame = dnd_rct;
+    fnr(&lst_drawer);
 
-        RenderForRegion(*this, rct_lst);
-    }
+    RenderForRegion(edt_area, rct_lst);
+}
+
+void Editor::Kit::RecalcForDndFrame(RGBA::Drawer* lst_drawer, const Rect& dnd_rct)
+{
+    DrawDndFrame(lst_drawer, dndSelFrame);
+    DrawDndFrame(lst_drawer, dnd_rct);
+
+    // *
+    dndSelFrame = dnd_rct;
+}
+
+void Editor::Kit::SetDndFrame(const Rect& dnd_rct)
+{
+    if( dndSelFrame != dnd_rct ) // нужна перерисовка
+        CalcRgnForRedraw(*this, bl::bind(&Editor::Kit::RecalcForDndFrame, this, bl::_1, dnd_rct));
 }
 
 void Editor::Kit::on_drag_leave(const RefPtr& context, guint time)
@@ -220,3 +263,8 @@
     return MyParent::on_drag_motion(context, x, y, time);
 }
 
+void ToggleSafeArea(MEditorArea& edt_area)
+{
+    CalcRgnForRedraw(edt_area, bl::bind(&DrawSafeArea, bl::_1, boost::ref(edt_area)));
+}
+
diff -Nru bombono-dvd-0.5.2/src/mgui/editor/kit.cpp bombono-dvd-0.6.0/src/mgui/editor/kit.cpp
--- bombono-dvd-0.5.2/src/mgui/editor/kit.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/editor/kit.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/editor/kit.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -142,7 +142,7 @@
     //canv_pix->fill(BLACK_CLR);
 
     Point sz(PixbufSize(canv_pix));
-    canv_pix->fill(0xffffffff);
+    canv_pix->fill(WHITE_CLR);
 
     double rel = 0.5; //2./3.; // центр логотипа правее и ниже
     // :TODO: optimize?
diff -Nru bombono-dvd-0.5.2/src/mgui/editor/kit.h bombono-dvd-0.6.0/src/mgui/editor/kit.h
--- bombono-dvd-0.5.2/src/mgui/editor/kit.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/editor/kit.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/editor/kit.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -26,6 +26,7 @@
 #include "tool.h" 
 
 #include  
+#include  
 
 namespace Editor
 {
@@ -50,6 +51,7 @@
        Gtk::ToggleButton  itaBtn;
        Gtk::ToggleButton  undBtn;
         Gtk::ColorButton  clrBtn;
+       Gtk::ToggleButton  frmBtn; // безопасная рамка
 
                           Toolbar();
                           // по font* составить
@@ -99,6 +101,7 @@
        virtual void  DoOnConfigure(bool is_update);
 
 void SetDndFrame(const Rect& dnd_rct);
+void RecalcForDndFrame(RGBA::Drawer* lst_drawer, const Rect& dnd_rct);
 };
 
 class ClearInitTextVis: public GuiObjVisitor
diff -Nru bombono-dvd-0.5.2/src/mgui/editor/select.cpp bombono-dvd-0.6.0/src/mgui/editor/select.cpp
--- bombono-dvd-0.5.2/src/mgui/editor/select.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/editor/select.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/editor/select.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -35,6 +35,7 @@
 #include 
 #include 
 #include   // Popup()
+#include 
 
 #include 
 
@@ -256,23 +257,33 @@
 
 static void DeleteSelObjects(MEditorArea& edt_area);
 
+typedef boost::function CMFunctor;
+ 
+static void ForeachSelectedCM(MEditorArea& edt_area, const CMFunctor& fnr)
+{
+    MenuRegion& m_rgn = edt_area.CurMenuRegion();
+    Comp::ListObj::ArrType& lst = m_rgn.List();
+    const int_array sel_arr     = edt_area.SelArr();
+    for( int i=0; i<(int)sel_arr.size(); ++i )
+        if( Comp::MediaObj* obj = dynamic_cast(lst[sel_arr[i]]) )
+            if( fnr(obj) )
+               break;
+}
+
+static bool GetFirstMILink(Comp::MediaObj* obj, Project::MediaItem& res_mi)
+{
+    res_mi = obj->MediaItem();
+    return true;
+}
+
 static Project::MediaItem GetCurObjectLink(MEditorArea& edt_area, bool is_background)
 {
     Project::MediaItem res_mi;
-    MenuRegion& m_rgn = edt_area.CurMenuRegion();
     if( is_background )
-        res_mi = m_rgn.BgRef();
+        res_mi = edt_area.CurMenuRegion().BgRef();
     else
-    {
-        Comp::ListObj::ArrType& lst = m_rgn.List();
-        const int_array sel_arr     = edt_area.SelArr();
-        for( int i=0; i<(int)sel_arr.size(); ++i )
-            if( Comp::MediaObj* obj = dynamic_cast(lst[sel_arr[i]]) )
-            {
-                res_mi = obj->MediaItem();
-                break;
-            }
-    }
+        ForeachSelectedCM(edt_area, bl::bind(&GetFirstMILink, bl::_1, boost::ref(res_mi)));
+
     return res_mi;
 }
 
@@ -297,6 +308,157 @@
 
 static void SetBgColor(MEditorArea& edt_area);
 
+static void ForAllSelectedFTO(Editor::FTOFunctor fnr, MEditorArea& edt_area)
+{
+    Editor::ForAllSelectedFTO(fnr, edt_area.CurMenuRegion(), edt_area.SelArr());
+}
+
+static bool GetCurPosterLink_(FrameThemeObj* obj, Project::MediaItem& mi, bool& can_set_poster)
+{
+    can_set_poster = true;
+    mi = obj->PosterItem();
+    return false;
+}
+
+static Project::MediaItem GetCurPosterLink(MEditorArea& edt_area, bool& can_set_poster)
+{
+    can_set_poster = false;
+    Project::MediaItem mi;
+    ForAllSelectedFTO(
+        bl::bind(&GetCurPosterLink_, bl::_1, boost::ref(mi), boost::ref(can_set_poster)), 
+        edt_area);
+    return mi;
+}
+
+static void SetObjectsLinksEx(MEditorArea& edt_area, Project::MediaItem mi, const int_array& items,
+                              bool for_poster)
+{
+    ClearLinkVis sr_vis(items, mi, for_poster);
+    RenderByRLV(edt_area, sr_vis);
+}
+
+void SetLinkForObject(MEditorArea& edt_area, Project::MediaItem mi, int pos, bool for_poster)
+{
+    int_array single;
+    single.push_back(pos);
+    SetObjectsLinksEx(edt_area, mi, single, for_poster);
+}
+
+static void SetObjectsLinks(MEditorArea& edt_area, Project::MediaItem mi, bool for_poster)
+{
+    SetObjectsLinksEx(edt_area, mi, edt_area.SelArr(), for_poster);
+}
+
+static void SetPoster(MEditorArea& edt_area, Project::MediaItem mi)
+{
+    SetObjectsLinks(edt_area, mi, true);
+}
+
+class PosterMenuBuilder: public Project::EditorMenuBuilder
+{
+    typedef Project::EditorMenuBuilder MyParent;
+    public:
+                    PosterMenuBuilder(Project::MediaItem cur_itm, MEditorArea& ed)
+                        :MyParent(cur_itm, ed, true) {}
+
+    virtual ActionFunctor  CreateAction(Project::MediaItem mi)
+    {
+        return bl::bind(&SetPoster, boost::ref(editor), mi);
+    }
+};
+
+static bool CalcAlignSettings(Comp::MediaObj* obj, Rect& edge_rct, bool& is_first)
+{
+    Rect rct = obj->Placement();
+    edge_rct.lft = is_first ? rct.lft : std::min(rct.lft, edge_rct.lft);
+    edge_rct.rgt = is_first ? rct.rgt : std::max(rct.rgt, edge_rct.rgt);
+    edge_rct.top = is_first ? rct.top : std::min(rct.top, edge_rct.top);
+    edge_rct.btm = is_first ? rct.btm : std::max(rct.btm, edge_rct.btm);
+
+    is_first = false;
+    return false;
+}
+
+typedef boost::function CMFunctor2;
+
+class AlignVis: public CommonDrawVis
+{
+    typedef CommonDrawVis MyParent;
+    public:
+        CMFunctor2  alignFnr;
+
+                  AlignVis(const CMFunctor2& fnr, const int_array& sel_arr)
+                    : MyParent(sel_arr), alignFnr(fnr) { }
+
+   virtual  void  Visit(FrameThemeObj& fto) { RepositionObj(fto, MakeFTOMoving(fto)); }
+   virtual  void  Visit(TextObj& t_obj)     { RepositionObj(t_obj, MakeTextMoving(t_obj)); }
+
+            void  RepositionObj(Comp::MediaObj& m_obj, Manager ming);
+};
+
+void AlignVis::RepositionObj(Comp::MediaObj& m_obj, Manager ming)
+{
+    if( IsObjSelected() )
+    {
+        Draw(ming);
+        alignFnr(&m_obj);
+        Draw(ming);
+    }
+}
+
+static void LeftAlignImpl(Comp::MediaObj* m_obj, const Rect& edge_rct)
+{
+    Rect rct = m_obj->Placement(); 
+    m_obj->SetPlacement(rct + Point(edge_rct.lft-rct.lft, 0));
+}
+
+static void RightAlignImpl(Comp::MediaObj* m_obj, const Rect& edge_rct)
+{
+    Rect rct = m_obj->Placement(); 
+    m_obj->SetPlacement(rct + Point(edge_rct.rgt-rct.rgt, 0));
+}
+
+static void TopAlignImpl(Comp::MediaObj* m_obj, const Rect& edge_rct)
+{
+    Rect rct = m_obj->Placement(); 
+    m_obj->SetPlacement(rct + Point(0, edge_rct.top-rct.top));
+}
+
+static void BottomAlignImpl(Comp::MediaObj* m_obj, const Rect& edge_rct)
+{
+    Rect rct = m_obj->Placement(); 
+    m_obj->SetPlacement(rct + Point(0, edge_rct.btm-rct.btm));
+}
+
+static void CenterHzImpl(Comp::MediaObj* m_obj, const Rect& edge_rct)
+{
+    m_obj->SetPlacement(CenterRect(m_obj->Placement(), edge_rct, true, false));
+}
+
+static void CenterVrImpl(Comp::MediaObj* m_obj, const Rect& edge_rct)
+{
+    m_obj->SetPlacement(CenterRect(m_obj->Placement(), edge_rct, false, true));
+}
+
+typedef boost::function CMFunctor3;
+
+static void AlignByFunctor(MEditorArea& edt_area, const CMFunctor3& fnr)
+{
+    Rect edge_rct;
+    bool is_first = true;
+    ForeachSelectedCM(edt_area, bl::bind(&CalcAlignSettings, bl::_1, boost::ref(edge_rct), boost::ref(is_first)));
+    ASSERT( !is_first );
+
+    AlignVis vis(bl::bind(fnr, bl::_1, edge_rct), edt_area.SelArr());
+    RenderByRLV(edt_area, vis);
+}
+
+static void AddAlignItem(Gtk::Menu& menu, const CMFunctor3& fnr, const char* name, MEditorArea& edt_area)
+{
+    Gtk::MenuItem& itm = AppendMI(menu, NewManaged(name));
+    itm.signal_activate().connect(bl::bind(&AlignByFunctor, boost::ref(edt_area), fnr));
+}
+
 void NormalSelect::OnMouseDown(MEditorArea& edt_area, GdkEventButton* event)
 {
     int sel_pos;
@@ -329,11 +491,12 @@
         DoSelection(edt_area, dat, false);
 
         using namespace Gtk::Menu_Helpers;
-        bool is_background = edt_area.SelArr().empty();
+        const int_array& sel_arr = edt_area.SelArr();
+        bool is_background = sel_arr.empty();
         Gtk::Menu& mn      = NewPopupMenu(); 
         boost::reference_wrapper edt_ref(edt_area);
 
-        mn.items().push_back(MenuElem("Delete", bl::bind(&DeleteSelObjects, edt_ref)));
+        mn.items().push_back(MenuElem(_("Delete"), bl::bind(&DeleteSelObjects, edt_ref)));
         if( is_background )
             mn.items().back().set_sensitive(false);
         mn.items().push_back(SeparatorElem());
@@ -347,20 +510,49 @@
         InvokeOn(cur_mn, "SetLinkMenu");
         if( slm.linkMenu )
         {
-            mn.items().push_back(MenuElem("Link"));
+            mn.items().push_back(MenuElem(_("Link")));
             mn.items().back().set_submenu(*slm.linkMenu.release());
         }
-
         mn.items().push_back(
-            MenuElem("Remove Link", bl::bind(&SetSelObjectsLinks, edt_ref, 
-                                             Project::MediaItem(), is_background)));
-        Gtk::MenuItem& bg_itm = AppendMI(mn, NewManaged("Set Background Color"));
+            MenuElem(_("Remove Link"), bl::bind(&SetSelObjectsLinks, edt_ref, 
+                                                Project::MediaItem(), is_background)));
+
+        // Poster Link
+        Gtk::MenuItem& poster_itm = AppendMI(mn, NewManaged(_("Set Poster")));
+        bool can_set_poster;
+        Project::MediaItem cur_pstr = GetCurPosterLink(edt_area, can_set_poster);
+        poster_itm.set_sensitive(can_set_poster);
+        if( can_set_poster )
+            poster_itm.set_submenu(PosterMenuBuilder(cur_pstr, edt_area).Create());
+
+        // Align
+        {
+            Gtk::MenuItem& align_itm = AppendMI(mn, NewManaged(_("Align")));
+            bool can_align = !is_background;
+            align_itm.set_sensitive(can_align);
+            if( can_align )
+            {
+                Gtk::Menu& menu = NewManaged();
+                align_itm.set_submenu(menu);
+
+                AddAlignItem(menu, LeftAlignImpl,   _("Align Left"),   edt_area);
+                AddAlignItem(menu, RightAlignImpl,  _("Align Right"),  edt_area);
+                AddAlignItem(menu, TopAlignImpl,    _("Align Top"),    edt_area);
+                AddAlignItem(menu, BottomAlignImpl, _("Align Bottom"), edt_area);
+                menu.append(NewManaged());
+
+                AddAlignItem(menu, CenterHzImpl, _("Center Horizontally"), edt_area);
+                AddAlignItem(menu, CenterVrImpl, _("Center Vertically"),   edt_area);
+            }
+        }
+
+        // Set Background Color
+        Gtk::MenuItem& bg_itm = AppendMI(mn, NewManaged(_("Set Background Color...")));
         bg_itm.set_sensitive(is_background);
         bg_itm.signal_activate().connect(bl::bind(&SetBgColor, edt_ref));
 
         //mn.accelerate(edt_area);
-        mn.show_all();
-        Popup(mn, event);
+        Popup(mn, event, true);
     }
 }
 
@@ -570,44 +762,44 @@
 {
     if( IsObjSelected() )
     {
-        fto.MediaItem() = newMI;
-        fto.GetData().ClearPix();
+        Project::MediaItem old_mi = Project::MIToDraw(fto);
+        Project::GetFTOLink(fto, forPoster).SetLink(newMI);
+
+        if( old_mi != Project::MIToDraw(fto) )
+        {
+            // нужна перерисовка
+            fto.GetData().ClearPix();
+            MyParent::Visit(fto);
+        }
     }
-    MyParent::Visit(fto);
 }
 
 void ClearLinkVis::Visit(TextObj& t_obj)
 {
-    if( IsObjSelected() )
-        t_obj.MediaItem() = newMI;
+    if( !forPoster && IsObjSelected() )
+        t_obj.MediaItem().SetLink(newMI);
     //MyParent::Visit(t_obj);
 }
 
 void SetBackgroundLink(MEditorArea& edt_area, Project::MediaItem mi)
 {
     MenuRegion& mr = edt_area.CurMenuRegion();
-    mr.BgRef() = mi;
+    mr.BgRef().SetLink(mi);
     ResetBackgroundImage(mr);
     RenderForRegion(edt_area, Rect0Sz(edt_area.FramePlacement().Size()));
 }
 
-void SetObjectsLinks(MEditorArea& edt_area, Project::MediaItem mi, const int_array& items)
-{
-    ClearLinkVis sr_vis(items, mi);
-    RenderByRLV(edt_area, sr_vis);
-}
-
 void SetSelObjectsLinks(MEditorArea& edt_area, Project::MediaItem mi, bool is_background)
 {
     if( is_background )
         SetBackgroundLink(edt_area, mi);
     else
-        SetObjectsLinks(edt_area, mi, edt_area.SelArr());
+        SetObjectsLinks(edt_area, mi, false);
 }
 
 static void SetBgColor(MEditorArea& edt_area)
 {
-    Gtk::ColorSelectionDialog dlg("Pick a Color for Background");
+    Gtk::ColorSelectionDialog dlg(_("Set Background Color..."));
     Gtk::ColorSelection& sel = *dlg.get_colorsel();
     RGBA::Pixel& bg_clr      = edt_area.CurMenuRegion().BgColor();
 
diff -Nru bombono-dvd-0.5.2/src/mgui/editor/toolbar.cpp bombono-dvd-0.6.0/src/mgui/editor/toolbar.cpp
--- bombono-dvd-0.5.2/src/mgui/editor/toolbar.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/editor/toolbar.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/editor/toolbar.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -36,6 +36,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -125,10 +126,10 @@
     // * инструменты
     Gtk::RadioToolButton::Group group;
     // Selection Tool
-    selTool.set_tooltip(TooltipFactory(), "Selection Tool (S)");
+    selTool.set_tooltip(TooltipFactory(), boost::format("%1% (S)") % _("Selection Tool") % bf::stop);
     Gtk::set_group(selTool, group);
     // Text Tool
-    txtTool.set_tooltip(TooltipFactory(), "Text Tool (T)");
+    txtTool.set_tooltip(TooltipFactory(), boost::format("%1% (T)") % _("Text Tool") % bf::stop);
     Gtk::set_group(txtTool, group);
 
     // * выбор рамки
@@ -321,7 +322,7 @@
     {
         Point sz(mr.GetParams().Size());
         Point obj_sz = CalcStandardObjectSize(sz);
-        Point a      = FindAForCenteredRect(obj_sz, Rect0Sz(sz), true, true);
+        Point a      = FindAForCenteredRect(obj_sz, Rect0Sz(sz));
 
         lct = RectASz(a, obj_sz);
     }
@@ -489,7 +490,7 @@
 
         // * кнопка
         Gtk::ToolButton& add_btn = NewManaged(Gtk::StockID(Gtk::Stock::ADD));
-        add_btn.set_tooltip(TooltipFactory(), "Add Item");
+        add_btn.set_tooltip(TooltipFactory(), _("Add Item"));
         tbar.append(add_btn);
         add_btn.signal_clicked().connect( bl::bind(&AddObjectClicked, boost::ref(editor)) );
     }
@@ -511,7 +512,7 @@
         AppendToToolbarWithAC(tbar, fonts_ent, true);
         {
             Gtk::Entry& ent = *fonts_ent.get_entry();
-            SetTip(ent, "Font Name");
+            SetTip(ent, _("Font Name"));
             ConnectOnActivate(ent, on_font_change);
         }
 
@@ -527,28 +528,40 @@
             Gtk::Entry& ent = *size_ent.get_entry();
             LimitTextInput(ent, "0123456789.,");
             ent.set_width_chars(5);
-            SetTip(ent, "Font Size");
+            SetTip(ent, _("Font Size"));
             ConnectOnActivate(ent, on_font_change);
         }
 
         // * кнопки стилей шрифта
-        SetupStyleBtn(edt_tbar.bldBtn, tbar, "Bold", on_font_change, Gtk::Stock::BOLD);
-        SetupStyleBtn(edt_tbar.itaBtn, tbar, "Italic", on_font_change, Gtk::Stock::ITALIC);
-        SetupStyleBtn(edt_tbar.undBtn, tbar, "Underline", on_font_change, Gtk::Stock::UNDERLINE);
+        SetupStyleBtn(edt_tbar.bldBtn, tbar, _("Bold"), on_font_change, Gtk::Stock::BOLD);
+        SetupStyleBtn(edt_tbar.itaBtn, tbar, _("Italic"), on_font_change, Gtk::Stock::ITALIC);
+        SetupStyleBtn(edt_tbar.undBtn, tbar, _("Underline"), on_font_change, Gtk::Stock::UNDERLINE);
 
         // * кнопка цвета текста
         Gtk::ColorButton& clr_btn = edt_tbar.clrBtn;
         clr_btn.set_use_alpha();
+        clr_btn.set_relief(Gtk::RELIEF_NONE);
         clr_btn.set_color(RGBA::PixelToColor(GOLD_CLR));
         clr_btn.set_alpha(0xffff);
 
-        clr_btn.set_title("Pick a Color for Text");
+        clr_btn.set_title(_("Pick a Color for Text"));
         clr_btn.set_focus_on_click(false);
-        SetTip(clr_btn, "Text Color");
+        SetTip(clr_btn, _("Text Color"));
 
         clr_btn.signal_color_set().connect(bl::bind(&FontNameChanged, boost::ref(editor), true));
         AppendToToolbar(tbar, clr_btn);
+
     }
+
+    // * кнопка рамки
+    Gtk::ToggleButton& frm_btn = edt_tbar.frmBtn;
+    AppendToToolbar(tbar, frm_btn);
+    frm_btn.set_relief(Gtk::RELIEF_NONE);
+    frm_btn.add(GetFactoryGtkImage("copy-n-paste/lpetool_show_bbox.png"));
+    SetTip(frm_btn, _("Show Safe Area"));
+    // обвязка otc здесь используется для проверки, что в редакторе есть меню (и не валится при его отстутствии)
+    frm_btn.signal_toggled().connect(bl::bind(otc, ActionFunctor(bl::bind(&ToggleSafeArea, boost::ref(editor)))));
+
     return tbar;
 }
 
diff -Nru bombono-dvd-0.5.2/src/mgui/editor/toolbar.h bombono-dvd-0.6.0/src/mgui/editor/toolbar.h
--- bombono-dvd-0.5.2/src/mgui/editor/toolbar.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/editor/toolbar.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/editor/toolbar.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -44,7 +44,7 @@
 namespace Project
 {
 
-void AddFTOItem(MenuRegion& menu_rgn, const std::string& theme, const Rect& lct, MediaItem mi);
+FrameThemeObj* AddFTOItem(MenuRegion& menu_rgn, const std::string& theme, const Rect& lct, MediaItem mi);
 void AddMenuItem(MenuRegion& menu_rgn, Comp::Object* obj);
 
 // вспомогательная структура для передачи меню ссылок
@@ -84,7 +84,48 @@
 void SetSelObjectsTStyle(MEditorArea& edt_area, const Editor::TextStyle& ts, bool only_clr);
 
 void SetBackgroundLink(MEditorArea& edt_area, Project::MediaItem mi);
-void SetObjectsLinks(MEditorArea& edt_area, Project::MediaItem mi, const int_array& items);
+void SetLinkForObject(MEditorArea& edt_area, Project::MediaItem mi, int pos, bool for_poster);
+
+void ToggleSafeArea(MEditorArea& edt_area);
+
+namespace Project {
+
+class CommonMenuBuilder
+{
+    public:
+                           CommonMenuBuilder(MediaItem cur_itm, bool for_poster);
+    virtual               ~CommonMenuBuilder() {}
+
+    virtual ActionFunctor  CreateAction(MediaItem mi) = 0;
+
+                Gtk::Menu& Create();
+    virtual          void  AddConstantChoice(Gtk::Menu& lnk_list);
+
+    protected:
+              MediaItem  curItm; // текущая ссылка
+                   bool  forPoster; // визуальная ссылка или для переходов (может быть меню, не может быть рисунком)
+
+              Gtk::Menu& resMenu;  // результирующее меню; обязательно должно быть присоединено после Creat(),
+                                   // иначе утечка
+  Gtk::RadioButtonGroup  radioGrp;
+
+Gtk::RadioMenuItem& 
+AddMediaItemChoice(Gtk::Menu& lnk_list, MediaItem mi, const std::string& name = std::string());
+};
+
+void AppendRadioItem(Gtk::RadioMenuItem& itm, bool is_active, const ActionFunctor& fnr, Gtk::Menu& lnk_list);
+
+class EditorMenuBuilder: public CommonMenuBuilder
+{
+    typedef CommonMenuBuilder MyParent;
+    public:
+                           EditorMenuBuilder(MediaItem cur_itm, MEditorArea& ed, bool for_poster): 
+                               MyParent(cur_itm, for_poster), editor(ed) {}
+    protected:
+            MEditorArea& editor;
+};
+
+} // namespace Project
 
 #endif // __MGUI_EDITOR_TOOLBAR_H__
 
diff -Nru bombono-dvd-0.5.2/src/mgui/editor/visitors.h bombono-dvd-0.6.0/src/mgui/editor/visitors.h
--- bombono-dvd-0.5.2/src/mgui/editor/visitors.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/editor/visitors.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/editor/visitor.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008 Ilya Murav'jov
+// Copyright (c) 2008, 2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -95,10 +95,11 @@
 {
     typedef SelRectVis MyParent;
     public:
-        Project::MediaItem newMI;
+        Project::MediaItem  newMI;
+                      bool  forPoster; //false для ссылок пунктов меню, true - постер только для FTO
 
-                  ClearLinkVis(const int_array& sel_arr, Project::MediaItem mi)
-                    : MyParent(sel_arr), newMI(mi) {}
+                  ClearLinkVis(const int_array& sel_arr, Project::MediaItem mi, bool for_poster)
+                    : MyParent(sel_arr), newMI(mi), forPoster(for_poster) {}
 
    virtual  void  Visit(FrameThemeObj& fto);
    virtual  void  Visit(TextObj& t_obj);
diff -Nru bombono-dvd-0.5.2/src/mgui/execution.cpp bombono-dvd-0.6.0/src/mgui/execution.cpp
--- bombono-dvd-0.5.2/src/mgui/execution.cpp	1970-01-01 01:00:00.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/execution.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -0,0 +1,80 @@
+//
+// mgui/execution.cpp
+// This file is part of Bombono DVD project.
+//
+// Copyright (c) 2010 Ilya Murav'jov
+//
+// This program 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.
+//
+// This program 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 this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+
+#include 
+
+#include "execution.h"
+#include "dialog.h"
+#include "gettext.h"
+
+#include  // ::Spawn()
+
+#include 
+#include  // SIGTERM
+
+
+namespace Execution
+{
+
+void Stop(GPid& pid)
+{
+    ASSERT( pid != NO_HNDL );
+    kill(pid, SIGTERM);
+}
+
+void Data::StopExecution(const std::string& what)
+{
+    // COPY_N_PASTE - тупо сделал содержимое сообщений как у "TSNAMI-MPEG DVD Author"
+    // А что делать - нафига свои придумывать, если смысл один и тот же
+    if( Gtk::RESPONSE_YES == MessageBox(BF_("You are about to cancel %1%. Are you sure?") % what 
+                                            % bf::stop, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO) )
+    {
+        userAbort = true;
+        if( pid != NO_HNDL ) // во время выполнения внешней команды
+            Stop(pid);
+    }
+}
+
+static bool PulseProgress(Gtk::ProgressBar& prg_bar)
+{
+    prg_bar.pulse();
+    return true;
+}
+
+Pulse::Pulse(Gtk::ProgressBar& prg_bar) 
+{ 
+    tm.Connect(bl::bind(&PulseProgress, boost::ref(prg_bar)), 500); 
+}
+
+Pulse::~Pulse() 
+{
+    tm.Disconnect(); 
+}
+
+void SimpleSpawn(const char *commandline, const char* dir)
+{
+    GPid p = Spawn(dir, commandline);
+    ASSERT_RTL( p > 0 );
+    g_spawn_close_pid(p);
+}
+
+} // namespace Execution
+
diff -Nru bombono-dvd-0.5.2/src/mgui/execution.h bombono-dvd-0.6.0/src/mgui/execution.h
--- bombono-dvd-0.5.2/src/mgui/execution.h	1970-01-01 01:00:00.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/execution.h	2010-04-16 12:53:55.000000000 +0100
@@ -0,0 +1,60 @@
+//
+// mgui/execution.h
+// This file is part of Bombono DVD project.
+//
+// Copyright (c) 2010 Ilya Murav'jov
+//
+// This program 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.
+//
+// This program 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 this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+
+#ifndef __MGUI_EXECUTION_H__
+#define __MGUI_EXECUTION_H__
+
+#include 
+#include 
+
+namespace Execution {
+
+struct Data 
+{
+    GPid  pid;
+    bool  userAbort; // пользователь сам отменил
+
+            Data() { Init(); }
+
+      void  Init() 
+      {
+          pid = NO_HNDL;
+          userAbort = false;
+      }
+      void  StopExecution(const std::string& what);
+};
+
+class Pulse
+{
+    public:
+    Pulse(Gtk::ProgressBar& prg_bar);
+   ~Pulse();
+
+    protected:
+    Timer tm;
+};
+
+void SimpleSpawn(const char *commandline, const char* dir = 0);
+
+} // namespace Exection
+
+#endif // #ifndef __MGUI_EXECUTION_H__
+
diff -Nru bombono-dvd-0.5.2/src/mgui/gettext.h bombono-dvd-0.6.0/src/mgui/gettext.h
--- bombono-dvd-0.5.2/src/mgui/gettext.h	1970-01-01 01:00:00.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/gettext.h	2010-04-16 12:53:55.000000000 +0100
@@ -0,0 +1,7 @@
+#ifndef __MGUI_GETTEXT_H__
+#define __MGUI_GETTEXT_H__
+
+#include 
+
+#endif // #ifndef __MGUI_GETTEXT_H__
+
diff -Nru bombono-dvd-0.5.2/src/mgui/mux.cpp bombono-dvd-0.6.0/src/mgui/mux.cpp
--- bombono-dvd-0.5.2/src/mgui/mux.cpp	1970-01-01 01:00:00.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/mux.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -0,0 +1,228 @@
+//
+// mgui/mux.cpp
+// This file is part of Bombono DVD project.
+//
+// Copyright (c) 2010 Ilya Murav'jov
+//
+// This program 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.
+//
+// This program 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 this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+
+#include 
+
+#include "mux.h"
+
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+
+#include  // ExecuteAsync()
+
+#include 
+
+#include  // gtk_window_set_geometry_hints()
+
+static void OnNewText(Gtk::TextView& txt_view, const char* dat, int sz, bool is_out)
+{
+    AppendNewText(txt_view, std::string(dat, sz), is_out);
+}
+
+static void OnResponse(Execution::Data& edat, int resp)
+{
+    if( resp == Gtk::RESPONSE_CANCEL)
+    {
+        // повтороне нажатие - закрытие диалога
+        if( !edat.userAbort )
+            edat.StopExecution(_("muxing"));
+    }
+}
+
+void SetDialogStrict(Gtk::Dialog& dlg, int min_wdh, int min_hgt)
+{
+    dlg.set_resizable(false); // чтоб при закрытии экспандера диалог уменьшался
+    // размер окна пошире
+    GdkGeometry geom;
+    geom.min_width  = min_wdh;
+    geom.min_height = min_hgt;
+    gtk_window_set_geometry_hints(static_cast(dlg).gobj(), 0, &geom, GDK_HINT_MIN_SIZE); 
+}
+
+static bool RunMuxing(const std::string& dest_path, const std::string& args)
+{
+    Gtk::Dialog dlg(BF_("Muxing \"%1%\"") % fs::path(dest_path).leaf() % bf::stop);
+    SetDialogStrict(dlg, 400, -1);
+
+    Gtk::TextView& txt_view = NewManaged();
+    Execution::Data edat;
+    Gtk::ProgressBar& prg_bar = NewManaged();
+
+    {
+        Gtk::VBox& box = *dlg.get_vbox();
+        PackStart(box, prg_bar);
+
+        Gtk::Expander& expdr = PackStart(box, NewManaged(_("Show/_Hide Details"), true));
+        txt_view.set_editable(false);
+        txt_view.set_size_request(0, 200);
+        expdr.add(PackDetails(txt_view));
+
+        dlg.get_action_area()->set_layout(Gtk::BUTTONBOX_CENTER);
+        dlg.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
+        dlg.signal_response().connect(bl::bind(&OnResponse, boost::ref(edat), bl::_1));
+
+        dlg.show_all();
+    }
+
+    //dlg.run();
+    ExitData ed;
+    {
+        Execution::Pulse pls(prg_bar);
+        ReadReadyFnr fnr = bl::bind(&OnNewText, boost::ref(txt_view), bl::_1, bl::_2, bl::_3);
+        std::string cmd = boost::format("mplex -f 8 -o %1% %2%") % dest_path % args % bf::stop;
+        AppendCommandText(txt_view, cmd);
+        ed = ExecuteAsync(0, cmd.c_str(), fnr, &edat.pid);
+    }
+
+    if( !ed.IsGood() && !edat.userAbort )
+    {
+        MessageBox(_("Muxing error"), Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, 
+                   BF_("The reason is \"%1%\" (see Details)") % ExitDescription(ed) % bf::stop);
+        dlg.run();
+    }
+    return ed.IsGood();
+}
+
+struct SaveChooser: public Gtk::Table
+{
+                Gtk::Entry& ent;
+    Gtk::FileChooserButton& fcb;
+
+    SaveChooser(const char* type);
+};
+
+SaveChooser::SaveChooser(const char* type): 
+    ent(NewManaged()), 
+    fcb(NewManaged(_("Select a folder"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER))
+{
+    // вариант с виджетом - слишком большой, хоть и более функциональный
+    //Gtk::FileChooserWidget& fcw = NewManaged(Gtk::FILE_CHOOSER_ACTION_SAVE);
+    //Gtk::Frame& frm = PackStart(vbox, NewManagedFrame(Gtk::SHADOW_ETCHED_IN, " Output: "), Gtk::PACK_EXPAND_WIDGET);
+    //Add(Add(frm, NewPaddingAlg(0, 5, 5, 5)), fcw);
+
+    set_col_spacings(5);
+    Gtk::Label& o_lbl = NewManaged(type);
+    SetAlign(o_lbl, true);
+    attach(o_lbl, 0, 1, 0, 1, Gtk::SHRINK|Gtk::FILL);
+    attach(ent, 1, 2, 0, 1);
+    Gtk::Label& i_lbl = NewManaged(_("in"));
+    SetAlign(i_lbl, false);
+    attach(i_lbl, 0, 1, 1, 2, Gtk::SHRINK|Gtk::FILL);
+    attach(fcb, 1, 2, 1, 2);
+}
+
+std::string GetFilename(SaveChooser& sc)
+{
+    std::string fname = sc.ent.get_text();
+    if( !fname.empty() )
+        fname = (fs::path(sc.fcb.get_filename())/fname).string();
+    
+    return fname;
+}
+
+static void OnVideoSelected(Gtk::FileChooserButton& v_btn, Gtk::FileChooserButton& a_btn, SaveChooser& sc)
+{
+    fs::path pth = fs::path(v_btn.get_filename());
+    if( pth.empty() )
+        return;
+    std::string folder = pth.branch_path().string();
+
+    if( a_btn.get_filename().empty() )
+        a_btn.set_current_folder(folder);
+
+    if( GetFilename(sc).empty() )
+    {
+        sc.fcb.set_current_folder(folder);
+        sc.ent.set_text(get_basename(pth) + ".mpg");
+    }
+}
+
+bool MuxStreams(std::string& dest_fname, const std::string& src_fname)
+{
+    Gtk::Dialog dlg(_("Mux streams"));
+    SetDialogStrict(dlg, 400, -1);
+    SaveChooser& sc = NewManaged(SMCLN_("Output"));
+    Gtk::FileChooserButton& v_btn = NewManaged(_("Select elementary video"), Gtk::FILE_CHOOSER_ACTION_OPEN);
+    Gtk::FileChooserButton& a_btn = NewManaged(_("Select audio"),            Gtk::FILE_CHOOSER_ACTION_OPEN);
+    {
+        DialogVBox& vbox = AddHIGedVBox(dlg);
+
+        AppendWithLabel(vbox, v_btn, SMCLN_("Video"));
+        {
+            Gtk::FileFilter f;
+            f.set_name(_("MPEG2 elementary video (m2v)"));
+            f.add_pattern("*.m2v");
+            v_btn.add_filter(f);
+        }
+
+        AppendWithLabel(vbox, a_btn, SMCLN_("Audio"));
+        {
+            Gtk::FileFilter f;
+            f.set_name(_("Audio for DVD") + std::string(" (mp2/mpa, ac3, dts or 16bit lpcm)"));
+            FillSoundFilter(f);
+            a_btn.add_filter(f);
+        }
+
+        PackStart(vbox, sc);
+
+        CompleteDialog(dlg);
+    }
+
+    v_btn.signal_selection_changed().connect(bl::bind(&OnVideoSelected, boost::ref(v_btn), boost::ref(a_btn), boost::ref(sc)));
+    if( !src_fname.empty() )
+    {
+        if( get_extension(src_fname) == "m2v" )
+            v_btn.set_filename(src_fname);
+        else
+            a_btn.set_filename(src_fname);
+    }
+
+    bool res = false;
+    for( ; res = Gtk::RESPONSE_OK == dlg.run(), res; )
+    {
+        dest_fname = GetFilename(sc);
+
+        if( v_btn.get_filename().empty() )
+            ErrorBox(_("Elementary video file is not selected."));
+        else if( a_btn.get_filename().empty() )
+            ErrorBox(_("Audio file is not selected."));
+        else if( dest_fname.empty() )
+            ErrorBox(_("Output file name is empty."));
+        else if( CheckKeepOrigin(dest_fname) )
+            ;
+        else
+            break;
+    }
+
+    if( res )
+    {
+        dlg.hide();
+        res = RunMuxing(dest_fname, boost::format("%1% %2%") % v_btn.get_filename() % a_btn.get_filename() % bf::stop );
+    }
+
+    return res;
+}
+
diff -Nru bombono-dvd-0.5.2/src/mgui/mux.h bombono-dvd-0.6.0/src/mgui/mux.h
--- bombono-dvd-0.5.2/src/mgui/mux.h	1970-01-01 01:00:00.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/mux.h	2010-04-16 12:53:55.000000000 +0100
@@ -0,0 +1,30 @@
+//
+// mgui/mux.h
+// This file is part of Bombono DVD project.
+//
+// Copyright (c) 2010 Ilya Murav'jov
+//
+// This program 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.
+//
+// This program 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 this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+
+#ifndef __MGUI_MUX_H__
+#define __MGUI_MUX_H__
+
+bool MuxStreams(std::string& dest_fname, const std::string& src_fname = std::string());
+
+void FillSoundFilter(Gtk::FileFilter& f);
+
+#endif // #ifndef __MGUI_MUX_H__
+
diff -Nru bombono-dvd-0.5.2/src/mgui/prefs.cpp bombono-dvd-0.6.0/src/mgui/prefs.cpp
--- bombono-dvd-0.5.2/src/mgui/prefs.cpp	1970-01-01 01:00:00.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/prefs.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -0,0 +1,180 @@
+//
+// mgui/prefs.cpp
+// This file is part of Bombono DVD project.
+//
+// Copyright (c) 2010 Ilya Murav'jov
+//
+// This program 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.
+//
+// This program 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 this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+
+#include 
+
+#include "prefs.h"
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+
+#include 
+#include  // fs::create_directories()
+
+template
+GtkObj& AddWidget(RefPtr wdg_sg, GtkObj& wdg)
+{
+    wdg_sg->add_widget(wdg);
+    return wdg;
+}
+
+DialogVBox& AddHIGedVBox(Gtk::Dialog& dlg)
+{
+    // :KLUDGE: почему-то set_border_width() на dlg.get_vbox() не действует, поэтому использовать
+    // MakeBoxHIGed() нельзя
+    Gtk::VBox& box = *dlg.get_vbox();
+
+    //return Add(PackStart(box, NewPaddingAlg(10, 10, 10, 10), Gtk::PACK_EXPAND_WIDGET), NewManaged(false, 10));
+    DialogVBox& vbox = PackStart(box, NewManaged(false, 10), Gtk::PACK_EXPAND_WIDGET);
+    vbox.set_border_width(10);
+    return vbox;
+}
+
+void AppendWithLabel(DialogVBox& vbox, Gtk::Widget& wdg, const char* label)
+{
+    Gtk::HBox& hbox = PackStart(vbox, NewManaged());
+    Gtk::Label& lbl = NewManaged(label, true);
+    SetAlign(lbl);
+    lbl.set_mnemonic_widget(wdg);
+    Add(PackStart(hbox, NewPaddingAlg(0, 0, 0, 5)), AddWidget(vbox.labelSg, lbl));
+
+    PackStart(hbox, wdg, Gtk::PACK_EXPAND_WIDGET);
+}
+
+void SetDialogStrict(Gtk::Dialog& dlg, int min_wdh, int min_hgt);
+
+void Preferences::Init()
+{
+    isPAL  = true;
+    player = paTOTEM;
+    authorPath = (fs::path(Glib::get_user_cache_dir()) / "bombono-dvd-video").string();
+}
+
+const int PREFS_VERSION = 2;
+
+void SavePrefs(Project::ArchieveFnr afnr, const std::string& fname)
+{
+    xmlpp::Document doc;
+    xmlpp::Element* root_node = doc.create_root_node("BmD");
+    root_node->set_attribute("Version", boost::lexical_cast(PREFS_VERSION));
+    root_node->add_child_comment("Preferences for Bombono DVD");
+
+    Project::DoSaveArchieve(root_node, afnr);
+    doc.write_to_file_formatted(fname);
+}
+
+void SerializePrefs(Project::Archieve& ar)
+{
+    int load_ver = PREFS_VERSION;
+    if( ar.IsLoad() )
+        ar("Version", load_ver);
+
+
+    ar("PAL",    Prefs().isPAL  )
+      ("Player", Prefs().player );
+
+    if( ar.IsSave() || load_ver >= 2 )
+        ar("DefAuthorPath", Prefs().authorPath);
+}
+
+std::string PrefsPath()
+{
+    return GetConfigDir() + "/preferences.xml";
+}
+
+void LoadPrefs()
+{
+    std::string cfg_path = PrefsPath();
+    try
+    {
+        Project::DoLoadArchieve(cfg_path, &SerializePrefs, "BmD");
+    }
+    catch (const std::exception& err)
+    {
+        LOG_WRN << "Couldn't load preferences from " << cfg_path << ": " << err.what() << io::endl;
+        Prefs().Init();
+    }
+}
+
+void TrySetDirectory(Gtk::FileChooser& fc, const std::string& dir_path)
+{
+    try
+    {
+        if( !fs::exists(dir_path) )
+            fs::create_directories(dir_path);
+    }
+    catch (const std::exception& err)
+    {
+        LOG_WRN << "TrySetDirectory(" << dir_path << "): " << err.what() << io::endl;
+    }
+    fc.set_filename(dir_path);
+}
+
+void ShowPrefs(Gtk::Window* win)
+{
+    Gtk::Dialog dlg(_("Bombono DVD Preferences"), false, true);
+    if( win )
+        dlg.set_transient_for(*win);
+    SetDialogStrict(dlg, 450, 200);
+
+    Gtk::ComboBoxText& tv_cmb = NewManaged();
+    Gtk::ComboBoxText& pl_cmb = NewManaged();
+    Gtk::FileChooserButton& a_btn = NewManaged("Select output folder", Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER);
+    {
+        DialogVBox& vbox = AddHIGedVBox(dlg);
+
+        tv_cmb.append_text("PAL/SECAM");
+        tv_cmb.append_text("NTSC");
+        tv_cmb.set_active(Prefs().isPAL ? 0 : 1);
+        AppendWithLabel(vbox, tv_cmb, _("_Default project type"));
+
+        TryDefaultAuthorPath(a_btn);
+        AppendWithLabel(vbox, a_btn, _("Default _folder for authoring"));
+
+        pl_cmb.append_text("Totem");
+        pl_cmb.append_text("Xine");
+        pl_cmb.set_active(Prefs().player);
+        AppendWithLabel(vbox, pl_cmb, _("_Play authoring result in"));
+
+        CompleteDialog(dlg, true);
+    }
+
+    dlg.run();
+    //if( Gtk::RESPONSE_OK == dlg.run() )
+    {
+        Prefs().isPAL  = tv_cmb.get_active_row_number() == 0;
+        Prefs().player = (PlayAuthoring)pl_cmb.get_active_row_number();
+        Prefs().authorPath = a_btn.get_filename();
+
+        SavePrefs(&SerializePrefs, PrefsPath());
+    }
+}
+
diff -Nru bombono-dvd-0.5.2/src/mgui/prefs.h bombono-dvd-0.6.0/src/mgui/prefs.h
--- bombono-dvd-0.5.2/src/mgui/prefs.h	1970-01-01 01:00:00.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/prefs.h	2010-04-16 12:53:55.000000000 +0100
@@ -0,0 +1,67 @@
+//
+// mgui/prefs.h
+// This file is part of Bombono DVD project.
+//
+// Copyright (c) 2010 Ilya Murav'jov
+//
+// This program 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.
+//
+// This program 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 this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+
+#ifndef __MGUI_PREFS_H__
+#define __MGUI_PREFS_H__
+
+#include 
+#include 
+
+enum PlayAuthoring
+{
+    paTOTEM = 0,
+    paXINE,
+    paVLC       // позже добавим, если кому-то потребуется
+};
+
+struct Preferences: public Singleton
+{
+             bool  isPAL;   // PAL vs NTSC
+    PlayAuthoring  player;
+      std::string  authorPath;
+
+            Preferences() { Init(); }
+
+      void  Init();
+};
+
+inline Preferences& Prefs()
+{
+    return Preferences::Instance();
+}
+
+void LoadPrefs();
+void ShowPrefs(Gtk::Window* win = 0);
+
+//
+// FileChooser не создает директории при set_filename(), если их нет, а 
+// устанавливает первую существующую; эта функция:
+// - пытается создать директорию
+// - если не получилось, то посылает предупреждение в лог
+void TrySetDirectory(Gtk::FileChooser& fc, const std::string& dir_path);
+inline void TryDefaultAuthorPath(Gtk::FileChooser& fc)
+{
+    TrySetDirectory(fc, Prefs().authorPath);
+}
+
+
+#endif // #ifndef __MGUI_PREFS_H__
+
diff -Nru bombono-dvd-0.5.2/src/mgui/project/browser.cpp bombono-dvd-0.6.0/src/mgui/project/browser.cpp
--- bombono-dvd-0.5.2/src/mgui/project/browser.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/project/browser.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/project/browser.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -31,6 +31,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 
@@ -123,30 +124,34 @@
     return src_path;
 }
 
+const char* ConfirmQuestions[] = {
+    N_("Do you really want to delete \"%1%\" from Media List?"),
+    N_("Do you really want to delete chapter \"%1%\"?"),
+    N_("Do you really want to delete menu \"%1%\"?")
+};
+
 class DelConfirmationStrVis: public ObjVisitor
 {
     public:
-        std::string contentStr;
+        std::string templStr;
 
-        virtual  void  Visit(StillImageMD& obj)   { contentStr += ObjFromML(obj); }
-        virtual  void  Visit(VideoMD& obj)        { contentStr += ObjFromML(obj); }
-        virtual  void  Visit(VideoChapterMD& obj) { contentStr += obj.mdName + "\" chapter?"; }
-        virtual  void  Visit(MenuMD& obj)         { contentStr += obj.mdName + "\" menu?";    }
-
-        std::string ObjFromML(Media& md) { return md.mdName + "\" from Media List?"; }
+        virtual  void  Visit(StillImageMD&)   { templStr = ConfirmQuestions[0]; }
+        virtual  void  Visit(VideoMD&)        { templStr = ConfirmQuestions[0]; }
+        virtual  void  Visit(VideoChapterMD&) { templStr = ConfirmQuestions[1]; }
+        virtual  void  Visit(MenuMD&)         { templStr = ConfirmQuestions[2]; }
 };
 
 static std::string GetDelConfirmationStr(MediaItem md)
 {
     DelConfirmationStrVis vis;
     md->Accept(vis);
-    return "Do you really want to delete\n\"" + vis.contentStr;
+    return BF_(vis.templStr) % md->mdName % bf::stop;
 }
 
 bool ConfirmDeleteMedia(MediaItem mi)
 {
     return Gtk::RESPONSE_OK == MessageBox(GetDelConfirmationStr(mi), 
-                                            Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL);
+                                          Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL);
 }
 
 void DeleteMedia(RefPtr os, const Gtk::TreeIter& itr)
@@ -219,6 +224,7 @@
     case GDK_E: case GDK_e:
         if( IsControlKey(event->state) ) // :DOC: Ctrl+E = установка начального (Entrance) медиа
             if( MediaItem mi = GetCurMedia(*this) )
+            {
                 if( IsVideo(mi) || IsMenu(mi) )
                 {
                     MediaItem& fp = AData().FirstPlayItem();
@@ -233,8 +239,9 @@
                     RedrawThumbnail(old_fp);
                 }
                 else
-                    MessageBox("First-Play media can be Video or Menu only.", 
+                    MessageBox(_("First-Play media can be Video or Menu only."), 
                                Gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK);
+            }
         break;
     default:
         break;
@@ -285,17 +292,6 @@
     brw.grab_focus();
 }
 
-Gtk::ScrolledWindow& PackInScrolledWindow(Gtk::Widget& wdg, bool need_hz)
-{
-    Gtk::ScrolledWindow& scr_win = *Gtk::manage(new Gtk::ScrolledWindow);
-    scr_win.set_shadow_type(Gtk::SHADOW_NONE); //SHADOW_OUT); //IN);
-    scr_win.set_policy( need_hz ? Gtk::POLICY_AUTOMATIC : Gtk::POLICY_NEVER, 
-                        Gtk::POLICY_AUTOMATIC );
-
-    scr_win.add(wdg);
-    return scr_win;
-}
-
 Gtk::HButtonBox& CreateMListButtonBox()
 {
     Gtk::HButtonBox& hb = *Gtk::manage(new Gtk::HButtonBox(Gtk::BUTTONBOX_START, 2));
@@ -364,6 +360,18 @@
     vbox.pack_start(NewManaged(), Gtk::PACK_SHRINK);
 }
 
+Gtk::ScrolledWindow& PackInScrolledWindow(Gtk::Widget& wdg, bool need_hz)
+{
+    Gtk::ScrolledWindow& scr_win = *Gtk::manage(new Gtk::ScrolledWindow);
+    scr_win.set_shadow_type(Gtk::SHADOW_NONE); //SHADOW_OUT); //IN);
+    scr_win.set_policy( need_hz ? Gtk::POLICY_AUTOMATIC : Gtk::POLICY_NEVER, 
+                        Gtk::POLICY_AUTOMATIC );
+
+    scr_win.add(wdg);
+    return scr_win;
+}
+
+
 //////////////////////////////////////////////////////////////////////////
 // DnD для URI
 
diff -Nru bombono-dvd-0.5.2/src/mgui/project/browser.h bombono-dvd-0.6.0/src/mgui/project/browser.h
--- bombono-dvd-0.5.2/src/mgui/project/browser.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/project/browser.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/project/browser.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -62,6 +62,9 @@
 bool ConfirmDeleteMedia(MediaItem mi);
 void DeleteMedia(RefPtr os, const Gtk::TreeIter& itr);
 
+inline int Size(RefPtr os)
+{ return (int)os->children().size(); }
+
 //
 // ObjectBrowser
 // 
@@ -100,7 +103,6 @@
     return tv.get_selection()->get_selected();
 }
 
-Gtk::ScrolledWindow& PackInScrolledWindow(Gtk::Widget& wdg, bool need_hz = false);
 Gtk::HButtonBox& CreateMListButtonBox();
 // dnd_column - где MediaItem лежит, который нужно dnd-ить
 void SetupBrowser(ObjectBrowser& brw, int dnd_column, bool need_headers = false);
diff -Nru bombono-dvd-0.5.2/src/mgui/project/mb-actions.cpp bombono-dvd-0.6.0/src/mgui/project/mb-actions.cpp
--- bombono-dvd-0.5.2/src/mgui/project/mb-actions.cpp	2009-09-27 18:06:35.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/project/mb-actions.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/project/mb-actions.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -25,6 +25,7 @@
 #include "handler.h"
 #include "thumbnail.h"
 #include "mconstructor.h" // APROJECT_NAME
+#include "mconstructor.h" // APROJECT_NAME
 
 #include 
 #include 
@@ -32,6 +33,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -41,6 +43,8 @@
 #include 
 #include  // strcasecmp()
 
+#include 
+
 namespace Project
 {
 
@@ -137,7 +141,7 @@
 
 static std::string MarkBoolError(bool val, bool not_error)
 {
-    return MarkError(std::string(val ? "yes" : "no"), not_error);
+    return MarkError(std::string(val ? _("yes") : _("no")), not_error);
 }
 
 
@@ -186,9 +190,17 @@
     int kbps = vid.bytRat/400;
     bool is_byte_rate_ok = kbps <= 9800; // Kbps
     SetImportError(ed, is_byte_rate_ok, 
-                   "Video bitrate:\t" + 
-                   MarkError(lexical_cast(kbps), is_byte_rate_ok) + " Kbps", 
-                   "Maximum data rate for video (9800Kbps) is exceeded.");
+                   std::string(_("Video bitrate")) + ":\t" + 
+                   MarkError(lexical_cast(kbps), is_byte_rate_ok) + " " + _("kbps"), 
+                   _("Maximum data rate for video (9800 kbps) is exceeded."));
+
+    const char* Descriptions[] = {
+        N_("The %1% DVD-Video can accept MPEG-2 with resolutions: %2% only."),
+        N_("The %1% DVD-Video can accept MPEG-2 with frame rate: %2% only."),
+        N_("The %1% DVD-Video can accept MPEG-2 with aspects 4:3, 16:9 only.")
+    };
+    std::string tv_type = TVTypeStr(is_ntsc);
+
 
     // * (352x480, 352x288 - не по стандарту, см. Trac#9)
     Point ntsc_resolutions[] = { Point(720, 480), Point(704, 480), Point(352, 480), Point(352, 240) };
@@ -204,11 +216,9 @@
             resol_list += ", ";
         resol_list += PointToStr(resolutions[i]);
     }   
-    std::string desc_prefix = "The " + TVTypeStr(is_ntsc) + 
-        " DVD-Video can accept MPEG-2 with ";
     SetImportError(ed, sz_ok, 
-                   "Video size:   \t" + MarkError(PointToStr(sz), sz_ok),
-                   desc_prefix + " resolutions: " + resol_list + " only.");
+                   std::string(_("Video size")) + ":   \t" + MarkError(PointToStr(sz), sz_ok),
+                   BF_(Descriptions[0]) % tv_type % resol_list % bf::stop);
 
     // *
     Point frate(vid.framRat);
@@ -227,21 +237,22 @@
         frate_list = FpsToStr(Point(25, 1));
     }
     SetImportError(ed, frate_ok, 
-                   "Frame rate:   \t" + 
-                   MarkError(FpsToStr(frate), frate_ok) + " fps",
-                   desc_prefix + " frame rate: " + frate_list + " fps only.");
+                   std::string(_("Frame rate")) + ":   \t" + 
+                   MarkError(FpsToStr(frate), frate_ok) + " " + _("fps"),
+                   BF_(Descriptions[1]) % tv_type % frate_list % bf::stop);
 
     // *
     bool is_aspect_ok = vid.sarCode == af4_3 || vid.sarCode == af16_9;
     Point aspect = vid.SizeAspect();
     std::string aspect_str = (str::stream() << aspect.x << ':' << aspect.y).str();
     SetImportError(ed, is_aspect_ok, 
-                   "Aspect ratio: \t" + MarkError(aspect_str, is_aspect_ok),
-                   desc_prefix + " aspects: 4:3, 16:9 only.");
+                   std::string(_("Aspect ratio")) + ": \t" + MarkError(aspect_str, is_aspect_ok),
+                   BF_(Descriptions[2]) % tv_type % bf::stop);
 
     // * 
     bool no_delay = !vid.lowDelay;
-    SetImportError(ed, no_delay, "Low delay:    \t" + MarkBoolError(!no_delay, no_delay));
+    // Translators: Low delay is very tech term and can be left as is.
+    SetImportError(ed, no_delay, "\"Low delay\":    \t" + MarkBoolError(!no_delay, no_delay));
     ed.outStr += "\n";
 }
 
@@ -310,22 +321,20 @@
                     i++;
             }
         }
-        #define APROJECT_DNAME ""APROJECT_NAME""
-        std::string dvd_mux_desc = APROJECT_DNAME " can import \"mux-ready\" video only now."
+        std::string dvd_mux_desc = _("Bombono DVD can use \"DVD-ready\" video only now."
             " Use muxing programs like \"mplex -f 8\" (from mjpegtools)," 
-            " mencoder (from mplayer) or transcode to make your video ready for " APROJECT_DNAME ".";
+            " mencoder (from mplayer) or transcode to make your video ready for Bombono DVD.");
         SetImportError(ed, is_dvd_mux,
-                       "DVD packs:    \t" + MarkBoolError(is_dvd_mux, is_dvd_mux), dvd_mux_desc);
+                       boost::format("%1%:    \t") % _("DVD packs") % bf::stop + MarkBoolError(is_dvd_mux, is_dvd_mux), dvd_mux_desc);
         SetImportError(ed, is_nav_found, 
-                       "NAV packets:  \t" + MarkBoolError(is_nav_found, is_nav_found), dvd_mux_desc);
+                       boost::format("%1%:  \t") % _("NAV packets") % bf::stop + MarkBoolError(is_nav_found, is_nav_found), dvd_mux_desc);
         bool dvd_check = is_dvd_mux && is_nav_found;
 
         res = ed.res;
         if( !res )
         {
-            err_string  = "This video may not be added due to (errors in " + MarkError("red color", false) + "):\n";
-            err_string += ed.outStr;
-            err_string += "";
+            err_string  = _("This video may not be added due to (errors in red color):");
+            err_string += "\n" + ed.outStr + "";
 
             std::string desc_str = ed.descStr;
             if( !video_check && dvd_check )
@@ -335,10 +344,10 @@
                 if( ed2.res )
                 {
                     // подскажем пользователю, что он ошибся форматом проекта
-                    desc_str = "This video has " + TVTypeStr(!is_ntsc) + " type and can't be added to"
-                        " current project of " + TVTypeStr(is_ntsc) + " type. Create new project from"
-                        " menu \"File->New Project\" with right type."
-                        ;
+                    desc_str = BF_("This video has %1% type and can't be added to"
+                        " current project of %2% type. Create new project from"
+                        " menu \"Project->New Project\" with right type.") % 
+                        TVTypeStr(!is_ntsc) % TVTypeStr(is_ntsc) % bf::stop;
                 }
             }
 
@@ -363,12 +372,12 @@
     fs::path pth(fname);
     if( !fs::exists(pth) )
     {
-    	err_string = "File is not available";
+    	err_string = _("File doesn't exist.");
     	return md;
     }
     if( fs::is_directory(pth) )
     {
-    	err_string = "Folders can't be added";
+    	err_string = _("Folders can't be added.");
     	return md;
     }
 
@@ -403,7 +412,7 @@
     if( !md )
     {
         // по расширению выводим наиболее вероятную ошибку
-        err_string  = must_be_video ? video_err_str : "Unknown file type" ;
+        err_string  = must_be_video ? video_err_str : _("Unknown file type.") ;
     }
     return md;
 }
@@ -589,29 +598,72 @@
     return res;
 }
 
+// desc - метка происхождения, добавления
+void TryAddMediaQuiet(const std::string& fname, const std::string& desc)
+{
+    std::string err_str;
+    Gtk::TreePath pth;
+    if( !TryAddMedia(fname.c_str(), pth, err_str) )
+    {    
+        LOG_ERR << "TryAddMediaQuiet error (" << desc << "): " << err_str << io::endl;
+    }
+}
+
 static std::string StandFNameOut(const fs::path& pth)
 {
     return "" + 
                     pth.leaf() + "";
 }
 
+#if GTK_CHECK_VERSION(2,18,0)
+#define LABEL_HAS_A_TAG
+#endif
+
+static void AddMediaError(const std::string& msg_str, const std::string& desc_str)
+{
+#ifdef LABEL_HAS_A_TAG
+    MessageBoxWeb(msg_str, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, desc_str);
+#else
+    MessageBox(msg_str, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, desc_str);
+#endif
+}
+
 void TryAddMedias(const Str::List& paths, MediaBrowser& brw,
                   Gtk::TreePath& brw_pth, bool insert_after)
 {
     // * подсказка с импортом
     if( paths.size() )
     {
-        fs::path pth(paths[0]); 
+        const std::string fname = paths[0];
+        fs::path pth(fname); 
         std::string leaf = pth.leaf();
-        std::string::const_iterator start = leaf.begin(), end = leaf.end();
-        static boost::regex dvd_video_vob("(VIDEO_TS|VTS_[0-9][0-9]_[0-9]).VOB", 
-                                          boost::regex::perl|boost::regex::icase);
-
-        if( boost::regex_match(start, end, dvd_video_vob) && 
-            MessageBox("The file \"" + leaf + "\"looks like VOB from DVD.\nRun import?",
-                       Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL) == Gtk::RESPONSE_OK )
         {
-            DVD::RunImport(*GetTopWindow(brw), pth.branch_path().string());
+            std::string::const_iterator start = leaf.begin(), end = leaf.end();
+            static boost::regex dvd_video_vob("(VIDEO_TS|VTS_[0-9][0-9]_[0-9]).VOB", 
+                                              boost::regex::perl|boost::regex::icase);
+    
+            if( boost::regex_match(start, end, dvd_video_vob) && 
+                MessageBox(BF_("The file \"%1%\" looks like VOB from DVD.\nRun import?") % leaf % bf::stop,
+                           Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL) == Gtk::RESPONSE_OK )
+            {
+                DVD::RunImport(*GetTopWindow(brw), pth.branch_path().string());
+                return;
+            }
+        }
+
+        std::string ext = get_extension(pth);
+        const char* el_array[] = {"m2v", "mp2", "mpa", "ac3", "dts", "lpcm", 0 };
+        bool res = false;
+        for( const char** el = el_array; *el ; el++ )
+            if( *el == ext )
+            {
+                res = true;
+                break;
+            }
+        if( res && MessageBox(BF_("The file \"%1%\" looks like elementary stream and need to be muxed before using. Run muxing?") % leaf % bf::stop,
+                              Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL) == Gtk::RESPONSE_OK )
+        {
+            MuxAddStreams(fname);
             return;
         }
     }
@@ -670,7 +722,7 @@
             }
             else
             {
-                err_desc += (err_cnt == max_show_errors) ? "\n\nAlso: " : ", " ;
+                err_desc += (err_cnt == max_show_errors) ? std::string("\n\n") + _("Also:") + " " : std::string(", ") ;
                 err_desc += StandFNameOut(pth);
             }
         }
@@ -678,13 +730,25 @@
 
     if( err_cnt )
     {
-        if( err_cnt == 1 )
-        {
-            MessageBox("Can't add file \"" + err_pth.leaf() + "\".", 
-                       Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, err_str);
-        }
+        bool one_error = (err_cnt == 1);
+        std::string desc = one_error ? err_str : err_desc ;
+
+#ifdef LABEL_HAS_A_TAG
+        std::string online_tip("\n\n");
+        online_tip += BF_("See more about preparing video for authoring in online help.") % 
+            "http://www.bombono.org/Preparing_sources_for_DVD" % bf::stop;
+
+        desc += online_tip;
+#endif
+
+        // :KLUDGE: хотелось использовать ngettext() для того чтоб в PO строки были рядом,
+        // однако msgfmt для требует чтобы в обоих вариантах присутствовало одинаковое 
+        // кол-во заполнителей 
+        //boost::format frmt(ngettext("Can't add file \"%1%\".", "Can't add files:", err_cnt));
+        if( one_error )
+            AddMediaError(BF_("Can't add file \"%1%\".") % err_pth.leaf() % bf::stop, desc);
         else
-            MessageBox("Can't add files:", Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, err_desc);
+            AddMediaError(_("Can't add files:"), desc);
     }
 
     if( !goto_path.empty() )
diff -Nru bombono-dvd-0.5.2/src/mgui/project/mb-actions.h bombono-dvd-0.6.0/src/mgui/project/mb-actions.h
--- bombono-dvd-0.5.2/src/mgui/project/mb-actions.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/project/mb-actions.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/project/mb-actions.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -69,6 +69,9 @@
 // интерактивный вариант TryAddMedia()
 void TryAddMedias(const Str::List& paths, MediaBrowser& brw,
                   Gtk::TreePath& brw_pth, bool insert_after);
+// desc - метка происхождения, добавления
+void TryAddMediaQuiet(const std::string& fname, const std::string& desc);
+void MuxAddStreams(const std::string& src_fname);
 
 // ограничиваем возможность вставки верхним уровнем
 // want_ia - где хотим вставить (dnd)
diff -Nru bombono-dvd-0.5.2/src/mgui/project/mconstructor.cpp bombono-dvd-0.6.0/src/mgui/project/mconstructor.cpp
--- bombono-dvd-0.5.2/src/mgui/project/mconstructor.cpp	2009-09-27 14:08:13.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/project/mconstructor.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/project/mconstructor.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -38,6 +38,9 @@
 #include  // VideoSizeSum()
 #include  // PackOutput()
 
+#include 
+#include 
+#include 
 #include  // RegisterHook()
 #include 
 #include 
@@ -67,10 +70,8 @@
 
 void SetTabName(Gtk::Notebook& nbook, const std::string& name, int pos)
 {
-    Gtk::Label& lbl = NewManaged(""
-                                             + name + "");
-    lbl.set_use_markup(true);
-    lbl.set_use_underline(true);
+    Gtk::Label& lbl = NewMarkupLabel(""
+                                     + name + "", true);
 
     // попытка сделать вертикальные закладки читабельными
     //switch( nbook.get_tab_pos() )
@@ -128,8 +129,10 @@
 {
     bool res = false;
     std::string fname = MakeProjectTitle();
-    if( ChooseFileSaveTo(fname, "Save Project As...", for_wdg) )
+    if( ChooseFileSaveTo(fname, _("Save Project As..."), for_wdg) )
     {
+        fname = Project::ConvertPathToUtf8(fname);
+
         ASSERT( !fname.empty() );
         AData().SetProjectFName(fname);
         res = true;
@@ -163,11 +166,28 @@
         // мягкая очистка
         db.Clear(false);
         db.ClearSettings();
-        MessageBox("Cant open project file \"" + prj_file_name + "\"", Gtk::MESSAGE_ERROR, 
+        MessageBox(BF_("Cant open project file \"%1%\"") % prj_file_name % bf::stop, Gtk::MESSAGE_ERROR, 
                    Gtk::BUTTONS_OK, err_str);
     }
 }
 
+static bool ClearEndAction(VideoItem vi, MediaItem mi)
+{
+    PostAction& pa = vi->PAction();
+    if( pa.paLink == mi )
+    {
+        pa.paLink = 0;
+        pa.paTyp  = patAUTO;
+    }
+    return true;
+}
+
+static void OnDeleteEndAction(MediaItem mi, const char* action)
+{
+    if( mi && (strcmp("OnDelete", action) == 0) )
+        ForeachVideo(bl::bind(ClearEndAction, bl::_1, mi));
+}
+
 // создать списки медиа и меню
 static AStores& InitAStores()
 {
@@ -178,6 +198,8 @@
     as.mdStore  = md_store;
     as.mnStore  = mn_store;
 
+    // для ForeachVideo требуется готовый as.mdStore
+    RegisterHook(&OnDeleteEndAction);
     return as;
 }
 
@@ -390,20 +412,21 @@
 
 static void OnDlgAbout(Gtk::Window& win)
 {
-    const char* license =
-        "This program is free software; you can redistribute it and/or modify\n"
-        "it under the terms of the GNU General Public License as published by\n"
-        "the Free Software Foundation; either version 2 of the License, or\n"
-        "(at your option) any later version.\n"
-        "\n"
-        "This program is distributed in the hope that it will be useful,\n"
-        "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
-        "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
-        "GNU General Public License for more details.\n"
-        "\n"
-        "You should have received a copy of the GNU General Public License\n"
-        "along with this program; if not, write to the Free Software\n"
-        "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA";
+    // :TODO: включить кнопку лицензии пока нельзя из ограничения окна About на размер
+    //const char* license =
+    //    "This program is free software; you can redistribute it and/or modify\n"
+    //    "it under the terms of the GNU General Public License as published by\n"
+    //    "the Free Software Foundation; either version 2 of the License, or\n"
+    //    "(at your option) any later version.\n"
+    //    "\n"
+    //    "This program is distributed in the hope that it will be useful,\n"
+    //    "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+    //    "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+    //    "GNU General Public License for more details.\n"
+    //    "\n"
+    //    "You should have received a copy of the GNU General Public License\n"
+    //    "along with this program; if not, write to the Free Software\n"
+    //    "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA";
 
     HookUpURLs();
 
@@ -437,13 +460,14 @@
         dlg->set_name(APROJECT_NAME);
         dlg->set_version(APROJECT_VERSION);
         dlg->set_copyright("Copyright \xc2\xa9 2007-2009 Ilya Murav'jov");
-        dlg->set_license(license);
+        //dlg->set_license(license);
         dlg->set_website("http://www.bombono.org");
-        dlg->set_comments(APROJECT_NAME" is a DVD authoring program with nice and clean GUI");
+        dlg->set_comments(_("Bombono DVD is a DVD authoring program with nice and clean GUI"));
         dlg->set_logo(Gdk::Pixbuf::create_from_file(AppendPath(GetDataDir(), "about-front.png")));
         //dlg.set_authors(authors);
         //dlg.set_documenters(documenters);
         //dlg.set_decorated(false);
+        dlg->set_translator_credits(_("translator-credits"));
     
         ForAllWidgets(static_cast(*dlg).gobj(), SetNoButtonRelief);
         dlg->signal_response().connect(bl::bind(OnCloseAboutDlg, dlg.get(), bl::_1));
@@ -583,10 +607,10 @@
     if( app.isProjectChanged )
     {
     
-        Gtk::MessageDialog dlg("" 
-                               "Save changes to \"" + MakeProjectTitle() + "\"?" 
+        Gtk::MessageDialog dlg("" +
+                               BF_("Save changes to \"%1%\"?") % MakeProjectTitle() % bf::stop + 
                                "", true,  Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE, true);
-        dlg.add_button("Close _without Saving", Gtk::RESPONSE_CLOSE);
+        dlg.add_button(_("Close _without Saving"), Gtk::RESPONSE_CLOSE);
         AddCancelSaveButtons(dlg);
     
         bool to_save = false;
@@ -615,8 +639,9 @@
 {
     const char* name = val ? "_PAL/SECAM" : "_NTSC" ;
     Gtk::RadioButton& btn = *Gtk::manage(new Gtk::RadioButton(grp, name, true));
-    using namespace boost; // boost::function<> - для приведения результата к void
-    btn.signal_toggled().connect( function(lambda::var(is_pal) = val) );
+    if( is_pal == val )
+        btn.set_active();
+    SetForRadioToggle(btn, bl::var(is_pal) = val);
     return btn;
 }
 
@@ -624,25 +649,20 @@
 {
     if( CheckBeforeClosing(app) )
     {
-        bool is_pal = true;
-        Gtk::Dialog new_prj_dlg("New Project", app.win, true, true);
+        bool is_pal = Prefs().isPAL;
+        Gtk::Dialog new_prj_dlg(_("New Project"), app.win, true, true);
         new_prj_dlg.set_name("NewProject");
         new_prj_dlg.set_resizable(false);
         {
             AddCancelDoButtons(new_prj_dlg, Gtk::Stock::OK);
             Gtk::VBox& dlg_box = *new_prj_dlg.get_vbox();
-            // :REFACTOR: fs::path(GetDataDir())...
             PackStart(dlg_box, NewManaged((fs::path(GetDataDir())/"cap400.png").string()));
-            Gtk::Alignment& alg = PackStart(dlg_box, NewManaged());
-            alg.set_padding(10, 40, 20, 20);
-            Gtk::VBox& vbox = Add(alg, NewManaged());
+            Gtk::VBox& vbox = Add(PackStart(dlg_box, NewPaddingAlg(10, 40, 20, 20)), NewManaged());
             
-            PackStart(vbox, NewManaged("Please select a Television standard for your project:",
+            PackStart(vbox, NewManaged(_("Please select a Television standard for your project:"),
                                                    0.0, 0.5, true));
             {
-                Gtk::Alignment& alg = PackStart(vbox, NewManaged());
-                alg.set_padding(10, 10, 0, 0);
-                Gtk::VBox& vbox2 = Add(alg, NewManaged());
+                Gtk::VBox& vbox2 = Add(PackStart(vbox, NewPaddingAlg(10, 10, 0, 0)), NewManaged());
 
                 Gtk::RadioButtonGroup grp;
                 PackStart(vbox2, TVSelectionButton(is_pal, true,  grp));
@@ -664,16 +684,16 @@
 {
     if( CheckBeforeClosing(app) )
     {
-        Gtk::FileChooserDialog dialog("Open Project", Gtk::FILE_CHOOSER_ACTION_OPEN);
+        Gtk::FileChooserDialog dialog(_("Open Project"), Gtk::FILE_CHOOSER_ACTION_OPEN);
         BuildChooserDialog(dialog, true, app.win);
     
         Gtk::FileFilter prj_filter;
-        prj_filter.set_name("Project files (*.xml)");
+        prj_filter.set_name(_("Project files (*.xml)"));
         prj_filter.add_pattern("*.xml");
         dialog.add_filter(prj_filter);
     
         Gtk::FileFilter all_filter;
-        all_filter.set_name("All files");
+        all_filter.set_name(_("All Files (*.*)"));
         all_filter.add_pattern("*");
         dialog.add_filter(all_filter);
     
@@ -790,9 +810,6 @@
 	BRASERO_UTILS_GO
 };
 
-#define N_(arg) (arg)
-#define _(arg)  (arg)
-
 static gchar* 
 brasero_utils_get_size_string(gint64 dsize,
                               gboolean with_unit,
@@ -801,7 +818,10 @@
 	int unit;
 	int size;
 	int remain = 0;
-	const char *units[] = { "", N_("KiB"), N_("MiB"), N_("GiB") };
+    // раньше Brasero использовал KiB, MiB и GiB, как более точные технически
+    // (вроде как размеры HDD принято измерять по 1GB=1000MB); теперь Brasero
+    // перешел на стандарт KB/MB/GB, ну и BmD тоже (а че, мы не гордые :)
+	const char *units[] = { "", N_("KB"), N_("MB"), N_("GB") };
 
 	if (dsize < 1024) {
 		unit = BRASERO_UTILS_NO_UNIT;
@@ -891,6 +911,12 @@
     virtual      void  Visit(VideoMD& ) { UpdateDVDSize(szBar); }
 };
 
+void MuxAddStreams(const std::string& src_fname)
+{
+    std::string dest_fname;
+    if( MuxStreams(dest_fname, src_fname) )
+        TryAddMediaQuiet(dest_fname, "MuxAddStreams");
+}
 
 //////////////////////////////////////////////////
 
@@ -906,23 +932,27 @@
         Gtk::MenuBar& main_bar = PackStart(hbox, NewManaged());
 
         // Project
-        Gtk::MenuItem& prj_mi = AppendMI(main_bar, NewManaged("_Project", true));
+        Gtk::MenuItem& prj_mi = AppendMI(main_bar, NewManaged(_("_Project"), true));
         {
             RefPtr prj_actions = Gtk::ActionGroup::create("ProjectActions");
 
             prj_actions->add( Gtk::Action::create("ProjectMenu", "_Project") ); 
-            prj_actions->add( Gtk::Action::create("New",    Gtk::Stock::NEW,  "_New Project"),
+            prj_actions->add( Gtk::Action::create("New",    Gtk::Stock::NEW,  _("_New Project")),
                               Gtk::AccelKey("N"), lambda::bind(&OnNewProject, app_ref) );
-            prj_actions->add( Gtk::Action::create("Open",   Gtk::Stock::OPEN, "_Open..."),
+            prj_actions->add( Gtk::Action::create("Open",   Gtk::Stock::OPEN, _("_Open...")),
                               Gtk::AccelKey("O"), lambda::bind(&OnOpenProject, app_ref) );
-            prj_actions->add( Gtk::Action::create("Save",   Gtk::Stock::SAVE, "_Save"),
+            prj_actions->add( Gtk::Action::create("Save",   Gtk::Stock::SAVE, _("_Save")),
                               Gtk::AccelKey("S"), lambda::bind(&OnSaveProject, app_ref) );
-            prj_actions->add( Gtk::Action::create("SaveAs", Gtk::Stock::SAVE_AS, "Save _As..."),
+            prj_actions->add( Gtk::Action::create("SaveAs", Gtk::Stock::SAVE_AS, _("Save _As...")),
                               lambda::bind(&OnSaveAsProject, app_ref) );
-            prj_actions->add( Gtk::Action::create("Quit",   Gtk::Stock::QUIT, "_Quit"), 
+            prj_actions->add( Gtk::Action::create("Quit",   Gtk::Stock::QUIT, _("_Quit")), 
                               Gtk::AccelKey("Q"), lambda::bind(&QuitApplication, app_ref) );
-            prj_actions->add( Gtk::Action::create("Import DVD", "Add Videos from _DVD", "DVD-Import Assistant"), 
+            prj_actions->add( Gtk::Action::create("Import DVD", DOTS_("Add Videos from _DVD"), _("DVD-Import Assistant")), 
                               lambda::bind(&ImportFromDVD, app_ref) );
+            prj_actions->add( Gtk::Action::create("Mux Streams", DOTS_("_Mux"), _("Mux Elementary Streams into MPEG2")),
+                              bl::bind(&MuxAddStreams, std::string()) );
+            prj_actions->add( Gtk::Action::create("Preferences", Gtk::Stock::PREFERENCES, DOTS_("Pr_eferences")), 
+                              bl::bind(&ShowPrefs, &win) );
 
 
             RefPtr mngr = Gtk::UIManager::create();
@@ -942,10 +972,13 @@
             "    "
             "    "
             "    "
+            "    "
             "    "
             "    "
             "    "
             "    "
+            "    "
+            "    "
             "    "
             "  "
             ""
@@ -957,13 +990,13 @@
         }
 
         // Go
-        Gtk::MenuItem& go_mi = AppendMI(main_bar, NewManaged("_Go", true));
+        Gtk::MenuItem& go_mi = AppendMI(main_bar, NewManaged(_("_Go"), true));
         go_mi.set_submenu(goMenu);
         Gtk::RadioButtonGroup grp;
         goMenu.append(CreateGoMenuItem(grp, *this)); // первый вставляем сразу
         
         // Help
-        Gtk::Menu& hlp_menu     = MakeSubmenu(AppendMI(main_bar, NewManaged("_Help", true)));
+        Gtk::Menu& hlp_menu     = MakeSubmenu(AppendMI(main_bar, NewManaged(_("_Help"), true)));
         Gtk::MenuItem& about_mi = AppendMI(hlp_menu, *Gtk::manage(new Gtk::ImageMenuItem(Gtk::Stock::ABOUT)));
         about_mi.signal_activate().connect(lambda::bind(&OnDlgAbout, boost::ref(win)));
 
@@ -1064,11 +1097,11 @@
     // * закладки с содержимым
     Gtk::Notebook& nbook = app.BookContent();
     PackMediasWindow(nbook, md_store);
-    app.SetTabName("_Source", 0);
+    app.SetTabName(C_("MainTabs", "_Source"), 0);
     PackMenusWindow(nbook, mn_store, md_store);
-    app.SetTabName("_Menu", 1);
+    app.SetTabName(C_("MainTabs", "_Menu"), 1);
     ActionFunctor after_fnr = PackOutput(app, prj_file_name);
-    app.SetTabName("_Output", 2);
+    app.SetTabName(C_("MainTabs", "_Output"), 2);
 
     return after_fnr;
 }
@@ -1076,6 +1109,13 @@
 void RunConstructor(const std::string& prj_file_name, bool ask_save_on_exit)
 {
     DBCleanup db_cleanup(false);
+    // *
+    InitI18n();
+    // *
+    LoadPrefs();
+    AData().SetPalTvSystem(Prefs().isPAL);
+
+    // *
     ConstructorApp app;
     app.askSaveOnExit = ask_save_on_exit;
 
@@ -1093,3 +1133,22 @@
 
 } // namespace Project
 
+void InitI18n()
+{
+    static bool is_init = false;
+    if( !is_init )
+    {
+        is_init = true;
+    
+        setlocale(LC_ALL, "");
+        const char* prefix = GetInstallPrefix();
+        std::string locale_prefix(prefix ? (fs::path(prefix) / "share" / "locale").string() : "build/po/locale");
+        bindtextdomain("bombono-dvd", locale_prefix.c_str());
+        textdomain("bombono-dvd");
+    }
+}
+
+void GoUrl(const gchar* url)
+{
+    Project::go_url_show(0, url, 0);
+}
diff -Nru bombono-dvd-0.5.2/src/mgui/project/mconstructor.h bombono-dvd-0.6.0/src/mgui/project/mconstructor.h
--- bombono-dvd-0.5.2/src/mgui/project/mconstructor.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/project/mconstructor.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/project/mconstructor.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -81,5 +81,7 @@
 
 } // namespace Project
 
+void InitI18n();
+
 #endif // #ifndef __MGUI_PROJECT_MCONSTRUCTOR_H__
 
diff -Nru bombono-dvd-0.5.2/src/mgui/project/media-browser.cpp bombono-dvd-0.6.0/src/mgui/project/media-browser.cpp
--- bombono-dvd-0.5.2/src/mgui/project/media-browser.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/project/media-browser.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/project/media-browser.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -27,8 +27,15 @@
 
 #include 
 #include 
+#include 
+#include 
 #include  // MessageBox
+#include 
+#include 
 
+#include 
+
+#include  
 #include 
 #include 
 
@@ -92,17 +99,110 @@
     TryAddMedias(paths, brw, brw_pth, insert_after);
 }
 
+static void SetConstEALink(PostAction& pa, PostActionType typ)
+{
+    ASSERT_RTL( typ != patEXP_LINK );
+    pa.paTyp  = typ;
+    pa.paLink = 0;
+}
+
+static void SetEALink(PostAction& pa, MediaItem mi)
+{
+    ASSERT_RTL(mi); // пустая явная ссылка? - нет пути!
+    pa.paTyp  = patEXP_LINK;
+    pa.paLink = mi;
+}
+
+class EndActionMenuBld: public CommonMenuBuilder
+{
+    typedef CommonMenuBuilder MyParent;
+    public:
+                    EndActionMenuBld(PostAction& pa): pAct(pa), MyParent(pa.paLink, false) {}
+
+    virtual ActionFunctor  CreateAction(Project::MediaItem mi)
+    {
+        return bl::bind(&SetEALink, boost::ref(pAct), mi);
+    }
+
+    virtual          void  AddConstantChoice(Gtk::Menu& lnk_list);
+
+    protected:
+        PostAction& pAct;
+
+void AddConstantItem(Gtk::Menu& lnk_list, const std::string& label, PostActionType typ);
+};
+
+void EndActionMenuBld::AddConstantItem(Gtk::Menu& lnk_list, const std::string& label, PostActionType typ)
+{
+    Gtk::RadioMenuItem& itm = NewManaged(radioGrp);
+    SetAlign(Add(itm, NewMarkupLabel("" + label + "")));
+    AppendRadioItem(itm, typ == pAct.paTyp, bl::bind(&SetConstEALink, boost::ref(pAct), typ), lnk_list);
+}
+
+int MenusCnt();
+
+void EndActionMenuBld::AddConstantChoice(Gtk::Menu& lnk_list)
+{
+    const char* real_cmd = MenusCnt() ? _("Previous Menu") : _("Next Video") ;
+    AddConstantItem(lnk_list, BF_("Auto (%1%)") % real_cmd % bf::stop, patAUTO);
+    AddConstantItem(lnk_list, _("Next Video"), patNEXT_TITLE);
+}
+
+static bool OnMBButtonPress(MediaBrowser& brw, GdkEventButton* event)
+{
+    // :TRICKY: переопределением on_button_press_event() было бы все проще;
+    // но пусть будет - как пример Gtk::Widget::event()
+
+    // сделано по аналогии с list_button_press_event_cb, GtkFileChooserDefault
+    // Суть в том, что:
+    // - GtkTreeView не пускает сигнал нажатия после себя -> регистрир. до
+    // - хочется выполнить обработку GtkTreeView по новому выделению -> вложенный
+    //   gtk_widget_event(), c защитой от рекурсии
+    // - в конце точно надо не пускать сигнал дальше
+    static bool in_press = false;
+    if( in_press )
+        return false;
+
+    //if (event->button != 3)
+    //  return FALSE;
+
+    in_press = true;
+    brw.event((GdkEvent*)event);
+    in_press = false;
+
+    if( IsRightButton(event) )
+        if( MediaItem mi = GetCurMedia(brw) )
+        {
+            Gtk::Menu& mn  = NewPopupMenu(); 
+            Gtk::MenuItem& ea_itm = AppendMI(mn, NewManaged(_("End Action")));
+            // пока только видео (позже - постдействие для интерактивных меню)
+            VideoItem vi = IsVideo(mi);
+            ea_itm.set_sensitive(vi);
+            if( vi )
+                ea_itm.set_submenu(EndActionMenuBld(vi->PAction()).Create());
+            Popup(mn, event, true);
+        }
+
+    return true;
+}
+
 MediaBrowser::MediaBrowser(RefPtr a_lst)
 {
     set_model(a_lst);
     BuildStructure();
 
     SetupURIDrop(*this, bl::bind(&OnURIsDrop, boost::ref(*this), bl::_1, bl::_2));
+    signal_button_press_event().connect(wrap_return(bl::bind(&OnMBButtonPress, boost::ref(*this), bl::_1)), false);
 }
 
+// Названия типов для i18n
+F_("Video")
+F_("Chapter")
+F_("Still Picture")
+
 void RenderMediaType(Gtk::CellRendererText* rndr, MediaItem mi)
 {
-    rndr->property_text() = mi->TypeString();
+    rndr->property_text() = gettext(mi->TypeString().c_str());
 }
 
 void MediaBrowser::BuildStructure()
@@ -114,7 +214,7 @@
 
     // 1 миниатюра + имя
     {
-        Gtk::TreeView::Column& name_cln = *Gtk::manage( new Gtk::TreeView::Column("Name") );
+        Gtk::TreeView::Column& name_cln = *Gtk::manage( new Gtk::TreeView::Column(_("Name")) );
         // ширину колонки можно менять
         name_cln.set_resizable(true);
         
@@ -130,7 +230,7 @@
 
     // 3 тип
     {
-        Gtk::TreeView::Column& cln  = *Gtk::manage( new Gtk::TreeView::Column("Type") );
+        Gtk::TreeView::Column& cln  = *Gtk::manage( new Gtk::TreeView::Column(_("Type")) );
         Gtk::CellRendererText& rndr = *Gtk::manage( new Gtk::CellRendererText() );
 
         cln.pack_start(rndr, false);
@@ -188,7 +288,7 @@
 //     vbox.pack_start(label, Gtk::PACK_SHRINK);
 //     Gtk::Requisition req = label.size_request();
 //     label.set_size_request(0, req.height+10);
-    vbox.pack_start(MakeTitleLabel("Media List"), Gtk::PACK_SHRINK);
+    vbox.pack_start(MakeTitleLabel(_("Media List")), Gtk::PACK_SHRINK);
     PackHSeparator(vbox);
 
 //     Gtk::ScrolledWindow* scr_win = Gtk::manage(new Gtk::ScrolledWindow);
@@ -228,7 +328,7 @@
         vbox->pack_start(hbox, Gtk::PACK_SHRINK);
         {
             Gtk::Button* add_btn = CreateButtonWithIcon("", Gtk::Stock::ADD, 
-                                                        "Add Media from File Browser");
+                                                        _("Add Media from File Browser"));
             hbox.pack_start(*add_btn);
             //bbox.pack_start(*add_btn);
             add_btn->signal_clicked().connect(add_media_fnr);
@@ -237,13 +337,18 @@
             SetDefaultButtonOnEveryMap(*add_btn);
 
             Gtk::Button* rm_btn = CreateButtonWithIcon("", Gtk::Stock::REMOVE,
-                                                       "Remove Media");
+                                                       _("Remove Media"));
             hbox.pack_start(*rm_btn);
             //bbox.pack_start(*rm_btn);
             rm_btn->signal_clicked().connect(remove_media_fnr);
-
-            Gtk::Button* edit_btn = CreateButtonWithIcon("Edit", Gtk::Stock::YES,
-                                                         "Make Chapters for Video");
+            // Translators: it is normal to translate "Edit" as " " (empty) and
+            // to keep the button small; let the tooltip tell the purpose. The same thing 
+            // with the button "Edit" in Menu List
+            // Замечание: так как переводчики не обращают внимание (фин, например), то ставим пусто,
+            // чтобы качество GUI не зависело от локали
+            //const char* edit_text = C_("MediaBrowser", "Edit");
+            const char* edit_text = "";
+            Gtk::Button* edit_btn = CreateButtonWithIcon(edit_text, Gtk::Stock::YES, _("Make Chapters for Video"));
             hbox.pack_start(*edit_btn);
             //bbox.pack_start(*edit_btn);
             edit_btn->signal_clicked().connect(edit_media_fnr);
diff -Nru bombono-dvd-0.5.2/src/mgui/project/menu-actions.cpp bombono-dvd-0.6.0/src/mgui/project/menu-actions.cpp
--- bombono-dvd-0.5.2/src/mgui/project/menu-actions.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/project/menu-actions.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/project/menu-actions.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -80,7 +80,9 @@
 {
     RefPtr ms = brw.GetMenuStore();
     // * subj
-    Menu mn = MakeMenu(ms->children().size());
+    Menu mn = MakeMenu(Size(ms));
+    // отношение сторон
+    mn->Params().GetAF() = IsMenuToBe4_3() ? af4_3 : af16_9 ;
 
     // * куда
     Gtk::TreeRow row = *InsertByPos(ms, GetCursor(brw));
@@ -95,7 +97,7 @@
 class RegionEraserVis: public GuiObjVisitor
 {
     public:
-                       RegionEraserVis(Comp::Object* l_obj, bool del_link);
+                       RegionEraserVis(Comp::Object* l_obj, bool del_link, bool for_poster);
 
                  void  Process();
 
@@ -106,6 +108,7 @@
     protected:
         Comp::Object* lObj;
                 bool  delLink;
+                bool  forPoster;
 
                 Rect  plc;
               MenuMD* owner;
@@ -120,8 +123,8 @@
 {
     typedef RegionEraserVis MyParent;
     public:
-                       PrimaryRegionEraserVis(Comp::Object* l_obj, bool del_link)
-                        : MyParent(l_obj, del_link) {}
+                       PrimaryRegionEraserVis(Comp::Object* l_obj, bool del_link, bool for_poster)
+                        : MyParent(l_obj, del_link, for_poster) {}
 
     protected:
         virtual  void  CalcSubRegions(RectListRgn& lst) { lst.push_back(plc); }
@@ -133,7 +136,7 @@
     public:
                        MenuRegionEraserVis(Comp::Object* l_obj, const Point& mn_sz, 
                                            RectListRgn& r_lst)
-                        : MyParent(l_obj, false), menuSz(mn_sz), rLst(r_lst) {}
+                        : MyParent(l_obj, false, false), menuSz(mn_sz), rLst(r_lst) {}
 
     protected:
             const Point menuSz; // список измененных областей в меню
@@ -142,13 +145,14 @@
         virtual  void  CalcSubRegions(RectListRgn& lst);
 };
 
-RegionEraserVis::RegionEraserVis(Comp::Object* l_obj, bool del_link)
+RegionEraserVis::RegionEraserVis(Comp::Object* l_obj, bool del_link, bool for_poster)
     :lObj(l_obj), owner(GetOwnerMenu(lObj)), mPack(owner->GetData()),
-     delLink(del_link)
+     delLink(del_link), forPoster(for_poster)
 {}
 
 void RegionEraserVis::Visit(MenuRegion& mr)
 {
+    ASSERT( !forPoster );
     plc = mr.GetCanvasBuf().FrameRect();
     if( mPack.editor )
         ResetBackgroundImage(mr);
@@ -159,15 +163,19 @@
 
 void RegionEraserVis::Visit(FrameThemeObj& fto)
 {
-    // * добавляем область
-    plc = Planed::AbsToRel(mPack.thRgn.Transition(), fto.Placement());
-    // * обнуляем
-    Editor::FTOData& dat = mPack.editor ? fto.GetData() : 
-        (Editor::FTOData&)fto.GetData() ;
-    dat.ClearPix();
+    CommonMediaLink& lnk = GetFTOLink(fto, forPoster);
+    if( lnk.Link() == MIToDraw(fto) )
+    {
+        // * добавляем область
+        plc = Planed::AbsToRel(mPack.thRgn.Transition(), fto.Placement());
+        // * обнуляем
+        Editor::FTOData& dat = mPack.editor ? fto.GetData() : 
+            (Editor::FTOData&)fto.GetData() ;
+        dat.ClearPix();
+    }
 
     if( delLink )
-        fto.MediaItem().ClearLink();
+        lnk.ClearLink();
 }
 
 void RegionEraserVis::Visit(TextObj& txt)
@@ -176,21 +184,6 @@
         txt.MediaItem().ClearLink();
 }
 
-typedef boost::function CompObjectFunctor;
-
-void ForeachLinked(MediaItem mi, CompObjectFunctor fnr)
-{
-    for( MenuLinkRange rng = LinkedObjects(mi); rng.first != rng.second ; )
-    {
-        ASSERT( rng.first->ref == mi );
-        Comp::Object* obj = rng.first->subj;
-        ASSERT( obj );
-        ++rng.first; // чтоб можно было удалять ссылки в цикле
-
-        fnr(obj);
-    }
-}
-
 void UpdateMenuRegionObject(Comp::Object* obj, const Point& menu_sz, RectListRgn& lst)
 {
     MenuRegionEraserVis vis(obj, menu_sz, lst);
@@ -273,15 +266,21 @@
         FillThumbnail(itr, mn_store);
 }
 
-static void UpdateMenuObject(Comp::Object* obj, bool del_link)
+static void UpdateMenuObject(Comp::Object* obj, bool del_link, bool for_poster)
 {
-    PrimaryRegionEraserVis vis(obj, del_link);
+    PrimaryRegionEraserVis vis(obj, del_link, for_poster);
     vis.Process();
 }
 
+static void UpdateFTO(FrameThemeObj& fto, bool del_link)
+{
+    UpdateMenuObject(&fto, del_link, true);
+}
+
 static void UpdateMenusFor(MediaItem mi, bool del_link)
 {
-    ForeachLinked(mi, boost::lambda::bind(&UpdateMenuObject, boost::lambda::_1, del_link));
+    ForeachLinked(mi, bl::bind(&UpdateMenuObject, bl::_1, del_link, false));
+    ForeachWithPoster(mi, bl::bind(&UpdateFTO, bl::_1, del_link));
 }
 
 static void UpdateRedrawMenusFor(MediaItem mi, bool del_link, RefPtr mn_store)
diff -Nru bombono-dvd-0.5.2/src/mgui/project/menu-actions.h bombono-dvd-0.6.0/src/mgui/project/menu-actions.h
--- bombono-dvd-0.5.2/src/mgui/project/menu-actions.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/project/menu-actions.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/project/menu-actions.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -43,6 +43,8 @@
 // перерисовать все меню в ответ на изменения в меню changed_mn
 void RenderMenuSystem(Menu changed_mn, RectListRgn& rct_lst);
 
+bool IsMenuToBe4_3();
+
 } // namespace Project
 
 bool ReDivideRects(RectListRgn& rct_lst, MenuRegion& menu_rgn);
diff -Nru bombono-dvd-0.5.2/src/mgui/project/menu-browser.cpp bombono-dvd-0.6.0/src/mgui/project/menu-browser.cpp
--- bombono-dvd-0.5.2/src/mgui/project/menu-browser.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/project/menu-browser.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/project/menu-browser.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -29,7 +29,10 @@
 #include 
 #include 
 #include 
+#include 
 #include 
+#include 
+#include 
 
 #include 
 
@@ -184,55 +187,75 @@
 
 static std::string MakeMediaItemNameForMenu(MediaItem mi)
 {
-    return mi ? mi->mdName + " (" + mi->TypeString() + ")" : "No Link" ;
+    return mi ? mi->mdName + " (" + gettext(mi->TypeString().c_str()) + ")" : _("No Link") ;
 }
 
-static Gtk::RadioMenuItem& 
-AddMediaItemChoice(Gtk::Menu& lnk_list, MediaItem mi, Gtk::RadioButtonGroup& grp,
-                   const SetLinkMenu& slm, MEditorArea* editor, const std::string& name = std::string())
+class LinkMenuBuilder: public EditorMenuBuilder
 {
-    std::string itm_name = name.empty() ? MakeMediaItemNameForMenu(mi) : name ;
+    typedef EditorMenuBuilder MyParent;
+    public:
+                    LinkMenuBuilder(SetLinkMenu& slm, MEditorArea& ed)
+                        :MyParent(slm.newLink, ed, slm.isForBack) {}
+
+    virtual ActionFunctor  CreateAction(MediaItem mi);
+};
 
-    Gtk::RadioMenuItem& itm = NewManaged(grp, itm_name);
-    bool is_default = (mi == slm.newLink);
-    itm.set_active(is_default);
-    // строго после установки сигнала set_active()
-    itm.signal_activate().connect(boost::lambda::bind(SetSelObjectsLinks, boost::ref(*editor), mi, slm.isForBack));
+ActionFunctor LinkMenuBuilder::CreateAction(MediaItem mi)
+{
+    return bl::bind(SetSelObjectsLinks, boost::ref(editor), mi, forPoster);
+}
 
+void AppendRadioItem(Gtk::RadioMenuItem& itm, bool is_active, const ActionFunctor& fnr, Gtk::Menu& lnk_list)
+{
+    itm.set_active(is_active);
+    // .connect() строго после установки set_active()
+    SetForRadioToggle(itm, fnr);
     lnk_list.append(itm);
+}
+
+CommonMenuBuilder::CommonMenuBuilder(MediaItem cur_itm, bool for_poster): 
+   curItm(cur_itm), forPoster(for_poster), resMenu(NewManaged()) {}
+
+
+Gtk::RadioMenuItem& 
+CommonMenuBuilder::AddMediaItemChoice(Gtk::Menu& lnk_list, MediaItem mi, const std::string& name)
+{
+    std::string itm_name = name.empty() ? MakeMediaItemNameForMenu(mi) : name ;
+
+    Gtk::RadioMenuItem& itm = NewManaged(radioGrp, itm_name);
+    AppendRadioItem(itm, mi == curItm, CreateAction(mi), lnk_list);
     return itm;
 }
 
-void SetLinkMenuVis::Visit(MenuMD& obj)
+void CommonMenuBuilder::AddConstantChoice(Gtk::Menu& lnk_list)
 {
-    SetLinkMenu& slm = obj.GetData();
-    Gtk::Menu& lnk_list = NewManaged();
-    slm.linkMenu = &lnk_list;
+    // No Link
+    AddMediaItemChoice(lnk_list, MediaItem());
+}
 
-    MenuPack& mp = obj.GetData();
-    if( !mp.editor )
-    {
-        LOG_ERR << "SetLinkMenuVis::Visit: where is editor?" << io::endl;
-        return;
-    }
-    MediaItem def_mi = slm.newLink;
+Gtk::Menu& CommonMenuBuilder::Create()
+{
+    AStores& as = GetAStores();
+    RefPtr mdStore = as.mdStore;
+    RefPtr  mnStore = as.mnStore;
+
+    Gtk::Menu& lnk_list        = resMenu;
+    Gtk::RadioButtonGroup& grp = radioGrp;
 
-    Gtk::RadioButtonGroup grp;
     // создаем пустой по умолчанию; он будет нажат, иначе им будет No Link
-    // и при вызове set_active() он тоже отработает ("отжали кнопку"); а все потому,
-    // что используем signal_activate вместо signal_toggled
+    // и при вызове set_active() он тоже отработает ("отжали кнопку")
     Gtk::RadioMenuItem empty_itm(grp);
-    // No Link
-    AddMediaItemChoice(lnk_list, MediaItem(), grp, slm, mp.editor);
+
+    AddConstantChoice(lnk_list);
     lnk_list.append(NewManaged());
     // * Menus
-    if( !slm.isForBack )
+    if( !forPoster )
     {
-        if( mnStore->children().size() )
+        if( Size(mnStore) )
         {
             for( MenuStore::iterator itr = mnStore->children().begin(), end = mnStore->children().end();
                  itr != end; ++itr )
-                AddMediaItemChoice(lnk_list, mnStore->GetMedia(itr), grp, slm, mp.editor);
+                AddMediaItemChoice(lnk_list, mnStore->GetMedia(itr));
         }
         else
             AddNoStaffItem(lnk_list, "");
@@ -240,7 +263,7 @@
     }
 
     // * Medias
-    if( mdStore->children().size() )
+    if( Size(mdStore) )
     {
         for( MediaStore::iterator itr = mdStore->children().begin(), end = mdStore->children().end();
              itr != end; ++itr )
@@ -253,24 +276,39 @@
                     Gtk::MenuItem& mn_itm = AppendMI(lnk_list, NewManaged(MakeMediaItemNameForMenu(mi)));
                     Gtk::Menu& chp_menu = MakeSubmenu(mn_itm);
 
-                    AddMediaItemChoice(chp_menu, mi, grp, slm, mp.editor, mi->mdName);
+                    AddMediaItemChoice(chp_menu, mi, mi->mdName);
                     chp_menu.append(NewManaged());
 
                     for( VideoMD::Itr itr = vd->List().begin(), end = vd->List().end(); itr != end; ++itr )
                     {
                         ChapterItem chp = *itr;
-                        AddMediaItemChoice(chp_menu, chp, grp, slm, mp.editor, chp->mdName);
+                        AddMediaItemChoice(chp_menu, chp, chp->mdName);
                     }
                 }
                 else
-                    AddMediaItemChoice(lnk_list, mi, grp, slm, mp.editor);
+                    AddMediaItemChoice(lnk_list, mi);
             }
             else if( ptr::dynamic_pointer_cast(mi) )
-                AddMediaItemChoice(lnk_list, mi, grp, slm, mp.editor).set_sensitive(slm.isForBack);
+                AddMediaItemChoice(lnk_list, mi).set_sensitive(forPoster);
         }
     }
     else
         AddNoStaffItem(lnk_list, "");
+
+    return lnk_list;
+}
+
+void SetLinkMenuVis::Visit(MenuMD& obj)
+{
+    SetLinkMenu& slm = obj.GetData();
+
+    MenuPack& mp = obj.GetData();
+    if( !mp.editor )
+    {
+        LOG_ERR << "SetLinkMenuVis::Visit: where is editor?" << io::endl;
+        return;
+    }
+    slm.linkMenu = &LinkMenuBuilder(slm, *mp.editor).Create();
 }
 
 void PackMenusWindow(Gtk::Container& contr, RefPtr ms, RefPtr md_store)
@@ -296,7 +334,7 @@
         hp.add1(PackInScrolledWindow(vbox));
 
         // * subj
-        vbox.pack_start(MakeTitleLabel("Menu List"), Gtk::PACK_SHRINK);
+        vbox.pack_start(MakeTitleLabel(_("Menu List")), Gtk::PACK_SHRINK);
         PackHSeparator(vbox);
         vbox.pack_start(menu_brw);
         PackHSeparator(vbox);
@@ -306,27 +344,23 @@
         eb.modify_bg(Gtk::STATE_NORMAL, Gdk::Color("white")); // устанавливается при "реализации" виджета
         vbox.pack_start(eb, Gtk::PACK_SHRINK);
 
-        Gtk::Alignment& alg = NewManaged();
-        alg.set_padding(0, 0, 2, 2);
-        eb.add(alg);
-
+        Gtk::Alignment& alg = Add(eb, NewPaddingAlg(0, 0, 2, 2));
         //Gtk::HBox& hb = *Gtk::manage(new Gtk::HBox(true, 4));
-        Gtk::HButtonBox& hb = CreateMListButtonBox();
-        alg.add(hb);
+        Gtk::HButtonBox& hb = Add(alg, CreateMListButtonBox());
         {
             using namespace boost;
             Gtk::Button* add_btn = CreateButtonWithIcon("", Gtk::Stock::ADD,
-                                                        "Add Menu");
+                                                        _("Add Menu"));
             hb.pack_start(*add_btn);
             add_btn->signal_clicked().connect(lambda::bind(&InsertMenuIntoBrowser, boost::ref(menu_brw)));
 
             Gtk::Button* rm_btn = CreateButtonWithIcon("", Gtk::Stock::REMOVE,
-                                                       "Remove Menu");
+                                                       _("Remove Menu"));
             hb.pack_start(*rm_btn);
             rm_btn->signal_clicked().connect(lambda::bind(&DeleteMenuFromBrowser, boost::ref(menu_brw)));
-
-            Gtk::Button* edit_btn = CreateButtonWithIcon("Edit", Gtk::Stock::YES,
-                                                         "Edit Menu");
+            //const char* edit_text = C_("MenuBrowser", "Edit");
+            const char* edit_text = "";
+            Gtk::Button* edit_btn = CreateButtonWithIcon(edit_text, Gtk::Stock::YES, _("Edit Menu"));
             hb.pack_start(*edit_btn);
             ActionFunctor edit_fnr =
                 lambda::bind(&EditMenu, boost::ref(menu_brw), boost::ref(meditor), boost::ref(title_lbl));
@@ -336,7 +370,7 @@
 
         // *
         PackHSeparator(vbox);
-        vbox.pack_start(MakeTitleLabel("Media List"), Gtk::PACK_SHRINK);
+        vbox.pack_start(MakeTitleLabel(_("Media List")), Gtk::PACK_SHRINK);
         PackHSeparator(vbox);
 
         MediaBrowser& brw = NewManaged(md_store);
diff -Nru bombono-dvd-0.5.2/src/mgui/project/menu-browser.h bombono-dvd-0.6.0/src/mgui/project/menu-browser.h
--- bombono-dvd-0.5.2/src/mgui/project/menu-browser.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/project/menu-browser.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/project/menu-browser.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008 Ilya Murav'jov
+// Copyright (c) 2008, 2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -71,6 +71,7 @@
 };
 
 void InsertMenuIntoBrowser(MenuBrowser& brw);
+int MenusCnt();
 
 } // namespace Project
 
diff -Nru bombono-dvd-0.5.2/src/mgui/project/menu-render.cpp bombono-dvd-0.6.0/src/mgui/project/menu-render.cpp
--- bombono-dvd-0.5.2/src/mgui/project/menu-render.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/project/menu-render.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/project/menu-render.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -337,12 +337,13 @@
     SetOwnerMenu(obj, GetOwnerMenu(&menu_rgn));
 }
 
-void AddFTOItem(MenuRegion& menu_rgn, const std::string& theme, const Rect& lct, MediaItem mi)
+FrameThemeObj* AddFTOItem(MenuRegion& menu_rgn, const std::string& theme, const Rect& lct, MediaItem mi)
 {
     FrameThemeObj* fto = new FrameThemeObj(Project::ThemeOrDef(theme).c_str(), lct);
-    fto->MediaItem() = mi;
+    fto->MediaItem().SetLink(mi);
 
     AddMenuItem(menu_rgn, fto);
+    return fto;
 }
 
 void ClearMenuSavedData(Menu mn)
@@ -376,7 +377,8 @@
             //FrameThemeObj* fto = new FrameThemeObj(frame_mi->Theme().c_str(), mi->Placement());
             //fto->MediaItem() = mi->Ref();
             //AddMenuItem(menu_rgn, fto);
-            AddFTOItem(menu_rgn, frame_mi->Theme(), mi->Placement(), mi->Ref());
+            FrameThemeObj* fto = AddFTOItem(menu_rgn, frame_mi->Theme(), mi->Placement(), mi->Ref());
+            fto->PosterItem().SetLink(frame_mi->Poster());
         }
         else
             ASSERT(0);
@@ -420,6 +422,7 @@
         {
             FrameItemMD* f_itm = new FrameItemMD(mn.get());
             f_itm->Theme()    = frame_obj->Theme();
+            f_itm->Poster()   = frame_obj->PosterItem();
 
             SaveMenuItem(f_itm, frame_obj);
         }
diff -Nru bombono-dvd-0.5.2/src/mgui/render/editor.h bombono-dvd-0.6.0/src/mgui/render/editor.h
--- bombono-dvd-0.5.2/src/mgui/render/editor.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/render/editor.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/render/editor.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -67,7 +67,7 @@
    virtual  void  Visit(TextObj& t_obj);
 
    typedef ptr::one Drawer;
-          Drawer& GetDrawer() { return drw; }
+   RGBA::RgnPixelDrawer& GetDrawer() { return *drw; }
             
     protected:
         ptr::one drw; 
diff -Nru bombono-dvd-0.5.2/src/mgui/render/rgba.cpp bombono-dvd-0.6.0/src/mgui/render/rgba.cpp
--- bombono-dvd-0.5.2/src/mgui/render/rgba.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/render/rgba.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/render/rgba.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -77,7 +77,7 @@
     intClr = *(guint32*)&fillClr;
 }
 
-void Drawer::MoveTo(const int to_x, const int to_y)
+void Drawer::MoveTo(int to_x, int to_y)
 {
     curX = to_x;
     curY = to_y;
diff -Nru bombono-dvd-0.5.2/src/mgui/SConscript bombono-dvd-0.6.0/src/mgui/SConscript
--- bombono-dvd-0.5.2/src/mgui/SConscript	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/SConscript	2010-04-16 12:53:55.000000000 +0100
@@ -11,10 +11,13 @@
 # lib
 lib_src_files = [
                  'dvdimport.cpp',
+                 'execution.cpp',
                  'img-factory.cpp',
                  'img_utils.cpp',
                  'mcommon_vis.cpp',
                  'menu-rgn.cpp',
+                 'mux.cpp',
+                 'prefs.cpp',
                  'redivide.cpp',
                  'stream_utils.cpp',
                  'theme.cpp',
@@ -65,6 +68,7 @@
                  'sdk/cairo_utils.cpp',
                  'sdk/clearlooks.cpp',
                  'sdk/player_utils.cpp',
+                 'sdk/textview.cpp',
                  #'sdk/libgnome/gnome-exec.c',
                  'sdk/libgnome/gnome-util.c',
 
@@ -76,6 +80,7 @@
                  'timeline/select.cpp',
                  'timeline/service.cpp',
                 ]
+user_options_dict['AddSourcesForXgettext'](lib_src_files)
 
 # Precompiled header install
 # :ATTENTION: if you use precompiled header in another project then point it out in
diff -Nru bombono-dvd-0.5.2/src/mgui/sdk/menu.h bombono-dvd-0.6.0/src/mgui/sdk/menu.h
--- bombono-dvd-0.5.2/src/mgui/sdk/menu.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/sdk/menu.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/sdk/menu.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2009 Ilya Murav'jov
+// Copyright (c) 2009-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -43,8 +43,10 @@
 // Замечание: для таких меню обычно перед Popup() следует вызвать show_all()
 // 
 Gtk::Menu& NewPopupMenu();
-inline void Popup(Gtk::Menu& mn, GdkEventButton* event)
+inline void Popup(Gtk::Menu& mn, GdkEventButton* event, bool show_all = false)
 {
+    if( show_all )
+        mn.show_all();
     mn.popup(event->button, event->time);
 }
 
diff -Nru bombono-dvd-0.5.2/src/mgui/sdk/textview.cpp bombono-dvd-0.6.0/src/mgui/sdk/textview.cpp
--- bombono-dvd-0.5.2/src/mgui/sdk/textview.cpp	1970-01-01 01:00:00.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/sdk/textview.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -0,0 +1,127 @@
+//
+// mgui/sdk/textview.cpp
+// This file is part of Bombono DVD project.
+//
+// Copyright (c) 2010 Ilya Murav'jov
+//
+// This program 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.
+//
+// This program 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 this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+
+#include 
+
+#include "textview.h"
+#include "widget.h"
+
+static void InitStderrTag(RefPtr tag)
+{
+    Glib::PropertyProxy prop = tag->property_font_desc();
+
+    Pango::FontDescription dsc = prop.get_value();
+    dsc.set_style(Pango::STYLE_ITALIC);
+    prop.set_value(dsc);
+}
+
+TextIterRange AppendNewText(Gtk::TextView& txt_view, const std::string& line, bool is_out)
+{
+    TextIterRange tir = AppendText(txt_view, line);
+    //ApplyStripyOutput(txt_view, tir);
+
+    if( !is_out )
+        ApplyTag(txt_view, tir, "stderr", InitStderrTag);
+    return tir;
+}
+
+static void InitCommandTag(RefPtr tag)
+{
+    tag->property_foreground() = "darkred";
+}
+
+void AppendCommandText(Gtk::TextView& txt_view, const std::string& title)
+{
+    ApplyTag(txt_view, AppendText(txt_view, title + "\n"), 
+             "Command", InitCommandTag);
+}
+
+//static void InitRedTag(RefPtr tag, bool is_red)
+//{
+//    tag->property_foreground() = is_red ? "darkred" : "darkblue" ;
+//}
+//
+//static bool RedTag = true;
+//InitTagFunctor RedFnr  = boost::lambda::bind(&InitRedTag, boost::lambda::_1, true);
+//InitTagFunctor BlueFnr = boost::lambda::bind(&InitRedTag, boost::lambda::_1, false);
+//
+//static void ApplyStripyOutput(Gtk::TextView& txt_view, const TextIterRange& tir)
+//{
+//    RedTag ? ApplyTag(txt_view, tir, "RedTag", RedFnr) : ApplyTag(txt_view, tir, "BlueTag", BlueFnr) ;
+//    RedTag = !RedTag;
+//}
+
+TextIterRange AppendText(Gtk::TextView& txt_view, const std::string& text)
+{
+    RefPtr buf = txt_view.get_buffer();
+    Gtk::TextIter itr = buf->get_iter_at_offset(-1);
+    
+    // внизу ли находимся
+    Gdk::Rectangle disp_rct;
+    txt_view.get_visible_rect(disp_rct);
+    Gdk::Rectangle itr_rct;
+    txt_view.get_iter_location(itr, itr_rct);
+    // нас интересует пересечение только по высоте, тем более что
+    // ширина всегда нулевой ширины
+    itr_rct.set_x(disp_rct.get_x());
+    itr_rct.set_width(disp_rct.get_width());
+    // при интенсивном заполнении даже при таком поднятии могут происходить
+    // одиночные непересечения, но "по инерции" все равно будет скроллироваться
+    itr_rct.set_y(itr_rct.get_y()-itr_rct.get_height());
+
+    bool at_end = !itr_rct.intersect(disp_rct).has_zero_area();
+
+    int itr_off = itr.get_offset(); // после вставки не действителен
+    Gtk::TextIter end_itr = buf->insert(itr, text);
+    itr = buf->get_iter_at_offset(itr_off);
+
+    if( at_end ) // скроллируем
+    {
+        RefPtr end_mark = buf->create_mark("end of text", end_itr, false);
+        txt_view.scroll_to(end_mark);
+    }
+    return TextIterRange(itr, end_itr);
+}
+
+static RefPtr GetBufTag(RefPtr buf, const std::string& tag_name,
+                                      InitTagFunctor fnr)
+{
+    RefPtr tag = buf->get_tag_table()->lookup(tag_name);
+    if( !tag )
+    {
+        tag = buf->create_tag(tag_name);
+        fnr(tag);
+    }
+    return tag;
+}
+
+void ApplyTag(Gtk::TextView& txt_view, const TextIterRange& tir, 
+              const std::string& tag_name, InitTagFunctor fnr)
+{
+    RefPtr buf = txt_view.get_buffer();
+    RefPtr tag = GetBufTag(buf, tag_name, fnr);
+    buf->apply_tag(tag, tir.first, tir.second);
+}
+
+Gtk::Widget& PackDetails(Gtk::TextView& txt_view)
+{
+    return PackWidgetInFrame(PackInScrolledWindow(txt_view, true), Gtk::SHADOW_ETCHED_IN);
+}
diff -Nru bombono-dvd-0.5.2/src/mgui/sdk/textview.h bombono-dvd-0.6.0/src/mgui/sdk/textview.h
--- bombono-dvd-0.5.2/src/mgui/sdk/textview.h	1970-01-01 01:00:00.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/sdk/textview.h	2010-04-16 12:53:55.000000000 +0100
@@ -0,0 +1,45 @@
+//
+// mgui/sdk/textview.h
+// This file is part of Bombono DVD project.
+//
+// Copyright (c) 2010 Ilya Murav'jov
+//
+// This program 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.
+//
+// This program 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 this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+
+#ifndef __MGUI_SDK_TEXTVIEW_H__
+#define __MGUI_SDK_TEXTVIEW_H__
+
+#include 
+
+#include 
+
+#include 
+#include 
+
+Gtk::Widget& PackDetails(Gtk::TextView& txt_view);
+
+typedef std::pair TextIterRange;
+typedef boost::function)> InitTagFunctor;
+
+TextIterRange AppendText(Gtk::TextView& txt_view, const std::string& text);
+void ApplyTag(Gtk::TextView& txt_view, const TextIterRange& tir, 
+              const std::string& tag_name, InitTagFunctor fnr);
+
+TextIterRange AppendNewText(Gtk::TextView& txt_view, const std::string& line, bool is_out);
+void AppendCommandText(Gtk::TextView& txt_view, const std::string& title);
+
+#endif // #ifndef __MGUI_SDK_TEXTVIEW_H__
+
diff -Nru bombono-dvd-0.5.2/src/mgui/sdk/treemodel.h bombono-dvd-0.6.0/src/mgui/sdk/treemodel.h
--- bombono-dvd-0.5.2/src/mgui/sdk/treemodel.h	1970-01-01 01:00:00.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/sdk/treemodel.h	2010-04-16 12:53:55.000000000 +0100
@@ -0,0 +1,52 @@
+//
+// mgui/sdk/treemodel.h
+// This file is part of Bombono DVD project.
+//
+// Copyright (c) 2010 Ilya Murav'jov
+//
+// This program 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.
+//
+// This program 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 this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+
+#ifndef __MGUI_SDK_TREEMODEL_H__
+#define __MGUI_SDK_TREEMODEL_H__
+
+template
+struct ColumnRecord: public Singleton >
+{
+    //typedef ColumnRecord Type;
+    Gtk::TreeModelColumnRecord  rec;
+                       FieldsT  flds;
+
+    protected:
+    ColumnRecord(): flds(rec) {}
+    friend class Singleton; // из-за не тривиального конструктора
+};
+
+template
+FieldsT& GetColumnFields()
+{
+    typedef ColumnRecord Type;
+    return Type::Instance().flds;
+}
+
+template
+Gtk::TreeModelColumnRecord& GetColumnRecord()
+{
+    typedef ColumnRecord Type;
+    return Type::Instance().rec;
+}
+
+#endif // __MGUI_SDK_TREEMODEL_H__
+
diff -Nru bombono-dvd-0.5.2/src/mgui/sdk/widget.h bombono-dvd-0.6.0/src/mgui/sdk/widget.h
--- bombono-dvd-0.5.2/src/mgui/sdk/widget.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/sdk/widget.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/sdk/widget.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2009 Ilya Murav'jov
+// Copyright (c) 2009-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -43,5 +43,46 @@
 typedef boost::function GtkWidgetFunctor;
 void ForAllWidgets(GtkWidget* wdg, const GtkWidgetFunctor& fnr);
 
+Gtk::Alignment& NewPaddingAlg(int top, int btm, int lft, int rgt);
+
+Gtk::ScrolledWindow& PackInScrolledWindow(Gtk::Widget& wdg, bool need_hz = false);
+
+// удобная функция упаковки виджета в рамку
+Gtk::Frame& NewManagedFrame(Gtk::ShadowType st = Gtk::SHADOW_ETCHED_IN, 
+                            const std::string& label = std::string());
+Gtk::Frame& PackWidgetInFrame(Gtk::Widget& wdg, Gtk::ShadowType st,
+                              const std::string& label = std::string());
+
+Gtk::Label& NewMarkupLabel(const std::string& label, bool use_underline = false);
+
+//
+// GtkRadioButton, GtkRadioMenuItem и др. "radio"-виджеты отрабатывают toggled на оба состояния;
+// реально же действие хочется выполнить только на выбор.
+//
+template
+class RadioToggleCaller
+{
+    public:
+                RadioToggleCaller(RadioItem& itm, const ActionFunctor& fnr): itm_(itm), fnr_(fnr) {}
+
+          void  operator()()
+          {
+              if( itm_.get_active() )
+                  fnr_();
+          }
+
+    private:
+              RadioItem& itm_;
+           ActionFunctor fnr_;
+};
+
+template
+void SetForRadioToggle(RadioItem& itm, const ActionFunctor& fnr)
+{
+    // в заголовках не используем Boost.Lambda
+    //itm.signal_toggled().connect(bl::bind(&OnRadioToggled, boost::ref(itm), fnr));
+    itm.signal_toggled().connect(RadioToggleCaller(itm, fnr));
+}
+
 #endif // #ifndef __MGUI_SDK_WIDGET_H__
 
diff -Nru bombono-dvd-0.5.2/src/mgui/tests/SConscript bombono-dvd-0.6.0/src/mgui/tests/SConscript
--- bombono-dvd-0.5.2/src/mgui/tests/SConscript	2009-09-08 11:12:14.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/tests/SConscript	2010-04-16 12:53:55.000000000 +0100
@@ -15,10 +15,12 @@
                 'test_dnd.cpp',
                 'test_dvdimport.cpp',
                 'test_execute.cpp',
+                'test_gettext.cpp',
                 'test_meditor.cpp',
                 'test_menu.cpp',
                 'test_main.cpp',
                 'test_mbrowser.cpp',
+                'test_mux.cpp',
                 'test_redivide.cpp',
                 'test_stream_utils.cpp',
                 #'test_scaled_text.cpp',
diff -Nru bombono-dvd-0.5.2/src/mgui/tests/test_execute.cpp bombono-dvd-0.6.0/src/mgui/tests/test_execute.cpp
--- bombono-dvd-0.5.2/src/mgui/tests/test_execute.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/tests/test_execute.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/tests/test_execute.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2009 Ilya Murav'jov
+// Copyright (c) 2009-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -26,6 +26,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -126,21 +127,11 @@
     ExecState& es;
 };
 
-static void InitTitleTag(RefPtr tag)
-{
-    tag->property_foreground() = "darkred";
-}
-
-static void AppendTitleText(Gtk::TextView& txt_view, const std::string& title)
-{
-    ApplyTag(txt_view, AppendText(txt_view, "\t### " + title + " ###\n"), 
-             "Title", InitTitleTag);
-}
-
 static void OnExecuteCommand(Gtk::ComboBoxEntryText& cmd_ent, 
                              Gtk::FileChooserButton& ch_btn)
 {
     ExecState& es = GetES();
+    Execution::Data& edat = es.eDat;
     if( !es.isExec )
     {
         ConsoleSetter ess(es);
@@ -154,19 +145,19 @@
             cmd_ent.remove_text(cmd);
             cmd_ent.prepend_text(cmd);
             ent.set_text(""); // очищаем
-            AppendTitleText(txt_view, "Execute Command: '" + cmd + "'");
+            AppendCommandText(txt_view, "Execute Command: '" + cmd + "'");
 
             ConsoleOF cof;
-            ExitData ed = ExecuteAsync(ch_btn.get_filename().c_str(), cmd.c_str(), cof, &es.pid);
+            ExitData ed = ExecuteAsync(ch_btn.get_filename().c_str(), cmd.c_str(), cof, &edat.pid);
 
 
             std::string exit_str = ExitDescription(ed);
-            AppendTitleText(txt_view, "Exit Status: " + exit_str + ".");
+            AppendCommandText(txt_view, "Exit Status: " + exit_str + ".");
             es.SetStatus(ed.IsGood() ? std::string() : exit_str);
         }
     }
     else
-        StopExecution(es.pid);
+        edat.StopExecution("\"command\"");
 }
 
 BOOST_AUTO_TEST_CASE( TestInteractiveExecute )
diff -Nru bombono-dvd-0.5.2/src/mgui/tests/test_gettext.cpp bombono-dvd-0.6.0/src/mgui/tests/test_gettext.cpp
--- bombono-dvd-0.5.2/src/mgui/tests/test_gettext.cpp	1970-01-01 01:00:00.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/tests/test_gettext.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -0,0 +1,66 @@
+//
+// mgui/tests/test_gettext.cpp
+// This file is part of Bombono DVD project.
+//
+// Copyright (c) 2010 Ilya Murav'jov
+//
+// This program 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.
+//
+// This program 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 this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+
+#include 
+
+//#include 
+//#define _(String) gettext(String)
+//#define gettext_noop(String) String
+//#define N_(String) gettext_noop(String)
+
+#include 
+#include 
+#include 
+
+#include 
+#include 
+//#include 
+#include 
+#include 
+
+BOOST_AUTO_TEST_CASE( TestFormat )
+{
+    // Boost.Format
+    std::string f_str = boost::str(boost::format("writing %2%,  x=%1% : %3%-th try") % "toto" % 40.23 % 50);
+    BOOST_CHECK( strcmp(f_str.c_str(), "writing 40.23,  x=toto : 50-th try") == 0 );
+}
+
+BOOST_AUTO_TEST_CASE( TestGettext )
+{
+    return;
+    InitI18n();
+    
+    const char* not_trans_text = N_("not_trans_text");
+    BOOST_CHECK( strcmp(not_trans_text, "not_trans_text") == 0 );
+
+    io::cout << _("Hello, world!") << io::endl;
+    //io::cout << boost::format(_("writing %1%,  x=%2% : %3%-th try")) % "toto" % 40.23 % 50; 
+}
+
+BOOST_AUTO_TEST_CASE( TestMBLinks )
+{
+    return;
+    InitGtkmm();
+
+    std::string err_str = "See more about preparing video for authoring in online help.";
+    MessageBoxWeb("Message", Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, err_str);
+}
+
diff -Nru bombono-dvd-0.5.2/src/mgui/tests/test_mbrowser.cpp bombono-dvd-0.6.0/src/mgui/tests/test_mbrowser.cpp
--- bombono-dvd-0.5.2/src/mgui/tests/test_mbrowser.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/tests/test_mbrowser.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/tests/test_mbrowser.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -39,7 +39,7 @@
 
 static int GetMediasSize(RefPtr ms)
 {
-    return ms->children().size();
+    return Size(ms);
 }
 
 static void CheckMediaPaths(RefPtr ms, int have_cnt = -1)
diff -Nru bombono-dvd-0.5.2/src/mgui/tests/test_menu.cpp bombono-dvd-0.6.0/src/mgui/tests/test_menu.cpp
--- bombono-dvd-0.5.2/src/mgui/tests/test_menu.cpp	2009-09-27 18:13:45.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/tests/test_menu.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/tests/test_menu.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -232,6 +232,9 @@
 
     // * производительность
     //TestChangeProductivity(mp1, a, 4000);
+
+    // явно очищаем циклические ссылки, достаточно у одного меню
+    mp1.thRgn.Clear();
 }
 
 } // namespace Project
diff -Nru bombono-dvd-0.5.2/src/mgui/tests/test_mux.cpp bombono-dvd-0.6.0/src/mgui/tests/test_mux.cpp
--- bombono-dvd-0.5.2/src/mgui/tests/test_mux.cpp	1970-01-01 01:00:00.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/tests/test_mux.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -0,0 +1,69 @@
+//
+// mgui/tests/test_mux.cpp
+// This file is part of Bombono DVD project.
+//
+// Copyright (c) 2010 Ilya Murav'jov
+//
+// This program 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.
+//
+// This program 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 this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+
+#include 
+
+#include 
+#include 
+
+#include 
+
+#include 
+#include 
+#include 
+
+BOOST_AUTO_TEST_CASE( TestFileChooser )
+{
+    InitGtkmm();
+
+    const char* path = "/var/tmp";
+    Gtk::FileChooserButton btn("Select folder", Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER);
+
+    BOOST_CHECK( btn.set_filename(path) );
+    //BOOST_CHECK( btn.set_current_folder(path) );
+
+    //Gtk::Window win;
+    //win.add(btn);
+    //RunWindow(win);
+    IteratePendingEvents();
+    
+    //io::cout << btn.get_filename() << io::endl;
+    BOOST_CHECK_MESSAGE( strcmp(btn.get_filename().c_str(), path) == 0, "See more at https://bugzilla.gnome.org/show_bug.cgi?id=615353" );
+}
+
+BOOST_AUTO_TEST_CASE( TestPreferences )
+{
+    return;
+    InitGtkmm();
+
+    LoadPrefs();
+    ShowPrefs();
+}
+
+BOOST_AUTO_TEST_CASE( TestMux )
+{
+    return;
+    InitGtkmm();
+
+    std::string fname;
+    MuxStreams(fname);
+}
+
diff -Nru bombono-dvd-0.5.2/src/mgui/theme.cpp bombono-dvd-0.6.0/src/mgui/theme.cpp
--- bombono-dvd-0.5.2/src/mgui/theme.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/theme.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/theme.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -21,12 +21,12 @@
 
 #include 
 
+#include "theme.h"
+
 #include 
 #include 
 #include 
 
-#include "theme.h"
-
 namespace Editor
 {
 
@@ -121,9 +121,24 @@
 void FTOData::CompositeFTO(RefPtr& pix, FrameThemeObj& fto)
 {
     const Editor::ThemeData& td = GetTheme(fto.Theme());
-    RefPtr obj_pix = CalcSource(fto.MediaItem(), PixbufSize(td.vFrameImg));
+
+    RefPtr obj_pix = CalcSource(Project::MIToDraw(fto), PixbufSize(td.vFrameImg));
     pix = CompositeWithFrame(obj_pix, td);
 }
 
 } // namespace Editor
 
+
+namespace Project {
+
+MediaItem MIToDraw(FrameThemeObj& fto)
+{
+    MediaItem mi = fto.PosterItem();
+    if( !mi )
+        mi = fto.MediaItem();
+
+    return mi;
+}
+
+} // namespace Project
+
diff -Nru bombono-dvd-0.5.2/src/mgui/theme.h bombono-dvd-0.6.0/src/mgui/theme.h
--- bombono-dvd-0.5.2/src/mgui/theme.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/theme.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/theme.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008 Ilya Murav'jov
+// Copyright (c) 2008, 2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -22,12 +22,16 @@
 #ifndef __MGUI_THEME_H__
 #define __MGUI_THEME_H__
 
-#include 
+#include "img_utils.h"
 
-#include 
 #include 
 #include 
-#include "img_utils.h"
+#include 
+
+#include 
+
+#include 
+
 
 namespace Editor
 {
@@ -87,5 +91,18 @@
 
 } // namespace Editor
 
+
+namespace Project {
+
+// выбор: что отрисовывать в рамке
+Project::MediaItem MIToDraw(FrameThemeObj& fto);
+
+inline CommonMediaLink& GetFTOLink(FrameThemeObj& fto, bool forPoster)
+{
+    return forPoster ? (CommonMediaLink&)fto.PosterItem() : fto.MediaItem() ;
+}
+
+} // namespace Project
+
 #endif // __MGUI_THEME_H__
 
diff -Nru bombono-dvd-0.5.2/src/mgui/timeline/layout.cpp bombono-dvd-0.6.0/src/mgui/timeline/layout.cpp
--- bombono-dvd-0.5.2/src/mgui/timeline/layout.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/timeline/layout.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/timeline/layout.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -28,6 +28,8 @@
 #include 
 #include 
 #include 
+#include 
+#include 
 
 #include  
 
@@ -465,11 +467,8 @@
         Gtk::HPaned& hp = layout.TrkHPaned();
         {
             // делаем отступ от бегунка
-            Gtk::Alignment* algn = Gtk::manage(new Gtk::Alignment);
-            algn->set_padding(0, 0, 0, 2);
-
-            Gtk::HBox* hbox = Gtk::manage(new Gtk::HBox(false, 0));
-            algn->add(*hbox);
+            Gtk::Alignment& algn = NewPaddingAlg(0, 0, 0, 2);
+            Gtk::HBox& hbox = Add(algn, NewManaged());
             {
                 Gtk::Button* m_btn = CreateScaleButton(layout, false);
                 {
@@ -478,11 +477,11 @@
 
                     m_btn->add(*m_lbl);
                 }
-                hbox->pack_start(*m_btn, false, true);
+                hbox.pack_start(*m_btn, false, true);
 
                 Gtk::HScale* scl = Gtk::manage(new Gtk::HScale(layout.TrkScale()));
                 SetScaleSecondary(*scl);
-                hbox->pack_start(*scl, true, true);
+                hbox.pack_start(*scl, true, true);
 
                 Gtk::Button* p_btn = CreateScaleButton(layout, true);
                 {
@@ -491,9 +490,9 @@
 
                     p_btn->add(*p_lbl);
                 }
-                hbox->pack_start(*p_btn, false, true);
+                hbox.pack_start(*p_btn, false, true);
             }
-            hp.add1(*algn);
+            hp.add1(algn);
 
             Gtk::HScrollbar* scr_bar = Gtk::manage(new Gtk::HScrollbar(layout.TrkHScroll()));
             hp.add2(*scr_bar);
@@ -524,7 +523,7 @@
     {
         Gtk::Button* dvd_btn = Gtk::manage(new Gtk::Button);
         SetNonActiveButton(*dvd_btn, "DVDLabelButton");
-        SetTip(*dvd_btn, "Add Chapter Point");
+        SetTip(*dvd_btn, _("Add Chapter Point"));
         dvd_btn->signal_clicked().connect( boost::lambda::bind(&InsertDVDMark, boost::ref(layout)) );
 
         Gtk::Image* dvd_img = Gtk::manage(new Gtk::Image(GetFactoryImage("dvdmark.png")));
diff -Nru bombono-dvd-0.5.2/src/mgui/timeline/layout-draw.cpp bombono-dvd-0.6.0/src/mgui/timeline/layout-draw.cpp
--- bombono-dvd-0.5.2/src/mgui/timeline/layout-draw.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/timeline/layout-draw.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/timeline/layout-draw.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008 Ilya Murav'jov
+// Copyright (c) 2008, 2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -21,12 +21,13 @@
 
 #include 
 
-#include 
-#include 
-
 #include "layout.h"
 #include "service.h"
 
+#include 
+#include 
+#include 
+
 namespace Timeline
 {
 
@@ -152,10 +153,10 @@
     FillRectangle(cont, head_rct, false, 1);
 
     RefPtr lay = Pango::Layout::create(cont);
-    const char* mark_str = "Video";
+    std::string mark_str = boost::format("%1%") % _("Video") % bf::stop;
     lay->set_markup(mark_str);
 
-    DPoint txt_pos = FindAForCenteredRect(CalcTextSize(lay), DRect(head_rct), true, true);
+    DPoint txt_pos = FindAForCenteredRect(CalcTextSize(lay), DRect(head_rct));
     //cont->move_to(10, 5);
     cont->move_to(Round(txt_pos.x), Round(txt_pos.y));
     show_in_cairo_context(lay, cont);
diff -Nru bombono-dvd-0.5.2/src/mgui/timeline/mviewer.cpp bombono-dvd-0.6.0/src/mgui/timeline/mviewer.cpp
--- bombono-dvd-0.5.2/src/mgui/timeline/mviewer.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/timeline/mviewer.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/timeline/mviewer.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -26,6 +26,8 @@
 #include 
 #include 
 #include 
+#include 
+#include 
 
 #include 
 
@@ -123,11 +125,7 @@
 
 Gtk::Container& PackAlignedForBrowserTB(Gtk::Container& par_contr)
 {
-    Gtk::Alignment& algn = *Gtk::manage(new Gtk::Alignment);
-    par_contr.add(algn);
-    algn.set_padding(WDG_BORDER_WDH, WDG_BORDER_WDH, 0, 0);
-
-    return algn;
+    return Add(par_contr, NewPaddingAlg(WDG_BORDER_WDH, WDG_BORDER_WDH, 0, 0));
 }
 
 Gtk::HButtonBox& InsertButtonArea(Gtk::VBox& vbox, Gtk::ButtonBoxStyle style)
@@ -145,9 +143,8 @@
 Gtk::Label& MakeTitleLabel(const char* name)
 {
     // не меньше чем размер шрифта элемента в списке
-    Gtk::Label& label = *Gtk::manage(new Gtk::Label("" + 
-                                                    std::string(name) + ""));
-    label.set_use_markup(true);
+    Gtk::Label& label = NewMarkupLabel("" + 
+                                       std::string(name) + "");
     label.set_padding(0, 5);
 
     return label;
@@ -158,6 +155,7 @@
 {
     fftALL_FORMATS,
     fftMPEG,
+    fftDVD_SOUND,
     fftIMAGES,
     fftALL
 };
@@ -174,6 +172,15 @@
     //ff.add_pattern("*.dva");
 }
 
+void FillSoundFilter(Gtk::FileFilter& ff)
+{
+    ff.add_pattern("*.mp2");
+    ff.add_pattern("*.mpa");
+    ff.add_pattern("*.ac3");
+    ff.add_pattern("*.dts");
+    ff.add_pattern("*.lpcm");
+}
+
 static void AddImagesFilter(Gtk::FileFilter& ff)
 {
     ff.add_pattern("*.png");
@@ -185,6 +192,7 @@
 static void AddAllFormatsFilter(Gtk::FileFilter& ff)
 {
     AddMPEGFilter(ff);
+    FillSoundFilter(ff);
     AddImagesFilter(ff);
 }
 
@@ -200,6 +208,9 @@
     case fftMPEG:
         AddMPEGFilter(ff);
         break;
+    case fftDVD_SOUND:
+        FillSoundFilter(ff);
+        break;
     case fftIMAGES:
         AddImagesFilter(ff);
         break;
@@ -225,7 +236,7 @@
     MakeBoxHIGed(vbox);
 
     // 0 надпись
-    vbox.pack_start(PackWidgetInFrame(MakeTitleLabel("File Browser"), Gtk::SHADOW_ETCHED_IN), Gtk::PACK_SHRINK);
+    vbox.pack_start(PackWidgetInFrame(MakeTitleLabel(_("File Browser")), Gtk::SHADOW_ETCHED_IN), Gtk::PACK_SHRINK);
 
     // 1 окно выбора файлов
     Gtk::FileChooserWidget& fcw = *Gtk::manage(new Gtk::FileChooserWidget(Gtk::FILE_CHOOSER_ACTION_OPEN));
@@ -255,10 +266,11 @@
     else
     {
         Gtk::ComboBoxText& combo = *Gtk::manage(new Gtk::ComboBoxText);
-        combo.append_text("All formats");
-        combo.append_text("MPEG files (*.mpeg, *.mpg, *.vob)");
-        combo.append_text("Still Images (*.png, *.jpg, *.jpeg, *.bmp)");
-        combo.append_text("All Files (*.*)");
+        combo.append_text(_("All formats"));
+        combo.append_text(_("MPEG files") + std::string(" (*.mpeg, *.mpg, *.vob)"));
+        combo.append_text(_("Audio for DVD") + std::string(" (*.mp2/mpa, *.ac3, *.dts, *.lpcm)"));
+        combo.append_text(_("Still Images") + std::string(" (*.png, *.jpg, *.jpeg, *.bmp)"));
+        combo.append_text(_("All Files (*.*)"));
 
         // значение по умолчанию
         combo.set_active(fftALL_FORMATS);
diff -Nru bombono-dvd-0.5.2/src/mgui/timeline/select.cpp bombono-dvd-0.6.0/src/mgui/timeline/select.cpp
--- bombono-dvd-0.5.2/src/mgui/timeline/select.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/timeline/select.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/timeline/select.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -23,14 +23,21 @@
 
 #include "service.h"
 
+#include 
+
 #include 
 #include 
 #include 
 #include 
 #include   // Popup()
+#include 
+#include 
+#include 
 #include  // ChooseFileSaveTo()
+#include 
 
 #include 
+#include 
 #include 
 #include  // std::ceil()
 
@@ -107,6 +114,19 @@
     return std::string( jpeg_on_break ? "jpeg" : "" );
 }
 
+static std::string& SaveFrameDir()
+{
+    static std::string dir;
+    return dir;
+}
+
+static void OnSaveFrameDialog(Gtk::FileChooserDialog& dlg, Gtk::CheckButton& btn)
+{
+    if( !SaveFrameDir().empty() )
+        dlg.set_current_folder(SaveFrameDir());
+    dlg.set_extra_widget(btn);
+}
+
 static void SaveFrame(DAMonitor& mon)
 {
     time4_t t4 = FramesToTime(mon.CurPos()>=0 ? mon.CurPos() : 0, Mpeg::GetFrameFPS(mon.GetPlayer()));
@@ -120,7 +140,10 @@
     strm << ".jpeg";
 
     std::string fnam = strm.str();
-    if( ChooseFileSaveTo(fnam, "Save Frame", mon, false) )
+    Gtk::CheckButton& add_btn = NewManaged(_("A_dd to project"), true);
+    RefPtr add_ref(MakeRefPtr(&add_btn)); 
+
+    if( ChooseFileSaveTo(fnam, _("Save Frame..."), mon, bl::bind(&OnSaveFrameDialog, bl::_1, boost::ref(add_btn))) )
     {
         // находим расширение и по нему сохраняем
         int i = fnam.rfind('.');
@@ -128,33 +151,93 @@
         ext = GetFormatByExt(ext.c_str(), true);
 
         mon.FramePixbuf()->save(fnam, ext);
+
+        SaveFrameDir() = fs::path(fnam).branch_path().string();
+        if( add_btn.get_active() )
+            Project::TryAddMediaQuiet(fnam, "SaveFrame");
+    }
+}
+
+static int LastPos(TrackLayout& trk_lay)
+{
+    return (int)std::ceil(trk_lay.GetFramesLength());
+}
+
+static void InsertDVDMarkAtPos(TrackLayout& trk_lay, int pos);
+
+static void InsertChapters(TrackLayout& trk_lay)
+{
+    Gtk::Dialog add_dlg(_("Add Chapter Points at Intervals"), *GetTopWindow(trk_lay), true);
+    Gtk::SpinButton*  btn  = 0;
+    Gtk::CheckButton* cbtn = 0;
+    {
+        Gtk::VBox& vbox = AddHIGedVBox(add_dlg);
+        Gtk::HBox& hbox = PackStart(vbox, NewManaged());
+        Add(PackStart(hbox, NewPaddingAlg(0, 0, 0, 40)), NewManaged(_("Interval between Chapters:")));
+        btn = &PackStart(hbox, NewManaged());
+        // по мотивам gtk_spin_button_new_with_range()
+        int step = 1;
+        btn->configure(*Gtk::manage(new Gtk::Adjustment(5, 1, 1000, step, 10*step, 0)), step, 0);
+        btn->set_numeric(true);
+
+        Gtk::Label& lbl = PackStart(hbox, NewManaged(_("min.")));
+        lbl.set_padding(2, 0);
+
+        cbtn = &PackStart(vbox, NewManaged(_("Remove Existing Chapters")));
+    }
+    CompleteDialog(add_dlg);
+
+    if( Gtk::RESPONSE_OK == add_dlg.run() )
+    {
+        int intr = btn->get_value_as_int() * 60; // секунды
+        if( cbtn->get_active() )
+            DeleteAllDVDMarks(trk_lay);
+
+        int last_pos = LastPos(trk_lay);
+        for( int i = 1, pos; pos = TimeToFrames(i*intr, trk_lay.FrameFPS()), pos < last_pos; i++ )
+            InsertDVDMarkAtPos(trk_lay, pos);
     }
 }
 
+static void PlayInTotem(TrackLayout& trk_lay)
+{
+    uint64_t msec = uint64_t(trk_lay.CurPos()/trk_lay.FrameFPS()*1000);
+    // уже запущенный Totem не воспринимает --seek, поэтому сначала закрываем его
+    std::string cmd = boost::format("totem --quit; totem --seek %1% %2%") % msec % GetFilename(*CurrVideo) % bf::stop;
+    Execution::SimpleSpawn(cmd.c_str());
+}
+
 void ContextMenuHook::AtScale()
 {
     popupActions = Gtk::ActionGroup::create("Actions");
 
     using namespace boost;
     // Add
-    popupActions->add( Gtk::Action::create("Add Chapter", "Add Chapter Point"),
+    popupActions->add( Gtk::Action::create("Add Chapter", _("Add Chapter Point")),
                        lambda::bind(&InsertDVDMark, boost::ref(trkLay)) );
     // Delete
-    RefPtr act = Gtk::Action::create("Delete Chapter", "Delete Chapter Point");
+    RefPtr act = Gtk::Action::create("Delete Chapter", _("Delete Chapter Point"));
     act->set_sensitive(false);
     popupActions->add( act );
     // Delete All
-    act = Gtk::Action::create("Delete All", "Delete All Chapter Points");
+    act = Gtk::Action::create("Delete All", _("Delete All Chapter Points"));
     if( DVDMarks().size() == 0 )
         act->set_sensitive(false);
     popupActions->add( act, lambda::bind(&DeleteAllDVDMarks, boost::ref(trkLay)) );
+    // Add at Intervals
+    popupActions->add( Gtk::Action::create("Add at Intervals", DOTS_("Add Chapter Points at Intervals")),
+                       bl::bind(&InsertChapters, boost::ref(trkLay)) );
+
     // Save
     ActionFunctor save_fnr = lambda::constant(0); // если не mon, то пустой
     DAMonitor* mon = dynamic_cast(&trkLay.GetMonitor());
     if( mon )
         save_fnr = lambda::bind(&SaveFrame, boost::ref(*mon));
-    popupActions->add( Gtk::Action::create("Save Frame", Gtk::Stock::SAVE, "Save Current Frame..."),
+    popupActions->add( Gtk::Action::create("Save Frame", Gtk::Stock::SAVE, DOTS_("Save Current Frame")),
                        save_fnr );
+    popupActions->add( Gtk::Action::create("Play in Totem", Gtk::Stock::MEDIA_PLAY, 
+                                           BF_("_Play in %1%") % "Totem" % bf::stop),
+                       bl::bind(&PlayInTotem, boost::ref(trkLay)) );
 }
 
 void ContextMenuHook::AtDVDMark(int idx)
@@ -182,8 +265,10 @@
         "    "
         "    "
         "    "
+        "    "
         "    "
         "    "
+        "    "
         "  "
         "";
         mngr->add_ui_from_string(ui_info);
@@ -329,7 +414,7 @@
             break;
         case GDK_End:  case GDK_KP_End:
             {
-                int last_pos = (int)std::ceil(trk.GetFramesLength());
+                int last_pos = LastPos(trk);
                 SetPointer( std::max(0, last_pos), trk );
             }
             break;
@@ -664,7 +749,7 @@
         wrap_return(lambda::bind(&OnKeyPressBigLabel, boost::ref(trk), lambda::_1)) );
     LimitTextInput(ent, AllowedChars);
 
-    sz = FindAForCenteredRect(sz, lct, true, true);
+    sz = FindAForCenteredRect(sz, lct);
     trk.put(ent, sz.x, sz.y);
 
     // фокус устанавливаем после вставки, иначе не сработает
@@ -704,11 +789,11 @@
     NormalTL::Instance().OnMouseDown(trk, event);
 }
 
-void InsertDVDMark(TrackLayout& trk_lay)
+static void InsertDVDMarkAtPos(TrackLayout& trk_lay, int pos)
 {
-    if( trk_lay.CurPos() >= 0 )
+    if( pos >= 0 )
     {
-        Project::ChapterItem ci = PushBackDVDMark(trk_lay.CurPos());
+        Project::ChapterItem ci = PushBackDVDMark(pos);
         RedrawDVDMark(trk_lay, OrderDVDMark(DVDMarks().size()-1));
 
         // обновляем
@@ -717,6 +802,10 @@
     }
 }
 
+void InsertDVDMark(TrackLayout& trk_lay)
+{
+    InsertDVDMarkAtPos(trk_lay, trk_lay.CurPos());
+}
 
 } // namespace Timeline
 
diff -Nru bombono-dvd-0.5.2/src/mgui/timeline/select.h bombono-dvd-0.6.0/src/mgui/timeline/select.h
--- bombono-dvd-0.5.2/src/mgui/timeline/select.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/timeline/select.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/timeline/select.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008 Ilya Murav'jov
+// Copyright (c) 2008, 2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -142,7 +142,6 @@
 
 Rect GetBigLabelLocation(TrackLayout& trk);
 bool SetPointer(int new_pos, TrackLayout& trk);
-void InsertDVDMark(TrackLayout& trk_lay);
 void RedrawDVDMark(TrackLayout& trk, int idx);
 
 //
diff -Nru bombono-dvd-0.5.2/src/mgui/trackwindow.h bombono-dvd-0.6.0/src/mgui/trackwindow.h
--- bombono-dvd-0.5.2/src/mgui/trackwindow.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/trackwindow.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/trackwindow.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008 Ilya Murav'jov
+// Copyright (c) 2008, 2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -23,6 +23,7 @@
 #define __MGUI_TRACKWINDOW_H__
 
 #include 
+#include 
 
 typedef boost::function TWFunctor;
 
diff -Nru bombono-dvd-0.5.2/src/mgui/win_utils.cpp bombono-dvd-0.6.0/src/mgui/win_utils.cpp
--- bombono-dvd-0.5.2/src/mgui/win_utils.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/win_utils.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/win_utils.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -22,14 +22,20 @@
 #include 
 
 #include "win_utils.h"
+#include "dialog.h"
 
 #include 
 #include 
+#include  // ForAllWidgets()
+#include 
 
 #include  // Project::ConvertPathToUtf8()
 #include 
 #include      // fs::exists()
 
+#include  // GTK_IS_LABEL()
+
+
 #define GetStyleColor_Impl(ClrType, ClrName)    \
 RGBA::Pixel GetStyleColor ## ClrName(Gtk::StateType typ, Gtk::Widget& wdg)  \
 { \
@@ -169,12 +175,18 @@
     return *tips;
 }
 
-Gtk::Frame& PackWidgetInFrame(Gtk::Widget& wdg, Gtk::ShadowType st, const std::string& label)
+Gtk::Frame& NewManagedFrame(Gtk::ShadowType st, const std::string& label)
 {
-    Gtk::Frame& fram = *Gtk::manage(new Gtk::Frame);
+    Gtk::Frame& fram = NewManaged();
     fram.set_shadow_type(st);
     if( label.size() )
         fram.set_label(label);
+    return fram;
+}
+
+Gtk::Frame& PackWidgetInFrame(Gtk::Widget& wdg, Gtk::ShadowType st, const std::string& label)
+{
+    Gtk::Frame& fram = NewManagedFrame(st, label);
 
     fram.add(wdg);
     return fram;
@@ -192,19 +204,45 @@
     return "" + title + "";
 }
 
-Gtk::ResponseType MessageBox(const std::string& msg_str, Gtk::MessageType typ,
-                             Gtk::ButtonsType b_typ, const std::string& desc_str, bool def_ok)
+Gtk::ResponseType MessageBoxEx(const std::string& msg_str, Gtk::MessageType typ,
+                               Gtk::ButtonsType b_typ, const std::string& desc_str, const MDFunctor& fnr)
 {
     std::string markup_msg_str = MakeMessageBoxTitle(QuoteForGMarkupParser(msg_str));
 
     Gtk::MessageDialog mdlg(markup_msg_str, true, typ, b_typ);
     if( !desc_str.empty() )
         mdlg.set_secondary_text(desc_str, true);
-    if( def_ok )
-        mdlg.set_default_response(Gtk::RESPONSE_OK);
+
+    if( fnr )
+        fnr(mdlg);
+
     return (Gtk::ResponseType)mdlg.run();
 }
 
+static void SetOKDefault(Gtk::MessageDialog& mdlg)
+{
+    mdlg.set_default_response(Gtk::RESPONSE_OK);
+}
+
+Gtk::ResponseType MessageBox(const std::string& msg_str, Gtk::MessageType typ,
+                             Gtk::ButtonsType b_typ, const std::string& desc_str, bool def_ok)
+{
+    //std::string markup_msg_str = MakeMessageBoxTitle(QuoteForGMarkupParser(msg_str));
+    //
+    //Gtk::MessageDialog mdlg(markup_msg_str, true, typ, b_typ);
+    //if( !desc_str.empty() )
+    //    mdlg.set_secondary_text(desc_str, true);
+    //if( def_ok )
+    //    mdlg.set_default_response(Gtk::RESPONSE_OK);
+    //
+    //if( fnr )
+    //    fnr(mdlg);
+    //
+    //return (Gtk::ResponseType)mdlg.run();
+
+    return MessageBoxEx(msg_str, typ, b_typ, desc_str, def_ok ? SetOKDefault : MDFunctor());
+}
+
 void SetTip(Gtk::Widget& wdg, const char* tooltip)
 {
     if( tooltip && *tooltip )
@@ -214,11 +252,15 @@
 Gtk::Button* CreateButtonWithIcon(const char* label, const Gtk::BuiltinStockID& stock_id,
                                   const char* tooltip, Gtk::BuiltinIconSize icon_sz)
 {
-    Gtk::Button* btn = Gtk::manage(new Gtk::Button(label));
-    btn->set_image(*Gtk::manage(new Gtk::Image(stock_id, icon_sz)));
+    Gtk::Button& btn = NewManaged(label);
+    Gtk::Image& img  = NewManaged(stock_id, icon_sz);
+    btn.set_image(img);
+    // убираем влияние настройки gtk-button-images после включения в кнопку
+    //img.set_visible();
+    img.property_visible() = true;
 
-    SetTip(*btn, tooltip);
-    return btn;
+    SetTip(btn, tooltip);
+    return &btn;
 }
 
 void AddCancelDoButtons(Gtk::Dialog& dialog, Gtk::BuiltinStockID do_id)
@@ -251,30 +293,38 @@
 }
 
 bool ChooseFileSaveTo(std::string& fname, const std::string& title, Gtk::Widget& for_wdg,
-                      bool convert_to_utf8 = true)
+                      const FCDFunctor& fnr)
 {
     Gtk::FileChooserDialog dialog(title, Gtk::FILE_CHOOSER_ACTION_SAVE);
     BuildChooserDialog(dialog, false, for_wdg);
 
     dialog.set_current_name(fname);
-//     bool res = Gtk::RESPONSE_OK == dialog.run();
-//     if( res )
+    if( fnr )
+        fnr(dialog);
+
     bool res;
-    for( ; res = Gtk::RESPONSE_OK == dialog.run(); )
+    for( ; res = Gtk::RESPONSE_OK == dialog.run(), res; )
     {
         fname = dialog.get_filename();
-        if( fs::exists(fname) && 
-            (Gtk::RESPONSE_OK != MessageBox("A file named \"" + fs::path(fname).leaf() + 
-                                            "\" already exists. Do you want to replace it?",
-                                            Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL, 
-                                            "Replacing the file overwrite its contents.",
-                                            true)) )
+        if( CheckKeepOrigin(fname) )
             continue;
 
-        if( convert_to_utf8 )
-            fname = Project::ConvertPathToUtf8(fname);
         break;
     }
+
+    return res;
+}
+
+bool CheckKeepOrigin(const std::string& fname)
+{
+    bool res = false;
+    if( fs::exists(fname) && 
+        (Gtk::RESPONSE_OK != MessageBox(BF_("A file named \"%1%\" already exists. Do you want to replace it?")
+                                        % fs::path(fname).leaf() % bf::stop,
+                                        Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL, 
+                                        _("Replacing the file overwrite its contents."),
+                                        true)) )
+        res = true;
     return res;
 }
 
@@ -290,4 +340,75 @@
     }
 }
 
+static gboolean ActivateLink(GtkWidget* /*label*/, const gchar* uri, gpointer)
+{
+    gboolean ret = FALSE;
+    if( strncmp(uri, "http://", ARR_SIZE("http://")-1) == 0 )
+    {
+        void GoUrl(const gchar* url);
+        GoUrl(uri);
+
+        ret = TRUE;
+    }
+
+    return ret;
+}
+
+static void ActivateLinksFor2Label(GtkWidget* wdg, int& label_num)
+{
+    if( GTK_IS_LABEL(wdg) )
+    {
+        //io::cout << "Found Label!" << gtk_label_get_text(GTK_LABEL(wdg)) << io::endl;
+
+        label_num++;
+        if( label_num == 2 ) // 2-я по счету
+        {
+            // :KLUDGE: при открытии диалога, в вызове gtk_dialog_map() производится установка
+            // фокуса на первый виджет, за исключением меток. Все бы ничего, только "код избегания"
+            // меток фатален (бесконечный цикл), если метка содержит ссылки (с тегом ). Нашел 
+            // наиболее простое решение - убрать фокус со злополучной метки
+            //gtk_label_set_selectable(GTK_LABEL(wdg), FALSE);
+            //gtk_widget_set_can_focus(wdg, FALSE);
+            g_object_set(wdg, "can-focus", FALSE, NULL);
+
+            g_signal_connect(wdg, "activate-link", G_CALLBACK (ActivateLink), NULL);
+        }
+    }
+}
+
+void SetWeblinkCallback(Gtk::MessageDialog& mdlg)
+{
+    // устанавливаем действие при нажатии на ссылку во второй метке
+    // для этого его сначала нужно найти
+    // 
+    // :KLUDGE: идейно правильный вариант заключается в реализации нового MessageDialog
+    // на основе Gtk::Dialog; при этом придется копировать стандартный функционал MessageDialog
+    //
+    int label_num = 0;
+    ForAllWidgets(static_cast(mdlg).gobj(), bl::bind(&ActivateLinksFor2Label, bl::_1, boost::ref(label_num)));
+}
+
+Gtk::Alignment& NewPaddingAlg(int top, int btm, int lft, int rgt)
+{
+    Gtk::Alignment& alg = NewManaged();
+    alg.set_padding(top, btm, lft, rgt);
+    return alg;
+}
+
+void CompleteDialog(Gtk::Dialog& dlg, bool close_style)
+{
+    if( close_style )
+        dlg.add_button(Gtk::Stock::CLOSE, Gtk::RESPONSE_CLOSE);
+    else
+        AddCancelDoButtons(dlg, Gtk::Stock::OK);
+    dlg.get_vbox()->show_all();
+}
+
+Gtk::Label& NewMarkupLabel(const std::string& label, bool use_underline)
+{
+    Gtk::Label& lbl = NewManaged(label);
+    lbl.set_use_markup(true);
+    lbl.set_use_underline(use_underline);
+    return lbl;
+}
 
diff -Nru bombono-dvd-0.5.2/src/mgui/win_utils.h bombono-dvd-0.6.0/src/mgui/win_utils.h
--- bombono-dvd-0.5.2/src/mgui/win_utils.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mgui/win_utils.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mgui/win_utils.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -244,9 +244,6 @@
 // создание подсказок - из 
 Gtk::Tooltips& TooltipFactory();
 void SetTip(Gtk::Widget& wdg, const char* tooltip);
-// удобная функция упаковки виджета в рамку
-Gtk::Frame& PackWidgetInFrame(Gtk::Widget& wdg, Gtk::ShadowType st,
-                              const std::string& label = std::string());
 
 Gtk::Button* CreateButtonWithIcon(const char* label, const Gtk::BuiltinStockID& stock_id,
                                   const char* tooltip = "", Gtk::BuiltinIconSize icon_sz = Gtk::ICON_SIZE_BUTTON);
diff -Nru bombono-dvd-0.5.2/src/mlib/filesystem.h bombono-dvd-0.6.0/src/mlib/filesystem.h
--- bombono-dvd-0.5.2/src/mlib/filesystem.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mlib/filesystem.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mlib/filesystem.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2009 Ilya Murav'jov
+// Copyright (c) 2009-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -58,5 +58,9 @@
 
 std::string AppendPath(const std::string& dir, const std::string& path);
 
+// создать директорию (с родителями), если еще не сущ.
+bool CreateDirs(const fs::path& dir, std::string& err_str);
+bool CreateDirsQuiet(const fs::path& dir);
+
 #endif // __MBASE_FILESYSTEM_H__
 
diff -Nru bombono-dvd-0.5.2/src/mlib/geom2d.h bombono-dvd-0.6.0/src/mlib/geom2d.h
--- bombono-dvd-0.5.2/src/mlib/geom2d.h	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mlib/geom2d.h	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mlib/geom2d.h
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008 Ilya Murav'jov
+// Copyright (c) 2008, 2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -296,13 +296,11 @@
 }
 
 template
-PointT FindAForCenteredRect(const PointT& src_sz, const RectT& center_rct, bool is_horiz, bool is_vert)
+PointT FindAForCenteredRect(const PointT& src_sz, const RectT& center_rct)
 {
-    PointT a(center_rct.A());
-    if( is_horiz )
-        a.x = center_rct.lft + (center_rct.Width()  - src_sz.x) / 2;
-    if( is_vert )
-        a.y = center_rct.top + (center_rct.Height() - src_sz.y) / 2;
+    PointT a;
+    a.x = center_rct.lft + (center_rct.Width()  - src_sz.x) / 2;
+    a.y = center_rct.top + (center_rct.Height() - src_sz.y) / 2;
     return a;
 }
 
@@ -310,7 +308,13 @@
 RectT CenterRect(const RectT& src_rct, const RectT& center_rct, bool is_horiz, bool is_vert)
 {
     PointT sz(src_rct.Size());
-    return RectASz(FindAForCenteredRect(sz, center_rct, is_horiz, is_vert), sz);
+    PointT a = FindAForCenteredRect(sz, center_rct);
+    if( !is_horiz )
+        a.x = src_rct.lft;
+    if( !is_vert )
+        a.y = src_rct.top;
+
+    return RectASz(a, sz);
 }
 
 
diff -Nru bombono-dvd-0.5.2/src/mlib/gettext.h bombono-dvd-0.6.0/src/mlib/gettext.h
--- bombono-dvd-0.5.2/src/mlib/gettext.h	1970-01-01 01:00:00.000000000 +0100
+++ bombono-dvd-0.6.0/src/mlib/gettext.h	2010-04-16 12:53:55.000000000 +0100
@@ -0,0 +1,71 @@
+//
+// mlib/gettext.h
+// This file is part of Bombono DVD project.
+//
+// Copyright (c) 2010 Ilya Murav'jov
+//
+// This program 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.
+//
+// This program 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 this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+
+#ifndef __MLIB_GETTEXT_H__
+#define __MLIB_GETTEXT_H__
+
+#include 
+
+#include 
+
+// макрос наподобие N_(), только для xgettext
+#define F_(String)
+
+// укороченный вариант для i18n + Boost.Format
+inline boost::format BF_(const char* str)
+{
+    return boost::format(gettext(str));
+}
+inline boost::format BF_(const std::string& str)
+{
+    return boost::format(gettext(str.c_str()));
+}
+
+//
+// Приведение boost::format к std::string наиболее удобным способом:
+//    MessageBox(BF_("some ... template with %N%") % arg1 % arg2 % ... % bf::stop, Gtk::BUTTONS_OK);
+// 
+// boost::str() требует лишних скобок, за которыми неудобно следить
+namespace bf { enum stop_enum { stop }; }
+
+inline std::string operator % (boost::format& f, bf::stop_enum /*stop*/)
+{
+    return f.str();
+}
+
+inline std::string _dots_(const char* str)
+{
+    return gettext(str) + std::string("...");
+}
+
+inline std::string _semicolon_(const char* str)
+{
+    return gettext(str) + std::string(":");
+}
+
+// вариант _() с добавлением точек в конце для пунктов меню
+#define DOTS_(str) _dots_(str).c_str()
+#define SMCLN_(str) _semicolon_(str).c_str()
+
+
+#endif // #ifndef __MLIB_GETTEXT_H__
+
+
diff -Nru bombono-dvd-0.5.2/src/mlib/tests/test_utils.cpp bombono-dvd-0.6.0/src/mlib/tests/test_utils.cpp
--- bombono-dvd-0.5.2/src/mlib/tests/test_utils.cpp	2009-07-26 18:31:16.000000000 +0100
+++ bombono-dvd-0.6.0/src/mlib/tests/test_utils.cpp	2010-04-16 12:53:55.000000000 +0100
@@ -2,7 +2,7 @@
 // mlib/tests/test_utils.cpp
 // This file is part of Bombono DVD project.
 //
-// Copyright (c) 2008-2009 Ilya Murav'jov
+// Copyright (c) 2008-2010 Ilya Murav'jov
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -151,6 +151,9 @@
         pth = "/ttt";
         BOOST_CHECK( Project::MakeRelativeToDir(pth, dir) && (pth == fs::path("../../ttt")) );
     }
+
+    // 
+    BOOST_CHECK( !fs::exists("/root/.config") );
 }
 
 BOOST_AUTO_TEST_CASE( TestStringstream )
diff -Nru bombono-dvd-0.5.2/tools/scripts/atom-env bombono-dvd-0.6.0/tools/scripts/atom-env
--- bombono-dvd-0.5.2/tools/scripts/atom-env	2009-07-27 22:26:20.000000000 +0100
+++ bombono-dvd-0.6.0/tools/scripts/atom-env	2010-04-16 12:53:55.000000000 +0100
@@ -8,19 +8,20 @@
 # Цель - чтобы все было настроено одинаково (и командной строке, и в IDE.)
 #
 
-# Gnome 2.18.1 
-PKG_CONFIG_PATH=/opt/Gnome2181/lib/pkgconfig:$PKG_CONFIG_PATH
+# Gnome
+GNOME_PREFIX=/opt/Gnome230tar
+export PKG_CONFIG_PATH=$GNOME_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH
 
-export PKG_CONFIG_PATH=$ATOM_PATH/Debug/lib/pkgconfig:$PKG_CONFIG_PATH
-export PATH=$ATOM_PATH/Debug/bin:$PATH
 export LANG=C
 
 # Gtk runtime
-export GTK_PATH=/opt/Gnome2181/lib/gtk-2.0 
+export GTK_PATH=$GNOME_PREFIX/lib/gtk-2.0 
+#export GTK2_RC_FILES=$ATOM_PATH/gtkrc
 export GTK2_RC_FILES=$ATOM_PATH/gtkrc
 
 # SCons
-SCONS_PATH=/home/ilya/opt/programming/atom-project/Temp/scons-1.2.0
-export PYTHONPATH=$SCONS_PATH/engine:$PYTHONPATH
-export PATH=$SCONS_PATH/script:$PATH
+SCONS_PATH=/home/ilya/opt/programming/atom-project/Temp/scons-0.97
+#export PYTHONPATH=$SCONS_PATH/engine:$PYTHONPATH
+#export SCONS_LIB_DIR=$SCONS_PATH/engine
+#export PATH=$SCONS_PATH/script:$PATH
 
Binary files /tmp/pq9PsVFcno/bombono-dvd-0.5.2/tools/scripts/AuxTools.pyc and /tmp/1HeDGEIqNv/bombono-dvd-0.6.0/tools/scripts/AuxTools.pyc differ
diff -Nru bombono-dvd-0.5.2/tools/scripts/bombono-dvd.spec bombono-dvd-0.6.0/tools/scripts/bombono-dvd.spec
--- bombono-dvd-0.5.2/tools/scripts/bombono-dvd.spec	2009-09-27 12:45:52.000000000 +0100
+++ bombono-dvd-0.6.0/tools/scripts/bombono-dvd.spec	2010-04-16 12:53:55.000000000 +0100
@@ -7,7 +7,7 @@
 # So, maybe adjustments required for other RPM-based distros. 
 
 Name:		bombono-dvd
-Version:	0.5.2
+Version:	0.6.0
 Summary:	DVD authoring program with nice and clean GUI
 License:	GPL
 Release:	0
@@ -28,11 +28,11 @@
 %description
  Bombono DVD is easy to use program for making DVD-Video.
  The main features of Bombono DVD are:
-  * excellent MPEG viewer: Timeline and Monitor
-  * real WYSIWYG Menu Editor with live thumbnails
-  * comfortable Drag-N-Drop support
-  * you can author to folder, make ISO-image or burn directly to DVD
-  * reauthoring: you can import video from DVD discs.
+  * Excellent MPEG viewer: Timeline and Monitor
+  * Real WYSIWYG Menu Editor with live thumbnails
+  * Comfortable Drag-N-Drop support
+  * You can author to folder, make ISO-image or burn directly to DVD
+  * Reauthoring: you can import video from DVD discs.
 
 %prep
 %setup -q	
diff -Nru bombono-dvd-0.5.2/tools/scripts/BuildVars.py bombono-dvd-0.6.0/tools/scripts/BuildVars.py
--- bombono-dvd-0.5.2/tools/scripts/BuildVars.py	2009-09-27 12:46:03.000000000 +0100
+++ bombono-dvd-0.6.0/tools/scripts/BuildVars.py	2010-04-16 12:53:55.000000000 +0100
@@ -121,14 +121,13 @@
     main_env.Export('UnitTest')
 
     # set brief output
-    SetBriefOutput()
+    SetBriefOutput(main_env)
 
     # to separate our output from SCons'
     print
 
 # Non/Verbose output
-def SetBriefOutput():
-    env = GetDefEnv()
+def SetBriefOutput(env):
     if BuildBrief :
         def GetBaseNameFromTarget(target):
             target_path = str(target[0]) # target[0] is not string somehow
@@ -141,9 +140,13 @@
             #target_path = str(target[0]) # target[0] is not string somehow
             return '\nLinking %s ...\n' % (GetBaseNameFromTarget(target))
 
-        def InstallString(dest, source, env, **kw):
+        def _InstallString(dest, source, env, **kw):
             # :TODO: do for faked PCH only
             return ' '
+        InstallString = _InstallString
+        # for >= 0.98.1 strings can be set up only
+        if IsSConsVersionGE((0, 98, 1)):
+            InstallString = ' '
 
         def GCHString(target, source, env, **kw):
             return 'Making precompiled header %s ...' % (target[0])
Binary files /tmp/pq9PsVFcno/bombono-dvd-0.5.2/tools/scripts/BuildVars.pyc and /tmp/1HeDGEIqNv/bombono-dvd-0.6.0/tools/scripts/BuildVars.pyc differ
diff -Nru bombono-dvd-0.5.2/tools/scripts/copy_boost.sh bombono-dvd-0.6.0/tools/scripts/copy_boost.sh
--- bombono-dvd-0.5.2/tools/scripts/copy_boost.sh	2009-04-18 20:27:59.000000000 +0100
+++ bombono-dvd-0.6.0/tools/scripts/copy_boost.sh	2010-04-16 12:53:55.000000000 +0100
@@ -24,7 +24,7 @@
     BCP=bcp
 fi
 
-$BCP --boost=$BOOST_SRC boost/smart_ptr.hpp boost/test boost/function.hpp boost/lambda boost/filesystem boost/regex $BOOST_DST
+$BCP --boost=$BOOST_SRC boost/smart_ptr.hpp boost/test boost/function.hpp boost/lambda boost/filesystem boost/regex format $BOOST_DST
 
 ###############################
 # Чистим все неиспользуемое
diff -Nru bombono-dvd-0.5.2/tools/scripts/gch.py bombono-dvd-0.6.0/tools/scripts/gch.py
--- bombono-dvd-0.5.2/tools/scripts/gch.py	2007-06-23 11:45:03.000000000 +0100
+++ bombono-dvd-0.6.0/tools/scripts/gch.py	2010-04-16 12:53:55.000000000 +0100
@@ -46,10 +46,18 @@
 if BuildVars.IsSConsGE_0_96_92(def_env):
     GchAction = SCons.Action.Action('$GCHCOM', '$GCHCOMSTR')
     GchShAction = SCons.Action.Action('$GCHSHCOM', '$GCHSHCOMSTR')
+    
+    # compose gch string from standard one, adding -x c++-header after '-o ' option
+    import re
+    pat = re.compile(re.escape("$TARGET "))
+    def MakeGchString(cmd_str):
+        res = re.subn(pat, "$TARGET -x c++-header ", cmd_str)
+        assert res[1] == 1
+        return res[0]
 
     GetCScannerFunc = lambda : SCons.Scanner.C.CScanner()
-    GCHCOMString    = '$CXX -o $TARGET -x c++-header -c $CXXFLAGS $_CCCOMCOM $SOURCE'
-    GCHSHCOMString  = '$CXX -o $TARGET -x c++-header -c $SHCXXFLAGS $_CCCOMCOM $SOURCE'
+    GCHCOMString    = MakeGchString(def_env['CXXCOM'])   # '$CXX -o $TARGET -x c++-header -c $CXXFLAGS $_CCCOMCOM $SOURCE'
+    GCHSHCOMString  = MakeGchString(def_env['SHCXXCOM']) # '$CXX -o $TARGET -x c++-header -c $SHCXXFLAGS $_CCCOMCOM $SOURCE'
 else:
     # < 0.96.92
     GchAction = SCons.Action.Action('$GCHCOM')
Binary files /tmp/pq9PsVFcno/bombono-dvd-0.5.2/tools/scripts/gch.pyc and /tmp/1HeDGEIqNv/bombono-dvd-0.6.0/tools/scripts/gch.pyc differ
Binary files /tmp/pq9PsVFcno/bombono-dvd-0.5.2/tools/scripts/SConsTwin.pyc and /tmp/1HeDGEIqNv/bombono-dvd-0.6.0/tools/scripts/SConsTwin.pyc differ
diff -Nru bombono-dvd-0.5.2/tools/scripts/update_ru_po.sh bombono-dvd-0.6.0/tools/scripts/update_ru_po.sh
--- bombono-dvd-0.5.2/tools/scripts/update_ru_po.sh	1970-01-01 01:00:00.000000000 +0100
+++ bombono-dvd-0.6.0/tools/scripts/update_ru_po.sh	2010-04-16 12:53:55.000000000 +0100
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+scons build/po/ru.po && mv po/ru.po po/ru.po_ && cp build/po/ru.po po/ru.po && env LANG=ru_RU.UTF-8 poedit po/ru.po && scons msgupdate
diff -Nru bombono-dvd-0.5.2/tools/test-data/medias.xml bombono-dvd-0.6.0/tools/test-data/medias.xml
--- bombono-dvd-0.5.2/tools/test-data/medias.xml	2008-08-26 10:42:08.000000000 +0100
+++ bombono-dvd-0.6.0/tools/test-data/medias.xml	2010-04-16 12:53:55.000000000 +0100
@@ -3,9 +3,12 @@
 
   
     
-      10
-      20
-      30
+      
+        10
+        20
+        30
+      
+      
     
     
      
diff -Nru bombono-dvd-0.5.2/tools/test-data/menus.xml bombono-dvd-0.6.0/tools/test-data/menus.xml
--- bombono-dvd-0.5.2/tools/test-data/menus.xml	2009-07-26 18:59:04.000000000 +0100
+++ bombono-dvd-0.6.0/tools/test-data/menus.xml	2010-04-16 12:53:55.000000000 +0100
@@ -8,12 +8,18 @@
   
   
     
-      9.7999999999999989
-      20
-      30
+      
+        9.7999999999999989
+        20
+        30
+      
+      
     
     
-      6
+      
+        6
+      
+      
     
     
   
@@ -23,16 +29,16 @@
         
       
       
-        
+        
           
         
-        
+        
           
         
         
           
         
-        
+        
           
         
       
@@ -42,7 +48,7 @@
         
       
       
-        
+        
           
         
       
@@ -52,13 +58,13 @@
         
       
       
-        
+        
           
         
         
           
         
-        
+