From 2a7a82094d50b75380b9858eae5eb41ed169378d Mon Sep 17 00:00:00 2001 From: Martin Szulecki Date: Thu, 19 Mar 2009 22:52:58 +0100 Subject: Initial import of gfax 0.7.7 --- AUTHORS | 2 + COPYING | 340 +++ ChangeLog | 319 +++ FAQ | 31 + INSTALL | 182 ++ Makefile.am | 26 + NEWS | 353 +++ README | 57 + TODO | 54 + autogen.sh | 22 + configure.in | 82 + cvs-notes | 59 + data/Makefile.am | 54 + data/cups-gfax | 32 + data/gfax.desktop.in | 10 + data/gfax.schemas.in | 286 ++ data/gfax.spec | 95 + data/icons/16x16/Makefile.am | 8 + data/icons/16x16/gfax.png | Bin 0 -> 29726 bytes data/icons/48x48/Makefile.am | 9 + data/icons/48x48/gfax.png | Bin 0 -> 2547 bytes data/icons/Makefile.am | 16 + data/icons/scalable/Makefile.am | 8 + data/icons/scalable/gfax.svg | 1248 +++++++++ gfax.in | 37 + glade/gfax.glade | 5532 +++++++++++++++++++++++++++++++++++++++ glade/send-druid.glade | 1241 +++++++++ intltool-extract.in | 875 +++++++ intltool-merge.in | 1506 +++++++++++ intltool-update.in | 1166 +++++++++ po/POTFILES.in | 20 + po/de.po | 1244 +++++++++ po/en_CA.po | 1606 ++++++++++++ po/it.po | 1598 +++++++++++ po/lv.po | 1569 +++++++++++ po/nl.po | 1686 ++++++++++++ src/Defines.cs.in | 12 + src/Makefile.am | 69 + src/efax.cs | 605 +++++ src/evolution.cs | 134 + src/fax.cs | 501 ++++ src/gfaxphonebook.cs | 498 ++++ src/gfaxprefs.cs | 302 +++ src/gfaxsend.cs | 364 +++ src/gui.cs | 1137 ++++++++ src/guitools.cs | 540 ++++ src/hylafax.cs | 950 +++++++ src/main.cs | 243 ++ src/newphonebook.cs | 187 ++ src/phonebook.cs | 386 +++ src/sendphonebook.cs | 242 ++ 51 files changed, 27543 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 FAQ create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 NEWS create mode 100644 README create mode 100644 TODO create mode 100755 autogen.sh create mode 100644 configure.in create mode 100644 cvs-notes create mode 100644 data/Makefile.am create mode 100755 data/cups-gfax create mode 100644 data/gfax.desktop.in create mode 100644 data/gfax.schemas.in create mode 100644 data/gfax.spec create mode 100644 data/icons/16x16/Makefile.am create mode 100644 data/icons/16x16/gfax.png create mode 100644 data/icons/48x48/Makefile.am create mode 100644 data/icons/48x48/gfax.png create mode 100644 data/icons/Makefile.am create mode 100644 data/icons/scalable/Makefile.am create mode 100644 data/icons/scalable/gfax.svg create mode 100755 gfax.in create mode 100644 glade/gfax.glade create mode 100644 glade/send-druid.glade create mode 100644 intltool-extract.in create mode 100644 intltool-merge.in create mode 100644 intltool-update.in create mode 100644 po/POTFILES.in create mode 100644 po/de.po create mode 100644 po/en_CA.po create mode 100644 po/it.po create mode 100644 po/lv.po create mode 100644 po/nl.po create mode 100755 src/Defines.cs.in create mode 100755 src/Makefile.am create mode 100755 src/efax.cs create mode 100755 src/evolution.cs create mode 100755 src/fax.cs create mode 100755 src/gfaxphonebook.cs create mode 100755 src/gfaxprefs.cs create mode 100644 src/gfaxsend.cs create mode 100755 src/gui.cs create mode 100755 src/guitools.cs create mode 100755 src/hylafax.cs create mode 100644 src/main.cs create mode 100755 src/newphonebook.cs create mode 100755 src/phonebook.cs create mode 100755 src/sendphonebook.cs diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..c985385 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ +George Farris - Main author +Johannes Rohr - German translation diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 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. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, 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 software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, 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 redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +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 give any other recipients of the Program a copy of this License +along with the Program. + +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 Program or any portion +of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +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 Program, 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 Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) 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; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, 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 executable. 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. + +If distribution of executable or 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 counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program 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. + + 5. 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 Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program 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. + + 7. 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 Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program 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 Program. + +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. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program 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. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 Program +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 Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, 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 + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), 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 Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. 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 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..5e1ff49 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,319 @@ +0.7.7 release +------------- +2008-05-23 George Farris + *remove gfaxlpr script + *add cups backend cups-gfax script + *remove FAQ item about OpenOffice printer, Gfax should now work + with all cups enable software. + +2008-05-09 George Farris + *remove gnomeprint dependency + *added fax tracing menu item to debug trasmit agent problems + *added notification icon and system to work with cups printer + *updated everything to GPLv3 + +2007-11-06 Martin Szulecki + *fix toolbar to respect user's style + *use icon's from icon naming spec + *Remove G_About and use Gtk.AboutDialog + *enable column sorting in every treeview + *use DateTime.ParseExact for date string parsing + *add new column showing an icon related to the job status + *evolution import uses all fax contact fields now, not just BusinessFax + *fix alignment of column data + *improve liststore data logic + *display a human readable localized date in related columns + *fix job modification failing due to invalid transmitted job id + *fix autofoo for lib64 builds + *fix schema install killing gconfd + *update language files to changes + *trim all values when parsing queues + *hide some debug output into macros + *make G_ListView more generic and add column helpers for DateTime and Icons + *increase size of sender in job format to prevent cutting long sender names + *add prototype of new gfax tango icon + +0.7.6 release +------------- +2006-12-02 George Farris + *updated de.po translations + *added lv.po translations + *added it.po translations + +2006-11-29 George Farris + *added efax send status to the main window status view + *made the main window progressbar pulse when sending fax via efax + +2006-11-27 George Farris + *fix add button not enabled if adding just numbers to the phonebook + +2006-11-25 George Farris + *fix sending of busy faxes with efax, would only try once + +2006-11-17 George Farris + *added double click to view a received fax + *don't try to open a non existing phonebook file + *can now select all received faxes and delete them + *added double click to job modify in send tab + *fix callback event args for various gtk widgets + +2006-11-16 George Farris + *remove gfax.proc file use, interact with gui directly + *pulse progress bar when sending fax via efax + *update appbar line when sending fax via efax + +2006-11-14 George Farris + *change default queue auto refresh to 30 seconds. + *added check for permission to read fax from server, otherwise would hang + *fix bug with efax sending +2006-11-14 Jean Louis argente + *fix bug with ghostscript conversion + +2006-11-10 George Farris + *updated major network traffic to async operations + *when switching tabs make sure server status is updated in addition to queue + *make main progressbar show that there is network action + *fixed send time bug, was sending in the past + +2006-10-30 George Farris + *updated debian control file with proper dependancies + +2006-10-29 George Farris + *remove depreciated Gnome.About and start using Gtk.AboutDialog + *remove depreciated OptionMenu and use ComboBox + +2006-10-27 George Farris + *removed all Mgetty support - never really was there anyway:-) + +2006-10-27 Bart Verstraete + *added Dutch translation + + +0.7.5 release +------------- +2006-10-25 George Farris + *added progressbar to main window for receiving faxes to view/print + +2006-10-23 George Farris + *added ability to download a fax from a hylafax server and view it + *fix - modify job was not changing phone number + *added delete button for received faxes + +2006-10-16 George Farris + *added "fax_viewer" schema item for viewing received faxes + *added fax viewer preference + *job cancel button should not be sensitive if no jobs selected on startup + +2006-08-31 George Farris + *changed all Mono.Posix modules to Mono.Unix + *added check for libgnomeprint dev package in configure.in + + +0.7.4 release (Never really happend, is actually 0.7.5) +------------- +2005-12-22 George Farris + *added ability to modify a Hylafax job. + +2005-12-19 George Farris + *moved /var/spool/gfax to ~/.local/share/gfax/spool + +2005-12-16 George Farris + *added Evolution address book support (read only) + *fix crasher bug if entering text in "Current Phone Book" entry + +2005-12-09 George Farris + *fix return of no contacts, should have been 0 not null + *rename Contact class to GfaxContact so it doesn't conflict with Evolution + +2005-12-09 George Farris + *ported to new gtk-sharp-2.x api. + *changed gtk.combo widget to gtk.combobox, gtk.combo is depreciated + *updated to new file dialog in Gtk-2.x + *added shortcut for "New Fax" + *added error dialog if fax number is empty when "Send" is hit. + *removed preferences button, added Edit menu with preferences. + +2005-12-02 George Farris + *change gfax.proc file location to ~/.local/share/gfax/gfax.proc . + *deleted many unused variables + *automatically migrate phone books from ~/.etc/gfax to ~/.config/gfax. + +0.7.3 release +------------- +2005-02-28 George Farris + *Updated German translations. + *Removed listview tooltip, no longer required. + +0.7.2 release +------------- +2005-02-17 George Farris + *fix /tmp/gfax.proc file name creation race. + *fix Hylafax receive queue display. + *update make deb script + *add German translation. + +0.7.1 release +------------- +2005-02-17 George Farris + *fix menu bug. + +0.7.0 release +------------- +2005-02-15 George Farris + * Major point release please see the News file. + +0.6.3 release +------------- +2004-06-29 George Farris + *fix phone book typo. + +0.6.2 release +------------- +2004-06-29 George Farris + *fix phone number and org were swapped when sending a fax. + +0.6.1 release +------------- +2004-06-25 George Farris + *port to mono-beta3 + +0.6.0 Point release +------------------- +2004-03-13 George Farris + *added user/password authentication in Hylafax. + *added check for existance of the SPOOLDIR directory + *make phone number have focus in send fax druid. + *run the main app after sending a fax with the wizard. + +2004-03-12 George Farris + *added delayed faxing sending capability + *set default icons for menu items. + *changed gfax.glade and send-druid.glade to support delayed faxing. + *added gconf key for storing hylafax password. + +2004-03-10 George Farris + *added "Send At" column to queue display. + +2004-03-06 George Farris + *Code cancel fax function in progressbar. + +2004-03-06 George Farris + *ported code to gtk#-0.17, minor changes in treeview code. + +Beta 9 release +-------------- +2004-03-01 George Farris + *display number of send jobs in window title. + *added toggle to send fax window. you can now deselect numbers. + *addded queue selection to "Jobs" menu. + *when deleting jobs from a the Done queue it is refeshed properly. + +2004-02-29 George Farris + *added refresh queue status message to appbar if auto refresh. + *start auto refresh on program startup if enabled. + +2004-02-21 George Farris + *change socket read code so all data will be read in hylafax.cs + *added number of jobs in the queue to the status bar. + +Beta 8 release +-------------- +2004-02-18 George Farris + *fix bug: send fax wizard didn't work with number from entry box. + *don't send the file to the fax server if no destinations set. + +2004-02-15 George Farris + *fix bug: add GConf.PropertyEditors.EditorShell shell in send class. + + +Beta 7 release +-------------- +2004-02-11 George Farris + *fix bug: send wizard fix - bad port:-) + +Beta 6 release +-------------- +2004-02-11 George Farris + *remove glade errors when starting. + *changes to compile with gtk-sharp-0.15 and Mono-0.30. + *swap "Add" and "Clear" buttons for adding phone items. + *added stock icons to "Add" and "Clear" buttons. + +2004-01-13 George Farris + *clear phone book list items at appropriate times. + *added class for new phone book wizard. + *changes to main code to support new phone book wizard. + *Fix bug: deleting phone book correctly deletes the file. + +2004-01-06 George Farris + *new dialog in gfax.glade file for new phone book + +Beta 5 release +-------------- +2003-12-29 George Farris + *created spec file for rpms. + *fixed schema installation, works for all users now. + *adding new phone book didn't work quite right, fixed. + *deleteing item in phonebook didn't allow saving after, fixed. + *now compiles with mono >= 0.28 and gtk-sharp-0.14. + +Beta 4 release +-------------- +2003-06-14 George Farris + *send druid now displays numbers to send instead of "MULTIPLE NUMBERS." + *added toggle to send fax druid. you can now deselect numbers. + *resolution setting is now functional in Hylafax. + *email notification is now functional in Hylafax. + +2003-06-03 George Farris + *changed spool directory to /var/spool/gfax + *set "Rules Hint" in glade file so lists follow theme. + *Fix bug: don't delete file when sending file from Gfax. + *Fix bug: don't delete file if not in /var/spool/gfax. + +2003-06-02 George Farris + *Fix bug: Delete Job button active when no job. + *Fix bug: Delete item button active when no items selected. + +2003-05-27 George Farris + *sendphonebook.cs changes to support the send page in gfax + *added phonebook support to "New Fax" window. + *Fix bug: removed modal from About dialog. + *Fix bug: when adding numbers from phonebook in gfaxsend it doesn't display + a single number if the company is not set. + *Clear "New Fax" page proper if switching to main and back. + +Beta 3 release +-------------- +2003-05-21 George Farris + *Make sure Delete and Edit buttons sensitive only when proper in phb page. + *Sendfax page now functional. + *Update Makefile to install schema on "make install". + *Make sure DeleteJob button is senitive at right time. + *Created gfaxlpr command for apps that fail with gfax like OpenOffice. + +2003-05-20 George Farris + *Fix bug: create phonebook directory if it doesn't exist. + *Fix bug: create "phonebooks" file if it doesn't exist. + *Add default directory for new phonebook (~/.etc/gfax). + +2003-05-17 George Farris + *Changed default queue to send queue. + *Added ability to delete Hylafax jobs. + *Made "Delete Job" button sensitive only when showing send queue. + +Beta 2 release +-------------- +2003-05-15 George Farris + *Updated Gfax to compile with mono-0.24 and gtk-sharp-0.9 + *Added functionality to the "Settings" menu. + *Added queue_refresh function to refresh the main and queue status on + regular intervals + *Added "refresh_queue_enabled" and "refresh_queue_interval" GConf items + +2003-04-19 George Farris + *Changed gfax directory from $HOME/.gfax to $HOME/.etc/gfax + its a fad,lets all do it:-) put your stuff in .etc + +Beta 1 release +-------------- diff --git a/FAQ b/FAQ new file mode 100644 index 0000000..0b3f46f --- /dev/null +++ b/FAQ @@ -0,0 +1,31 @@ +Gfax Frequently asked questions. + + 1). I get the following error after I install gfax: + Unhandled Exception: GConf.NoSuchKeyException: Key + '/apps/gfax/general/run_setup_at_start' not found in GConf + 2). How do I add Hylafax users and passwords on the fax server? + 3). How do I send an entire phone book? + 4). How do I send faxes from OpenOffice programs? + 5). How do I get cover pages working? + + 1). (Q) I get the following error after I install gfax: + Unhandled Exception: GConf.NoSuchKeyException: Key + (A) Loging out and login back in should fix this. The GConfd + process is not picking up the new keys. + + 2) (Q) How do I add Hylafax users and passwords on the fax server? + (A) Login to your server as "root" and addusers with the following + command: + faxadduser -a -p username + The -a and -p otions are passwords that you choose, -a must be given + for administrative rights to your jobs. Admin rights allow you to + remove jobs from the server. + + 3) (Q) How do I send an entire phone book? + (A) When sending the facsimile choose the phonebook name and click "OK" + this will select every number in the selected phonebook. You may + de-select individual entries by un-checking them. + + 4) (Q) How do I get cover pages working? + (A) Coverpage support is not yet included. Most people just add the + cover page from their word processor. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..b42a17a --- /dev/null +++ b/INSTALL @@ -0,0 +1,182 @@ +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..af56e85 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,26 @@ +SUBDIRS = data src po + +bin_SCRIPTS = gfax +bindir=$(prefix)/bin + +gfax: gfax.in config.log + sed -e "s|\@prefix\@|$(prefix)|" \ + -e "s|\@eprefix\@|$(eprefix)|" < gfax.in > gfax + +INTLTOOL = \ + intltool-extract.in \ + intltool-merge.in \ + intltool-update.in + +EXTRA_DIST = \ + gfax.in \ + $(INTLTOOL) + +CLEANFILES = \ + gfax.exe \ + gfax + +DISTCLEANFILES = \ + intltool-extract \ + intltool-merge \ + intltool-update diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..d7894d8 --- /dev/null +++ b/NEWS @@ -0,0 +1,353 @@ +Whats new in gfax-0.7.7 +============================================ +Gfax should now work with all software that can print to a CUPS printer. + +Noteable change is that Gfax MUST be running BEFORE you try to use the +fax system. It will minimise to the system tray. + + +Whats new in gfax-0.7.6 +============================================ +The "Wow it actually works" release. + +Yes folks, if you check the Changelog you will find a significant amount +of work has been done to polish this release. Many thanks to the crew +on the mailing list who have been very helpful in testing and providing +feedback. + +I would like to acknowledge and thank the following individuals for their +patience, testing and feedback. + Jean Louis Argente + Sasa Ostrouska + Bart Verstraete + Aaron Peromsik + +Much work has been put into polishing Hylafax and Efax support. +The following is a list of new or changed items. If you have tried Gfax in +the past and have been disappointed we recommend you checkout the 0.7.6 version. +We think you will be pleased. There is still work to be done but we +have a great group of people providing feedback, which really helps. + + +EFAX CHANGES: +============= + -When sending a fax with Efax, the main status window will display the + progress and the progressbar will pulse while the fax is being transmitted. + -The appbar will display the "Sending fax..." state. + -There is no longer a gfax.proc file, the GUI is updated directly from the + efaxd thread. + -The queue scanning is now 30 seconds instead of 60 seconds for dealing with + faxes sent via Efax. + +HYLAFAX CHANGES: +================ + -Much of the network traffic is now asynchronous, which means Gfax will + not hang when getting status, switching tabs etc. More to follow in the + next version. + -Main progressbar now pulses when there is network traffic. + -Server status is now updated whenever the queue status is updated. + -Can now double click on a received facsimile to to view it. + -Can now select multiple or all received faxes and delete them. + -Double clicking on job to send will now popup job modify dialog in send tab. + -Gfax will check for permission to read fax from the fax server and popup a + notification if the user does not have permission to view the fax. + +OTHER CHANGES: +============== + -Debian control file has been updated with proper dependancies. + -Removed depreciated Gnome.About and replaced with Gtk.AboutDialog. + -Removed depreciated OptionMenu and replaced ComboBox. + -Removed all Mgetty support - never really was there anyway:-) + + -Added Latvian (lt.po) translation + -Added Dutch (nl.po) translation + -Updated German (de.po) translation + -Updated Italian (it.po) translation + + +BUGS FIXED: +=========== + -Fix: "Add" button was not enabled if adding just numbers to the phonebook. + -Fix: When sending a fax via Efax, if the fax result was "Busy" Gfax would + not retry. Gfax will now try the set number of times (EfaxRetry). + -Fix: "Don't try to open a non existing phonebook file. + -Fix: Various callback event args have been changed for newer versions of + Gtk-Sharp, these have been updated. + -Fix: "Efax sending was broken in 0.7.5, now works. + -Fix: Ghostscript conversion of files for Efax was failing. + -Fix: Gfax was setting the time in the past due to a timezone bug, + consequently Hylafax jobs never ran and couldn't be modified. + + + +Whats new in gfax-0.7.5 +============================================ +Hylafax received facsimiles can now be viewed/printed or deleted. +Evolution addressbooks are now supported. See Note 1 in the README. +Hylafax jobs can be modified after sending. +Newer GTK file dialog supported. +Some other small UI changes. +Gfax Phone books and spool directory is moved to ~/.config and ~/.local. +Gfax Phonebooks will be moved automatically. +Many bugs fixed. + + +Whats new in gfax-0.7.4 +============================================ +There never really was a 0.7.4 release, I was just messing with your mind. + +Whats new in gfax-0.7.3 +============================================ +Updated German translation. +Deleted status tooltips that are not used anymore due +to clear text status words. + +Whats new in gfax-0.7.2 +============================================ +fix /tmp/gfax.proc file name creation race. +fix Hylafax receive queue display. +update make deb script +add German translation. + + +Whats new in gfax-0.7.1 +============================================ +Bad release forget about it:-) + + +Whats new in gfax-0.7.0 +============================================ +Major UI change and improvements, lots of HIG changes. +Much better phonebook support for creating phonebooks. +Efax support has been added. +Build tools changed to use automake/autoconf. +Full gettext support for multiple languages. +Many bugs fixed. + + + + +Whats new in gfax-0.6.4 +============================================ +Bug fix release. Toggle in list of items to send was not active. + +Whats new in gfax-0.6.3 +============================================ +Bug fix release. Stupid typo on my part stopped phonebook working +properly. + +Whats new in gfax-0.6.2 +============================================ +Bug fix release. When sending a fax and selecting a number from the +phone book, the number and organization entry were swapped. + +Whats new in gfax-0.6.1 +============================================ +Changes have been made to allow Gfax to compile against mono-beta3 (0.96) +and Gtk#-0.98 or higher, will probably not work with any earlier versions. +This is in preparation for the up coming Mono 1.0 release. + + +Whats new in gfax-0.6.0, Major point release +============================================ +Changes have been made to allow Gfax to compile against Gtk#-0.17, +and will probably not work with any earlier versions. + +Full username and password authentication is now working in Hylafax. +Authentication can now be either by allowing the machine host name or +IP address or system administrators can add Hylafax users and passwords +for their fax server (see FAQ). + +Gfax now runs the main application after sending a fax with the send +wizard, enabling immediate status of the fax job to be viewed. + +Gfax now fully supports delayed sending of facsimiles with from the +send wizard and the main application. Facsimiles can be delayed up to +30 days in the future. + +Status queue displays have been updated to display the "Send At" time +for all jobs. + +While transferring jobs to the hylafax server the user can press the +"Cancel" button, deleting the job/file on the fax server and returning +to the main display. + +Gfax-0.6 is now in updated on the GNOME CVS repository. + + +Whats new in gfax-0.6beta9: +=========================== +Network status queue data reception is much better and should work +without problem now. Previously Gfax would crash or the entire queue +would not be displayed if there were many jobs. + +Gfax will now display the number of jobs left in the Send queue in +the window title bar so one can track send status when Gfax is +minimized. + +The total number of jobs displayed in the status line at the bottom +of the window. This status line will also show when Gfax is +auto-refreshing the queue. + +Queue selection has been added to the "Job" menu. + +When sending a fax from the "New Fax" button, fax destinations can be +deselected. You can now select an entire phone book and then deselect +a few numbers. + +Bug fixes: +---------- + *start auto refresh on program startup if enabled. + *change socket read code so all data will be read in hylafax.cs + *when deleting jobs from the Done queue it is refreshed properly. + + + + +Whats new in gfax-0.6beta8: +=========================== +Well it turns out that the beta7 didn't quite do the job. The +Send Wizrad worked with a phone book item but not entering a +number in the entry box, this is now fixed. Also the fax wizard +would send the fax to the server even if there weren't any valid +destinations, this is also fixed. + + +Whats new in gfax-0.6beta7: +=========================== +This is just a quick bug fix as beta6 send wizard was bad. + + +Whats new in gfax-0.6beta6: +=========================== +Ported to mono >= 0.30 and gtk-sharp-0.15. +It should work on the likes of Fedora Core 1 and Redhat 9 to name a few. + +If you run Fedora try our yum repository for installation, see +http://gfax.cowlug.org for more information. + +The biggest news is a new wizard to add phone books. The old way of +adding phone books was prone to error and not intuitive at all. + + +Bug fixes: +---------- + *remove glade errors when starting. + *clear phone book list items at appropriate times. + *deleting phone book correctly deletes the file. + +Changes: +--------- + *compile with gtk-sharp-0.15 and Mono-0.30. + *swap "Add" and "Clear" buttons for adding phone items. + *added stock icons to "Add" and "Clear" buttons. + *added class for new phone book wizard. + *changes to main code to support new phone book wizard. + *new dialog in gfax.glade file for new phone book + + + + + +Whats new in gfax-0.6beta5: +=========================== +This version is basically a port to mono >= 0.28 and gtk-sharp-0.14. +It should work on the likes of Fedora Core 1 and Redhat 9 to name a few. + +This is the first version with a proper working spec file for building +rpms. + +Fedora Core 1 users note: +Unless one has the CVS version of Orbit gfax will crash upon exit, this +is not a problem, everything still works fine. Fedora Core 2 will most +likely have this fixed. + +Bug fixes: +---------- + *created spec file for rpms. + *fixed schema installation, works for all users now. + *adding new phone book didn't work quite right, fixed. + *deleteing item in phonebook didn't allow saving after, fixed. + *now compiles with mono >= 0.28 and gtk-sharp-0.14. + +Changes: +---------- + *none. + +Whats new in gfax-0.6beta4: +=========================== +The send druid now displays all the numbers that you have choosen to send +the fax to. Each number in the list is preceded with a check mark which +allows you to deselect numbers in your list. For example: + -Print to a fax to send it. + -Press the "Phonebook" button and select a phonebook from the "Phone Books" + list and press "OK". + -You should now see all the numbers that were in your phone book. + -Deselect desired numbers by toggling the checkmark off. + +Numbers may be "built up" by continually selecting phone books, phone book +items or manually entering a number in the entry provided. + +Stretching the druid expands the list properly. + +Other changes to the send druid include the ability to change the facsimile +resolution, email address and notification feature. Notification and +resolution settings previously didn't get transmitted to hylafax, they are +now working. + +Bug fixes: +---------- + *Don't delete your file when sending the file from the "New Fax" fucntion. + *Don't delete your file if piped in from the command line. + *Delete Job button was active when no jobs to delete. + *Delete item button active when no items selected. + *Removed modal setting from About dialog. + *When adding numbers from a phone book in the send druid it wouldn't + display a single number if the organization was not set. + +Changes: +---------- + *Send druid now displays numbers to send instead of "MULTIPLE NUMBERS." + *Added toggle to send druid, you can now deselect numbers. + *Resolution setting is now functional for Hylafax. + *Email notification is now functional for Hylafax. + *Changed spool directory location to /var/spool/gfax + *Set "Rules Hint" in glade file so lists follow theme. + *Added phonebook support to "New Fax" function. + *Clear "New Fax" page properly if switching to main and back. + + +Whats new in gfax-0.6beta3: +=========================== +This release should be far more functional that previous releases, please join +the mail list and help with bug reports. Many thanks to Stephan Sachse for +his feedback. + +Bug fixes: +---------- + *create phonebook directory (~/.etc/gfax/) if it doesn't exist. + *create "phonebooks" file if it doesn't exist. + +Changes: +---------- + *Changed the default queue that is displayed on startup to the send queue. + *Added ability to delete Hylafax jobs. + *Made "Delete Job" button sensitive only when showing send queue. + + *Gfax now attempts to display the proper sensitivity for many + buttons, such as "Delete" and "Edit" in the Phonebooks page. + + *The send fax page is now functional and postscript files can be sent + directly from gfax. + + *The makefile has been updated to install schema on "make install", you + will no longer have to do a seperate "make schema". + + *When creating a new phone book the base directory defaults to ~/.etc/gfax + so users will only have to enter a file name and not the entire path. + + *Created a gfaxlpr command for use with apps like OpenOffice. It seem that + reading input in the shell sometimes fails so gfaxlpr does nothing but + read from the standard input. Hopefully this will work better for + printing from applications. See the INSTALL file for more information + about defining printers in OpenOffice. diff --git a/README b/README new file mode 100644 index 0000000..255133c --- /dev/null +++ b/README @@ -0,0 +1,57 @@ +The GFAX project aims to provide a free front end to the various +facsimile programs available for Linux and other operating systems +that use GNOME. + +GFAX provides the familiar "pop up" window and phone book support +when one "prints" to a "fax" printer. + +This is a GNOME-2.x port of Gfax. + +This version has the following features: + + - Works with Hylafax and Efax + - View status of Hylafax server, send, done and receive queues. + - Delete jobs in send queues. + - Modify jobs in send queue. Number, time to send etc. + - Download, view, print and delete received faxes on the Hylafax server. + - Delayed sending of Hylafax jobs, up to 30 days in the future. + - Both IP and username/password authentication for Hylafax. + - Cancel partially sent jobs, (while sending file to Hylafax server). + - Retrieves and displays total number of jobs in queue. + - Number of jobs in send queue displays in icon in task bar. + - Auto timed refresh of server and queue status can be toggled on or off. + - Complete list of jobs in queues with status and time to send. + + - Phonebooks + - Define Gfax phone books. + - Use your Evolution Adressbooks - See Note 1. + - Add and delete entries to Gfax phone books. + - Send fax to entire phonebook easily. + - Convenient wizard for adding new phonebooks. + - Deselect individual numbers form outgoing list. + + - Can fax postscript documents from the command line as well via + Gnome print, OpenOffice and most other X applications. + - Faxing of postscript files straight from Gfax. + + +NOTES: + 1) Evolution addressbooks are read only at the moment. + +WHEN BUILDING +If you are building from source you should run autogen.sh or configure with +the following: + --prefix=/usr --sysconfdir=/etc +Of course you may choose to substitute /usr and /etc with the locations that +your system is configured with. + +There are many things to do but C# is highly productive and I'm sure Gfax +will benefit from being written in it and move forward rapidly. + +Please join the gfax mail list for bugs, support, feature requests, flames +and other discussion. + +Gfax mail list site: http://www.cowlug.org/mailman/listinfo/gfax + +Thanks. +George Farris - farrisg@shaw.ca diff --git a/TODO b/TODO new file mode 100644 index 0000000..1d7e309 --- /dev/null +++ b/TODO @@ -0,0 +1,54 @@ +- Add debug on or off for efax and Hylafax + +- allow customizing phonebook location (central server) +- add Nautilus script to fax file. (0.7.7) + +- Add small daemon to watch cups output and run gfax. + +- evolution phonebook as a plugin to avoid dependencies (0.7.7) +- add cancel button when receiving a fax to view (0.7.7) +- receive support for efax (0.7.7) + +- allow re-queue job from done queue (0.7.7) +- add libnotify support for sedning faxes etc + +- move transmit progressbar to main window when faxing from there + +- convert many types of files for faxing so we can send more than just *.ps +- preview outgoing file before sending. + +- add gnome-keyring support. + +- install OpenOffice.org printer (maybe not) + +- cover page stuff. +- add emailing +- add log of numbers called. +- modify multiple jobs. (0.7.7) + +- Documentation via Yelp (0.7.7) + +- Add good error checking to all Hylafax operations + +- add searching phone number on send fax page. (auto search) +- add help. +- show "my" sent faxes or all faxes or sort at least +- query entire job information, destination company etc. + +- change transmit agent to enum so the property editor works right. +- change main listview to object +- clean up my variable naming :-) + +D-Bus support + +D-Bus support needs to be added for Efax. Basically the efax thread will +communicate via dbus. It should initially be able to do the following: + +From gfax to efax + start queue loop + cancel job + +From efax to gfax + job id currently working on + job status + received fax - later, receive support isn't in yet. diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..387dc65 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,22 @@ +#!/bin/sh +# Run this to generate all the initial makefiles, etc. + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +PKG_NAME="gfax" + +(test -f $srcdir/configure.in \ + && test -f $srcdir/ChangeLog \ + && test -d $srcdir/src) || { + echo -n "**Error**: Directory "\`$srcdir\'" does not look like the" + echo " top-level gfax directory" + exit 1 +} + + +which gnome-autogen.sh || { + echo "You need to install gnome-common from the GNOME CVS" + exit 1 +} +USE_GNOME2_MACROS=1 . gnome-autogen.sh diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..5f45c72 --- /dev/null +++ b/configure.in @@ -0,0 +1,82 @@ +AC_INIT(src/main.cs) +#AC_CANONICAL_SYSTEM +AM_INIT_AUTOMAKE(gfax, 0.7.7) +AM_MAINTAINER_MODE +AM_CONFIG_HEADER(config.h) + +GNOME_COMMON_INIT +GNOME_DOC_INIT + +AC_PROG_INSTALL +AC_PROG_CC +AC_ISC_POSIX +AC_HEADER_STDC +AC_PROG_INTLTOOL([0.25]) +AM_PROG_LIBTOOL +# +# Find gconftool-2 +# +AC_PATH_PROG(GCONFTOOL, gconftool-2) +AM_GCONF_SOURCE_2 + +# +# Setup GETTEXT +# +ALL_LINGUAS="en_CA de nl it lv" +GETTEXT_PACKAGE=gfax +AC_SUBST(GETTEXT_PACKAGE) +AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Gettext package]) +AM_GLIB_GNU_GETTEXT + +# +# Find pkg-config +# +AC_PATH_PROG(PKG_CONFIG, pkg-config, no) +if test "x$PKG_CONFIG" = "xno"; then + AC_MSG_ERROR([You need to install pkg-config]) +fi + +# +# Find mcs +# +AC_PATH_PROG(MCS, mcs) +if test "x$MCS" = "x"; then + AC_MSG_ERROR([Can't find mcs in your PATH]) +fi + +# + +AM_CONDITIONAL(GCONF_SCHEMAS_INSTALL, true) + +# +# Use DBus# to export our remote control if available. +# +PKG_CHECK_MODULES(DBUS, dbus-sharp, ENABLE_DBUS="yes", ENABLE_DBUS="no") +AC_ARG_ENABLE(dbus, + [ --enable-dbus=[no/yes] compile with dbus support (default: yes)], + ENABLE_DBUS="$enableval") +AM_CONDITIONAL(ENABLE_DBUS, test "$ENABLE_DBUS" = "yes") +AC_SUBST(DBUS_LIBS) + + +libpath=`basename ${libdir}` + +AC_SUBST(install_sh) + +# +# Gfax needs Gtk# Gnome# GConf# +# +PKG_CHECK_MODULES(GFAX, glib-sharp-2.0 gtk-sharp-2.0 gnome-sharp-2.0 gconf-sharp-2.0 gconf-sharp-peditors-2.0 + glade-sharp-2.0 evolution-sharp) +AC_SUBST(GFAX_LIBS) + +AC_OUTPUT([ +Makefile +data/Makefile +src/Makefile +po/Makefile.in +data/icons/Makefile +data/icons/16x16/Makefile +data/icons/48x48/Makefile +data/icons/scalable/Makefile +]) diff --git a/cvs-notes b/cvs-notes new file mode 100644 index 0000000..de4a996 --- /dev/null +++ b/cvs-notes @@ -0,0 +1,59 @@ +Build Ubuntu package with + dpkg-buildpackage -rfakeroot + +My CVS notes + +CHECKOUT +-------- +Check out the current working branch and prune directories + cvs co -P gfax +This would assume you have changed from the HEAD branch. +To checkout a named tag + cvs co -P -r gfax_0_7_2 gfax + +While branch names refer to the latest code at the end of a +branch (and as such, are dynamic), tag names refer +to the static version of code that existed upon the tag's creation. +As a result, you cannot commit changes back into the tree at the +tagged place that you checked them out from. + + +NEW RELEASE +----------- +To create a new branch: +Branch name is gfax_0_7, the tag works on the working +copy so you should do a HEAD checkout first. + cvs co -P gfax + cvs tag -r gfax_0_7 +Use this when releaseing a new version of the program +Access the branch with: + cvs co -P -r gfax_0_7 + +To find out what branch a file is on do this: + cvs status -v filename + + +ADD FILE +-------- +To add a file to the repository, create the file locally and then add it: + cvs add filename + cvs commit + +MERGE release back to HEAD +-------------------------- +Checkout HEAD first + cvs co -P -r HEAD +now merge tag (maybe from branch) + cvs update -j gfax_0_7 +then commit + cvs commit +You can only do this once per branch, after that you must merge the branch +and file version: + cvs update -j 1.2.2.2 -j gfax_0_7 src/gui.cs + + +Move to branch + cvs update -r gfax_0_7 +Move back to HEAD + cvs update -A + diff --git a/data/Makefile.am b/data/Makefile.am new file mode 100644 index 0000000..e782b80 --- /dev/null +++ b/data/Makefile.am @@ -0,0 +1,54 @@ +SUBDIRS = icons + +desktop_in_files=gfax.desktop.in +desktop_files=$(desktop_in_files:.desktop.in=.desktop) +@INTLTOOL_DESKTOP_RULE@ + +Applicationsdir = $(datadir)/applications +Applications_DATA = $(desktop_files) + +schemas_in_files = gfax.schemas.in +schemasdir = $(GCONF_SCHEMA_FILE_DIR) +schemas_DATA = $(schemas_in_files:.schemas.in=.schemas) + +@INTLTOOL_SCHEMAS_RULE@ + +if GCONF_SCHEMAS_INSTALL +install-data-local: + if test -z "$(DESTDIR)" ; then \ + for p in $(schemas_DATA) ; do \ + GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(srcdir)/$$p ; \ + done \ + fi +else +install-data-local: +endif + +cups-gfax: +backenddir = /usr/lib/cups/backend +backend_EXEC = cups-gfax + +backend_availabledir = /usr/lib/cups/backend-available +backend_available_EXEC = cups-gfax + +install-exec-hook: + $(INSTALL_PROGRAM) $(backend_EXEC) $(backenddir) + $(INSTALL_PROGRAM) $(backend_available_EXEC) $(backend_availabledir) + lpadmin -p Gfax_Facsimile_Printer -v cups-gfax:/ -E + +uninstall-local: + rm -f $(backenddir)/$(backend_EXEC) + rm -f $(backend_availabledir)/$(backend_available_EXEC) + lpadmin -x Gfax_Facsimile_Printer + +EXTRA_DIST = \ + $(backend_EXEC) \ + $(backend_available_EXEC) \ + $(desktop_in_files) \ + $(desktop_files) \ + $(schemas_in_files) \ + $(schemas_DATA) + +DISTCLEANFILES = \ + $(desktop_files) \ + $(schemas_DATA) diff --git a/data/cups-gfax b/data/cups-gfax new file mode 100755 index 0000000..59165fe --- /dev/null +++ b/data/cups-gfax @@ -0,0 +1,32 @@ +#!/bin/bash +# GFAX - Gnome fax application +# Copyright (C) 2003 - 2008 George A. Farris +# +# 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 3 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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +if [ $# == 0 ] ; then + echo "file cups-gfax:/ \"Unknown\" \"Gfax Facsimile Printer\"" + exit 0 +fi + +RNAME=G$$ +# don't change this spool directory, gfax uses it. +mkdir -p /var/spool/gfax/$2 +chmod 777 /var/spool/gfax/$2 +SPOOL_DIR=/var/spool/gfax/$2 +cp $6 $SPOOL_DIR/D.$RNAME +chmod 666 $SPOOL_DIR/D.$RNAME + +exit 0 diff --git a/data/gfax.desktop.in b/data/gfax.desktop.in new file mode 100644 index 0000000..d8b5d96 --- /dev/null +++ b/data/gfax.desktop.in @@ -0,0 +1,10 @@ +[Desktop Entry] +Version=1.0 +_Name=Gfax Facsimile Program +_Comment=Send and Receive Facsimiles +Exec=gfax +Icon=gfax +StartupNotify=true +Terminal=false +Type=Application +Categories=GNOME;GTK;Office; diff --git a/data/gfax.schemas.in b/data/gfax.schemas.in new file mode 100644 index 0000000..1f88f78 --- /dev/null +++ b/data/gfax.schemas.in @@ -0,0 +1,286 @@ + + + + /schemas/apps/gfax/general/refresh_queue_interval + /apps/gfax/general/refresh_queue_interval + gfax + int + + 30 + + + /schemas/apps/gfax/general/run_setup_at_start + /apps/gfax/general/run_setup_at_start + gfax + bool + + true + + + /schemas/apps/gfax/general/log_enabled + /apps/gfax/general/log_enabled + gfax + bool + + false + + + /schemas/apps/gfax/general/refresh_queue_enabled + /apps/gfax/general/refresh_queue_enabled + gfax + bool + + false + + + /schemas/apps/gfax/general/send_now + /apps/gfax/general/send_now + gfax + bool + + true + + + /schemas/apps/gfax/general/email_notify + /apps/gfax/general/email_notify + gfax + bool + + true + + + /schemas/apps/gfax/general/cover_page + /apps/gfax/general/cover_page + gfax + bool + + false + + + /schemas/apps/gfax/general/hi_resolution + /apps/gfax/general/hi_resolution + gfax + bool + + true + + + /schemas/apps/gfax/general/faxtracing + /apps/gfax/general/faxtracing + gfax + bool + + false + + + + /schemas/apps/gfax/general/phone_prefix + /apps/gfax/general/phone_prefix + gfax + string + + none + + + /schemas/apps/gfax/general/fax_number + /apps/gfax/general/fax_number + gfax + string + + + + + /schemas/apps/gfax/general/email_address + /apps/gfax/general/email_address + gfax + string + + + + + /schemas/apps/gfax/general/transmit_agent + /apps/gfax/general/transmit_agent + gfax + string + + hylafax + + + /schemas/apps/gfax/general/fax_viewer + /apps/gfax/general/fax_viewer + gfax + string + + evince + + + /schemas/apps/gfax/transport/hylafax/hostname + /apps/gfax/transport/hylafax/hostname + gfax + string + + localhost + + + /schemas/apps/gfax/transport/hylafax/port + /apps/gfax/transport/hylafax/port + gfax + string + + 4559 + + + /schemas/apps/gfax/transport/hylafax/username + /apps/gfax/transport/hylafax/username + gfax + string + + + + + /schemas/apps/gfax/transport/hylafax/password + /apps/gfax/transport/hylafax/password + gfax + string + + + + + + + + /schemas/apps/gfax/transport/efax/efax_modem_device + /apps/gfax/transport/efax/efax_modem_device + gfax + string + ttyS0 + + Modem Device + The serial port the modem is connected too. Typical values are ttyS0, cua0 or modem. + + + + /schemas/apps/gfax/transport/efax/efax_modem_init + /apps/gfax/transport/efax/efax_modem_init + gfax + string + + Modem initialization string + The initialization code that is sent to the modem. + + + + + /schemas/apps/gfax/transport/efax/efax_modem_fcinit + /apps/gfax/transport/efax/efax_modem_fcinit + gfax + string + + + + + /schemas/apps/gfax/transport/efax/efax_modem_reset + /apps/gfax/transport/efax/efax_modem_reset + gfax + string + + Modem reset string + The reset code that resets the modem to a power up state. The -Kz code works with most modems. + + -kZ + + + /schemas/apps/gfax/transport/efax/efax_modem_speaker_mode + /apps/gfax/transport/efax/efax_modem_speaker_mode + gfax + int + 1 + + 0:never, 1:until carrier, 2:always, 3:on receive only + + + + /schemas/apps/gfax/transport/efax/efax_modem_speaker_volume + /apps/gfax/transport/efax/efax_modem_speaker_volume + gfax + int + 0 + + 0:very low, 1:low, 2:medium, 3:high + + + + /schemas/apps/gfax/transport/efax/efax_modem_class + /apps/gfax/transport/efax/efax_modem_class + gfax + string + + Not currently used. + + auto + + + /schemas/apps/gfax/transport/efax/efax_modem_capabilities + /apps/gfax/transport/efax/efax_modem_capabilities + gfax + string + + Not currently used. + + + + + /schemas/apps/gfax/transport/efax/efax_lockfile + /apps/gfax/transport/efax/efax_lockfile + gfax + string + + The name of the lock file according to your system's conventions. If you're running Linux you shouldn't have to touch this. + + /var/lock/LCK.. + + + /schemas/apps/gfax/transport/efax/efax_page_header + /apps/gfax/transport/efax/efax_page_header + gfax + string + + + + + + /schemas/apps/gfax/transport/efax/efax_retries + /apps/gfax/transport/efax/efax_retries + gfax + int + + 10 + + + /schemas/apps/gfax/transport/efax/efax_next_jobid + /apps/gfax/transport/efax/efax_next_jobid + gfax + int + + 0 + + + /schemas/apps/gfax/transport/efax/efax_papersize + /apps/gfax/transport/efax/efax_papersize + gfax + string + + letter + + + /schemas/apps/gfax/transport/efax/efax_debug_messages + /apps/gfax/transport/efax/efax_debug_messages + gfax + string + + c + + + + + diff --git a/data/gfax.spec b/data/gfax.spec new file mode 100644 index 0000000..3530a15 --- /dev/null +++ b/data/gfax.spec @@ -0,0 +1,95 @@ +# created by RPM Builder for Anjuta, v0.1.2 +# http://arpmbuilder.sourceforge.net +# Thu Dec 11 20:34:57 2003 + +%define gfax 0.7.5 +#%define anjuta_plugindir /usr/lib/anjuta +%define _prefix /usr + +Summary: Gnome facsimile software +Name: gfax +Version: 0.7.5 +Release: 1 +Vendor: George Farris (george@gmsys.com> +Packager: George Farris (george@gmsys.com> +Group: Office +License: GPL +Source0: %{name}-%{version}.tar.gz +Url: http://gfax.cowlug.org +BuildRoot: /var/tmp/gfax +BuildArch: noarch +Requires: mono >= 1.0, gtk-sharp >= 1.0, efax >= .9 +# Buildrequires: (none) +# Conflicts: (none) +# Provides: (none) +Obsoletes: gfax + +%description +Gfax is a popup tool for easily sending +facsimilies by printing to a fax printer. + +%prep +%setup -q + +%build +[ ! -f Makefile ] || make clean +make schema +make + +%install +rm -rf $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT/etc/gconf/schemas +mkdir -p $RPM_BUILD_ROOT/usr/bin +mkdir -p $RPM_BUILD_ROOT/usr/lib/gfax +mkdir -p $RPM_BUILD_ROOT/usr/share/gfax +mkdir -p $RPM_BUILD_ROOT/usr/share/pixmaps +mkdir -p $RPM_BUILD_ROOT/usr/share/applications +mkdir -p $RPM_BUILD_ROOT/var/spool/gfax + +install -m 644 data/gfax.schema $RPM_BUILD_ROOT/etc/gconf/schemas/gfax.schemas +install -m 755 src/gfax.exe $RPM_BUILD_ROOT/usr/lib/gfax/gfax.exe +install -m 755 gfax $RPM_BUILD_ROOT/usr/bin/gfax +install -m 755 gfaxlpr $RPM_BUILD_ROOT/usr/bin/gfaxlpr +install -m 644 pixmaps/gfax.png $RPM_BUILD_ROOT/usr/share/pixmaps/gfax.png +install -m 644 data/gfax.desktop $RPM_BUILD_ROOT/usr/share/applications/gfax.desktop +install -m 755 scripts/printer-setup.sh $RPM_BUILD_ROOT/usr/share/gfax/printer-setup.sh +install -m 644 data/fax-g3.profile $RPM_BUILD_ROOT/usr/share/gfax/fax-g3.profile +install -m 644 data/GFAX.xml $RPM_BUILD_ROOT/usr/share/gfax/GFAX.xml +install -m 644 data/GNOME-GFAX-PS.xml $RPM_BUILD_ROOT/usr/share/gfax/GNOME-GFAX-PS.xml + +chmod 777 $RPM_BUILD_ROOT/var/spool/gfax + +#[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT + +for doc in AUTHORS COPYING README INSTALL NEWS TODO ChangeLog; do + rm -f $RPM_BUILD_ROOT%{_prefix}/doc/gfax/$doc; +done; + +rm -f $RPM_BUILD_ROOT%{gfax}; + +%clean +[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT + +%post +export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source` +gconftool-2 --makefile-install-rule %{_sysconfdir}/gconf/schemas/gfax.schemas > /dev/null +killall -HUP gconfd-2 +# run the printer install +%{_datadir}/gfax/printer-setup.sh --install + +%preun +%{_datadir}/gfax/printer-setup.sh --remove + +%files +%defattr(-,root,root) +%config %{_sysconfdir}/gconf/schemas/*.schemas +%{_libdir}/gfax/gfax.exe +%{_bindir}/gfax +%{_bindir}/gfaxlpr +%{_datadir}/applications/*.desktop +%{_datadir}/pixmaps/* +%{_datadir}/gfax/* +%defattr(-, root, root, 0777) +%{_localstatedir}/spool/gfax/ + +%doc AUTHORS COPYING ChangeLog README INSTALL NEWS TODO diff --git a/data/icons/16x16/Makefile.am b/data/icons/16x16/Makefile.am new file mode 100644 index 0000000..1e7e42b --- /dev/null +++ b/data/icons/16x16/Makefile.am @@ -0,0 +1,8 @@ +icondir = $(datadir)/icons/hicolor/16x16/apps +icon_DATA = gfax.png + +EXTRA_DIST = \ + $(icon_DATA) + +clean-local : + rm -f *~ diff --git a/data/icons/16x16/gfax.png b/data/icons/16x16/gfax.png new file mode 100644 index 0000000..e0cb102 Binary files /dev/null and b/data/icons/16x16/gfax.png differ diff --git a/data/icons/48x48/Makefile.am b/data/icons/48x48/Makefile.am new file mode 100644 index 0000000..db441f6 --- /dev/null +++ b/data/icons/48x48/Makefile.am @@ -0,0 +1,9 @@ +icondir = $(datadir)/icons/hicolor/48x48/apps +icon_DATA = \ + gfax.png + +EXTRA_DIST = \ + $(icon_DATA) + +clean-local : + rm -f *~ diff --git a/data/icons/48x48/gfax.png b/data/icons/48x48/gfax.png new file mode 100644 index 0000000..49c3db3 Binary files /dev/null and b/data/icons/48x48/gfax.png differ diff --git a/data/icons/Makefile.am b/data/icons/Makefile.am new file mode 100644 index 0000000..714218d --- /dev/null +++ b/data/icons/Makefile.am @@ -0,0 +1,16 @@ + +SUBDIRS = 16x16 48x48 scalable + +gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor + +install-data-hook: + @-if test -z "$(DESTDIR)"; then \ + echo "Updating Gtk icon cache."; \ + $(gtk_update_icon_cache); \ + else \ + echo "*** Icon cache not updated. After install, run this:"; \ + echo "*** $(gtk_update_icon_cache)"; \ + fi + +clean-local : + rm -f *~ diff --git a/data/icons/scalable/Makefile.am b/data/icons/scalable/Makefile.am new file mode 100644 index 0000000..6e73d64 --- /dev/null +++ b/data/icons/scalable/Makefile.am @@ -0,0 +1,8 @@ +icondir = $(datadir)/icons/hicolor/scalable/apps +icon_DATA = gfax.svg + +EXTRA_DIST = \ + $(icon_DATA) + +clean-local : + rm -f *~ diff --git a/data/icons/scalable/gfax.svg b/data/icons/scalable/gfax.svg new file mode 100644 index 0000000..8d1804a --- /dev/null +++ b/data/icons/scalable/gfax.svg @@ -0,0 +1,1248 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Fax Device + + + Martin Szulecki + + + + http://sukimashita.com + + + fax + print + hylafax + gfax + efax + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gfax.in b/gfax.in new file mode 100755 index 0000000..6079139 --- /dev/null +++ b/gfax.in @@ -0,0 +1,37 @@ +#!/bin/bash +# GFAX - Gnome fax application +# Copyright (C) 2003 - 2008 George A. Farris +# +# 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 3 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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +RNAME=G$$ +# don't change this spool directory, gfax uses it. +SPOOL_DIR=~/.local/share/gfax/spool +STD=no + +if [ -s /dev/stdin ]; then + cat > $SPOOL_DIR/D.$RNAME + STD=yes +fi + +if [ $STD = "yes" ]; then + exec mono @prefix@/lib/gfax/gfax.exe -f $SPOOL_DIR/D.$RNAME & + #rm -f $SPOOL_DIR/D.$RNAME + exit 0 +fi + +# If it's not a fax piped in on stdin, pass everything straight through to +# mono-gfax. +mono @prefix@/lib/gfax/gfax.exe $@ diff --git a/glade/gfax.glade b/glade/gfax.glade new file mode 100644 index 0000000..b25fec0 --- /dev/null +++ b/glade/gfax.glade @@ -0,0 +1,5532 @@ + + + + + + + + + True + Gfax + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + 639 + 479 + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + True + False + True + + + + + + True + True + + + + True + GTK_SHADOW_OUT + + + + True + GTK_PACK_DIRECTION_LTR + GTK_PACK_DIRECTION_LTR + + + + True + _Fax + True + + + + + + + True + New Fax + True + + + + + + True + gtk-new + 1 + 0.5 + 0.5 + 0 + 0 + + + + + + + + True + + + + + + True + Exit + True + + + + + + True + gtk-quit + 1 + 0.5 + 0.5 + 0 + 0 + + + + + + + + + + + + True + GNOMEUIINFO_MENU_EDIT_TREE + + + + + + + True + GNOMEUIINFO_MENU_PREFERENCES_ITEM + + + + + + + + + + + True + _Settings + True + + + + + + + True + Auto Refresh Queue + True + False + + + + + + + True + E-Mail Notification + True + False + + + + + + + True + Hi Resolution Mode + True + False + + + + + + + True + Log Enabled + True + False + + + + + + + True + Fax Tracing + True + False + + + + + + + + + + + True + _Help + True + + + + + + + True + GNOMEUIINFO_MENU_ABOUT_ITEM + + + + + + + + + + + + BONOBO_DOCK_TOP + 0 + 0 + 0 + BONOBO_DOCK_ITEM_BEH_EXCLUSIVE|BONOBO_DOCK_ITEM_BEH_NEVER_VERTICAL + + + + + + True + GTK_SHADOW_OUT + + + + True + GTK_ORIENTATION_HORIZONTAL + GTK_TOOLBAR_BOTH_HORIZ + True + True + + + + True + New Fax + True + gtk-new + True + True + True + + + + + False + True + + + + + + True + Open phone book + Phone Book + True + True + True + True + + + + + False + True + + + + + + True + True + True + True + + + False + False + + + + + + True + Exit + True + gtk-quit + True + True + True + + + + + False + True + + + + + + + BONOBO_DOCK_TOP + 1 + 0 + 0 + BONOBO_DOCK_ITEM_BEH_EXCLUSIVE + + + + + + 6 + True + False + 12 + + + + True + True + True + True + GTK_POS_TOP + False + False + + + + + 6 + True + False + 6 + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_ALWAYS + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + True + False + True + False + False + False + + + + + + 0 + True + True + + + + + + True + False + 6 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + True + False + + + + + + True + True + GTK_RELIEF_NORMAL + True + + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-cancel + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + _Cancel Job + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + + + + 0 + False + False + GTK_PACK_END + + + + + + True + True + GTK_RELIEF_NORMAL + True + + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-edit + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + _Modify Job + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + + + + 0 + False + False + + + + + 0 + False + False + + + + + False + True + + + + + + True + Facsimiles to Send + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 6 + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_ALWAYS + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + True + False + True + False + False + False + + + + + + False + True + + + + + + True + Completed Jobs + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 6 + True + False + 6 + + + + 6 + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_ALWAYS + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + True + False + True + False + False + False + + + + + + 0 + True + True + + + + + + True + False + 0 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + True + True + + + + + + True + True + GTK_RELIEF_NORMAL + True + + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-print-preview + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + View / Print + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + + + + 0 + False + False + + + + + + True + True + GTK_RELIEF_NORMAL + True + + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-delete + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + Delete + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + + + + 6 + False + False + + + + + 0 + False + False + + + + + False + True + + + + + + True + Received Facsimiles + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + 0 + True + True + + + + + + True + False + 6 + + + + True + Fax Status: + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + 80 + True + True + GTK_POLICY_NEVER + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + True + GTK_JUSTIFY_LEFT + GTK_WRAP_NONE + True + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 0 + True + True + + + + + 0 + False + True + + + + + + + 0 + True + True + + + + + + True + True + True + + + 0 + True + True + + + + + + True + Gfax - New user setup + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + True + False + + + + + 4 + True + False + + + + + True + GNOME_EDGE_START + Gfax - Gnome facsimile program + Welcome to Gfax! + + +Gfax is a GNOME facsimile program that provides +the familiar "popup" window when printing to a fax +printer. + +The following pages will help you to setup Gfax. + + + + + + True + Gfax - Facsimile Transport Agent + + + + 16 + True + False + 6 + + + + 16 + True + False + 0 + + + + True + False + 0 + + + + True + First we must choose a transport agent. + +A transport agent is a software package that is responsible for +actually sending the facsimile with your modem. If you don't have +one of these installed you should hit cancel here and install +a transport agent first. + +Transport agents can be found at the following URL's but you should +check your distribution CD first.. + +Hylafax - http://www.hylafax.org +Efax - http://www.cce.com/efax + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + False + False + + + + + + True + 0 + 0.5 + GTK_SHADOW_ETCHED_IN + + + + True + False + 0 + + + + True + False + 0 + + + + True + False + 0 + + + + True + True + Hylafax - Choose this for network faxing. + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + True + Efax + True + GTK_RELIEF_NORMAL + True + True + False + True + HylafaxRadioButton + + + 0 + False + False + + + + + 0 + False + True + + + + + 0 + True + False + + + + + + + + True + Transport Agent + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + False + False + + + + + 5 + True + False + + + + + 0 + False + False + + + + + + + + + + True + Gfax - Modem Selection + + + + 16 + True + False + 6 + + + + True + False + False + GTK_POS_TOP + False + False + + + + 12 + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + False + 0 + + + + True + +Please enter your Hylafax server information here. If you are running Hylafax on the same computer That you are using Gfax on then "Host Name" should be set to "localhost". + + False + False + GTK_JUSTIFY_LEFT + True + False + 0.239999994636 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + 6 + True + False + 0 + + + + True + True + 0 + + + + True + Host Name: + False + False + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + IP Port: + False + False + GTK_JUSTIFY_RIGHT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + Username: + False + False + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 6 + False + False + + + + + + True + True + 12 + + + + True + True + True + True + 0 + + True + * + False + 45 + + + 0 + False + False + + + + + + True + True + True + True + 0 + 4559 + True + * + False + + + 0 + False + False + + + + + + True + True + True + True + 0 + + True + * + False + + + 0 + False + False + + + + + 0 + False + False + + + + + 0 + False + True + + + + + + + + True + <b>Server</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + False + True + + + + + + True + Hylafax + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 5 + True + False + 5 + + + + True + Gfax can inform the Efax transport agent which +serial port your modem is connected to. + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + True + True + + + + + + True + False + 0 + + + + True + 0 + 0.5 + GTK_SHADOW_ETCHED_IN + + + + 14 + True + False + 0 + + + + True + Which serial port is your modem connected to? + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 10 + True + True + + + + + + True + False + True + False + True + False + + + + True + The serial port the modem is on - ttyS0 is COM1, ttyS1 is COM2 etc. + True + True + 0 + + True + * + False + + + + + + True + GTK_SELECTION_BROWSE + + + + True + + + + True + modem + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + + True + + + + True + ttyS0 + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + + True + + + + True + ttyS1 + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + + True + + + + True + ttyS2 + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + + True + + + + True + ttyS3 + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + + True + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + + + 12 + True + True + + + + + + + + True + Modem Connection + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + False + False + + + + + 0 + True + False + + + + + False + True + + + + + + Mgetty + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + 0 + False + False + + + + + + + + + + True + Gfax - Phone Number Information + + + + 16 + True + False + 6 + + + + 12 + True + False + 0 + + + + True + Please enter your facsimile number. + +This number is placed in the top one line header that is placed +on all outgoing facsimiles. + +You may also choose a default dial prefix. Many companies in +North America use the number "9" to reach an outside line. + + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + True + True + + + + + + True + False + 0 + + + + True + False + 0 + + + + True + True + 0 + + + + True + Facsimile Number: + False + False + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + Dial Prefix: + False + False + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 0 + False + False + + + + + + 6 + True + True + 12 + + + + True + True + True + True + 0 + + True + * + False + + + 0 + False + False + + + + + + True + True + True + True + 0 + + True + * + False + + + 0 + False + False + + + + + 0 + False + False + + + + + 0 + False + False + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + + + + + True + Gfax - E-Mail Address + + + + 16 + True + False + 6 + + + + 12 + True + False + 0 + + + + True + Hylafax and Mgetty+Sendfax can both be requested to send +results of facsimile transmission to an email address. + +If you require this feature please enter your email address +here. It's a good idea to include this even if you don't +use it immediately, you can enable and disable it in the +preferences section of Gfax. + + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 12 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 0 + + + + True + E-Mail Address: + False + False + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + True + True + True + 0 + + True + * + False + 45 + + + 6 + False + False + + + + + 0 + False + False + + + + + 0 + False + False + + + + + + + + + + True + GNOME_EDGE_FINISH + Gfax - Setup Complete + Gfax setup is now complete! + +Gfax is configurable; there are other configuration +options available under the preferences menu. + +You can run this first time setup at any time from +the preferences section. + +Default preferences have been choosen for the +transport agent you chose, you may want to +customise them. + + + + + + + + + True + Gfax - Preferences + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + True + False + True + + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-help + True + GTK_RELIEF_NORMAL + True + -11 + + + + + + + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + True + -7 + + + + + + 0 + False + True + GTK_PACK_END + + + + + + True + True + True + True + GTK_POS_TOP + False + False + + + + 6 + True + False + 0 + + + + 6 + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + 12 + True + False + 0 + + + + 10 + True + True + Hylafax + True + GTK_RELIEF_NORMAL + True + True + False + True + + + + + 0 + False + False + + + + + + 10 + True + True + Efax + True + GTK_RELIEF_NORMAL + True + False + False + True + HylafaxRadioButton + + + + 0 + False + False + + + + + + + + True + <b><big>Fax Transport Agent</big></b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 6 + False + False + + + + + + 6 + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + 12 + True + False + 0 + + + + True + True + 0 + + + + True + Facsimile Number: + False + False + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + Dial Prefix: + False + False + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 0 + False + False + + + + + + 6 + True + True + 6 + + + + True + True + True + True + 0 + + True + * + False + + + + 0 + False + False + + + + + + True + True + True + True + 0 + + True + * + False + + + + 0 + False + False + + + + + 0 + False + False + + + + + + + + True + <b><big>Phone Information</big></b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 6 + False + False + + + + + + 6 + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + 12 + True + False + 0 + + + + True + True + 0 + + + + True + Program: + False + False + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 0 + False + False + + + + + + True + True + 6 + + + + True + True + True + True + 0 + + True + â— + False + + + 0 + False + False + + + + + 0 + False + False + + + + + + + + True + <b><big>Facsimile Viewer Program</big></b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + False + False + + + + + False + True + + + + + + True + System + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + GTK_POLICY_NEVER + GTK_POLICY_AUTOMATIC + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + True + GTK_SHADOW_NONE + + + + 24 + True + 3 + 2 + False + 6 + 6 + + + + True + Port Number: + False + False + GTK_JUSTIFY_CENTER + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + + + + + + + + True + Username: + False + False + GTK_JUSTIFY_CENTER + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + Hostname: + False + False + GTK_JUSTIFY_CENTER + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + True + True + True + 0 + + True + * + False + + + 1 + 2 + 2 + 3 + fill + + + + + + + True + The TCP/IP port number of the fax server. Default hylafax port is 4559. + True + True + True + 0 + 4559 + True + * + False + + + 1 + 2 + 1 + 2 + fill + + + + + + + True + The host name of the network fax server. Enter "localhost" if you are not using a network fax server. + True + True + True + 0 + localhost + True + * + False + 40 + + + 1 + 2 + 0 + 1 + fill + + + + + + + + + + + + + True + <b><big>Hylafax Setup</big></b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + False + True + + + + + + True + Hylafax + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + False + 0 + + + + 10 + True + GTK_POLICY_NEVER + GTK_POLICY_AUTOMATIC + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + True + GTK_SHADOW_NONE + + + + 10 + True + 4 + 2 + False + 10 + 6 + + + + True + False + True + False + True + False + + + + True + The serial port the modem is on - ttyS0 is COM1, ttyS1 is COM2 etc. + True + True + 0 + + True + * + False + + + + + + + True + GTK_SELECTION_BROWSE + + + + True + + + + True + modem + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + + True + + + + True + ttyS0 + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + + True + + + + True + ttyS1 + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + + True + + + + True + ttyS2 + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + + True + + + + True + ttyS3 + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + + True + + + + True + cua1 + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + + True + + + + True + cua2 + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + + True + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + + + 1 + 2 + 0 + 1 + + + + + + + True + Modem Type: + False + False + GTK_JUSTIFY_CENTER + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + Speaker Volume: + False + False + GTK_JUSTIFY_CENTER + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + Page Size: + False + False + GTK_JUSTIFY_CENTER + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 3 + 4 + fill + + + + + + + True + Modem Port: + False + False + GTK_JUSTIFY_CENTER + False + False + 1 + 0.5 + 4 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + letter +legal +a4 + False + True + + + + 1 + 2 + 3 + 4 + fill + fill + + + + + + True + Very Low +Low +Medium +High + False + True + + + + 1 + 2 + 2 + 3 + fill + fill + + + + + + True + ATT (Dataport, Paradyne) +Motorola (Power Modem, 3400 Pro,... +QuickComm (Spirit II) +USR (Courier, Sportster) +Multi-Tech (for bit reversal) +User Defined + + False + True + + + + 1 + 2 + 1 + 2 + fill + fill + + + + + + + + + 0 + True + True + + + + + + + + True + <b><big>Efax Setup</big></b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + False + True + + + + + + True + Efax + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 6 + True + True + 0 + + + + 6 + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + 3 + True + False + 0 + + + + 3 + True + False + 12 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + True + Send Email Notification + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + 0 + False + False + + + + + + 3 + True + False + 12 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + E-Mail Address: + False + False + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 2 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + True + True + True + 0 + + True + * + False + 40 + + + + 0 + True + True + + + + + 0 + False + False + + + + + + + + True + <b><big>E-Mail Notification</big></b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + False + False + + + + + + 6 + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + 3 + True + False + 0 + + + + 3 + True + False + 12 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + True + Send Immediately + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + 0 + False + False + + + + + + 3 + True + False + 12 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + True + Fax log enabled + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + 0 + False + False + + + + + + + + True + <b><big>Transmit Properties</big></b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + True + False + + + + + + 6 + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + 3 + True + False + 0 + + + + 3 + True + False + 12 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + True + Use Cover Page + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + 0 + False + False + + + + + + 3 + True + False + 12 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + True + Use Fine Resolution + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + 0 + False + False + + + + + + + + True + <b><big>Fax Properties</big></b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + True + False + + + + + False + True + + + + + + True + User + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + 0 + True + True + + + + + + + + True + Gfax - Transmission Progress + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + True + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + True + False + True + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + True + 0 + + + + + + + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + True + -7 + + + + + + 0 + False + True + GTK_PACK_END + + + + + + True + False + False + GTK_POS_TOP + False + False + + + + 5 + True + True + 10 + + + + 12 + True + False + 6 + + + + True + gtk-print + 6 + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + Transmitting facsimile to +Hylafax server. + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + 0 + False + False + + + + + + True + GTK_PROGRESS_LEFT_TO_RIGHT + 0 + 0.10000000149 + PANGO_ELLIPSIZE_NONE + + + 12 + False + False + + + + + False + True + + + + + + True + label379 + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + False + 6 + + + + True + gtk-dialog-info + 6 + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + Your facsimile was sucessfully + transmitted! + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + False + True + + + + + + True + oklabel + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + False + 6 + + + + True + gtk-dialog-error + 6 + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + There was an error transmitting +your facsimile to the server! + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + False + True + + + + + + True + label383 + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + 0 + True + True + + + + + + + + True + New phone book + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + True + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + True + False + True + + + + + True + False + 0 + + + + 1 + False + GTK_BUTTONBOX_END + + + 0 + False + False + GTK_PACK_END + + + + + + 4 + True + False + + + + + True + GNOME_EDGE_START + Gfax - Add new phone book. + This will lead you through the process +of creating a new phone book. + + + + + + True + Gfax - Add new phone book. + + + + + 16 + True + False + 6 + + + + True + True + 0 + + + + True + Please enter the type of phone book you are creating. + False + False + GTK_JUSTIFY_LEFT + False + False + 0.300000011921 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + 12 + True + 2 + 2 + True + 0 + 3 + + + + True + False + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + 4 + internet-mail + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + Evolution + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + + + + 1 + 2 + 0 + 1 + fill + + + + + + + False + True + GTK_RELIEF_NORMAL + True + False + False + True + EvolutionRadioButton + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + 4 + network-server + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + LDAP + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + + + + 1 + 2 + 1 + 2 + fill + + + + + + + False + True + GTK_RELIEF_NORMAL + True + False + False + True + EvolutionRadioButton + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + 4 + x-office-address-book + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + Database + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + True + GTK_RELIEF_NORMAL + True + True + False + True + EvolutionRadioButton + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + 4 + x-office-address-book + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + Gfax + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + + + + 0 + 1 + 0 + 1 + expand + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + + + + + True + Gfax - Add new phone book. + + + + + 16 + True + False + 6 + + + + 50 + True + True + 0 + + + + True + Please enter a name for your new phone book. + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + True + True + True + True + 0 + + True + * + False + + + 0 + True + True + + + + + 0 + True + True + + + + + + + + + + True + Evolution Address books + + + + 16 + True + False + 6 + + + + True + False + 0 + + + + True + Please select the Evolution address books that you would +like to use. + +These are only local address books and will only include +contacts with facsimile numbers. + False + False + GTK_JUSTIFY_LEFT + False + False + 0.300000011921 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + 6 + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + False + True + False + False + False + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + + + + + True + GNOME_EDGE_FINISH + Gfax - Add new phone book. + Complete... + +Your new phone book is ready. +If this is a Gfax type phone book you may +now add items. + +Evolution phone books are read only +but may be change through Evolution. + + + + + + 0 + True + True + + + + + + + + True + Password Dialog + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + True + False + True + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + True + -6 + + + + + + + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + True + -5 + + + + + + 0 + False + True + GTK_PACK_END + + + + + + 12 + True + False + 12 + + + + True + False + 0 + + + + True + gtk-dialog-question + 6 + 0 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + Please enter the password +for your fax server. + False + False + GTK_JUSTIFY_LEFT + False + False + 0.419999986887 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + True + True + + + + + 0 + True + False + + + + + + True + True + True + True + False + 0 + + True + * + False + + + + 0 + True + True + + + + + + True + True + Remember this password + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + 0 + True + True + + + + + + + + True + Gfax - Modify Job + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + False + True + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + True + False + True + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + True + -6 + + + + + + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + True + -5 + + + + + 0 + False + True + GTK_PACK_END + + + + + + True + False + 0 + + + + True + False + 0 + + + + True + gtk-dialog-info + 6 + 0 + 0.5 + 0 + 0 + + + 6 + False + True + + + + + + True + <b>Alter facsimile job parameters</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.0799999982119 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + True + True + + + + + 0 + True + True + + + + + + 6 + True + 3 + 2 + False + 6 + 6 + + + + True + Fax Number: + False + False + GTK_JUSTIFY_RIGHT + False + False + 1 + 0 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + Time to send: + False + False + GTK_JUSTIFY_RIGHT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + True + True + 0 + + True + * + False + + + 1 + 2 + 0 + 1 + + + + + + + True + True + GNOME_DATE_EDIT_SHOW_TIME|GNOME_DATE_EDIT_24_HR + 0 + 23 + + + 1 + 2 + 1 + 2 + + + + + + + True + Maximum Dials: + False + False + GTK_JUSTIFY_RIGHT + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + Make no more than <maxdials> calls in attempting to send the facsimile. Once <maxdials> has been reached, the job will be killed. + True + 1 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 2 1 20 1 10 10 + + + 1 + 2 + 2 + 3 + + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + + diff --git a/glade/send-druid.glade b/glade/send-druid.glade new file mode 100644 index 0000000..dd05e75 --- /dev/null +++ b/glade/send-druid.glade @@ -0,0 +1,1241 @@ + + + + + + + True + 6 + Send Fax + GDK_WINDOW_TYPE_HINT_DIALOG + True + True + False + + + True + + + True + True + + + True + 6 + 0 + GTK_SHADOW_NONE + + + True + 6 + 6 + + + True + 2 + 2 + 12 + 6 + + + True + 4 + + + True + 10 + + + True + True + Enter a phone number and hit <enter>. + * + + + + + + + True + Browse + True + 0 + + + + False + False + 1 + + + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + 4 + + + True + 10 + + + True + True + Enter a phone number and hit <enter>. + * + + + + + + + + True + Phone Book + True + 0 + + + + False + False + 1 + + + + + 1 + 2 + 1 + 2 + + + + + + True + 0 + Postscript file: + + + GTK_FILL + + + + + + True + 0 + Fax number: + GTK_JUSTIFY_CENTER + + + 1 + 2 + GTK_FILL + + + + + + False + + + + + True + False + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + True + + + + + 1 + + + + + + + True + <b>New fax information</b> + True + + + label_item + + + + + + + True + Job + + + tab + False + + + + + True + 6 + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + 3 + 2 + 3 + 6 + + + True + True + Fine resolution + True + 0 + True + + + GTK_FILL + + + + + + True + 0 + + + 1 + 2 + GTK_FILL + + + + + + True + GNOME_DATE_EDIT_SHOW_TIME | GNOME_DATE_EDIT_24_HR + 0 + 23 + + + 1 + 2 + 2 + 3 + + + + + + True + True + Send immediately + True + 0 + True + True + + + + 2 + 3 + GTK_FILL + + + + + + True + True + * + + + 1 + 2 + 1 + 2 + + + + + + True + True + E-Mail job results to: + True + 0 + True + + + 1 + 2 + GTK_FILL + + + + + + + + + + True + <b>Facsimile Job Details</b> + True + + + label_item + + + + + 1 + + + + + True + Details + + + tab + 1 + False + + + + + 6 + 1 + + + + + True + GTK_BUTTONBOX_END + + + True + True + True + gtk-cancel + True + -6 + + + + + + True + Transmit the fax + 0 + + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-print + + + False + False + + + + + True + Send + True + + + False + False + 1 + + + + + + + + + 1 + + + + + False + GTK_PACK_END + + + + + + + True + Gfax - Phone Book Selection + True + 550 + 350 + True + GDK_WINDOW_TYPE_HINT_DIALOG + + + True + + + True + 6 + 0 + GTK_SHADOW_NONE + + + True + + + True + + + False + False + + + + + True + + + True + 0 + GTK_SHADOW_NONE + + + True + False + 5 + GTK_POLICY_NEVER + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + True + + + + + + + + True + Phone Books + + + label_item + + + + + False + False + + + + + True + 0 + GTK_SHADOW_NONE + + + True + False + 5 + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + True + + + + + + + + True + Phone Book Item List + + + label_item + + + + + 1 + + + + + 1 + + + + + + + True + 6 + + + True + 5 + x-office-address-book + + + + + True + <b><big>Current Phone Books</big></b> + True + + + False + False + 1 + + + + + label_item + + + + + 2 + + + + + True + GTK_BUTTONBOX_END + + + True + True + True + gtk-help + True + -11 + + + + + True + True + True + gtk-cancel + True + -6 + + + + 1 + + + + + True + True + True + gtk-ok + True + -5 + + + + 2 + + + + + False + GTK_PACK_END + + + + + + + True + Gfax - Phone books + 600 + + + + True + + + True + + + True + _File + True + + + + + True + Add + True + + + + True + gtk-add + 1 + + + + + + + True + Save and Close + True + + + + True + gtk-floppy + 1 + + + + + + + True + + + + + True + Delete + True + + + + True + gtk-delete + 1 + + + + + + + True + + + + + True + Close + True + + + + True + gtk-close + 1 + + + + + + + + + + + False + False + + + + + True + GTK_SHADOW_OUT + + + True + + + True + Save and Close + True + Save and close + True + gtk-save + + + + False + + + + + True + + + True + + + + + False + False + + + + + True + New phone book + True + Add + True + gtk-add + + + + False + + + + + True + Delete phone book + True + Delete + True + gtk-delete + + + + False + + + + + True + + + True + + + + + False + False + + + + + True + Close + True + Close + True + gtk-close + + + + False + + + + + + + False + 1 + + + + + True + + + False + 2 + + + + + True + 6 + 0 + GTK_SHADOW_NONE + + + True + + + True + + + True + 6 + 0 + GTK_SHADOW_NONE + + + True + + + + + + + + + + + True + Current Phone Book + + + label_item + + + + + False + 5 + + + + + True + 6 + 0 + GTK_SHADOW_NONE + + + True + 7 + 1 + + + True + 5 + + + True + True + * + + + + False + False + + + + + 1 + 2 + + + + + True + 5 + 5 + + + True + 5 + True + + + True + True + 0 + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-add + + + False + False + + + + + True + Add + True + + + False + False + 1 + + + + + + + + + + + True + True + 0 + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-apply + + + False + False + + + + + True + Update + True + + + False + False + 1 + + + + + + + + + 1 + + + + + + + True + True + 0 + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-clear + + + False + False + + + + + True + Clear + True + + + False + False + 1 + + + + + + + + + False + False + 1 + + + + + 6 + 7 + GTK_FILL + + + + + True + 5 + + + True + True + * + + + + False + False + + + + + 5 + 6 + GTK_FILL + + + + + True + 5 + + + True + True + * + + + + False + False + + + + + 3 + 4 + GTK_FILL + + + + + True + 0.05000000074505806 + Organization + GTK_JUSTIFY_CENTER + + + 4 + 5 + GTK_FILL + + + + + + True + 0.05000000074505806 + Contact + GTK_JUSTIFY_CENTER + + + 2 + 3 + GTK_FILL + + + + + + True + 0.05000000074505806 + Number + GTK_JUSTIFY_CENTER + + + GTK_FILL + + + + + + + + True + New Entry + + + label_item + + + + + False + 1 + + + + + False + False + + + + + True + 6 + 0 + GTK_SHADOW_NONE + + + True + False + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + 6 + True + + + + + + + + True + New Item + + + label_item + + + + + 5 + 1 + + + + + + + True + 2 + + + True + gtk-justify-fill + + + + + True + <b><big>Edit Phone book</big></b> + True + + + False + False + 1 + + + + + label_item + + + + + 3 + + + + + True + False + + + False + False + 4 + + + + + + diff --git a/intltool-extract.in b/intltool-extract.in new file mode 100644 index 0000000..ae393ac --- /dev/null +++ b/intltool-extract.in @@ -0,0 +1,875 @@ +#!@INTLTOOL_PERL@ -w +# -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 4 -*- + +# +# The Intltool Message Extractor +# +# Copyright (C) 2000-2001, 2003 Free Software Foundation. +# +# Intltool 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. +# +# Intltool 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., 675 Mass Ave, Cambridge, MA 02139, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. +# +# Authors: Kenneth Christiansen +# Darin Adler +# + +## Release information +my $PROGRAM = "intltool-extract"; +my $PACKAGE = "intltool"; +my $VERSION = "0.37.1"; + +## Loaded modules +use strict; +use File::Basename; +use Getopt::Long; + +## Scalars used by the option stuff +my $TYPE_ARG = "0"; +my $LOCAL_ARG = "0"; +my $HELP_ARG = "0"; +my $VERSION_ARG = "0"; +my $UPDATE_ARG = "0"; +my $QUIET_ARG = "0"; +my $SRCDIR_ARG = "."; + +my $FILE; +my $OUTFILE; + +my $gettext_type = ""; +my $input; +my %messages = (); +my %loc = (); +my %count = (); +my %comments = (); +my $strcount = 0; + +my $XMLCOMMENT = ""; + +## Use this instead of \w for XML files to handle more possible characters. +my $w = "[-A-Za-z0-9._:]"; + +## Always print first +$| = 1; + +## Handle options +GetOptions ( + "type=s" => \$TYPE_ARG, + "local|l" => \$LOCAL_ARG, + "help|h" => \$HELP_ARG, + "version|v" => \$VERSION_ARG, + "update" => \$UPDATE_ARG, + "quiet|q" => \$QUIET_ARG, + "srcdir=s" => \$SRCDIR_ARG, + ) or &error; + +&split_on_argument; + + +## Check for options. +## This section will check for the different options. + +sub split_on_argument { + + if ($VERSION_ARG) { + &version; + + } elsif ($HELP_ARG) { + &help; + + } elsif ($LOCAL_ARG) { + &place_local; + &extract; + + } elsif ($UPDATE_ARG) { + &place_normal; + &extract; + + } elsif (@ARGV > 0) { + &place_normal; + &message; + &extract; + + } else { + &help; + + } +} + +sub place_normal { + $FILE = $ARGV[0]; + $OUTFILE = "$FILE.h"; + + my $dirname = dirname ($OUTFILE); + if (! -d "$dirname" && $dirname ne "") { + system ("mkdir -p $dirname"); + } +} + +sub place_local { + $FILE = $ARGV[0]; + $OUTFILE = fileparse($FILE, ()); + if (!-e "tmp/") { + system("mkdir tmp/"); + } + $OUTFILE = "./tmp/$OUTFILE.h" +} + +sub determine_type { + if ($TYPE_ARG =~ /^gettext\/(.*)/) { + $gettext_type=$1 + } +} + +## Sub for printing release information +sub version{ + print <<_EOF_; +${PROGRAM} (${PACKAGE}) $VERSION +Copyright (C) 2000, 2003 Free Software Foundation, Inc. +Written by Kenneth Christiansen, 2000. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +_EOF_ + exit; +} + +## Sub for printing usage information +sub help { + print <<_EOF_; +Usage: ${PROGRAM} [OPTION]... [FILENAME] +Generates a header file from an XML source file. + +It grabs all strings between <_translatable_node> and its end tag in +XML files. Read manpage (man ${PROGRAM}) for more info. + + --type=TYPE Specify the file type of FILENAME. Currently supports: + "gettext/glade", "gettext/ini", "gettext/keys" + "gettext/rfc822deb", "gettext/schemas", + "gettext/scheme", "gettext/xml", "gettext/quoted", + "gettext/quotedxml" + -l, --local Writes output into current working directory + (conflicts with --update) + --update Writes output into the same directory the source file + reside (conflicts with --local) + --srcdir Root of the source tree + -v, --version Output version information and exit + -h, --help Display this help and exit + -q, --quiet Quiet mode + +Report bugs to http://bugzilla.gnome.org/ (product name "$PACKAGE") +or send email to . +_EOF_ + exit; +} + +## Sub for printing error messages +sub error{ + print STDERR "Try `${PROGRAM} --help' for more information.\n"; + exit; +} + +sub message { + print "Generating C format header file for translation.\n" unless $QUIET_ARG; +} + +sub extract { + &determine_type; + + &convert; + + open OUT, ">$OUTFILE"; + binmode (OUT) if $^O eq 'MSWin32'; + &msg_write; + close OUT; + + print "Wrote $OUTFILE\n" unless $QUIET_ARG; +} + +sub convert { + + ## Reading the file + { + local (*IN); + local $/; #slurp mode + open (IN, "<$SRCDIR_ARG/$FILE") || die "can't open $SRCDIR_ARG/$FILE: $!"; + $input = ; + } + + &type_ini if $gettext_type eq "ini"; + &type_keys if $gettext_type eq "keys"; + &type_xml if $gettext_type eq "xml"; + &type_glade if $gettext_type eq "glade"; + &type_scheme if $gettext_type eq "scheme"; + &type_schemas if $gettext_type eq "schemas"; + &type_rfc822deb if $gettext_type eq "rfc822deb"; + &type_quoted if $gettext_type eq "quoted"; + &type_quotedxml if $gettext_type eq "quotedxml"; +} + +sub entity_decode_minimal +{ + local ($_) = @_; + + s/'/'/g; # ' + s/"/"/g; # " + s/&/&/g; + + return $_; +} + +sub entity_decode +{ + local ($_) = @_; + + s/'/'/g; # ' + s/"/"/g; # " + s/<//g; + s/&/&/g; + + return $_; +} + +sub escape_char +{ + return '\"' if $_ eq '"'; + return '\n' if $_ eq "\n"; + return '\\\\' if $_ eq '\\'; + + return $_; +} + +sub escape +{ + my ($string) = @_; + return join "", map &escape_char, split //, $string; +} + +sub type_ini { + ### For generic translatable desktop files ### + while ($input =~ /^(#(.+)\n)?^_.*=(.*)$/mg) { + if (defined($2)) { + $comments{$3} = $2; + } + $messages{$3} = []; + } +} + +sub type_keys { + ### For generic translatable mime/keys files ### + while ($input =~ /^\s*_\w+=(.*)$/mg) { + $messages{$1} = []; + } +} + +sub type_xml { + ### For generic translatable XML files ### + my $tree = readXml($input); + parseTree(0, $tree); +} + +sub print_var { + my $var = shift; + my $vartype = ref $var; + + if ($vartype =~ /ARRAY/) { + my @arr = @{$var}; + print "[ "; + foreach my $el (@arr) { + print_var($el); + print ", "; + } + print "] "; + } elsif ($vartype =~ /HASH/) { + my %hash = %{$var}; + print "{ "; + foreach my $key (keys %hash) { + print "$key => "; + print_var($hash{$key}); + print ", "; + } + print "} "; + } else { + print $var; + } +} + +# Same syntax as getAttributeString in intltool-merge.in.in, similar logic (look for ## differences comment) +sub getAttributeString +{ + my $sub = shift; + my $do_translate = shift || 1; + my $language = shift || ""; + my $translate = shift; + my $result = ""; + foreach my $e (reverse(sort(keys %{ $sub }))) { + my $key = $e; + my $string = $sub->{$e}; + my $quote = '"'; + + $string =~ s/^[\s]+//; + $string =~ s/[\s]+$//; + + if ($string =~ /^'.*'$/) + { + $quote = "'"; + } + $string =~ s/^['"]//g; + $string =~ s/['"]$//g; + + ## differences from intltool-merge.in.in + if ($key =~ /^_/) { + $comments{entity_decode($string)} = $XMLCOMMENT if $XMLCOMMENT; + $messages{entity_decode($string)} = []; + $$translate = 2; + } + ## differences end here from intltool-merge.in.in + $result .= " $key=$quote$string$quote"; + } + return $result; +} + +# Verbatim copy from intltool-merge.in.in +sub getXMLstring +{ + my $ref = shift; + my $spacepreserve = shift || 0; + my @list = @{ $ref }; + my $result = ""; + + my $count = scalar(@list); + my $attrs = $list[0]; + my $index = 1; + + $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/)); + $spacepreserve = 0 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?default["']?$/)); + + while ($index < $count) { + my $type = $list[$index]; + my $content = $list[$index+1]; + if (! $type ) { + # We've got CDATA + if ($content) { + # lets strip the whitespace here, and *ONLY* here + $content =~ s/\s+/ /gs if (!$spacepreserve); + $result .= $content; + } + } elsif ( "$type" ne "1" ) { + # We've got another element + $result .= "<$type"; + $result .= getAttributeString(@{$content}[0], 0); # no nested translatable elements + if ($content) { + my $subresult = getXMLstring($content, $spacepreserve); + if ($subresult) { + $result .= ">".$subresult . ""; + } else { + $result .= "/>"; + } + } else { + $result .= "/>"; + } + } + $index += 2; + } + return $result; +} + +# Verbatim copy from intltool-merge.in.in, except for MULTIPLE_OUTPUT handling removed +# Translate list of nodes if necessary +sub translate_subnodes +{ + my $fh = shift; + my $content = shift; + my $language = shift || ""; + my $singlelang = shift || 0; + my $spacepreserve = shift || 0; + + my @nodes = @{ $content }; + + my $count = scalar(@nodes); + my $index = 0; + while ($index < $count) { + my $type = $nodes[$index]; + my $rest = $nodes[$index+1]; + traverse($fh, $type, $rest, $language, $spacepreserve); + $index += 2; + } +} + +# Based on traverse() in intltool-merge.in.in +sub traverse +{ + my $fh = shift; # unused, to allow us to sync code between -merge and -extract + my $nodename = shift; + my $content = shift; + my $language = shift || ""; + my $spacepreserve = shift || 0; + + if ($nodename && "$nodename" eq "1") { + $XMLCOMMENT = $content; + } elsif ($nodename) { + # element + my @all = @{ $content }; + my $attrs = shift @all; + my $translate = 0; + my $outattr = getAttributeString($attrs, 1, $language, \$translate); + + if ($nodename =~ /^_/) { + $translate = 1; + $nodename =~ s/^_//; + } + my $lookup = ''; + + $spacepreserve = 0 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?default["']?$/)); + $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/)); + + if ($translate) { + $lookup = getXMLstring($content, $spacepreserve); + if (!$spacepreserve) { + $lookup =~ s/^\s+//s; + $lookup =~ s/\s+$//s; + } + + if ($lookup && $translate != 2) { + $comments{$lookup} = $XMLCOMMENT if $XMLCOMMENT; + $messages{$lookup} = []; + } elsif ($translate == 2) { + translate_subnodes($fh, \@all, $language, 1, $spacepreserve); + } + } else { + $XMLCOMMENT = ""; + my $count = scalar(@all); + if ($count > 0) { + my $index = 0; + while ($index < $count) { + my $type = $all[$index]; + my $rest = $all[$index+1]; + traverse($fh, $type, $rest, $language, $spacepreserve); + $index += 2; + } + } + } + $XMLCOMMENT = ""; + } +} + + +# Verbatim copy from intltool-merge.in.in, $fh for compatibility +sub parseTree +{ + my $fh = shift; + my $ref = shift; + my $language = shift || ""; + + my $name = shift @{ $ref }; + my $cont = shift @{ $ref }; + + while (!$name || "$name" eq "1") { + $name = shift @{ $ref }; + $cont = shift @{ $ref }; + } + + my $spacepreserve = 0; + my $attrs = @{$cont}[0]; + $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/)); + + traverse($fh, $name, $cont, $language, $spacepreserve); +} + +# Verbatim copy from intltool-merge.in.in +sub intltool_tree_comment +{ + my $expat = shift; + my $data = $expat->original_string(); + my $clist = $expat->{Curlist}; + my $pos = $#$clist; + + $data =~ s/^$//s; + push @$clist, 1 => $data; +} + +# Verbatim copy from intltool-merge.in.in +sub intltool_tree_cdatastart +{ + my $expat = shift; + my $clist = $expat->{Curlist}; + my $pos = $#$clist; + + push @$clist, 0 => $expat->original_string(); +} + +# Verbatim copy from intltool-merge.in.in +sub intltool_tree_cdataend +{ + my $expat = shift; + my $clist = $expat->{Curlist}; + my $pos = $#$clist; + + $clist->[$pos] .= $expat->original_string(); +} + +# Verbatim copy from intltool-merge.in.in +sub intltool_tree_char +{ + my $expat = shift; + my $text = shift; + my $clist = $expat->{Curlist}; + my $pos = $#$clist; + + # Use original_string so that we retain escaped entities + # in CDATA sections. + # + if ($pos > 0 and $clist->[$pos - 1] eq '0') { + $clist->[$pos] .= $expat->original_string(); + } else { + push @$clist, 0 => $expat->original_string(); + } +} + +# Verbatim copy from intltool-merge.in.in +sub intltool_tree_start +{ + my $expat = shift; + my $tag = shift; + my @origlist = (); + + # Use original_string so that we retain escaped entities + # in attribute values. We must convert the string to an + # @origlist array to conform to the structure of the Tree + # Style. + # + my @original_array = split /\x/, $expat->original_string(); + my $source = $expat->original_string(); + + # Remove leading tag. + # + $source =~ s|^\s*<\s*(\S+)||s; + + # Grab attribute key/value pairs and push onto @origlist array. + # + while ($source) + { + if ($source =~ /^\s*([\w:-]+)\s*[=]\s*["]/) + { + $source =~ s|^\s*([\w:-]+)\s*[=]\s*["]([^"]*)["]||s; + push @origlist, $1; + push @origlist, '"' . $2 . '"'; + } + elsif ($source =~ /^\s*([\w:-]+)\s*[=]\s*[']/) + { + $source =~ s|^\s*([\w:-]+)\s*[=]\s*[']([^']*)[']||s; + push @origlist, $1; + push @origlist, "'" . $2 . "'"; + } + else + { + last; + } + } + + my $ol = [ { @origlist } ]; + + push @{ $expat->{Lists} }, $expat->{Curlist}; + push @{ $expat->{Curlist} }, $tag => $ol; + $expat->{Curlist} = $ol; +} + +# Copied from intltool-merge.in.in and added comment handler. +sub readXml +{ + my $xmldoc = shift || return; + my $ret = eval 'require XML::Parser'; + if(!$ret) { + die "You must have XML::Parser installed to run $0\n\n"; + } + my $xp = new XML::Parser(Style => 'Tree'); + $xp->setHandlers(Char => \&intltool_tree_char); + $xp->setHandlers(Start => \&intltool_tree_start); + $xp->setHandlers(CdataStart => \&intltool_tree_cdatastart); + $xp->setHandlers(CdataEnd => \&intltool_tree_cdataend); + + ## differences from intltool-merge.in.in + $xp->setHandlers(Comment => \&intltool_tree_comment); + ## differences end here from intltool-merge.in.in + + my $tree = $xp->parse($xmldoc); + #print_var($tree); + +# Hello thereHowdydo +# would be: +# [foo, [{}, 1, "comment", head, [{id => "a"}, 0, "Hello ", em, [{}, 0, "there"]], bar, +# [{}, 0, "Howdy", ref, [{}]], 0, "do" ] ] + + return $tree; +} + +sub type_schemas { + ### For schemas XML files ### + + # FIXME: We should handle escaped < (less than) + while ($input =~ / + \s* + (\s*(?:\s*)?(.*?)\s*<\/default>\s*)? + (\s*(?:\s*)?(.*?)\s*<\/short>\s*)? + (\s*(?:\s*)?(.*?)\s*<\/long>\s*)? + <\/locale> + /sgx) { + my @totranslate = ($3,$6,$9); + my @eachcomment = ($2,$5,$8); + foreach (@totranslate) { + my $currentcomment = shift @eachcomment; + next if !$_; + s/\s+/ /g; + $messages{entity_decode_minimal($_)} = []; + $comments{entity_decode_minimal($_)} = $currentcomment if (defined($currentcomment)); + } + } +} + +sub type_rfc822deb { + ### For rfc822-style Debian configuration files ### + + my $lineno = 1; + my $type = ''; + while ($input =~ /\G(.*?)(^|\n)(_+)([^:]+):[ \t]*(.*?)(?=\n\S|$)/sg) + { + my ($pre, $newline, $underscore, $tag, $text) = ($1, $2, $3, $4, $5); + while ($pre =~ m/\n/g) + { + $lineno ++; + } + $lineno += length($newline); + my @str_list = rfc822deb_split(length($underscore), $text); + for my $str (@str_list) + { + $strcount++; + $messages{$str} = []; + $loc{$str} = $lineno; + $count{$str} = $strcount; + my $usercomment = ''; + while($pre =~ s/(^|\n)#([^\n]*)$//s) + { + $usercomment = "\n" . $2 . $usercomment; + } + $comments{$str} = $tag . $usercomment; + } + $lineno += ($text =~ s/\n//g); + } +} + +sub rfc822deb_split { + # Debian defines a special way to deal with rfc822-style files: + # when a value contain newlines, it consists of + # 1. a short form (first line) + # 2. a long description, all lines begin with a space, + # and paragraphs are separated by a single dot on a line + # This routine returns an array of all paragraphs, and reformat + # them. + # When first argument is 2, the string is a comma separated list of + # values. + my $type = shift; + my $text = shift; + $text =~ s/^[ \t]//mg; + return (split(/, */, $text, 0)) if $type ne 1; + return ($text) if $text !~ /\n/; + + $text =~ s/([^\n]*)\n//; + my @list = ($1); + my $str = ''; + for my $line (split (/\n/, $text)) + { + chomp $line; + if ($line =~ /^\.\s*$/) + { + # New paragraph + $str =~ s/\s*$//; + push(@list, $str); + $str = ''; + } + elsif ($line =~ /^\s/) + { + # Line which must not be reformatted + $str .= "\n" if length ($str) && $str !~ /\n$/; + $line =~ s/\s+$//; + $str .= $line."\n"; + } + else + { + # Continuation line, remove newline + $str .= " " if length ($str) && $str !~ /\n$/; + $str .= $line; + } + } + $str =~ s/\s*$//; + push(@list, $str) if length ($str); + return @list; +} + +sub type_quoted { + while ($input =~ /\"(([^\"]|\\\")*[^\\\"])\"/g) { + my $message = $1; + my $before = $`; + $message =~ s/\\\"/\"/g; + $before =~ s/[^\n]//g; + $messages{$message} = []; + $loc{$message} = length ($before) + 2; + } +} + +sub type_quotedxml { + while ($input =~ /\"(([^\"]|\\\")*[^\\\"])\"/g) { + my $message = $1; + my $before = $`; + $message =~ s/\\\"/\"/g; + $message = entity_decode($message); + $before =~ s/[^\n]//g; + $messages{$message} = []; + $loc{$message} = length ($before) + 2; + } +} + +sub type_glade { + ### For translatable Glade XML files ### + + my $tags = "label|title|text|format|copyright|comments|preview_text|tooltip|message"; + + while ($input =~ /<($tags)>([^<]+)<\/($tags)>/sg) { + # Glade sometimes uses tags that normally mark translatable things for + # little bits of non-translatable content. We work around this by not + # translating strings that only includes something like label4 or window1. + $messages{entity_decode($2)} = [] unless $2 =~ /^(window|label|dialog)[0-9]+$/; + } + + while ($input =~ /(..[^<]*)<\/items>/sg) { + for my $item (split (/\n/, $1)) { + $messages{entity_decode($item)} = []; + } + } + + ## handle new glade files + while ($input =~ /<(property|atkproperty|col)\s+[^>]*translatable\s*=\s*"yes"(?:\s+[^>]*comments\s*=\s*"([^"]*)")?[^>]*>([^<]+)<\/\1>/sg) { + $messages{entity_decode($3)} = [] unless $3 =~ /^(window|label)[0-9]+$/; + if (defined($2) and !($3 =~ /^(window|label)[0-9]+$/)) { + $comments{entity_decode($3)} = entity_decode($2) ; + } + } + while ($input =~ /]*)"\s+description="([^>]+)"\/>/sg) { + $messages{entity_decode_minimal($2)} = []; + } +} + +sub type_scheme { + my ($line, $i, $state, $str, $trcomment, $char); + for $line (split(/\n/, $input)) { + $i = 0; + $state = 0; # 0 - nothing, 1 - string, 2 - translatable string + while ($i < length($line)) { + if (substr($line,$i,1) eq "\"") { + if ($state == 2) { + $comments{$str} = $trcomment if ($trcomment); + $messages{$str} = []; + $str = ''; + $state = 0; $trcomment = ""; + } elsif ($state == 1) { + $str = ''; + $state = 0; $trcomment = ""; + } else { + $state = 1; + $str = ''; + if ($i>0 && substr($line,$i-1,1) eq '_') { + $state = 2; + } + } + } elsif (!$state) { + if (substr($line,$i,1) eq ";") { + $trcomment = substr($line,$i+1); + $trcomment =~ s/^;*\s*//; + $i = length($line); + } elsif ($trcomment && substr($line,$i,1) !~ /\s|\(|\)|_/) { + $trcomment = ""; + } + } else { + if (substr($line,$i,1) eq "\\") { + $char = substr($line,$i+1,1); + if ($char ne "\"" && $char ne "\\") { + $str = $str . "\\"; + } + $i++; + } + $str = $str . substr($line,$i,1); + } + $i++; + } + } +} + +sub msg_write { + my @msgids; + if (%count) + { + @msgids = sort { $count{$a} <=> $count{$b} } keys %count; + } + else + { + @msgids = sort keys %messages; + } + for my $message (@msgids) + { + my $offsetlines = 1; + $offsetlines++ if $message =~ /%/; + if (defined ($comments{$message})) + { + while ($comments{$message} =~ m/\n/g) + { + $offsetlines++; + } + } + print OUT "# ".($loc{$message} - $offsetlines). " \"$FILE\"\n" + if defined $loc{$message}; + print OUT "/* ".$comments{$message}." */\n" + if defined $comments{$message}; + print OUT "/* xgettext:no-c-format */\n" if $message =~ /%/; + + my @lines = split (/\n/, $message, -1); + for (my $n = 0; $n < @lines; $n++) + { + if ($n == 0) + { + print OUT "char *s = N_(\""; + } + else + { + print OUT " \""; + } + + print OUT escape($lines[$n]); + + if ($n < @lines - 1) + { + print OUT "\\n\"\n"; + } + else + { + print OUT "\");\n"; + } + } + } +} + diff --git a/intltool-merge.in b/intltool-merge.in new file mode 100644 index 0000000..60c3f3e --- /dev/null +++ b/intltool-merge.in @@ -0,0 +1,1506 @@ +#!@INTLTOOL_PERL@ -w +# -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 4 -*- + +# +# The Intltool Message Merger +# +# Copyright (C) 2000, 2003 Free Software Foundation. +# Copyright (C) 2000, 2001 Eazel, Inc +# +# Intltool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# version 2 published by the Free Software Foundation. +# +# Intltool 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., 675 Mass Ave, Cambridge, MA 02139, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. +# +# Authors: Maciej Stachowiak +# Kenneth Christiansen +# Darin Adler +# +# Proper XML UTF-8'ification written by Cyrille Chepelov +# + +## Release information +my $PROGRAM = "intltool-merge"; +my $PACKAGE = "intltool"; +my $VERSION = "0.37.1"; + +## Loaded modules +use strict; +use Getopt::Long; +use Text::Wrap; +use File::Basename; + +my $must_end_tag = -1; +my $last_depth = -1; +my $translation_depth = -1; +my @tag_stack = (); +my @entered_tag = (); +my @translation_strings = (); +my $leading_space = ""; + +## Scalars used by the option stuff +my $HELP_ARG = 0; +my $VERSION_ARG = 0; +my $BA_STYLE_ARG = 0; +my $XML_STYLE_ARG = 0; +my $KEYS_STYLE_ARG = 0; +my $DESKTOP_STYLE_ARG = 0; +my $SCHEMAS_STYLE_ARG = 0; +my $RFC822DEB_STYLE_ARG = 0; +my $QUOTED_STYLE_ARG = 0; +my $QUOTEDXML_STYLE_ARG = 0; +my $QUIET_ARG = 0; +my $PASS_THROUGH_ARG = 0; +my $UTF8_ARG = 0; +my $MULTIPLE_OUTPUT = 0; +my $cache_file; + +## Handle options +GetOptions +( + "help" => \$HELP_ARG, + "version" => \$VERSION_ARG, + "quiet|q" => \$QUIET_ARG, + "oaf-style|o" => \$BA_STYLE_ARG, ## for compatibility + "ba-style|b" => \$BA_STYLE_ARG, + "xml-style|x" => \$XML_STYLE_ARG, + "keys-style|k" => \$KEYS_STYLE_ARG, + "desktop-style|d" => \$DESKTOP_STYLE_ARG, + "schemas-style|s" => \$SCHEMAS_STYLE_ARG, + "rfc822deb-style|r" => \$RFC822DEB_STYLE_ARG, + "quoted-style" => \$QUOTED_STYLE_ARG, + "quotedxml-style" => \$QUOTEDXML_STYLE_ARG, + "pass-through|p" => \$PASS_THROUGH_ARG, + "utf8|u" => \$UTF8_ARG, + "multiple-output|m" => \$MULTIPLE_OUTPUT, + "cache|c=s" => \$cache_file + ) or &error; + +my $PO_DIR; +my $FILE; +my $OUTFILE; + +my %po_files_by_lang = (); +my %translations = (); +my $iconv = $ENV{"ICONV"} || "iconv"; +my $devnull = ($^O eq 'MSWin32' ? 'NUL:' : '/dev/null'); + +sub isProgramInPath +{ + my ($file) = @_; + # If either a file exists, or when run it returns 0 exit status + return 1 if ((-x $file) or (system("$file -l >$devnull") == 0)); + return 0; +} + +if (! isProgramInPath ("$iconv")) +{ + print STDERR " *** iconv is not found on this system!\n". + " *** Without it, intltool-merge can not convert encodings.\n"; + exit; +} + +# Use this instead of \w for XML files to handle more possible characters. +my $w = "[-A-Za-z0-9._:]"; + +# XML quoted string contents +my $q = "[^\\\"]*"; + +## Check for options. + +if ($VERSION_ARG) +{ + &print_version; +} +elsif ($HELP_ARG) +{ + &print_help; +} +elsif ($BA_STYLE_ARG && @ARGV > 2) +{ + &utf8_sanity_check; + &preparation; + &print_message; + &ba_merge_translations; + &finalize; +} +elsif ($XML_STYLE_ARG && @ARGV > 2) +{ + &utf8_sanity_check; + &preparation; + &print_message; + &xml_merge_output; + &finalize; +} +elsif ($KEYS_STYLE_ARG && @ARGV > 2) +{ + &utf8_sanity_check; + &preparation; + &print_message; + &keys_merge_translations; + &finalize; +} +elsif ($DESKTOP_STYLE_ARG && @ARGV > 2) +{ + &utf8_sanity_check; + &preparation; + &print_message; + &desktop_merge_translations; + &finalize; +} +elsif ($SCHEMAS_STYLE_ARG && @ARGV > 2) +{ + &utf8_sanity_check; + &preparation; + &print_message; + &schemas_merge_translations; + &finalize; +} +elsif ($RFC822DEB_STYLE_ARG && @ARGV > 2) +{ + &preparation; + &print_message; + &rfc822deb_merge_translations; + &finalize; +} +elsif (($QUOTED_STYLE_ARG || $QUOTEDXML_STYLE_ARG) && @ARGV > 2) +{ + &utf8_sanity_check; + &preparation; + &print_message; + "ed_merge_translations($QUOTEDXML_STYLE_ARG); + &finalize; +} +else +{ + &print_help; +} + +exit; + +## Sub for printing release information +sub print_version +{ + print <<_EOF_; +${PROGRAM} (${PACKAGE}) ${VERSION} +Written by Maciej Stachowiak, Darin Adler and Kenneth Christiansen. + +Copyright (C) 2000-2003 Free Software Foundation, Inc. +Copyright (C) 2000-2001 Eazel, Inc. +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +_EOF_ + exit; +} + +## Sub for printing usage information +sub print_help +{ + print <<_EOF_; +Usage: ${PROGRAM} [OPTION]... PO_DIRECTORY FILENAME OUTPUT_FILE +Generates an output file that includes some localized attributes from an +untranslated source file. + +Mandatory options: (exactly one must be specified) + -b, --ba-style includes translations in the bonobo-activation style + -d, --desktop-style includes translations in the desktop style + -k, --keys-style includes translations in the keys style + -s, --schemas-style includes translations in the schemas style + -r, --rfc822deb-style includes translations in the RFC822 style + --quoted-style includes translations in the quoted string style + --quotedxml-style includes translations in the quoted xml string style + -x, --xml-style includes translations in the standard xml style + +Other options: + -u, --utf8 convert all strings to UTF-8 before merging + (default for everything except RFC822 style) + -p, --pass-through deprecated, does nothing and issues a warning + -m, --multiple-output output one localized file per locale, instead of + a single file containing all localized elements + -c, --cache=FILE specify cache file name + (usually \$top_builddir/po/.intltool-merge-cache) + -q, --quiet suppress most messages + --help display this help and exit + --version output version information and exit + +Report bugs to http://bugzilla.gnome.org/ (product name "$PACKAGE") +or send email to . +_EOF_ + exit; +} + + +## Sub for printing error messages +sub print_error +{ + print STDERR "Try `${PROGRAM} --help' for more information.\n"; + exit; +} + + +sub print_message +{ + print "Merging translations into $OUTFILE.\n" unless $QUIET_ARG; +} + + +sub preparation +{ + $PO_DIR = $ARGV[0]; + $FILE = $ARGV[1]; + $OUTFILE = $ARGV[2]; + + &gather_po_files; + &get_translation_database; +} + +# General-purpose code for looking up translations in .po files + +sub po_file2lang +{ + my ($tmp) = @_; + $tmp =~ s/^.*\/(.*)\.po$/$1/; + return $tmp; +} + +sub gather_po_files +{ + if (my $linguas = $ENV{"LINGUAS"}) + { + for my $lang (split / /, $linguas) { + my $po_file = $PO_DIR . "/" . $lang . ".po"; + if (-e $po_file) { + $po_files_by_lang{$lang} = $po_file; + } + } + } + else + { + if (open LINGUAS_FILE, "$PO_DIR/LINGUAS") + { + while () + { + next if /^#/; + + for my $lang (split) + { + chomp ($lang); + my $po_file = $PO_DIR . "/" . $lang . ".po"; + if (-e $po_file) { + $po_files_by_lang{$lang} = $po_file; + } + } + } + + close LINGUAS_FILE; + } + else + { + for my $po_file (glob "$PO_DIR/*.po") { + $po_files_by_lang{po_file2lang($po_file)} = $po_file; + } + } + } +} + +sub get_local_charset +{ + my ($encoding) = @_; + my $alias_file = $ENV{"G_CHARSET_ALIAS"} || "@INTLTOOL_LIBDIR@/charset.alias"; + + # seek character encoding aliases in charset.alias (glib) + + if (open CHARSET_ALIAS, $alias_file) + { + while () + { + next if /^\#/; + return $1 if (/^\s*([-._a-zA-Z0-9]+)\s+$encoding\b/i) + } + + close CHARSET_ALIAS; + } + + # if not found, return input string + + return $encoding; +} + +sub get_po_encoding +{ + my ($in_po_file) = @_; + my $encoding = ""; + + open IN_PO_FILE, $in_po_file or die; + while () + { + ## example: "Content-Type: text/plain; charset=ISO-8859-1\n" + if (/Content-Type\:.*charset=([-a-zA-Z0-9]+)\\n/) + { + $encoding = $1; + last; + } + } + close IN_PO_FILE; + + if (!$encoding) + { + print STDERR "Warning: no encoding found in $in_po_file. Assuming ISO-8859-1\n" unless $QUIET_ARG; + $encoding = "ISO-8859-1"; + } + + system ("$iconv -f $encoding -t UTF-8 <$devnull 2>$devnull"); + if ($?) { + $encoding = get_local_charset($encoding); + } + + return $encoding +} + +sub utf8_sanity_check +{ + print STDERR "Warning: option --pass-through has been removed.\n" if $PASS_THROUGH_ARG; + $UTF8_ARG = 1; +} + +sub get_translation_database +{ + if ($cache_file) { + &get_cached_translation_database; + } else { + &create_translation_database; + } +} + +sub get_newest_po_age +{ + my $newest_age; + + foreach my $file (values %po_files_by_lang) + { + my $file_age = -M $file; + $newest_age = $file_age if !$newest_age || $file_age < $newest_age; + } + + $newest_age = 0 if !$newest_age; + + return $newest_age; +} + +sub create_cache +{ + print "Generating and caching the translation database\n" unless $QUIET_ARG; + + &create_translation_database; + + open CACHE, ">$cache_file" || die; + print CACHE join "\x01", %translations; + close CACHE; +} + +sub load_cache +{ + print "Found cached translation database\n" unless $QUIET_ARG; + + my $contents; + open CACHE, "<$cache_file" || die; + { + local $/; + $contents = ; + } + close CACHE; + %translations = split "\x01", $contents; +} + +sub get_cached_translation_database +{ + my $cache_file_age = -M $cache_file; + if (defined $cache_file_age) + { + if ($cache_file_age <= &get_newest_po_age) + { + &load_cache; + return; + } + print "Found too-old cached translation database\n" unless $QUIET_ARG; + } + + &create_cache; +} + +sub create_translation_database +{ + for my $lang (keys %po_files_by_lang) + { + my $po_file = $po_files_by_lang{$lang}; + + if ($UTF8_ARG) + { + my $encoding = get_po_encoding ($po_file); + + if (lc $encoding eq "utf-8") + { + open PO_FILE, "<$po_file"; + } + else + { + print "NOTICE: $po_file is not in UTF-8 but $encoding, converting...\n" unless $QUIET_ARG;; + + open PO_FILE, "$iconv -f $encoding -t UTF-8 $po_file|"; + } + } + else + { + open PO_FILE, "<$po_file"; + } + + my $nextfuzzy = 0; + my $inmsgid = 0; + my $inmsgstr = 0; + my $msgid = ""; + my $msgstr = ""; + + while () + { + $nextfuzzy = 1 if /^#, fuzzy/; + + if (/^msgid "((\\.|[^\\]+)*)"/ ) + { + $translations{$lang, $msgid} = $msgstr if $inmsgstr && $msgid && $msgstr; + $msgid = ""; + $msgstr = ""; + + if ($nextfuzzy) { + $inmsgid = 0; + } else { + $msgid = unescape_po_string($1); + $inmsgid = 1; + } + $inmsgstr = 0; + $nextfuzzy = 0; + } + + if (/^msgstr "((\\.|[^\\]+)*)"/) + { + $msgstr = unescape_po_string($1); + $inmsgstr = 1; + $inmsgid = 0; + } + + if (/^"((\\.|[^\\]+)*)"/) + { + $msgid .= unescape_po_string($1) if $inmsgid; + $msgstr .= unescape_po_string($1) if $inmsgstr; + } + } + $translations{$lang, $msgid} = $msgstr if $inmsgstr && $msgid && $msgstr; + } +} + +sub finalize +{ +} + +sub unescape_one_sequence +{ + my ($sequence) = @_; + + return "\\" if $sequence eq "\\\\"; + return "\"" if $sequence eq "\\\""; + return "\n" if $sequence eq "\\n"; + return "\r" if $sequence eq "\\r"; + return "\t" if $sequence eq "\\t"; + return "\b" if $sequence eq "\\b"; + return "\f" if $sequence eq "\\f"; + return "\a" if $sequence eq "\\a"; + return chr(11) if $sequence eq "\\v"; # vertical tab, see ascii(7) + + return chr(hex($1)) if ($sequence =~ /\\x([0-9a-fA-F]{2})/); + return chr(oct($1)) if ($sequence =~ /\\([0-7]{3})/); + + # FIXME: Is \0 supported as well? Kenneth and Rodney don't want it, see bug #48489 + + return $sequence; +} + +sub unescape_po_string +{ + my ($string) = @_; + + $string =~ s/(\\x[0-9a-fA-F]{2}|\\[0-7]{3}|\\.)/unescape_one_sequence($1)/eg; + + return $string; +} + +sub entity_decode +{ + local ($_) = @_; + + s/'/'/g; # ' + s/"/"/g; # " + s/<//g; + s/&/&/g; + + return $_; +} + +# entity_encode: (string) +# +# Encode the given string to XML format (encode '<' etc). + +sub entity_encode +{ + my ($pre_encoded) = @_; + + my @list_of_chars = unpack ('C*', $pre_encoded); + + # with UTF-8 we only encode minimalistic + return join ('', map (&entity_encode_int_minimalist, @list_of_chars)); +} + +sub entity_encode_int_minimalist +{ + return """ if $_ == 34; + return "&" if $_ == 38; + return "'" if $_ == 39; + return "<" if $_ == 60; + return ">" if $_ == 62; + return chr $_; +} + +sub entity_encoded_translation +{ + my ($lang, $string) = @_; + + my $translation = $translations{$lang, $string}; + return $string if !$translation; + return entity_encode ($translation); +} + +## XML (bonobo-activation specific) merge code + +sub ba_merge_translations +{ + my $source; + + { + local $/; # slurp mode + open INPUT, "<$FILE" or die "can't open $FILE: $!"; + $source = ; + close INPUT; + } + + open OUTPUT, ">$OUTFILE" or die "can't open $OUTFILE: $!"; + # Binmode so that selftest works ok if using a native Win32 Perl... + binmode (OUTPUT) if $^O eq 'MSWin32'; + + while ($source =~ s|^(.*?)([ \t]*<\s*$w+\s+($w+\s*=\s*"$q"\s*)+/?>)([ \t]*\n)?||s) + { + print OUTPUT $1; + + my $node = $2 . "\n"; + + my @strings = (); + $_ = $node; + while (s/(\s)_($w+\s*=\s*"($q)")/$1$2/s) { + push @strings, entity_decode($3); + } + print OUTPUT; + + my %langs; + for my $string (@strings) + { + for my $lang (keys %po_files_by_lang) + { + $langs{$lang} = 1 if $translations{$lang, $string}; + } + } + + for my $lang (sort keys %langs) + { + $_ = $node; + s/(\sname\s*=\s*)"($q)"/$1"$2-$lang"/s; + s/(\s)_($w+\s*=\s*")($q)"/$1 . $2 . entity_encoded_translation($lang, $3) . '"'/seg; + print OUTPUT; + } + } + + print OUTPUT $source; + + close OUTPUT; +} + + +## XML (non-bonobo-activation) merge code + + +# Process tag attributes +# Only parameter is a HASH containing attributes -> values mapping +sub getAttributeString +{ + my $sub = shift; + my $do_translate = shift || 0; + my $language = shift || ""; + my $result = ""; + my $translate = shift; + foreach my $e (reverse(sort(keys %{ $sub }))) { + my $key = $e; + my $string = $sub->{$e}; + my $quote = '"'; + + $string =~ s/^[\s]+//; + $string =~ s/[\s]+$//; + + if ($string =~ /^'.*'$/) + { + $quote = "'"; + } + $string =~ s/^['"]//g; + $string =~ s/['"]$//g; + + if ($do_translate && $key =~ /^_/) { + $key =~ s|^_||g; + if ($language) { + # Handle translation + my $decode_string = entity_decode($string); + my $translation = $translations{$language, $decode_string}; + if ($translation) { + $translation = entity_encode($translation); + $string = $translation; + } + $$translate = 2; + } else { + $$translate = 2 if ($translate && (!$$translate)); # watch not to "overwrite" $translate + } + } + + $result .= " $key=$quote$string$quote"; + } + return $result; +} + +# Returns a translatable string from XML node, it works on contents of every node in XML::Parser tree +sub getXMLstring +{ + my $ref = shift; + my $spacepreserve = shift || 0; + my @list = @{ $ref }; + my $result = ""; + + my $count = scalar(@list); + my $attrs = $list[0]; + my $index = 1; + + $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/)); + $spacepreserve = 0 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?default["']?$/)); + + while ($index < $count) { + my $type = $list[$index]; + my $content = $list[$index+1]; + if (! $type ) { + # We've got CDATA + if ($content) { + # lets strip the whitespace here, and *ONLY* here + $content =~ s/\s+/ /gs if (!$spacepreserve); + $result .= $content; + } + } elsif ( "$type" ne "1" ) { + # We've got another element + $result .= "<$type"; + $result .= getAttributeString(@{$content}[0], 0); # no nested translatable elements + if ($content) { + my $subresult = getXMLstring($content, $spacepreserve); + if ($subresult) { + $result .= ">".$subresult . ""; + } else { + $result .= "/>"; + } + } else { + $result .= "/>"; + } + } + $index += 2; + } + return $result; +} + +# Translate list of nodes if necessary +sub translate_subnodes +{ + my $fh = shift; + my $content = shift; + my $language = shift || ""; + my $singlelang = shift || 0; + my $spacepreserve = shift || 0; + + my @nodes = @{ $content }; + + my $count = scalar(@nodes); + my $index = 0; + while ($index < $count) { + my $type = $nodes[$index]; + my $rest = $nodes[$index+1]; + if ($singlelang) { + my $oldMO = $MULTIPLE_OUTPUT; + $MULTIPLE_OUTPUT = 1; + traverse($fh, $type, $rest, $language, $spacepreserve); + $MULTIPLE_OUTPUT = $oldMO; + } else { + traverse($fh, $type, $rest, $language, $spacepreserve); + } + $index += 2; + } +} + +sub isWellFormedXmlFragment +{ + my $ret = eval 'require XML::Parser'; + if(!$ret) { + die "You must have XML::Parser installed to run $0\n\n"; + } + + my $fragment = shift; + return 0 if (!$fragment); + + $fragment = "$fragment"; + my $xp = new XML::Parser(Style => 'Tree'); + my $tree = 0; + eval { $tree = $xp->parse($fragment); }; + return $tree; +} + +sub traverse +{ + my $fh = shift; + my $nodename = shift; + my $content = shift; + my $language = shift || ""; + my $spacepreserve = shift || 0; + + if (!$nodename) { + if ($content =~ /^[\s]*$/) { + $leading_space .= $content; + } + print $fh $content; + } else { + # element + my @all = @{ $content }; + my $attrs = shift @all; + my $translate = 0; + my $outattr = getAttributeString($attrs, 1, $language, \$translate); + + if ($nodename =~ /^_/) { + $translate = 1; + $nodename =~ s/^_//; + } + my $lookup = ''; + + $spacepreserve = 0 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?default["']?$/)); + $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/)); + + print $fh "<$nodename", $outattr; + if ($translate) { + $lookup = getXMLstring($content, $spacepreserve); + if (!$spacepreserve) { + $lookup =~ s/^\s+//s; + $lookup =~ s/\s+$//s; + } + + if ($lookup || $translate == 2) { + my $translation = $translations{$language, $lookup} if isWellFormedXmlFragment($translations{$language, $lookup}); + if ($MULTIPLE_OUTPUT && ($translation || $translate == 2)) { + $translation = $lookup if (!$translation); + print $fh " xml:lang=\"", $language, "\"" if $language; + print $fh ">"; + if ($translate == 2) { + translate_subnodes($fh, \@all, $language, 1, $spacepreserve); + } else { + print $fh $translation; + } + print $fh ""; + + return; # this means there will be no same translation with xml:lang="$language"... + # if we want them both, just remove this "return" + } else { + print $fh ">"; + if ($translate == 2) { + translate_subnodes($fh, \@all, $language, 1, $spacepreserve); + } else { + print $fh $lookup; + } + print $fh ""; + } + } else { + print $fh "/>"; + } + + for my $lang (sort keys %po_files_by_lang) { + if ($MULTIPLE_OUTPUT && $lang ne "$language") { + next; + } + if ($lang) { + # Handle translation + # + my $translate = 0; + my $localattrs = getAttributeString($attrs, 1, $lang, \$translate); + my $translation = $translations{$lang, $lookup} if isWellFormedXmlFragment($translations{$lang, $lookup}); + if ($translate && !$translation) { + $translation = $lookup; + } + + if ($translation || $translate) { + print $fh "\n"; + $leading_space =~ s/.*\n//g; + print $fh $leading_space; + print $fh "<", $nodename, " xml:lang=\"", $lang, "\"", $localattrs, ">"; + if ($translate == 2) { + translate_subnodes($fh, \@all, $lang, 1, $spacepreserve); + } else { + print $fh $translation; + } + print $fh ""; + } + } + } + + } else { + my $count = scalar(@all); + if ($count > 0) { + print $fh ">"; + my $index = 0; + while ($index < $count) { + my $type = $all[$index]; + my $rest = $all[$index+1]; + traverse($fh, $type, $rest, $language, $spacepreserve); + $index += 2; + } + print $fh ""; + } else { + print $fh "/>"; + } + } + } +} + +sub intltool_tree_comment +{ + my $expat = shift; + my $data = shift; + my $clist = $expat->{Curlist}; + my $pos = $#$clist; + + push @$clist, 1 => $data; +} + +sub intltool_tree_cdatastart +{ + my $expat = shift; + my $clist = $expat->{Curlist}; + my $pos = $#$clist; + + push @$clist, 0 => $expat->original_string(); +} + +sub intltool_tree_cdataend +{ + my $expat = shift; + my $clist = $expat->{Curlist}; + my $pos = $#$clist; + + $clist->[$pos] .= $expat->original_string(); +} + +sub intltool_tree_char +{ + my $expat = shift; + my $text = shift; + my $clist = $expat->{Curlist}; + my $pos = $#$clist; + + # Use original_string so that we retain escaped entities + # in CDATA sections. + # + if ($pos > 0 and $clist->[$pos - 1] eq '0') { + $clist->[$pos] .= $expat->original_string(); + } else { + push @$clist, 0 => $expat->original_string(); + } +} + +sub intltool_tree_start +{ + my $expat = shift; + my $tag = shift; + my @origlist = (); + + # Use original_string so that we retain escaped entities + # in attribute values. We must convert the string to an + # @origlist array to conform to the structure of the Tree + # Style. + # + my @original_array = split /\x/, $expat->original_string(); + my $source = $expat->original_string(); + + # Remove leading tag. + # + $source =~ s|^\s*<\s*(\S+)||s; + + # Grab attribute key/value pairs and push onto @origlist array. + # + while ($source) + { + if ($source =~ /^\s*([\w:-]+)\s*[=]\s*["]/) + { + $source =~ s|^\s*([\w:-]+)\s*[=]\s*["]([^"]*)["]||s; + push @origlist, $1; + push @origlist, '"' . $2 . '"'; + } + elsif ($source =~ /^\s*([\w:-]+)\s*[=]\s*[']/) + { + $source =~ s|^\s*([\w:-]+)\s*[=]\s*[']([^']*)[']||s; + push @origlist, $1; + push @origlist, "'" . $2 . "'"; + } + else + { + last; + } + } + + my $ol = [ { @origlist } ]; + + push @{ $expat->{Lists} }, $expat->{Curlist}; + push @{ $expat->{Curlist} }, $tag => $ol; + $expat->{Curlist} = $ol; +} + +sub readXml +{ + my $filename = shift || return; + if(!-f $filename) { + die "ERROR Cannot find filename: $filename\n"; + } + + my $ret = eval 'require XML::Parser'; + if(!$ret) { + die "You must have XML::Parser installed to run $0\n\n"; + } + my $xp = new XML::Parser(Style => 'Tree'); + $xp->setHandlers(Char => \&intltool_tree_char); + $xp->setHandlers(Start => \&intltool_tree_start); + $xp->setHandlers(CdataStart => \&intltool_tree_cdatastart); + $xp->setHandlers(CdataEnd => \&intltool_tree_cdataend); + my $tree = $xp->parsefile($filename); + +# Hello thereHowdydo +# would be: +# [foo, [{}, head, [{id => "a"}, 0, "Hello ", em, [{}, 0, "there"]], bar, [{}, +# 0, "Howdy", ref, [{}]], 0, "do" ] ] + + return $tree; +} + +sub print_header +{ + my $infile = shift; + my $fh = shift; + my $source; + + if(!-f $infile) { + die "ERROR Cannot find filename: $infile\n"; + } + + print $fh qq{\n}; + { + local $/; + open DOCINPUT, "<${FILE}" or die; + $source = ; + close DOCINPUT; + } + if ($source =~ /()/s) + { + print $fh "$1\n"; + } + elsif ($source =~ /(]*>)/s) + { + print $fh "$1\n"; + } +} + +sub parseTree +{ + my $fh = shift; + my $ref = shift; + my $language = shift || ""; + + my $name = shift @{ $ref }; + my $cont = shift @{ $ref }; + + while (!$name || "$name" eq "1") { + $name = shift @{ $ref }; + $cont = shift @{ $ref }; + } + + my $spacepreserve = 0; + my $attrs = @{$cont}[0]; + $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/)); + + traverse($fh, $name, $cont, $language, $spacepreserve); +} + +sub xml_merge_output +{ + my $source; + + if ($MULTIPLE_OUTPUT) { + for my $lang (sort keys %po_files_by_lang) { + if ( ! -d $lang ) { + mkdir $lang or -d $lang or die "Cannot create subdirectory $lang: $!\n"; + } + open OUTPUT, ">$lang/$OUTFILE" or die "Cannot open $lang/$OUTFILE: $!\n"; + binmode (OUTPUT) if $^O eq 'MSWin32'; + my $tree = readXml($FILE); + print_header($FILE, \*OUTPUT); + parseTree(\*OUTPUT, $tree, $lang); + close OUTPUT; + print "CREATED $lang/$OUTFILE\n" unless $QUIET_ARG; + } + if ( ! -d "C" ) { + mkdir "C" or -d "C" or die "Cannot create subdirectory C: $!\n"; + } + open OUTPUT, ">C/$OUTFILE" or die "Cannot open C/$OUTFILE: $!\n"; + binmode (OUTPUT) if $^O eq 'MSWin32'; + my $tree = readXml($FILE); + print_header($FILE, \*OUTPUT); + parseTree(\*OUTPUT, $tree); + close OUTPUT; + print "CREATED C/$OUTFILE\n" unless $QUIET_ARG; + } else { + open OUTPUT, ">$OUTFILE" or die "Cannot open $OUTFILE: $!\n"; + binmode (OUTPUT) if $^O eq 'MSWin32'; + my $tree = readXml($FILE); + print_header($FILE, \*OUTPUT); + parseTree(\*OUTPUT, $tree); + close OUTPUT; + print "CREATED $OUTFILE\n" unless $QUIET_ARG; + } +} + +sub keys_merge_translation +{ + my ($lang) = @_; + + if ( ! -d $lang && $MULTIPLE_OUTPUT) + { + mkdir $lang or -d $lang or die "Cannot create subdirectory $lang: $!\n"; + } + + open INPUT, "<${FILE}" or die "Cannot open ${FILE}: $!\n"; + open OUTPUT, ">$lang/$OUTFILE" or die "Cannot open $lang/$OUTFILE: $!\n"; + binmode (OUTPUT) if $^O eq 'MSWin32'; + + while () + { + if (s/^(\s*)_(\w+=(.*))/$1$2/) + { + my $string = $3; + + if (!$MULTIPLE_OUTPUT) + { + print OUTPUT; + + my $non_translated_line = $_; + + for my $lang (sort keys %po_files_by_lang) + { + my $translation = $translations{$lang, $string}; + next if !$translation; + + $_ = $non_translated_line; + s/(\w+)=.*/[$lang]$1=$translation/; + print OUTPUT; + } + } + else + { + my $non_translated_line = $_; + my $translation = $translations{$lang, $string}; + $translation = $string if !$translation; + + $_ = $non_translated_line; + s/(\w+)=.*/$1=$translation/; + print OUTPUT; + } + } + else + { + print OUTPUT; + } + } + + close OUTPUT; + close INPUT; + + print "CREATED $lang/$OUTFILE\n" unless $QUIET_ARG; +} + +sub keys_merge_translations +{ + if ($MULTIPLE_OUTPUT) + { + for my $lang (sort keys %po_files_by_lang) + { + keys_merge_translation ($lang); + } + keys_merge_translation ("C"); + } + else + { + keys_merge_translation ("."); + } +} + +sub desktop_merge_translations +{ + open INPUT, "<${FILE}" or die; + open OUTPUT, ">${OUTFILE}" or die; + binmode (OUTPUT) if $^O eq 'MSWin32'; + + while () + { + if (s/^(\s*)_(\w+=(.*))/$1$2/) + { + my $string = $3; + + print OUTPUT; + + my $non_translated_line = $_; + + for my $lang (sort keys %po_files_by_lang) + { + my $translation = $translations{$lang, $string}; + next if !$translation; + + $_ = $non_translated_line; + s/(\w+)=.*/${1}[$lang]=$translation/; + print OUTPUT; + } + } + else + { + print OUTPUT; + } + } + + close OUTPUT; + close INPUT; +} + +sub schemas_merge_translations +{ + my $source; + + { + local $/; # slurp mode + open INPUT, "<$FILE" or die "can't open $FILE: $!"; + $source = ; + close INPUT; + } + + open OUTPUT, ">$OUTFILE" or die; + binmode (OUTPUT) if $^O eq 'MSWin32'; + + # FIXME: support attribute translations + + # Empty nodes never need translation, so unmark all of them. + # For example, <_foo/> is just replaced by . + $source =~ s|<\s*_($w+)\s*/>|<$1/>|g; + + while ($source =~ s/ + (.*?) + (\s+)((\s*) + (\s*(?:\s*)?(.*?)\s*<\/default>)?(\s*) + (\s*(?:\s*)?(.*?)\s*<\/short>)?(\s*) + (\s*(?:\s*)?(.*?)\s*<\/long>)?(\s*) + <\/locale>) + //sx) + { + print OUTPUT $1; + + my $locale_start_spaces = $2 ? $2 : ''; + my $default_spaces = $4 ? $4 : ''; + my $short_spaces = $7 ? $7 : ''; + my $long_spaces = $10 ? $10 : ''; + my $locale_end_spaces = $13 ? $13 : ''; + my $c_default_block = $3 ? $3 : ''; + my $default_string = $6 ? $6 : ''; + my $short_string = $9 ? $9 : ''; + my $long_string = $12 ? $12 : ''; + + print OUTPUT "$locale_start_spaces$c_default_block"; + + $default_string =~ s/\s+/ /g; + $default_string = entity_decode($default_string); + $short_string =~ s/\s+/ /g; + $short_string = entity_decode($short_string); + $long_string =~ s/\s+/ /g; + $long_string = entity_decode($long_string); + + for my $lang (sort keys %po_files_by_lang) + { + my $default_translation = $translations{$lang, $default_string}; + my $short_translation = $translations{$lang, $short_string}; + my $long_translation = $translations{$lang, $long_string}; + + next if (!$default_translation && !$short_translation && + !$long_translation); + + print OUTPUT "\n$locale_start_spaces"; + + print OUTPUT "$default_spaces"; + + if ($default_translation) + { + $default_translation = entity_encode($default_translation); + print OUTPUT "$default_translation"; + } + + print OUTPUT "$short_spaces"; + + if ($short_translation) + { + $short_translation = entity_encode($short_translation); + print OUTPUT "$short_translation"; + } + + print OUTPUT "$long_spaces"; + + if ($long_translation) + { + $long_translation = entity_encode($long_translation); + print OUTPUT "$long_translation"; + } + + print OUTPUT "$locale_end_spaces"; + } + } + + print OUTPUT $source; + + close OUTPUT; +} + +sub rfc822deb_merge_translations +{ + my %encodings = (); + for my $lang (keys %po_files_by_lang) { + $encodings{$lang} = ($UTF8_ARG ? 'UTF-8' : get_po_encoding($po_files_by_lang{$lang})); + } + + my $source; + + $Text::Wrap::huge = 'overflow'; + $Text::Wrap::break = qr/\n|\s(?=\S)/; + + { + local $/; # slurp mode + open INPUT, "<$FILE" or die "can't open $FILE: $!"; + $source = ; + close INPUT; + } + + open OUTPUT, ">${OUTFILE}" or die; + binmode (OUTPUT) if $^O eq 'MSWin32'; + + while ($source =~ /(^|\n+)(_*)([^:\s]+)(:[ \t]*)(.*?)(?=\n[\S\n]|$)/sg) + { + my $sep = $1; + my $non_translated_line = $3.$4; + my $string = $5; + my $underscore = length($2); + next if $underscore eq 0 && $non_translated_line =~ /^#/; + # Remove [] dummy strings + my $stripped = $string; + $stripped =~ s/\[\s[^\[\]]*\],/,/g if $underscore eq 2; + $stripped =~ s/\[\s[^\[\]]*\]$//; + $non_translated_line .= $stripped; + + print OUTPUT $sep.$non_translated_line; + + if ($underscore) + { + my @str_list = rfc822deb_split($underscore, $string); + + for my $lang (sort keys %po_files_by_lang) + { + my $is_translated = 1; + my $str_translated = ''; + my $first = 1; + + for my $str (@str_list) + { + my $translation = $translations{$lang, $str}; + + if (!$translation) + { + $is_translated = 0; + last; + } + + # $translation may also contain [] dummy + # strings, mostly to indicate an empty string + $translation =~ s/\[\s[^\[\]]*\]$//; + + if ($first) + { + if ($underscore eq 2) + { + $str_translated .= $translation; + } + else + { + $str_translated .= + Text::Tabs::expand($translation) . + "\n"; + } + } + else + { + if ($underscore eq 2) + { + $str_translated .= ', ' . $translation; + } + else + { + $str_translated .= Text::Tabs::expand( + Text::Wrap::wrap(' ', ' ', $translation)) . + "\n .\n"; + } + } + $first = 0; + + # To fix some problems with Text::Wrap::wrap + $str_translated =~ s/(\n )+\n/\n .\n/g; + } + next unless $is_translated; + + $str_translated =~ s/\n \.\n$//; + $str_translated =~ s/\s+$//; + + $_ = $non_translated_line; + s/^(\w+):\s*.*/$sep${1}-$lang.$encodings{$lang}: $str_translated/s; + print OUTPUT; + } + } + } + print OUTPUT "\n"; + + close OUTPUT; + close INPUT; +} + +sub rfc822deb_split +{ + # Debian defines a special way to deal with rfc822-style files: + # when a value contain newlines, it consists of + # 1. a short form (first line) + # 2. a long description, all lines begin with a space, + # and paragraphs are separated by a single dot on a line + # This routine returns an array of all paragraphs, and reformat + # them. + # When first argument is 2, the string is a comma separated list of + # values. + my $type = shift; + my $text = shift; + $text =~ s/^[ \t]//mg; + return (split(/, */, $text, 0)) if $type ne 1; + return ($text) if $text !~ /\n/; + + $text =~ s/([^\n]*)\n//; + my @list = ($1); + my $str = ''; + + for my $line (split (/\n/, $text)) + { + chomp $line; + if ($line =~ /^\.\s*$/) + { + # New paragraph + $str =~ s/\s*$//; + push(@list, $str); + $str = ''; + } + elsif ($line =~ /^\s/) + { + # Line which must not be reformatted + $str .= "\n" if length ($str) && $str !~ /\n$/; + $line =~ s/\s+$//; + $str .= $line."\n"; + } + else + { + # Continuation line, remove newline + $str .= " " if length ($str) && $str !~ /\n$/; + $str .= $line; + } + } + + $str =~ s/\s*$//; + push(@list, $str) if length ($str); + + return @list; +} + +sub quoted_translation +{ + my ($xml_mode, $lang, $string) = @_; + + $string = entity_decode($string) if $xml_mode; + $string =~ s/\\\"/\"/g; + + my $translation = $translations{$lang, $string}; + $translation = $string if !$translation; + $translation = entity_encode($translation) if $xml_mode; + $translation =~ s/\"/\\\"/g; + return $translation +} + +sub quoted_merge_translations +{ + my ($xml_mode) = @_; + + if (!$MULTIPLE_OUTPUT) { + print "Quoted only supports Multiple Output.\n"; + exit(1); + } + + for my $lang (sort keys %po_files_by_lang) { + if ( ! -d $lang ) { + mkdir $lang or -d $lang or die "Cannot create subdirectory $lang: $!\n"; + } + open INPUT, "<${FILE}" or die; + open OUTPUT, ">$lang/$OUTFILE" or die "Cannot open $lang/$OUTFILE: $!\n"; + binmode (OUTPUT) if $^O eq 'MSWin32'; + while () + { + s/\"(([^\"]|\\\")*[^\\\"])\"/"\"" . "ed_translation($xml_mode, $lang, $1) . "\""/ge; + print OUTPUT; + } + close OUTPUT; + close INPUT; + } +} diff --git a/intltool-update.in b/intltool-update.in new file mode 100644 index 0000000..2684cc0 --- /dev/null +++ b/intltool-update.in @@ -0,0 +1,1166 @@ +#!@INTLTOOL_PERL@ -w +# -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 4 -*- + +# +# The Intltool Message Updater +# +# Copyright (C) 2000-2003 Free Software Foundation. +# +# Intltool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# version 2 published by the Free Software Foundation. +# +# Intltool 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., 675 Mass Ave, Cambridge, MA 02139, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. +# +# Authors: Kenneth Christiansen +# Maciej Stachowiak +# Darin Adler + +## Release information +my $PROGRAM = "intltool-update"; +my $VERSION = "0.37.1"; +my $PACKAGE = "intltool"; + +## Loaded modules +use strict; +use Getopt::Long; +use Cwd; +use File::Copy; +use File::Find; + +## Scalars used by the option stuff +my $HELP_ARG = 0; +my $VERSION_ARG = 0; +my $DIST_ARG = 0; +my $POT_ARG = 0; +my $HEADERS_ARG = 0; +my $MAINTAIN_ARG = 0; +my $REPORT_ARG = 0; +my $VERBOSE = 0; +my $GETTEXT_PACKAGE = ""; +my $OUTPUT_FILE = ""; + +my @languages; +my %varhash = (); +my %po_files_by_lang = (); + +# Regular expressions to categorize file types. +# FIXME: Please check if the following is correct + +my $xml_support = +"xml(?:\\.in)*|". # http://www.w3.org/XML/ (Note: .in is not required) +"ui|". # Bonobo specific - User Interface desc. files +"lang|". # ? +"glade2?(?:\\.in)*|". # Glade specific - User Interface desc. files (Note: .in is not required) +"scm(?:\\.in)*|". # ? (Note: .in is not required) +"oaf(?:\\.in)+|". # DEPRECATED: Replaces by Bonobo .server files +"etspec|". # ? +"server(?:\\.in)+|". # Bonobo specific +"sheet(?:\\.in)+|". # ? +"schemas(?:\\.in)+|". # GConf specific +"pong(?:\\.in)+|". # DEPRECATED: PONG is not used [by GNOME] any longer. +"kbd(?:\\.in)+|". # GOK specific. +"policy(?:\\.in)+"; # PolicyKit files + +my $ini_support = +"icon(?:\\.in)+|". # http://www.freedesktop.org/Standards/icon-theme-spec +"desktop(?:\\.in)+|". # http://www.freedesktop.org/Standards/menu-spec +"caves(?:\\.in)+|". # GNOME Games specific +"directory(?:\\.in)+|". # http://www.freedesktop.org/Standards/menu-spec +"soundlist(?:\\.in)+|". # GNOME specific +"keys(?:\\.in)+|". # GNOME Mime database specific +"theme(?:\\.in)+|". # http://www.freedesktop.org/Standards/icon-theme-spec +"service(?:\\.in)+"; # DBus specific + +my $buildin_gettext_support = +"c|y|cs|cc|cpp|c\\+\\+|h|hh|gob|py"; + +## Always flush buffer when printing +$| = 1; + +## Sometimes the source tree will be rooted somewhere else. +my $SRCDIR = $ENV{"srcdir"} || "."; +my $POTFILES_in; + +$POTFILES_in = "<$SRCDIR/POTFILES.in"; + +my $devnull = ($^O eq 'MSWin32' ? 'NUL:' : '/dev/null'); + +## Handle options +GetOptions +( + "help" => \$HELP_ARG, + "version" => \$VERSION_ARG, + "dist|d" => \$DIST_ARG, + "pot|p" => \$POT_ARG, + "headers|s" => \$HEADERS_ARG, + "maintain|m" => \$MAINTAIN_ARG, + "report|r" => \$REPORT_ARG, + "verbose|x" => \$VERBOSE, + "gettext-package|g=s" => \$GETTEXT_PACKAGE, + "output-file|o=s" => \$OUTPUT_FILE, + ) or &Console_WriteError_InvalidOption; + +&Console_Write_IntltoolHelp if $HELP_ARG; +&Console_Write_IntltoolVersion if $VERSION_ARG; + +my $arg_count = ($DIST_ARG > 0) + + ($POT_ARG > 0) + + ($HEADERS_ARG > 0) + + ($MAINTAIN_ARG > 0) + + ($REPORT_ARG > 0); + +&Console_Write_IntltoolHelp if $arg_count > 1; + +my $PKGNAME = FindPackageName (); + +# --version and --help don't require a module name +my $MODULE = $GETTEXT_PACKAGE || $PKGNAME || "unknown"; + +if ($POT_ARG) +{ + &GenerateHeaders; + &GeneratePOTemplate; +} +elsif ($HEADERS_ARG) +{ + &GenerateHeaders; +} +elsif ($MAINTAIN_ARG) +{ + &FindLeftoutFiles; +} +elsif ($REPORT_ARG) +{ + &GenerateHeaders; + &GeneratePOTemplate; + &Console_Write_CoverageReport; +} +elsif ((defined $ARGV[0]) && $ARGV[0] =~ /^[a-z]/) +{ + my $lang = $ARGV[0]; + + ## Report error if the language file supplied + ## to the command line is non-existent + &Console_WriteError_NotExisting("$SRCDIR/$lang.po") + if ! -s "$SRCDIR/$lang.po"; + + if (!$DIST_ARG) + { + print "Working, please wait..." if $VERBOSE; + &GenerateHeaders; + &GeneratePOTemplate; + } + &POFile_Update ($lang, $OUTPUT_FILE); + &Console_Write_TranslationStatus ($lang, $OUTPUT_FILE); +} +else +{ + &Console_Write_IntltoolHelp; +} + +exit; + +######### + +sub Console_Write_IntltoolVersion +{ + print <<_EOF_; +${PROGRAM} (${PACKAGE}) $VERSION +Written by Kenneth Christiansen, Maciej Stachowiak, and Darin Adler. + +Copyright (C) 2000-2003 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +_EOF_ + exit; +} + +sub Console_Write_IntltoolHelp +{ + print <<_EOF_; +Usage: ${PROGRAM} [OPTION]... LANGCODE +Updates PO template files and merge them with the translations. + +Mode of operation (only one is allowed): + -p, --pot generate the PO template only + -s, --headers generate the header files in POTFILES.in + -m, --maintain search for left out files from POTFILES.in + -r, --report display a status report for the module + -d, --dist merge LANGCODE.po with existing PO template + +Extra options: + -g, --gettext-package=NAME override PO template name, useful with --pot + -o, --output-file=FILE write merged translation to FILE + -x, --verbose display lots of feedback + --help display this help and exit + --version output version information and exit + +Examples of use: +${PROGRAM} --pot just create a new PO template +${PROGRAM} xy create new PO template and merge xy.po with it + +Report bugs to http://bugzilla.gnome.org/ (product name "$PACKAGE") +or send email to . +_EOF_ + exit; +} + +sub echo_n +{ + my $str = shift; + my $ret = `echo "$str"`; + + $ret =~ s/\n$//; # do we need the "s" flag? + + return $ret; +} + +sub POFile_DetermineType ($) +{ + my $type = $_; + my $gettext_type; + + my $xml_regex = "(?:" . $xml_support . ")"; + my $ini_regex = "(?:" . $ini_support . ")"; + my $buildin_regex = "(?:" . $buildin_gettext_support . ")"; + + if ($type =~ /\[type: gettext\/([^\]].*)]/) + { + $gettext_type=$1; + } + elsif ($type =~ /schemas(\.in)+$/) + { + $gettext_type="schemas"; + } + elsif ($type =~ /glade2?(\.in)*$/) + { + $gettext_type="glade"; + } + elsif ($type =~ /scm(\.in)*$/) + { + $gettext_type="scheme"; + } + elsif ($type =~ /keys(\.in)+$/) + { + $gettext_type="keys"; + } + + # bucket types + + elsif ($type =~ /$xml_regex$/) + { + $gettext_type="xml"; + } + elsif ($type =~ /$ini_regex$/) + { + $gettext_type="ini"; + } + elsif ($type =~ /$buildin_regex$/) + { + $gettext_type="buildin"; + } + else + { + $gettext_type="unknown"; + } + + return "gettext\/$gettext_type"; +} + +sub TextFile_DetermineEncoding ($) +{ + my $gettext_code="ASCII"; # All files are ASCII by default + my $filetype=`file $_ | cut -d ' ' -f 2`; + + if ($? eq "0") + { + if ($filetype =~ /^(ISO|UTF)/) + { + chomp ($gettext_code = $filetype); + } + elsif ($filetype =~ /^XML/) + { + $gettext_code="UTF-8"; # We asume that .glade and other .xml files are UTF-8 + } + } + + return $gettext_code; +} + +sub isNotValidMissing +{ + my ($file) = @_; + + return if $file =~ /^\{arch\}\/.*$/; + return if $file =~ /^$varhash{"PACKAGE"}-$varhash{"VERSION"}\/.*$/; +} + +sub FindLeftoutFiles +{ + my (@buf_i18n_plain, + @buf_i18n_xml, + @buf_i18n_xml_unmarked, + @buf_i18n_ini, + @buf_potfiles, + @buf_potfiles_ignore, + @buf_allfiles, + @buf_allfiles_sorted, + @buf_potfiles_sorted, + @buf_potfiles_ignore_sorted + ); + + ## Search and find all translatable files + find sub { + push @buf_i18n_plain, "$File::Find::name" if /\.($buildin_gettext_support)$/; + push @buf_i18n_xml, "$File::Find::name" if /\.($xml_support)$/; + push @buf_i18n_ini, "$File::Find::name" if /\.($ini_support)$/; + push @buf_i18n_xml_unmarked, "$File::Find::name" if /\.(schemas(\.in)+)$/; + }, ".."; + find sub { + push @buf_i18n_plain, "$File::Find::name" if /\.($buildin_gettext_support)$/; + push @buf_i18n_xml, "$File::Find::name" if /\.($xml_support)$/; + push @buf_i18n_ini, "$File::Find::name" if /\.($ini_support)$/; + push @buf_i18n_xml_unmarked, "$File::Find::name" if /\.(schemas(\.in)+)$/; + }, "$SRCDIR/.." if "$SRCDIR" ne "."; + + open POTFILES, $POTFILES_in or die "$PROGRAM: there's no POTFILES.in!\n"; + @buf_potfiles = grep !/^(#|\s*$)/, ; + close POTFILES; + + foreach (@buf_potfiles) { + s/^\[.*]\s*//; + } + + print "Searching for missing translatable files...\n" if $VERBOSE; + + ## Check if we should ignore some found files, when + ## comparing with POTFILES.in + foreach my $ignore ("POTFILES.skip", "POTFILES.ignore") + { + (-s "$SRCDIR/$ignore") or next; + + if ("$ignore" eq "POTFILES.ignore") + { + print "The usage of POTFILES.ignore is deprecated. Please consider moving the\n". + "content of this file to POTFILES.skip.\n"; + } + + print "Found $ignore: Ignoring files...\n" if $VERBOSE; + open FILE, "<$SRCDIR/$ignore" or die "ERROR: Failed to open $SRCDIR/$ignore!\n"; + + while () + { + push @buf_potfiles_ignore, $_ unless /^(#|\s*$)/; + } + close FILE; + + @buf_potfiles_ignore_sorted = sort (@buf_potfiles_ignore); + } + + foreach my $file (@buf_i18n_plain) + { + my $in_comment = 0; + my $in_macro = 0; + + open FILE, "<$file"; + while () + { + # Handle continued multi-line comment. + if ($in_comment) + { + next unless s-.*\*/--; + $in_comment = 0; + } + + # Handle continued macro. + if ($in_macro) + { + $in_macro = 0 unless /\\$/; + next; + } + + # Handle start of macro (or any preprocessor directive). + if (/^\s*\#/) + { + $in_macro = 1 if /^([^\\]|\\.)*\\$/; + next; + } + + # Handle comments and quoted text. + while (m-(/\*|//|\'|\")-) # \' and \" keep emacs perl mode happy + { + my $match = $1; + if ($match eq "/*") + { + if (!s-/\*.*?\*/--) + { + s-/\*.*--; + $in_comment = 1; + } + } + elsif ($match eq "//") + { + s-//.*--; + } + else # ' or " + { + if (!s-$match([^\\]|\\.)*?$match-QUOTEDTEXT-) + { + warn "mismatched quotes at line $. in $file\n"; + s-$match.*--; + } + } + } + + if (/\w\.GetString *\(QUOTEDTEXT/) + { + if (defined isNotValidMissing (unpack("x3 A*", $file))) { + ## Remove the first 3 chars and add newline + push @buf_allfiles, unpack("x3 A*", $file) . "\n"; + } + last; + } + + ## C_ N_ Q_ and _ are the macros defined in gi8n.h + if (/[CNQ]?_ *\(QUOTEDTEXT/) + { + if (defined isNotValidMissing (unpack("x3 A*", $file))) { + ## Remove the first 3 chars and add newline + push @buf_allfiles, unpack("x3 A*", $file) . "\n"; + } + last; + } + } + close FILE; + } + + foreach my $file (@buf_i18n_xml) + { + open FILE, "<$file"; + + while () + { + # FIXME: share the pattern matching code with intltool-extract + if (/\s_[-A-Za-z0-9._:]+\s*=\s*\"([^"]+)\"/ || /<_[^>]+>/ || /translatable=\"yes\"/) + { + if (defined isNotValidMissing (unpack("x3 A*", $file))) { + push @buf_allfiles, unpack("x3 A*", $file) . "\n"; + } + last; + } + } + close FILE; + } + + foreach my $file (@buf_i18n_ini) + { + open FILE, "<$file"; + while () + { + if (/_(.*)=/) + { + if (defined isNotValidMissing (unpack("x3 A*", $file))) { + push @buf_allfiles, unpack("x3 A*", $file) . "\n"; + } + last; + } + } + close FILE; + } + + foreach my $file (@buf_i18n_xml_unmarked) + { + if (defined isNotValidMissing (unpack("x3 A*", $file))) { + push @buf_allfiles, unpack("x3 A*", $file) . "\n"; + } + } + + + @buf_allfiles_sorted = sort (@buf_allfiles); + @buf_potfiles_sorted = sort (@buf_potfiles); + + my %in2; + foreach (@buf_potfiles_sorted) + { + s#^$SRCDIR/../##; + s#^$SRCDIR/##; + $in2{$_} = 1; + } + + foreach (@buf_potfiles_ignore_sorted) + { + s#^$SRCDIR/../##; + s#^$SRCDIR/##; + $in2{$_} = 1; + } + + my @result; + + foreach (@buf_allfiles_sorted) + { + my $dummy = $_; + my $srcdir = $SRCDIR; + + $srcdir =~ s#^../##; + $dummy =~ s#^$srcdir/../##; + $dummy =~ s#^$srcdir/##; + $dummy =~ s#_build/##; + if (!exists($in2{$dummy})) + { + push @result, $dummy + } + } + + my @buf_potfiles_notexist; + + foreach (@buf_potfiles_sorted) + { + chomp (my $dummy = $_); + if ("$dummy" ne "" and !(-f "$SRCDIR/../$dummy" or -f "../$dummy")) + { + push @buf_potfiles_notexist, $_; + } + } + + ## Save file with information about the files missing + ## if any, and give information about this procedure. + if (@result + @buf_potfiles_notexist > 0) + { + if (@result) + { + print "\n" if $VERBOSE; + unlink "missing"; + open OUT, ">missing"; + print OUT @result; + close OUT; + warn "\e[1mThe following files contain translations and are currently not in use. Please\e[0m\n". + "\e[1mconsider adding these to the POTFILES.in file, located in the po/ directory.\e[0m\n\n"; + print STDERR @result, "\n"; + warn "If some of these files are left out on purpose then please add them to\n". + "POTFILES.skip instead of POTFILES.in. A file \e[1m'missing'\e[0m containing this list\n". + "of left out files has been written in the current directory.\n"; + } + if (@buf_potfiles_notexist) + { + unlink "notexist"; + open OUT, ">notexist"; + print OUT @buf_potfiles_notexist; + close OUT; + warn "\n" if ($VERBOSE or @result); + warn "\e[1mThe following files do not exist anymore:\e[0m\n\n"; + warn @buf_potfiles_notexist, "\n"; + warn "Please remove them from POTFILES.in. A file \e[1m'notexist'\e[0m\n". + "containing this list of absent files has been written in the current directory.\n"; + } + } + + ## If there is nothing to complain about, notify the user + else { + print "\nAll files containing translations are present in POTFILES.in.\n" if $VERBOSE; + } +} + +sub Console_WriteError_InvalidOption +{ + ## Handle invalid arguments + print STDERR "Try `${PROGRAM} --help' for more information.\n"; + exit 1; +} + +sub isProgramInPath +{ + my ($file) = @_; + # If either a file exists, or when run it returns 0 exit status + return 1 if ((-x $file) or (system("$file --version >$devnull") == 0)); + return 0; +} + +sub isGNUGettextTool +{ + my ($file) = @_; + # Check that we are using GNU gettext tools + if (isProgramInPath ($file)) + { + my $version = `$file --version`; + return 1 if ($version =~ m/.*\(GNU .*\).*/); + } + return 0; +} + +sub GenerateHeaders +{ + my $EXTRACT = $ENV{"INTLTOOL_EXTRACT"} || "intltool-extract"; + + ## Generate the .h header files, so we can allow glade and + ## xml translation support + if (! isProgramInPath ("$EXTRACT")) + { + print STDERR "\n *** The intltool-extract script wasn't found!" + ."\n *** Without it, intltool-update can not generate files.\n"; + exit; + } + else + { + open (FILE, $POTFILES_in) or die "$PROGRAM: POTFILES.in not found.\n"; + + while () + { + chomp; + next if /^\[\s*encoding/; + + ## Find xml files in POTFILES.in and generate the + ## files with help from the extract script + + my $gettext_type= &POFile_DetermineType ($1); + + if (/\.($xml_support|$ini_support)$/ || /^\[/) + { + s/^\[[^\[].*]\s*//; + + my $filename = "../$_"; + + if ($VERBOSE) + { + system ($EXTRACT, "--update", "--srcdir=$SRCDIR", + "--type=$gettext_type", $filename); + } + else + { + system ($EXTRACT, "--update", "--type=$gettext_type", + "--srcdir=$SRCDIR", "--quiet", $filename); + } + } + } + close FILE; + } +} + +# +# Generate .pot file from POTFILES.in +# +sub GeneratePOTemplate +{ + my $XGETTEXT = $ENV{"XGETTEXT"} || "xgettext"; + my $XGETTEXT_ARGS = $ENV{"XGETTEXT_ARGS"} || ''; + chomp $XGETTEXT; + + if (! isGNUGettextTool ("$XGETTEXT")) + { + print STDERR " *** GNU xgettext is not found on this system!\n". + " *** Without it, intltool-update can not extract strings.\n"; + exit; + } + + print "Building $MODULE.pot...\n" if $VERBOSE; + + open INFILE, $POTFILES_in; + unlink "POTFILES.in.temp"; + open OUTFILE, ">POTFILES.in.temp" or die("Cannot open POTFILES.in.temp for writing"); + + my $gettext_support_nonascii = 0; + + # checks for GNU gettext >= 0.12 + my $dummy = `$XGETTEXT --version --from-code=UTF-8 >$devnull 2>$devnull`; + if ($? == 0) + { + $gettext_support_nonascii = 1; + } + else + { + # urge everybody to upgrade gettext + print STDERR "WARNING: This version of gettext does not support extracting non-ASCII\n". + " strings. That means you should install a version of gettext\n". + " that supports non-ASCII strings (such as GNU gettext >= 0.12),\n". + " or have to let non-ASCII strings untranslated. (If there is any)\n"; + } + + my $encoding = "ASCII"; + my $forced_gettext_code; + my @temp_headers; + my $encoding_problem_is_reported = 0; + + while () + { + next if (/^#/ or /^\s*$/); + + chomp; + + my $gettext_code; + + if (/^\[\s*encoding:\s*(.*)\s*\]/) + { + $forced_gettext_code=$1; + } + elsif (/\.($xml_support|$ini_support)$/ || /^\[/) + { + s/^\[.*]\s*//; + print OUTFILE "../$_.h\n"; + push @temp_headers, "../$_.h"; + $gettext_code = &TextFile_DetermineEncoding ("../$_.h") if ($gettext_support_nonascii and not defined $forced_gettext_code); + } + else + { + print OUTFILE "$SRCDIR/../$_\n"; + $gettext_code = &TextFile_DetermineEncoding ("$SRCDIR/../$_") if ($gettext_support_nonascii and not defined $forced_gettext_code); + } + + next if (! $gettext_support_nonascii); + + if (defined $forced_gettext_code) + { + $encoding=$forced_gettext_code; + } + elsif (defined $gettext_code and "$encoding" ne "$gettext_code") + { + if ($encoding eq "ASCII") + { + $encoding=$gettext_code; + } + elsif ($gettext_code ne "ASCII") + { + # Only report once because the message is quite long + if (! $encoding_problem_is_reported) + { + print STDERR "WARNING: You should use the same file encoding for all your project files,\n". + " but $PROGRAM thinks that most of the source files are in\n". + " $encoding encoding, while \"$_\" is (likely) in\n". + " $gettext_code encoding. If you are sure that all translatable strings\n". + " are in same encoding (say UTF-8), please \e[1m*prepend*\e[0m the following\n". + " line to POTFILES.in:\n\n". + " [encoding: UTF-8]\n\n". + " and make sure that configure.in/ac checks for $PACKAGE >= 0.27 .\n". + "(such warning message will only be reported once.)\n"; + $encoding_problem_is_reported = 1; + } + } + } + } + + close OUTFILE; + close INFILE; + + unlink "$MODULE.pot"; + my @xgettext_argument=("$XGETTEXT", + "--add-comments", + "--directory\=.", + "--default-domain\=$MODULE", + "--flag\=g_strdup_printf:1:c-format", + "--flag\=g_string_printf:2:c-format", + "--flag\=g_string_append_printf:2:c-format", + "--flag\=g_error_new:3:c-format", + "--flag\=g_set_error:4:c-format", + "--flag\=g_markup_printf_escaped:1:c-format", + "--flag\=g_log:3:c-format", + "--flag\=g_print:1:c-format", + "--flag\=g_printerr:1:c-format", + "--flag\=g_printf:1:c-format", + "--flag\=g_fprintf:2:c-format", + "--flag\=g_sprintf:2:c-format", + "--flag\=g_snprintf:3:c-format", + "--flag\=g_scanner_error:2:c-format", + "--flag\=g_scanner_warn:2:c-format", + "--output\=$MODULE\.pot", + "--files-from\=\.\/POTFILES\.in\.temp"); + my $XGETTEXT_KEYWORDS = &FindPOTKeywords; + push @xgettext_argument, $XGETTEXT_KEYWORDS; + my $MSGID_BUGS_ADDRESS = &FindMakevarsBugAddress; + push @xgettext_argument, "--msgid-bugs-address\=\"$MSGID_BUGS_ADDRESS\"" if $MSGID_BUGS_ADDRESS; + push @xgettext_argument, "--from-code\=$encoding" if ($gettext_support_nonascii); + push @xgettext_argument, $XGETTEXT_ARGS if $XGETTEXT_ARGS; + my $xgettext_command = join ' ', @xgettext_argument; + + # intercept xgettext error message + print "Running $xgettext_command\n" if $VERBOSE; + my $xgettext_error_msg = `$xgettext_command 2>\&1`; + my $command_failed = $?; + + unlink "POTFILES.in.temp"; + + print "Removing generated header (.h) files..." if $VERBOSE; + unlink foreach (@temp_headers); + print "done.\n" if $VERBOSE; + + if (! $command_failed) + { + if (! -e "$MODULE.pot") + { + print "None of the files in POTFILES.in contain strings marked for translation.\n" if $VERBOSE; + } + else + { + print "Wrote $MODULE.pot\n" if $VERBOSE; + } + } + else + { + if ($xgettext_error_msg =~ /--from-code/) + { + # replace non-ASCII error message with a more useful one. + print STDERR "ERROR: xgettext failed to generate PO template file because there is non-ASCII\n". + " string marked for translation. Please make sure that all strings marked\n". + " for translation are in uniform encoding (say UTF-8), then \e[1m*prepend*\e[0m the\n". + " following line to POTFILES.in and rerun $PROGRAM:\n\n". + " [encoding: UTF-8]\n\n"; + } + else + { + print STDERR "$xgettext_error_msg"; + if (-e "$MODULE.pot") + { + # is this possible? + print STDERR "ERROR: xgettext failed but still managed to generate PO template file.\n". + " Please consult error message above if there is any.\n"; + } + else + { + print STDERR "ERROR: xgettext failed to generate PO template file. Please consult\n". + " error message above if there is any.\n"; + } + } + exit (1); + } +} + +sub POFile_Update +{ + -f "$MODULE.pot" or die "$PROGRAM: $MODULE.pot does not exist.\n"; + + my $MSGMERGE = $ENV{"MSGMERGE"} || "msgmerge"; + my ($lang, $outfile) = @_; + + if (! isGNUGettextTool ("$MSGMERGE")) + { + print STDERR " *** GNU msgmerge is not found on this system!\n". + " *** Without it, intltool-update can not extract strings.\n"; + exit; + } + + print "Merging $SRCDIR/$lang.po with $MODULE.pot..." if $VERBOSE; + + my $infile = "$SRCDIR/$lang.po"; + $outfile = "$SRCDIR/$lang.po" if ($outfile eq ""); + + # I think msgmerge won't overwrite old file if merge is not successful + system ("$MSGMERGE", "-o", $outfile, $infile, "$MODULE.pot"); +} + +sub Console_WriteError_NotExisting +{ + my ($file) = @_; + + ## Report error if supplied language file is non-existing + print STDERR "$PROGRAM: $file does not exist!\n"; + print STDERR "Try '$PROGRAM --help' for more information.\n"; + exit; +} + +sub GatherPOFiles +{ + my @po_files = glob ("./*.po"); + + @languages = map (&POFile_GetLanguage, @po_files); + + foreach my $lang (@languages) + { + $po_files_by_lang{$lang} = shift (@po_files); + } +} + +sub POFile_GetLanguage ($) +{ + s/^(.*\/)?(.+)\.po$/$2/; + return $_; +} + +sub Console_Write_TranslationStatus +{ + my ($lang, $output_file) = @_; + my $MSGFMT = $ENV{"MSGFMT"} || "msgfmt"; + + if (! isGNUGettextTool ("$MSGFMT")) + { + print STDERR " *** GNU msgfmt is not found on this system!\n". + " *** Without it, intltool-update can not extract strings.\n"; + exit; + } + + $output_file = "$SRCDIR/$lang.po" if ($output_file eq ""); + + system ("$MSGFMT", "-o", "$devnull", "--verbose", $output_file); +} + +sub Console_Write_CoverageReport +{ + my $MSGFMT = $ENV{"MSGFMT"} || "msgfmt"; + + if (! isGNUGettextTool ("$MSGFMT")) + { + print STDERR " *** GNU msgfmt is not found on this system!\n". + " *** Without it, intltool-update can not extract strings.\n"; + exit; + } + + &GatherPOFiles; + + foreach my $lang (@languages) + { + print STDERR "$lang: "; + &POFile_Update ($lang, ""); + } + + print STDERR "\n\n * Current translation support in $MODULE \n\n"; + + foreach my $lang (@languages) + { + print STDERR "$lang: "; + system ("$MSGFMT", "-o", "$devnull", "--verbose", "$SRCDIR/$lang.po"); + } +} + +sub SubstituteVariable +{ + my ($str) = @_; + + # always need to rewind file whenever it has been accessed + seek (CONF, 0, 0); + + # cache each variable. varhash is global to we can add + # variables elsewhere. + while () + { + if (/^(\w+)=(.*)$/) + { + ($varhash{$1} = $2) =~ s/^["'](.*)["']$/$1/; + } + } + + if ($str =~ /^(.*)\${?([A-Z_]+)}?(.*)$/) + { + my $rest = $3; + my $untouched = $1; + my $sub = ""; + # Ignore recursive definitions of variables + $sub = $varhash{$2} if defined $varhash{$2} and $varhash{$2} !~ /\${?$2}?/; + + return SubstituteVariable ("$untouched$sub$rest"); + } + + # We're using Perl backticks ` and "echo -n" here in order to + # expand any shell escapes (such as backticks themselves) in every variable + return echo_n ($str); +} + +sub CONF_Handle_Open +{ + my $base_dirname = getcwd(); + $base_dirname =~ s@.*/@@; + + my ($conf_in, $src_dir); + + if ($base_dirname =~ /^po(-.+)?$/) + { + if (-f "Makevars") + { + my $makefile_source; + + local (*IN); + open (IN, ") + { + if (/^top_builddir[ \t]*=/) + { + $src_dir = $_; + $src_dir =~ s/^top_builddir[ \t]*=[ \t]*([^ \t\n\r]*)/$1/; + + chomp $src_dir; + if (-f "$src_dir" . "/configure.ac") { + $conf_in = "$src_dir" . "/configure.ac" . "\n"; + } else { + $conf_in = "$src_dir" . "/configure.in" . "\n"; + } + last; + } + } + close IN; + + $conf_in || die "Cannot find top_builddir in Makevars."; + } + elsif (-f "$SRCDIR/../configure.ac") + { + $conf_in = "$SRCDIR/../configure.ac"; + } + elsif (-f "$SRCDIR/../configure.in") + { + $conf_in = "$SRCDIR/../configure.in"; + } + else + { + my $makefile_source; + + local (*IN); + open (IN, ") + { + if (/^top_srcdir[ \t]*=/) + { + $src_dir = $_; + $src_dir =~ s/^top_srcdir[ \t]*=[ \t]*([^ \t\n\r]*)/$1/; + + chomp $src_dir; + $conf_in = "$src_dir" . "/configure.in" . "\n"; + + last; + } + } + close IN; + + $conf_in || die "Cannot find top_srcdir in Makefile."; + } + + open (CONF, "<$conf_in"); + } + else + { + print STDERR "$PROGRAM: Unable to proceed.\n" . + "Make sure to run this script inside the po directory.\n"; + exit; + } +} + +sub FindPackageName +{ + my $version; + my $domain = &FindMakevarsDomain; + my $name = $domain || "untitled"; + + &CONF_Handle_Open; + + my $conf_source; { + local (*IN); + open (IN, "<&CONF") || return $name; + seek (IN, 0, 0); + local $/; # slurp mode + $conf_source = ; + close IN; + } + + # priority for getting package name: + # 1. GETTEXT_PACKAGE + # 2. first argument of AC_INIT (with >= 2 arguments) + # 3. first argument of AM_INIT_AUTOMAKE (with >= 2 argument) + + # /^AM_INIT_AUTOMAKE\([\s\[]*([^,\)\s\]]+)/m + # the \s makes this not work, why? + if ($conf_source =~ /^AM_INIT_AUTOMAKE\(([^,\)]+),([^,\)]+)/m) + { + ($name, $version) = ($1, $2); + $name =~ s/[\[\]\s]//g; + $version =~ s/[\[\]\s]//g; + $varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\${?AC_PACKAGE_NAME}?/); + $varhash{"PACKAGE"} = $name if (not $name =~ /\${?PACKAGE}?/); + $varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\${?AC_PACKAGE_VERSION}?/); + $varhash{"VERSION"} = $version if (not $name =~ /\${?VERSION}?/); + } + + if ($conf_source =~ /^AC_INIT\(([^,\)]+),([^,\)]+)/m) + { + ($name, $version) = ($1, $2); + $name =~ s/[\[\]\s]//g; + $version =~ s/[\[\]\s]//g; + $varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\${?AC_PACKAGE_NAME}?/); + $varhash{"PACKAGE"} = $name if (not $name =~ /\${?PACKAGE}?/); + $varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\${?AC_PACKAGE_VERSION}?/); + $varhash{"VERSION"} = $version if (not $name =~ /\${?VERSION}?/); + } + + # \s makes this not work, why? + $name = $1 if $conf_source =~ /^GETTEXT_PACKAGE=\[?([^\n\]]+)/m; + + # m4 macros AC_PACKAGE_NAME, AC_PACKAGE_VERSION etc. have same value + # as corresponding $PACKAGE_NAME, $PACKAGE_VERSION etc. shell variables. + $name =~ s/\bAC_PACKAGE_/\$PACKAGE_/g; + + $name = $domain if $domain; + + $name = SubstituteVariable ($name); + $name =~ s/^["'](.*)["']$/$1/; + + return $name if $name; +} + + +sub FindPOTKeywords +{ + + my $keywords = "--keyword\=\_ --keyword\=N\_ --keyword\=U\_ --keyword\=Q\_"; + my $varname = "XGETTEXT_OPTIONS"; + my $make_source; { + local (*IN); + open (IN, "; + close IN; + } + + # unwrap lines split with a trailing \ + $make_source =~ s/\\ $ \n/ /mxg; + $keywords = $1 if $make_source =~ /^$varname[ ]*=\[?([^\n\]]+)/m; + + return $keywords; +} + +sub FindMakevarsDomain +{ + + my $domain = ""; + my $makevars_source; { + local (*IN); + open (IN, "; + close IN; + } + + $domain = $1 if $makevars_source =~ /^DOMAIN[ ]*=\[?([^\n\]\$]+)/m; + $domain =~ s/^\s+//; + $domain =~ s/\s+$//; + + return $domain; +} + +sub FindMakevarsBugAddress +{ + + my $address = ""; + my $makevars_source; { + local (*IN); + open (IN, "; + close IN; + } + + $address = $1 if $makevars_source =~ /^MSGID_BUGS_ADDRESS[ ]*=\[?([^\n\]\$]+)/m; + $address =~ s/^\s+//; + $address =~ s/\s+$//; + + return $address; +} diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..6a70353 --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,20 @@ +# List of source files containing translatable strings. +# Please keep this file sorted alphabetically. +data/gfax.desktop.in +data/gfax.schemas.in +glade/gfax.glade +glade/send-druid.glade +src/efax.cs +src/evolution.cs +src/fax.cs +src/gfaxphonebook.cs +src/gfaxprefs.cs +src/gfaxsend.cs +src/gui.cs +src/guitools.cs +src/hylafax.cs +src/main.cs +src/newphonebook.cs +src/phonebook.cs +src/sendphonebook.cs +src/Settings.cs diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..bcc9b68 --- /dev/null +++ b/po/de.po @@ -0,0 +1,1244 @@ +# English translations for gfax package. +# Copyright (C) 2004 THE gfax'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gfax package. +# George Farris , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: gfax 0.7.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-11-29 19:29-0800\n" +"PO-Revision-Date: 2006-11-30 21:05+0100\n" +"Last-Translator: Johannes Rohr \n" +"Language-Team: German \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../gfax.desktop.in.h:1 +msgid "Gfax Facsimile Program" +msgstr "Gfax-Faxprogramm" + +#: ../gfax.desktop.in.h:2 +msgid "Send and Receive Facsimiles" +msgstr "Faxe versenden und empfangen" + +#: ../gfax.schemas.in.h:1 +msgid "0:never, 1:until carrier, 2:always, 3:on receive only" +msgstr "0:nie, 1:bis zum Freizeichen, 2:immer, 3:nur beim Empfang" + +#: ../gfax.schemas.in.h:2 +msgid "0:very low, 1:low, 2:medium, 3:high" +msgstr "0:Sehr niedrig, 1:niedrig, 2:mittel, 3:hoch" + +#: ../gfax.schemas.in.h:3 +msgid "Modem Device" +msgstr "Modemgerät" + +#: ../gfax.schemas.in.h:4 +msgid "Modem initialization string" +msgstr "Initialisierungssequenz des Modems" + +#: ../gfax.schemas.in.h:5 +msgid "Modem reset string" +msgstr "Zeichenfolge zum Zurücksetzen des Modems" + +#: ../gfax.schemas.in.h:6 +msgid "Not currently used." +msgstr "Momentan nicht verwendet." + +#: ../gfax.schemas.in.h:7 +msgid "The initialization code that is sent to the modem." +msgstr "Der Initializierungscode, der an das Modem gesendet wird." + +#: ../gfax.schemas.in.h:8 +msgid "" +"The name of the lock file according to your system's conventions. If you're " +"running Linux you shouldn't have to touch this." +msgstr "" +"Der Name der Sperrdatei entsprechend den Konventionen Ihres Betriebssytems. \n" +"Wenn Sie Linux verwenden, brauchen Sie hier nichts zu ändern." + +#: ../gfax.schemas.in.h:9 +msgid "" +"The reset code that resets the modem to a power up state. The -Kz code works " +"with most modems." +msgstr "" +"Der Reset-Code setzt das Modem auf den Zustand unmittelbar nach dem Einschalten zurück.\n" +"Bei den meisten Modems funktioniert die Zeichenfolge -Kz" + +#: ../gfax.schemas.in.h:10 +msgid "" +"The serial port the modem is connected too. Typical values are ttyS0, cua0 " +"or modem." +msgstr "" +"Der serielle Anschluss, an dem das Modem angeschlossen ist. \n" +"Übliche Werte sind ttyS0, cua0 oder modem." + +#: ../glade/gfax.glade.h:1 +msgid "" +"\n" +"Please enter your Hylafax server information here. If you are running " +"Hylafax on the same computer That you are using Gfax on then \"Host Name\" " +"should be set to \"localhost\".\n" +msgstr "" +"\n" +"Bitte geben Sie hier die Daten für Ihren Hylafax-Server ein. Falls\n" +"Hylafax auf demselben Computer läuft, auf dem Sie Gfax nutzen, dann\n" +"sollte der \"Rechnername\" \"localhost\" lauten. \n" + +#: ../glade/gfax.glade.h:4 +msgid " Program: " +msgstr " Programm: " + +#: ../glade/gfax.glade.h:5 +msgid "4559" +msgstr "4559" + +#: ../glade/gfax.glade.h:6 +msgid "E-Mail Notification" +msgstr "E-Mail-Benachrichtung" + +#: ../glade/gfax.glade.h:7 +msgid "Efax Setup" +msgstr "Einrichtung von Efax" + +#: ../glade/gfax.glade.h:8 +msgid "Facsimile Viewer Program" +msgstr "Faxbetrachter" + +#: ../glade/gfax.glade.h:9 +msgid "Fax Properties" +msgstr "Fax-Eigenschaften" + +#: ../glade/gfax.glade.h:10 +msgid "Fax Transport Agent" +msgstr "Fax Transport Agent" + +#: ../glade/gfax.glade.h:11 +msgid "Hylafax Setup" +msgstr "Einrichtung von Hylafax" + +#: ../glade/gfax.glade.h:12 +msgid "Phone Information" +msgstr "Phone Information" + +#: ../glade/gfax.glade.h:13 +msgid "Transmit Properties" +msgstr "Transmit Properties" + +#: ../glade/gfax.glade.h:14 +msgid "Alter facsimile job parameters" +msgstr "Paramenter des Faxauftrags ändern" + +#: ../glade/gfax.glade.h:15 +msgid "Server" +msgstr "Server" + +#: ../glade/gfax.glade.h:16 +msgid "" +"ATT (Dataport, Paradyne)\n" +"Motorola (Power Modem, 3400 Pro,...\n" +"QuickComm (Spirit II)\n" +"USR (Courier, Sportster)\n" +"Multi-Tech (for bit reversal)\n" +"User Defined\n" +msgstr "" + +#: ../glade/gfax.glade.h:23 +msgid "Auto Refresh Queue" +msgstr "Auto Refresh Queue" + +#: ../glade/gfax.glade.h:24 +msgid "" +"Complete...\n" +"\n" +"Your new phone book is ready.\n" +"If this is a Gfax type phone book you may\n" +"now add items. \n" +"\n" +"Evolution phone books are read only\n" +"but may be change through Evolution." +msgstr "" +"Ihr neues Telefonbuch ist eingerichtet.\n" +"Falls es vom Typ Gfax ist, können Sie jetzt\n" +"neue Einträge hinzufügen.\n" +"\n" +"Evolution-Adressbücher können von Gfax nur gelesen\n" +"werden und können in Evolution geändert werden." + +# +#: ../glade/gfax.glade.h:32 +msgid "Completed Jobs" +msgstr "Abgeschlossene Aufträge" + +#: ../glade/gfax.glade.h:33 +msgid "Database" +msgstr "Database" + +#: ../glade/gfax.glade.h:34 ../glade/send-druid.glade.h:11 +msgid "Delete" +msgstr "Löschen" + +#: ../glade/gfax.glade.h:35 +msgid "Dial Prefix:" +msgstr "Wählpräfix:" + +#: ../glade/gfax.glade.h:36 +msgid "E-Mail Address:" +msgstr "E-Mail-Adresse:" + +#: ../glade/gfax.glade.h:37 +msgid "E-Mail Notification" +msgstr "E-Mail-Benachrichtigung" + +#: ../glade/gfax.glade.h:38 +msgid "Efax" +msgstr "Efax" + +#: ../glade/gfax.glade.h:39 +msgid "Evolution" +msgstr "Evolution" + +#: ../glade/gfax.glade.h:40 +msgid "Evolution Address books" +msgstr "Evolution-Adressbücher" + +#: ../glade/gfax.glade.h:41 +msgid "Exit" +msgstr "Exit" + +#: ../glade/gfax.glade.h:42 +msgid "Facsimile Number:" +msgstr "Faxnummer:" + +#: ../glade/gfax.glade.h:43 +msgid "Facsimiles to Send" +msgstr "Faxausgang" + +#: ../glade/gfax.glade.h:44 +msgid "Fax Number:" +msgstr "Faxnummer:" + +#: ../glade/gfax.glade.h:45 +msgid "Fax Status:" +msgstr "Faxstatus:" + +#: ../glade/gfax.glade.h:46 +msgid "Fax log enabled" +msgstr "Fax-Protokollierung aktiv" + +#: ../glade/gfax.glade.h:47 +msgid "" +"First we must choose a transport agent. \n" +"\n" +"A transport agent is a software package that is responsible for\n" +"actually sending the facsimile with your modem. If you don't have \n" +"one of these installed you should hit cancel here and install\n" +"a transport agent first.\n" +"\n" +"Transport agents can be found at the following URL's but you should \n" +"check your distribution CD first..\n" +"\n" +"Hylafax - http://www.hylafax.org\n" +"Efax - http://www.cce.com/efax" +msgstr "" +"Zunächst müssen Sie ein Programm zur Faxübertragung auswählen.\n" +"\n" +"Dies ist ein Programm, das den eigentlichen Versand des Faxes über das\n" +"Modem vornimmt. Wenn Sie keine solches Programm installiert haben,\n" +"sollten Sie jetzt abbrechen und zunächst ein Programm zur\n" +"Faxübertragung installieren.\n" +"\n" +"Übertragungsprogramme können unter den folgenden URLs gefunden werden,\n" +"aber sie sollten es zuerst mit der CD Ihrer Distribution versuchen.\n" +"\n" +"Hylafax - http://www.hylafax.org\n" +"Efax - http://www.cce.com/efax" + +#: ../glade/gfax.glade.h:59 +msgid "Gfax" +msgstr "Gfax" + +#: ../glade/gfax.glade.h:60 +msgid "Gfax - E-Mail Address" +msgstr "Gfax - E-Mail Addresse" + +#: ../glade/gfax.glade.h:61 +msgid "Gfax - Facsimile Transport Agent" +msgstr "Gfax - Programm zur Faxübertragung" + +#: ../glade/gfax.glade.h:62 +msgid "Gfax - Gnome facsimile program" +msgstr "Gfax - Gnome-Faxprogramm" + +#: ../glade/gfax.glade.h:63 +msgid "Gfax - Modem Selection" +msgstr "Gfax - Modemauswahl" + +#: ../glade/gfax.glade.h:64 +msgid "Gfax - Phone Number Information" +msgstr "Gfax - Telefonnummern" + +#: ../glade/gfax.glade.h:65 +msgid "Gfax - Setup Complete" +msgstr "Gfax - Einrichtung abgeschlossen" + +#: ../glade/gfax.glade.h:66 +msgid "Gfax - Add new phone book." +msgstr "Gfax - Neues Telefonbuch hinzufügen" + +#: ../glade/gfax.glade.h:67 +msgid "Gfax - Modify Job" +msgstr "Gfax - Auftrag ändern" + +#: ../glade/gfax.glade.h:68 +msgid "Gfax - New user setup" +msgstr "Gfax - Einrichtigung für neuen Benutzer" + +#: ../glade/gfax.glade.h:69 +msgid "Gfax - Preferences" +msgstr "Gfax - Einstellungen" + +#: ../glade/gfax.glade.h:70 +msgid "Gfax - Transmission Progress" +msgstr "Gfax - Fortschritt der Übertragung" + +#: ../glade/gfax.glade.h:71 +msgid "" +"Gfax can inform the Efax transport agent which\n" +"serial port your modem is connected to." +msgstr "" +"Gfax kann die Hilfsprogramm Efax darüber informieren, an\n" +"welchen seriellen Anschluss Ihr Modem angeschlossen ist." + +#: ../glade/gfax.glade.h:73 +msgid "" +"Gfax setup is now complete!\n" +"\n" +"Gfax is configurable; there are other configuration \n" +"options available under the preferences menu.\n" +"\n" +"You can run this first time setup at any time from\n" +"the preferences section.\n" +"\n" +"Default preferences have been choosen for the\n" +"transport agent you chose, you may want to\n" +"customise them." +msgstr "" +"Gfax ist jetzt vollständig eingerichtet.\n" +"\n" +"Gfax ist anpassbar, es gibt weitere KOnfigurationsoptionen im\n" +"Einrichtungsmenu.\n" +"\n" +"Sie können diesen Einrichtungsassistenten jederzeit aus dem\n" +"Einrichtungsmenü heraus aufrufen.\n" +"\n" +"Für das gewählte Faxtransportprogramm wurden Vorgabeeinstellungen\n" +"gewählt, die Sie wahrscheinlich an Ihre Bedürfnisse anpassen sollten." + +#: ../glade/gfax.glade.h:84 +msgid "Hi Resolution Mode" +msgstr "Hohe Auflösung" + +#: ../glade/gfax.glade.h:85 +msgid "Host Name:" +msgstr "Rechnername:" + +#: ../glade/gfax.glade.h:86 +msgid "Hostname:" +msgstr "Rechnername:" + +#: ../glade/gfax.glade.h:87 +msgid "Hylafax" +msgstr "Hylafax" + +#: ../glade/gfax.glade.h:88 +msgid "Hylafax - Choose this for network faxing." +msgstr "Hylafax - Wählen Sie dies für netzwerkbasierten Faxversand." + +#: ../glade/gfax.glade.h:89 +msgid "" +"Hylafax and Mgetty+Sendfax can both be requested to send \n" +"results of facsimile transmission to an email address.\n" +"\n" +"If you require this feature please enter your email address\n" +"here. It's a good idea to include this even if you don't \n" +"use it immediately, you can enable and disable it in the\n" +"preferences section of Gfax.\n" +" " +msgstr "" +"Hylafax und Mgetty+Sendfax können beide so eingestellt werden, dass\n" +"sie das Ergebnismeldung der Faxübertragung an eine Email-Adresse\n" +"senden.\n" +"\n" +"Wenn Sie diese Funktion benötigen, geben Sie bitte Ihrer Email-Adresse\n" +"hier ein. Selbst wenn Sie dies nicht unmittelbar benötigen, ist es ist\n" +"eine gute Idee, diese anzugeben, sie können es in den\n" +"Gfax-Einstellungen ein- und ausschalten.\n" +" " + +#: ../glade/gfax.glade.h:97 +msgid "IP Port:" +msgstr "IP Port:" + +#: ../glade/gfax.glade.h:98 +msgid "LDAP" +msgstr "LDAP" + +#: ../glade/gfax.glade.h:99 +msgid "Log Enabled" +msgstr "Protokoll aktiviert" + +#: ../glade/gfax.glade.h:100 +msgid "" +"Make no more than calls in attempting to send the facsimile. " +"Once has been reached, the job will be killed." +msgstr "" +"Nicht mehr als Versuche zum Versand des Faxes unternehmen. \n" +"Wenn erreicht ist, wird der Auftrag verworfen." + +#: ../glade/gfax.glade.h:101 +msgid "Maximum Dials:" +msgstr "Maximale Anwahlversuche:" + +#: ../glade/gfax.glade.h:102 +msgid "Mgetty" +msgstr "Mgetty" + +#: ../glade/gfax.glade.h:103 +msgid "Modem Connection" +msgstr "Modem-Verbindung" + +#: ../glade/gfax.glade.h:104 +msgid "Modem Port:" +msgstr "Modem-Anschluss" + +#: ../glade/gfax.glade.h:105 +msgid "Modem Type:" +msgstr "Modemtyp" + +#: ../glade/gfax.glade.h:106 +msgid "New Fax" +msgstr "Neues Fax" + +#: ../glade/gfax.glade.h:107 ../glade/send-druid.glade.h:23 +msgid "New phone book" +msgstr "Neues Telefonbuch" + +#: ../glade/gfax.glade.h:108 +msgid "Open phone book" +msgstr "Telefonbuch öffenen" + +#: ../glade/gfax.glade.h:109 +msgid "Page Size:" +msgstr "Seitenformat" + +#: ../glade/gfax.glade.h:110 +msgid "Password Dialog" +msgstr "Passwortdialog" + +#: ../glade/gfax.glade.h:111 ../glade/send-druid.glade.h:26 +#: ../src/newphonebook.cs:81 +msgid "Phone Book" +msgstr "Telefonbuch" + +#: ../glade/gfax.glade.h:112 +msgid "Please enter a name for your new phone book." +msgstr "Bitte geben Sie einen Namen für Ihr neues Telefonbuch ein." + +#: ../glade/gfax.glade.h:113 +msgid "" +"Please enter the password \n" +"for your fax server." +msgstr "" +"Bitte geben Sie das Passwort\n" +"für Ihren Faxserver ein." + +#: ../glade/gfax.glade.h:115 +msgid "" +"Please enter the type of phone book you are creating." +msgstr "" +"Bitte legen Sie fest, welchen Typ von Telefonbuch Sie anlegen." + +#: ../glade/gfax.glade.h:121 +msgid "" +"Please enter your facsimile number.\n" +"\n" +"This number is placed in the top one line header that is placed \n" +"on all outgoing facsimiles.\n" +"\n" +"You may also choose a default dial prefix. Many companies in\n" +"North America use the number \"9\" to reach an outside line.\n" +msgstr "" +"Bitte geben Sie Ihre Faxnummer ein.\n" +"\n" +"Diese Nummer wird in der Kopfzeile aller ausgehenden Faxe verwendet.\n" +"\n" +"Sie können auch eine Nummer zur Amtsholung eingeben. Viele Unternehmen\n" +"in Nordamerika verwenden die Nummer \"9\", um eine Amtsleitung zu\n" +"erreichen. (In Europa ist dagegen die \"0\" üblich, Anmerkung des\n" +"Übersäzzas)\n" + +#: ../glade/gfax.glade.h:129 +msgid "" +"Please select the Evolution address books that you would \n" +"like to use.\n" +"\n" +"These are only local address books and will only include\n" +"contacts with facsimile numbers." +msgstr "" +"Bitte wählen Sie die Evolution-Adressbücher aus, die sie verwenden möchten.\n" +"\n" +"Es werden nur lokale Adressbücher angezeigt und ausschließlich \n" +"Kontakte mit Faxnummern werden verfügbar gemacht." + +#: ../glade/gfax.glade.h:134 +msgid "Port Number:" +msgstr "Portnummer" + +#: ../glade/gfax.glade.h:135 +msgid "Received Facsimiles" +msgstr "Empfangene Faxe" + +#: ../glade/gfax.glade.h:136 +msgid "Remember this password" +msgstr "An dieses Passwort erinnern" + +#: ../glade/gfax.glade.h:137 +msgid "Send Email Notification" +msgstr "Per Email benachrichtigen" + +#: ../glade/gfax.glade.h:138 +msgid "Send Immediately" +msgstr "Sofort senden" + +#: ../glade/gfax.glade.h:139 +msgid "Speaker Volume:" +msgstr "Lautstärke:" + +#: ../glade/gfax.glade.h:140 +msgid "System" +msgstr "System" + +#: ../glade/gfax.glade.h:141 +msgid "" +"The TCP/IP port number of the fax server. Default hylafax port is 4559." +msgstr "" +"Der TCP/IP-Port für den Fax-Server. Der Standardport für Hylafax ist 4559." + +#: ../glade/gfax.glade.h:142 +msgid "" +"The host name of the network fax server. Enter \"localhost\" if you are not " +"using a network fax server." +msgstr "" +"Der Rechnername des Faxservers im Netzwerk. Geben Sie \"localhost\" ein,\n" +"wenn sie keinen Fax-Server im Netzwerk verwenden." + +#: ../glade/gfax.glade.h:143 +msgid "The serial port the modem is on - ttyS0 is COM1, ttyS1 is COM2 etc." +msgstr "" +"Der serielle Anschluss, an dem das Modem angeschlossen ist - ttyS0 ist\n" +"COM1, ttyS1 ist COM2 usw." + +#: ../glade/gfax.glade.h:144 +msgid "" +"There was an error transmitting\n" +"your facsimile to the server!" +msgstr "" +"Fehler bei der Übermittlung \n" +"des Faxes an den Server!" + +#: ../glade/gfax.glade.h:146 +msgid "" +"This will lead you through the process \n" +"of creating a new phone book." +msgstr "" +"Dieser Assistent ist Ihnen beim Erstellen \n" +"eines neuen Telefonbuchs behilflich." + +#: ../glade/gfax.glade.h:148 +msgid "Time to send:" +msgstr "Sendezeit" + +#: ../glade/gfax.glade.h:149 +msgid "" +"Transmitting facsimile to \n" +"Hylafax server." +msgstr "" +"Übermittle Fax an\n" +"Hylafax-Server." + +#: ../glade/gfax.glade.h:151 +msgid "Transport Agent" +msgstr "Transportprogramm" + +#: ../glade/gfax.glade.h:152 +msgid "Use Cover Page" +msgstr "Deckblatt benutzen" + +#: ../glade/gfax.glade.h:153 +msgid "Use Fine Resolution" +msgstr "Hohe Auflösung benutzen" + +#: ../glade/gfax.glade.h:154 +msgid "User" +msgstr "Benutzer" + +#: ../glade/gfax.glade.h:155 +msgid "Username:" +msgstr "Benutzername:" + +#: ../glade/gfax.glade.h:156 +msgid "" +"Very Low\n" +"Low\n" +"Medium\n" +"High" +msgstr "" +"Sehr niedrig\n" +"Niedrig\n" +"Mittel\n" +"Hoch" + +#: ../glade/gfax.glade.h:160 +msgid "View / Print" +msgstr "Betrachten / Drucken" + +#: ../glade/gfax.glade.h:161 +msgid "" +"Welcome to Gfax!\n" +"\n" +"\n" +"Gfax is a GNOME facsimile program that provides \n" +"the familiar \"popup\" window when printing to a fax \n" +"printer.\n" +"\n" +"The following pages will help you to setup Gfax." +msgstr "" +"msgid \"c2.0\"\n" +"msgstr \"\"" + +#: ../glade/gfax.glade.h:169 +msgid "Which serial port is your modem connected to?" +msgstr "An welchen seriellen Anschluss ist Ihr Modem angeschlossen?" + +#: ../glade/gfax.glade.h:170 +msgid "" +"Your facsimile was sucessfully\n" +" transmitted!" +msgstr "" +"Ihr Fax wurde erfolgreich \n" +"übermittelt." + +#: ../glade/gfax.glade.h:172 +msgid "_Cancel Job" +msgstr "_Auftrag abbrechen" + +#: ../glade/gfax.glade.h:173 +msgid "_Fax" +msgstr "_Fax" + +#: ../glade/gfax.glade.h:174 +msgid "_Help" +msgstr "_Hilfe" + +#: ../glade/gfax.glade.h:175 +msgid "_Modify Job" +msgstr "_Auftrag ändern" + +#: ../glade/gfax.glade.h:176 +msgid "_Settings" +msgstr "_Einstellungen" + +#: ../glade/gfax.glade.h:177 +msgid "cua1" +msgstr "cua1" + +#: ../glade/gfax.glade.h:178 +msgid "cua2" +msgstr "cua2" + +#: ../glade/gfax.glade.h:179 +msgid "" +"letter\n" +"legal\n" +"a4" +msgstr "" +"letter\n" +"legal\n" +"a4" + +#: ../glade/gfax.glade.h:182 +msgid "localhost" +msgstr "localhost" + +#: ../glade/gfax.glade.h:183 +msgid "modem" +msgstr "modem" + +#: ../glade/gfax.glade.h:184 +msgid "oklabel" +msgstr "oklabel" + +#: ../glade/gfax.glade.h:185 +msgid "ttyS0" +msgstr "ttyS0" + +#: ../glade/gfax.glade.h:186 +msgid "ttyS1" +msgstr "ttyS1" + +#: ../glade/gfax.glade.h:187 +msgid "ttyS2" +msgstr "ttyS2" + +#: ../glade/gfax.glade.h:188 +msgid "ttyS3" +msgstr "ttyS3" + +#: ../glade/send-druid.glade.h:1 +msgid "Current Phone Books" +msgstr "Aktuelle Telefonbücher" + +#: ../glade/send-druid.glade.h:2 +msgid "Edit Phone book" +msgstr "Telefonbücher bearbeiten" + +#: ../glade/send-druid.glade.h:3 +msgid "Facsimile Job Details" +msgstr "Faxauftrags-Details" + +#: ../glade/send-druid.glade.h:4 +msgid "New fax information" +msgstr "New fax information" + +#: ../glade/send-druid.glade.h:5 +msgid "Add" +msgstr "Add" + +#: ../glade/send-druid.glade.h:6 +msgid "Browse" +msgstr "Durchsuchen" + +#: ../glade/send-druid.glade.h:7 +msgid "Clear" +msgstr "Löschen" + +#: ../glade/send-druid.glade.h:8 +msgid "Close" +msgstr "Schließen" + +#: ../glade/send-druid.glade.h:9 ../src/gfaxphonebook.cs:89 +#: ../src/gfaxsend.cs:142 ../src/sendphonebook.cs:105 +msgid "Contact" +msgstr "Kontakt" + +#: ../glade/send-druid.glade.h:10 +msgid "Current Phone Book" +msgstr "Gewähltes Telefonbuch" + +#: ../glade/send-druid.glade.h:12 +msgid "Delete phone book" +msgstr "Telefonbuch löschen" + +#: ../glade/send-druid.glade.h:13 +msgid "Details" +msgstr "Details" + +#: ../glade/send-druid.glade.h:14 +msgid "E-Mail job results to:" +msgstr "Ergebnis der Faxübertragung per Email senden an:" + +#: ../glade/send-druid.glade.h:15 +msgid "Enter a phone number and hit ." +msgstr "Geben Sie eine Telefonnummer ein und drücken Sie die Eingabetaste." + +#: ../glade/send-druid.glade.h:16 +msgid "Fax number:" +msgstr "Faxnummer:" + +#: ../glade/send-druid.glade.h:17 +msgid "Fine resolution" +msgstr "Hohe Auflösung" + +#: ../glade/send-druid.glade.h:18 +msgid "Gfax - Phone Book Selection" +msgstr "Gfax - Auswahl des Telefonbuchs" + +#: ../glade/send-druid.glade.h:19 +msgid "Gfax - Phone books" +msgstr "Gfax - Telefonbücher" + +#: ../glade/send-druid.glade.h:20 +msgid "Job" +msgstr "Auftrag" + +#: ../glade/send-druid.glade.h:21 +msgid "New Entry" +msgstr "Neuer Eintrag" + +#: ../glade/send-druid.glade.h:22 +msgid "New Item" +msgstr "Neuer Eintrag" + +#: ../glade/send-druid.glade.h:24 ../src/gui.cs:238 ../src/gui.cs:249 +msgid "Number" +msgstr "Nummer" + +#: ../glade/send-druid.glade.h:25 ../src/gfaxphonebook.cs:87 +#: ../src/gfaxsend.cs:141 ../src/sendphonebook.cs:103 +msgid "Organization" +msgstr "Organisation" + +#: ../glade/send-druid.glade.h:27 +msgid "Phone Book Item List" +msgstr "Liste der Telefonbucheinträge" + +#: ../glade/send-druid.glade.h:28 +msgid "Phone Books" +msgstr "Telefonbücher" + +#: ../glade/send-druid.glade.h:29 +msgid "Postscript file:" +msgstr "Postscript-Datei:" + +#: ../glade/send-druid.glade.h:30 +msgid "Save and Close" +msgstr "Speichern und schließen" + +#: ../glade/send-druid.glade.h:31 +msgid "Save and close" +msgstr "Speichern und schließen" + +#: ../glade/send-druid.glade.h:32 ../src/gfaxsend.cs:139 +msgid "Send" +msgstr "Senden" + +#: ../glade/send-druid.glade.h:33 +msgid "Send Fax" +msgstr "Fax senden" + +#: ../glade/send-druid.glade.h:34 +msgid "Send immediately" +msgstr "Sofort senden" + +#: ../glade/send-druid.glade.h:35 +msgid "Transmit the fax" +msgstr "Fax übermitteln" + +#: ../glade/send-druid.glade.h:36 +msgid "Update" +msgstr "Aktualisieren" + +#: ../glade/send-druid.glade.h:37 +msgid "_File" +msgstr "_Datei" + +#: ../src/efax.cs:384 +msgid "Scanning control files." +msgstr "Steuerdateien werden überprüft." + +#: ../src/efax.cs:397 +msgid "Running job " +msgstr "Auftrag wird ausgeführt." + +#: ../src/efax.cs:421 ../src/efax.cs:508 +msgid "Busy retries exceeded" +msgstr "Höchstanzahl der Wählversuche bei Besetzt überschritten" + +#: ../src/efax.cs:468 +msgid "Sending facsimile..." +msgstr "Fax wird versandt..." + +#. If successful then mv the control file to the done queue and flag +#. a date for it's removal. +#: ../src/efax.cs:492 +msgid "Success" +msgstr "Erfolg" + +#. fatal errors - no retry +#. fatalError = true; +#. change code in file +#: ../src/efax.cs:516 +msgid "Fatal error" +msgstr "Fehler" + +#. Modem error - no retry +#. fatalError = true; +#: ../src/efax.cs:522 +msgid "Fatal modem error" +msgstr "Schwerwiegender Modemfehler" + +#. Modem not responding +#. fatalError = true; +#: ../src/efax.cs:528 +msgid "Modem not responding" +msgstr "Modem antwortet nicht." + +#. Program terminated +#. fatalError = true; +#: ../src/efax.cs:534 +msgid "Program terminated" +msgstr "Programm beendet" + +#: ../src/fax.cs:60 +msgid "No Connection" +msgstr "Keine Verbindung" + +#: ../src/fax.cs:71 +msgid "" +"Efax transmit process running...\n" +"Scanning job files every 30 seconds." +msgstr "" +"Efax-Faxübertragung läuft...\n" +"Auftragsdateien werden alle 30 Sekunden überprüft." + +#: ../src/fax.cs:77 +msgid "Error transport agent not specified!" +msgstr "Fehler: Faxtransportprogramm nicht angegeben!" + +#: ../src/fax.cs:132 +msgid "Run" +msgstr "Ausführen" + +#: ../src/fax.cs:135 +msgid "Sleep" +msgstr "Pausieren" + +#: ../src/fax.cs:138 +msgid "Block" +msgstr "Blockieren" + +#: ../src/fax.cs:141 +msgid "Busy" +msgstr "Besetzt" + +#: ../src/fax.cs:144 ../src/fax.cs:244 +msgid "Done" +msgstr "Erledigt" + +#: ../src/fax.cs:147 +msgid "Fail" +msgstr "Fehlschlag" + +#: ../src/fax.cs:150 +msgid "New" +msgstr "Neu" + +#: ../src/fax.cs:241 +msgid "Receiving" +msgstr "Empfange" + +#: ../src/gfaxphonebook.cs:88 ../src/gfaxsend.cs:140 +#: ../src/sendphonebook.cs:104 +msgid "Phone Number" +msgstr "Telefonnummer" + +#: ../src/gfaxphonebook.cs:213 +msgid "Are you sure you want to delete the phone book?" +msgstr "Sind Sie sicher, dass Sie dieses Telefonbuch löschen wollen?" + +#: ../src/gfaxphonebook.cs:297 +msgid "" +"You have unsaved phone book entries.\n" +" Are you sure you want to Quit?" +msgstr "" +"Es gibt ungespeicherte Telefonbucheinträge. \n" +"Sind Sie sicher, dass Sie beenden wollen? " + +#: ../src/gfaxphonebook.cs:460 +msgid "Press the key to delete an entry." +msgstr "Drücken Sie die Entfernen-Taste um einen Eintrag zu löschen." + +#: ../src/gfaxprefs.cs:190 ../src/gfaxprefs.cs:208 +msgid "You need to exit Gfax and restart it when you change transport agents" +msgstr "Sie müssen Gfax beenden und neu starten, wenn Sie ein anderes Faxübertragungsprogramm ausgewählt haben." + +#: ../src/gfaxsend.cs:88 +msgid "" +"\n" +"This is the first time you have run Gfax.\n" +"Please run Gfax from the menu or command line and set your \n" +"MODEM TYPE, PORT and Fax number under preferences.\n" +"\n" +"Gfax is initially setup to use Efax, you may change it use \n" +"Hylafax if you prefer or require connection to a network \n" +"facsimile server." +msgstr "" +"\n" +"Sie haben Gfax zum ersten Mal gestartet. Bitte führen Sie Gfax vom\n" +"Menü oder der Kommandozeile aus und stellen Sie in den Einstellungen\n" +"den Typ, Anschluss ihres Modems sowie Ihre Faxnummer ein.\n" +"\n" +"Gfax ist per Vorgabe darauf eingerichtet, Efax zu verwenden. Sie\n" +"können dies auf Hylafax ändern, wenn Sie eine Verbindung mit einem\n" +"Faxserver im Netzwerk benötigen oder bevorzugen." + +#: ../src/gfaxsend.cs:164 +msgid "Spooled from print job" +msgstr "Aus Druckauftrag" + +#: ../src/gfaxsend.cs:276 +msgid "" +"\n" +"The file you have entered does not exist.\n" +"Please check the name and try again." +msgstr "" +"\n" +"Die Datei, die Sie angegeben haben, existiert nicht.\n" +"Bitte überprüfen Sie den Namen und versuchen Sie es erneut." + +#: ../src/gfaxsend.cs:310 +msgid "" +"\n" +"You have not entered a facsimile number!\n" +"Please enter a number and press the Enter key or\n" +"click the Phone Book button to select numbers or\n" +"entire phone books." +msgstr "" +"\n" +"Sie haben keine Faxnummer angegeben!\n" +"Bitte geben Sie eine Faxnummer ein und drücken Sie die Eingabetaste oder\n" +"klicken Sie auf das Telefonbücher-Symbol um Nummern oder\n" +"ganze Telefonbücher auszuwählen." + +#: ../src/gui.cs:143 +msgid "" +"\n" +"This is the first time you have run Gfax.\n" +"You should set your MODEM TYPE and PORT under preferences.\n" +"\n" +"Gfax is initially setup to use Efax, you may change it use \n" +"Hylafax if you prefer or require connection to a network \n" +"facsimile server." +msgstr "" +"\n" +"Sie haben Gfax zum ersten Mal gestartet.\n" +"Sie sollten den Typ und den Anschluss Ihres Modems in den Einstellungen auswählen.\n" +"\n" +"Gfax ist per Vorgabe darauf eingerichtet, Efax zu verwenden. Sie können dies auf\n" +"Hylafax ändern, wenn Sie eine Verbindung mit einem Faxserver im Netzwerk benötigen oder\n" +"bevorzugen." + +#: ../src/gui.cs:157 +msgid "" +"Your spool directory is missing!\n" +"\t\t\t\t\t\n" +"Please login as the root user and create the " +msgstr "" +"Das Spool-Verzeichnis fehlt!\n" +"\n" +"Bitte melden Sie sich als Benutzer root an und erzeugen Sie das " + +#: ../src/gui.cs:161 +msgid "" +" directory.\n" +"\n" +"All users should be able to write to it.\n" +msgstr "" +" Verzeichnis.\n" +"\n" +"Es sollte für alle Benutzer beschreibbar sein.\n" + +#: ../src/gui.cs:166 +msgid "" +"The doneq directory is missing in your spool directory!\n" +"\t\t\t\t\t\n" +"Please login as the root user and create the " +msgstr "" +"In Ihrem Spool-Verzeichnis fehlt das Unterverzeichnis doneq!\n" +"\n" +"Bitte melden Sie sich als Benutzer root and und erzeugen Sie das " + +#: ../src/gui.cs:169 +msgid "" +"/doneq directory.\n" +"\n" +"All users should be able to write to it.\n" +msgstr "" +"Verzeichnis /doneq.\n" +"\n" +"Es sollte für alle Benutzer beschreibbar sein.\n" + +#: ../src/gui.cs:175 +msgid "" +"The recq directory is missing in your spool directory!\n" +"\t\t\t\t\t\n" +"Please login as the root user and create the " +msgstr "" +"In Ihrem Spool-Verzeichnis fehlt das Unterverzeichnis recq!\n" +"\n" +"Bitte melden Sie sich als Benutzer root and und erzeugen Sie das " + +#: ../src/gui.cs:178 +msgid "" +"/recq directory.\n" +"\n" +"All users should be able to write to it.\n" +msgstr "" +"Verzeichnis /recq.\n" +"\n" +"Es sollte für alle Benutzer beschreibbar sein.\n" + +#: ../src/gui.cs:237 ../src/gui.cs:248 +msgid "Jobid" +msgstr "Auftragsnummer" + +#: ../src/gui.cs:239 ../src/gui.cs:250 ../src/gui.cs:259 +msgid "Status" +msgstr "Status" + +#: ../src/gui.cs:240 ../src/gui.cs:251 +msgid "Owner" +msgstr "Besitzer" + +#: ../src/gui.cs:241 ../src/gui.cs:252 +msgid "Pages" +msgstr "Seiten" + +#: ../src/gui.cs:242 ../src/gui.cs:253 +msgid "Dials" +msgstr "Anwahlversuche" + +#: ../src/gui.cs:243 ../src/gui.cs:254 +msgid "Send At" +msgstr "Senden um" + +#: ../src/gui.cs:244 ../src/gui.cs:255 +msgid "Error" +msgstr "Fehler" + +#: ../src/gui.cs:258 +msgid "Sender" +msgstr "Absender" + +#: ../src/gui.cs:260 +msgid "Pages " +msgstr "Seiten " + +#: ../src/gui.cs:261 +msgid "Arrived" +msgstr "Eingegangen" + +#: ../src/gui.cs:262 +msgid "Filename" +msgstr "Dateiname" + +#: ../src/gui.cs:666 +msgid "" +"Cannot read the facsimile file from the server. You most likely do not \n" +"have permission to read the file. Check the settings on your fax server." +msgstr "" +"Die Faxdatei auf dem Server kann nicht gelesen werden. Sie haben wahrscheinlich\n" +"nicht die nötigen Zugriffsrechte. Bitte überprüfen Sie die Einstellungen Ihres Faxservers." + +#: ../src/gui.cs:673 +msgid "" +"Cannot start your faxviewer program. \n" +"Please check your settings. It is currently set to " +msgstr "" +"Der Faxbetrachter kann nicht gestartet werden.\n" +"Bitte überprüfen Sie Ihre Einstellungen. Im Moment ist folgendes eingestellt: " + +#: ../src/gui.cs:674 +msgid "." +msgstr "." + +#: ../src/gui.cs:709 +msgid "" +"Cannot delete the facsimile file from the server. You most likely do not \n" +"have permission to delete the file. Check the settings on your fax server." +msgstr "" +"Die Faxdatei auf dem Server kann nicht gelöscht werden. Sie haben wahrscheinlich\n" +"nicht die nötigen Zugriffsrechte. Bitte überprüfen Sie die Einstellungen Ihres Faxservers." + +#: ../src/gui.cs:715 +msgid "" +"Cannot delete the file on the Hylafax server. \n" +"Please check your settings or contact your system Administrator" +msgstr "" +"Die Datei auf dem Hylafax-Server kann nicht gelesen werden. \n" +"Bitte überprüfen Sie die Einstellungen oder benachrichtigen Sie Ihren Systemverwalter." + +#: ../src/gui.cs:785 +msgid "Copyright (C) 2003 George Farris " +msgstr "Copyright (C) 2003 George Farris " + +#: ../src/gui.cs:786 +msgid "A Facsimile application for GNOME" +msgstr "Ein Faxprogramm für GNOME" + +#: ../src/gui.cs:831 +msgid "Refreshing server status..." +msgstr "Serverstatus wird aktualisiert..." + +#: ../src/gui.cs:868 +msgid "Refreshing queue..." +msgstr "Warteschlange wird aktualisiert..." + +#: ../src/gui.cs:934 ../src/gui.cs:953 +msgid "There are " +msgstr "Es gibt " + +#: ../src/gui.cs:934 ../src/gui.cs:953 +msgid " jobs in the queue" +msgstr " Aufträge in der Warteschlange" + +#: ../src/gui.cs:941 ../src/gui.cs:960 +msgid "There are 0 jobs in the queue" +msgstr "Es ist kein Auftrag in der Warteschlange." + +#: ../src/hylafax.cs:146 +msgid "You can not write data to this stream" +msgstr "Sie können in diesen Strom keine Daten schreiben." + +#: ../src/hylafax.cs:150 +msgid "You can not read data from this stream" +msgstr "Sie können aus diesem Strom keine Daten lesen." + +#: ../src/hylafax.cs:158 +msgid "" +"Could not connect to your Hylafax server.\n" +"Check console messages for further information\n" +"\n" +"You might need to set a value for username." +msgstr "" +"Konnte nicht mit dem Hylafax-Server verbinden.\n" +"Überprüfen Sie die Konsolenausgabe für weitere Einzelheiten\n" +"\n" +"Möglicherweise müssen Sie einen Benutzernamen angeben." + +#: ../src/main.cs:109 +msgid "Gfax help..." +msgstr "Hilfe zu Gfax" + +#: ../src/main.cs:135 +msgid "" +"Gconfd cannot find your settings. \n" +"If you are running Gfax immediately \n" +"after an installation, you may have \n" +"to log out and log back in again." +msgstr "" +"Gconfd kann Ihre Einstellungen nicht finden. \n" +"Falls Die Gfax direkt nach der Installation \n" +"ausführen, müssen Sie sich möglicherweise\n" +"ab- und wieder anmelden." + +#: ../src/newphonebook.cs:80 +msgid "Use" +msgstr "Benutzen" + +#: ../src/phonebook.cs:295 +#, csharp-format +msgid "Can't open file : {0}" +msgstr "Kann Datei {0} nicht öffnen\"" + +#: ../src/sendphonebook.cs:66 +msgid "You don't have any phone books yet." +msgstr "Sie haben noch keine Telefonbücher angelegt." + +#. Got have a column title or things won't show up +#: ../src/sendphonebook.cs:94 +msgid "Phone books" +msgstr "Telefonbücher" diff --git a/po/en_CA.po b/po/en_CA.po new file mode 100644 index 0000000..a1e9507 --- /dev/null +++ b/po/en_CA.po @@ -0,0 +1,1606 @@ +# English translations for gfax package. +# Copyright (C) 2005 THE gfax'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gfax package. +# George Farris , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: gfax 0.7.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-11-29 19:29-0800\n" +"PO-Revision-Date: 2005-02-22 12:04-0800\n" +"Last-Translator: George Farris \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../gfax.desktop.in.h:1 +#, fuzzy +msgid "Gfax Facsimile Program" +msgstr "Gfax Facsimile Sender" + +#: ../gfax.desktop.in.h:2 +#, fuzzy +msgid "Send and Receive Facsimiles" +msgstr "Received Facsimiles" + +#: ../gfax.schemas.in.h:1 +msgid "0:never, 1:until carrier, 2:always, 3:on receive only" +msgstr "0:never, 1:until carrier, 2:always, 3:on receive only" + +#: ../gfax.schemas.in.h:2 +msgid "0:very low, 1:low, 2:medium, 3:high" +msgstr "0:very low, 1:low, 2:medium, 3:high" + +#: ../gfax.schemas.in.h:3 +msgid "Modem Device" +msgstr "Modem Device" + +#: ../gfax.schemas.in.h:4 +msgid "Modem initialization string" +msgstr "Modem initialization string" + +#: ../gfax.schemas.in.h:5 +msgid "Modem reset string" +msgstr "Modem reset string" + +#: ../gfax.schemas.in.h:6 +msgid "Not currently used." +msgstr "Not currently used." + +#: ../gfax.schemas.in.h:7 +msgid "The initialization code that is sent to the modem." +msgstr "The initialization code that is sent to the modem." + +#: ../gfax.schemas.in.h:8 +msgid "" +"The name of the lock file according to your system's conventions. If you're " +"running Linux you shouldn't have to touch this." +msgstr "" +"The name of the lock file according to your system's conventions. If you're " +"running Linux you shouldn't have to touch this." + +#: ../gfax.schemas.in.h:9 +msgid "" +"The reset code that resets the modem to a power up state. The -Kz code works " +"with most modems." +msgstr "" +"The reset code that resets the modem to a power up state. The -Kz code works " +"with most modems." + +#: ../gfax.schemas.in.h:10 +msgid "" +"The serial port the modem is connected too. Typical values are ttyS0, cua0 " +"or modem." +msgstr "" +"The serial port the modem is connected too. Typical values are ttyS0, cua0 " +"or modem." + +#: ../glade/gfax.glade.h:1 +msgid "" +"\n" +"Please enter your Hylafax server information here. If you are running " +"Hylafax on the same computer That you are using Gfax on then \"Host Name\" " +"should be set to \"localhost\".\n" +msgstr "" +"\n" +"Please enter your Hylafax server information here. If you are running " +"Hylafax on the same computer That you are using Gfax on then \"Host Name\" " +"should be set to \"localhost\".\n" + +#: ../glade/gfax.glade.h:4 +msgid " Program: " +msgstr "" + +#: ../glade/gfax.glade.h:5 +msgid "4559" +msgstr "4559" + +#: ../glade/gfax.glade.h:6 +msgid "E-Mail Notification" +msgstr "E-Mail Notification" + +#: ../glade/gfax.glade.h:7 +msgid "Efax Setup" +msgstr "Efax Setup" + +#: ../glade/gfax.glade.h:8 +#, fuzzy +msgid "Facsimile Viewer Program" +msgstr "Transmit Properties" + +#: ../glade/gfax.glade.h:9 +msgid "Fax Properties" +msgstr "Fax Properties" + +#: ../glade/gfax.glade.h:10 +msgid "Fax Transport Agent" +msgstr "Fax Transport Agent" + +#: ../glade/gfax.glade.h:11 +msgid "Hylafax Setup" +msgstr "Hylafax Setup" + +#: ../glade/gfax.glade.h:12 +msgid "Phone Information" +msgstr "Phone Information" + +#: ../glade/gfax.glade.h:13 +msgid "Transmit Properties" +msgstr "Transmit Properties" + +#: ../glade/gfax.glade.h:14 +#, fuzzy +msgid "Alter facsimile job parameters" +msgstr "Facsimile Job Details" + +#: ../glade/gfax.glade.h:15 +msgid "Server" +msgstr "Server" + +#: ../glade/gfax.glade.h:16 +msgid "" +"ATT (Dataport, Paradyne)\n" +"Motorola (Power Modem, 3400 Pro,...\n" +"QuickComm (Spirit II)\n" +"USR (Courier, Sportster)\n" +"Multi-Tech (for bit reversal)\n" +"User Defined\n" +msgstr "" + +#: ../glade/gfax.glade.h:23 +msgid "Auto Refresh Queue" +msgstr "Auto Refresh Queue" + +#: ../glade/gfax.glade.h:24 +msgid "" +"Complete...\n" +"\n" +"Your new phone book is ready.\n" +"If this is a Gfax type phone book you may\n" +"now add items. \n" +"\n" +"Evolution phone books are read only\n" +"but may be change through Evolution." +msgstr "" + +#: ../glade/gfax.glade.h:32 +msgid "Completed Jobs" +msgstr "Completed Jobs" + +#: ../glade/gfax.glade.h:33 +msgid "Database" +msgstr "Database" + +#: ../glade/gfax.glade.h:34 ../glade/send-druid.glade.h:11 +msgid "Delete" +msgstr "Delete" + +#: ../glade/gfax.glade.h:35 +msgid "Dial Prefix:" +msgstr "Dial Prefix:" + +#: ../glade/gfax.glade.h:36 +msgid "E-Mail Address:" +msgstr "E-Mail Address:" + +#: ../glade/gfax.glade.h:37 +msgid "E-Mail Notification" +msgstr "E-Mail Notification" + +#: ../glade/gfax.glade.h:38 +msgid "Efax" +msgstr "Efax" + +#: ../glade/gfax.glade.h:39 +msgid "Evolution" +msgstr "Evolution" + +#: ../glade/gfax.glade.h:40 +msgid "Evolution Address books" +msgstr "" + +#: ../glade/gfax.glade.h:41 +msgid "Exit" +msgstr "Exit" + +#: ../glade/gfax.glade.h:42 +msgid "Facsimile Number:" +msgstr "Facsimile Number:" + +#: ../glade/gfax.glade.h:43 +msgid "Facsimiles to Send" +msgstr "Facsimiles to Send" + +#: ../glade/gfax.glade.h:44 +#, fuzzy +msgid "Fax Number:" +msgstr "Fax number:" + +#: ../glade/gfax.glade.h:45 +msgid "Fax Status:" +msgstr "Fax Status:" + +#: ../glade/gfax.glade.h:46 +msgid "Fax log enabled" +msgstr "Fax log enabled" + +#: ../glade/gfax.glade.h:47 +#, fuzzy +msgid "" +"First we must choose a transport agent. \n" +"\n" +"A transport agent is a software package that is responsible for\n" +"actually sending the facsimile with your modem. If you don't have \n" +"one of these installed you should hit cancel here and install\n" +"a transport agent first.\n" +"\n" +"Transport agents can be found at the following URL's but you should \n" +"check your distribution CD first..\n" +"\n" +"Hylafax - http://www.hylafax.org\n" +"Efax - http://www.cce.com/efax" +msgstr "" +"First we must choose a transport agent. \n" +"\n" +"A transport agent is a software package that is responsible for\n" +"actually sending the facsimile with your modem. If you don't have \n" +"one of these installed you should hit cancel here and install\n" +"a transport agent first.\n" +"\n" +"Transport agents can be found at the following URL's but you should \n" +"check your distribution CD first..\n" +"\n" +"Hylafax - http://www.hylafax.org\n" +"Mgetty - http://alpha.greenie.net/mgetty\n" +"Efax - http://www.cce.com/efax" + +#: ../glade/gfax.glade.h:59 +msgid "Gfax" +msgstr "Gfax" + +#: ../glade/gfax.glade.h:60 +msgid "Gfax - E-Mail Address" +msgstr "Gfax - E-Mail Address" + +#: ../glade/gfax.glade.h:61 +msgid "Gfax - Facsimile Transport Agent" +msgstr "Gfax - Facsimile Transport Agent" + +#: ../glade/gfax.glade.h:62 +msgid "Gfax - Gnome facsimile program" +msgstr "Gfax - Gnome facsimile program" + +#: ../glade/gfax.glade.h:63 +msgid "Gfax - Modem Selection" +msgstr "Gfax - Modem Selection" + +#: ../glade/gfax.glade.h:64 +msgid "Gfax - Phone Number Information" +msgstr "Gfax - Phone Number Information" + +#: ../glade/gfax.glade.h:65 +msgid "Gfax - Setup Complete" +msgstr "Gfax - Setup Complete" + +#: ../glade/gfax.glade.h:66 +msgid "Gfax - Add new phone book." +msgstr "Gfax - Add new phone book." + +#: ../glade/gfax.glade.h:67 +msgid "Gfax - Modify Job" +msgstr "" + +#: ../glade/gfax.glade.h:68 +msgid "Gfax - New user setup" +msgstr "Gfax - New user setup" + +#: ../glade/gfax.glade.h:69 +msgid "Gfax - Preferences" +msgstr "Gfax - Preferences" + +#: ../glade/gfax.glade.h:70 +msgid "Gfax - Transmission Progress" +msgstr "Gfax - Transmission Progress" + +#: ../glade/gfax.glade.h:71 +#, fuzzy +msgid "" +"Gfax can inform the Efax transport agent which\n" +"serial port your modem is connected to." +msgstr "" +"Gfax can inform the Mgetty and Efax transport agents which\n" +"serial port your modem is connected to." + +#: ../glade/gfax.glade.h:73 +msgid "" +"Gfax setup is now complete!\n" +"\n" +"Gfax is configurable; there are other configuration \n" +"options available under the preferences menu.\n" +"\n" +"You can run this first time setup at any time from\n" +"the preferences section.\n" +"\n" +"Default preferences have been choosen for the\n" +"transport agent you chose, you may want to\n" +"customise them." +msgstr "" +"Gfax setup is now complete!\n" +"\n" +"Gfax is configurable; there are other configuration \n" +"options available under the preferences menu.\n" +"\n" +"You can run this first time setup at any time from\n" +"the preferences section.\n" +"\n" +"Default preferences have been choosen for the\n" +"transport agent you chose, you may want to\n" +"customise them." + +#: ../glade/gfax.glade.h:84 +msgid "Hi Resolution Mode" +msgstr "Hi Resolution Mode" + +#: ../glade/gfax.glade.h:85 +msgid "Host Name:" +msgstr "Host Name:" + +#: ../glade/gfax.glade.h:86 +msgid "Hostname:" +msgstr "Hostname:" + +#: ../glade/gfax.glade.h:87 +msgid "Hylafax" +msgstr "Hylafax" + +#: ../glade/gfax.glade.h:88 +msgid "Hylafax - Choose this for network faxing." +msgstr "Hylafax - Choose this for network faxing." + +#: ../glade/gfax.glade.h:89 +msgid "" +"Hylafax and Mgetty+Sendfax can both be requested to send \n" +"results of facsimile transmission to an email address.\n" +"\n" +"If you require this feature please enter your email address\n" +"here. It's a good idea to include this even if you don't \n" +"use it immediately, you can enable and disable it in the\n" +"preferences section of Gfax.\n" +" " +msgstr "" +"Hylafax and Mgetty+Sendfax can both be requested to send \n" +"results of facsimile transmission to an email address.\n" +"\n" +"If you require this feature please enter your email address\n" +"here. It's a good idea to include this even if you don't \n" +"use it immediately, you can enable and disable it in the\n" +"preferences section of Gfax.\n" +" " + +#: ../glade/gfax.glade.h:97 +msgid "IP Port:" +msgstr "IP Port:" + +#: ../glade/gfax.glade.h:98 +msgid "LDAP" +msgstr "LDAP" + +#: ../glade/gfax.glade.h:99 +msgid "Log Enabled" +msgstr "Log Enabled" + +#: ../glade/gfax.glade.h:100 +msgid "" +"Make no more than calls in attempting to send the facsimile. " +"Once has been reached, the job will be killed." +msgstr "" + +#: ../glade/gfax.glade.h:101 +msgid "Maximum Dials:" +msgstr "" + +#: ../glade/gfax.glade.h:102 +msgid "Mgetty" +msgstr "Mgetty" + +#: ../glade/gfax.glade.h:103 +msgid "Modem Connection" +msgstr "Modem Connection" + +#: ../glade/gfax.glade.h:104 +msgid "Modem Port:" +msgstr "Modem Port:" + +#: ../glade/gfax.glade.h:105 +msgid "Modem Type:" +msgstr "Modem Type:" + +#: ../glade/gfax.glade.h:106 +msgid "New Fax" +msgstr "New Fax" + +#: ../glade/gfax.glade.h:107 ../glade/send-druid.glade.h:23 +msgid "New phone book" +msgstr "New phone book" + +#: ../glade/gfax.glade.h:108 +msgid "Open phone book" +msgstr "Open phone book" + +#: ../glade/gfax.glade.h:109 +msgid "Page Size:" +msgstr "Page Size:" + +#: ../glade/gfax.glade.h:110 +msgid "Password Dialog" +msgstr "Password Dialog" + +#: ../glade/gfax.glade.h:111 ../glade/send-druid.glade.h:26 +#: ../src/newphonebook.cs:81 +msgid "Phone Book" +msgstr "Phone Book" + +#: ../glade/gfax.glade.h:112 +msgid "Please enter a name for your new phone book." +msgstr "Please enter a name for your new phone book." + +#: ../glade/gfax.glade.h:113 +msgid "" +"Please enter the password \n" +"for your fax server." +msgstr "" +"Please enter the password \n" +"for your fax server." + +#: ../glade/gfax.glade.h:115 +msgid "" +"Please enter the type of phone book you are creating." +msgstr "" +"Please enter the type of phone book you are creating." + +#: ../glade/gfax.glade.h:121 +msgid "" +"Please enter your facsimile number.\n" +"\n" +"This number is placed in the top one line header that is placed \n" +"on all outgoing facsimiles.\n" +"\n" +"You may also choose a default dial prefix. Many companies in\n" +"North America use the number \"9\" to reach an outside line.\n" +msgstr "" +"Please enter your facsimile number.\n" +"\n" +"This number is placed in the top one line header that is placed \n" +"on all outgoing facsimiles.\n" +"\n" +"You may also choose a default dial prefix. Many companies in\n" +"North America use the number \"9\" to reach an outside line.\n" + +#: ../glade/gfax.glade.h:129 +msgid "" +"Please select the Evolution address books that you would \n" +"like to use.\n" +"\n" +"These are only local address books and will only include\n" +"contacts with facsimile numbers." +msgstr "" + +#: ../glade/gfax.glade.h:134 +msgid "Port Number:" +msgstr "Port Number:" + +#: ../glade/gfax.glade.h:135 +msgid "Received Facsimiles" +msgstr "Received Facsimiles" + +#: ../glade/gfax.glade.h:136 +msgid "Remember this password" +msgstr "Remember this password" + +#: ../glade/gfax.glade.h:137 +msgid "Send Email Notification" +msgstr "Send Email Notification" + +#: ../glade/gfax.glade.h:138 +msgid "Send Immediately" +msgstr "Send Immediately" + +#: ../glade/gfax.glade.h:139 +msgid "Speaker Volume:" +msgstr "Speaker Volume:" + +#: ../glade/gfax.glade.h:140 +msgid "System" +msgstr "System" + +#: ../glade/gfax.glade.h:141 +msgid "" +"The TCP/IP port number of the fax server. Default hylafax port is 4559." +msgstr "" +"The TCP/IP port number of the fax server. Default hylafax port is 4559." + +#: ../glade/gfax.glade.h:142 +msgid "" +"The host name of the network fax server. Enter \"localhost\" if you are not " +"using a network fax server." +msgstr "" +"The host name of the network fax server. Enter \"localhost\" if you are not " +"using a network fax server." + +#: ../glade/gfax.glade.h:143 +msgid "The serial port the modem is on - ttyS0 is COM1, ttyS1 is COM2 etc." +msgstr "The serial port the modem is on - ttyS0 is COM1, ttyS1 is COM2 etc." + +#: ../glade/gfax.glade.h:144 +msgid "" +"There was an error transmitting\n" +"your facsimile to the server!" +msgstr "" +"There was an error transmitting\n" +"your facsimile to the server!" + +#: ../glade/gfax.glade.h:146 +msgid "" +"This will lead you through the process \n" +"of creating a new phone book." +msgstr "" +"This will lead you through the process \n" +"of creating a new phone book." + +#: ../glade/gfax.glade.h:148 +#, fuzzy +msgid "Time to send:" +msgstr "Facsimiles to Send" + +#: ../glade/gfax.glade.h:149 +msgid "" +"Transmitting facsimile to \n" +"Hylafax server." +msgstr "" +"Transmitting facsimile to \n" +"Hylafax server." + +#: ../glade/gfax.glade.h:151 +msgid "Transport Agent" +msgstr "Transport Agent" + +#: ../glade/gfax.glade.h:152 +msgid "Use Cover Page" +msgstr "Use Cover Page" + +#: ../glade/gfax.glade.h:153 +msgid "Use Fine Resolution" +msgstr "Use Fine Resolution" + +#: ../glade/gfax.glade.h:154 +msgid "User" +msgstr "User" + +#: ../glade/gfax.glade.h:155 +msgid "Username:" +msgstr "Username:" + +#: ../glade/gfax.glade.h:156 +msgid "" +"Very Low\n" +"Low\n" +"Medium\n" +"High" +msgstr "" + +#: ../glade/gfax.glade.h:160 +msgid "View / Print" +msgstr "" + +#: ../glade/gfax.glade.h:161 +msgid "" +"Welcome to Gfax!\n" +"\n" +"\n" +"Gfax is a GNOME facsimile program that provides \n" +"the familiar \"popup\" window when printing to a fax \n" +"printer.\n" +"\n" +"The following pages will help you to setup Gfax." +msgstr "" +"Welcome to Gfax!\n" +"\n" +"\n" +"Gfax is a GNOME facsimile program that provides \n" +"the familiar \"popup\" window when printing to a fax \n" +"printer.\n" +"\n" +"The following pages will help you to setup Gfax." + +#: ../glade/gfax.glade.h:169 +msgid "Which serial port is your modem connected to?" +msgstr "Which serial port is your modem connected to?" + +#: ../glade/gfax.glade.h:170 +msgid "" +"Your facsimile was sucessfully\n" +" transmitted!" +msgstr "" +"Your facsimile was sucessfully\n" +" transmitted!" + +#: ../glade/gfax.glade.h:172 +msgid "_Cancel Job" +msgstr "_Cancel Job" + +#: ../glade/gfax.glade.h:173 +msgid "_Fax" +msgstr "_Fax" + +#: ../glade/gfax.glade.h:174 +msgid "_Help" +msgstr "_Help" + +#: ../glade/gfax.glade.h:175 +msgid "_Modify Job" +msgstr "" + +#: ../glade/gfax.glade.h:176 +msgid "_Settings" +msgstr "_Settings" + +#: ../glade/gfax.glade.h:177 +msgid "cua1" +msgstr "cua1" + +#: ../glade/gfax.glade.h:178 +msgid "cua2" +msgstr "cua2" + +#: ../glade/gfax.glade.h:179 +msgid "" +"letter\n" +"legal\n" +"a4" +msgstr "" + +#: ../glade/gfax.glade.h:182 +msgid "localhost" +msgstr "localhost" + +#: ../glade/gfax.glade.h:183 +msgid "modem" +msgstr "modem" + +#: ../glade/gfax.glade.h:184 +msgid "oklabel" +msgstr "oklabel" + +#: ../glade/gfax.glade.h:185 +msgid "ttyS0" +msgstr "ttyS0" + +#: ../glade/gfax.glade.h:186 +msgid "ttyS1" +msgstr "ttyS1" + +#: ../glade/gfax.glade.h:187 +msgid "ttyS2" +msgstr "ttyS2" + +#: ../glade/gfax.glade.h:188 +msgid "ttyS3" +msgstr "ttyS3" + +#: ../glade/send-druid.glade.h:1 +msgid "Current Phone Books" +msgstr "Current Phone Books" + +#: ../glade/send-druid.glade.h:2 +msgid "Edit Phone book" +msgstr "Edit Phone book" + +#: ../glade/send-druid.glade.h:3 +msgid "Facsimile Job Details" +msgstr "Facsimile Job Details" + +#: ../glade/send-druid.glade.h:4 +msgid "New fax information" +msgstr "New fax information" + +#: ../glade/send-druid.glade.h:5 +msgid "Add" +msgstr "Add" + +#: ../glade/send-druid.glade.h:6 +msgid "Browse" +msgstr "" + +#: ../glade/send-druid.glade.h:7 +msgid "Clear" +msgstr "Clear" + +#: ../glade/send-druid.glade.h:8 +msgid "Close" +msgstr "Close" + +#: ../glade/send-druid.glade.h:9 ../src/gfaxphonebook.cs:89 +#: ../src/gfaxsend.cs:142 ../src/sendphonebook.cs:105 +msgid "Contact" +msgstr "Contact" + +#: ../glade/send-druid.glade.h:10 +msgid "Current Phone Book" +msgstr "Current Phone Book" + +#: ../glade/send-druid.glade.h:12 +#, fuzzy +msgid "Delete phone book" +msgstr "New phone book" + +#: ../glade/send-druid.glade.h:13 +msgid "Details" +msgstr "Details" + +#: ../glade/send-druid.glade.h:14 +msgid "E-Mail job results to:" +msgstr "E-Mail job results to:" + +#: ../glade/send-druid.glade.h:15 +msgid "Enter a phone number and hit ." +msgstr "Enter a phone number and hit ." + +#: ../glade/send-druid.glade.h:16 +msgid "Fax number:" +msgstr "Fax number:" + +#: ../glade/send-druid.glade.h:17 +msgid "Fine resolution" +msgstr "Fine resolution" + +#: ../glade/send-druid.glade.h:18 +msgid "Gfax - Phone Book Selection" +msgstr "Gfax - Phone Book Selection" + +#: ../glade/send-druid.glade.h:19 +msgid "Gfax - Phone books" +msgstr "Gfax - Phone books" + +#: ../glade/send-druid.glade.h:20 +msgid "Job" +msgstr "Job" + +#: ../glade/send-druid.glade.h:21 +msgid "New Entry" +msgstr "New Entry" + +#: ../glade/send-druid.glade.h:22 +msgid "New Item" +msgstr "New Item" + +#: ../glade/send-druid.glade.h:24 ../src/gui.cs:238 ../src/gui.cs:249 +msgid "Number" +msgstr "Number" + +#: ../glade/send-druid.glade.h:25 ../src/gfaxphonebook.cs:87 +#: ../src/gfaxsend.cs:141 ../src/sendphonebook.cs:103 +msgid "Organization" +msgstr "Organization" + +#: ../glade/send-druid.glade.h:27 +msgid "Phone Book Item List" +msgstr "Phone Book Item List" + +#: ../glade/send-druid.glade.h:28 +msgid "Phone Books" +msgstr "Phone Books" + +#: ../glade/send-druid.glade.h:29 +msgid "Postscript file:" +msgstr "Postscript file:" + +#: ../glade/send-druid.glade.h:30 +msgid "Save and Close" +msgstr "Save and Close" + +#: ../glade/send-druid.glade.h:31 +#, fuzzy +msgid "Save and close" +msgstr "Save and Close" + +#: ../glade/send-druid.glade.h:32 ../src/gfaxsend.cs:139 +msgid "Send" +msgstr "Send" + +#: ../glade/send-druid.glade.h:33 +msgid "Send Fax" +msgstr "Send Fax" + +#: ../glade/send-druid.glade.h:34 +msgid "Send immediately" +msgstr "Send immediately" + +#: ../glade/send-druid.glade.h:35 +msgid "Transmit the fax" +msgstr "Transmit the fax" + +#: ../glade/send-druid.glade.h:36 +msgid "Update" +msgstr "Update" + +#: ../glade/send-druid.glade.h:37 +msgid "_File" +msgstr "_File" + +#: ../src/efax.cs:384 +msgid "Scanning control files." +msgstr "Scanning control files." + +#: ../src/efax.cs:397 +msgid "Running job " +msgstr "" + +#: ../src/efax.cs:421 ../src/efax.cs:508 +msgid "Busy retries exceeded" +msgstr "Busy retries exceeded" + +#: ../src/efax.cs:468 +#, fuzzy +msgid "Sending facsimile..." +msgstr "Send Facsimiles" + +#. If successful then mv the control file to the done queue and flag +#. a date for it's removal. +#: ../src/efax.cs:492 +msgid "Success" +msgstr "Success" + +#. fatal errors - no retry +#. fatalError = true; +#. change code in file +#: ../src/efax.cs:516 +msgid "Fatal error" +msgstr "Fatal error" + +#. Modem error - no retry +#. fatalError = true; +#: ../src/efax.cs:522 +msgid "Fatal modem error" +msgstr "Fatal modem error" + +#. Modem not responding +#. fatalError = true; +#: ../src/efax.cs:528 +msgid "Modem not responding" +msgstr "Modem not responding" + +#. Program terminated +#. fatalError = true; +#: ../src/efax.cs:534 +msgid "Program terminated" +msgstr "Program terminated" + +#: ../src/fax.cs:60 +msgid "No Connection" +msgstr "No Connection" + +#: ../src/fax.cs:71 +#, fuzzy +msgid "" +"Efax transmit process running...\n" +"Scanning job files every 30 seconds." +msgstr "" +"Efax transmit process running...\n" +"Scanning job files every 60 seconds." + +#: ../src/fax.cs:77 +msgid "Error transport agent not specified!" +msgstr "Error transport agent not specified!" + +#: ../src/fax.cs:132 +msgid "Run" +msgstr "Run" + +#: ../src/fax.cs:135 +msgid "Sleep" +msgstr "Sleep" + +#: ../src/fax.cs:138 +msgid "Block" +msgstr "Block" + +#: ../src/fax.cs:141 +msgid "Busy" +msgstr "Busy" + +#: ../src/fax.cs:144 ../src/fax.cs:244 +msgid "Done" +msgstr "Done" + +#: ../src/fax.cs:147 +msgid "Fail" +msgstr "Fail" + +#: ../src/fax.cs:150 +msgid "New" +msgstr "New" + +#: ../src/fax.cs:241 +msgid "Receiving" +msgstr "Receiving" + +#: ../src/gfaxphonebook.cs:88 ../src/gfaxsend.cs:140 +#: ../src/sendphonebook.cs:104 +msgid "Phone Number" +msgstr "Phone Number" + +#: ../src/gfaxphonebook.cs:213 +msgid "Are you sure you want to delete the phone book?" +msgstr "Are you sure you want to delete the phone book?" + +#: ../src/gfaxphonebook.cs:297 +msgid "" +"You have unsaved phone book entries.\n" +" Are you sure you want to Quit?" +msgstr "" +"You have unsaved phone book entries.\n" +" Are you sure you want to Quit?" + +#: ../src/gfaxphonebook.cs:460 +msgid "Press the key to delete an entry." +msgstr "Press the key to delete an entry." + +#: ../src/gfaxprefs.cs:190 ../src/gfaxprefs.cs:208 +msgid "You need to exit Gfax and restart it when you change transport agents" +msgstr "You need to exit Gfax and restart it when you change transport agents" + +#: ../src/gfaxsend.cs:88 +#, fuzzy +msgid "" +"\n" +"This is the first time you have run Gfax.\n" +"Please run Gfax from the menu or command line and set your \n" +"MODEM TYPE, PORT and Fax number under preferences.\n" +"\n" +"Gfax is initially setup to use Efax, you may change it use \n" +"Hylafax if you prefer or require connection to a network \n" +"facsimile server." +msgstr "" +"\n" +"This is the first time you have run Gfax.\n" +"Please run Gfax from the menu or command line and set your \n" +"MODEM TYPE and PORT under preferences.\n" +"\n" +"Gfax is initially setup to use Efax, you may change it use \n" +"Hylafax if you prefer or require connection to a network \n" +"facsimile server." + +#: ../src/gfaxsend.cs:164 +msgid "Spooled from print job" +msgstr "Spooled from print job" + +#: ../src/gfaxsend.cs:276 +msgid "" +"\n" +"The file you have entered does not exist.\n" +"Please check the name and try again." +msgstr "" + +#: ../src/gfaxsend.cs:310 +msgid "" +"\n" +"You have not entered a facsimile number!\n" +"Please enter a number and press the Enter key or\n" +"click the Phone Book button to select numbers or\n" +"entire phone books." +msgstr "" + +#: ../src/gui.cs:143 +msgid "" +"\n" +"This is the first time you have run Gfax.\n" +"You should set your MODEM TYPE and PORT under preferences.\n" +"\n" +"Gfax is initially setup to use Efax, you may change it use \n" +"Hylafax if you prefer or require connection to a network \n" +"facsimile server." +msgstr "" +"\n" +"This is the first time you have run Gfax.\n" +"You should set your MODEM TYPE and PORT under preferences.\n" +"\n" +"Gfax is initially setup to use Efax, you may change it use \n" +"Hylafax if you prefer or require connection to a network \n" +"facsimile server." + +#: ../src/gui.cs:157 +msgid "" +"Your spool directory is missing!\n" +"\t\t\t\t\t\n" +"Please login as the root user and create the " +msgstr "" +"Your spool directory is missing!\n" +"\t\t\t\t\t\n" +"Please login as the root user and create the " + +#: ../src/gui.cs:161 +msgid "" +" directory.\n" +"\n" +"All users should be able to write to it.\n" +msgstr "" +" directory.\n" +"\n" +"All users should be able to write to it.\n" + +#: ../src/gui.cs:166 +msgid "" +"The doneq directory is missing in your spool directory!\n" +"\t\t\t\t\t\n" +"Please login as the root user and create the " +msgstr "" +"The doneq directory is missing in your spool directory!\n" +"\t\t\t\t\t\n" +"Please login as the root user and create the " + +#: ../src/gui.cs:169 +msgid "" +"/doneq directory.\n" +"\n" +"All users should be able to write to it.\n" +msgstr "" +"/doneq directory.\n" +"\n" +"All users should be able to write to it.\n" + +#: ../src/gui.cs:175 +msgid "" +"The recq directory is missing in your spool directory!\n" +"\t\t\t\t\t\n" +"Please login as the root user and create the " +msgstr "" +"The recq directory is missing in your spool directory!\n" +"\t\t\t\t\t\n" +"Please login as the root user and create the " + +#: ../src/gui.cs:178 +msgid "" +"/recq directory.\n" +"\n" +"All users should be able to write to it.\n" +msgstr "" +"/recq directory.\n" +"\n" +"All users should be able to write to it.\n" + +#: ../src/gui.cs:237 ../src/gui.cs:248 +msgid "Jobid" +msgstr "Jobid" + +#: ../src/gui.cs:239 ../src/gui.cs:250 ../src/gui.cs:259 +msgid "Status" +msgstr "Status" + +#: ../src/gui.cs:240 ../src/gui.cs:251 +msgid "Owner" +msgstr "Owner" + +#: ../src/gui.cs:241 ../src/gui.cs:252 +msgid "Pages" +msgstr "Pages" + +#: ../src/gui.cs:242 ../src/gui.cs:253 +msgid "Dials" +msgstr "Dials" + +#: ../src/gui.cs:243 ../src/gui.cs:254 +msgid "Send At" +msgstr "Send At" + +#: ../src/gui.cs:244 ../src/gui.cs:255 +msgid "Error" +msgstr "Error" + +#: ../src/gui.cs:258 +msgid "Sender" +msgstr "Sender" + +#: ../src/gui.cs:260 +msgid "Pages " +msgstr "Pages " + +#: ../src/gui.cs:261 +msgid "Arrived" +msgstr "Arrived" + +#: ../src/gui.cs:262 +msgid "Filename" +msgstr "Filename" + +#: ../src/gui.cs:666 +msgid "" +"Cannot read the facsimile file from the server. You most likely do not \n" +"have permission to read the file. Check the settings on your fax server." +msgstr "" + +#: ../src/gui.cs:673 +msgid "" +"Cannot start your faxviewer program. \n" +"Please check your settings. It is currently set to " +msgstr "" + +#: ../src/gui.cs:674 +msgid "." +msgstr "" + +#: ../src/gui.cs:709 +msgid "" +"Cannot delete the facsimile file from the server. You most likely do not \n" +"have permission to delete the file. Check the settings on your fax server." +msgstr "" + +#: ../src/gui.cs:715 +msgid "" +"Cannot delete the file on the Hylafax server. \n" +"Please check your settings or contact your system Administrator" +msgstr "" + +#: ../src/gui.cs:785 +#, fuzzy +msgid "Copyright (C) 2003 George Farris " +msgstr "Copyright (C) 2003 George Farris " + +#: ../src/gui.cs:786 +msgid "A Facsimile application for GNOME" +msgstr "A Facsimile application for GNOME" + +#: ../src/gui.cs:831 +#, fuzzy +msgid "Refreshing server status..." +msgstr "Refreshing queue..." + +#: ../src/gui.cs:868 +msgid "Refreshing queue..." +msgstr "Refreshing queue..." + +#: ../src/gui.cs:934 ../src/gui.cs:953 +msgid "There are " +msgstr "There are " + +#: ../src/gui.cs:934 ../src/gui.cs:953 +msgid " jobs in the queue" +msgstr " jobs in the queue" + +#: ../src/gui.cs:941 ../src/gui.cs:960 +msgid "There are 0 jobs in the queue" +msgstr "There are 0 jobs in the queue" + +#: ../src/hylafax.cs:146 +msgid "You can not write data to this stream" +msgstr "You can not write data to this stream" + +#: ../src/hylafax.cs:150 +msgid "You can not read data from this stream" +msgstr "You can not read data from this stream" + +#: ../src/hylafax.cs:158 +msgid "" +"Could not connect to your Hylafax server.\n" +"Check console messages for further information\n" +"\n" +"You might need to set a value for username." +msgstr "" +"Could not connect to your Hylafax server.\n" +"Check console messages for further information\n" +"\n" +"You might need to set a value for username." + +#: ../src/main.cs:109 +msgid "Gfax help..." +msgstr "Gfax help..." + +#: ../src/main.cs:135 +msgid "" +"Gconfd cannot find your settings. \n" +"If you are running Gfax immediately \n" +"after an installation, you may have \n" +"to log out and log back in again." +msgstr "" +"Gconfd cannot find your settings. \n" +"If you are running Gfax immediately \n" +"after an installation, you may have \n" +"to log out and log back in again." + +#: ../src/newphonebook.cs:80 +#, fuzzy +msgid "Use" +msgstr "User" + +#: ../src/phonebook.cs:295 +#, csharp-format +msgid "Can't open file : {0}" +msgstr "Can't open file : {0}" + +#: ../src/sendphonebook.cs:66 +msgid "You don't have any phone books yet." +msgstr "You don't have any phone books yet." + +#. Got have a column title or things won't show up +#: ../src/sendphonebook.cs:94 +#, fuzzy +msgid "Phone books" +msgstr "Phone Books" + +#~ msgid "0" +#~ msgstr "0" + +#~ msgid "1" +#~ msgstr "1" + +#~ msgid "10 Minutes" +#~ msgstr "10 Minutes" + +#~ msgid "1000" +#~ msgstr "1000" + +#~ msgid "115200" +#~ msgstr "115200" + +#~ msgid "15 Minutes" +#~ msgstr "15 Minutes" + +#~ msgid "1500" +#~ msgstr "1500" + +#~ msgid "19200" +#~ msgstr "19200" + +#~ msgid "2" +#~ msgstr "2" + +#~ msgid "2000" +#~ msgstr "2000" + +#~ msgid "2400" +#~ msgstr "2400" + +#~ msgid "3" +#~ msgstr "3" + +#~ msgid "30 Minutes" +#~ msgstr "30 Minutes" + +#~ msgid "38400" +#~ msgstr "38400" + +#~ msgid "4" +#~ msgstr "4" + +#~ msgid "4800" +#~ msgstr "4800" + +#~ msgid "5" +#~ msgstr "5" + +#~ msgid "5 Minutes" +#~ msgstr "5 Minutes" + +#~ msgid "500" +#~ msgstr "500" + +#~ msgid "57600" +#~ msgstr "57600" + +#~ msgid "6" +#~ msgstr "6" + +#~ msgid "7" +#~ msgstr "7" + +#~ msgid "8" +#~ msgstr "8" + +#~ msgid "9" +#~ msgstr "9" + +#~ msgid "9600" +#~ msgstr "9600" + +#~ msgid "" +#~ "A few modems respond to raising the DTR line (when opening the device) " +#~ "with `OK'. This can confuse `sendfax', because it will see this OK as " +#~ "response to the next command. Default is 0." +#~ msgstr "" +#~ "A few modems respond to raising the DTR line (when opening the device) " +#~ "with `OK'. This can confuse `sendfax', because it will see this OK as " +#~ "response to the next command. Default is 0." + +#~ msgid "ATT (Dataport, Paradyne)" +#~ msgstr "ATT (Dataport, Paradyne)" + +#~ msgid "" +#~ "After the maximum number of tries for one page are reached, `sendfax' can " +#~ "report an error and abort or continue. Default is Yes." +#~ msgstr "" +#~ "After the maximum number of tries for one page are reached, `sendfax' can " +#~ "report an error and abort or continue. Default is Yes." + +#~ msgid "" +#~ "An 'AT...' command that will be sent to the modem at the end of the modem " +#~ "initialization, right before dialing." +#~ msgstr "" +#~ "An 'AT...' command that will be sent to the modem at the end of the modem " +#~ "initialization, right before dialing." + +#~ msgid "Baud Rate Switch" +#~ msgstr "Baud Rate Switch" + +#~ msgid "" +#~ "Controls the amount of information written into the fax log file. " +#~ "Default is 3." +#~ msgstr "" +#~ "Controls the amount of information written into the fax log file. " +#~ "Default is 3." + +#~ msgid "Debug Level" +#~ msgstr "Debug Level" + +#~ msgid "Dial Command" +#~ msgstr "Dial Command" + +#~ msgid "Disabled" +#~ msgstr "Disabled" + +#~ msgid "Fax Users Allowed" +#~ msgstr "Fax Users Allowed" + +#~ msgid "Fax Users Denied" +#~ msgstr "Fax Users Denied" + +#~ msgid "High" +#~ msgstr "High" + +#~ msgid "Hour" +#~ msgstr "Hour" + +#~ msgid "" +#~ "How often you want the fax queue scanned. Faxes won't be transmitted " +#~ "until \"faxrunq\" is run to scan the queue. This value is set in /etc/" +#~ "crontab." +#~ msgstr "" +#~ "How often you want the fax queue scanned. Faxes won't be transmitted " +#~ "until \"faxrunq\" is run to scan the queue. This value is set in /etc/" +#~ "crontab." + +#~ msgid "Ignore Carrier" +#~ msgstr "Ignore Carrier" + +#~ msgid "Low" +#~ msgstr "Low" + +#~ msgid "Maximum Tries Continue" +#~ msgstr "Maximum Tries Continue" + +#~ msgid "Maximum Tries per Page" +#~ msgstr "Maximum Tries per Page" + +#~ msgid "Medium" +#~ msgstr "Medium" + +#~ msgid "Mgetty+Sendfax" +#~ msgstr "Mgetty+Sendfax" + +#~ msgid "Mgetty+Sendfax Setup" +#~ msgstr "Mgetty+Sendfax Setup" + +#~ msgid "Minute" +#~ msgstr "Minute" + +#~ msgid "Modem Handshake" +#~ msgstr "Modem Handshake" + +#~ msgid "Modem Initialization String" +#~ msgstr "Modem Initialization String" + +#~ msgid "Modem Port" +#~ msgstr "Modem Port" + +#~ msgid "Modem Quirks" +#~ msgstr "Modem Quirks" + +#~ msgid "Modem Speed (bps)" +#~ msgstr "Modem Speed (bps)" + +#~ msgid "Modem Type" +#~ msgstr "Modem Type" + +#~ msgid "Motorola (Power Modem, 3400 Pro,..." +#~ msgstr "Motorola (Power Modem, 3400 Pro,..." + +#~ msgid "Multi-Tech (for bit reversal)" +#~ msgstr "Multi-Tech (for bit reversal)" + +#~ msgid "No" +#~ msgstr "No" + +#~ msgid "None" +#~ msgstr "None" + +#~ msgid "" +#~ "On some (very few) modems it is necessary to start with baudrate \"A\" " +#~ "and switch to baudrate \"B\" after sending the `AT+FCLASS=2' command. " +#~ "Default is None." +#~ msgstr "" +#~ "On some (very few) modems it is necessary to start with baudrate \"A\" " +#~ "and switch to baudrate \"B\" after sending the `AT+FCLASS=2' command. " +#~ "Default is None." + +#~ msgid "Open Delay (msec)" +#~ msgstr "Open Delay (msec)" + +#~ msgid "QuickComm (Spirit II)" +#~ msgstr "QuickComm (Spirit II)" + +#~ msgid "Run Fax Queue Every" +#~ msgstr "Run Fax Queue Every" + +#~ msgid "SendFax Config File" +#~ msgstr "SendFax Config File" + +#~ msgid "Sendfax Config File" +#~ msgstr "Sendfax Config File" + +#~ msgid "Setup Druid" +#~ msgstr "Setup Druid" + +#~ msgid "" +#~ "Some misbehaving modems lower the DCD (carrier detect) line briefly, " +#~ "between sending multiple pages. This may cause all subsequent port serial " +#~ "accesses to fail. Default is No." +#~ msgstr "" +#~ "Some misbehaving modems lower the DCD (carrier detect) line briefly, " +#~ "between sending multiple pages. This may cause all subsequent port serial " +#~ "accesses to fail. Default is No." + +#~ msgid "" +#~ "The location of the mgetty \"sendfax.config\" file. Default is \"/etc/" +#~ "mgetty+sendfax/sendfax.config\". You shouldn't have to change this." +#~ msgstr "" +#~ "The location of the mgetty \"sendfax.config\" file. Default is \"/etc/" +#~ "mgetty+sendfax/sendfax.config\". You shouldn't have to change this." + +#~ msgid "" +#~ "The maximum number of tries per page if the receiving end reports " +#~ "reception errors. Default is 3." +#~ msgstr "" +#~ "The maximum number of tries per page if the receiving end reports " +#~ "reception errors. Default is 3." + +#~ msgid "" +#~ "The speed to set your serial port at. Try the highest and go down from " +#~ "there." +#~ msgstr "" +#~ "The speed to set your serial port at. Try the highest and go down from " +#~ "there." + +#~ msgid "The standard papersize you send facsimilies in." +#~ msgstr "The standard papersize you send facsimilies in." + +#~ msgid "The type of modem you have." +#~ msgstr "The type of modem you have." + +#~ msgid "The volume your modem is set too." +#~ msgstr "The volume your modem is set too." + +#~ msgid "" +#~ "This can be used to adapt `sendfax' to some peculiarities in certain " +#~ "modems. Not normally required." +#~ msgstr "" +#~ "This can be used to adapt `sendfax' to some peculiarities in certain " +#~ "modems. Not normally required." + +#~ msgid "" +#~ "This is the command used for dialing out. Usually this will be something " +#~ "simple, as `ATDT' for tone or `ATDP' for pulse dialing." +#~ msgstr "" +#~ "This is the command used for dialing out. Usually this will be something " +#~ "simple, as `ATDT' for tone or `ATDP' for pulse dialing." + +#~ msgid "" +#~ "This will initialize the modem when the port is opened. See your modem " +#~ "manual. Default is ATZ." +#~ msgstr "" +#~ "This will initialize the modem when the port is opened. See your modem " +#~ "manual. Default is ATZ." + +#~ msgid "Type of fax modem. See your modem manual. Default is auto." +#~ msgstr "Type of fax modem. See your modem manual. Default is auto." + +#~ msgid "USR (Courier, Sportster)" +#~ msgstr "USR (Courier, Sportster)" + +#~ msgid "User Defined" +#~ msgstr "User Defined" + +#~ msgid "" +#~ "Users allowed to use the fax system. Can be empty only if the deny list " +#~ "is populated. These must be user names." +#~ msgstr "" +#~ "Users allowed to use the fax system. Can be empty only if the deny list " +#~ "is populated. These must be user names." + +#~ msgid "" +#~ "Users denied from using the fax system. Can be empty only if the allow " +#~ "list is populated." +#~ msgstr "" +#~ "Users denied from using the fax system. Can be empty only if the allow " +#~ "list is populated." + +#~ msgid "Very Low" +#~ msgstr "Very Low" + +#~ msgid "Yes" +#~ msgstr "Yes" + +#~ msgid "a4" +#~ msgstr "a4" + +#~ msgid "auto" +#~ msgstr "auto" + +#~ msgid "c2.0" +#~ msgstr "c2.0" + +#~ msgid "cls2" +#~ msgstr "cls2" + +#~ msgid "legal" +#~ msgstr "legal" + +#~ msgid "letter" +#~ msgstr "letter" + +#~ msgid "Starting scan process" +#~ msgstr "Starting scan process" + +#~ msgid "Control file " +#~ msgstr "Control file " + +#, fuzzy +#~ msgid "Can't create .gfax.proc" +#~ msgstr "Can't create /tmp/gfax.proc" + +#~ msgid "*" +#~ msgstr "*" + +#~ msgid "" +#~ "Complete...\n" +#~ "\n" +#~ "Your new phone book is ready for you to add items." +#~ msgstr "" +#~ "Complete...\n" +#~ "\n" +#~ "Your new phone book is ready for you to add items." + +#~ msgid "Enter a phone number and hit or press the \"Add\" button" +#~ msgstr "Enter a phone number and hit or press the \"Add\" button" + +#~ msgid "Gfax - Select postcript file" +#~ msgstr "Gfax - Select postcript file" + +#~ msgid "Preferences" +#~ msgstr "Preferences" + +#~ msgid "Send later" +#~ msgstr "Send later" + +#~ msgid "" +#~ "Status Column Definition: D = Complete, R = Running, F = Failed, S = " +#~ "Sleeping, W = Waiting for modem, B = Blocked by job, P = Pending" +#~ msgstr "" +#~ "Status Column Definition: D = Complete, R = Running, F = Failed, S = " +#~ "Sleeping, W = Waiting for modem, B = Blocked by job, P = Pending" + +#~ msgid "Use cover page" +#~ msgstr "Use cover page" + +#~ msgid "New Phonebook" +#~ msgstr "New Phonebook" diff --git a/po/it.po b/po/it.po new file mode 100644 index 0000000..273be7f --- /dev/null +++ b/po/it.po @@ -0,0 +1,1598 @@ +# English translations for gfax package. +# Copyright (C) 2004 THE gfax'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gfax package. +# George Farris , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: gfax 0.7.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-11-29 19:29-0800\n" +"PO-Revision-Date: 2005-02-24 19:21+0100\n" +"Last-Translator: Sasa Ostrouska \n" +"Language-Team: Italian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../gfax.desktop.in.h:1 +#, fuzzy +msgid "Gfax Facsimile Program" +msgstr "Gfax Programma Facsimile" + +#: ../gfax.desktop.in.h:2 +#, fuzzy +msgid "Send and Receive Facsimiles" +msgstr "Invia e Riceve Facsimili" + +#: ../gfax.schemas.in.h:1 +msgid "0:never, 1:until carrier, 2:always, 3:on receive only" +msgstr "0:mai, 1:fino al carrier, 2:sempre, 3:solo ricezzione" + +#: ../gfax.schemas.in.h:2 +msgid "0:very low, 1:low, 2:medium, 3:high" +msgstr "0:molto basso, 1:basso, 2:medio, 3:alto" + +#: ../gfax.schemas.in.h:3 +#, fuzzy +msgid "Modem Device" +msgstr "Modem tipo" + +#: ../gfax.schemas.in.h:4 +#, fuzzy +msgid "Modem initialization string" +msgstr "Stringa di inizializazzione del modem" + +#: ../gfax.schemas.in.h:5 +msgid "Modem reset string" +msgstr "Stringa di reset del modem" + +#: ../gfax.schemas.in.h:6 +msgid "Not currently used." +msgstr "Non in uso al momento." + +#: ../gfax.schemas.in.h:7 +msgid "The initialization code that is sent to the modem." +msgstr "Codice di inizializzazione che viene inviato al modem." + +#: ../gfax.schemas.in.h:8 +msgid "" +"The name of the lock file according to your system's conventions. If you're " +"running Linux you shouldn't have to touch this." +msgstr "" +"Il nome del file lock come da suo systema. Se usate Linux non " +"dovrebbe essere necessario fare modifiche." + +#: ../gfax.schemas.in.h:9 +msgid "" +"The reset code that resets the modem to a power up state. The -Kz code works " +"with most modems." +msgstr "" +"Il codice di reset che resetta il modem a un stato di power up. Il codice -Kz " +"funziona con la maioria dei modem" + +#: ../gfax.schemas.in.h:10 +#, fuzzy +msgid "" +"The serial port the modem is connected too. Typical values are ttyS0, cua0 " +"or modem." +msgstr "" +"La porta seriale al quale il modem e collegato. Valori tipici sono ttyS0,\n" +"cua0 o modem." + +#: ../glade/gfax.glade.h:1 +msgid "" +"\n" +"Please enter your Hylafax server information here. If you are running " +"Hylafax on the same computer That you are using Gfax on then \"Host Name\" " +"should be set to \"localhost\".\n" +msgstr "" +"\n" +"Per favore inserire le informazioni del Hylafax server qua. Se il server\n" +"Hylafax e sullo stesso computer dove state usando Gfax dovete immettere\n" +"\"localhost\" nello spazio \"Nome Host\". \n" + +#: ../glade/gfax.glade.h:4 +msgid " Program: " +msgstr " Programma: " + +#: ../glade/gfax.glade.h:5 +msgid "4559" +msgstr "4559" + +#: ../glade/gfax.glade.h:6 +msgid "E-Mail Notification" +msgstr "Notifica E-Mail" + +#: ../glade/gfax.glade.h:7 +msgid "Efax Setup" +msgstr "Settaggi Efax" + +#: ../glade/gfax.glade.h:8 +#, fuzzy +msgid "Facsimile Viewer Program" +msgstr "Programma per la visualizzazione dei Facsimili" + +#: ../glade/gfax.glade.h:9 +msgid "Fax Properties" +msgstr "Proprieta Fax" + +#: ../glade/gfax.glade.h:10 +msgid "Fax Transport Agent" +msgstr "Agente Trasporto Facsimili" + +#: ../glade/gfax.glade.h:11 +msgid "Hylafax Setup" +msgstr "Settaggi Hylafax" + +#: ../glade/gfax.glade.h:12 +msgid "Phone Information" +msgstr "Informazioni Telefono" + +#: ../glade/gfax.glade.h:13 +msgid "Transmit Properties" +msgstr "Proprieta di Transmissione" + +#: ../glade/gfax.glade.h:14 +#, fuzzy +msgid "Alter facsimile job parameters" +msgstr "Parametri alternativi di facsimile" + +#: ../glade/gfax.glade.h:15 +msgid "Server" +msgstr "Server" + +#: ../glade/gfax.glade.h:16 +msgid "" +"ATT (Dataport, Paradyne)\n" +"Motorola (Power Modem, 3400 Pro,...\n" +"QuickComm (Spirit II)\n" +"USR (Courier, Sportster)\n" +"Multi-Tech (for bit reversal)\n" +"User Defined\n" +msgstr "" + +#: ../glade/gfax.glade.h:23 +msgid "Auto Refresh Queue" +msgstr "Coda di Auto Refresh" + +#: ../glade/gfax.glade.h:24 +msgid "" +"Complete...\n" +"\n" +"Your new phone book is ready.\n" +"If this is a Gfax type phone book you may\n" +"now add items. \n" +"\n" +"Evolution phone books are read only\n" +"but may be change through Evolution." +msgstr "" +"Completato...\n" +"\n" +"La sua nuova agenda contatti telefonici e pronta.\n" +"Se la sua agenda e del tipo Gfax le puo adesso\n" +"immettere nuovi contatti. \n" +"\n" +"Contatti telefonici del tipo Evolution non sono modifficabili,\n" +"pero e possibile modificarli tramite Evolution." + +# +#: ../glade/gfax.glade.h:32 +msgid "Completed Jobs" +msgstr "Facsimili completati" + +#: ../glade/gfax.glade.h:33 +msgid "Database" +msgstr "Database" + +#: ../glade/gfax.glade.h:34 ../glade/send-druid.glade.h:11 +msgid "Delete" +msgstr "Cancellare" + +#: ../glade/gfax.glade.h:35 +msgid "Dial Prefix:" +msgstr "Prefisso:" + +#: ../glade/gfax.glade.h:36 +msgid "E-Mail Address:" +msgstr "Indirizzo E-Mail:" + +#: ../glade/gfax.glade.h:37 +msgid "E-Mail Notification" +msgstr "Avviso E-Mail" + +#: ../glade/gfax.glade.h:38 +msgid "Efax" +msgstr "Efax" + +#: ../glade/gfax.glade.h:39 +msgid "Evolution" +msgstr "Evolution" + +#: ../glade/gfax.glade.h:40 +msgid "Evolution Address books" +msgstr "Aggenda Evolution" + +#: ../glade/gfax.glade.h:41 +msgid "Exit" +msgstr "Uscita" + +#: ../glade/gfax.glade.h:42 +msgid "Facsimile Number:" +msgstr "Numero Telefax:" + +#: ../glade/gfax.glade.h:43 +msgid "Facsimiles to Send" +msgstr "Telefax da spedire" + +#: ../glade/gfax.glade.h:44 +#, fuzzy +msgid "Fax Number:" +msgstr "Nummero Fax:" + +#: ../glade/gfax.glade.h:45 +msgid "Fax Status:" +msgstr "Stato Fax:" + +#: ../glade/gfax.glade.h:46 +msgid "Fax log enabled" +msgstr "Log dei fax attivo" + +#: ../glade/gfax.glade.h:47 +#, fuzzy +msgid "" +"First we must choose a transport agent. \n" +"\n" +"A transport agent is a software package that is responsible for\n" +"actually sending the facsimile with your modem. If you don't have \n" +"one of these installed you should hit cancel here and install\n" +"a transport agent first.\n" +"\n" +"Transport agents can be found at the following URL's but you should \n" +"check your distribution CD first..\n" +"\n" +"Hylafax - http://www.hylafax.org\n" +"Efax - http://www.cce.com/efax" +msgstr "" +"Per prima cosa dovete scegliere il tipo di fax server.\n" +"\n" +"Il fax server e un server responsabile per l'invio dei facsimili\n" +"Se non avete installatto un fax server ancora dovete premmere Cancella\n" +"e installare prima un fax server.\n" +"\n" +"Gli fax server possono essere trovati algi seguenti indirizzi URL,\n" +"pero e meglio sevoi controllate prima gli CD della vostra distribuzione.\n" +"\n" +"Hylafax - http://www.hylafax.org\n" +"Mgetty - http://alpha.greenie.net/mgetty\n" +"Efax - http://www.cce.com/efax" + +#: ../glade/gfax.glade.h:59 +msgid "Gfax" +msgstr "Gfax" + +#: ../glade/gfax.glade.h:60 +msgid "Gfax - E-Mail Address" +msgstr "Gfax - Indirizzo E-Mail" + +#: ../glade/gfax.glade.h:61 +msgid "Gfax - Facsimile Transport Agent" +msgstr "Gfax - Agente di trasporto facsimili" + +#: ../glade/gfax.glade.h:62 +msgid "Gfax - Gnome facsimile program" +msgstr "Gfax - Programma Gnome per facsimili" + +#: ../glade/gfax.glade.h:63 +msgid "Gfax - Modem Selection" +msgstr "Gfax - Selezione Modem" + +#: ../glade/gfax.glade.h:64 +msgid "Gfax - Phone Number Information" +msgstr "Gfax - Informazioni Numero di Telefono" + +#: ../glade/gfax.glade.h:65 +msgid "Gfax - Setup Complete" +msgstr "Gfax - Setup Completato" + +#: ../glade/gfax.glade.h:66 +msgid "Gfax - Add new phone book." +msgstr "Gfax - Aggiungi Agenda nr. Telefonici" + +#: ../glade/gfax.glade.h:67 +msgid "Gfax - Modify Job" +msgstr "Gfax - Modifica lavoro" + +#: ../glade/gfax.glade.h:68 +msgid "Gfax - New user setup" +msgstr "Gfax - Setup Nuovo Utente" + +#: ../glade/gfax.glade.h:69 +msgid "Gfax - Preferences" +msgstr "Gfax - Proprieta" + +#: ../glade/gfax.glade.h:70 +msgid "Gfax - Transmission Progress" +msgstr "Gfax - Progresso Trasmissione" + +#: ../glade/gfax.glade.h:71 +#, fuzzy +msgid "" +"Gfax can inform the Efax transport agent which\n" +"serial port your modem is connected to." +msgstr "" +"Gfax e capace di informare l'Efax server quale e la\n" +"porta seriale che il vostro modem usa." + +#: ../glade/gfax.glade.h:73 +msgid "" +"Gfax setup is now complete!\n" +"\n" +"Gfax is configurable; there are other configuration \n" +"options available under the preferences menu.\n" +"\n" +"You can run this first time setup at any time from\n" +"the preferences section.\n" +"\n" +"Default preferences have been choosen for the\n" +"transport agent you chose, you may want to\n" +"customise them." +msgstr "" +"Il setup di Gfax e completato!\n" +"\n" +"Gfax e configurabile; ci sono altri settaggi sotto il \n" +"menu Proprieta.\n" +"\n" +"Potete riavviare questo programma di setup in qualunque\n" +"momento dal menu Proprieta.\n" +"\n" +"Le proprieta default sono state scielte per il tipo di\n" +"server da voi scielto, potete anche personalizarle." + +#: ../glade/gfax.glade.h:84 +msgid "Hi Resolution Mode" +msgstr "Modalita Alta Risoluzione" + +#: ../glade/gfax.glade.h:85 +msgid "Host Name:" +msgstr "Nome Host:" + +#: ../glade/gfax.glade.h:86 +msgid "Hostname:" +msgstr "Nome Host:" + +#: ../glade/gfax.glade.h:87 +msgid "Hylafax" +msgstr "Hylafax" + +#: ../glade/gfax.glade.h:88 +msgid "Hylafax - Choose this for network faxing." +msgstr "Hylafax - Selezionate questo tipo per il network faxing." + +#: ../glade/gfax.glade.h:89 +msgid "" +"Hylafax and Mgetty+Sendfax can both be requested to send \n" +"results of facsimile transmission to an email address.\n" +"\n" +"If you require this feature please enter your email address\n" +"here. It's a good idea to include this even if you don't \n" +"use it immediately, you can enable and disable it in the\n" +"preferences section of Gfax.\n" +" " +msgstr "" +"Hylafax e Mgetty+Sendfax possono entrambi essere usati per l'invio\n" +"via e-mail del risultato di sucesso di invio del facsimile.\n" +"\n" +"Se volete usufruire di questa funzione immetete il vostro indirizzo\n" +"e-mail. E una buona idea fare questo anche se non si desidera questa\n" +"funzione immediatamente. Potete abilitare/disabilitare questa funzione\n" +"nelle proprieta di Gfax.\n" +" " + +#: ../glade/gfax.glade.h:97 +msgid "IP Port:" +msgstr "IP Port:" + +#: ../glade/gfax.glade.h:98 +msgid "LDAP" +msgstr "LDAP" + +#: ../glade/gfax.glade.h:99 +msgid "Log Enabled" +msgstr "Log Attivato" + +#: ../glade/gfax.glade.h:100 +msgid "" +"Make no more than calls in attempting to send the facsimile. " +"Once has been reached, the job will be killed." +msgstr "" +"Non fare piu di chiamate tentando di inviare il facsimile. " +"Quando il nr. di chiamate e stato raggiunto, il lavoro verra \n" +"cancellato." + +#: ../glade/gfax.glade.h:101 +msgid "Maximum Dials:" +msgstr "Nr. Massimo di chiamate" + +#: ../glade/gfax.glade.h:102 +msgid "Mgetty" +msgstr "Mgetty" + +#: ../glade/gfax.glade.h:103 +msgid "Modem Connection" +msgstr "Connessione Modem" + +#: ../glade/gfax.glade.h:104 +#, fuzzy +msgid "Modem Port:" +msgstr "Porta Modem:" + +#: ../glade/gfax.glade.h:105 +#, fuzzy +msgid "Modem Type:" +msgstr "Modem Tipo:" + +#: ../glade/gfax.glade.h:106 +msgid "New Fax" +msgstr "Nuovo Fax" + +#: ../glade/gfax.glade.h:107 ../glade/send-druid.glade.h:23 +msgid "New phone book" +msgstr "Nuova Aggenda Telefonica" + +#: ../glade/gfax.glade.h:108 +msgid "Open phone book" +msgstr "Aprire Agenda Telefonica" + +#: ../glade/gfax.glade.h:109 +#, fuzzy +msgid "Page Size:" +msgstr "Pagina Formato:" + +#: ../glade/gfax.glade.h:110 +msgid "Password Dialog" +msgstr "Dialogo Password" + +#: ../glade/gfax.glade.h:111 ../glade/send-druid.glade.h:26 +#: ../src/newphonebook.cs:81 +msgid "Phone Book" +msgstr "Agenda Telefonica" + +#: ../glade/gfax.glade.h:112 +msgid "Please enter a name for your new phone book." +msgstr "Immettere nome per la vostra nuova agenda telefonica." + +#: ../glade/gfax.glade.h:113 +msgid "" +"Please enter the password \n" +"for your fax server." +msgstr "" +"Immettete la pasword per\n" +"il vostro fax server." + +#: ../glade/gfax.glade.h:115 +msgid "" +"Please enter the type of phone book you are creating." +msgstr "" +"Per favore immettere il tipo della agenda telefonica che state creando." + +#: ../glade/gfax.glade.h:121 +msgid "" +"Please enter your facsimile number.\n" +"\n" +"This number is placed in the top one line header that is placed \n" +"on all outgoing facsimiles.\n" +"\n" +"You may also choose a default dial prefix. Many companies in\n" +"North America use the number \"9\" to reach an outside line.\n" +msgstr "" +"Immettere il numero del vostro facsimile.\n" +"\n" +"Questo numero verra immesso sopra ogni telefax inviato nella .\n" +"prima riga del telefax.\n" +"\n" +"Potete anche scegliere il prefisso predefinito.\n" +"Molte volte si deve digitare \"0\" per avere il segnale.\n" +"Qua potete immettere il vostro prefisso\n" + +#: ../glade/gfax.glade.h:129 +msgid "" +"Please select the Evolution address books that you would \n" +"like to use.\n" +"\n" +"These are only local address books and will only include\n" +"contacts with facsimile numbers." +msgstr "" + +#: ../glade/gfax.glade.h:134 +msgid "Port Number:" +msgstr "Numero Porta:" + +#: ../glade/gfax.glade.h:135 +msgid "Received Facsimiles" +msgstr "Facsimili Ricevuti" + +#: ../glade/gfax.glade.h:136 +msgid "Remember this password" +msgstr "Ricorda questa password" + +#: ../glade/gfax.glade.h:137 +msgid "Send Email Notification" +msgstr "Invia Notifica Email" + +#: ../glade/gfax.glade.h:138 +msgid "Send Immediately" +msgstr "Invia immediatamente" + +#: ../glade/gfax.glade.h:139 +msgid "Speaker Volume:" +msgstr "Volume autoparlante:" + +#: ../glade/gfax.glade.h:140 +msgid "System" +msgstr "Sistema" + +#: ../glade/gfax.glade.h:141 +msgid "" +"The TCP/IP port number of the fax server. Default hylafax port is 4559." +msgstr "" +"La porta TCP/IP del fax server. La porta predefinita di Hylafax e 4559." + +#: ../glade/gfax.glade.h:142 +msgid "" +"The host name of the network fax server. Enter \"localhost\" if you are not " +"using a network fax server." +msgstr "" +"Il nome del host del server fax. Immettere \"localhost\" se non si e in ,\n" +"rete o non si usa un fax server di rete." + +#: ../glade/gfax.glade.h:143 +msgid "The serial port the modem is on - ttyS0 is COM1, ttyS1 is COM2 etc." +msgstr "" +"La porta seriale sulla quale e collegato il modem - ttyS0 = COM1, \n" +"ttyS1 = COM2 e cosi via." + +#: ../glade/gfax.glade.h:144 +msgid "" +"There was an error transmitting\n" +"your facsimile to the server!" +msgstr "" +"Si e verificato un errore durante\n" +"la trasmissione del fax al Fax Server!" + +#: ../glade/gfax.glade.h:146 +msgid "" +"This will lead you through the process \n" +"of creating a new phone book." +msgstr "" +"Questo Wizard vi guidera atraverso il \n" +"processo di creazione di una nuova agenda telefonica." + +#: ../glade/gfax.glade.h:148 +#, fuzzy +msgid "Time to send:" +msgstr "Ora Invio:" + +#: ../glade/gfax.glade.h:149 +msgid "" +"Transmitting facsimile to \n" +"Hylafax server." +msgstr "" +"Trasmissione Facsimile al \n" +"Hylafax-Server." + +#: ../glade/gfax.glade.h:151 +msgid "Transport Agent" +msgstr "Fax Server" + +#: ../glade/gfax.glade.h:152 +msgid "Use Cover Page" +msgstr "Uso Copertina" + +#: ../glade/gfax.glade.h:153 +msgid "Use Fine Resolution" +msgstr "Uso Alta Risoluzione" + +#: ../glade/gfax.glade.h:154 +msgid "User" +msgstr "Utente" + +#: ../glade/gfax.glade.h:155 +msgid "Username:" +msgstr "Nome Utente:" + +#: ../glade/gfax.glade.h:156 +msgid "" +"Very Low\n" +"Low\n" +"Medium\n" +"High" +msgstr "" +"Molto Basso\n" +"Basso\n" +"Medio\n" +"Alto" + +#: ../glade/gfax.glade.h:160 +msgid "View / Print" +msgstr "Vedi / Stampa" + +#: ../glade/gfax.glade.h:161 +msgid "" +"Welcome to Gfax!\n" +"\n" +"\n" +"Gfax is a GNOME facsimile program that provides \n" +"the familiar \"popup\" window when printing to a fax \n" +"printer.\n" +"\n" +"The following pages will help you to setup Gfax." +msgstr "" +"Benvenuti in Gfax!\n" +"\n" +"\n" +"Gfax e un programma per invio facsimili per GNOME il\n" +"quale usa le finestre \"popup\" quando si stampa ad una \n" +"stampante fax." +"\n" +"Le pagine seguenti vi aiuterano a configurare Gfax." + +#: ../glade/gfax.glade.h:169 +msgid "Which serial port is your modem connected to?" +msgstr "Quale e la porta seriale del vostro modem ?" + +#: ../glade/gfax.glade.h:170 +msgid "" +"Your facsimile was sucessfully\n" +" transmitted!" +msgstr "" +"Il vostro facsimile e stato \n" +"inviato con sucesso !" + +#: ../glade/gfax.glade.h:172 +msgid "_Cancel Job" +msgstr "_Cancellare Lavoro" + +#: ../glade/gfax.glade.h:173 +msgid "_Fax" +msgstr "_Fax" + +#: ../glade/gfax.glade.h:174 +msgid "_Help" +msgstr "_Aiuto" + +#: ../glade/gfax.glade.h:175 +msgid "_Modify Job" +msgstr "_Modifica Lavoro" + +#: ../glade/gfax.glade.h:176 +msgid "_Settings" +msgstr "_Proprieta" + +#: ../glade/gfax.glade.h:177 +msgid "cua1" +msgstr "cua1" + +#: ../glade/gfax.glade.h:178 +msgid "cua2" +msgstr "cua2" + +#: ../glade/gfax.glade.h:179 +msgid "" +"letter\n" +"legal\n" +"a4" +msgstr "" + +#: ../glade/gfax.glade.h:182 +msgid "localhost" +msgstr "localhost" + +#: ../glade/gfax.glade.h:183 +msgid "modem" +msgstr "modem" + +#: ../glade/gfax.glade.h:184 +msgid "oklabel" +msgstr "oklabel" + +#: ../glade/gfax.glade.h:185 +msgid "ttyS0" +msgstr "ttyS0" + +#: ../glade/gfax.glade.h:186 +msgid "ttyS1" +msgstr "ttyS1" + +#: ../glade/gfax.glade.h:187 +msgid "ttyS2" +msgstr "ttyS2" + +#: ../glade/gfax.glade.h:188 +msgid "ttyS3" +msgstr "ttyS3" + +#: ../glade/send-druid.glade.h:1 +msgid "Current Phone Books" +msgstr "Agenda Telefonica Corrente" + +#: ../glade/send-druid.glade.h:2 +msgid "Edit Phone book" +msgstr "Edittare Agenda Telefonica" + +#: ../glade/send-druid.glade.h:3 +msgid "Facsimile Job Details" +msgstr "Detagli Lavoro Facsimile" + +#: ../glade/send-druid.glade.h:4 +msgid "New fax information" +msgstr "New fax information" + +#: ../glade/send-druid.glade.h:5 +msgid "Add" +msgstr "Addizionare" + +#: ../glade/send-druid.glade.h:6 +msgid "Browse" +msgstr "Cercare" + +#: ../glade/send-druid.glade.h:7 +msgid "Clear" +msgstr "Cancellare" + +#: ../glade/send-druid.glade.h:8 +msgid "Close" +msgstr "Chiudere" + +#: ../glade/send-druid.glade.h:9 ../src/gfaxphonebook.cs:89 +#: ../src/gfaxsend.cs:142 ../src/sendphonebook.cs:105 +msgid "Contact" +msgstr "Contatto" + +#: ../glade/send-druid.glade.h:10 +msgid "Current Phone Book" +msgstr "Agenda Telefonica Corrente" + +#: ../glade/send-druid.glade.h:12 +#, fuzzy +msgid "Delete phone book" +msgstr "Cancellare Agenda Telefonica" + +#: ../glade/send-druid.glade.h:13 +msgid "Details" +msgstr "Detagli" + +#: ../glade/send-druid.glade.h:14 +msgid "E-Mail job results to:" +msgstr "Inviare e-mail del lavoroa:" + +#: ../glade/send-druid.glade.h:15 +msgid "Enter a phone number and hit ." +msgstr "Immettere nr. fax e premere ." + +#: ../glade/send-druid.glade.h:16 +msgid "Fax number:" +msgstr "Numero Fax:" + +#: ../glade/send-druid.glade.h:17 +msgid "Fine resolution" +msgstr "Risoluzione Fina" + +#: ../glade/send-druid.glade.h:18 +msgid "Gfax - Phone Book Selection" +msgstr "Gfax - Selezione Agenda Telefonica" + +#: ../glade/send-druid.glade.h:19 +msgid "Gfax - Phone books" +msgstr "Gfax - Agende Telefoniche" + +#: ../glade/send-druid.glade.h:20 +msgid "Job" +msgstr "Lavoro" + +#: ../glade/send-druid.glade.h:21 +msgid "New Entry" +msgstr "Nuova Entrata" + +#: ../glade/send-druid.glade.h:22 +msgid "New Item" +msgstr "Nuovo Item" + +#: ../glade/send-druid.glade.h:24 ../src/gui.cs:238 ../src/gui.cs:249 +msgid "Number" +msgstr "Numero" + +#: ../glade/send-druid.glade.h:25 ../src/gfaxphonebook.cs:87 +#: ../src/gfaxsend.cs:141 ../src/sendphonebook.cs:103 +msgid "Organization" +msgstr "Organizazzione" + +#: ../glade/send-druid.glade.h:27 +msgid "Phone Book Item List" +msgstr "Lista Item Agenda Telefonica" + +#: ../glade/send-druid.glade.h:28 +msgid "Phone Books" +msgstr "Agende Telefoniche" + +#: ../glade/send-druid.glade.h:29 +msgid "Postscript file:" +msgstr "Archivio Postscript:" + +#: ../glade/send-druid.glade.h:30 +msgid "Save and Close" +msgstr "Salva e Chiudi" + +#: ../glade/send-druid.glade.h:31 +#, fuzzy +msgid "Save and close" +msgstr "Salva e Chiudi" + +#: ../glade/send-druid.glade.h:32 ../src/gfaxsend.cs:139 +msgid "Send" +msgstr "Invia" + +#: ../glade/send-druid.glade.h:33 +msgid "Send Fax" +msgstr "Fax Invio" + +#: ../glade/send-druid.glade.h:34 +msgid "Send immediately" +msgstr "Invia Immediatamente" + +#: ../glade/send-druid.glade.h:35 +msgid "Transmit the fax" +msgstr "Trasmetti il Fax" + +#: ../glade/send-druid.glade.h:36 +msgid "Update" +msgstr "Aggiorna" + +#: ../glade/send-druid.glade.h:37 +msgid "_File" +msgstr "_Archivio" + +#: ../src/efax.cs:384 +msgid "Scanning control files." +msgstr "" + +#: ../src/efax.cs:397 +msgid "Running job " +msgstr "Lavoro Corrente" + +#: ../src/efax.cs:421 ../src/efax.cs:508 +msgid "Busy retries exceeded" +msgstr "" + +#: ../src/efax.cs:468 +#, fuzzy +msgid "Sending facsimile..." +msgstr "Invio Facsimile..." + +#. If successful then mv the control file to the done queue and flag +#. a date for it's removal. +#: ../src/efax.cs:492 +msgid "Success" +msgstr "Sucesso" + +#. fatal errors - no retry +#. fatalError = true; +#. change code in file +#: ../src/efax.cs:516 +msgid "Fatal error" +msgstr "Errore Fatale" + +#. Modem error - no retry +#. fatalError = true; +#: ../src/efax.cs:522 +msgid "Fatal modem error" +msgstr "Errore Fatale del Modem" + +#. Modem not responding +#. fatalError = true; +#: ../src/efax.cs:528 +msgid "Modem not responding" +msgstr "Il Modem non risponde" + +#. Program terminated +#. fatalError = true; +#: ../src/efax.cs:534 +msgid "Program terminated" +msgstr "Programma treminato" + +#: ../src/fax.cs:60 +msgid "No Connection" +msgstr "Connessione Assente" + +#: ../src/fax.cs:71 +msgid "" +"Efax transmit process running...\n" +"Scanning job files every 30 seconds." +msgstr "" + +#: ../src/fax.cs:77 +msgid "Error transport agent not specified!" +msgstr "Errore: Fax Server non specificato!" + +#: ../src/fax.cs:132 +msgid "Run" +msgstr "Corri" + +#: ../src/fax.cs:135 +msgid "Sleep" +msgstr "Dormi" + +#: ../src/fax.cs:138 +msgid "Block" +msgstr "Blocca" + +#: ../src/fax.cs:141 +msgid "Busy" +msgstr "Ocupato" + +#: ../src/fax.cs:144 ../src/fax.cs:244 +#, fuzzy +msgid "Done" +msgstr "Fatto" + +#: ../src/fax.cs:147 +#, fuzzy +msgid "Fail" +msgstr "_Falito" + +#: ../src/fax.cs:150 +#, fuzzy +msgid "New" +msgstr "Nuovo Fax" + +#: ../src/fax.cs:241 +msgid "Receiving" +msgstr "Ricezione" + +#: ../src/gfaxphonebook.cs:88 ../src/gfaxsend.cs:140 +#: ../src/sendphonebook.cs:104 +#, fuzzy +msgid "Phone Number" +msgstr "Numero Telefono" + +#: ../src/gfaxphonebook.cs:213 +msgid "Are you sure you want to delete the phone book?" +msgstr "siete sicuri di cancellare la agenda telefonica ?" + +#: ../src/gfaxphonebook.cs:297 +msgid "" +"You have unsaved phone book entries.\n" +" Are you sure you want to Quit?" +msgstr "" +"Es gibt ungespeicherte Telefonbucheinträge. \n" +"Sind Sie sicher, dass Sie beenden wollen? " + +#: ../src/gfaxphonebook.cs:460 +msgid "Press the key to delete an entry." +msgstr "Drücken Sie die Entfernen-Taste um einen Eintrag zu löschen." + +#: ../src/gfaxprefs.cs:190 ../src/gfaxprefs.cs:208 +msgid "You need to exit Gfax and restart it when you change transport agents" +msgstr "" + +#: ../src/gfaxsend.cs:88 +msgid "" +"\n" +"This is the first time you have run Gfax.\n" +"Please run Gfax from the menu or command line and set your \n" +"MODEM TYPE, PORT and Fax number under preferences.\n" +"\n" +"Gfax is initially setup to use Efax, you may change it use \n" +"Hylafax if you prefer or require connection to a network \n" +"facsimile server." +msgstr "" + +#: ../src/gfaxsend.cs:164 +msgid "Spooled from print job" +msgstr "" + +#: ../src/gfaxsend.cs:276 +msgid "" +"\n" +"The file you have entered does not exist.\n" +"Please check the name and try again." +msgstr "" + +#: ../src/gfaxsend.cs:310 +msgid "" +"\n" +"You have not entered a facsimile number!\n" +"Please enter a number and press the Enter key or\n" +"click the Phone Book button to select numbers or\n" +"entire phone books." +msgstr "" + +#: ../src/gui.cs:143 +msgid "" +"\n" +"This is the first time you have run Gfax.\n" +"You should set your MODEM TYPE and PORT under preferences.\n" +"\n" +"Gfax is initially setup to use Efax, you may change it use \n" +"Hylafax if you prefer or require connection to a network \n" +"facsimile server." +msgstr "" + +#: ../src/gui.cs:157 +msgid "" +"Your spool directory is missing!\n" +"\t\t\t\t\t\n" +"Please login as the root user and create the " +msgstr "" + +#: ../src/gui.cs:161 +msgid "" +" directory.\n" +"\n" +"All users should be able to write to it.\n" +msgstr "" + +#: ../src/gui.cs:166 +msgid "" +"The doneq directory is missing in your spool directory!\n" +"\t\t\t\t\t\n" +"Please login as the root user and create the " +msgstr "" + +#: ../src/gui.cs:169 +msgid "" +"/doneq directory.\n" +"\n" +"All users should be able to write to it.\n" +msgstr "" + +#: ../src/gui.cs:175 +msgid "" +"The recq directory is missing in your spool directory!\n" +"\t\t\t\t\t\n" +"Please login as the root user and create the " +msgstr "" + +#: ../src/gui.cs:178 +msgid "" +"/recq directory.\n" +"\n" +"All users should be able to write to it.\n" +msgstr "" + +#: ../src/gui.cs:237 ../src/gui.cs:248 +#, fuzzy +msgid "Jobid" +msgstr "Auftrag" + +#: ../src/gui.cs:239 ../src/gui.cs:250 ../src/gui.cs:259 +#, fuzzy +msgid "Status" +msgstr "Faxstatus:" + +#: ../src/gui.cs:240 ../src/gui.cs:251 +msgid "Owner" +msgstr "" + +#: ../src/gui.cs:241 ../src/gui.cs:252 +msgid "Pages" +msgstr "" + +#: ../src/gui.cs:242 ../src/gui.cs:253 +#, fuzzy +msgid "Dials" +msgstr "Details" + +#: ../src/gui.cs:243 ../src/gui.cs:254 +#, fuzzy +msgid "Send At" +msgstr "Senden" + +#: ../src/gui.cs:244 ../src/gui.cs:255 +msgid "Error" +msgstr "" + +#: ../src/gui.cs:258 +#, fuzzy +msgid "Sender" +msgstr "Senden" + +#: ../src/gui.cs:260 +#, fuzzy +msgid "Pages " +msgstr "Seitenformat" + +#: ../src/gui.cs:261 +msgid "Arrived" +msgstr "" + +#: ../src/gui.cs:262 +#, fuzzy +msgid "Filename" +msgstr "_Datei" + +#: ../src/gui.cs:666 +msgid "" +"Cannot read the facsimile file from the server. You most likely do not \n" +"have permission to read the file. Check the settings on your fax server." +msgstr "" + +#: ../src/gui.cs:673 +msgid "" +"Cannot start your faxviewer program. \n" +"Please check your settings. It is currently set to " +msgstr "" + +#: ../src/gui.cs:674 +msgid "." +msgstr "" + +#: ../src/gui.cs:709 +msgid "" +"Cannot delete the facsimile file from the server. You most likely do not \n" +"have permission to delete the file. Check the settings on your fax server." +msgstr "" + +#: ../src/gui.cs:715 +msgid "" +"Cannot delete the file on the Hylafax server. \n" +"Please check your settings or contact your system Administrator" +msgstr "" + +#: ../src/gui.cs:785 +msgid "Copyright (C) 2003 George Farris " +msgstr "" + +#: ../src/gui.cs:786 +msgid "A Facsimile application for GNOME" +msgstr "" + +#: ../src/gui.cs:831 +#, fuzzy +msgid "Refreshing server status..." +msgstr "Auto Refresh Queue" + +#: ../src/gui.cs:868 +#, fuzzy +msgid "Refreshing queue..." +msgstr "Auto Refresh Queue" + +#: ../src/gui.cs:934 ../src/gui.cs:953 +msgid "There are " +msgstr "" + +#: ../src/gui.cs:934 ../src/gui.cs:953 +msgid " jobs in the queue" +msgstr "" + +#: ../src/gui.cs:941 ../src/gui.cs:960 +msgid "There are 0 jobs in the queue" +msgstr "" + +#: ../src/hylafax.cs:146 +msgid "You can not write data to this stream" +msgstr "Sie können in diesen Strom keine Daten schreiben." + +#: ../src/hylafax.cs:150 +msgid "You can not read data from this stream" +msgstr "Sie können aus diesem Strom keine Daten lesen." + +#: ../src/hylafax.cs:158 +msgid "" +"Could not connect to your Hylafax server.\n" +"Check console messages for further information\n" +"\n" +"You might need to set a value for username." +msgstr "" +"Konnte nicht mit dem Hylafax-Server verbinden.\n" +"Überprüfen Sie die Konsolenausgabe für weitere Einzelheiten\n" +"\n" +"Möglicherweise müssen Sie einen Benutzernamen angeben." + +#: ../src/main.cs:109 +msgid "Gfax help..." +msgstr "Hilfe zu Gfax" + +#: ../src/main.cs:135 +msgid "" +"Gconfd cannot find your settings. \n" +"If you are running Gfax immediately \n" +"after an installation, you may have \n" +"to log out and log back in again." +msgstr "" + +#: ../src/newphonebook.cs:80 +#, fuzzy +msgid "Use" +msgstr "Benutzer" + +#: ../src/phonebook.cs:295 +#, csharp-format +msgid "Can't open file : {0}" +msgstr "Kann Datei {0} nicht öffnen\"" + +#: ../src/sendphonebook.cs:66 +msgid "You don't have any phone books yet." +msgstr "Sie haben noch keine Telefonbücher angelegt." + +#. Got have a column title or things won't show up +#: ../src/sendphonebook.cs:94 +#, fuzzy +msgid "Phone books" +msgstr "Telefonbücher" + +#~ msgid "0" +#~ msgstr "0" + +#~ msgid "1" +#~ msgstr "1" + +#~ msgid "10 Minutes" +#~ msgstr "10 Minuten" + +#~ msgid "1000" +#~ msgstr "1000" + +#~ msgid "115200" +#~ msgstr "115200" + +#~ msgid "15 Minutes" +#~ msgstr "15 Minuten" + +#~ msgid "1500" +#~ msgstr "1500" + +#~ msgid "19200" +#~ msgstr "19200" + +#~ msgid "2" +#~ msgstr "2" + +#~ msgid "2000" +#~ msgstr "2000" + +#~ msgid "2400" +#~ msgstr "2400" + +#~ msgid "3" +#~ msgstr "3" + +#~ msgid "30 Minutes" +#~ msgstr "30 Minutes" + +#~ msgid "38400" +#~ msgstr "38400" + +#~ msgid "4" +#~ msgstr "4" + +#~ msgid "4800" +#~ msgstr "4800" + +#~ msgid "5" +#~ msgstr "5" + +#~ msgid "5 Minutes" +#~ msgstr "5 Minuten" + +#~ msgid "500" +#~ msgstr "500" + +#~ msgid "57600" +#~ msgstr "57600" + +#~ msgid "6" +#~ msgstr "6" + +#~ msgid "7" +#~ msgstr "7" + +#~ msgid "8" +#~ msgstr "8" + +#~ msgid "9" +#~ msgstr "9" + +#~ msgid "9600" +#~ msgstr "9600" + +#~ msgid "" +#~ "A few modems respond to raising the DTR line (when opening the device) " +#~ "with `OK'. This can confuse `sendfax', because it will see this OK as " +#~ "response to the next command. Default is 0." +#~ msgstr "" +#~ "A few modems respond to raising the DTR line (when opening the device) " +#~ "with `OK'. This can confuse `sendfax', because it will see this OK as " +#~ "response to the next command. Default is 0." + +#, fuzzy +#~ msgid "ATT (Dataport, Paradyne)" +#~ msgstr "FCINIT='-j\\Q4'\t\t#AT&T (Dataport, Paradyne)" + +#~ msgid "" +#~ "After the maximum number of tries for one page are reached, `sendfax' can " +#~ "report an error and abort or continue. Default is Yes." +#~ msgstr "" +#~ "After the maximum number of tries for one page are reached, `sendfax' can " +#~ "report an error and abort or continue. Default is Yes." + +#~ msgid "" +#~ "An 'AT...' command that will be sent to the modem at the end of the modem " +#~ "initialization, right before dialing." +#~ msgstr "" +#~ "An 'AT...' command that will be sent to the modem at the end of the modem " +#~ "initialization, right before dialing." + +#~ msgid "Baud Rate Switch" +#~ msgstr "Baud Rate Switch" + +#~ msgid "" +#~ "Controls the amount of information written into the fax log file. " +#~ "Default is 3." +#~ msgstr "" +#~ "Controls the amount of information written into the fax log file. " +#~ "Default is 3." + +#~ msgid "Debug Level" +#~ msgstr "Debug Level" + +#~ msgid "Dial Command" +#~ msgstr "Wählbefehl" + +#~ msgid "Disabled" +#~ msgstr "Deaktiviert" + +#~ msgid "Fax Users Allowed" +#~ msgstr "Zugelassene Faxbenutzer" + +#~ msgid "Fax Users Denied" +#~ msgstr "Nicht zugelassene Faxbenutzer" + +#~ msgid "Hour" +#~ msgstr "Stunde" + +#~ msgid "" +#~ "How often you want the fax queue scanned. Faxes won't be transmitted " +#~ "until \"faxrunq\" is run to scan the queue. This value is set in /etc/" +#~ "crontab." +#~ msgstr "" +#~ "Wie oft soll die Fax-Warteschlange überprüft werden? Faxe werden erst\n" +#~ "übertragen, wenn \"faxrunq\" die Warteschlange überprüft. Der Wert wird\n" +#~ "in /etc/crontab festgelegt." + +#~ msgid "Ignore Carrier" +#~ msgstr "Freizeichen ignorieren" + +#~ msgid "Maximum Tries per Page" +#~ msgstr "Maximale Anzahl Versuche pro Seite" + +#~ msgid "Mgetty+Sendfax" +#~ msgstr "Mgetty+Sendfax" + +#~ msgid "Mgetty+Sendfax Setup" +#~ msgstr "Einrichtung von Mgetty+Sendfax" + +#~ msgid "Minute" +#~ msgstr "Minute" + +#~ msgid "Modem Handshake" +#~ msgstr "Modem Handshake" + +#~ msgid "Modem Initialization String" +#~ msgstr "Initialisierungssequenz des Modems" + +#~ msgid "Modem Port" +#~ msgstr "Modem-Anschluss" + +#~ msgid "Modem Quirks" +#~ msgstr "Besonderheiten des Modems" + +#~ msgid "Modem Speed (bps)" +#~ msgstr "Geschwindigkeit des Modems (bps)" + +#~ msgid "Modem Type" +#~ msgstr "Modemtyp" + +#, fuzzy +#~ msgid "Motorola (Power Modem, 3400 Pro,..." +#~ msgstr "FCINIT='-j\\Q1'\t\t#Motorola (Power Modem, 3400 Pro,.)" + +#, fuzzy +#~ msgid "Multi-Tech (for bit reversal)" +#~ msgstr "FCINIT='-or'\t\t # Multi-Tech (for bit reversal)" + +#~ msgid "No" +#~ msgstr "Nein" + +#~ msgid "None" +#~ msgstr "Keiner" + +#~ msgid "" +#~ "On some (very few) modems it is necessary to start with baudrate \"A\" " +#~ "and switch to baudrate \"B\" after sending the `AT+FCLASS=2' command. " +#~ "Default is None." +#~ msgstr "" +#~ "Bei manchen (sehr wenigen) Modems ist es notwendig, mit der Baudrate\n" +#~ "\"A\" zu beginnen und später, nachdem der Befehl 'AT+FCLASS=2' gesendet\n" +#~ "wurde, zu Baudrate \"B\" umzuschalten. Vorgabe ist Keine." + +#~ msgid "Open Delay (msec)" +#~ msgstr "Verzögerung beim Öffnen (Millisekunden)" + +#, fuzzy +#~ msgid "QuickComm (Spirit II)" +#~ msgstr "FCINIT='-j*F1'\t\t # QuickComm (Spirit II)" + +#~ msgid "Run Fax Queue Every" +#~ msgstr "Warteschlange abarbeiten jede" + +#~ msgid "SendFax Config File" +#~ msgstr "Sendfax-Konfigurationsdatei" + +#~ msgid "Sendfax Config File" +#~ msgstr "Sendfax-Konfigurationsdatei" + +#~ msgid "Setup Druid" +#~ msgstr "Einrichtungsassistent" + +#~ msgid "" +#~ "The location of the mgetty \"sendfax.config\" file. Default is \"/etc/" +#~ "mgetty+sendfax/sendfax.config\". You shouldn't have to change this." +#~ msgstr "" +#~ "Speicherort der Datei \"sendfax.config\" von mgetty. Die Vorgabe ist\n" +#~ "\"/etc/mgetty+sendfax/sendfax.config\" Normalerweise müssen Sie dies\n" +#~ "nicht ändern.\"" + +#~ msgid "" +#~ "The maximum number of tries per page if the receiving end reports " +#~ "reception errors. Default is 3." +#~ msgstr "" +#~ "Maximale Anzahl von Versuchen pro Seite, wenn die empfangende Seite\n" +#~ "Empfangsfehler meldet. Vorgabe ist 3." + +#~ msgid "" +#~ "The speed to set your serial port at. Try the highest and go down from " +#~ "there." +#~ msgstr "" +#~ "Die Geschwindigkeit Ihres seriellen Anschlusses. Versuchen Sie\n" +#~ "zunächst den höchstmöglichen Wert und verringern Sie, falls nötig." + +#~ msgid "" +#~ "This can be used to adapt `sendfax' to some peculiarities in certain " +#~ "modems. Not normally required." +#~ msgstr "" +#~ "Dies kann eingesetzt werden, umd `sendfax' an die Eigenarten gewisser " +#~ "Modems anzupassen. Normalerweise nicht benötigt." + +#~ msgid "" +#~ "This is the command used for dialing out. Usually this will be something " +#~ "simple, as `ATDT' for tone or `ATDP' for pulse dialing." +#~ msgstr "" +#~ "Dies ist der Befehl zum Herauswählen. Normalerweise ist dies etwas\n" +#~ "einfaches, wie `ATDT' für Ton- oder `ATDP' für Impulswahl." + +#~ msgid "" +#~ "This will initialize the modem when the port is opened. See your modem " +#~ "manual. Default is ATZ." +#~ msgstr "" +#~ "Hiermit wird Ihr Modem initialisiert, wenn der Anschluss geöffnet\n" +#~ "wird. Schauen Sie in das Handbuch zu Ihrem Modem. Die Vorgabe ist ATZ." + +#~ msgid "Type of fax modem. See your modem manual. Default is auto." +#~ msgstr "" +#~ "Typ des Faxmodems. Konsultieren Sie Ihr Modemhandbuch. Vorgabe ist auto." + +#, fuzzy +#~ msgid "USR (Courier, Sportster)" +#~ msgstr "FCINIT='-j&H2'\t\t# USR (Courier, Sportster)" + +#, fuzzy +#~ msgid "User Defined" +#~ msgstr "Nicht zugelassene Faxbenutzer" + +#~ msgid "" +#~ "Users allowed to use the fax system. Can be empty only if the deny list " +#~ "is populated. These must be user names." +#~ msgstr "" +#~ "Benutzer, die berechtigt sind, das Faxsystem zu benutzen. Kann nur\n" +#~ "dann leer sein, wenn die Liste der nicht zugelassen Benutzer Einträge\n" +#~ "enthält. Diese müssen Benutzernamen verwenden." + +#~ msgid "" +#~ "Users denied from using the fax system. Can be empty only if the allow " +#~ "list is populated." +#~ msgstr "" +#~ "Benutzer, die nicht berechtigt sind, das Faxsystem zu benutzen. Kann\n" +#~ "nur dann leer gelassen werfden, wenn die Liste der zugelassenen\n" +#~ "Benutzer Einträge enthält." + +#~ msgid "Yes" +#~ msgstr "Ja" + +#~ msgid "a4" +#~ msgstr "a4" + +#~ msgid "auto" +#~ msgstr "auto" + +#~ msgid "c2.0" +#~ msgstr "c2.0" + +#~ msgid "cls2" +#~ msgstr "cls2" + +#~ msgid "legal" +#~ msgstr "legal" + +#~ msgid "letter" +#~ msgstr "letter" + +#~ msgid "'-x /usr/spool/uucp/LCK..$DEV'" +#~ msgstr "'-x /usr/spool/uucp/LCK..$DEV'" + +#~ msgid "'-x /var/lock/LCK..$DEV'" +#~ msgstr "'-x /var/lock/LCK..$DEV'" + +#~ msgid "*" +#~ msgstr "*" + +#~ msgid "-x /var/spool/uucp/LCK..$DEV'" +#~ msgstr "-x /var/spool/uucp/LCK..$DEV'" + +#~ msgid "/etc/efax.rc" +#~ msgstr "/etc/efax.rc" + +#~ msgid "" +#~ "Complete...\n" +#~ "\n" +#~ "Your new phone book is ready for you to add items." +#~ msgstr "" +#~ "Complete...\n" +#~ "\n" +#~ "Your new phone book is ready for you to add items." + +#~ msgid "Efax config file" +#~ msgstr "Efax config file" + +#~ msgid "Enter a phone number and hit or press the \"Add\" button" +#~ msgstr "" +#~ "Geben Sie eine Telefonnummer ein und drücken Sie oder klicken " +#~ "Sie auf den Knopf \"Hinzufügen\"." + +#~ msgid "FCINIT=''" +#~ msgstr "FCINIT=''" + +#~ msgid "Force xon/xoff" +#~ msgstr "Force xon/xoff" + +#~ msgid "Gfax - Select postcript file" +#~ msgstr "Gfax - Postcript-Datei auswählen" + +#~ msgid "Lock File" +#~ msgstr "Sperrdatei" + +#~ msgid "Preferences" +#~ msgstr "Vorlieben" + +#~ msgid "Send later" +#~ msgstr "Später senden" + +#~ msgid "" +#~ "Status Column Definition: D = Complete, R = Running, F = Failed, S = " +#~ "Sleeping, W = Waiting for modem, B = Blocked by job, P = Pending" +#~ msgstr "" +#~ "Erklärung der Statusspalten: D = Abgeschlosse, R = Laufend, F =\n" +#~ "Fehlgeschlagen, S = Schlafend, W = Warte auf Modem, B= Blockiert durch\n" +#~ "Auftrag, P = Wartend" + +#~ msgid "Use cover page" +#~ msgstr "Deckblatt benutzen" + +#~ msgid "New Phonebook" +#~ msgstr "Neues Telefonbuch" + +#~ msgid "label379" +#~ msgstr "label379" + +#~ msgid "label383" +#~ msgstr "label383" diff --git a/po/lv.po b/po/lv.po new file mode 100644 index 0000000..fc2437c --- /dev/null +++ b/po/lv.po @@ -0,0 +1,1569 @@ +# Latvian translations for gfax package. +# Copyright (C) 2004 THE gfax'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gfax package. +# George Farris , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: gfax 0.7.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-12-04 19:29-0800\n" +"PO-Revision-Date: 2005-02-24 19:21+0100\n" +"Last-Translator: Maris Dembovskis \n" +"Language-Team: Latvian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../gfax.desktop.in.h:1 +#, fuzzy +msgid "Gfax Facsimile Program" +msgstr "Gfax FaksÄ“Å¡anas programma" + +#: ../gfax.desktop.in.h:2 +#, fuzzy +msgid "Send and Receive Facsimiles" +msgstr "SÅ«tÄ«t saņemt faksus" + +#: ../gfax.schemas.in.h:1 +msgid "0:never, 1:until carrier, 2:always, 3:on receive only" +msgstr "" + +#: ../gfax.schemas.in.h:2 +msgid "0:very low, 1:low, 2:medium, 3:high" +msgstr "" + +#: ../gfax.schemas.in.h:3 +#, fuzzy +msgid "Modem Device" +msgstr "Modema tips" + +#: ../gfax.schemas.in.h:4 +#, fuzzy +msgid "Modem initialization string" +msgstr "ModÄ“mu inicializÄ“Å¡ana" + +#: ../gfax.schemas.in.h:5 +msgid "Modem reset string" +msgstr "" + +#: ../gfax.schemas.in.h:6 +msgid "Not currently used." +msgstr "" + +#: ../gfax.schemas.in.h:7 +msgid "The initialization code that is sent to the modem." +msgstr "" + +#: ../gfax.schemas.in.h:8 +msgid "" +"The name of the lock file according to your system's conventions. If you're " +"running Linux you shouldn't have to touch this." +msgstr "" + +#: ../gfax.schemas.in.h:9 +msgid "" +"The reset code that resets the modem to a power up state. The -Kz code works " +"with most modems." +msgstr "" + +#: ../gfax.schemas.in.h:10 +#, fuzzy +msgid "" +"The serial port the modem is connected too. Typical values are ttyS0, cua0 " +"or modem." +msgstr "" +"SeriÄlie porti, pie kuriem modems ir pieslÄ“gts, parasti tie ir ttyS0, cua0" + +#: ../glade/gfax.glade.h:1 +msgid "" +"\n" +"Please enter your Hylafax server information here. If you are running " +"Hylafax on the same computer That you are using Gfax on then \"Host Name\" " +"should be set to \"localhost\".\n" +msgstr "" +"\n" +"Ievadiet lÅ«dzu Hylafax servera informÄciju.\n" +"Ja jÅ«s lietojat Hylafax uz tÄ paÅ¡a datora, kur tiks palaists GFAX, tad\n" +"jums ir \"nosaukums\" \"localhost\" jÄdod. \n" + +#: ../glade/gfax.glade.h:4 +msgid " Program: " +msgstr "" + +#: ../glade/gfax.glade.h:5 +msgid "4559" +msgstr "4559" + +#: ../glade/gfax.glade.h:6 +msgid "E-Mail Notification" +msgstr "E-pasta brÄ«dinÄjums" + +#: ../glade/gfax.glade.h:7 +msgid "Efax Setup" +msgstr "Efax uzstÄdÄ«Å¡ana" + +#: ../glade/gfax.glade.h:8 +#, fuzzy +msgid "Facsimile Viewer Program" +msgstr "Faxu apskates programmas" + +#: ../glade/gfax.glade.h:9 +msgid "Fax Properties" +msgstr "Fax properties" + +#: ../glade/gfax.glade.h:10 +msgid "Fax Transport Agent" +msgstr "Fax Transport Agent" + +#: ../glade/gfax.glade.h:11 +msgid "Hylafax Setup" +msgstr "Hylafax uzstÄdÄ«Å¡ana" + +#: ../glade/gfax.glade.h:12 +msgid "Phone Information" +msgstr "Phone Information" + +#: ../glade/gfax.glade.h:13 +msgid "Transmit Properties" +msgstr "Transmit Properties" + +#: ../glade/gfax.glade.h:14 +#, fuzzy +msgid "Alter facsimile job parameters" +msgstr "PÄ“c faksa darba uzstÄdijumi" + +#: ../glade/gfax.glade.h:15 +msgid "Server" +msgstr "Serveris" + +#: ../glade/gfax.glade.h:16 +msgid "" +"ATT (Dataport, Paradyne)\n" +"Motorola (Power Modem, 3400 Pro,...\n" +"QuickComm (Spirit II)\n" +"USR (Courier, Sportster)\n" +"Multi-Tech (for bit reversal)\n" +"User Defined\n" +msgstr "" + +#: ../glade/gfax.glade.h:23 +msgid "Auto Refresh Queue" +msgstr "Auto Refresh Queue" + +#: ../glade/gfax.glade.h:24 +msgid "" +"Complete...\n" +"\n" +"Your new phone book is ready.\n" +"If this is a Gfax type phone book you may\n" +"now add items. \n" +"\n" +"Evolution phone books are read only\n" +"but may be change through Evolution." +msgstr "" + +# +#: ../glade/gfax.glade.h:32 +msgid "Completed Jobs" +msgstr "Pabeigtie darbi" + +#: ../glade/gfax.glade.h:33 +msgid "Database" +msgstr "DatubÄze" + +#: ../glade/gfax.glade.h:34 ../glade/send-druid.glade.h:11 +msgid "Delete" +msgstr "DzÄ“st" + +#: ../glade/gfax.glade.h:35 +msgid "Dial Prefix:" +msgstr "Ciparu prefix kad tiek sastÄdÄ«ts numurs:" + +#: ../glade/gfax.glade.h:36 +msgid "E-Mail Address:" +msgstr "E-pasta adrese:" + +#: ../glade/gfax.glade.h:37 +msgid "E-Mail Notification" +msgstr "E-pasta brÄ«dinÄjums" + +#: ../glade/gfax.glade.h:38 +msgid "Efax" +msgstr "Efax" + +#: ../glade/gfax.glade.h:39 +msgid "Evolution" +msgstr "Evolution" + +#: ../glade/gfax.glade.h:40 +msgid "Evolution Address books" +msgstr "" + +#: ../glade/gfax.glade.h:41 +msgid "Exit" +msgstr "Exit" + +#: ../glade/gfax.glade.h:42 +msgid "Facsimile Number:" +msgstr "Faxa numurs:" + +#: ../glade/gfax.glade.h:43 +msgid "Facsimiles to Send" +msgstr "Faksi, kas jÄnosÅ«ta" + +#: ../glade/gfax.glade.h:44 +#, fuzzy +msgid "Fax Number:" +msgstr "Faxa numurs:" + +#: ../glade/gfax.glade.h:45 +msgid "Fax Status:" +msgstr "Faxa status:" + +#: ../glade/gfax.glade.h:46 +msgid "Fax log enabled" +msgstr "Faxa izpildes rezultÄts apskatÄms" + +#: ../glade/gfax.glade.h:47 +#, fuzzy +msgid "" +"First we must choose a transport agent. \n" +"\n" +"A transport agent is a software package that is responsible for\n" +"actually sending the facsimile with your modem. If you don't have \n" +"one of these installed you should hit cancel here and install\n" +"a transport agent first.\n" +"\n" +"Transport agents can be found at the following URL's but you should \n" +"check your distribution CD first..\n" +"\n" +"Hylafax - http://www.hylafax.org\n" +"Efax - http://www.cce.com/efax" +msgstr "" +"Vispirms ir jÄizvÄ“las transporta aÄ£ents.\n" +"\n" +"Transporta aÄ£ents ir programmatÅ«ra, kas ir atbildÄ«ga " +"par to, kad kad notiek faxu sÅ«tÄ«Å¡ana caur jÅ«su modemu " +"Ja jums pagaidÄm nav nevienas programmas, kas atbild par faksu sÅ«tÄ«Å¡anu, lÅ«dzu instalÄ“jiet to tagad.\n" +"\n" +"Transporta (faxu sÅ«tÄ«Å¡anas) aÄ£enti var atrasties zem Å¡ÄdÄm saitÄ“m\n" +"bet vispirms lÅ«dzu pÄrbaudiet savas distribÅ«cijas CD.\n" +"\n" +"Hylafax - http://www.hylafax.org\n" +"Mgetty - http://alpha.greenie.net/mgetty\n" +"Efax - http://www.cce.com/efax" + +#: ../glade/gfax.glade.h:59 +msgid "Gfax" +msgstr "Gfax" + +#: ../glade/gfax.glade.h:60 +msgid "Gfax - E-Mail Address" +msgstr "Gfax - E-pasta adrese" + +#: ../glade/gfax.glade.h:61 +msgid "Gfax - Facsimile Transport Agent" +msgstr "Gfax - Programma faxu sÅ«tÄ«Å¡anai" + +#: ../glade/gfax.glade.h:62 +msgid "Gfax - Gnome facsimile program" +msgstr "Gfax - Gnome-Faxu programma" + +#: ../glade/gfax.glade.h:63 +msgid "Gfax - Modem Selection" +msgstr "Gfax - Modema izvÄ“le" + +#: ../glade/gfax.glade.h:64 +msgid "Gfax - Phone Number Information" +msgstr "Gfax - Telefona numura informÄcija" + +#: ../glade/gfax.glade.h:65 +msgid "Gfax - Setup Complete" +msgstr "Gfax - UzstÄdÄ«Å¡ana pabeigta" + +#: ../glade/gfax.glade.h:66 +msgid "Gfax - Add new phone book." +msgstr "Gfax - Jauna telefona grÄmata" + +#: ../glade/gfax.glade.h:67 +msgid "Gfax - Modify Job" +msgstr "" + +#: ../glade/gfax.glade.h:68 +msgid "Gfax - New user setup" +msgstr "Gfax - Jauna lietotÄja uzstÄdÄ«Å¡ana" + +#: ../glade/gfax.glade.h:69 +msgid "Gfax - Preferences" +msgstr "Gfax - UzstÄdÄ«jumi" + +#: ../glade/gfax.glade.h:70 +msgid "Gfax - Transmission Progress" +msgstr "Gfax - ApstrÄdes progress" + +#: ../glade/gfax.glade.h:71 +#, fuzzy +msgid "" +"Gfax can inform the Efax transport agent which\n" +"serial port your modem is connected to." +msgstr "" +"Gfax var informÄ“t Efax sistÄ“mu par\n" +"pie kura seriÄlÄ porta modems ir pieslÄ“gts." + +#: ../glade/gfax.glade.h:73 +msgid "" +"Gfax setup is now complete!\n" +"\n" +"Gfax is configurable; there are other configuration \n" +"options available under the preferences menu.\n" +"\n" +"You can run this first time setup at any time from\n" +"the preferences section.\n" +"\n" +"Default preferences have been choosen for the\n" +"transport agent you chose, you may want to\n" +"customise them." +msgstr "" +"Gfax uzstÄdÄ«Å¡ana pabeigta.\n" +"\n" +"Gfax ir konfigurÄ“jams ar daudz dažadÄm kofigurÄcijas iespÄ“jÄm \n" +"zem UZSTÄ€DĪJUMI.\n" +"\n" +"JÅ«s varat palaist pirmo reizi programmu ar jebkÄdiem laika uzstÄdÄ«jumiem.\n" +"\n" +"\n" +"NoklusÄ“tie uzstÄdÄ«jumi ir izvÄ“lÄ“ti\n" +"jÅ«s varat arÄ« rediģēt Å¡os uzstÄdÄ«jumus." + +#: ../glade/gfax.glade.h:84 +msgid "Hi Resolution Mode" +msgstr "IzÅ¡Ä·irtspÄ“ja" + +#: ../glade/gfax.glade.h:85 +msgid "Host Name:" +msgstr "Hosta vÄrds:" + +#: ../glade/gfax.glade.h:86 +msgid "Hostname:" +msgstr "Hosts:" + +#: ../glade/gfax.glade.h:87 +msgid "Hylafax" +msgstr "Hylafax" + +#: ../glade/gfax.glade.h:88 +msgid "Hylafax - Choose this for network faxing." +msgstr "Hylafax - IzvÄ“lieties Å¡o tÄ«kla faksÄ“Å¡anai" + +#: ../glade/gfax.glade.h:89 +msgid "" +"Hylafax and Mgetty+Sendfax can both be requested to send \n" +"results of facsimile transmission to an email address.\n" +"\n" +"If you require this feature please enter your email address\n" +"here. It's a good idea to include this even if you don't \n" +"use it immediately, you can enable and disable it in the\n" +"preferences section of Gfax.\n" +" " +msgstr "" +"Hylafax un Mgetty+Sendfax var abi sÅ«tÄ«t\n" +"rezultÄti faksÄ“Å¡anai uz e-pasta adresi\n" +"\n" +"\n" +"Ja jÅ«s vÄ“laties Å¡Ädu iespÄ“ju, lÅ«dzu ierakstiet savu e-pasta adresi\n" +"Å¡eit. Ir laba ideja to ierakstÄ«t arÄ« tad, ja Å¡Ä« opcija netiks izmantota\n" +"vÄ“lÄk Å¡o iespÄ“ju varÄ“s aizliegt vai atļaut\n" +"zem UzstÄdÄ«jumi izvÄ“lnes.\n" +" " + +#: ../glade/gfax.glade.h:97 +msgid "IP Port:" +msgstr "IP Ports:" + +#: ../glade/gfax.glade.h:98 +msgid "LDAP" +msgstr "LDAP" + +#: ../glade/gfax.glade.h:99 +msgid "Log Enabled" +msgstr "Log aktivizÄ“ts" + +#: ../glade/gfax.glade.h:100 +msgid "" +"Make no more than calls in attempting to send the facsimile. " +"Once has been reached, the job will be killed." +msgstr "" + +#: ../glade/gfax.glade.h:101 +msgid "Maximum Dials:" +msgstr "" + +#: ../glade/gfax.glade.h:102 +msgid "Mgetty" +msgstr "Mgetty" + +#: ../glade/gfax.glade.h:103 +msgid "Modem Connection" +msgstr "Modema konekcija" + +#: ../glade/gfax.glade.h:104 +#, fuzzy +msgid "Modem Port:" +msgstr "Modema ports" + +#: ../glade/gfax.glade.h:105 +#, fuzzy +msgid "Modem Type:" +msgstr "Modema tips" + +#: ../glade/gfax.glade.h:106 +msgid "New Fax" +msgstr "Jauns Fax" + +#: ../glade/gfax.glade.h:107 ../glade/send-druid.glade.h:23 +msgid "New phone book" +msgstr "Jauna telefona grÄmata" + +#: ../glade/gfax.glade.h:108 +msgid "Open phone book" +msgstr "AtvÄ“rt telefona grÄmatu" + +#: ../glade/gfax.glade.h:109 +#, fuzzy +msgid "Page Size:" +msgstr "PapÄ«ra lielums" + +#: ../glade/gfax.glade.h:110 +msgid "Password Dialog" +msgstr "Paroles dialogs" + +#: ../glade/gfax.glade.h:111 ../glade/send-druid.glade.h:26 +#: ../src/newphonebook.cs:81 +msgid "Phone Book" +msgstr "Telefona grÄmata" + +#: ../glade/gfax.glade.h:112 +msgid "Please enter a name for your new phone book." +msgstr "LÅ«dzu ieraksti vÄrdu jaunajai telefonu grÄmatai." + +#: ../glade/gfax.glade.h:113 +msgid "" +"Please enter the password \n" +"for your fax server." +msgstr "" +"LÅ«dzu ieraksti savu paroli\n" +"savam faxa serverim." + +#: ../glade/gfax.glade.h:115 +msgid "Please enter the type of phone book you are creating." + +msgstr "LÅ«dzu ievadi telefonu grÄmatas tipu, ko tu veido." + +#: ../glade/gfax.glade.h:121 +msgid "" +"Please enter your facsimile number.\n" +"\n" +"This number is placed in the top one line header that is placed \n" +"on all outgoing facsimiles.\n" +"\n" +"You may also choose a default dial prefix. Many companies in\n" +"North America use the number \"9\" to reach an outside line.\n" +msgstr "" +"LÅ«dzu ievadiet faxa numuru.\n" +"\n" +"Å is numurs bÅ«s redzams visÄm izejoÅ¡ajÄm lapÄm paÅ¡Ä lapas augÅ¡Ä.\n" +"\n" +"JÅ«s varat izvÄ“lÄ“ties arÄ« noklusÄ“to zvanÄ«Å¡anas prefixu \n" +"Daudzas kompÄnijas USA lieto ciparu \"9\", lai pieslÄ“gtos ÄrÄ“jai lÄ«nijai \n" +"EiropÄ toties lieto \"0\" lai pieslÄ“gtus citÄm valstÄ«m \n" +"\n" + +#: ../glade/gfax.glade.h:129 +msgid "" +"Please select the Evolution address books that you would \n" +"like to use.\n" +"\n" +"These are only local address books and will only include\n" +"contacts with facsimile numbers." +msgstr "" + +#: ../glade/gfax.glade.h:134 +msgid "Port Number:" +msgstr "Porta numurs" + +#: ../glade/gfax.glade.h:135 +msgid "Received Facsimiles" +msgstr "Empfangene Faxe" + +#: ../glade/gfax.glade.h:136 +msgid "Remember this password" +msgstr "AtcerÄ“ties paroli" + +#: ../glade/gfax.glade.h:137 +msgid "Send Email Notification" +msgstr "SÅ«tÄ«t e-pasta paziņojumu" + +#: ../glade/gfax.glade.h:138 +msgid "Send Immediately" +msgstr "SÅ«tÄ«t steidzami" + +#: ../glade/gfax.glade.h:139 +msgid "Speaker Volume:" +msgstr "" + +#: ../glade/gfax.glade.h:140 +msgid "System" +msgstr "SistÄ“ma" + +#: ../glade/gfax.glade.h:141 +msgid "" +"The TCP/IP port number of the fax server. Default hylafax port is 4559." +msgstr "" +"TCP/IP porta numurs faxa serverim. NoklusÄ“tais Hylafax ports ir 4559." + +#: ../glade/gfax.glade.h:142 +msgid "" +"The host name of the network fax server. Enter \"localhost\" if you are not " +"using a network fax server." +msgstr "" +"Hosta vÄrds tÄ«kla faxa serverim. AtstÄjiet \"localhost\" ja jÅ«s nelietojat,\n" +"tÄ«kla faxa serveri." + +#: ../glade/gfax.glade.h:143 +msgid "The serial port the modem is on - ttyS0 is COM1, ttyS1 is COM2 etc." +msgstr "" +"SeriÄlÄ ports, pie kura modems ir ieslÄ“gts - ttyS0,COM1, ttyS1 ir COM2 u.t.t." + +#: ../glade/gfax.glade.h:144 +msgid "" +"There was an error transmitting\n" +"your facsimile to the server!" +msgstr "" +"NeizdevÄs nosÅ«tÄ«t \n" +"faxu uz faxa serveri!" + +#: ../glade/gfax.glade.h:146 +msgid "" +"This will lead you through the process \n" +"of creating a new phone book." +msgstr "" +"Tagad jÅ«s tiksiet vadÄ«ti cauri procesam, \n" +"veidojot jaunu telefonu grÄmatu." + +#: ../glade/gfax.glade.h:148 +#, fuzzy +msgid "Time to send:" +msgstr "Laiks, ka jÄnosÅ«ta" + +#: ../glade/gfax.glade.h:149 +msgid "" +"Transmitting facsimile to \n" +"Hylafax server." +msgstr "" +"SÅ«tÄ«t faxu uz\n" +"Hylafax-Server." + +#: ../glade/gfax.glade.h:151 +msgid "Transport Agent" +msgstr "Transporta aÄ£ents" + +#: ../glade/gfax.glade.h:152 +msgid "Use Cover Page" +msgstr "Lietot priekÅ¡lapu" + +#: ../glade/gfax.glade.h:153 +msgid "Use Fine Resolution" +msgstr "Lietot normÄlu izÅ¡Ä·irtspÄ“ju" + +#: ../glade/gfax.glade.h:154 +msgid "User" +msgstr "LietotÄjs" + +#: ../glade/gfax.glade.h:155 +msgid "Username:" +msgstr "LietotÄjvÄrds:" + +#: ../glade/gfax.glade.h:156 +msgid "" +"Very Low\n" +"Low\n" +"Medium\n" +"High" +msgstr "" + +#: ../glade/gfax.glade.h:160 +msgid "View / Print" +msgstr "" + +#: ../glade/gfax.glade.h:161 +msgid "" +"Welcome to Gfax!\n" +"\n" +"\n" +"Gfax is a GNOME facsimile program that provides \n" +"the familiar \"popup\" window when printing to a fax \n" +"printer.\n" +"\n" +"The following pages will help you to setup Gfax." +msgstr "" +"msgid \"c2.0\"\n" +"msgstr \"\"" + +#: ../glade/gfax.glade.h:169 +msgid "Which serial port is your modem connected to?" +msgstr "Pie kura seriÄlÄ porta jÅ«su modems ir pieslÄ“gts?" + +#: ../glade/gfax.glade.h:170 +msgid "" +"Your facsimile was sucessfully\n" +" transmitted!" +msgstr "" +"Fakss nosÅ«tÄ«ts \n" +"veiksmÄ«gi." + +#: ../glade/gfax.glade.h:172 +msgid "_Cancel Job" +msgstr "_pÄrtraukt darbu" + +#: ../glade/gfax.glade.h:173 +msgid "_Fax" +msgstr "_Fax" + +#: ../glade/gfax.glade.h:174 +msgid "_Help" +msgstr "_PalÄ«dzÄ«ba" + +#: ../glade/gfax.glade.h:175 +msgid "_Modify Job" +msgstr "" + +#: ../glade/gfax.glade.h:176 +msgid "_Settings" +msgstr "_UzstÄdÄ«jumi" + +#: ../glade/gfax.glade.h:177 +msgid "cua1" +msgstr "cua1" + +#: ../glade/gfax.glade.h:178 +msgid "cua2" +msgstr "cua2" + +#: ../glade/gfax.glade.h:179 +msgid "" +"letter\n" +"legal\n" +"a4" +msgstr "" + +#: ../glade/gfax.glade.h:182 +msgid "localhost" +msgstr "localhost" + +#: ../glade/gfax.glade.h:183 +msgid "modem" +msgstr "modem" + +#: ../glade/gfax.glade.h:184 +msgid "oklabel" +msgstr "oklabel" + +#: ../glade/gfax.glade.h:185 +msgid "ttyS0" +msgstr "ttyS0" + +#: ../glade/gfax.glade.h:186 +msgid "ttyS1" +msgstr "ttyS1" + +#: ../glade/gfax.glade.h:187 +msgid "ttyS2" +msgstr "ttyS2" + +#: ../glade/gfax.glade.h:188 +msgid "ttyS3" +msgstr "ttyS3" + +#: ../glade/send-druid.glade.h:1 +msgid "Current Phone Books" +msgstr "EsoÅ¡Ä telefonu grÄmata" + +#: ../glade/send-druid.glade.h:2 +msgid "Edit Phone book" +msgstr "Rediģēt telefonu grÄmatu" + +#: ../glade/send-druid.glade.h:3 +msgid "Facsimile Job Details" +msgstr "Faxa darba detaļas" + +#: ../glade/send-druid.glade.h:4 +msgid "New fax information" +msgstr "New fax information" + +#: ../glade/send-druid.glade.h:5 +msgid "Add" +msgstr "Add" + +#: ../glade/send-druid.glade.h:6 +msgid "Browse" +msgstr "" + +#: ../glade/send-druid.glade.h:7 +msgid "Clear" +msgstr "DzÄ“st" + +#: ../glade/send-druid.glade.h:8 +msgid "Close" +msgstr "TaisÄ«t ciet" + +#: ../glade/send-druid.glade.h:9 ../src/gfaxphonebook.cs:89 +#: ../src/gfaxsend.cs:142 ../src/sendphonebook.cs:105 +msgid "Contact" +msgstr "Kontakti" + +#: ../glade/send-druid.glade.h:10 +msgid "Current Phone Book" +msgstr "EsoÅ¡Ä telefonu grÄmata" + +#: ../glade/send-druid.glade.h:12 +#, fuzzy +msgid "Delete phone book" +msgstr "DzÄ“st telefonu grÄmatu" + +#: ../glade/send-druid.glade.h:13 +msgid "Details" +msgstr "Detaļas" + +#: ../glade/send-druid.glade.h:14 +msgid "E-Mail job results to:" +msgstr "E-pasta darba rezultÄts uz:" + +#: ../glade/send-druid.glade.h:15 +msgid "Enter a phone number and hit ." +msgstr "Ieraksti telefona numuru un nospied Enter." + +#: ../glade/send-druid.glade.h:16 +msgid "Fax number:" +msgstr "Faxa numurs:" + +#: ../glade/send-druid.glade.h:17 +msgid "Fine resolution" +msgstr "Laba rezolÅ«cija" + +#: ../glade/send-druid.glade.h:18 +msgid "Gfax - Phone Book Selection" +msgstr "Gfax - Telefona grÄmatas izvÄ“le" + +#: ../glade/send-druid.glade.h:19 +msgid "Gfax - Phone books" +msgstr "Gfax - Telefona grÄmata" + +#: ../glade/send-druid.glade.h:20 +msgid "Job" +msgstr "Darbs" + +#: ../glade/send-druid.glade.h:21 +msgid "New Entry" +msgstr "Jauns ieraksts" + +#: ../glade/send-druid.glade.h:22 +msgid "New Item" +msgstr "Jauna sadaļa" + +#: ../glade/send-druid.glade.h:24 ../src/gui.cs:238 ../src/gui.cs:249 +msgid "Number" +msgstr "Numurs" + +#: ../glade/send-druid.glade.h:25 ../src/gfaxphonebook.cs:87 +#: ../src/gfaxsend.cs:141 ../src/sendphonebook.cs:103 +msgid "Organization" +msgstr "OrganizÄcija" + +#: ../glade/send-druid.glade.h:27 +msgid "Phone Book Item List" +msgstr "TelefongrÄmatas liste" + +#: ../glade/send-druid.glade.h:28 +msgid "Phone Books" +msgstr "Telefonu grÄmata" + +#: ../glade/send-druid.glade.h:29 +msgid "Postscript file:" +msgstr "Postscript-fails:" + +#: ../glade/send-druid.glade.h:30 +msgid "Save and Close" +msgstr "SaglabÄt un aizvÄ“rt" + +#: ../glade/send-druid.glade.h:31 +#, fuzzy +msgid "Save and close" +msgstr "SaglabÄt un aizvÄ“rt" + +#: ../glade/send-druid.glade.h:32 ../src/gfaxsend.cs:139 +msgid "Send" +msgstr "SÅ«tÄ«t" + +#: ../glade/send-druid.glade.h:33 +msgid "Send Fax" +msgstr "NosÅ«tÄ«t faksu" + +#: ../glade/send-druid.glade.h:34 +msgid "Send immediately" +msgstr "SÅ«tÄ«t faksu nekavÄ“joties" + +#: ../glade/send-druid.glade.h:35 +msgid "Transmit the fax" +msgstr "PÄrsÅ«tÄ«t faksu" + +#: ../glade/send-druid.glade.h:36 +msgid "Update" +msgstr "Uzlabot" + +#: ../glade/send-druid.glade.h:37 +msgid "_File" +msgstr "_Fails" + +#: ../src/efax.cs:384 +msgid "Scanning control files." +msgstr "" + +#: ../src/efax.cs:397 +msgid "Running job " +msgstr "" + +#: ../src/efax.cs:421 ../src/efax.cs:508 +msgid "Busy retries exceeded" +msgstr "" + +#: ../src/efax.cs:468 +#, fuzzy +msgid "Sending facsimile..." +msgstr "SÅ«ta faxu..." + +#. If successful then mv the control file to the done queue and flag +#. a date for it's removal. +#: ../src/efax.cs:492 +msgid "Success" +msgstr "VeiksmÄ«gi" + +#. fatal errors - no retry +#. fatalError = true; +#. change code in file +#: ../src/efax.cs:516 +msgid "Fatal error" +msgstr "Kļūmes" + +#. Modem error - no retry +#. fatalError = true; +#: ../src/efax.cs:522 +msgid "Fatal modem error" +msgstr "Modema kļūdas" + +#. Modem not responding +#. fatalError = true; +#: ../src/efax.cs:528 +msgid "Modem not responding" +msgstr "Nevar sakonektÄ“ties ar modemu" + +#. Program terminated +#. fatalError = true; +#: ../src/efax.cs:534 +msgid "Program terminated" +msgstr "" + +#: ../src/fax.cs:60 +msgid "No Connection" +msgstr "Nav konekcijas" + +#: ../src/fax.cs:71 +msgid "" +"Efax transmit process running...\n" +"Scanning job files every 30 seconds." +msgstr "" + +#: ../src/fax.cs:77 +msgid "Error transport agent not specified!" +msgstr "Kļūda faxu sÅ«tÄ«Å¡anas programma nav norÄdÄ«ta!" + +#: ../src/fax.cs:132 +msgid "Run" +msgstr "StartÄ“t" + +#: ../src/fax.cs:135 +msgid "Sleep" +msgstr "GulÄ“t" + +#: ../src/fax.cs:138 +msgid "Block" +msgstr "" + +#: ../src/fax.cs:141 +msgid "Busy" +msgstr "Aizņemts" + +#: ../src/fax.cs:144 ../src/fax.cs:244 +#, fuzzy +msgid "Done" +msgstr "DarÄ«ts" + +#: ../src/fax.cs:147 +#, fuzzy +msgid "Fail" +msgstr "_" + +#: ../src/fax.cs:150 +#, fuzzy +msgid "New" +msgstr "Jauns fax" + +#: ../src/fax.cs:241 +msgid "Receiving" +msgstr "Saņemu" + +#: ../src/gfaxphonebook.cs:88 ../src/gfaxsend.cs:140 +#: ../src/sendphonebook.cs:104 +#, fuzzy +msgid "Phone Number" +msgstr "Porta numurs" + +#: ../src/gfaxphonebook.cs:213 +msgid "Are you sure you want to delete the phone book?" +msgstr "Vai esi droÅ¡s, ka vÄ“lies izdzÄ“st esoÅ¡o telefonu grÄmatu?" + +#: ../src/gfaxphonebook.cs:297 +msgid "" +"You have unsaved phone book entries.\n" +" Are you sure you want to Quit?" +msgstr "" +"Tu neesi saglabÄjis telefonu grÄmatas ierakstus. \n" +"Vai tu esi droÅ¡s, ka vÄ“lies beigt darbu? " + +#: ../src/gfaxphonebook.cs:460 +msgid "Press the key to delete an entry." +msgstr "Nospied Delete, lai dzÄ“stu ierakstu." + +#: ../src/gfaxprefs.cs:190 ../src/gfaxprefs.cs:208 +msgid "You need to exit Gfax and restart it when you change transport agents" +msgstr "" + +#: ../src/gfaxsend.cs:88 +msgid "" +"\n" +"This is the first time you have run Gfax.\n" +"Please run Gfax from the menu or command line and set your \n" +"MODEM TYPE, PORT and Fax number under preferences.\n" +"\n" +"Gfax is initially setup to use Efax, you may change it use \n" +"Hylafax if you prefer or require connection to a network \n" +"facsimile server." +msgstr "" + +#: ../src/gfaxsend.cs:164 +msgid "Spooled from print job" +msgstr "" + +#: ../src/gfaxsend.cs:276 +msgid "" +"\n" +"The file you have entered does not exist.\n" +"Please check the name and try again." +msgstr "" + +#: ../src/gfaxsend.cs:310 +msgid "" +"\n" +"You have not entered a facsimile number!\n" +"Please enter a number and press the Enter key or\n" +"click the Phone Book button to select numbers or\n" +"entire phone books." +msgstr "" + +#: ../src/gui.cs:143 +msgid "" +"\n" +"This is the first time you have run Gfax.\n" +"You should set your MODEM TYPE and PORT under preferences.\n" +"\n" +"Gfax is initially setup to use Efax, you may change it use \n" +"Hylafax if you prefer or require connection to a network \n" +"facsimile server." +msgstr "" + +#: ../src/gui.cs:157 +msgid "" +"Your spool directory is missing!\n" +"\t\t\t\t\t\n" +"Please login as the root user and create the " +msgstr "" + +#: ../src/gui.cs:161 +msgid "" +" directory.\n" +"\n" +"All users should be able to write to it.\n" +msgstr "" + +#: ../src/gui.cs:166 +msgid "" +"The doneq directory is missing in your spool directory!\n" +"\t\t\t\t\t\n" +"Please login as the root user and create the " +msgstr "LÅ«dzu ielogojies kÄ sakne" + +#: ../src/gui.cs:169 +msgid "" +"/doneq directory.\n" +"\n" +"All users should be able to write to it.\n" +msgstr "" + +#: ../src/gui.cs:175 +msgid "" +"The recq directory is missing in your spool directory!\n" +"\t\t\t\t\t\n" +"Please login as the root user and create the " +msgstr "" + +#: ../src/gui.cs:178 +msgid "" +"/recq directory.\n" +"\n" +"All users should be able to write to it.\n" +msgstr "" + +#: ../src/gui.cs:237 ../src/gui.cs:248 +#, fuzzy +msgid "Jobid" +msgstr "Darba ID" + +#: ../src/gui.cs:239 ../src/gui.cs:250 ../src/gui.cs:259 +#, fuzzy +msgid "Status" +msgstr "Faxa status:" + +#: ../src/gui.cs:240 ../src/gui.cs:251 +msgid "Owner" +msgstr "ĪpaÅ¡nieks" + +#: ../src/gui.cs:241 ../src/gui.cs:252 +msgid "Pages" +msgstr "Lappuses" + +#: ../src/gui.cs:242 ../src/gui.cs:253 +#, fuzzy +msgid "Dials" +msgstr "Zvana" + +#: ../src/gui.cs:243 ../src/gui.cs:254 +#, fuzzy +msgid "Send At" +msgstr "SÅ«tÄ«t" + +#: ../src/gui.cs:244 ../src/gui.cs:255 +msgid "Error" +msgstr "Kļūda" + +#: ../src/gui.cs:258 +#, fuzzy +msgid "Sender" +msgstr "SÅ«tÄ«tÄjs" + +#: ../src/gui.cs:260 +#, fuzzy +msgid "Pages " +msgstr "Lappuses" + +#: ../src/gui.cs:261 +msgid "Arrived" +msgstr "IenÄcis" + +#: ../src/gui.cs:262 +#, fuzzy +msgid "Filename" +msgstr "_Faila vÄrds" + +#: ../src/gui.cs:666 +msgid "" +"Cannot read the facsimile file from the server. You most likely do not \n" +"have permission to read the file. Check the settings on your fax server." +msgstr "" + +#: ../src/gui.cs:673 +msgid "" +"Cannot start your faxviewer program. \n" +"Please check your settings. It is currently set to " +msgstr "" + +#: ../src/gui.cs:674 +msgid "." +msgstr "" + +#: ../src/gui.cs:709 +msgid "" +"Cannot delete the facsimile file from the server. You most likely do not \n" +"have permission to delete the file. Check the settings on your fax server." +msgstr "" + +#: ../src/gui.cs:715 +msgid "" +"Cannot delete the file on the Hylafax server. \n" +"Please check your settings or contact your system Administrator" +msgstr "" + +#: ../src/gui.cs:785 +msgid "Copyright (C) 2003 George Farris " +msgstr "" + +#: ../src/gui.cs:786 +msgid "A Facsimile application for GNOME" +msgstr "" + +#: ../src/gui.cs:831 +#, fuzzy +msgid "Refreshing server status..." +msgstr "Auto Refresh Queue" + +#: ../src/gui.cs:868 +#, fuzzy +msgid "Refreshing queue..." +msgstr "Auto Refresh Queue" + +#: ../src/gui.cs:934 ../src/gui.cs:953 +msgid "There are " +msgstr "" + +#: ../src/gui.cs:934 ../src/gui.cs:953 +msgid " jobs in the queue" +msgstr "" + +#: ../src/gui.cs:941 ../src/gui.cs:960 +msgid "There are 0 jobs in the queue" +msgstr "" + +#: ../src/hylafax.cs:146 +msgid "You can not write data to this stream" +msgstr "Tagad tu vari rakstÄ«t datus." + +#: ../src/hylafax.cs:150 +msgid "You can not read data from this stream" +msgstr "Tagad tu vari datus lasÄ«t." + +#: ../src/hylafax.cs:158 +msgid "" +"Could not connect to your Hylafax server.\n" +"Check console messages for further information\n" +"\n" +"You might need to set a value for username." +msgstr "" +"Tu nevari piekonektÄ“ties pie Hylafax servera..\n" +"\n" +"IespÄ“jams tev jÄnorÄda pareizs lietotÄjvÄrds." + +#: ../src/main.cs:109 +msgid "Gfax help..." +msgstr "PalÄ«dzÄ«ba Gfax" + +#: ../src/main.cs:135 +msgid "" +"Gconfd cannot find your settings. \n" +"If you are running Gfax immediately \n" +"after an installation, you may have \n" +"to log out and log back in again." +msgstr "" + +#: ../src/newphonebook.cs:80 +#, fuzzy +msgid "Use" +msgstr "Lietot" + +#: ../src/phonebook.cs:295 +#, csharp-format +msgid "Can't open file : {0}" +msgstr "Nevar atvÄ“rt {0} failu" + +#: ../src/sendphonebook.cs:66 +msgid "You don't have any phone books yet." +msgstr "Jums patlaban nav izveidota neviena telefona grÄmata." + +#. Got have a column title or things won't show up +#: ../src/sendphonebook.cs:94 +#, fuzzy +msgid "Phone books" +msgstr "Telefona grÄmata" + +#~ msgid "0" +#~ msgstr "0" + +#~ msgid "1" +#~ msgstr "1" + +#~ msgid "10 Minutes" +#~ msgstr "10 MinÅ«tes" + +#~ msgid "1000" +#~ msgstr "1000" + +#~ msgid "115200" +#~ msgstr "115200" + +#~ msgid "15 Minutes" +#~ msgstr "15 MinÅ«tes" + +#~ msgid "1500" +#~ msgstr "1500" + +#~ msgid "19200" +#~ msgstr "19200" + +#~ msgid "2" +#~ msgstr "2" + +#~ msgid "2000" +#~ msgstr "2000" + +#~ msgid "2400" +#~ msgstr "2400" + +#~ msgid "3" +#~ msgstr "3" + +#~ msgid "30 Minutes" +#~ msgstr "30 MinÅ«tes" + +#~ msgid "38400" +#~ msgstr "38400" + +#~ msgid "4" +#~ msgstr "4" + +#~ msgid "4800" +#~ msgstr "4800" + +#~ msgid "5" +#~ msgstr "5" + +#~ msgid "5 Minutes" +#~ msgstr "5 MinÅ«tes" + +#~ msgid "500" +#~ msgstr "500" + +#~ msgid "57600" +#~ msgstr "57600" + +#~ msgid "6" +#~ msgstr "6" + +#~ msgid "7" +#~ msgstr "7" + +#~ msgid "8" +#~ msgstr "8" + +#~ msgid "9" +#~ msgstr "9" + +#~ msgid "9600" +#~ msgstr "9600" + +#~ msgid "" +#~ "A few modems respond to raising the DTR line (when opening the device) " +#~ "with `OK'. This can confuse `sendfax', because it will see this OK as " +#~ "response to the next command. Default is 0." +#~ msgstr "" +#~ "A few modems respond to raising the DTR line (when opening the device) " +#~ "with `OK'. This can confuse `sendfax', because it will see this OK as " +#~ "response to the next command. Default is 0." + +#, fuzzy +#~ msgid "ATT (Dataport, Paradyne)" +#~ msgstr "FCINIT='-j\\Q4'\t\t#AT&T (Dataport, Paradyne)" + +#~ msgid "" +#~ "After the maximum number of tries for one page are reached, `sendfax' can " +#~ "report an error and abort or continue. Default is Yes." +#~ msgstr "" +#~ "After the maximum number of tries for one page are reached, `sendfax' can " +#~ "report an error and abort or continue. Default is Yes." + +#~ msgid "" +#~ "An 'AT...' command that will be sent to the modem at the end of the modem " +#~ "initialization, right before dialing." +#~ msgstr "" +#~ "An 'AT...' command that will be sent to the modem at the end of the modem " +#~ "initialization, right before dialing." + +#~ msgid "Baud Rate Switch" +#~ msgstr "Baud Rate Switch" + +#~ msgid "" +#~ "Controls the amount of information written into the fax log file. " +#~ "Default is 3." +#~ msgstr "" +#~ "Controls the amount of information written into the fax log file. " +#~ "Default is 3." + +#~ msgid "Debug Level" +#~ msgstr "Debug Level" + +#~ msgid "Dial Command" +#~ msgstr "ZvanÄ«Å¡anas komanda" + +#~ msgid "Disabled" +#~ msgstr "DeaktivizÄ“t" + +#~ msgid "Fax Users Allowed" +#~ msgstr "Faxa lietotÄjiem atļauts" + +#~ msgid "Fax Users Denied" +#~ msgstr "Faxa lietotÄjiem nepieejams" + +#~ msgid "Hour" +#~ msgstr "Stunda" + +#~ msgid "" +#~ "How often you want the fax queue scanned. Faxes won't be transmitted " +#~ "until \"faxrunq\" is run to scan the queue. This value is set in /etc/" +#~ "crontab." +#~ msgstr "" +#~ "Cik bieži tu vÄ“lies lai faxu rinda tiktu skenÄ“ta? \n" +#~ "tiklÄ«dz \"faxrunq\" darbojas skenÄ“jas rinda. VÄ“rtÄ«ba ir ielikta \n" +#~ "iekÅ¡ /etc/crontab ." + +#~ msgid "Ignore Carrier" +#~ msgstr "IgnorÄ“t pÄrplÅ«di" + +#~ msgid "Maximum Tries per Page" +#~ msgstr "Maksimums mÄ“Ä£inÄjumu lapai " + +#~ msgid "Mgetty+Sendfax" +#~ msgstr "Mgetty+Sendfax" + +#~ msgid "Mgetty+Sendfax Setup" +#~ msgstr "UzstÄdÄ«t Mgetty+Sendfax" + +#~ msgid "Minute" +#~ msgstr "MinÅ«te" + +#~ msgid "Modem Handshake" +#~ msgstr "Modem Handshake" + +#~ msgid "Modem Initialization String" +#~ msgstr "ModÄ“ma inicializÄ“Å¡ana" + +#~ msgid "Modem Port" +#~ msgstr "Modema ports" + +#~ msgid "Modem Quirks" +#~ msgstr "Modema Ä«patnÄ«bas" + +#~ msgid "Modem Speed (bps)" +#~ msgstr "Modema Ätrums (bps)" + +#~ msgid "Modem Type" +#~ msgstr "Modema tips" + +#, fuzzy +#~ msgid "Motorola (Power Modem, 3400 Pro,..." +#~ msgstr "FCINIT='-j\\Q1'\t\t#Motorola (Power Modem, 3400 Pro,.)" + +#, fuzzy +#~ msgid "Multi-Tech (for bit reversal)" +#~ msgstr "FCINIT='-or'\t\t # Multi-Tech (for bit reversal)" + +#~ msgid "No" +#~ msgstr "NÄ“" + +#~ msgid "None" +#~ msgstr "Neviens" + +#~ msgid "" +#~ "On some (very few) modems it is necessary to start with baudrate \"A\" " +#~ "and switch to baudrate \"B\" after sending the `AT+FCLASS=2' command. " +#~ "Default is None." +#~ msgstr "" +#~ "Dažiem modemiem ir svarÄ«gi sÄkt darbu no Baudrate\n" +#~ "\"A\" un pÄrslÄ“gties uz baudrate pÄ“c 'AT+FCLASS=2' komandas\n" +#~ "NoklusÄ“ta nav." + +#~ msgid "Open Delay (msec)" +#~ msgstr "AtvÄ“rt ar nokavÄ“Å¡anos (milisekundes)" + +#, fuzzy +#~ msgid "QuickComm (Spirit II)" +#~ msgstr "FCINIT='-j*F1'\t\t # QuickComm (Spirit II)" + +#~ msgid "Run Fax Queue Every" +#~ msgstr "Palaist Faxu rindu katru" + +#~ msgid "SendFax Config File" +#~ msgstr "SÅ«tÄ«t faxu konfigurÄcijas failu" + +#~ msgid "Sendfax Config File" +#~ msgstr "SÅ«tÄ«t faxu konfigurÄcijas failu" + +#~ msgid "Setup Druid" +#~ msgstr "UzstÄdÄ«Å¡anas pÄrvaldÄ«tÄjs" + +#~ msgid "" +#~ "The location of the mgetty \"sendfax.config\" file. Default is \"/etc/" +#~ "mgetty+sendfax/sendfax.config\". You shouldn't have to change this." +#~ msgstr "" +#~ "LokÄcijas vieta mgetty \"sendfax.config\" failam. NoklusÄ“tais ir zem \n" +#~ "\"/etc/mgetty+sendfax/sendfax.config\" Parasti Å¡is fails nav jÄmaina, bet tas ir iespÄ“jams, \n" +#~ "ja rodas grÅ«tÄ«bas ar noklusÄ“tajiem uzstÄdÄ«jumiem.\"" + +#~ msgid "" +#~ "The maximum number of tries per page if the receiving end reports " +#~ "reception errors. Default is 3." +#~ msgstr "" +#~ "MaksimÄlais mÄ“Ä£inÄjumu daudzums, ja sanemÅ¡ana lapai \n" +#~ "ir neveiksmÄ«ga. NoklusÄ“tais ir 3." + +#~ msgid "" +#~ "The speed to set your serial port at. Try the highest and go down from " +#~ "there." +#~ msgstr "" +#~ "Ä€trums seriÄlajam portam. PamÄ“Ä£iniet\n" +#~ "vislielÄko un pÄ“c tam pakÄpeniski mazÄku Ätrumu." + +#~ msgid "" +#~ "This can be used to adapt `sendfax' to some peculiarities in certain " +#~ "modems. Not normally required." +#~ msgstr "" +#~ "Å is varÄ“tu tikt izmantots lai `sendfax' varÄ“tu tikt " +#~ "pieskaņots pie modemiem, kas parasti netiek izmantoti." + +#~ msgid "" +#~ "This is the command used for dialing out. Usually this will be something " +#~ "simple, as `ATDT' for tone or `ATDP' for pulse dialing." +#~ msgstr "" +#~ "Å Ä« ir komanda, kas nodroÅ¡ina izsÅ«tÄ«Å¡anu uz Ärpusi\n" +#~ "vienkÄrsi `ATDT' tonim vai `ATDP' prieks impulsa toņa." + +#~ msgid "" +#~ "This will initialize the modem when the port is opened. See your modem " +#~ "manual. Default is ATZ." +#~ msgstr "" +#~ "Å¡is inicializÄ“s modemu, kas ports ir atvÄ“rts. SkatÄ«t sava modema \n" +#~ "aprakstÄ, ja tÄds ir. NoklusÄ“tais ir ATZ." + +#~ msgid "Type of fax modem. See your modem manual. Default is auto." +#~ msgstr "" +#~ "Faxa modema tips. NoklusÄ“tais ir auto." + +#, fuzzy +#~ msgid "USR (Courier, Sportster)" +#~ msgstr "FCINIT='-j&H2'\t\t# USR (Courier, Sportster)" + +#, fuzzy +#~ msgid "User Defined" +#~ msgstr "LietotÄja definÄ“ts" + +#~ msgid "" +#~ "Users allowed to use the fax system. Can be empty only if the deny list " +#~ "is populated. These must be user names." +#~ msgstr "" +#~ "LietotÄji drÄ«kst lietot faxu sistÄ“mu. Var bÅ«t tukÅ¡s ja ieliek listÄ“ pie tiem\n" +#~ "kam Å¡Äda iespÄ“ja ir liegta. Å iem jÄbÅ«t lietotÄjvÄrdiem.\n" +#~ "" + +#~ msgid "" +#~ "Users denied from using the fax system. Can be empty only if the allow " +#~ "list is populated." +#~ msgstr "" +#~ "LietotÄji bloÄ·Ä“ti lai Å¡o sistÄ“mu lietotu. Var bÅ«t tukÅ¡s,\n" +#~ "tikai tad, ja ir ielikts listÄ“\n" +#~ "pie attiecÄ«gajiem lietotÄjiem." + +#~ msgid "Yes" +#~ msgstr "JÄ" + +#~ msgid "a4" +#~ msgstr "a4" + +#~ msgid "auto" +#~ msgstr "auto" + +#~ msgid "c2.0" +#~ msgstr "c2.0" + +#~ msgid "cls2" +#~ msgstr "cls2" + +#~ msgid "legal" +#~ msgstr "legal" + +#~ msgid "letter" +#~ msgstr "letter" + +#~ msgid "'-x /usr/spool/uucp/LCK..$DEV'" +#~ msgstr "'-x /usr/spool/uucp/LCK..$DEV'" + +#~ msgid "'-x /var/lock/LCK..$DEV'" +#~ msgstr "'-x /var/lock/LCK..$DEV'" + +#~ msgid "*" +#~ msgstr "*" + +#~ msgid "-x /var/spool/uucp/LCK..$DEV'" +#~ msgstr "-x /var/spool/uucp/LCK..$DEV'" + +#~ msgid "/etc/efax.rc" +#~ msgstr "/etc/efax.rc" + +#~ msgid "" +#~ "Complete...\n" +#~ "\n" +#~ "Your new phone book is ready for you to add items." +#~ msgstr "" +#~ "Complete...\n" +#~ "\n" +#~ "Your new phone book is ready for you to add items." + +#~ msgid "Efax config file" +#~ msgstr "Efax konfigurÄ“Å¡anas fails" + +#~ msgid "Enter a phone number and hit or press the \"Add\" button" +#~ msgstr "" +#~ "Ierakstiet telefona numuru un nospiedeit enter vai " +#~ "spiediet pogu \"Pievienot\"." + +#~ msgid "FCINIT=''" +#~ msgstr "FCINIT=''" + +#~ msgid "Force xon/xoff" +#~ msgstr "Force xon/xoff" + +#~ msgid "Gfax - Select postcript file" +#~ msgstr "Gfax - izvÄ“lÄ“ties postscript failu" + +#~ msgid "Lock File" +#~ msgstr "saslÄ“gt failu" + +#~ msgid "Preferences" +#~ msgstr "UzstÄdÄ«jumi" + +#~ msgid "Send later" +#~ msgstr "SÅ«tÄ«t vÄ“lÄk" + +#~ msgid "" +#~ "Status Column Definition: D = Complete, R = Running, F = Failed, S = " +#~ "Sleeping, W = Waiting for modem, B = Blocked by job, P = Pending" +#~ msgstr "" +#~ "StÄvoklis definÄ“jumiem: D = Pabeigts, R = ProcesÄ, F =\n" +#~ "Neizdevies, S = GuļoÅ¡s, W = Gaida brÄ«vu modemu, B= BloÄ·Ä“ts, P=ApstÄjies \n" + +#~ msgid "Use cover page" +#~ msgstr "Lietot priekÅ¡lapu" + +#~ msgid "New Phonebook" +#~ msgstr "Jauna telefongrÄmata" + +#~ msgid "label379" +#~ msgstr "label379" + +#~ msgid "label383" +#~ msgstr "label383" diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 0000000..f83749d --- /dev/null +++ b/po/nl.po @@ -0,0 +1,1686 @@ +# English translations for gfax package. +# Copyright (C) 2004 THE gfax'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gfax package. +# George Farris , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: gfax 0.7.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-11-29 19:29-0800\n" +"PO-Revision-Date: 2005-02-24 19:21+0100\n" +"Last-Translator: Bart Verstraete \n" +"Language-Team: Dutch \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../gfax.desktop.in.h:1 +#, fuzzy +msgid "Gfax Facsimile Program" +msgstr "Gfax Facsimile Verzender" + +#: ../gfax.desktop.in.h:2 +#, fuzzy +msgid "Send and Receive Facsimiles" +msgstr "Ontvangen Facsimiles" + +#: ../gfax.schemas.in.h:1 +msgid "0:never, 1:until carrier, 2:always, 3:on receive only" +msgstr "0:nooit, 1: tot carrier, 2:altijd, 3:bij ontvangen alleen" + +#: ../gfax.schemas.in.h:2 +msgid "0:very low, 1:low, 2:medium, 3:high" +msgstr "0:zeer laag, 1:laag, 2:gemiddeld, 3:hoog" + +#: ../gfax.schemas.in.h:3 +#, fuzzy +msgid "Modem Device" +msgstr "Modem apparaat" + +#: ../gfax.schemas.in.h:4 +#, fuzzy +msgid "Modem initialization string" +msgstr "Modem initialisatie string" + +#: ../gfax.schemas.in.h:5 +msgid "Modem reset string" +msgstr "Modem reset string" + +#: ../gfax.schemas.in.h:6 +msgid "Not currently used." +msgstr "Word op dit moment niet gebruikt" + +#: ../gfax.schemas.in.h:7 +msgid "The initialization code that is sent to the modem." +msgstr "De initialisatie code dat is verzonen naar de modem" + +#: ../gfax.schemas.in.h:8 +msgid "" +"The name of the lock file according to your system's conventions. If you're " +"running Linux you shouldn't have to touch this." +msgstr "" +"De naam van het 'lock' bestandje volgen uw systeem overeenkomssssten. Als " +"je linux draait zal je hier niet moeten aankomen." + +#: ../gfax.schemas.in.h:9 +msgid "" +"The reset code that resets the modem to a power up state. The -Kz code works " +"with most modems." +msgstr "" +"De reset code dat de modem naar de opstart staat resets. De -Kz code werkt " +"bij de meeste modems." + +#: ../gfax.schemas.in.h:10 +#, fuzzy +msgid "" +"The serial port the modem is connected too. Typical values are ttyS0, cua0 " +"or modem." +msgstr "" +"De seriële poort dat de modem verbonden mee is. Veel voorkomende waarden " +"zijn: ttyS0, cua0 of modem." + +#: ../glade/gfax.glade.h:1 +msgid "" +"\n" +"Please enter your Hylafax server information here. If you are running " +"Hylafax on the same computer That you are using Gfax on then \"Host Name\" " +"should be set to \"localhost\".\n" +msgstr "" +"\n" +"Geef uw Hylafax server informatie hier in. Als je Hylafax op dezelfde " +"computer draait waar je Gfax op gebruikt dan dient \"Host Name\" verandert " +"te veranderen in \"localhost\".\n" + +#: ../glade/gfax.glade.h:4 +msgid " Program: " +msgstr " Programma: " + +#: ../glade/gfax.glade.h:5 +msgid "4559" +msgstr "4559" + +#: ../glade/gfax.glade.h:6 +msgid "E-Mail Notification" +msgstr "E-Mail Berichtgeving" + +#: ../glade/gfax.glade.h:7 +msgid "Efax Setup" +msgstr "" + +#: ../glade/gfax.glade.h:8 +#, fuzzy +msgid "Facsimile Viewer Program" +msgstr "Facsimile Viewer Programma" + +#: ../glade/gfax.glade.h:9 +msgid "Fax Properties" +msgstr "Fax Eigenschappen" + +#: ../glade/gfax.glade.h:10 +msgid "Fax Transport Agent" +msgstr "Fax Transport Agent" + +#: ../glade/gfax.glade.h:11 +msgid "Hylafax Setup" +msgstr "" + +#: ../glade/gfax.glade.h:12 +msgid "Phone Information" +msgstr "Telefoon informatie" + +#: ../glade/gfax.glade.h:13 +msgid "Transmit Properties" +msgstr "Verzend Eigenschappen" + +#: ../glade/gfax.glade.h:14 +#, fuzzy +msgid "Alter facsimile job parameters" +msgstr "Verander facsimile job parameters" + +#: ../glade/gfax.glade.h:15 +msgid "Server" +msgstr "Server" + +#: ../glade/gfax.glade.h:16 +msgid "" +"ATT (Dataport, Paradyne)\n" +"Motorola (Power Modem, 3400 Pro,...\n" +"QuickComm (Spirit II)\n" +"USR (Courier, Sportster)\n" +"Multi-Tech (for bit reversal)\n" +"User Defined\n" +msgstr "" + +#: ../glade/gfax.glade.h:23 +msgid "Auto Refresh Queue" +msgstr "Auto Ververs Queue" + +#: ../glade/gfax.glade.h:24 +msgid "" +"Complete...\n" +"\n" +"Your new phone book is ready.\n" +"If this is a Gfax type phone book you may\n" +"now add items. \n" +"\n" +"Evolution phone books are read only\n" +"but may be change through Evolution." +msgstr "" +"Compleet...\n" +"\n" +"Uw telefoonboek is klaar.\n" +"Als dit een Gfax telefoonboek mag je nu\n" +"items toevoegen. \n" +"\n" +"Evolution telefoonboeken zijn alleen\n" +"lezend maar kunnen wel aangepast worden\n" +"in Evolution" + +# +#: ../glade/gfax.glade.h:32 +msgid "Completed Jobs" +msgstr "Voltooide Jobs" + +#: ../glade/gfax.glade.h:33 +msgid "Database" +msgstr "Database" + +#: ../glade/gfax.glade.h:34 ../glade/send-druid.glade.h:11 +msgid "Delete" +msgstr "Verwijderen" + +#: ../glade/gfax.glade.h:35 +msgid "Dial Prefix:" +msgstr "Bel Prefix:" + +#: ../glade/gfax.glade.h:36 +msgid "E-Mail Address:" +msgstr "E-Mail Adres:" + +#: ../glade/gfax.glade.h:37 +msgid "E-Mail Notification" +msgstr "E-Mail Berichtgeving" + +#: ../glade/gfax.glade.h:38 +msgid "Efax" +msgstr "Efax" + +#: ../glade/gfax.glade.h:39 +msgid "Evolution" +msgstr "Evolution" + +#: ../glade/gfax.glade.h:40 +msgid "Evolution Address books" +msgstr "Evolution Telefoonboek" + +#: ../glade/gfax.glade.h:41 +msgid "Exit" +msgstr "Exit" + +#: ../glade/gfax.glade.h:42 +msgid "Facsimile Number:" +msgstr "Facsimile Nummer:" + +#: ../glade/gfax.glade.h:43 +msgid "Facsimiles to Send" +msgstr "Facsimiles te verzenden" + +#: ../glade/gfax.glade.h:44 +#, fuzzy +msgid "Fax Number:" +msgstr "Fax Nummer:" + +#: ../glade/gfax.glade.h:45 +msgid "Fax Status:" +msgstr "Fax Status:" + +#: ../glade/gfax.glade.h:46 +msgid "Fax log enabled" +msgstr "Fax log geaktiveerd" + +#: ../glade/gfax.glade.h:47 +#, fuzzy +msgid "" +"First we must choose a transport agent. \n" +"\n" +"A transport agent is a software package that is responsible for\n" +"actually sending the facsimile with your modem. If you don't have \n" +"one of these installed you should hit cancel here and install\n" +"a transport agent first.\n" +"\n" +"Transport agents can be found at the following URL's but you should \n" +"check your distribution CD first..\n" +"\n" +"Hylafax - http://www.hylafax.org\n" +"Efax - http://www.cce.com/efax" +msgstr "" +"Eerst moeten we een transport agent kiezen. \n" +"\n" +"Een transport agent is een software pakket dat verantwoordeljk is\n" +"voor het verzenden van de facsimile met uw modem. Als u geen van deze\n" +"twee hebt geïnstalleerd dient u nu op annuleer te drukken en eerst\n" +"een transport agent te installeren.\n" +"\n" +"Transport agenten kunnen geevonden worden op de volgende URL's, maar\n" +"controleer eerst uw distributie CD's.\n" +"\n" +"Hylafax - http://www.hylafax.org\n" +"Mgetty - http://alpha.greenie.net/mgetty\n" +"Efax - http://www.cce.com/efax" + +#: ../glade/gfax.glade.h:59 +msgid "Gfax" +msgstr "Gfax" + +#: ../glade/gfax.glade.h:60 +msgid "Gfax - E-Mail Address" +msgstr "Gfax - E-Mail Adres" + +#: ../glade/gfax.glade.h:61 +msgid "Gfax - Facsimile Transport Agent" +msgstr "Gfax - Facsimile Transport Agent" + +#: ../glade/gfax.glade.h:62 +msgid "Gfax - Gnome facsimile program" +msgstr "Gfax - Gnome facsimile programma" + +#: ../glade/gfax.glade.h:63 +msgid "Gfax - Modem Selection" +msgstr "Gfax - Modem Selectie" + +#: ../glade/gfax.glade.h:64 +msgid "Gfax - Phone Number Information" +msgstr "Gfax - Telefoonnummer informatie" + +#: ../glade/gfax.glade.h:65 +msgid "Gfax - Setup Complete" +msgstr "Gfax - Setup is voltooid" + +#: ../glade/gfax.glade.h:66 +msgid "Gfax - Add new phone book." +msgstr "Gfax - Nieuwe telefoonboek toevoegen" + +#: ../glade/gfax.glade.h:67 +msgid "Gfax - Modify Job" +msgstr "Gfax - Weizig Job" + +#: ../glade/gfax.glade.h:68 +msgid "Gfax - New user setup" +msgstr "Gfax - Setup nieuwe gebruiker" + +#: ../glade/gfax.glade.h:69 +msgid "Gfax - Preferences" +msgstr "Gfax - Voorkeuren" + +#: ../glade/gfax.glade.h:70 +msgid "Gfax - Transmission Progress" +msgstr "Gfax - Voortgang verzending" + +#: ../glade/gfax.glade.h:71 +#, fuzzy +msgid "" +"Gfax can inform the Efax transport agent which\n" +"serial port your modem is connected to." +msgstr "" +"Gfax kan de Mgetty en Efax transport agenten informeren welke\n" +"Seriële poort uw modem is verbonden." + +#: ../glade/gfax.glade.h:73 +#, fuzzy +msgid "" +"Gfax setup is now complete!\n" +"\n" +"Gfax is configurable; there are other configuration \n" +"options available under the preferences menu.\n" +"\n" +"You can run this first time setup at any time from\n" +"the preferences section.\n" +"\n" +"Default preferences have been choosen for the\n" +"transport agent you chose, you may want to\n" +"customise them." +msgstr "" +"Gfax setup is voltooid!\n" +"\n" +"Gfax is volledig configureerbaar; er zijn andere configureer \n" +"opties beschikbaar in de voorkeuren sectie.\n" + +#: ../glade/gfax.glade.h:84 +msgid "Hi Resolution Mode" +msgstr "Hoge Resolutie mode" + +#: ../glade/gfax.glade.h:85 +msgid "Host Name:" +msgstr "Hostname:" + +#: ../glade/gfax.glade.h:86 +msgid "Hostname:" +msgstr "Hostname:" + +#: ../glade/gfax.glade.h:87 +msgid "Hylafax" +msgstr "Hylafax" + +#: ../glade/gfax.glade.h:88 +msgid "Hylafax - Choose this for network faxing." +msgstr "Hylafax - Kies deze om via het netwerk te kunnen faxen." + +#: ../glade/gfax.glade.h:89 +msgid "" +"Hylafax and Mgetty+Sendfax can both be requested to send \n" +"results of facsimile transmission to an email address.\n" +"\n" +"If you require this feature please enter your email address\n" +"here. It's a good idea to include this even if you don't \n" +"use it immediately, you can enable and disable it in the\n" +"preferences section of Gfax.\n" +" " +msgstr "" +"Hylafax en Mgetty+Sendfax kunnen beide gevaagd worden het\n" +"resultaat van de facsimile verzending te mailen.\n" +"\n" +"Als je deze optie nodig hebt vul hier dan je e-mail adres\n" +"in. Het is een goed idee dit toch in te vullen, zelfs\n" +"al gebruik je dit niet onmiddelijk, je kan dit (de)aktiveren\n" +"in de voorkeuren sectie van Gfax.\n" +" " + +#: ../glade/gfax.glade.h:97 +msgid "IP Port:" +msgstr "IP Port:" + +#: ../glade/gfax.glade.h:98 +msgid "LDAP" +msgstr "LDAP" + +#: ../glade/gfax.glade.h:99 +msgid "Log Enabled" +msgstr "Log geaktiveerd" + +#: ../glade/gfax.glade.h:100 +msgid "" +"Make no more than calls in attempting to send the facsimile. " +"Once has been reached, the job will be killed." +msgstr "" +"Maak niet meer dan belpogingen om de faxsimile te verzenden. Als " +" is bereikt wordt de job afgebroken." + +#: ../glade/gfax.glade.h:101 +msgid "Maximum Dials:" +msgstr "Maximum aantal x bellen:" + +#: ../glade/gfax.glade.h:102 +msgid "Mgetty" +msgstr "Mgetty" + +#: ../glade/gfax.glade.h:103 +msgid "Modem Connection" +msgstr "Modem Verbinding" + +#: ../glade/gfax.glade.h:104 +#, fuzzy +msgid "Modem Port:" +msgstr "Modem poort:" + +#: ../glade/gfax.glade.h:105 +#, fuzzy +msgid "Modem Type:" +msgstr "Modem Type:" + +#: ../glade/gfax.glade.h:106 +msgid "New Fax" +msgstr "Nieuwe Fax" + +#: ../glade/gfax.glade.h:107 ../glade/send-druid.glade.h:23 +msgid "New phone book" +msgstr "Nieuwe Telefoonboek" + +#: ../glade/gfax.glade.h:108 +msgid "Open phone book" +msgstr "Open telefoonboek" + +#: ../glade/gfax.glade.h:109 +#, fuzzy +msgid "Page Size:" +msgstr "Paginaformaat:" + +#: ../glade/gfax.glade.h:110 +msgid "Password Dialog" +msgstr "Paswoord dialoog" + +#: ../glade/gfax.glade.h:111 ../glade/send-druid.glade.h:26 +#: ../src/newphonebook.cs:81 +msgid "Phone Book" +msgstr "Telefoonboek" + +#: ../glade/gfax.glade.h:112 +msgid "Please enter a name for your new phone book." +msgstr "Geef een naam voor u nieuw telefoonboek." + +#: ../glade/gfax.glade.h:113 +msgid "" +"Please enter the password \n" +"for your fax server." +msgstr "" +"Geef het paswoord\n" +"voor uw fax server" + +#: ../glade/gfax.glade.h:115 +msgid "" +"Please enter the type of phone book you are creating. " + +msgstr "" +"Geef het type van telefoonboek dat u aanmaakt." + +#: ../glade/gfax.glade.h:121 +msgid "" +"Please enter your facsimile number.\n" +"\n" +"This number is placed in the top one line header that is placed \n" +"on all outgoing facsimiles.\n" +"\n" +"You may also choose a default dial prefix. Many companies in\n" +"North America use the number \"9\" to reach an outside line.\n" +msgstr "" +"Geef het facsimile nummer.\n" +"\n" +"Dit nummer word geplaatst op de bovenst lijn van al je\n" +"facsimiles\n" +"\n" +"U mag ook een standaart Bel Prefix kiezen. Veel bedrijven\n" +"gebruiken het nummer \"0\" om een externe lijn te krijgen.\n" + +#: ../glade/gfax.glade.h:129 +msgid "" +"Please select the Evolution address books that you would \n" +"like to use.\n" +"\n" +"These are only local address books and will only include\n" +"contacts with facsimile numbers." +msgstr "" +"Selecteer het Evolution Adres boek dat u wilt gebruiken.\n" +"\n" +"Dit zijn alleen locale adres boekenen zullen alleen\n" +"contacten bbevatten met een facsimile nummer." + +#: ../glade/gfax.glade.h:134 +msgid "Port Number:" +msgstr "Poort nummer:" + +#: ../glade/gfax.glade.h:135 +msgid "Received Facsimiles" +msgstr "Ontvangen Facsimiles" + +#: ../glade/gfax.glade.h:136 +msgid "Remember this password" +msgstr "Dit paswoord onthouden" + +#: ../glade/gfax.glade.h:137 +msgid "Send Email Notification" +msgstr "Verzend een e-mail berichtgeving" + +#: ../glade/gfax.glade.h:138 +msgid "Send Immediately" +msgstr "Verzend onmiddelijk" + +#: ../glade/gfax.glade.h:139 +msgid "Speaker Volume:" +msgstr "Speaker Volume:" + +#: ../glade/gfax.glade.h:140 +msgid "System" +msgstr "Systeem" + +#: ../glade/gfax.glade.h:141 +msgid "" +"The TCP/IP port number of the fax server. Default hylafax port is 4559." +msgstr "" +"De TCP/IP poort nummer van de fax server. Standaard Hylafax poort is 4559." + +#: ../glade/gfax.glade.h:142 +msgid "" +"The host name of the network fax server. Enter \"localhost\" if you are not " +"using a network fax server." +msgstr "" +"De hostname van de netwerk fax server. Vul \"localhost\" in, als u geen\n" +"fax server gebruikt." + +#: ../glade/gfax.glade.h:143 +msgid "The serial port the modem is on - ttyS0 is COM1, ttyS1 is COM2 etc." +msgstr "" +"De Seriële poort dat de modem gebruikt - ttyS0 is COM1, ttyS1 is COM2 etc." + +#: ../glade/gfax.glade.h:144 +msgid "" +"There was an error transmitting\n" +"your facsimile to the server!" +msgstr "" +"Er was een error bij het verzenden\n" +"van uw facsimiles naar de server!" + +#: ../glade/gfax.glade.h:146 +msgid "" +"This will lead you through the process \n" +"of creating a new phone book." +msgstr "" +"Dit asisteerd u bij het maken van\n" +"een nieuw telefoonboek." + +#: ../glade/gfax.glade.h:148 +#, fuzzy +msgid "Time to send:" +msgstr "Te verzenden tijd:" + +#: ../glade/gfax.glade.h:149 +msgid "" +"Transmitting facsimile to \n" +"Hylafax server." +msgstr "" +"Verznenden facsimile naar\n" +"Hylafax server." + +#: ../glade/gfax.glade.h:151 +msgid "Transport Agent" +msgstr "Transport Agent" + +#: ../glade/gfax.glade.h:152 +msgid "Use Cover Page" +msgstr "Voorblad gebruiken" + +#: ../glade/gfax.glade.h:153 +msgid "Use Fine Resolution" +msgstr "Gebruik fijne resolutie" + +#: ../glade/gfax.glade.h:154 +msgid "User" +msgstr "Gebruiker" + +#: ../glade/gfax.glade.h:155 +msgid "Username:" +msgstr "Gebruikersnaam:" + +#: ../glade/gfax.glade.h:156 +msgid "" +"Very Low\n" +"Low\n" +"Medium\n" +"High" +msgstr "" + +#: ../glade/gfax.glade.h:160 +msgid "View / Print" +msgstr "Bekijken / Print" + +#: ../glade/gfax.glade.h:161 +msgid "" +"Welcome to Gfax!\n" +"\n" +"\n" +"Gfax is a GNOME facsimile program that provides \n" +"the familiar \"popup\" window when printing to a fax \n" +"printer.\n" +"\n" +"The following pages will help you to setup Gfax." +msgstr "" +"Welkom bij Gfax!\n" +"\n" +"\n" +"Gfax is een GNOME facsimile programma dat de familiare\n" +"\"popup\" venster verschaft wanneer men print naar een\n" +"fax printer.\n" +"\n" +"De volgende paginas zullen u helpen bij de setup van Gfax." + +#: ../glade/gfax.glade.h:169 +msgid "Which serial port is your modem connected to?" +msgstr "Aan welke seriële poort is uw modem verbonden?" + +#: ../glade/gfax.glade.h:170 +msgid "" +"Your facsimile was sucessfully\n" +" transmitted!" +msgstr "" +"Uw facsimile is succesvol\n" +"verzonden!" + +#: ../glade/gfax.glade.h:172 +msgid "_Cancel Job" +msgstr "_Annuleer job" + +#: ../glade/gfax.glade.h:173 +msgid "_Fax" +msgstr "_Fax" + +#: ../glade/gfax.glade.h:174 +msgid "_Help" +msgstr "_Help" + +#: ../glade/gfax.glade.h:175 +msgid "_Modify Job" +msgstr "_Wijzig job" + +#: ../glade/gfax.glade.h:176 +msgid "_Settings" +msgstr "_Instellingen" + +#: ../glade/gfax.glade.h:177 +msgid "cua1" +msgstr "cua1" + +#: ../glade/gfax.glade.h:178 +msgid "cua2" +msgstr "cua2" + +#: ../glade/gfax.glade.h:179 +msgid "" +"letter\n" +"legal\n" +"a4" +msgstr "" + +#: ../glade/gfax.glade.h:182 +msgid "localhost" +msgstr "localhost" + +#: ../glade/gfax.glade.h:183 +msgid "modem" +msgstr "modem" + +#: ../glade/gfax.glade.h:184 +msgid "oklabel" +msgstr "oklabel" + +#: ../glade/gfax.glade.h:185 +msgid "ttyS0" +msgstr "ttyS0" + +#: ../glade/gfax.glade.h:186 +msgid "ttyS1" +msgstr "ttyS1" + +#: ../glade/gfax.glade.h:187 +msgid "ttyS2" +msgstr "ttyS2" + +#: ../glade/gfax.glade.h:188 +msgid "ttyS3" +msgstr "ttyS3" + +#: ../glade/send-druid.glade.h:1 +msgid "Current Phone Books" +msgstr "Huidige telefoonboeken" + +#: ../glade/send-druid.glade.h:2 +msgid "Edit Phone book" +msgstr "Bewerk telefoonboek" + +#: ../glade/send-druid.glade.h:3 +msgid "Facsimile Job Details" +msgstr "Facsimile job details" + +#: ../glade/send-druid.glade.h:4 +msgid "New fax information" +msgstr "Nieuwe fax informatie" + +#: ../glade/send-druid.glade.h:5 +msgid "Add" +msgstr "Toevoegen" + +#: ../glade/send-druid.glade.h:6 +msgid "Browse" +msgstr "Blader" + +#: ../glade/send-druid.glade.h:7 +msgid "Clear" +msgstr "Wis" + +#: ../glade/send-druid.glade.h:8 +msgid "Close" +msgstr "Sluit" + +#: ../glade/send-druid.glade.h:9 ../src/gfaxphonebook.cs:89 +#: ../src/gfaxsend.cs:142 ../src/sendphonebook.cs:105 +msgid "Contact" +msgstr "Contacteer" + +#: ../glade/send-druid.glade.h:10 +msgid "Current Phone Book" +msgstr "Huidige telefoonboek" + +#: ../glade/send-druid.glade.h:12 +#, fuzzy +msgid "Delete phone book" +msgstr "Verwijder telefoonboek" + +#: ../glade/send-druid.glade.h:13 +msgid "Details" +msgstr "Details" + +#: ../glade/send-druid.glade.h:14 +msgid "E-Mail job results to:" +msgstr "E-Mail job resutaat naar:" + +#: ../glade/send-druid.glade.h:15 +msgid "Enter a phone number and hit ." +msgstr "Geef een telefoonnummer en druk op " + +#: ../glade/send-druid.glade.h:16 +msgid "Fax number:" +msgstr "Fax nummer:" + +#: ../glade/send-druid.glade.h:17 +msgid "Fine resolution" +msgstr "Fijne resolutie" + +#: ../glade/send-druid.glade.h:18 +msgid "Gfax - Phone Book Selection" +msgstr "Gfax - Telefoonboek selectie" + +#: ../glade/send-druid.glade.h:19 +msgid "Gfax - Phone books" +msgstr "Gfax - Telefoonboeken" + +#: ../glade/send-druid.glade.h:20 +msgid "Job" +msgstr "Job" + +#: ../glade/send-druid.glade.h:21 +msgid "New Entry" +msgstr "Nieuwe ingang" + +#: ../glade/send-druid.glade.h:22 +msgid "New Item" +msgstr "Nieuw item" + +#: ../glade/send-druid.glade.h:24 ../src/gui.cs:238 ../src/gui.cs:249 +msgid "Number" +msgstr "Nummer" + +#: ../glade/send-druid.glade.h:25 ../src/gfaxphonebook.cs:87 +#: ../src/gfaxsend.cs:141 ../src/sendphonebook.cs:103 +msgid "Organization" +msgstr "Organisatie" + +#: ../glade/send-druid.glade.h:27 +msgid "Phone Book Item List" +msgstr "Telefoonboek item lijst" + +#: ../glade/send-druid.glade.h:28 +msgid "Phone Books" +msgstr "Telefoonboeken" + +#: ../glade/send-druid.glade.h:29 +msgid "Postscript file:" +msgstr "Postscript beestand:" + +#: ../glade/send-druid.glade.h:30 +msgid "Save and Close" +msgstr "Opslaan en sluiten" + +#: ../glade/send-druid.glade.h:31 +#, fuzzy +msgid "Save and close" +msgstr "Opslaan en sluiten" + +#: ../glade/send-druid.glade.h:32 ../src/gfaxsend.cs:139 +msgid "Send" +msgstr "Verzend" + +#: ../glade/send-druid.glade.h:33 +msgid "Send Fax" +msgstr "Fax verzenden" + +#: ../glade/send-druid.glade.h:34 +msgid "Send immediately" +msgstr "Onmiddelijk verzenden" + +#: ../glade/send-druid.glade.h:35 +msgid "Transmit the fax" +msgstr "Verzend de fax" + +#: ../glade/send-druid.glade.h:36 +msgid "Update" +msgstr "Update" + +#: ../glade/send-druid.glade.h:37 +msgid "_File" +msgstr "_Bestand" + +#: ../src/efax.cs:384 +msgid "Scanning control files." +msgstr "Controle bestanden scannen" + +#: ../src/efax.cs:397 +msgid "Running job " +msgstr "" + +#: ../src/efax.cs:421 ../src/efax.cs:508 +msgid "Busy retries exceeded" +msgstr "Bezet proberen overschreden" + +#: ../src/efax.cs:468 +#, fuzzy +msgid "Sending facsimile..." +msgstr "Fax verzenden" + +#. If successful then mv the control file to the done queue and flag +#. a date for it's removal. +#: ../src/efax.cs:492 +msgid "Success" +msgstr "Succes" + +#. fatal errors - no retry +#. fatalError = true; +#. change code in file +#: ../src/efax.cs:516 +msgid "Fatal error" +msgstr "Fatale error" + +#. Modem error - no retry +#. fatalError = true; +#: ../src/efax.cs:522 +msgid "Fatal modem error" +msgstr "Fatale modem error" + +#. Modem not responding +#. fatalError = true; +#: ../src/efax.cs:528 +msgid "Modem not responding" +msgstr "Modem reaggeert niet" + +#. Program terminated +#. fatalError = true; +#: ../src/efax.cs:534 +msgid "Program terminated" +msgstr "Programmais gestopt" + +#: ../src/fax.cs:60 +msgid "No Connection" +msgstr "Geen verbinding" + +#: ../src/fax.cs:71 +#, fuzzy +msgid "" +"Efax transmit process running...\n" +"Scanning job files every 30 seconds." +msgstr "" +"Efax verzen proces wordt uitevoerd...\n" +"Job bestanden worden om de 60 seconden gescant." + +#: ../src/fax.cs:77 +msgid "Error transport agent not specified!" +msgstr "Error, transport agent is niet gespecificeerd!" + +#: ../src/fax.cs:132 +msgid "Run" +msgstr "Loopt" + +#: ../src/fax.cs:135 +msgid "Sleep" +msgstr "Slaap" + +#: ../src/fax.cs:138 +msgid "Block" +msgstr "Geblokkeerd" + +#: ../src/fax.cs:141 +msgid "Busy" +msgstr "Bezig" + +#: ../src/fax.cs:144 ../src/fax.cs:244 +#, fuzzy +msgid "Done" +msgstr "Klaar" + +#: ../src/fax.cs:147 +#, fuzzy +msgid "Fail" +msgstr "Falen" + +#: ../src/fax.cs:150 +#, fuzzy +msgid "New" +msgstr "Nieuw" + +#: ../src/fax.cs:241 +msgid "Receiving" +msgstr "Ontvangen" + +#: ../src/gfaxphonebook.cs:88 ../src/gfaxsend.cs:140 +#: ../src/sendphonebook.cs:104 +#, fuzzy +msgid "Phone Number" +msgstr "Telefoonnummer" + +#: ../src/gfaxphonebook.cs:213 +msgid "Are you sure you want to delete the phone book?" +msgstr "Bent u zeker dat u de telefoonboek wilt verwijderen?" + +#: ../src/gfaxphonebook.cs:297 +msgid "" +"You have unsaved phone book entries.\n" +" Are you sure you want to Quit?" +msgstr "" +"U hebt onopgeslagen telefoonboek items.\n" +" Bent u zeker dat uw wilt sluiten?" + +#: ../src/gfaxphonebook.cs:460 +msgid "Press the key to delete an entry." +msgstr "Druk op de toets om een item te verwijderen." + +#: ../src/gfaxprefs.cs:190 ../src/gfaxprefs.cs:208 +msgid "You need to exit Gfax and restart it when you change transport agents" +msgstr "" +"U dient Gfax te verlaten en te herstarten wanneer u de transport agents " +"verandert" + +#: ../src/gfaxsend.cs:88 +#, fuzzy +msgid "" +"\n" +"This is the first time you have run Gfax.\n" +"Please run Gfax from the menu or command line and set your \n" +"MODEM TYPE, PORT and Fax number under preferences.\n" +"\n" +"Gfax is initially setup to use Efax, you may change it use \n" +"Hylafax if you prefer or require connection to a network \n" +"facsimile server." +msgstr "" +"\n" +"Dit is de eerste keer dat u Gfax uitvoerd.\n" +"Voer Gfax uit vanuit het menu of de commandolijn en zet uw\n" +"MODEM TYPE en POORT onder voorkeuren.\n" +"\n" +"Gfax is oorspronkelijk voor Efax ingesteld, u mag het veranderen\n" +"naar Hylafax als u verkiesd of verplicht bent via een netwerk\n" +"een facsimile server te connecteren." + +#: ../src/gfaxsend.cs:164 +msgid "Spooled from print job" +msgstr "Spooled van een print job" + +#: ../src/gfaxsend.cs:276 +msgid "" +"\n" +"The file you have entered does not exist.\n" +"Please check the name and try again." +msgstr "" + +#: ../src/gfaxsend.cs:310 +msgid "" +"\n" +"You have not entered a facsimile number!\n" +"Please enter a number and press the Enter key or\n" +"click the Phone Book button to select numbers or\n" +"entire phone books." +msgstr "" +"\n" +"U hebt geen facsimile nummer ingegeven!\n" +"Geef een nummer in en druk op de Enter toets of\n" +"klik op de Telefoonboek knop om nummers te\n" +"selecteren of volledige telefoonboeken." + +#: ../src/gui.cs:143 +msgid "" +"\n" +"This is the first time you have run Gfax.\n" +"You should set your MODEM TYPE and PORT under preferences.\n" +"\n" +"Gfax is initially setup to use Efax, you may change it use \n" +"Hylafax if you prefer or require connection to a network \n" +"facsimile server." +msgstr "" +"\n" +"Dit is de eerste keer dat u Gfax uitvoerd.\n" +"U dient uw MODEM TYPE en POORT onder oorkeuren op te geven.\n" +"\n" +"Gfax is oorspronkelijk voor Efax ingesteld, u mag het veranderen\n" +"naar Hylafax als u verkiesd of verplicht bent via een netwerk\n" +"een facsimile server te connecteren." + +#: ../src/gui.cs:157 +msgid "" +"Your spool directory is missing!\n" +"\t\t\t\t\t\n" +"Please login as the root user and create the " +msgstr "" +"U spool directory bestaat niet!\n" +"\t\t\t\t\t\n" +"Login als root en creëer de " + +#: ../src/gui.cs:161 +msgid "" +" directory.\n" +"\n" +"All users should be able to write to it.\n" +msgstr "" +" directorie\n" +"\n" +"Alle gebruikers dienen er naar te kunnen schrijven.\n" + +#: ../src/gui.cs:166 +msgid "" +"The doneq directory is missing in your spool directory!\n" +"\t\t\t\t\t\n" +"Please login as the root user and create the " +msgstr "" +"De doneq directorie bestaat niet in uw spool directorie!\n" +"\t\t\t\t\t\n" +"Login als root en creëer de " + +#: ../src/gui.cs:169 +msgid "" +"/doneq directory.\n" +"\n" +"All users should be able to write to it.\n" +msgstr "" +"/doneq directorie.\n" +"\n" +"Alle gebruikers dienen er naar te kunnen schrijven.\n" + +#: ../src/gui.cs:175 +msgid "" +"The recq directory is missing in your spool directory!\n" +"\t\t\t\t\t\n" +"Please login as the root user and create the " +msgstr "" +"De recq directorie bestaat niet in uw spool directorie!\n" +"\t\t\t\t\t\n" +"Login als root en creëer de " + +#: ../src/gui.cs:178 +msgid "" +"/recq directory.\n" +"\n" +"All users should be able to write to it.\n" +msgstr "" +"/recq directorie.\n" +"\n" +"Alle gebruikers dienen er naar te kunnen schrijven.\n" + +#: ../src/gui.cs:237 ../src/gui.cs:248 +#, fuzzy +msgid "Jobid" +msgstr "Job-ID" + +#: ../src/gui.cs:239 ../src/gui.cs:250 ../src/gui.cs:259 +#, fuzzy +msgid "Status" +msgstr "Status:" + +#: ../src/gui.cs:240 ../src/gui.cs:251 +msgid "Owner" +msgstr "Eigenaar" + +#: ../src/gui.cs:241 ../src/gui.cs:252 +msgid "Pages" +msgstr "Paginas" + +#: ../src/gui.cs:242 ../src/gui.cs:253 +msgid "Dials" +msgstr "" + +#: ../src/gui.cs:243 ../src/gui.cs:254 +#, fuzzy +msgid "Send At" +msgstr "Verzend op" + +#: ../src/gui.cs:244 ../src/gui.cs:255 +msgid "Error" +msgstr "Error" + +#: ../src/gui.cs:258 +#, fuzzy +msgid "Sender" +msgstr "Verzender" + +#: ../src/gui.cs:260 +#, fuzzy +msgid "Pages " +msgstr "Paginas" + +#: ../src/gui.cs:261 +msgid "Arrived" +msgstr "Gearriveerd" + +#: ../src/gui.cs:262 +#, fuzzy +msgid "Filename" +msgstr "Bestandsnaam" + +#: ../src/gui.cs:666 +msgid "" +"Cannot read the facsimile file from the server. You most likely do not \n" +"have permission to read the file. Check the settings on your fax server." +msgstr "" + +#: ../src/gui.cs:673 +msgid "" +"Cannot start your faxviewer program. \n" +"Please check your settings. It is currently set to " +msgstr "" +"Kan u programma om faxen te bekijken niet starten.\n" +"Controlleer uw instellingen. Het is op dit moment\n" +"ingesteld op " + +#: ../src/gui.cs:674 +msgid "." +msgstr "." + +#: ../src/gui.cs:709 +msgid "" +"Cannot delete the facsimile file from the server. You most likely do not \n" +"have permission to delete the file. Check the settings on your fax server." +msgstr "" + +#: ../src/gui.cs:715 +#, fuzzy +msgid "" +"Cannot delete the file on the Hylafax server. \n" +"Please check your settings or contact your system Administrator" +msgstr "" +"Kan het bestand op de Hylafax server niet verwijderen.\n" +"Conrolleer uw instellingen of contacteer uw systeem admin." + +#: ../src/gui.cs:785 +msgid "Copyright (C) 2003 George Farris " +msgstr "" + +#: ../src/gui.cs:786 +msgid "A Facsimile application for GNOME" +msgstr "Een Facsimile applicatie voor GNOME" + +#: ../src/gui.cs:831 +#, fuzzy +msgid "Refreshing server status..." +msgstr "Auto ververs wachtrij" + +#: ../src/gui.cs:868 +#, fuzzy +msgid "Refreshing queue..." +msgstr "Auto ververs wachtrij" + +#: ../src/gui.cs:934 ../src/gui.cs:953 +msgid "There are " +msgstr "Er zijn " + +#: ../src/gui.cs:934 ../src/gui.cs:953 +msgid " jobs in the queue" +msgstr "jobs in de wachtrij" + +#: ../src/gui.cs:941 ../src/gui.cs:960 +msgid "There are 0 jobs in the queue" +msgstr "Er zijn geen jobs in de wachtrij" + +#: ../src/hylafax.cs:146 +msgid "You can not write data to this stream" +msgstr "U kan geen data shrijven naar deze stream" + +#: ../src/hylafax.cs:150 +msgid "You can not read data from this stream" +msgstr "U kan geen data lezen van deze stream" + +#: ../src/hylafax.cs:158 +msgid "" +"Could not connect to your Hylafax server.\n" +"Check console messages for further information\n" +"\n" +"You might need to set a value for username." +msgstr "" +"Kan geen verbinding maken met uw Hylafax server.\n" +"Controleer de terminal berichten voor meer informatie\n" +"\n" +"Het kan zijn dat ueen waarde voor de gebruikersnaam moet geven" + +#: ../src/main.cs:109 +msgid "Gfax help..." +msgstr "Gfax help..." + +#: ../src/main.cs:135 +#, fuzzy +msgid "" +"Gconfd cannot find your settings. \n" +"If you are running Gfax immediately \n" +"after an installation, you may have \n" +"to log out and log back in again." +msgstr "" +"gconfd kan uw instellingen niet vinden\n" +"Als u Gfax onmiddelijk na een installatie\n" +"uitvoerd, kan het zijn dat u eerst moet\n" +"uitloggen en dan weer inloggen.\n" + +#: ../src/newphonebook.cs:80 +#, fuzzy +msgid "Use" +msgstr "Gebruik" + +#: ../src/phonebook.cs:295 +#, csharp-format +msgid "Can't open file : {0}" +msgstr "Kan bestand {0} niet openen" + +#: ../src/sendphonebook.cs:66 +msgid "You don't have any phone books yet." +msgstr "U hebt nog geen telefoonboeken." + +#. Got have a column title or things won't show up +#: ../src/sendphonebook.cs:94 +#, fuzzy +msgid "Phone books" +msgstr "Telefoonboeken" + +#~ msgid "0" +#~ msgstr "0" + +#~ msgid "1" +#~ msgstr "1" + +#~ msgid "10 Minutes" +#~ msgstr "10 Minuten" + +#~ msgid "1000" +#~ msgstr "1000" + +#~ msgid "115200" +#~ msgstr "115200" + +#~ msgid "15 Minutes" +#~ msgstr "15 Minuten" + +#~ msgid "1500" +#~ msgstr "1500" + +#~ msgid "19200" +#~ msgstr "19200" + +#~ msgid "2" +#~ msgstr "2" + +#~ msgid "2000" +#~ msgstr "2000" + +#~ msgid "2400" +#~ msgstr "2400" + +#~ msgid "3" +#~ msgstr "3" + +#~ msgid "30 Minutes" +#~ msgstr "30 Minuten" + +#~ msgid "38400" +#~ msgstr "38400" + +#~ msgid "4" +#~ msgstr "4" + +#~ msgid "4800" +#~ msgstr "4800" + +#~ msgid "5" +#~ msgstr "5" + +#~ msgid "5 Minutes" +#~ msgstr "5 Minuten" + +#~ msgid "500" +#~ msgstr "500" + +#~ msgid "57600" +#~ msgstr "57600" + +#~ msgid "6" +#~ msgstr "6" + +#~ msgid "7" +#~ msgstr "7" + +#~ msgid "8" +#~ msgstr "8" + +#~ msgid "9" +#~ msgstr "9" + +#~ msgid "9600" +#~ msgstr "9600" + +#~ msgid "" +#~ "A few modems respond to raising the DTR line (when opening the device) " +#~ "with `OK'. This can confuse `sendfax', because it will see this OK as " +#~ "response to the next command. Default is 0." +#~ msgstr "" +#~ "Enkele modems reageren op de DTR lijn (wanneer het apparaat wordt " +#~ "geopent) Met `OK'. Dit kan `sendfax' verwarren, omdat het deze OK ziet " +#~ "als een antwoord op het volgende commando. Default is 0." + +#, fuzzy +#~ msgid "ATT (Dataport, Paradyne)" +#~ msgstr "FCINIT='-j\\Q4'\t\t#AT&T (Dataport, Paradyne)" + +#~ msgid "" +#~ "After the maximum number of tries for one page are reached, `sendfax' can " +#~ "report an error and abort or continue. Default is Yes." +#~ msgstr "" +#~ "Nadat het maximaal aantal keer proberen van een pagina is berijkt, " +#~ "`sendfax' kan een error rapporteren en afbreken of voortgaan. Default is " +#~ "Yes." + +#~ msgid "" +#~ "An 'AT...' command that will be sent to the modem at the end of the modem " +#~ "initialization, right before dialing." +#~ msgstr "" +#~ "Een 'AT...' commando dat naar de modem word verzonden aan het einde van " +#~ "de modem initialisatie, juist voor het bellen." + +#~ msgid "Baud Rate Switch" +#~ msgstr "Baud Rate Switch" + +#~ msgid "" +#~ "Controls the amount of information written into the fax log file. " +#~ "Default is 3." +#~ msgstr "" +#~ "Controleerd de hoeveelheid informatie er wordt geschreven in de faxlog. " +#~ "Default is 3." + +#~ msgid "Debug Level" +#~ msgstr "Debug Level" + +#~ msgid "Dial Command" +#~ msgstr "Bel Commando" + +#~ msgid "Disabled" +#~ msgstr "Gedeaktiveerd" + +#~ msgid "Fax Users Allowed" +#~ msgstr "Fax Gebruiker Toegelaten" + +#~ msgid "Fax Users Denied" +#~ msgstr "Fax Gebruiker Niet Toegelaten" + +#~ msgid "High" +#~ msgstr "Hoog" + +#~ msgid "Hour" +#~ msgstr "Uur" + +#~ msgid "" +#~ "How often you want the fax queue scanned. Faxes won't be transmitted " +#~ "until \"faxrunq\" is run to scan the queue. This value is set in /etc/" +#~ "crontab." +#~ msgstr "" +#~ "Hoe vaak wilt u dat de wachtrij gescant wordt? Faxen worden niet " +#~ "verzonden tot dat \"faxrunq\" is uitgevoer om de wachtrij te scannen. " +#~ "Deze waarde is opgeslagen in /etc/crontab." + +#~ msgid "Ignore Carrier" +#~ msgstr "Negeer Carrier" + +#~ msgid "Low" +#~ msgstr "Laag" + +#~ msgid "Maximum Tries Continue" +#~ msgstr "Maximum pogingen om voort te gaan" + +#~ msgid "Maximum Tries per Page" +#~ msgstr "Maximum pogingen per pagina" + +#~ msgid "Medium" +#~ msgstr "gemiddeld" + +#~ msgid "Mgetty+Sendfax" +#~ msgstr "Mgetty+Sendfax" + +#~ msgid "Mgetty+Sendfax Setup" +#~ msgstr "Mgetty+Sendfax Setup" + +#~ msgid "Minute" +#~ msgstr "Minuut" + +#~ msgid "Modem Handshake" +#~ msgstr "Modem Handshake" + +#~ msgid "Modem Initialization String" +#~ msgstr "Modem Initializatie String" + +#~ msgid "Modem Port" +#~ msgstr "Modem poort" + +#~ msgid "Modem Quirks" +#~ msgstr "Modem bijzonderheden" + +#~ msgid "Modem Speed (bps)" +#~ msgstr "Snelheid Modem (bps)" + +#~ msgid "Modem Type" +#~ msgstr "Modem Type" + +#, fuzzy +#~ msgid "Motorola (Power Modem, 3400 Pro,..." +#~ msgstr "FCINIT='-j\\Q1'\t\t#Motorola (Power Modem, 3400 Pro,.)" + +#, fuzzy +#~ msgid "Multi-Tech (for bit reversal)" +#~ msgstr "FCINIT='-or'\t\t # Multi-Tech (for bit reversal)" + +#~ msgid "No" +#~ msgstr "Neen" + +#~ msgid "None" +#~ msgstr "Geen" + +#~ msgid "" +#~ "On some (very few) modems it is necessary to start with baudrate \"A\" " +#~ "and switch to baudrate \"B\" after sending the `AT+FCLASS=2' command. " +#~ "Default is None." +#~ msgstr "" +#~ "Op somige (zeer weing) modems is het nodig om te starten met baudrate \"A" +#~ "\" en over te schakelen naar baudrate \"B\" na het zenden van het `AT" +#~ "+FCLASS=2' commando. Default is Geen" + +#~ msgid "Open Delay (msec)" +#~ msgstr "Open Vertraging (msec)" + +#, fuzzy +#~ msgid "QuickComm (Spirit II)" +#~ msgstr "FCINIT='-j*F1'\t\t # QuickComm (Spirit II)" + +#~ msgid "Run Fax Queue Every" +#~ msgstr "Fax wachrij uitvoeren iedere" + +#~ msgid "SendFax Config File" +#~ msgstr "Sendfax configuratie bestand" + +#~ msgid "Sendfax Config File" +#~ msgstr "Sendfax configuratie bestand" + +#~ msgid "Setup Druid" +#~ msgstr "Setup Druid" + +#~ msgid "" +#~ "Some misbehaving modems lower the DCD (carrier detect) line briefly, " +#~ "between sending multiple pages. This may cause all subsequent port serial " +#~ "accesses to fail. Default is No." +#~ msgstr "" +#~ "Sommige modems die zich misgedragen verlagen de DCD (carrier detect) " +#~ "lijn, tussen het verzenden van meerdere pagina's. Dit kan tot gevolg " +#~ "hebben dat alle seriële poort toegang faalt. Default is No." + +#~ msgid "" +#~ "The location of the mgetty \"sendfax.config\" file. Default is \"/etc/" +#~ "mgetty+sendfax/sendfax.config\". You shouldn't have to change this." +#~ msgstr "" +#~ "De locatie van de mgetty \"sendfax.config\" bestand. Standaard is \"/etc/" +#~ "mgetty+sendfax/sendfax.config\". Normaal moet u dit niet veranderen." + +#~ msgid "" +#~ "The maximum number of tries per page if the receiving end reports " +#~ "reception errors. Default is 3." +#~ msgstr "" +#~ "Het maximaal aantal probeer pogingen per pagina als de ontvangende partij " +#~ "\"reception errors\" rapporteert. Standaard is 3." + +#~ msgid "" +#~ "The speed to set your serial port at. Try the highest and go down from " +#~ "there." +#~ msgstr "" +#~ "De snelheid voor uw seriële poort. Probeer eerst de hoogte en dan lager." + +#~ msgid "The standard papersize you send facsimilies in." +#~ msgstr "Het standaard papierformaat fat u facsimiles in." + +#~ msgid "The type of modem you have." +#~ msgstr "Het type modem u hebt" + +#~ msgid "The volume your modem is set too." +#~ msgstr "De volume van uw modem" + +#~ msgid "" +#~ "This can be used to adapt `sendfax' to some peculiarities in certain " +#~ "modems. Not normally required." +#~ msgstr "" +#~ "Dit kan gebruikt worden om `sendfax' aan te passen aan eigenaardigheden " +#~ "in sommige modems. Normaal is dit geen vereiste." + +#~ msgid "" +#~ "This is the command used for dialing out. Usually this will be something " +#~ "simple, as `ATDT' for tone or `ATDP' for pulse dialing." +#~ msgstr "" +#~ "Dit commando wordt gebruikt omnaar buiten te bellen. ewoonlijk is dit " +#~ "iets simpels zoals `ATDT' voor tonen of `ATDP'voor pulsen." + +#~ msgid "" +#~ "This will initialize the modem when the port is opened. See your modem " +#~ "manual. Default is ATZ." +#~ msgstr "" +#~ "Dit initialiseert de modem wanneer de poort wordt geopend. Controleer de " +#~ "handleiding van de modem. Standaard is ATZ." + +#~ msgid "Type of fax modem. See your modem manual. Default is auto." +#~ msgstr "" +#~ "Type fax modem. Controleer de handleiding van de modem. Standaard is auto." + +#, fuzzy +#~ msgid "USR (Courier, Sportster)" +#~ msgstr "FCINIT='-j&H2'\t\t# USR (Courier, Sportster)" + +#, fuzzy +#~ msgid "User Defined" +#~ msgstr "Gebruiker gedifnieerd" + +#~ msgid "" +#~ "Users allowed to use the fax system. Can be empty only if the deny list " +#~ "is populated. These must be user names." +#~ msgstr "" +#~ "Gebruikers toegelaten tot het fax systeem. Kan alleen leeg zijn als de " +#~ "geblokeerde lijst gebruikers gevuld is. Deze moeten gebruikersnamen zijn." + +#~ msgid "" +#~ "Users denied from using the fax system. Can be empty only if the allow " +#~ "list is populated." +#~ msgstr "" +#~ "Gebruikers die geen toegang hebben tot het fax systeem. Kan alleen leeg " +#~ "zijn als de toegelaten lijst gebruikers gevuld is" + +#~ msgid "Very Low" +#~ msgstr "Zeer laag" + +#~ msgid "Yes" +#~ msgstr "Ja" + +#~ msgid "a4" +#~ msgstr "a4" + +#~ msgid "auto" +#~ msgstr "auto" + +#~ msgid "c2.0" +#~ msgstr "c2.0" + +#~ msgid "cls2" +#~ msgstr "cls2" + +#~ msgid "legal" +#~ msgstr "legal" + +#~ msgid "letter" +#~ msgstr "letter" + +#~ msgid "Starting scan process" +#~ msgstr "Start scan proces" + +#~ msgid "Control file " +#~ msgstr "Controle bestand" + +#~ msgid "Can't create .gfax.proc" +#~ msgstr "Kan .gfax.proc niet maken" + +#~ msgid "'-x /usr/spool/uucp/LCK..$DEV'" +#~ msgstr "'-x /usr/spool/uucp/LCK..$DEV'" + +#~ msgid "'-x /var/lock/LCK..$DEV'" +#~ msgstr "'-x /var/lock/LCK..$DEV'" + +#~ msgid "*" +#~ msgstr "*" + +#~ msgid "-x /var/spool/uucp/LCK..$DEV'" +#~ msgstr "-x /var/spool/uucp/LCK..$DEV'" + +#~ msgid "/etc/efax.rc" +#~ msgstr "/etc/efax.rc" + +#~ msgid "" +#~ "Complete...\n" +#~ "\n" +#~ "Your new phone book is ready for you to add items." +#~ msgstr "" +#~ "Complete...\n" +#~ "\n" +#~ "Your new phone book is ready for you to add items." + +#~ msgid "Efax config file" +#~ msgstr "Efax config file" + +#~ msgid "Enter a phone number and hit or press the \"Add\" button" +#~ msgstr "" +#~ "Geben Sie eine Telefonnummer ein und drücken Sie oder klicken " +#~ "Sie auf den Knopf \"Hinzufügen\"." + +#~ msgid "FCINIT=''" +#~ msgstr "FCINIT=''" + +#~ msgid "Force xon/xoff" +#~ msgstr "Force xon/xoff" + +#~ msgid "Gfax - Select postcript file" +#~ msgstr "Gfax - Postcript-Datei auswählen" + +#~ msgid "Lock File" +#~ msgstr "Sperrdatei" + +#~ msgid "Preferences" +#~ msgstr "Vorlieben" + +#~ msgid "Send later" +#~ msgstr "Später senden" + +#~ msgid "" +#~ "Status Column Definition: D = Complete, R = Running, F = Failed, S = " +#~ "Sleeping, W = Waiting for modem, B = Blocked by job, P = Pending" +#~ msgstr "" +#~ "Erklärung der Statusspalten: D = Abgeschlosse, R = Laufend, F =\n" +#~ "Fehlgeschlagen, S = Schlafend, W = Warte auf Modem, B= Blockiert durch\n" +#~ "Auftrag, P = Wartend" + +#~ msgid "Use cover page" +#~ msgstr "Deckblatt benutzen" + +#~ msgid "New Phonebook" +#~ msgstr "Neues Telefonbuch" + +#~ msgid "label379" +#~ msgstr "label379" + +#~ msgid "label383" +#~ msgstr "label383" diff --git a/src/Defines.cs.in b/src/Defines.cs.in new file mode 100755 index 0000000..fab15cc --- /dev/null +++ b/src/Defines.cs.in @@ -0,0 +1,12 @@ + +using System; + +namespace gfax +{ + public class Defines + { + public static string VERSION = "@version@"; + public static string DATADIR = "@datadir@"; + public static string GNOME_LOCALE_DIR = DATADIR + "/locale"; + } +} diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100755 index 0000000..e71dd90 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,69 @@ +# 0169 - Don't warn about unused functions, they are called from libglade +# 0219 - Constructs like Gtk.TreeIter iter = new Gtk.TreeIter(); +CSC = mcs -nowarn:0169,0219 -debug + +TARGET = gfax.exe +WRAPPER = gfax +SCHEMA = $(top_srcdir)/gfax.schemas.in + +#CSFLAGS = -define:DEBUGEFAX +#CSFLAGS = -define:DEBUGHYLAFAX +#CSFLAGS = + +ASSEMBLIES = -r:Mono.Posix + +RESOURCES = \ + -resource:$(top_srcdir)/glade/gfax.glade,gfax.glade \ + -resource:$(top_srcdir)/glade/send-druid.glade,send-druid.glade \ + -resource:$(top_srcdir)/pixmaps/gfax.png,gfax.png \ + -resource:$(top_srcdir)/pixmaps/send.png,send.png + + +CSFILES = efax.cs \ + fax.cs \ + gui.cs \ + gfaxprefs.cs \ + gfaxsend.cs \ + gfaxphonebook.cs \ + newphonebook.cs \ + guitools.cs \ + hylafax.cs \ + main.cs \ + phonebook.cs \ + evolution.cs \ + sendphonebook.cs + + +GENERATED_CSFILES = Defines.cs Settings.cs + +Defines.cs: Defines.cs.in ../config.log + sed -e "s|\@version\@|$(VERSION)|" \ + -e "s|\@datadir\@|$(datadir)|" \ + -e "s|\@eprefix\@|$(eprefix)|" \ + < Defines.cs.in > Defines.cs + +Settings.cs: Settings.cs + env GCONF_CONFIG_SOURCE="" gconftool-2 --makefile-install-rule $(SCHEMA); \ + gconfsharp2-schemagen gfax $(SCHEMA) > $(srcdir)/Settings.cs + +gfax.exe: $(CSFILES) $(GENERATED_CSFILES) + $(CSC) $(CSFLAGS) $(GFAX_LIBS) $(ASSEMBLIES) $(RESOURCES) $(CSFILES) $(GENERATED_CSFILES) -o $@ + +all: gfax.exe + +install-data-local: $(TARGET) + $(mkinstalldirs) $(DESTDIR)$(pkglibdir) + $(INSTALL_PROGRAM) $(TARGET) $(DESTDIR)$(pkglibdir)/$(TARGET) + +uninstall-local: + rm -f $(DESTDIR)$(pkglibdir)/$(TARGET) + +EXTRA_DIST = \ + $(srcdir)/Defines.cs.in \ + $(CSFILES) + + +CLEANFILES = \ + gfax.exe \ + Defines.cs \ + Settings.cs diff --git a/src/efax.cs b/src/efax.cs new file mode 100755 index 0000000..d9df4dc --- /dev/null +++ b/src/efax.cs @@ -0,0 +1,605 @@ +// GFAX - Gnome fax application +// Copyright (C) 2003 - 2008 George A. Farris +// +// 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 3 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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + // Sequence to send a file is: + // 1) Make sure we're connected + // 2) Store the filename on the server [storefile_open] + // 3) Send the file line by line + // 4) Close the stream for sending the file + // 5) For all the phone numbers do: + // a) job_new [job_new] + // b) set all job parms [job_parm_set] + // c) submit the job [submit_job] + // 6) Close the connection. + +// Properties +// string Hostname, Username, Password +// int IPPort + +//#define DEBUGEFAX + +namespace gfax { + using Gtk; + using Mono.Unix; + using System; + using System.IO; + using System.Text; //Encoding.ASCII.GetBytes + using System.Collections; + using System.Net; + using System.Threading; + using System.Net.Sockets; + using System.Diagnostics; + + + public class Efax + { + private static System.Threading.Thread thread; + string user; + + + //Speaker Volume + string[] speakerVolume = {"L0","L1","L2","L3"}; + const int VERY_LOW = 0; + const int LOW = 1; + const int MEDIUM = 2; + const int HIGH = 3; + + // Speaker modes + string[] speakerMode = {"M0","M1","M2","M3"}; + const int NEVER = 0; + const int UNTIL_CARRIER = 1; + const int ALWAYS_ON = 2; + const int ON_RECEIVE_ONLY = 3; + + string[] modemType = {@"-j\Q4",@"-j\Q1",@"-j*F1",@"-j&H2&I0&R1&D3I4",@"-or"}; + + + /* + # FCINIT='-j\Q4' # AT&T (Dataport, Paradyne) + # FCINIT='-j\Q1' # Motorola (Power Modem, 3400 Pro,...) + # FCINIT='-j*F1' # QuickComm (Spirit II) + # FCINIT='-j&H2&I0&R1&D3I4' # USR (Courier, Sportster) + # FCINIT='-or' # Multi-Tech (for bit reversal) + */ + + // Don't need this anymore + //TextWriter statusfile = null; + + public Efax () + { + + // Set initial modem settings, gconfsharp-schemagen doesn't like "&" + // so can't set a default in gfax.schemas + if ( Settings.EfaxModemInit == "" ) + Settings.EfaxModemInit = "-iZ -i&FE0&D2S7=120 -i&C0"; + if ( Settings.EfaxModemFcinit == "" ) + Settings.EfaxModemFcinit = "-j&H2&I0&R1&D3I4"; + if ( Settings.EfaxModemReset == "" ) + Settings.EfaxModemReset = "-kZ"; + + //Don't need this anymore + //statusfile = TextWriter.Synchronized(File.CreateText(gfax.Procfile)); + } + + public void close () + { + } + + // Method status(queue) + // + // queue is the queue fax system it can be one of: + // 'sendq', 'doneq' or 'recvq' + // + // Return a string containing lines formatted like so + // "jobid=number=status=owner=pages=dials=error=sendat\n" + // such as: + // "2=5551212=S=george=2=1=error message=2004/03/09 18.01.51\n" + public string status (string queue) + { + StreamReader infile = null; + string[] sts = new string[11]; + string path; + string buf; + + + if (queue == "sendq") + path = gfax.SpoolDirectory; + else if (queue == "doneq") + path = gfax.SpoolDirectory + "/doneq"; + else + path = gfax.SpoolDirectory + "/recq"; + + string[] control_files = Directory.GetFiles(path, "C_*"); + string[] lines = new string[control_files.Length]; + int num_lines = 0; + + foreach (string s in control_files) { + try { + infile = File.OpenText(s); + + for (int i=0; (buf = infile.ReadLine()) != null; i++) { + string[] sa = buf.Split('='); + if ( sa[1].Length != 0 ) + sts[i] = sa[1]; + else + sts[i] = "-"; + } + infile.Close(); + // Purge doneq files if older than 5 days. + if ( queue == "doneq" ) + if ( (DateTime.Now).Subtract(File.GetCreationTime(s)).Days > 5 ) + File.Delete(s); + + lines[num_lines++] = String.Format("{0}={1}={2}={3}={4}={5}={6}={7}\n", + sts[0],sts[2],sts[3],sts[4],sts[5],sts[6],sts[10],sts[7]); + } + catch (Exception e) { + //return; + } + } + + return String.Concat(lines); + } + + // send_init (string filename) + // + // Here we should convert the file with ghostscript and return a directory + // that points to the converted files to send, one per page. There should + // be some status messages passed to the user to let them know whats going on. + // Maybe a dialog box. + // + // We also setup the status message system. + public string send_init (string fname) + { + StreamReader fp = null; + double lines = 0; + string resolution = "204x98"; // normal res + + // Get new directory name and make it + Random rand = new Random(); + string rand_file = rand.Next().ToString(); + string dir_name = String.Format("{0}/D_{1}",gfax.SpoolDirectory, rand_file); + // TODO proper checks here, this is nasty + Directory.CreateDirectory(dir_name); + + + // get the fax options + if (gfax.sendWizardResolution) { + resolution = "204x196"; + }else { + if (Settings.HiResolution) + resolution = "204x196"; + } + + string papersize = Settings.EfaxPapersize; + + + //figure out how many lines in the file for progress bar + // TODO progress bar and error + try { fp = File.OpenText(fname); } + catch (Exception e) { } + + while ( (fp.ReadLine()) != null ) { + lines = lines + 1; + } + fp.Close(); + + + try { fp = File.OpenText(fname); } + catch (Exception e) { } + + if (Settings.Faxtracing == true) { + Console.WriteLine("[Efax.send_init] File :{0} is open and has {1} lines", fname,lines); + } + + fp.Close(); + + + // TODO need random temp file name + if (Settings.Faxtracing == true) { + Console.WriteLine("[Efax.send_init] Converting file with gs"); + Console.WriteLine(" Filename -> {0}",fname); + Console.WriteLine(" Resolution -> {0}",resolution); + Console.WriteLine(" Directory -> {0}",dir_name); + Console.WriteLine(" Papersize -> {0}\n",papersize); + } + + ProcessStartInfo pidInfo = new ProcessStartInfo(); + pidInfo.FileName = "gs"; + + pidInfo.Arguments = String.Concat( + "-q -sDEVICE=tiffg3 -r", + resolution, + " -dNOPAUSE -dSAFER -dBATCH", + " -sOutputFile=", + dir_name, + "/tmp.%03d -sPAPERSIZE=", + papersize, " ",fname); + + if (Settings.Faxtracing == true) { + Console.WriteLine("[Efax.send_init]\n {0}", pidInfo.Arguments); + } + + Process pid = Process.Start(pidInfo); + pid.WaitForExit(); + + return dir_name; + } + + // Method send(string directory, contact) + // + // Sequence to send a file is: + public void send (string directory, GfaxContact contact) + { + StreamWriter outfile; + int pages; + + + string emailAddress = Settings.EmailAddress; + string emailNotify = "none"; + + // Get advanced options + if (gfax.fromSendWizard) { + if (gfax.sendWizardEmailNotify) { + emailNotify = "done"; + emailAddress = gfax.sendWizardEmailAddress; + } + } else { + if (Settings.EmailNotify) + emailNotify = "done"; + } + + //2004/03/09 18.01.51 + // Format time to send + DateTime st = DateTime.Now; + string tts = String.Format("{0}/{1:00}/{2:00} {3:00}.{4:00}.00", + st.Year, st.Month, st.Day, st.Hour, st.Minute); + + // get next jobid + if ( Settings.EfaxNextJobid > 998 ) + Settings.EfaxNextJobid = 1; + else + Settings.EfaxNextJobid++; + + // open directory and count files, that will be the number of pages. + pages = Directory.GetFiles(directory).Length; + + // build filename + Random rand = new Random(); + string rand_file = rand.Next().ToString(); + string tfname = String.Format("{0}/C_{1}.{2}",gfax.SpoolDirectory, contact.PhoneNumber, rand_file); + + // TODO error stuff + //Open new status file + try { outfile = File.CreateText(tfname); } + catch (Exception e) { return; } + outfile.Write("Jobid="); + outfile.WriteLine(Settings.EfaxNextJobid); + outfile.Write("JobDirectory="); + outfile.WriteLine(directory); + outfile.Write("PhoneNumber="); + outfile.WriteLine(contact.PhoneNumber); + outfile.Write("Status="); + outfile.WriteLine("P"); + outfile.Write("Owner="); + outfile.WriteLine(Environment.GetEnvironmentVariable("USERNAME")); + outfile.Write("Pages="); + outfile.WriteLine(pages.ToString()); + outfile.Write("Dials="); + outfile.WriteLine(0); + outfile.Write("Sendat="); + outfile.WriteLine(tts); + outfile.Write("Notification="); + outfile.WriteLine(emailNotify); + outfile.Write("Email="); + outfile.WriteLine(emailAddress); + outfile.Write("ErrorMessage="); + outfile.WriteLine(""); + outfile.Close(); + + // jobid might need to be Convert.ToInt32 + + } + + public void job_delete (string jobid) + { + StreamReader infile = null; + string[] sts = new string[11]; + string buf; + + string[] controlFiles = Directory.GetFiles(gfax.SpoolDirectory, "C_*"); + + foreach (string controlFile in controlFiles) { + try { + infile = File.OpenText(controlFile); + + for (int i=0; (buf = infile.ReadLine()) != null; i++) { + string[] sa = buf.Split('='); + if ( sa[1].Length != 0 ) + sts[i] = sa[1]; + else + sts[i] = "-"; + } + infile.Close(); + + if ( sts[0] == jobid ) { + File.Delete(controlFile); + Directory.Delete(sts[1], true); + break; + } + } + catch (Exception e) {continue; } + } + + // end up here with control file name + return; + } + + public string job_kill (string jobid) + { + return null; + } + + public void run_efaxd () + { + // Create the thread object, passing in the efaxd method + WaitCallback callback = new WaitCallback(efaxd); + ThreadPool.QueueUserWorkItem(callback); + } + + /* efaxd + * For now just cycle through the control files and send the fax + * + */ + private void efaxd (object state) + { + thread = System.Threading.Thread.CurrentThread; + + StreamReader infile = null; + string[] sts = new string[11]; + string buf; + //bool fatalError = false; + int retries; + string speakerModeVolume; + + //string jobid, number, status, owner, pages, dials, error, sendat; + System.Threading.Thread.Sleep(15000); // Don't start immediately + + while (true) { + Application.Invoke (delegate {gfax.GAppbar.ClearStack();}); + Application.Invoke (delegate {gfax.GAppbar.Push(Catalog.GetString("Scanning control files."));}); + + // while there are job files in the folder + while (Directory.GetFiles(gfax.SpoolDirectory, "C_*").Length > 0) { + + string[] controlFiles = Directory.GetFiles(gfax.SpoolDirectory, "C_*"); + // for each job try send it + foreach (string controlFile in controlFiles) { + if (Settings.Faxtracing == true) { + Console.WriteLine("Control files are ----> {0}", controlFile); + } + + //Application.Invoke (delegate {gfax.GAppbar.ClearStack();}); + Application.Invoke (delegate {gfax.GStatusTextBuffer.InsertAtCursor( + Catalog.GetString("Running job " + controlFile));}); + + try { + infile = File.OpenText(controlFile); + + for (int i=0; (buf = infile.ReadLine()) != null; i++) { + string[] sa = buf.Split('='); + if ( sa[1].Length != 0 ) + sts[i] = sa[1]; + else + sts[i] = "-"; + } + infile.Close(); + if (Settings.Faxtracing == true) { + Console.WriteLine("[Efaxd] Buffer is {0}", buf); + } + } + catch (Exception e) {continue; } + + //lines[num_lines++] = String.Format("{0}={1}={2}={3}={4}={5}={6}={7}\n", + // sts[0],sts[2],sts[3],sts[4],sts[5],sts[6],sts[10],sts[7]); + + // If we aborted for some reason check the retries + if (Convert.ToInt32(sts[6]) >= Settings.EfaxRetries) { + sts[10] = Catalog.GetString("Busy retries exceeded"); + update_status_code(sts, controlFile, "F"); + continue; + } + + sts[10] = ""; // clear error message + update_status_code(sts, controlFile, "R"); + + // default "-iM1L0" + speakerModeVolume = String.Concat("-i", + speakerMode[Settings.EfaxModemSpeakerMode], + speakerVolume[Settings.EfaxModemSpeakerVolume]); + + string [] tifFiles = Directory.GetFiles(sts[1], "tmp.*"); + StringBuilder filesToSend = new StringBuilder(); + foreach (string f in tifFiles) { + filesToSend.Append(f); + filesToSend.Append(" "); + } + + + ProcessStartInfo pidInfo = new ProcessStartInfo(); + pidInfo.FileName = "efax"; + pidInfo.RedirectStandardError = true; + pidInfo.UseShellExecute = false; + //used for testing + //Thread.Sleep(5000); + //pidInfo.FileName = "echo"; + //pidInfo.FileName = "sleep 5"; + + pidInfo.Arguments = String.Concat( + "-d /dev/", Settings.EfaxModemDevice, //modem port + " -x ", Settings.EfaxLockfile, Settings.EfaxModemDevice, // lockfile + " \"", Settings.EfaxModemInit, "\"", // init sequence + " \"", speakerModeVolume, "\"", // speaker enable / mode + " -l \"", Settings.FaxNumber, "\"", // Our fax number + " \"", Settings.EfaxModemReset, "\"", // how to reset modem + " -f /usr/bin/efaxfont", + " -h \'%d/%d\'", // should be name number and date + " -v i", // session progress information + " -t T", sts[2], // should make sure there are no bad chars + " ", filesToSend); // files to send + + if (Settings.Faxtracing == true) { + Console.WriteLine("[Efax.send]\n {0}", pidInfo.Arguments); + } + Application.Invoke (delegate {gfax.GAppbar.ClearStack();}); + Application.Invoke (delegate {gfax.GAppbar.Push(Catalog.GetString("Sending facsimile..."));}); + Process pid = Process.Start(pidInfo); + StreamReader myStreamReader = pid.StandardError; + + //start the pulser + Application.Invoke (delegate {gfax.Pulser.StartPulse();}); + Application.Invoke (delegate {gfax.Status.Append("");}); + + while (!pid.HasExited) { + string str = myStreamReader.ReadLine(); + Application.Invoke (delegate {gfax.Status.Append(str);}); + System.Threading.Thread.Sleep(200); + } + //stop the pulser. + Application.Invoke (delegate {gfax.Pulser.EndPulse();}); + + if (Settings.Faxtracing == true) { + Console.WriteLine("[Efax.efaxd] Exit code - {0}", pid.ExitCode); + } + + switch (pid.ExitCode) { + case 0: + // If successful then mv the control file to the done queue and flag + // a date for it's removal. + sts[10] = Catalog.GetString("Success"); + update_status_code(sts, controlFile, "D"); + // remove directory path + string basefilename = controlFile.Remove(0, gfax.SpoolDirectory.Length + 1); + string newfilename = String.Concat(gfax.SpoolDirectory,"/doneq/", basefilename); + File.Move(controlFile, newfilename); + break; + case 1: + // busy number, continue after timeout + // update listview as well + retries = Convert.ToInt32(sts[6]); + if (retries++ < Settings.EfaxRetries) { + sts[6] = retries.ToString(); + update_status_code(sts, controlFile, "W"); + } + else { + sts[10] = Catalog.GetString("Busy retries exceeded"); + update_status_code(sts, controlFile, "F"); + } + break; + case 2: + // fatal errors - no retry + //fatalError = true; + // change code in file + sts[10] = Catalog.GetString("Fatal error"); + update_status_code(sts, controlFile, "F"); + break; + case 3: + // Modem error - no retry + //fatalError = true; + sts[10] = Catalog.GetString("Fatal modem error"); + update_status_code(sts, controlFile, "F"); + break; + case 4: + // Modem not responding + //fatalError = true; + sts[10] = Catalog.GetString("Modem not responding"); + update_status_code(sts, controlFile, "B"); + break; + case 5: + // Program terminated + //fatalError = true; + sts[10] = Catalog.GetString("Program terminated"); + update_status_code(sts, controlFile, "F"); + break; + }// end of switch + + //sleep between each fax for the modem to stablize + System.Threading.Thread.Sleep(3000); + } // end of foreach + // This basically sleeps between busy numbers. + System.Threading.Thread.Sleep(30000); + } + System.Threading.Thread.Sleep(30000); // sleep 30 seconds + // Moved this from case 0 above + if (Settings.Faxtracing == true) { + Console.WriteLine("Deleting --->{0}", sts[1]); + } + //Directory.Delete(sts[1], true); + }// end of while + } + + + // Updates the status code in the control file and writes it back to disk + public void update_status_code (string[] job, string file, string status) + { + string fname = file; + + if ( status == "F" ) { + string filename = file.Remove(0, gfax.SpoolDirectory.Length + 1); + fname = String.Concat(gfax.SpoolDirectory,"/doneq/", filename); + File.Delete(file); + Directory.Delete(job[1], true); + } + + + // Thread safe + TextWriter outfile = TextWriter.Synchronized(File.CreateText(fname)); + + // TODO change this to string.concat and just issue one write + try { + //outfile = File.CreateText(file); + + outfile.Write("Jobid="); + outfile.WriteLine(job[0]); + outfile.Write("JobDirectory="); + outfile.WriteLine(job[1]); + outfile.Write("PhoneNumber="); + outfile.WriteLine(job[2]); + outfile.Write("Status="); + outfile.WriteLine(status); + outfile.Write("Owner="); + outfile.WriteLine(job[4]); + outfile.Write("Pages="); + outfile.WriteLine(job[5]); + outfile.Write("Dials="); + outfile.WriteLine(job[6]); + outfile.Write("Sendat="); + outfile.WriteLine(job[7]); + outfile.Write("Notification="); + outfile.WriteLine(job[8]); + outfile.Write("Email="); + outfile.WriteLine(job[9]); + outfile.Write("ErrorMessage="); + outfile.WriteLine(job[10]); + + outfile.Close(); + } + catch (Exception e) {} + } + + } +} diff --git a/src/evolution.cs b/src/evolution.cs new file mode 100755 index 0000000..5622a69 --- /dev/null +++ b/src/evolution.cs @@ -0,0 +1,134 @@ +// GFAX - Gnome fax application +// Copyright (C) 2003 - 2008 George A. Farris +// +// 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 3 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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +namespace gfax { + using System; + using System.IO; + using GLib; + using Gtk; + using GtkSharp; + using System.Collections; + using System.Reflection; + using Evolution; + + //************************************************************************ + // + // + // + public class EdsPhoneBooks + { + + private void OnContactsAdded (object o, Evolution.ContactsAddedArgs args) + { + Console.WriteLine ("Contacts added:"); + foreach (Evolution.Contact contact in args.Contacts) { + Console.WriteLine ("\nId: {0}", contact.Id); + Console.WriteLine ("Fullname: {0}", contact.FullName); + } + } + + private void OnContactsChanged (object o, Evolution.ContactsChangedArgs args) + { + } + + private void OnContactsRemoved (object o, Evolution.ContactsRemovedArgs args) + { + + } + + public ArrayList GetPhoneBooks () + { + ArrayList ebooks = new ArrayList(); + + SourceList slist = new SourceList ("/apps/evolution/addressbook/sources"); + if (slist != null) { + SList group_list = slist.Groups; + //Console.WriteLine ("Group count: {0}", group_list.Count); + + foreach (SourceGroup group in group_list) { + //Only get phone books on this machine. + if (group.Name == "On This Computer") { + SList src_list = group.Sources; + + foreach (Evolution.Source src in src_list) { + ebooks.Add(src.Name); + } + } + } + } + return ebooks; + } + + + public ArrayList GetContacts (string bookName) + { + string contact_fax = null; + ArrayList ebooks = new ArrayList(); + ArrayList records = new ArrayList(); + + SourceList slist = new SourceList ("/apps/evolution/addressbook/sources"); + if (slist != null) { + SList group_list = slist.Groups; + foreach (SourceGroup group in group_list) { + //Only get phone books on this machine. + if (group.Name == "On This Computer") { + SList src_list = group.Sources; + + foreach (Evolution.Source src in src_list) { + if (src.Name == bookName) { + //Book bk = Book.NewSystemAddressbook (); + Book bk = new Book(src); + bk.Open (true); + + BookQuery q = BookQuery.AnyFieldContains (""); + Contact[] contactlist = bk.GetContacts (q); + //Console.WriteLine ("Contact count (range) : {0}", contactlist.Length); + + if (contactlist != null) { + + foreach (Contact comp in contactlist) { + contact_fax = null; + + if (comp.BusinessFax != null && comp.BusinessFax != String.Empty) { + contact_fax = comp.BusinessFax; + } + else if (comp.OtherFax != null && comp.OtherFax != String.Empty) { + contact_fax = comp.OtherFax; + } + else if (comp.HomeFax != null && comp.HomeFax != String.Empty) { + contact_fax = comp.HomeFax; + } + + if (contact_fax != null) { + GfaxContact gc = new GfaxContact(); + //Console.WriteLine ("Id: {0}", comp.Id); + gc.PhoneNumber = contact_fax; + gc.ContactPerson = comp.FullName; + gc.Organization = comp.Org; + records.Add(gc); + } + } + } + } + } + } + } + } + return records; + } + } +} diff --git a/src/fax.cs b/src/fax.cs new file mode 100755 index 0000000..91d0f0f --- /dev/null +++ b/src/fax.cs @@ -0,0 +1,501 @@ +// GFAX - Gnome fax application +// Copyright (C) 2003 - 2008 George A. Farris +// +// 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 3 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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +//#define DEBUGHYLAFAX + + +namespace gfax { + using Mono.Unix; + using System; + using System.Collections; + + public enum FaxStatus: int { + Sent, + Fail, + New, + Busy, + Block, + Sleep, + Run, + Receiving, + Received + }; + + public class Fax + { + static Hylafax hfax; + static Efax efax; + static bool firstRun = true; + + public class FaxQueue + { + public string Jobid; + public string Number; + public string Status; + public FaxStatus StatusType; + public string Owner; + public string Pages; + public string Dials; + public string Error; + public object Sendat; + } + + public class FaxRecQueue + { + public string Pages; + public string Status; + public FaxStatus StatusType; + public string Sender; + public object TimeReceived; + public string Filename; + } + + public static string async_get_server_status () + { + + if (Settings.TransmitAgent == "hylafax") { + hfax = new Hylafax(); + + if ( !hfax.connect() ) + return (Catalog.GetString("No Connection")); + hfax.asyncstatus("status"); + hfax.close(); + hfax = null; + return (""); + } + + if (Settings.TransmitAgent == "efax") { + //TODO put modem ready status here + if (firstRun) { + firstRun = false; + return (Catalog.GetString("Efax transmit process running...\nScanning job files every 30 seconds.")); + } + else + return (null); + } + + return (Catalog.GetString("Error transport agent not specified!")); + } + + public static ArrayList async_get_queue_status (string queue) + { + if (Settings.TransmitAgent == "hylafax") { + hfax = new Hylafax(); + + if ( hfax.connect() ) + hfax.asyncstatus(queue); + hfax.close(); + hfax = null; + } + + if (Settings.TransmitAgent == "efax") { + string reply = gfax.efax.status(queue); + + if (queue == "doneq" || queue == "sendq") + return (parse_senddone(reply)); + else // (queue == "recvq") + return (parse_receive(reply)); + } + return (null); + } + + // parse the send or done queue + public static ArrayList parse_senddone (string reply) + { + ArrayList list = new ArrayList(); + + if (reply.Length > 0) { + foreach (string s in reply.Split('\n')) { + FaxQueue hq = new FaxQueue(); + //Console.WriteLine("s length equals --> {0}", s.Length); + if (s.Length == 0 ) + break; + + string[] sa = s.Split('='); + + // TODO put error here about bad network comms + if (sa.Length != 8) { + break; + } + + if ( sa[0].Length != 0 ) + hq.Jobid = sa[0].Trim(); + else + hq.Jobid = ""; + if ( sa[1].Length != 0 ) + hq.Number = sa[1].Trim(); + else + hq.Number = ""; + if ( sa[2].Length != 0 ) { + switch (sa[2]) { + case "R": + hq.Status = Catalog.GetString("Run"); + hq.StatusType = FaxStatus.Run; + break; + case "S": + hq.Status = Catalog.GetString("Sleep"); + hq.StatusType = FaxStatus.Sleep; + break; + case "B": + hq.Status = Catalog.GetString("Block"); + hq.StatusType = FaxStatus.Block; + break; + case "W": + hq.Status = Catalog.GetString("Busy"); + hq.StatusType = FaxStatus.Busy; + break; + case "D": + hq.Status = Catalog.GetString("Done"); + hq.StatusType = FaxStatus.Sent; + break; + case "F": + hq.Status = Catalog.GetString("Fail"); + hq.StatusType = FaxStatus.Fail; + break; + case "P": + hq.Status = Catalog.GetString("New"); + hq.StatusType = FaxStatus.New; + break; + } + } + else + hq.Status = ""; + if ( sa[3].Length != 0 ) + hq.Owner = sa[3].Trim(); + else + hq.Owner = ""; + if ( sa[4].Length != 0 ) + hq.Pages = sa[4].Trim(); + else + hq.Pages = ""; + if ( sa[5].Length != 0 ) + hq.Dials = sa[5].Trim(); + else + hq.Dials = ""; + if ( sa[6].Length != 0 ) + hq.Error = sa[6]; + else + hq.Error = ""; + + if ( sa[7].Length != 0 ) { // 2004/03/09 18.01.51 + try { + hq.Sendat = (DateTime)System.DateTime.ParseExact(sa[7].Replace(".", ":").Trim(), "yyyy/MM/dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture); + } + catch(FormatException e) + { + hq.Sendat = null; + } + } else { + hq.Sendat = null; + } + + list.Add(hq); + } + + } else { // no status + + FaxQueue hq = new FaxQueue(); + hq.Jobid = ""; + hq.Number = ""; + hq.Status = ""; + hq.Owner = ""; + hq.Pages = ""; + hq.Dials = ""; + hq.Error = ""; + hq.Sendat = null; + + list.Add(hq); + } + + return (list); + } + + // parse the receive queue + // + //Page S Sender/TSI Recvd@ Filename + //1 +49 30 7865224 10Nov04 fax00004.tif + // should come back as + //1= =+49 30 7865224=10Nov04=fax00004.tif + public static ArrayList parse_receive (string reply) + { + ArrayList list = new ArrayList(); + + + if (reply.Length > 0) { + foreach (string s in reply.Split('\n')) { + FaxRecQueue hq = new FaxRecQueue(); + if (s.Length == 0 ) + break; + + string[] sa = s.Split('='); + if (sa.Length != 5) { + break; + } + + if ( sa[0].Length != 0 ) + hq.Pages = sa[0].Trim(); + else + hq.Pages = ""; + if ( sa[1].Length != 0 ) + switch (sa[1]) { + case "N*": + hq.Status = Catalog.GetString("Receiving"); + hq.StatusType = FaxStatus.Receiving; + break; + case "N ": + hq.Status = Catalog.GetString("Done"); + hq.StatusType = FaxStatus.Received; + break; + } + if ( sa[2].Length != 0 ) + hq.Sender = sa[2].Trim(); + else + hq.Sender = ""; + if ( sa[3].Length != 0 ) + { + try { + hq.TimeReceived = (DateTime)System.DateTime.ParseExact(sa[3], "ddMMMyy", System.Globalization.CultureInfo.InvariantCulture); + } + catch(FormatException e ) + { + hq.TimeReceived = null; + } + } + else + hq.TimeReceived = null; + if ( sa[4].Length != 0 ) + hq.Filename = sa[4].Trim(); + else + hq.Filename = ""; + + list.Add(hq); + } + + } else { // no status + + FaxRecQueue hq = new FaxRecQueue(); + hq.Pages = ""; + hq.Status = ""; + hq.Sender = ""; + hq.TimeReceived = null; + hq.Filename = ""; + + list.Add(hq); + } + + return (list); + } + + + + public static void sendfax (string fname) + { + string remote_fname; + + if (Settings.Faxtracing == true) { + Console.WriteLine("[Fax.sendfax] File name is : {0}", fname); + } + + if (Settings.TransmitAgent == "hylafax") { + Hylafax hfaxsf = new Hylafax(); + // hylafax actually stores the file to the server + hfaxsf.connect(); + remote_fname = hfaxsf.send_init(fname); + + // if "Cancel" button pressed on progess bar + if (remote_fname == "cancelled") + return; + + if (Settings.Faxtracing == true) { + if (Settings.TransmitAgent == "hylafax") { + Console.WriteLine("[Fax.sendfax] Remote file name is : {0}", remote_fname); + } + } + + //System.Threading.Thread.Sleep(2000); + + IEnumerator enu = gfax.Destinations.GetEnumerator(); + + if (Settings.Faxtracing == true) { + if (Settings.TransmitAgent == "hylafax") { + Console.WriteLine("[Fax.sendfax] Destinations has a count of : {0}", gfax.Destinations.Count); + } + } + + while ( enu.MoveNext() ) { + // TODO try catch exception here + GfaxContact c = (GfaxContact)enu.Current; + + if (Settings.Faxtracing == true) { + if (Settings.TransmitAgent == "hylafax") { + Console.WriteLine("[Fax.sendfax] In while loop contact is -----> {0}", c.PhoneNumber); + } + } + + hfaxsf.send(remote_fname, c); + + if (Settings.Faxtracing == true) { + if (Settings.TransmitAgent == "hylafax") { + Console.WriteLine("[Fax.sendfax] In while loop bottom... "); + } + } + + //System.Threading.Thread.Sleep(1000); + // open the log and log out going fax to server + // Date Time PhoneNumber Organization ContactPerson + // log file is in ~/.etc/gfax + //if (Settings.LogEnabled) + //log_it((GfaxContact)enu.Current); + } + + if (Settings.Faxtracing == true) { + if (Settings.TransmitAgent == "hylafax") { + Console.WriteLine("[Fax.sendfax] End of send contact loop..."); + } + } + + hfaxsf = null; + } + + + //Efax transport + if (Settings.TransmitAgent == "efax") { + + // Convert the file with ghostscript + string directory = gfax.efax.send_init(fname); + if (directory == "cancelled") + return; + + IEnumerator enu = gfax.Destinations.GetEnumerator(); + while ( enu.MoveNext() ) { + gfax.efax.send(directory, (GfaxContact)enu.Current); + if (Settings.LogEnabled) + log_it((GfaxContact)enu.Current); + } + } + } + + public static bool recvfax (string fname) + { + + // Hylafax support + if (Settings.TransmitAgent == "hylafax") { + hfax = new Hylafax(); + // hylafax actually stores the file to the server + hfax.connect(); + return(hfax.getfile(fname)); + } + + // Efax transport + if (Settings.TransmitAgent == "efax") { + return false; + } + + return false; + } + + + public static void log_it (GfaxContact contact) + { + + } + + + public static void modify_job (string jobid, string number, string sendat, string dials) + { + if (Settings.TransmitAgent == "hylafax") { + hfax = new Hylafax(); + hfax.connect(); + hfax.job_select(jobid); + hfax.job_suspend(); + hfax.job_param_set("SENDTIME", sendat); + hfax.job_param_set("EXTERNAL", number); + hfax.job_param_set("DIALSTRING", number); + hfax.job_param_set("MAXDIALS", dials); + hfax.job_submit(); + hfax = null; + } + + /* + if (Settings.TransmitAgent == "efax") { + gfax.efax.job_kill(jobid); + gfax.efax.job_delete(jobid); + } + */ + + } + + public static void resubmit_job (string jobid, string number, string sendat, string dials) + { + // will have to query the job, get the file name + // possibly retrieve the file and then re-submit the job + + if (Settings.TransmitAgent == "hylafax") { + hfax = new Hylafax(); + hfax.connect(); + hfax.job_select(jobid); + + /* + hfax.job_reset("P"); + hfax.job_suspend(); + hfax.job_param_set("SENDTIME", sendat); + hfax.job_param_set("EXTERNAL", number); + hfax.job_param_set("DIALSTRING", number); + hfax.job_param_set("MAXDIALS", dials); + hfax.job_submit(); + hfax = null; + */ + } + + } + + + public static void delete_job (string jobid) + { + if (Settings.TransmitAgent == "hylafax") { + hfax = new Hylafax(); + hfax.connect(); + hfax.job_select(jobid); + hfax.job_kill(); + hfax.job_delete(); + hfax = null; + } + + if (Settings.TransmitAgent == "efax") { + gfax.efax.job_kill(jobid); + gfax.efax.job_delete(jobid); + } + + } + + public static int delete_file (string fname) + { + if (Settings.TransmitAgent == "hylafax") { + hfax = new Hylafax(); + hfax.connect(); + int reply = hfax.deletefile(fname); + hfax = null; + return (reply); + } + + if (Settings.TransmitAgent == "efax") { + return(0); + } + return(0); + } + } +} diff --git a/src/gfaxphonebook.cs b/src/gfaxphonebook.cs new file mode 100755 index 0000000..be922c0 --- /dev/null +++ b/src/gfaxphonebook.cs @@ -0,0 +1,498 @@ +// 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +namespace gfax { + using Mono.Unix; + using System; + using System.IO; + using GLib; + using Gtk; + using Gnome; + using Glade; + using GConf.PropertyEditors; + using GtkSharp; + using System.Runtime.InteropServices; + using System.Collections; + using System.Diagnostics; + using System.Reflection; + + //************************************************************************ + // GfaxPhonebook class + // + + public class GfaxPhonebook + { + const string APPNAME = "Gfax"; + + const int COLUMN_0 = 0; + const int COLUMN_1 = 1; + const int COLUMN_2 = 2; + const int COLUMN_3 = 3; + const int ALL_COLUMNS = -1; + + string tempName; + string tempNumber; + string tempCompany; + + bool eventsEnabled = true; + + [Glade.Widget] Gtk.Window PhbookWindow; + [Glade.Widget] Gtk.ComboBox PhonebookComboBox; + [Glade.Widget] Gtk.TreeView ItemTreeview; + [Glade.Widget] Gtk.Entry PhonebookComboEntry; + [Glade.Widget] Gtk.Entry EditPhbNumberEntry; + [Glade.Widget] Gtk.Entry EditPhbNameEntry; + [Glade.Widget] Gtk.Entry EditPhbCompanyEntry; + [Glade.Widget] Gtk.ToolButton SaveCloseButton; + [Glade.Widget] Gtk.ToolButton DeletePhonebookButton; + [Glade.Widget] Gtk.Button AddButton; + [Glade.Widget] Gtk.Button UpdateButton; + [Glade.Widget] Gtk.Button ClearButton; + [Glade.Widget] Gtk.Statusbar Statusbar; + + Gtk.ListStore ItemStore; //phonebook item store + G_ListView ItemView; + + GConf.PropertyEditors.EditorShell shell; + Phonebook[] myPhoneBooks; + Glade.XML gxml; + const int id = 1; + bool pbIsReadOnly = false; //wether current phone book is no editable. + + public GfaxPhonebook () + { + myPhoneBooks = Phonetools.get_phonebooks(); + + Application.Init (); + gxml = new Glade.XML (null, "send-druid.glade","PhbookWindow",null); + gxml.Autoconnect (this); + + ItemStore = new ListStore(typeof (string), typeof (string), typeof (string)); + ItemView = new G_ListView(ItemTreeview, ItemStore); + ItemView.AddColumnTitle(Catalog.GetString("Organization"), 0, COLUMN_0); + ItemView.AddColumnTitle(Catalog.GetString("Phone Number"), 1, COLUMN_1); + ItemView.AddColumnTitle(Catalog.GetString("Contact"), 2, COLUMN_2); + ItemTreeview.HeadersVisible = true; + //ItemTreeview.Selection.Mode = SelectionMode.Multiple; + ItemTreeview.Selection.Changed += + new EventHandler(on_ItemTreeview_selection); + + // Populate the drop down combo box with phonebooks and populate + // the list with the first phonebook. + // TODO sort these alphabetically + if ( myPhoneBooks.Length > 0) { + string[] list = new string[myPhoneBooks.Length]; + + if ( myPhoneBooks != null ) { + // populate the list + int i = 0; + PhonebookComboBox.RemoveText(0); + foreach (Phonebook p in myPhoneBooks) { + list[i++] = p.Name; + PhonebookComboBox.AppendText(p.Name); + } + PhonebookComboBox.Active = 0; + } + + //Console.WriteLine(list[PhonebookComboBox.Active]); + DeletePhonebookButton.Sensitive = true; + } else { + DeletePhonebookButton.Sensitive = false; + } + + SaveCloseButton.Sensitive = false; + UpdateButton.Sensitive = false; + ClearButton.Sensitive = false; + AddButton.Sensitive = false; + + Application.Run (); + } + + + private void on_PhbookWindow_delete_event (object o, DeleteEventArgs args) + { + PhbookWindow.Destroy(); + Application.Quit (); + } + + // Menu signals + private void on_New_activate (object o, EventArgs args) + { + on_NewPhonebookButton_clicked(null, null); + } + + private void on_SaveAndClose_activate (object o, EventArgs args) + { + on_SaveCloseButton_clicked(null, null); + } + + private void on_Delete_activate (object o, EventArgs args) + { + on_DeletePhonebookButton_clicked(null, null); + } + + private void on_Close_activate (object o, EventArgs args) + { + on_CloseButton_clicked(null, null); + } + //--------- end of menu ----------------- + + + private void on_NewPhonebookButton_clicked (object o, EventArgs args) + { + // Unselect any phone book otherwise we get gtk errors. + ItemTreeview.Selection.UnselectAll(); + + // run the wizard + NewPhoneBook nphb = new NewPhoneBook (); + nphb.Run(); + + if ( nphb.PhoneBookNames.Count > 0 ) { // don't do this if cancelled + IEnumerator enu = nphb.PhoneBookNames.GetEnumerator(); + + while ( enu.MoveNext() ) { + Phonebook ph = new Phonebook(); + if (nphb.PhoneBookType == "gfax") + ph.Path = gfax.ConfigDirectory + "/" + (string)enu.Current; + else + ph.Path = ""; + + ph.Name = (string)enu.Current; // get the new book name + ph.Type = nphb.PhoneBookType; + Phonetools.add_book(ph); + PhonebookComboBox.AppendText(ph.Name); + } + // Reload the phone books + myPhoneBooks = Phonetools.get_phonebooks(); + + if ( myPhoneBooks.Length > 0) { + //PhonebookComboBox.AppendText(ph.Name); + PhonebookComboBox.Active = 0; + DeletePhonebookButton.Sensitive = true; + } + } + + nphb = null; + } + + private void on_DeletePhonebookButton_clicked (object o, EventArgs args) + { + + if ( myPhoneBooks.Length > 0) { + string[] list = new string[myPhoneBooks.Length]; + + if ( myPhoneBooks != null ) { + // populate the list + int i = 0; + foreach (Phonebook pb in myPhoneBooks) { + list[i++] = pb.Name; + } + } + string book = list[PhonebookComboBox.Active]; + + MessageDialog md = new MessageDialog ( + null, + DialogFlags.DestroyWithParent, + MessageType.Question, + ButtonsType.YesNo, + Catalog.GetString("Are you sure you want to delete the phone book?") + ); + + ResponseType result = (ResponseType)md.Run (); + + if (result == ResponseType.Yes) { + md.Destroy(); + + if (book == null) + return; + Phonetools.delete_book(book); + + PhonebookComboBox.RemoveText(PhonebookComboBox.Active); + ItemStore.Clear(); + + myPhoneBooks = Phonetools.get_phonebooks(); + + if (myPhoneBooks.Length > 0) { + // now reload + PhonebookComboBox.Active = 0; + on_PhonebookComboBox_changed(null, null); + } else { + DeletePhonebookButton.Sensitive = false; + PhonebookComboBox.InsertText(0," "); + } + PhonebookComboBox.Active = 0; + + } else { + md.Destroy(); + } + } + } + + private void on_SaveCloseButton_clicked (object o, EventArgs args) + { + ArrayList rows; + ArrayList contacts = new ArrayList(); + string book; + + if ( myPhoneBooks.Length > 0) { + string[] list = new string[myPhoneBooks.Length]; + + if ( myPhoneBooks != null ) { + // populate the list + int i = 0; + foreach (Phonebook pb in myPhoneBooks) + list[i++] = pb.Name; + } + book = list[PhonebookComboBox.Active]; + + // just get all items and save + SaveCloseButton.Sensitive = false; + //eventsEnabled = false; + EditPhbCompanyEntry.Text = ""; + EditPhbNumberEntry.Text = ""; + EditPhbNameEntry.Text = ""; + + rows = ItemView.GetAllRows(); + + IEnumerator enu = rows.GetEnumerator(); + while ( enu.MoveNext() ) { + GfaxContact c = new GfaxContact(); + c.Organization = ((string[])enu.Current)[0]; + c.PhoneNumber = ((string[])enu.Current)[1]; + c.ContactPerson = ((string[])enu.Current)[2]; + contacts.Add(c); + } + + Phonetools.save_phonebook_items(book, contacts); + //EditPhbList.Selection.UnselectAll(); + } + + PhbookWindow.Destroy(); + Application.Quit (); + } + + private void on_CloseButton_clicked (object o, EventArgs args) + { + if (SaveCloseButton.Sensitive) { + MessageDialog md = new MessageDialog ( + null, + DialogFlags.DestroyWithParent, + MessageType.Question, + ButtonsType.YesNo, + Catalog.GetString("You have unsaved phone book entries.\n Are you sure you want to Quit?") + ); + + ResponseType result = (ResponseType)md.Run (); + + if (result == ResponseType.Yes) { + md.Destroy(); + PhbookWindow.Destroy(); + Application.Quit (); + } else { + md.Destroy(); + } + } else { + PhbookWindow.Destroy(); + Application.Quit (); + } + } + + + private void on_PhonebookComboBox_changed (object o, EventArgs args) + { + ArrayList contacts = null; + Phonebook p; + + // get the first book in the list and load the liststore + if ( myPhoneBooks.Length > 0) { + string[] list = new string[myPhoneBooks.Length]; + + if ( myPhoneBooks != null ) { + // populate the list + int i = 0; + foreach (Phonebook pb in myPhoneBooks) { + list[i++] = pb.Name; + } + } + + p = Phonetools.get_book_from_name(list[PhonebookComboBox.Active]); + if (p == null) + return; + + // Clear the list_store + ItemStore.Clear(); + + contacts = Phonetools.get_contacts(p); + + if (contacts != null) { + IEnumerator enu = contacts.GetEnumerator(); + while ( enu.MoveNext() ) { + GfaxContact c = new GfaxContact(); + c = (GfaxContact)enu.Current; + ItemView.AddTextToRow(c.Organization, c.PhoneNumber, c.ContactPerson); + } + if (p.Type == "evolution") { + pbIsReadOnly = true; + EditPhbCompanyEntry.Sensitive = false; + EditPhbNumberEntry.Sensitive = false; + EditPhbNameEntry.Sensitive = false; + + } else { + pbIsReadOnly = false; + EditPhbCompanyEntry.Sensitive = true; + EditPhbNumberEntry.Sensitive = true; + EditPhbNameEntry.Sensitive = true; + eventsEnabled = true; + } + } + } + } + + private void on_EditPhbNumberEntry_changed (object o, EventArgs args) + { + if (eventsEnabled) { + ArrayList al = ItemView.GetSelections(ALL_COLUMNS); + // if single contact selected + if (al.Count > 0) { + UpdateButton.Sensitive = true; + } else { + AddButton.Sensitive = true; + ClearButton.Sensitive = true; + } + } + } + private void on_EditPhbNameEntry_changed (object o, EventArgs args) + { + if (eventsEnabled) { + ArrayList al = ItemView.GetSelections(ALL_COLUMNS); + // if single contact selected + if (al.Count > 0) { + UpdateButton.Sensitive = true; + } else { + AddButton.Sensitive = true; + ClearButton.Sensitive = true; + } + } + } + private void on_EditPhbCompanyEntry_changed (object o, EventArgs args) + { + if (eventsEnabled) { + ArrayList al = ItemView.GetSelections(ALL_COLUMNS); + // if single contact selected + if (al.Count > 0) { + UpdateButton.Sensitive = true; + } else { + AddButton.Sensitive = true; + ClearButton.Sensitive = true; + } + } + } + + private void on_ClearButton_clicked (object o, EventArgs args) + { + eventsEnabled = false; + EditPhbCompanyEntry.Text = ""; + EditPhbNumberEntry.Text = ""; + EditPhbNameEntry.Text = ""; + UpdateButton.Sensitive = false; + ItemTreeview.Selection.UnselectAll(); + ClearButton.Sensitive = false; + AddButton.Sensitive = false; + Statusbar.Pop(id); + Statusbar.Push(id, " "); + } + + private void on_AddButton_clicked (object o, EventArgs args) + { + ItemView.AddTextToRow(EditPhbCompanyEntry.Text, + EditPhbNumberEntry.Text, + EditPhbNameEntry.Text); + + eventsEnabled = false; // no updates till selected + EditPhbCompanyEntry.Text = ""; + EditPhbNumberEntry.Text = ""; + EditPhbNameEntry.Text = ""; + EditPhbNumberEntry.HasFocus = true; + SaveCloseButton.Sensitive = true; + ClearButton.Sensitive = false; + AddButton.Sensitive = false; + eventsEnabled = true; + } + + private void on_UpdateButton_clicked (object o, EventArgs args) + { + ItemView.UpdateColumnText(tempNumber, EditPhbNumberEntry.Text, COLUMN_1); + ItemView.UpdateColumnText(tempName, EditPhbNameEntry.Text, COLUMN_2); + ItemView.UpdateColumnText(tempCompany, EditPhbCompanyEntry.Text, COLUMN_0); + EditPhbCompanyEntry.Text = ""; + EditPhbNumberEntry.Text = ""; + EditPhbNameEntry.Text = ""; + UpdateButton.Sensitive = false; + ItemTreeview.Selection.UnselectAll(); + ClearButton.Sensitive = false; + SaveCloseButton.Sensitive = true; + Statusbar.Pop(id); + Statusbar.Push(id, " "); + } + + private void on_ItemTreeview_selection (object o, EventArgs args) + { + ArrayList al; + + eventsEnabled = false; // no updates + if (!pbIsReadOnly) { + al = ItemView.GetSelections(ALL_COLUMNS); + Statusbar.Push(id,Catalog.GetString("Press the key to delete an entry.")); + + // if single contact selected + if (al.Count == 3) { + IEnumerator enu = al.GetEnumerator(); + enu.MoveNext(); + EditPhbCompanyEntry.Text = (string)enu.Current; + tempCompany = (string)enu.Current; + enu.MoveNext(); + EditPhbNumberEntry.Text = (string)enu.Current; + tempNumber = (string)enu.Current; + enu.MoveNext(); + EditPhbNameEntry.Text = (string)enu.Current; + tempName = (string)enu.Current; + } + AddButton.Sensitive = false; + ClearButton.Sensitive = true; + eventsEnabled = true; + } + } + + private void on_ItemTreeview_key_press_event (object o, KeyPressEventArgs args) + { + if (args.Event.Key == Gdk.Key.Delete ) { + + //eventsEnabled = false; // no updates + ArrayList al = ItemView.GetSelections(ALL_COLUMNS); + + // if single contact selected + //if (al.Count == 3) { + ItemView.RemoveSelectedRow(); + EditPhbCompanyEntry.Text = ""; + EditPhbNumberEntry.Text = ""; + EditPhbNameEntry.Text = ""; + //} + AddButton.Sensitive = false; + ClearButton.Sensitive = false; + SaveCloseButton.Sensitive = true; + //eventsEnabled = true; + } + } + } +} diff --git a/src/gfaxprefs.cs b/src/gfaxprefs.cs new file mode 100755 index 0000000..0ff9e6d --- /dev/null +++ b/src/gfaxprefs.cs @@ -0,0 +1,302 @@ +// GFAX - Gnome fax application +// Copyright (C) 2003 - 2008 George A. Farris +// +// 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 3 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +namespace gfax { + using Mono.Unix; + using System; + using System.IO; + using GLib; + using Gtk; + using Gnome; + using Glade; + using GConf.PropertyEditors; + using GtkSharp; + using System.Runtime.InteropServices; + using System.Collections; + using System.Diagnostics; + using System.Reflection; + + //************************************************************************ + // GfaxPrefs class + // + // This is the preferences window. + public class GfaxPrefs + { + Glade.XML gxml; + [Glade.Widget] Gtk.Dialog PrefsDialog; + [Glade.Widget] Gtk.Notebook PrefsNotebook; + //System Tab + [Glade.Widget] Gtk.RadioButton HylafaxRadioButton; + [Glade.Widget] Gtk.RadioButton EfaxRadioButton; + [Glade.Widget] Gtk.Entry FaxNumberEntry; + [Glade.Widget] Gtk.Entry DialPrefixEntry; + [Glade.Widget] Gtk.Entry ModemEntry; + [Glade.Widget] Gtk.Entry FaxViewerEntry; + + //Hylafax Tab + [Glade.Widget] Gtk.Entry HylafaxHostnameEntry; + [Glade.Widget] Gtk.Entry HylafaxPortEntry; + [Glade.Widget] Gtk.Entry HylafaxUsernameEntry; + + //Efax Tab + [Glade.Widget] Gtk.Entry EfaxModemDeviceEntry; + [Glade.Widget] Gtk.ComboBox EfaxPapersizeComboBox; + [Glade.Widget] Gtk.ComboBox EfaxModemTypeComboBox; + [Glade.Widget] Gtk.ComboBox EfaxModemSpeakerVolumeComboBox; + + //User Tab + [Glade.Widget] Gtk.CheckButton EmailNotifyCheckButton; + [Glade.Widget] Gtk.Entry EmailAddressEntry; + [Glade.Widget] Gtk.CheckButton SendNowCheckButton; + [Glade.Widget] Gtk.CheckButton FaxLogCheckButton; + [Glade.Widget] Gtk.CheckButton CoverPageCheckButton; + [Glade.Widget] Gtk.CheckButton HiResCheckButton; + + // we set this otherwise setting inital values will wipe + // out all the other settings. + bool eventsEnabled = false; + + bool taChanged = false; + + const int HYLAFAX_PAGE = 1; + const int EFAX_PAGE = 2; + + string[] papersize = {"letter", "legal", "a4"}; + + string[] modemType = {@"-j\Q4",@"-j\Q1",@"-j*F1",@"-j&H2&I0&R1&D3I4",@"-or"}; + /* + # FCINIT='-j\Q4' # AT&T (Dataport, Paradyne) + # FCINIT='-j\Q1' # Motorola (Power Modem, 3400 Pro,...) + # FCINIT='-j*F1' # QuickComm (Spirit II) + # FCINIT='-j&H2&I0&R1&D3I4' # USR (Courier, Sportster) + # FCINIT='-or' # Multi-Tech (for bit reversal) + */ + + + public GfaxPrefs () + { + gxml = new Glade.XML (null, "gfax.glade","PrefsDialog",null); + //GConf.PropertEditors + EditorShell shell = new EditorShell (gxml); + gxml.Autoconnect(this); + + + // System Tab + if (Settings.TransmitAgent == "hylafax") { + HylafaxRadioButton.Active = true; + CoverPageCheckButton.Visible = false; + PrefsNotebook.GetNthPage(EFAX_PAGE).Hide(); + } + else if (Settings.TransmitAgent == "efax") { + EfaxRadioButton.Active = true; + EmailNotifyCheckButton.Sensitive = false; + EmailAddressEntry.Sensitive = false; + Settings.SendNow = SendNowCheckButton.Active; + FaxLogCheckButton.Visible = false; + CoverPageCheckButton.Visible = false; + Settings.HiResolution = HiResCheckButton.Active; + + PrefsNotebook.GetNthPage(HYLAFAX_PAGE).Hide(); + } + + // Set these regardless so they are set if we need them + switch (Settings.EfaxPapersize) { + case "letter": + EfaxPapersizeComboBox.Active = 0; + break; + case "legal": + EfaxPapersizeComboBox.Active = 1; + break; + case "a4": + EfaxPapersizeComboBox.Active = 2; + break; + default: + EfaxPapersizeComboBox.Active = 0; + break; + } + //"-j\\Q4","-j\\Q1","-j*F1","-j&H2&I0&R1&D3I4","-or" + switch (Settings.EfaxModemFcinit) { + case @"-j\Q4": + EfaxModemTypeComboBox.Active = 0; + break; + case @"-j\Q1": + EfaxModemTypeComboBox.Active = 1; + break; + case @"-j*F1": + EfaxModemTypeComboBox.Active = 2; + break; + case @"-j&H2&I0&R1&D3I4": + EfaxModemTypeComboBox.Active = 3; + break; + case @"-or": + EfaxModemTypeComboBox.Active = 4; + break; + default: + EfaxModemTypeComboBox.Active = 5; + break; + } + + EfaxModemSpeakerVolumeComboBox.Active = Settings.EfaxModemSpeakerVolume; + + + + // changes that happen automagically + shell.Add(SettingKeys.FaxNumber, "FaxNumberEntry"); + shell.Add(SettingKeys.PhonePrefix, "DialPrefixEntry"); + shell.Add(SettingKeys.FaxViewer, "FaxViewerEntry"); + + // Hylafax Tab + shell.Add(SettingKeys.Hostname, "HylafaxHostnameEntry"); + shell.Add(SettingKeys.Port, "HylafaxPortEntry"); + shell.Add(SettingKeys.Username, "HylafaxUsernameEntry"); + + // Efax Tab + shell.Add(SettingKeys.EfaxModemDevice, "EfaxModemDeviceEntry"); + + + // User tab + shell.Add(SettingKeys.EmailNotify, "EmailNotifyCheckButton"); + shell.Add(SettingKeys.EmailAddress, "EmailAddressEntry"); + shell.Add(SettingKeys.SendNow, "SendNowCheckButton"); + shell.Add(SettingKeys.LogEnabled, "FaxLogCheckButton"); + shell.Add(SettingKeys.CoverPage, "CoverPageCheckButton"); + shell.Add(SettingKeys.HiResolution, "HiResCheckButton"); + + eventsEnabled = true; + + } + + + private void on_PrefsDialog_delete_event (object o, DeleteEventArgs args) + { + MessageDialog md; + if (taChanged) { + md = new MessageDialog ( + null, + DialogFlags.DestroyWithParent, + MessageType.Warning, + ButtonsType.Ok, + Catalog.GetString("You need to exit Gfax and restart it when you change transport agents") + ); + md.Run (); + md.Destroy(); + } + PrefsDialog.Destroy(); + args.RetVal = true; + } + + private void on_CloseButton_clicked (object o, EventArgs args) + { + MessageDialog md; + if (taChanged) { + md = new MessageDialog ( + null, + DialogFlags.DestroyWithParent, + MessageType.Warning, + ButtonsType.Ok, + Catalog.GetString("You need to exit Gfax and restart it when you change transport agents") + ); + md.Run (); + md.Destroy(); + } + PrefsDialog.Destroy(); + } + + private void on_HelpButton_clicked (object o, EventArgs args) + { + + } + + private void system_tab_changed (object o, EventArgs args) + { + if (eventsEnabled) { + //eventsEnabled = false; + if (HylafaxRadioButton.Active) { + Settings.TransmitAgent = "hylafax"; + Settings.RefreshQueueInterval = 30; + Settings.RefreshQueueEnabled = false; + PrefsNotebook.GetNthPage(HYLAFAX_PAGE).Show(); + PrefsNotebook.GetNthPage(EFAX_PAGE).Hide(); + } + else if (EfaxRadioButton.Active) { + Settings.TransmitAgent = "efax"; + Settings.RefreshQueueInterval = 15; + Settings.RefreshQueueEnabled = true; + PrefsNotebook.GetNthPage(EFAX_PAGE).Show(); + PrefsNotebook.GetNthPage(HYLAFAX_PAGE).Hide(); + + } + + Settings.FaxNumber = FaxNumberEntry.Text; + Settings.PhonePrefix = DialPrefixEntry.Text; + Settings.FaxViewer = FaxViewerEntry.Text; + } + } + + private void user_tab_changed (object o, EventArgs args) + { + if (eventsEnabled) { + Settings.EmailNotify = EmailNotifyCheckButton.Active; + Settings.EmailAddress = EmailAddressEntry.Text; + Settings.SendNow = SendNowCheckButton.Active; + Settings.LogEnabled = FaxLogCheckButton.Active; + Settings.CoverPage = CoverPageCheckButton.Active; + Settings.HiResolution = HiResCheckButton.Active; + } + } + + private void radio_button_toggled (object o, EventArgs args) + { + if (eventsEnabled) + taChanged = true; + } + + + private void efax_setup_changed (object o, EventArgs args) + { + + if (eventsEnabled) { + // Option 5 is custom define so we don't change anything + if (EfaxModemTypeComboBox.Active != 5) { + switch (EfaxModemTypeComboBox.Active) { + case 0: + Settings.EfaxModemFcinit = @"-j\Q4"; + break; + case 1: + Settings.EfaxModemFcinit = @"-j\Q1"; + break; + case 2: + Settings.EfaxModemFcinit = @"-j*F1"; + break; + case 3: + Settings.EfaxModemFcinit = @"-j&H2&I0&R1&D3I4"; + break; + case 4: + Settings.EfaxModemFcinit = @"-or"; + break; + default: + Settings.EfaxModemFcinit = @"-j&H2&I0&R1&D3I4"; + break; + } + } + + Settings.EfaxPapersize = EfaxPapersizeComboBox.ActiveText; + Settings.EfaxModemSpeakerVolume = EfaxModemSpeakerVolumeComboBox.Active; + } + } + } +} diff --git a/src/gfaxsend.cs b/src/gfaxsend.cs new file mode 100644 index 0000000..444ed91 --- /dev/null +++ b/src/gfaxsend.cs @@ -0,0 +1,364 @@ +// 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +//************************************************************************ +// GfaxSend class +// +// This is a the send window for sending of a facsimile. +namespace gfax { + using Mono.Unix; + using System; + using System.IO; + using GLib; + using Gtk; + using Gnome; + using Glade; + using GConf.PropertyEditors; + using GtkSharp; + using System.Runtime.InteropServices; + using System.Collections; + using System.Diagnostics; + using System.Reflection; + + + public class GfaxSend // : Program + { + const string APPNAME = "Gfax"; + + const int COLUMN_0 = 0; + const int COLUMN_1 = 1; + const int COLUMN_2 = 2; + const int COLUMN_3 = 3; + const int ALL_COLUMNS = -1; + + [Glade.Widget] Gtk.Window NewFaxDialog; + [Glade.Widget] Gtk.Button BrowseButton; + [Glade.Widget] Gtk.Button PhoneButton; + [Glade.Widget] Gtk.Entry NumberEntry; + [Glade.Widget] Gtk.Entry EmailEntry; + [Glade.Widget] Gtk.Entry FilenameEntry; + [Glade.Widget] Gtk.CheckButton ResolutionCheckbutton; + [Glade.Widget] Gtk.CheckButton EmailCheckbutton; + [Glade.Widget] Gtk.CheckButton SendCheckbutton; + [Glade.Widget] Gtk.TreeView ItemTreeview; + [Glade.Widget] Gnome.DateEdit SendDateedit; + //[Glade.Widget] Gnome.FileEntry PSFileEntry; + + + Gtk.ListStore ItemStore; + G_ListView ItemListview; + + GConf.PropertyEditors.EditorShell shell; + + Glade.XML gxml; + string filename, includeFilename; + bool dosend; + + public GfaxSend (string fname, string[] args) + { + + filename = fname; + includeFilename = args[0]; + + Application.Init (); + + if (Settings.Faxtracing == true) { + Console.WriteLine("[GfaxSend] File name is : {0}", fname); + } + + // check to see if we've run before, if so gfax will be there + if ( Settings.RunSetupAtStart ) { + Settings.RunSetupAtStart = false; + MessageDialog md; + md = new MessageDialog ( + null, + DialogFlags.DestroyWithParent, + MessageType.Info, + ButtonsType.Ok, + Catalog.GetString( + @" +This is the first time you have run Gfax. +Please run Gfax from the menu or command line and set your +MODEM TYPE, PORT and Fax number under preferences. + +Gfax is initially setup to use Efax, you may change it use +Hylafax if you prefer or require connection to a network +facsimile server.") + ); + md.Run (); + md.Destroy(); + Application.Quit(); + dosend = false; + Environment.Exit(0); + } +/* + if ( Settings.FaxNumber.Length <= 4 ) { + MessageDialog md; + md = new MessageDialog ( + null, + DialogFlags.DestroyWithParent, + MessageType.Info, + ButtonsType.Ok, + Catalog.GetString( + @" +You must have a Fax number set in your preferences under +Phone Information.") + ); + md.Run (); + md.Destroy(); + //Application.Quit(); + dosend = false; + return; + } +*/ + gxml = new Glade.XML (null, "send-druid.glade","NewFaxDialog",null); + gxml.Autoconnect (this); + + // Set the program icon + //Gdk.Pixbuf Icon = new Gdk.Pixbuf(null, "gfax.png"); + //((Gtk.Window) gxml["NewFaxDialog"]).Icon = Icon; + //NewFaxDialog.Icon = Icon; + + ItemStore = new ListStore( + typeof (Boolean), + typeof (string), + typeof (string), + typeof (string)); + + ItemListview = new G_ListView(ItemTreeview, ItemStore); + + ItemListview.AddColumnTitleToggle(Catalog.GetString("Send"), 0, COLUMN_0); + ItemListview.AddColumnTitle(Catalog.GetString("Phone Number"), 0, COLUMN_1); + ItemListview.AddColumnTitle(Catalog.GetString("Organization"), 0, COLUMN_2); + ItemListview.AddColumnTitle(Catalog.GetString("Contact"), 0, COLUMN_3); + + ItemTreeview.HeadersVisible = true; + + //ItemTreeview.Selection.Mode = SelectionMode.Multiple; + + ResolutionCheckbutton.Active = Settings.HiResolution; + EmailCheckbutton.Active = Settings.EmailNotify; + EmailEntry.Text = Settings.EmailAddress; + + if (Settings.TransmitAgent == "efax") { + EmailCheckbutton.Visible = false; + EmailEntry.Visible = false; + SendCheckbutton.Visible = false; + SendDateedit.Visible = false; + } + + if (SendCheckbutton.Active) + SendDateedit.Sensitive = false; + + // If we have a file name from the gnome print dialog + if (includeFilename != "do_filename") { + FilenameEntry.Text = Catalog.GetString("Spooled from print job"); + FilenameEntry.Sensitive = false; + BrowseButton.Sensitive = false; + } + + Application.Run (); + } + + public bool DoSend + { + get { return dosend; } + } + + public string Filename + { + get { return filename; } + } + + + private void on_window1_delete_event (object o, DeleteEventArgs args) + { + dosend = false; + //((Gtk.Window) gxml["NewFaxDialog"]).Destroy(); + NewFaxDialog.Destroy(); + Application.Quit (); + args.RetVal = true; + } + + private void on_CancelButton_clicked (object o, EventArgs args) + { + dosend = false; + //((Gtk.Window) gxml["NewFaxDialog"]).Destroy(); + NewFaxDialog.Destroy(); + Application.Quit (); + } + + private void on_NumberEntry_changed (object o, EventArgs args) + { + //if (NumberEntry.Text == "\t") + //((Gnome.Druid) gxml["send_druid"]).HasFocus = true; + } + + private void on_SendCheckButton_toggled (object o, EventArgs args) + { + SendDateedit.Sensitive = ! SendDateedit.Sensitive; + } + + private void on_NumberEntry_activate (object o, EventArgs args) + { + Gtk.TreeIter iter = new Gtk.TreeIter(); + + iter = ItemStore.AppendValues(true, NumberEntry.Text, "", ""); + ItemTreeview.Model = ItemStore; + NumberEntry.Text = ""; + } + + + private void on_BrowseButton_clicked (object o, EventArgs args) + { + FileChooserDialog fc = new FileChooserDialog("Choose postscript file", null, FileChooserAction.Open); + fc.AddButton (Gtk.Stock.Cancel, Gtk.ResponseType.Cancel); + fc.AddButton (Gtk.Stock.Open, Gtk.ResponseType.Ok); + + ResponseType result = (ResponseType)fc.Run (); + + if (result == ResponseType.Ok) { + FilenameEntry.Text = fc.Filename; + fc.Destroy(); + } else { + fc.Destroy(); + } + } + + + private void on_PhoneButton_clicked (object o, EventArgs args) + { + Gtk.TreeIter iter = new Gtk.TreeIter(); + // display the phone book, when we return gfax.Destinations + // will be set with contacts. + GfaxSendPhoneBook gfs = new GfaxSendPhoneBook(gxml, "gfaxsend"); + + ItemStore.Clear(); + + if (gfax.Destinations.Count > 0) { + IEnumerator enu = gfax.Destinations.GetEnumerator(); + + while ( enu.MoveNext() ) { + iter = ItemStore.AppendValues(true, + ((GfaxContact)enu.Current).PhoneNumber, + ((GfaxContact)enu.Current).Organization, + ((GfaxContact)enu.Current).ContactPerson); + ItemTreeview.Model = ItemStore; + } + } + } + + + // When finished gfax.Destinations will contain a list of contacts + // of Phonebook.Contact type. + private void on_SendfaxButton_clicked (object o, EventArgs args) + { + Gtk.TreeIter iter = new Gtk.TreeIter(); + ArrayList rows = new ArrayList(); + + if (includeFilename == "do_filename") + filename = FilenameEntry.Text; + + if (!File.Exists(filename)) { + MessageDialog md; + md = new MessageDialog (null, DialogFlags.DestroyWithParent, + MessageType.Info, ButtonsType.Ok, + Catalog.GetString( + @" +The file you have entered does not exist. +Please check the name and try again.") + ); + md.Run (); + md.Destroy(); + return; + } + + // clear all the distinations, it's a little wierd yup + gfax.Destinations.Clear(); + + // Get the first row. + ItemStore.GetIterFirst(out iter); + + try { + if ( (bool)ItemStore.GetValue(iter, 0) ) { // if send is true (toggle set) + + GfaxContact c = new GfaxContact(); + c.PhoneNumber = (string)ItemStore.GetValue(iter, 1); // number + c.Organization = (string)ItemStore.GetValue(iter, 2); // organization + c.ContactPerson = (string)ItemStore.GetValue(iter, 3); // contact + + rows.Add(c); + } + } + catch (Exception e) { + MessageDialog md; + md = new MessageDialog ( + null, + DialogFlags.DestroyWithParent, + MessageType.Info, + ButtonsType.Ok, + Catalog.GetString( + @" +You have not entered a facsimile number! +Please enter a number and press the Enter key or +click the Phone Book button to select numbers or +entire phone books.") + ); + md.Run (); + md.Destroy(); + return; + } + + // get the rest of the rows + while (ItemStore.IterNext(ref iter)) { + + try { + if ( (bool)ItemStore.GetValue(iter, 0) ) { // if send is true (toggle set) + + GfaxContact c = new GfaxContact(); + c.PhoneNumber = (string)ItemStore.GetValue(iter, 1); // number + c.Organization = (string)ItemStore.GetValue(iter, 2); // organization + c.ContactPerson = (string)ItemStore.GetValue(iter, 3); // contact + + rows.Add(c); + } + } + catch (Exception e) {} + } + + + if (SendCheckbutton.Active) { + gfax.timeToSend = DateTime.UtcNow; + } else { + // Convert to UTC for Hylafax + gfax.timeToSend = (SendDateedit.Time).ToUniversalTime(); + } + + gfax.Destinations = rows; + + //get the fine resolution status + gfax.sendWizardResolution = ResolutionCheckbutton.Active; + //get the email flag and email address + gfax.sendWizardEmailNotify = EmailCheckbutton.Active; + gfax.sendWizardEmailAddress = EmailEntry.Text; + + if ( gfax.Destinations.Count > 0 ) + dosend = true; // yes send the fax + + //((Gtk.Window) gxml["NewFaxDialog"]).Hide(); + NewFaxDialog.Hide(); + Application.Quit(); + } + } +} diff --git a/src/gui.cs b/src/gui.cs new file mode 100755 index 0000000..b5ab51a --- /dev/null +++ b/src/gui.cs @@ -0,0 +1,1137 @@ +// GFAX - Gnome fax application +// Copyright (C) 2003 - 2008 George A. Farris +// +// 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 3 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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +//#define DEBUG + +namespace gfax { + using Mono.Unix; + using System; + using System.IO; + using GLib; + using Gdk; + using Gtk; + using Gnome; + using Glade; + using GConf.PropertyEditors; + using GtkSharp; + using System.Runtime.InteropServices; + using System.Collections; + using System.Diagnostics; + using System.Reflection; + + + //************************************************************************ + // Gfax class + // + // This is the main application window + + public class Gfax : Program + { + const string VERSION = "0.7.7"; + const string NAME = "Gfax"; + const string APPNAME = "Gfax"; + + // Notebook pages + const int SENDQ_PAGE = 0; + const int DONEQ_PAGE = 1; + const int RECEIVEQ_PAGE = 2; + + const int COLUMN_0 = 0; + const int COLUMN_1 = 1; + const int COLUMN_2 = 2; + const int COLUMN_3 = 3; + const int COLUMN_4 = 4; + const int COLUMN_5 = 5; + const int ALL_COLUMNS = -1; + + // Strings to hold old contact info temporarily + string tempName; + string tempNumber; + string tempCompany; + + ArrayList oldSendQueue = null; // hold old queue results + + bool restart = true; + bool eventsEnabled = true; + bool queueBusy = false; + + enum ActiveQ { done, send, receive }; + ActiveQ activeQ; + + + Glade.XML gxml; + + [Glade.Widget] Gtk.Window GfaxWindow; + [Glade.Widget] Gnome.AppBar Appbar; + + [Glade.Widget] Gtk.TreeView StatusList; + [Glade.Widget] Gtk.TreeView JobsCompleteList; + [Glade.Widget] Gtk.TreeView JobsReceivedList; + [Glade.Widget] Gtk.Notebook StatusNotebook; + [Glade.Widget] Gtk.Button DeleteJobButton; + [Glade.Widget] Gtk.Button ModifyJobButton; + [Glade.Widget] Gtk.Button ViewPrintButton; + [Glade.Widget] Gtk.Button RecvfaxDeleteButton; + [Glade.Widget] Gtk.TextView StatusText; + + + // Menu items + [Glade.Widget] Gtk.CheckMenuItem AutoQRefreshCheckMenuItem; + [Glade.Widget] Gtk.CheckMenuItem EmailNotificationCheckMenuItem; + [Glade.Widget] Gtk.CheckMenuItem HiResolutionModeCheckMenuItem; + [Glade.Widget] Gtk.CheckMenuItem LogEnabledCheckMenuItem; + [Glade.Widget] Gtk.CheckMenuItem FaxTracingCheckMenuItem; + + //Gtk.Window MainWindow; + + Gtk.ListStore StatusStore; + Gtk.ListStore RecvStore; + Gtk.TreeModel StatusModel; + G_ListView lv, jobsCompletedView, jobsReceivedView; + + // text buffer for status text area + TextBuffer StatusTextBuffer = new TextBuffer(new TextTagTable()); + + Phonebook[] myPhoneBooks; + + GConf.PropertyEditors.EditorShell shell; + + long filePos = 0; + static bool iconified = true; // gfax starts iconified + + static long lastMaxOffset; + + + + public Gfax (string fname, string[] args) + : base (APPNAME, VERSION, Modules.UI, args, new object [0]) + { + //Phonebook[] pb; delete me + + // Set the program icon + Gtk.Window.DefaultIconName = "gfax"; + + Application.Init (); + + // check to see if we've run before, if so gfax will be there + if ( Settings.RunSetupAtStart ) { + Settings.RunSetupAtStart = false; + + MessageDialog md; + md = new MessageDialog ( + null, + DialogFlags.DestroyWithParent, + MessageType.Info, + ButtonsType.Ok, + Catalog.GetString( + @" +This is the first time you have run Gfax. +You should set your MODEM TYPE and PORT under preferences. + +Gfax is initially setup to use Efax, you may change it use +Hylafax if you prefer or require connection to a network +facsimile server.") + ); + md.Run (); + md.Destroy(); + } + + if (!Directory.Exists(gfax.SpoolDirectory)) { + G_Message gm = new G_Message(Catalog.GetString( + @"Your spool directory is missing! + +Please login as the root user and create the " ++ gfax.SpoolDirectory + +" directory.\n\nAll users should be able to write to it.\n")); + return; + } + if (!Directory.Exists(gfax.SpoolDirectory + "/doneq")) { + G_Message gm = new G_Message(Catalog.GetString( + @"The doneq directory is missing in your spool directory! + +Please login as the root user and create the " ++ gfax.SpoolDirectory + "/doneq" + +" directory.\n\nAll users should be able to write to it.\n")); + return; + } + if (!Directory.Exists(gfax.SpoolDirectory + "/recq")) { + G_Message gm = new G_Message(Catalog.GetString( + @"The recq directory is missing in your spool directory! + +Please login as the root user and create the " ++ gfax.SpoolDirectory + "/recq" + +" directory.\n\nAll users should be able to write to it.\n")); + return; + } + + + gxml = new Glade.XML (null, "gfax.glade", "GfaxWindow", null); + gxml.Autoconnect (this); + + + // Set initial gui state as per preferences + // GConf.PropertyEditors.EditorShell doesn't handle + // checkmenuitems; + eventsEnabled = false; + if (Settings.TransmitAgent == "hylafax") { + AutoQRefreshCheckMenuItem.Active = Settings.RefreshQueueEnabled; + EmailNotificationCheckMenuItem.Active = Settings.EmailNotify; + HiResolutionModeCheckMenuItem.Active = Settings.HiResolution; + LogEnabledCheckMenuItem.Active = Settings.LogEnabled; + } + if (Settings.TransmitAgent == "efax") { + AutoQRefreshCheckMenuItem.Active = Settings.RefreshQueueEnabled; + AutoQRefreshCheckMenuItem.Sensitive = false; + EmailNotificationCheckMenuItem.Active = false; + EmailNotificationCheckMenuItem.Sensitive = false; + HiResolutionModeCheckMenuItem.Active = Settings.HiResolution; + LogEnabledCheckMenuItem.Visible = false; + } + eventsEnabled = true; + + StatusText.Editable = false; + StatusText.CanFocus = false; + StatusText.Buffer = StatusTextBuffer; + + // Set the program icon + Gdk.Pixbuf Icon = new Gdk.Pixbuf(null, "gfax.png"); + + gfax.MainWindow = GfaxWindow; + + // Setup listview icons + InitListViewIcons(); + + StatusStore = new ListStore( + typeof (Gdk.Pixbuf), + typeof (string), + typeof (string), + typeof (string), + typeof (string), + typeof (string), + typeof (string), + typeof (DateTime), + typeof (string)); + + RecvStore = new ListStore( + typeof (Gdk.Pixbuf), + typeof (string), + typeof (string), + typeof (string), + typeof (DateTime), + typeof (string)); + + + lv = new G_ListView(StatusList, StatusStore); + lv.AddColumnIcon(Gtk.Stock.Info, 0); + lv.AddColumnTitle(Catalog.GetString("Jobid"), 1, 1); + lv.AddColumnTitle(Catalog.GetString("Number"), 2, 2); + lv.AddColumnTitle(Catalog.GetString("Status"), 3, 3); + lv.AddColumnTitle(Catalog.GetString("Owner"), 4, 4); + lv.AddColumnTitle(Catalog.GetString("Pages"), 5, 5); + lv.AddColumnTitle(Catalog.GetString("Dials"), 6, 6); + lv.AddColumnDateTime(Catalog.GetString("Send At"), "G", 7, 7); + lv.AddColumnTitle(Catalog.GetString("Information"), 8, 8); + + // List view for completed jobs tab + jobsCompletedView = new G_ListView(JobsCompleteList, StatusStore); + jobsCompletedView.AddColumnIcon(Gtk.Stock.Info, 0); + jobsCompletedView.AddColumnTitle(Catalog.GetString("Jobid"), 1, 1); + jobsCompletedView.AddColumnTitle(Catalog.GetString("Number"), 2, 2); + jobsCompletedView.AddColumnTitle(Catalog.GetString("Status"), 3, 3); + jobsCompletedView.AddColumnTitle(Catalog.GetString("Owner"), 4, 4); + jobsCompletedView.AddColumnTitle(Catalog.GetString("Pages"), 5, 5); + jobsCompletedView.AddColumnTitle(Catalog.GetString("Dials"), 6, 6); + jobsCompletedView.AddColumnDateTime(Catalog.GetString("Send At"), "G", 7, 7); + jobsCompletedView.AddColumnTitle(Catalog.GetString("Information"), 8, 8); + + jobsReceivedView = new G_ListView(JobsReceivedList, RecvStore); + jobsReceivedView.AddColumnIcon(Gtk.Stock.Info, 0); + jobsReceivedView.AddColumnTitle(Catalog.GetString("Sender"), 1, 1); + jobsReceivedView.AddColumnTitle(Catalog.GetString("Status"), 2, 2); + jobsReceivedView.AddColumnTitle(Catalog.GetString("Pages "), 3, 3); + jobsReceivedView.AddColumnDateTime(Catalog.GetString("Arrived"), "d", 4, 4); + jobsReceivedView.AddColumnTitle(Catalog.GetString("Filename"), 5, 5); + + StatusList.Selection.Changed += + new EventHandler(on_StatusList_selection); + StatusList.Selection.Mode = SelectionMode.Multiple; + StatusList.HeadersVisible = true; + + JobsCompleteList.Selection.Changed += + new EventHandler(on_JobsCompleteList_selection); + JobsCompleteList.Selection.Mode = SelectionMode.Multiple; + JobsCompleteList.HeadersVisible = true; + + JobsReceivedList.Selection.Changed += + new EventHandler(on_JobsReceivedList_selection); + JobsReceivedList.Selection.Mode = SelectionMode.Multiple; + JobsReceivedList.HeadersVisible = true; + + // Make sure headers are visible + lv.AddTextToRow(null,"","","","","","",null,""); + jobsCompletedView.AddTextToRow(null,"","","","","","",null,""); + jobsReceivedView.AddTextToRow(null,"","","",null,""); + StatusStore.Clear(); + RecvStore.Clear(); + + DeleteJobButton.Sensitive = false; + if (Settings.TransmitAgent == "hylafax") + ModifyJobButton.Sensitive = false; + else + ModifyJobButton.Visible = false; + ViewPrintButton.Sensitive = false; + + // Setup some global variables + gfax.MainProgressBar = Appbar.Progress; + gfax.GStatusTextBuffer = StatusTextBuffer; + gfax.GAppbar = Appbar; + + gfax.Pulser = new Pulser(); + gfax.Status = new Status(StatusText, StatusTextBuffer); + + if (Settings.RefreshQueueEnabled) + GLib.Timeout.Add((uint)(Settings.RefreshQueueInterval * 1000), + new TimeoutHandler (queue_refresh)); + + async_update_status(); + + if (Settings.TransmitAgent == "hylafax" ) { + while (gfax.activeNetwork) + System.Threading.Thread.Sleep(100); + + async_net_read_finished(); + } + + activeQ = ActiveQ.send; + async_update_queue_status("sendq"); + + StatusIcon sicon = new StatusIcon(Icon); + sicon.Activate += new EventHandler (OnImageClick); + sicon.Tooltip = "Gfax Facsimile Sender"; + // showing the trayicon + sicon.Visible = true; + // setup system tray icon + gfax.MainWindow.SkipTaskbarHint = true; + gfax.MainWindow.Iconify(); + + Application.Run (); + } + + // end up here if we click the icon in the notifier + private static void OnImageClick(object o, EventArgs arg) + { + if (iconified) { + gfax.MainWindow.Deiconify(); + iconified = false; + gfax.MainWindow.SkipTaskbarHint = false; + } else { + gfax.MainWindow.Iconify(); + gfax.MainWindow.SkipTaskbarHint = true; + iconified = true; + } + } + + // End up here if we iconify with the window manager + private static void on_mainWindow_window_state_event(object o, WindowStateEventArgs args) + { + //Console.WriteLine ("state event: type=" + args.Event.Type + + // "; new_window_state=" + args.Event.NewWindowState); + + if (args.Event.NewWindowState == Gdk.WindowState.Iconified) { + iconified = true; + gfax.MainWindow.SkipTaskbarHint = true; + } else { + gfax.MainWindow.SkipTaskbarHint = false; + iconified = false; + } + + } + //************************************************************************ + // queue_refresh + // returns true to continue timeout functioning + // + // Queue_refresh connects to the hylafax server and retrieves + // updated queue information on regular intervals. This is called + // from a GLib.TimeoutHandler + public bool queue_refresh () + { + if (!Settings.RefreshQueueEnabled) + return false; + + // always do main status + //update_status(Fax.get_server_status()); + + // TODO do all this stuff with Delegates and events + async_update_status(); + while (gfax.activeNetwork) + System.Threading.Thread.Sleep(100); + // now do queue + + switch (activeQ) { + case ActiveQ.done : + async_update_queue_status("doneq"); + break; + case ActiveQ.send : + async_update_queue_status("sendq"); + break; + case ActiveQ.receive : + async_update_queue_status("recvq"); + break; + } + + return true; // must return true from timeout to keep it active + } + + // Set to true if we need to restart for changed transport agent + public bool Restart + { + get { return restart; } + set { restart = value; } + } + + +//========================= PRIVATE METHODS ==================================== + private void on_StatusList_selection (object o, EventArgs args) + { + if (StatusList.Selection.CountSelectedRows() > 0) { + DeleteJobButton.Sensitive = true; + ModifyJobButton.Sensitive = true; + } else { + DeleteJobButton.Sensitive = false; + ModifyJobButton.Sensitive = false; + } + } + + + private void on_JobsCompleteList_selection (object o, EventArgs args) + { + DeleteJobButton.Sensitive = true; + } + + private void on_JobsReceivedList_selection (object o, EventArgs args) + { + if (JobsReceivedList.Selection.CountSelectedRows() > 0) { + ViewPrintButton.Sensitive = true; + RecvfaxDeleteButton.Sensitive = true; + } else { + ViewPrintButton.Sensitive = false; + RecvfaxDeleteButton.Sensitive = false; + } + } + + // Double click (Send tab) + private void on_StatusList_row_activated (object o, RowActivatedArgs args) + { + modify_job(lv.GetSelections(ALL_COLUMNS), "sendq"); + } + + + private void on_JobsCompleteList_row_activated (object o, RowActivatedArgs args) + { + //modify_job(jobsCompletedView.GetSelections(ALL_COLUMNS), "doneq"); + } + + + private void on_JobsReceivedList_row_activated (object o, RowActivatedArgs args) + { + // get the selected jobs + ArrayList al; + string hfaxfile = null; + + // COLUMN_5 is the filename + al = jobsReceivedView.GetSelections(COLUMN_5); + + IEnumerator enu = al.GetEnumerator(); + while ( enu.MoveNext() ) { + hfaxfile = (string)enu.Current; + } + //Console.WriteLine("File to receive is {0}", hfaxfile); + + view_received_fax( hfaxfile ); + } + + private void on_exitButton_clicked (object o, EventArgs args) + { + Application.Quit(); + } + + private void on_mainWindow_delete_event (object o, DeleteEventArgs args) + { + Application.Quit(); + args.RetVal = true; + } + + private void on_exit1_activate (object o, EventArgs args) + { + Application.Quit(); + restart = true; + } + + +//Status list notebook signal, switch pages to show different queues + private void on_StatusNotebook_switch_page (object o, SwitchPageArgs args) + { + async_update_status(); + while (gfax.activeNetwork) + System.Threading.Thread.Sleep(100); + + switch (StatusNotebook.CurrentPage) { + case SENDQ_PAGE: + activeQ = ActiveQ.send; + //if (update_queue_status("sendq") > 0) + // DeleteJobButton.Sensitive = true; + //else { + DeleteJobButton.Sensitive = false; + //} + async_update_queue_status("sendq"); + break; + case DONEQ_PAGE: + DeleteJobButton.Sensitive = false; + activeQ = ActiveQ.done; + async_update_queue_status("doneq"); + break; + case RECEIVEQ_PAGE: + DeleteJobButton.Sensitive = false; + RecvfaxDeleteButton.Sensitive = false; + activeQ = ActiveQ.receive; + async_update_queue_status("recvq"); + break; + } + + } + +//Main toolbar buttons +//======================================================================= + private void on_NewFaxButton_clicked (object o, EventArgs args) + { + send_new_fax(); + } + + + private void on_PhonebookButton_clicked (object o, EventArgs args) + { + GfaxPhonebook gpb = new GfaxPhonebook(); + } + + + private void on_ModifyJobButton_clicked (object o, EventArgs args) + { + modify_job(lv.GetSelections(ALL_COLUMNS), "sendq"); + } + + private void modify_job (ArrayList al, string id) + { + + string jobid = null; + string number = null; + string status = null; + string user = null; + string pages = null; + string dials = null; + object sendat = null; + string error = null; + + IEnumerator enu = al.GetEnumerator(); + while ( enu.MoveNext() ) { + enu.MoveNext(); + jobid = (string)enu.Current; + enu.MoveNext(); + number = (string)enu.Current; + enu.MoveNext(); + status = (string)enu.Current; + enu.MoveNext(); + user = (string)enu.Current; + enu.MoveNext(); + pages = (string)enu.Current; + enu.MoveNext(); + int idx = ((string)enu.Current).LastIndexOf(':'); + dials = ((string)enu.Current).Substring(idx + 1); + enu.MoveNext(); + sendat = (object)enu.Current; + enu.MoveNext(); + error = (string)enu.Current; + } + + #if DEBUG + Console.WriteLine("[ModifyJob] Date is {0}", sendat); + #endif + + Glade.XML xml = new Glade.XML (null, "gfax.glade","vbox74",null); + Dialog mjd = new Dialog(); + mjd.VBox.Add(xml.GetWidget("vbox74")); + Gtk.Entry mje = (Gtk.Entry)xml.GetWidget("ModifyJobNumberEntry"); + Gnome.DateEdit mjde = (Gnome.DateEdit)xml.GetWidget("ModifyJobDate"); + Gtk.SpinButton mjmd = (Gtk.SpinButton)xml.GetWidget("MaxDialsSpinbutton"); + + mjd.AddButton (Gtk.Stock.Cancel, Gtk.ResponseType.Cancel); + mjd.AddButton (Gtk.Stock.Ok, Gtk.ResponseType.Ok); + + // this is to re-enable the entry for editing so it won't be selected + // to begin with??? Maybe something to do with re-parenting or something. + mje.FocusInEvent += + new FocusInEventHandler (on_ModifyJobNumberEntry_focus_in_event); + + mje.IsEditable = false; + mje.Text = number.Trim(); + + mjde.Time = sendat == null ? new DateTime(): (DateTime)sendat; + + mjmd.Value = Convert.ToDouble(dials.Trim()); + + ResponseType result = (ResponseType)mjd.Run (); + + if (result == ResponseType.Ok) { + DateTime newsend = (mjde.Time).ToUniversalTime(); + + // Format time to send - timezone is in UTC format. + string tts = String.Format("{0}{1:00}{2:00}{3:00}{4:00}", + newsend.Year, + newsend.Month, + newsend.Day, + newsend.Hour, + newsend.Minute); + + if (id == "sendq" ) + Fax.modify_job(jobid, mje.Text, tts, (mjmd.ValueAsInt).ToString()); + else // "doneq" + Fax.resubmit_job(jobid, mje.Text, tts, (mjmd.ValueAsInt).ToString()); + + mjd.Destroy(); + } else { + mjd.Destroy(); + } + + async_update_queue_status("sendq"); + ModifyJobButton.Sensitive = false; + DeleteJobButton.Sensitive = false; + } + + public void on_ModifyJobNumberEntry_focus_in_event (object o, EventArgs args) + { + Gtk.Entry e = o as Gtk.Entry; + e.IsEditable = true; + } + + private void on_DeleteJobButton_clicked (object o, EventArgs args) + { + // get the selected jobs + ArrayList al; + + // get a list of jobids to kill + al = lv.GetSelections(COLUMN_1); + + IEnumerator enu = al.GetEnumerator(); + while ( enu.MoveNext() ) { + Fax.delete_job((string)enu.Current); + } + + switch (activeQ) { + case ActiveQ.done : + async_update_queue_status("doneq"); + break; + case ActiveQ.send : + async_update_queue_status("sendq"); + break; + case ActiveQ.receive : + async_update_queue_status("recvq"); + break; + } + + DeleteJobButton.Sensitive = false; + ModifyJobButton.Sensitive = false; + } + + private void on_ViewPrintButton_clicked (object o, EventArgs args) + { + // get the selected jobs + ArrayList al; + string hfaxfile = null; + + // COLUMN_5 is the filename + al = jobsReceivedView.GetSelections(COLUMN_5); + + IEnumerator enu = al.GetEnumerator(); + while ( enu.MoveNext() ) { + hfaxfile = (string)enu.Current; + } + + view_received_fax (hfaxfile); + } + + private void view_received_fax (string s) + { + // TODO get proper Gnome mime type and use that first if running Gnome + try { + if (Fax.recvfax(s)) { + ProcessStartInfo pidInfo = new ProcessStartInfo(); + pidInfo.FileName = Settings.FaxViewer; + pidInfo.Arguments = String.Concat(gfax.SpoolDirectory, "/tif/", s); + System.Diagnostics.Process pid = System.Diagnostics.Process.Start(pidInfo); + } else { + G_Message gm = new G_Message(Catalog.GetString( +@"Cannot read the facsimile file from the server. You most likely do not +have permission to read the file. Check the settings on your fax server." )); + return; + } + + } catch (Exception e) { + G_Message gm = new G_Message(Catalog.GetString( +@"Cannot start your faxviewer program. +Please check your settings. It is currently set to " + Settings.FaxViewer + "." )); + } + + switch (activeQ) { + case ActiveQ.done : + async_update_queue_status("doneq"); + break; + case ActiveQ.send : + async_update_queue_status("sendq"); + break; + case ActiveQ.receive : + async_update_queue_status("recvq"); + break; + } + + // Reset progressbar + gfax.MainProgressBar.Fraction = 0; + } + + private void on_RecvfaxDeleteButton_clicked (object o, EventArgs args) + { + // get the selected jobs + ArrayList al; + string hfaxfile = null; + + // COLUMN_5 is the filename + al = jobsReceivedView.GetSelections(COLUMN_5); + + IEnumerator enu = al.GetEnumerator(); + while ( enu.MoveNext() ) { + hfaxfile = (string)enu.Current; + + try { + if (Fax.delete_file(hfaxfile) == 1) { + G_Message gm = new G_Message(Catalog.GetString( +@"Cannot delete the facsimile file from the server. You most likely do not +have permission to delete the file. Check the settings on your fax server." )); + return; + } + } catch (Exception e) { + G_Message gm = new G_Message(Catalog.GetString( +@"Cannot delete the file on the Hylafax server. +Please check your settings or contact your system Administrator")); + } + + switch (activeQ) { + case ActiveQ.done : + async_update_queue_status("doneq"); + break; + case ActiveQ.send : + async_update_queue_status("sendq"); + break; + case ActiveQ.receive : + async_update_queue_status("recvq"); + break; + } + } + } + + + +// Menu items selected ============================================= + private void on_newfax_activate (object o, EventArgs args) + { + send_new_fax(); + } + + private void on_preferences_activate (object o, EventArgs args) + { + GfaxPrefs gp = new GfaxPrefs(); + } + + private void on_jobs1_activate (object o, EventArgs args) + { + + } + + private void on_auto_queue_refresh_check_menu_item_activate (object o, EventArgs args) + { + if (eventsEnabled) { + Settings.RefreshQueueEnabled = !Settings.RefreshQueueEnabled; + if (Settings.RefreshQueueEnabled) + GLib.Timeout.Add((uint)(Settings.RefreshQueueInterval * 1000), + new TimeoutHandler(queue_refresh)); + } + } + + private void on_log_enabled_check_menu_item_activate (object o, EventArgs args) + { + if (eventsEnabled) + Settings.LogEnabled = !Settings.LogEnabled; + } + + private void on_email_notification_check_menu_item_activate (object o, EventArgs args) + { + if (eventsEnabled) + Settings.EmailNotify = !Settings.EmailNotify; + } + + private void on_hi_resolution_mode_check_menu_item_activate (object o, EventArgs args) + { + if (eventsEnabled) + Settings.HiResolution = !Settings.HiResolution; + } + + private void on_fax_tracing_check_menuItem_activate (object o, EventArgs args) + { + if (eventsEnabled) + Settings.Faxtracing = !Settings.Faxtracing; + } + + + private static AboutDialog about = null; + private static void on_about_activate (object sender, EventArgs args) + { + if (about == null) + about = new AboutDialog(); + + about.Name = NAME; + about.Version = VERSION; + about.LogoIconName = "gfax"; + about.Authors = new string[] { "George Farris " }; + about.Documenters = new string[] {}; + about.Copyright = Catalog.GetString("Copyright (C) 2003 George Farris "); + about.Comments = Catalog.GetString("A Facsimile application for GNOME"); + about.TranslatorCredits = ( + "Johannes Rohr - German\n" + + "Maris Dembovskis - Latvian\n" + + "Sasa Ostrouska Italian\n" + + "Bart Verstraete - Dutch"); + about.Run(); + about.Hide(); + } + + +//--------------------------- SUPPORT FUNCTIONS ------------------------------- + Gdk.Pixbuf fax_fail; + Gdk.Pixbuf fax_sent; + Gdk.Pixbuf fax_sleep; + Gdk.Pixbuf fax_block; + Gdk.Pixbuf fax_run; + Gdk.Pixbuf fax_receiving; + Gdk.Pixbuf fax_received; + + public void InitListViewIcons() + { + fax_receiving = Gtk.IconTheme.Default.LoadIcon ("document-save", 16, 0); + fax_fail = Gtk.IconTheme.Default.LoadIcon ("gtk-cancel", 16, 0); + fax_sent = Gtk.IconTheme.Default.LoadIcon ("gtk-apply", 16, 0); + fax_run = Gtk.IconTheme.Default.LoadIcon ("printer-printing", 16, 0); + fax_block = Gtk.IconTheme.Default.LoadIcon ("printer-error", 16, 0); + fax_sleep = Gtk.IconTheme.Default.LoadIcon ("appointment-soon", 16, 0); + fax_received = Gtk.IconTheme.Default.LoadIcon ("text-x-generic", 16, 0); + } + + public Gdk.Pixbuf GetFaxStatusIcon (FaxStatus status) + { + switch (status) + { + case FaxStatus.Fail: + return fax_fail; + case FaxStatus.New: + return fax_run; + case FaxStatus.Busy: + return fax_block; + case FaxStatus.Block: + return fax_block; + case FaxStatus.Sleep: + return fax_sleep; + case FaxStatus.Run: + return fax_run; + case FaxStatus.Receiving: + return fax_receiving; + case FaxStatus.Received: + return fax_received; + } + + return fax_sent; + } + + // Updates the status text widget + // only used for Efax + public void update_status (string s) + { + if (s == null) + return; + + if (Settings.TransmitAgent == "efax") { + TextMark tm = StatusTextBuffer.GetMark("insert"); + StatusTextBuffer.InsertAtCursor(String.Concat(s, "\n")); + StatusText.ScrollMarkOnscreen(tm); + } + } + + public void async_update_status () + { + string s; + + if (Settings.TransmitAgent == "efax") { + s = Fax.async_get_server_status(); + if (s != null ) { + TextMark tm = StatusTextBuffer.GetMark("insert"); + StatusTextBuffer.InsertAtCursor(String.Concat(s, "\n")); + StatusText.ScrollMarkOnscreen(tm); + } + } + + if (Settings.TransmitAgent == "hylafax") { + // Progressbar pulser - add this when we have async comms + GLib.Timeout.Add((uint)(100), new TimeoutHandler (queue_progress)); + + // update status bar + Appbar.ClearStack(); + Appbar.Push(Catalog.GetString("Refreshing server status...")); + Appbar.Refresh(); + //GLib.MainContext.Iteration (); + while (Gtk.Application.EventsPending ()) + Gtk.Application.RunIteration (); + + s = Fax.async_get_server_status(); + } + } + + + private void async_update_queue_status(string queue) + { + G_ListView view; + Fax.FaxQueue q = null; + Fax.FaxRecQueue rq = null; + + view = lv; + + switch (queue) { + case "sendq": + view = lv; + break; + case "doneq": + view = jobsCompletedView; + break; + case "recvq": + view = jobsReceivedView; + break; + } + + if (Settings.TransmitAgent == "hylafax") { + // Progressbar pulser - add this when we have async comms + GLib.Timeout.Add((uint)(100), new TimeoutHandler (queue_progress)); + + // update status bar + Appbar.ClearStack(); + Appbar.Push(Catalog.GetString("Refreshing queue...")); + Appbar.Refresh(); + //GLib.MainContext.Iteration (); + while (Gtk.Application.EventsPending ()) + Gtk.Application.RunIteration (); + + Fax.async_get_queue_status(queue); + } + if (Settings.TransmitAgent == "efax") { + async_update_listview(Fax.async_get_queue_status(queue), queue); + } + } + + // We end up here when an async network read is finished + private void async_net_read_finished () + { + switch (gfax.asyncReadType) { + case "doneq" : + async_update_listview(Fax.parse_senddone(gfax.asyncFolderMessageBuffer), "doneq"); + break; + case "sendq" : + async_update_listview(Fax.parse_senddone(gfax.asyncFolderMessageBuffer), "sendq"); + break; + case "recvq" : + async_update_listview(Fax.parse_receive(gfax.asyncFolderMessageBuffer), "recvq"); + break; + case "status" : + StatusTextBuffer.Text = gfax.asyncServerMessageBuffer; + break; + } + } + + private void async_update_listview(ArrayList reply, string queue) + { + G_ListView view; + Fax.FaxQueue q = null; + Fax.FaxRecQueue rq = null; + + view = lv; + + switch (queue) { + case "sendq": + view = lv; + break; + case "doneq": + view = jobsCompletedView; + break; + case "recvq": + view = jobsReceivedView; + break; + } + + if (reply.Count > 0) { + StatusStore.Clear(); + RecvStore.Clear(); + IEnumerator enu = reply.GetEnumerator(); + + if (queue == "sendq" || queue == "doneq") { + while ( enu.MoveNext() ) { + q = (Fax.FaxQueue)enu.Current; + view.AddTextToRow(GetFaxStatusIcon(q.StatusType), q.Jobid, q.Number, q.Status, q.Owner, q.Pages, q.Dials, q.Sendat, q.Error); + } + + Appbar.ClearStack(); + + if (q.Jobid != "") { + Appbar.Push(Catalog.GetString("There are " + reply.Count + " jobs in the queue")); + Appbar.Refresh(); + //((Gtk.Window) gxml["Gfax"]).Title = "Gfax (" + reply.Count + ")"; + GfaxWindow.Title = "Gfax (" + reply.Count + ")"; + //return reply.Count; + return; + } else { + Appbar.Push(Catalog.GetString("There are 0 jobs in the queue")); + Appbar.Refresh(); + //((Gtk.Window) gxml["Gfax"]).Title = "Gfax"; + GfaxWindow.Title = "Gfax"; + } + } else { //receive queue + while ( enu.MoveNext() ) { + rq = (Fax.FaxRecQueue)enu.Current; + view.AddTextToRow(GetFaxStatusIcon(rq.StatusType), rq.Sender, rq.Status, rq.Pages, rq.TimeReceived, rq.Filename); + } + + if (rq.Sender != "") { + Appbar.Push(Catalog.GetString("There are " + reply.Count + " jobs in the queue")); + Appbar.Refresh(); + //((Gtk.Window) gxml["Gfax"]).Title = "Gfax (" + reply.Count + ")"; + GfaxWindow.Title = "Gfax (" + reply.Count + ")"; + //return reply.Count; + return; + } else { + Appbar.Push(Catalog.GetString("There are 0 jobs in the queue")); + Appbar.Refresh(); + //((Gtk.Window) gxml["Gfax"]).Title = "Gfax"; + GfaxWindow.Title = "Gfax"; + } + } + + oldSendQueue = reply; // else save queue + } + + + StatusStore.Clear(); + RecvStore.Clear(); + } + + + private bool queue_progress () + { + if (gfax.activeNetwork) { + Appbar.Progress.Pulse(); + return (true); + } + else { + async_net_read_finished(); + Appbar.Progress.Fraction = 0; + return (false); + } + } + + // This is where we end up if the New Fax button or the menu item + // has been selected. + private void send_new_fax () + { + + string [] largs = {"do_filename"}; + GfaxSend sd = new GfaxSend ("", largs); + + // send the faxes + if (sd.DoSend) { + Fax.sendfax(sd.Filename); + // if file is temp data (/var/spool/gfax/D.*) then delete it + FileInfo f = new FileInfo(sd.Filename); + if (File.Exists(String.Concat(gfax.SpoolDirectory, "/", f.Name))) + File.Delete(String.Concat(gfax.SpoolDirectory, "/", f.Name)); + } + activeQ = ActiveQ.send; + async_update_queue_status("sendq"); + sd = null; + largs = null; + } + + } + + public class Status + { + TextBuffer stb; + TextView stv; + + public Status (Gtk.TextView StatusText, TextBuffer StatusTextBuffer) + { + stv = StatusText; + stb = StatusTextBuffer; + } + + public void Append (string s) + { + TextMark tm = stb.GetMark("insert"); + stb.InsertAtCursor(String.Concat(s, "\n")); + stv.ScrollMarkOnscreen(tm); + } + } + + // pulse the main window progressbar + public class Pulser + { + public bool endPulse; + + public void StartPulse () + { + endPulse = true; + GLib.Timeout.Add((uint)(200), + new TimeoutHandler (PulseIt)); + } + + public void EndPulse () + { + endPulse = false; + } + + private bool PulseIt () + { + gfax.MainProgressBar.Pulse(); + if (endPulse) + return(true); + else { + gfax.MainProgressBar.Fraction = 0; + return(false); + } + } + } + +} diff --git a/src/guitools.cs b/src/guitools.cs new file mode 100755 index 0000000..8828941 --- /dev/null +++ b/src/guitools.cs @@ -0,0 +1,540 @@ +// GFAX - Gnome fax application +// Copyright (C) 2003 - 2008 George A. Farris +// +// 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 3 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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +namespace gfax { + using System; + using System.IO; + using System.Collections; + using System.Reflection; + using GLib; + using Gtk; + using Gdk; + using Gnome; + using Glade; + using GtkSharp; + + // G_ProgressBar + public class G_ProgressBar + { + [Glade.Widget] Gtk.Dialog HylafaxProgressDialog; + [Glade.Widget] ProgressBar HylafaxProgressbar; + [Glade.Widget] Gtk.Notebook HylafaxProgressNotebook; + [Glade.Widget] Gtk.Button HylafaxProgressCancelButton; + [Glade.Widget] Gtk.Button HylafaxProgressCloseButton; + + bool close = true; + bool cancel = false; // Cancel all jobs + + public G_ProgressBar () + { + Glade.XML xml = new Glade.XML (null, "gfax.glade","HylafaxProgressDialog",null); + xml.Autoconnect (this); + + HylafaxProgressNotebook.CurrentPage = 0; + HylafaxProgressCloseButton.Hide(); + HylafaxProgressDialog.Show(); + } + + public bool Cancel + { + get { return cancel; } + } + + private void on_HylafaxProgressCancelButton_clicked(object o, EventArgs args) + { + cancel = true; + } + + private void on_HylafaxProgressCloseButton_clicked(object o, EventArgs args) + { + close = false; + HylafaxProgressDialog.Destroy(); + } + + public void Close() + { + //close = false; + //HylafaxProgressDialog.Hide(); + //HylafaxProgressDialog.Dispose(); + HylafaxProgressDialog.Destroy(); + } + + //public void Run () + //{ + // HylafaxProgressDialog.Run(); + //} + + public double Fraction + { + set { HylafaxProgressbar.Fraction = value; } + } + + public void Finished() + { + HylafaxProgressNotebook.CurrentPage = 1; + HylafaxProgressCancelButton.Hide(); + HylafaxProgressCloseButton.Show(); + // TODO Bad, bad, slap your wrist boy, do timer function + // or fix this somehow. Can I say 100% processor useage. + //while (close) { + // while (Gtk.Application.EventsPending ()) + // Gtk.Application.RunIteration (); + //} + } + } + + // G_Message class + // + // A simple message dialog + public class G_Message + { + public G_Message (string s) + { + MessageDialog d = new MessageDialog ( + null, DialogFlags.DestroyWithParent, MessageType.Error, ButtonsType.Ok, s); + d.Run (); + d.Destroy (); + } + + public G_Message (string s, bool toplevel) + { + Application.Init(); + MessageDialog d = new MessageDialog ( + null, DialogFlags.DestroyWithParent, MessageType.Error, ButtonsType.Ok, s); + d.Run (); + d.Destroy (); + Application.Quit(); + } + } + + public class G_Password + { + [Glade.Widget] Gtk.Dialog PasswordDialog; + [Glade.Widget] Gtk.Entry PasswordEntry; + + string pass; // the password entered + bool cancel = false; // Cancel the connection + bool remember = false; // Remember the password + + public G_Password () + { + Glade.XML xml = new Glade.XML (null, "gfax.glade","PasswordDialog",null); + xml.Autoconnect (this); + + PasswordDialog.Show(); + } + + public bool Cancel + { + get { return cancel; } + } + + public bool RememberPassword + { + get { return remember; } + } + + public string Password + { + get { return pass; } + } + + public void Run () + { + PasswordDialog.Run(); + } + + private void on_PasswordCheckbutton_toggled(object o, EventArgs args) + { + remember = true; + } + + private void on_cancelbutton_clicked(object o, EventArgs args) + { + cancel = true; + PasswordDialog.Hide(); + } + + private void on_PasswordEntry_activate(object o, EventArgs args) + { + pass = PasswordEntry.Text; + PasswordDialog.Hide(); + } + + private void on_okbutton_clicked(object o, EventArgs args) + { + pass = PasswordEntry.Text; + PasswordDialog.Hide(); + } + + public void Close() + { + PasswordDialog.Destroy(); + } + } + + + // *********************************************************************** + // + // G_GetFilename class + // + // Implements a GTK+ fileselector with signal handler for Ok and Cancel + // Arguments: + // string title : Title open file selection dialog + // string dir : Starting directory + + public class G_GetFilename + { + string fname; + public Gtk.FileSelection fs; + + public G_GetFilename (string title, string dir) + { + fs = new FileSelection(title); + fs.Filename = dir; + fs.Modal = true; + fs.HideFileopButtons (); + fs.OkButton.Clicked += new EventHandler (ok); + fs.CancelButton.Clicked += new EventHandler (cancel); + +/* + check_button = new CheckButton ("Show Fileops"); + check_button.Toggled += new EventHandler (show_fileops); + fs.ActionArea.PackStart (check_button, false, false, 0); + + toggle_button = new ToggleButton ("Select Multiple"); + toggle_button.Clicked += new EventHandler (select_multiple); + fs.ActionArea.PackStart (toggle_button, false, false, 0); +*/ + fs.ShowAll(); + fs.Run (); + } + + public void Destroy () + { + fs.Destroy(); + } + + private void cancel (object o, EventArgs args) + { + //Console.WriteLine("[Cancel] file selection cancel"); + fs.Hide (); + } + + private void ok (object o, EventArgs args) + { + //Console.WriteLine(fs.Filename); + fname = fs.Filename; + fs.Hide (); + } + + public string Fname + { + get {return fname;} + set {fname = value;} + } + + + } + + public class CellRendererDateTime: CellRendererText + { + public string Format; + } + + public class G_ListView + { + Gtk.ListStore store; + Gtk.TreeView tree; + Gtk.TreeViewColumn column; + Gtk.CellRendererText textrenderer; + CellRendererDateTime datetimerenderer; + Gtk.CellRendererPixbuf iconrenderer; + Gtk.TreeIter iter; + Value valnot = new Value(false); + Value valone = new Value(true); + + const int COLUMN_0 = 0; + const int COLUMN_1 = 1; + const int COLUMN_2 = 2; + const int ALL_COLUMNS = -1; + + public G_ListView (Gtk.TreeView tr, Gtk.ListStore st) + { + store = st; + tree = tr; + iter = new Gtk.TreeIter(); + } + + public void AddColumnIcon (string iconname, int col) + { + column = new TreeViewColumn (); + iconrenderer = new Gtk.CellRendererPixbuf (); + column.Expand = false; + column.Resizable = false; + column.Clickable = false; + column.Reorderable = false; + column.Alignment = 0.5f; + column.Widget = new Gtk.Image( + Gtk.IconTheme.Default.LoadIcon (iconname, 16, 0) + ); + column.Widget.Show(); + column.PackStart (iconrenderer, true); + column.AddAttribute (iconrenderer, "pixbuf", col); + tree.AppendColumn(column); + } + + protected int DateTimeTreeIterCompareFunc (TreeModel model, TreeIter a, TreeIter b) + { + int col = -1; + SortType sort; + + bool is_sorted = ((Gtk.ListStore)model).GetSortColumnId (out col, out sort); + if(!is_sorted) + return 0; + + DateTime dateA = (DateTime)model.GetValue (a, col); + DateTime dateB = (DateTime)model.GetValue (b, col); + + return dateA.CompareTo(dateB); + } + + protected void DateTimeColumnDataHandler (TreeViewColumn column, + CellRenderer cell, TreeModel model, TreeIter iter) + { + DateTime date = (DateTime)model.GetValue (iter, column.SortColumnId); + CellRendererDateTime renderer = (CellRendererDateTime)cell; + renderer.Text = date.ToString(renderer.Format); + } + + public void AddColumnDateTime (string title, string format, int sortid, int col) + { + store.SetSortFunc(col, new TreeIterCompareFunc(DateTimeTreeIterCompareFunc)); + + column = new TreeViewColumn (); + datetimerenderer = new CellRendererDateTime (); + datetimerenderer.Format = format == null ? "G" : format; + column.Title = title; + column.SortColumnId = sortid; + column.Sizing = TreeViewColumnSizing.Autosize; + column.Reorderable = true; + column.Resizable = true; + column.Expand = false; + column.Alignment = 0.0f; + column.PackStart (datetimerenderer, true); + column.SetCellDataFunc (datetimerenderer, new TreeCellDataFunc(DateTimeColumnDataHandler)); + tree.AppendColumn(column); + } + + public void AddColumnTitle (string title, int sortid, int col) + { + column = new TreeViewColumn (); + textrenderer = new CellRendererText (); + //text.Editable = true;object + column.Title = title; + column.SortColumnId = sortid; + column.Sizing = TreeViewColumnSizing.Autosize; + column.Reorderable = true; + column.Resizable = true; + column.Expand = false; + column.Alignment = 0.0f; + column.PackStart (textrenderer, true); + column.AddAttribute (textrenderer, "text", col); + tree.AppendColumn(column); + } + +// TODO move this to GfaxSend in gui.cs + public void AddColumnTitleToggle (string title, int sortid, int col) + { + column = new TreeViewColumn (); + CellRendererToggle toggle = new CellRendererToggle (); + toggle.Activatable = true; + toggle.Toggled += new ToggledHandler (toggle_it); + column.Title = title; + column.PackStart (toggle, false); + column.AddAttribute (toggle, "active", col); + tree.AppendColumn(column); + } + + // we need to manually set the toggle when selected otherwise + // it won't show in the gui. + public void toggle_it (object o, Gtk.ToggledArgs args) + { + store.GetIterFromString(out iter, args.Path); + bool tog = (bool)store.GetValue(iter, 0); + store.SetValue(iter, 0, !tog); + } +// end of move + + // Each arg is a new column + public void AddTextToRow (params object[] args) + { + iter = store.AppendValues(args); + tree.Model = store; + } + + // returns a list of arrays of columns size + public ArrayList GetAllRows() + { + ArrayList rows = new ArrayList(); + + // Really get the whole row. + string[] col = new string[store.NColumns]; + store.GetIterFirst(out iter); + + for ( int i = 0; i < store.NColumns; i++) { + try { + col[i] = (string)store.GetValue(iter, i); + //Console.WriteLine("Column {0}",col[i]); + } + catch (Exception e) { } + } + rows.Add(col); + + #if DEBUG + Console.WriteLine("got colums"); + #endif + + while (store.IterNext(ref iter)) { + string[] coln = new string[store.NColumns]; + for ( int i = 0; i < store.NColumns; i++) { + coln[i] = (string)store.GetValue(iter, i); + } + rows.Add(coln); + } + return rows; + } + + // get multiple selections, return a list of objects + public ArrayList GetSelections(int column) + { + ArrayList selects = new ArrayList(); + + // Really get the whole row. + if (column == ALL_COLUMNS) { + store.GetIterFirst(out iter); + if ( tree.Selection.IterIsSelected(iter)) { + for ( int i = 0; i < store.NColumns; i++) { + selects.Add(store.GetValue(iter, i)); + } + } + + while (store.IterNext(ref iter)) { + if ( tree.Selection.IterIsSelected(iter)) { + for ( int i = 0; i < store.NColumns; i++) { + selects.Add(store.GetValue(iter, i)); + } + } + } + } + else + { + store.GetIterFirst(out iter); + if ( tree.Selection.IterIsSelected(iter)) { + selects.Add(store.GetValue(iter, column)); + } + + while (store.IterNext(ref iter)) { + if ( tree.Selection.IterIsSelected(iter)) { + selects.Add(store.GetValue(iter, column)); + } + } + } + return selects; + } + + // get single selection + public object GetSingleSelection () + { + object sel = null; + Gtk.TreeIter iter = new Gtk.TreeIter(); + + store.GetIterFirst(out iter); + if ( tree.Selection.IterIsSelected(iter)) { + sel = store.GetValue(iter, 0); + } + + while (store.IterNext(ref iter)) { + if ( tree.Selection.IterIsSelected(iter)) { + sel = store.GetValue(iter, 0); + } + } + return sel; + } + + public void RemoveSelectedRow () + { + Gtk.TreeIter iter = new Gtk.TreeIter(); + + store.GetIterFirst(out iter); + if ( tree.Selection.IterIsSelected(iter)) { + store.Remove(ref iter); + return; + } + + while (store.IterNext(ref iter)) { + if ( tree.Selection.IterIsSelected(iter)) { + store.Remove(ref iter); + break; + } + } + return; + } + + //TODO get this to work + public void RemoveSelectedRows () + { + Gtk.TreeIter iter = new Gtk.TreeIter(); + + store.GetIterFirst(out iter); + if ( tree.Selection.IterIsSelected(iter)) { + store.Remove(ref iter); + } + + while (store.IterNext(ref iter)) { + if ( tree.Selection.IterIsSelected(iter)) { + store.Remove(ref iter); + } + } + return; + } + + + public void UpdateColumnText (string oldString, string newString, int column) + { + Gtk.TreeIter iter = new Gtk.TreeIter(); + + store.GetIterFirst(out iter); + // Check for a null Stamp (no initial entry in the list) + if (iter.Stamp == 0) + return; + + if ( oldString == (string)store.GetValue(iter, column)) { + GLib.Value val = new GLib.Value(newString); + store.SetValue (iter, column, val); + } + + while (store.IterNext(ref iter)) { + if ( oldString == (string)store.GetValue(iter, column)) { + GLib.Value val1 = new GLib.Value(newString); + store.SetValue (iter, column, val1); + } + } + + } + } +} diff --git a/src/hylafax.cs b/src/hylafax.cs new file mode 100755 index 0000000..54ab63f --- /dev/null +++ b/src/hylafax.cs @@ -0,0 +1,950 @@ +// GFAX - Gnome fax application +// Copyright (C) 2003 - 2008 George A. Farris +// +// 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 3 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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + // Sequence to send a file is: + // 1) Make sure we're connected + // 2) Store the filename on the server [storefile_open] + // 3) Send the file line by line + // 4) Close the stream for sending the file + // 5) For all the phone numbers do: + // a) job_new [job_new] + // b) set all job parms [job_parm_set] + // c) submit the job [submit_job] + // 6) Close the connection. + +// Properties +// string Hostname, Username, Password +// int IPPort + +//#define DEBUGHYLAFAX + +namespace gfax { + using Mono.Unix; + using System; + using System.IO; + using System.Text; //Encoding.ASCII.GetBytes + using System.Collections; + using System.Threading; + using System.Net; + using System.Net.Sockets; + + + public class Hylafax + { + TcpClient mainclient = new TcpClient(); + NetworkStream mainstream; + string host, user, pass; + int port; + bool permission; + + + public class StateObject + { + public TcpClient client = null; + public int totalBytesRead = 0; + public const int BufferSize = 256; + public string readType = null; + public byte[] buffer = new byte[BufferSize]; + public StringBuilder messageBuffer = new StringBuilder(); + } + + + // connect + // return false on sucess or true on cancel + public bool connect () + { + host = Settings.Hostname; + port = Convert.ToInt32(Settings.Port); + user = Settings.Username; + if (gfax.hylafaxPassword == null) // if we already entered a pass but + if (Settings.Password != "") // don't want to remember it it won't be null + gfax.hylafaxPassword = Settings.Password; + + if (Settings.Faxtracing == true) { + Console.WriteLine ("Initializing hylafax class ......."); + } + + try { + mainclient.Connect(host, port); + mainstream = mainclient.GetStream(); + string s = read(mainstream, mainclient); + if (Settings.Faxtracing == true) { + Console.WriteLine ("[hylafax.connect] on connect : {0}", s); + } + + + if(mainstream.CanWrite && mainstream.CanRead){ + // Write username + if (Settings.Faxtracing == true) { + Console.WriteLine ("[hylafax.connect] Sending USER : {0}", user); + } + + //If the username is null then hylafax doesn't need usernames + // TODO check the hylafax protocol about this + if (user == "") + user = "anonymous"; + + write (mainstream, "USER " + user + "\n"); + // Read result + // If the result is ("230 User logged in.") + // I don't need to send a password + // Else if the result is ("331 Password required for .") + // I must send a password. + string returndata = read(mainstream, mainclient); + + if (returndata.Substring(0,3) == "331") { + //Console.WriteLine("Password is {0}", gfax.hylafaxPassword); + for (int i = 0; i < 3; i++) { + + if (gfax.hylafaxPassword == null) { + G_Password gpass = new G_Password(); + gpass.Run(); + + if (gpass.Cancel) { + return false; // connection cancelled + } + gfax.hylafaxPassword = gpass.Password; + if (gpass.RememberPassword) + Settings.Password = gpass.Password; + gpass.Close(); + } + // 530 Login incorrect. result from bad password + //prompt for password + write (mainstream, "PASS " + gfax.hylafaxPassword + "\n"); + + string rtn = read(mainstream, mainclient); + //Console.WriteLine("Return is {0}", rtn); + if (rtn.Substring(0,3) == "230") // user is logged in + break; + else { + gfax.hylafaxPassword = null; + write (mainstream, "USER " + user + "\n"); + string rtndata = read(mainstream, mainclient); + } + } + } + + if (Settings.Faxtracing == true) { + Console.WriteLine("[hylafax.connect] USER returned : {0}", returndata); + } + } + else if (!mainstream.CanRead) { + Console.WriteLine(Catalog.GetString("You can not write data to this stream")); + mainclient.Close(); + } + else if (!mainstream.CanWrite) { + Console.WriteLine(Catalog.GetString("You can not read data from this stream")); + mainclient.Close(); + } + + return true; + } + catch (Exception e ) { + Console.WriteLine(e.ToString()); + G_Message m = new G_Message(Catalog.GetString("Could not connect to your Hylafax server.\n" + + "Check console messages for further information\n\n" + + "You might need to set a value for username.")); + return false; + } + } + + public void close () + { + mainclient.Close(); + } + + // Method status(queue) + // + // queue is the queue directory of the hylafax server it can be one of: + // 'status', 'sendq', 'doneq' or 'recvq' + // + // Return a list containing lines +/* + public string status (string queue) + { + #if DEBUGHYLAFAX + Console.WriteLine ("[hylafax.status] queue is : {0}", queue); + #endif + // try + return getfolder(queue); + } +*/ + public void asyncstatus (string queue) + { + if (Settings.Faxtracing == true) { + Console.WriteLine ("[hylafax.status] queue is : {0}", queue); + } + asyncgetfolder(queue); + } + + // send_init (string filename) + // + // 2) Store the filename on the server [storefile_open] + // 3) Send the file line by line + // 4) Close the stream for sending the file + public string send_init (string fname) + { + G_ProgressBar pbar; + TcpClient myclient; + NetworkStream mystream; + StreamReader fp = null; + string buf; + string remote_fname; + double lines = 0; + double lines_sent = 0; + double percent = 0; + + if (Settings.Faxtracing == true) { + Console.WriteLine("[Hylafax.send_init] Filename : {0}", fname); + } + + //timezone("LOCAL"); + // Setup the server and return a passive connection + // PASV, STOT + myclient = storefile_open(); + if (Settings.Faxtracing == true) { + Console.WriteLine("[Hylafax.send_init] Got tcpclient"); + } + + mystream = myclient.GetStream(); + if (Settings.Faxtracing == true) { + Console.WriteLine("[Hylafax.send_init] Stream is open"); + } + //figure out how many lines in the file for progress bar + // TODO progress bar and error + try { fp = File.OpenText(fname); } + catch (Exception e) { } + + while ( (buf = fp.ReadLine()) != null ) { + lines = lines + 1; + } + fp.Close(); + + try { fp = File.OpenText(fname); } + catch (Exception e) { } + + if (Settings.Faxtracing == true) { + Console.WriteLine("[Hylafax.send_init] File :{0} is open and has {1} lines", fname,lines); + } + + pbar = new G_ProgressBar(); + //pbar.Text = "File xmit"; + lines_sent = 1; + while ( (buf = fp.ReadLine()) != null ) { + write(mystream, buf); + write(mystream, "\n"); + lines_sent = lines_sent + 1; + percent = lines_sent / lines; + if (percent <= 1.0) + pbar.Fraction = percent; + //GLib.MainContext.Iteration (); + while (Gtk.Application.EventsPending ()) + Gtk.Application.RunIteration (); + if (pbar.Cancel) + break; + } + fp.Close(); + remote_fname = storefile_close(myclient); + + if (pbar.Cancel) { //If the transfer was cancelled + deletefile(remote_fname); + remote_fname = "cancelled"; + pbar.Close(); + } else { + pbar.Finished(); + } + + if (Settings.Faxtracing == true) { + Console.WriteLine("[Hylafax.send_init] Stream is closed, sent {0} lines",lines_sent); + } + return remote_fname; + } + + // Method send(string filename_on_server, Contact contact) + // + // Sequence to send a file is: + // a) job_new [job_new] + // b) set all job parms [job_parm_set] + // c) submit the job [submit_job] + // format send time - should be as such: + // yyyymmddhhmm + //-> JPARM SENDTIME 200403100509 + //213 SENDTIME set to 20040310050900. + public void send (string remote_fname, GfaxContact contact) + { + if (Settings.Faxtracing == true) { + Console.WriteLine("Hylafax.send] top of method..."); + } + + string emailAddress = Settings.EmailAddress; + if (Settings.Faxtracing == true) { + Console.WriteLine("Hylafax.send] email address {0}", emailAddress); + } + + string resolution = "98"; + string emailNotify = "none"; + + if (Settings.Faxtracing == true) { + Console.WriteLine("[Hylafax.send] gfax.timeToSend : {0}", gfax.timeToSend); + Console.WriteLine("[Hylafax.send] Remote file name is : {0}", remote_fname); + } + + // if this is sent from GfaxSend wizard + if (gfax.fromSendWizard) { + if (gfax.sendWizardResolution) + resolution = "196"; + + if (gfax.sendWizardEmailNotify) { + emailNotify = "done"; + emailAddress = gfax.sendWizardEmailAddress; + } + } else { + if (Settings.EmailNotify) + emailNotify = "done"; + + if (Settings.HiResolution) + resolution = "196"; + } + + // Format time to send - timezone is in UTC format. + string tts = String.Format("{0}{1:00}{2:00}{3:00}{4:00}", + gfax.timeToSend.Year, + gfax.timeToSend.Month, + gfax.timeToSend.Day, + gfax.timeToSend.Hour, + gfax.timeToSend.Minute); + + string jid = job_new(); + //TODO try catch exception here + //#item[1] is the name #item[2] is the company + + job_param_set("FROMUSER", Environment.UserName); + job_param_set("LASTTIME", "000259"); + job_param_set("SENDTIME", tts); + job_param_set("MAXDIALS", "12"); + job_param_set("MAXTRIES", "3"); + job_param_set("SCHEDPRI", "127"); + job_param_set("DIALSTRING", contact.PhoneNumber); + job_param_set("NOTIFYADDR", emailAddress); + job_param_set("VRES", resolution); + job_param_set("PAGEWIDTH", "215"); + job_param_set("PAGELENGTH", "279"); + job_param_set("NOTIFY", emailNotify); //can be "none" or "done" + job_param_set("PAGECHOP", "default"); + job_param_set("CHOPTHRESHOLD", "3"); + job_param_set("DOCUMENT", remote_fname); + job_submit(); + } + + public bool getfile (string fname) + { + G_ProgressBar pbar; + TcpClient myclient; + NetworkStream mystream; + FileStream fp; + string data; + double fsize = 0; + double totalBytes = 0; + double percent = 0; + + // get the file size for the receive progress bar + write(mainstream, String.Concat("SIZE recvq/", fname, "\n")); + data = read(mainstream, mainclient); + try { + string[] s = data.Split(); + fsize = Convert.ToDouble(s[1]); + } catch (Exception e) { + Console.WriteLine("Couldn't get file size"); + Console.WriteLine("Hylafax exception {0}", e); + return (false); + } + if (Settings.Faxtracing == true) { + Console.WriteLine("[hylafax.getfile] \"File size is : {0}", fsize); + } + + // assume we have permission to open file + permission = true; + // PASV, RETR + myclient = recvfile_open(fname); + if (Settings.Faxtracing == true) { + Console.WriteLine("[Hylafax.getfile] Got tcpclient"); + } + + mystream = myclient.GetStream(); + if (Settings.Faxtracing == true) { + Console.WriteLine("[Hylafax.getfile] Stream is open"); + } + + if (!permission) { + return (false); + } + + try { + fp = new FileStream(String.Concat(gfax.SpoolDirectory,"/tif/",fname), FileMode.Create); + } catch (Exception e) { + Console.WriteLine(e.ToString()); + return(false); + } + + byte[] bytes = new byte[256]; + + do { + try { + gfax.MainProgressBar.Fraction = percent; + while (Gtk.Application.EventsPending ()) + Gtk.Application.RunIteration (); + + int len = mystream.Read(bytes, 0, bytes.Length); + if (len > 0 ) { + totalBytes = totalBytes + len; + percent = totalBytes / fsize; + if (percent <= 1.0) + gfax.MainProgressBar.Fraction = percent; + //GLib.MainContext.Iteration (); + while (Gtk.Application.EventsPending ()) + Gtk.Application.RunIteration (); + fp.Write(bytes,0,len); + } + } catch ( Exception e ) { + Console.WriteLine(e.ToString()); + return(false); + } + // Seems if we don't sleep here for a bit, we never read + // all the data??? Maybe a Hylafax thing. + System.Threading.Thread.Sleep(1); + + } while (mystream.DataAvailable); + + fp.Close(); + recvfile_close(myclient); + + // valid file received + return(true); + } + + + + private string job_new () + { + string data; + string[] tmp; + //string jobid; + + try { + write(mainstream, "JOB default\n"); + data = read(mainstream, mainclient); + if (Settings.Faxtracing == true) { + Console.WriteLine("[hylafax.job_new] \"JOB default\" data returned : {0}", data); + } + + write(mainstream, "JNEW\n"); + data = read(mainstream, mainclient); + // data = 200 New job created: jobid: 14433 groupid: 14433. + tmp = data.Split(' '); + + if (Settings.Faxtracing == true) { + Console.WriteLine("[hylafax.job_new] \"JNEW\" data returned : {0}", data); + } + + } catch (Exception e) { + Console.WriteLine("Hylafax exception {0}", e); + return (""); + } + + // jobid might need to be Convert.ToInt32 + return tmp[5]; + } + + public void job_param_set (string pname, string pvalue) + { + string data; + + write(mainstream, "JPARM " + pname + " " + pvalue +"\n"); + data = read(mainstream, mainclient); + if (Settings.Faxtracing == true) { + Console.Write("[hylafax.job_param_set] \"JPARM\" data returned : {0}", data); + } + } + + public void job_submit () + { + string data; + + write(mainstream, "JSUBM\n"); + data = read(mainstream, mainclient); + if (Settings.Faxtracing == true) { + Console.WriteLine("[hylafax.job_submit] \"JSUBM\" data returned : {0}", data); + } + } + + private TcpClient storefile_open () + { + TcpClient myclient = new TcpClient(); + NetworkStream mystream; + IPAddress ipaddr; + int ipport; + string data; + + write(mainstream, "PASV\n"); + data = read(mainstream, mainclient); + + if (Settings.Faxtracing == true) { + Console.WriteLine("[hylafax.storefile_open] data returned : {0}", data); + } + + // dig out ip address and port for new connection + ipaddr = get_ip_addr(data); + ipport = get_ip_port(data); + if (Settings.Faxtracing == true) { + Console.WriteLine("[hylafax.storefile_open] ipaddr, port : {0}, {1}", ipaddr, ipport); + } + + try { + myclient.Connect(ipaddr, ipport); + } + catch (Exception e ) { + Console.WriteLine(e.ToString()); + // handle error here + } + + mystream = myclient.GetStream(); + write(mainstream, "STOT\n"); + if (Settings.Faxtracing == true) { + Console.WriteLine("[hylafax.storefile_open] wrote STOT"); + } + data = read(mainstream, mainclient); + //data = 150 FILE: /tmp/doc1097.ps (Opening new data connection). + if (Settings.Faxtracing == true) { + Console.WriteLine("[hylafax.storefile_open] returned from STOT : {0}", data); + } + return myclient; + } + + private string storefile_close(TcpClient tc) + { + string data; + string[] s; + string fn; + + tc.Close(); + data = read(mainstream, mainclient); + // data = 226 Transfer complete (FILE: /tmp/doc1101.ps). + // TODO error checking + + // remove white space first, Arrgggh! + fn = data.Trim(); + s = fn.Split(' '); + + return(s[4].TrimEnd(')','.')); + } + + private TcpClient recvfile_open (string fname) + { + TcpClient myclient = new TcpClient(); + NetworkStream mystream; + IPAddress ipaddr; + int ipport; + string data; + + write(mainstream, "PASV\n"); + data = read(mainstream, mainclient); + if (Settings.Faxtracing == true) { + Console.WriteLine("[hylafax.recvfile_open] data returned : {0}", data); + } + + // dig out ip address and port for new connection + ipaddr = get_ip_addr(data); + ipport = get_ip_port(data); + if (Settings.Faxtracing == true) { + Console.WriteLine("[hylafax.recvfile_open] ipaddr, port : {0}, {1}", ipaddr, ipport); + } + + try { + myclient.Connect(ipaddr, ipport); + } + catch (Exception e ) { + Console.WriteLine(e.ToString()); + // handle error here + } + + mystream = myclient.GetStream(); + write(mainstream, "TYPE I\n"); + data = read(mainstream, mainclient); + if (Settings.Faxtracing == true) { + Console.WriteLine("[hylafax.recvfile_open] data returned : {0}", data); + } + + write(mainstream, String.Concat("RETR recvq/", fname, "\n")); + if (Settings.Faxtracing == true) { + Console.WriteLine("[hylafax.recvfile_open] wrote RETR"); + } + data = read(mainstream, mainclient); + + if (data.Substring(0,3) == "550") + permission = false; + //data = returned from RETR : 550 recvq/fax000000018.tif: Operation not permitted. + //data = returned from RETR : 150 Opening new data connection for recvq/fax000000018.tif (2793 bytes). + if (Settings.Faxtracing == true) { + Console.WriteLine("[hylafax.recvfile_open] returned from RETR : {0}", data); + } + return myclient; + } + + private string recvfile_close(TcpClient tc) + { + string data; + string[] s; + string fn; + + tc.Close(); + data = read(mainstream, mainclient); + // data = 226 Transfer complete (FILE: /tmp/doc1101.ps). + // TODO error checking + + // remove white space first, Arrgggh! + //fn = data.Trim(); + //s = fn.Split(' '); + + //return(s[4].TrimEnd(')','.')); + return ""; + } + +/* + private string getfolder (string folder) + { + TcpClient myclient = new TcpClient(); + NetworkStream mystream; + IPAddress ipaddr; + int ipport; + string jobfmt; + + write(mainstream, "PASV\n"); + string data = read(mainstream, mainclient); + + // dig out ip address and port for new connection + ipaddr = get_ip_addr(data); + ipport = get_ip_port(data); + + try { + myclient.Connect(ipaddr, ipport); + } + catch (Exception e ) { + Console.WriteLine(e.ToString()); + // handle error here + } + + mystream = myclient.GetStream(); + /* + RCVFMT (receive) + %4p%1z %14.14s %7t %f + p - number of pages + z - * if still receiving, otherwise + s - sender (TIS) + t - time received + f - filename + + 1= =Malaspina Univ=16Oct06=fax000000018.tif + + JOBFMT (send, done) + j - Job identifier + e - Phone number + a - Job state (one-character symbol) + o - Job owner + P - # pages transmitted/total # pages to transmit + D - Total # dials/maximum # dials + s - Job status information from last failure + Y - Scheduled date and time + */ +/* // set the job format string + if (folder == "doneq" || folder == "sendq") { + jobfmt = "\"%-4j=%-14e=%1a=%-12o=%-5P=%-5D=%.35s=%-19Y\""; + write(mainstream, "JOBFMT "+jobfmt+"\n"); + data = read(mainstream, mainclient); + } + if (folder == "recvq") { + jobfmt = "\"%4p=N%1z=%14.14s=%7t=%f\""; + write(mainstream, "RCVFMT "+jobfmt+"\n"); + data = read(mainstream, mainclient); + } + write(mainstream, "LIST "+folder+"\n"); + data = read(mystream, myclient); + + + #if DEBUGHYLAFAX + Console.WriteLine("[hylafax.getfolder] list folder data : {0}", data); + Console.WriteLine("[hylafax.getfolder] data length : {0}", data.Length); + #endif + + myclient.Close(); + return data; + } +*/ + + private void asyncgetfolder (string folder) + { + TcpClient myclient = new TcpClient(); + IPAddress ipaddr; + int ipport; + string jobfmt; + + write(mainstream, "PASV\n"); + string data = read(mainstream, mainclient); + + // dig out ip address and port for new connection + ipaddr = get_ip_addr(data); + ipport = get_ip_port(data); + + try { + myclient.Connect(ipaddr, ipport); + } + catch (Exception e ) { + Console.WriteLine(e.ToString()); + // handle error here + } + + /* + RCVFMT (receive) + %4p%1z %14.14s %7t %f + p - number of pages + z - * if still receiving, otherwise + s - sender (TIS) + t - time received + f - filename + + 1= =Malaspina Univ=16Oct06=fax000000018.tif + + JOBFMT (send, done) + j - Job identifier + e - Phone number + a - Job state (one-character symbol) + o - Job owner + P - # pages transmitted/total # pages to transmit + D - Total # dials/maximum # dials + s - Job status information from last failure + Y - Scheduled date and time + */ + // set the job format string + if (folder == "doneq" || folder == "sendq") { + jobfmt = "\"%-4j=%-14e=%1a=%-12o=%-5P=%-5D=%.35s=%-19Y\""; + write(mainstream, "JOBFMT "+jobfmt+"\n"); + data = read(mainstream, mainclient); + } + if (folder == "recvq") { + jobfmt = "\"%4p=N%1z=%28.28s=%7t=%f\""; + write(mainstream, "RCVFMT "+jobfmt+"\n"); + data = read(mainstream, mainclient); + } + write(mainstream, "LIST "+folder+"\n"); + //data = read(mystream, myclient); + asyncread(myclient, folder); + } + + private IPAddress get_ip_addr (string ipdata) + { + int index = ipdata.IndexOf("("); + int len = ipdata.IndexOf(")") - index; + string s = ipdata.Substring(index + 1, len - 1 ); + char[] splitter = {','}; + string[] sa = s.Split(splitter); + string sipaddr = String.Concat(sa[0],".",sa[1],".",sa[2],".",sa[3]); + return IPAddress.Parse(sipaddr); + } + + private int get_ip_port (string ipdata) + { + // find port returned + int index = ipdata.IndexOf("("); + int len = ipdata.IndexOf(")") - index; + string s = ipdata.Substring(index + 1, len - 1 ); + char[] splitter = {','}; + string[] sa = s.Split(splitter); + return (Convert.ToInt32(sa[4]) * 256 + Convert.ToInt32(sa[5])); + } + + + private void write (NetworkStream sock, string s) + { + byte[] bytes = Encoding.ASCII.GetBytes(s); + sock.Write(bytes, 0, bytes.Length); + } + + + private string read (NetworkStream str, TcpClient c) + { + StringBuilder buf = new StringBuilder(); + byte[] bytes = new byte[256]; + + do { + try { + int len = str.Read(bytes, 0, bytes.Length); + if (len > 0 ) { + buf.Append(Encoding.ASCII.GetString(bytes,0,len)); + } + } catch ( Exception e ) { + Console.WriteLine("Network IO problem " + e.ToString()); + } + // Seems if we don't sleep here for a bit, we never read + // all the data??? Maybe a Hylafax thing. + System.Threading.Thread.Sleep(5); + + } while (str.DataAvailable); + return (buf.ToString()); + } + + + //public void asyncread (TcpClient sock, string readType) + private void asyncread (TcpClient sock, string readType) + { + gfax.activeNetwork = true; + if (readType == "status") { + gfax.asyncServerMessageBuffer = ""; + } else { + gfax.asyncFolderMessageBuffer = ""; + } + + StateObject state = new StateObject(); + state.client = sock; + state.readType = readType; + NetworkStream stream = sock.GetStream(); + + if (stream.CanRead) { + try { + IAsyncResult ar = stream.BeginRead (state.buffer, 0, StateObject.BufferSize, + new AsyncCallback(myReadCallBack), state); + } catch ( Exception e ) { + Console.WriteLine("Network IO problem " + e.ToString()); + } + } + } + + + //======================================================== + //public static void myReadCallBack(IAsyncResult ar ) + private static void myReadCallBack(IAsyncResult ar ) + { + int numberOfBytesRead; + StateObject state = (StateObject) ar.AsyncState; + NetworkStream mas = state.client.GetStream(); + string type = null; + + numberOfBytesRead = mas.EndRead(ar); + state.totalBytesRead += numberOfBytesRead; + + //Console.WriteLine("Byes read ---------------> {0}", numberOfBytesRead); + if ( numberOfBytesRead > 0) { + state.messageBuffer.Append(Encoding.ASCII.GetString(state.buffer, 0, numberOfBytesRead)); + mas.BeginRead(state.buffer, 0, StateObject.BufferSize, + new AsyncCallback(myReadCallBack), state); + } else { + mas.Close(); + state.client.Close(); + //Console.WriteLine("Byes read ---------------> {0}", state.totalBytesRead); + //Console.WriteLine("You received the following message : {0} " + state.messageBuffer); + if (state.readType == "status") { + gfax.asyncServerMessageBuffer = state.messageBuffer.ToString(); + } else { + gfax.asyncFolderMessageBuffer = state.messageBuffer.ToString(); + } + gfax.asyncReadType = state.readType; + mas = null; + state = null; + gfax.activeNetwork = false; + } + } + + public void job_select (string jobid) + { + write(mainstream, "JOB " + jobid + "\n"); + string s = read(mainstream, mainclient); + #if DEBUGHYLAFAX + Console.WriteLine("[hylafax.select] returned: {0}", s); + #endif + } + + public void job_kill () + { + write (mainstream, "JKILL\n"); + string s = read(mainstream, mainclient); + #if DEBUGHYLAFAX + Console.WriteLine("[hylafax.kill] returned: {0}", s); + #endif + } + + public void job_delete () + { + write (mainstream, "JDELE\n"); + string s = read(mainstream, mainclient); + #if DEBUGHYLAFAX + Console.WriteLine("[hylafax.delete] returned: {0}", s); + #endif + } + + public void job_suspend () + { + write (mainstream, "JSUSP\n"); + string s = read(mainstream, mainclient); + if (Settings.Faxtracing == true) { + Console.WriteLine("[hylafax.suspend] returned: {0}", s); + } + } + + // Returns + // 550 fax000000019.tif: Operation not permitted. + // + public int deletefile (string name) + { + write (mainstream, String.Concat("DELE ", "recvq/", name, "\n")); + string s = read(mainstream, mainclient); + if (s.Substring(0,3) == "550") + return(1); + if (Settings.Faxtracing == true) { + Console.WriteLine("[hylafax.deletefile] returned: {0}", s); + } + return (0); + } + + + private void job_param (string parms) + { + write (mainstream, "JPARM " + parms + "\n"); + string s = read(mainstream, mainclient); + #if DEBUGHYLAFAX + Console.WriteLine("[hylafax.param] returned: {0}", s); + #endif + } + + public void job_reset (string parms) + { + write (mainstream, "JREST " + parms + "\n"); + string s = read(mainstream, mainclient); + if (Settings.Faxtracing == true) { + Console.WriteLine("[hylafax.reset] returned: {0}", s); + } + + } + + + private void timezone (string name) // can be "LOCAL" or "GMT" + { + write (mainstream, "TZONE " + name + "\n"); + string s = read(mainstream, mainclient); + if (Settings.Faxtracing == true) { + Console.WriteLine("[hylafax.timezone] returned: {0}", s); + } + } + } +} diff --git a/src/main.cs b/src/main.cs new file mode 100644 index 0000000..e44b897 --- /dev/null +++ b/src/main.cs @@ -0,0 +1,243 @@ +// GFAX - Gnome fax application +// Copyright (C) 2003 - 2008 George A. Farris +// +// 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 3 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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +namespace gfax { + using GLib; + using Gtk; + using GtkSharp; + using Mono.Unix; + using System; + using System.IO; + using System.Collections; + using System.Text; //Encoding.ASCII.GetBytes + using System.Threading; + using System.Diagnostics; + + + + public class gfax + { + // Gfax Global variables ( ya, ya I know) + // + // list of contacts of type Contact to xmit, we use this everywhere so it is + // simpler to make it public and global. + public static ArrayList Destinations = new ArrayList(); + public static DateTime timeToSend; + public static bool quitAfterSend = false; + public static bool fromSendWizard = false; + public static bool sendWizardResolution = false; + public static bool sendWizardEmailNotify = false; + public static string sendWizardEmailAddress = null; + public static string hylafaxPassword = null; + public static string ConfigDirectory = null; + public static string SpoolDirectory = null; + public static bool activeNetwork = false; + public static Gnome.AppBar GAppbar = null; + public static Gtk.ProgressBar MainProgressBar = null; + public static Gtk.TextBuffer GStatusTextBuffer = null; + public static Gtk.Window MainWindow = null; + public static string asyncFolderMessageBuffer = ""; + public static string asyncServerMessageBuffer = ""; + public static string asyncReadType = ""; + + public static Efax efax; + public static Status Status; + public static Pulser Pulser; + + public static string filename = null; + public static string[] pargs; + + const bool TOPLEVEL = true; + + + public static void Main (string[] args) + { + + string HOMEDIR = Environment.GetEnvironmentVariable("HOME"); + string USER = Environment.GetEnvironmentVariable("USER"); + ConfigDirectory = HOMEDIR + "/.config/gfax"; + SpoolDirectory = HOMEDIR + "/.local/share/gfax/spool"; + pargs = args; + + // TODO put this is try/catch + if ( !Directory.Exists(ConfigDirectory)) { + if ( !Directory.Exists(HOMEDIR + "/.config")) { + Directory.CreateDirectory(HOMEDIR + "/.config"); + } + // Move data from old ~/.etc directory + if ( Directory.Exists(HOMEDIR + "/.etc/gfax")) { + Directory.Move(HOMEDIR + "/.etc/gfax", ConfigDirectory); + } else { + Directory.CreateDirectory(ConfigDirectory); + } + } + if ( !Directory.Exists(HOMEDIR + "/.local/share/gfax/spool") ) { + if ( !Directory.Exists(HOMEDIR + "/.local/share/gfax") ) { + if ( !Directory.Exists(HOMEDIR + "/.local/share") ) { + if ( !Directory.Exists(HOMEDIR + "/.local") ) + Directory.CreateDirectory(HOMEDIR + "/.local"); + Directory.CreateDirectory(HOMEDIR + "/.local/share"); + } + Directory.CreateDirectory(HOMEDIR + "/.local/share/gfax"); + } + Directory.CreateDirectory(HOMEDIR + "/.local/share/gfax/spool"); + Directory.CreateDirectory(HOMEDIR + "/.local/share/gfax/spool/doneq"); + Directory.CreateDirectory(HOMEDIR + "/.local/share/gfax/spool/recq"); + } + + // Clean out the spool/tif directory - incoming faxes + if ( !Directory.Exists(HOMEDIR + "/.local/share/gfax/spool/tif")) { + Directory.CreateDirectory(HOMEDIR + "/.local/share/gfax/spool/tif"); + } else { + Directory.Delete(HOMEDIR + "/.local/share/gfax/spool/tif/", true); + Directory.CreateDirectory(HOMEDIR + "/.local/share/gfax/spool/tif"); + } + + + + // Initialize GETTEXT + Catalog.Init ("gfax", Defines.GNOME_LOCALE_DIR); + + // handle command line args ourselves + for (int i=0; i < args.Length; i++ ) { + //Console.WriteLine("{0} {1}", i, args[i]); + switch (args[i]) + { + case "--help" : + Console.WriteLine (Catalog.GetString("Gfax help...")); + Console.WriteLine ("Gfax spool dir -> {0}", SpoolDirectory); + break; + case "-f" : // file name is present + filename = args[i+1]; + break; + //case "-q" : // immediately quit after sending fax + // filename = args[i+1]; + // break; + default: + if (File.Exists(args[i])) + filename = args[i]; + break; + } + } + + try { + if ( Settings.RunSetupAtStart ) { + // Set some default preferences. + Settings.TransmitAgent = "efax"; + Settings.SendNow = true; + Settings.EfaxModemDevice = "ttyS0"; + Settings.RefreshQueueInterval = 15; + Settings.RefreshQueueEnabled = true; + } + } catch (Exception e) { + //TODO HIG love required + G_Message gm = new G_Message( + Catalog.GetString( +@"Gconfd cannot find your settings. +If you are running Gfax immediately +after an installation, you may have +to log out and log back in again."), TOPLEVEL); + Console.WriteLine("Exception in main.cs {0}", e); + Environment.Exit(0); + } + + // If we have a file name run the send dialog + if (filename != null) { + GfaxSend sd = new GfaxSend (filename, args); + FileInfo f = new FileInfo(filename); + + // send the faxes + if (sd.DoSend) { + fromSendWizard = true; + + // Start the fax daemon if efax + if (Settings.TransmitAgent == "efax") { + efax = new Efax(); + efax.run_efaxd(); + } + + Fax.sendfax(filename); + // delete the spool file (~.local/share/gfax/spool/D.*) + if (File.Exists(String.Concat(SpoolDirectory, "/", f.Name))) + File.Delete(String.Concat(SpoolDirectory, "/", f.Name)); + + //if (!quitAfterSend) { + //Gfax gf = new Gfax (filename, args); + //} + } + + // delete the spool file that gfaxlpr created if it exists + if (File.Exists(String.Concat("/var/spool/gfax/", USER, "/", f.Name))) + File.Delete(String.Concat("/var/spool/gfax/", USER, "/", f.Name)); + + }else { + // check to see if we've run before, if so gfax will be there + + if ( !Directory.Exists("/var/spool/gfax/" + USER)) { + Directory.CreateDirectory("/var/spool/gfax/" + USER); + } + + FileSystemWatcher watcher = new FileSystemWatcher(); + watcher.Path = "/var/spool/gfax/" + USER; + + watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite + | NotifyFilters.FileName | NotifyFilters.DirectoryName; + // Only watch text files. + watcher.Filter = "*"; + watcher.Created += new FileSystemEventHandler(TIOnChanged); + // Begin watching. + watcher.EnableRaisingEvents = true; + + // Start the fax daemon if efax + if (Settings.TransmitAgent == "efax") { + efax = new Efax(); + efax.run_efaxd(); + } + + Gfax gf = new Gfax (filename, args); + } + + } + + // Define the event handlers. + private static void TIOnChanged(object source, FileSystemEventArgs e) + { + // Specify what is done when a file is changed, created, or deleted. + Console.WriteLine("File---: " + e.FullPath + " " + e.ChangeType); + //GfaxSend sd = new GfaxSend ("/home/george/log.txt", pargs); + + quitAfterSend = true; + + ProcessStartInfo pidInfo = new ProcessStartInfo(); + pidInfo.FileName = "gfax"; + + pidInfo.Arguments = String.Concat("-f ",e.FullPath + " " + e.ChangeType); + + if (Settings.Faxtracing == true) { + if (Settings.TransmitAgent == "efax") { + Console.WriteLine("[Efax.send_init]\n {0}", pidInfo.Arguments); + } + } + + System.Diagnostics.Process pid = System.Diagnostics.Process.Start(pidInfo); + pid.WaitForExit(); + + + } + + } +} diff --git a/src/newphonebook.cs b/src/newphonebook.cs new file mode 100755 index 0000000..1424977 --- /dev/null +++ b/src/newphonebook.cs @@ -0,0 +1,187 @@ +// GFAX - Gnome fax application +// Copyright (C) 2003 - 2008 George A. Farris +// +// 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 3 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +//************************************************************************ +// NewPhoneBook class +// +// A new phone book druid, should make it easier for people to create +// new phone books. The old way was a little confusing. +// + +namespace gfax { + using Mono.Unix; + using System; + using System.IO; + using GLib; + using Gtk; + using Gnome; + using Glade; + using GConf.PropertyEditors; + using GtkSharp; + using System.Runtime.InteropServices; + using System.Collections; + using System.Diagnostics; + using System.Reflection; + + public class NewPhoneBook + { + [Glade.Widget] Gtk.Dialog NewPhoneBookDialog; + [Glade.Widget] Gnome.Druid NewPhoneBookDruid; + [Glade.Widget] Gnome.DruidPage EvoDruidPageStandard; + [Glade.Widget] Gnome.DruidPage druidpagestandard12; + [Glade.Widget] Gtk.RadioButton GfaxRadioButton; + [Glade.Widget] Gtk.RadioButton EvolutionRadioButton; + [Glade.Widget] Gtk.RadioButton DatabaseRadioButton; + [Glade.Widget] Gtk.RadioButton LDAPRadioButton; + [Glade.Widget] Gtk.Entry NewPhoneBookNameEntry; + [Glade.Widget] Gtk.TreeView EvolutionTreeView; + + // Properties + ArrayList booknames; + string phonebooktype; + + Gtk.ListStore store; + G_ListView view; + + const int COLUMN_0 = 0; + const int COLUMN_1 = 1; + + public NewPhoneBook () + { + booknames = new ArrayList(); + + Glade.XML xml = new Glade.XML (null, "gfax.glade","NewPhoneBookDialog",null); + xml.Autoconnect (this); + + GfaxRadioButton.Active = true; + + EvolutionRadioButton.Sensitive = true; + // turn these off until somewhere near supported + DatabaseRadioButton.Visible = false; + LDAPRadioButton.Visible = false; + + store = new ListStore( + typeof (Boolean), + typeof (string)); + + view = new G_ListView(EvolutionTreeView, store); + + view.AddColumnTitleToggle(Catalog.GetString("Use"), 0, COLUMN_0); + view.AddColumnTitle(Catalog.GetString("Phone Book"), 0, COLUMN_1); + + EvolutionTreeView.HeadersVisible = true; + + NewPhoneBookDruid.ShowAll(); + } + + public ArrayList PhoneBookNames + { + get { return booknames; } + } + + public string PhoneBookType + { + get { return phonebooktype; } + } + + public void Run() + { + NewPhoneBookDialog.Run(); + } + + private void on_NewPhoneBookDialog_delete_event (object o, DeleteEventArgs args) + { + NewPhoneBookDialog.Hide(); + NewPhoneBookDialog.Dispose(); + args.RetVal = true; + } + + private void on_NewPhoneBookDruidEdge_finish (object o, Gnome.FinishClickedArgs args) + { + + if (GfaxRadioButton.Active) { + phonebooktype = "gfax"; + booknames.Add( NewPhoneBookNameEntry.Text ); + } else if (EvolutionRadioButton.Active) { + phonebooktype = "evolution"; + + Gtk.TreeIter iter = new Gtk.TreeIter(); + + // Get the first row. + store.GetIterFirst(out iter); + + try { + if ( (bool)store.GetValue(iter, 0) ) { // if use is true (toggle set) + booknames.Add( (string)store.GetValue(iter, 1) ); + } + } catch (Exception e) {} + + // get the rest of the rows + while (store.IterNext(ref iter)) { + + try { + if ( (bool)store.GetValue(iter, 0) ) { + booknames.Add( (string)store.GetValue(iter, 1) ); + } + } + catch (Exception e) {} + } + } + else if (DatabaseRadioButton.Active) + phonebooktype = "sql"; + else if (LDAPRadioButton.Active) + phonebooktype = "ldap"; + + NewPhoneBookDialog.Hide(); + NewPhoneBookDialog.Dispose(); + } + + private void on_NewPhoneBookDruid_cancel (object o, EventArgs args) + { + NewPhoneBookDialog.Hide(); + NewPhoneBookDialog.Dispose(); + } + + private void on_druidpagestandard12_next (object o, Gnome.NextClickedArgs args) + { + // we're on the gfax phone book enter name pages + // skip to finish on next signal + NewPhoneBookDruid.Page = EvoDruidPageStandard; + } + + + private void on_BookDruidPageStandard_next (object o, Gnome.NextClickedArgs args) + { + // skip next page if active + if (EvolutionRadioButton.Active) { + NewPhoneBookDruid.Page = druidpagestandard12; + + EdsPhoneBooks eds = new EdsPhoneBooks(); + ArrayList ebooks = new ArrayList(); + ebooks = eds.GetPhoneBooks(); + + Gtk.TreeIter iter = new Gtk.TreeIter(); + + IEnumerator enu = ebooks.GetEnumerator(); + while ( enu.MoveNext() ) { + iter = store.AppendValues(false, enu.Current); + EvolutionTreeView.Model = store; + } + } + } + } +} diff --git a/src/phonebook.cs b/src/phonebook.cs new file mode 100755 index 0000000..fbb8621 --- /dev/null +++ b/src/phonebook.cs @@ -0,0 +1,386 @@ +// GFAX - Gnome fax application +// Copyright (C) 2003 - 2008 George A. Farris +// +// 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 3 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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +namespace gfax { + using Mono.Unix; + using System; + using System.IO; + using System.Text; + using System.Collections; + + // Phone book that holds multiple numbers + public class Phonebook + { + public string Name; //Name book is called by + public string Path; //Filename including path + public string Type; // Type of phone book (gfax,gcard etc) + } + + // Individual contact in phone book + public class GfaxContact + { + public string Organization; + public string PhoneNumber; + public string ContactPerson; + } + + public class Phonetools + { + public static Phonebook[] get_phonebooks () + { + StreamReader infile = null; + string buf; + bool migrate = false; + + Phonebook[] pbooks = null; + + // TODO get location from gconf + string HOMEDIR = Environment.GetEnvironmentVariable("HOME"); + string PHONEBOOKS = gfax.ConfigDirectory + "/phonebooks"; + + #if DEBUG + Console.WriteLine("[Phonebook] Reading phonebook file"); + #endif + + int numberOfBooks = get_number_of_books(); + pbooks = new Phonebook[numberOfBooks]; + + if (numberOfBooks == 0) { + return (pbooks); + } + + + try { + infile = File.OpenText(PHONEBOOKS); + int i = 0; + + while ( (buf = infile.ReadLine()) != null ) { + switch (buf.Trim()) { + case "" : + // TODO more robust file reading + Phonebook c = new Phonebook(); + c.Name = strip_tag(infile.ReadLine(), "name"); + c.Type = strip_tag(infile.ReadLine(), "type"); + c.Path = strip_tag(infile.ReadLine(), "path"); + + // Migrate from old location + if (c.Type == "gfax") { + if (Path.GetDirectoryName(c.Path) == HOMEDIR + "/.etc/gfax") { + c.Path = gfax.ConfigDirectory + "/" + Path.GetFileName(c.Path); + migrate = true; + } + } + + pbooks[i++] = c; + continue; + } + } + + infile.Close(); + if (migrate) + save_phonebooks(pbooks); + return pbooks; + } + catch (Exception e) { + Console.WriteLine("get_phonebooks - Exception in phonebook.cs {0}", e); + return pbooks; + } + + } + + // save or create phonebooks files + public static void save_phonebooks (Phonebook[] pbooks) + { + StreamWriter outfile; + + // TODO get location from gconf + string PHONEBOOKS = gfax.ConfigDirectory + "/phonebooks"; + + try { + outfile = File.CreateText(PHONEBOOKS); + } catch (Exception e) { + Console.WriteLine("Exception in phonebook.cs {0}", e); + return; + } + + outfile.WriteLine(""); + Console.WriteLine("Len :{0}", pbooks.Length); + foreach (Phonebook p in pbooks) { + outfile.WriteLine(" "); + outfile.WriteLine(" " + p.Name + ""); + outfile.WriteLine(" " + p.Type + ""); + outfile.WriteLine(" " + p.Path + ""); + outfile.WriteLine(" "); + } + outfile.WriteLine(""); + outfile.Close(); + } + + public static void delete_book (string book) + { + StreamReader infile = null; + string buf; + string deleteme = null; + Phonebook[] pbooks = null; + + // make array size less 1 because we're deleting 1 + pbooks = new Phonebook[get_number_of_books() - 1]; + + // TODO get location from gconf + string PHONEBOOKS = gfax.ConfigDirectory + "/phonebooks"; + string type = ""; + try { + infile = File.OpenText(PHONEBOOKS); + int i = 0; + + // iterate through the phonebook file and skip past book to delete + while ( (buf = infile.ReadLine()) != null ) { + switch (buf.Trim()) { + case "" : + // TODO more robust file reading + Phonebook c = new Phonebook(); + c.Name = strip_tag(infile.ReadLine(), "name"); + c.Type = strip_tag(infile.ReadLine(), "type"); + c.Path = strip_tag(infile.ReadLine(), "path"); + + if (c.Name != book) + pbooks[i++] = c; + else { + deleteme = c.Path; + type = "gfax"; + } + continue; + } + } + infile.Close(); + save_phonebooks(pbooks); + + if (type == "gfax") + if (File.Exists(deleteme)) + File.Delete(deleteme); + } + catch (Exception e) { + Console.WriteLine("delete_book - Exception in phonebook.cs {0}", e); + return; + } + } + + // Create or add the new phone book to the "phonebooks" file. + public static void add_book (Phonebook p) + { + StreamReader infile = null; + string buf; + Phonebook[] pbooks = null; + + // make array plus 1 because we're adding 1 + pbooks = new Phonebook[get_number_of_books() + 1]; + + // TODO get location from gconf + string PHONEBOOKS = gfax.ConfigDirectory + "/phonebooks"; + + if (p.Type == "gfax") { + // add default path if not specified + if (Path.GetDirectoryName(p.Path) == "") + p.Path = gfax.ConfigDirectory + p.Path; + } + // Create the file. + if (!File.Exists(PHONEBOOKS)) { + FileStream fs = File.Create(PHONEBOOKS); + fs.Close(); + } + + int i = 0; + try { + infile = File.OpenText(PHONEBOOKS); + + while ( (buf = infile.ReadLine()) != null ) { + switch (buf.Trim()) { + case "" : + // TODO more robust file reading + Phonebook c = new Phonebook(); + c.Name = strip_tag(infile.ReadLine(), "name"); + c.Type = strip_tag(infile.ReadLine(), "type"); + c.Path = strip_tag(infile.ReadLine(), "path"); + + pbooks[i++] = c; + continue; + } + } + infile.Close(); + } + catch (Exception e) { + // TODO catch file ops error + Console.WriteLine("add_book - Exception in phonebook.cs {0}", e); + return; + } + + + pbooks[i++] = p; // add the new book + save_phonebooks(pbooks); + } + + // save a list (ArrayList) of contacts + public static void save_phonebook_items (string book, ArrayList contacts) + { + Phonebook p; + StreamWriter outfile; + + p = get_book_from_name(book); + + if (p.Type == "gfax") { + // TODO error reporting + try { outfile = File.CreateText(p.Path); } + catch (Exception e) { + Console.WriteLine("save_phonebook_items - Exception in phonebook.cs {0}", e); + return; + } + + outfile.WriteLine("#Gfax phone book"); + + IEnumerator enu = contacts.GetEnumerator(); + while ( enu.MoveNext() ) { + GfaxContact c = new GfaxContact(); + c = (GfaxContact)enu.Current; + outfile.WriteLine("{0}:{1}:{2}",c.PhoneNumber,c.ContactPerson,c.Organization); + } + outfile.Close(); + } + } + + public static StreamReader open_phonebook (Phonebook p) + { + StreamReader infile = null; + + // If it doesn't exist yet just return + if (!File.Exists(p.Path)) + return(null); + + try { + infile = File.OpenText(p.Path); + } + catch (Exception e) { + Console.WriteLine("open_phonebook - Exception in phonebook.cs {0}", e); + return null; + } + return infile; + } + + public static ArrayList get_contacts (Phonebook p) + { + string buf = null; + string[] sa; + //char[] ca = {':',':',':'}; delete me + + ArrayList records = new ArrayList(); + StreamReader fp = null; + + // TODO add popup message + if ( p.Type == "gfax" ) { + fp = open_phonebook(p); + if (fp == null) { + Console.WriteLine(Catalog.GetString("Can't open file : {0}"), p.Path); + return records; + } + + while ( (buf = fp.ReadLine()) != null ) { + buf.Trim(); + + if (buf[0] == '#') + continue; + else { + sa = buf.Split(':'); + GfaxContact contact = new GfaxContact(); + contact.PhoneNumber = sa[0]; + contact.ContactPerson = sa[1]; + contact.Organization = sa[2]; + records.Add(contact); + } + } + + fp.Close(); + } + + if ( p.Type == "evolution" ) { + EdsPhoneBooks eds = new EdsPhoneBooks(); + ArrayList ebooks = new ArrayList(); + ebooks = eds.GetPhoneBooks(); + + IEnumerator enu = ebooks.GetEnumerator(); + while ( enu.MoveNext() ) { + if ((string)enu.Current == p.Name) { + records = eds.GetContacts((string)enu.Current); + } + } + } + + return records; + + } + + public static string strip_tag (string line, string tag) + { + string bt = "<" + tag + ">"; + string et = ""; + string s = (line.Trim()).Replace(bt, ""); + return s.Replace(et, ""); + } + + private static int get_number_of_books () + { + StreamReader infile = null; + string buf; + int count = 0; + + // TODO get location from gconf + string PHONEBOOKS = gfax.ConfigDirectory + "/phonebooks"; + + if (!File.Exists(PHONEBOOKS)) + return(0); + + try { + infile = File.OpenText(PHONEBOOKS); + } catch (Exception e) { + Console.WriteLine("get_number_of_books - Exception in phonebook.cs {0}", e); + return 0; + } + + // how many phone books do we have, Trim() removes white space + while ( (buf = infile.ReadLine()) != null ) { + if ( buf.Trim() == "") { + count++; + } + } + infile.Close(); + return count; + } + + public static Phonebook get_book_from_name(string name) + { + Phonebook[] books; + //int count; delete me + + //count = get_number_of_books(); delete me + books = get_phonebooks(); + + foreach (Phonebook p in books) { + if (name == p.Name) + return p; + } + return null; + } + } +} diff --git a/src/sendphonebook.cs b/src/sendphonebook.cs new file mode 100755 index 0000000..cc1dc62 --- /dev/null +++ b/src/sendphonebook.cs @@ -0,0 +1,242 @@ +// GFAX - Gnome fax application +// Copyright (C) 2003 - 2008 George A. Farris +// +// 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 3 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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +namespace gfax { + using Mono.Unix; + using System; + using System.IO; + using GLib; + using Gtk; + using Gnome; + using Glade; + using GtkSharp; + using System.Runtime.InteropServices; + using System.Collections; + using System.Reflection; + + //************************************************************************ + // GfaxSendPhoneBook class + // + // + // + public class GfaxSendPhoneBook + { + Gtk.Dialog phbd; + Gtk.TreeView book, list; + //Gtk.TreeModel book_model; delete me + Gtk.ListStore book_store, list_store; + G_ListView bs, ls; + Glade.XML gsxml; + + [Glade.Widget] Gtk.Dialog PhbookDialog; + [Glade.Widget] Gtk.TreeView book_treeview; + [Glade.Widget] Gtk.TreeView list_treeview; + + const int COLUMN_0 = 0; + const int COLUMN_1 = 1; + const int COLUMN_2 = 2; + const int ALL_COLUMNS = -1; + //string parent; delete me + Phonebook[] myPhoneBooks; + + public GfaxSendPhoneBook (Glade.XML xml, string myparent) + { + + //Phonebook[] pb; delete me + + //gxml = xml; + //parent = myparent; delete me + myPhoneBooks = Phonetools.get_phonebooks(); + + if ( myPhoneBooks == null ) { + G_Message m = new G_Message(Catalog.GetString("You don't have any phone books yet.")); + m = null; + return; + } + + gsxml = new Glade.XML (null, "send-druid.glade","PhbookDialog",null); + gsxml.Autoconnect (this); + + // Get the widget so we can manipulate it + //phbd = (Gtk.Dialog) gsxml.GetWidget("PhbookDialog"); + //book = (Gtk.TreeView) gsxml.GetWidget("book_treeview"); + //list = (Gtk.TreeView) gsxml.GetWidget("list_treeview"); + phbd = PhbookDialog; + book = book_treeview; + list = list_treeview; + + book.Selection.Changed += new EventHandler (on_book_treeview_selection); + + phbd.Resizable = true; + book_store = new ListStore(typeof(string)); + book.HeadersVisible = false; + book.Selection.Mode = SelectionMode.Multiple; + + bs = new G_ListView(book, book_store); + // Got have a column title or things won't show up + bs.AddColumnTitle(Catalog.GetString("Phone books"), 0, COLUMN_0); + + + list_store = new ListStore( + typeof (string), + typeof (string), + typeof (string)); + + ls = new G_ListView(list, list_store); + ls.AddColumnTitle(Catalog.GetString("Organization"), 0, COLUMN_0); + ls.AddColumnTitle(Catalog.GetString("Phone Number"), 1, COLUMN_1); + ls.AddColumnTitle(Catalog.GetString("Contact"), 2, COLUMN_2); + list.HeadersVisible = true; + list.Selection.Mode = SelectionMode.Multiple; + + // populate the list + foreach (Phonebook p in myPhoneBooks) + bs.AddTextToRow(p.Name); + + phbd.Run(); + } + + // load the phone book + // Since we have SelectionMode.Multiple turned on we have to + // jump through these hoops in GTK-2.0 to get a selection + private void on_book_treeview_selection(object o, EventArgs args) + { + Gtk.TreeIter iter = new Gtk.TreeIter(); + //Value value = new Value(); delete me + string selectionText = null; + + book_store.GetIterFirst(out iter); + if ( book.Selection.IterIsSelected(iter)) { + selectionText = (string)book_store.GetValue(iter, 0); + } + + while (book_store.IterNext(ref iter)) { + if ( book.Selection.IterIsSelected(iter)) { + selectionText = (string)book_store.GetValue(iter, 0); + } + } + + // Ok now we can finally load the phone book + foreach (Phonebook p in myPhoneBooks) + if (p.Name == selectionText) + load_phone_book(p); + + } + + // If we double click the phonebook. + private void on_book_treeview_row_activated(object o, RowActivatedArgs args) + { + /* + ArrayList bsdest = new ArrayList(); + ArrayList contacts = new ArrayList(); + + bsdest = bs.GetSelections(COLUMN_0); + if ( bsdest.Count > 0 ) { + IEnumerator enu = bsdest.GetEnumerator(); + while ( enu.MoveNext() ) { + foreach (Phonebook p in myPhoneBooks) + if (p.Name == (string)enu.Current) + contacts = Phonetools.get_contacts(p); + + // add contacts to global desinations + IEnumerator enuc = contacts.GetEnumerator(); + while ( enuc.MoveNext() ) + gfax.Destinations.Add((Contact)enuc.Current); + } + } + + phbd.Destroy(); + */ + } + + + private void on_list_treeview_row_activated(object o, RowActivatedArgs args) + { + } + + private void on_ok_button_clicked(object o, EventArgs args) + { + ArrayList lsdest = new ArrayList(); + ArrayList bsdest = new ArrayList(); + ArrayList contacts = new ArrayList(); + + lsdest = ls.GetSelections(ALL_COLUMNS); + + // if there are indiviual entries don't do entire phonebooks + if (lsdest.Count > 0) { + IEnumerator enu = lsdest.GetEnumerator(); + while ( enu.MoveNext() ) { + GfaxContact c = new GfaxContact(); + c.Organization = (string)enu.Current; + enu.MoveNext(); + c.PhoneNumber = (string)enu.Current; + enu.MoveNext(); + c.ContactPerson = (string)enu.Current; + gfax.Destinations.Add(c); + } + } + else { + bsdest = bs.GetSelections(COLUMN_0); + if ( bsdest.Count > 0 ) { + IEnumerator enu = bsdest.GetEnumerator(); + while ( enu.MoveNext() ) { + foreach (Phonebook p in myPhoneBooks) + if (p.Name == (string)enu.Current) + contacts = Phonetools.get_contacts(p); + + // add contacts to global desinations + if (contacts.Count > 0) { + IEnumerator enuc = contacts.GetEnumerator(); + while ( enuc.MoveNext() ) + gfax.Destinations.Add((GfaxContact)enuc.Current); + } + } + } + } + + phbd.Destroy(); + } + + // loads the phone book into list_store + private void load_phone_book(Phonebook p) + { + ArrayList contacts = null; + + // Clear the list_store + list_store.Clear(); + + contacts = Phonetools.get_contacts(p); + if (contacts == null) + return; + + IEnumerator enu = contacts.GetEnumerator(); + while ( enu.MoveNext() ) { + GfaxContact c = new GfaxContact(); + c = (GfaxContact)enu.Current; + ls.AddTextToRow(c.Organization, c.PhoneNumber, c.ContactPerson); + } + } + + private void on_cancel_button_clicked(object o, EventArgs args) + { + phbd.Destroy(); + } + + } + +} -- cgit v1.1-32-gdbae